From: Richard Sandiford Date: Thu, 10 Jul 2008 19:06:54 +0000 (+0000) Subject: bfd/ X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0a61c8c283b8f3be8efc3816b84c88bc1962b04d;p=binutils-gdb.git 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 60ba1a37a44..b107cd34946 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2008-07-10 Richard Sandiford + + * 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. + 2008-07-10 Richard Sandiford * elfxx-mips.c (mips_elf_check_mips16_stubs): Use ELF_ST_IS_MIPS16. diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index fabae69cdf3..a67663da1f4 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)) diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 9159c2a2dd7..d3337f3ac39 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2008-07-10 Richard Sandiford + + * 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. + 2008-07-07 Stan Shebs * ld-arm/arm-elf.exp: Use objdump -d for arm-be8 test. diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp index 86462f44481..80493e980ec 100644 --- a/ld/testsuite/ld-mips-elf/mips-elf.exp +++ b/ld/testsuite/ld-mips-elf/mips-elf.exp @@ -79,6 +79,15 @@ if { $linux_gnu } { run_dump_test "multi-got-hidden-2" } +# Test __gnu_local_gp accesses +if { $linux_gnu } { + run_dump_test "no-shared-1-o32" + if { $has_newabi } { + run_dump_test "no-shared-1-n32" + run_dump_test "no-shared-1-n64" + } +} + if $has_newabi { run_dump_test "elf-rel-got-n32" run_dump_test "elf-rel-xgot-n32" diff --git a/ld/testsuite/ld-mips-elf/no-shared-1-n32.d b/ld/testsuite/ld-mips-elf/no-shared-1-n32.d new file mode 100644 index 00000000000..a28b22e8aa7 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/no-shared-1-n32.d @@ -0,0 +1,25 @@ +#as: -mabi=n32 -EB +#source: no-shared-1-o32.s +#ld: -melf32btsmipn32 -T no-shared-1.ld +#objdump: -dr -j.text -j.data -j.got + +.* + + +Disassembly of section \.text: + +00050000 <__start>: + 50000: 3c020007 lui v0,0x7 + 50004: 24428000 addiu v0,v0,-32768 + 50008: 8f828018 lw v0,-32744\(gp\) + 5000c: 8f828018 lw v0,-32744\(gp\) +#... +Disassembly of section \.data: + +00060000 <\.data>: + 60000: 00068000 .* +#... +Disassembly of section \.got: + +00060010 <_GLOBAL_OFFSET_TABLE_>: + 60010: 00000000 80000000 00068000 .* diff --git a/ld/testsuite/ld-mips-elf/no-shared-1-n64.d b/ld/testsuite/ld-mips-elf/no-shared-1-n64.d new file mode 100644 index 00000000000..ea74ebb07fb --- /dev/null +++ b/ld/testsuite/ld-mips-elf/no-shared-1-n64.d @@ -0,0 +1,26 @@ +#as: -mabi=64 -EB +#ld: -melf64btsmip -T no-shared-1.ld +#objdump: -dr -j.text -j.data -j.got + +.* + + +Disassembly of section \.text: + +0000000000050000 <__start>: + 50000: 3c020007 lui v0,0x7 + 50004: 64428000 daddiu v0,v0,-32768 + 50008: df828020 ld v0,-32736\(gp\) + 5000c: df828020 ld v0,-32736\(gp\) +#... +Disassembly of section \.data: + +0000000000060000 <\.data>: + 60000: 00000000 .* + 60004: 00068000 .* +#... +Disassembly of section \.got: + +0000000000060010 <_GLOBAL_OFFSET_TABLE_>: + \.\.\. + 60018: 80000000 00000000 00000000 00068000 .* diff --git a/ld/testsuite/ld-mips-elf/no-shared-1-n64.s b/ld/testsuite/ld-mips-elf/no-shared-1-n64.s new file mode 100644 index 00000000000..8eedf12157b --- /dev/null +++ b/ld/testsuite/ld-mips-elf/no-shared-1-n64.s @@ -0,0 +1,13 @@ + .abicalls + .text + .globl __start + .ent __start +__start: + lui $2,%hi(__gnu_local_gp) + daddiu $2,$2,%lo(__gnu_local_gp) + ld $2,%got(__gnu_local_gp)($gp) + ld $2,%call16(__gnu_local_gp)($gp) + .end __start + + .data + .8byte __gnu_local_gp diff --git a/ld/testsuite/ld-mips-elf/no-shared-1-o32.d b/ld/testsuite/ld-mips-elf/no-shared-1-o32.d new file mode 100644 index 00000000000..b67737fd266 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/no-shared-1-o32.d @@ -0,0 +1,24 @@ +#as: -mabi=32 -EB +#ld: -melf32btsmip -T no-shared-1.ld +#objdump: -dr -j.text -j.data -j.got + +.* + + +Disassembly of section \.text: + +00050000 <__start>: + 50000: 3c020007 lui v0,0x7 + 50004: 24428000 addiu v0,v0,-32768 + 50008: 8f828018 lw v0,-32744\(gp\) + 5000c: 8f828018 lw v0,-32744\(gp\) +#... +Disassembly of section \.data: + +00060000 <\.data>: + 60000: 00068000 .* +#... +Disassembly of section \.got: + +00060010 <_GLOBAL_OFFSET_TABLE_>: + 60010: 00000000 80000000 00068000 .* diff --git a/ld/testsuite/ld-mips-elf/no-shared-1-o32.s b/ld/testsuite/ld-mips-elf/no-shared-1-o32.s new file mode 100644 index 00000000000..f00fc4ba915 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/no-shared-1-o32.s @@ -0,0 +1,13 @@ + .abicalls + .text + .globl __start + .ent __start +__start: + lui $2,%hi(__gnu_local_gp) + addiu $2,$2,%lo(__gnu_local_gp) + lw $2,%got(__gnu_local_gp)($gp) + lw $2,%call16(__gnu_local_gp)($gp) + .end __start + + .data + .4byte __gnu_local_gp diff --git a/ld/testsuite/ld-mips-elf/no-shared-1.ld b/ld/testsuite/ld-mips-elf/no-shared-1.ld new file mode 100644 index 00000000000..06d28a6e41c --- /dev/null +++ b/ld/testsuite/ld-mips-elf/no-shared-1.ld @@ -0,0 +1,11 @@ +SECTIONS +{ + . = 0x50000; + .text : { *(.text) } + .MIPS.stubs : { *(.MIPS.stubs) } + + . = 0x60000; + .data : { *(.data) } + _gp = ALIGN (16) + 0x7ff0; + .got : { *(.got) } +}