ld: Allow section groups to be resolved as part of a relocatable link
[deliverable/binutils-gdb.git] / ld / ldemul.c
index fbe3e1dd565c0c6f9ca2f542072e5cea7eb2adb5..cebf012e78f27fca3655c49def218b1032b8a3e3 100644 (file)
@@ -1,28 +1,25 @@
 /* ldemul.c -- clearing house for ld emulation states
-   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003, 2005
-   Free Software Foundation, Inc.
+   Copyright (C) 1991-2017 Free Software Foundation, Inc.
 
-This file is part of GLD, the Gnu Linker.
+   This file is part of the GNU Binutils.
 
-GLD is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
 
-GLD is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with GLD; see the file COPYING.  If not, write to the Free
-Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
-02110-1301, USA.  */
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
-#include "config.h"
-#include "bfd.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "getopt.h"
 #include "bfdlink.h"
 
@@ -79,12 +76,6 @@ ldemul_before_allocation (void)
   ld_emulation->before_allocation ();
 }
 
-void
-ldemul_do_assignments (void)
-{
-  ld_emulation->do_assignments ();
-}
-
 void
 ldemul_set_output_arch (void)
 {
@@ -94,8 +85,7 @@ ldemul_set_output_arch (void)
 void
 ldemul_finish (void)
 {
-  if (ld_emulation->finish)
-    ld_emulation->finish ();
+  ld_emulation->finish ();
 }
 
 void
@@ -127,12 +117,12 @@ ldemul_open_dynamic_archive (const char *arch, search_dirs_type *search,
   return FALSE;
 }
 
-bfd_boolean
-ldemul_place_orphan (lang_input_statement_type *file, 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) (file, s);
-  return FALSE;
+    return (*ld_emulation->place_orphan) (s, name, constraint);
+  return NULL;
 }
 
 void
@@ -200,9 +190,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
+      && (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
@@ -213,38 +229,44 @@ after_open_default (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
-do_assignments_default (void)
+finish_default (void)
 {
+  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 };
@@ -306,7 +328,7 @@ ldemul_list_emulation_options (FILE *f)
        }
     }
 
-  if (! options_found)
+  if (!options_found)
     fprintf (f, _("  no emulation specific options.\n"));
 }
 
@@ -326,3 +348,10 @@ ldemul_new_vers_pattern (struct bfd_elf_version_expr *entry)
     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);
+}
This page took 0.042893 seconds and 4 git commands to generate.