source: trunk/src/binutils/ld/ldfile.c@ 719

Last change on this file since 719 was 618, checked in by bird, 22 years ago

Joined the port of 2.11.2 with 2.14.

  • Property cvs2svn:cvs-rev set to 1.4
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 14.6 KB
Line 
1/* Linker file opening and searching.
2 Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002, 2003
3 Free Software Foundation, Inc.
4
5 This file is part of GLD, the Gnu Linker.
6
7 GLD is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GLD is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GLD; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
21
22/* ldfile.c: look after all the file stuff. */
23
24#include "bfd.h"
25#include "sysdep.h"
26#include "bfdlink.h"
27#include "safe-ctype.h"
28#include "ld.h"
29#include "ldmisc.h"
30#include "ldexp.h"
31#include "ldlang.h"
32#include "ldfile.h"
33#include "ldmain.h"
34#include <ldgram.h>
35#include "ldlex.h"
36#include "ldemul.h"
37#include "libiberty.h"
38#include "filenames.h"
39
40const char * ldfile_input_filename;
41bfd_boolean ldfile_assumed_script = FALSE;
42const char * ldfile_output_machine_name = "";
43unsigned long ldfile_output_machine;
44enum bfd_architecture ldfile_output_architecture;
45search_dirs_type * search_head;
46
47#ifndef MPW
48#ifdef VMS
49char * slash = "";
50#else
51#if defined (_WIN32) && ! defined (__CYGWIN32__)
52char * slash = "\\";
53#else
54char * slash = "/";
55#endif
56#endif
57#else /* MPW */
58/* The MPW path char is a colon. */
59char * slash = ":";
60#endif /* MPW */
61
62typedef struct search_arch
63{
64 char *name;
65 struct search_arch *next;
66} search_arch_type;
67
68static search_dirs_type **search_tail_ptr = &search_head;
69static search_arch_type *search_arch_head;
70static search_arch_type **search_arch_tail_ptr = &search_arch_head;
71
72static FILE *try_open
73 PARAMS ((const char *, const char *));
74static bfd_boolean is_sysrooted_pathname
75 PARAMS ((const char *, bfd_boolean));
76
77/* Test whether a pathname, after canonicalization, is the same or a
78 sub-directory of the sysroot directory. */
79
80static bfd_boolean
81is_sysrooted_pathname (name, notsame)
82 const char *name;
83 bfd_boolean notsame;
84{
85 char * realname = ld_canon_sysroot ? lrealpath (name) : NULL;
86 int len;
87 bfd_boolean result;
88
89 if (! realname)
90 return FALSE;
91
92 len = strlen (realname);
93
94 if (((! notsame && len == ld_canon_sysroot_len)
95 || (len >= ld_canon_sysroot_len
96 && IS_DIR_SEPARATOR (realname[ld_canon_sysroot_len])
97 && (realname[ld_canon_sysroot_len] = '\0') == '\0'))
98 && FILENAME_CMP (ld_canon_sysroot, realname) == 0)
99 result = TRUE;
100 else
101 result = FALSE;
102
103 if (realname)
104 free (realname);
105
106 return result;
107}
108
109/* Adds NAME to the library search path.
110 Makes a copy of NAME using xmalloc(). */
111
112void
113ldfile_add_library_path (name, cmdline)
114 const char *name;
115 bfd_boolean cmdline;
116{
117 search_dirs_type *new;
118
119 if (!cmdline && config.only_cmd_line_lib_dirs)
120 return;
121
122 new = (search_dirs_type *) xmalloc (sizeof (search_dirs_type));
123 new->next = NULL;
124 new->cmdline = cmdline;
125 *search_tail_ptr = new;
126 search_tail_ptr = &new->next;
127
128 /* If a directory is marked as honoring sysroot, prepend the sysroot path
129 now. */
130 if (name[0] == '=')
131 {
132 new->name = concat (ld_sysroot, name + 1, NULL);
133 new->sysrooted = TRUE;
134 }
135 else
136 {
137 new->name = xstrdup (name);
138 new->sysrooted = is_sysrooted_pathname (name, FALSE);
139 }
140}
141
142/* Try to open a BFD for a lang_input_statement. */
143
144bfd_boolean
145ldfile_try_open_bfd (attempt, entry)
146 const char *attempt;
147 lang_input_statement_type *entry;
148{
149 entry->the_bfd = bfd_openr (attempt, entry->target);
150
151 if (trace_file_tries)
152 {
153 if (entry->the_bfd == NULL)
154 info_msg (_("attempt to open %s failed\n"), attempt);
155 else
156 info_msg (_("attempt to open %s succeeded\n"), attempt);
157 }
158
159 if (entry->the_bfd == NULL)
160 {
161 if (bfd_get_error () == bfd_error_invalid_target)
162 einfo (_("%F%P: invalid BFD target `%s'\n"), entry->target);
163 return FALSE;
164 }
165
166 /* If we are searching for this file, see if the architecture is
167 compatible with the output file. If it isn't, keep searching.
168 If we can't open the file as an object file, stop the search
169 here. */
170
171 if (entry->search_dirs_flag)
172 {
173 bfd *check;
174
175 if (bfd_check_format (entry->the_bfd, bfd_archive))
176 check = bfd_openr_next_archived_file (entry->the_bfd, NULL);
177 else
178 check = entry->the_bfd;
179
180 if (check != NULL)
181 {
182 if (! bfd_check_format (check, bfd_object))
183 {
184 if (check == entry->the_bfd
185 && bfd_get_error () == bfd_error_file_not_recognized
186 && ! ldemul_unrecognized_file (entry))
187 {
188 int token, skip = 0;
189 char *arg, *arg1, *arg2, *arg3;
190 extern FILE *yyin;
191
192 /* Try to interpret the file as a linker script. */
193 ldfile_open_command_file (attempt);
194
195 ldfile_assumed_script = TRUE;
196 parser_input = input_selected;
197 ldlex_both ();
198 token = INPUT_SCRIPT;
199 while (token != 0)
200 {
201 switch (token)
202 {
203 case OUTPUT_FORMAT:
204 if ((token = yylex ()) != '(')
205 continue;
206 if ((token = yylex ()) != NAME)
207 continue;
208 arg1 = yylval.name;
209 arg2 = NULL;
210 arg3 = NULL;
211 token = yylex ();
212 if (token == ',')
213 {
214 if ((token = yylex ()) != NAME)
215 {
216 free (arg1);
217 continue;
218 }
219 arg2 = yylval.name;
220 if ((token = yylex ()) != ','
221 || (token = yylex ()) != NAME)
222 {
223 free (arg1);
224 free (arg2);
225 continue;
226 }
227 arg3 = yylval.name;
228 token = yylex ();
229 }
230 if (token == ')')
231 {
232 switch (command_line.endian)
233 {
234 default:
235 case ENDIAN_UNSET:
236 arg = arg1; break;
237 case ENDIAN_BIG:
238 arg = arg2 ? arg2 : arg1; break;
239 case ENDIAN_LITTLE:
240 arg = arg3 ? arg3 : arg1; break;
241 }
242 if (strcmp (arg, lang_get_output_target ()) != 0)
243 skip = 1;
244 }
245 free (arg1);
246 if (arg2) free (arg2);
247 if (arg3) free (arg3);
248 break;
249 case NAME:
250 case LNAME:
251 case VERS_IDENTIFIER:
252 case VERS_TAG:
253 free (yylval.name);
254 break;
255 case INT:
256 if (yylval.bigint.str)
257 free (yylval.bigint.str);
258 break;
259 }
260 token = yylex ();
261 }
262 ldlex_popstate ();
263 ldfile_assumed_script = FALSE;
264 fclose (yyin);
265 yyin = NULL;
266 if (skip)
267 {
268 einfo (_("%P: skipping incompatible %s when searching for %s\n"),
269 attempt, entry->local_sym_name);
270 bfd_close (entry->the_bfd);
271 entry->the_bfd = NULL;
272 return FALSE;
273 }
274 }
275 return TRUE;
276 }
277
278 if ((bfd_arch_get_compatible (check, output_bfd,
279 command_line.accept_unknown_input_arch) == NULL)
280 /* XCOFF archives can have 32 and 64 bit objects. */
281 && ! (bfd_get_flavour (check) == bfd_target_xcoff_flavour
282 && bfd_get_flavour (output_bfd) == bfd_target_xcoff_flavour
283 && bfd_check_format (entry->the_bfd, bfd_archive)))
284 {
285 einfo (_("%P: skipping incompatible %s when searching for %s\n"),
286 attempt, entry->local_sym_name);
287 bfd_close (entry->the_bfd);
288 entry->the_bfd = NULL;
289 return FALSE;
290 }
291 }
292 }
293
294 return TRUE;
295}
296
297/* Search for and open the file specified by ENTRY. If it is an
298 archive, use ARCH, LIB and SUFFIX to modify the file name. */
299
300bfd_boolean
301ldfile_open_file_search (arch, entry, lib, suffix)
302 const char *arch;
303 lang_input_statement_type *entry;
304 const char *lib;
305 const char *suffix;
306{
307 search_dirs_type *search;
308
309 /* If this is not an archive, try to open it in the current
310 directory first. */
311 if (! entry->is_archive)
312 {
313 if (entry->sysrooted && IS_ABSOLUTE_PATH (entry->filename))
314 {
315 char *name = concat (ld_sysroot, entry->filename,
316 (const char *) NULL);
317 if (ldfile_try_open_bfd (name, entry))
318 {
319 entry->filename = name;
320 return TRUE;
321 }
322 free (name);
323 }
324 else if (ldfile_try_open_bfd (entry->filename, entry))
325 {
326 entry->sysrooted = IS_ABSOLUTE_PATH (entry->filename)
327 && is_sysrooted_pathname (entry->filename, TRUE);
328 return TRUE;
329 }
330
331 if (IS_ABSOLUTE_PATH (entry->filename))
332 return FALSE;
333 }
334
335 for (search = search_head;
336 search != (search_dirs_type *) NULL;
337 search = search->next)
338 {
339 char *string;
340
341 if (entry->dynamic && ! link_info.relocateable)
342 {
343 if (ldemul_open_dynamic_archive (arch, search, entry))
344 {
345 entry->sysrooted = search->sysrooted;
346 return TRUE;
347 }
348 }
349
350 string = (char *) xmalloc (strlen (search->name)
351 + strlen (slash)
352 + strlen (lib)
353 + strlen (entry->filename)
354 + strlen (arch)
355 + strlen (suffix)
356 + 1);
357
358 if (entry->is_archive)
359 sprintf (string, "%s%s%s%s%s%s", search->name, slash,
360 lib, entry->filename, arch, suffix);
361 else
362 sprintf (string, "%s%s%s", search->name, slash, entry->filename);
363
364 if (ldfile_try_open_bfd (string, entry))
365 {
366 entry->filename = string;
367 entry->sysrooted = search->sysrooted;
368 return TRUE;
369 }
370
371 free (string);
372 }
373
374 return FALSE;
375}
376
377/* Open the input file specified by ENTRY. */
378
379void
380ldfile_open_file (entry)
381 lang_input_statement_type *entry;
382{
383 if (entry->the_bfd != NULL)
384 return;
385
386 if (! entry->search_dirs_flag)
387 {
388 if (ldfile_try_open_bfd (entry->filename, entry))
389 return;
390 if (strcmp (entry->filename, entry->local_sym_name) != 0)
391 einfo (_("%F%P: cannot open %s for %s: %E\n"),
392 entry->filename, entry->local_sym_name);
393 else
394 einfo (_("%F%P: cannot open %s: %E\n"), entry->local_sym_name);
395 }
396 else
397 {
398 search_arch_type *arch;
399 bfd_boolean found = FALSE;
400
401 /* Try to open <filename><suffix> or lib<filename><suffix>.a */
402 for (arch = search_arch_head;
403 arch != (search_arch_type *) NULL;
404 arch = arch->next)
405 {
406#if defined (__EMX__) /* Target feature really, but no target define to test on. */
407 found = ldfile_open_file_search (arch->name, entry, "", ".a");
408 if (found)
409 break;
410#endif /* __EMX__ */
411 found = ldfile_open_file_search (arch->name, entry, "lib", ".a");
412 if (found)
413 break;
414#ifdef VMS
415 found = ldfile_open_file_search (arch->name, entry, ":lib", ".a");
416 if (found)
417 break;
418#endif
419 found = ldemul_find_potential_libraries (arch->name, entry);
420 if (found)
421 break;
422 }
423
424 /* If we have found the file, we don't need to search directories
425 again. */
426 if (found)
427 entry->search_dirs_flag = FALSE;
428 else if (entry->sysrooted
429 && ld_sysroot
430 && IS_ABSOLUTE_PATH (entry->local_sym_name))
431 einfo (_("%F%P: cannot find %s inside %s\n"),
432 entry->local_sym_name, ld_sysroot);
433 else
434 einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name);
435 }
436}
437
438/* Try to open NAME; if that fails, try NAME with EXTEN appended to it. */
439
440static FILE *
441try_open (name, exten)
442 const char *name;
443 const char *exten;
444{
445 FILE *result;
446 char buff[1000];
447
448 result = fopen (name, "r");
449
450 if (trace_file_tries)
451 {
452 if (result == NULL)
453 info_msg (_("cannot find script file %s\n"), name);
454 else
455 info_msg (_("opened script file %s\n"), name);
456 }
457
458 if (result != NULL)
459 return result;
460
461 if (*exten)
462 {
463 sprintf (buff, "%s%s", name, exten);
464 result = fopen (buff, "r");
465
466 if (trace_file_tries)
467 {
468 if (result == NULL)
469 info_msg (_("cannot find script file %s\n"), buff);
470 else
471 info_msg (_("opened script file %s\n"), buff);
472 }
473 }
474
475 return result;
476}
477
478/* Try to open NAME; if that fails, look for it in any directories
479 specified with -L, without and with EXTEND appended. */
480
481FILE *
482ldfile_find_command_file (name, extend)
483 const char *name;
484 const char *extend;
485{
486 search_dirs_type *search;
487 FILE *result;
488 char buffer[1000];
489
490 /* First try raw name. */
491 result = try_open (name, "");
492 if (result == (FILE *) NULL)
493 {
494 /* Try now prefixes. */
495 for (search = search_head;
496 search != (search_dirs_type *) NULL;
497 search = search->next)
498 {
499 sprintf (buffer, "%s%s%s", search->name, slash, name);
500
501 result = try_open (buffer, extend);
502 if (result)
503 break;
504 }
505 }
506
507 return result;
508}
509
510void
511ldfile_open_command_file (name)
512 const char *name;
513{
514 FILE *ldlex_input_stack;
515 ldlex_input_stack = ldfile_find_command_file (name, "");
516
517 if (ldlex_input_stack == (FILE *) NULL)
518 {
519 bfd_set_error (bfd_error_system_call);
520 einfo (_("%P%F: cannot open linker script file %s: %E\n"), name);
521 }
522
523 lex_push_file (ldlex_input_stack, name);
524
525 ldfile_input_filename = name;
526 lineno = 1;
527
528 saved_script_handle = ldlex_input_stack;
529}
530
531#ifdef GNU960
532static char *
533gnu960_map_archname (name)
534 char *name;
535{
536 struct tabentry { char *cmd_switch; char *arch; };
537 static struct tabentry arch_tab[] =
538 {
539 "", "",
540 "KA", "ka",
541 "KB", "kb",
542 "KC", "mc", /* Synonym for MC */
543 "MC", "mc",
544 "CA", "ca",
545 "SA", "ka", /* Functionally equivalent to KA */
546 "SB", "kb", /* Functionally equivalent to KB */
547 NULL, ""
548 };
549 struct tabentry *tp;
550
551 for (tp = arch_tab; tp->cmd_switch != NULL; tp++)
552 {
553 if (! strcmp (name,tp->cmd_switch))
554 break;
555 }
556
557 if (tp->cmd_switch == NULL)
558 einfo (_("%P%F: unknown architecture: %s\n"), name);
559
560 return tp->arch;
561}
562
563void
564ldfile_add_arch (name)
565 char *name;
566{
567 search_arch_type *new =
568 (search_arch_type *) xmalloc ((bfd_size_type) (sizeof (search_arch_type)));
569
570 if (*name != '\0')
571 {
572 if (ldfile_output_machine_name[0] != '\0')
573 {
574 einfo (_("%P%F: target architecture respecified\n"));
575 return;
576 }
577
578 ldfile_output_machine_name = name;
579 }
580
581 new->next = (search_arch_type *) NULL;
582 new->name = gnu960_map_archname (name);
583 *search_arch_tail_ptr = new;
584 search_arch_tail_ptr = &new->next;
585}
586
587#else /* not GNU960 */
588
589void
590ldfile_add_arch (in_name)
591 const char *in_name;
592{
593 char *name = xstrdup (in_name);
594 search_arch_type *new =
595 (search_arch_type *) xmalloc (sizeof (search_arch_type));
596
597 ldfile_output_machine_name = in_name;
598
599 new->name = name;
600 new->next = (search_arch_type *) NULL;
601 while (*name)
602 {
603 *name = TOLOWER (*name);
604 name++;
605 }
606 *search_arch_tail_ptr = new;
607 search_arch_tail_ptr = &new->next;
608
609}
610#endif
611
612/* Set the output architecture. */
613
614void
615ldfile_set_output_arch (string)
616 const char *string;
617{
618 const bfd_arch_info_type *arch = bfd_scan_arch (string);
619
620 if (arch)
621 {
622 ldfile_output_architecture = arch->arch;
623 ldfile_output_machine = arch->mach;
624 ldfile_output_machine_name = arch->printable_name;
625 }
626 else
627 {
628 einfo (_("%P%F: cannot represent machine `%s'\n"), string);
629 }
630}
Note: See TracBrowser for help on using the repository browser.