diff options
Diffstat (limited to 'contrib/binutils/ld/ldmain.c')
-rw-r--r-- | contrib/binutils/ld/ldmain.c | 128 |
1 files changed, 64 insertions, 64 deletions
diff --git a/contrib/binutils/ld/ldmain.c b/contrib/binutils/ld/ldmain.c index fbc3081..354c41a 100644 --- a/contrib/binutils/ld/ldmain.c +++ b/contrib/binutils/ld/ldmain.c @@ -1,6 +1,6 @@ /* Main program of GNU linker. Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, - 2002, 2003, 2004, 2005, 2006 + 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. Written by Steve Chamberlain steve@cygnus.com @@ -21,9 +21,8 @@ Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ -#include "bfd.h" #include "sysdep.h" -#include <stdio.h> +#include "bfd.h" #include "safe-ctype.h" #include "libiberty.h" #include "progress.h" @@ -161,7 +160,10 @@ static struct bfd_link_callbacks link_callbacks = reloc_dangerous, unattached_reloc, notice, - einfo + einfo, + info_msg, + minfo, + ldlang_override_segment_assignment }; struct bfd_link_info link_info; @@ -240,25 +242,17 @@ main (int argc, char **argv) } #endif - /* Initialize the data about options. */ - trace_files = trace_file_tries = version_printed = FALSE; - whole_archive = FALSE; config.build_constructors = TRUE; - config.dynamic_link = FALSE; - config.has_shared = FALSE; + config.rpath_separator = ':'; config.split_by_reloc = (unsigned) -1; config.split_by_file = (bfd_size_type) -1; - config.hash_table_size = 0; - command_line.force_common_definition = FALSE; - command_line.inhibit_common_definition = FALSE; - command_line.interpreter = NULL; - command_line.rpath = NULL; + config.make_executable = TRUE; + config.magic_demand_paged = TRUE; + config.text_read_only = TRUE; + command_line.warn_mismatch = TRUE; + command_line.warn_search_mismatch = TRUE; command_line.check_section_addresses = TRUE; - command_line.accept_unknown_input_arch = FALSE; - command_line.reduce_memory_overheads = FALSE; - - sort_section = none; /* We initialize DEMANGLING based on the environment variable COLLECT_NO_DEMANGLE. The gcc collect2 program will demangle the @@ -267,63 +261,22 @@ main (int argc, char **argv) interface by default. */ demangling = getenv ("COLLECT_NO_DEMANGLE") == NULL; - link_info.relocatable = FALSE; - link_info.emitrelocations = FALSE; - link_info.task_link = FALSE; - link_info.shared = FALSE; - link_info.pie = FALSE; - link_info.executable = FALSE; - link_info.symbolic = FALSE; - link_info.export_dynamic = FALSE; - link_info.static_link = FALSE; - link_info.traditional_format = FALSE; - link_info.optimize = FALSE; - link_info.unresolved_syms_in_objects = RM_NOT_YET_SET; - link_info.unresolved_syms_in_shared_libs = RM_NOT_YET_SET; - link_info.allow_multiple_definition = FALSE; link_info.allow_undefined_version = TRUE; - link_info.create_default_symver = FALSE; - link_info.default_imported_symver = FALSE; link_info.keep_memory = TRUE; - link_info.notice_all = FALSE; - link_info.nocopyreloc = FALSE; - link_info.new_dtags = FALSE; link_info.combreloc = TRUE; - link_info.eh_frame_hdr = FALSE; - link_info.relro = FALSE; link_info.strip_discarded = TRUE; - link_info.strip = strip_none; - link_info.discard = discard_sec_merge; - link_info.common_skip_ar_aymbols = bfd_link_common_skip_none; + link_info.emit_hash = TRUE; link_info.callbacks = &link_callbacks; - link_info.hash = NULL; - link_info.keep_hash = NULL; - link_info.notice_hash = NULL; - link_info.wrap_hash = NULL; - link_info.input_bfds = NULL; - link_info.create_object_symbols_section = NULL; - link_info.gc_sym_list = NULL; - link_info.base_file = NULL; + link_info.input_bfds_tail = &link_info.input_bfds; /* SVR4 linkers seem to set DT_INIT and DT_FINI based on magic _init and _fini symbols. We are compatible. */ link_info.init_function = "_init"; link_info.fini_function = "_fini"; + link_info.relax_pass = 1; link_info.pei386_auto_import = -1; - link_info.pei386_runtime_pseudo_reloc = FALSE; link_info.spare_dynamic_tags = 5; - link_info.flags = 0; - link_info.flags_1 = 0; - link_info.relax_pass = 1; - link_info.warn_shared_textrel = FALSE; - link_info.gc_sections = FALSE; ldfile_add_arch (""); - - config.make_executable = TRUE; - force_make_executable = FALSE; - config.magic_demand_paged = TRUE; - config.text_read_only = TRUE; - emulation = get_emulation (argc, argv); ldemul_choose_mode (emulation); default_target = ldemul_choose_target (argc, argv); @@ -347,6 +300,43 @@ main (int argc, char **argv) einfo (_("%P%F: -r and -shared may not be used together\n")); } + /* We may have -Bsymbolic, -Bsymbolic-functions, --dynamic-list-data, + --dynamic-list-cpp-new, --dynamic-list-cpp-typeinfo and + --dynamic-list FILE. -Bsymbolic and -Bsymbolic-functions are + for shared libraries. -Bsymbolic overrides all others and vice + versa. */ + switch (command_line.symbolic) + { + case symbolic_unset: + break; + case symbolic: + /* -Bsymbolic is for shared library only. */ + if (link_info.shared) + { + link_info.symbolic = TRUE; + /* Should we free the unused memory? */ + link_info.dynamic_list = NULL; + command_line.dynamic_list = dynamic_list_unset; + } + break; + case symbolic_functions: + /* -Bsymbolic-functions is for shared library only. */ + if (link_info.shared) + command_line.dynamic_list = dynamic_list_data; + break; + } + + switch (command_line.dynamic_list) + { + case dynamic_list_unset: + break; + case dynamic_list_data: + link_info.dynamic_data = TRUE; + case dynamic_list: + link_info.dynamic = TRUE; + break; + } + if (! link_info.shared) { if (command_line.filter_shlib) @@ -372,6 +362,16 @@ main (int argc, char **argv) the -L's in argv have been processed. */ set_scripts_dir (); + /* If we have not already opened and parsed a linker script, + try the default script from command line first. */ + if (saved_script_handle == NULL + && command_line.default_script != NULL) + { + ldfile_open_command_file (command_line.default_script); + parser_input = input_script; + yyparse (); + } + /* If we have not already opened and parsed a linker script read the emulation's appropriate default script. */ if (saved_script_handle == NULL) @@ -594,7 +594,7 @@ get_sysroot (int argc, char **argv) const char *path; for (i = 1; i < argc; i++) - if (strncmp (argv[i], "--sysroot=", strlen ("--sysroot=")) == 0) + if (CONST_STRNEQ (argv[i], "--sysroot=")) return argv[i] + strlen ("--sysroot="); path = get_relative_sysroot (BINDIR); @@ -623,7 +623,7 @@ get_emulation (int argc, char **argv) for (i = 1; i < argc; i++) { - if (!strncmp (argv[i], "-m", 2)) + if (CONST_STRNEQ (argv[i], "-m")) { if (argv[i][2] == '\0') { |