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:
Andreas Krebbel 2016-06-07 16:45:15 +02:00
parent 14b57c7c6a
commit 161db27905
7 changed files with 76 additions and 3 deletions

View file

@ -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

View file

@ -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)

View file

@ -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.

View 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_>

View 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*)
}
}

View 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

View file

@ -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-*-*"] {