This is the mail archive of the
binutils@sourceware.cygnus.com
mailing list for the binutils project.
PATCH for smaller GOTs on MIPS
- To: binutils@sourceware.cygnus.com
- Subject: PATCH for smaller GOTs on MIPS
- From: Mark Mitchell <mark@codesourcery.com>
- Date: Thu, 26 Aug 1999 17:15:44 -0700
- Organization: CodeSourcery, LLC
Ralf noticed that the new binutils was using more GOT space. This
patch (checked in) fixes the thinko that caused that. With this
patch, Ralf reports markedly smaller GOTs that with binutils 2.9.1,
presumably because of the fact that we're now sorting the symbol
table, which allows us to avoid GOT entries for many symbols.
Ralf, thanks again for your testing, feedback, etc.
--
Mark Mitchell mark@codesourcery.com
CodeSourcery, LLC http://www.codesourcery.com
1999-08-26 Mark Mitchell <mark@codesourcery.com>
* elf32-mips.c (_bfd_mips_elf_check_relocs): Don't allocate local
GOT entries for GOT16 relocations; they're not required.
Index: elf32-mips.c
===================================================================
RCS file: /cvs/binutils/binutils/bfd/elf32-mips.c,v
retrieving revision 1.49
diff -c -p -r1.49 elf32-mips.c
*** elf32-mips.c 1999/08/15 22:56:20 1.49
--- elf32-mips.c 1999/08/27 00:04:07
*************** _bfd_mips_elf_check_relocs (abfd, info,
*** 7456,7470 ****
if (!h && (r_type == R_MIPS_CALL_LO16
|| r_type == R_MIPS_GOT_LO16
! || r_type == R_MIPS_GOT_DISP
! || r_type == R_MIPS_GOT16))
{
/* We may need a local GOT entry for this relocation. We
don't count R_MIPS_GOT_PAGE because we can estimate the
maximum number of pages needed by looking at the size of
! the segment. We don't count R_MIPS_GOT_HI16, or
! R_MIPS_CALL_HI16 because these are always followed by an
! R_MIPS_GOT_LO16 or R_MIPS_CALL_LO16.
This estimation is very conservative since we can merge
duplicate entries in the GOT. In order to be less
--- 7456,7470 ----
if (!h && (r_type == R_MIPS_CALL_LO16
|| r_type == R_MIPS_GOT_LO16
! || r_type == R_MIPS_GOT_DISP))
{
/* We may need a local GOT entry for this relocation. We
don't count R_MIPS_GOT_PAGE because we can estimate the
maximum number of pages needed by looking at the size of
! the segment. Similar comments apply to R_MIPS_GOT16. We
! don't count R_MIPS_GOT_HI16, or R_MIPS_CALL_HI16 because
! these are always followed by an R_MIPS_GOT_LO16 or
! R_MIPS_CALL_LO16.
This estimation is very conservative since we can merge
duplicate entries in the GOT. In order to be less
*************** _bfd_mips_elf_size_dynamic_sections (out
*** 8003,8010 ****
loadable_size += MIPS_FUNCTION_STUB_SIZE;
/* Assume there are two loadable segments consisting of
! contiguous sections. Is 5 enough? */
local_gotno = (loadable_size >> 16) + 5;
g->local_gotno += local_gotno;
s->_raw_size += local_gotno * MIPS_ELF_GOT_SIZE (dynobj);
--- 8003,8016 ----
loadable_size += MIPS_FUNCTION_STUB_SIZE;
/* Assume there are two loadable segments consisting of
! contiguous sections. Is 5 enough? */
local_gotno = (loadable_size >> 16) + 5;
+ if (IRIX_COMPAT (output_bfd) == ict_irix6)
+ /* It's possible we will need GOT_PAGE entries as well as
+ GOT16 entries. Often, these will be able to share GOT
+ entries, but not always. */
+ local_gotno *= 2;
+
g->local_gotno += local_gotno;
s->_raw_size += local_gotno * MIPS_ELF_GOT_SIZE (dynobj);