aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2009-09-13 07:19:18 +0000
committerAlan Modra <amodra@gmail.com>2009-09-13 07:19:18 +0000
commit97b11f4094739634d104156f5c586ba7916ef0fa (patch)
tree4736e643a4af78cef04523666cdf386dc474323a /ld
parentb43b923a25d813161bf3596b31a7f00ef9608537 (diff)
downloadfsf-binutils-gdb-97b11f4094739634d104156f5c586ba7916ef0fa.zip
fsf-binutils-gdb-97b11f4094739634d104156f5c586ba7916ef0fa.tar.gz
fsf-binutils-gdb-97b11f4094739634d104156f5c586ba7916ef0fa.tar.bz2
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.
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog18
-rw-r--r--ld/emultempl/alphaelf.em2
-rw-r--r--ld/emultempl/cr16elf.em4
-rw-r--r--ld/emultempl/crxelf.em4
-rw-r--r--ld/emultempl/hppaelf.em2
-rw-r--r--ld/emultempl/ia64elf.em4
-rw-r--r--ld/emultempl/pe.em18
-rw-r--r--ld/emultempl/pep.em18
-rw-r--r--ld/ldemul.c26
-rw-r--r--ld/lexsup.c1
-rw-r--r--ld/scripttempl/elf32cr16.sc6
-rw-r--r--ld/scripttempl/elf32cr16c.sc6
-rw-r--r--ld/scripttempl/elf32crx.sc6
-rw-r--r--ld/scripttempl/elf32xc16xs.sc2
14 files changed, 62 insertions, 55 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 8d72882..94dd411 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -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.
diff --git a/ld/emultempl/alphaelf.em b/ld/emultempl/alphaelf.em
index 1bee6f9..864e699 100644
--- a/ld/emultempl/alphaelf.em
+++ b/ld/emultempl/alphaelf.em
@@ -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
diff --git a/ld/emultempl/cr16elf.em b/ld/emultempl/cr16elf.em
index 3c66f66..83f0783 100644
--- a/ld/emultempl/cr16elf.em
+++ b/ld/emultempl/cr16elf.em
@@ -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
diff --git a/ld/emultempl/crxelf.em b/ld/emultempl/crxelf.em
index d177a61..a257c06 100644
--- a/ld/emultempl/crxelf.em
+++ b/ld/emultempl/crxelf.em
@@ -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
diff --git a/ld/emultempl/hppaelf.em b/ld/emultempl/hppaelf.em
index 1f9a307..3ce5d54 100644
--- a/ld/emultempl/hppaelf.em
+++ b/ld/emultempl/hppaelf.em
@@ -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
diff --git a/ld/emultempl/ia64elf.em b/ld/emultempl/ia64elf.em
index b29e16c..88d5748 100644
--- a/ld/emultempl/ia64elf.em
+++ b/ld/emultempl/ia64elf.em
@@ -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
diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em
index 2437bfb..788818d 100644
--- a/ld/emultempl/pe.em
+++ b/ld/emultempl/pe.em
@@ -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,
diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em
index e4519c5..90af020 100644
--- a/ld/emultempl/pep.em
+++ b/ld/emultempl/pep.em
@@ -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,
diff --git a/ld/ldemul.c b/ld/ldemul.c
index b297036..c77eeb0 100644
--- a/ld/ldemul.c
+++ b/ld/ldemul.c
@@ -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
diff --git a/ld/lexsup.c b/ld/lexsup.c
index d3d6e56..47c72db 100644
--- a/ld/lexsup.c
+++ b/ld/lexsup.c
@@ -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)
diff --git a/ld/scripttempl/elf32cr16.sc b/ld/scripttempl/elf32cr16.sc
index 7c357c1..61351c5 100644
--- a/ld/scripttempl/elf32cr16.sc
+++ b/ld/scripttempl/elf32cr16.sc
@@ -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. */
diff --git a/ld/scripttempl/elf32cr16c.sc b/ld/scripttempl/elf32cr16c.sc
index 56bab60..84fc61c 100644
--- a/ld/scripttempl/elf32cr16c.sc
+++ b/ld/scripttempl/elf32cr16c.sc
@@ -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
diff --git a/ld/scripttempl/elf32crx.sc b/ld/scripttempl/elf32crx.sc
index 514254a..c320bda 100644
--- a/ld/scripttempl/elf32crx.sc
+++ b/ld/scripttempl/elf32crx.sc
@@ -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. */
diff --git a/ld/scripttempl/elf32xc16xs.sc b/ld/scripttempl/elf32xc16xs.sc
index 215b50a..3565ece 100644
--- a/ld/scripttempl/elf32xc16xs.sc
+++ b/ld/scripttempl/elf32xc16xs.sc
@@ -1,7 +1,7 @@
cat <<EOF
OUTPUT_FORMAT("${OUTPUT_FORMAT}")
OUTPUT_ARCH(${ARCH})
-ENTRY("_start")
+${RELOCATING+ENTRY ("_start")}
MEMORY
{
vectarea : o =0xc00000, l = 0x0300