/* ldemul.c -- clearing house for ld emulation states
- Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002, 2003, 2005, 2007
- Free Software Foundation, Inc.
+ Copyright (C) 1991-2017 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
return FALSE;
}
-bfd_boolean
-ldemul_place_orphan (asection *s)
+lang_output_section_statement_type *
+ldemul_place_orphan (asection *s, const char *name, int constraint)
{
if (ld_emulation->place_orphan)
- return (*ld_emulation->place_orphan) (s);
- return FALSE;
+ return (*ld_emulation->place_orphan) (s, name, constraint);
+ 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
+ && (bfd_link_executable (&link_info) || 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
before_allocation_default (void)
{
- if (!link_info.relocatable)
+ if (!bfd_link_relocatable (&link_info))
strip_excluded_output_sections ();
}
void
finish_default (void)
{
- if (!link_info.relocatable)
- _bfd_fix_excluded_sec_syms (output_bfd, &link_info);
+ if (!bfd_link_relocatable (&link_info))
+ _bfd_fix_excluded_sec_syms (link_info.output_bfd, &link_info);
}
void
set_output_arch_default (void)
{
/* Set the output architecture and machine if possible. */
- bfd_set_arch_mach (output_bfd,
+ 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 };
}
}
- if (! options_found)
+ if (!options_found)
fprintf (f, _(" no emulation specific options.\n"));
}
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);
+}