Fix PLT first entry GOT operand calculation.
Embedding the .plt section in another revealed a bug in the way the larl operand of the first magic plt entry is being calculated. Fixed with the attached patch. bfd/ChangeLog: * elf64-s390.c (elf_s390_finish_dynamic_sections): Subtract plt section offset when calculation the larl operand in the first PLT entry. ld/ChangeLog: * testsuite/ld-s390/pltoffset-1.dd: New test. * testsuite/ld-s390/pltoffset-1.ld: New test. * testsuite/ld-s390/pltoffset-1.s: New test. * testsuite/ld-s390/s390.exp: Run new test.
This commit is contained in:
parent
14b57c7c6a
commit
161db27905
7 changed files with 76 additions and 3 deletions
|
@ -1,3 +1,9 @@
|
|||
2016-06-07 Ulrich Weigand <ulrich.weigand@de.ibm.com>
|
||||
|
||||
* elf64-s390.c (elf_s390_finish_dynamic_sections): Subtract plt
|
||||
section offset when calculation the larl operand in the first PLT
|
||||
entry.
|
||||
|
||||
2016-06-07 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* cpu-powerpc.c (powerpc_compatible): Allow bfd_mach_ppc_vle entry
|
||||
|
|
|
@ -3782,9 +3782,10 @@ elf_s390_finish_dynamic_sections (bfd *output_bfd,
|
|||
PLT_FIRST_ENTRY_SIZE);
|
||||
/* Fixup relative address to start of GOT */
|
||||
bfd_put_32 (output_bfd,
|
||||
(htab->elf.sgotplt->output_section->vma +
|
||||
htab->elf.sgotplt->output_offset
|
||||
- htab->elf.splt->output_section->vma - 6)/2,
|
||||
(htab->elf.sgotplt->output_section->vma
|
||||
+ htab->elf.sgotplt->output_offset
|
||||
- htab->elf.splt->output_section->vma
|
||||
- htab->elf.splt->output_offset - 6)/2,
|
||||
htab->elf.splt->contents + 8);
|
||||
}
|
||||
if (elf_section_data (htab->elf.splt->output_section) != NULL)
|
||||
|
|
|
@ -1,3 +1,10 @@
|
|||
2016-06-07 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||
|
||||
* testsuite/ld-s390/pltoffset-1.dd: New test.
|
||||
* testsuite/ld-s390/pltoffset-1.ld: New test.
|
||||
* testsuite/ld-s390/pltoffset-1.s: New test.
|
||||
* testsuite/ld-s390/s390.exp: Run new test.
|
||||
|
||||
2016-06-07 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* testsuite/ld-powerpc/apuinfo1.s: Delete nop.
|
||||
|
|
8
ld/testsuite/ld-s390/pltoffset-1.dd
Normal file
8
ld/testsuite/ld-s390/pltoffset-1.dd
Normal file
|
@ -0,0 +1,8 @@
|
|||
tmpdir/pltoffset-1: file format elf64-s390
|
||||
|
||||
Disassembly of section .text:
|
||||
|
||||
.* <.text>:
|
||||
.*: 00 00 00 00 [ ]*.long 0x00000000
|
||||
.*: e3 10 f0 38 00 24 [ ]*stg %r1,56\(%r15\)
|
||||
.*: c0 10 00 00 00 27 [ ]*larl %r1,58 <_GLOBAL_OFFSET_TABLE_>
|
34
ld/testsuite/ld-s390/pltoffset-1.ld
Normal file
34
ld/testsuite/ld-s390/pltoffset-1.ld
Normal file
|
@ -0,0 +1,34 @@
|
|||
SECTIONS
|
||||
{
|
||||
.text : {
|
||||
. = . + 4;
|
||||
*(.plt)
|
||||
}
|
||||
.test : {
|
||||
*(.text)
|
||||
*(.got)
|
||||
*(.got.plt)
|
||||
*(.rodata)
|
||||
*(.eh_frame)
|
||||
*(.interp)
|
||||
*(.data)
|
||||
*(.bss)
|
||||
}
|
||||
|
||||
/* For old binutils which otherwise complain about nonrepresentable
|
||||
sections. */
|
||||
.dynsym : { *(.dynsym) }
|
||||
.gnu.version : { *(.gnu.version) }
|
||||
|
||||
/DISCARD/ : {
|
||||
*(.rela.text)
|
||||
*(.rela.plt)
|
||||
*(.rela.got.plt)
|
||||
*(.rela.data)
|
||||
*(.rela.rodata)
|
||||
*(.rela.bss)
|
||||
*(.rela.text)
|
||||
*(.comment*)
|
||||
*(.note*)
|
||||
}
|
||||
}
|
12
ld/testsuite/ld-s390/pltoffset-1.s
Normal file
12
ld/testsuite/ld-s390/pltoffset-1.s
Normal file
|
@ -0,0 +1,12 @@
|
|||
.file "hello.c"
|
||||
.text
|
||||
.align 8
|
||||
.globl main
|
||||
.type main, @function
|
||||
main:
|
||||
brasl %r5,foo@PLT
|
||||
br %r4
|
||||
.size main, .-main
|
||||
|
||||
.globl foo
|
||||
foo: .long 123
|
|
@ -74,6 +74,11 @@ set s390xtests {
|
|||
"-m64" {gotreloc-1.s}
|
||||
{{objdump -dzrj.text gotreloc_64-1.dd}}
|
||||
"gotreloc_64-1"}
|
||||
{"PLT: offset test"
|
||||
"-shared -m elf64_s390 -dT pltoffset-1.ld" ""
|
||||
"-m64" {pltoffset-1.s}
|
||||
{{objdump "-dzrj.text --stop-address=16" pltoffset-1.dd}}
|
||||
"pltoffset-1"}
|
||||
}
|
||||
|
||||
if [istarget "s390-*-*"] {
|
||||
|
|
Loading…
Reference in a new issue