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