2003-02-18 06:05:07 +00:00
|
|
|
# This shell script emits a C file. -*- C -*-
|
2014-02-27 13:01:35 +00:00
|
|
|
# Copyright (C) 2003-2014 Free Software Foundation, Inc.
|
2003-02-18 06:05:07 +00:00
|
|
|
#
|
2007-07-06 14:09:45 +00:00
|
|
|
# This file is part of the GNU Binutils.
|
2003-02-18 06:05:07 +00: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
|
2007-07-06 14:09:45 +00:00
|
|
|
# the Free Software Foundation; either version 3 of the License, or
|
2003-02-18 06:05:07 +00:00
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# 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.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with this program; if not, write to the Free Software
|
2007-07-06 14:09:45 +00:00
|
|
|
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
|
|
|
# MA 02110-1301, USA.
|
2003-02-18 06:05:07 +00:00
|
|
|
#
|
|
|
|
|
2005-03-21 13:23:15 +00:00
|
|
|
# This file is sourced from elf32.em, and defines extra powerpc32-elf
|
2003-02-18 06:05:07 +00:00
|
|
|
# specific routines.
|
|
|
|
#
|
2007-07-19 19:56:10 +00:00
|
|
|
fragment <<EOF
|
2003-02-18 06:05:07 +00:00
|
|
|
|
|
|
|
#include "libbfd.h"
|
|
|
|
#include "elf32-ppc.h"
|
2012-05-26 11:13:20 +00:00
|
|
|
#include "ldlex.h"
|
2003-02-18 06:05:07 +00:00
|
|
|
|
2008-02-15 09:03:02 +00:00
|
|
|
#define is_ppc_elf(bfd) \
|
|
|
|
(bfd_get_flavour (bfd) == bfd_target_elf_flavour \
|
* elf-bfd.h (emum elf_object_id): Rename to elf_target_id. Add
entries for other architectures.
(struct elf_link_hash_table): Add hash_table_id field.
(elf_hash_table_id): New accessor macro.
* elflink.c (_bfd_elf_link_hash_table_init): Add target_id
parameter.
* elf-m10300.c (elf32_mn10300_hash_table): Check table id before
returning cast pointer.
(elf32_mn10300_link_hash_table_create): Identify new table as
containing MN10300 extensions.
(mn10300_elf_relax_section): Check pointer returned by
elf32_mn10300_hash_table.
* elf32-arm.c: Likewise, except using ARM extensions.
* elf32-avr.c: Likewise, except using AVR extensions.
* elf32-bfin.c: Likewise, except using BFIN extensions.
* elf32-cris.c: Likewise, except using CRIS extensions.
* elf32-frv.c: Likewise, except using FRV extensions.
* elf32-hppa.c: Likewise, except using HPPA32 extensions.
* elf32-i386.c: Likewise, except using I386 extensions.
* elf32-lm32.c: Likewise, except using LM32 extensions.
* elf32-m32r.c: Likewise, except using M32RM extensions.
* elf32-m68hc11.c: Likewise, except using M68HC11 extensions.
* elf32-m68hc1x.c: Likewise, except using M68HC11 extensions.
* elf32-m68hc1x.h: Likewise, except using M68HC11 extensions.
* elf32-m68k.c: Likewise, except using M68K extensions.
* elf32-microblaze.c: Likewise, except using MICROBLAZE extensions.
* elf32-ppc.c: Likewise, except using PPC32 extensions.
* elf32-s390.c: Likewise, except using S390 extensions.
* elf32-sh.c: Likewise, except using SH extensions.
* elf32-spu.c: Likewise, except using SPU extensions.
* elf32-xtensa.c: Likewise, except using XTENSA extensions.
* elf64-alpha.c: Likewise, except using ALPHA extensions.
* elf64-hppa.c: Likewise, except using HPPA64 extensions.
* elf64-ppc.c: Likewise, except using PPC64 extensions.
* elf64-s390.c: Likewise, except using S390 extensions.
* elf64-x86-64.c: Likewise, except using X86_64 extensions.
* elfxx-ia64.c: Likewise, except using IA64 extensions.
* elfxx-mips.c: Likewise, except using MIPS extensions.
* elfxx-sparc.c: Likewise, except using SPARC extensions.
* elfxx-sparc.h: Likewise, except using SPARC extensions.
* elf32-cr16.c (struct elf32_cr16_link_hash_table): Delete
redundant structure.
(elf32_cr16_hash_table): Delete unused macro.
(elf32_cr16_link_hash_traverse): Delete unused macro.
* elf32-score.c: Likewise.
* elf32-score7.c: Likewise.
* elf32-vax.c: Likewise.
* elf64-sh64.c: Likewise.
* emultempl/alphaelf.em: Update value expected from elf_object_id.
* emultempl/hppaelf.em: Likewise.
* emultempl/mipself.em: Likewise.
* emultempl/ppc32elf.em: Likewise.
* emultempl/ppc64elf.em: Likewise.
2010-02-04 09:16:43 +00:00
|
|
|
&& elf_object_id (bfd) == PPC32_ELF_DATA)
|
2005-03-21 13:23:15 +00:00
|
|
|
|
2003-02-18 06:05:07 +00:00
|
|
|
/* Whether to run tls optimization. */
|
|
|
|
static int notlsopt = 0;
|
|
|
|
|
2014-01-29 21:56:02 +00:00
|
|
|
/* Choose the correct place for .got. */
|
2005-05-11 14:10:10 +00:00
|
|
|
static int old_got = 0;
|
|
|
|
|
2014-02-12 06:14:36 +00:00
|
|
|
static bfd_vma pagesize = 0;
|
|
|
|
|
2014-01-29 21:56:02 +00:00
|
|
|
static struct ppc_elf_params params = { PLT_UNSET, -1, 0, 0, 0, 0 };
|
|
|
|
|
|
|
|
static void
|
|
|
|
ppc_after_open_output (void)
|
|
|
|
{
|
|
|
|
if (params.emit_stub_syms < 0)
|
|
|
|
params.emit_stub_syms = link_info.emitrelocations || link_info.shared;
|
2014-02-12 06:14:36 +00:00
|
|
|
if (pagesize == 0)
|
|
|
|
pagesize = config.commonpagesize;
|
|
|
|
params.pagesize_p2 = bfd_log2 (pagesize);
|
2014-01-29 21:56:02 +00:00
|
|
|
ppc_elf_link_params (&link_info, ¶ms);
|
|
|
|
}
|
|
|
|
|
2014-02-27 13:01:35 +00:00
|
|
|
EOF
|
|
|
|
|
|
|
|
# No --secure-plt, --bss-plt, or --sdata-got for vxworks.
|
|
|
|
if test -z "$VXWORKS_BASE_EM_FILE" ; then
|
|
|
|
fragment <<EOF
|
2005-05-11 14:10:10 +00:00
|
|
|
static void
|
|
|
|
ppc_after_open (void)
|
|
|
|
{
|
2008-02-15 09:03:02 +00:00
|
|
|
if (is_ppc_elf (link_info.output_bfd))
|
2005-05-11 14:10:10 +00:00
|
|
|
{
|
|
|
|
int new_plt;
|
|
|
|
int keep_new;
|
|
|
|
unsigned int num_plt;
|
|
|
|
unsigned int num_got;
|
|
|
|
lang_output_section_statement_type *os;
|
|
|
|
lang_output_section_statement_type *plt_os[2];
|
|
|
|
lang_output_section_statement_type *got_os[2];
|
|
|
|
|
2014-01-29 21:56:02 +00:00
|
|
|
new_plt = ppc_elf_select_plt_layout (link_info.output_bfd, &link_info);
|
2005-05-11 14:10:10 +00:00
|
|
|
if (new_plt < 0)
|
|
|
|
einfo ("%X%P: select_plt_layout problem %E\n");
|
|
|
|
|
|
|
|
num_got = 0;
|
|
|
|
num_plt = 0;
|
|
|
|
for (os = &lang_output_section_statement.head->output_section_statement;
|
|
|
|
os != NULL;
|
|
|
|
os = os->next)
|
|
|
|
{
|
|
|
|
if (os->constraint == SPECIAL && strcmp (os->name, ".plt") == 0)
|
|
|
|
{
|
|
|
|
if (num_plt < 2)
|
|
|
|
plt_os[num_plt] = os;
|
|
|
|
++num_plt;
|
|
|
|
}
|
|
|
|
if (os->constraint == SPECIAL && strcmp (os->name, ".got") == 0)
|
|
|
|
{
|
|
|
|
if (num_got < 2)
|
|
|
|
got_os[num_got] = os;
|
|
|
|
++num_got;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
keep_new = new_plt == 1 ? 0 : -1;
|
|
|
|
if (num_plt == 2)
|
|
|
|
{
|
|
|
|
plt_os[0]->constraint = keep_new;
|
|
|
|
plt_os[1]->constraint = ~keep_new;
|
|
|
|
}
|
|
|
|
if (num_got == 2)
|
|
|
|
{
|
|
|
|
if (old_got)
|
|
|
|
keep_new = -1;
|
|
|
|
got_os[0]->constraint = keep_new;
|
|
|
|
got_os[1]->constraint = ~keep_new;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
gld${EMULATION_NAME}_after_open ();
|
|
|
|
}
|
|
|
|
|
2014-02-27 13:01:35 +00:00
|
|
|
EOF
|
|
|
|
fi
|
|
|
|
fragment <<EOF
|
2003-02-18 06:05:07 +00:00
|
|
|
static void
|
2003-06-24 14:04:29 +00:00
|
|
|
ppc_before_allocation (void)
|
2003-02-18 06:05:07 +00:00
|
|
|
{
|
2008-02-15 09:03:02 +00:00
|
|
|
if (is_ppc_elf (link_info.output_bfd))
|
2003-02-18 06:05:07 +00:00
|
|
|
{
|
2014-01-29 21:56:02 +00:00
|
|
|
if (ppc_elf_tls_setup (link_info.output_bfd, &link_info)
|
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 11:51:02 +00:00
|
|
|
&& !notlsopt)
|
2003-02-18 06:05:07 +00:00
|
|
|
{
|
2008-02-15 03:35:53 +00:00
|
|
|
if (!ppc_elf_tls_optimize (link_info.output_bfd, &link_info))
|
2003-02-18 06:05:07 +00:00
|
|
|
{
|
|
|
|
einfo ("%X%P: TLS problem %E\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2009-07-10 12:29:40 +00:00
|
|
|
|
2003-02-18 06:05:07 +00:00
|
|
|
gld${EMULATION_NAME}_before_allocation ();
|
2009-07-10 12:29:40 +00:00
|
|
|
|
2014-01-29 21:56:02 +00:00
|
|
|
if (RELAXATION_ENABLED)
|
|
|
|
params.branch_trampolines = 1;
|
|
|
|
|
2009-07-10 12:29:40 +00:00
|
|
|
/* Turn on relaxation if executable sections have addresses that
|
|
|
|
might make branches overflow. */
|
2014-01-29 21:56:02 +00:00
|
|
|
else if (!RELAXATION_DISABLED_BY_USER)
|
2009-07-10 12:29:40 +00:00
|
|
|
{
|
|
|
|
bfd_vma low = (bfd_vma) -1;
|
|
|
|
bfd_vma high = 0;
|
|
|
|
asection *o;
|
|
|
|
|
|
|
|
/* Run lang_size_sections (if not already done). */
|
|
|
|
if (expld.phase != lang_mark_phase_enum)
|
|
|
|
{
|
|
|
|
expld.phase = lang_mark_phase_enum;
|
|
|
|
expld.dataseg.phase = exp_dataseg_none;
|
|
|
|
one_lang_size_sections_pass (NULL, FALSE);
|
|
|
|
lang_reset_memory_regions ();
|
|
|
|
}
|
|
|
|
|
|
|
|
for (o = link_info.output_bfd->sections; o != NULL; o = o->next)
|
|
|
|
{
|
|
|
|
if ((o->flags & (SEC_ALLOC | SEC_CODE)) != (SEC_ALLOC | SEC_CODE))
|
|
|
|
continue;
|
2009-08-04 08:15:24 +00:00
|
|
|
if (o->rawsize == 0)
|
2009-07-10 12:29:40 +00:00
|
|
|
continue;
|
|
|
|
if (low > o->vma)
|
|
|
|
low = o->vma;
|
2009-08-04 08:15:24 +00:00
|
|
|
if (high < o->vma + o->rawsize - 1)
|
|
|
|
high = o->vma + o->rawsize - 1;
|
2009-07-10 12:29:40 +00:00
|
|
|
}
|
|
|
|
if (high > low && high - low > (1 << 25) - 1)
|
2014-01-29 21:56:02 +00:00
|
|
|
params.branch_trampolines = 1;
|
2009-07-10 12:29:40 +00:00
|
|
|
}
|
2014-01-29 21:56:02 +00:00
|
|
|
|
|
|
|
if (params.ppc476_workaround || params.branch_trampolines)
|
|
|
|
ENABLE_RELAXATION;
|
2003-02-18 06:05:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
EOF
|
|
|
|
|
2007-03-26 11:10:44 +00:00
|
|
|
if grep -q 'ld_elf32_spu_emulation' ldemul-list.h; then
|
2007-07-19 19:56:10 +00:00
|
|
|
fragment <<EOF
|
2007-03-26 11:10:44 +00:00
|
|
|
/* Special handling for embedded SPU executables. */
|
|
|
|
extern bfd_boolean embedded_spu_file (lang_input_statement_type *, const char *);
|
|
|
|
static bfd_boolean gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *);
|
|
|
|
|
|
|
|
static bfd_boolean
|
|
|
|
ppc_recognized_file (lang_input_statement_type *entry)
|
|
|
|
{
|
|
|
|
if (embedded_spu_file (entry, "-m32"))
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
return gld${EMULATION_NAME}_load_symbols (entry);
|
|
|
|
}
|
|
|
|
|
|
|
|
EOF
|
|
|
|
LDEMUL_RECOGNIZED_FILE=ppc_recognized_file
|
|
|
|
fi
|
|
|
|
|
2003-02-18 06:05:07 +00:00
|
|
|
# Define some shell vars to insert bits of code into the standard elf
|
|
|
|
# parse_args and list_options functions.
|
|
|
|
#
|
2011-07-26 01:57:18 +00:00
|
|
|
PARSE_AND_LIST_PROLOGUE=${PARSE_AND_LIST_PROLOGUE}'
|
|
|
|
#define OPTION_NO_TLS_OPT 321
|
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 11:51:02 +00:00
|
|
|
#define OPTION_NO_TLS_GET_ADDR_OPT (OPTION_NO_TLS_OPT + 1)
|
|
|
|
#define OPTION_NEW_PLT (OPTION_NO_TLS_GET_ADDR_OPT + 1)
|
|
|
|
#define OPTION_OLD_PLT (OPTION_NEW_PLT + 1)
|
|
|
|
#define OPTION_OLD_GOT (OPTION_OLD_PLT + 1)
|
|
|
|
#define OPTION_STUBSYMS (OPTION_OLD_GOT + 1)
|
2009-10-02 15:00:30 +00:00
|
|
|
#define OPTION_NO_STUBSYMS (OPTION_STUBSYMS + 1)
|
2014-01-29 21:56:02 +00:00
|
|
|
#define OPTION_PPC476_WORKAROUND (OPTION_NO_STUBSYMS + 1)
|
|
|
|
#define OPTION_NO_PPC476_WORKAROUND (OPTION_PPC476_WORKAROUND + 1)
|
2003-02-18 06:05:07 +00:00
|
|
|
'
|
|
|
|
|
2011-07-26 01:57:18 +00:00
|
|
|
PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
|
2005-12-08 11:41:12 +00:00
|
|
|
{ "emit-stub-syms", no_argument, NULL, OPTION_STUBSYMS },
|
2009-10-02 15:00:30 +00:00
|
|
|
{ "no-emit-stub-syms", no_argument, NULL, OPTION_NO_STUBSYMS },
|
2003-02-18 06:05:07 +00:00
|
|
|
{ "no-tls-optimize", no_argument, NULL, OPTION_NO_TLS_OPT },
|
2014-02-27 13:01:35 +00:00
|
|
|
{ "no-tls-get-addr-optimize", no_argument, NULL, OPTION_NO_TLS_GET_ADDR_OPT },'
|
|
|
|
if test -z "$VXWORKS_BASE_EM_FILE" ; then
|
|
|
|
PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
|
2007-05-11 06:39:05 +00:00
|
|
|
{ "secure-plt", no_argument, NULL, OPTION_NEW_PLT },
|
2005-05-11 14:10:10 +00:00
|
|
|
{ "bss-plt", no_argument, NULL, OPTION_OLD_PLT },
|
2014-02-27 13:01:35 +00:00
|
|
|
{ "sdata-got", no_argument, NULL, OPTION_OLD_GOT },'
|
|
|
|
fi
|
|
|
|
PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
|
2014-01-29 21:56:02 +00:00
|
|
|
{ "ppc476-workaround", optional_argument, NULL, OPTION_PPC476_WORKAROUND },
|
|
|
|
{ "no-ppc476-workaround", no_argument, NULL, OPTION_NO_PPC476_WORKAROUND },
|
2003-02-18 06:05:07 +00:00
|
|
|
'
|
|
|
|
|
2011-07-26 01:57:18 +00:00
|
|
|
PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'
|
2003-02-18 06:05:07 +00:00
|
|
|
fprintf (file, _("\
|
2007-08-17 13:50:48 +00:00
|
|
|
--emit-stub-syms Label linker stubs with a symbol.\n\
|
2009-10-02 15:00:30 +00:00
|
|
|
--no-emit-stub-syms Don'\''t label linker stubs with a symbol.\n\
|
2007-08-17 13:50:48 +00:00
|
|
|
--no-tls-optimize Don'\''t try to optimize TLS accesses.\n\
|
2014-02-27 13:01:35 +00:00
|
|
|
--no-tls-get-addr-optimize Don'\''t use a special __tls_get_addr call.\n'
|
|
|
|
if test -z "$VXWORKS_BASE_EM_FILE" ; then
|
|
|
|
PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'\
|
2007-08-17 13:50:48 +00:00
|
|
|
--secure-plt Use new-style PLT if possible.\n\
|
|
|
|
--bss-plt Force old-style BSS PLT.\n\
|
2014-02-27 13:01:35 +00:00
|
|
|
--sdata-got Force GOT location just before .sdata.\n'
|
|
|
|
fi
|
|
|
|
PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'\
|
2014-01-29 21:56:02 +00:00
|
|
|
--ppc476-workaround [=pagesize]\n\
|
|
|
|
Avoid a cache bug on ppc476.\n\
|
|
|
|
--no-ppc476-workaround Disable workaround.\n"
|
2003-02-18 06:05:07 +00:00
|
|
|
));
|
|
|
|
'
|
|
|
|
|
2011-07-26 01:57:18 +00:00
|
|
|
PARSE_AND_LIST_ARGS_CASES=${PARSE_AND_LIST_ARGS_CASES}'
|
2005-12-08 11:41:12 +00:00
|
|
|
case OPTION_STUBSYMS:
|
2014-01-29 21:56:02 +00:00
|
|
|
params.emit_stub_syms = 1;
|
2005-12-08 11:41:12 +00:00
|
|
|
break;
|
|
|
|
|
2009-10-02 15:00:30 +00:00
|
|
|
case OPTION_NO_STUBSYMS:
|
2014-01-29 21:56:02 +00:00
|
|
|
params.emit_stub_syms = 0;
|
2009-10-02 15:00:30 +00:00
|
|
|
break;
|
|
|
|
|
2003-02-18 06:05:07 +00:00
|
|
|
case OPTION_NO_TLS_OPT:
|
|
|
|
notlsopt = 1;
|
|
|
|
break;
|
2005-05-11 14:10:10 +00:00
|
|
|
|
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 11:51:02 +00:00
|
|
|
case OPTION_NO_TLS_GET_ADDR_OPT:
|
2014-01-29 21:56:02 +00:00
|
|
|
params.no_tls_get_addr_opt = 1;
|
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 11:51:02 +00:00
|
|
|
break;
|
|
|
|
|
2007-05-11 06:39:05 +00:00
|
|
|
case OPTION_NEW_PLT:
|
2014-01-29 21:56:02 +00:00
|
|
|
params.plt_style = PLT_NEW;
|
2007-05-11 06:39:05 +00:00
|
|
|
break;
|
|
|
|
|
2005-05-11 14:10:10 +00:00
|
|
|
case OPTION_OLD_PLT:
|
2014-01-29 21:56:02 +00:00
|
|
|
params.plt_style = PLT_OLD;
|
2005-05-11 14:10:10 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case OPTION_OLD_GOT:
|
|
|
|
old_got = 1;
|
|
|
|
break;
|
2012-05-26 11:13:20 +00:00
|
|
|
|
|
|
|
case OPTION_TRADITIONAL_FORMAT:
|
|
|
|
notlsopt = 1;
|
2014-01-29 21:56:02 +00:00
|
|
|
params.no_tls_get_addr_opt = 1;
|
2012-05-26 11:13:20 +00:00
|
|
|
return FALSE;
|
2014-01-29 21:56:02 +00:00
|
|
|
|
|
|
|
case OPTION_PPC476_WORKAROUND:
|
|
|
|
params.ppc476_workaround = 1;
|
|
|
|
if (optarg != NULL)
|
|
|
|
{
|
|
|
|
char *end;
|
2014-02-12 06:14:36 +00:00
|
|
|
pagesize = strtoul (optarg, &end, 0);
|
2014-01-29 21:56:02 +00:00
|
|
|
if (*end
|
2014-02-12 06:14:36 +00:00
|
|
|
|| (pagesize < 4096 && pagesize != 0)
|
|
|
|
|| pagesize != (pagesize & -pagesize))
|
2014-01-29 21:56:02 +00:00
|
|
|
einfo (_("%P%F: invalid pagesize `%s'\''\n"), optarg);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case OPTION_NO_PPC476_WORKAROUND:
|
|
|
|
params.ppc476_workaround = 0;
|
|
|
|
break;
|
2003-02-18 06:05:07 +00:00
|
|
|
'
|
|
|
|
|
2005-03-21 13:23:15 +00:00
|
|
|
# Put these extra ppc32elf routines in ld_${EMULATION_NAME}_emulation
|
2003-02-18 06:05:07 +00:00
|
|
|
#
|
2014-01-29 21:56:02 +00:00
|
|
|
LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=ppc_after_open_output
|
2014-02-27 13:01:35 +00:00
|
|
|
if test -z "$VXWORKS_BASE_EM_FILE" ; then
|
|
|
|
LDEMUL_AFTER_OPEN=ppc_after_open
|
|
|
|
fi
|
2003-02-18 06:05:07 +00:00
|
|
|
LDEMUL_BEFORE_ALLOCATION=ppc_before_allocation
|