commit: 66feb3705c419dfd965e099c2f167958ddf45be5 Author: Sam James <sam <AT> gentoo <DOT> org> AuthorDate: Fri Aug 29 13:40:06 2025 +0000 Commit: Sam James <sam <AT> gentoo <DOT> org> CommitDate: Fri Aug 29 13:40:06 2025 +0000 URL: https://gitweb.gentoo.org/proj/toolchain/binutils-patches.git/commit/?id=66feb370
9999: drop merged --got-sections patch Signed-off-by: Sam James <sam <AT> gentoo.org> 9999/0007-readelf-Add-got-contents-option.patch | 2245 ----------------------- 1 file changed, 2245 deletions(-) diff --git a/9999/0007-readelf-Add-got-contents-option.patch b/9999/0007-readelf-Add-got-contents-option.patch deleted file mode 100644 index 85fd491..0000000 --- a/9999/0007-readelf-Add-got-contents-option.patch +++ /dev/null @@ -1,2245 +0,0 @@ -From 59c754fcc3081053610842bdd288726fedc8c91b Mon Sep 17 00:00:00 2001 -Message-ID: <59c754fcc3081053610842bdd288726fedc8c91b.1756412415.git....@gentoo.org> -From: "H.J. Lu" <[email protected]> -Date: Mon, 25 Aug 2025 18:00:00 -0700 -Subject: [PATCH] readelf: Add --got-contents option - -Add --got-contents option to readelf, inspired by the -G option on Solaris, -to display contents of GOT sections: - -$ readelf --got-contents libfoo.so - -Global Offset Table '.got' contains 1 entry: - Index: Address Reloc Sym. Name + Addend/Value - 0: 000000200340 R_X86_64_GLOB_DAT foo + 0 - -Global Offset Table '.got.plt' contains 4 entries: - Index: Address Reloc Sym. Name + Addend/Value - 0: 000000200348 200220 - 1: 000000200350 0 - 2: 000000200358 0 - 3: 000000200360 R_X86_64_JUMP_SLO bar + 0 - -When --got-content options are used: - -1. Allocate an array, all_relocations, to hold all relocations. -2. Update dump_relr_relocations and dump_relocations to scan relocations -and cache them in all_relocations. Don't display relocations if not -requested. -3. Add process_got_section_contents to display contents of GOT sections -by matching the GOT entry offset against the cached relocations. -4. Update process_mips_specific to only display the GOT related contents -for --got-contents. - -binutils/ - - * NEWS: Mention "readelf --got-contents". - * readelf.c (do_got_section_contents): New. - (elf_relocation): Likewise. - (all_relocations_root): Likewise. - (all_relocations): Likewise. - (all_relocations_count): Likewise. - (update_all_relocations): Likewise. - (dump_relr_relocations): Add a bool argument to indicate if - relocations should be displayed. Populate all_relocations if - do_got_section_contents is true. - (dump_relocations): Likewise. - (long_option_values): Add OPTION_GOT_CONTENTS. - (options): Add --got-contents. - (usage): Show --got-contents. - (parse_args): Support --got-contents. - (display_relocations): Add a bool argument, dump_reloc, to - indicate if relocations should be displayed. Call - update_all_relocations. Pass dump_reloc to dump_relr_relocations - and dump_relocations. - (process_relocs): Check do_got_section_contents. Handle - do_got_section_contents for dynamic relocations. - (process_section_contents): Pass true to display_relocations. - (process_mips_specific): Add a bool argument, dump_got, to - indicate if only the GOT related contents should be displayed. - Display all MIPS specific information if dump_got is false. - (elf_relocation_cmp): New. - (display_elf_relocation_at): Likewise. - (process_got_section_contents): Likewise. - (process_object): Call process_got_section_contents. - * doc/binutils.texi: Document --got-contents. - -ld/ - - * testsuite/ld-i386/binutils.exp: New file. - * testsuite/ld-i386/got-1.s: Likewise. - * testsuite/ld-i386/libgot-1a.rd: Likewise. - * testsuite/ld-i386/libgot-1b.rd: Likewise. - * testsuite/ld-i386/libgot-1c.rd: Likewise. - * testsuite/ld-i386/libgot-1d.rd: Likewise. - * testsuite/ld-x86-64/binutils.exp: Likewise. - * testsuite/ld-x86-64/got-1.s: Likewise. - * testsuite/ld-x86-64/libgot-1a-x32.rd: Likewise. - * testsuite/ld-x86-64/libgot-1a.rd: Likewise. - * testsuite/ld-x86-64/libgot-1b-x32.rd: Likewise. - * testsuite/ld-x86-64/libgot-1b.rd: Likewise. - * testsuite/ld-x86-64/libgot-1c-x32.rd: Likewise. - * testsuite/ld-x86-64/libgot-1c.rd: Likewise. - * testsuite/ld-x86-64/libgot-1d-x32.rd: Likewise. - * testsuite/ld-x86-64/libgot-1d.rd: Likewise. - -Signed-off-by: H.J. Lu <[email protected]> ---- - binutils/NEWS | 3 + - binutils/doc/binutils.texi | 12 +- - binutils/readelf.c | 1004 ++++++++++++++++++----- - ld/testsuite/ld-i386/binutils.exp | 45 + - ld/testsuite/ld-i386/got-1.s | 7 + - ld/testsuite/ld-i386/libgot-1a.rd | 9 + - ld/testsuite/ld-i386/libgot-1b.rd | 119 +++ - ld/testsuite/ld-i386/libgot-1c.rd | 12 + - ld/testsuite/ld-i386/libgot-1d.rd | 12 + - ld/testsuite/ld-x86-64/binutils.exp | 59 ++ - ld/testsuite/ld-x86-64/got-1.s | 7 + - ld/testsuite/ld-x86-64/libgot-1a-x32.rd | 9 + - ld/testsuite/ld-x86-64/libgot-1a.rd | 9 + - ld/testsuite/ld-x86-64/libgot-1b-x32.rd | 119 +++ - ld/testsuite/ld-x86-64/libgot-1b.rd | 119 +++ - ld/testsuite/ld-x86-64/libgot-1c-x32.rd | 12 + - ld/testsuite/ld-x86-64/libgot-1c.rd | 12 + - ld/testsuite/ld-x86-64/libgot-1d-x32.rd | 12 + - ld/testsuite/ld-x86-64/libgot-1d.rd | 12 + - 19 files changed, 1378 insertions(+), 215 deletions(-) - create mode 100644 ld/testsuite/ld-i386/binutils.exp - create mode 100644 ld/testsuite/ld-i386/got-1.s - create mode 100644 ld/testsuite/ld-i386/libgot-1a.rd - create mode 100644 ld/testsuite/ld-i386/libgot-1b.rd - create mode 100644 ld/testsuite/ld-i386/libgot-1c.rd - create mode 100644 ld/testsuite/ld-i386/libgot-1d.rd - create mode 100644 ld/testsuite/ld-x86-64/binutils.exp - create mode 100644 ld/testsuite/ld-x86-64/got-1.s - create mode 100644 ld/testsuite/ld-x86-64/libgot-1a-x32.rd - create mode 100644 ld/testsuite/ld-x86-64/libgot-1a.rd - create mode 100644 ld/testsuite/ld-x86-64/libgot-1b-x32.rd - create mode 100644 ld/testsuite/ld-x86-64/libgot-1b.rd - create mode 100644 ld/testsuite/ld-x86-64/libgot-1c-x32.rd - create mode 100644 ld/testsuite/ld-x86-64/libgot-1c.rd - create mode 100644 ld/testsuite/ld-x86-64/libgot-1d-x32.rd - create mode 100644 ld/testsuite/ld-x86-64/libgot-1d.rd - -diff --git a/binutils/NEWS b/binutils/NEWS -index ccda8559897..0a4ed3bcc43 100644 ---- a/binutils/NEWS -+++ b/binutils/NEWS -@@ -1,5 +1,8 @@ - -*- text -*- - -+* Add --got-contents option to readelf to display the contents of -+ Global Offset Table (GOT) sections. -+ - * Internal changes to plugin support, and stricter target checking may result - in some errors being exposed in user options passed to the various binutils. - For example objcopy --target=TARGET now will only work if the input file is -diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi -index 4543341e00c..89425b8a15b 100644 ---- a/binutils/doc/binutils.texi -+++ b/binutils/doc/binutils.texi -@@ -5076,6 +5076,7 @@ readelf [@option{-a}|@option{--all}] - [@option{--ctf-strings=}@var{section}] - [@option{--sframe=}@var{section}] - [@option{-I}|@option{--histogram}] -+ [@option{--got-contents}] - [@option{-v}|@option{--version}] - [@option{-W}|@option{--wide}] - [@option{-T}|@option{--silent-truncation}] -@@ -5111,7 +5112,8 @@ given. - Equivalent to specifying @option{--file-header}, - @option{--program-headers}, @option{--sections}, @option{--symbols}, - @option{--relocs}, @option{--dynamic}, @option{--notes}, --@option{--version-info}, @option{--arch-specific}, @option{--unwind}, -+@option{--got-contents}, @option{--version-info}, -+@option{--arch-specific}, @option{--unwind}, - @option{--section-groups} and @option{--histogram}. - - Note - this option does not enable @option{--use-dynamic} itself, so -@@ -5387,6 +5389,14 @@ string table are used. - If either of @option{--ctf-symbols} or @option{--ctf-strings} is specified, the - other must be specified as well. - -+@item --got-contents -+@cindex ELF section information -+@cindex ELF reloc information -+Displays the contents of the file's Global Offset Table (GOT) sections, -+if it has any. For MIPS, this option is similar to -+@option{--arch-specific}, but it only displays the GOT related contents -+and it is ignored when @option{--arch-specific} is used. -+ - @item -I - @itemx --histogram - Display a histogram of bucket list lengths when displaying the contents -diff --git a/binutils/readelf.c b/binutils/readelf.c -index 68e193415f2..2affc713adb 100644 ---- a/binutils/readelf.c -+++ b/binutils/readelf.c -@@ -229,6 +229,7 @@ static bool do_dyn_syms = false; - static bool do_lto_syms = false; - static bool do_reloc = false; - static bool do_sections = false; -+static bool do_got_section_contents = false; - static bool do_section_groups = false; - static bool do_section_details = false; - static bool do_segments = false; -@@ -372,6 +373,21 @@ enum versioned_symbol_info - symbol_public - }; - -+/* Relocation entries */ -+ -+typedef struct elf_relocation -+{ -+ bfd_vma r_offset; /* Location at which to apply the action */ -+ bfd_vma r_addend; /* Constant addend used to compute value */ -+ const char *r_name; /* Relocation name. */ -+ char *r_symbol; /* Relocation symbol. */ -+ relocation_type r_type; /* Relocation type. */ -+} elf_relocation; -+ -+static elf_relocation *all_relocations_root; -+static elf_relocation *all_relocations; -+static size_t all_relocations_count; -+ - static int - fseek64 (FILE *stream, int64_t offset, int whence) - { -@@ -1767,6 +1783,32 @@ symcmp (const void *p, const void *q) - return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0); - } - -+static void -+update_all_relocations (size_t nentries) -+{ -+ size_t sz; -+ -+ if (!do_got_section_contents) -+ return; -+ -+ if (!all_relocations_root) -+ { -+ sz = nentries * sizeof (elf_relocation); -+ all_relocations_root = (elf_relocation *) xmalloc (sz); -+ all_relocations = all_relocations_root; -+ all_relocations_count = nentries; -+ } -+ else -+ { -+ size_t orig_count = all_relocations_count; -+ sz = (orig_count + nentries) * sizeof (elf_relocation); -+ all_relocations_root = (elf_relocation *) -+ xrealloc (all_relocations_root, sz); -+ all_relocations = all_relocations_root + orig_count; -+ all_relocations_count += nentries; -+ } -+} -+ - static uint64_t - count_relr_relocations (Filedata * filedata, - Elf_Internal_Shdr * section) -@@ -1830,6 +1872,9 @@ count_relr_relocations (Filedata * filedata, - return count; - } - -+/* If DUMP_RELOC is false, don't display RELR relocations, just collect -+ RELR relocations for displaying GOT section contents later. */ -+ - static bool - dump_relr_relocations (Filedata * filedata, - uint64_t relr_size, -@@ -1838,7 +1883,8 @@ dump_relr_relocations (Filedata * filedata, - Elf_Internal_Sym * symtab, - uint64_t nsyms, - char * strtab, -- uint64_t strtablen) -+ uint64_t strtablen, -+ bool dump_reloc) - { - uint64_t * relrs; - uint64_t nentries, i; -@@ -1860,7 +1906,8 @@ dump_relr_relocations (Filedata * filedata, - num_bits_in_entry = 63; - else - { -- warn (_("Unexpected entsize for RELR section\n")); -+ if (dump_reloc) -+ warn (_("Unexpected entsize for RELR section\n")); - return false; - } - -@@ -1874,6 +1921,161 @@ dump_relr_relocations (Filedata * filedata, - if (symtab == NULL) - nsyms = 0; - -+ const char *rtype = NULL; -+ if (do_got_section_contents) -+ switch (filedata->file_header.e_machine) -+ { -+ default: -+ abort (); -+ -+ case EM_386: -+ case EM_IAMCU: -+ rtype = "R_386_RELATIVE"; -+ break; -+ -+ case EM_68K: -+ rtype = "R_68K_RELATIVE"; -+ break; -+ -+ case EM_860: -+ rtype = "R_860_RELATIVE"; -+ break; -+ -+ case EM_AARCH64: -+ rtype = "R_AARCH64_RELATIVE"; -+ break; -+ -+ case EM_AMDGPU: -+ rtype = "R_AMDGPU_RELATIVE64"; -+ break; -+ -+ case EM_ALPHA: -+ rtype = "R_ALPHA_RELATIVE"; -+ break; -+ -+ case EM_ALTERA_NIOS2: -+ rtype = "R_NIOS2_RELATIVE"; -+ break; -+ -+ case EM_ARM: -+ rtype = "R_ARM_RELATIVE"; -+ break; -+ -+ case EM_ARC: -+ case EM_ARC_COMPACT: -+ case EM_ARC_COMPACT2: -+ case EM_ARC_COMPACT3: -+ case EM_ARC_COMPACT3_64: -+ rtype = "R_ARC_RELATIVE"; -+ break; -+ -+ case EM_CRIS: -+ rtype = "R_CRIS_RELATIVE"; -+ break; -+ -+ case EM_CSKY: -+ rtype = "R_CKCORE_RELATIVE"; -+ break; -+ -+ case EM_KVX: -+ rtype = "R_KVX_RELATIVE"; -+ break; -+ -+ case EM_LATTICEMICO32: -+ rtype = "R_LM32_RELATIVE"; -+ break; -+ -+ case EM_LOONGARCH: -+ rtype = "R_LARCH_RELATIVE"; -+ break; -+ -+ case EM_M32R: -+ case EM_CYGNUS_M32R: -+ rtype = "R_M32R_RELATIVE"; -+ break; -+ -+ case EM_MCORE: -+ rtype = "R_MCORE_RELATIVE"; -+ break; -+ -+ case EM_METAG: -+ rtype = "R_METAG_RELATIVE"; -+ break; -+ -+ case EM_MN10300: -+ case EM_CYGNUS_MN10300: -+ rtype = "R_MN10300_RELATIVE"; -+ break; -+ -+ case EM_NDS32: -+ rtype = "R_NDS32_RELATIVE"; -+ break; -+ -+ case EM_OR1K: -+ rtype = "R_OR1K_RELATIVE"; -+ break; -+ -+ case EM_PPC: -+ rtype = "R_PPC_RELATIVE"; -+ break; -+ -+ case EM_PPC64: -+ rtype = "R_PPC64_RELATIVE"; -+ break; -+ -+ case EM_RISCV: -+ rtype = "R_RISCV_RELATIVE"; -+ break; -+ -+ case EM_S370: -+ rtype = "R_I370_RELATIVE"; -+ break; -+ -+ case EM_S390_OLD: -+ case EM_S390: -+ rtype = "R_390_RELATIVE"; -+ break; -+ -+ case EM_SH: -+ rtype = "R_SH_RELATIVE"; -+ break; -+ -+ case EM_OLD_SPARCV9: -+ case EM_SPARC32PLUS: -+ case EM_SPARCV9: -+ case EM_SPARC: -+ rtype = "R_SPARC_RELATIVE"; -+ break; -+ -+ case EM_TILEGX: -+ rtype = "R_TILEGX_RELATIVE"; -+ break; -+ -+ case EM_TILEPRO: -+ rtype = "R_TILEPRO_RELATIVE"; -+ break; -+ -+ case EM_V850: -+ case EM_CYGNUS_V850: -+ rtype = "R_V850_RELATIVE"; -+ break; -+ -+ case EM_VAX: -+ rtype = "R_VAX_RELATIVE"; -+ break; -+ -+ case EM_X86_64: -+ case EM_L1OM: -+ case EM_K1OM: -+ rtype = "R_X86_64_RELATIVE"; -+ break; -+ -+ case EM_XTENSA_OLD: -+ case EM_XTENSA: -+ rtype = "R_XTENSA_RELATIVE"; -+ break; -+ } -+ - if (symtab != NULL) - { - /* Symbol tables are not sorted on address, but we want a quick lookup -@@ -1884,11 +2086,15 @@ dump_relr_relocations (Filedata * filedata, - nsyms = filter_display_syms (filedata, symtab, nsyms, strtab, strtablen); - } - -- if (relr_entsize == sizeof (Elf32_External_Relr)) -- printf (_ ("Index: Entry Address Symbolic Address\n")); -- else -- printf (_ ("Index: Entry Address Symbolic Address\n")); -+ if (dump_reloc) -+ { -+ if (relr_entsize == sizeof (Elf32_External_Relr)) -+ printf (_ ("Index: Entry Address Symbolic Address\n")); -+ else -+ printf (_ ("Index: Entry Address Symbolic Address\n")); -+ } - -+ uint64_t r = 0; - for (i = 0; i < nentries; i++) - { - uint64_t entry; -@@ -1898,16 +2104,34 @@ dump_relr_relocations (Filedata * filedata, - else - entry = BYTE_GET (((Elf64_External_Relr *)relrs)[i].r_data); - -- /* We assume that there will never be more than 9999 entries. */ -- printf (_("%04u: "), (unsigned int) i); -- print_vma (entry, ZERO_HEX); -- printf (" "); -+ if (dump_reloc) -+ { -+ /* We assume that there will never be more than 9999 -+ entries. */ -+ printf (_("%04u: "), (unsigned int) i); -+ print_vma (entry, ZERO_HEX); -+ printf (" "); -+ } - - if ((entry & 1) == 0) - { - where = entry; -- print_relr_addr_and_sym (filedata, symtab, nsyms, strtab, where); -- printf ("\n"); -+ if (dump_reloc) -+ { -+ print_relr_addr_and_sym (filedata, symtab, nsyms, strtab, -+ where); -+ printf ("\n"); -+ } -+ -+ if (do_got_section_contents) -+ { -+ all_relocations[r].r_offset = where; -+ all_relocations[r].r_name = rtype; -+ all_relocations[r].r_symbol = NULL; -+ all_relocations[r].r_type = reltype_relr; -+ r++; -+ } -+ - where += relr_entsize; - } - else -@@ -1920,7 +2144,7 @@ dump_relr_relocations (Filedata * filedata, - /* This can actually happen when the linker is allowed to shrink - RELR sections. For more details see: https://reviews.llvm.org/D67164. */ - continue; -- else if (i == 0) -+ else if (dump_reloc && i == 0) - warn (_("Unusual RELR bitmap - no previous entry to set the base address\n")); - - for (j = 0; entry >>= 1; j++) -@@ -1928,19 +2152,35 @@ dump_relr_relocations (Filedata * filedata, - { - uint64_t addr = where + (j * relr_entsize); - -- if (first) -+ if (dump_reloc) - { -- print_relr_addr_and_sym (filedata, symtab, nsyms, strtab, addr); -- first = false; -+ if (first) -+ { -+ print_relr_addr_and_sym (filedata, symtab, nsyms, -+ strtab, addr); -+ first = false; -+ } -+ else -+ { -+ printf (_("\n%*s "), -+ relr_entsize == 4 ? 15 : 23, " "); -+ print_relr_addr_and_sym (filedata, symtab, nsyms, -+ strtab, addr); -+ } - } -- else -+ -+ if (do_got_section_contents) - { -- printf (_("\n%*s "), relr_entsize == 4 ? 15 : 23, " "); -- print_relr_addr_and_sym (filedata, symtab, nsyms, strtab, addr); -+ all_relocations[r].r_offset = addr; -+ all_relocations[r].r_name = rtype; -+ all_relocations[r].r_symbol = NULL; -+ all_relocations[r].r_type = reltype_relr; -+ r++; - } - } - -- printf ("\n"); -+ if (dump_reloc) -+ printf ("\n"); - where += num_bits_in_entry * relr_entsize; - } - } -@@ -1950,7 +2190,8 @@ dump_relr_relocations (Filedata * filedata, - } - - /* Display the contents of the relocation data found at the specified -- offset. */ -+ offset. If DUMP_RELOC is false, don't display relocations, just -+ collect relocations for displaying GOT section contents later. */ - - static bool - dump_relocations (Filedata * filedata, -@@ -1961,7 +2202,8 @@ dump_relocations (Filedata * filedata, - char * strtab, - uint64_t strtablen, - relocation_type rel_type, -- bool is_dynsym) -+ bool is_dynsym, -+ bool dump_reloc) - { - size_t i; - Elf_Internal_Rela * rels; -@@ -1986,26 +2228,26 @@ dump_relocations (Filedata * filedata, - return false; - } - -- if (is_32bit_elf) -+ if (dump_reloc) - { -- if (rel_type == reltype_rela) -- { -- if (do_wide) -- printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n")); -- else -- printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n")); -- } -- else -+ if (is_32bit_elf) - { -- if (do_wide) -- printf (_(" Offset Info Type Sym. Value Symbol's Name\n")); -+ if (rel_type == reltype_rela) -+ { -+ if (do_wide) -+ printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n")); -+ else -+ printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n")); -+ } - else -- printf (_(" Offset Info Type Sym.Value Sym. Name\n")); -+ { -+ if (do_wide) -+ printf (_(" Offset Info Type Sym. Value Symbol's Name\n")); -+ else -+ printf (_(" Offset Info Type Sym.Value Sym. Name\n")); -+ } - } -- } -- else -- { -- if (rel_type == reltype_rela) -+ else if (rel_type == reltype_rela) - { - if (do_wide) - printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n")); -@@ -2035,18 +2277,16 @@ dump_relocations (Filedata * filedata, - type = get_reloc_type (filedata, inf); - symtab_index = get_reloc_symindex (inf); - -- if (is_32bit_elf) -- { -- printf ("%8.8lx %8.8lx ", -- (unsigned long) offset & 0xffffffff, -- (unsigned long) inf & 0xffffffff); -- } -- else -+ if (dump_reloc) - { -- printf (do_wide -- ? "%16.16" PRIx64 " %16.16" PRIx64 " " -- : "%12.12" PRIx64 " %12.12" PRIx64 " ", -- offset, inf); -+ if (is_32bit_elf) -+ printf ("%8.8" PRIx32 " %8.8" PRIx32 " ", -+ (uint32_t) offset, (uint32_t) inf); -+ else -+ printf (do_wide -+ ? "%16.16" PRIx64 " %16.16" PRIx64 " " -+ : "%12.12" PRIx64 " %12.12" PRIx64 " ", -+ offset, inf); - } - - switch (filedata->file_header.e_machine) -@@ -2396,10 +2636,15 @@ dump_relocations (Filedata * filedata, - break; - } - -- if (rtype == NULL) -- printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff); -- else -- printf (do_wide ? "%-22s" : "%-17.17s", rtype); -+ char *symbol_name = NULL; -+ if (dump_reloc) -+ { -+ if (rtype == NULL) -+ printf (_("unrecognized: %-7lx"), -+ (unsigned long) type & 0xffffffff); -+ else -+ printf (do_wide ? "%-22s" : "%-17.17s", rtype); -+ } - - if (filedata->file_header.e_machine == EM_ALPHA - && rtype != NULL -@@ -2418,23 +2663,29 @@ dump_relocations (Filedata * filedata, - default: rtype = NULL; - } - -- if (rtype) -- printf (" (%s)", rtype); -- else -+ if (dump_reloc) - { -- putchar (' '); -- printf (_("<unknown addend: %" PRIx64 ">"), -- rels[i].r_addend); -- res = false; -+ if (rtype) -+ printf (" (%s)", rtype); -+ else -+ { -+ putchar (' '); -+ printf (_("<unknown addend: %" PRIx64 ">"), -+ rels[i].r_addend); -+ res = false; -+ } - } - } - else if (symtab_index) - { - if (symtab == NULL || symtab_index >= nsyms) - { -- error (_(" bad symbol index: %08lx in reloc\n"), -- (unsigned long) symtab_index); -- res = false; -+ if (dump_reloc) -+ { -+ error (_(" bad symbol index: %08lx in reloc\n"), -+ (unsigned long) symtab_index); -+ res = false; -+ } - } - else - { -@@ -2453,7 +2704,8 @@ dump_relocations (Filedata * filedata, - &sym_info, - &vna_other); - -- printf (" "); -+ if (dump_reloc) -+ printf (" "); - - if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC) - { -@@ -2478,13 +2730,30 @@ dump_relocations (Filedata * filedata, - else - name = strtab + psym->st_name; - -- len = print_symbol_name (width, name); -- if (version_string) -- printf (sym_info == symbol_public ? "@@%s" : "@%s", -- version_string); -- printf ("()%-*s", len <= width ? (width + 1) - len : 1, " "); -+ if (do_got_section_contents) -+ { -+ if (version_string) -+ symbol_name = concat (name, -+ sym_info == symbol_public -+ ? "@@" : "@", -+ version_string, NULL); -+ else -+ symbol_name = xstrdup (name); -+ } -+ -+ if (dump_reloc) -+ { -+ len = print_symbol_name (width, name); -+ if (version_string) -+ printf (sym_info == symbol_public -+ ? "@@%s" : "@%s", -+ version_string); -+ printf ("()%-*s", -+ len <= width ? (width + 1) - len : 1, -+ " "); -+ } - } -- else -+ else if (dump_reloc) - { - print_vma (psym->st_value, LONG_HEX); - -@@ -2499,25 +2768,49 @@ dump_relocations (Filedata * filedata, - sec_name = printable_section_name_from_index - (filedata, psym->st_shndx, NULL); - -- print_symbol_name (22, sec_name); -+ if (do_got_section_contents) -+ symbol_name = xstrdup (sec_name); -+ if (dump_reloc) -+ print_symbol_name (22, sec_name); - } - else if (strtab == NULL) -- printf (_("<string table index: %3ld>"), psym->st_name); -+ { -+ if (dump_reloc) -+ printf (_("<string table index: %3ld>"), -+ psym->st_name); -+ } - else if (psym->st_name >= strtablen) - { -- error (_("<corrupt string table index: %3ld>\n"), -- psym->st_name); -- res = false; -+ if (dump_reloc) -+ { -+ error (_("<corrupt string table index: %3ld>\n"), -+ psym->st_name); -+ res = false; -+ } - } - else - { -- print_symbol_name (22, strtab + psym->st_name); -- if (version_string) -- printf (sym_info == symbol_public ? "@@%s" : "@%s", -- version_string); -+ if (dump_reloc) -+ { -+ print_symbol_name (22, strtab + psym->st_name); -+ if (version_string) -+ printf (sym_info == symbol_public -+ ? "@@%s" : "@%s", -+ version_string); -+ } -+ if (do_got_section_contents) -+ { -+ if (version_string) -+ symbol_name = concat (strtab + psym->st_name, -+ sym_info == symbol_public -+ ? "@@" : "@", -+ version_string, NULL); -+ else -+ symbol_name = xstrdup (strtab + psym->st_name); -+ } - } - -- if (rel_type == reltype_rela) -+ if (dump_reloc && rel_type == reltype_rela) - { - uint64_t off = rels[i].r_addend; - -@@ -2528,7 +2821,7 @@ dump_relocations (Filedata * filedata, - } - } - } -- else if (rel_type == reltype_rela) -+ else if (dump_reloc && rel_type == reltype_rela) - { - uint64_t off = rels[i].r_addend; - -@@ -2539,37 +2832,50 @@ dump_relocations (Filedata * filedata, - printf ("%" PRIx64, off); - } - -- if (filedata->file_header.e_machine == EM_SPARCV9 -- && rtype != NULL -- && streq (rtype, "R_SPARC_OLO10")) -- printf (" + %" PRIx64, ELF64_R_TYPE_DATA (inf)); -- -- putchar ('\n'); -+ if (do_got_section_contents) -+ { -+ all_relocations[i].r_offset = offset; -+ all_relocations[i].r_name = rtype; -+ all_relocations[i].r_symbol = symbol_name; -+ all_relocations[i].r_addend = rels[i].r_addend; -+ all_relocations[i].r_type = rel_type; -+ } - -- if (! is_32bit_elf && filedata->file_header.e_machine == EM_MIPS) -+ if (dump_reloc) - { -- uint64_t type2 = ELF64_MIPS_R_TYPE2 (inf); -- uint64_t type3 = ELF64_MIPS_R_TYPE3 (inf); -- const char * rtype2 = elf_mips_reloc_type (type2); -- const char * rtype3 = elf_mips_reloc_type (type3); -+ if (filedata->file_header.e_machine == EM_SPARCV9 -+ && rtype != NULL -+ && streq (rtype, "R_SPARC_OLO10")) -+ printf (" + %" PRIx64, ELF64_R_TYPE_DATA (inf)); - -- printf (" Type2: "); -+ putchar ('\n'); - -- if (rtype2 == NULL) -- printf (_("unrecognized: %-7lx"), -- (unsigned long) type2 & 0xffffffff); -- else -- printf ("%-17.17s", rtype2); -+ if (! is_32bit_elf -+ && filedata->file_header.e_machine == EM_MIPS) -+ { -+ uint64_t type2 = ELF64_MIPS_R_TYPE2 (inf); -+ uint64_t type3 = ELF64_MIPS_R_TYPE3 (inf); -+ const char * rtype2 = elf_mips_reloc_type (type2); -+ const char * rtype3 = elf_mips_reloc_type (type3); - -- printf ("\n Type3: "); -+ printf (" Type2: "); - -- if (rtype3 == NULL) -- printf (_("unrecognized: %-7lx"), -- (unsigned long) type3 & 0xffffffff); -- else -- printf ("%-17.17s", rtype3); -+ if (rtype2 == NULL) -+ printf (_("unrecognized: %-7lx"), -+ (unsigned long) type2 & 0xffffffff); -+ else -+ printf ("%-17.17s", rtype2); - -- putchar ('\n'); -+ printf ("\n Type3: "); -+ -+ if (rtype3 == NULL) -+ printf (_("unrecognized: %-7lx"), -+ (unsigned long) type3 & 0xffffffff); -+ else -+ printf ("%-17.17s", rtype3); -+ -+ putchar ('\n'); -+ } - } - } - -@@ -6097,7 +6403,8 @@ enum long_option_values - OPTION_NO_RECURSE_LIMIT, - OPTION_NO_DEMANGLING, - OPTION_NO_EXTRA_SYM_INFO, -- OPTION_SYM_BASE -+ OPTION_SYM_BASE, -+ OPTION_GOT_CONTENTS - }; - - static struct option options[] = -@@ -6160,6 +6467,7 @@ static struct option options[] = - #endif - {"sframe", optional_argument, 0, OPTION_SFRAME_DUMP}, - {"sym-base", optional_argument, 0, OPTION_SYM_BASE}, -+ {"got-contents", no_argument, 0, OPTION_GOT_CONTENTS}, - - {0, no_argument, 0, 0} - }; -@@ -6171,7 +6479,7 @@ usage (FILE * stream) - fprintf (stream, _(" Display information about the contents of ELF format files\n")); - fprintf (stream, _(" Options are:\n")); - fprintf (stream, _("\ -- -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n")); -+ -a --all Equivalent to: -h -l -S -s -r -d -V -A -I --got-contents\n")); - fprintf (stream, _("\ - -h --file-header Display the ELF file header\n")); - fprintf (stream, _("\ -@@ -6317,6 +6625,8 @@ usage (FILE * stream) - fprintf (stream, _("\ - -I --histogram Display histogram of bucket list lengths\n")); - fprintf (stream, _("\ -+ --got-contents Display GOT section contents\n")); -+ fprintf (stream, _("\ - -W --wide Allow output width to exceed 80 characters\n")); - fprintf (stream, _("\ - -T --silent-truncation If a symbol name is truncated, do not add [...] suffix\n")); -@@ -6441,6 +6751,7 @@ parse_args (struct dump_data *dumpdata, int argc, char ** argv) - do_histogram = true; - do_arch = true; - do_notes = true; -+ do_got_section_contents = true; - break; - - case 'g': -@@ -6700,6 +7011,11 @@ parse_args (struct dump_data *dumpdata, int argc, char ** argv) - } - break; - -+ case OPTION_GOT_CONTENTS: -+ do_got_section_contents = true; -+ do_dump = true; -+ break; -+ - default: - /* xgettext:c-format */ - error (_("Invalid option '-%c'\n"), c); -@@ -9437,7 +9753,8 @@ rel_type_from_sh_type (unsigned int sh_type) - - static bool - display_relocations (Elf_Internal_Shdr * section, -- Filedata * filedata) -+ Filedata * filedata, -+ bool dump_reloc) - { - relocation_type rel_type = rel_type_from_sh_type (section->sh_type); - -@@ -9449,19 +9766,23 @@ display_relocations (Elf_Internal_Shdr * section, - if (rel_size == 0) - return false; - -- if (filedata->is_separate) -- printf (_("\nIn linked file '%s' relocation section "), -- printable_string (filedata->file_name, 0)); -- else -- printf (_("\nRelocation section ")); -+ if (dump_reloc) -+ { -+ if (filedata->is_separate) -+ printf (_("\nIn linked file '%s' relocation section "), -+ printable_string (filedata->file_name, 0)); -+ else -+ printf (_("\nRelocation section ")); - -- if (filedata->string_table == NULL) -- printf ("%d", section->sh_name); -- else -- printf ("'%s'", printable_section_name (filedata, section)); -+ if (filedata->string_table == NULL) -+ printf ("%d", section->sh_name); -+ else -+ printf ("'%s'", printable_section_name (filedata, section)); -+ } - -- uint64_t num_rela = rel_size / section->sh_entsize; - uint64_t rel_offset = section->sh_offset; -+ uint64_t num_rela = rel_size / section->sh_entsize; -+ uint64_t num_reloc; - - if (rel_type == reltype_relr) - { -@@ -9470,26 +9791,33 @@ display_relocations (Elf_Internal_Shdr * section, - the number of words in the compressed RELR format. So also provide - the number of locations affected. */ - -- uint64_t num_reloc = count_relr_relocations (filedata, section); -+ num_reloc = count_relr_relocations (filedata, section); - -- printf (_(" at offset %#" PRIx64), rel_offset); -- printf (ngettext (" contains %" PRIu64 " entry which relocates", -- " contains %" PRIu64 " entries which relocate", -- num_rela), num_rela); -- printf (ngettext (" %" PRIu64 " location:\n", -- " %" PRIu64 " locations:\n", -- num_reloc), num_reloc); -+ if (dump_reloc) -+ { -+ printf (_(" at offset %#" PRIx64), rel_offset); -+ printf (ngettext (" contains %" PRIu64 " entry which relocates", -+ " contains %" PRIu64 " entries which relocate", -+ num_rela), num_rela); -+ printf (ngettext (" %" PRIu64 " location:\n", -+ " %" PRIu64 " locations:\n", -+ num_reloc), num_reloc); -+ } - } - else - { -- printf (ngettext (" at offset %#" PRIx64 -- " contains %" PRIu64 " entry:\n", -- " at offset %#" PRIx64 -- " contains %" PRIu64 " entries:\n", -- num_rela), -- rel_offset, num_rela); -+ num_reloc = num_rela; -+ if (dump_reloc) -+ printf (ngettext (" at offset %#" PRIx64 -+ " contains %" PRIu64 " entry:\n", -+ " at offset %#" PRIx64 -+ " contains %" PRIu64 " entries:\n", -+ num_rela), -+ rel_offset, num_rela); - } - -+ update_all_relocations (num_reloc); -+ - Elf_Internal_Shdr * symsec; - Elf_Internal_Sym * symtab = NULL; - uint64_t nsyms = 0; -@@ -9524,12 +9852,15 @@ display_relocations (Elf_Internal_Shdr * section, - res = dump_relr_relocations (filedata, section->sh_size, - section->sh_entsize, - section->sh_offset, -- symtab, nsyms, strtab, strtablen); -+ symtab, nsyms, strtab, strtablen, -+ dump_reloc); - else - res = dump_relocations (filedata, rel_offset, rel_size, - symtab, nsyms, strtab, strtablen, - rel_type, -- symsec == NULL ? false : symsec->sh_type == SHT_DYNSYM); -+ symsec == NULL -+ ? false : symsec->sh_type == SHT_DYNSYM, -+ dump_reloc); - free (strtab); - free (symtab); - -@@ -9543,14 +9874,16 @@ process_relocs (Filedata * filedata) - { - uint64_t rel_size; - uint64_t rel_offset; -+ unsigned int rel_entsz; - -- if (!do_reloc) -+ if (!do_reloc && !do_got_section_contents) - return true; - - if (do_using_dynamic) - { - relocation_type rel_type; - const char * name; -+ const char * entsz_name; - bool has_dynamic_reloc; - unsigned int i; - -@@ -9584,16 +9917,37 @@ process_relocs (Filedata * filedata) - } - } - -- if (filedata->is_separate) -- printf -- (_("\nIn linked file '%s' section '%s' at offset %#" PRIx64 -- " contains %" PRId64 " bytes:\n"), -- filedata->file_name, name, rel_offset, rel_size); -- else -- printf -- (_("\n'%s' relocation section at offset %#" PRIx64 -- " contains %" PRId64 " bytes:\n"), -- name, rel_offset, rel_size); -+ switch (rel_type) -+ { -+ default: -+ abort (); -+ case reltype_rel: -+ rel_entsz = filedata->dynamic_info[DT_RELENT]; -+ entsz_name = "DT_RELENT"; -+ break; -+ case reltype_rela: -+ rel_entsz = filedata->dynamic_info[DT_RELAENT]; -+ entsz_name = "DT_RELAENT"; -+ break; -+ case reltype_relr: -+ rel_entsz = filedata->dynamic_info[DT_RELRENT]; -+ entsz_name = "DT_RELRENT"; -+ break; -+ } -+ -+ if (do_reloc) -+ { -+ if (filedata->is_separate) -+ printf -+ (_("\nIn linked file '%s' section '%s' at offset" -+ "%#" PRIx64 " contains %" PRId64 " bytes:\n"), -+ filedata->file_name, name, rel_offset, rel_size); -+ else -+ printf -+ (_("\n'%s' relocation section at offset %#" PRIx64 -+ " contains %" PRId64 " bytes:\n"), -+ name, rel_offset, rel_size); -+ } - - if (rel_type == reltype_relr) - dump_relr_relocations (filedata, -@@ -9603,24 +9957,37 @@ process_relocs (Filedata * filedata) - filedata->dynamic_symbols, - filedata->num_dynamic_syms, - filedata->dynamic_strings, -- filedata->dynamic_strings_length); -+ filedata->dynamic_strings_length, -+ do_reloc); - else -- dump_relocations (filedata, -- offset_from_vma (filedata, rel_offset, -- rel_size), -- rel_size, -- filedata->dynamic_symbols, -- filedata->num_dynamic_syms, -- filedata->dynamic_strings, -- filedata->dynamic_strings_length, -- rel_type, true /* is_dynamic */); -+ { -+ if (rel_entsz == 0) -+ { -+ printf (_("<missing or corrupt dynamic tag: %s>\n"), -+ entsz_name); -+ continue; -+ } -+ -+ update_all_relocations (rel_size / rel_entsz); -+ -+ dump_relocations (filedata, -+ offset_from_vma (filedata, rel_offset, -+ rel_size), -+ rel_size, -+ filedata->dynamic_symbols, -+ filedata->num_dynamic_syms, -+ filedata->dynamic_strings, -+ filedata->dynamic_strings_length, -+ rel_type, true /* is_dynamic */, -+ do_reloc); -+ } - } - - if (is_ia64_vms (filedata) - && process_ia64_vms_dynamic_relocs (filedata)) - has_dynamic_reloc = true; - -- if (! has_dynamic_reloc) -+ if (do_reloc && ! has_dynamic_reloc) - { - if (filedata->is_separate) - printf (_("\nThere are no dynamic relocations in linked file '%s'.\n"), -@@ -9639,11 +10006,11 @@ process_relocs (Filedata * filedata) - i < filedata->file_header.e_shnum; - i++, section++) - { -- if (display_relocations (section, filedata)) -+ if (display_relocations (section, filedata, do_reloc)) - found = true; - } - -- if (! found) -+ if (do_reloc && ! found) - { - /* Users sometimes forget the -D option, so try to be helpful. */ - for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++) -@@ -17627,7 +17994,7 @@ process_section_contents (Filedata * filedata) - case SHT_RELA: - case SHT_REL: - case SHT_RELR: -- res &= display_relocations (section, filedata); -+ res &= display_relocations (section, filedata, true); - break; - - case SHT_NOTE: -@@ -19644,8 +20011,11 @@ get_mips_reg_size (int reg_size) - : -1; - } - -+/* If DUMP_GOT is true, display only the GOT related contents. -+ Otherwise, display all MIPS specific information. */ -+ - static bool --process_mips_specific (Filedata * filedata) -+process_mips_specific (Filedata * filedata, bool dump_got) - { - Elf_Internal_Dyn * entry; - Elf_Internal_Shdr *sect = NULL; -@@ -19664,60 +20034,63 @@ process_mips_specific (Filedata * filedata) - uint64_t symtabno = 0; - bool res = true; - -- if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL, -- display_mips_gnu_attribute)) -- res = false; -- -- sect = find_section (filedata, ".MIPS.abiflags"); -- -- if (sect != NULL) -+ if (!dump_got) - { -- Elf_External_ABIFlags_v0 *abiflags_ext; -- Elf_Internal_ABIFlags_v0 abiflags_in; -+ if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL, -+ display_mips_gnu_attribute)) -+ res = false; - -- if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size) -- { -- error (_("Corrupt MIPS ABI Flags section.\n")); -- res = false; -- } -- else -+ sect = find_section (filedata, ".MIPS.abiflags"); -+ -+ if (sect != NULL) - { -- abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1, -- sect->sh_size, _("MIPS ABI Flags section")); -- if (abiflags_ext) -+ Elf_External_ABIFlags_v0 *abiflags_ext; -+ Elf_Internal_ABIFlags_v0 abiflags_in; -+ -+ if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size) - { -- abiflags_in.version = BYTE_GET (abiflags_ext->version); -- abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level); -- abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev); -- abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size); -- abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size); -- abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size); -- abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi); -- abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext); -- abiflags_in.ases = BYTE_GET (abiflags_ext->ases); -- abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1); -- abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2); -- -- printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version); -- printf ("\nISA: MIPS%d", abiflags_in.isa_level); -- if (abiflags_in.isa_rev > 1) -- printf ("r%d", abiflags_in.isa_rev); -- printf ("\nGPR size: %d", -- get_mips_reg_size (abiflags_in.gpr_size)); -- printf ("\nCPR1 size: %d", -- get_mips_reg_size (abiflags_in.cpr1_size)); -- printf ("\nCPR2 size: %d", -- get_mips_reg_size (abiflags_in.cpr2_size)); -- fputs ("\nFP ABI: ", stdout); -- print_mips_fp_abi_value (abiflags_in.fp_abi); -- fputs ("ISA Extension: ", stdout); -- print_mips_isa_ext (abiflags_in.isa_ext); -- fputs ("\nASEs:", stdout); -- print_mips_ases (abiflags_in.ases); -- printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1); -- printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2); -- fputc ('\n', stdout); -- free (abiflags_ext); -+ error (_("Corrupt MIPS ABI Flags section.\n")); -+ res = false; -+ } -+ else -+ { -+ abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1, -+ sect->sh_size, _("MIPS ABI Flags section")); -+ if (abiflags_ext) -+ { -+ abiflags_in.version = BYTE_GET (abiflags_ext->version); -+ abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level); -+ abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev); -+ abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size); -+ abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size); -+ abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size); -+ abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi); -+ abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext); -+ abiflags_in.ases = BYTE_GET (abiflags_ext->ases); -+ abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1); -+ abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2); -+ -+ printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version); -+ printf ("\nISA: MIPS%d", abiflags_in.isa_level); -+ if (abiflags_in.isa_rev > 1) -+ printf ("r%d", abiflags_in.isa_rev); -+ printf ("\nGPR size: %d", -+ get_mips_reg_size (abiflags_in.gpr_size)); -+ printf ("\nCPR1 size: %d", -+ get_mips_reg_size (abiflags_in.cpr1_size)); -+ printf ("\nCPR2 size: %d", -+ get_mips_reg_size (abiflags_in.cpr2_size)); -+ fputs ("\nFP ABI: ", stdout); -+ print_mips_fp_abi_value (abiflags_in.fp_abi); -+ fputs ("ISA Extension: ", stdout); -+ print_mips_isa_ext (abiflags_in.isa_ext); -+ fputs ("\nASEs:", stdout); -+ print_mips_ases (abiflags_in.ases); -+ printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1); -+ printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2); -+ fputc ('\n', stdout); -+ free (abiflags_ext); -+ } - } - } - } -@@ -19865,7 +20238,7 @@ process_mips_specific (Filedata * filedata) - break; - } - -- if (liblist_offset != 0 && liblistno != 0 && do_dynamic) -+ if (!dump_got && liblist_offset != 0 && liblistno != 0 && do_dynamic) - { - Elf32_External_Lib * elib; - size_t cnt; -@@ -19950,7 +20323,7 @@ process_mips_specific (Filedata * filedata) - res = false; - } - -- if (options_offset != 0) -+ if (!dump_got && options_offset != 0) - { - Elf_External_Options * eopt; - size_t offset; -@@ -20199,7 +20572,7 @@ process_mips_specific (Filedata * filedata) - res = false; - } - -- if (conflicts_offset != 0 && conflictsno != 0) -+ if (!dump_got && conflicts_offset != 0 && conflictsno != 0) - { - Elf32_Conflict * iconf; - size_t cnt; -@@ -20558,6 +20931,206 @@ process_nds32_specific (Filedata * filedata) - return true; - } - -+static int -+elf_relocation_cmp (const void *p, const void *q) -+{ -+ const elf_relocation *rp = (const elf_relocation *) p; -+ const elf_relocation *rq = (const elf_relocation *) q; -+ -+ return (rp->r_offset > rq->r_offset -+ ? 1 -+ : (rp->r_offset < rq->r_offset ? -1 : 0)); -+} -+ -+static void -+display_elf_relocation_at (uint64_t offset, uint64_t g) -+{ -+ bool matched = false; -+ -+ for (size_t i = 0; i < all_relocations_count; i++) -+ if (all_relocations_root[i].r_offset == offset) -+ { -+ if (do_wide) -+ printf (" %-22s", all_relocations_root[i].r_name); -+ else -+ printf (" %-17.17s", all_relocations_root[i].r_name); -+ -+ uint64_t off; -+ switch (all_relocations_root[i].r_type) -+ { -+ default: -+ abort (); -+ case reltype_rel: -+ case reltype_relr: -+ off = g; -+ break; -+ case reltype_rela: -+ off = all_relocations_root[i].r_addend; -+ break; -+ } -+ -+ if (all_relocations_root[i].r_symbol) -+ { -+ printf (" %s", all_relocations_root[i].r_symbol); -+ if ((int64_t) off < 0) -+ printf (" - %" PRIx64, -off); -+ else -+ printf (" + %" PRIx64, off); -+ } -+ else -+ { -+ if ((int64_t) off < 0) -+ printf (" -%" PRIx64, -off); -+ else -+ printf (" %" PRIx64, off); -+ } -+ -+ matched = true; -+ break; -+ } -+ else if (all_relocations_root[i].r_offset > offset) -+ break; -+ -+ if (!matched) -+ { -+ if (do_wide) -+ printf ("%*c", 24, ' '); -+ else -+ printf ("%*c", 19, ' '); -+ printf ("%" PRIx64, g); -+ } -+} -+ -+static bool -+process_got_section_contents (Filedata * filedata) -+{ -+ Elf_Internal_Shdr * section; -+ unsigned int i; -+ uint64_t entries; -+ unsigned char *data; -+ bool res = true; -+ -+ if (!do_got_section_contents) -+ return res; -+ -+ switch (filedata->file_header.e_machine) -+ { -+ case EM_MIPS: -+ case EM_MIPS_RS3_LE: -+ /* process_mips_specific also displays GOT related contents. */ -+ if (!do_arch) -+ res = process_mips_specific (filedata, true); -+ goto out; -+ } -+ -+ qsort (all_relocations_root, all_relocations_count, -+ sizeof (elf_relocation), elf_relocation_cmp); -+ -+ initialise_dumps_byname (filedata); -+ -+ for (i = 0, section = filedata->section_headers; -+ i < filedata->file_header.e_shnum; -+ i++, section++) -+ if (section->sh_type == SHT_PROGBITS -+ && section->sh_size != 0) -+ { -+ const char *name = printable_section_name (filedata, section); -+ -+ if (!startswith (name, ".got")) -+ continue; -+ -+ data = (unsigned char *) get_section_contents (section, -+ filedata); -+ if (data == NULL) -+ { -+ res = false; -+ goto out; -+ } -+ -+ uint32_t entsz = section->sh_entsize; -+ entries = section->sh_size / entsz; -+ if (entries == 1) -+ printf (_("\nGlobal Offset Table '%s' contains 1 entry:\n"), -+ name); -+ else -+ printf (_("\nGlobal Offset Table '%s' contains %" PRIu64 -+ " entries:\n"), name, entries); -+ -+ uint64_t g; -+ -+ if (is_32bit_elf) -+ { -+ uint32_t j, n = entries; -+ uint32_t addr; -+ struct got32 -+ { -+ unsigned char bytes[4]; -+ } *got; -+ -+ if (do_wide) -+ printf (_(" Index: Address Reloc Sym. Name + Addend/Value\n")); -+ /* |---9---| |---8--| |---------22---------| |........... */ -+ else -+ printf (_(" Index: Address Reloc Sym. Name + Addend/Value\n")); -+ /* |--7--| |---8--| |-------17------| |........... */ -+ -+ addr = section->sh_addr; -+ got = (struct got32 *) data; -+ for (j = 0; j < n; j++) -+ { -+ g = BYTE_GET (got[j].bytes); -+ if (do_wide) -+ printf ("%8" PRIu32 ": %8.8" PRIx32, j, addr); -+ else -+ printf ("%6" PRIu32 ": %8.8" PRIx32, j, addr); -+ display_elf_relocation_at (addr, g); -+ putchar ('\n'); -+ addr += entsz; -+ } -+ } -+ else -+ { -+ uint64_t j, addr; -+ struct got64 -+ { -+ unsigned char bytes[4]; -+ } *got; -+ -+ if (do_wide) -+ printf (_(" Index: Address Reloc Sym. Name + Addend/Value\n")); -+ /* |---9---| |------16------| |---------22---------| |........... */ -+ else -+ printf (_(" Index: Address Reloc Sym. Name + Addend/Value\n")); -+ /* |--7--| |----12----| |------17-------| |........... */ -+ -+ addr = section->sh_addr; -+ got = (struct got64 *) data; -+ for (j = 0; j < entries; j++) -+ { -+ g = BYTE_GET (got[j].bytes); -+ if (do_wide) -+ printf ("%8" PRIu64 ": %16.16" PRIx64, j, addr); -+ else -+ printf ("%6" PRIu64 ": %12.12" PRIx64, j, addr); -+ display_elf_relocation_at (addr, g); -+ putchar ('\n'); -+ addr += entsz; -+ } -+ } -+ -+ free (data); -+ } -+ -+ out: -+ for (size_t j = 0; j < all_relocations_count; j++) -+ free (all_relocations_root[j].r_symbol); -+ free (all_relocations_root); -+ all_relocations_root = NULL; -+ all_relocations = NULL; -+ all_relocations_count = 0; -+ return res; -+} -+ - static bool - process_gnu_liblist (Filedata * filedata) - { -@@ -23469,7 +24042,7 @@ process_arch_specific (Filedata * filedata) - - case EM_MIPS: - case EM_MIPS_RS3_LE: -- return process_mips_specific (filedata); -+ return process_mips_specific (filedata, false); - - case EM_MSP430: - return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES, -@@ -23833,6 +24406,9 @@ process_object (Filedata * filedata) - if (! process_section_contents (filedata)) - res = false; - -+ if (! process_got_section_contents (filedata)) -+ res = false; -+ - if (have_separate_files) - { - separate_info * d; -diff --git a/ld/testsuite/ld-i386/binutils.exp b/ld/testsuite/ld-i386/binutils.exp -new file mode 100644 -index 00000000000..5069c59ca9e ---- /dev/null -+++ b/ld/testsuite/ld-i386/binutils.exp -@@ -0,0 +1,45 @@ -+# Expect script for ELF/i386 binutils tests on linker outputs. -+# Copyright (C) 2025 Free Software Foundation, Inc. -+# -+# This file is part of the GNU Binutils. -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, -+# MA 02110-1301, USA. -+# -+ -+if ![is_elf_format] { -+ return -+} -+ -+if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } { -+ return -+} -+ -+run_ld_link_tests [list \ -+ [list \ -+ "Build libgot-1.so" \ -+ "-shared -melf_i386 --no-ld-generated-unwind-info \ -+ -z noseparate-code -z max-page-size=0x200000 --hash-style=sysv \ -+ $NO_DT_RELR_LDFLAGS" \ -+ "" \ -+ "--32 -mx86-used-note=no --generate-missing-build-notes=no" \ -+ {got-1.s} \ -+ {{readelf -rW libgot-1a.rd} \ -+ {readelf -aW libgot-1b.rd} \ -+ {readelf --got-contents libgot-1c.rd} \ -+ {readelf {--got-contents -W} libgot-1d.rd}} \ -+ "libgot-1.so" \ -+ ] \ -+] -diff --git a/ld/testsuite/ld-i386/got-1.s b/ld/testsuite/ld-i386/got-1.s -new file mode 100644 -index 00000000000..30e45f9be43 ---- /dev/null -+++ b/ld/testsuite/ld-i386/got-1.s -@@ -0,0 +1,7 @@ -+ .text -+ .globl func -+ .type func, @function -+func: -+ call *foo@GOT(%ebx) -+ jmp bar@PLT -+ .section .note.GNU-stack,"",@progbits -diff --git a/ld/testsuite/ld-i386/libgot-1a.rd b/ld/testsuite/ld-i386/libgot-1a.rd -new file mode 100644 -index 00000000000..b8609b8fbe2 ---- /dev/null -+++ b/ld/testsuite/ld-i386/libgot-1a.rd -@@ -0,0 +1,9 @@ -+ -+Relocation section '.rel.dyn' at offset 0x128 contains 1 entry: -+ Offset Info Type Sym. Value Symbol's Name -+0+2001fc 00000206 R_386_GLOB_DAT 00000000 foo -+ -+Relocation section '.rel.plt' at offset 0x130 contains 1 entry: -+ Offset Info Type Sym. Value Symbol's Name -+0+20020c 00000307 R_386_JUMP_SLOT 00000000 bar -+#pass -diff --git a/ld/testsuite/ld-i386/libgot-1b.rd b/ld/testsuite/ld-i386/libgot-1b.rd -new file mode 100644 -index 00000000000..faebdb49e0d ---- /dev/null -+++ b/ld/testsuite/ld-i386/libgot-1b.rd -@@ -0,0 +1,119 @@ -+ELF Header: -+ Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 -+ Class: ELF32 -+ Data: 2's complement, little endian -+ Version: 1 \(current\) -+ OS/ABI: UNIX - System V -+ ABI Version: 0 -+ Type: DYN \(Shared object file\) -+ Machine: Intel 80386 -+ Version: 0x1 -+ Entry point address: 0x0 -+ Start of program headers: 52 \(bytes into file\) -+ Start of section headers: 768 \(bytes into file\) -+ Flags: 0x0 -+ Size of this header: 52 \(bytes\) -+ Size of program headers: 32 \(bytes\) -+ Number of program headers: 4 -+ Size of section headers: 40 \(bytes\) -+ Number of section headers: 14 -+ Section header string table index: 13 -+ -+Section Headers: -+ \[Nr\] Name Type Addr Off Size ES Flg Lk Inf Al -+ \[ 0\] NULL 00000000 000000 000000 00 0 0 0 -+ \[ 1\] .hash HASH 000000b4 0000b4 000024 04 A 2 0 4 -+ \[ 2\] .dynsym DYNSYM 000000d8 0000d8 000040 10 A 3 1 4 -+ \[ 3\] .dynstr STRTAB 00000118 000118 00000e 00 A 0 0 1 -+ \[ 4\] .rel.dyn REL 00000128 000128 000008 08 A 2 0 4 -+ \[ 5\] .rel.plt REL 00000130 000130 000008 08 AI 2 10 4 -+ \[ 6\] .plt PROGBITS 00000140 000140 000020 04 AX 0 0 16 -+ \[ 7\] .text PROGBITS 00000160 000160 00000b 00 AX 0 0 1 -+ \[ 8\] .dynamic DYNAMIC 0020016c 00016c 000090 08 WA 3 0 4 -+ \[ 9\] .got PROGBITS 002001fc 0001fc 000004 04 WA 0 0 4 -+ \[10\] .got.plt PROGBITS 00200200 000200 000010 04 WA 0 0 4 -+ \[11\] .symtab SYMTAB 00000000 000210 000060 10 12 3 4 -+ \[12\] .strtab STRTAB 00000000 000270 00002d 00 0 0 1 -+ \[13\] .shstrtab STRTAB 00000000 00029d 000060 00 0 0 1 -+Key to Flags: -+ W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\), I \(info\), -+ L \(link order\), O \(extra OS processing required\), G \(group\), T \(TLS\), -+ C \(compressed\), x \(unknown\), o \(OS specific\), E \(exclude\), -+ D \(mbind\), p \(processor specific\) -+ -+There are no section groups in this file. -+ -+Program Headers: -+ Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align -+ LOAD 0x000000 0x00000000 0x00000000 0x0016b 0x0016b R E 0x200000 -+ LOAD 0x00016c 0x0020016c 0x0020016c 0x000a4 0x000a4 RW 0x200000 -+ DYNAMIC 0x00016c 0x0020016c 0x0020016c 0x00090 0x00090 RW 0x4 -+ GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x10 -+ -+ Section to Segment mapping: -+ Segment Sections... -+ 00 .hash .dynsym .dynstr .rel.dyn .rel.plt .plt .text -+ 01 .dynamic .got .got.plt -+ 02 .dynamic -+ 03 -+ -+Dynamic section at offset 0x16c contains 13 entries: -+ Tag Type Name/Value -+ 0x00000004 \(HASH\) 0xb4 -+ 0x00000005 \(STRTAB\) 0x118 -+ 0x00000006 \(SYMTAB\) 0xd8 -+ 0x0000000a \(STRSZ\) 14 \(bytes\) -+ 0x0000000b \(SYMENT\) 16 \(bytes\) -+ 0x00000003 \(PLTGOT\) 0x200200 -+ 0x00000002 \(PLTRELSZ\) 8 \(bytes\) -+ 0x00000014 \(PLTREL\) REL -+ 0x00000017 \(JMPREL\) 0x130 -+ 0x00000011 \(REL\) 0x128 -+ 0x00000012 \(RELSZ\) 8 \(bytes\) -+ 0x00000013 \(RELENT\) 8 \(bytes\) -+ 0x00000000 \(NULL\) 0x0 -+ -+Relocation section '.rel.dyn' at offset 0x128 contains 1 entry: -+ Offset Info Type Sym. Value Symbol's Name -+0+2001fc 00000206 R_386_GLOB_DAT 00000000 foo -+ -+Relocation section '.rel.plt' at offset 0x130 contains 1 entry: -+ Offset Info Type Sym. Value Symbol's Name -+0+20020c 00000307 R_386_JUMP_SLOT 00000000 bar -+No processor specific unwind information to decode -+ -+Symbol table '.dynsym' contains 4 entries: -+ Num: Value Size Type Bind Vis Ndx Name -+ +[a-f0-9]+: 00000000 0 NOTYPE LOCAL DEFAULT UND -+ +[a-f0-9]+: 00000160 0 FUNC GLOBAL DEFAULT 7 func -+ +[a-f0-9]+: 00000000 0 NOTYPE GLOBAL DEFAULT UND foo -+ +[a-f0-9]+: 00000000 0 NOTYPE GLOBAL DEFAULT UND bar -+ -+Symbol table '.symtab' contains 6 entries: -+ Num: Value Size Type Bind Vis Ndx Name -+ +[a-f0-9]+: 00000000 0 NOTYPE LOCAL DEFAULT UND -+ +[a-f0-9]+: 0020016c 0 OBJECT LOCAL DEFAULT 8 _DYNAMIC -+ +[a-f0-9]+: 00200200 0 OBJECT LOCAL DEFAULT 10 _GLOBAL_OFFSET_TABLE_ -+ +[a-f0-9]+: 00000160 0 FUNC GLOBAL DEFAULT 7 func -+ +[a-f0-9]+: 00000000 0 NOTYPE GLOBAL DEFAULT UND foo -+ +[a-f0-9]+: 00000000 0 NOTYPE GLOBAL DEFAULT UND bar -+ -+Histogram for bucket list length \(total of 3 buckets\): -+ Length Number % of total Coverage -+ 0 1 \( 33.3%\) -+ 1 1 \( 33.3%\) 33.3% -+ 2 1 \( 33.3%\) 100.0% -+ -+No version information found in this file. -+ -+Global Offset Table '.got' contains 1 entry: -+ Index: Address Reloc Sym. Name \+ Addend/Value -+ +[0-9]+: 002001fc R_386_GLOB_DAT foo \+ 0 -+ -+Global Offset Table '.got.plt' contains 4 entries: -+ Index: Address Reloc Sym. Name \+ Addend/Value -+ +[0-9]+: 00200200 20016c -+ +[0-9]+: 00200204 0 -+ +[0-9]+: 00200208 0 -+ +[0-9]+: 0020020c R_386_JUMP_SLOT bar \+ 156 -+#pass -diff --git a/ld/testsuite/ld-i386/libgot-1c.rd b/ld/testsuite/ld-i386/libgot-1c.rd -new file mode 100644 -index 00000000000..374b03f1658 ---- /dev/null -+++ b/ld/testsuite/ld-i386/libgot-1c.rd -@@ -0,0 +1,12 @@ -+ -+Global Offset Table '.got' contains 1 entry: -+ Index: Address Reloc Sym. Name \+ Addend/Value -+ +[0-9]+: 002001fc R_386_GLOB_DAT foo \+ 0 -+ -+Global Offset Table '.got.plt' contains 4 entries: -+ Index: Address Reloc Sym. Name \+ Addend/Value -+ +[0-9]+: 00200200 20016c -+ +[0-9]+: 00200204 0 -+ +[0-9]+: 00200208 0 -+ +[0-9]+: 0020020c R_386_JUMP_SLOT bar \+ 156 -+#pass -diff --git a/ld/testsuite/ld-i386/libgot-1d.rd b/ld/testsuite/ld-i386/libgot-1d.rd -new file mode 100644 -index 00000000000..632b47be743 ---- /dev/null -+++ b/ld/testsuite/ld-i386/libgot-1d.rd -@@ -0,0 +1,12 @@ -+ -+Global Offset Table '.got' contains 1 entry: -+ Index: Address Reloc Sym. Name \+ Addend/Value -+ +[0-9]+: 002001fc R_386_GLOB_DAT foo \+ 0 -+ -+Global Offset Table '.got.plt' contains 4 entries: -+ Index: Address Reloc Sym. Name \+ Addend/Value -+ +[0-9]+: 00200200 20016c -+ +[0-9]+: 00200204 0 -+ +[0-9]+: 00200208 0 -+ +[0-9]+: 0020020c R_386_JUMP_SLOT bar \+ 156 -+#pass -diff --git a/ld/testsuite/ld-x86-64/binutils.exp b/ld/testsuite/ld-x86-64/binutils.exp -new file mode 100644 -index 00000000000..fef997368db ---- /dev/null -+++ b/ld/testsuite/ld-x86-64/binutils.exp -@@ -0,0 +1,59 @@ -+# Expect script for ELF/x86-64 binutils tests on linker outputs. -+# Copyright (C) 2025 Free Software Foundation, Inc. -+# -+# This file is part of the GNU Binutils. -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, -+# MA 02110-1301, USA. -+# -+ -+if ![is_elf_format] { -+ return -+} -+ -+if { ![istarget "x86_64-*-*"] } { -+ return -+} -+ -+run_ld_link_tests [list \ -+ [list \ -+ "Build libgot-1.so" \ -+ "-shared -melf_x86_64 --no-ld-generated-unwind-info \ -+ -z noseparate-code -z max-page-size=0x200000 --hash-style=sysv \ -+ -z nomark-plt $NO_DT_RELR_LDFLAGS" \ -+ "" \ -+ "--64 -mx86-used-note=no --generate-missing-build-notes=no" \ -+ {got-1.s} \ -+ {{readelf -rW libgot-1a.rd} \ -+ {readelf -aW libgot-1b.rd} \ -+ {readelf --got-contents libgot-1c.rd} \ -+ {readelf {--got-contents -W} libgot-1d.rd}} \ -+ "libgot-1.so" \ -+ ] \ -+ [list \ -+ "Build libgot-1-x32.so" \ -+ "-shared -melf32_x86_64 --no-ld-generated-unwind-info \ -+ -z noseparate-code -z max-page-size=0x200000 --hash-style=sysv \ -+ -z nomark-plt $NO_DT_RELR_LDFLAGS" \ -+ "" \ -+ "--x32 -mx86-used-note=no --generate-missing-build-notes=no" \ -+ {got-1.s} \ -+ {{readelf -rW libgot-1a-x32.rd} \ -+ {readelf -aW libgot-1b-x32.rd} \ -+ {readelf --got-contents libgot-1c-x32.rd} \ -+ {readelf {--got-contents -W} libgot-1d-x32.rd}} \ -+ "libgot-1-x32.so" \ -+ ] \ -+] -diff --git a/ld/testsuite/ld-x86-64/got-1.s b/ld/testsuite/ld-x86-64/got-1.s -new file mode 100644 -index 00000000000..76370691f1d ---- /dev/null -+++ b/ld/testsuite/ld-x86-64/got-1.s -@@ -0,0 +1,7 @@ -+ .text -+ .globl func -+ .type func, @function -+func: -+ call *foo@GOTPCREL(%rip) -+ jmp bar@PLT -+ .section .note.GNU-stack,"",@progbits -diff --git a/ld/testsuite/ld-x86-64/libgot-1a-x32.rd b/ld/testsuite/ld-x86-64/libgot-1a-x32.rd -new file mode 100644 -index 00000000000..6861d6588d6 ---- /dev/null -+++ b/ld/testsuite/ld-x86-64/libgot-1a-x32.rd -@@ -0,0 +1,9 @@ -+ -+Relocation section '.rela.dyn' at offset 0x128 contains 1 entry: -+ Offset Info Type Sym. Value Symbol's Name \+ Addend -+0+200200 00000206 R_X86_64_GLOB_DAT 00000000 foo \+ 0 -+ -+Relocation section '.rela.plt' at offset 0x134 contains 1 entry: -+ Offset Info Type Sym. Value Symbol's Name \+ Addend -+0+200220 00000307 R_X86_64_JUMP_SLOT 00000000 bar \+ 0 -+#pass -diff --git a/ld/testsuite/ld-x86-64/libgot-1a.rd b/ld/testsuite/ld-x86-64/libgot-1a.rd -new file mode 100644 -index 00000000000..8ed447003c7 ---- /dev/null -+++ b/ld/testsuite/ld-x86-64/libgot-1a.rd -@@ -0,0 +1,9 @@ -+ -+Relocation section '.rela.dyn' at offset 0x1b8 contains 1 entry: -+ Offset Info Type Symbol's Value Symbol's Name \+ Addend -+0+200340 0000000200000006 R_X86_64_GLOB_DAT 0000000000000000 foo \+ 0 -+ -+Relocation section '.rela.plt' at offset 0x1d0 contains 1 entry: -+ Offset Info Type Symbol's Value Symbol's Name \+ Addend -+0+200360 0000000300000007 R_X86_64_JUMP_SLOT 0000000000000000 bar \+ 0 -+#pass -diff --git a/ld/testsuite/ld-x86-64/libgot-1b-x32.rd b/ld/testsuite/ld-x86-64/libgot-1b-x32.rd -new file mode 100644 -index 00000000000..f900303fcce ---- /dev/null -+++ b/ld/testsuite/ld-x86-64/libgot-1b-x32.rd -@@ -0,0 +1,119 @@ -+ELF Header: -+ Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 -+ Class: ELF32 -+ Data: 2's complement, little endian -+ Version: 1 \(current\) -+ OS/ABI: UNIX - System V -+ ABI Version: 0 -+ Type: DYN \(Shared object file\) -+ Machine: Advanced Micro Devices X86-64 -+ Version: 0x1 -+ Entry point address: 0x0 -+ Start of program headers: 52 \(bytes into file\) -+ Start of section headers: 792 \(bytes into file\) -+ Flags: 0x0 -+ Size of this header: 52 \(bytes\) -+ Size of program headers: 32 \(bytes\) -+ Number of program headers: 4 -+ Size of section headers: 40 \(bytes\) -+ Number of section headers: 14 -+ Section header string table index: 13 -+ -+Section Headers: -+ \[Nr\] Name Type Addr Off Size ES Flg Lk Inf Al -+ \[ 0\] NULL 00000000 000000 000000 00 0 0 0 -+ \[ 1\] .hash HASH 000000b4 0000b4 000024 04 A 2 0 4 -+ \[ 2\] .dynsym DYNSYM 000000d8 0000d8 000040 10 A 3 1 4 -+ \[ 3\] .dynstr STRTAB 00000118 000118 00000e 00 A 0 0 1 -+ \[ 4\] .rela.dyn RELA 00000128 000128 00000c 0c A 2 0 4 -+ \[ 5\] .rela.plt RELA 00000134 000134 00000c 0c AI 2 10 4 -+ \[ 6\] .plt PROGBITS 00000140 000140 000020 10 AX 0 0 16 -+ \[ 7\] .text PROGBITS 00000160 000160 00000b 00 AX 0 0 1 -+ \[ 8\] .dynamic DYNAMIC 0020016c 00016c 000090 08 WA 3 0 4 -+ \[ 9\] .got PROGBITS 00200200 000200 000008 08 WA 0 0 8 -+ \[10\] .got.plt PROGBITS 00200208 000208 000020 08 WA 0 0 8 -+ \[11\] .symtab SYMTAB 00000000 000228 000060 10 12 3 4 -+ \[12\] .strtab STRTAB 00000000 000288 00002d 00 0 0 1 -+ \[13\] .shstrtab STRTAB 00000000 0002b5 000062 00 0 0 1 -+Key to Flags: -+ W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\), I \(info\), -+ L \(link order\), O \(extra OS processing required\), G \(group\), T \(TLS\), -+ C \(compressed\), x \(unknown\), o \(OS specific\), E \(exclude\), -+ D \(mbind\), l \(large\), p \(processor specific\) -+ -+There are no section groups in this file. -+ -+Program Headers: -+ Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align -+ LOAD 0x000000 0x00000000 0x00000000 0x0016b 0x0016b R E 0x200000 -+ LOAD 0x00016c 0x0020016c 0x0020016c 0x000bc 0x000bc RW 0x200000 -+ DYNAMIC 0x00016c 0x0020016c 0x0020016c 0x00090 0x00090 RW 0x4 -+ GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x10 -+ -+ Section to Segment mapping: -+ Segment Sections... -+ 00 .hash .dynsym .dynstr .rela.dyn .rela.plt .plt .text -+ 01 .dynamic .got .got.plt -+ 02 .dynamic -+ 03 -+ -+Dynamic section at offset 0x16c contains 13 entries: -+ Tag Type Name/Value -+ 0x00000004 \(HASH\) 0xb4 -+ 0x00000005 \(STRTAB\) 0x118 -+ 0x00000006 \(SYMTAB\) 0xd8 -+ 0x0000000a \(STRSZ\) 14 \(bytes\) -+ 0x0000000b \(SYMENT\) 16 \(bytes\) -+ 0x00000003 \(PLTGOT\) 0x200208 -+ 0x00000002 \(PLTRELSZ\) 12 \(bytes\) -+ 0x00000014 \(PLTREL\) RELA -+ 0x00000017 \(JMPREL\) 0x134 -+ 0x00000007 \(RELA\) 0x128 -+ 0x00000008 \(RELASZ\) 12 \(bytes\) -+ 0x00000009 \(RELAENT\) 12 \(bytes\) -+ 0x00000000 \(NULL\) 0x0 -+ -+Relocation section '.rela.dyn' at offset 0x128 contains 1 entry: -+ Offset Info Type Sym. Value Symbol's Name \+ Addend -+0+200200 00000206 R_X86_64_GLOB_DAT 00000000 foo \+ 0 -+ -+Relocation section '.rela.plt' at offset 0x134 contains 1 entry: -+ Offset Info Type Sym. Value Symbol's Name \+ Addend -+0+200220 00000307 R_X86_64_JUMP_SLOT 00000000 bar \+ 0 -+No processor specific unwind information to decode -+ -+Symbol table '.dynsym' contains 4 entries: -+ Num: Value Size Type Bind Vis Ndx Name -+ +[a-f0-9]+: 00000000 0 NOTYPE LOCAL DEFAULT UND -+ +[a-f0-9]+: 00000160 0 FUNC GLOBAL DEFAULT 7 func -+ +[a-f0-9]+: 00000000 0 NOTYPE GLOBAL DEFAULT UND foo -+ +[a-f0-9]+: 00000000 0 NOTYPE GLOBAL DEFAULT UND bar -+ -+Symbol table '.symtab' contains 6 entries: -+ Num: Value Size Type Bind Vis Ndx Name -+ +[a-f0-9]+: 00000000 0 NOTYPE LOCAL DEFAULT UND -+ +[a-f0-9]+: 0020016c 0 OBJECT LOCAL DEFAULT 8 _DYNAMIC -+ +[a-f0-9]+: 00200208 0 OBJECT LOCAL DEFAULT 10 _GLOBAL_OFFSET_TABLE_ -+ +[a-f0-9]+: 00000160 0 FUNC GLOBAL DEFAULT 7 func -+ +[a-f0-9]+: 00000000 0 NOTYPE GLOBAL DEFAULT UND foo -+ +[a-f0-9]+: 00000000 0 NOTYPE GLOBAL DEFAULT UND bar -+ -+Histogram for bucket list length \(total of 3 buckets\): -+ Length Number % of total Coverage -+ 0 1 \( 33.3%\) -+ 1 1 \( 33.3%\) 33.3% -+ 2 1 \( 33.3%\) 100.0% -+ -+No version information found in this file. -+ -+Global Offset Table '.got' contains 1 entry: -+ Index: Address Reloc Sym. Name \+ Addend/Value -+ +[0-9]+: 00200200 R_X86_64_GLOB_DAT foo \+ 0 -+ -+Global Offset Table '.got.plt' contains 4 entries: -+ Index: Address Reloc Sym. Name \+ Addend/Value -+ +[0-9]+: 00200208 20016c -+ +[0-9]+: 00200210 0 -+ +[0-9]+: 00200218 0 -+ +[0-9]+: 00200220 R_X86_64_JUMP_SLOT bar \+ 0 -+#pass -diff --git a/ld/testsuite/ld-x86-64/libgot-1b.rd b/ld/testsuite/ld-x86-64/libgot-1b.rd -new file mode 100644 -index 00000000000..18e432475fc ---- /dev/null -+++ b/ld/testsuite/ld-x86-64/libgot-1b.rd -@@ -0,0 +1,119 @@ -+ELF Header: -+ Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 -+ Class: ELF64 -+ Data: 2's complement, little endian -+ Version: 1 \(current\) -+ OS/ABI: UNIX - System V -+ ABI Version: 0 -+ Type: DYN \(Shared object file\) -+ Machine: Advanced Micro Devices X86-64 -+ Version: 0x1 -+ Entry point address: 0x0 -+ Start of program headers: 64 \(bytes into file\) -+ Start of section headers: 1160 \(bytes into file\) -+ Flags: 0x0 -+ Size of this header: 64 \(bytes\) -+ Size of program headers: 56 \(bytes\) -+ Number of program headers: 4 -+ Size of section headers: 64 \(bytes\) -+ Number of section headers: 14 -+ Section header string table index: 13 -+ -+Section Headers: -+ \[Nr\] Name Type Address Off Size ES Flg Lk Inf Al -+ \[ 0\] NULL 0000000000000000 000000 000000 00 0 0 0 -+ \[ 1\] .hash HASH 0000000000000120 000120 000024 04 A 2 0 8 -+ \[ 2\] .dynsym DYNSYM 0000000000000148 000148 000060 18 A 3 1 8 -+ \[ 3\] .dynstr STRTAB 00000000000001a8 0001a8 00000e 00 A 0 0 1 -+ \[ 4\] .rela.dyn RELA 00000000000001b8 0001b8 000018 18 A 2 0 8 -+ \[ 5\] .rela.plt RELA 00000000000001d0 0001d0 000018 18 AI 2 10 8 -+ \[ 6\] .plt PROGBITS 00000000000001f0 0001f0 000020 10 AX 0 0 16 -+ \[ 7\] .text PROGBITS 0000000000000210 000210 00000b 00 AX 0 0 1 -+ \[ 8\] .dynamic DYNAMIC 0000000000200220 000220 000120 10 WA 3 0 8 -+ \[ 9\] .got PROGBITS 0000000000200340 000340 000008 08 WA 0 0 8 -+ \[10\] .got.plt PROGBITS 0000000000200348 000348 000020 08 WA 0 0 8 -+ \[11\] .symtab SYMTAB 0000000000000000 000368 000090 18 12 3 8 -+ \[12\] .strtab STRTAB 0000000000000000 0003f8 00002d 00 0 0 1 -+ \[13\] .shstrtab STRTAB 0000000000000000 000425 000062 00 0 0 1 -+Key to Flags: -+ W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\), I \(info\), -+ L \(link order\), O \(extra OS processing required\), G \(group\), T \(TLS\), -+ C \(compressed\), x \(unknown\), o \(OS specific\), E \(exclude\), -+ D \(mbind\), l \(large\), p \(processor specific\) -+ -+There are no section groups in this file. -+ -+Program Headers: -+ Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align -+ LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x00021b 0x00021b R E 0x200000 -+ LOAD 0x000220 0x0000000000200220 0x0000000000200220 0x000148 0x000148 RW 0x200000 -+ DYNAMIC 0x000220 0x0000000000200220 0x0000000000200220 0x000120 0x000120 RW 0x8 -+ GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x10 -+ -+ Section to Segment mapping: -+ Segment Sections... -+ 00 .hash .dynsym .dynstr .rela.dyn .rela.plt .plt .text -+ 01 .dynamic .got .got.plt -+ 02 .dynamic -+ 03 -+ -+Dynamic section at offset 0x220 contains 13 entries: -+ Tag Type Name/Value -+ 0x0000000000000004 \(HASH\) 0x120 -+ 0x0000000000000005 \(STRTAB\) 0x1a8 -+ 0x0000000000000006 \(SYMTAB\) 0x148 -+ 0x000000000000000a \(STRSZ\) 14 \(bytes\) -+ 0x000000000000000b \(SYMENT\) 24 \(bytes\) -+ 0x0000000000000003 \(PLTGOT\) 0x200348 -+ 0x0000000000000002 \(PLTRELSZ\) 24 \(bytes\) -+ 0x0000000000000014 \(PLTREL\) RELA -+ 0x0000000000000017 \(JMPREL\) 0x1d0 -+ 0x0000000000000007 \(RELA\) 0x1b8 -+ 0x0000000000000008 \(RELASZ\) 24 \(bytes\) -+ 0x0000000000000009 \(RELAENT\) 24 \(bytes\) -+ 0x0000000000000000 \(NULL\) 0x0 -+ -+Relocation section '.rela.dyn' at offset 0x1b8 contains 1 entry: -+ Offset Info Type Symbol's Value Symbol's Name \+ Addend -+0+200340 0000000200000006 R_X86_64_GLOB_DAT 0000000000000000 foo \+ 0 -+ -+Relocation section '.rela.plt' at offset 0x1d0 contains 1 entry: -+ Offset Info Type Symbol's Value Symbol's Name \+ Addend -+0+200360 0000000300000007 R_X86_64_JUMP_SLOT 0000000000000000 bar \+ 0 -+No processor specific unwind information to decode -+ -+Symbol table '.dynsym' contains 4 entries: -+ Num: Value Size Type Bind Vis Ndx Name -+ +[a-f0-9]+: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND -+ +[a-f0-9]+: 0000000000000210 0 FUNC GLOBAL DEFAULT 7 func -+ +[a-f0-9]+: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND foo -+ +[a-f0-9]+: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND bar -+ -+Symbol table '.symtab' contains 6 entries: -+ Num: Value Size Type Bind Vis Ndx Name -+ +[a-f0-9]+: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND -+ +[a-f0-9]+: 0000000000200220 0 OBJECT LOCAL DEFAULT 8 _DYNAMIC -+ +[a-f0-9]+: 0000000000200348 0 OBJECT LOCAL DEFAULT 10 _GLOBAL_OFFSET_TABLE_ -+ +[a-f0-9]+: 0000000000000210 0 FUNC GLOBAL DEFAULT 7 func -+ +[a-f0-9]+: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND foo -+ +[a-f0-9]+: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND bar -+ -+Histogram for bucket list length \(total of 3 buckets\): -+ Length Number % of total Coverage -+ 0 1 \( 33.3%\) -+ 1 1 \( 33.3%\) 33.3% -+ 2 1 \( 33.3%\) 100.0% -+ -+No version information found in this file. -+ -+Global Offset Table '.got' contains 1 entry: -+ Index: Address Reloc Sym. Name \+ Addend/Value -+ +[0-9]+: 0000000000200340 R_X86_64_GLOB_DAT foo \+ 0 -+ -+Global Offset Table '.got.plt' contains 4 entries: -+ Index: Address Reloc Sym. Name \+ Addend/Value -+ +[0-9]+: 0000000000200348 200220 -+ +[0-9]+: 0000000000200350 0 -+ +[0-9]+: 0000000000200358 0 -+ +[0-9]+: 0000000000200360 R_X86_64_JUMP_SLOT bar \+ 0 -+#pass -diff --git a/ld/testsuite/ld-x86-64/libgot-1c-x32.rd b/ld/testsuite/ld-x86-64/libgot-1c-x32.rd -new file mode 100644 -index 00000000000..a3bdacf1fa4 ---- /dev/null -+++ b/ld/testsuite/ld-x86-64/libgot-1c-x32.rd -@@ -0,0 +1,12 @@ -+ -+Global Offset Table '.got' contains 1 entry: -+ Index: Address Reloc Sym. Name \+ Addend/Value -+ +[0-9]+: 00200200 R_X86_64_GLOB_DAT foo \+ 0 -+ -+Global Offset Table '.got.plt' contains 4 entries: -+ Index: Address Reloc Sym. Name \+ Addend/Value -+ +[0-9]+: 00200208 20016c -+ +[0-9]+: 00200210 0 -+ +[0-9]+: 00200218 0 -+ +[0-9]+: 00200220 R_X86_64_JUMP_SLO bar \+ 0 -+#pass -diff --git a/ld/testsuite/ld-x86-64/libgot-1c.rd b/ld/testsuite/ld-x86-64/libgot-1c.rd -new file mode 100644 -index 00000000000..fc1a2605848 ---- /dev/null -+++ b/ld/testsuite/ld-x86-64/libgot-1c.rd -@@ -0,0 +1,12 @@ -+ -+Global Offset Table '.got' contains 1 entry: -+ Index: Address Reloc Sym. Name \+ Addend/Value -+ +[0-9]+: 000000200340 R_X86_64_GLOB_DAT foo \+ 0 -+ -+Global Offset Table '.got.plt' contains 4 entries: -+ Index: Address Reloc Sym. Name \+ Addend/Value -+ +[0-9]+: 000000200348 200220 -+ +[0-9]+: 000000200350 0 -+ +[0-9]+: 000000200358 0 -+ +[0-9]+: 000000200360 R_X86_64_JUMP_SLO bar \+ 0 -+#pass -diff --git a/ld/testsuite/ld-x86-64/libgot-1d-x32.rd b/ld/testsuite/ld-x86-64/libgot-1d-x32.rd -new file mode 100644 -index 00000000000..3e2693e0f52 ---- /dev/null -+++ b/ld/testsuite/ld-x86-64/libgot-1d-x32.rd -@@ -0,0 +1,12 @@ -+ -+Global Offset Table '.got' contains 1 entry: -+ Index: Address Reloc Sym. Name \+ Addend/Value -+ +[0-9]+: 00200200 R_X86_64_GLOB_DAT foo \+ 0 -+ -+Global Offset Table '.got.plt' contains 4 entries: -+ Index: Address Reloc Sym. Name \+ Addend/Value -+ +[0-9]+: 00200208 20016c -+ +[0-9]+: 00200210 0 -+ +[0-9]+: 00200218 0 -+ +[0-9]+: 00200220 R_X86_64_JUMP_SLOT bar \+ 0 -+#pass -diff --git a/ld/testsuite/ld-x86-64/libgot-1d.rd b/ld/testsuite/ld-x86-64/libgot-1d.rd -new file mode 100644 -index 00000000000..341840e9081 ---- /dev/null -+++ b/ld/testsuite/ld-x86-64/libgot-1d.rd -@@ -0,0 +1,12 @@ -+ -+Global Offset Table '.got' contains 1 entry: -+ Index: Address Reloc Sym. Name \+ Addend/Value -+ +[0-9]+: 0000000000200340 R_X86_64_GLOB_DAT foo \+ 0 -+ -+Global Offset Table '.got.plt' contains 4 entries: -+ Index: Address Reloc Sym. Name \+ Addend/Value -+ +[0-9]+: 0000000000200348 200220 -+ +[0-9]+: 0000000000200350 0 -+ +[0-9]+: 0000000000200358 0 -+ +[0-9]+: 0000000000200360 R_X86_64_JUMP_SLOT bar \+ 0 -+#pass --- -2.51.0 -
