aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog9
-rw-r--r--ld/ld.118
-rw-r--r--ld/ld.texinfo17
-rw-r--r--ld/ldlang.c3
-rw-r--r--ld/ldlang.h46
-rw-r--r--ld/lexsup.c46
6 files changed, 107 insertions, 32 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index abf98c1..3d16ef3 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -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
--- 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
diff --git a/ld/ld.texinfo b/ld/ld.texinfo
index 10d1c26..811bcd2 100644
--- a/ld/ld.texinfo
+++ b/ld/ld.texinfo
@@ -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
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 4dedd98..2c67d27 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -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);
diff --git a/ld/ldlang.h b/ld/ldlang.h
index 5e05017..3d6a6f3 100644
--- a/ld/ldlang.h
+++ b/ld/ldlang.h
@@ -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
diff --git a/ld/lexsup.c b/ld/lexsup.c
index 96babdd..1e5d5dc 100644
--- a/ld/lexsup.c
+++ b/ld/lexsup.c
@@ -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;