* lexsup.c (parse_args): Recognize --no-whole-archive.
authorIan Lance Taylor <ian@airs.com>
Tue, 27 Feb 1996 17:59:46 +0000 (17:59 +0000)
committerIan Lance Taylor <ian@airs.com>
Tue, 27 Feb 1996 17:59:46 +0000 (17:59 +0000)
* ldlang.h (lang_input_statement_type): Add whole_archive field.
* ldlang.c (new_afile): Set whole_archive field.
(load_symbols): Check input file specific whole_archive field
rather than global variable.
* ld.texinfo, ld.1: Document --no-whole-archive.
PR 9094.

ld/ChangeLog
ld/ld.1
ld/ld.texinfo
ld/ldlang.c
ld/ldlang.h
ld/lexsup.c

index abf98c1..3d16ef3 100644 (file)
@@ -1,3 +1,12 @@
+Tue Feb 27 12:55:46 1996  Ian Lance Taylor  <ian@cygnus.com>
+
+       * lexsup.c (parse_args): Recognize --no-whole-archive.
+       * ldlang.h (lang_input_statement_type): Add whole_archive field.
+       * ldlang.c (new_afile): Set whole_archive field.
+       (load_symbols): Check input file specific whole_archive field
+       rather than global variable.
+       * ld.texinfo, ld.1: Document --no-whole-archive.
+
 Tue Feb 20 16:07:00 1996  Ian Lance Taylor  <ian@cygnus.com>
 
        * configure.tgt: Correct gldi960 to gld960.
diff --git a/ld/ld.1 b/ld/ld.1
index cb0bf97..322c4cf 100644 (file)
--- a/ld/ld.1
+++ b/ld/ld.1
@@ -121,6 +121,7 @@ ld \- the GNU linker
 .RB "[\|" \-warn\-constructors "\|]" 
 .RB "[\|" \-warn\-once "\|]" 
 .RB "[\|" \-\-whole\-archive "\|]" 
+.RB "[\|" \-\-no\-whole\-archive "\|]" 
 .RB "[\|" \-X "\|]" 
 .RB "[\|" \-x "\|]" 
 .ad b
@@ -913,11 +914,18 @@ which refers to it.
 
 .TP
 .B \-\-whole\-archive
-For each archive mentioned on the command line, include every object
-file in the archive in the link, rather than searching the archive for
-the required object files.  This is normally used to turn an archive
-file into a shared library, forcing every object to be included in the
-resulting shared library.
+For each archive mentioned on the command line after the
+.B \-\-whole\-archive
+option, include every object file in the archive in the link, rather
+than searching the archive for the required object files.  This is
+normally used to turn an archive file into a shared library, forcing
+every object to be included in the resulting shared library.
+
+.TP
+.B \-\-no\-whole\-archive
+Turn off the effect of the
+.B \-\-whole\-archive
+option for archives which appear later on the command line.
 
 .TP
 .B \-X 
index 10d1c26..811bcd2 100644 (file)
@@ -189,7 +189,7 @@ ld [ -o @var{output} ]  @var{objfile}@dots{}
   [ -( [ archives ] -) ]
   [ --start-group [ archives ] --end-group ]
   [ -split-by-reloc @var{count} ] [ -split-by-file ]
-  [ --whole-archive ]
+  [ --whole-archive ] [ --no-whole-archive ]
 @end smallexample
 
 This plethora of command-line options may seem intimidating, but in
@@ -941,11 +941,16 @@ which refers to it.
 
 @kindex --whole-archive
 @cindex including an entire archive
-For each archive mentioned on the command line, include every object
-file in the archive in the link, rather than searching the archive for
-the required object files.  This is normally used to turn an archive
-file into a shared library, forcing every object to be included in the
-resulting shared library.
+For each archive mentioned on the command line after the
+@code{--whole-archive} option, include every object file in the archive
+in the link, rather than searching the archive for the required object
+files.  This is normally used to turn an archive file into a shared
+library, forcing every object to be included in the resulting shared
+library.
+
+@kindex --no-whole-archive
+Turn off the effect of the @code{--whole-archive} option for archives
+which appear later on the command line.
 
 @kindex -X
 @cindex local symbols, deleting
index 4dedd98..2c67d27 100644 (file)
@@ -373,6 +373,7 @@ new_afile (name, file_type, target, add_to_list)
   p->symbol_count = 0;
   p->common_output_section = (asection *) NULL;
   p->dynamic = config.dynamic_link;
+  p->whole_archive = whole_archive;
   p->loaded = false;
   lang_statement_append (&input_file_chain,
                         (lang_statement_union_type *) p,
@@ -827,7 +828,7 @@ load_symbols (entry, place)
       break;
 
     case bfd_archive:
-      if (whole_archive)
+      if (entry->whole_archive)
        {
          bfd *member = bfd_openr_next_archived_file (entry->the_bfd,
                                                      (bfd *) NULL);
index 5e05017..3d6a6f3 100644 (file)
@@ -97,6 +97,16 @@ typedef struct lang_output_statement_struct
 } lang_output_statement_type;
 
 
+/* This structure holds a list of program headers describing segments
+   in which this section should be placed.  */
+
+struct lang_output_section_phdr_list
+{
+  struct lang_output_section_phdr_list *next;
+  const char *name;
+  boolean used;
+};
+
 typedef struct lang_output_section_statement_struct 
 {
   lang_statement_header_type header;
@@ -118,7 +128,9 @@ typedef struct lang_output_section_statement_struct
   int subsection_alignment;  /* alignment of components */
   int section_alignment;  /* alignment of start of section */
 
-  union etree_union *load_base;  
+  union etree_union *load_base;
+
+  struct lang_output_section_phdr_list *phdrs;
 } lang_output_section_statement_type;
 
 
@@ -219,10 +231,15 @@ typedef struct lang_input_statement_struct
      Also default text_start to after this file's bss. */
     
   boolean just_syms_flag;
-    
+
+  /* Whether to search for this entry as a dynamic archive.  */
+  boolean dynamic;
+
+  /* Whether to include the entire contents of an archive.  */
+  boolean whole_archive;
+
   boolean loaded;
     
-    
   /*    unsigned int globals_in_this_file;*/
   const char *target;
   boolean real;
@@ -304,12 +321,29 @@ typedef union lang_statement_union
   lang_group_statement_type group_statement;
 } lang_statement_union_type;
 
+/* This structure holds information about a program header, from the
+   PHDRS command in the linker script.  */
+
+struct lang_phdr
+{
+  struct lang_phdr *next;
+  const char *name;
+  unsigned long type;
+  boolean filehdr;
+  boolean phdrs;
+  etree_type *at;
+  etree_type *flags;
+};
+
 extern lang_output_section_statement_type *abs_output_section;
 extern boolean lang_has_input_file;
 extern etree_type *base;
 extern lang_statement_list_type *stat_ptr;
 extern boolean delete_output_file_on_failure;
 
+extern const char *entry_symbol;
+extern boolean entry_from_cmdline;
+
 extern void lang_init PARAMS ((void));
 extern struct memory_region_struct *lang_memory_region_lookup
   PARAMS ((const char *const));
@@ -327,7 +361,7 @@ extern void lang_enter_output_section_statement
 extern void lang_final PARAMS ((void));
 extern void lang_process PARAMS ((void));
 extern void lang_section_start PARAMS ((const char *, union etree_union *));
-extern void lang_add_entry PARAMS ((const char *, int));
+extern void lang_add_entry PARAMS ((const char *, boolean));
 extern void lang_add_target PARAMS ((const char *));
 extern void lang_add_wild PARAMS ((const char *const , const char *const));
 extern void lang_add_map PARAMS ((const char *));
@@ -393,5 +427,9 @@ extern void wild_doit
   PARAMS ((lang_statement_list_type *ptr, asection *section,
           lang_output_section_statement_type *output,
           lang_input_statement_type *file));
+extern void lang_new_phdr
+  PARAMS ((const char *, etree_type *, boolean, boolean, etree_type *,
+          etree_type *));
+extern void lang_section_in_phdr PARAMS ((const char *));
 
 #endif
index 96babdd..1e5d5dc 100644 (file)
@@ -65,7 +65,7 @@ parse_args (argc, argv)
      as if it were the argument of an option with character code 1.  */
 
   const char *shortopts =
-    "-a:A:B::b:c:de:F::G:gh:iL:l:Mm:NnO:o:R:rSsT:tu:VvXxY:y:z:()";
+    "-a:A:b:c:de:F::G:gh:iL:l:Mm:NnO:o:R:rSsT:tu:VvXxY:y:z:()";
 
   /* 150 isn't special; it's just an arbitrary non-ASCII char value.  */
 
@@ -83,11 +83,13 @@ parse_args (argc, argv)
 #define OPTION_NO_KEEP_MEMORY          (OPTION_MAP + 1)
 #define OPTION_NOINHIBIT_EXEC          (OPTION_NO_KEEP_MEMORY + 1)
 #define OPTION_NON_SHARED              (OPTION_NOINHIBIT_EXEC + 1)
-#define OPTION_OFORMAT                 (OPTION_NON_SHARED + 1)
+#define OPTION_NO_WHOLE_ARCHIVE                (OPTION_NON_SHARED + 1)
+#define OPTION_OFORMAT                 (OPTION_NO_WHOLE_ARCHIVE + 1)
 #define OPTION_RELAX                   (OPTION_OFORMAT + 1)
 #define OPTION_RETAIN_SYMBOLS_FILE     (OPTION_RELAX + 1)
 #define OPTION_RPATH                   (OPTION_RETAIN_SYMBOLS_FILE + 1)
-#define OPTION_SHARED                  (OPTION_RPATH + 1)
+#define OPTION_RPATH_LINK              (OPTION_RPATH + 1)
+#define OPTION_SHARED                  (OPTION_RPATH_LINK + 1)
 #define OPTION_SONAME                  (OPTION_SHARED + 1)
 #define OPTION_SORT_COMMON             (OPTION_SONAME + 1)
 #define OPTION_STATS                   (OPTION_SORT_COMMON + 1)
@@ -130,6 +132,7 @@ parse_args (argc, argv)
     {"help", no_argument, NULL, OPTION_HELP},
     {"Map", required_argument, NULL, OPTION_MAP},
     {"no-keep-memory", no_argument, NULL, OPTION_NO_KEEP_MEMORY},
+    {"no-whole-archive", no_argument, NULL, OPTION_NO_WHOLE_ARCHIVE},
     {"noinhibit-exec", no_argument, NULL, OPTION_NOINHIBIT_EXEC},
     {"noinhibit_exec", no_argument, NULL, OPTION_NOINHIBIT_EXEC},
     {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
@@ -139,6 +142,7 @@ parse_args (argc, argv)
     {"relax", no_argument, NULL, OPTION_RELAX},
     {"retain-symbols-file", required_argument, NULL, OPTION_RETAIN_SYMBOLS_FILE},
     {"rpath", required_argument, NULL, OPTION_RPATH},
+    {"rpath-link", required_argument, NULL, OPTION_RPATH_LINK},
     {"shared", no_argument, NULL, OPTION_SHARED},
     {"soname", required_argument, NULL, OPTION_SONAME},
     {"sort-common", no_argument, NULL, OPTION_SORT_COMMON},
@@ -219,8 +223,7 @@ parse_args (argc, argv)
            einfo ("%P%F: unrecognized -a option `%s'\n", optarg);
          break;
        case OPTION_ASSERT:
-         /* FIXME: We just ignore these, except for pure-text, but we
-             should handle them.  */
+         /* FIXME: We just ignore these, but we should handle them.  */
          if (strcmp (optarg, "definitions") == 0)
            ;
          else if (strcmp (optarg, "nodefinitions") == 0)
@@ -228,16 +231,7 @@ parse_args (argc, argv)
          else if (strcmp (optarg, "nosymbolic") == 0)
            ;
          else if (strcmp (optarg, "pure-text") == 0)
-           {
-             /* FIXME: This is wrong.  We do it this way as a hack to
-                 support SunOS4, on which gcc -shared will pass
-                 -assert pure-text to the linker.  The SunOS linker
-                 will automatically create a shared library if there
-                 are any undefined symbols, but our linker does not
-                 know how to do that (it seems to require an extra
-                 pass over the relocs).  */
-             link_info.shared = true;
-           }
+           ;
          else
            einfo ("%P%F: unrecognized -assert option `%s'\n", optarg);
          break;
@@ -286,7 +280,7 @@ parse_args (argc, argv)
          command_line.export_dynamic = true;
          break;
        case 'e':
-         lang_add_entry (optarg, 1);
+         lang_add_entry (optarg, true);
          break;
        case 'F':
          /* Ignore.  */
@@ -325,9 +319,11 @@ parse_args (argc, argv)
        case 'N':
          config.text_read_only = false;
          config.magic_demand_paged = false;
+         config.dynamic_link = false;
          break;
        case 'n':
          config.magic_demand_paged = false;
+         config.dynamic_link = false;
          break;
        case OPTION_NO_KEEP_MEMORY:
          link_info.keep_memory = false;
@@ -335,6 +331,9 @@ parse_args (argc, argv)
        case OPTION_NOINHIBIT_EXEC:
          force_make_executable = true;
          break;
+       case OPTION_NO_WHOLE_ARCHIVE:
+         whole_archive = false;
+         break;
        case 'O':
          /* FIXME "-O<non-digits> <value>" used to set the address of
             section <non-digits>.  Was this for compatibility with
@@ -392,6 +391,21 @@ parse_args (argc, argv)
              command_line.rpath = buf;
            }
          break;
+       case OPTION_RPATH_LINK:
+         if (command_line.rpath_link == NULL)
+           command_line.rpath_link = buystring (optarg);
+         else
+           {
+             char *buf;
+
+             buf = xmalloc (strlen (command_line.rpath_link)
+                            + strlen (optarg)
+                            + 2);
+             sprintf (buf, "%s:%s", command_line.rpath_link, optarg);
+             free (command_line.rpath_link);
+             command_line.rpath_link = buf;
+           }
+         break;
        case OPTION_RELAX:
          command_line.relax = true;
          break;