*** empty log message ***
[deliverable/binutils-gdb.git] / ld / ldmain.c
CommitLineData
2fa0b342 1/* Copyright (C) 1991 Free Software Foundation, Inc.
ce4d59e2 2 Written by Steve Chamberlain steve@cygnus.com
e47bfa63 3
2fa0b342
DHW
4This file is part of GLD, the Gnu Linker.
5
6GLD is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
ce4d59e2 8the Free Software Foundation; either version 2, or (at your option)
2fa0b342
DHW
9any later version.
10
11GLD is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GLD; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
2fa0b342 20
2fa0b342 21#include "bfd.h"
f177a611 22#include "sysdep.h"
2fa0b342
DHW
23
24#include "config.h"
25#include "ld.h"
26#include "ldmain.h"
27#include "ldmisc.h"
28#include "ldwrite.h"
29#include "ldgram.h"
30#include "ldsym.h"
31#include "ldlang.h"
8c514453 32#include "ldemul.h"
2fa0b342
DHW
33#include "ldlex.h"
34#include "ldfile.h"
c611e285
SC
35#include "ldindr.h"
36#include "ldwarn.h"
37#include "ldctor.h"
9d1fe8a4
SC
38#include "lderror.h"
39
2fa0b342
DHW
40/* IMPORTS */
41extern boolean lang_has_input_file;
1418c83b 42extern boolean trace_files;
e47bfa63 43
2fa0b342
DHW
44/* EXPORTS */
45
46char *default_target;
47char *output_filename = "a.out";
e47bfa63 48
2fa0b342
DHW
49/* Name this program was invoked by. */
50char *program_name;
51
52/* The file that we're creating */
b6316534 53bfd *output_bfd = 0;
2fa0b342
DHW
54
55extern boolean option_v;
56
57/* The local symbol prefix */
58char lprefix = 'L';
59
60/* Count the number of global symbols multiply defined. */
61int multiple_def_count;
62
2fa0b342
DHW
63/* Count the number of symbols defined through common declarations.
64 This count is referenced in symdef_library, linear_library, and
65 modified by enter_global_ref.
66
67 It is incremented when a symbol is created as a common, and
68 decremented when the common declaration is overridden
69
70 Another way of thinking of it is that this is a count of
3e4c643d 71 all ldsym_types with a ->scoms field */
2fa0b342 72
3e4c643d 73unsigned int commons_pending;
2fa0b342 74
e47bfa63 75/* Count the number of global symbols referenced and not defined.
3e4c643d 76 common symbols are not included in this count. */
2fa0b342
DHW
77
78unsigned int undefined_global_sym_count;
79
2fa0b342
DHW
80/* Count the number of warning symbols encountered. */
81int warning_count;
82
83/* have we had a load script ? */
84extern boolean had_script;
85
2fa0b342
DHW
86/* Nonzero means print names of input files as processed. */
87boolean trace_files;
88
2fa0b342
DHW
89/* 1 => write load map. */
90boolean write_map;
91
92
93int unix_relocate;
e47bfa63 94
81016051
SC
95#ifdef GNU960
96/* Indicates whether output file will be b.out (default) or coff */
f177a611 97enum target_flavour output_flavor = BFD_BOUT_FORMAT;
e47bfa63 98
81016051 99#endif
2fa0b342 100
2fa0b342
DHW
101/* Force the make_executable to be output, even if there are non-fatal
102 errors */
103boolean force_make_executable;
104
2fa0b342
DHW
105/* A count of the total number of local symbols ever seen - by adding
106 the symbol_count field of each newly read afile.*/
107
2fa0b342
DHW
108unsigned int total_symbols_seen;
109
110/* A count of the number of read files - the same as the number of elements
111 in file_chain
112 */
113unsigned int total_files_seen;
114
2fa0b342
DHW
115/* IMPORTS */
116args_type command_line;
117ld_config_type config;
9d1fe8a4 118void
2fa0b342
DHW
119main (argc, argv)
120 char **argv;
121 int argc;
122{
123 char *emulation;
e47bfa63 124
2fa0b342
DHW
125 program_name = argv[0];
126 output_filename = "a.out";
99fe4553 127
e47bfa63 128 bfd_init ();
bfbdc80f 129
99fe4553 130#ifdef GNU960
e47bfa63
SC
131 {
132 int i;
133
134 check_v960 (argc, argv);
135 emulation = "gld960";
136 for (i = 1; i < argc; i++)
137 {
138 if (!strcmp (argv[i], "-Fcoff"))
139 {
140 emulation = "lnk960";
141 output_flavor = BFD_COFF_FORMAT;
142 break;
143 }
144 }
145 }
81016051 146#else
e47bfa63 147 emulation = (char *) getenv (EMULATION_ENVIRON);
99fe4553
SC
148#endif
149
2fa0b342 150 /* Initialize the data about options. */
76855794 151
9d1fe8a4 152
2fa0b342 153 trace_files = false;
2fa0b342
DHW
154 write_map = false;
155 config.relocateable_output = false;
156 unix_relocate = 0;
157 command_line.force_common_definition = false;
158
e47bfa63
SC
159 init_bfd_error_vector ();
160 ldsym_init ();
161 ldfile_add_arch ("");
a72f4e5f 162
2fa0b342
DHW
163 config.make_executable = true;
164 force_make_executable = false;
165
166
167 /* Initialize the cumulative counts of symbols. */
168 undefined_global_sym_count = 0;
169 warning_count = 0;
170 multiple_def_count = 0;
171 commons_pending = 0;
172
ce4d59e2
SC
173 config.magic_demand_paged = true;
174 config.text_read_only = true;
2fa0b342 175 config.make_executable = true;
e47bfa63
SC
176 if (emulation == (char *) NULL)
177 {
178 emulation = DEFAULT_EMULATION;
870f54b2 179 }
1418c83b 180
e47bfa63
SC
181 ldemul_choose_mode (emulation);
182 default_target = ldemul_choose_target ();
183 lang_init ();
184 ldemul_before_parse ();
2fa0b342 185 lang_has_input_file = false;
e47bfa63
SC
186 parse_args (argc, argv);
187 lang_final ();
9d1fe8a4 188
e47bfa63
SC
189 if (trace_files)
190 {
9d1fe8a4 191
e47bfa63 192 info ("%P: mode %s\n", emulation);
9d1fe8a4 193
870f54b2 194 }
e47bfa63
SC
195 if (lang_has_input_file == false)
196 {
197 einfo ("%P%F: No input files\n");
870f54b2 198 }
2fa0b342 199
e47bfa63 200 ldemul_after_parse ();
870f54b2 201
9d1fe8a4 202
e47bfa63 203 if (config.map_filename)
870f54b2 204 {
e47bfa63 205 if (strcmp (config.map_filename, "-") == 0)
2e2bf962 206 {
e47bfa63 207 config.map_file = stdout;
2e2bf962 208 }
e47bfa63
SC
209 else
210 {
211 config.map_file = fopen (config.map_filename, FOPEN_WT);
212 if (config.map_file == (FILE *) NULL)
213 {
214 einfo ("%P%F: can't open map file %s\n",
215 config.map_filename);
216 }
217 }
218 }
870f54b2 219
2e2bf962 220
e47bfa63 221 lang_process ();
2fa0b342 222
2fa0b342
DHW
223 /* Print error messages for any missing symbols, for any warning
224 symbols, and possibly multiple definitions */
225
2fa0b342 226
e47bfa63
SC
227 if (config.text_read_only)
228 {
229 /* Look for a text section and mark the readonly attribute in it */
230 asection *found = bfd_get_section_by_name (output_bfd, ".text");
231
232 if (found != (asection *) NULL)
233 {
234 found->flags |= SEC_READONLY;
235 }
3e4c643d 236 }
2fa0b342 237
e47bfa63
SC
238 if (config.relocateable_output)
239 {
870f54b2 240 output_bfd->flags &= ~EXEC_P;
c611e285 241
e47bfa63
SC
242 ldwrite ();
243 bfd_close (output_bfd);
870f54b2 244 }
2fa0b342 245
a72f4e5f 246 else
e47bfa63 247 {
c611e285 248
e47bfa63 249 output_bfd->flags |= EXEC_P;
c611e285 250
e47bfa63 251 ldwrite ();
a72f4e5f
SC
252
253
e47bfa63
SC
254 if (config.make_executable == false && force_make_executable == false)
255 {
b257477f 256
e47bfa63
SC
257 if (trace_files == true)
258 {
259 einfo ("%P: Link errors found, deleting executable `%s'\n",
260 output_filename);
261 }
b257477f 262
e47bfa63
SC
263 if (output_bfd->iostream)
264 fclose ((FILE *) (output_bfd->iostream));
a72f4e5f 265
e47bfa63
SC
266 unlink (output_filename);
267 exit (1);
268 }
269 else
270 {
271 bfd_close (output_bfd);
272 }
2fa0b342 273 }
a72f4e5f
SC
274
275
2fa0b342 276
e47bfa63 277 exit (0);
870f54b2 278} /* main() */
2fa0b342 279
2fa0b342
DHW
280void
281Q_read_entry_symbols (desc, entry)
282 bfd *desc;
283 struct lang_input_statement_struct *entry;
284{
e47bfa63
SC
285 if (entry->asymbols == (asymbol **) NULL)
286 {
287 bfd_size_type table_size = get_symtab_upper_bound (desc);
2fa0b342 288
e47bfa63
SC
289 entry->asymbols = (asymbol **) ldmalloc (table_size);
290 entry->symbol_count = bfd_canonicalize_symtab (desc, entry->asymbols);
291 }
292}
2fa0b342
DHW
293
294/*
e47bfa63 295 * turn this item into a reference
2fa0b342 296 */
e47bfa63
SC
297void
298refize (sp, nlist_p)
299 ldsym_type *sp;
300 asymbol **nlist_p;
2fa0b342
DHW
301{
302 asymbol *sym = *nlist_p;
e47bfa63 303
2fa0b342 304 sym->value = 0;
c611e285
SC
305 sym->flags = 0;
306 sym->section = &bfd_und_section;
e47bfa63 307 sym->udata = (PTR) (sp->srefs_chain);
2fa0b342
DHW
308 sp->srefs_chain = nlist_p;
309}
e47bfa63 310
2fa0b342
DHW
311/*
312This function is called for each name which is seen which has a global
313scope. It enters the name into the global symbol table in the correct
314symbol on the correct chain. Remember that each ldsym_type has three
315chains attatched, one of all definitions of a symbol, one of all
316references of a symbol and one of all common definitions of a symbol.
317
318When the function is over, the supplied is left connected to the bfd
319to which is was born, with its udata field pointing to the next member
320on the chain in which it has been inserted.
321
322A certain amount of jigery pokery is necessary since commons come
323along and upset things, we only keep one item in the common chain; the
324one with the biggest size seen sofar. When another common comes along
325it either bumps the previous definition into the ref chain, since it
326is bigger, or gets turned into a ref on the spot since the one on the
327common chain is already bigger. If a real definition comes along then
328the common gets bumped off anyway.
329
330Whilst all this is going on we keep a count of the number of multiple
331definitions seen, undefined global symbols and pending commons.
332*/
333
c611e285 334extern boolean relaxing;
2fa0b342
DHW
335
336void
e47bfa63
SC
337DEFUN (Q_enter_global_ref, (nlist_p, name),
338 asymbol ** nlist_p AND /* pointer into symbol table from incoming bfd */
339 CONST char *name /* name of symbol in linker table */ )
2fa0b342
DHW
340{
341 asymbol *sym = *nlist_p;
e47bfa63 342 ldsym_type *sp;
b257477f
SC
343
344 /* Lookup the name from the incoming bfd's symbol table in the
345 linker's global symbol table */
2fa0b342 346
2fa0b342 347
b257477f 348 flagword this_symbol_flags = sym->flags;
e47bfa63 349
b257477f 350 sp = ldsym_get (name);
be1627d3
SC
351 /* If this symbol already has udata, it means that something strange
352 has happened.
353
354 The strange thing is that we've had an undefined symbol resolved by
355 an alias, but the thing the alias defined wasn't in the file. So
356 the symbol got a udata entry, but the file wasn't loaded. Then
357 later on the file was loaded, but we don't need to do this
358 processing again */
2fa0b342 359
be1627d3
SC
360
361 if (sym->udata)
362 return;
2fa0b342 363
3e4c643d 364
e47bfa63 365 if (flag_is_constructor (this_symbol_flags))
be1627d3
SC
366 {
367 /* Add this constructor to the list we keep */
368 ldlang_add_constructor (sp);
369 /* Turn any commons into refs */
370 if (sp->scoms_chain != (asymbol **) NULL)
e47bfa63 371 {
be1627d3
SC
372 refize (sp, sp->scoms_chain);
373 sp->scoms_chain = 0;
374 }
3e4c643d 375
81016051 376
be1627d3 377 }
e47bfa63 378 else
be1627d3
SC
379 {
380 if (sym->section == &bfd_com_section)
e47bfa63 381 {
be1627d3
SC
382 /* If we have a definition of this symbol already then
383 this common turns into a reference. Also we only
384 ever point to the largest common, so if we
385 have a common, but it's bigger that the new symbol
386 the turn this into a reference too. */
387 if (sp->sdefs_chain)
388 {
389 /* This is a common symbol, but we already have a definition
390 for it, so just link it into the ref chain as if
391 it were a reference */
392 refize (sp, nlist_p);
393 }
394 else if (sp->scoms_chain)
395 {
396 /* If we have a previous common, keep only the biggest */
397 if ((*(sp->scoms_chain))->value > sym->value)
e47bfa63 398 {
be1627d3
SC
399 /* other common is bigger, throw this one away */
400 refize (sp, nlist_p);
3e4c643d 401 }
be1627d3 402 else if (sp->scoms_chain != nlist_p)
e47bfa63 403 {
be1627d3
SC
404 /* other common is smaller, throw that away */
405 refize (sp, sp->scoms_chain);
406 sp->scoms_chain = nlist_p;
3e4c643d 407 }
be1627d3 408 }
e47bfa63 409 else
be1627d3
SC
410 {
411 /* This is the first time we've seen a common, so remember it
412 - if it was undefined before, we know it's defined now. If
413 the symbol has been marked as really being a constructor,
414 then treat this as a ref
415 */
416 if (sp->flags & SYM_CONSTRUCTOR)
e47bfa63 417 {
be1627d3 418 /* Turn this into a ref */
e47bfa63
SC
419 refize (sp, nlist_p);
420 }
be1627d3
SC
421 else
422 {
423 /* treat like a common */
424 if (sp->srefs_chain)
425 undefined_global_sym_count--;
426
427 commons_pending++;
428 sp->scoms_chain = nlist_p;
429 }
430 }
81016051 431 }
2fa0b342 432
be1627d3
SC
433 else if (sym->section != &bfd_und_section)
434 {
435 /* This is the definition of a symbol, add to def chain */
436 if (sp->sdefs_chain && (*(sp->sdefs_chain))->section != sym->section)
437 {
438 /* Multiple definition */
439 asymbol *sy = *(sp->sdefs_chain);
440 lang_input_statement_type *stat = (lang_input_statement_type *) sy->the_bfd->usrdata;
441 lang_input_statement_type *stat1 = (lang_input_statement_type *) sym->the_bfd->usrdata;
442 asymbol **stat1_symbols = stat1 ? stat1->asymbols : 0;
443 asymbol **stat_symbols = stat ? stat->asymbols : 0;
444
445 multiple_def_count++;
446 einfo ("%X%C: multiple definition of `%T'\n",
447 sym->the_bfd, sym->section, stat1_symbols, sym->value, sym);
448
449 einfo ("%X%C: first seen here\n",
450 sy->the_bfd, sy->section, stat_symbols, sy->value);
451 }
452 else
453 {
454 sym->udata = (PTR) (sp->sdefs_chain);
455 sp->sdefs_chain = nlist_p;
456 }
457 /* A definition overrides a common symbol */
458 if (sp->scoms_chain)
459 {
460 refize (sp, sp->scoms_chain);
461 sp->scoms_chain = 0;
462 commons_pending--;
463 }
464 else if (sp->srefs_chain && relaxing == false)
465 {
466 /* If previously was undefined, then remember as defined */
467 undefined_global_sym_count--;
468 }
469 }
470 else
471 {
472 if (sp->scoms_chain == (asymbol **) NULL
473 && sp->srefs_chain == (asymbol **) NULL
474 && sp->sdefs_chain == (asymbol **) NULL)
475 {
476 /* And it's the first time we've seen it */
477 undefined_global_sym_count++;
478
479 }
480
481 refize (sp, nlist_p);
482 }
483 }
484
e47bfa63
SC
485 ASSERT (sp->sdefs_chain == 0 || sp->scoms_chain == 0);
486 ASSERT (sp->scoms_chain == 0 || (*(sp->scoms_chain))->udata == 0);
2fa0b342
DHW
487
488
489}
490
491static void
492Q_enter_file_symbols (entry)
e47bfa63 493 lang_input_statement_type *entry;
2fa0b342 494{
e47bfa63 495 asymbol **q;
c611e285 496
2fa0b342 497 entry->common_section =
e47bfa63 498 bfd_make_section_old_way (entry->the_bfd, "COMMON");
2fa0b342 499
e47bfa63 500 ldlang_add_file (entry);
2fa0b342 501
fe563ffe 502
e47bfa63 503 if (trace_files || option_v)
2fa0b342 504 {
e47bfa63 505 info ("%I\n", entry);
fe563ffe 506 }
e47bfa63
SC
507
508 total_symbols_seen += entry->symbol_count;
509 total_files_seen++;
510 if (entry->symbol_count)
fe563ffe 511 {
e47bfa63
SC
512 for (q = entry->asymbols; *q; q++)
513 {
514 asymbol *p = *q;
81016051 515
e47bfa63
SC
516 if (p->flags & BSF_INDIRECT)
517 {
518 add_indirect (q);
519 }
520 else if (p->flags & BSF_WARNING)
521 {
522 add_warning (p);
523 }
524 else if (p->section == &bfd_und_section
525 || (p->flags & BSF_GLOBAL)
526 || p->section == &bfd_com_section
527 || (p->flags & BSF_CONSTRUCTOR))
c611e285 528
e47bfa63 529 {
2fa0b342 530
e47bfa63 531 asymbol *p = *q;
2fa0b342 532
e47bfa63
SC
533 if (p->flags & BSF_INDIRECT)
534 {
535 add_indirect (q);
536 }
537 else if (p->flags & BSF_WARNING)
538 {
539 add_warning (p);
540 }
541 else if (p->section == &bfd_und_section
542 || (p->flags & BSF_GLOBAL)
543 || p->section == &bfd_com_section
544 || (p->flags & BSF_CONSTRUCTOR))
545 {
546 Q_enter_global_ref (q, p->name);
547 }
548
549 }
550 }
551 }
552}
2fa0b342
DHW
553
554/* Searching libraries */
555
556struct lang_input_statement_struct *decode_library_subfile ();
557void linear_library (), symdef_library ();
558
559/* Search the library ENTRY, already open on descriptor DESC.
560 This means deciding which library members to load,
561 making a chain of `struct lang_input_statement_struct' for those members,
562 and entering their global symbols in the hash table. */
563
564void
565search_library (entry)
566 struct lang_input_statement_struct *entry;
567{
568
569 /* No need to load a library if no undefined symbols */
e47bfa63
SC
570 if (!undefined_global_sym_count)
571 return;
2fa0b342 572
e47bfa63 573 if (bfd_has_map (entry->the_bfd))
2fa0b342
DHW
574 symdef_library (entry);
575 else
576 linear_library (entry);
577
578}
579
99fe4553
SC
580#ifdef GNU960
581static
e47bfa63 582 boolean
99fe4553 583gnu960_check_format (abfd, format)
e47bfa63
SC
584 bfd *abfd;
585 bfd_format format;
99fe4553
SC
586{
587 boolean retval;
588
e47bfa63
SC
589 if ((bfd_check_format (abfd, format) == true)
590 && (abfd->xvec->flavour == output_flavor))
591 {
592 return true;
593 }
81016051
SC
594
595
99fe4553
SC
596 return false;
597}
e47bfa63 598
99fe4553
SC
599#endif
600
2fa0b342 601void
1418c83b 602ldmain_open_file_read_symbol (entry)
e47bfa63 603 struct lang_input_statement_struct *entry;
2fa0b342 604{
e47bfa63
SC
605 if (entry->asymbols == (asymbol **) NULL
606 && entry->real == true
607 && entry->filename != (char *) NULL)
2fa0b342
DHW
608 {
609 ldfile_open_file (entry);
610
ce4d59e2 611
99fe4553 612#ifdef GNU960
e47bfa63 613 if (gnu960_check_format (entry->the_bfd, bfd_object))
99fe4553 614#else
e47bfa63 615 if (bfd_check_format (entry->the_bfd, bfd_object))
99fe4553 616#endif
2fa0b342 617 {
e47bfa63 618 entry->the_bfd->usrdata = (PTR) entry;
2fa0b342
DHW
619
620
621 Q_read_entry_symbols (entry->the_bfd, entry);
ce4d59e2
SC
622
623 /* look through the sections in the file and see if any of them
624 are constructors */
625 ldlang_check_for_constructors (entry);
626
2fa0b342
DHW
627 Q_enter_file_symbols (entry);
628 }
99fe4553 629#ifdef GNU960
e47bfa63 630 else if (gnu960_check_format (entry->the_bfd, bfd_archive))
99fe4553 631#else
e47bfa63 632 else if (bfd_check_format (entry->the_bfd, bfd_archive))
99fe4553 633#endif
2fa0b342 634 {
e47bfa63 635 entry->the_bfd->usrdata = (PTR) entry;
2fa0b342 636
e47bfa63 637 entry->subfiles = (lang_input_statement_type *) NULL;
2fa0b342
DHW
638 search_library (entry);
639 }
e47bfa63 640 else
2fa0b342 641 {
e47bfa63
SC
642 einfo ("%F%B: malformed input file (not rel or archive) \n",
643 entry->the_bfd);
2fa0b342
DHW
644 }
645 }
646
647}
648
2fa0b342
DHW
649/* Construct and return a lang_input_statement_struct for a library member.
650 The library's lang_input_statement_struct is library_entry,
651 and the library is open on DESC.
652 SUBFILE_OFFSET is the byte index in the library of this member's header.
653 We store the length of the member into *LENGTH_LOC. */
654
655lang_input_statement_type *
656decode_library_subfile (library_entry, subfile_offset)
657 struct lang_input_statement_struct *library_entry;
658 bfd *subfile_offset;
659{
660 register struct lang_input_statement_struct *subentry;
e47bfa63
SC
661 subentry = (struct lang_input_statement_struct *) ldmalloc ((bfd_size_type) (sizeof (struct lang_input_statement_struct)));
662
663 subentry->filename = subfile_offset->filename;
664 subentry->local_sym_name = subfile_offset->filename;
2fa0b342
DHW
665 subentry->asymbols = 0;
666 subentry->the_bfd = subfile_offset;
667 subentry->subfiles = 0;
668 subentry->next = 0;
669 subentry->superfile = library_entry;
670 subentry->is_archive = false;
1418c83b 671
2fa0b342
DHW
672 subentry->just_syms_flag = false;
673 subentry->loaded = false;
674 subentry->chain = 0;
675
676 return subentry;
677}
678
e47bfa63 679boolean subfile_wanted_p ();
2fa0b342 680void
e47bfa63
SC
681clear_syms (entry, offset)
682 struct lang_input_statement_struct *entry;
683 file_ptr offset;
2fa0b342
DHW
684{
685 carsym *car;
e47bfa63
SC
686 unsigned long indx = bfd_get_next_mapent (entry->the_bfd,
687 BFD_NO_MORE_SYMBOLS,
688 &car);
689
690 while (indx != BFD_NO_MORE_SYMBOLS)
691 {
692 if (car->file_offset == offset)
693 {
694 car->name = 0;
695 }
696 indx = bfd_get_next_mapent (entry->the_bfd, indx, &car);
2fa0b342 697 }
2fa0b342
DHW
698
699}
700
701/* Search a library that has a map
702 */
703void
704symdef_library (entry)
705 struct lang_input_statement_struct *entry;
706
707{
708 register struct lang_input_statement_struct *prev = 0;
709
710 boolean not_finished = true;
711
2fa0b342 712 while (not_finished == true)
e47bfa63
SC
713 {
714 carsym *exported_library_name;
715 bfd *prev_archive_member_bfd = 0;
2fa0b342 716
e47bfa63
SC
717 int idx = bfd_get_next_mapent (entry->the_bfd,
718 BFD_NO_MORE_SYMBOLS,
719 &exported_library_name);
2fa0b342 720
e47bfa63 721 not_finished = false;
2fa0b342 722
e47bfa63
SC
723 while (idx != BFD_NO_MORE_SYMBOLS && undefined_global_sym_count)
724 {
2fa0b342 725
e47bfa63
SC
726 if (exported_library_name->name)
727 {
2fa0b342 728
e47bfa63 729 ldsym_type *sp = ldsym_get_soft (exported_library_name->name);
3e4c643d 730
e47bfa63
SC
731 /* If we find a symbol that appears to be needed, think carefully
732 about the archive member that the symbol is in. */
733 /* So - if it exists, and is referenced somewhere and is
734 undefined or */
735 if (sp && sp->srefs_chain && !sp->sdefs_chain)
736 {
737 bfd *archive_member_bfd = bfd_get_elt_at_index (entry->the_bfd, idx);
738 struct lang_input_statement_struct *archive_member_lang_input_statement_struct;
2fa0b342 739
99fe4553 740#ifdef GNU960
e47bfa63 741 if (archive_member_bfd && gnu960_check_format (archive_member_bfd, bfd_object))
99fe4553 742#else
e47bfa63 743 if (archive_member_bfd && bfd_check_format (archive_member_bfd, bfd_object))
99fe4553 744#endif
e47bfa63 745 {
2fa0b342 746
e47bfa63
SC
747 /* Don't think carefully about any archive member
748 more than once in a given pass. */
749 if (prev_archive_member_bfd != archive_member_bfd)
750 {
2fa0b342 751
e47bfa63 752 prev_archive_member_bfd = archive_member_bfd;
2fa0b342 753
e47bfa63 754 /* Read the symbol table of the archive member. */
2fa0b342 755
e47bfa63
SC
756 if (archive_member_bfd->usrdata != (PTR) NULL)
757 {
2fa0b342 758
e47bfa63
SC
759 archive_member_lang_input_statement_struct = (lang_input_statement_type *) archive_member_bfd->usrdata;
760 }
761 else
762 {
2fa0b342 763
e47bfa63
SC
764 archive_member_lang_input_statement_struct =
765 decode_library_subfile (entry, archive_member_bfd);
766 archive_member_bfd->usrdata = (PTR) archive_member_lang_input_statement_struct;
2fa0b342 767
e47bfa63 768 }
2fa0b342 769
e47bfa63
SC
770 if (archive_member_lang_input_statement_struct == 0)
771 {
772 einfo ("%F%I contains invalid archive member %s\n",
773 entry, sp->name);
774 }
2fa0b342 775
e47bfa63
SC
776 if (archive_member_lang_input_statement_struct->loaded == false)
777 {
2fa0b342 778
e47bfa63
SC
779 Q_read_entry_symbols (archive_member_bfd, archive_member_lang_input_statement_struct);
780 /* Now scan the symbol table and decide whether to load. */
2fa0b342
DHW
781
782
e47bfa63 783 if (subfile_wanted_p (archive_member_lang_input_statement_struct) == true)
2fa0b342 784
e47bfa63
SC
785 {
786 /* This member is needed; load it.
787 Since we are loading something on this pass,
788 we must make another pass through the symdef data. */
2fa0b342 789
e47bfa63 790 not_finished = true;
2fa0b342 791
e47bfa63 792 Q_enter_file_symbols (archive_member_lang_input_statement_struct);
2fa0b342 793
e47bfa63
SC
794 if (prev)
795 prev->chain = archive_member_lang_input_statement_struct;
796 else
797 entry->subfiles = archive_member_lang_input_statement_struct;
2fa0b342
DHW
798
799
e47bfa63 800 prev = archive_member_lang_input_statement_struct;
2fa0b342
DHW
801
802
e47bfa63
SC
803 /* Clear out this member's symbols from the symdef data
804 so that following passes won't waste time on them. */
805 clear_syms (entry, exported_library_name->file_offset);
806 archive_member_lang_input_statement_struct->loaded = true;
2fa0b342 807 }
e47bfa63 808 }
2fa0b342 809 }
e47bfa63
SC
810 }
811 }
2fa0b342 812 }
e47bfa63
SC
813 idx = bfd_get_next_mapent (entry->the_bfd, idx, &exported_library_name);
814 }
815 }
2fa0b342
DHW
816}
817
818void
819linear_library (entry)
e47bfa63 820 struct lang_input_statement_struct *entry;
2fa0b342
DHW
821{
822 boolean more_to_do = true;
823 register struct lang_input_statement_struct *prev = 0;
824
e47bfa63
SC
825 if (entry->complained == false)
826 {
827 einfo ("%P: library %s has bad table of contents, rerun ranlib\n",
828 entry->the_bfd->filename);
829 entry->complained = true;
830 }
831 while (more_to_do)
832 {
2fa0b342 833
e47bfa63 834 bfd *archive = bfd_openr_next_archived_file (entry->the_bfd, 0);
2fa0b342 835
e47bfa63
SC
836 more_to_do = false;
837 while (archive)
838 {
99fe4553 839#ifdef GNU960
e47bfa63 840 if (gnu960_check_format (archive, bfd_object))
99fe4553 841#else
e47bfa63 842 if (bfd_check_format (archive, bfd_object))
99fe4553 843#endif
e47bfa63
SC
844 {
845 register struct lang_input_statement_struct *subentry;
2fa0b342 846
e47bfa63
SC
847 subentry = decode_library_subfile (entry,
848 archive);
2fa0b342 849
e47bfa63
SC
850 archive->usrdata = (PTR) subentry;
851 if (!subentry)
852 return;
853 if (subentry->loaded == false)
854 {
855 Q_read_entry_symbols (archive, subentry);
2fa0b342 856
e47bfa63
SC
857 if (subfile_wanted_p (subentry) == true)
858 {
859 Q_enter_file_symbols (subentry);
2fa0b342 860
e47bfa63
SC
861 if (prev)
862 prev->chain = subentry;
863 else
864 entry->subfiles = subentry;
865 prev = subentry;
866
867 more_to_do = true;
868 subentry->loaded = true;
869 }
870 }
871 }
872 archive = bfd_openr_next_archived_file (entry->the_bfd, archive);
2fa0b342 873
2fa0b342 874 }
2fa0b342 875
e47bfa63 876 }
2fa0b342
DHW
877}
878
e47bfa63
SC
879 /* ENTRY is an entry for a file inside an archive
880 Its symbols have been read into core, but not entered into the
881 linker ymbol table
882 Return nonzero if we ought to load this file */
2fa0b342
DHW
883
884boolean
885subfile_wanted_p (entry)
e47bfa63 886 struct lang_input_statement_struct *entry;
2fa0b342
DHW
887{
888 asymbol **q;
889
890 for (q = entry->asymbols; *q; q++)
891 {
892 asymbol *p = *q;
893
894 /* If the symbol has an interesting definition, we could
895 potentially want it. */
896
e47bfa63
SC
897 if (p->flags & BSF_INDIRECT)
898 {
b257477f 899/** add_indirect(q);*/
e47bfa63 900 }
3e4c643d 901
c611e285 902 if (p->section == &bfd_com_section
9d1fe8a4
SC
903 || (p->flags & BSF_GLOBAL)
904 || (p->flags & BSF_INDIRECT))
2fa0b342
DHW
905 {
906 register ldsym_type *sp = ldsym_get_soft (p->name);
907
2fa0b342
DHW
908 /* If this symbol has not been hashed,
909 we can't be looking for it. */
e47bfa63
SC
910 if (sp != (ldsym_type *) NULL
911 && sp->sdefs_chain == (asymbol **) NULL)
912 {
913 if (sp->srefs_chain != (asymbol **) NULL
914 || sp->scoms_chain != (asymbol **) NULL)
915 {
916 /* This is a symbol we are looking for. It is either
917 not yet defined or common. */
918
919 if (p->section == &bfd_com_section)
920 {
921
922 /* If the symbol in the table is a constructor, we won't to
923 anything fancy with it */
924 if ((sp->flags & SYM_CONSTRUCTOR) == 0)
925 {
926 /* This libary member has something to
927 say about this element. We should
928 remember if its a new size */
929 /* Move something from the ref list to the com list */
930 if (sp->scoms_chain)
931 {
932 /* Already a common symbol, maybe update it */
933 if (p->value > (*(sp->scoms_chain))->value)
934 {
935 (*(sp->scoms_chain))->value = p->value;
936 }
937 }
938 else
939 {
940 /* Take a value from the ref chain
941 Here we are moving a symbol from the owning bfd
942 to another bfd. We must set up the
943 common_section portion of the bfd thing */
944
945
946
947 sp->scoms_chain = sp->srefs_chain;
948 sp->srefs_chain =
949 (asymbol **) ((*(sp->srefs_chain))->udata);
950 (*(sp->scoms_chain))->udata = (PTR) NULL;
951
952 (*(sp->scoms_chain))->section =
953 &bfd_com_section;
954 (*(sp->scoms_chain))->flags = 0;
955 /* Remember the size of this item */
956 sp->scoms_chain[0]->value = p->value;
957 commons_pending++;
958 undefined_global_sym_count--;
959 }
960 {
961 asymbol *com = *(sp->scoms_chain);
962
963 if (((lang_input_statement_type *)
964 (com->the_bfd->usrdata))->common_section ==
965 (asection *) NULL)
966 {
967 ((lang_input_statement_type *)
968 (com->the_bfd->usrdata))->common_section =
969 bfd_make_section_old_way (com->the_bfd, "COMMON");
970 }
971 }
972 }
973 ASSERT (p->udata == 0);
2fa0b342 974 }
e47bfa63
SC
975
976 else
2fa0b342 977 {
e47bfa63
SC
978 if (write_map)
979 {
980 info ("%I needed due to %s\n", entry, sp->name);
981 }
982 return true;
2fa0b342 983 }
2fa0b342 984 }
e47bfa63 985 }
2fa0b342
DHW
986 }
987 }
988
989 return false;
990}
This page took 0.098346 seconds and 4 git commands to generate.