From e8910a83af41c3dbfd00191b2720d4094f8d9532 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 29 Oct 2013 16:34:35 +1030 Subject: [PATCH] Replace DT_PPC_TLSOPT with DT_PPC_OPT. This removes the DT_PPC_TLSOPT/DT_PPC64_TLSOPT dynamic tag and replaces it with DT_PPC_OPT/DT_PPC64_OPT tag to provide the same functionality and more. This isn't backwards compatible, but the TLSOPT tag hasn't been used since the tls optimisation support was never submitted to glibc. /include/elf/ * ppc.h (DT_PPC_TLSOPT): Delete. (DT_PPC_OPT, PPC_OPT_TLS): Define. * ppc64.h (DT_PPC64_TLSOPT): Delete. (DT_PPC64_OPT, PPC64_OPT_TLS, PPC64_OPT_MULTI_TOC): Define. bfd/ * elf32-ppc.c (ppc_elf_size_dynamic_sections): Use new DT_PPC_OPT tag to specify tls optimisation. * elf64-ppc.c (ppc64_elf_size_dynamic_sections): Likewise. (ppc64_elf_finish_dynamic_sections): Specify whether multiple toc pointers are used via DT_PPC64_OPT. binutils/ * readelf.c (get_ppc_dynamic_type): Replace PPC_TLSOPT with PPC_OPT. (get_ppc64_dynamic_type): Replace PPC64_TLSOPT with PPC64_OPT. --- bfd/ChangeLog | 8 ++++++++ bfd/elf32-ppc.c | 2 +- bfd/elf64-ppc.c | 20 +++++++++++++++----- binutils/ChangeLog | 5 +++++ binutils/readelf.c | 4 ++-- include/elf/ChangeLog | 7 +++++++ include/elf/ppc.h | 3 ++- include/elf/ppc64.h | 6 ++++-- 8 files changed, 44 insertions(+), 11 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 6afd755a283..ae0a0243281 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2013-10-30 Alan Modra + + * elf32-ppc.c (ppc_elf_size_dynamic_sections): Use new DT_PPC_OPT + tag to specify tls optimisation. + * elf64-ppc.c (ppc64_elf_size_dynamic_sections): Likewise. + (ppc64_elf_finish_dynamic_sections): Specify whether multiple + toc pointers are used via DT_PPC64_OPT. + 2013-10-30 Alan Modra * elf64-ppc.c (STK_LR, STK_TOC, STK_LINKER): Define. diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index d6aae81d8e3..63928dc099a 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -6488,7 +6488,7 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (!htab->no_tls_get_addr_opt && htab->tls_get_addr != NULL && htab->tls_get_addr->plt.plist != NULL - && !add_dynamic_entry (DT_PPC_TLSOPT, 0)) + && !add_dynamic_entry (DT_PPC_OPT, PPC_OPT_TLS)) return FALSE; } diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 8f74333fbe3..6a8ec513468 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -9790,6 +9790,8 @@ ppc64_elf_size_dynamic_sections (bfd *output_bfd, if (htab->elf.dynamic_sections_created) { + bfd_boolean tls_opt; + /* Add some entries to the .dynamic section. We fill in the values later, in ppc64_elf_finish_dynamic_sections, but we must add the entries now so that we get the correct size for @@ -9821,11 +9823,14 @@ ppc64_elf_size_dynamic_sections (bfd *output_bfd, return FALSE; } - if (!htab->no_tls_get_addr_opt - && htab->tls_get_addr_fd != NULL - && htab->tls_get_addr_fd->elf.plt.plist != NULL - && !add_dynamic_entry (DT_PPC64_TLSOPT, 0)) - return FALSE; + tls_opt = (!htab->no_tls_get_addr_opt + && htab->tls_get_addr_fd != NULL + && htab->tls_get_addr_fd->elf.plt.plist != NULL); + if (tls_opt || !htab->opd_abi) + { + if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0)) + return FALSE; + } if (relocs) { @@ -14659,6 +14664,11 @@ ppc64_elf_finish_dynamic_sections (bfd *output_bfd, dyn.d_un.d_ptr = s->vma; break; + case DT_PPC64_OPT: + if (htab->do_multi_toc && htab->multi_toc_needed) + dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC; + break; + case DT_PPC64_OPDSZ: s = bfd_get_section_by_name (output_bfd, ".opd"); if (s == NULL) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 9774deadb3a..457f0b01c7b 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2013-10-30 Alan Modra + + * readelf.c (get_ppc_dynamic_type): Replace PPC_TLSOPT with PPC_OPT. + (get_ppc64_dynamic_type): Replace PPC64_TLSOPT with PPC64_OPT. + 2013-10-30 Ulrich Weigand * readelf.c (get_ppc64_symbol_other): New function. diff --git a/binutils/readelf.c b/binutils/readelf.c index c99b46e536a..0389f147c12 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -1575,7 +1575,7 @@ get_ppc_dynamic_type (unsigned long type) switch (type) { case DT_PPC_GOT: return "PPC_GOT"; - case DT_PPC_TLSOPT: return "PPC_TLSOPT"; + case DT_PPC_OPT: return "PPC_OPT"; default: return NULL; } @@ -1589,7 +1589,7 @@ get_ppc64_dynamic_type (unsigned long type) case DT_PPC64_GLINK: return "PPC64_GLINK"; case DT_PPC64_OPD: return "PPC64_OPD"; case DT_PPC64_OPDSZ: return "PPC64_OPDSZ"; - case DT_PPC64_TLSOPT: return "PPC64_TLSOPT"; + case DT_PPC64_OPT: return "PPC64_OPT"; default: return NULL; } diff --git a/include/elf/ChangeLog b/include/elf/ChangeLog index 7e98ddbf3c2..68b10021044 100644 --- a/include/elf/ChangeLog +++ b/include/elf/ChangeLog @@ -1,3 +1,10 @@ +2013-10-30 Alan Modra + + * ppc.h (DT_PPC_TLSOPT): Delete. + (DT_PPC_OPT, PPC_OPT_TLS): Define. + * ppc64.h (DT_PPC64_TLSOPT): Delete. + (DT_PPC64_OPT, PPC64_OPT_TLS, PPC64_OPT_MULTI_TOC): Define. + 2013-10-30 Alan Modra * ppc64.h (STO_PPC64_LOCAL_BIT, STO_PPC64_LOCAL_MASK): Define. diff --git a/include/elf/ppc.h b/include/elf/ppc.h index f80a1e8a3e9..da00df8688d 100644 --- a/include/elf/ppc.h +++ b/include/elf/ppc.h @@ -176,7 +176,8 @@ END_RELOC_NUMBERS (R_PPC_max) #define DT_PPC_GOT (DT_LOPROC) /* Specify that tls descriptors should be optimized. */ -#define DT_PPC_TLSOPT (DT_LOPROC + 1) +#define DT_PPC_OPT (DT_LOPROC + 1) +#define PPC_OPT_TLS 1 /* Processor specific flags for the ELF header e_flags field. */ diff --git a/include/elf/ppc64.h b/include/elf/ppc64.h index d3cfdfb82ce..78d947baea9 100644 --- a/include/elf/ppc64.h +++ b/include/elf/ppc64.h @@ -234,7 +234,9 @@ ppc64_encode_local_entry(unsigned int val) #define DT_PPC64_OPD (DT_LOPROC + 1) #define DT_PPC64_OPDSZ (DT_LOPROC + 2) -/* Specify that tls descriptors should be optimized. */ -#define DT_PPC64_TLSOPT (DT_LOPROC + 3) +/* Specify whether various optimisations are possible. */ +#define DT_PPC64_OPT (DT_LOPROC + 3) +#define PPC64_OPT_TLS 1 +#define PPC64_OPT_MULTI_TOC 2 #endif /* _ELF_PPC64_H */ -- 2.30.2