Fix formatting.
[deliverable/binutils-gdb.git] / ld / ldfile.c
CommitLineData
a9998805
ILT
1/* Linker file opening and searching.
2 Copyright (C) 1991, 92, 93, 94, 95, 98, 99, 2000
3 Free Software Foundation, Inc.
252b5132
RH
4
5This file is part of GLD, the Gnu Linker.
6
7GLD is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GLD is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GLD; see the file COPYING. If not, write to the Free
19Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2002111-1307, USA. */
21
22/*
23 ldfile.c
24
25 look after all the file stuff
26
27 */
28
29#include "bfd.h"
30#include "sysdep.h"
31#include "bfdlink.h"
32#include "ld.h"
33#include "ldmisc.h"
34#include "ldexp.h"
35#include "ldlang.h"
36#include "ldfile.h"
37#include "ldmain.h"
38#include "ldgram.h"
39#include "ldlex.h"
40#include "ldemul.h"
41
42#include <ctype.h>
43
44const char *ldfile_input_filename;
45boolean ldfile_assumed_script = false;
46const char *ldfile_output_machine_name = "";
47unsigned long ldfile_output_machine;
48enum bfd_architecture ldfile_output_architecture;
49search_dirs_type *search_head;
50
51#ifndef MPW
52#ifdef VMS
53char *slash = "";
54#else
55#if defined (_WIN32) && ! defined (__CYGWIN32__)
56char *slash = "\\";
57#else
58char *slash = "/";
59#endif
60#endif
61#else /* MPW */
62/* The MPW path char is a colon. */
63char *slash = ":";
64#endif /* MPW */
65
66/* LOCAL */
67
68static search_dirs_type **search_tail_ptr = &search_head;
69
70typedef struct search_arch
71{
72 char *name;
73 struct search_arch *next;
74} search_arch_type;
75
76static search_arch_type *search_arch_head;
77static search_arch_type **search_arch_tail_ptr = &search_arch_head;
78
252b5132
RH
79static FILE *try_open PARAMS ((const char *name, const char *exten));
80
81void
82ldfile_add_library_path (name, cmdline)
83 const char *name;
84 boolean cmdline;
85{
86 search_dirs_type *new;
87
88 new = (search_dirs_type *) xmalloc (sizeof (search_dirs_type));
89 new->next = NULL;
90 new->name = name;
91 new->cmdline = cmdline;
92 *search_tail_ptr = new;
93 search_tail_ptr = &new->next;
94}
95
96/* Try to open a BFD for a lang_input_statement. */
97
98boolean
99ldfile_try_open_bfd (attempt, entry)
100 const char *attempt;
101 lang_input_statement_type *entry;
102{
103 entry->the_bfd = bfd_openr (attempt, entry->target);
104
105 if (trace_file_tries)
106 {
107 if (entry->the_bfd == NULL)
108 info_msg (_("attempt to open %s failed\n"), attempt);
109 else
110 info_msg (_("attempt to open %s succeeded\n"), attempt);
111 }
112
b90d1146 113 if (entry->the_bfd == NULL)
252b5132
RH
114 {
115 if (bfd_get_error () == bfd_error_invalid_target)
116 einfo (_("%F%P: invalid BFD target `%s'\n"), entry->target);
117 return false;
118 }
b90d1146
ILT
119
120 /* If we are searching for this file, see if the architecture is
121 compatible with the output file. If it isn't, keep searching.
122 If we can't open the file as an object file, stop the search
123 here. */
124
125 if (entry->search_dirs_flag)
126 {
127 bfd *check;
128
129 if (bfd_check_format (entry->the_bfd, bfd_archive))
130 check = bfd_openr_next_archived_file (entry->the_bfd, NULL);
131 else
132 check = entry->the_bfd;
133
a9998805 134 if (check != NULL)
b90d1146 135 {
a9998805
ILT
136 if (! bfd_check_format (check, bfd_object))
137 return true;
138 if (bfd_arch_get_compatible (check, output_bfd) == NULL)
139 {
140 einfo (_("%P: skipping incompatible %s when searching for %s"),
141 attempt, entry->local_sym_name);
142 bfd_close (entry->the_bfd);
143 entry->the_bfd = NULL;
144 return false;
145 }
b90d1146
ILT
146 }
147 }
148
149 return true;
252b5132
RH
150}
151
152/* Search for and open the file specified by ENTRY. If it is an
153 archive, use ARCH, LIB and SUFFIX to modify the file name. */
154
344a211f 155boolean
252b5132
RH
156ldfile_open_file_search (arch, entry, lib, suffix)
157 const char *arch;
158 lang_input_statement_type *entry;
159 const char *lib;
160 const char *suffix;
161{
162 search_dirs_type *search;
163
164 /* If this is not an archive, try to open it in the current
165 directory first. */
166 if (! entry->is_archive)
167 {
168 if (ldfile_try_open_bfd (entry->filename, entry))
169 return true;
170 }
171
172 for (search = search_head;
173 search != (search_dirs_type *)NULL;
174 search = search->next)
175 {
176 char *string;
177
178 if (entry->dynamic && ! link_info.relocateable)
179 {
180 if (ldemul_open_dynamic_archive (arch, search, entry))
181 return true;
182 }
183
184 string = (char *) xmalloc (strlen (search->name)
185 + strlen (slash)
186 + strlen (lib)
187 + strlen (entry->filename)
188 + strlen (arch)
189 + strlen (suffix)
190 + 1);
191
192 if (entry->is_archive)
193 sprintf (string, "%s%s%s%s%s%s", search->name, slash,
194 lib, entry->filename, arch, suffix);
195 else if (entry->filename[0] == '/' || entry->filename[0] == '.'
196#if defined (__MSDOS__) || defined (_WIN32)
197 || entry->filename[0] == '\\'
198 || (isalpha (entry->filename[0])
199 && entry->filename[1] == ':')
200#endif
201 )
202 strcpy (string, entry->filename);
203 else
204 sprintf (string, "%s%s%s", search->name, slash, entry->filename);
205
206 if (ldfile_try_open_bfd (string, entry))
207 {
b90d1146
ILT
208 entry->filename = string;
209 return true;
252b5132
RH
210 }
211
212 free (string);
213 }
214
215 return false;
216}
217
218/* Open the input file specified by ENTRY. */
219
220void
221ldfile_open_file (entry)
222 lang_input_statement_type *entry;
223{
224 if (entry->the_bfd != NULL)
225 return;
226
227 if (! entry->search_dirs_flag)
228 {
229 if (ldfile_try_open_bfd (entry->filename, entry))
230 return;
231 if (strcmp (entry->filename, entry->local_sym_name) != 0)
232 einfo (_("%F%P: cannot open %s for %s: %E\n"),
233 entry->filename, entry->local_sym_name);
234 else
235 einfo(_("%F%P: cannot open %s: %E\n"), entry->local_sym_name);
236 }
237 else
238 {
239 search_arch_type *arch;
240
241 /* Try to open <filename><suffix> or lib<filename><suffix>.a */
242 for (arch = search_arch_head;
243 arch != (search_arch_type *) NULL;
244 arch = arch->next)
245 {
246 if (ldfile_open_file_search (arch->name, entry, "lib", ".a"))
247 return;
248#ifdef VMS
249 if (ldfile_open_file_search (arch->name, entry, ":lib", ".a"))
250 return;
251#endif
344a211f
NC
252 if (ldemul_find_potential_libraries (arch->name, entry))
253 return;
252b5132
RH
254 }
255 einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name);
256 }
257}
258
259/* Try to open NAME; if that fails, try NAME with EXTEN appended to it. */
260
261static FILE *
262try_open (name, exten)
263 const char *name;
264 const char *exten;
265{
266 FILE *result;
267 char buff[1000];
268
269 result = fopen (name, "r");
270 if (trace_file_tries)
271 {
272 if (result == NULL)
273 info_msg (_("cannot find script file %s\n"), name);
274 else
275 info_msg (_("opened script file %s\n"), name);
276 }
277
278 if (result != NULL)
279 return result;
280
281 if (*exten)
282 {
283 sprintf (buff, "%s%s", name, exten);
284 result = fopen (buff, "r");
285 if (trace_file_tries)
286 {
287 if (result == NULL)
288 info_msg (_("cannot find script file %s\n"), buff);
289 else
290 info_msg (_("opened script file %s\n"), buff);
291 }
292 }
293
294 return result;
295}
296
297/* Try to open NAME; if that fails, look for it in any directories
298 specified with -L, without and with EXTEND apppended. */
299
300FILE *
301ldfile_find_command_file (name, extend)
302 const char *name;
303 const char *extend;
304{
305 search_dirs_type *search;
306 FILE *result;
307 char buffer[1000];
308
309 /* First try raw name */
310 result = try_open(name,"");
311 if (result == (FILE *)NULL) {
312 /* Try now prefixes */
313 for (search = search_head;
314 search != (search_dirs_type *)NULL;
315 search = search->next) {
316 sprintf(buffer,"%s%s%s", search->name, slash, name);
317 result = try_open(buffer, extend);
318 if (result)break;
319 }
320 }
321 return result;
322}
323
324void
325ldfile_open_command_file (name)
326 const char *name;
327{
328 FILE *ldlex_input_stack;
329 ldlex_input_stack = ldfile_find_command_file(name, "");
330
331 if (ldlex_input_stack == (FILE *)NULL) {
332 bfd_set_error (bfd_error_system_call);
333 einfo(_("%P%F: cannot open linker script file %s: %E\n"),name);
334 }
335 lex_push_file(ldlex_input_stack, name);
336
337 ldfile_input_filename = name;
338 lineno = 1;
339 had_script = true;
340}
341
342
343
344
345
346#ifdef GNU960
347static
348char *
349gnu960_map_archname( name )
350char *name;
351{
352 struct tabentry { char *cmd_switch; char *arch; };
353 static struct tabentry arch_tab[] = {
354 "", "",
355 "KA", "ka",
356 "KB", "kb",
357 "KC", "mc", /* Synonym for MC */
358 "MC", "mc",
359 "CA", "ca",
360 "SA", "ka", /* Functionally equivalent to KA */
361 "SB", "kb", /* Functionally equivalent to KB */
362 NULL, ""
363 };
364 struct tabentry *tp;
365
366
367 for ( tp = arch_tab; tp->cmd_switch != NULL; tp++ ){
368 if ( !strcmp(name,tp->cmd_switch) ){
369 break;
370 }
371 }
372
373 if ( tp->cmd_switch == NULL ){
374 einfo(_("%P%F: unknown architecture: %s\n"),name);
375 }
376 return tp->arch;
377}
378
379
380
381void
382ldfile_add_arch(name)
383char *name;
384{
385 search_arch_type *new =
386 (search_arch_type *)xmalloc((bfd_size_type)(sizeof(search_arch_type)));
387
388
389 if (*name != '\0') {
390 if (ldfile_output_machine_name[0] != '\0') {
391 einfo(_("%P%F: target architecture respecified\n"));
392 return;
393 }
394 ldfile_output_machine_name = name;
395 }
396
397 new->next = (search_arch_type*)NULL;
398 new->name = gnu960_map_archname( name );
399 *search_arch_tail_ptr = new;
400 search_arch_tail_ptr = &new->next;
401
402}
403
404#else /* not GNU960 */
405
406
407void
408ldfile_add_arch (in_name)
409 CONST char * in_name;
410{
411 char *name = buystring(in_name);
412 search_arch_type *new =
413 (search_arch_type *) xmalloc (sizeof (search_arch_type));
414
415 ldfile_output_machine_name = in_name;
416
417 new->name = name;
418 new->next = (search_arch_type*)NULL;
419 while (*name)
420 {
421 if (isupper ((unsigned char) *name))
422 *name = tolower ((unsigned char) *name);
423 name++;
424 }
425 *search_arch_tail_ptr = new;
426 search_arch_tail_ptr = &new->next;
427
428}
429#endif
430
431/* Set the output architecture */
432void
433ldfile_set_output_arch (string)
434 CONST char *string;
435{
436 const bfd_arch_info_type *arch = bfd_scan_arch(string);
437
438 if (arch) {
439 ldfile_output_architecture = arch->arch;
440 ldfile_output_machine = arch->mach;
441 ldfile_output_machine_name = arch->printable_name;
442 }
443 else {
444 einfo(_("%P%F: cannot represent machine `%s'\n"), string);
445 }
446}
This page took 0.067231 seconds and 4 git commands to generate.