From: Andreas Krebbel Date: Sat, 14 Mar 2015 10:45:05 +0000 (+0100) Subject: S/390: Disable relocation sort against code sections. X-Git-Tag: binutils-2_25_1~175 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f12dd7bb5d7c16dc4877a5d6fa87d29231c3e93c;p=thirdparty%2Fbinutils-gdb.git S/390: Disable relocation sort against code sections. When downgrading from GD to IE model we rewrite the call to __tls_get_offset to a 64 bit load instruction. This relies on the fact that the additional relocation for the call target has already been executed when doing the rewrite. f1018: e3 20 d0 00 00 04 lg %r2,0(%r13) f101e: c0 e5 00 00 00 00 brasl %r14,f101e <__res_init+0x1e> f101e: R_390_TLS_GDCALL __libc_resp f1020: R_390_PLT32DBL __tls_get_offset+0x2 0000000f1020 39f6c00000014 R_390_PLT32DBL 0000000000000000 __tls_get_offset + 2 0000000f101e 3afb700000026 R_390_TLS_GDCALL 0000000000000008 __libc_resp + 0 Due to the reloc sorting the order changed an the PLT32DBL reloc is executed after the rewrite and overwrites part of the load instruction with garbage. bfd/ 2015-03-14 Andreas Krebbel * elf-s390-common.c (elf_s390_elf_sort_relocs_p): Don't sort relocs against code sections. * elf32-s390.c: Define elf_backend_sort_relocs_p. * elf64-s390.c: Likewise. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ef3042ed1c5..b1dcab20abc 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,6 +1,12 @@ 2015-03-18 Alan Modra Apply from master + 2015-03-14 Andreas Krebbel + * elf-s390-common.c (elf_s390_elf_sort_relocs_p): Don't sort + relocs against code sections. + * elf32-s390.c: Define elf_backend_sort_relocs_p. + * elf64-s390.c: Likewise. + 2015-03-11 Alan Modra * elf32-ppc.c (ppc_elf_get_synthetic_symtab): Examine stubs in reverse order. Account for larger size of __tls_get_addr_opt stub. diff --git a/bfd/elf-s390-common.c b/bfd/elf-s390-common.c index c74883cde27..3b0922b348c 100644 --- a/bfd/elf-s390-common.c +++ b/bfd/elf-s390-common.c @@ -242,3 +242,15 @@ elf_s390_add_symbol_hook (bfd *abfd, return TRUE; } + +/* Whether to sort relocs output by ld -r or ld --emit-relocs, by + r_offset. Don't do so for code sections. We want to keep ordering + of GDCALL / PLT32DBL for TLS optimizations as is. On the other + hand, elf-eh-frame.c processing requires .eh_frame relocs to be + sorted. */ + +static bfd_boolean +elf_s390_elf_sort_relocs_p (asection *sec) +{ + return (sec->flags & SEC_CODE) == 0; +} diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c index 07e594f2957..73df41a69fb 100644 --- a/bfd/elf32-s390.c +++ b/bfd/elf32-s390.c @@ -4028,6 +4028,7 @@ elf32_s390_merge_private_bfd_data (bfd *ibfd, bfd *obfd) #define elf_backend_grok_prstatus elf_s390_grok_prstatus #define elf_backend_plt_sym_val elf_s390_plt_sym_val #define elf_backend_add_symbol_hook elf_s390_add_symbol_hook +#define elf_backend_sort_relocs_p elf_s390_elf_sort_relocs_p #define bfd_elf32_mkobject elf_s390_mkobject #define elf_backend_object_p elf_s390_object_p diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c index 9a874f2b749..1e68afb21c6 100644 --- a/bfd/elf64-s390.c +++ b/bfd/elf64-s390.c @@ -3840,6 +3840,7 @@ const struct elf_size_info s390_elf64_size_info = #define elf_backend_init_index_section _bfd_elf_init_1_index_section #define elf_backend_plt_sym_val elf_s390_plt_sym_val #define elf_backend_add_symbol_hook elf_s390_add_symbol_hook +#define elf_backend_sort_relocs_p elf_s390_elf_sort_relocs_p #define bfd_elf64_mkobject elf_s390_mkobject #define elf_backend_object_p elf_s390_object_p