From 3c8deccc4f0e767b9fe362665ae904c53cac0f71 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 27 Feb 1996 17:59:46 +0000 Subject: [PATCH] * 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. PR 9094. --- ld/ChangeLog | 9 +++++++++ ld/ld.1 | 18 +++++++++++++----- ld/ld.texinfo | 17 +++++++++++------ ld/ldlang.c | 3 ++- ld/ldlang.h | 46 ++++++++++++++++++++++++++++++++++++++++++---- ld/lexsup.c | 46 ++++++++++++++++++++++++++++++---------------- 6 files changed, 107 insertions(+), 32 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index abf98c17e7e..3d16ef38293 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,12 @@ +Tue Feb 27 12:55:46 1996 Ian Lance Taylor + + * 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 * configure.tgt: Correct gldi960 to gld960. diff --git a/ld/ld.1 b/ld/ld.1 index cb0bf978d3d..322c4cf3e8e 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 10d1c26558c..811bcd2670a 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 4dedd9886ff..2c67d274f92 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 5e050170627..3d6a6f3b886 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 96babdd30e2..1e5d5dcb037 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 " used to set the address of section . 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; -- 2.30.2