aboutsummaryrefslogtreecommitdiff
path: root/ld/ldemul.c
diff options
context:
space:
mode:
Diffstat (limited to 'ld/ldemul.c')
-rw-r--r--ld/ldemul.c26
1 files changed, 26 insertions, 0 deletions
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