2003-02-18 07:05:07 +01:00
|
|
|
# This shell script emits a C file. -*- C -*-
|
2016-01-01 12:25:12 +01:00
|
|
|
# Copyright (C) 2003-2016 Free Software Foundation, Inc.
|
2003-02-18 07:05:07 +01:00
|
|
|
#
|
2007-07-06 16:09:45 +02:00
|
|
|
# This file is part of the GNU Binutils.
|
2003-02-18 07:05:07 +01: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 16:09:45 +02:00
|
|
|
# the Free Software Foundation; either version 3 of the License, or
|
2003-02-18 07:05:07 +01: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 16:09:45 +02:00
|
|
|
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
|
|
|
# MA 02110-1301, USA.
|
2003-02-18 07:05:07 +01:00
|
|
|
#
|
|
|
|
|
2005-03-21 14:23:15 +01:00
|
|
|
# This file is sourced from elf32.em, and defines extra powerpc32-elf
|
2003-02-18 07:05:07 +01:00
|
|
|
# specific routines.
|
|
|
|
#
|
2007-07-19 21:56:10 +02:00
|
|
|
fragment <<EOF
|
2003-02-18 07:05:07 +01:00
|
|
|
|
|
|
|
#include "libbfd.h"
|
|
|
|
#include "elf32-ppc.h"
|
2012-05-26 13:13:20 +02:00
|
|
|
#include "ldlex.h"
|
2014-04-05 09:25:13 +02:00
|
|
|
#include "ldlang.h"
|
2003-02-18 07:05:07 +01:00
|
|
|
|
2008-02-15 10:03:02 +01: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 10:16:43 +01:00
|
|
|
&& elf_object_id (bfd) == PPC32_ELF_DATA)
|
2005-03-21 14:23:15 +01:00
|
|
|
|
2003-02-18 07:05:07 +01:00
|
|
|
/* Whether to run tls optimization. */
|
|
|
|
static int notlsopt = 0;
|
|
|
|
|
2014-01-29 22:56:02 +01:00
|
|
|
/* Choose the correct place for .got. */
|
2005-05-11 16:10:10 +02:00
|
|
|
static int old_got = 0;
|
|
|
|
|
2014-02-12 07:14:36 +01:00
|
|
|
static bfd_vma pagesize = 0;
|
|
|
|
|
2015-04-01 01:29:46 +02:00
|
|
|
static struct ppc_elf_params params = { PLT_UNSET, -1, 0, 0, 0, 0, 0 };
|
2014-01-29 22:56:02 +01:00
|
|
|
|
|
|
|
static void
|
|
|
|
ppc_after_open_output (void)
|
|
|
|
{
|
|
|
|
if (params.emit_stub_syms < 0)
|
Add output_type to bfd_link_info
The "shared" field in bfd_link_info is set for both DSO and and PIE.
There are separate fields for executable and relocatable outputs. This
patch adds an "output_type" field:
enum output_type
{
type_unknown = 0,
type_executable,
type_dll,
type_relocatable
};
and a "pic" field to bfd_link_info to replace shared, executable and
relocatable fields so that we can use the "output_type" field to check
for output type and the "pic" field check if output is PIC. Macros,
bfd_link_executable, bfd_link_dll, bfd_link_relocatable, bfd_link_pic
and bfd_link_pie, are provided to check for output features.
bfd/
* bfd/aoutx.h: Replace shared, executable, relocatable and pie
fields with bfd_link_executable, bfd_link_dll,
bfd_link_relocatable, bfd_link_pic and bfd_link_pie.
* bfd/bout.c: Likewise.
* bfd/coff-alpha.c: Likewise.
* bfd/coff-arm.c: Likewise.
* bfd/coff-i386.c: Likewise.
* bfd/coff-i960.c: Likewise.
* bfd/coff-m68k.c: Likewise.
* bfd/coff-mcore.c: Likewise.
* bfd/coff-mips.c: Likewise.
* bfd/coff-ppc.c: Likewise.
* bfd/coff-rs6000.c: Likewise.
* bfd/coff-sh.c: Likewise.
* bfd/coff-tic80.c: Likewise.
* bfd/coff-x86_64.c: Likewise.
* bfd/coff64-rs6000.c: Likewise.
* bfd/coffgen.c: Likewise.
* bfd/cofflink.c: Likewise.
* bfd/ecoff.c: Likewise.
* bfd/ecofflink.c: Likewise.
* bfd/elf-bfd.h: Likewise.
* bfd/elf-eh-frame.c: Likewise.
* bfd/elf-ifunc.c: Likewise.
* bfd/elf-m10200.c: Likewise.
* bfd/elf-m10300.c: Likewise.
* bfd/elf-s390-common.c: Likewise.
* bfd/elf-vxworks.c: Likewise.
* bfd/elf.c: Likewise.
* bfd/elf32-arm.c: Likewise.
* bfd/elf32-avr.c: Likewise.
* bfd/elf32-bfin.c: Likewise.
* bfd/elf32-cr16.c: Likewise.
* bfd/elf32-cr16c.c: Likewise.
* bfd/elf32-cris.c: Likewise.
* bfd/elf32-crx.c: Likewise.
* bfd/elf32-d10v.c: Likewise.
* bfd/elf32-dlx.c: Likewise.
* bfd/elf32-epiphany.c: Likewise.
* bfd/elf32-fr30.c: Likewise.
* bfd/elf32-frv.c: Likewise.
* bfd/elf32-ft32.c: Likewise.
* bfd/elf32-h8300.c: Likewise.
* bfd/elf32-hppa.c: Likewise.
* bfd/elf32-i370.c: Likewise.
* bfd/elf32-i386.c: Likewise.
* bfd/elf32-i860.c: Likewise.
* bfd/elf32-ip2k.c: Likewise.
* bfd/elf32-iq2000.c: Likewise.
* bfd/elf32-lm32.c: Likewise.
* bfd/elf32-m32c.c: Likewise.
* bfd/elf32-m32r.c: Likewise.
* bfd/elf32-m68hc11.c: Likewise.
* bfd/elf32-m68hc1x.c: Likewise.
* bfd/elf32-m68k.c: Likewise.
* bfd/elf32-mcore.c: Likewise.
* bfd/elf32-mep.c: Likewise.
* bfd/elf32-metag.c: Likewise.
* bfd/elf32-microblaze.c: Likewise.
* bfd/elf32-moxie.c: Likewise.
* bfd/elf32-msp430.c: Likewise.
* bfd/elf32-mt.c: Likewise.
* bfd/elf32-nds32.c: Likewise.
* bfd/elf32-nios2.c: Likewise.
* bfd/elf32-or1k.c: Likewise.
* bfd/elf32-ppc.c: Likewise.
* bfd/elf32-rl78.c: Likewise.
* bfd/elf32-rx.c: Likewise.
* bfd/elf32-s390.c: Likewise.
* bfd/elf32-score.c: Likewise.
* bfd/elf32-score7.c: Likewise.
* bfd/elf32-sh-symbian.c: Likewise.
* bfd/elf32-sh.c: Likewise.
* bfd/elf32-sh64.c: Likewise.
* bfd/elf32-spu.c: Likewise.
* bfd/elf32-tic6x.c: Likewise.
* bfd/elf32-tilepro.c: Likewise.
* bfd/elf32-v850.c: Likewise.
* bfd/elf32-vax.c: Likewise.
* bfd/elf32-visium.c: Likewise.
* bfd/elf32-xc16x.c: Likewise.
* bfd/elf32-xstormy16.c: Likewise.
* bfd/elf32-xtensa.c: Likewise.
* bfd/elf64-alpha.c: Likewise.
* bfd/elf64-hppa.c: Likewise.
* bfd/elf64-ia64-vms.c: Likewise.
* bfd/elf64-mmix.c: Likewise.
* bfd/elf64-ppc.c: Likewise.
* bfd/elf64-s390.c: Likewise.
* bfd/elf64-sh64.c: Likewise.
* bfd/elf64-x86-64.c: Likewise.
* bfd/elflink.c: Likewise.
* bfd/elfnn-aarch64.c: Likewise.
* bfd/elfnn-ia64.c: Likewise.
* bfd/elfxx-mips.c: Likewise.
* bfd/elfxx-sparc.c: Likewise.
* bfd/elfxx-tilegx.c: Likewise.
* bfd/i386linux.c: Likewise.
* bfd/linker.c: Likewise.
* bfd/m68klinux.c: Likewise.
* bfd/pdp11.c: Likewise.
* bfd/pe-mips.c: Likewise.
* bfd/peXXigen.c: Likewise.
* bfd/reloc.c: Likewise.
* bfd/reloc16.c: Likewise.
* bfd/sparclinux.c: Likewise.
* bfd/sunos.c: Likewise.
* bfd/vms-alpha.c: Likewise.
* bfd/xcofflink.c: Likewise.
include/
* include/bfdlink.h (output_type): New enum.
(bfd_link_executable): New macro.
(bfd_link_dll): Likewise.
(bfd_link_relocatable): Likewise.
(bfd_link_pic): Likewise.
(bfd_link_pie): Likewise.
(bfd_link_info): Remove shared, executable, pie and relocatable.
Add output_type and pic.
ld/
* ld/ldctor.c: Replace shared, executable, relocatable and pie
fields with bfd_link_executable, bfd_link_dll,
bfd_link_relocatable, bfd_link_pic and bfd_link_pie.
* ld/ldemul.c: Likewise.
* ld/ldfile.c: Likewise.
* ld/ldlang.c: Likewise.
* ld/ldmain.c: Likewise.
* ld/ldwrite.c: Likewise.
* ld/lexsup.c: Likewise.
* ld/pe-dll.c: Likewise.
* ld/plugin.c: Likewise.
* ld/emultempl/aarch64elf.em: Likewise.
* ld/emultempl/aix.em: Likewise.
* ld/emultempl/alphaelf.em: Likewise.
* ld/emultempl/armcoff.em: Likewise.
* ld/emultempl/armelf.em: Likewise.
* ld/emultempl/avrelf.em: Likewise.
* ld/emultempl/beos.em: Likewise.
* ld/emultempl/cr16elf.em: Likewise.
* ld/emultempl/elf-generic.em: Likewise.
* ld/emultempl/elf32.em: Likewise.
* ld/emultempl/genelf.em: Likewise.
* ld/emultempl/generic.em: Likewise.
* ld/emultempl/gld960.em: Likewise.
* ld/emultempl/gld960c.em: Likewise.
* ld/emultempl/hppaelf.em: Likewise.
* ld/emultempl/irix.em: Likewise.
* ld/emultempl/linux.em: Likewise.
* ld/emultempl/lnk960.em: Likewise.
* ld/emultempl/m68hc1xelf.em: Likewise.
* ld/emultempl/m68kcoff.em: Likewise.
* ld/emultempl/m68kelf.em: Likewise.
* ld/emultempl/metagelf.em: Likewise.
* ld/emultempl/mipself.em: Likewise.
* ld/emultempl/mmo.em: Likewise.
* ld/emultempl/msp430.em: Likewise.
* ld/emultempl/nds32elf.em: Likewise.
* ld/emultempl/needrelax.em: Likewise.
* ld/emultempl/nios2elf.em: Likewise.
* ld/emultempl/pe.em: Likewise.
* ld/emultempl/pep.em: Likewise.
* ld/emultempl/ppc32elf.em: Likewise.
* ld/emultempl/ppc64elf.em: Likewise.
* ld/emultempl/sh64elf.em: Likewise.
* ld/emultempl/solaris2.em: Likewise.
* ld/emultempl/spuelf.em: Likewise.
* ld/emultempl/sunos.em: Likewise.
* ld/emultempl/tic6xdsbt.em: Likewise.
* ld/emultempl/ticoff.em: Likewise.
* ld/emultempl/v850elf.em: Likewise.
* ld/emultempl/vms.em: Likewise.
* ld/emultempl/vxworks.em: Likewise.
2015-08-18 14:51:03 +02:00
|
|
|
params.emit_stub_syms = (link_info.emitrelocations
|
|
|
|
|| bfd_link_pic (&link_info));
|
2014-02-12 07:14:36 +01:00
|
|
|
if (pagesize == 0)
|
|
|
|
pagesize = config.commonpagesize;
|
|
|
|
params.pagesize_p2 = bfd_log2 (pagesize);
|
2014-01-29 22:56:02 +01:00
|
|
|
ppc_elf_link_params (&link_info, ¶ms);
|
|
|
|
}
|
|
|
|
|
2014-02-27 14:01:35 +01: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 16:10:10 +02:00
|
|
|
static void
|
|
|
|
ppc_after_open (void)
|
|
|
|
{
|
2008-02-15 10:03:02 +01:00
|
|
|
if (is_ppc_elf (link_info.output_bfd))
|
2005-05-11 16:10:10 +02: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 22:56:02 +01:00
|
|
|
new_plt = ppc_elf_select_plt_layout (link_info.output_bfd, &link_info);
|
2005-05-11 16:10:10 +02: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 14:01:35 +01:00
|
|
|
EOF
|
|
|
|
fi
|
|
|
|
fragment <<EOF
|
2003-02-18 07:05:07 +01:00
|
|
|
static void
|
2003-06-24 16:04:29 +02:00
|
|
|
ppc_before_allocation (void)
|
2003-02-18 07:05:07 +01:00
|
|
|
{
|
2008-02-15 10:03:02 +01:00
|
|
|
if (is_ppc_elf (link_info.output_bfd))
|
2003-02-18 07:05:07 +01:00
|
|
|
{
|
2014-01-29 22:56:02 +01: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 13:51:02 +02:00
|
|
|
&& !notlsopt)
|
2003-02-18 07:05:07 +01:00
|
|
|
{
|
2008-02-15 04:35:53 +01:00
|
|
|
if (!ppc_elf_tls_optimize (link_info.output_bfd, &link_info))
|
2003-02-18 07:05:07 +01:00
|
|
|
{
|
|
|
|
einfo ("%X%P: TLS problem %E\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2009-07-10 14:29:40 +02:00
|
|
|
|
2003-02-18 07:05:07 +01:00
|
|
|
gld${EMULATION_NAME}_before_allocation ();
|
2009-07-10 14:29:40 +02:00
|
|
|
|
2014-05-20 04:12:42 +02:00
|
|
|
ppc_elf_maybe_strip_sdata_syms (&link_info);
|
|
|
|
|
2014-01-29 22:56:02 +01:00
|
|
|
if (RELAXATION_ENABLED)
|
|
|
|
params.branch_trampolines = 1;
|
|
|
|
|
2009-07-10 14:29:40 +02:00
|
|
|
/* Turn on relaxation if executable sections have addresses that
|
|
|
|
might make branches overflow. */
|
2014-01-29 22:56:02 +01:00
|
|
|
else if (!RELAXATION_DISABLED_BY_USER)
|
2009-07-10 14:29:40 +02: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 10:15:24 +02:00
|
|
|
if (o->rawsize == 0)
|
2009-07-10 14:29:40 +02:00
|
|
|
continue;
|
|
|
|
if (low > o->vma)
|
|
|
|
low = o->vma;
|
2009-08-04 10:15:24 +02:00
|
|
|
if (high < o->vma + o->rawsize - 1)
|
|
|
|
high = o->vma + o->rawsize - 1;
|
2009-07-10 14:29:40 +02:00
|
|
|
}
|
|
|
|
if (high > low && high - low > (1 << 25) - 1)
|
2014-01-29 22:56:02 +01:00
|
|
|
params.branch_trampolines = 1;
|
2009-07-10 14:29:40 +02:00
|
|
|
}
|
2014-01-29 22:56:02 +01:00
|
|
|
|
2015-04-01 01:29:46 +02:00
|
|
|
if (params.branch_trampolines
|
|
|
|
|| params.ppc476_workaround
|
|
|
|
|| params.pic_fixup > 0)
|
2014-01-29 22:56:02 +01:00
|
|
|
ENABLE_RELAXATION;
|
2003-02-18 07:05:07 +01:00
|
|
|
}
|
|
|
|
|
2014-04-05 09:25:13 +02:00
|
|
|
/* Replaces default zero fill padding in executable sections with
|
|
|
|
"ba 0" instructions. This works around the ppc476 icache bug if we
|
|
|
|
have a function pointer tail call near the end of a page, some
|
|
|
|
small amount of padding, then the function called at the beginning
|
|
|
|
of the next page. If the "ba 0" is ever executed we should hit a
|
|
|
|
segv, so it's almost as good as an illegal instruction (zero). */
|
|
|
|
|
|
|
|
static void
|
|
|
|
no_zero_padding (lang_statement_union_type *l)
|
|
|
|
{
|
|
|
|
if (l->header.type == lang_padding_statement_enum
|
|
|
|
&& l->padding_statement.size != 0
|
|
|
|
&& l->padding_statement.output_section != NULL
|
|
|
|
&& (l->padding_statement.output_section->flags & SEC_CODE) != 0
|
|
|
|
&& l->padding_statement.fill->size == 0)
|
|
|
|
{
|
|
|
|
struct _ppc_fill_type
|
|
|
|
{
|
|
|
|
size_t size;
|
|
|
|
unsigned char data[4];
|
|
|
|
};
|
|
|
|
static struct _ppc_fill_type fill_be = { 4, {0x48, 0, 0, 2} };
|
|
|
|
static struct _ppc_fill_type fill_le = { 4, {2, 0, 0, 0x48} };
|
|
|
|
|
|
|
|
if (bfd_big_endian (link_info.output_bfd))
|
|
|
|
l->padding_statement.fill = (struct _fill_type *) &fill_be;
|
|
|
|
else
|
|
|
|
l->padding_statement.fill = (struct _fill_type *) &fill_le;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
ppc_finish (void)
|
|
|
|
{
|
|
|
|
if (params.ppc476_workaround)
|
|
|
|
lang_for_each_statement (no_zero_padding);
|
|
|
|
finish_default ();
|
|
|
|
}
|
|
|
|
|
2003-02-18 07:05:07 +01:00
|
|
|
EOF
|
|
|
|
|
2007-03-26 13:10:44 +02:00
|
|
|
if grep -q 'ld_elf32_spu_emulation' ldemul-list.h; then
|
2007-07-19 21:56:10 +02:00
|
|
|
fragment <<EOF
|
2007-03-26 13:10:44 +02: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 07:05:07 +01:00
|
|
|
# Define some shell vars to insert bits of code into the standard elf
|
|
|
|
# parse_args and list_options functions.
|
|
|
|
#
|
2011-07-26 03:57:18 +02: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 13:51:02 +02: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 17:00:30 +02:00
|
|
|
#define OPTION_NO_STUBSYMS (OPTION_STUBSYMS + 1)
|
2014-01-29 22:56:02 +01:00
|
|
|
#define OPTION_PPC476_WORKAROUND (OPTION_NO_STUBSYMS + 1)
|
|
|
|
#define OPTION_NO_PPC476_WORKAROUND (OPTION_PPC476_WORKAROUND + 1)
|
2015-04-01 01:29:46 +02:00
|
|
|
#define OPTION_NO_PICFIXUP (OPTION_NO_PPC476_WORKAROUND + 1)
|
2003-02-18 07:05:07 +01:00
|
|
|
'
|
|
|
|
|
2011-07-26 03:57:18 +02:00
|
|
|
PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
|
2005-12-08 12:41:12 +01:00
|
|
|
{ "emit-stub-syms", no_argument, NULL, OPTION_STUBSYMS },
|
2009-10-02 17:00:30 +02:00
|
|
|
{ "no-emit-stub-syms", no_argument, NULL, OPTION_NO_STUBSYMS },
|
2003-02-18 07:05:07 +01:00
|
|
|
{ "no-tls-optimize", no_argument, NULL, OPTION_NO_TLS_OPT },
|
2014-02-27 14:01:35 +01: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 08:39:05 +02:00
|
|
|
{ "secure-plt", no_argument, NULL, OPTION_NEW_PLT },
|
2005-05-11 16:10:10 +02:00
|
|
|
{ "bss-plt", no_argument, NULL, OPTION_OLD_PLT },
|
2014-02-27 14:01:35 +01:00
|
|
|
{ "sdata-got", no_argument, NULL, OPTION_OLD_GOT },'
|
|
|
|
fi
|
|
|
|
PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
|
2014-01-29 22:56:02 +01:00
|
|
|
{ "ppc476-workaround", optional_argument, NULL, OPTION_PPC476_WORKAROUND },
|
|
|
|
{ "no-ppc476-workaround", no_argument, NULL, OPTION_NO_PPC476_WORKAROUND },
|
2015-04-01 01:29:46 +02:00
|
|
|
{ "no-pic-fixup", no_argument, NULL, OPTION_NO_PICFIXUP },
|
2003-02-18 07:05:07 +01:00
|
|
|
'
|
|
|
|
|
2011-07-26 03:57:18 +02:00
|
|
|
PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'
|
2003-02-18 07:05:07 +01:00
|
|
|
fprintf (file, _("\
|
2007-08-17 15:50:48 +02:00
|
|
|
--emit-stub-syms Label linker stubs with a symbol.\n\
|
2009-10-02 17:00:30 +02:00
|
|
|
--no-emit-stub-syms Don'\''t label linker stubs with a symbol.\n\
|
2007-08-17 15:50:48 +02:00
|
|
|
--no-tls-optimize Don'\''t try to optimize TLS accesses.\n\
|
2014-02-27 14:01:35 +01: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 15:50:48 +02:00
|
|
|
--secure-plt Use new-style PLT if possible.\n\
|
|
|
|
--bss-plt Force old-style BSS PLT.\n\
|
2014-02-27 14:01:35 +01:00
|
|
|
--sdata-got Force GOT location just before .sdata.\n'
|
|
|
|
fi
|
|
|
|
PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'\
|
2014-01-29 22:56:02 +01:00
|
|
|
--ppc476-workaround [=pagesize]\n\
|
|
|
|
Avoid a cache bug on ppc476.\n\
|
2015-04-01 01:29:46 +02:00
|
|
|
--no-ppc476-workaround Disable workaround.\n\
|
|
|
|
--no-pic-fixup Don'\''t edit non-pic to pic.\n"
|
2003-02-18 07:05:07 +01:00
|
|
|
));
|
|
|
|
'
|
|
|
|
|
2011-07-26 03:57:18 +02:00
|
|
|
PARSE_AND_LIST_ARGS_CASES=${PARSE_AND_LIST_ARGS_CASES}'
|
2005-12-08 12:41:12 +01:00
|
|
|
case OPTION_STUBSYMS:
|
2014-01-29 22:56:02 +01:00
|
|
|
params.emit_stub_syms = 1;
|
2005-12-08 12:41:12 +01:00
|
|
|
break;
|
|
|
|
|
2009-10-02 17:00:30 +02:00
|
|
|
case OPTION_NO_STUBSYMS:
|
2014-01-29 22:56:02 +01:00
|
|
|
params.emit_stub_syms = 0;
|
2009-10-02 17:00:30 +02:00
|
|
|
break;
|
|
|
|
|
2003-02-18 07:05:07 +01:00
|
|
|
case OPTION_NO_TLS_OPT:
|
|
|
|
notlsopt = 1;
|
|
|
|
break;
|
2005-05-11 16:10:10 +02: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 13:51:02 +02:00
|
|
|
case OPTION_NO_TLS_GET_ADDR_OPT:
|
2014-01-29 22:56:02 +01: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 13:51:02 +02:00
|
|
|
break;
|
|
|
|
|
2007-05-11 08:39:05 +02:00
|
|
|
case OPTION_NEW_PLT:
|
2014-01-29 22:56:02 +01:00
|
|
|
params.plt_style = PLT_NEW;
|
2007-05-11 08:39:05 +02:00
|
|
|
break;
|
|
|
|
|
2005-05-11 16:10:10 +02:00
|
|
|
case OPTION_OLD_PLT:
|
2014-01-29 22:56:02 +01:00
|
|
|
params.plt_style = PLT_OLD;
|
2005-05-11 16:10:10 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case OPTION_OLD_GOT:
|
|
|
|
old_got = 1;
|
|
|
|
break;
|
2012-05-26 13:13:20 +02:00
|
|
|
|
|
|
|
case OPTION_TRADITIONAL_FORMAT:
|
|
|
|
notlsopt = 1;
|
2014-01-29 22:56:02 +01:00
|
|
|
params.no_tls_get_addr_opt = 1;
|
2012-05-26 13:13:20 +02:00
|
|
|
return FALSE;
|
2014-01-29 22:56:02 +01:00
|
|
|
|
|
|
|
case OPTION_PPC476_WORKAROUND:
|
|
|
|
params.ppc476_workaround = 1;
|
|
|
|
if (optarg != NULL)
|
|
|
|
{
|
|
|
|
char *end;
|
2014-02-12 07:14:36 +01:00
|
|
|
pagesize = strtoul (optarg, &end, 0);
|
2014-01-29 22:56:02 +01:00
|
|
|
if (*end
|
2014-02-12 07:14:36 +01:00
|
|
|
|| (pagesize < 4096 && pagesize != 0)
|
|
|
|
|| pagesize != (pagesize & -pagesize))
|
2014-01-29 22:56:02 +01:00
|
|
|
einfo (_("%P%F: invalid pagesize `%s'\''\n"), optarg);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case OPTION_NO_PPC476_WORKAROUND:
|
|
|
|
params.ppc476_workaround = 0;
|
|
|
|
break;
|
2015-04-01 01:29:46 +02:00
|
|
|
|
|
|
|
case OPTION_NO_PICFIXUP:
|
|
|
|
params.pic_fixup = -1;
|
|
|
|
break;
|
2003-02-18 07:05:07 +01:00
|
|
|
'
|
|
|
|
|
2005-03-21 14:23:15 +01:00
|
|
|
# Put these extra ppc32elf routines in ld_${EMULATION_NAME}_emulation
|
2003-02-18 07:05:07 +01:00
|
|
|
#
|
2014-01-29 22:56:02 +01:00
|
|
|
LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=ppc_after_open_output
|
2014-02-27 14:01:35 +01:00
|
|
|
if test -z "$VXWORKS_BASE_EM_FILE" ; then
|
|
|
|
LDEMUL_AFTER_OPEN=ppc_after_open
|
|
|
|
fi
|
2003-02-18 07:05:07 +01:00
|
|
|
LDEMUL_BEFORE_ALLOCATION=ppc_before_allocation
|
2014-04-05 09:25:13 +02:00
|
|
|
LDEMUL_FINISH=ppc_finish
|