source: branches/libc-0.6/src/binutils/ld/ldfile.c

Last change on this file was 1253, checked in by bird, 22 years ago

Fixed some library searching for OS/2.

  • Property cvs2svn:cvs-rev set to 1.5
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 16.7 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#if defined (__EMX__) /* Target feature really, but no target define to test on. */
357 + 16);
358#else
359 + 1);
360#endif
361
362#if defined (__EMX__) /* Target feature really, but no target define to test on. */
363 /* On OS/2 we have a complex naming scheme for libraries. They may have a
364 prefix, we prefere the ones with. They may also have special suffixes
365 depending on the library type. _s.a mean static, _dll.a mean dynaminc,
366 plain .a might mean both and should be searched last.
367
368 TODO: make a ldemul_open_static_archive(). */
369
370 if (entry->is_archive)
371 sprintf (string, "%s%s%s%s%s%s%s", search->name, slash,
372 lib, entry->filename, arch,
373 (entry->dynamic && ! link_info.relocateable ? "" : "_s"),
374 suffix);
375 else
376 sprintf (string, "%s%s%s", search->name, slash, entry->filename);
377
378 if (ldfile_try_open_bfd (string, entry))
379 {
380 entry->filename = string;
381 entry->sysrooted = search->sysrooted;
382 return TRUE;
383 }
384
385 if (entry->is_archive)
386 {
387 /* without lib prefix. */
388 sprintf (string, "%s%s%s%s%s%s", search->name, slash,
389 entry->filename, arch,
390 (entry->dynamic && ! link_info.relocateable ? "" : "_s"),
391 suffix);
392 if (ldfile_try_open_bfd (string, entry))
393 {
394 entry->filename = string;
395 entry->sysrooted = search->sysrooted;
396 return TRUE;
397 }
398
399 /* inverse the "_s". */
400 sprintf (string, "%s%s%s%s%s%s%s", search->name, slash,
401 lib, entry->filename, arch,
402 (entry->dynamic && ! link_info.relocateable ? "_s" : ""),
403 suffix);
404 if (ldfile_try_open_bfd (string, entry))
405 {
406 entry->filename = string;
407 entry->sysrooted = search->sysrooted;
408 return TRUE;
409 }
410
411 /* without lib prefix and inverse "_s". */
412 sprintf (string, "%s%s%s%s%s%s", search->name, slash,
413 entry->filename, arch,
414 (entry->dynamic && ! link_info.relocateable ? "_s" : ""),
415 suffix);
416 if (ldfile_try_open_bfd (string, entry))
417 {
418 entry->filename = string;
419 entry->sysrooted = search->sysrooted;
420 return TRUE;
421 }
422 }
423#else /* __EMX__ ^ */
424 if (entry->is_archive)
425 sprintf (string, "%s%s%s%s%s%s", search->name, slash,
426 lib, entry->filename, arch, suffix);
427 else
428 sprintf (string, "%s%s%s", search->name, slash, entry->filename);
429
430 if (ldfile_try_open_bfd (string, entry))
431 {
432 entry->filename = string;
433 entry->sysrooted = search->sysrooted;
434 return TRUE;
435 }
436#endif /* __EMX__ */
437
438
439 free (string);
440 }
441
442 return FALSE;
443}
444
445/* Open the input file specified by ENTRY. */
446
447void
448ldfile_open_file (entry)
449 lang_input_statement_type *entry;
450{
451 if (entry->the_bfd != NULL)
452 return;
453
454 if (! entry->search_dirs_flag)
455 {
456 if (ldfile_try_open_bfd (entry->filename, entry))
457 return;
458 if (strcmp (entry->filename, entry->local_sym_name) != 0)
459 einfo (_("%F%P: cannot open %s for %s: %E\n"),
460 entry->filename, entry->local_sym_name);
461 else
462 einfo (_("%F%P: cannot open %s: %E\n"), entry->local_sym_name);
463 }
464 else
465 {
466 search_arch_type *arch;
467 bfd_boolean found = FALSE;
468
469 /* Try to open <filename><suffix> or lib<filename><suffix>.a */
470 for (arch = search_arch_head;
471 arch != (search_arch_type *) NULL;
472 arch = arch->next)
473 {
474 found = ldfile_open_file_search (arch->name, entry, "lib", ".a");
475 if (found)
476 break;
477#ifdef VMS
478 found = ldfile_open_file_search (arch->name, entry, ":lib", ".a");
479 if (found)
480 break;
481#endif
482 found = ldemul_find_potential_libraries (arch->name, entry);
483 if (found)
484 break;
485 }
486
487 /* If we have found the file, we don't need to search directories
488 again. */
489 if (found)
490 entry->search_dirs_flag = FALSE;
491 else if (entry->sysrooted
492 && ld_sysroot
493 && IS_ABSOLUTE_PATH (entry->local_sym_name))
494 einfo (_("%F%P: cannot find %s inside %s\n"),
495 entry->local_sym_name, ld_sysroot);
496 else
497 einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name);
498 }
499}
500
501/* Try to open NAME; if that fails, try NAME with EXTEN appended to it. */
502
503static FILE *
504try_open (name, exten)
505 const char *name;
506 const char *exten;
507{
508 FILE *result;
509 char buff[1000];
510
511 result = fopen (name, "r");
512
513 if (trace_file_tries)
514 {
515 if (result == NULL)
516 info_msg (_("cannot find script file %s\n"), name);
517 else
518 info_msg (_("opened script file %s\n"), name);
519 }
520
521 if (result != NULL)
522 return result;
523
524 if (*exten)
525 {
526 sprintf (buff, "%s%s", name, exten);
527 result = fopen (buff, "r");
528
529 if (trace_file_tries)
530 {
531 if (result == NULL)
532 info_msg (_("cannot find script file %s\n"), buff);
533 else
534 info_msg (_("opened script file %s\n"), buff);
535 }
536 }
537
538 return result;
539}
540
541/* Try to open NAME; if that fails, look for it in any directories
542 specified with -L, without and with EXTEND appended. */
543
544FILE *
545ldfile_find_command_file (name, extend)
546 const char *name;
547 const char *extend;
548{
549 search_dirs_type *search;
550 FILE *result;
551 char buffer[1000];
552
553 /* First try raw name. */
554 result = try_open (name, "");
555 if (result == (FILE *) NULL)
556 {
557 /* Try now prefixes. */
558 for (search = search_head;
559 search != (search_dirs_type *) NULL;
560 search = search->next)
561 {
562 sprintf (buffer, "%s%s%s", search->name, slash, name);
563
564 result = try_open (buffer, extend);
565 if (result)
566 break;
567 }
568 }
569
570 return result;
571}
572
573void
574ldfile_open_command_file (name)
575 const char *name;
576{
577 FILE *ldlex_input_stack;
578 ldlex_input_stack = ldfile_find_command_file (name, "");
579
580 if (ldlex_input_stack == (FILE *) NULL)
581 {
582 bfd_set_error (bfd_error_system_call);
583 einfo (_("%P%F: cannot open linker script file %s: %E\n"), name);
584 }
585
586 lex_push_file (ldlex_input_stack, name);
587
588 ldfile_input_filename = name;
589 lineno = 1;
590
591 saved_script_handle = ldlex_input_stack;
592}
593
594#ifdef GNU960
595static char *
596gnu960_map_archname (name)
597 char *name;
598{
599 struct tabentry { char *cmd_switch; char *arch; };
600 static struct tabentry arch_tab[] =
601 {
602 "", "",
603 "KA", "ka",
604 "KB", "kb",
605 "KC", "mc", /* Synonym for MC */
606 "MC", "mc",
607 "CA", "ca",
608 "SA", "ka", /* Functionally equivalent to KA */
609 "SB", "kb", /* Functionally equivalent to KB */
610 NULL, ""
611 };
612 struct tabentry *tp;
613
614 for (tp = arch_tab; tp->cmd_switch != NULL; tp++)
615 {
616 if (! strcmp (name,tp->cmd_switch))
617 break;
618 }
619
620 if (tp->cmd_switch == NULL)
621 einfo (_("%P%F: unknown architecture: %s\n"), name);
622
623 return tp->arch;
624}
625
626void
627ldfile_add_arch (name)
628 char *name;
629{
630 search_arch_type *new =
631 (search_arch_type *) xmalloc ((bfd_size_type) (sizeof (search_arch_type)));
632
633 if (*name != '\0')
634 {
635 if (ldfile_output_machine_name[0] != '\0')
636 {
637 einfo (_("%P%F: target architecture respecified\n"));
638 return;
639 }
640
641 ldfile_output_machine_name = name;
642 }
643
644 new->next = (search_arch_type *) NULL;
645 new->name = gnu960_map_archname (name);
646 *search_arch_tail_ptr = new;
647 search_arch_tail_ptr = &new->next;
648}
649
650#else /* not GNU960 */
651
652void
653ldfile_add_arch (in_name)
654 const char *in_name;
655{
656 char *name = xstrdup (in_name);
657 search_arch_type *new =
658 (search_arch_type *) xmalloc (sizeof (search_arch_type));
659
660 ldfile_output_machine_name = in_name;
661
662 new->name = name;
663 new->next = (search_arch_type *) NULL;
664 while (*name)
665 {
666 *name = TOLOWER (*name);
667 name++;
668 }
669 *search_arch_tail_ptr = new;
670 search_arch_tail_ptr = &new->next;
671
672}
673#endif
674
675/* Set the output architecture. */
676
677void
678ldfile_set_output_arch (string)
679 const char *string;
680{
681 const bfd_arch_info_type *arch = bfd_scan_arch (string);
682
683 if (arch)
684 {
685 ldfile_output_architecture = arch->arch;
686 ldfile_output_machine = arch->mach;
687 ldfile_output_machine_name = arch->printable_name;
688 }
689 else
690 {
691 einfo (_("%P%F: cannot represent machine `%s'\n"), string);
692 }
693}
Note: See TracBrowser for help on using the repository browser.