* ldlang.h (struct lang_input_statement_flags): New, extract from..
authorAlan Modra <amodra@gmail.com>
Mon, 5 Mar 2012 22:43:40 +0000 (22:43 +0000)
committerAlan Modra <amodra@gmail.com>
Mon, 5 Mar 2012 22:43:40 +0000 (22:43 +0000)
(lang_input_statement_type): ..here.  New field "flags".
(input_flags): Declare.
(missing_file): Delete.
* ldmain.h (whole_archive): Delete.
(add_DT_NEEDED_for_regular, add_DT_NEEDED_for_dynamic): Delete.
* ld.h (ld_config_type <dynamic_link>): Delete.
* ldmain.c (whole_archive): Delete.
(add_DT_NEEDED_for_regular, add_DT_NEEDED_for_dynamic): Delete.
* ldlang.c (missing_file, ldlang_sysrooted_script): Delete.
(input_flags): New variable.  Replace all uses of config.dynamic_link,
missing_file, ldlang_sysrooted_script, whole_archive,
add_DT_NEEDED_for_regular and add_DT_NEEDED_for_dynamic with fields
from here.
* ldfile.c: Likewise.
* ldgram.y: Likewise.
* ldmain.c: Likewise.
* ldwrite.c: Likewise.
* lexsup.c: Likewise.
* plugin.c: Likewise.
* emultempl/aix.em: Likewise.
* emultempl/armelf.em: Likewise.
* emultempl/elf32.em: Likewise.
* emultempl/hppaelf.em: Likewise.
* emultempl/linux.em: Likewise.
* emultempl/pe.em: Likewise.
* emultempl/pep.em: Likewise.
* emultempl/ppc64elf.em: Likewise.
* emultempl/scoreelf.em: Likewise.
* emultempl/spuelf.em: Likewise.
* emultempl/sunos.em: Likewise.
* emultempl/vms.em: Likewise.
* ldlang.c (new_afile): Use memset to init zero fields.
(load_symbols): Simplify save and restore of flags around command
file processing.
* ldfile.c (is_sysrooted_pathname): Tidy.

23 files changed:
ld/ChangeLog
ld/emultempl/aix.em
ld/emultempl/armelf.em
ld/emultempl/elf32.em
ld/emultempl/hppaelf.em
ld/emultempl/linux.em
ld/emultempl/pe.em
ld/emultempl/pep.em
ld/emultempl/ppc64elf.em
ld/emultempl/scoreelf.em
ld/emultempl/spuelf.em
ld/emultempl/sunos.em
ld/emultempl/vms.em
ld/ld.h
ld/ldfile.c
ld/ldgram.y
ld/ldlang.c
ld/ldlang.h
ld/ldmain.c
ld/ldmain.h
ld/ldwrite.c
ld/lexsup.c
ld/plugin.c

index 32ed5d7efa8f2ce6d75484cefc2466843ed6fed8..8446bc772ddeb97f366bfa1a44ec72fdf7ce6cb3 100644 (file)
@@ -1,3 +1,42 @@
+2012-03-06  Alan Modra  <amodra@gmail.com>
+
+       * ldlang.h (struct lang_input_statement_flags): New, extract from..
+       (lang_input_statement_type): ..here.  New field "flags".
+       (input_flags): Declare.
+       (missing_file): Delete.
+       * ldmain.h (whole_archive): Delete.
+       (add_DT_NEEDED_for_regular, add_DT_NEEDED_for_dynamic): Delete.
+       * ld.h (ld_config_type <dynamic_link>): Delete.
+       * ldmain.c (whole_archive): Delete.
+       (add_DT_NEEDED_for_regular, add_DT_NEEDED_for_dynamic): Delete.
+       * ldlang.c (missing_file, ldlang_sysrooted_script): Delete.
+       (input_flags): New variable.  Replace all uses of config.dynamic_link,
+       missing_file, ldlang_sysrooted_script, whole_archive,
+       add_DT_NEEDED_for_regular and add_DT_NEEDED_for_dynamic with fields
+       from here.
+       * ldfile.c: Likewise.
+       * ldgram.y: Likewise.
+       * ldmain.c: Likewise.
+       * ldwrite.c: Likewise.
+       * lexsup.c: Likewise.
+       * plugin.c: Likewise.
+       * emultempl/aix.em: Likewise.
+       * emultempl/armelf.em: Likewise.
+       * emultempl/elf32.em: Likewise.
+       * emultempl/hppaelf.em: Likewise.
+       * emultempl/linux.em: Likewise.
+       * emultempl/pe.em: Likewise.
+       * emultempl/pep.em: Likewise.
+       * emultempl/ppc64elf.em: Likewise.
+       * emultempl/scoreelf.em: Likewise.
+       * emultempl/spuelf.em: Likewise.
+       * emultempl/sunos.em: Likewise.
+       * emultempl/vms.em: Likewise.
+       * ldlang.c (new_afile): Use memset to init zero fields.
+       (load_symbols): Simplify save and restore of flags around command
+       file processing.
+       * ldfile.c (is_sysrooted_pathname): Tidy.
+
 2012-03-05  Hans-Peter Nilsson  <hp@axis.com>
 
        * configure.tgt (mips64*el-*-freebsd*, mips64*-*-freebsd*)
index f4660ec4b7e4c539de6ab5404f604f40a9c156da..3f6a097f4a32b1f6c9aa9474c2d30a18e53db744 100644 (file)
@@ -10,7 +10,7 @@ fragment <<EOF
 
 /* AIX emulation code for ${EMULATION_NAME}
    Copyright 1991, 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-   2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+   2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012
    Free Software Foundation, Inc.
    Written by Steve Chamberlain <sac@cygnus.com>
    AIX support by Ian Lance Taylor <ian@cygnus.com>
@@ -145,7 +145,7 @@ gld${EMULATION_NAME}_before_parse (void)
 {
   ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
 
-  config.dynamic_link = TRUE;
+  input_flags.dynamic = TRUE;
   config.has_shared = TRUE;
 
   /* The link_info.[init|fini]_functions are initialized in ld/lexsup.c.
@@ -669,7 +669,7 @@ gld${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry)
       *flpp = n;
 
       ret = TRUE;
-      entry->loaded = TRUE;
+      entry->flags.loaded = TRUE;
     }
 
   fclose (e);
@@ -1505,7 +1505,7 @@ gld${EMULATION_NAME}_open_dynamic_archive (const char *arch,
 {
   char *path;
 
-  if (!entry->maybe_archive)
+  if (!entry->flags.maybe_archive)
     return FALSE;
 
   path = concat (search->name, "/lib", entry->filename, arch, ".a", NULL);
index 21d4f59b5391d21d33c3befc632702fb9cc90f01..03ee98b05dfc81e10874dd782b02889e83965759 100644 (file)
@@ -1,6 +1,6 @@
 # This shell script emits a C file. -*- C -*-
 #   Copyright 1991, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
-#   2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+#   2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
 #   Free Software Foundation, Inc.
 #
 # This file is part of the GNU Binutils.
@@ -50,7 +50,7 @@ gld${EMULATION_NAME}_before_parse (void)
 #ifndef TARGET_                        /* I.e., if not generic.  */
   ldfile_set_output_arch ("`echo ${ARCH}`", bfd_arch_unknown);
 #endif /* not TARGET_ */
-  config.dynamic_link = ${DYNAMIC_LINK-TRUE};
+  input_flags.dynamic = ${DYNAMIC_LINK-TRUE};
   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
 }
 
@@ -240,7 +240,7 @@ build_section_lists (lang_statement_union_type *statement)
     {
       asection *i = statement->input_section.section;
 
-      if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
+      if (!((lang_input_statement_type *) i->owner->usrdata)->flags.just_syms
          && (i->flags & SEC_EXCLUDE) == 0
          && i->output_section != NULL
          && i->output_section->owner == link_info.output_bfd)
index 78a708bb4f02a45ba2b887c536d05794bd1546ad..7d318646eb63616899e8522de784d35fc224c87c 100644 (file)
@@ -13,7 +13,7 @@ fragment <<EOF
 
 /* ${ELFSIZE} bit ELF emulation code for ${EMULATION_NAME}
    Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-   2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+   2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
    Free Software Foundation, Inc.
    Written by Steve Chamberlain <sac@cygnus.com>
    ELF support by Ian Lance Taylor <ian@cygnus.com>
@@ -102,7 +102,7 @@ static void
 gld${EMULATION_NAME}_before_parse (void)
 {
   ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
-  config.dynamic_link = ${DYNAMIC_LINK-TRUE};
+  input_flags.dynamic = ${DYNAMIC_LINK-TRUE};
   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
 }
 
@@ -121,16 +121,16 @@ gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *entry)
   /* Tell the ELF linker that we don't want the output file to have a
      DT_NEEDED entry for this file, unless it is used to resolve
      references in a regular object.  */
-  if (entry->add_DT_NEEDED_for_regular)
+  if (entry->flags.add_DT_NEEDED_for_regular)
     link_class = DYN_AS_NEEDED;
 
   /* Tell the ELF linker that we don't want the output file to have a
      DT_NEEDED entry for any dynamic library in DT_NEEDED tags from
      this file at all.  */
-  if (!entry->add_DT_NEEDED_for_dynamic)
+  if (!entry->flags.add_DT_NEEDED_for_dynamic)
     link_class |= DYN_NO_ADD_NEEDED;
 
-  if (entry->just_syms_flag
+  if (entry->flags.just_syms
       && (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) != 0)
     einfo (_("%P%F: --just-symbols may not be used on DSO: %B\n"),
           entry->the_bfd);
@@ -862,7 +862,7 @@ gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
       return;
     }
 
-  if (s->search_dirs_flag)
+  if (s->flags.search_dirs)
     {
       const char *f = strrchr (s->filename, '/');
       if (f != NULL
@@ -1560,7 +1560,7 @@ ${ELF_INTERPRETER_SET_DEFAULT}
        char *msg;
        bfd_boolean ret;
 
-       if (is->just_syms_flag)
+       if (is->flags.just_syms)
          continue;
 
        s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
@@ -1621,7 +1621,7 @@ gld${EMULATION_NAME}_open_dynamic_archive
   const char *filename;
   char *string;
 
-  if (! entry->maybe_archive)
+  if (! entry->flags.maybe_archive)
     return FALSE;
 
   filename = entry->filename;
@@ -1675,7 +1675,7 @@ gld${EMULATION_NAME}_open_dynamic_archive
   if (bfd_check_format (entry->the_bfd, bfd_object)
       && (entry->the_bfd->flags & DYNAMIC) != 0)
     {
-      ASSERT (entry->maybe_archive && entry->search_dirs_flag);
+      ASSERT (entry->flags.maybe_archive && entry->flags.search_dirs);
 
       /* Rather than duplicating the logic above.  Just use the
         filename we recorded earlier.  */
index 1137ba2cd6f080f6288064941a18cd4b98e5beb7..ec816246ab3e491fa34dbd59fb7766ec3f9a0062 100644 (file)
@@ -1,6 +1,6 @@
 # This shell script emits a C file. -*- C -*-
 #   Copyright 1991, 1993, 1994, 1997, 1999, 2000, 2001, 2002, 2003, 2004,
-#   2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+#   2005, 2006, 2007, 2008, 2009, 2012 Free Software Foundation, Inc.
 #
 # This file is part of the GNU Binutils.
 #
@@ -229,7 +229,7 @@ build_section_lists (lang_statement_union_type *statement)
     {
       asection *i = statement->input_section.section;
 
-      if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
+      if (!((lang_input_statement_type *) i->owner->usrdata)->flags.just_syms
          && (i->flags & SEC_EXCLUDE) == 0
          && i->output_section != NULL
          && i->output_section->owner == link_info.output_bfd)
index db628308c218a0cfdc668c65a9513cb304d746fd..61c7df4e8bedd3ee6accb81a30400ebdcc0d72e2 100644 (file)
@@ -10,7 +10,7 @@ fragment <<EOF
 
 /* Linux a.out emulation code for ${EMULATION_NAME}
    Copyright 1991, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002,
-   2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+   2003, 2004, 2005, 2007, 2008, 2012 Free Software Foundation, Inc.
    Written by Steve Chamberlain <sac@cygnus.com>
    Linux support by Eric Youngdale <ericy@cais.cais.com>
 
@@ -49,7 +49,7 @@ static void
 gld${EMULATION_NAME}_before_parse (void)
 {
   ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
-  config.dynamic_link = TRUE;
+  input_flags.dynamic = TRUE;
   config.has_shared = TRUE;
 }
 
@@ -62,7 +62,7 @@ gld${EMULATION_NAME}_open_dynamic_archive
 {
   char *string;
 
-  if (! entry->maybe_archive)
+  if (! entry->flags.maybe_archive)
     return FALSE;
 
   string = (char *) xmalloc (strlen (search->name)
index 5737fc0985616902fd05b1f3ec26dc4a031c5799..fe188f7de693a23182e7fde14dff4fe241240063 100644 (file)
@@ -9,7 +9,8 @@ rm -f e${EMULATION_NAME}.c
 (echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
 fragment <<EOF
 /* Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-   2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+   2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+   Free Software Foundation, Inc.
 
    This file is part of the GNU Binutils.
 
@@ -164,7 +165,7 @@ gld_${EMULATION_NAME}_before_parse (void)
   ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
   output_filename = "${EXECUTABLE_NAME:-a.exe}";
 #ifdef DLL_SUPPORT
-  config.dynamic_link = TRUE;
+  input_flags.dynamic = TRUE;
   config.has_shared = 1;
 EOF
 
@@ -2093,7 +2094,7 @@ gld_${EMULATION_NAME}_open_dynamic_archive
   unsigned int i;
 
 
-  if (! entry->maybe_archive)
+  if (! entry->flags.maybe_archive)
     return FALSE;
 
   filename = entry->filename;
index e02ddcf5ea7b1526d624c3f13cbd0f793324609b..a24c30a9099ae80b71fce272d29755466608b477 100644 (file)
@@ -8,7 +8,7 @@ fi
 rm -f e${EMULATION_NAME}.c
 (echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
 fragment <<EOF
-/* Copyright 2006, 2007, 2008, 2009, 2010, 2011
+/* Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012
    Free Software Foundation, Inc.
    Written by Kai Tietz, OneVision Software GmbH&CoKg.
 
@@ -139,7 +139,7 @@ gld_${EMULATION_NAME}_before_parse (void)
   ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
   output_filename = "${EXECUTABLE_NAME:-a.exe}";
 #ifdef DLL_SUPPORT
-  config.dynamic_link = TRUE;
+  input_flags.dynamic = TRUE;
   config.has_shared = 1;
   link_info.pei386_auto_import = 1;
   link_info.pei386_runtime_pseudo_reloc = 2; /* Use by default version 2.  */
@@ -1830,7 +1830,7 @@ gld_${EMULATION_NAME}_open_dynamic_archive
   unsigned int i;
 
 
-  if (! entry->maybe_archive)
+  if (! entry->flags.maybe_archive)
     return FALSE;
 
   filename = entry->filename;
index 5b637e1c44c30b96c4947d2d74dca0f628e4c0b1..668b468b69b2b1954e7b322b91b82a58cb8bca75 100644 (file)
@@ -435,7 +435,7 @@ build_toc_list (lang_statement_union_type *statement)
     {
       asection *i = statement->input_section.section;
 
-      if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
+      if (!((lang_input_statement_type *) i->owner->usrdata)->flags.just_syms
          && (i->flags & SEC_EXCLUDE) == 0
          && i->output_section == toc_section)
        {
@@ -453,7 +453,7 @@ build_section_lists (lang_statement_union_type *statement)
     {
       asection *i = statement->input_section.section;
 
-      if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
+      if (!((lang_input_statement_type *) i->owner->usrdata)->flags.just_syms
          && (i->flags & SEC_EXCLUDE) == 0
          && i->output_section != NULL
          && i->output_section->owner == link_info.output_bfd)
index 897147e9d78b17dcf6d955bfb3069db581332a22..94aa5af17a15cbfa8b84f75e25c6beb555329241 100644 (file)
@@ -1,5 +1,5 @@
 # This shell script emits a C file. -*- C -*-
-#   Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+#   Copyright 2006, 2007, 2008, 2009, 2012 Free Software Foundation, Inc.
 #   Contributed by:
 #   Brain.lin (brain.lin@sunplusct.com)
 #   Mei Ligang (ligang@sunnorth.com.cn)
@@ -36,7 +36,7 @@ gld${EMULATION_NAME}_before_parse ()
 #ifndef TARGET_                        /* I.e., if not generic.  */
   ldfile_set_output_arch ("`echo ${ARCH}`", bfd_arch_unknown);
 #endif /* not TARGET_ */
-  config.dynamic_link = ${DYNAMIC_LINK-TRUE};
+  input_flags.dynamic = ${DYNAMIC_LINK-TRUE};
   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
 }
 
index 714d33d803374285e916de585296733270f37724..d3e3c70476d5fe087a9966658790efba4c206728 100644 (file)
@@ -1,5 +1,5 @@
 # This shell script emits a C file. -*- C -*-
-#   Copyright 2006, 2007, 2008, 2009, 2010, 2011
+#   Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012
 #   Free Software Foundation, Inc.
 #
 # This file is part of the GNU Binutils.
@@ -579,7 +579,7 @@ embedded_spu_file (lang_input_statement_type *entry, const char *flags)
 
   /* Ensure bfd sections are excluded from the output.  */
   bfd_section_list_clear (entry->the_bfd);
-  entry->loaded = TRUE;
+  entry->flags.loaded = TRUE;
   return TRUE;
 }
 
index 567b8e245052abe990db19863744b6d4711c2313..d7cd3e8352be383b391520ea6b145239354dfa38 100644 (file)
@@ -10,7 +10,8 @@ fragment <<EOF
 
 /* SunOS emulation code for ${EMULATION_NAME}
    Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-   2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+   2002, 2003, 2004, 2005, 2006, 2007, 2008, 2012
+   Free Software Foundation, Inc.
    Written by Steve Chamberlain <sac@cygnus.com>
    SunOS shared library support by Ian Lance Taylor <ian@cygnus.com>
 
@@ -85,7 +86,7 @@ static void
 gld${EMULATION_NAME}_before_parse (void)
 {
   ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
-  config.dynamic_link = TRUE;
+  input_flags.dynamic = TRUE;
   config.has_shared = TRUE;
 }
 
@@ -156,9 +157,9 @@ gld${EMULATION_NAME}_find_so (lang_input_statement_type *inp)
   char *alc;
   struct stat st;
 
-  if (! inp->search_dirs_flag
-      || ! inp->maybe_archive
-      || ! inp->dynamic)
+  if (! inp->flags.search_dirs
+      || ! inp->flags.maybe_archive
+      || ! inp->flags.dynamic)
     return;
 
   ASSERT (CONST_STRNEQ (inp->local_sym_name, "-l"));
@@ -188,7 +189,7 @@ gld${EMULATION_NAME}_find_so (lang_input_statement_type *inp)
 
   /* Turn off the search_dirs_flag to prevent ldfile_open_file from
      searching for this file again.  */
-  inp->search_dirs_flag = FALSE;
+  inp->flags.search_dirs = FALSE;
 
   free (found);
 
@@ -891,7 +892,7 @@ gld${EMULATION_NAME}_count_need (lang_input_statement_type *inp)
     {
       ++need_entries;
       need_size += NEED_ENTRY_SIZE;
-      if (! inp->maybe_archive)
+      if (! inp->flags.maybe_archive)
        need_size += strlen (inp->filename) + 1;
       else
        {
@@ -919,7 +920,7 @@ gld${EMULATION_NAME}_set_need (lang_input_statement_type *inp)
         referential locality.  */
       bfd_put_32 (link_info.output_bfd, need_pnames - need_contents,
                  need_pinfo);
-      if (! inp->maybe_archive)
+      if (! inp->flags.maybe_archive)
        {
          bfd_put_32 (link_info.output_bfd, (bfd_vma) 0, need_pinfo + 4);
          bfd_put_16 (link_info.output_bfd, (bfd_vma) 0, need_pinfo + 8);
index 6107c56870e859a1b839076604f641eb3d768551..164f2e19038506f447ec3bd6733faa9f7fa558f3 100644 (file)
@@ -1,5 +1,5 @@
 # This shell script emits a C file. -*- C -*-
-#   Copyright 2010
+#   Copyright 2010, 2012
 #   Free Software Foundation, Inc.
 #
 # This file is part of the GNU Binutils.
@@ -29,7 +29,7 @@ static void
 gld${EMULATION_NAME}_before_parse (void)
 {
   ldfile_set_output_arch ("${ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
-  config.dynamic_link = TRUE;
+  input_flags.dynamic = TRUE;
   config.has_shared = FALSE; /* Not yet.  */
 }
 
@@ -54,7 +54,7 @@ gld${EMULATION_NAME}_open_dynamic_archive (const char *arch ATTRIBUTE_UNUSED,
 {
   char *string;
 
-  if (! entry->maybe_archive)
+  if (! entry->flags.maybe_archive)
     return FALSE;
 
   string = (char *) xmalloc (strlen (search->name)
diff --git a/ld/ld.h b/ld/ld.h
index 9a7080c30f57da05f0b9c0559c58e3d26d7ccfed..f5e031be08a69d8998933d74e491a4b6aa87e7f4 100644 (file)
--- a/ld/ld.h
+++ b/ld/ld.h
@@ -250,9 +250,6 @@ typedef struct {
   bfd_boolean magic_demand_paged;
   bfd_boolean make_executable;
 
-  /* If TRUE, doing a dynamic link.  */
-  bfd_boolean dynamic_link;
-
   /* If TRUE, -shared is supported.  */
   /* ??? A better way to do this is perhaps to define this in the
      ld_emulation_xfer_struct since this is really a target dependent
index e9cb173672f9829590575984624874319306c884..b76f669be1f8618ce99df9788dfe872289e805fe 100644 (file)
@@ -72,27 +72,29 @@ static search_arch_type **search_arch_tail_ptr = &search_arch_head;
 static bfd_boolean
 is_sysrooted_pathname (const char *name, bfd_boolean notsame)
 {
-  char * realname = ld_canon_sysroot ? lrealpath (name) : NULL;
+  char *realname;
   int len;
   bfd_boolean result;
 
-  if (! realname)
+  if (ld_canon_sysroot == NULL)
     return FALSE;
 
+  realname = lrealpath (name);
   len = strlen (realname);
+  result = FALSE;
+  if (len == ld_canon_sysroot_len)
+    result = !notsame;
+  else if (len > ld_canon_sysroot_len
+          && IS_DIR_SEPARATOR (realname[ld_canon_sysroot_len]))
+    {
+      result = TRUE;
+      realname[ld_canon_sysroot_len] = '\0';
+    }
 
-  if (((! notsame && len == ld_canon_sysroot_len)
-       || (len >= ld_canon_sysroot_len
-          && IS_DIR_SEPARATOR (realname[ld_canon_sysroot_len])
-          && (realname[ld_canon_sysroot_len] = '\0') == '\0'))
-      && FILENAME_CMP (ld_canon_sysroot, realname) == 0)
-    result = TRUE;
-  else
-    result = FALSE;
-
-  if (realname)
-    free (realname);
+  if (result)
+    result = FILENAME_CMP (ld_canon_sysroot, realname) == 0;
 
+  free (realname);
   return result;
 }
 
@@ -164,7 +166,7 @@ ldfile_try_open_bfd (const char *attempt,
      checks out compatible, do not exit early returning TRUE, or
      the plugins will not get a chance to claim the file.  */
 
-  if (entry->search_dirs_flag || !entry->dynamic)
+  if (entry->flags.search_dirs || !entry->flags.dynamic)
     {
       bfd *check;
 
@@ -178,7 +180,7 @@ ldfile_try_open_bfd (const char *attempt,
          if (! bfd_check_format (check, bfd_object))
            {
              if (check == entry->the_bfd
-                 && entry->search_dirs_flag
+                 && entry->flags.search_dirs
                  && bfd_get_error () == bfd_error_file_not_recognized
                  && ! ldemul_unrecognized_file (entry))
                {
@@ -274,7 +276,7 @@ ldfile_try_open_bfd (const char *attempt,
              goto success;
            }
 
-         if (!entry->dynamic && (entry->the_bfd->flags & DYNAMIC) != 0)
+         if (!entry->flags.dynamic && (entry->the_bfd->flags & DYNAMIC) != 0)
            {
              einfo (_("%F%P: attempted static link of dynamic object `%s'\n"),
                     attempt);
@@ -283,7 +285,7 @@ ldfile_try_open_bfd (const char *attempt,
              return FALSE;
            }
 
-         if (entry->search_dirs_flag
+         if (entry->flags.search_dirs
              && !bfd_arch_get_compatible (check, link_info.output_bfd,
                                           command_line.accept_unknown_input_arch)
              /* XCOFF archives can have 32 and 64 bit objects.  */
@@ -348,9 +350,9 @@ ldfile_open_file_search (const char *arch,
 
   /* If this is not an archive, try to open it in the current
      directory first.  */
-  if (! entry->maybe_archive)
+  if (! entry->flags.maybe_archive)
     {
-      if (entry->sysrooted && IS_ABSOLUTE_PATH (entry->filename))
+      if (entry->flags.sysrooted && IS_ABSOLUTE_PATH (entry->filename))
        {
          char *name = concat (ld_sysroot, entry->filename,
                               (const char *) NULL);
@@ -363,8 +365,9 @@ ldfile_open_file_search (const char *arch,
        }
       else if (ldfile_try_open_bfd (entry->filename, entry))
        {
-         entry->sysrooted = IS_ABSOLUTE_PATH (entry->filename)
-           && is_sysrooted_pathname (entry->filename, TRUE);
+         entry->flags.sysrooted
+           = (IS_ABSOLUTE_PATH (entry->filename)
+              && is_sysrooted_pathname (entry->filename, TRUE));
          return TRUE;
        }
 
@@ -376,16 +379,16 @@ ldfile_open_file_search (const char *arch,
     {
       char *string;
 
-      if (entry->dynamic && ! link_info.relocatable)
+      if (entry->flags.dynamic && ! link_info.relocatable)
        {
          if (ldemul_open_dynamic_archive (arch, search, entry))
            {
-             entry->sysrooted = search->sysrooted;
+             entry->flags.sysrooted = search->sysrooted;
              return TRUE;
            }
        }
 
-      if (entry->maybe_archive)
+      if (entry->flags.maybe_archive)
        string = concat (search->name, slash, lib, entry->filename,
                         arch, suffix, (const char *) NULL);
       else
@@ -395,7 +398,7 @@ ldfile_open_file_search (const char *arch,
       if (ldfile_try_open_bfd (string, entry))
        {
          entry->filename = string;
-         entry->sysrooted = search->sysrooted;
+         entry->flags.sysrooted = search->sysrooted;
          return TRUE;
        }
 
@@ -416,7 +419,7 @@ ldfile_open_file (lang_input_statement_type *entry)
   if (entry->the_bfd != NULL)
     return;
 
-  if (! entry->search_dirs_flag)
+  if (! entry->flags.search_dirs)
     {
       if (ldfile_try_open_bfd (entry->filename, entry))
        return;
@@ -427,8 +430,8 @@ ldfile_open_file (lang_input_statement_type *entry)
       else
        einfo (_("%P: cannot find %s: %E\n"), entry->local_sym_name);
 
-      entry->missing_file = TRUE;
-      missing_file = TRUE;
+      entry->flags.missing_file = TRUE;
+      input_flags.missing_file = TRUE;
     }
   else
     {
@@ -454,18 +457,18 @@ ldfile_open_file (lang_input_statement_type *entry)
       /* If we have found the file, we don't need to search directories
         again.  */
       if (found)
-       entry->search_dirs_flag = FALSE;
+       entry->flags.search_dirs = FALSE;
       else
        {
-         if (entry->sysrooted
+         if (entry->flags.sysrooted
               && ld_sysroot
               && IS_ABSOLUTE_PATH (entry->local_sym_name))
            einfo (_("%P: cannot find %s inside %s\n"),
                   entry->local_sym_name, ld_sysroot);
          else
            einfo (_("%P: cannot find %s\n"), entry->local_sym_name);
-         entry->missing_file = TRUE;
-         missing_file = TRUE;
+         entry->flags.missing_file = TRUE;
+         input_flags.missing_file = TRUE;
        }
     }
 }
index b8b5008a13c7141dcc7e3e8dfbe69ce94bb8ed98..923ac0f8f44154c51ed6bce712820d9cfd1f89c8 100644 (file)
@@ -386,17 +386,20 @@ input_list:
                { lang_add_input_file($2,lang_input_file_is_l_enum,
                                 (char *)NULL); }
        |       AS_NEEDED '('
-                 { $<integer>$ = add_DT_NEEDED_for_regular; add_DT_NEEDED_for_regular = TRUE; }
+                 { $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
+                   input_flags.add_DT_NEEDED_for_regular = TRUE; }
                     input_list ')'
-                 { add_DT_NEEDED_for_regular = $<integer>3; }
+                 { input_flags.add_DT_NEEDED_for_regular = $<integer>3; }
        |       input_list ',' AS_NEEDED '('
-                 { $<integer>$ = add_DT_NEEDED_for_regular; add_DT_NEEDED_for_regular = TRUE; }
+                 { $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
+                   input_flags.add_DT_NEEDED_for_regular = TRUE; }
                     input_list ')'
-                 { add_DT_NEEDED_for_regular = $<integer>5; }
+                 { input_flags.add_DT_NEEDED_for_regular = $<integer>5; }
        |       input_list AS_NEEDED '('
-                 { $<integer>$ = add_DT_NEEDED_for_regular; add_DT_NEEDED_for_regular = TRUE; }
+                 { $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
+                   input_flags.add_DT_NEEDED_for_regular = TRUE; }
                     input_list ')'
-                 { add_DT_NEEDED_for_regular = $<integer>4; }
+                 { input_flags.add_DT_NEEDED_for_regular = $<integer>4; }
        ;
 
 sections:
index 1bffa937c6f7c1ddd5f4c75f8f4da02661d30c4a..650f4b79d2adb0dee09c8eaf0d6fb5fe477c4e10 100644 (file)
@@ -69,7 +69,6 @@ static struct bfd_hash_table lang_definedness_table;
 static lang_statement_list_type *stat_save[10];
 static lang_statement_list_type **stat_save_ptr = &stat_save[0];
 static struct unique_sections *unique_section_list;
-static bfd_boolean ldlang_sysrooted_script = FALSE;
 
 /* Forward declarations.  */
 static void exp_init_os (etree_type *);
@@ -100,6 +99,7 @@ lang_statement_list_type file_chain = { NULL, NULL };
 lang_statement_list_type input_file_chain;
 struct bfd_sym_chain entry_symbol = { NULL, NULL };
 const char *entry_section = ".text";
+struct lang_input_statement_flags input_flags;
 bfd_boolean entry_from_cmdline;
 bfd_boolean undef_from_cmdline;
 bfd_boolean lang_has_input_file = FALSE;
@@ -108,7 +108,6 @@ bfd_boolean lang_float_flag = FALSE;
 bfd_boolean delete_output_file_on_failure = FALSE;
 struct lang_phdr *lang_phdr_list;
 struct lang_nocrossrefs *nocrossref_list;
-bfd_boolean missing_file = FALSE;
 
  /* Functions that traverse the linker script and might evaluate
     DEFINED() need to increment this.  */
@@ -731,7 +730,7 @@ walk_wild_section (lang_wild_statement_type *ptr,
                   callback_t callback,
                   void *data)
 {
-  if (file->just_syms_flag)
+  if (file->flags.just_syms)
     return;
 
   (*ptr->walk_wild_section_handler) (ptr, file, callback, data);
@@ -1046,6 +1045,8 @@ new_afile (const char *name,
 {
   lang_input_statement_type *p;
 
+  lang_has_input_file = TRUE;
+
   if (add_to_list)
     p = (lang_input_statement_type *) new_stat (lang_input_statement, stat_ptr);
   else
@@ -1056,9 +1057,13 @@ new_afile (const char *name,
       p->header.next = NULL;
     }
 
-  lang_has_input_file = TRUE;
+  memset (&p->the_bfd, 0,
+         sizeof (*p) - offsetof (lang_input_statement_type, the_bfd));
   p->target = target;
-  p->sysrooted = FALSE;
+  p->flags.dynamic = input_flags.dynamic;
+  p->flags.add_DT_NEEDED_for_dynamic = input_flags.add_DT_NEEDED_for_dynamic;
+  p->flags.add_DT_NEEDED_for_regular = input_flags.add_DT_NEEDED_for_regular;
+  p->flags.whole_archive = input_flags.whole_archive;
 
   if (file_type == lang_input_file_is_l_enum
       && name[0] == ':' && name[1] != '\0')
@@ -1071,70 +1076,41 @@ new_afile (const char *name,
     {
     case lang_input_file_is_symbols_only_enum:
       p->filename = name;
-      p->maybe_archive = FALSE;
-      p->real = TRUE;
       p->local_sym_name = name;
-      p->just_syms_flag = TRUE;
-      p->search_dirs_flag = FALSE;
+      p->flags.real = TRUE;
+      p->flags.just_syms = TRUE;
       break;
     case lang_input_file_is_fake_enum:
       p->filename = name;
-      p->maybe_archive = FALSE;
-      p->real = FALSE;
       p->local_sym_name = name;
-      p->just_syms_flag = FALSE;
-      p->search_dirs_flag = FALSE;
       break;
     case lang_input_file_is_l_enum:
-      p->maybe_archive = TRUE;
       p->filename = name;
-      p->real = TRUE;
       p->local_sym_name = concat ("-l", name, (const char *) NULL);
-      p->just_syms_flag = FALSE;
-      p->search_dirs_flag = TRUE;
+      p->flags.maybe_archive = TRUE;
+      p->flags.real = TRUE;
+      p->flags.search_dirs = TRUE;
       break;
     case lang_input_file_is_marker_enum:
       p->filename = name;
-      p->maybe_archive = FALSE;
-      p->real = FALSE;
       p->local_sym_name = name;
-      p->just_syms_flag = FALSE;
-      p->search_dirs_flag = TRUE;
+      p->flags.search_dirs = TRUE;
       break;
     case lang_input_file_is_search_file_enum:
-      p->sysrooted = ldlang_sysrooted_script;
       p->filename = name;
-      p->maybe_archive = FALSE;
-      p->real = TRUE;
       p->local_sym_name = name;
-      p->just_syms_flag = FALSE;
-      p->search_dirs_flag = TRUE;
+      p->flags.real = TRUE;
+      p->flags.search_dirs = TRUE;
+      p->flags.sysrooted = input_flags.sysrooted;
       break;
     case lang_input_file_is_file_enum:
       p->filename = name;
-      p->maybe_archive = FALSE;
-      p->real = TRUE;
       p->local_sym_name = name;
-      p->just_syms_flag = FALSE;
-      p->search_dirs_flag = FALSE;
+      p->flags.real = TRUE;
       break;
     default:
       FAIL ();
     }
-  p->the_bfd = NULL;
-  p->next_real_file = NULL;
-  p->next = NULL;
-  p->dynamic = config.dynamic_link;
-  p->add_DT_NEEDED_for_dynamic = add_DT_NEEDED_for_dynamic;
-  p->add_DT_NEEDED_for_regular = add_DT_NEEDED_for_regular;
-  p->whole_archive = whole_archive;
-  p->loaded = FALSE;
-  p->missing_file = FALSE;
-#ifdef ENABLE_PLUGINS
-  p->claimed = FALSE;
-  p->claim_archive = FALSE;
-  p->reload = FALSE;
-#endif /* ENABLE_PLUGINS */
 
   lang_statement_append (&input_file_chain,
                         (lang_statement_union_type *) p,
@@ -2012,7 +1988,7 @@ lang_map (void)
       asection *s;
 
       if ((file->the_bfd->flags & (BFD_LINKER_CREATED | DYNAMIC)) != 0
-         || file->just_syms_flag)
+         || file->flags.just_syms)
        continue;
 
       for (s = file->the_bfd->sections; s != NULL; s = s->next)
@@ -2234,7 +2210,7 @@ section_already_linked (bfd *abfd, asection *sec, void *data)
 
   /* If we are only reading symbols from this object, then we want to
      discard all sections.  */
-  if (entry->just_syms_flag)
+  if (entry->flags.just_syms)
     {
       bfd_link_just_syms (abfd, sec, &link_info);
       return;
@@ -2619,7 +2595,7 @@ lookup_name (const char *name)
 
   /* If we have already added this file, or this file is not real
      don't add this file.  */
-  if (search->loaded || !search->real)
+  if (search->flags.loaded || !search->flags.real)
     return search;
 
   if (! load_symbols (search, NULL))
@@ -2697,23 +2673,20 @@ load_symbols (lang_input_statement_type *entry,
 {
   char **matching;
 
-  if (entry->loaded)
+  if (entry->flags.loaded)
     return TRUE;
 
   ldfile_open_file (entry);
 
   /* Do not process further if the file was missing.  */
-  if (entry->missing_file)
+  if (entry->flags.missing_file)
     return TRUE;
 
   if (! bfd_check_format (entry->the_bfd, bfd_archive)
       && ! bfd_check_format_matches (entry->the_bfd, bfd_object, &matching))
     {
       bfd_error_type err;
-      bfd_boolean save_ldlang_sysrooted_script;
-      bfd_boolean save_add_DT_NEEDED_for_regular;
-      bfd_boolean save_add_DT_NEEDED_for_dynamic;
-      bfd_boolean save_whole_archive;
+      struct lang_input_statement_flags save_flags;
 
       err = bfd_get_error ();
 
@@ -2739,30 +2712,26 @@ load_symbols (lang_input_statement_type *entry,
       entry->the_bfd = NULL;
 
       /* Try to interpret the file as a linker script.  */
+      save_flags = input_flags;
       ldfile_open_command_file (entry->filename);
 
       push_stat_ptr (place);
-      save_ldlang_sysrooted_script = ldlang_sysrooted_script;
-      ldlang_sysrooted_script = entry->sysrooted;
-      save_add_DT_NEEDED_for_regular = add_DT_NEEDED_for_regular;
-      add_DT_NEEDED_for_regular = entry->add_DT_NEEDED_for_regular;
-      save_add_DT_NEEDED_for_dynamic = add_DT_NEEDED_for_dynamic;
-      add_DT_NEEDED_for_dynamic = entry->add_DT_NEEDED_for_dynamic;
-      save_whole_archive = whole_archive;
-      whole_archive = entry->whole_archive;
+      input_flags.sysrooted = entry->flags.sysrooted;
+      input_flags.add_DT_NEEDED_for_regular
+       = entry->flags.add_DT_NEEDED_for_regular;
+      input_flags.add_DT_NEEDED_for_dynamic
+       = entry->flags.add_DT_NEEDED_for_dynamic;
+      input_flags.whole_archive = entry->flags.whole_archive;
+      input_flags.dynamic = entry->flags.dynamic;
 
       ldfile_assumed_script = TRUE;
       parser_input = input_script;
-      /* We want to use the same -Bdynamic/-Bstatic as the one for
-        ENTRY.  */
-      config.dynamic_link = entry->dynamic;
       yyparse ();
       ldfile_assumed_script = FALSE;
 
-      ldlang_sysrooted_script = save_ldlang_sysrooted_script;
-      add_DT_NEEDED_for_regular = save_add_DT_NEEDED_for_regular;
-      add_DT_NEEDED_for_dynamic = save_add_DT_NEEDED_for_dynamic;
-      whole_archive = save_whole_archive;
+      /* missing_file is sticky.  */
+      save_flags.missing_file |= input_flags.missing_file;
+      input_flags = save_flags;
       pop_stat_ptr ();
 
       return TRUE;
@@ -2782,7 +2751,7 @@ load_symbols (lang_input_statement_type *entry,
 
     case bfd_object:
 #ifdef ENABLE_PLUGINS
-      if (!entry->reload)
+      if (!entry->flags.reload)
 #endif
        ldlang_add_file (entry);
       if (trace_files || trace_file_tries)
@@ -2792,7 +2761,7 @@ load_symbols (lang_input_statement_type *entry,
     case bfd_archive:
       check_excluded_libs (entry->the_bfd);
 
-      if (entry->whole_archive)
+      if (entry->flags.whole_archive)
        {
          bfd *member = NULL;
          bfd_boolean loaded = TRUE;
@@ -2827,18 +2796,18 @@ load_symbols (lang_input_statement_type *entry,
                }
            }
 
-         entry->loaded = loaded;
+         entry->flags.loaded = loaded;
          return loaded;
        }
       break;
     }
 
   if (bfd_link_add_symbols (entry->the_bfd, &link_info))
-    entry->loaded = TRUE;
+    entry->flags.loaded = TRUE;
   else
     einfo (_("%F%B: could not read symbols: %E\n"), entry->the_bfd);
 
-  return entry->loaded;
+  return entry->flags.loaded;
 }
 
 /* Handle a wild statement.  S->FILENAME or S->SECTION_LIST or both
@@ -3022,7 +2991,7 @@ get_first_input_target (void)
   LANG_FOR_EACH_INPUT_STATEMENT (s)
     {
       if (s->header.type == lang_input_statement_enum
-         && s->real)
+         && s->flags.real)
        {
          ldfile_open_file (s);
 
@@ -3255,7 +3224,7 @@ open_input_bfds (lang_statement_union_type *s, enum open_bfd_mode mode)
          current_target = s->target_statement.target;
          break;
        case lang_input_statement_enum:
-         if (s->input_statement.real)
+         if (s->input_statement.flags.real)
            {
              lang_statement_union_type **os_tail;
              lang_statement_list_type add;
@@ -3271,22 +3240,22 @@ open_input_bfds (lang_statement_union_type *s, enum open_bfd_mode mode)
                  && ((mode & OPEN_BFD_RESCAN) == 0
                      || plugin_insert == NULL)
 #endif
-                 && !s->input_statement.whole_archive
-                 && s->input_statement.loaded
+                 && !s->input_statement.flags.whole_archive
+                 && s->input_statement.flags.loaded
                  && bfd_check_format (s->input_statement.the_bfd,
                                       bfd_archive))
-               s->input_statement.loaded = FALSE;
+               s->input_statement.flags.loaded = FALSE;
 #ifdef ENABLE_PLUGINS
              /* When rescanning, reload --as-needed shared libs.  */
              else if ((mode & OPEN_BFD_RESCAN) != 0
                       && plugin_insert == NULL
-                      && s->input_statement.loaded
-                      && s->input_statement.add_DT_NEEDED_for_regular
+                      && s->input_statement.flags.loaded
+                      && s->input_statement.flags.add_DT_NEEDED_for_regular
                       && ((s->input_statement.the_bfd->flags) & DYNAMIC) != 0
                       && plugin_should_reload (s->input_statement.the_bfd))
                {
-                 s->input_statement.loaded = FALSE;
-                 s->input_statement.reload = TRUE;
+                 s->input_statement.flags.loaded = FALSE;
+                 s->input_statement.flags.reload = TRUE;
                }
 #endif
 
@@ -3337,7 +3306,7 @@ open_input_bfds (lang_statement_union_type *s, enum open_bfd_mode mode)
     }
 
   /* Exit if any of the files were missing.  */
-  if (missing_file)
+  if (input_flags.missing_file)
     einfo ("%F");
 }
 
@@ -4648,7 +4617,7 @@ size_input_section
   lang_input_section_type *is = &((*this_ptr)->input_section);
   asection *i = is->section;
 
-  if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
+  if (!((lang_input_statement_type *) i->owner->usrdata)->flags.just_syms
       && (i->flags & SEC_EXCLUDE) == 0)
     {
       bfd_size_type alignment_needed;
@@ -5819,7 +5788,7 @@ lang_check (void)
     {
 #ifdef ENABLE_PLUGINS
       /* Don't check format of files claimed by plugin.  */
-      if (file->input_statement.claimed)
+      if (file->input_statement.flags.claimed)
        continue;
 #endif /* ENABLE_PLUGINS */
       input_bfd = file->input_statement.the_bfd;
@@ -6022,7 +5991,7 @@ lang_place_orphans (void)
              /* This section of the file is not attached, root
                 around for a sensible place for it to go.  */
 
-             if (file->just_syms_flag)
+             if (file->flags.just_syms)
                bfd_link_just_syms (file->the_bfd, s, &link_info);
              else if ((s->flags & SEC_EXCLUDE) != 0)
                s->output_section = bfd_abs_section_ptr;
@@ -6334,7 +6303,7 @@ lang_gc_sections (void)
        {
          asection *sec;
 #ifdef ENABLE_PLUGINS
-         if (f->claimed)
+         if (f->flags.claimed)
            continue;
 #endif
          for (sec = f->the_bfd->sections; sec != NULL; sec = sec->next)
@@ -6499,8 +6468,8 @@ find_replacements_insert_point (void)
        claim1 != NULL;
        claim1 = &claim1->next->input_statement)
     {
-      if (claim1->claimed)
-       return claim1->claim_archive ? lastobject : claim1;
+      if (claim1->flags.claimed)
+       return claim1->flags.claim_archive ? lastobject : claim1;
       /* Update lastobject if this is a real object file.  */
       if (claim1->the_bfd && (claim1->the_bfd->my_archive == NULL))
        lastobject = claim1;
@@ -6911,7 +6880,7 @@ lang_startup (const char *name)
     }
   first_file->filename = name;
   first_file->local_sym_name = name;
-  first_file->real = TRUE;
+  first_file->flags.real = TRUE;
 }
 
 void
index f37409c7b5f8a2fbbd0c456218e0ae787693a2b1..9ed3952c4b221d927a4f68451685e8b3ad791b23 100644 (file)
@@ -1,6 +1,6 @@
 /* ldlang.h - linker command language support
    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
    Free Software Foundation, Inc.
 
    This file is part of the GNU Binutils.
@@ -228,36 +228,16 @@ typedef struct
   bfd_vma output_offset;
 } lang_reloc_statement_type;
 
-typedef struct lang_input_statement_struct
+struct lang_input_statement_flags
 {
-  lang_statement_header_type header;
-  /* Name of this file.  */
-  const char *filename;
-  /* Name to use for the symbol giving address of text start.
-     Usually the same as filename, but for a file spec'd with
-     -l this is the -l switch itself rather than the filename.  */
-  const char *local_sym_name;
-
-  bfd *the_bfd;
-
-  struct flag_info *section_flag_list;
-
-  /* Point to the next file - whatever it is, wanders up and down
-     archives */
-  union lang_statement_union *next;
-
-  /* Point to the next file, but skips archive contents.  */
-  union lang_statement_union *next_real_file;
-
-  const char *target;
-
+  /* 1 means this file was specified in a -l option.  */
   unsigned int maybe_archive : 1;
 
   /* 1 means search a set of directories for this file.  */
-  unsigned int search_dirs_flag : 1;
+  unsigned int search_dirs : 1;
 
   /* 1 means this was found in a search directory marked as sysrooted,
-     if search_dirs_flag is false, otherwise, that it should be
+     if search_dirs is false, otherwise, that it should be
      searched in ld_sysroot before any other location, as long as it
      starts with a slash.  */
   unsigned int sysrooted : 1;
@@ -265,7 +245,7 @@ typedef struct lang_input_statement_struct
   /* 1 means this is base file of incremental load.
      Do not load this file's text or data.
      Also default text_start to after this file's bss.  */
-  unsigned int just_syms_flag : 1;
+  unsigned int just_syms : 1;
 
   /* Whether to search for this entry as a dynamic archive.  */
   unsigned int dynamic : 1;
@@ -300,7 +280,32 @@ typedef struct lang_input_statement_struct
   /* Set if reloading an --as-needed lib.  */
   unsigned int reload : 1;
 #endif /* ENABLE_PLUGINS */
+};
+
+typedef struct lang_input_statement_struct
+{
+  lang_statement_header_type header;
+  /* Name of this file.  */
+  const char *filename;
+  /* Name to use for the symbol giving address of text start.
+     Usually the same as filename, but for a file spec'd with
+     -l this is the -l switch itself rather than the filename.  */
+  const char *local_sym_name;
+
+  bfd *the_bfd;
+
+  struct flag_info *section_flag_list;
+
+  /* Point to the next file - whatever it is, wanders up and down
+     archives */
+  union lang_statement_union *next;
+
+  /* Point to the next file, but skips archive contents.  */
+  union lang_statement_union *next_real_file;
+
+  const char *target;
 
+  struct lang_input_statement_flags flags;
 } lang_input_statement_type;
 
 typedef struct
@@ -416,8 +421,6 @@ struct lang_phdr
   etree_type *flags;
 };
 
-extern struct lang_phdr *lang_phdr_list;
-
 /* This structure is used to hold a list of sections which may not
    cross reference each other.  */
 
@@ -435,8 +438,6 @@ struct lang_nocrossrefs
   lang_nocrossref_type *list;
 };
 
-extern struct lang_nocrossrefs *nocrossref_list;
-
 /* This structure is used to hold a list of input section names which
    will not match an output section in the linker script.  */
 
@@ -467,9 +468,12 @@ struct orphan_save
   lang_output_section_statement_type **os_tail;
 };
 
+extern struct lang_phdr *lang_phdr_list;
+extern struct lang_nocrossrefs *nocrossref_list;
 extern const char *output_target;
 extern lang_output_section_statement_type *abs_output_section;
 extern lang_statement_list_type lang_output_section_statement;
+extern struct lang_input_statement_flags input_flags;
 extern bfd_boolean lang_has_input_file;
 extern etree_type *base;
 extern lang_statement_list_type *stat_ptr;
@@ -482,7 +486,6 @@ extern lang_statement_list_type file_chain;
 extern lang_statement_list_type input_file_chain;
 
 extern int lang_statement_iteration;
-extern bfd_boolean missing_file;
 
 extern void lang_init
   (void);
index d006ed5d3e8ae4ce28fb095360fee09d24d2ea8d..b2810a725d970b908852e80fe3e45c5bb1a4608a 100644 (file)
@@ -95,18 +95,6 @@ bfd_boolean trace_file_tries;
    instead of complaining if no input files are given.  */
 bfd_boolean version_printed;
 
-/* Nonzero means link in every member of an archive.  */
-bfd_boolean whole_archive;
-
-/* True means only create DT_NEEDED entries for dynamic libraries
-   if they actually satisfy some reference in a regular object.  */
-bfd_boolean add_DT_NEEDED_for_regular;
-
-/* True means create DT_NEEDED entries for dynamic libraries that
-   are DT_NEEDED by dynamic libraries specifically mentioned on
-   the command line.  */
-bfd_boolean add_DT_NEEDED_for_dynamic;
-
 /* TRUE if we should demangle symbol names.  */
 bfd_boolean demangling;
 
@@ -767,9 +755,9 @@ add_archive_element (struct bfd_link_info *info,
          file.filesize = arelt_size (abfd);
          file.fd = fd;
          plugin_maybe_claim (&file, input);
-         if (input->claimed)
+         if (input->flags.claimed)
            {
-             input->claim_archive = TRUE;
+             input->flags.claim_archive = TRUE;
              *subsbfd = input->the_bfd;
            }
        }
index 57ce8d781131fbd871951bd7dfc15432a14b632d..527d3f2e51a15c6e256fd44a9143289a85dafa3d 100644 (file)
@@ -1,6 +1,6 @@
 /* ldmain.h -
    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2002, 2003, 2004,
-   2005, 2007, 2008, 2009 Free Software Foundation, Inc.
+   2005, 2007, 2008, 2009, 2012 Free Software Foundation, Inc.
 
    This file is part of the GNU Binutils.
 
@@ -33,9 +33,6 @@ extern char *default_target;
 extern bfd_boolean trace_files;
 extern bfd_boolean trace_file_tries;
 extern bfd_boolean version_printed;
-extern bfd_boolean whole_archive;
-extern bfd_boolean add_DT_NEEDED_for_regular;
-extern bfd_boolean add_DT_NEEDED_for_dynamic;
 extern bfd_boolean demangling;
 extern int g_switch_value;
 extern const char *output_filename;
index 481fef46170296ff1465db6cf52f493c54e2095a..911149e2e4adb2e9f2a93cb5b1c4fd01a98f304e 100644 (file)
@@ -241,7 +241,7 @@ build_link_order (lang_statement_union_type *statement)
           attached */
        asection *i = statement->input_section.section;
 
-       if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
+       if (!((lang_input_statement_type *) i->owner->usrdata)->flags.just_syms
            && (i->flags & SEC_EXCLUDE) == 0)
          {
            asection *output_section = i->output_section;
index 7c1bc46fecb4b2e2dcb3c717365f880355d05561..490f79c52d46675c4d21b9f4d443be4f8a209806 100644 (file)
@@ -775,10 +775,10 @@ parse_args (unsigned argc, char **argv)
             ``use only shared libraries'' but, then, we don't
             currently support shared libraries on HP/UX anyhow.  */
          if (strcmp (optarg, "archive") == 0)
-           config.dynamic_link = FALSE;
+           input_flags.dynamic = FALSE;
          else if (strcmp (optarg, "shared") == 0
                   || strcmp (optarg, "default") == 0)
-           config.dynamic_link = TRUE;
+           input_flags.dynamic = TRUE;
          else
            einfo (_("%P%F: unrecognized -a option `%s'\n"), optarg);
          break;
@@ -807,10 +807,10 @@ parse_args (unsigned argc, char **argv)
          yyparse ();
          break;
        case OPTION_CALL_SHARED:
-         config.dynamic_link = TRUE;
+         input_flags.dynamic = TRUE;
          break;
        case OPTION_NON_SHARED:
-         config.dynamic_link = FALSE;
+         input_flags.dynamic = FALSE;
          break;
        case OPTION_CREF:
          command_line.cref = TRUE;
@@ -934,17 +934,17 @@ parse_args (unsigned argc, char **argv)
        case 'N':
          config.text_read_only = FALSE;
          config.magic_demand_paged = FALSE;
-         config.dynamic_link = FALSE;
+         input_flags.dynamic = FALSE;
          break;
        case OPTION_NO_OMAGIC:
          config.text_read_only = TRUE;
          config.magic_demand_paged = TRUE;
-         /* NB/ Does not set dynamic_link to TRUE.
+         /* NB/ Does not set input_flags.dynamic to TRUE.
             Use --call-shared or -Bdynamic for this.  */
          break;
        case 'n':
          config.magic_demand_paged = FALSE;
-         config.dynamic_link = FALSE;
+         input_flags.dynamic = FALSE;
          break;
        case OPTION_NO_DEFINE_COMMON:
          command_line.inhibit_common_definition = TRUE;
@@ -1040,7 +1040,7 @@ parse_args (unsigned argc, char **argv)
          config.only_cmd_line_lib_dirs = TRUE;
          break;
        case OPTION_NO_WHOLE_ARCHIVE:
-         whole_archive = FALSE;
+         input_flags.whole_archive = FALSE;
          break;
        case 'O':
          /* FIXME "-O<non-digits> <value>" used to set the address of
@@ -1092,7 +1092,7 @@ parse_args (unsigned argc, char **argv)
          config.build_constructors = FALSE;
          config.magic_demand_paged = FALSE;
          config.text_read_only = FALSE;
-         config.dynamic_link = FALSE;
+         input_flags.dynamic = FALSE;
          break;
        case 'R':
          /* The GNU linker traditionally uses -R to mean to include
@@ -1313,7 +1313,7 @@ parse_args (unsigned argc, char **argv)
          config.build_constructors = TRUE;
          config.magic_demand_paged = FALSE;
          config.text_read_only = FALSE;
-         config.dynamic_link = FALSE;
+         input_flags.dynamic = FALSE;
          break;
        case 'u':
          ldlang_add_undef (optarg, TRUE);
@@ -1437,19 +1437,19 @@ parse_args (unsigned argc, char **argv)
          link_info.warn_alternate_em = TRUE;
          break;
        case OPTION_WHOLE_ARCHIVE:
-         whole_archive = TRUE;
+         input_flags.whole_archive = TRUE;
          break;
        case OPTION_ADD_DT_NEEDED_FOR_DYNAMIC:
-         add_DT_NEEDED_for_dynamic = TRUE;
+         input_flags.add_DT_NEEDED_for_dynamic = TRUE;
          break;
        case OPTION_NO_ADD_DT_NEEDED_FOR_DYNAMIC:
-         add_DT_NEEDED_for_dynamic = FALSE;
+         input_flags.add_DT_NEEDED_for_dynamic = FALSE;
          break;
        case OPTION_ADD_DT_NEEDED_FOR_REGULAR:
-         add_DT_NEEDED_for_regular = TRUE;
+         input_flags.add_DT_NEEDED_for_regular = TRUE;
          break;
        case OPTION_NO_ADD_DT_NEEDED_FOR_REGULAR:
-         add_DT_NEEDED_for_regular = FALSE;
+         input_flags.add_DT_NEEDED_for_regular = FALSE;
          break;
        case OPTION_WRAP:
          add_wrap (optarg);
index 91fe48b9f27135a219598343d562b39c78e60d0d..2515888878d083744925ef218eeaf5b164702580 100644 (file)
@@ -1,5 +1,5 @@
 /* Plugin control for the GNU linker.
-   Copyright 2010, 2011 Free Software Foundation, Inc.
+   Copyright 2010, 2011, 2012 Free Software Foundation, Inc.
 
    This file is part of the GNU Binutils.
 
@@ -262,7 +262,7 @@ is_ir_dummy_bfd (const bfd *abfd)
      when processing DT_NEEDED dependencies.  */
   return (abfd
          && abfd->usrdata
-         && ((lang_input_statement_type *)(abfd->usrdata))->claimed);
+         && ((lang_input_statement_type *)(abfd->usrdata))->flags.claimed);
 }
 
 /* Helpers to convert between BFD and GOLD symbol formats.  */
@@ -873,7 +873,7 @@ plugin_maybe_claim (struct ld_plugin_input_file *file,
       if (entry->the_bfd->my_archive == NULL)
        bfd_close (entry->the_bfd);
       entry->the_bfd = file->handle;
-      entry->claimed = TRUE;
+      entry->flags.claimed = TRUE;
       bfd_make_readable (entry->the_bfd);
     }
   else
@@ -881,7 +881,7 @@ plugin_maybe_claim (struct ld_plugin_input_file *file,
       /* If plugin didn't claim the file, we don't need the dummy bfd.
         Can't avoid speculatively creating it, alas.  */
       bfd_close_all_done (file->handle);
-      entry->claimed = FALSE;
+      entry->flags.claimed = FALSE;
     }
 }