mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-07-30 13:23:50 +08:00
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.
This commit is contained in:
@ -1,3 +1,9 @@
|
|||||||
|
2008-07-10 Richard Sandiford <rdsandiford@googlemail.com>
|
||||||
|
|
||||||
|
* 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 <rdsandiford@googlemail.com>
|
2008-07-10 Richard Sandiford <rdsandiford@googlemail.com>
|
||||||
|
|
||||||
* elfxx-mips.c (mips_elf_check_mips16_stubs): Use ELF_ST_IS_MIPS16.
|
* elfxx-mips.c (mips_elf_check_mips16_stubs): Use ELF_ST_IS_MIPS16.
|
||||||
|
@ -4099,12 +4099,12 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
|
|||||||
bfd_vma symbol = 0;
|
bfd_vma symbol = 0;
|
||||||
/* The final GP value to be used for the relocatable, executable, or
|
/* The final GP value to be used for the relocatable, executable, or
|
||||||
shared object file being produced. */
|
shared object file being produced. */
|
||||||
bfd_vma gp = MINUS_ONE;
|
bfd_vma gp;
|
||||||
/* The place (section offset or address) of the storage unit being
|
/* The place (section offset or address) of the storage unit being
|
||||||
relocated. */
|
relocated. */
|
||||||
bfd_vma p;
|
bfd_vma p;
|
||||||
/* The value of GP used to create the relocatable object. */
|
/* 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 offset into the global offset table at which the address of
|
||||||
the relocation entry symbol, adjusted by the addend, resides
|
the relocation entry symbol, adjusted by the addend, resides
|
||||||
during execution. */
|
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_p = mips_elf_local_relocation_p (input_bfd, relocation,
|
||||||
local_sections, TRUE);
|
local_sections, TRUE);
|
||||||
|
|
||||||
/* If we haven't already determined the GOT offset, or the GP value,
|
gp0 = _bfd_get_gp_value (input_bfd);
|
||||||
and we're going to need it, get it now. */
|
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)
|
switch (r_type)
|
||||||
{
|
{
|
||||||
case R_MIPS_GOT_PAGE:
|
case R_MIPS_GOT_PAGE:
|
||||||
@ -4449,29 +4458,8 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
|
|||||||
/* Convert GOT indices to actual offsets. */
|
/* Convert GOT indices to actual offsets. */
|
||||||
g = mips_elf_got_offset_from_index (dynobj, abfd, input_bfd, g);
|
g = mips_elf_got_offset_from_index (dynobj, abfd, input_bfd, g);
|
||||||
break;
|
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__
|
/* Relocations against the VxWorks __GOTT_BASE__ and __GOTT_INDEX__
|
||||||
symbols are resolved by the loader. Add them to .rela.dyn. */
|
symbols are resolved by the loader. Add them to .rela.dyn. */
|
||||||
if (h != NULL && is_gott_symbol (info, &h->root))
|
if (h != NULL && is_gott_symbol (info, &h->root))
|
||||||
|
@ -1,3 +1,13 @@
|
|||||||
|
2008-07-10 Richard Sandiford <rdsandiford@googlemail.com>
|
||||||
|
|
||||||
|
* 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 <stan@codesourcery.com>
|
2008-07-07 Stan Shebs <stan@codesourcery.com>
|
||||||
|
|
||||||
* ld-arm/arm-elf.exp: Use objdump -d for arm-be8 test.
|
* ld-arm/arm-elf.exp: Use objdump -d for arm-be8 test.
|
||||||
|
@ -79,6 +79,15 @@ if { $linux_gnu } {
|
|||||||
run_dump_test "multi-got-hidden-2"
|
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 {
|
if $has_newabi {
|
||||||
run_dump_test "elf-rel-got-n32"
|
run_dump_test "elf-rel-got-n32"
|
||||||
run_dump_test "elf-rel-xgot-n32"
|
run_dump_test "elf-rel-xgot-n32"
|
||||||
|
25
ld/testsuite/ld-mips-elf/no-shared-1-n32.d
Normal file
25
ld/testsuite/ld-mips-elf/no-shared-1-n32.d
Normal file
@ -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 .*
|
26
ld/testsuite/ld-mips-elf/no-shared-1-n64.d
Normal file
26
ld/testsuite/ld-mips-elf/no-shared-1-n64.d
Normal file
@ -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 .*
|
13
ld/testsuite/ld-mips-elf/no-shared-1-n64.s
Normal file
13
ld/testsuite/ld-mips-elf/no-shared-1-n64.s
Normal file
@ -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
|
24
ld/testsuite/ld-mips-elf/no-shared-1-o32.d
Normal file
24
ld/testsuite/ld-mips-elf/no-shared-1-o32.d
Normal file
@ -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 .*
|
13
ld/testsuite/ld-mips-elf/no-shared-1-o32.s
Normal file
13
ld/testsuite/ld-mips-elf/no-shared-1-o32.s
Normal file
@ -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
|
11
ld/testsuite/ld-mips-elf/no-shared-1.ld
Normal file
11
ld/testsuite/ld-mips-elf/no-shared-1.ld
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
. = 0x50000;
|
||||||
|
.text : { *(.text) }
|
||||||
|
.MIPS.stubs : { *(.MIPS.stubs) }
|
||||||
|
|
||||||
|
. = 0x60000;
|
||||||
|
.data : { *(.data) }
|
||||||
|
_gp = ALIGN (16) + 0x7ff0;
|
||||||
|
.got : { *(.got) }
|
||||||
|
}
|
Reference in New Issue
Block a user