2015-05-05 14:38:00 +02:00
|
|
|
|
# This shell script emits a C file. -*- C -*-
|
|
|
|
|
# It does some substitutions.
|
|
|
|
|
fragment <<EOF
|
|
|
|
|
/* This file is is generated by a shell script. DO NOT EDIT! */
|
|
|
|
|
|
|
|
|
|
/* Emulate the original gld for the given ${EMULATION_NAME}
|
2018-01-03 06:17:27 +01:00
|
|
|
|
Copyright (C) 2014-2018 Free Software Foundation, Inc.
|
2015-05-05 14:38:00 +02:00
|
|
|
|
Written by Steve Chamberlain steve@cygnus.com
|
|
|
|
|
Extended for the MSP430 by Nick Clifton nickc@redhat.com
|
2017-10-12 12:58:30 +02:00
|
|
|
|
|
2015-05-05 14:38:00 +02:00
|
|
|
|
This file is part of the GNU Binutils.
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
|
|
|
|
MA 02110-1301, USA. */
|
|
|
|
|
|
|
|
|
|
#define TARGET_IS_${EMULATION_NAME}
|
|
|
|
|
|
|
|
|
|
#include "sysdep.h"
|
|
|
|
|
#include "bfd.h"
|
|
|
|
|
#include "bfdlink.h"
|
|
|
|
|
|
|
|
|
|
#include "ld.h"
|
2017-08-29 18:18:43 +02:00
|
|
|
|
#include "getopt.h"
|
2015-05-05 14:38:00 +02:00
|
|
|
|
#include "ldmain.h"
|
|
|
|
|
#include "ldmisc.h"
|
|
|
|
|
#include "ldexp.h"
|
|
|
|
|
#include "ldlang.h"
|
|
|
|
|
#include "ldfile.h"
|
|
|
|
|
#include "ldemul.h"
|
|
|
|
|
#include "libiberty.h"
|
2017-08-29 18:18:43 +02:00
|
|
|
|
#include <ldgram.h>
|
|
|
|
|
|
|
|
|
|
enum regions
|
|
|
|
|
{
|
|
|
|
|
REGION_NONE = 0,
|
|
|
|
|
REGION_LOWER,
|
|
|
|
|
REGION_UPPER,
|
|
|
|
|
REGION_EITHER = 3,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum either_placement_stage
|
|
|
|
|
{
|
|
|
|
|
LOWER_TO_UPPER,
|
|
|
|
|
UPPER_TO_LOWER,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum { ROM, RAM };
|
|
|
|
|
|
|
|
|
|
static int data_region = REGION_NONE;
|
|
|
|
|
static int code_region = REGION_NONE;
|
|
|
|
|
static bfd_boolean disable_sec_transformation = FALSE;
|
|
|
|
|
|
|
|
|
|
#define MAX_PREFIX_LENGTH 7
|
2015-05-05 14:38:00 +02:00
|
|
|
|
|
|
|
|
|
EOF
|
|
|
|
|
|
|
|
|
|
# Import any needed special functions and/or overrides.
|
|
|
|
|
#
|
|
|
|
|
if test -n "$EXTRA_EM_FILE" ; then
|
|
|
|
|
source_em ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
|
|
|
|
|
fragment <<EOF
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gld${EMULATION_NAME}_before_parse (void)
|
|
|
|
|
{
|
|
|
|
|
#ifndef TARGET_ /* I.e., if not generic. */
|
|
|
|
|
ldfile_set_output_arch ("`echo ${ARCH}`", bfd_arch_unknown);
|
|
|
|
|
#endif /* not TARGET_ */
|
|
|
|
|
|
|
|
|
|
/* The MSP430 port *needs* linker relaxtion in order to cope with large
|
|
|
|
|
functions where conditional branches do not fit into a +/- 1024 byte range. */
|
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
|
|
|
|
if (!bfd_link_relocatable (&link_info))
|
2015-05-05 14:38:00 +02:00
|
|
|
|
TARGET_ENABLE_RELAXATION;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EOF
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
|
|
|
|
|
fragment <<EOF
|
|
|
|
|
|
|
|
|
|
static char *
|
|
|
|
|
gld${EMULATION_NAME}_get_script (int *isfile)
|
|
|
|
|
EOF
|
|
|
|
|
|
|
|
|
|
if test x"$COMPILE_IN" = xyes
|
|
|
|
|
then
|
|
|
|
|
# Scripts compiled in.
|
|
|
|
|
|
|
|
|
|
# sed commands to quote an ld script as a C string.
|
|
|
|
|
sc="-f stringify.sed"
|
|
|
|
|
|
|
|
|
|
fragment <<EOF
|
|
|
|
|
{
|
|
|
|
|
*isfile = 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
|
|
|
|
if (bfd_link_relocatable (&link_info) && config.build_constructors)
|
2015-05-05 14:38:00 +02:00
|
|
|
|
return
|
|
|
|
|
EOF
|
|
|
|
|
sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
|
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
|
|
|
|
echo ' ; else if (bfd_link_relocatable (&link_info)) return' >> e${EMULATION_NAME}.c
|
2015-05-05 14:38:00 +02:00
|
|
|
|
sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
|
|
|
|
|
echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
|
|
|
|
|
sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
|
|
|
|
|
echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
|
|
|
|
|
sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
|
|
|
|
|
echo ' ; else return' >> e${EMULATION_NAME}.c
|
|
|
|
|
sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
|
|
|
|
|
echo '; }' >> e${EMULATION_NAME}.c
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
# Scripts read from the filesystem.
|
|
|
|
|
|
|
|
|
|
fragment <<EOF
|
|
|
|
|
{
|
|
|
|
|
*isfile = 1;
|
|
|
|
|
|
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
|
|
|
|
if (bfd_link_relocatable (&link_info) && config.build_constructors)
|
2015-05-05 14:38:00 +02:00
|
|
|
|
return "ldscripts/${EMULATION_NAME}.xu";
|
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
|
|
|
|
else if (bfd_link_relocatable (&link_info))
|
2015-05-05 14:38:00 +02:00
|
|
|
|
return "ldscripts/${EMULATION_NAME}.xr";
|
|
|
|
|
else if (!config.text_read_only)
|
|
|
|
|
return "ldscripts/${EMULATION_NAME}.xbn";
|
|
|
|
|
else if (!config.magic_demand_paged)
|
|
|
|
|
return "ldscripts/${EMULATION_NAME}.xn";
|
|
|
|
|
else
|
|
|
|
|
return "ldscripts/${EMULATION_NAME}.x";
|
|
|
|
|
}
|
|
|
|
|
EOF
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
|
|
|
|
|
fragment <<EOF
|
|
|
|
|
|
2017-08-29 18:18:43 +02:00
|
|
|
|
static unsigned int
|
|
|
|
|
data_statement_size (lang_data_statement_type *d)
|
|
|
|
|
{
|
|
|
|
|
unsigned int size = 0;
|
|
|
|
|
switch (d->type)
|
|
|
|
|
{
|
|
|
|
|
case QUAD:
|
|
|
|
|
case SQUAD:
|
|
|
|
|
size = QUAD_SIZE;
|
|
|
|
|
break;
|
|
|
|
|
case LONG:
|
|
|
|
|
size = LONG_SIZE;
|
|
|
|
|
break;
|
|
|
|
|
case SHORT:
|
|
|
|
|
size = SHORT_SIZE;
|
|
|
|
|
break;
|
|
|
|
|
case BYTE:
|
|
|
|
|
size = BYTE_SIZE;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
2017-10-11 06:18:45 +02:00
|
|
|
|
einfo (_("%P: error: unhandled data_statement size\n"));
|
2017-08-29 18:18:43 +02:00
|
|
|
|
FAIL ();
|
|
|
|
|
}
|
|
|
|
|
return size;
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-05 14:38:00 +02:00
|
|
|
|
/* Helper function for place_orphan that computes the size
|
|
|
|
|
of sections already mapped to the given statement. */
|
|
|
|
|
|
|
|
|
|
static bfd_size_type
|
|
|
|
|
scan_children (lang_statement_union_type * l)
|
|
|
|
|
{
|
|
|
|
|
bfd_size_type amount = 0;
|
|
|
|
|
|
|
|
|
|
while (l != NULL)
|
|
|
|
|
{
|
|
|
|
|
switch (l->header.type)
|
|
|
|
|
{
|
|
|
|
|
case lang_input_section_enum:
|
|
|
|
|
if (l->input_section.section->flags & SEC_ALLOC)
|
|
|
|
|
amount += l->input_section.section->size;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case lang_constructors_statement_enum:
|
|
|
|
|
case lang_assignment_statement_enum:
|
2017-08-29 18:18:43 +02:00
|
|
|
|
case lang_padding_statement_enum:
|
2015-05-05 14:38:00 +02:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case lang_wild_statement_enum:
|
2017-10-12 12:58:30 +02:00
|
|
|
|
amount += scan_children (l->wild_statement.children.head);
|
2015-05-05 14:38:00 +02:00
|
|
|
|
break;
|
|
|
|
|
|
2017-08-29 18:18:43 +02:00
|
|
|
|
case lang_data_statement_enum:
|
|
|
|
|
amount += data_statement_size (&l->data_statement);
|
|
|
|
|
break;
|
|
|
|
|
|
2015-05-05 14:38:00 +02:00
|
|
|
|
default:
|
|
|
|
|
fprintf (stderr, "msp430 orphan placer: unhandled lang type %d\n", l->header.type);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
l = l->header.next;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return amount;
|
|
|
|
|
}
|
2017-10-12 12:58:30 +02:00
|
|
|
|
|
2015-05-05 14:38:00 +02:00
|
|
|
|
/* Place an orphan section. We use this to put .either sections
|
|
|
|
|
into either their lower or their upper equivalents. */
|
|
|
|
|
|
|
|
|
|
static lang_output_section_statement_type *
|
|
|
|
|
gld${EMULATION_NAME}_place_orphan (asection * s,
|
|
|
|
|
const char * secname,
|
|
|
|
|
int constraint)
|
|
|
|
|
{
|
|
|
|
|
char * lower_name;
|
|
|
|
|
char * upper_name;
|
|
|
|
|
char * name;
|
2016-03-21 17:31:46 +01:00
|
|
|
|
char * buf = NULL;
|
2015-05-05 14:38:00 +02:00
|
|
|
|
lang_output_section_statement_type * lower;
|
|
|
|
|
lang_output_section_statement_type * upper;
|
|
|
|
|
|
|
|
|
|
if ((s->flags & SEC_ALLOC) == 0)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
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
|
|
|
|
if (bfd_link_relocatable (&link_info))
|
2015-05-05 14:38:00 +02:00
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
/* If constraints are involved let the linker handle the placement normally. */
|
|
|
|
|
if (constraint != 0)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
/* We only need special handling for .either sections. */
|
|
|
|
|
if (strncmp (secname, ".either.", 8) != 0)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
/* Skip the .either prefix. */
|
|
|
|
|
secname += 7;
|
|
|
|
|
|
|
|
|
|
/* Compute the names of the corresponding upper and lower
|
|
|
|
|
sections. If the input section name contains another period,
|
|
|
|
|
only use the part of the name before the second dot. */
|
|
|
|
|
if (strchr (secname + 1, '.') != NULL)
|
|
|
|
|
{
|
2016-03-21 17:31:46 +01:00
|
|
|
|
buf = name = xstrdup (secname);
|
2015-05-05 14:38:00 +02:00
|
|
|
|
|
|
|
|
|
* strchr (name + 1, '.') = 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
name = (char *) secname;
|
2017-10-12 12:58:30 +02:00
|
|
|
|
|
2016-03-21 17:31:46 +01:00
|
|
|
|
lower_name = concat (".lower", name, NULL);
|
|
|
|
|
upper_name = concat (".upper", name, NULL);
|
2015-05-05 14:38:00 +02:00
|
|
|
|
|
|
|
|
|
/* Find the corresponding lower and upper sections. */
|
|
|
|
|
lower = lang_output_section_find (lower_name);
|
|
|
|
|
upper = lang_output_section_find (upper_name);
|
|
|
|
|
|
2017-08-29 18:18:43 +02:00
|
|
|
|
if (lower == NULL && upper == NULL)
|
|
|
|
|
{
|
2017-10-11 06:18:45 +02:00
|
|
|
|
einfo (_("%P: error: no section named %s or %s in linker script\n"),
|
2017-08-29 18:18:43 +02:00
|
|
|
|
lower_name, upper_name);
|
|
|
|
|
goto end;
|
|
|
|
|
}
|
|
|
|
|
else if (lower == NULL)
|
2015-05-05 14:38:00 +02:00
|
|
|
|
{
|
2017-08-29 18:18:43 +02:00
|
|
|
|
lower = lang_output_section_find (name);
|
|
|
|
|
if (lower == NULL)
|
|
|
|
|
{
|
2017-10-11 06:18:45 +02:00
|
|
|
|
einfo (_("%P: error: no section named %s in linker script\n"), name);
|
2016-03-21 17:31:46 +01:00
|
|
|
|
goto end;
|
2015-05-05 14:38:00 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
2017-08-29 18:18:43 +02:00
|
|
|
|
|
|
|
|
|
/* Always place orphaned sections in lower. Optimal placement of either
|
|
|
|
|
sections is performed later, once section sizes have been finalized. */
|
|
|
|
|
lang_add_section (& lower->children, s, NULL, lower);
|
|
|
|
|
end:
|
|
|
|
|
free (upper_name);
|
|
|
|
|
free (lower_name);
|
|
|
|
|
if (buf)
|
|
|
|
|
free (buf);
|
|
|
|
|
return lower;
|
|
|
|
|
}
|
|
|
|
|
EOF
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
fragment <<EOF
|
|
|
|
|
|
|
|
|
|
static bfd_boolean
|
|
|
|
|
change_output_section (lang_statement_union_type ** head,
|
|
|
|
|
asection *s,
|
|
|
|
|
lang_output_section_statement_type * new_output_section)
|
|
|
|
|
{
|
|
|
|
|
asection *is;
|
|
|
|
|
lang_statement_union_type * prev = NULL;
|
|
|
|
|
lang_statement_union_type * curr;
|
|
|
|
|
|
|
|
|
|
curr = *head;
|
|
|
|
|
while (curr != NULL)
|
|
|
|
|
{
|
|
|
|
|
switch (curr->header.type)
|
|
|
|
|
{
|
|
|
|
|
case lang_input_section_enum:
|
|
|
|
|
is = curr->input_section.section;
|
|
|
|
|
if (is == s)
|
|
|
|
|
{
|
|
|
|
|
s->output_section = NULL;
|
|
|
|
|
lang_add_section (& (new_output_section->children), s, NULL,
|
|
|
|
|
new_output_section);
|
|
|
|
|
/* Remove the section from the old output section. */
|
|
|
|
|
if (prev == NULL)
|
|
|
|
|
*head = curr->header.next;
|
|
|
|
|
else
|
|
|
|
|
prev->header.next = curr->header.next;
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case lang_wild_statement_enum:
|
|
|
|
|
if (change_output_section (&(curr->wild_statement.children.head),
|
|
|
|
|
s, new_output_section))
|
|
|
|
|
return TRUE;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
prev = curr;
|
|
|
|
|
curr = curr->header.next;
|
|
|
|
|
}
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
move_prefixed_section (asection *s, char *new_name,
|
|
|
|
|
lang_output_section_statement_type * new_output_sec)
|
|
|
|
|
{
|
|
|
|
|
s->name = new_name;
|
|
|
|
|
if (s->output_section == NULL)
|
|
|
|
|
lang_add_section (& (new_output_sec->children), s, NULL, new_output_sec);
|
2015-05-05 14:38:00 +02:00
|
|
|
|
else
|
|
|
|
|
{
|
2017-08-29 18:18:43 +02:00
|
|
|
|
lang_output_section_statement_type * curr_output_sec
|
|
|
|
|
= lang_output_section_find (s->output_section->name);
|
|
|
|
|
change_output_section (&(curr_output_sec->children.head), s,
|
|
|
|
|
new_output_sec);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
add_region_prefix (bfd *abfd, asection *s,
|
|
|
|
|
ATTRIBUTE_UNUSED void *unused)
|
|
|
|
|
{
|
|
|
|
|
const char *curr_name = bfd_get_section_name (abfd, s);
|
|
|
|
|
char * base_name;
|
|
|
|
|
char * new_input_sec_name = NULL;
|
|
|
|
|
char * new_output_sec_name = NULL;
|
|
|
|
|
int region = REGION_NONE;
|
|
|
|
|
|
|
|
|
|
if (strncmp (curr_name, ".text", 5) == 0)
|
|
|
|
|
{
|
|
|
|
|
region = code_region;
|
|
|
|
|
base_name = concat (".text", NULL);
|
|
|
|
|
}
|
|
|
|
|
else if (strncmp (curr_name, ".data", 5) == 0)
|
|
|
|
|
{
|
|
|
|
|
region = data_region;
|
|
|
|
|
base_name = concat (".data", NULL);
|
|
|
|
|
}
|
|
|
|
|
else if (strncmp (curr_name, ".bss", 4) == 0)
|
|
|
|
|
{
|
|
|
|
|
region = data_region;
|
|
|
|
|
base_name = concat (".bss", NULL);
|
|
|
|
|
}
|
|
|
|
|
else if (strncmp (curr_name, ".rodata", 7) == 0)
|
|
|
|
|
{
|
|
|
|
|
region = data_region;
|
|
|
|
|
base_name = concat (".rodata", NULL);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
switch (region)
|
|
|
|
|
{
|
|
|
|
|
case REGION_NONE:
|
|
|
|
|
break;
|
|
|
|
|
case REGION_UPPER:
|
|
|
|
|
new_input_sec_name = concat (".upper", curr_name, NULL);
|
|
|
|
|
new_output_sec_name = concat (".upper", base_name, NULL);
|
|
|
|
|
lang_output_section_statement_type * upper
|
|
|
|
|
= lang_output_section_find (new_output_sec_name);
|
|
|
|
|
if (upper != NULL)
|
|
|
|
|
{
|
|
|
|
|
move_prefixed_section (s, new_input_sec_name, upper);
|
|
|
|
|
}
|
|
|
|
|
else
|
2017-10-11 06:18:45 +02:00
|
|
|
|
einfo (_("%P: error: no section named %s in linker script\n"),
|
2017-08-29 18:18:43 +02:00
|
|
|
|
new_output_sec_name);
|
|
|
|
|
break;
|
|
|
|
|
case REGION_LOWER:
|
|
|
|
|
new_input_sec_name = concat (".lower", curr_name, NULL);
|
|
|
|
|
new_output_sec_name = concat (".lower", base_name, NULL);
|
|
|
|
|
lang_output_section_statement_type * lower
|
|
|
|
|
= lang_output_section_find (new_output_sec_name);
|
|
|
|
|
if (lower != NULL)
|
|
|
|
|
{
|
|
|
|
|
move_prefixed_section (s, new_input_sec_name, lower);
|
|
|
|
|
}
|
|
|
|
|
else
|
2017-10-11 06:18:45 +02:00
|
|
|
|
einfo (_("%P: error: no section named %s in linker script\n"),
|
2017-08-29 18:18:43 +02:00
|
|
|
|
new_output_sec_name);
|
|
|
|
|
break;
|
|
|
|
|
case REGION_EITHER:
|
|
|
|
|
s->name = concat (".either", curr_name, NULL);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
/* Unreachable. */
|
|
|
|
|
FAIL ();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
free (base_name);
|
|
|
|
|
if (new_input_sec_name)
|
|
|
|
|
{
|
|
|
|
|
free (new_input_sec_name);
|
|
|
|
|
free (new_output_sec_name);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
msp430_elf_after_open (void)
|
|
|
|
|
{
|
|
|
|
|
bfd *abfd;
|
|
|
|
|
|
|
|
|
|
gld${EMULATION_NAME}_after_open ();
|
2015-05-05 14:38:00 +02:00
|
|
|
|
|
2017-08-29 18:18:43 +02:00
|
|
|
|
/* If neither --code-region or --data-region have been passed, do not
|
|
|
|
|
transform sections names. */
|
|
|
|
|
if ((code_region == REGION_NONE && data_region == REGION_NONE)
|
|
|
|
|
|| disable_sec_transformation)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
for (abfd = link_info.input_bfds; abfd != NULL; abfd = abfd->link.next)
|
|
|
|
|
bfd_map_over_sections (abfd, add_region_prefix, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define OPTION_CODE_REGION 321
|
|
|
|
|
#define OPTION_DATA_REGION (OPTION_CODE_REGION + 1)
|
|
|
|
|
#define OPTION_DISABLE_TRANS (OPTION_CODE_REGION + 2)
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gld${EMULATION_NAME}_add_options
|
|
|
|
|
(int ns, char **shortopts, int nl, struct option **longopts,
|
|
|
|
|
int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
|
|
|
|
|
{
|
|
|
|
|
static const char xtra_short[] = { };
|
2015-05-05 14:38:00 +02:00
|
|
|
|
|
2017-08-29 18:18:43 +02:00
|
|
|
|
static const struct option xtra_long[] =
|
|
|
|
|
{
|
|
|
|
|
{ "code-region", required_argument, NULL, OPTION_CODE_REGION },
|
|
|
|
|
{ "data-region", required_argument, NULL, OPTION_DATA_REGION },
|
|
|
|
|
{ "disable-sec-transformation", no_argument, NULL,
|
|
|
|
|
OPTION_DISABLE_TRANS },
|
|
|
|
|
{ NULL, no_argument, NULL, 0 }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
*shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
|
|
|
|
|
memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
|
|
|
|
|
*longopts = (struct option *)
|
|
|
|
|
xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
|
|
|
|
|
memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
|
|
|
|
|
}
|
2015-05-05 14:38:00 +02:00
|
|
|
|
|
2017-08-29 18:18:43 +02:00
|
|
|
|
static void
|
|
|
|
|
gld${EMULATION_NAME}_list_options (FILE * file)
|
|
|
|
|
{
|
|
|
|
|
fprintf (file, _("\
|
|
|
|
|
--code-region={either,lower,upper,none}\n\
|
|
|
|
|
\tTransform .text* sections to {either,lower,upper,none}.text* sections.\n\
|
|
|
|
|
--data-region={either,lower,upper,none}\n\
|
|
|
|
|
\tTransform .data*, .rodata* and .bss* sections to\n\
|
|
|
|
|
{either,lower,upper,none}.{bss,data,rodata}* sections\n\
|
|
|
|
|
--disable-sec-transformation\n\
|
|
|
|
|
\tDisable transformation of .{text,data,bss,rodata}* sections to\n\
|
|
|
|
|
\tadd the {either,lower,upper,none} prefixes\n"));
|
|
|
|
|
}
|
2015-05-05 14:38:00 +02:00
|
|
|
|
|
2017-08-29 18:18:43 +02:00
|
|
|
|
static bfd_boolean
|
|
|
|
|
gld${EMULATION_NAME}_handle_option (int optc)
|
|
|
|
|
{
|
|
|
|
|
switch (optc)
|
|
|
|
|
{
|
|
|
|
|
case OPTION_CODE_REGION:
|
|
|
|
|
if (strcmp (optarg, "upper") == 0)
|
|
|
|
|
code_region = REGION_UPPER;
|
|
|
|
|
else if (strcmp (optarg, "lower") == 0)
|
|
|
|
|
code_region = REGION_LOWER;
|
|
|
|
|
else if (strcmp (optarg, "either") == 0)
|
|
|
|
|
code_region = REGION_EITHER;
|
|
|
|
|
else if (strcmp (optarg, "none") == 0)
|
|
|
|
|
code_region = REGION_NONE;
|
|
|
|
|
else if (strlen (optarg) == 0)
|
|
|
|
|
{
|
|
|
|
|
einfo (_("%P: --code-region requires an argument: \
|
|
|
|
|
{upper,lower,either,none}\n"));
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
2015-05-05 14:38:00 +02:00
|
|
|
|
else
|
2017-08-29 18:18:43 +02:00
|
|
|
|
{
|
|
|
|
|
einfo (_("%P: error: unrecognized argument to --code-region= option: \
|
|
|
|
|
\"%s\"\n"), optarg);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case OPTION_DATA_REGION:
|
|
|
|
|
if (strcmp (optarg, "upper") == 0)
|
|
|
|
|
data_region = REGION_UPPER;
|
|
|
|
|
else if (strcmp (optarg, "lower") == 0)
|
|
|
|
|
data_region = REGION_LOWER;
|
|
|
|
|
else if (strcmp (optarg, "either") == 0)
|
|
|
|
|
data_region = REGION_EITHER;
|
|
|
|
|
else if (strcmp (optarg, "none") == 0)
|
|
|
|
|
data_region = REGION_NONE;
|
|
|
|
|
else if (strlen (optarg) == 0)
|
|
|
|
|
{
|
|
|
|
|
einfo (_("%P: --data-region requires an argument: \
|
|
|
|
|
{upper,lower,either,none}\n"));
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
einfo (_("%P: error: unrecognized argument to --data-region= option: \
|
|
|
|
|
\"%s\"\n"), optarg);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case OPTION_DISABLE_TRANS:
|
|
|
|
|
disable_sec_transformation = TRUE;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
eval_upper_either_sections (bfd *abfd, asection *s, void *data)
|
|
|
|
|
{
|
2017-09-02 03:30:02 +02:00
|
|
|
|
const char * base_sec_name;
|
2017-08-29 18:18:43 +02:00
|
|
|
|
const char * curr_name;
|
|
|
|
|
char * either_name;
|
|
|
|
|
int curr_region;
|
|
|
|
|
|
|
|
|
|
lang_output_section_statement_type * lower;
|
|
|
|
|
lang_output_section_statement_type * upper;
|
|
|
|
|
static bfd_size_type *lower_size = 0;
|
|
|
|
|
static bfd_size_type *upper_size = 0;
|
|
|
|
|
static bfd_size_type lower_size_rom = 0;
|
|
|
|
|
static bfd_size_type lower_size_ram = 0;
|
|
|
|
|
static bfd_size_type upper_size_rom = 0;
|
|
|
|
|
static bfd_size_type upper_size_ram = 0;
|
|
|
|
|
|
|
|
|
|
if ((s->flags & SEC_ALLOC) == 0)
|
|
|
|
|
return;
|
|
|
|
|
if (bfd_link_relocatable (&link_info))
|
|
|
|
|
return;
|
|
|
|
|
|
2017-09-02 03:30:02 +02:00
|
|
|
|
base_sec_name = (const char *) data;
|
2017-08-29 18:18:43 +02:00
|
|
|
|
curr_name = bfd_get_section_name (abfd, s);
|
|
|
|
|
|
|
|
|
|
/* Only concerned with .either input sections in the upper output section. */
|
|
|
|
|
either_name = concat (".either", base_sec_name, NULL);
|
|
|
|
|
if (strncmp (curr_name, either_name, strlen (either_name)) != 0
|
|
|
|
|
|| strncmp (s->output_section->name, ".upper", 6) != 0)
|
|
|
|
|
goto end;
|
|
|
|
|
|
|
|
|
|
lower = lang_output_section_find (concat (".lower", base_sec_name, NULL));
|
|
|
|
|
upper = lang_output_section_find (concat (".upper", base_sec_name, NULL));
|
|
|
|
|
|
|
|
|
|
if (upper == NULL || upper->region == NULL)
|
|
|
|
|
goto end;
|
|
|
|
|
else if (lower == NULL)
|
|
|
|
|
lower = lang_output_section_find (base_sec_name);
|
|
|
|
|
if (lower == NULL || lower->region == NULL)
|
|
|
|
|
goto end;
|
|
|
|
|
|
|
|
|
|
if (strcmp (base_sec_name, ".text") == 0
|
|
|
|
|
|| strcmp (base_sec_name, ".rodata") == 0)
|
|
|
|
|
curr_region = ROM;
|
|
|
|
|
else
|
|
|
|
|
curr_region = RAM;
|
|
|
|
|
|
|
|
|
|
if (curr_region == ROM)
|
|
|
|
|
{
|
|
|
|
|
if (lower_size_rom == 0)
|
|
|
|
|
{
|
|
|
|
|
lower_size_rom = lower->region->current - lower->region->origin;
|
|
|
|
|
upper_size_rom = upper->region->current - upper->region->origin;
|
|
|
|
|
}
|
|
|
|
|
lower_size = &lower_size_rom;
|
|
|
|
|
upper_size = &upper_size_rom;
|
|
|
|
|
}
|
|
|
|
|
else if (curr_region == RAM)
|
|
|
|
|
{
|
|
|
|
|
if (lower_size_ram == 0)
|
|
|
|
|
{
|
|
|
|
|
lower_size_ram = lower->region->current - lower->region->origin;
|
|
|
|
|
upper_size_ram = upper->region->current - upper->region->origin;
|
|
|
|
|
}
|
|
|
|
|
lower_size = &lower_size_ram;
|
|
|
|
|
upper_size = &upper_size_ram;
|
2015-05-05 14:38:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
2017-08-29 18:18:43 +02:00
|
|
|
|
/* Move sections in the upper region that would fit in the lower
|
|
|
|
|
region to the lower region. */
|
|
|
|
|
if (*lower_size + s->size < lower->region->length)
|
|
|
|
|
{
|
|
|
|
|
if (change_output_section (&(upper->children.head), s, lower))
|
|
|
|
|
{
|
|
|
|
|
*upper_size -= s->size;
|
|
|
|
|
*lower_size += s->size;
|
|
|
|
|
}
|
|
|
|
|
}
|
2016-03-21 17:31:46 +01:00
|
|
|
|
end:
|
2017-08-29 18:18:43 +02:00
|
|
|
|
free (either_name);
|
2015-05-05 14:38:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
2017-08-29 18:18:43 +02:00
|
|
|
|
static void
|
|
|
|
|
eval_lower_either_sections (bfd *abfd, asection *s, void *data)
|
|
|
|
|
{
|
2017-09-02 03:30:02 +02:00
|
|
|
|
const char * base_sec_name;
|
2017-08-29 18:18:43 +02:00
|
|
|
|
const char * curr_name;
|
|
|
|
|
char * either_name;
|
|
|
|
|
int curr_region;
|
|
|
|
|
lang_output_section_statement_type * output_sec;
|
|
|
|
|
lang_output_section_statement_type * lower;
|
|
|
|
|
lang_output_section_statement_type * upper;
|
|
|
|
|
|
|
|
|
|
static bfd_size_type *lower_size = 0;
|
|
|
|
|
static bfd_size_type lower_size_rom = 0;
|
|
|
|
|
static bfd_size_type lower_size_ram = 0;
|
|
|
|
|
|
|
|
|
|
if ((s->flags & SEC_ALLOC) == 0)
|
|
|
|
|
return;
|
|
|
|
|
if (bfd_link_relocatable (&link_info))
|
|
|
|
|
return;
|
|
|
|
|
|
2017-09-02 03:30:02 +02:00
|
|
|
|
base_sec_name = (const char *) data;
|
2017-08-29 18:18:43 +02:00
|
|
|
|
curr_name = bfd_get_section_name (abfd, s);
|
|
|
|
|
|
|
|
|
|
/* Only concerned with .either input sections in the lower or "default"
|
|
|
|
|
output section i.e. not in the upper output section. */
|
|
|
|
|
either_name = concat (".either", base_sec_name, NULL);
|
|
|
|
|
if (strncmp (curr_name, either_name, strlen (either_name)) != 0
|
|
|
|
|
|| strncmp (s->output_section->name, ".upper", 6) == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (strcmp (base_sec_name, ".text") == 0
|
|
|
|
|
|| strcmp (base_sec_name, ".rodata") == 0)
|
|
|
|
|
curr_region = ROM;
|
|
|
|
|
else
|
|
|
|
|
curr_region = RAM;
|
|
|
|
|
|
|
|
|
|
output_sec = lang_output_section_find (s->output_section->name);
|
|
|
|
|
|
|
|
|
|
/* If the output_section doesn't exist, this has already been reported in
|
|
|
|
|
place_orphan, so don't need to warn again. */
|
|
|
|
|
if (output_sec == NULL || output_sec->region == NULL)
|
|
|
|
|
goto end;
|
|
|
|
|
|
|
|
|
|
/* lower and output_sec might be the same, but in some cases an .either
|
|
|
|
|
section can end up in base_sec_name if it hasn't been placed by
|
|
|
|
|
place_orphan. */
|
|
|
|
|
lower = lang_output_section_find (concat (".lower", base_sec_name, NULL));
|
|
|
|
|
upper = lang_output_section_find (concat (".upper", base_sec_name, NULL));
|
|
|
|
|
if (upper == NULL)
|
|
|
|
|
goto end;
|
|
|
|
|
|
|
|
|
|
if (curr_region == ROM)
|
|
|
|
|
{
|
|
|
|
|
if (lower_size_rom == 0)
|
|
|
|
|
{
|
|
|
|
|
/* Get the size of other items in the lower region that aren't the
|
|
|
|
|
sections to be moved around. */
|
|
|
|
|
lower_size_rom
|
|
|
|
|
= (output_sec->region->current - output_sec->region->origin)
|
|
|
|
|
- scan_children (output_sec->children.head);
|
|
|
|
|
if (output_sec != lower && lower != NULL)
|
|
|
|
|
lower_size_rom -= scan_children (lower->children.head);
|
|
|
|
|
}
|
|
|
|
|
lower_size = &lower_size_rom;
|
|
|
|
|
}
|
|
|
|
|
else if (curr_region == RAM)
|
|
|
|
|
{
|
|
|
|
|
if (lower_size_ram == 0)
|
|
|
|
|
{
|
|
|
|
|
lower_size_ram
|
|
|
|
|
= (output_sec->region->current - output_sec->region->origin)
|
|
|
|
|
- scan_children (output_sec->children.head);
|
|
|
|
|
if (output_sec != lower && lower != NULL)
|
|
|
|
|
lower_size_ram -= scan_children (lower->children.head);
|
|
|
|
|
}
|
|
|
|
|
lower_size = &lower_size_ram;
|
|
|
|
|
}
|
|
|
|
|
/* Move sections that cause the lower region to overflow to the upper region. */
|
|
|
|
|
if (*lower_size + s->size > output_sec->region->length)
|
|
|
|
|
change_output_section (&(output_sec->children.head), s, upper);
|
|
|
|
|
else
|
|
|
|
|
*lower_size += s->size;
|
|
|
|
|
end:
|
|
|
|
|
free (either_name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* This function is similar to lang_relax_sections, but without the size
|
|
|
|
|
evaluation code that is always executed after relaxation. */
|
|
|
|
|
static void
|
|
|
|
|
intermediate_relax_sections (void)
|
|
|
|
|
{
|
|
|
|
|
int i = link_info.relax_pass;
|
|
|
|
|
|
|
|
|
|
/* The backend can use it to determine the current pass. */
|
|
|
|
|
link_info.relax_pass = 0;
|
|
|
|
|
|
|
|
|
|
while (i--)
|
|
|
|
|
{
|
|
|
|
|
bfd_boolean relax_again;
|
|
|
|
|
|
|
|
|
|
link_info.relax_trip = -1;
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
link_info.relax_trip++;
|
|
|
|
|
|
|
|
|
|
lang_do_assignments (lang_assigning_phase_enum);
|
|
|
|
|
|
|
|
|
|
lang_reset_memory_regions ();
|
|
|
|
|
|
|
|
|
|
relax_again = FALSE;
|
|
|
|
|
lang_size_sections (&relax_again, FALSE);
|
|
|
|
|
}
|
|
|
|
|
while (relax_again);
|
|
|
|
|
|
|
|
|
|
link_info.relax_pass++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
msp430_elf_after_allocation (void)
|
|
|
|
|
{
|
|
|
|
|
int relax_count = 0;
|
2017-09-02 03:30:02 +02:00
|
|
|
|
unsigned int i;
|
2017-08-29 18:18:43 +02:00
|
|
|
|
/* Go over each section twice, once to place either sections that don't fit
|
|
|
|
|
in lower into upper, and then again to move any sections in upper that
|
|
|
|
|
fit in lower into lower. */
|
|
|
|
|
for (i = 0; i < 8; i++)
|
|
|
|
|
{
|
|
|
|
|
int placement_stage = (i < 4) ? LOWER_TO_UPPER : UPPER_TO_LOWER;
|
2017-09-02 03:30:02 +02:00
|
|
|
|
const char * base_sec_name;
|
2017-08-29 18:18:43 +02:00
|
|
|
|
lang_output_section_statement_type * upper;
|
|
|
|
|
|
|
|
|
|
switch (i % 4)
|
|
|
|
|
{
|
2017-09-02 03:30:02 +02:00
|
|
|
|
default:
|
2017-08-29 18:18:43 +02:00
|
|
|
|
case 0:
|
2017-09-02 03:30:02 +02:00
|
|
|
|
base_sec_name = ".text";
|
2017-08-29 18:18:43 +02:00
|
|
|
|
break;
|
|
|
|
|
case 1:
|
2017-09-02 03:30:02 +02:00
|
|
|
|
base_sec_name = ".data";
|
2017-08-29 18:18:43 +02:00
|
|
|
|
break;
|
|
|
|
|
case 2:
|
2017-09-02 03:30:02 +02:00
|
|
|
|
base_sec_name = ".bss";
|
2017-08-29 18:18:43 +02:00
|
|
|
|
break;
|
|
|
|
|
case 3:
|
2017-09-02 03:30:02 +02:00
|
|
|
|
base_sec_name = ".rodata";
|
2017-08-29 18:18:43 +02:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
upper = lang_output_section_find (concat (".upper", base_sec_name, NULL));
|
|
|
|
|
if (upper != NULL)
|
|
|
|
|
{
|
|
|
|
|
/* Can't just use one iteration over the all the sections to make
|
|
|
|
|
both lower->upper and upper->lower transformations because the
|
|
|
|
|
iterator encounters upper sections before all lower sections have
|
|
|
|
|
been examined. */
|
|
|
|
|
bfd *abfd;
|
|
|
|
|
|
|
|
|
|
if (placement_stage == LOWER_TO_UPPER)
|
|
|
|
|
{
|
|
|
|
|
/* Perform relaxation and get the final size of sections
|
|
|
|
|
before trying to fit .either sections in the correct
|
|
|
|
|
ouput sections. */
|
|
|
|
|
if (relax_count == 0)
|
|
|
|
|
{
|
|
|
|
|
intermediate_relax_sections ();
|
|
|
|
|
relax_count++;
|
|
|
|
|
}
|
|
|
|
|
for (abfd = link_info.input_bfds; abfd != NULL;
|
|
|
|
|
abfd = abfd->link.next)
|
|
|
|
|
{
|
|
|
|
|
bfd_map_over_sections (abfd, eval_lower_either_sections,
|
2017-09-02 03:30:02 +02:00
|
|
|
|
(void *) base_sec_name);
|
2017-08-29 18:18:43 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (placement_stage == UPPER_TO_LOWER)
|
|
|
|
|
{
|
|
|
|
|
/* Relax again before moving upper->lower. */
|
|
|
|
|
if (relax_count == 1)
|
|
|
|
|
{
|
|
|
|
|
intermediate_relax_sections ();
|
|
|
|
|
relax_count++;
|
|
|
|
|
}
|
|
|
|
|
for (abfd = link_info.input_bfds; abfd != NULL;
|
|
|
|
|
abfd = abfd->link.next)
|
|
|
|
|
{
|
|
|
|
|
bfd_map_over_sections (abfd, eval_upper_either_sections,
|
2017-09-02 03:30:02 +02:00
|
|
|
|
(void *) base_sec_name);
|
2017-08-29 18:18:43 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
gld${EMULATION_NAME}_after_allocation ();
|
|
|
|
|
}
|
2015-05-05 14:38:00 +02:00
|
|
|
|
|
|
|
|
|
struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
|
|
|
|
|
{
|
|
|
|
|
${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
|
|
|
|
|
${LDEMUL_SYSLIB-syslib_default},
|
|
|
|
|
${LDEMUL_HLL-hll_default},
|
|
|
|
|
${LDEMUL_AFTER_PARSE-after_parse_default},
|
2017-08-29 18:18:43 +02:00
|
|
|
|
msp430_elf_after_open,
|
ELF: Call check_relocs after opening all inputs
For all ELF targers, call check_relocs after opening all inputs and
garbage collection. Since the symbol resolution is known, check_relocs
can be simplified. Also garbage collection doesn't need to undo what
check_relocs has done for symbols which have been garbage collected.
Since ELF targets never see the removed sections, gc_sweep_hook can be
removed from elf_backend_data and we can avoid GOT/PLT with garbage
collection now.
Set link_info.check_relocs_after_open_input to TRUE for all linker
targets which use ELF linker and update garbage collection tests to
remove unused GOT section.
ldemul_after_check_relocs is added for powerpc to support --secure-plt,
--bss-plt and --sdata-got.
Tested natively without regressions on i686, x86-64 and x32. Tested
cross binutils on x86-64 without regressions for aarch64-linux,
alpha-linux, arm-linux, bfin-elf, cr16-elf, cris-elf, crx-elf, frv-linux,
hppa64-linux, hppa-linux, ia64-linux, lm32-elf, m32r-elf, m68k-linux,
mcore-elf, metag-elf, microblaze-linux, mips-linux, mmix, mn10300-elf,
nds32le-linux, nios2-linux, or1k-elf, powerpc64-linux, powerpc-linux,
riscv32-linux, riscv64-linux, s390-linux, s390x-linux, score-elf,
sh3-linux, sparc64-linux, sparc-linux, tic6x-elf, tilegx-linux,
tilepro-linux, vax-linux, x86_64-mingw32 and xtensa-linux.
bfd/
* elf-bfd.h (elf_backend_data): Remove gc_sweep_hook.
* elf32-arm.c (elf32_arm_gc_sweep_hook): Removed.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-bfin.c (bfin_gc_sweep_hook): Likewise.
(bfinfdpic_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-cr16.c (elf32_cr16_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-cris.c (cris_elf_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-hppa.c (elf32_hppa_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-lm32.c (lm32_elf_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-m32r.c (m32r_elf_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-m68k.c (elf_m68k_got_entry): Remove elf_m68k_gc_sweep_hook
from comments.
(elf_m68k_remove_got_entry_type): Removed.
(elf_m68k_find_got_entry_ptr): Likewise.
(elf_m68k_remove_got_entry): Likewise.
(elf_m68k_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-mcore.c (mcore_elf_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-metag.c (elf_metag_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-microblaze.c (elf_backend_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-mips.c (elf_backend_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-nds32.c (nds32_elf_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-nios2.c (nios2_elf32_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-or1k.c (or1k_elf_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-ppc.c (ppc_elf_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-s390.c (elf_s390_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-sparc.c (elf_backend_gc_sweep_hook): Likewise.
* elf32-tic6x.c (elf32_tic6x_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-tilegx.c (elf_backend_gc_sweep_hook): Likewise.
* elf32-tilepro.c (tilepro_elf_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-vax.c (elf_vax_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf32-xtensa.c (elf_xtensa_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf64-alpha.c (elf64_alpha_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf64-mips.c (elf_backend_gc_sweep_hook): Likewise.
* elf64-mmix.c (mmix_elf_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf64-ppc.c (elf_backend_gc_sweep_hook): Likewise.
(ppc64_elf_gc_sweep_hook): Likewise.
* elf64-s390.c (elf_s390_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elf64-sparc.c (elf_backend_gc_sweep_hook): Likewise.
* elf64-tilegx.c (elf_backend_gc_sweep_hook): Likewise.
* elflink.c (elf_link_add_object_symbols): Don't call
_bfd_elf_link_check_relocs here.
(gc_sweep_hook_fn): Removed.
(elf_gc_sweep): Remove gc_sweep_hook.
* elfnn-aarch64.c (elfNN_aarch64_gc_sweep_hook): Removed.
(elf_backend_gc_sweep_hook): Likewise.
* elfnn-riscv.c (riscv_elf_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elfxx-mips.c (_bfd_mips_elf_gc_sweep_hook): Likewise.
* elfxx-mips.h (_bfd_mips_elf_gc_sweep_hook): Likewise.
(elf_backend_gc_sweep_hook): Likewise.
* elfxx-sparc.c (_bfd_sparc_elf_gc_sweep_hook): Likewise.
* elfxx-sparc.h (_bfd_sparc_elf_gc_sweep_hook): Likewise.
* elfxx-target.h (elf_backend_gc_sweep_hook): Likewise.
(elfNN_bed): Remove elf_backend_gc_sweep_hook.
* elfxx-tilegx.c (tilegx_elf_gc_sweep_hook): Removed.
* elfxx-tilegx.h (tilegx_elf_gc_sweep_hook): Likewise.
ld/
* emulparams/elf32_x86_64.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Removed.
* emulparams/elf_i386_be.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emulparams/elf_i386_chaos.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emulparams/elf_i386_ldso.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emulparams/elf_i386_vxworks.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emulparams/elf_iamcu.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emulparams/elf_k1om.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emulparams/elf_l1om.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emulparams/elf_x86_64.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emulparams/i386lynx.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emulparams/i386moss.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emulparams/i386nto.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emulparams/i386nw.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emulparams/shelf.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emulparams/shelf32.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emulparams/shelf_nto.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emulparams/shelf_vxworks.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emulparams/shlelf32_linux.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emulparams/shlelf_linux.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emulparams/shlelf_nto.sh (CHECK_RELOCS_AFTER_OPEN_INPUT):
Likewise.
* emultempl/aarch64elf.em (gld${EMULATION_NAME}_before_parse):
Set link_info.check_relocs_after_open_input to TRUE.
* emultempl/armelf.em (gld${EMULATION_NAME}_before_parse):
Likewise.
* emultempl/scoreelf.em (gld${EMULATION_NAME}_before_parse):
Likewise.
* emultempl/aix.em (ld_${EMULATION_NAME}_emulation): Add
after_parse_default.
* emultempl/armcoff.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/beos.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/generic.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/gld960.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/gld960c.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/lnk960.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/m68kcoff.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/msp430.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/pe.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/pep.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/sunos.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/ticoff.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/vanilla.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/elf32.em (gld${EMULATION_NAME}_before_parse): Always
set link_info.check_relocs_after_open_input to TRUE.
(ld_${EMULATION_NAME}_emulation): Add $LDEMUL_AFTER_CHECK_RELOCS.
* emultempl/linux.em (gld${EMULATION_NAME}_before_parse):
Set link_info.check_relocs_after_open_input to TRUE.
(ld_${EMULATION_NAME}_emulation): Add after_check_relocs_default.
* emultempl/mmix-elfnmmo.em (mmix_before_parse): New function.
(LDEMUL_BEFORE_PARSE): New.
* emultempl/mmixelf.em (elfmmix_before_parse): Replace
gld${EMULATION_NAME}_before_parse with mmix_before_parse.
* emultempl/ppc32elf.em (ppc_after_open): Renamed to ...
(ppc_after_check_relocs): This. Call after_check_relocs_default
instead of gld${EMULATION_NAME}_after_open.
(LDEMUL_AFTER_OPEN): Removed.
(LDEMUL_AFTER_CHECK_RELOCS): New.
* ldemul.c (ldemul_after_check_relocs): New.
(after_check_relocs_default): Likewise.
* ldemul.h (ldemul_after_check_relocs): Likewise.
(after_check_relocs_default): Likewise.
(ld_emulation_xfer_struct): Add after_check_relocs.
* ldlang.c (lang_process): Call ldemul_after_check_relocs after
lang_check_relocs.
* testsuite/ld-aarch64/gc-got-relocs.d: Don't expect GOT section.
* testsuite/ld-aarch64/gc-tls-relocs.d: Likewise.
* testsuite/ld-cris/tls-gc-68.d: Likewise.
* testsuite/ld-cris/tls-gc-69.d: Likewise.
* testsuite/ld-cris/tls-gc-70.d: Likewise.
* testsuite/ld-cris/tls-gc-75.d: Likewise.
* testsuite/ld-cris/tls-gc-79.d: Likewise.
* testsuite/ld-mmix/bpo-10.d: Don't expect .MMIX.reg_contents
section.
2017-10-16 12:49:54 +02:00
|
|
|
|
after_check_relocs_default,
|
2017-08-29 18:18:43 +02:00
|
|
|
|
msp430_elf_after_allocation,
|
2015-05-05 14:38:00 +02:00
|
|
|
|
${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
|
|
|
|
|
${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
|
|
|
|
|
${LDEMUL_BEFORE_ALLOCATION-before_allocation_default},
|
|
|
|
|
${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
|
|
|
|
|
"${EMULATION_NAME}",
|
|
|
|
|
"${OUTPUT_FORMAT}",
|
|
|
|
|
${LDEMUL_FINISH-finish_default},
|
|
|
|
|
${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
|
|
|
|
|
${LDEMUL_OPEN_DYNAMIC_ARCHIVE-NULL},
|
|
|
|
|
${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
|
|
|
|
|
${LDEMUL_SET_SYMBOLS-NULL},
|
|
|
|
|
${LDEMUL_PARSE_ARGS-NULL},
|
2017-08-29 18:18:43 +02:00
|
|
|
|
gld${EMULATION_NAME}_add_options,
|
|
|
|
|
gld${EMULATION_NAME}_handle_option,
|
2015-05-05 14:38:00 +02:00
|
|
|
|
${LDEMUL_UNRECOGNIZED_FILE-NULL},
|
2017-08-29 18:18:43 +02:00
|
|
|
|
gld${EMULATION_NAME}_list_options,
|
2015-05-05 14:38:00 +02:00
|
|
|
|
${LDEMUL_RECOGNIZED_FILE-NULL},
|
|
|
|
|
${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
|
|
|
|
|
${LDEMUL_NEW_VERS_PATTERN-NULL},
|
|
|
|
|
${LDEMUL_EXTRA_MAP_FILE_TEXT-NULL}
|
|
|
|
|
};
|
|
|
|
|
EOF
|
|
|
|
|
#
|
|
|
|
|
# Local Variables:
|
|
|
|
|
# mode: c
|
|
|
|
|
# End:
|