From e4bca8dc710e0d8df28b81562052a4e46ca7bf34 Mon Sep 17 00:00:00 2001 From: Xing GUO Date: Wed, 6 Mar 2019 01:28:40 +0000 Subject: [PATCH] [BinaryFormat] Add DT_USED tag into dynamic section. Summary: This tag is documented in https://docs.oracle.com/cd/E19253-01/817-1984/chapter6-42444/index.html Though I could not find some docs that describe it in detail, I found some code snippets. 1. ``` /* * Look up the string in the string table and get its offset. If * this succeeds, then it is possible that there is a DT_NEEDED * dynamic entry that references it. */ have_string = elfedit_sec_findstr(argstate->str.sec, strpad_elt.dn_dyn.d_un.d_val, arg, &str_offset) != 0; if (have_string) { dyn = argstate->dynamic.data; for (ndx = 0; ndx < numdyn; dyn++, ndx++) { if (((dyn->d_tag == DT_NEEDED) || (dyn->d_tag == DT_USED)) && (dyn->d_un.d_val == str_offset)) goto done; } } ``` https://github.com/kofemann/opensolaris/blob/80192cd83bf665e708269dae856f9145f7190f74/usr/src/cmd/sgs/elfedit/modules/common/syminfo.c#L512 2. ``` case DT_USED: case DT_INIT_ARRAY: case DT_FINI_ARRAY: if (do_dynamic) { if (entry->d_tag == DT_USED && VALID_DYNAMIC_NAME (entry->d_un.d_val)) { char *name = GET_DYNAMIC_NAME (entry->d_un.d_val); if (*name) { printf (_("Not needed object: [%s]\n"), name); break; } } print_vma (entry->d_un.d_val, PREFIX_HEX); putchar ('\n'); } break; ``` http://web.mit.edu/freebsd/head/contrib/binutils/binutils/readelf.c 3. ``` #define DT_USED 0x7ffffffe /* ignored - same as needed */ ``` https://github.com/switchbrew/switch-tools/blob/master/src/elf_common.h Reviewers: jhenderson, grimar Reviewed By: jhenderson, grimar Subscribers: emaste, krytarowski, fedor.sergeev, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D58762 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355468 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/BinaryFormat/DynamicTags.def | 1 + test/tools/obj2yaml/dynamic-section.test | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/include/llvm/BinaryFormat/DynamicTags.def b/include/llvm/BinaryFormat/DynamicTags.def index 3f9b7b80b61..82fe72eefad 100644 --- a/include/llvm/BinaryFormat/DynamicTags.def +++ b/include/llvm/BinaryFormat/DynamicTags.def @@ -196,6 +196,7 @@ PPC64_DYNAMIC_TAG(PPC64_GLINK, 0x70000000) // Address of 32 bytes before the // Sun machine-independent extensions. DYNAMIC_TAG(AUXILIARY, 0x7FFFFFFD) // Shared object to load before self +DYNAMIC_TAG(USED, 0x7FFFFFFE) // Same as DT_NEEDED DYNAMIC_TAG(FILTER, 0x7FFFFFFF) // Shared object to get values from diff --git a/test/tools/obj2yaml/dynamic-section.test b/test/tools/obj2yaml/dynamic-section.test index d8fb7e9928c..28066dd16ad 100644 --- a/test/tools/obj2yaml/dynamic-section.test +++ b/test/tools/obj2yaml/dynamic-section.test @@ -122,6 +122,8 @@ # CHECK-NEXT: Value: 0x0000000000000035 # CHECK-NEXT: - Tag: DT_VERNEEDNUM # CHECK-NEXT: Value: 0x0000000000000036 +# CHECK-NEXT: - Tag: DT_USED +# CHECK-NEXT: Value: 0x0000000000000001 !ELF FileHeader: @@ -246,3 +248,5 @@ Sections: Value: 0x0000000000000035 - Tag: DT_VERNEEDNUM Value: 0x0000000000000036 + - Tag: DT_USED + Value: 0x0000000000000001 -- 2.40.0