PR ld/6766

* lexsup.c (parse_args <-e>): Revert 2009-03-18 change.
	* ldemul.c (after_parse_default): Add entry symbol as undef.
	* emultempl/alphaelf.em (alpha_after_parse): Call after_parse_default.
	* emultempl/cr16elf.em (cr16elf_after_parse): Likewise.
	* emultempl/crxelf.em (crxelf_after_parse): Likewise.
	* emultempl/hppaelf.em (hppaelf_after_parse): Likewise.
	* emultempl/ia64elf.em (gld${EMULATION_NAME}_after_parse): Likewise.
	* emultempl/pe.em (gld_${EMULATION_NAME}_after_parse): Call
	after_parse_default and delete now duplicate code.
	* emultempl/pep.em (gld_${EMULATION_NAME}_after_parse): Likewise.
	* scripttempl/elf32cr16.sc: No need to make entry extern.
	* scripttempl/elf32cr16c.sc: Likewise.
	* scripttempl/elf32crx.sc: Likewise.
	* scripttempl/elf32xc16xs.sc: Only provide ENTRY on final link.
This commit is contained in:
Alan Modra 2009-09-13 07:19:18 +00:00
parent b43b923a25
commit 97b11f4094
14 changed files with 62 additions and 55 deletions

View File

@ -1,3 +1,21 @@
2009-09-13 Alan Modra <amodra@bigpond.net.au>
PR ld/6766
* lexsup.c (parse_args <-e>): Revert 2009-03-18 change.
* ldemul.c (after_parse_default): Add entry symbol as undef.
* emultempl/alphaelf.em (alpha_after_parse): Call after_parse_default.
* emultempl/cr16elf.em (cr16elf_after_parse): Likewise.
* emultempl/crxelf.em (crxelf_after_parse): Likewise.
* emultempl/hppaelf.em (hppaelf_after_parse): Likewise.
* emultempl/ia64elf.em (gld${EMULATION_NAME}_after_parse): Likewise.
* emultempl/pe.em (gld_${EMULATION_NAME}_after_parse): Call
after_parse_default and delete now duplicate code.
* emultempl/pep.em (gld_${EMULATION_NAME}_after_parse): Likewise.
* scripttempl/elf32cr16.sc: No need to make entry extern.
* scripttempl/elf32cr16c.sc: Likewise.
* scripttempl/elf32crx.sc: Likewise.
* scripttempl/elf32xc16xs.sc: Only provide ENTRY on final link.
2009-09-11 Nick Clifton <nickc@redhat.com>
* po/ld.pot: Updated by the Translation project.

View File

@ -80,6 +80,8 @@ alpha_after_parse (void)
exp_intop (ALPHA_TEXT_START_32BIT),
exp_nameop (SIZEOF_HEADERS, NULL)),
NULL);
after_parse_default ();
}
static void

View File

@ -1,5 +1,5 @@
# This shell script emits a C file. -*- C -*-
# Copyright 2007, 2008 Free Software Foundation, Inc.
# Copyright 2007, 2008, 2009 Free Software Foundation, Inc.
# Contributed by M R Swami Reddy <MR.Swami.Reddy@nsc.com>
#
# This file is part of the GNU Binutils.
@ -121,6 +121,8 @@ cr16elf_after_parse (void)
meaninful in CR16 embedded systems. Moreover, when magic_demand_paged
is true the link sometimes fails. */
config.magic_demand_paged = FALSE;
after_parse_default ();
}
/* This is called after the sections have been attached to output

View File

@ -1,5 +1,5 @@
# This shell script emits a C file. -*- C -*-
# Copyright 2004, 2005, 2007
# Copyright 2004, 2005, 2007, 2009
# Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
@ -45,6 +45,8 @@ crxelf_after_parse (void)
meaninful in CRX embedded systems. Moreover, when magic_demand_paged
is true the link sometimes fails. */
config.magic_demand_paged = FALSE;
after_parse_default ();
}
/* This is called after the sections have been attached to output

View File

@ -59,6 +59,8 @@ hppaelf_after_parse (void)
lang_input_file_is_l_enum,
NULL);
*/
after_parse_default ();
}
/* This is called before the input files are opened. We create a new

View File

@ -1,5 +1,5 @@
# This shell script emits a C file. -*- C -*-
# Copyright 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
# Copyright 2003, 2005, 2006, 2007, 2009 Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
#
@ -35,6 +35,8 @@ gld${EMULATION_NAME}_after_parse (void)
{
link_info.relax_pass = 2;
bfd_elf${ELFSIZE}_ia64_after_parse (itanium);
after_parse_default ();
}
EOF

View File

@ -877,27 +877,13 @@ gld_${EMULATION_NAME}_set_symbols (void)
static void
gld_${EMULATION_NAME}_after_parse (void)
{
/* The Windows libraries are designed for the linker to treat the
entry point as an undefined symbol. Otherwise, the .obj that
defines mainCRTStartup is brought in because it is the first
encountered in libc.lib and it has other symbols in it which will
be pulled in by the link process. To avoid this, we act as
though the user specified -u with the entry point symbol.
This function is called after the linker script and command line
options have been read, so at this point we know the right entry
point. This function is called before the input files are
opened, so registering the symbol as undefined will make a
difference. */
if (! link_info.relocatable && entry_symbol.name != NULL)
ldlang_add_undef (entry_symbol.name);
/* PR ld/6744: Warn the user if they have used an ELF-only
option hoping it will work on PE. */
if (link_info.export_dynamic)
einfo (_("%P: warning: --export-dynamic is not supported for PE "
"targets, did you mean --export-all-symbols?\n"));
after_parse_default ();
}
/* pe-dll.c directly accesses pe_data_import_dll,

View File

@ -814,27 +814,13 @@ gld_${EMULATION_NAME}_set_symbols (void)
static void
gld_${EMULATION_NAME}_after_parse (void)
{
/* The Windows libraries are designed for the linker to treat the
entry point as an undefined symbol. Otherwise, the .obj that
defines mainCRTStartup is brought in because it is the first
encountered in libc.lib and it has other symbols in it which will
be pulled in by the link process. To avoid this, we act as
though the user specified -u with the entry point symbol.
This function is called after the linker script and command line
options have been read, so at this point we know the right entry
point. This function is called before the input files are
opened, so registering the symbol as undefined will make a
difference. */
if (! link_info.relocatable && entry_symbol.name != NULL)
ldlang_add_undef (entry_symbol.name);
/* PR ld/6744: Warn the user if they have used an ELF-only
option hoping it will work on PE+. */
if (link_info.export_dynamic)
einfo (_("%P: warning: --export-dynamic is not supported for PE+ "
"targets, did you mean --export-all-symbols?\n"));
after_parse_default ();
}
/* pep-dll.c directly accesses pep_data_import_dll,

View File

@ -192,9 +192,35 @@ ldemul_default_target (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
return ld_emulation->target_name;
}
/* If the entry point was not specified as an address, then add the
symbol as undefined. This will cause ld to extract an archive
element defining the entry if ld is linking against such an archive.
We don't do this when generating shared libraries unless given -e
on the command line, because most shared libs are not designed to
be run as an executable. However, some are, eg. glibc ld.so and
may rely on the default linker script supplying ENTRY. So we can't
remove the ENTRY from the script, but would rather not insert
undefined _start syms. */
void
after_parse_default (void)
{
if (entry_symbol.name != NULL
&& (link_info.executable || entry_from_cmdline))
{
bfd_boolean is_vma = FALSE;
if (entry_from_cmdline)
{
const char *send;
bfd_scan_vma (entry_symbol.name, &send, 0);
is_vma = *send == '\0';
}
if (!is_vma)
ldlang_add_undef (entry_symbol.name);
}
}
void

View File

@ -832,7 +832,6 @@ parse_args (unsigned argc, char **argv)
break;
case 'e':
lang_add_entry (optarg, TRUE);
ldlang_add_undef (optarg);
break;
case 'f':
if (command_line.auxiliary_filters == NULL)

View File

@ -10,14 +10,8 @@ cat <<EOF
/* Example Linker Script for linking NS CR16 elf32 files. */
/* The next line forces the entry point (${ENTRY} in this script)
to be entered in the output file as an undefined symbol.
It is needed in case the entry point is not called explicitly
(which is the usual case) AND is in an archive. */
OUTPUT_FORMAT("${OUTPUT_FORMAT}")
OUTPUT_ARCH(${ARCH})
${RELOCATING+EXTERN(${ENTRY})}
${RELOCATING+ENTRY(${ENTRY})}
/* Define memory regions. */

View File

@ -7,12 +7,6 @@ cat <<EOF
elf32 files, which were compiled with either the near data
model or the default data model. */
/* Force the entry point to be entered in the output file as
an undefined symbol. This is needed in case the entry point
(which is not called explicitly) is in an archive (which is
the usual case). */
${RELOCATING+EXTERN(${ENTRY})}
${RELOCATING+ENTRY(${ENTRY})}
MEMORY

View File

@ -10,14 +10,8 @@ cat <<EOF
/* Example Linker Script for linking NS CRX elf32 files. */
/* The next line forces the entry point (${ENTRY} in this script)
to be entered in the output file as an undefined symbol.
It is needed in case the entry point is not called explicitly
(which is the usual case) AND is in an archive. */
OUTPUT_FORMAT("${OUTPUT_FORMAT}")
OUTPUT_ARCH(${ARCH})
${RELOCATING+EXTERN(${ENTRY})}
${RELOCATING+ENTRY(${ENTRY})}
/* Define memory regions. */

View File

@ -1,7 +1,7 @@
cat <<EOF
OUTPUT_FORMAT("${OUTPUT_FORMAT}")
OUTPUT_ARCH(${ARCH})
ENTRY("_start")
${RELOCATING+ENTRY ("_start")}
MEMORY
{
vectarea : o =0xc00000, l = 0x0300