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