2003-01-16 12:08:47 +08:00
|
|
|
/* PPC64 ELF support for BFD.
|
2011-10-10 21:21:07 +08:00
|
|
|
Copyright 2003, 2005, 2009, 2010, 2011 Free Software Foundation, Inc.
|
2003-01-16 12:08:47 +08:00
|
|
|
|
2010-04-15 18:26:09 +08:00
|
|
|
This file is part of BFD, the Binary File Descriptor library.
|
2003-01-16 12:08:47 +08:00
|
|
|
|
2010-04-15 18:26:09 +08:00
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
2003-01-16 12:08:47 +08:00
|
|
|
|
2010-04-15 18:26:09 +08:00
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
2003-01-16 12:08:47 +08:00
|
|
|
|
2010-04-15 18:26:09 +08:00
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
|
|
|
MA 02110-1301, USA. */
|
2003-01-16 12:08:47 +08:00
|
|
|
|
|
|
|
#ifndef _ELF_PPC64_H
|
|
|
|
#define _ELF_PPC64_H
|
|
|
|
|
|
|
|
#include "elf/reloc-macros.h"
|
|
|
|
|
|
|
|
/* Relocations. */
|
|
|
|
START_RELOC_NUMBERS (elf_ppc64_reloc_type)
|
2003-02-04 22:48:36 +08:00
|
|
|
RELOC_NUMBER (R_PPC64_NONE, 0)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR32, 1)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR24, 2)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16, 3)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_LO, 4)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_HI, 5)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_HA, 6)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR14, 7)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR14_BRTAKEN, 8)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR14_BRNTAKEN, 9)
|
|
|
|
RELOC_NUMBER (R_PPC64_REL24, 10)
|
|
|
|
RELOC_NUMBER (R_PPC64_REL14, 11)
|
|
|
|
RELOC_NUMBER (R_PPC64_REL14_BRTAKEN, 12)
|
|
|
|
RELOC_NUMBER (R_PPC64_REL14_BRNTAKEN, 13)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT16, 14)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT16_LO, 15)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT16_HI, 16)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT16_HA, 17)
|
2003-01-16 12:08:47 +08:00
|
|
|
/* 18 unused. 32-bit reloc is R_PPC_PLTREL24. */
|
2003-02-04 22:48:36 +08:00
|
|
|
RELOC_NUMBER (R_PPC64_COPY, 19)
|
|
|
|
RELOC_NUMBER (R_PPC64_GLOB_DAT, 20)
|
|
|
|
RELOC_NUMBER (R_PPC64_JMP_SLOT, 21)
|
|
|
|
RELOC_NUMBER (R_PPC64_RELATIVE, 22)
|
2003-01-16 12:08:47 +08:00
|
|
|
/* 23 unused. 32-bit reloc is R_PPC_LOCAL24PC. */
|
2003-02-04 22:48:36 +08:00
|
|
|
RELOC_NUMBER (R_PPC64_UADDR32, 24)
|
|
|
|
RELOC_NUMBER (R_PPC64_UADDR16, 25)
|
|
|
|
RELOC_NUMBER (R_PPC64_REL32, 26)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLT32, 27)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLTREL32, 28)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLT16_LO, 29)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLT16_HI, 30)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLT16_HA, 31)
|
2003-01-16 12:08:47 +08:00
|
|
|
/* 32 unused. 32-bit reloc is R_PPC_SDAREL16. */
|
2003-02-04 22:48:36 +08:00
|
|
|
RELOC_NUMBER (R_PPC64_SECTOFF, 33)
|
|
|
|
RELOC_NUMBER (R_PPC64_SECTOFF_LO, 34)
|
|
|
|
RELOC_NUMBER (R_PPC64_SECTOFF_HI, 35)
|
|
|
|
RELOC_NUMBER (R_PPC64_SECTOFF_HA, 36)
|
|
|
|
RELOC_NUMBER (R_PPC64_REL30, 37)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR64, 38)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_HIGHER, 39)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_HIGHERA, 40)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_HIGHEST, 41)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_HIGHESTA, 42)
|
|
|
|
RELOC_NUMBER (R_PPC64_UADDR64, 43)
|
|
|
|
RELOC_NUMBER (R_PPC64_REL64, 44)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLT64, 45)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLTREL64, 46)
|
|
|
|
RELOC_NUMBER (R_PPC64_TOC16, 47)
|
|
|
|
RELOC_NUMBER (R_PPC64_TOC16_LO, 48)
|
|
|
|
RELOC_NUMBER (R_PPC64_TOC16_HI, 49)
|
|
|
|
RELOC_NUMBER (R_PPC64_TOC16_HA, 50)
|
|
|
|
RELOC_NUMBER (R_PPC64_TOC, 51)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLTGOT16, 52)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLTGOT16_LO, 53)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLTGOT16_HI, 54)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLTGOT16_HA, 55)
|
2003-01-16 12:08:47 +08:00
|
|
|
|
2003-02-04 22:48:36 +08:00
|
|
|
/* The following relocs were added in the 64-bit PowerPC ELF ABI
|
|
|
|
revision 1.2. */
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_DS, 56)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_LO_DS, 57)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT16_DS, 58)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT16_LO_DS, 59)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLT16_LO_DS, 60)
|
|
|
|
RELOC_NUMBER (R_PPC64_SECTOFF_DS, 61)
|
|
|
|
RELOC_NUMBER (R_PPC64_SECTOFF_LO_DS, 62)
|
|
|
|
RELOC_NUMBER (R_PPC64_TOC16_DS, 63)
|
|
|
|
RELOC_NUMBER (R_PPC64_TOC16_LO_DS, 64)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLTGOT16_DS, 65)
|
|
|
|
RELOC_NUMBER (R_PPC64_PLTGOT16_LO_DS, 66)
|
|
|
|
|
|
|
|
/* Relocs added to support TLS. PowerPC64 ELF ABI revision 1.5. */
|
|
|
|
RELOC_NUMBER (R_PPC64_TLS, 67)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPMOD64, 68)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16, 69)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_LO, 70)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_HI, 71)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_HA, 72)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL64, 73)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16, 74)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_LO, 75)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_HI, 76)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_HA, 77)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL64, 78)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TLSGD16, 79)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TLSGD16_LO, 80)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TLSGD16_HI, 81)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TLSGD16_HA, 82)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TLSLD16, 83)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TLSLD16_LO, 84)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TLSLD16_HI, 85)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TLSLD16_HA, 86)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TPREL16_DS, 87)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TPREL16_LO_DS, 88)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TPREL16_HI, 89)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_TPREL16_HA, 90)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_DTPREL16_DS, 91)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_DTPREL16_LO_DS, 92)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_DTPREL16_HI, 93)
|
|
|
|
RELOC_NUMBER (R_PPC64_GOT_DTPREL16_HA, 94)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_DS, 95)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_LO_DS, 96)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_HIGHER, 97)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_HIGHERA, 98)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_HIGHEST, 99)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_HIGHESTA, 100)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_DS, 101)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_LO_DS, 102)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_HIGHER, 103)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_HIGHERA, 104)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_HIGHEST, 105)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_HIGHESTA, 106)
|
2009-03-04 13:50:50 +08:00
|
|
|
RELOC_NUMBER (R_PPC64_TLSGD, 107)
|
|
|
|
RELOC_NUMBER (R_PPC64_TLSLD, 108)
|
2011-10-10 21:21:07 +08:00
|
|
|
RELOC_NUMBER (R_PPC64_TOCSAVE, 109)
|
2003-01-16 12:08:47 +08:00
|
|
|
|
Report overflow on PowerPC64 @h and @ha relocations.
This changes the behaviour of @h and @ha on PowerPC64 to report errors
on 32-bit overflow. The motivation for this change is that on
PowerPC64, most uses of @h and @ha modifiers and their corresponding
relocations are to build up 32-bit offsets. We'd like to know when
such offsets overflow. Only rarely do people use @h or @ha with the
high 32-bit modifiers to build a 64-bit constant. Those uses will now
need to use two new modifiers, @high and @higha, if the constant isn't
known at assembly time. For now, we won't report overflow at assembly
time..
This also fixes an error when applying some of the HIGHER and HIGHEST
relocations.
include/elf/
* ppc64.h (R_PPC64_ADDR16_HIGH, R_PPC64_ADDR16_HIGHA,
R_PPC64_TPREL16_HIGH, R_PPC64_TPREL16_HIGHA,
R_PPC64_DTPREL16_HIGH, R_PPC64_DTPREL16_HIGHA): New.
(IS_PPC64_TLS_RELOC): Match new tls relocs.
bfd/
* reloc.c (BFD_RELOC_PPC64_ADDR16_HIGH, BFD_RELOC_PPC64_ADDR16_HIGHA,
BFD_RELOC_PPC64_TPREL16_HIGH, BFD_RELOC_PPC64_TPREL16_HIGHA,
BFD_RELOC_PPC64_DTPREL16_HIGH, BFD_RELOC_PPC64_DTPREL16_HIGHA): New.
* elf64-ppc.c (ppc64_elf_howto_raw): Add entries for new relocs.
Make all _HA and _HI relocs report signed overflow.
(ppc64_elf_reloc_type_lookup): Handle new relocs.
(must_be_dyn_reloc, ppc64_elf_check_relocs): Likewise.
(dec_dynrel_count, ppc64_elf_relocate_section): Likewise.
(ppc64_elf_relocate_section): Don't apply 0x8000 adjust to
R_PPC64_TPREL16_HIGHER, R_PPC64_TPREL16_HIGHEST,
R_PPC64_DTPREL16_HIGHER, and R_PPC64_DTPREL16_HIGHEST.
* libbfd.h: Regenerate.
* bfd-in2.h: Regenerate.
gas/
* config/tc-ppc.c (SEX16): Don't mask.
(REPORT_OVERFLOW_HI): Define as zero.
(ppc_elf_suffix): Support @high, @higha, @dtprel@high, @dtprel@higha,
@tprel@high, and @tprel@higha modifiers.
(md_assemble): Ignore X_unsigned when applying 16-bit insn fields.
Add (disabled) code to check @h and @ha reloc overflow for powerpc64.
Handle new relocs.
(md_apply_fix): Similarly.
elfcpp/
* powerpc.h (R_PPC64_ADDR16_HIGH, R_PPC64_ADDR16_HIGHA,
R_PPC64_TPREL16_HIGH, R_PPC64_TPREL16_HIGHA,
R_PPC64_DTPREL16_HIGH, R_PPC64_DTPREL16_HIGHA): Define.
gold/
* powerpc.cc (Target_powerpc::Scan::check_non_pic): Handle new relocs.
(Target_powerpc::Scan::global, local): Likewise.
(Target_powerpc::Relocate::relocate): Likewise. Check for overflow
on all ppc64 @h and @ha relocs.
2013-10-29 14:23:25 +08:00
|
|
|
/* Added when HA and HI relocs were changed to report overflows. */
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_HIGH, 110)
|
|
|
|
RELOC_NUMBER (R_PPC64_ADDR16_HIGHA, 111)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_HIGH, 112)
|
|
|
|
RELOC_NUMBER (R_PPC64_TPREL16_HIGHA, 113)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_HIGH, 114)
|
|
|
|
RELOC_NUMBER (R_PPC64_DTPREL16_HIGHA, 115)
|
|
|
|
|
2010-06-25 13:20:57 +08:00
|
|
|
#ifndef RELOC_MACROS_GEN_FUNC
|
|
|
|
/* Fake relocation only used internally by ld. */
|
|
|
|
RELOC_NUMBER (R_PPC64_LO_DS_OPT, 128)
|
|
|
|
#endif
|
2009-07-10 20:19:58 +08:00
|
|
|
/* Support STT_GNU_IFUNC plt calls. */
|
2009-07-29 22:55:20 +08:00
|
|
|
RELOC_NUMBER (R_PPC64_JMP_IREL, 247)
|
2009-07-10 20:19:58 +08:00
|
|
|
RELOC_NUMBER (R_PPC64_IRELATIVE, 248)
|
|
|
|
|
2009-07-29 22:55:20 +08:00
|
|
|
/* These are GNU extensions used in PIC code sequences. */
|
|
|
|
RELOC_NUMBER (R_PPC64_REL16, 249)
|
|
|
|
RELOC_NUMBER (R_PPC64_REL16_LO, 250)
|
|
|
|
RELOC_NUMBER (R_PPC64_REL16_HI, 251)
|
|
|
|
RELOC_NUMBER (R_PPC64_REL16_HA, 252)
|
|
|
|
|
2003-01-16 12:08:47 +08:00
|
|
|
/* These are GNU extensions to enable C++ vtable garbage collection. */
|
2003-02-04 22:48:36 +08:00
|
|
|
RELOC_NUMBER (R_PPC64_GNU_VTINHERIT, 253)
|
|
|
|
RELOC_NUMBER (R_PPC64_GNU_VTENTRY, 254)
|
2003-01-16 12:08:47 +08:00
|
|
|
|
|
|
|
END_RELOC_NUMBERS (R_PPC64_max)
|
|
|
|
|
Report overflow on PowerPC64 @h and @ha relocations.
This changes the behaviour of @h and @ha on PowerPC64 to report errors
on 32-bit overflow. The motivation for this change is that on
PowerPC64, most uses of @h and @ha modifiers and their corresponding
relocations are to build up 32-bit offsets. We'd like to know when
such offsets overflow. Only rarely do people use @h or @ha with the
high 32-bit modifiers to build a 64-bit constant. Those uses will now
need to use two new modifiers, @high and @higha, if the constant isn't
known at assembly time. For now, we won't report overflow at assembly
time..
This also fixes an error when applying some of the HIGHER and HIGHEST
relocations.
include/elf/
* ppc64.h (R_PPC64_ADDR16_HIGH, R_PPC64_ADDR16_HIGHA,
R_PPC64_TPREL16_HIGH, R_PPC64_TPREL16_HIGHA,
R_PPC64_DTPREL16_HIGH, R_PPC64_DTPREL16_HIGHA): New.
(IS_PPC64_TLS_RELOC): Match new tls relocs.
bfd/
* reloc.c (BFD_RELOC_PPC64_ADDR16_HIGH, BFD_RELOC_PPC64_ADDR16_HIGHA,
BFD_RELOC_PPC64_TPREL16_HIGH, BFD_RELOC_PPC64_TPREL16_HIGHA,
BFD_RELOC_PPC64_DTPREL16_HIGH, BFD_RELOC_PPC64_DTPREL16_HIGHA): New.
* elf64-ppc.c (ppc64_elf_howto_raw): Add entries for new relocs.
Make all _HA and _HI relocs report signed overflow.
(ppc64_elf_reloc_type_lookup): Handle new relocs.
(must_be_dyn_reloc, ppc64_elf_check_relocs): Likewise.
(dec_dynrel_count, ppc64_elf_relocate_section): Likewise.
(ppc64_elf_relocate_section): Don't apply 0x8000 adjust to
R_PPC64_TPREL16_HIGHER, R_PPC64_TPREL16_HIGHEST,
R_PPC64_DTPREL16_HIGHER, and R_PPC64_DTPREL16_HIGHEST.
* libbfd.h: Regenerate.
* bfd-in2.h: Regenerate.
gas/
* config/tc-ppc.c (SEX16): Don't mask.
(REPORT_OVERFLOW_HI): Define as zero.
(ppc_elf_suffix): Support @high, @higha, @dtprel@high, @dtprel@higha,
@tprel@high, and @tprel@higha modifiers.
(md_assemble): Ignore X_unsigned when applying 16-bit insn fields.
Add (disabled) code to check @h and @ha reloc overflow for powerpc64.
Handle new relocs.
(md_apply_fix): Similarly.
elfcpp/
* powerpc.h (R_PPC64_ADDR16_HIGH, R_PPC64_ADDR16_HIGHA,
R_PPC64_TPREL16_HIGH, R_PPC64_TPREL16_HIGHA,
R_PPC64_DTPREL16_HIGH, R_PPC64_DTPREL16_HIGHA): Define.
gold/
* powerpc.cc (Target_powerpc::Scan::check_non_pic): Handle new relocs.
(Target_powerpc::Scan::global, local): Likewise.
(Target_powerpc::Relocate::relocate): Likewise. Check for overflow
on all ppc64 @h and @ha relocs.
2013-10-29 14:23:25 +08:00
|
|
|
#define IS_PPC64_TLS_RELOC(R) \
|
|
|
|
(((R) >= R_PPC64_TLS && (R) <= R_PPC64_DTPREL16_HIGHESTA) \
|
|
|
|
|| ((R) >= R_PPC64_TPREL16_HIGH && (R) <= R_PPC64_DTPREL16_HIGHA))
|
2003-02-04 22:48:36 +08:00
|
|
|
|
2003-01-16 12:08:47 +08:00
|
|
|
/* Specify the start of the .glink section. */
|
|
|
|
#define DT_PPC64_GLINK DT_LOPROC
|
|
|
|
|
|
|
|
/* Specify the start and size of the .opd section. */
|
|
|
|
#define DT_PPC64_OPD (DT_LOPROC + 1)
|
|
|
|
#define DT_PPC64_OPDSZ (DT_LOPROC + 2)
|
|
|
|
|
include/elf/
* ppc.h (DT_PPC_TLSOPT): Define.
* ppc64.h (DT_PPC64_TLSOPT): Define.
bfd/
* elf32-ppc.c (TLS_GET_ADDR_GLINK_SIZE): Define.
(ADD_3_12_2, BEQLR, CMPWI_11_0, LWZ_11_3, LWZ_12_3): Define.
(MR_0_3, MR_3_0): Define.
(struct ppc_elf_link_hash_table): Add no_tls_get_addr_opt.
(ppc_elf_select_plt_layout): Save emit_stub_syms param earlier.
(ppc_elf_tls_setup): Add no_tls_get_addr_opt param and save to hash
table. Check for presense of __tls_get_addr_opt
(allocate_dynrelocs): Increase glink entry size for __tls_get_addr.
(ppc_elf_size_dynamic_sections): Add DT_PPC_TLS_OPT tag.
(write_glink_stub): Add param p.
(ppc_elf_relocate_section): Adjust write_glink_stub call.
(ppc_elf_finish_dynamic_symbol): Emit special glink call stub for
__tls_get_addr.
* elf32-ppc.h (ppc_elf_tls_setup): Update prototype.
* elf64-ppc.c (struct ppc_link_hash_table): Add no_tls_get_addr_opt.
(ppc64_elf_tls_setup): Add no_tls_get_addr_opt param and save to hash
table. Check for presense of __tls_get_addr_opt.
(ppc64_elf_size_dynamic_sections): Add DT_PPC64_TLS_OPT tag.
(LD_R11_0R3, LD_R12_0R3, MR_R0_R3, CMPDI_R11_0, ADD_R3_R12_R13,
BEQLR, MR_R3_R0, MFLR_R11, STD_R11_0R1, BCTRL, LD_R11_0R1,
LD_R2_0R1, MTLR_R11): Define.
(build_tls_get_addr_stub): New function.
(ppc_build_one_stub): Call it.
(ppc_size_one_stub): Add extra size for __tls_get_addr stub.
(ppc64_elf_relocate_section): Don't change nop to ld 2,40(1) for
__tls_get_addr plt call.
* elf64-ppc.h (ppc64_elf_tls_setup): Update prototype.
binutils/
* readelf.c (get_ppc_dynamic_type): Add TLSOPT.
(get_ppc64_dynamic_type): Likewise.
ld/
* emultempl/ppc32elf.em (no_tls_get_addr_opt): New var.
(ppc_before_allocation): Pass to ppc_elf_tls_setup.
(OPTION_NO_TLS_GET_ADDR_OPT): Define. Redefine other options in
terms of previous option.
(PARSE_AND_LIST_LONGOPTS, PARSE_AND_LIST_OPTIONS): Add
--no-tls-get-addr-optimize.
(PARSE_AND_LIST_ARGS_CASES): Handle it.
* emultempl/ppc64elf.em (no_tls_get_addr_opt): New var.
(ppc_before_allocation): Pass to ppc64_elf_tls_setup.
(OPTION_NO_TLS_GET_ADDR_OPT): Define.
(PARSE_AND_LIST_LONGOPTS, PARSE_AND_LIST_OPTIONS): Add
--no-tls-get-addr-optimize.
(PARSE_AND_LIST_ARGS_CASES): Handle it.
ld/testsuite/
* ld-powerpc/tlslib.s: Delete dot-symbol entry syms. Add
__tls_get_addr_opt.
* ld-powerpc/tlslib32.s: Add __tls_get_addr_opt.
* ld-powerpc/oldtlslib.s: New file, old-abi version of tlslib.s.
* ld-powerpc/powerpc.exp: Build old-abi library and use it in
two new link tests.
* ld-powerpc/tlsexe.d: Update for new __tls_get_addr stub.
* ld-powerpc/tlsexe.g, * ld-powerpc/tlsexe.r, *ld-powerpc/tlsexe32.d,
* ld-powerpc/tlsexe32.g, * ld-powerpc/tlsexe32.r,
* ld-powerpc/tlsexetoc.d, * ld-powerpc/tlsexetoc.g,
* ld-powerpc/tlsexetoc.r: Likewise.
2009-09-21 19:51:02 +08:00
|
|
|
/* Specify that tls descriptors should be optimized. */
|
|
|
|
#define DT_PPC64_TLSOPT (DT_LOPROC + 3)
|
|
|
|
|
2003-01-16 12:08:47 +08:00
|
|
|
#endif /* _ELF_PPC64_H */
|