This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] MIPS/BFD: Fix n64 GOT header size in the ELF backend
- From: "Maciej W. Rozycki" <macro at linux-mips dot org>
- To: binutils at sourceware dot org
- Cc: Richard Sandiford <rdsandiford at googlemail dot com>
- Date: Mon, 7 May 2012 10:55:37 +0100 (BST)
- Subject: [PATCH] MIPS/BFD: Fix n64 GOT header size in the ELF backend
Hi,
I've noticed the MIPS backend does not set the size of the GOT header
correctly in the ELF backend structure for the n64 ABI. This is mostly
harmless because the MIPS backend does not use the value from the
structure and hardcoded the header size to twice the GOT entry size.
Furthermore the MIPS backend does not use the generic GOT creation
function (_bfd_elf_create_got_section) so it escapes damage there too.
However the size from the ELF backend structure is still used in linker
garbage collection (bfd_elf_gc_common_finalize_got_offsets) that the MIPS
backend does use, although GC is not on by default. Therefore I propose
to fix it as below and make the MIPS backend use the GOT header size from
the ELF backend structure too so that there is a central place everything
depends on and any breakage is easily noticed. Surprisingly enough this
is also a bit cheaper as MIPS_ELF_GOT_SIZE implies an extra pointer
dereference and calculation (the multiplication by 2 should be cancelled
by any sane compiler though).
I have no test case available and I don't remember anymore how I spotted
this, most probably noticed it by inspection while debugging the n64
compound relocation breakage with GC I have fixed recently. However I
believe the change is obvious enough and it does not cause any regressions
in mips64-gnu-linux testing. OK to apply?
2012-05-07 Maciej W. Rozycki <macro@linux-mips.org>
bfd/
* elf64-mips.c (elf_backend_got_header_size): Correct definition.
* elfxx-mips.c (_bfd_mips_elf_adjust_dynamic_symbol): Use the ELF
backend's GOT header size instead of hardcoding it.
Maciej
binutils-mips-got-header-size.patch
Index: binutils/bfd/elf64-mips.c
===================================================================
--- binutils.orig/bfd/elf64-mips.c
+++ binutils/bfd/elf64-mips.c
@@ -3261,7 +3261,7 @@ const struct elf_size_info mips_elf64_si
#define elf_backend_grok_prstatus elf64_mips_grok_prstatus
#define elf_backend_grok_psinfo elf64_mips_grok_psinfo
-#define elf_backend_got_header_size (4 * MIPS_RESERVED_GOTNO)
+#define elf_backend_got_header_size (8 * MIPS_RESERVED_GOTNO)
/* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations
work better/work only in RELA, so we default to this. */
Index: binutils/bfd/elfxx-mips.c
===================================================================
--- binutils.orig/bfd/elfxx-mips.c
+++ binutils/bfd/elfxx-mips.c
@@ -8293,7 +8293,8 @@ _bfd_mips_elf_adjust_dynamic_symbol (str
/* On non-VxWorks targets, the first two entries in .got.plt
are reserved. */
if (!htab->is_vxworks)
- htab->sgotplt->size += 2 * MIPS_ELF_GOT_SIZE (dynobj);
+ htab->sgotplt->size
+ += get_elf_backend_data (dynobj)->got_header_size;
/* On VxWorks, also allocate room for the header's
.rela.plt.unloaded entries. */