diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2008-07-10 19:06:54 +0000 |
---|---|---|
committer | Richard Sandiford <rdsandiford@googlemail.com> | 2008-07-10 19:06:54 +0000 |
commit | 0a61c8c283b8f3be8efc3816b84c88bc1962b04d (patch) | |
tree | 930ade3feb09e614c88aececb05df4607b0b0785 /bfd/elfxx-mips.c | |
parent | 30c090907953c55bb80ec4af160054776d32303e (diff) | |
download | gdb-0a61c8c283b8f3be8efc3816b84c88bc1962b04d.zip gdb-0a61c8c283b8f3be8efc3816b84c88bc1962b04d.tar.gz gdb-0a61c8c283b8f3be8efc3816b84c88bc1962b04d.tar.bz2 |
bfd/
* elfxx-mips.c (mips_elf_calculate_relocation): Calculate GP and GP0
for all relocation types. Allow any type of relocation to refer to
__gnu_local_gp.
ld/testsuite/
* ld-mips-elf/no-shared-1-o32.s,
ld-mips-elf/no-shared-1-o32.d,
ld-mips-elf/no-shared-1-n32.d,
ld-mips-elf/no-shared-1-n64.s,
ld-mips-elf/no-shared-1-n64.d,
ld-mips-elf/no-shared-1.ld: New tests.
* ld-mips-elf/mips-elf.exp: Run them.
Diffstat (limited to 'bfd/elfxx-mips.c')
-rw-r--r-- | bfd/elfxx-mips.c | 38 |
1 files changed, 13 insertions, 25 deletions
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index fabae69..a67663d 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -4099,12 +4099,12 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, bfd_vma symbol = 0; /* The final GP value to be used for the relocatable, executable, or shared object file being produced. */ - bfd_vma gp = MINUS_ONE; + bfd_vma gp; /* The place (section offset or address) of the storage unit being relocated. */ bfd_vma p; /* The value of GP used to create the relocatable object. */ - bfd_vma gp0 = MINUS_ONE; + bfd_vma gp0; /* The offset into the global offset table at which the address of the relocation entry symbol, adjusted by the addend, resides during execution. */ @@ -4367,8 +4367,17 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, local_p = mips_elf_local_relocation_p (input_bfd, relocation, local_sections, TRUE); - /* If we haven't already determined the GOT offset, or the GP value, - and we're going to need it, get it now. */ + gp0 = _bfd_get_gp_value (input_bfd); + gp = _bfd_get_gp_value (abfd); + if (dynobj) + gp += mips_elf_adjust_gp (abfd, mips_elf_got_info (dynobj, NULL), + input_bfd); + + if (gnu_local_gp_p) + symbol = gp; + + /* If we haven't already determined the GOT offset, oand we're going + to need it, get it now. */ switch (r_type) { case R_MIPS_GOT_PAGE: @@ -4449,29 +4458,8 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, /* Convert GOT indices to actual offsets. */ g = mips_elf_got_offset_from_index (dynobj, abfd, input_bfd, g); break; - - case R_MIPS_HI16: - case R_MIPS_LO16: - case R_MIPS_GPREL16: - case R_MIPS_GPREL32: - case R_MIPS_LITERAL: - case R_MIPS16_HI16: - case R_MIPS16_LO16: - case R_MIPS16_GPREL: - gp0 = _bfd_get_gp_value (input_bfd); - gp = _bfd_get_gp_value (abfd); - if (dynobj) - gp += mips_elf_adjust_gp (abfd, mips_elf_got_info (dynobj, NULL), - input_bfd); - break; - - default: - break; } - if (gnu_local_gp_p) - symbol = gp; - /* Relocations against the VxWorks __GOTT_BASE__ and __GOTT_INDEX__ symbols are resolved by the loader. Add them to .rela.dyn. */ if (h != NULL && is_gott_symbol (info, &h->root)) |