X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=ld%2Fldfile.c;h=782ed7f03a1fdcf723bccc4e1a1ccfebe68d6869;hb=9b3faffeb8841adfd73fbe6049aff02ab995c78f;hp=a9a69544d33cd9f8b38c3298d7fac28bb9041db7;hpb=b7f95647fd61692f386a504b17a32326259d54cf;p=platform%2Fupstream%2Fbinutils.git diff --git a/ld/ldfile.c b/ld/ldfile.c index a9a6954..782ed7f 100644 --- a/ld/ldfile.c +++ b/ld/ldfile.c @@ -1,6 +1,5 @@ /* Linker file opening and searching. - Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002, - 2003, 2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 1991-2014 Free Software Foundation, Inc. This file is part of the GNU Binutils. @@ -39,7 +38,6 @@ #include "plugin.h" #endif /* ENABLE_PLUGINS */ -const char * ldfile_input_filename; bfd_boolean ldfile_assumed_script = FALSE; const char * ldfile_output_machine_name = ""; unsigned long ldfile_output_machine; @@ -70,29 +68,26 @@ static search_arch_type **search_arch_tail_ptr = &search_arch_head; sub-directory of the sysroot directory. */ static bfd_boolean -is_sysrooted_pathname (const char *name, bfd_boolean notsame) +is_sysrooted_pathname (const char *name) { - 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 + && IS_DIR_SEPARATOR (realname[ld_canon_sysroot_len])) + { + realname[ld_canon_sysroot_len] = '\0'; + result = FILENAME_CMP (ld_canon_sysroot, realname) == 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); - + free (realname); return result; } @@ -116,15 +111,9 @@ ldfile_add_library_path (const char *name, bfd_boolean cmdline) /* If a directory is marked as honoring sysroot, prepend the sysroot path now. */ if (name[0] == '=') - { - new_dirs->name = concat (ld_sysroot, name + 1, (const char *) NULL); - new_dirs->sysrooted = TRUE; - } + new_dirs->name = concat (ld_sysroot, name + 1, (const char *) NULL); else - { - new_dirs->name = xstrdup (name); - new_dirs->sysrooted = is_sysrooted_pathname (name, FALSE); - } + new_dirs->name = xstrdup (name); } /* Try to open a BFD for a lang_input_statement. */ @@ -135,7 +124,7 @@ ldfile_try_open_bfd (const char *attempt, { entry->the_bfd = bfd_openr (attempt, entry->target); - if (trace_file_tries) + if (verbose) { if (entry->the_bfd == NULL) info_msg (_("attempt to open %s failed\n"), attempt); @@ -164,7 +153,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 +167,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 +263,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 +272,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. */ @@ -313,41 +302,19 @@ success: will be needed when and if we want to bfd_create a new one using this one as a template. */ if (bfd_check_format (entry->the_bfd, bfd_object) - && plugin_active_plugins_p ()) + && plugin_active_plugins_p () + && !no_more_claiming) { int fd = open (attempt, O_RDONLY | O_BINARY); if (fd >= 0) { struct ld_plugin_input_file file; - int claimed = 0; file.name = attempt; file.offset = 0; file.filesize = lseek (fd, 0, SEEK_END); file.fd = fd; - /* We create a dummy BFD, initially empty, to house - whatever symbols the plugin may want to add. */ - file.handle = plugin_get_ir_dummy_bfd (attempt, entry->the_bfd); - if (plugin_call_claim_file (&file, &claimed)) - einfo (_("%P%F: %s: plugin reported error claiming file\n"), - plugin_error_plugin ()); - /* fd belongs to us, not the plugin; but we don't need it. */ - close (fd); - if (claimed) - { - /* Discard the real file's BFD and substitute the dummy one. */ - bfd_close (entry->the_bfd); - entry->the_bfd = file.handle; - entry->claimed = TRUE; - bfd_make_readable (entry->the_bfd); - } - else - { - /* 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; - } + plugin_maybe_claim (&file, entry); } } #endif /* ENABLE_PLUGINS */ @@ -370,9 +337,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); @@ -384,11 +351,7 @@ ldfile_open_file_search (const char *arch, free (name); } else if (ldfile_try_open_bfd (entry->filename, entry)) - { - entry->sysrooted = IS_ABSOLUTE_PATH (entry->filename) - && is_sysrooted_pathname (entry->filename, TRUE); - return TRUE; - } + return TRUE; if (IS_ABSOLUTE_PATH (entry->filename)) return FALSE; @@ -398,16 +361,13 @@ 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; - return TRUE; - } + return TRUE; } - if (entry->maybe_archive) + if (entry->flags.maybe_archive && !entry->flags.full_name_provided) string = concat (search->name, slash, lib, entry->filename, arch, suffix, (const char *) NULL); else @@ -417,7 +377,6 @@ ldfile_open_file_search (const char *arch, if (ldfile_try_open_bfd (string, entry)) { entry->filename = string; - entry->sysrooted = search->sysrooted; return TRUE; } @@ -438,19 +397,19 @@ 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; - if (strcmp (entry->filename, entry->local_sym_name) != 0) + if (filename_cmp (entry->filename, entry->local_sym_name) != 0) einfo (_("%P: cannot find %s (%s): %E\n"), entry->filename, entry->local_sym_name); 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 { @@ -476,32 +435,35 @@ 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; } } } -/* Try to open NAME; if that fails, try NAME with EXTEN appended to it. */ +/* Try to open NAME. */ static FILE * -try_open (const char *name, const char *exten) +try_open (const char *name, bfd_boolean *sysrooted) { FILE *result; result = fopen (name, "r"); - if (trace_file_tries) + if (result != NULL) + *sysrooted = is_sysrooted_pathname (name); + + if (verbose) { if (result == NULL) info_msg (_("cannot find script file %s\n"), name); @@ -509,26 +471,6 @@ try_open (const char *name, const char *exten) info_msg (_("opened script file %s\n"), name); } - if (result != NULL) - return result; - - if (*exten) - { - char *buff; - - buff = concat (name, exten, (const char *) NULL); - result = fopen (buff, "r"); - - if (trace_file_tries) - { - if (result == NULL) - info_msg (_("cannot find script file %s\n"), buff); - else - info_msg (_("opened script file %s\n"), buff); - } - free (buff); - } - return result; } @@ -589,22 +531,23 @@ find_scripts_dir (void) /* If DEFAULT_ONLY is false, try to open NAME; if that fails, look for it in directories specified with -L, then in the default script - directory, without and with EXTEND appended. If DEFAULT_ONLY is - true, the search is restricted to the default script location. */ + directory. If DEFAULT_ONLY is true, the search is restricted to + the default script location. */ static FILE * -ldfile_find_command_file (const char *name, const char *extend, - bfd_boolean default_only) +ldfile_find_command_file (const char *name, + bfd_boolean default_only, + bfd_boolean *sysrooted) { search_dirs_type *search; FILE *result = NULL; - char *buffer; + char *path; static search_dirs_type *script_search; if (!default_only) { /* First try raw name. */ - result = try_open (name, ""); + result = try_open (name, sysrooted); if (result != NULL) return result; } @@ -630,9 +573,9 @@ ldfile_find_command_file (const char *name, const char *extend, search != NULL; search = search->next) { - buffer = concat (search->name, slash, name, (const char *) NULL); - result = try_open (buffer, extend); - free (buffer); + path = concat (search->name, slash, name, (const char *) NULL); + result = try_open (path, sysrooted); + free (path); if (result) break; } @@ -649,17 +592,19 @@ static void ldfile_open_command_file_1 (const char *name, bfd_boolean default_only) { FILE *ldlex_input_stack; - ldlex_input_stack = ldfile_find_command_file (name, "", default_only); + bfd_boolean sysrooted; + + ldlex_input_stack = ldfile_find_command_file (name, default_only, &sysrooted); if (ldlex_input_stack == NULL) { bfd_set_error (bfd_error_system_call); einfo (_("%P%F: cannot open linker script file %s: %E\n"), name); + return; } - lex_push_file (ldlex_input_stack, name); + lex_push_file (ldlex_input_stack, name, sysrooted); - ldfile_input_filename = name; lineno = 1; saved_script_handle = ldlex_input_stack;