160484Sobrien/* Linker file opening and searching. 2130561Sobrien Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002, 3218822Sdim 2003, 2004, 2005, 2007 Free Software Foundation, Inc. 433965Sjdp 5130561Sobrien This file is part of GLD, the Gnu Linker. 633965Sjdp 7130561Sobrien GLD is free software; you can redistribute it and/or modify 8130561Sobrien it under the terms of the GNU General Public License as published by 9130561Sobrien the Free Software Foundation; either version 2, or (at your option) 10130561Sobrien any later version. 1133965Sjdp 12130561Sobrien GLD is distributed in the hope that it will be useful, 13130561Sobrien but WITHOUT ANY WARRANTY; without even the implied warranty of 14130561Sobrien MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15130561Sobrien GNU General Public License for more details. 1633965Sjdp 17130561Sobrien You should have received a copy of the GNU General Public License 18130561Sobrien along with GLD; see the file COPYING. If not, write to the Free 19218822Sdim Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 20218822Sdim 02110-1301, USA. */ 2133965Sjdp 2277298Sobrien/* ldfile.c: look after all the file stuff. */ 2333965Sjdp 24218822Sdim#include "sysdep.h" 2533965Sjdp#include "bfd.h" 2633965Sjdp#include "bfdlink.h" 2789857Sobrien#include "safe-ctype.h" 2833965Sjdp#include "ld.h" 2933965Sjdp#include "ldmisc.h" 3033965Sjdp#include "ldexp.h" 3133965Sjdp#include "ldlang.h" 3233965Sjdp#include "ldfile.h" 3333965Sjdp#include "ldmain.h" 34107492Sobrien#include <ldgram.h> 3533965Sjdp#include "ldlex.h" 3633965Sjdp#include "ldemul.h" 3778828Sobrien#include "libiberty.h" 38130561Sobrien#include "filenames.h" 3933965Sjdp 40130561Sobrienconst char * ldfile_input_filename; 41130561Sobrienbfd_boolean ldfile_assumed_script = FALSE; 42130561Sobrienconst char * ldfile_output_machine_name = ""; 4333965Sjdpunsigned long ldfile_output_machine; 4433965Sjdpenum bfd_architecture ldfile_output_architecture; 45130561Sobriensearch_dirs_type * search_head; 4633965Sjdp 4733965Sjdp#ifdef VMS 48218822Sdimstatic char * slash = ""; 4933965Sjdp#else 5038889Sjdp#if defined (_WIN32) && ! defined (__CYGWIN32__) 51218822Sdimstatic char * slash = "\\"; 5238889Sjdp#else 53218822Sdimstatic char * slash = "/"; 5433965Sjdp#endif 5538889Sjdp#endif 5633965Sjdp 57130561Sobrientypedef struct search_arch 58130561Sobrien{ 5977298Sobrien char *name; 6033965Sjdp struct search_arch *next; 6133965Sjdp} search_arch_type; 6233965Sjdp 63130561Sobrienstatic search_dirs_type **search_tail_ptr = &search_head; 6433965Sjdpstatic search_arch_type *search_arch_head; 6533965Sjdpstatic search_arch_type **search_arch_tail_ptr = &search_arch_head; 6677298Sobrien 67130561Sobrien/* Test whether a pathname, after canonicalization, is the same or a 68130561Sobrien sub-directory of the sysroot directory. */ 6933965Sjdp 70130561Sobrienstatic bfd_boolean 71130561Sobrienis_sysrooted_pathname (const char *name, bfd_boolean notsame) 72130561Sobrien{ 73130561Sobrien char * realname = ld_canon_sysroot ? lrealpath (name) : NULL; 74130561Sobrien int len; 75130561Sobrien bfd_boolean result; 76130561Sobrien 77130561Sobrien if (! realname) 78130561Sobrien return FALSE; 79130561Sobrien 80130561Sobrien len = strlen (realname); 81130561Sobrien 82130561Sobrien if (((! notsame && len == ld_canon_sysroot_len) 83130561Sobrien || (len >= ld_canon_sysroot_len 84130561Sobrien && IS_DIR_SEPARATOR (realname[ld_canon_sysroot_len]) 85130561Sobrien && (realname[ld_canon_sysroot_len] = '\0') == '\0')) 86130561Sobrien && FILENAME_CMP (ld_canon_sysroot, realname) == 0) 87130561Sobrien result = TRUE; 88130561Sobrien else 89130561Sobrien result = FALSE; 90130561Sobrien 91130561Sobrien if (realname) 92130561Sobrien free (realname); 93130561Sobrien 94130561Sobrien return result; 95130561Sobrien} 96130561Sobrien 97130561Sobrien/* Adds NAME to the library search path. 98130561Sobrien Makes a copy of NAME using xmalloc(). */ 99130561Sobrien 10033965Sjdpvoid 101130561Sobrienldfile_add_library_path (const char *name, bfd_boolean cmdline) 10233965Sjdp{ 10333965Sjdp search_dirs_type *new; 10433965Sjdp 10589857Sobrien if (!cmdline && config.only_cmd_line_lib_dirs) 10689857Sobrien return; 10789857Sobrien 108130561Sobrien new = xmalloc (sizeof (search_dirs_type)); 10933965Sjdp new->next = NULL; 11033965Sjdp new->cmdline = cmdline; 11133965Sjdp *search_tail_ptr = new; 11233965Sjdp search_tail_ptr = &new->next; 113130561Sobrien 114130561Sobrien /* If a directory is marked as honoring sysroot, prepend the sysroot path 115130561Sobrien now. */ 116130561Sobrien if (name[0] == '=') 117130561Sobrien { 118130561Sobrien new->name = concat (ld_sysroot, name + 1, NULL); 119130561Sobrien new->sysrooted = TRUE; 120130561Sobrien } 121130561Sobrien else 122130561Sobrien { 123130561Sobrien new->name = xstrdup (name); 124130561Sobrien new->sysrooted = is_sysrooted_pathname (name, FALSE); 125130561Sobrien } 12633965Sjdp} 12733965Sjdp 12833965Sjdp/* Try to open a BFD for a lang_input_statement. */ 12933965Sjdp 130130561Sobrienbfd_boolean 131130561Sobrienldfile_try_open_bfd (const char *attempt, 132130561Sobrien lang_input_statement_type *entry) 13333965Sjdp{ 13433965Sjdp entry->the_bfd = bfd_openr (attempt, entry->target); 13533965Sjdp 13633965Sjdp if (trace_file_tries) 13760484Sobrien { 13860484Sobrien if (entry->the_bfd == NULL) 13960484Sobrien info_msg (_("attempt to open %s failed\n"), attempt); 14060484Sobrien else 14160484Sobrien info_msg (_("attempt to open %s succeeded\n"), attempt); 14260484Sobrien } 14333965Sjdp 14460484Sobrien if (entry->the_bfd == NULL) 14533965Sjdp { 14633965Sjdp if (bfd_get_error () == bfd_error_invalid_target) 14760484Sobrien einfo (_("%F%P: invalid BFD target `%s'\n"), entry->target); 148130561Sobrien return FALSE; 14933965Sjdp } 15060484Sobrien 15160484Sobrien /* If we are searching for this file, see if the architecture is 15260484Sobrien compatible with the output file. If it isn't, keep searching. 15360484Sobrien If we can't open the file as an object file, stop the search 154218822Sdim here. If we are statically linking, ensure that we don't link 155218822Sdim a dynamic object. */ 15660484Sobrien 157218822Sdim if (entry->search_dirs_flag || !entry->dynamic) 15860484Sobrien { 15960484Sobrien bfd *check; 16060484Sobrien 16160484Sobrien if (bfd_check_format (entry->the_bfd, bfd_archive)) 16260484Sobrien check = bfd_openr_next_archived_file (entry->the_bfd, NULL); 16360484Sobrien else 16460484Sobrien check = entry->the_bfd; 16560484Sobrien 16660484Sobrien if (check != NULL) 16760484Sobrien { 16860484Sobrien if (! bfd_check_format (check, bfd_object)) 169107492Sobrien { 170107492Sobrien if (check == entry->the_bfd 171218822Sdim && entry->search_dirs_flag 172107492Sobrien && bfd_get_error () == bfd_error_file_not_recognized 173107492Sobrien && ! ldemul_unrecognized_file (entry)) 174107492Sobrien { 175107492Sobrien int token, skip = 0; 176107492Sobrien char *arg, *arg1, *arg2, *arg3; 177107492Sobrien extern FILE *yyin; 178104834Sobrien 179107492Sobrien /* Try to interpret the file as a linker script. */ 180107492Sobrien ldfile_open_command_file (attempt); 181130561Sobrien 182130561Sobrien ldfile_assumed_script = TRUE; 183107492Sobrien parser_input = input_selected; 184107492Sobrien ldlex_both (); 185107492Sobrien token = INPUT_SCRIPT; 186107492Sobrien while (token != 0) 187107492Sobrien { 188107492Sobrien switch (token) 189107492Sobrien { 190107492Sobrien case OUTPUT_FORMAT: 191107492Sobrien if ((token = yylex ()) != '(') 192107492Sobrien continue; 193107492Sobrien if ((token = yylex ()) != NAME) 194107492Sobrien continue; 195107492Sobrien arg1 = yylval.name; 196107492Sobrien arg2 = NULL; 197107492Sobrien arg3 = NULL; 198107492Sobrien token = yylex (); 199107492Sobrien if (token == ',') 200107492Sobrien { 201107492Sobrien if ((token = yylex ()) != NAME) 202107492Sobrien { 203107492Sobrien free (arg1); 204107492Sobrien continue; 205107492Sobrien } 206107492Sobrien arg2 = yylval.name; 207107492Sobrien if ((token = yylex ()) != ',' 208107492Sobrien || (token = yylex ()) != NAME) 209107492Sobrien { 210107492Sobrien free (arg1); 211107492Sobrien free (arg2); 212107492Sobrien continue; 213107492Sobrien } 214107492Sobrien arg3 = yylval.name; 215107492Sobrien token = yylex (); 216107492Sobrien } 217107492Sobrien if (token == ')') 218107492Sobrien { 219107492Sobrien switch (command_line.endian) 220107492Sobrien { 221107492Sobrien default: 222107492Sobrien case ENDIAN_UNSET: 223107492Sobrien arg = arg1; break; 224107492Sobrien case ENDIAN_BIG: 225107492Sobrien arg = arg2 ? arg2 : arg1; break; 226107492Sobrien case ENDIAN_LITTLE: 227107492Sobrien arg = arg3 ? arg3 : arg1; break; 228107492Sobrien } 229107492Sobrien if (strcmp (arg, lang_get_output_target ()) != 0) 230107492Sobrien skip = 1; 231107492Sobrien } 232107492Sobrien free (arg1); 233107492Sobrien if (arg2) free (arg2); 234107492Sobrien if (arg3) free (arg3); 235107492Sobrien break; 236107492Sobrien case NAME: 237107492Sobrien case LNAME: 238107492Sobrien case VERS_IDENTIFIER: 239107492Sobrien case VERS_TAG: 240107492Sobrien free (yylval.name); 241107492Sobrien break; 242107492Sobrien case INT: 243107492Sobrien if (yylval.bigint.str) 244107492Sobrien free (yylval.bigint.str); 245107492Sobrien break; 246130561Sobrien } 247107492Sobrien token = yylex (); 248107492Sobrien } 249130561Sobrien ldlex_popstate (); 250130561Sobrien ldfile_assumed_script = FALSE; 251107492Sobrien fclose (yyin); 252107492Sobrien yyin = NULL; 253107492Sobrien if (skip) 254107492Sobrien { 255218822Sdim if (command_line.warn_search_mismatch) 256218822Sdim einfo (_("%P: skipping incompatible %s " 257218822Sdim "when searching for %s\n"), 258218822Sdim attempt, entry->local_sym_name); 259107492Sobrien bfd_close (entry->the_bfd); 260107492Sobrien entry->the_bfd = NULL; 261130561Sobrien return FALSE; 262107492Sobrien } 263107492Sobrien } 264130561Sobrien return TRUE; 265107492Sobrien } 266107492Sobrien 267218822Sdim if (!entry->dynamic && (entry->the_bfd->flags & DYNAMIC) != 0) 268218822Sdim { 269218822Sdim einfo (_("%F%P: attempted static link of dynamic object `%s'\n"), 270218822Sdim attempt); 271218822Sdim bfd_close (entry->the_bfd); 272218822Sdim entry->the_bfd = NULL; 273218822Sdim return FALSE; 274218822Sdim } 275218822Sdim 276218822Sdim if (entry->search_dirs_flag 277218822Sdim && !bfd_arch_get_compatible (check, output_bfd, 278218822Sdim command_line.accept_unknown_input_arch) 279130561Sobrien /* XCOFF archives can have 32 and 64 bit objects. */ 280104834Sobrien && ! (bfd_get_flavour (check) == bfd_target_xcoff_flavour 281104834Sobrien && bfd_get_flavour (output_bfd) == bfd_target_xcoff_flavour 282104834Sobrien && bfd_check_format (entry->the_bfd, bfd_archive))) 28360484Sobrien { 284218822Sdim if (command_line.warn_search_mismatch) 285218822Sdim einfo (_("%P: skipping incompatible %s " 286218822Sdim "when searching for %s\n"), 287218822Sdim attempt, entry->local_sym_name); 28860484Sobrien bfd_close (entry->the_bfd); 28960484Sobrien entry->the_bfd = NULL; 290130561Sobrien return FALSE; 29160484Sobrien } 29260484Sobrien } 29360484Sobrien } 29460484Sobrien 295130561Sobrien return TRUE; 29633965Sjdp} 29733965Sjdp 29833965Sjdp/* Search for and open the file specified by ENTRY. If it is an 29933965Sjdp archive, use ARCH, LIB and SUFFIX to modify the file name. */ 30033965Sjdp 301130561Sobrienbfd_boolean 302130561Sobrienldfile_open_file_search (const char *arch, 303130561Sobrien lang_input_statement_type *entry, 304130561Sobrien const char *lib, 305130561Sobrien const char *suffix) 30633965Sjdp{ 30733965Sjdp search_dirs_type *search; 30833965Sjdp 30933965Sjdp /* If this is not an archive, try to open it in the current 31033965Sjdp directory first. */ 31133965Sjdp if (! entry->is_archive) 31233965Sjdp { 313130561Sobrien if (entry->sysrooted && IS_ABSOLUTE_PATH (entry->filename)) 314130561Sobrien { 315130561Sobrien char *name = concat (ld_sysroot, entry->filename, 316130561Sobrien (const char *) NULL); 317130561Sobrien if (ldfile_try_open_bfd (name, entry)) 318130561Sobrien { 319130561Sobrien entry->filename = name; 320130561Sobrien return TRUE; 321130561Sobrien } 322130561Sobrien free (name); 323130561Sobrien } 324130561Sobrien else if (ldfile_try_open_bfd (entry->filename, entry)) 325130561Sobrien { 326130561Sobrien entry->sysrooted = IS_ABSOLUTE_PATH (entry->filename) 327130561Sobrien && is_sysrooted_pathname (entry->filename, TRUE); 328130561Sobrien return TRUE; 329130561Sobrien } 330130561Sobrien 331130561Sobrien if (IS_ABSOLUTE_PATH (entry->filename)) 332130561Sobrien return FALSE; 33333965Sjdp } 33433965Sjdp 335130561Sobrien for (search = search_head; search != NULL; search = search->next) 33633965Sjdp { 33733965Sjdp char *string; 33833965Sjdp 339130561Sobrien if (entry->dynamic && ! link_info.relocatable) 34033965Sjdp { 34133965Sjdp if (ldemul_open_dynamic_archive (arch, search, entry)) 342130561Sobrien { 343130561Sobrien entry->sysrooted = search->sysrooted; 344130561Sobrien return TRUE; 345130561Sobrien } 34633965Sjdp } 34733965Sjdp 348130561Sobrien string = xmalloc (strlen (search->name) 349130561Sobrien + strlen (slash) 350130561Sobrien + strlen (lib) 351130561Sobrien + strlen (entry->filename) 352130561Sobrien + strlen (arch) 353130561Sobrien + strlen (suffix) 354130561Sobrien + 1); 35533965Sjdp 35633965Sjdp if (entry->is_archive) 35733965Sjdp sprintf (string, "%s%s%s%s%s%s", search->name, slash, 35833965Sjdp lib, entry->filename, arch, suffix); 35933965Sjdp else 36033965Sjdp sprintf (string, "%s%s%s", search->name, slash, entry->filename); 36133965Sjdp 36233965Sjdp if (ldfile_try_open_bfd (string, entry)) 36333965Sjdp { 36433965Sjdp entry->filename = string; 365130561Sobrien entry->sysrooted = search->sysrooted; 366130561Sobrien return TRUE; 36733965Sjdp } 36833965Sjdp 36933965Sjdp free (string); 37033965Sjdp } 37133965Sjdp 372130561Sobrien return FALSE; 37333965Sjdp} 37433965Sjdp 37533965Sjdp/* Open the input file specified by ENTRY. */ 37633965Sjdp 37733965Sjdpvoid 378130561Sobrienldfile_open_file (lang_input_statement_type *entry) 37933965Sjdp{ 38033965Sjdp if (entry->the_bfd != NULL) 38133965Sjdp return; 38233965Sjdp 38333965Sjdp if (! entry->search_dirs_flag) 38433965Sjdp { 38533965Sjdp if (ldfile_try_open_bfd (entry->filename, entry)) 38633965Sjdp return; 38760484Sobrien if (strcmp (entry->filename, entry->local_sym_name) != 0) 388130561Sobrien einfo (_("%F%P: %s (%s): No such file: %E\n"), 38960484Sobrien entry->filename, entry->local_sym_name); 39060484Sobrien else 391130561Sobrien einfo (_("%F%P: %s: No such file: %E\n"), entry->local_sym_name); 39233965Sjdp } 39333965Sjdp else 39433965Sjdp { 39533965Sjdp search_arch_type *arch; 396130561Sobrien bfd_boolean found = FALSE; 39733965Sjdp 39833965Sjdp /* Try to open <filename><suffix> or lib<filename><suffix>.a */ 399130561Sobrien for (arch = search_arch_head; arch != NULL; arch = arch->next) 40033965Sjdp { 40178828Sobrien found = ldfile_open_file_search (arch->name, entry, "lib", ".a"); 40278828Sobrien if (found) 40378828Sobrien break; 40433965Sjdp#ifdef VMS 40578828Sobrien found = ldfile_open_file_search (arch->name, entry, ":lib", ".a"); 40678828Sobrien if (found) 40778828Sobrien break; 40833965Sjdp#endif 40978828Sobrien found = ldemul_find_potential_libraries (arch->name, entry); 41078828Sobrien if (found) 41178828Sobrien break; 41233965Sjdp } 41377298Sobrien 41478828Sobrien /* If we have found the file, we don't need to search directories 41578828Sobrien again. */ 41678828Sobrien if (found) 417130561Sobrien entry->search_dirs_flag = FALSE; 418130561Sobrien else if (entry->sysrooted 419130561Sobrien && ld_sysroot 420130561Sobrien && IS_ABSOLUTE_PATH (entry->local_sym_name)) 421130561Sobrien einfo (_("%F%P: cannot find %s inside %s\n"), 422130561Sobrien entry->local_sym_name, ld_sysroot); 42378828Sobrien else 42478828Sobrien einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name); 42533965Sjdp } 42633965Sjdp} 42733965Sjdp 42833965Sjdp/* Try to open NAME; if that fails, try NAME with EXTEN appended to it. */ 42933965Sjdp 43033965Sjdpstatic FILE * 431130561Sobrientry_open (const char *name, const char *exten) 43233965Sjdp{ 43333965Sjdp FILE *result; 43433965Sjdp char buff[1000]; 43533965Sjdp 43633965Sjdp result = fopen (name, "r"); 43777298Sobrien 43833965Sjdp if (trace_file_tries) 43933965Sjdp { 44033965Sjdp if (result == NULL) 44160484Sobrien info_msg (_("cannot find script file %s\n"), name); 44233965Sjdp else 44360484Sobrien info_msg (_("opened script file %s\n"), name); 44433965Sjdp } 44533965Sjdp 44633965Sjdp if (result != NULL) 44733965Sjdp return result; 44833965Sjdp 44933965Sjdp if (*exten) 45033965Sjdp { 45133965Sjdp sprintf (buff, "%s%s", name, exten); 45233965Sjdp result = fopen (buff, "r"); 45377298Sobrien 45433965Sjdp if (trace_file_tries) 45533965Sjdp { 45633965Sjdp if (result == NULL) 45760484Sobrien info_msg (_("cannot find script file %s\n"), buff); 45833965Sjdp else 45960484Sobrien info_msg (_("opened script file %s\n"), buff); 46033965Sjdp } 46133965Sjdp } 46233965Sjdp 46333965Sjdp return result; 46433965Sjdp} 46533965Sjdp 46633965Sjdp/* Try to open NAME; if that fails, look for it in any directories 467130561Sobrien specified with -L, without and with EXTEND appended. */ 46833965Sjdp 469218822Sdimstatic FILE * 470130561Sobrienldfile_find_command_file (const char *name, const char *extend) 47133965Sjdp{ 47233965Sjdp search_dirs_type *search; 47333965Sjdp FILE *result; 47433965Sjdp char buffer[1000]; 47533965Sjdp 47677298Sobrien /* First try raw name. */ 47777298Sobrien result = try_open (name, ""); 478130561Sobrien if (result == NULL) 47977298Sobrien { 48077298Sobrien /* Try now prefixes. */ 481130561Sobrien for (search = search_head; search != NULL; search = search->next) 48277298Sobrien { 48377298Sobrien sprintf (buffer, "%s%s%s", search->name, slash, name); 48477298Sobrien 48577298Sobrien result = try_open (buffer, extend); 48677298Sobrien if (result) 48777298Sobrien break; 48877298Sobrien } 48933965Sjdp } 49077298Sobrien 49133965Sjdp return result; 49233965Sjdp} 49333965Sjdp 49433965Sjdpvoid 495130561Sobrienldfile_open_command_file (const char *name) 49633965Sjdp{ 49733965Sjdp FILE *ldlex_input_stack; 49877298Sobrien ldlex_input_stack = ldfile_find_command_file (name, ""); 49933965Sjdp 500130561Sobrien if (ldlex_input_stack == NULL) 50177298Sobrien { 50277298Sobrien bfd_set_error (bfd_error_system_call); 50377298Sobrien einfo (_("%P%F: cannot open linker script file %s: %E\n"), name); 50477298Sobrien } 50577298Sobrien 50677298Sobrien lex_push_file (ldlex_input_stack, name); 50777298Sobrien 50833965Sjdp ldfile_input_filename = name; 50933965Sjdp lineno = 1; 510104834Sobrien 51189857Sobrien saved_script_handle = ldlex_input_stack; 51233965Sjdp} 51333965Sjdp 51433965Sjdpvoid 515130561Sobrienldfile_add_arch (const char *in_name) 51633965Sjdp{ 51778828Sobrien char *name = xstrdup (in_name); 518130561Sobrien search_arch_type *new = xmalloc (sizeof (search_arch_type)); 51933965Sjdp 52033965Sjdp ldfile_output_machine_name = in_name; 52133965Sjdp 52233965Sjdp new->name = name; 523130561Sobrien new->next = NULL; 52438889Sjdp while (*name) 52538889Sjdp { 52689857Sobrien *name = TOLOWER (*name); 52738889Sjdp name++; 52838889Sjdp } 52933965Sjdp *search_arch_tail_ptr = new; 53033965Sjdp search_arch_tail_ptr = &new->next; 53133965Sjdp 53233965Sjdp} 53333965Sjdp 53477298Sobrien/* Set the output architecture. */ 53577298Sobrien 53633965Sjdpvoid 537130561Sobrienldfile_set_output_arch (const char *string, enum bfd_architecture defarch) 53833965Sjdp{ 53977298Sobrien const bfd_arch_info_type *arch = bfd_scan_arch (string); 54033965Sjdp 54177298Sobrien if (arch) 54277298Sobrien { 54377298Sobrien ldfile_output_architecture = arch->arch; 54477298Sobrien ldfile_output_machine = arch->mach; 54577298Sobrien ldfile_output_machine_name = arch->printable_name; 54677298Sobrien } 547130561Sobrien else if (defarch != bfd_arch_unknown) 548130561Sobrien ldfile_output_architecture = defarch; 54977298Sobrien else 550130561Sobrien einfo (_("%P%F: cannot represent machine `%s'\n"), string); 55133965Sjdp} 552