2000-07-22 07:31:53 +08:00
|
|
|
# This shell script emits a C file. -*- C -*-
|
|
|
|
# It does some substitutions.
|
2007-07-20 03:56:10 +08:00
|
|
|
fragment <<EOF
|
2000-07-22 07:31:53 +08:00
|
|
|
/* This file is is generated by a shell script. DO NOT EDIT! */
|
|
|
|
|
|
|
|
/* Handle embedded relocs for m68k.
|
2014-03-05 19:46:15 +08:00
|
|
|
Copyright (C) 2000-2014 Free Software Foundation, Inc.
|
2000-07-22 07:31:53 +08:00
|
|
|
Written by Michael Sokolov <msokolov@ivan.Harhan.ORG>, based on generic.em
|
|
|
|
by Steve Chamberlain <steve@cygnus.com>, embedded relocs code based on
|
* configure.ac (mips*-*-bsd*, mips*-*-ultrix*, mips*-*-osf*)
(mips*-*-ecoff*, mips*-*-pe*, mips*-*-irix* [v4 and earlier])
(mips*-*-lnews*, mips*-*-riscos*): Add gas and ld to noconfigdirs.
* configure: Regenerate.
gas/
* NEWS: Note removal of ECOFF support.
* doc/as.texinfo (--emulation): Update for the removal of MIPS ECOFF.
* Makefile.am (TARG_ENV_HFILES): Remove config/te-lnews.h.
(MULTI_CFILES): Remove config/e-mipsecoff.c.
* Makefile.in: Regenerate.
* configure.in: Remove MIPS ECOFF references.
(mips-sony-bsd*, mips-*-bsd*, mips-*-lnews*-ecoff, mips-*-*-ecoff):
Delete cases.
(mips-*-irix5*-*, mips*-*-linux*-*, mips*-*-freebsd*)
(mips*-*-kfreebsd*-gnu, mips-*-*-elf): Fold into...
(mips-*-*): ...this single case.
(mipsbecoff, mipslecoff, mipsecoff): Remove emulations. Expect
MIPS emulations to be e-mipself*.
* configure: Regenerate.
* configure.tgt (mips-sony-bsd*, mips-*-ultrix*, mips-*-osf*)
(mips-*-ecoff*, mips-*-pe*, mips-*-irix*, ips-*-lnews*, mips-*-riscos*)
(mips-*-sysv*): Remove coff and ecoff cases.
* as.c (mipsbecoff, mipslecoff, mipsecoff): Remove.
* ecoff.c: Remove reference to MIPS ECOFF.
* config/e-mipsecoff.c, config/te-lnews.h: Delete files.
* config/tc-mips.c (ECOFF_LITTLE_FORMAT): Delete.
(RDATA_SECTION_NAME, mips_target_form): Remove COFF and ECOFF cases.
(mips_hi_fixup): Tweak comment.
(append_insn): Require a howto.
(mips_after_parse_args): Remove OBJ_MAYBE_ECOFF code.
gas/testsuite/
* gas/all/gas.exp: Remove reference to mips-ecoff.
* gas/mips/branch-misc-1.d, gas/mips/branch-misc-2.d,
gas/mips/branch-misc-2-64.d, gas/mips/branch-misc-2pic.d,
gas/mips/branch-misc-2pic-64.d, gas/mips/branch-swap.d: Remove
skips for mips-*-ecoff.
ld/
* NEWS: Document the removal of MIPS ECOFF targets.
* ld.texinfo (--gpsize=@var{value}): Use MIPS ELF rather than
MIPS ECOFF as an example of a target that supports small data.
* ldmain.c (g_switch_value): Likewise.
* configure.tgt (mips*-*-pe, mips*-dec-ultrix*, mips*-dec-osf*)
(mips*-sgi-irix* [v4 and earlier], mips*el-*-ecoff*, mips*-*-ecoff*)
(mips*-*-bsd*, mips*-*-lnews*): Remove cases.
* Makefile.am (ALL_EMULATION_SOURCES): Remove emipsbig.c, emipsbsd.c,
emipsidt.c, emipsidtl.c, emipslit.c, emipslnews.c and emipspe.c.
(emipsbig.c, emipsbsd.c, emipsidt.c, emipsidtl.c, emipslit.c)
(emipslnews.c, emipspe.c): Delete rules.
* Makefile.in: Regenerate.
* emulparams/mipsbig.sh, emulparams/mipsbsd.sh, emulparams/mipsidt.sh,
emulparams/mipsidtl.sh, emulparams/mipslit.sh, emulparams/mipslnews.sh,
emulparams/mipspe.sh, emultempl/mipsecoff.em: Delete.
* emultempl/m68kcoff.em: Update comment to say that MIPS ECOFF support
has now been removed.
* emultempl/pe.em: Remove TARGET_IS_mipspe checks.
2013-06-23 00:44:16 +08:00
|
|
|
mipsecoff.em by Ian Lance Taylor <ian@cygnus.com> (now removed).
|
2000-07-22 07:31:53 +08:00
|
|
|
|
2007-07-06 22:09:45 +08: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. */
|
2000-07-22 07:31:53 +08:00
|
|
|
|
|
|
|
#define TARGET_IS_${EMULATION_NAME}
|
|
|
|
|
|
|
|
#include "sysdep.h"
|
2007-04-26 22:47:00 +08:00
|
|
|
#include "bfd.h"
|
2000-07-22 07:31:53 +08:00
|
|
|
#include "bfdlink.h"
|
|
|
|
|
|
|
|
#include "ld.h"
|
|
|
|
#include "ldmain.h"
|
2005-04-07 22:07:33 +08:00
|
|
|
#include "ldexp.h"
|
|
|
|
#include "ldlang.h"
|
2000-07-22 07:31:53 +08:00
|
|
|
#include "ldfile.h"
|
2000-07-28 09:33:14 +08:00
|
|
|
#include "ldemul.h"
|
2000-07-22 07:31:53 +08:00
|
|
|
#include "ldmisc.h"
|
|
|
|
|
2003-06-27 08:38:25 +08:00
|
|
|
static void check_sections (bfd *, asection *, void *);
|
2000-07-22 07:31:53 +08:00
|
|
|
|
|
|
|
static void
|
2003-06-27 08:38:25 +08:00
|
|
|
gld${EMULATION_NAME}_before_parse (void)
|
2000-07-22 07:31:53 +08:00
|
|
|
{
|
|
|
|
#ifndef TARGET_ /* I.e., if not generic. */
|
2004-01-03 19:09:07 +08:00
|
|
|
ldfile_set_output_arch ("`echo ${ARCH}`", bfd_arch_unknown);
|
2000-07-22 07:31:53 +08:00
|
|
|
#endif /* not TARGET_ */
|
|
|
|
}
|
|
|
|
|
|
|
|
/* This function is run after all the input files have been opened.
|
|
|
|
We create a .emreloc section for each input file with a non zero
|
|
|
|
.data section. The BFD backend will fill in these sections with
|
|
|
|
magic numbers which can be used to relocate the data section at run
|
|
|
|
time. */
|
|
|
|
|
|
|
|
static void
|
2003-06-27 08:38:25 +08:00
|
|
|
gld${EMULATION_NAME}_after_open (void)
|
2000-07-22 07:31:53 +08:00
|
|
|
{
|
|
|
|
bfd *abfd;
|
|
|
|
|
* ld.texinfo (Expression Section): Describe treatment of numbers
and absolute symbols.
* ldemul.c (after_open_default): Look up __ld_compatibility.
* ldexp.c (fold_name): Convert absolute symbols to numbers when
inside output section definitions, or when __ld_compatibility >= 221.
(exp_fold_tree_1): Convert numbers to absolute when not in output
section definition and __ld_compatibility < 221. Don't always
convert values outside an output section definition to absolute.
* ldexp.h (uses_defined): Comment.
* ldlang.c (ld_compatibility): New variable.
* ldlang.h (ld_compatibility): Declare.
* emultempl/aix.em, * emultempl/armcoff.em, * emultempl/beos.em,
* emultempl/elf32.em, * emultempl/genelf.em, * emultempl/lnk960.em,
* emultempl/m68kcoff.em, * emultempl/mmo.em, * emultempl/pe.em,
* emultempl/pep.em, * emultempl/sunos.em, * emultempl/z80.em: Call
after_open_default from after_open function.
2010-12-20 21:00:14 +08:00
|
|
|
after_open_default ();
|
|
|
|
|
2000-07-22 07:31:53 +08:00
|
|
|
if (! command_line.embedded_relocs
|
2003-06-25 14:40:27 +08:00
|
|
|
|| link_info.relocatable)
|
2000-07-22 07:31:53 +08:00
|
|
|
return;
|
|
|
|
|
Make bfd.link_next field a union
This field of struct bfd is currently only used to chain together
linker input files. This patch prepares to use the field to stash
the linker hash table, which is always created on the linker output
file.
bfd/
* bfd.c (struct bfd): Replace link_next with a union.
* aoutx.h, * bfd.c, * coff-ppc.c, * coff-rs6000.c, * cofflink.c,
* ecoff.c, * elf-m10300.c, * elf32-arm.c, * elf32-avr.c,
* elf32-hppa.c, * elf32-i386.c, * elf32-lm32.c, * elf32-m32c.c,
* elf32-m32r.c, * elf32-m68hc1x.c, * elf32-metag.c,
* elf32-microblaze.c, * elf32-nds32.c, * elf32-nios2.c,
* elf32-or1k.c, * elf32-ppc.c, * elf32-rl78.c, * elf32-s390.c,
* elf32-score.c, * elf32-score7.c, * elf32-sh.c, * elf32-spu.c,
* elf32-tic6x.c, * elf32-tilepro.c, * elf32-xstormy16.c,
* elf32-xtensa.c, * elf64-alpha.c, * elf64-hppa.c, * elf64-ia64-vms.c,
* elf64-mmix.c, * elf64-ppc.c, * elf64-s390.c, * elf64-x86-64.c,
* elflink.c, * elfnn-aarch64.c, * elfxx-mips.c, * elfxx-sparc.c,
* elfxx-tilegx.c, * linker.c, * pdp11.c, * peXXigen.c, * simple.c,
* sunos.c, * vms-alpha.c, * xcofflink.c: Update for above.
* bfd-in2.h: Regenerate.
include/
* bfdlink.h: Update for bfd.link_next change.
ld/
* emultempl/cr16elf.em, * emultempl/elf32.em, * emultempl/genelf.em,
* emultempl/m68kcoff.em, * emultempl/m68kelf.em,
* emultempl/nds32elf.em, * emultempl/pe.em, * emultempl/pep.em,
* ldlang.c, * ldmain.c, * pe-dll.c: Update for bfd.link_next change.
2014-06-13 17:40:57 +08:00
|
|
|
for (abfd = link_info.input_bfds; abfd != NULL; abfd = abfd->link.next)
|
2000-07-22 07:31:53 +08:00
|
|
|
{
|
|
|
|
asection *datasec;
|
|
|
|
|
|
|
|
/* As first-order business, make sure that each input BFD is COFF. It
|
|
|
|
better be, as we are directly calling a COFF backend function. */
|
|
|
|
if (bfd_get_flavour (abfd) != bfd_target_coff_flavour)
|
|
|
|
einfo ("%F%B: all input objects must be COFF for --embedded-relocs\n");
|
|
|
|
|
|
|
|
datasec = bfd_get_section_by_name (abfd, ".data");
|
|
|
|
|
|
|
|
/* Note that we assume that the reloc_count field has already
|
|
|
|
been set up. We could call bfd_get_reloc_upper_bound, but
|
|
|
|
that returns the size of a memory buffer rather than a reloc
|
|
|
|
count. We do not want to call bfd_canonicalize_reloc,
|
|
|
|
because although it would always work it would force us to
|
|
|
|
read in the relocs into BFD canonical form, which would waste
|
|
|
|
a significant amount of time and memory. */
|
|
|
|
if (datasec != NULL && datasec->reloc_count > 0)
|
|
|
|
{
|
|
|
|
asection *relsec;
|
|
|
|
|
2008-07-07 08:46:51 +08:00
|
|
|
relsec = bfd_make_section_with_flags (abfd, ".emreloc",
|
|
|
|
(SEC_ALLOC
|
|
|
|
| SEC_LOAD
|
|
|
|
| SEC_HAS_CONTENTS
|
|
|
|
| SEC_IN_MEMORY));
|
2000-07-22 07:31:53 +08:00
|
|
|
if (relsec == NULL
|
|
|
|
|| ! bfd_set_section_alignment (abfd, relsec, 2)
|
|
|
|
|| ! bfd_set_section_size (abfd, relsec,
|
|
|
|
datasec->reloc_count * 12))
|
|
|
|
einfo ("%F%B: can not create .emreloc section: %E\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Double check that all other data sections are empty, as is
|
|
|
|
required for embedded PIC code. */
|
2003-06-28 13:28:54 +08:00
|
|
|
bfd_map_over_sections (abfd, check_sections, datasec);
|
2000-07-22 07:31:53 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check that of the data sections, only the .data section has
|
|
|
|
relocs. This is called via bfd_map_over_sections. */
|
|
|
|
|
|
|
|
static void
|
2003-06-27 08:38:25 +08:00
|
|
|
check_sections (bfd *abfd, asection *sec, void *datasec)
|
2000-07-22 07:31:53 +08:00
|
|
|
{
|
|
|
|
if ((bfd_get_section_flags (abfd, sec) & SEC_DATA)
|
2003-06-27 08:38:25 +08:00
|
|
|
&& sec != datasec
|
2000-07-22 07:31:53 +08:00
|
|
|
&& sec->reloc_count != 0)
|
|
|
|
einfo ("%B%X: section %s has relocs; can not use --embedded-relocs\n",
|
|
|
|
abfd, bfd_get_section_name (abfd, sec));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* This function is called after the section sizes and offsets have
|
|
|
|
been set. If we are generating embedded relocs, it calls a special
|
|
|
|
BFD backend routine to do the work. */
|
|
|
|
|
|
|
|
static void
|
2003-06-27 08:38:25 +08:00
|
|
|
gld${EMULATION_NAME}_after_allocation (void)
|
2000-07-22 07:31:53 +08:00
|
|
|
{
|
|
|
|
bfd *abfd;
|
|
|
|
|
|
|
|
if (! command_line.embedded_relocs
|
2003-06-25 14:40:27 +08:00
|
|
|
|| link_info.relocatable)
|
2000-07-22 07:31:53 +08:00
|
|
|
return;
|
|
|
|
|
Make bfd.link_next field a union
This field of struct bfd is currently only used to chain together
linker input files. This patch prepares to use the field to stash
the linker hash table, which is always created on the linker output
file.
bfd/
* bfd.c (struct bfd): Replace link_next with a union.
* aoutx.h, * bfd.c, * coff-ppc.c, * coff-rs6000.c, * cofflink.c,
* ecoff.c, * elf-m10300.c, * elf32-arm.c, * elf32-avr.c,
* elf32-hppa.c, * elf32-i386.c, * elf32-lm32.c, * elf32-m32c.c,
* elf32-m32r.c, * elf32-m68hc1x.c, * elf32-metag.c,
* elf32-microblaze.c, * elf32-nds32.c, * elf32-nios2.c,
* elf32-or1k.c, * elf32-ppc.c, * elf32-rl78.c, * elf32-s390.c,
* elf32-score.c, * elf32-score7.c, * elf32-sh.c, * elf32-spu.c,
* elf32-tic6x.c, * elf32-tilepro.c, * elf32-xstormy16.c,
* elf32-xtensa.c, * elf64-alpha.c, * elf64-hppa.c, * elf64-ia64-vms.c,
* elf64-mmix.c, * elf64-ppc.c, * elf64-s390.c, * elf64-x86-64.c,
* elflink.c, * elfnn-aarch64.c, * elfxx-mips.c, * elfxx-sparc.c,
* elfxx-tilegx.c, * linker.c, * pdp11.c, * peXXigen.c, * simple.c,
* sunos.c, * vms-alpha.c, * xcofflink.c: Update for above.
* bfd-in2.h: Regenerate.
include/
* bfdlink.h: Update for bfd.link_next change.
ld/
* emultempl/cr16elf.em, * emultempl/elf32.em, * emultempl/genelf.em,
* emultempl/m68kcoff.em, * emultempl/m68kelf.em,
* emultempl/nds32elf.em, * emultempl/pe.em, * emultempl/pep.em,
* ldlang.c, * ldmain.c, * pe-dll.c: Update for bfd.link_next change.
2014-06-13 17:40:57 +08:00
|
|
|
for (abfd = link_info.input_bfds; abfd != NULL; abfd = abfd->link.next)
|
2000-07-22 07:31:53 +08:00
|
|
|
{
|
|
|
|
asection *datasec, *relsec;
|
|
|
|
char *errmsg;
|
|
|
|
|
|
|
|
datasec = bfd_get_section_by_name (abfd, ".data");
|
|
|
|
|
|
|
|
if (datasec == NULL || datasec->reloc_count == 0)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
relsec = bfd_get_section_by_name (abfd, ".emreloc");
|
|
|
|
ASSERT (relsec != NULL);
|
|
|
|
|
|
|
|
if (! bfd_m68k_coff_create_embedded_relocs (abfd, &link_info,
|
|
|
|
datasec, relsec,
|
|
|
|
&errmsg))
|
|
|
|
{
|
|
|
|
if (errmsg == NULL)
|
|
|
|
einfo ("%B%X: can not create runtime reloc information: %E\n",
|
|
|
|
abfd);
|
|
|
|
else
|
|
|
|
einfo ("%X%B: can not create runtime reloc information: %s\n",
|
|
|
|
abfd, errmsg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static char *
|
2003-06-27 08:38:25 +08:00
|
|
|
gld${EMULATION_NAME}_get_script (int *isfile)
|
2000-07-22 07:31:53 +08:00
|
|
|
EOF
|
|
|
|
|
2014-01-17 08:09:50 +08:00
|
|
|
if test x"$COMPILE_IN" = xyes
|
2000-07-22 07:31:53 +08:00
|
|
|
then
|
|
|
|
# Scripts compiled in.
|
|
|
|
|
|
|
|
# sed commands to quote an ld script as a C string.
|
|
|
|
sc="-f stringify.sed"
|
|
|
|
|
2007-07-20 03:56:10 +08:00
|
|
|
fragment <<EOF
|
2003-06-27 08:38:25 +08:00
|
|
|
{
|
2000-07-22 07:31:53 +08:00
|
|
|
*isfile = 0;
|
|
|
|
|
2003-06-25 14:40:27 +08:00
|
|
|
if (link_info.relocatable && config.build_constructors)
|
2000-07-22 07:31:53 +08:00
|
|
|
return
|
|
|
|
EOF
|
2002-11-30 16:39:46 +08:00
|
|
|
sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
|
2003-06-25 14:40:27 +08:00
|
|
|
echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
|
2002-11-30 16:39:46 +08: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
|
2000-07-22 07:31:53 +08:00
|
|
|
|
|
|
|
else
|
|
|
|
# Scripts read from the filesystem.
|
|
|
|
|
2007-07-20 03:56:10 +08:00
|
|
|
fragment <<EOF
|
2003-06-27 08:38:25 +08:00
|
|
|
{
|
2000-07-22 07:31:53 +08:00
|
|
|
*isfile = 1;
|
|
|
|
|
2003-06-25 14:40:27 +08:00
|
|
|
if (link_info.relocatable && config.build_constructors)
|
2000-07-22 07:31:53 +08:00
|
|
|
return "ldscripts/${EMULATION_NAME}.xu";
|
2003-06-25 14:40:27 +08:00
|
|
|
else if (link_info.relocatable)
|
2000-07-22 07:31:53 +08: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
|
|
|
|
|
2007-07-20 03:56:10 +08:00
|
|
|
fragment <<EOF
|
2000-07-22 07:31:53 +08:00
|
|
|
|
2003-06-27 08:38:25 +08:00
|
|
|
struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
|
2000-07-22 07:31:53 +08:00
|
|
|
{
|
|
|
|
gld${EMULATION_NAME}_before_parse,
|
|
|
|
syslib_default,
|
|
|
|
hll_default,
|
|
|
|
after_parse_default,
|
|
|
|
gld${EMULATION_NAME}_after_open,
|
|
|
|
gld${EMULATION_NAME}_after_allocation,
|
|
|
|
set_output_arch_default,
|
|
|
|
ldemul_default_target,
|
|
|
|
before_allocation_default,
|
|
|
|
gld${EMULATION_NAME}_get_script,
|
|
|
|
"${EMULATION_NAME}",
|
|
|
|
"${OUTPUT_FORMAT}",
|
2005-08-04 09:19:10 +08:00
|
|
|
finish_default,
|
2000-07-22 07:31:53 +08:00
|
|
|
NULL, /* create output section statements */
|
|
|
|
NULL, /* open dynamic archive */
|
|
|
|
NULL, /* place orphan */
|
|
|
|
NULL, /* set symbols */
|
|
|
|
NULL, /* parse args */
|
2003-02-28 09:32:31 +08:00
|
|
|
NULL, /* add_options */
|
|
|
|
NULL, /* handle_option */
|
2000-07-22 07:31:53 +08:00
|
|
|
NULL, /* unrecognized file */
|
|
|
|
NULL, /* list options */
|
|
|
|
NULL, /* recognized file */
|
2002-05-22 17:04:48 +08:00
|
|
|
NULL, /* find_potential_libraries */
|
2014-05-28 05:14:49 +08:00
|
|
|
NULL, /* new_vers_pattern */
|
|
|
|
NULL /* extra_map_file_text */
|
2000-07-22 07:31:53 +08:00
|
|
|
};
|
|
|
|
EOF
|