2010-11-23 Phil Muldoon <pmuldoon@redhat.com>
[deliverable/binutils-gdb.git] / ld / ldfile.c
CommitLineData
a9998805 1/* Linker file opening and searching.
5e2f1575 2 Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002,
c4b78195 3 2003, 2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
252b5132 4
f96b4a7b 5 This file is part of the GNU Binutils.
252b5132 6
f96b4a7b 7 This program is free software; you can redistribute it and/or modify
3fe38064 8 it under the terms of the GNU General Public License as published by
f96b4a7b
NC
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
252b5132 11
f96b4a7b 12 This program is distributed in the hope that it will be useful,
3fe38064
NC
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.
252b5132 16
3fe38064 17 You should have received a copy of the GNU General Public License
f96b4a7b
NC
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
252b5132 21
252b5132 22#include "sysdep.h"
3db64b00 23#include "bfd.h"
252b5132 24#include "bfdlink.h"
3882b010 25#include "safe-ctype.h"
252b5132
RH
26#include "ld.h"
27#include "ldmisc.h"
28#include "ldexp.h"
29#include "ldlang.h"
30#include "ldfile.h"
31#include "ldmain.h"
df2a7313 32#include <ldgram.h>
252b5132
RH
33#include "ldlex.h"
34#include "ldemul.h"
d1b2b2dc 35#include "libiberty.h"
3fe38064 36#include "filenames.h"
5d3236ee
DK
37#ifdef ENABLE_PLUGINS
38#include "plugin-api.h"
39#include "plugin.h"
40#endif /* ENABLE_PLUGINS */
252b5132 41
3fe38064
NC
42const char * ldfile_input_filename;
43bfd_boolean ldfile_assumed_script = FALSE;
44const char * ldfile_output_machine_name = "";
252b5132
RH
45unsigned long ldfile_output_machine;
46enum bfd_architecture ldfile_output_architecture;
3fe38064 47search_dirs_type * search_head;
252b5132 48
252b5132 49#ifdef VMS
279e75dc 50static char * slash = "";
252b5132
RH
51#else
52#if defined (_WIN32) && ! defined (__CYGWIN32__)
279e75dc 53static char * slash = "\\";
252b5132 54#else
279e75dc 55static char * slash = "/";
252b5132
RH
56#endif
57#endif
252b5132 58
3fe38064
NC
59typedef struct search_arch
60{
4de2d33d 61 char *name;
252b5132
RH
62 struct search_arch *next;
63} search_arch_type;
64
3fe38064 65static search_dirs_type **search_tail_ptr = &search_head;
252b5132
RH
66static search_arch_type *search_arch_head;
67static search_arch_type **search_arch_tail_ptr = &search_arch_head;
4de2d33d 68
3fe38064
NC
69/* Test whether a pathname, after canonicalization, is the same or a
70 sub-directory of the sysroot directory. */
71
72static bfd_boolean
1579bae1 73is_sysrooted_pathname (const char *name, bfd_boolean notsame)
3fe38064
NC
74{
75 char * realname = ld_canon_sysroot ? lrealpath (name) : NULL;
76 int len;
77 bfd_boolean result;
78
79 if (! realname)
80 return FALSE;
5e2f1575 81
3fe38064
NC
82 len = strlen (realname);
83
84 if (((! notsame && len == ld_canon_sysroot_len)
85 || (len >= ld_canon_sysroot_len
86 && IS_DIR_SEPARATOR (realname[ld_canon_sysroot_len])
87 && (realname[ld_canon_sysroot_len] = '\0') == '\0'))
88 && FILENAME_CMP (ld_canon_sysroot, realname) == 0)
89 result = TRUE;
90 else
91 result = FALSE;
92
93 if (realname)
94 free (realname);
95
96 return result;
97}
252b5132 98
5ed6aba4
NC
99/* Adds NAME to the library search path.
100 Makes a copy of NAME using xmalloc(). */
101
252b5132 102void
1579bae1 103ldfile_add_library_path (const char *name, bfd_boolean cmdline)
252b5132 104{
d3ce72d0 105 search_dirs_type *new_dirs;
252b5132 106
361b220e
CD
107 if (!cmdline && config.only_cmd_line_lib_dirs)
108 return;
109
d3ce72d0
NC
110 new_dirs = (search_dirs_type *) xmalloc (sizeof (search_dirs_type));
111 new_dirs->next = NULL;
112 new_dirs->cmdline = cmdline;
113 *search_tail_ptr = new_dirs;
114 search_tail_ptr = &new_dirs->next;
9c8ebd6a
DJ
115
116 /* If a directory is marked as honoring sysroot, prepend the sysroot path
117 now. */
5ed6aba4 118 if (name[0] == '=')
e3f2db7f 119 {
d3ce72d0
NC
120 new_dirs->name = concat (ld_sysroot, name + 1, (const char *) NULL);
121 new_dirs->sysrooted = TRUE;
e3f2db7f
AO
122 }
123 else
5ed6aba4 124 {
d3ce72d0
NC
125 new_dirs->name = xstrdup (name);
126 new_dirs->sysrooted = is_sysrooted_pathname (name, FALSE);
5ed6aba4 127 }
252b5132
RH
128}
129
130/* Try to open a BFD for a lang_input_statement. */
131
b34976b6 132bfd_boolean
1579bae1
AM
133ldfile_try_open_bfd (const char *attempt,
134 lang_input_statement_type *entry)
252b5132
RH
135{
136 entry->the_bfd = bfd_openr (attempt, entry->target);
137
138 if (trace_file_tries)
139 {
140 if (entry->the_bfd == NULL)
141 info_msg (_("attempt to open %s failed\n"), attempt);
142 else
143 info_msg (_("attempt to open %s succeeded\n"), attempt);
144 }
145
b90d1146 146 if (entry->the_bfd == NULL)
252b5132
RH
147 {
148 if (bfd_get_error () == bfd_error_invalid_target)
149 einfo (_("%F%P: invalid BFD target `%s'\n"), entry->target);
b34976b6 150 return FALSE;
252b5132 151 }
b90d1146 152
4a114e3e
L
153 /* Linker needs to decompress sections. */
154 entry->the_bfd->flags |= BFD_DECOMPRESS;
155
b90d1146
ILT
156 /* If we are searching for this file, see if the architecture is
157 compatible with the output file. If it isn't, keep searching.
158 If we can't open the file as an object file, stop the search
6c0c5b1e 159 here. If we are statically linking, ensure that we don't link
5d3236ee
DK
160 a dynamic object.
161
162 In the code below, it's OK to exit early if the check fails,
163 closing the checked BFD and returning FALSE, but if the BFD
164 checks out compatible, do not exit early returning TRUE, or
165 the plugins will not get a chance to claim the file. */
b90d1146 166
6c0c5b1e 167 if (entry->search_dirs_flag || !entry->dynamic)
b90d1146
ILT
168 {
169 bfd *check;
170
171 if (bfd_check_format (entry->the_bfd, bfd_archive))
172 check = bfd_openr_next_archived_file (entry->the_bfd, NULL);
173 else
174 check = entry->the_bfd;
175
a9998805 176 if (check != NULL)
b90d1146 177 {
a9998805 178 if (! bfd_check_format (check, bfd_object))
599917b8
JJ
179 {
180 if (check == entry->the_bfd
6c0c5b1e 181 && entry->search_dirs_flag
599917b8
JJ
182 && bfd_get_error () == bfd_error_file_not_recognized
183 && ! ldemul_unrecognized_file (entry))
184 {
185 int token, skip = 0;
186 char *arg, *arg1, *arg2, *arg3;
187 extern FILE *yyin;
188
189 /* Try to interpret the file as a linker script. */
190 ldfile_open_command_file (attempt);
b34976b6
AM
191
192 ldfile_assumed_script = TRUE;
599917b8
JJ
193 parser_input = input_selected;
194 ldlex_both ();
195 token = INPUT_SCRIPT;
196 while (token != 0)
197 {
198 switch (token)
199 {
200 case OUTPUT_FORMAT:
201 if ((token = yylex ()) != '(')
202 continue;
203 if ((token = yylex ()) != NAME)
204 continue;
205 arg1 = yylval.name;
206 arg2 = NULL;
207 arg3 = NULL;
208 token = yylex ();
209 if (token == ',')
210 {
211 if ((token = yylex ()) != NAME)
212 {
213 free (arg1);
214 continue;
215 }
216 arg2 = yylval.name;
217 if ((token = yylex ()) != ','
218 || (token = yylex ()) != NAME)
219 {
220 free (arg1);
221 free (arg2);
222 continue;
223 }
224 arg3 = yylval.name;
225 token = yylex ();
226 }
227 if (token == ')')
228 {
229 switch (command_line.endian)
230 {
231 default:
232 case ENDIAN_UNSET:
233 arg = arg1; break;
234 case ENDIAN_BIG:
235 arg = arg2 ? arg2 : arg1; break;
236 case ENDIAN_LITTLE:
237 arg = arg3 ? arg3 : arg1; break;
238 }
239 if (strcmp (arg, lang_get_output_target ()) != 0)
240 skip = 1;
241 }
242 free (arg1);
243 if (arg2) free (arg2);
244 if (arg3) free (arg3);
245 break;
246 case NAME:
247 case LNAME:
248 case VERS_IDENTIFIER:
249 case VERS_TAG:
250 free (yylval.name);
251 break;
252 case INT:
253 if (yylval.bigint.str)
254 free (yylval.bigint.str);
255 break;
5e2f1575 256 }
599917b8
JJ
257 token = yylex ();
258 }
4f39e302 259 ldlex_popstate ();
b34976b6 260 ldfile_assumed_script = FALSE;
599917b8
JJ
261 fclose (yyin);
262 yyin = NULL;
263 if (skip)
264 {
fe7929ce
AM
265 if (command_line.warn_search_mismatch)
266 einfo (_("%P: skipping incompatible %s "
267 "when searching for %s\n"),
268 attempt, entry->local_sym_name);
599917b8
JJ
269 bfd_close (entry->the_bfd);
270 entry->the_bfd = NULL;
b34976b6 271 return FALSE;
599917b8
JJ
272 }
273 }
5d3236ee 274 goto success;
599917b8 275 }
f1f0d9ab 276
6c0c5b1e
AM
277 if (!entry->dynamic && (entry->the_bfd->flags & DYNAMIC) != 0)
278 {
279 einfo (_("%F%P: attempted static link of dynamic object `%s'\n"),
280 attempt);
281 bfd_close (entry->the_bfd);
282 entry->the_bfd = NULL;
283 return FALSE;
284 }
285
286 if (entry->search_dirs_flag
f13a99db 287 && !bfd_arch_get_compatible (check, link_info.output_bfd,
6c0c5b1e 288 command_line.accept_unknown_input_arch)
312b768e 289 /* XCOFF archives can have 32 and 64 bit objects. */
f1f0d9ab 290 && ! (bfd_get_flavour (check) == bfd_target_xcoff_flavour
f13a99db 291 && bfd_get_flavour (link_info.output_bfd) == bfd_target_xcoff_flavour
f1f0d9ab 292 && bfd_check_format (entry->the_bfd, bfd_archive)))
a9998805 293 {
fe7929ce
AM
294 if (command_line.warn_search_mismatch)
295 einfo (_("%P: skipping incompatible %s "
296 "when searching for %s\n"),
297 attempt, entry->local_sym_name);
a9998805
ILT
298 bfd_close (entry->the_bfd);
299 entry->the_bfd = NULL;
b34976b6 300 return FALSE;
a9998805 301 }
b90d1146
ILT
302 }
303 }
5d3236ee
DK
304success:
305#ifdef ENABLE_PLUGINS
306 /* If plugins are active, they get first chance to claim
307 any successfully-opened input file. We skip archives
308 here; the plugin wants us to offer it the individual
309 members when we enumerate them, not the whole file. We
310 also ignore corefiles, because that's just weird. It is
311 a needed side-effect of calling bfd_check_format with
312 bfd_object that it sets the bfd's arch and mach, which
313 will be needed when and if we want to bfd_create a new
314 one using this one as a template. */
d44ad554 315 if (bfd_check_format (entry->the_bfd, bfd_object)
f84854b6 316 && plugin_active_plugins_p ())
5d3236ee
DK
317 {
318 int fd = open (attempt, O_RDONLY | O_BINARY);
319 if (fd >= 0)
320 {
321 struct ld_plugin_input_file file;
322 int claimed = 0;
323
324 file.name = attempt;
325 file.offset = 0;
326 file.filesize = lseek (fd, 0, SEEK_END);
327 file.fd = fd;
328 /* We create a dummy BFD, initially empty, to house
329 whatever symbols the plugin may want to add. */
330 file.handle = plugin_get_ir_dummy_bfd (attempt, entry->the_bfd);
331 if (plugin_call_claim_file (&file, &claimed))
332 einfo (_("%P%F: %s: plugin reported error claiming file\n"),
f84854b6 333 plugin_error_plugin ());
d44ad554
DK
334 /* fd belongs to us, not the plugin; but we don't need it. */
335 close (fd);
5d3236ee
DK
336 if (claimed)
337 {
338 /* Discard the real file's BFD and substitute the dummy one. */
339 bfd_close (entry->the_bfd);
340 entry->the_bfd = file.handle;
341 entry->claimed = TRUE;
342 bfd_make_readable (entry->the_bfd);
343 }
344 else
345 {
d44ad554 346 /* If plugin didn't claim the file, we don't need the dummy
f84854b6 347 bfd. Can't avoid speculatively creating it, alas. */
5d3236ee 348 bfd_close_all_done (file.handle);
5d3236ee
DK
349 entry->claimed = FALSE;
350 }
351 }
352 }
353#endif /* ENABLE_PLUGINS */
b90d1146 354
5d3236ee
DK
355 /* It opened OK, the format checked out, and the plugins have had
356 their chance to claim it, so this is success. */
b34976b6 357 return TRUE;
252b5132
RH
358}
359
360/* Search for and open the file specified by ENTRY. If it is an
361 archive, use ARCH, LIB and SUFFIX to modify the file name. */
362
b34976b6 363bfd_boolean
1579bae1
AM
364ldfile_open_file_search (const char *arch,
365 lang_input_statement_type *entry,
366 const char *lib,
367 const char *suffix)
252b5132
RH
368{
369 search_dirs_type *search;
370
371 /* If this is not an archive, try to open it in the current
372 directory first. */
373 if (! entry->is_archive)
374 {
3fe38064 375 if (entry->sysrooted && IS_ABSOLUTE_PATH (entry->filename))
e3f2db7f
AO
376 {
377 char *name = concat (ld_sysroot, entry->filename,
378 (const char *) NULL);
379 if (ldfile_try_open_bfd (name, entry))
380 {
381 entry->filename = name;
382 return TRUE;
383 }
384 free (name);
385 }
386 else if (ldfile_try_open_bfd (entry->filename, entry))
387 {
3fe38064
NC
388 entry->sysrooted = IS_ABSOLUTE_PATH (entry->filename)
389 && is_sysrooted_pathname (entry->filename, TRUE);
e3f2db7f
AO
390 return TRUE;
391 }
3fe38064
NC
392
393 if (IS_ABSOLUTE_PATH (entry->filename))
394 return FALSE;
252b5132
RH
395 }
396
1579bae1 397 for (search = search_head; search != NULL; search = search->next)
252b5132
RH
398 {
399 char *string;
400
1049f94e 401 if (entry->dynamic && ! link_info.relocatable)
252b5132
RH
402 {
403 if (ldemul_open_dynamic_archive (arch, search, entry))
e3f2db7f
AO
404 {
405 entry->sysrooted = search->sysrooted;
406 return TRUE;
407 }
252b5132
RH
408 }
409
252b5132 410 if (entry->is_archive)
a26cc967
AM
411 string = concat (search->name, slash, lib, entry->filename,
412 arch, suffix, (const char *) NULL);
252b5132 413 else
a26cc967
AM
414 string = concat (search->name, slash, entry->filename,
415 (const char *) 0);
252b5132
RH
416
417 if (ldfile_try_open_bfd (string, entry))
418 {
b90d1146 419 entry->filename = string;
e3f2db7f 420 entry->sysrooted = search->sysrooted;
b34976b6 421 return TRUE;
252b5132
RH
422 }
423
424 free (string);
425 }
426
b34976b6 427 return FALSE;
252b5132
RH
428}
429
c4b78195
NC
430/* Open the input file specified by ENTRY.
431 PR 4437: Do not stop on the first missing file, but
432 continue processing other input files in case there
433 are more errors to report. */
252b5132
RH
434
435void
1579bae1 436ldfile_open_file (lang_input_statement_type *entry)
252b5132
RH
437{
438 if (entry->the_bfd != NULL)
439 return;
440
441 if (! entry->search_dirs_flag)
442 {
443 if (ldfile_try_open_bfd (entry->filename, entry))
444 return;
c4b78195 445
252b5132 446 if (strcmp (entry->filename, entry->local_sym_name) != 0)
c4b78195 447 einfo (_("%P: cannot find %s (%s): %E\n"),
252b5132
RH
448 entry->filename, entry->local_sym_name);
449 else
c4b78195
NC
450 einfo (_("%P: cannot find %s: %E\n"), entry->local_sym_name);
451
452 entry->missing_file = TRUE;
453 missing_file = TRUE;
252b5132
RH
454 }
455 else
456 {
457 search_arch_type *arch;
b34976b6 458 bfd_boolean found = FALSE;
252b5132
RH
459
460 /* Try to open <filename><suffix> or lib<filename><suffix>.a */
1579bae1 461 for (arch = search_arch_head; arch != NULL; arch = arch->next)
252b5132 462 {
78f85fd7
L
463 found = ldfile_open_file_search (arch->name, entry, "lib", ".a");
464 if (found)
465 break;
252b5132 466#ifdef VMS
78f85fd7
L
467 found = ldfile_open_file_search (arch->name, entry, ":lib", ".a");
468 if (found)
469 break;
252b5132 470#endif
78f85fd7
L
471 found = ldemul_find_potential_libraries (arch->name, entry);
472 if (found)
473 break;
252b5132 474 }
4de2d33d 475
78f85fd7
L
476 /* If we have found the file, we don't need to search directories
477 again. */
478 if (found)
b34976b6 479 entry->search_dirs_flag = FALSE;
c4b78195
NC
480 else
481 {
482 if (entry->sysrooted
3fe38064
NC
483 && ld_sysroot
484 && IS_ABSOLUTE_PATH (entry->local_sym_name))
c4b78195
NC
485 einfo (_("%P: cannot find %s inside %s\n"),
486 entry->local_sym_name, ld_sysroot);
487 else
488 einfo (_("%P: cannot find %s\n"), entry->local_sym_name);
489 entry->missing_file = TRUE;
490 missing_file = TRUE;
491 }
252b5132
RH
492 }
493}
494
495/* Try to open NAME; if that fails, try NAME with EXTEN appended to it. */
496
497static FILE *
1579bae1 498try_open (const char *name, const char *exten)
252b5132
RH
499{
500 FILE *result;
252b5132
RH
501
502 result = fopen (name, "r");
4de2d33d 503
252b5132
RH
504 if (trace_file_tries)
505 {
506 if (result == NULL)
507 info_msg (_("cannot find script file %s\n"), name);
508 else
509 info_msg (_("opened script file %s\n"), name);
510 }
511
512 if (result != NULL)
513 return result;
514
515 if (*exten)
516 {
a26cc967
AM
517 char *buff;
518
519 buff = concat (name, exten, (const char *) NULL);
252b5132 520 result = fopen (buff, "r");
4de2d33d 521
252b5132
RH
522 if (trace_file_tries)
523 {
524 if (result == NULL)
525 info_msg (_("cannot find script file %s\n"), buff);
526 else
527 info_msg (_("opened script file %s\n"), buff);
528 }
a26cc967 529 free (buff);
252b5132
RH
530 }
531
532 return result;
533}
534
a8caa245
AM
535/* Return TRUE iff directory DIR contains an "ldscripts" subdirectory. */
536
537static bfd_boolean
538check_for_scripts_dir (char *dir)
539{
540 char *buf;
541 struct stat s;
542 bfd_boolean res;
543
544 buf = concat (dir, "/ldscripts", (const char *) NULL);
545 res = stat (buf, &s) == 0 && S_ISDIR (s.st_mode);
546 free (buf);
547 return res;
548}
549
550/* Return the default directory for finding script files.
551 We look for the "ldscripts" directory in:
552
553 SCRIPTDIR (passed from Makefile)
554 (adjusted according to the current location of the binary)
c38b10fa 555 the dir where this program is (for using it from the build tree). */
a8caa245
AM
556
557static char *
558find_scripts_dir (void)
559{
c38b10fa 560 char *dir;
a8caa245
AM
561
562 dir = make_relative_prefix (program_name, BINDIR, SCRIPTDIR);
563 if (dir)
564 {
565 if (check_for_scripts_dir (dir))
566 return dir;
567 free (dir);
568 }
569
570 dir = make_relative_prefix (program_name, TOOLBINDIR, SCRIPTDIR);
571 if (dir)
572 {
573 if (check_for_scripts_dir (dir))
574 return dir;
575 free (dir);
576 }
577
a8caa245 578 /* Look for "ldscripts" in the dir where our binary is. */
c38b10fa
AM
579 dir = make_relative_prefix (program_name, ".", ".");
580 if (dir)
581 {
582 if (check_for_scripts_dir (dir))
583 return dir;
584 free (dir);
585 }
a8caa245 586
a8caa245
AM
587 return NULL;
588}
589
8c3e16f4
L
590/* If DEFAULT_ONLY is false, try to open NAME; if that fails, look for
591 it in directories specified with -L, then in the default script
592 directory, without and with EXTEND appended. If DEFAULT_ONLY is
593 true, the search is restricted to the default script location. */
252b5132 594
279e75dc 595static FILE *
7d24f02c
KH
596ldfile_find_command_file (const char *name, const char *extend,
597 bfd_boolean default_only)
252b5132
RH
598{
599 search_dirs_type *search;
32252ac1 600 FILE *result = NULL;
a8caa245
AM
601 char *buffer;
602 static search_dirs_type *script_search;
252b5132 603
8c3e16f4
L
604 if (!default_only)
605 {
606 /* First try raw name. */
607 result = try_open (name, "");
608 if (result != NULL)
609 return result;
610 }
a8caa245
AM
611
612 if (!script_search)
1c64c4ed 613 {
a8caa245
AM
614 char *script_dir = find_scripts_dir ();
615 if (script_dir)
1c64c4ed 616 {
a8caa245
AM
617 search_dirs_type **save_tail_ptr = search_tail_ptr;
618 search_tail_ptr = &script_search;
619 ldfile_add_library_path (script_dir, TRUE);
620 search_tail_ptr = save_tail_ptr;
1c64c4ed 621 }
a8caa245
AM
622 }
623
7d24f02c
KH
624 /* Temporarily append script_search to the path list so that the
625 paths specified with -L will be searched first. */
626 *search_tail_ptr = script_search;
627
a8caa245 628 /* Try now prefixes. */
7d24f02c
KH
629 for (search = default_only ? script_search : search_head;
630 search != NULL;
631 search = search->next)
a8caa245 632 {
a8caa245
AM
633 buffer = concat (search->name, slash, name, (const char *) NULL);
634 result = try_open (buffer, extend);
635 free (buffer);
636 if (result)
637 break;
252b5132 638 }
4de2d33d 639
7d24f02c
KH
640 /* Restore the original path list. */
641 *search_tail_ptr = NULL;
642
252b5132
RH
643 return result;
644}
645
7d24f02c
KH
646/* Open command file NAME. */
647
648static void
649ldfile_open_command_file_1 (const char *name, bfd_boolean default_only)
252b5132
RH
650{
651 FILE *ldlex_input_stack;
7d24f02c 652 ldlex_input_stack = ldfile_find_command_file (name, "", default_only);
252b5132 653
1579bae1 654 if (ldlex_input_stack == NULL)
1c64c4ed
NC
655 {
656 bfd_set_error (bfd_error_system_call);
657 einfo (_("%P%F: cannot open linker script file %s: %E\n"), name);
658 }
4de2d33d 659
1c64c4ed 660 lex_push_file (ldlex_input_stack, name);
4de2d33d 661
252b5132
RH
662 ldfile_input_filename = name;
663 lineno = 1;
b7a26f91 664
b9a8de1e 665 saved_script_handle = ldlex_input_stack;
252b5132
RH
666}
667
7d24f02c
KH
668/* Open command file NAME in the current directory, -L directories,
669 the default script location, in that order. */
670
671void
672ldfile_open_command_file (const char *name)
673{
674 ldfile_open_command_file_1 (name, FALSE);
675}
676
677/* Open command file NAME at the default script location. */
678
679void
680ldfile_open_default_command_file (const char *name)
681{
682 ldfile_open_command_file_1 (name, TRUE);
683}
684
252b5132 685void
1579bae1 686ldfile_add_arch (const char *in_name)
252b5132 687{
d1b2b2dc 688 char *name = xstrdup (in_name);
d3ce72d0
NC
689 search_arch_type *new_arch = (search_arch_type *)
690 xmalloc (sizeof (search_arch_type));
252b5132
RH
691
692 ldfile_output_machine_name = in_name;
693
d3ce72d0
NC
694 new_arch->name = name;
695 new_arch->next = NULL;
252b5132
RH
696 while (*name)
697 {
3882b010 698 *name = TOLOWER (*name);
252b5132
RH
699 name++;
700 }
d3ce72d0
NC
701 *search_arch_tail_ptr = new_arch;
702 search_arch_tail_ptr = &new_arch->next;
252b5132
RH
703
704}
252b5132 705
89cdebba
KH
706/* Set the output architecture. */
707
252b5132 708void
5e2f1575 709ldfile_set_output_arch (const char *string, enum bfd_architecture defarch)
252b5132 710{
1c64c4ed
NC
711 const bfd_arch_info_type *arch = bfd_scan_arch (string);
712
713 if (arch)
714 {
715 ldfile_output_architecture = arch->arch;
716 ldfile_output_machine = arch->mach;
717 ldfile_output_machine_name = arch->printable_name;
718 }
5e2f1575
AM
719 else if (defarch != bfd_arch_unknown)
720 ldfile_output_architecture = defarch;
1c64c4ed 721 else
5e2f1575 722 einfo (_("%P%F: cannot represent machine `%s'\n"), string);
252b5132 723}
This page took 0.499662 seconds and 4 git commands to generate.