/* ldemul.c -- clearing house for ld emulation states
- Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002, 2003, 2005, 2007, 2008
- Free Software Foundation, Inc.
+ Copyright (C) 1991-2015 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
return FALSE;
}
-bfd_boolean
+lang_output_section_statement_type *
ldemul_place_orphan (asection *s, const char *name, int constraint)
{
+ if (config.warn_orphan)
+ einfo (_("%P: Warning: input section '%s' from file '%B' is not mentioned in linker script\n"),
+ name, s->owner);
+
if (ld_emulation->place_orphan)
return (*ld_emulation->place_orphan) (s, name, constraint);
- return FALSE;
+ return NULL;
}
void
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, entry_from_cmdline);
+ }
}
void
void
after_allocation_default (void)
{
+ lang_relax_sections (FALSE);
}
void
/* Set the output architecture and machine if possible. */
bfd_set_arch_mach (link_info.output_bfd,
ldfile_output_architecture, ldfile_output_machine);
+
+ bfd_emul_set_maxpagesize (output_target, config.maxpagesize);
+ bfd_emul_set_commonpagesize (output_target, config.commonpagesize);
}
void
syslib_default (char *ignore ATTRIBUTE_UNUSED)
{
- info_msg (_("%S SYSLIB ignored\n"));
+ info_msg (_("%S SYSLIB ignored\n"), NULL);
}
void
hll_default (char *ignore ATTRIBUTE_UNUSED)
{
- info_msg (_("%S HLL ignored\n"));
+ info_msg (_("%S HLL ignored\n"), NULL);
}
ld_emulation_xfer_type *ld_emulations[] = { EMULATION_LIST };
entry = (*ld_emulation->new_vers_pattern) (entry);
return entry;
}
+
+void
+ldemul_extra_map_file_text (bfd *abfd, struct bfd_link_info *info, FILE *mapf)
+{
+ if (ld_emulation->extra_map_file_text)
+ ld_emulation->extra_map_file_text (abfd, info, mapf);
+}