Fix memory leaks
[binutils-gdb.git] / ld / ldfile.c
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
40 const char * ldfile_input_filename;
41 bfd_boolean ldfile_assumed_script = FALSE;
42 const char * ldfile_output_machine_name = "";
43 unsigned long ldfile_output_machine;
44 enum bfd_architecture ldfile_output_architecture;
45 search_dirs_type * search_head;
46
47 #ifndef MPW
48 #ifdef VMS
49 char * slash = "";
50 #else
51 #if defined (_WIN32) && ! defined (__CYGWIN32__)
52 char * slash = "\\";
53 #else
54 char * slash = "/";
55 #endif
56 #endif
57 #else /* MPW */
58 /* The MPW path char is a colon. */
59 char * slash = ":";
60 #endif /* MPW */
61
62 typedef struct search_arch
63 {
64 char *name;
65 struct search_arch *next;
66 } search_arch_type;
67
68 static search_dirs_type **search_tail_ptr = &search_head;
69 static search_arch_type *search_arch_head;
70 static search_arch_type **search_arch_tail_ptr = &search_arch_head;
71
72 static FILE *try_open
73 PARAMS ((const char *, const char *));
74 static 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
80 static bfd_boolean
81 is_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
112 void
113 ldfile_add_library_path (name, cmdline)
114 const char *name;
115 bfd_boolean cmdline;
116 {
117 search_dirs_type *new;
118 char *newname;
119
120 if (!cmdline && config.only_cmd_line_lib_dirs)
121 return;
122
123 new = (search_dirs_type *) xmalloc (sizeof (search_dirs_type));
124 new->next = NULL;
125 new->cmdline = cmdline;
126 *search_tail_ptr = new;
127 search_tail_ptr = &new->next;
128
129 /* If a directory is marked as honoring sysroot, prepend the sysroot path
130 now. */
131 if (name[0] == '=')
132 {
133 new->name = concat (ld_sysroot, name + 1, NULL);
134 new->sysrooted = TRUE;
135 }
136 else
137 {
138 new->name = xstrdup (name);
139 new->sysrooted = is_sysrooted_pathname (name, FALSE);
140 }
141 }
142
143 /* Try to open a BFD for a lang_input_statement. */
144
145 bfd_boolean
146 ldfile_try_open_bfd (attempt, entry)
147 const char *attempt;
148 lang_input_statement_type *entry;
149 {
150 entry->the_bfd = bfd_openr (attempt, entry->target);
151
152 if (trace_file_tries)
153 {
154 if (entry->the_bfd == NULL)
155 info_msg (_("attempt to open %s failed\n"), attempt);
156 else
157 info_msg (_("attempt to open %s succeeded\n"), attempt);
158 }
159
160 if (entry->the_bfd == NULL)
161 {
162 if (bfd_get_error () == bfd_error_invalid_target)
163 einfo (_("%F%P: invalid BFD target `%s'\n"), entry->target);
164 return FALSE;
165 }
166
167 /* If we are searching for this file, see if the architecture is
168 compatible with the output file. If it isn't, keep searching.
169 If we can't open the file as an object file, stop the search
170 here. */
171
172 if (entry->search_dirs_flag)
173 {
174 bfd *check;
175
176 if (bfd_check_format (entry->the_bfd, bfd_archive))
177 check = bfd_openr_next_archived_file (entry->the_bfd, NULL);
178 else
179 check = entry->the_bfd;
180
181 if (check != NULL)
182 {
183 if (! bfd_check_format (check, bfd_object))
184 {
185 if (check == entry->the_bfd
186 && bfd_get_error () == bfd_error_file_not_recognized
187 && ! ldemul_unrecognized_file (entry))
188 {
189 int token, skip = 0;
190 char *arg, *arg1, *arg2, *arg3;
191 extern FILE *yyin;
192
193 /* Try to interpret the file as a linker script. */
194 ldfile_open_command_file (attempt);
195
196 ldfile_assumed_script = TRUE;
197 parser_input = input_selected;
198 ldlex_both ();
199 token = INPUT_SCRIPT;
200 while (token != 0)
201 {
202 switch (token)
203 {
204 case OUTPUT_FORMAT:
205 if ((token = yylex ()) != '(')
206 continue;
207 if ((token = yylex ()) != NAME)
208 continue;
209 arg1 = yylval.name;
210 arg2 = NULL;
211 arg3 = NULL;
212 token = yylex ();
213 if (token == ',')
214 {
215 if ((token = yylex ()) != NAME)
216 {
217 free (arg1);
218 continue;
219 }
220 arg2 = yylval.name;
221 if ((token = yylex ()) != ','
222 || (token = yylex ()) != NAME)
223 {
224 free (arg1);
225 free (arg2);
226 continue;
227 }
228 arg3 = yylval.name;
229 token = yylex ();
230 }
231 if (token == ')')
232 {
233 switch (command_line.endian)
234 {
235 default:
236 case ENDIAN_UNSET:
237 arg = arg1; break;
238 case ENDIAN_BIG:
239 arg = arg2 ? arg2 : arg1; break;
240 case ENDIAN_LITTLE:
241 arg = arg3 ? arg3 : arg1; break;
242 }
243 if (strcmp (arg, lang_get_output_target ()) != 0)
244 skip = 1;
245 }
246 free (arg1);
247 if (arg2) free (arg2);
248 if (arg3) free (arg3);
249 break;
250 case NAME:
251 case LNAME:
252 case VERS_IDENTIFIER:
253 case VERS_TAG:
254 free (yylval.name);
255 break;
256 case INT:
257 if (yylval.bigint.str)
258 free (yylval.bigint.str);
259 break;
260 }
261 token = yylex ();
262 }
263 ldlex_popstate ();
264 ldfile_assumed_script = FALSE;
265 fclose (yyin);
266 yyin = NULL;
267 if (skip)
268 {
269 einfo (_("%P: skipping incompatible %s when searching for %s\n"),
270 attempt, entry->local_sym_name);
271 bfd_close (entry->the_bfd);
272 entry->the_bfd = NULL;
273 return FALSE;
274 }
275 }
276 return TRUE;
277 }
278
279 if ((bfd_arch_get_compatible (check, output_bfd,
280 command_line.accept_unknown_input_arch) == NULL)
281 /* XCOFF archives can have 32 and 64 bit objects. */
282 && ! (bfd_get_flavour (check) == bfd_target_xcoff_flavour
283 && bfd_get_flavour (output_bfd) == bfd_target_xcoff_flavour
284 && bfd_check_format (entry->the_bfd, bfd_archive)))
285 {
286 einfo (_("%P: skipping incompatible %s when searching for %s\n"),
287 attempt, entry->local_sym_name);
288 bfd_close (entry->the_bfd);
289 entry->the_bfd = NULL;
290 return FALSE;
291 }
292 }
293 }
294
295 return TRUE;
296 }
297
298 /* Search for and open the file specified by ENTRY. If it is an
299 archive, use ARCH, LIB and SUFFIX to modify the file name. */
300
301 bfd_boolean
302 ldfile_open_file_search (arch, entry, lib, suffix)
303 const char *arch;
304 lang_input_statement_type *entry;
305 const char *lib;
306 const char *suffix;
307 {
308 search_dirs_type *search;
309
310 /* If this is not an archive, try to open it in the current
311 directory first. */
312 if (! entry->is_archive)
313 {
314 if (entry->sysrooted && IS_ABSOLUTE_PATH (entry->filename))
315 {
316 char *name = concat (ld_sysroot, entry->filename,
317 (const char *) NULL);
318 if (ldfile_try_open_bfd (name, entry))
319 {
320 entry->filename = name;
321 return TRUE;
322 }
323 free (name);
324 }
325 else if (ldfile_try_open_bfd (entry->filename, entry))
326 {
327 entry->sysrooted = IS_ABSOLUTE_PATH (entry->filename)
328 && is_sysrooted_pathname (entry->filename, TRUE);
329 return TRUE;
330 }
331
332 if (IS_ABSOLUTE_PATH (entry->filename))
333 return FALSE;
334 }
335
336 for (search = search_head;
337 search != (search_dirs_type *) NULL;
338 search = search->next)
339 {
340 char *string;
341
342 if (entry->dynamic && ! link_info.relocateable)
343 {
344 if (ldemul_open_dynamic_archive (arch, search, entry))
345 {
346 entry->sysrooted = search->sysrooted;
347 return TRUE;
348 }
349 }
350
351 string = (char *) xmalloc (strlen (search->name)
352 + strlen (slash)
353 + strlen (lib)
354 + strlen (entry->filename)
355 + strlen (arch)
356 + strlen (suffix)
357 + 1);
358
359 if (entry->is_archive)
360 sprintf (string, "%s%s%s%s%s%s", search->name, slash,
361 lib, entry->filename, arch, suffix);
362 else
363 sprintf (string, "%s%s%s", search->name, slash, entry->filename);
364
365 if (ldfile_try_open_bfd (string, entry))
366 {
367 entry->filename = string;
368 entry->sysrooted = search->sysrooted;
369 return TRUE;
370 }
371
372 free (string);
373 }
374
375 return FALSE;
376 }
377
378 /* Open the input file specified by ENTRY. */
379
380 void
381 ldfile_open_file (entry)
382 lang_input_statement_type *entry;
383 {
384 if (entry->the_bfd != NULL)
385 return;
386
387 if (! entry->search_dirs_flag)
388 {
389 if (ldfile_try_open_bfd (entry->filename, entry))
390 return;
391 if (strcmp (entry->filename, entry->local_sym_name) != 0)
392 einfo (_("%F%P: cannot open %s for %s: %E\n"),
393 entry->filename, entry->local_sym_name);
394 else
395 einfo (_("%F%P: cannot open %s: %E\n"), entry->local_sym_name);
396 }
397 else
398 {
399 search_arch_type *arch;
400 bfd_boolean found = FALSE;
401
402 /* Try to open <filename><suffix> or lib<filename><suffix>.a */
403 for (arch = search_arch_head;
404 arch != (search_arch_type *) NULL;
405 arch = arch->next)
406 {
407 found = ldfile_open_file_search (arch->name, entry, "lib", ".a");
408 if (found)
409 break;
410 #ifdef VMS
411 found = ldfile_open_file_search (arch->name, entry, ":lib", ".a");
412 if (found)
413 break;
414 #endif
415 found = ldemul_find_potential_libraries (arch->name, entry);
416 if (found)
417 break;
418 }
419
420 /* If we have found the file, we don't need to search directories
421 again. */
422 if (found)
423 entry->search_dirs_flag = FALSE;
424 else if (entry->sysrooted
425 && ld_sysroot
426 && IS_ABSOLUTE_PATH (entry->local_sym_name))
427 einfo (_("%F%P: cannot find %s inside %s\n"),
428 entry->local_sym_name, ld_sysroot);
429 else
430 einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name);
431 }
432 }
433
434 /* Try to open NAME; if that fails, try NAME with EXTEN appended to it. */
435
436 static FILE *
437 try_open (name, exten)
438 const char *name;
439 const char *exten;
440 {
441 FILE *result;
442 char buff[1000];
443
444 result = fopen (name, "r");
445
446 if (trace_file_tries)
447 {
448 if (result == NULL)
449 info_msg (_("cannot find script file %s\n"), name);
450 else
451 info_msg (_("opened script file %s\n"), name);
452 }
453
454 if (result != NULL)
455 return result;
456
457 if (*exten)
458 {
459 sprintf (buff, "%s%s", name, exten);
460 result = fopen (buff, "r");
461
462 if (trace_file_tries)
463 {
464 if (result == NULL)
465 info_msg (_("cannot find script file %s\n"), buff);
466 else
467 info_msg (_("opened script file %s\n"), buff);
468 }
469 }
470
471 return result;
472 }
473
474 /* Try to open NAME; if that fails, look for it in any directories
475 specified with -L, without and with EXTEND appended. */
476
477 FILE *
478 ldfile_find_command_file (name, extend)
479 const char *name;
480 const char *extend;
481 {
482 search_dirs_type *search;
483 FILE *result;
484 char buffer[1000];
485
486 /* First try raw name. */
487 result = try_open (name, "");
488 if (result == (FILE *) NULL)
489 {
490 /* Try now prefixes. */
491 for (search = search_head;
492 search != (search_dirs_type *) NULL;
493 search = search->next)
494 {
495 sprintf (buffer, "%s%s%s", search->name, slash, name);
496
497 result = try_open (buffer, extend);
498 if (result)
499 break;
500 }
501 }
502
503 return result;
504 }
505
506 void
507 ldfile_open_command_file (name)
508 const char *name;
509 {
510 FILE *ldlex_input_stack;
511 ldlex_input_stack = ldfile_find_command_file (name, "");
512
513 if (ldlex_input_stack == (FILE *) NULL)
514 {
515 bfd_set_error (bfd_error_system_call);
516 einfo (_("%P%F: cannot open linker script file %s: %E\n"), name);
517 }
518
519 lex_push_file (ldlex_input_stack, name);
520
521 ldfile_input_filename = name;
522 lineno = 1;
523
524 saved_script_handle = ldlex_input_stack;
525 }
526
527 #ifdef GNU960
528 static char *
529 gnu960_map_archname (name)
530 char *name;
531 {
532 struct tabentry { char *cmd_switch; char *arch; };
533 static struct tabentry arch_tab[] =
534 {
535 "", "",
536 "KA", "ka",
537 "KB", "kb",
538 "KC", "mc", /* Synonym for MC */
539 "MC", "mc",
540 "CA", "ca",
541 "SA", "ka", /* Functionally equivalent to KA */
542 "SB", "kb", /* Functionally equivalent to KB */
543 NULL, ""
544 };
545 struct tabentry *tp;
546
547 for (tp = arch_tab; tp->cmd_switch != NULL; tp++)
548 {
549 if (! strcmp (name,tp->cmd_switch))
550 break;
551 }
552
553 if (tp->cmd_switch == NULL)
554 einfo (_("%P%F: unknown architecture: %s\n"), name);
555
556 return tp->arch;
557 }
558
559 void
560 ldfile_add_arch (name)
561 char *name;
562 {
563 search_arch_type *new =
564 (search_arch_type *) xmalloc ((bfd_size_type) (sizeof (search_arch_type)));
565
566 if (*name != '\0')
567 {
568 if (ldfile_output_machine_name[0] != '\0')
569 {
570 einfo (_("%P%F: target architecture respecified\n"));
571 return;
572 }
573
574 ldfile_output_machine_name = name;
575 }
576
577 new->next = (search_arch_type *) NULL;
578 new->name = gnu960_map_archname (name);
579 *search_arch_tail_ptr = new;
580 search_arch_tail_ptr = &new->next;
581 }
582
583 #else /* not GNU960 */
584
585 void
586 ldfile_add_arch (in_name)
587 const char *in_name;
588 {
589 char *name = xstrdup (in_name);
590 search_arch_type *new =
591 (search_arch_type *) xmalloc (sizeof (search_arch_type));
592
593 ldfile_output_machine_name = in_name;
594
595 new->name = name;
596 new->next = (search_arch_type *) NULL;
597 while (*name)
598 {
599 *name = TOLOWER (*name);
600 name++;
601 }
602 *search_arch_tail_ptr = new;
603 search_arch_tail_ptr = &new->next;
604
605 }
606 #endif
607
608 /* Set the output architecture. */
609
610 void
611 ldfile_set_output_arch (string)
612 const char *string;
613 {
614 const bfd_arch_info_type *arch = bfd_scan_arch (string);
615
616 if (arch)
617 {
618 ldfile_output_architecture = arch->arch;
619 ldfile_output_machine = arch->mach;
620 ldfile_output_machine_name = arch->printable_name;
621 }
622 else
623 {
624 einfo (_("%P%F: cannot represent machine `%s'\n"), string);
625 }
626 }