diff options
author | Thiemo Seufer <ths@networkno.de> | 2005-03-05 00:01:44 +0000 |
---|---|---|
committer | Thiemo Seufer <ths@networkno.de> | 2005-03-05 00:01:44 +0000 |
commit | 19ab14041cd0db75ff6aeb82347cab1766e9fbc1 (patch) | |
tree | 05ed6227ecfac0771c30ffee950f28a6d79ac96e /bfd | |
parent | 33f264dcbb43b742aeff65a5ef6e243df36ade53 (diff) | |
download | binutils-redhat-19ab14041cd0db75ff6aeb82347cab1766e9fbc1.tar.gz |
bfd/ChangeLog
* elfxx-mips.c (mips_elf_calculate_relocation): Handle special
'__gnu_local_gp' symbol used by gas -mno-shared.
gas/ChangeLog
* config/tc-mips.c (macro_build_lui): Use '__gnu_local_gp'
instead of '_gp' for -mno-shared optimization.
(s_cpload): Ditto.
(s_abicalls): Document it in the comment.
(md_show_usage): Document the -mno-shared option.
gas/testsuite/ChangeLog
* gas/mips/elf-rel23b.d: Use '__gnu_local_gp' instead of '_gp'
for -mno-shared optimization.
* gas/mips/elf-rel25a.d: Ditto.
ld/testsuite/ChangeLog
* ld-mips-elf/multi-got-no-shared-1.s,
ld-mips-elf/multi-got-no-shared-2.s,
ld-mips-elf/multi-got-no-shared.d: New tests.
* ld-mips-elf/mips-elf.exp: Run them.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elfxx-mips.c | 12 |
2 files changed, 17 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b2d3a3f1e5..af8d64edd7 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2005-03-04 David Daney <ddaney@avtrex.com> + + * elfxx-mips.c (mips_elf_calculate_relocation): Handle special + '__gnu_local_gp' symbol used by gas -mno-shared. + 2005-03-03 H.J. Lu <hongjiu.lu@intel.com> * elf-bfd.h (elf_backend_data): Add "const char *" to diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 5c2e5b4f25..847e7e6af2 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -3646,6 +3646,9 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, bfd_boolean local_p, was_local_p; /* TRUE if the symbol referred to by this relocation is "_gp_disp". */ bfd_boolean gp_disp_p = FALSE; + /* TRUE if the symbol referred to by this relocation is + "__gnu_local_gp". */ + bfd_boolean gnu_local_gp_p = FALSE; Elf_Internal_Shdr *symtab_hdr; size_t extsymoff; unsigned long r_symndx; @@ -3742,6 +3745,12 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, gp_disp_p = TRUE; } + /* See if this is the special _gp symbol. Note that such a + symbol must always be a global symbol. */ + else if (strcmp (*namep, "__gnu_local_gp") == 0) + gnu_local_gp_p = TRUE; + + /* If this symbol is defined, calculate its address. Note that _gp_disp is a magic symbol, always implicitly defined by the linker, so it's inappropriate to check to see whether or not @@ -3956,6 +3965,9 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, break; } + if (gnu_local_gp_p) + symbol = gp; + /* Figure out what kind of relocation is being performed. */ switch (r_type) { |