* elfcode.h (elf_slurp_reloc_table_from_section): Make "symcount"
[deliverable/binutils-gdb.git] / bfd / cofflink.c
1 /* COFF specific linker code.
2 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
3 Free Software Foundation, Inc.
4 Written by Ian Lance Taylor, Cygnus Support.
5
6 This file is part of BFD, the Binary File Descriptor library.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21
22 /* This file contains the COFF backend linker code. */
23
24 #include "bfd.h"
25 #include "sysdep.h"
26 #include "bfdlink.h"
27 #include "libbfd.h"
28 #include "coff/internal.h"
29 #include "libcoff.h"
30
31 static boolean coff_link_add_object_symbols
32 PARAMS ((bfd *, struct bfd_link_info *));
33 static boolean coff_link_check_archive_element
34 PARAMS ((bfd *, struct bfd_link_info *, boolean *));
35 static boolean coff_link_check_ar_symbols
36 PARAMS ((bfd *, struct bfd_link_info *, boolean *));
37 static boolean coff_link_add_symbols PARAMS ((bfd *, struct bfd_link_info *));
38 static char *dores_com PARAMS ((char *, bfd *, int));
39 static char *get_name PARAMS ((char *, char **));
40 static int process_embedded_commands
41 PARAMS ((bfd *, struct bfd_link_info *, bfd *));
42 static void mark_relocs PARAMS ((struct coff_final_link_info *, bfd *));
43
44 /* Return true if SYM is a weak, external symbol. */
45 #define IS_WEAK_EXTERNAL(abfd, sym) \
46 ((sym).n_sclass == C_WEAKEXT \
47 || (obj_pe (abfd) && (sym).n_sclass == C_NT_WEAK))
48
49 /* Return true if SYM is an external symbol. */
50 #define IS_EXTERNAL(abfd, sym) \
51 ((sym).n_sclass == C_EXT || IS_WEAK_EXTERNAL (abfd, sym))
52
53 /* Define macros so that the ISFCN, et. al., macros work correctly.
54 These macros are defined in include/coff/internal.h in terms of
55 N_TMASK, etc. These definitions require a user to define local
56 variables with the appropriate names, and with values from the
57 coff_data (abfd) structure. */
58
59 #define N_TMASK n_tmask
60 #define N_BTSHFT n_btshft
61 #define N_BTMASK n_btmask
62
63 /* Create an entry in a COFF linker hash table. */
64
65 struct bfd_hash_entry *
66 _bfd_coff_link_hash_newfunc (entry, table, string)
67 struct bfd_hash_entry *entry;
68 struct bfd_hash_table *table;
69 const char *string;
70 {
71 struct coff_link_hash_entry *ret = (struct coff_link_hash_entry *) entry;
72
73 /* Allocate the structure if it has not already been allocated by a
74 subclass. */
75 if (ret == (struct coff_link_hash_entry *) NULL)
76 ret = ((struct coff_link_hash_entry *)
77 bfd_hash_allocate (table, sizeof (struct coff_link_hash_entry)));
78 if (ret == (struct coff_link_hash_entry *) NULL)
79 return (struct bfd_hash_entry *) ret;
80
81 /* Call the allocation method of the superclass. */
82 ret = ((struct coff_link_hash_entry *)
83 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
84 table, string));
85 if (ret != (struct coff_link_hash_entry *) NULL)
86 {
87 /* Set local fields. */
88 ret->indx = -1;
89 ret->type = T_NULL;
90 ret->class = C_NULL;
91 ret->numaux = 0;
92 ret->auxbfd = NULL;
93 ret->aux = NULL;
94 }
95
96 return (struct bfd_hash_entry *) ret;
97 }
98
99 /* Initialize a COFF linker hash table. */
100
101 boolean
102 _bfd_coff_link_hash_table_init (table, abfd, newfunc)
103 struct coff_link_hash_table *table;
104 bfd *abfd;
105 struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *,
106 struct bfd_hash_table *,
107 const char *));
108 {
109 table->stab_info = NULL;
110 return _bfd_link_hash_table_init (&table->root, abfd, newfunc);
111 }
112
113 /* Create a COFF linker hash table. */
114
115 struct bfd_link_hash_table *
116 _bfd_coff_link_hash_table_create (abfd)
117 bfd *abfd;
118 {
119 struct coff_link_hash_table *ret;
120 bfd_size_type amt = sizeof (struct coff_link_hash_table);
121
122 ret = (struct coff_link_hash_table *) bfd_malloc (amt);
123 if (ret == NULL)
124 return NULL;
125 if (! _bfd_coff_link_hash_table_init (ret, abfd,
126 _bfd_coff_link_hash_newfunc))
127 {
128 free (ret);
129 return (struct bfd_link_hash_table *) NULL;
130 }
131 return &ret->root;
132 }
133
134 /* Create an entry in a COFF debug merge hash table. */
135
136 struct bfd_hash_entry *
137 _bfd_coff_debug_merge_hash_newfunc (entry, table, string)
138 struct bfd_hash_entry *entry;
139 struct bfd_hash_table *table;
140 const char *string;
141 {
142 struct coff_debug_merge_hash_entry *ret =
143 (struct coff_debug_merge_hash_entry *) entry;
144
145 /* Allocate the structure if it has not already been allocated by a
146 subclass. */
147 if (ret == (struct coff_debug_merge_hash_entry *) NULL)
148 ret = ((struct coff_debug_merge_hash_entry *)
149 bfd_hash_allocate (table,
150 sizeof (struct coff_debug_merge_hash_entry)));
151 if (ret == (struct coff_debug_merge_hash_entry *) NULL)
152 return (struct bfd_hash_entry *) ret;
153
154 /* Call the allocation method of the superclass. */
155 ret = ((struct coff_debug_merge_hash_entry *)
156 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
157 if (ret != (struct coff_debug_merge_hash_entry *) NULL)
158 {
159 /* Set local fields. */
160 ret->types = NULL;
161 }
162
163 return (struct bfd_hash_entry *) ret;
164 }
165
166 /* Given a COFF BFD, add symbols to the global hash table as
167 appropriate. */
168
169 boolean
170 _bfd_coff_link_add_symbols (abfd, info)
171 bfd *abfd;
172 struct bfd_link_info *info;
173 {
174 switch (bfd_get_format (abfd))
175 {
176 case bfd_object:
177 return coff_link_add_object_symbols (abfd, info);
178 case bfd_archive:
179 return (_bfd_generic_link_add_archive_symbols
180 (abfd, info, coff_link_check_archive_element));
181 default:
182 bfd_set_error (bfd_error_wrong_format);
183 return false;
184 }
185 }
186
187 /* Add symbols from a COFF object file. */
188
189 static boolean
190 coff_link_add_object_symbols (abfd, info)
191 bfd *abfd;
192 struct bfd_link_info *info;
193 {
194 if (! _bfd_coff_get_external_symbols (abfd))
195 return false;
196 if (! coff_link_add_symbols (abfd, info))
197 return false;
198
199 if (! info->keep_memory)
200 {
201 if (! _bfd_coff_free_symbols (abfd))
202 return false;
203 }
204 return true;
205 }
206
207 /* Check a single archive element to see if we need to include it in
208 the link. *PNEEDED is set according to whether this element is
209 needed in the link or not. This is called via
210 _bfd_generic_link_add_archive_symbols. */
211
212 static boolean
213 coff_link_check_archive_element (abfd, info, pneeded)
214 bfd *abfd;
215 struct bfd_link_info *info;
216 boolean *pneeded;
217 {
218 if (! _bfd_coff_get_external_symbols (abfd))
219 return false;
220
221 if (! coff_link_check_ar_symbols (abfd, info, pneeded))
222 return false;
223
224 if (*pneeded)
225 {
226 if (! coff_link_add_symbols (abfd, info))
227 return false;
228 }
229
230 if (! info->keep_memory || ! *pneeded)
231 {
232 if (! _bfd_coff_free_symbols (abfd))
233 return false;
234 }
235
236 return true;
237 }
238
239 /* Look through the symbols to see if this object file should be
240 included in the link. */
241
242 static boolean
243 coff_link_check_ar_symbols (abfd, info, pneeded)
244 bfd *abfd;
245 struct bfd_link_info *info;
246 boolean *pneeded;
247 {
248 bfd_size_type symesz;
249 bfd_byte *esym;
250 bfd_byte *esym_end;
251
252 *pneeded = false;
253
254 symesz = bfd_coff_symesz (abfd);
255 esym = (bfd_byte *) obj_coff_external_syms (abfd);
256 esym_end = esym + obj_raw_syment_count (abfd) * symesz;
257 while (esym < esym_end)
258 {
259 struct internal_syment sym;
260 enum coff_symbol_classification classification;
261
262 bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &sym);
263
264 classification = bfd_coff_classify_symbol (abfd, &sym);
265 if (classification == COFF_SYMBOL_GLOBAL
266 || classification == COFF_SYMBOL_COMMON)
267 {
268 const char *name;
269 char buf[SYMNMLEN + 1];
270 struct bfd_link_hash_entry *h;
271
272 /* This symbol is externally visible, and is defined by this
273 object file. */
274
275 name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
276 if (name == NULL)
277 return false;
278 h = bfd_link_hash_lookup (info->hash, name, false, false, true);
279
280 /* auto import */
281 if (!h && info->pei386_auto_import)
282 {
283 if (!strncmp (name,"__imp_", 6))
284 {
285 h =
286 bfd_link_hash_lookup (info->hash, name + 6, false, false,
287 true);
288 }
289 }
290 /* We are only interested in symbols that are currently
291 undefined. If a symbol is currently known to be common,
292 COFF linkers do not bring in an object file which defines
293 it. */
294 if (h != (struct bfd_link_hash_entry *) NULL
295 && h->type == bfd_link_hash_undefined)
296 {
297 if (! (*info->callbacks->add_archive_element) (info, abfd, name))
298 return false;
299 *pneeded = true;
300 return true;
301 }
302 }
303
304 esym += (sym.n_numaux + 1) * symesz;
305 }
306
307 /* We do not need this object file. */
308 return true;
309 }
310
311 /* Add all the symbols from an object file to the hash table. */
312
313 static boolean
314 coff_link_add_symbols (abfd, info)
315 bfd *abfd;
316 struct bfd_link_info *info;
317 {
318 unsigned int n_tmask = coff_data (abfd)->local_n_tmask;
319 unsigned int n_btshft = coff_data (abfd)->local_n_btshft;
320 unsigned int n_btmask = coff_data (abfd)->local_n_btmask;
321 boolean keep_syms;
322 boolean default_copy;
323 bfd_size_type symcount;
324 struct coff_link_hash_entry **sym_hash;
325 bfd_size_type symesz;
326 bfd_byte *esym;
327 bfd_byte *esym_end;
328 bfd_size_type amt;
329
330 /* Keep the symbols during this function, in case the linker needs
331 to read the generic symbols in order to report an error message. */
332 keep_syms = obj_coff_keep_syms (abfd);
333 obj_coff_keep_syms (abfd) = true;
334
335 if (info->keep_memory)
336 default_copy = false;
337 else
338 default_copy = true;
339
340 symcount = obj_raw_syment_count (abfd);
341
342 /* We keep a list of the linker hash table entries that correspond
343 to particular symbols. */
344 amt = symcount * sizeof (struct coff_link_hash_entry *);
345 sym_hash = (struct coff_link_hash_entry **) bfd_zalloc (abfd, amt);
346 if (sym_hash == NULL && symcount != 0)
347 goto error_return;
348 obj_coff_sym_hashes (abfd) = sym_hash;
349
350 symesz = bfd_coff_symesz (abfd);
351 BFD_ASSERT (symesz == bfd_coff_auxesz (abfd));
352 esym = (bfd_byte *) obj_coff_external_syms (abfd);
353 esym_end = esym + symcount * symesz;
354 while (esym < esym_end)
355 {
356 struct internal_syment sym;
357 enum coff_symbol_classification classification;
358 boolean copy;
359
360 bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &sym);
361
362 classification = bfd_coff_classify_symbol (abfd, &sym);
363 if (classification != COFF_SYMBOL_LOCAL)
364 {
365 const char *name;
366 char buf[SYMNMLEN + 1];
367 flagword flags;
368 asection *section;
369 bfd_vma value;
370 boolean addit;
371
372 /* This symbol is externally visible. */
373
374 name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
375 if (name == NULL)
376 goto error_return;
377
378 /* We must copy the name into memory if we got it from the
379 syment itself, rather than the string table. */
380 copy = default_copy;
381 if (sym._n._n_n._n_zeroes != 0
382 || sym._n._n_n._n_offset == 0)
383 copy = true;
384
385 value = sym.n_value;
386
387 switch (classification)
388 {
389 default:
390 abort ();
391
392 case COFF_SYMBOL_GLOBAL:
393 flags = BSF_EXPORT | BSF_GLOBAL;
394 section = coff_section_from_bfd_index (abfd, sym.n_scnum);
395 if (! obj_pe (abfd))
396 value -= section->vma;
397 break;
398
399 case COFF_SYMBOL_UNDEFINED:
400 flags = 0;
401 section = bfd_und_section_ptr;
402 break;
403
404 case COFF_SYMBOL_COMMON:
405 flags = BSF_GLOBAL;
406 section = bfd_com_section_ptr;
407 break;
408
409 case COFF_SYMBOL_PE_SECTION:
410 flags = BSF_SECTION_SYM | BSF_GLOBAL;
411 section = coff_section_from_bfd_index (abfd, sym.n_scnum);
412 break;
413 }
414
415 if (IS_WEAK_EXTERNAL (abfd, sym))
416 flags = BSF_WEAK;
417
418 addit = true;
419
420 /* In the PE format, section symbols actually refer to the
421 start of the output section. We handle them specially
422 here. */
423 if (obj_pe (abfd) && (flags & BSF_SECTION_SYM) != 0)
424 {
425 *sym_hash = coff_link_hash_lookup (coff_hash_table (info),
426 name, false, copy, false);
427 if (*sym_hash != NULL)
428 {
429 if (((*sym_hash)->coff_link_hash_flags
430 & COFF_LINK_HASH_PE_SECTION_SYMBOL) == 0
431 && (*sym_hash)->root.type != bfd_link_hash_undefined
432 && (*sym_hash)->root.type != bfd_link_hash_undefweak)
433 (*_bfd_error_handler)
434 ("Warning: symbol `%s' is both section and non-section",
435 name);
436
437 addit = false;
438 }
439 }
440
441 /* The Microsoft Visual C compiler does string pooling by
442 hashing the constants to an internal symbol name, and
443 relying on the linker comdat support to discard
444 duplicate names. However, if one string is a literal and
445 one is a data initializer, one will end up in the .data
446 section and one will end up in the .rdata section. The
447 Microsoft linker will combine them into the .data
448 section, which seems to be wrong since it might cause the
449 literal to change.
450
451 As long as there are no external references to the
452 symbols, which there shouldn't be, we can treat the .data
453 and .rdata instances as separate symbols. The comdat
454 code in the linker will do the appropriate merging. Here
455 we avoid getting a multiple definition error for one of
456 these special symbols.
457
458 FIXME: I don't think this will work in the case where
459 there are two object files which use the constants as a
460 literal and two object files which use it as a data
461 initializer. One or the other of the second object files
462 is going to wind up with an inappropriate reference. */
463 if (obj_pe (abfd)
464 && (classification == COFF_SYMBOL_GLOBAL
465 || classification == COFF_SYMBOL_PE_SECTION)
466 && section->comdat != NULL
467 && strncmp (name, "??_", 3) == 0
468 && strcmp (name, section->comdat->name) == 0)
469 {
470 if (*sym_hash == NULL)
471 *sym_hash = coff_link_hash_lookup (coff_hash_table (info),
472 name, false, copy, false);
473 if (*sym_hash != NULL
474 && (*sym_hash)->root.type == bfd_link_hash_defined
475 && (*sym_hash)->root.u.def.section->comdat != NULL
476 && strcmp ((*sym_hash)->root.u.def.section->comdat->name,
477 section->comdat->name) == 0)
478 addit = false;
479 }
480
481 if (addit)
482 {
483 if (! (bfd_coff_link_add_one_symbol
484 (info, abfd, name, flags, section, value,
485 (const char *) NULL, copy, false,
486 (struct bfd_link_hash_entry **) sym_hash)))
487 goto error_return;
488 }
489
490 if (obj_pe (abfd) && (flags & BSF_SECTION_SYM) != 0)
491 (*sym_hash)->coff_link_hash_flags |=
492 COFF_LINK_HASH_PE_SECTION_SYMBOL;
493
494 /* Limit the alignment of a common symbol to the possible
495 alignment of a section. There is no point to permitting
496 a higher alignment for a common symbol: we can not
497 guarantee it, and it may cause us to allocate extra space
498 in the common section. */
499 if (section == bfd_com_section_ptr
500 && (*sym_hash)->root.type == bfd_link_hash_common
501 && ((*sym_hash)->root.u.c.p->alignment_power
502 > bfd_coff_default_section_alignment_power (abfd)))
503 (*sym_hash)->root.u.c.p->alignment_power
504 = bfd_coff_default_section_alignment_power (abfd);
505
506 if (info->hash->creator->flavour == bfd_get_flavour (abfd))
507 {
508 /* If we don't have any symbol information currently in
509 the hash table, or if we are looking at a symbol
510 definition, then update the symbol class and type in
511 the hash table. */
512 if (((*sym_hash)->class == C_NULL
513 && (*sym_hash)->type == T_NULL)
514 || sym.n_scnum != 0
515 || (sym.n_value != 0
516 && (*sym_hash)->root.type != bfd_link_hash_defined
517 && (*sym_hash)->root.type != bfd_link_hash_defweak))
518 {
519 (*sym_hash)->class = sym.n_sclass;
520 if (sym.n_type != T_NULL)
521 {
522 /* We want to warn if the type changed, but not
523 if it changed from an unspecified type.
524 Testing the whole type byte may work, but the
525 change from (e.g.) a function of unspecified
526 type to function of known type also wants to
527 skip the warning. */
528 if ((*sym_hash)->type != T_NULL
529 && (*sym_hash)->type != sym.n_type
530 && !(DTYPE ((*sym_hash)->type) == DTYPE (sym.n_type)
531 && (BTYPE ((*sym_hash)->type) == T_NULL
532 || BTYPE (sym.n_type) == T_NULL)))
533 (*_bfd_error_handler)
534 (_("Warning: type of symbol `%s' changed from %d to %d in %s"),
535 name, (*sym_hash)->type, sym.n_type,
536 bfd_archive_filename (abfd));
537
538 /* We don't want to change from a meaningful
539 base type to a null one, but if we know
540 nothing, take what little we might now know. */
541 if (BTYPE (sym.n_type) != T_NULL
542 || (*sym_hash)->type == T_NULL)
543 (*sym_hash)->type = sym.n_type;
544 }
545 (*sym_hash)->auxbfd = abfd;
546 if (sym.n_numaux != 0)
547 {
548 union internal_auxent *alloc;
549 unsigned int i;
550 bfd_byte *eaux;
551 union internal_auxent *iaux;
552
553 (*sym_hash)->numaux = sym.n_numaux;
554 alloc = ((union internal_auxent *)
555 bfd_hash_allocate (&info->hash->table,
556 (sym.n_numaux
557 * sizeof (*alloc))));
558 if (alloc == NULL)
559 goto error_return;
560 for (i = 0, eaux = esym + symesz, iaux = alloc;
561 i < sym.n_numaux;
562 i++, eaux += symesz, iaux++)
563 bfd_coff_swap_aux_in (abfd, (PTR) eaux, sym.n_type,
564 sym.n_sclass, (int) i,
565 sym.n_numaux, (PTR) iaux);
566 (*sym_hash)->aux = alloc;
567 }
568 }
569 }
570
571 if (classification == COFF_SYMBOL_PE_SECTION
572 && (*sym_hash)->numaux != 0)
573 {
574 /* Some PE sections (such as .bss) have a zero size in
575 the section header, but a non-zero size in the AUX
576 record. Correct that here.
577
578 FIXME: This is not at all the right place to do this.
579 For example, it won't help objdump. This needs to be
580 done when we swap in the section header. */
581
582 BFD_ASSERT ((*sym_hash)->numaux == 1);
583 if (section->_raw_size == 0)
584 section->_raw_size = (*sym_hash)->aux[0].x_scn.x_scnlen;
585
586 /* FIXME: We could test whether the section sizes
587 matches the size in the aux entry, but apparently
588 that sometimes fails unexpectedly. */
589 }
590 }
591
592 esym += (sym.n_numaux + 1) * symesz;
593 sym_hash += sym.n_numaux + 1;
594 }
595
596 /* If this is a non-traditional, non-relocateable link, try to
597 optimize the handling of any .stab/.stabstr sections. */
598 if (! info->relocateable
599 && ! info->traditional_format
600 && info->hash->creator->flavour == bfd_get_flavour (abfd)
601 && (info->strip != strip_all && info->strip != strip_debugger))
602 {
603 asection *stab, *stabstr;
604
605 stab = bfd_get_section_by_name (abfd, ".stab");
606 if (stab != NULL)
607 {
608 stabstr = bfd_get_section_by_name (abfd, ".stabstr");
609
610 if (stabstr != NULL)
611 {
612 struct coff_link_hash_table *table;
613 struct coff_section_tdata *secdata;
614
615 secdata = coff_section_data (abfd, stab);
616 if (secdata == NULL)
617 {
618 amt = sizeof (struct coff_section_tdata);
619 stab->used_by_bfd = (PTR) bfd_zalloc (abfd, amt);
620 if (stab->used_by_bfd == NULL)
621 goto error_return;
622 secdata = coff_section_data (abfd, stab);
623 }
624
625 table = coff_hash_table (info);
626
627 if (! _bfd_link_section_stabs (abfd, &table->stab_info,
628 stab, stabstr,
629 &secdata->stab_info))
630 goto error_return;
631 }
632 }
633 }
634
635 obj_coff_keep_syms (abfd) = keep_syms;
636
637 return true;
638
639 error_return:
640 obj_coff_keep_syms (abfd) = keep_syms;
641 return false;
642 }
643 \f
644 /* Do the final link step. */
645
646 boolean
647 _bfd_coff_final_link (abfd, info)
648 bfd *abfd;
649 struct bfd_link_info *info;
650 {
651 bfd_size_type symesz;
652 struct coff_final_link_info finfo;
653 boolean debug_merge_allocated;
654 boolean long_section_names;
655 asection *o;
656 struct bfd_link_order *p;
657 bfd_size_type max_sym_count;
658 bfd_size_type max_lineno_count;
659 bfd_size_type max_reloc_count;
660 bfd_size_type max_output_reloc_count;
661 bfd_size_type max_contents_size;
662 file_ptr rel_filepos;
663 unsigned int relsz;
664 file_ptr line_filepos;
665 unsigned int linesz;
666 bfd *sub;
667 bfd_byte *external_relocs = NULL;
668 char strbuf[STRING_SIZE_SIZE];
669 bfd_size_type amt;
670
671 symesz = bfd_coff_symesz (abfd);
672
673 finfo.info = info;
674 finfo.output_bfd = abfd;
675 finfo.strtab = NULL;
676 finfo.section_info = NULL;
677 finfo.last_file_index = -1;
678 finfo.last_bf_index = -1;
679 finfo.internal_syms = NULL;
680 finfo.sec_ptrs = NULL;
681 finfo.sym_indices = NULL;
682 finfo.outsyms = NULL;
683 finfo.linenos = NULL;
684 finfo.contents = NULL;
685 finfo.external_relocs = NULL;
686 finfo.internal_relocs = NULL;
687 finfo.global_to_static = false;
688 debug_merge_allocated = false;
689
690 coff_data (abfd)->link_info = info;
691
692 finfo.strtab = _bfd_stringtab_init ();
693 if (finfo.strtab == NULL)
694 goto error_return;
695
696 if (! coff_debug_merge_hash_table_init (&finfo.debug_merge))
697 goto error_return;
698 debug_merge_allocated = true;
699
700 /* Compute the file positions for all the sections. */
701 if (! abfd->output_has_begun)
702 {
703 if (! bfd_coff_compute_section_file_positions (abfd))
704 goto error_return;
705 }
706
707 /* Count the line numbers and relocation entries required for the
708 output file. Set the file positions for the relocs. */
709 rel_filepos = obj_relocbase (abfd);
710 relsz = bfd_coff_relsz (abfd);
711 max_contents_size = 0;
712 max_lineno_count = 0;
713 max_reloc_count = 0;
714
715 long_section_names = false;
716 for (o = abfd->sections; o != NULL; o = o->next)
717 {
718 o->reloc_count = 0;
719 o->lineno_count = 0;
720 for (p = o->link_order_head; p != NULL; p = p->next)
721 {
722 if (p->type == bfd_indirect_link_order)
723 {
724 asection *sec;
725
726 sec = p->u.indirect.section;
727
728 /* Mark all sections which are to be included in the
729 link. This will normally be every section. We need
730 to do this so that we can identify any sections which
731 the linker has decided to not include. */
732 sec->linker_mark = true;
733
734 if (info->strip == strip_none
735 || info->strip == strip_some)
736 o->lineno_count += sec->lineno_count;
737
738 if (info->relocateable)
739 o->reloc_count += sec->reloc_count;
740
741 if (sec->_raw_size > max_contents_size)
742 max_contents_size = sec->_raw_size;
743 if (sec->lineno_count > max_lineno_count)
744 max_lineno_count = sec->lineno_count;
745 if (sec->reloc_count > max_reloc_count)
746 max_reloc_count = sec->reloc_count;
747 }
748 else if (info->relocateable
749 && (p->type == bfd_section_reloc_link_order
750 || p->type == bfd_symbol_reloc_link_order))
751 ++o->reloc_count;
752 }
753 if (o->reloc_count == 0)
754 o->rel_filepos = 0;
755 else
756 {
757 o->flags |= SEC_RELOC;
758 o->rel_filepos = rel_filepos;
759 rel_filepos += o->reloc_count * relsz;
760 /* In PE COFF, if there are at least 0xffff relocations an
761 extra relocation will be written out to encode the count. */
762 if (obj_pe (abfd) && o->reloc_count >= 0xffff)
763 rel_filepos += relsz;
764 }
765
766 if (bfd_coff_long_section_names (abfd)
767 && strlen (o->name) > SCNNMLEN)
768 {
769 /* This section has a long name which must go in the string
770 table. This must correspond to the code in
771 coff_write_object_contents which puts the string index
772 into the s_name field of the section header. That is why
773 we pass hash as false. */
774 if (_bfd_stringtab_add (finfo.strtab, o->name, false, false)
775 == (bfd_size_type) -1)
776 goto error_return;
777 long_section_names = true;
778 }
779 }
780
781 /* If doing a relocateable link, allocate space for the pointers we
782 need to keep. */
783 if (info->relocateable)
784 {
785 unsigned int i;
786
787 /* We use section_count + 1, rather than section_count, because
788 the target_index fields are 1 based. */
789 amt = abfd->section_count + 1;
790 amt *= sizeof (struct coff_link_section_info);
791 finfo.section_info = (struct coff_link_section_info *) bfd_malloc (amt);
792 if (finfo.section_info == NULL)
793 goto error_return;
794 for (i = 0; i <= abfd->section_count; i++)
795 {
796 finfo.section_info[i].relocs = NULL;
797 finfo.section_info[i].rel_hashes = NULL;
798 }
799 }
800
801 /* We now know the size of the relocs, so we can determine the file
802 positions of the line numbers. */
803 line_filepos = rel_filepos;
804 linesz = bfd_coff_linesz (abfd);
805 max_output_reloc_count = 0;
806 for (o = abfd->sections; o != NULL; o = o->next)
807 {
808 if (o->lineno_count == 0)
809 o->line_filepos = 0;
810 else
811 {
812 o->line_filepos = line_filepos;
813 line_filepos += o->lineno_count * linesz;
814 }
815
816 if (o->reloc_count != 0)
817 {
818 /* We don't know the indices of global symbols until we have
819 written out all the local symbols. For each section in
820 the output file, we keep an array of pointers to hash
821 table entries. Each entry in the array corresponds to a
822 reloc. When we find a reloc against a global symbol, we
823 set the corresponding entry in this array so that we can
824 fix up the symbol index after we have written out all the
825 local symbols.
826
827 Because of this problem, we also keep the relocs in
828 memory until the end of the link. This wastes memory,
829 but only when doing a relocateable link, which is not the
830 common case. */
831 BFD_ASSERT (info->relocateable);
832 amt = o->reloc_count;
833 amt *= sizeof (struct internal_reloc);
834 finfo.section_info[o->target_index].relocs =
835 (struct internal_reloc *) bfd_malloc (amt);
836 amt = o->reloc_count;
837 amt *= sizeof (struct coff_link_hash_entry *);
838 finfo.section_info[o->target_index].rel_hashes =
839 (struct coff_link_hash_entry **) bfd_malloc (amt);
840 if (finfo.section_info[o->target_index].relocs == NULL
841 || finfo.section_info[o->target_index].rel_hashes == NULL)
842 goto error_return;
843
844 if (o->reloc_count > max_output_reloc_count)
845 max_output_reloc_count = o->reloc_count;
846 }
847
848 /* Reset the reloc and lineno counts, so that we can use them to
849 count the number of entries we have output so far. */
850 o->reloc_count = 0;
851 o->lineno_count = 0;
852 }
853
854 obj_sym_filepos (abfd) = line_filepos;
855
856 /* Figure out the largest number of symbols in an input BFD. Take
857 the opportunity to clear the output_has_begun fields of all the
858 input BFD's. */
859 max_sym_count = 0;
860 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
861 {
862 size_t sz;
863
864 sub->output_has_begun = false;
865 sz = obj_raw_syment_count (sub);
866 if (sz > max_sym_count)
867 max_sym_count = sz;
868 }
869
870 /* Allocate some buffers used while linking. */
871 amt = max_sym_count * sizeof (struct internal_syment);
872 finfo.internal_syms = (struct internal_syment *) bfd_malloc (amt);
873 amt = max_sym_count * sizeof (asection *);
874 finfo.sec_ptrs = (asection **) bfd_malloc (amt);
875 amt = max_sym_count * sizeof (long);
876 finfo.sym_indices = (long *) bfd_malloc (amt);
877 finfo.outsyms = (bfd_byte *) bfd_malloc ((max_sym_count + 1) * symesz);
878 amt = max_lineno_count * bfd_coff_linesz (abfd);
879 finfo.linenos = (bfd_byte *) bfd_malloc (amt);
880 finfo.contents = (bfd_byte *) bfd_malloc (max_contents_size);
881 amt = max_reloc_count * relsz;
882 finfo.external_relocs = (bfd_byte *) bfd_malloc (amt);
883 if (! info->relocateable)
884 {
885 amt = max_reloc_count * sizeof (struct internal_reloc);
886 finfo.internal_relocs = (struct internal_reloc *) bfd_malloc (amt);
887 }
888 if ((finfo.internal_syms == NULL && max_sym_count > 0)
889 || (finfo.sec_ptrs == NULL && max_sym_count > 0)
890 || (finfo.sym_indices == NULL && max_sym_count > 0)
891 || finfo.outsyms == NULL
892 || (finfo.linenos == NULL && max_lineno_count > 0)
893 || (finfo.contents == NULL && max_contents_size > 0)
894 || (finfo.external_relocs == NULL && max_reloc_count > 0)
895 || (! info->relocateable
896 && finfo.internal_relocs == NULL
897 && max_reloc_count > 0))
898 goto error_return;
899
900 /* We now know the position of everything in the file, except that
901 we don't know the size of the symbol table and therefore we don't
902 know where the string table starts. We just build the string
903 table in memory as we go along. We process all the relocations
904 for a single input file at once. */
905 obj_raw_syment_count (abfd) = 0;
906
907 if (coff_backend_info (abfd)->_bfd_coff_start_final_link)
908 {
909 if (! bfd_coff_start_final_link (abfd, info))
910 goto error_return;
911 }
912
913 for (o = abfd->sections; o != NULL; o = o->next)
914 {
915 for (p = o->link_order_head; p != NULL; p = p->next)
916 {
917 if (p->type == bfd_indirect_link_order
918 && bfd_family_coff (p->u.indirect.section->owner))
919 {
920 sub = p->u.indirect.section->owner;
921 if (! bfd_coff_link_output_has_begun (sub, & finfo))
922 {
923 if (! _bfd_coff_link_input_bfd (&finfo, sub))
924 goto error_return;
925 sub->output_has_begun = true;
926 }
927 }
928 else if (p->type == bfd_section_reloc_link_order
929 || p->type == bfd_symbol_reloc_link_order)
930 {
931 if (! _bfd_coff_reloc_link_order (abfd, &finfo, o, p))
932 goto error_return;
933 }
934 else
935 {
936 if (! _bfd_default_link_order (abfd, info, o, p))
937 goto error_return;
938 }
939 }
940 }
941
942 if (! bfd_coff_final_link_postscript (abfd, & finfo))
943 goto error_return;
944
945 /* Free up the buffers used by _bfd_coff_link_input_bfd. */
946
947 coff_debug_merge_hash_table_free (&finfo.debug_merge);
948 debug_merge_allocated = false;
949
950 if (finfo.internal_syms != NULL)
951 {
952 free (finfo.internal_syms);
953 finfo.internal_syms = NULL;
954 }
955 if (finfo.sec_ptrs != NULL)
956 {
957 free (finfo.sec_ptrs);
958 finfo.sec_ptrs = NULL;
959 }
960 if (finfo.sym_indices != NULL)
961 {
962 free (finfo.sym_indices);
963 finfo.sym_indices = NULL;
964 }
965 if (finfo.linenos != NULL)
966 {
967 free (finfo.linenos);
968 finfo.linenos = NULL;
969 }
970 if (finfo.contents != NULL)
971 {
972 free (finfo.contents);
973 finfo.contents = NULL;
974 }
975 if (finfo.external_relocs != NULL)
976 {
977 free (finfo.external_relocs);
978 finfo.external_relocs = NULL;
979 }
980 if (finfo.internal_relocs != NULL)
981 {
982 free (finfo.internal_relocs);
983 finfo.internal_relocs = NULL;
984 }
985
986 /* The value of the last C_FILE symbol is supposed to be the symbol
987 index of the first external symbol. Write it out again if
988 necessary. */
989 if (finfo.last_file_index != -1
990 && (unsigned int) finfo.last_file.n_value != obj_raw_syment_count (abfd))
991 {
992 file_ptr pos;
993
994 finfo.last_file.n_value = obj_raw_syment_count (abfd);
995 bfd_coff_swap_sym_out (abfd, (PTR) &finfo.last_file,
996 (PTR) finfo.outsyms);
997
998 pos = obj_sym_filepos (abfd) + finfo.last_file_index * symesz;
999 if (bfd_seek (abfd, pos, SEEK_SET) != 0
1000 || bfd_bwrite (finfo.outsyms, symesz, abfd) != symesz)
1001 return false;
1002 }
1003
1004 /* If doing task linking (ld --task-link) then make a pass through the
1005 global symbols, writing out any that are defined, and making them
1006 static. */
1007 if (info->task_link)
1008 {
1009 finfo.failed = false;
1010 coff_link_hash_traverse (coff_hash_table (info),
1011 _bfd_coff_write_task_globals,
1012 (PTR) &finfo);
1013 if (finfo.failed)
1014 goto error_return;
1015 }
1016
1017 /* Write out the global symbols. */
1018 finfo.failed = false;
1019 coff_link_hash_traverse (coff_hash_table (info),
1020 _bfd_coff_write_global_sym,
1021 (PTR) &finfo);
1022 if (finfo.failed)
1023 goto error_return;
1024
1025 /* The outsyms buffer is used by _bfd_coff_write_global_sym. */
1026 if (finfo.outsyms != NULL)
1027 {
1028 free (finfo.outsyms);
1029 finfo.outsyms = NULL;
1030 }
1031
1032 if (info->relocateable && max_output_reloc_count > 0)
1033 {
1034 /* Now that we have written out all the global symbols, we know
1035 the symbol indices to use for relocs against them, and we can
1036 finally write out the relocs. */
1037 amt = max_output_reloc_count * relsz;
1038 external_relocs = (bfd_byte *) bfd_malloc (amt);
1039 if (external_relocs == NULL)
1040 goto error_return;
1041
1042 for (o = abfd->sections; o != NULL; o = o->next)
1043 {
1044 struct internal_reloc *irel;
1045 struct internal_reloc *irelend;
1046 struct coff_link_hash_entry **rel_hash;
1047 bfd_byte *erel;
1048
1049 if (o->reloc_count == 0)
1050 continue;
1051
1052 irel = finfo.section_info[o->target_index].relocs;
1053 irelend = irel + o->reloc_count;
1054 rel_hash = finfo.section_info[o->target_index].rel_hashes;
1055 erel = external_relocs;
1056 for (; irel < irelend; irel++, rel_hash++, erel += relsz)
1057 {
1058 if (*rel_hash != NULL)
1059 {
1060 BFD_ASSERT ((*rel_hash)->indx >= 0);
1061 irel->r_symndx = (*rel_hash)->indx;
1062 }
1063 bfd_coff_swap_reloc_out (abfd, (PTR) irel, (PTR) erel);
1064 }
1065
1066 if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0
1067 || (bfd_bwrite ((PTR) external_relocs,
1068 (bfd_size_type) relsz * o->reloc_count, abfd)
1069 != (bfd_size_type) relsz * o->reloc_count))
1070 goto error_return;
1071 }
1072
1073 free (external_relocs);
1074 external_relocs = NULL;
1075 }
1076
1077 /* Free up the section information. */
1078 if (finfo.section_info != NULL)
1079 {
1080 unsigned int i;
1081
1082 for (i = 0; i < abfd->section_count; i++)
1083 {
1084 if (finfo.section_info[i].relocs != NULL)
1085 free (finfo.section_info[i].relocs);
1086 if (finfo.section_info[i].rel_hashes != NULL)
1087 free (finfo.section_info[i].rel_hashes);
1088 }
1089 free (finfo.section_info);
1090 finfo.section_info = NULL;
1091 }
1092
1093 /* If we have optimized stabs strings, output them. */
1094 if (coff_hash_table (info)->stab_info != NULL)
1095 {
1096 if (! _bfd_write_stab_strings (abfd, &coff_hash_table (info)->stab_info))
1097 return false;
1098 }
1099
1100 /* Write out the string table. */
1101 if (obj_raw_syment_count (abfd) != 0 || long_section_names)
1102 {
1103 file_ptr pos;
1104
1105 pos = obj_sym_filepos (abfd) + obj_raw_syment_count (abfd) * symesz;
1106 if (bfd_seek (abfd, pos, SEEK_SET) != 0)
1107 return false;
1108
1109 #if STRING_SIZE_SIZE == 4
1110 H_PUT_32 (abfd,
1111 _bfd_stringtab_size (finfo.strtab) + STRING_SIZE_SIZE,
1112 strbuf);
1113 #else
1114 #error Change H_PUT_32 above
1115 #endif
1116
1117 if (bfd_bwrite (strbuf, (bfd_size_type) STRING_SIZE_SIZE, abfd)
1118 != STRING_SIZE_SIZE)
1119 return false;
1120
1121 if (! _bfd_stringtab_emit (abfd, finfo.strtab))
1122 return false;
1123
1124 obj_coff_strings_written (abfd) = true;
1125 }
1126
1127 _bfd_stringtab_free (finfo.strtab);
1128
1129 /* Setting bfd_get_symcount to 0 will cause write_object_contents to
1130 not try to write out the symbols. */
1131 bfd_get_symcount (abfd) = 0;
1132
1133 return true;
1134
1135 error_return:
1136 if (debug_merge_allocated)
1137 coff_debug_merge_hash_table_free (&finfo.debug_merge);
1138 if (finfo.strtab != NULL)
1139 _bfd_stringtab_free (finfo.strtab);
1140 if (finfo.section_info != NULL)
1141 {
1142 unsigned int i;
1143
1144 for (i = 0; i < abfd->section_count; i++)
1145 {
1146 if (finfo.section_info[i].relocs != NULL)
1147 free (finfo.section_info[i].relocs);
1148 if (finfo.section_info[i].rel_hashes != NULL)
1149 free (finfo.section_info[i].rel_hashes);
1150 }
1151 free (finfo.section_info);
1152 }
1153 if (finfo.internal_syms != NULL)
1154 free (finfo.internal_syms);
1155 if (finfo.sec_ptrs != NULL)
1156 free (finfo.sec_ptrs);
1157 if (finfo.sym_indices != NULL)
1158 free (finfo.sym_indices);
1159 if (finfo.outsyms != NULL)
1160 free (finfo.outsyms);
1161 if (finfo.linenos != NULL)
1162 free (finfo.linenos);
1163 if (finfo.contents != NULL)
1164 free (finfo.contents);
1165 if (finfo.external_relocs != NULL)
1166 free (finfo.external_relocs);
1167 if (finfo.internal_relocs != NULL)
1168 free (finfo.internal_relocs);
1169 if (external_relocs != NULL)
1170 free (external_relocs);
1171 return false;
1172 }
1173
1174 /* parse out a -heap <reserved>,<commit> line */
1175
1176 static char *
1177 dores_com (ptr, output_bfd, heap)
1178 char *ptr;
1179 bfd *output_bfd;
1180 int heap;
1181 {
1182 if (coff_data(output_bfd)->pe)
1183 {
1184 int val = strtoul (ptr, &ptr, 0);
1185 if (heap)
1186 pe_data(output_bfd)->pe_opthdr.SizeOfHeapReserve = val;
1187 else
1188 pe_data(output_bfd)->pe_opthdr.SizeOfStackReserve = val;
1189
1190 if (ptr[0] == ',')
1191 {
1192 val = strtoul (ptr+1, &ptr, 0);
1193 if (heap)
1194 pe_data(output_bfd)->pe_opthdr.SizeOfHeapCommit = val;
1195 else
1196 pe_data(output_bfd)->pe_opthdr.SizeOfStackCommit = val;
1197 }
1198 }
1199 return ptr;
1200 }
1201
1202 static char *get_name(ptr, dst)
1203 char *ptr;
1204 char **dst;
1205 {
1206 while (*ptr == ' ')
1207 ptr++;
1208 *dst = ptr;
1209 while (*ptr && *ptr != ' ')
1210 ptr++;
1211 *ptr = 0;
1212 return ptr+1;
1213 }
1214
1215 /* Process any magic embedded commands in a section called .drectve */
1216
1217 static int
1218 process_embedded_commands (output_bfd, info, abfd)
1219 bfd *output_bfd;
1220 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1221 bfd *abfd;
1222 {
1223 asection *sec = bfd_get_section_by_name (abfd, ".drectve");
1224 char *s;
1225 char *e;
1226 char *copy;
1227 if (!sec)
1228 return 1;
1229
1230 copy = bfd_malloc (sec->_raw_size);
1231 if (!copy)
1232 return 0;
1233 if (! bfd_get_section_contents(abfd, sec, copy, (bfd_vma) 0, sec->_raw_size))
1234 {
1235 free (copy);
1236 return 0;
1237 }
1238 e = copy + sec->_raw_size;
1239 for (s = copy; s < e ; )
1240 {
1241 if (s[0]!= '-') {
1242 s++;
1243 continue;
1244 }
1245 if (strncmp (s,"-attr", 5) == 0)
1246 {
1247 char *name;
1248 char *attribs;
1249 asection *asec;
1250
1251 int loop = 1;
1252 int had_write = 0;
1253 int had_read = 0;
1254 int had_exec= 0;
1255 int had_shared= 0;
1256 s += 5;
1257 s = get_name(s, &name);
1258 s = get_name(s, &attribs);
1259 while (loop) {
1260 switch (*attribs++)
1261 {
1262 case 'W':
1263 had_write = 1;
1264 break;
1265 case 'R':
1266 had_read = 1;
1267 break;
1268 case 'S':
1269 had_shared = 1;
1270 break;
1271 case 'X':
1272 had_exec = 1;
1273 break;
1274 default:
1275 loop = 0;
1276 }
1277 }
1278 asec = bfd_get_section_by_name (abfd, name);
1279 if (asec) {
1280 if (had_exec)
1281 asec->flags |= SEC_CODE;
1282 if (!had_write)
1283 asec->flags |= SEC_READONLY;
1284 }
1285 }
1286 else if (strncmp (s,"-heap", 5) == 0)
1287 {
1288 s = dores_com (s+5, output_bfd, 1);
1289 }
1290 else if (strncmp (s,"-stack", 6) == 0)
1291 {
1292 s = dores_com (s+6, output_bfd, 0);
1293 }
1294 else
1295 s++;
1296 }
1297 free (copy);
1298 return 1;
1299 }
1300
1301 /* Place a marker against all symbols which are used by relocations.
1302 This marker can be picked up by the 'do we skip this symbol ?'
1303 loop in _bfd_coff_link_input_bfd() and used to prevent skipping
1304 that symbol.
1305 */
1306
1307 static void
1308 mark_relocs (finfo, input_bfd)
1309 struct coff_final_link_info * finfo;
1310 bfd * input_bfd;
1311 {
1312 asection * a;
1313
1314 if ((bfd_get_file_flags (input_bfd) & HAS_SYMS) == 0)
1315 return;
1316
1317 for (a = input_bfd->sections; a != (asection *) NULL; a = a->next)
1318 {
1319 struct internal_reloc * internal_relocs;
1320 struct internal_reloc * irel;
1321 struct internal_reloc * irelend;
1322
1323 if ((a->flags & SEC_RELOC) == 0 || a->reloc_count < 1)
1324 continue;
1325
1326 /* Read in the relocs. */
1327 internal_relocs = _bfd_coff_read_internal_relocs
1328 (input_bfd, a, false,
1329 finfo->external_relocs,
1330 finfo->info->relocateable,
1331 (finfo->info->relocateable
1332 ? (finfo->section_info[ a->output_section->target_index ].relocs + a->output_section->reloc_count)
1333 : finfo->internal_relocs)
1334 );
1335
1336 if (internal_relocs == NULL)
1337 continue;
1338
1339 irel = internal_relocs;
1340 irelend = irel + a->reloc_count;
1341
1342 /* Place a mark in the sym_indices array (whose entries have
1343 been initialised to 0) for all of the symbols that are used
1344 in the relocation table. This will then be picked up in the
1345 skip/don't pass */
1346
1347 for (; irel < irelend; irel++)
1348 {
1349 finfo->sym_indices[ irel->r_symndx ] = -1;
1350 }
1351 }
1352 }
1353
1354 /* Link an input file into the linker output file. This function
1355 handles all the sections and relocations of the input file at once. */
1356
1357 boolean
1358 _bfd_coff_link_input_bfd (finfo, input_bfd)
1359 struct coff_final_link_info *finfo;
1360 bfd *input_bfd;
1361 {
1362 unsigned int n_tmask = coff_data (input_bfd)->local_n_tmask;
1363 unsigned int n_btshft = coff_data (input_bfd)->local_n_btshft;
1364 #if 0
1365 unsigned int n_btmask = coff_data (input_bfd)->local_n_btmask;
1366 #endif
1367 boolean (*adjust_symndx) PARAMS ((bfd *, struct bfd_link_info *, bfd *,
1368 asection *, struct internal_reloc *,
1369 boolean *));
1370 bfd *output_bfd;
1371 const char *strings;
1372 bfd_size_type syment_base;
1373 boolean copy, hash;
1374 bfd_size_type isymesz;
1375 bfd_size_type osymesz;
1376 bfd_size_type linesz;
1377 bfd_byte *esym;
1378 bfd_byte *esym_end;
1379 struct internal_syment *isymp;
1380 asection **secpp;
1381 long *indexp;
1382 unsigned long output_index;
1383 bfd_byte *outsym;
1384 struct coff_link_hash_entry **sym_hash;
1385 asection *o;
1386
1387 /* Move all the symbols to the output file. */
1388
1389 output_bfd = finfo->output_bfd;
1390 strings = NULL;
1391 syment_base = obj_raw_syment_count (output_bfd);
1392 isymesz = bfd_coff_symesz (input_bfd);
1393 osymesz = bfd_coff_symesz (output_bfd);
1394 linesz = bfd_coff_linesz (input_bfd);
1395 BFD_ASSERT (linesz == bfd_coff_linesz (output_bfd));
1396
1397 copy = false;
1398 if (! finfo->info->keep_memory)
1399 copy = true;
1400 hash = true;
1401 if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
1402 hash = false;
1403
1404 if (! _bfd_coff_get_external_symbols (input_bfd))
1405 return false;
1406
1407 esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
1408 esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
1409 isymp = finfo->internal_syms;
1410 secpp = finfo->sec_ptrs;
1411 indexp = finfo->sym_indices;
1412 output_index = syment_base;
1413 outsym = finfo->outsyms;
1414
1415 if (coff_data (output_bfd)->pe)
1416 {
1417 if (! process_embedded_commands (output_bfd, finfo->info, input_bfd))
1418 return false;
1419 }
1420
1421 /* If we are going to perform relocations and also strip/discard some symbols
1422 then we must make sure that we do not strip/discard those symbols that are
1423 going to be involved in the relocations */
1424 if (( finfo->info->strip != strip_none
1425 || finfo->info->discard != discard_none)
1426 && finfo->info->relocateable)
1427 {
1428 /* mark the symbol array as 'not-used' */
1429 memset (indexp, 0, obj_raw_syment_count (input_bfd) * sizeof * indexp);
1430
1431 mark_relocs (finfo, input_bfd);
1432 }
1433
1434 while (esym < esym_end)
1435 {
1436 struct internal_syment isym;
1437 enum coff_symbol_classification classification;
1438 boolean skip;
1439 boolean global;
1440 boolean dont_skip_symbol;
1441 int add;
1442
1443 bfd_coff_swap_sym_in (input_bfd, (PTR) esym, (PTR) isymp);
1444
1445 /* Make a copy of *isymp so that the relocate_section function
1446 always sees the original values. This is more reliable than
1447 always recomputing the symbol value even if we are stripping
1448 the symbol. */
1449 isym = *isymp;
1450
1451 classification = bfd_coff_classify_symbol (input_bfd, &isym);
1452 switch (classification)
1453 {
1454 default:
1455 abort ();
1456 case COFF_SYMBOL_GLOBAL:
1457 case COFF_SYMBOL_PE_SECTION:
1458 case COFF_SYMBOL_LOCAL:
1459 *secpp = coff_section_from_bfd_index (input_bfd, isym.n_scnum);
1460 break;
1461 case COFF_SYMBOL_COMMON:
1462 *secpp = bfd_com_section_ptr;
1463 break;
1464 case COFF_SYMBOL_UNDEFINED:
1465 *secpp = bfd_und_section_ptr;
1466 break;
1467 }
1468
1469 /* Extract the flag indicating if this symbol is used by a
1470 relocation. */
1471 if ((finfo->info->strip != strip_none
1472 || finfo->info->discard != discard_none)
1473 && finfo->info->relocateable)
1474 dont_skip_symbol = *indexp;
1475 else
1476 dont_skip_symbol = false;
1477
1478 *indexp = -1;
1479
1480 skip = false;
1481 global = false;
1482 add = 1 + isym.n_numaux;
1483
1484 /* If we are stripping all symbols, we want to skip this one. */
1485 if (finfo->info->strip == strip_all && ! dont_skip_symbol)
1486 skip = true;
1487
1488 if (! skip)
1489 {
1490 switch (classification)
1491 {
1492 default:
1493 abort ();
1494 case COFF_SYMBOL_GLOBAL:
1495 case COFF_SYMBOL_COMMON:
1496 case COFF_SYMBOL_PE_SECTION:
1497 /* This is a global symbol. Global symbols come at the
1498 end of the symbol table, so skip them for now.
1499 Locally defined function symbols, however, are an
1500 exception, and are not moved to the end. */
1501 global = true;
1502 if (! ISFCN (isym.n_type))
1503 skip = true;
1504 break;
1505
1506 case COFF_SYMBOL_UNDEFINED:
1507 /* Undefined symbols are left for the end. */
1508 global = true;
1509 skip = true;
1510 break;
1511
1512 case COFF_SYMBOL_LOCAL:
1513 /* This is a local symbol. Skip it if we are discarding
1514 local symbols. */
1515 if (finfo->info->discard == discard_all && ! dont_skip_symbol)
1516 skip = true;
1517 break;
1518 }
1519 }
1520
1521 #ifndef COFF_WITH_PE
1522 /* Skip section symbols for sections which are not going to be
1523 emitted. */
1524 if (!skip
1525 && isym.n_sclass == C_STAT
1526 && isym.n_type == T_NULL
1527 && isym.n_numaux > 0)
1528 {
1529 if ((*secpp)->output_section == bfd_abs_section_ptr)
1530 skip = true;
1531 }
1532 #endif
1533
1534 /* If we stripping debugging symbols, and this is a debugging
1535 symbol, then skip it. FIXME: gas sets the section to N_ABS
1536 for some types of debugging symbols; I don't know if this is
1537 a bug or not. In any case, we handle it here. */
1538 if (! skip
1539 && finfo->info->strip == strip_debugger
1540 && ! dont_skip_symbol
1541 && (isym.n_scnum == N_DEBUG
1542 || (isym.n_scnum == N_ABS
1543 && (isym.n_sclass == C_AUTO
1544 || isym.n_sclass == C_REG
1545 || isym.n_sclass == C_MOS
1546 || isym.n_sclass == C_MOE
1547 || isym.n_sclass == C_MOU
1548 || isym.n_sclass == C_ARG
1549 || isym.n_sclass == C_REGPARM
1550 || isym.n_sclass == C_FIELD
1551 || isym.n_sclass == C_EOS))))
1552 skip = true;
1553
1554 /* If some symbols are stripped based on the name, work out the
1555 name and decide whether to skip this symbol. */
1556 if (! skip
1557 && (finfo->info->strip == strip_some
1558 || finfo->info->discard == discard_l))
1559 {
1560 const char *name;
1561 char buf[SYMNMLEN + 1];
1562
1563 name = _bfd_coff_internal_syment_name (input_bfd, &isym, buf);
1564 if (name == NULL)
1565 return false;
1566
1567 if (! dont_skip_symbol
1568 && ((finfo->info->strip == strip_some
1569 && (bfd_hash_lookup (finfo->info->keep_hash, name, false,
1570 false) == NULL))
1571 || (! global
1572 && finfo->info->discard == discard_l
1573 && bfd_is_local_label_name (input_bfd, name))))
1574 skip = true;
1575 }
1576
1577 /* If this is an enum, struct, or union tag, see if we have
1578 already output an identical type. */
1579 if (! skip
1580 && (finfo->output_bfd->flags & BFD_TRADITIONAL_FORMAT) == 0
1581 && (isym.n_sclass == C_ENTAG
1582 || isym.n_sclass == C_STRTAG
1583 || isym.n_sclass == C_UNTAG)
1584 && isym.n_numaux == 1)
1585 {
1586 const char *name;
1587 char buf[SYMNMLEN + 1];
1588 struct coff_debug_merge_hash_entry *mh;
1589 struct coff_debug_merge_type *mt;
1590 union internal_auxent aux;
1591 struct coff_debug_merge_element **epp;
1592 bfd_byte *esl, *eslend;
1593 struct internal_syment *islp;
1594 bfd_size_type amt;
1595
1596 name = _bfd_coff_internal_syment_name (input_bfd, &isym, buf);
1597 if (name == NULL)
1598 return false;
1599
1600 /* Ignore fake names invented by compiler; treat them all as
1601 the same name. */
1602 if (*name == '~' || *name == '.' || *name == '$'
1603 || (*name == bfd_get_symbol_leading_char (input_bfd)
1604 && (name[1] == '~' || name[1] == '.' || name[1] == '$')))
1605 name = "";
1606
1607 mh = coff_debug_merge_hash_lookup (&finfo->debug_merge, name,
1608 true, true);
1609 if (mh == NULL)
1610 return false;
1611
1612 /* Allocate memory to hold type information. If this turns
1613 out to be a duplicate, we pass this address to
1614 bfd_release. */
1615 amt = sizeof (struct coff_debug_merge_type);
1616 mt = (struct coff_debug_merge_type *) bfd_alloc (input_bfd, amt);
1617 if (mt == NULL)
1618 return false;
1619 mt->class = isym.n_sclass;
1620
1621 /* Pick up the aux entry, which points to the end of the tag
1622 entries. */
1623 bfd_coff_swap_aux_in (input_bfd, (PTR) (esym + isymesz),
1624 isym.n_type, isym.n_sclass, 0, isym.n_numaux,
1625 (PTR) &aux);
1626
1627 /* Gather the elements. */
1628 epp = &mt->elements;
1629 mt->elements = NULL;
1630 islp = isymp + 2;
1631 esl = esym + 2 * isymesz;
1632 eslend = ((bfd_byte *) obj_coff_external_syms (input_bfd)
1633 + aux.x_sym.x_fcnary.x_fcn.x_endndx.l * isymesz);
1634 while (esl < eslend)
1635 {
1636 const char *elename;
1637 char elebuf[SYMNMLEN + 1];
1638 char *name_copy;
1639
1640 bfd_coff_swap_sym_in (input_bfd, (PTR) esl, (PTR) islp);
1641
1642 amt = sizeof (struct coff_debug_merge_element);
1643 *epp = ((struct coff_debug_merge_element *)
1644 bfd_alloc (input_bfd, amt));
1645 if (*epp == NULL)
1646 return false;
1647
1648 elename = _bfd_coff_internal_syment_name (input_bfd, islp,
1649 elebuf);
1650 if (elename == NULL)
1651 return false;
1652
1653 amt = strlen (elename) + 1;
1654 name_copy = (char *) bfd_alloc (input_bfd, amt);
1655 if (name_copy == NULL)
1656 return false;
1657 strcpy (name_copy, elename);
1658
1659 (*epp)->name = name_copy;
1660 (*epp)->type = islp->n_type;
1661 (*epp)->tagndx = 0;
1662 if (islp->n_numaux >= 1
1663 && islp->n_type != T_NULL
1664 && islp->n_sclass != C_EOS)
1665 {
1666 union internal_auxent eleaux;
1667 long indx;
1668
1669 bfd_coff_swap_aux_in (input_bfd, (PTR) (esl + isymesz),
1670 islp->n_type, islp->n_sclass, 0,
1671 islp->n_numaux, (PTR) &eleaux);
1672 indx = eleaux.x_sym.x_tagndx.l;
1673
1674 /* FIXME: If this tagndx entry refers to a symbol
1675 defined later in this file, we just ignore it.
1676 Handling this correctly would be tedious, and may
1677 not be required. */
1678
1679 if (indx > 0
1680 && (indx
1681 < ((esym -
1682 (bfd_byte *) obj_coff_external_syms (input_bfd))
1683 / (long) isymesz)))
1684 {
1685 (*epp)->tagndx = finfo->sym_indices[indx];
1686 if ((*epp)->tagndx < 0)
1687 (*epp)->tagndx = 0;
1688 }
1689 }
1690 epp = &(*epp)->next;
1691 *epp = NULL;
1692
1693 esl += (islp->n_numaux + 1) * isymesz;
1694 islp += islp->n_numaux + 1;
1695 }
1696
1697 /* See if we already have a definition which matches this
1698 type. We always output the type if it has no elements,
1699 for simplicity. */
1700 if (mt->elements == NULL)
1701 bfd_release (input_bfd, (PTR) mt);
1702 else
1703 {
1704 struct coff_debug_merge_type *mtl;
1705
1706 for (mtl = mh->types; mtl != NULL; mtl = mtl->next)
1707 {
1708 struct coff_debug_merge_element *me, *mel;
1709
1710 if (mtl->class != mt->class)
1711 continue;
1712
1713 for (me = mt->elements, mel = mtl->elements;
1714 me != NULL && mel != NULL;
1715 me = me->next, mel = mel->next)
1716 {
1717 if (strcmp (me->name, mel->name) != 0
1718 || me->type != mel->type
1719 || me->tagndx != mel->tagndx)
1720 break;
1721 }
1722
1723 if (me == NULL && mel == NULL)
1724 break;
1725 }
1726
1727 if (mtl == NULL || (bfd_size_type) mtl->indx >= syment_base)
1728 {
1729 /* This is the first definition of this type. */
1730 mt->indx = output_index;
1731 mt->next = mh->types;
1732 mh->types = mt;
1733 }
1734 else
1735 {
1736 /* This is a redefinition which can be merged. */
1737 bfd_release (input_bfd, (PTR) mt);
1738 *indexp = mtl->indx;
1739 add = (eslend - esym) / isymesz;
1740 skip = true;
1741 }
1742 }
1743 }
1744
1745 /* We now know whether we are to skip this symbol or not. */
1746 if (! skip)
1747 {
1748 /* Adjust the symbol in order to output it. */
1749
1750 if (isym._n._n_n._n_zeroes == 0
1751 && isym._n._n_n._n_offset != 0)
1752 {
1753 const char *name;
1754 bfd_size_type indx;
1755
1756 /* This symbol has a long name. Enter it in the string
1757 table we are building. Note that we do not check
1758 bfd_coff_symname_in_debug. That is only true for
1759 XCOFF, and XCOFF requires different linking code
1760 anyhow. */
1761 name = _bfd_coff_internal_syment_name (input_bfd, &isym,
1762 (char *) NULL);
1763 if (name == NULL)
1764 return false;
1765 indx = _bfd_stringtab_add (finfo->strtab, name, hash, copy);
1766 if (indx == (bfd_size_type) -1)
1767 return false;
1768 isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
1769 }
1770
1771 switch (isym.n_sclass)
1772 {
1773 case C_AUTO:
1774 case C_MOS:
1775 case C_EOS:
1776 case C_MOE:
1777 case C_MOU:
1778 case C_UNTAG:
1779 case C_STRTAG:
1780 case C_ENTAG:
1781 case C_TPDEF:
1782 case C_ARG:
1783 case C_USTATIC:
1784 case C_REG:
1785 case C_REGPARM:
1786 case C_FIELD:
1787 /* The symbol value should not be modified. */
1788 break;
1789
1790 case C_FCN:
1791 if (obj_pe (input_bfd)
1792 && strcmp (isym.n_name, ".bf") != 0
1793 && isym.n_scnum > 0)
1794 {
1795 /* For PE, .lf and .ef get their value left alone,
1796 while .bf gets relocated. However, they all have
1797 "real" section numbers, and need to be moved into
1798 the new section. */
1799 isym.n_scnum = (*secpp)->output_section->target_index;
1800 break;
1801 }
1802 /* Fall through. */
1803 default:
1804 case C_LABEL: /* Not completely sure about these 2 */
1805 case C_EXTDEF:
1806 case C_BLOCK:
1807 case C_EFCN:
1808 case C_NULL:
1809 case C_EXT:
1810 case C_STAT:
1811 case C_SECTION:
1812 case C_NT_WEAK:
1813 /* Compute new symbol location. */
1814 if (isym.n_scnum > 0)
1815 {
1816 isym.n_scnum = (*secpp)->output_section->target_index;
1817 isym.n_value += (*secpp)->output_offset;
1818 if (! obj_pe (input_bfd))
1819 isym.n_value -= (*secpp)->vma;
1820 if (! obj_pe (finfo->output_bfd))
1821 isym.n_value += (*secpp)->output_section->vma;
1822 }
1823 break;
1824
1825 case C_FILE:
1826 /* The value of a C_FILE symbol is the symbol index of
1827 the next C_FILE symbol. The value of the last C_FILE
1828 symbol is the symbol index to the first external
1829 symbol (actually, coff_renumber_symbols does not get
1830 this right--it just sets the value of the last C_FILE
1831 symbol to zero--and nobody has ever complained about
1832 it). We try to get this right, below, just before we
1833 write the symbols out, but in the general case we may
1834 have to write the symbol out twice. */
1835
1836 if (finfo->last_file_index != -1
1837 && finfo->last_file.n_value != (bfd_vma) output_index)
1838 {
1839 /* We must correct the value of the last C_FILE
1840 entry. */
1841 finfo->last_file.n_value = output_index;
1842 if ((bfd_size_type) finfo->last_file_index >= syment_base)
1843 {
1844 /* The last C_FILE symbol is in this input file. */
1845 bfd_coff_swap_sym_out (output_bfd,
1846 (PTR) &finfo->last_file,
1847 (PTR) (finfo->outsyms
1848 + ((finfo->last_file_index
1849 - syment_base)
1850 * osymesz)));
1851 }
1852 else
1853 {
1854 file_ptr pos;
1855
1856 /* We have already written out the last C_FILE
1857 symbol. We need to write it out again. We
1858 borrow *outsym temporarily. */
1859 bfd_coff_swap_sym_out (output_bfd,
1860 (PTR) &finfo->last_file,
1861 (PTR) outsym);
1862 pos = obj_sym_filepos (output_bfd);
1863 pos += finfo->last_file_index * osymesz;
1864 if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
1865 || bfd_bwrite (outsym, osymesz, output_bfd) != osymesz)
1866 return false;
1867 }
1868 }
1869
1870 finfo->last_file_index = output_index;
1871 finfo->last_file = isym;
1872 break;
1873 }
1874
1875 /* If doing task linking, convert normal global function symbols to
1876 static functions. */
1877 if (finfo->info->task_link && IS_EXTERNAL (input_bfd, isym))
1878 isym.n_sclass = C_STAT;
1879
1880 /* Output the symbol. */
1881
1882 bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) outsym);
1883
1884 *indexp = output_index;
1885
1886 if (global)
1887 {
1888 long indx;
1889 struct coff_link_hash_entry *h;
1890
1891 indx = ((esym - (bfd_byte *) obj_coff_external_syms (input_bfd))
1892 / isymesz);
1893 h = obj_coff_sym_hashes (input_bfd)[indx];
1894 if (h == NULL)
1895 {
1896 /* This can happen if there were errors earlier in
1897 the link. */
1898 bfd_set_error (bfd_error_bad_value);
1899 return false;
1900 }
1901 h->indx = output_index;
1902 }
1903
1904 output_index += add;
1905 outsym += add * osymesz;
1906 }
1907
1908 esym += add * isymesz;
1909 isymp += add;
1910 ++secpp;
1911 ++indexp;
1912 for (--add; add > 0; --add)
1913 {
1914 *secpp++ = NULL;
1915 *indexp++ = -1;
1916 }
1917 }
1918
1919 /* Fix up the aux entries. This must be done in a separate pass,
1920 because we don't know the correct symbol indices until we have
1921 already decided which symbols we are going to keep. */
1922
1923 esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
1924 esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
1925 isymp = finfo->internal_syms;
1926 indexp = finfo->sym_indices;
1927 sym_hash = obj_coff_sym_hashes (input_bfd);
1928 outsym = finfo->outsyms;
1929 while (esym < esym_end)
1930 {
1931 int add;
1932
1933 add = 1 + isymp->n_numaux;
1934
1935 if ((*indexp < 0
1936 || (bfd_size_type) *indexp < syment_base)
1937 && (*sym_hash == NULL
1938 || (*sym_hash)->auxbfd != input_bfd))
1939 esym += add * isymesz;
1940 else
1941 {
1942 struct coff_link_hash_entry *h;
1943 int i;
1944
1945 h = NULL;
1946 if (*indexp < 0)
1947 {
1948 h = *sym_hash;
1949
1950 /* The m68k-motorola-sysv assembler will sometimes
1951 generate two symbols with the same name, but only one
1952 will have aux entries. */
1953 BFD_ASSERT (isymp->n_numaux == 0
1954 || h->numaux == isymp->n_numaux);
1955 }
1956
1957 esym += isymesz;
1958
1959 if (h == NULL)
1960 outsym += osymesz;
1961
1962 /* Handle the aux entries. This handling is based on
1963 coff_pointerize_aux. I don't know if it always correct. */
1964 for (i = 0; i < isymp->n_numaux && esym < esym_end; i++)
1965 {
1966 union internal_auxent aux;
1967 union internal_auxent *auxp;
1968
1969 if (h != NULL)
1970 auxp = h->aux + i;
1971 else
1972 {
1973 bfd_coff_swap_aux_in (input_bfd, (PTR) esym, isymp->n_type,
1974 isymp->n_sclass, i, isymp->n_numaux,
1975 (PTR) &aux);
1976 auxp = &aux;
1977 }
1978
1979 if (isymp->n_sclass == C_FILE)
1980 {
1981 /* If this is a long filename, we must put it in the
1982 string table. */
1983 if (auxp->x_file.x_n.x_zeroes == 0
1984 && auxp->x_file.x_n.x_offset != 0)
1985 {
1986 const char *filename;
1987 bfd_size_type indx;
1988
1989 BFD_ASSERT (auxp->x_file.x_n.x_offset
1990 >= STRING_SIZE_SIZE);
1991 if (strings == NULL)
1992 {
1993 strings = _bfd_coff_read_string_table (input_bfd);
1994 if (strings == NULL)
1995 return false;
1996 }
1997 filename = strings + auxp->x_file.x_n.x_offset;
1998 indx = _bfd_stringtab_add (finfo->strtab, filename,
1999 hash, copy);
2000 if (indx == (bfd_size_type) -1)
2001 return false;
2002 auxp->x_file.x_n.x_offset = STRING_SIZE_SIZE + indx;
2003 }
2004 }
2005 else if (isymp->n_sclass != C_STAT || isymp->n_type != T_NULL)
2006 {
2007 unsigned long indx;
2008
2009 if (ISFCN (isymp->n_type)
2010 || ISTAG (isymp->n_sclass)
2011 || isymp->n_sclass == C_BLOCK
2012 || isymp->n_sclass == C_FCN)
2013 {
2014 indx = auxp->x_sym.x_fcnary.x_fcn.x_endndx.l;
2015 if (indx > 0
2016 && indx < obj_raw_syment_count (input_bfd))
2017 {
2018 /* We look forward through the symbol for
2019 the index of the next symbol we are going
2020 to include. I don't know if this is
2021 entirely right. */
2022 while ((finfo->sym_indices[indx] < 0
2023 || ((bfd_size_type) finfo->sym_indices[indx]
2024 < syment_base))
2025 && indx < obj_raw_syment_count (input_bfd))
2026 ++indx;
2027 if (indx >= obj_raw_syment_count (input_bfd))
2028 indx = output_index;
2029 else
2030 indx = finfo->sym_indices[indx];
2031 auxp->x_sym.x_fcnary.x_fcn.x_endndx.l = indx;
2032 }
2033 }
2034
2035 indx = auxp->x_sym.x_tagndx.l;
2036 if (indx > 0 && indx < obj_raw_syment_count (input_bfd))
2037 {
2038 long symindx;
2039
2040 symindx = finfo->sym_indices[indx];
2041 if (symindx < 0)
2042 auxp->x_sym.x_tagndx.l = 0;
2043 else
2044 auxp->x_sym.x_tagndx.l = symindx;
2045 }
2046
2047 /* The .bf symbols are supposed to be linked through
2048 the endndx field. We need to carry this list
2049 across object files. */
2050 if (i == 0
2051 && h == NULL
2052 && isymp->n_sclass == C_FCN
2053 && (isymp->_n._n_n._n_zeroes != 0
2054 || isymp->_n._n_n._n_offset == 0)
2055 && isymp->_n._n_name[0] == '.'
2056 && isymp->_n._n_name[1] == 'b'
2057 && isymp->_n._n_name[2] == 'f'
2058 && isymp->_n._n_name[3] == '\0')
2059 {
2060 if (finfo->last_bf_index != -1)
2061 {
2062 finfo->last_bf.x_sym.x_fcnary.x_fcn.x_endndx.l =
2063 *indexp;
2064
2065 if ((bfd_size_type) finfo->last_bf_index
2066 >= syment_base)
2067 {
2068 PTR auxout;
2069
2070 /* The last .bf symbol is in this input
2071 file. This will only happen if the
2072 assembler did not set up the .bf
2073 endndx symbols correctly. */
2074 auxout = (PTR) (finfo->outsyms
2075 + ((finfo->last_bf_index
2076 - syment_base)
2077 * osymesz));
2078 bfd_coff_swap_aux_out (output_bfd,
2079 (PTR) &finfo->last_bf,
2080 isymp->n_type,
2081 isymp->n_sclass,
2082 0, isymp->n_numaux,
2083 auxout);
2084 }
2085 else
2086 {
2087 file_ptr pos;
2088
2089 /* We have already written out the last
2090 .bf aux entry. We need to write it
2091 out again. We borrow *outsym
2092 temporarily. FIXME: This case should
2093 be made faster. */
2094 bfd_coff_swap_aux_out (output_bfd,
2095 (PTR) &finfo->last_bf,
2096 isymp->n_type,
2097 isymp->n_sclass,
2098 0, isymp->n_numaux,
2099 (PTR) outsym);
2100 pos = obj_sym_filepos (output_bfd);
2101 pos += finfo->last_bf_index * osymesz;
2102 if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
2103 || (bfd_bwrite (outsym, osymesz, output_bfd)
2104 != osymesz))
2105 return false;
2106 }
2107 }
2108
2109 if (auxp->x_sym.x_fcnary.x_fcn.x_endndx.l != 0)
2110 finfo->last_bf_index = -1;
2111 else
2112 {
2113 /* The endndx field of this aux entry must
2114 be updated with the symbol number of the
2115 next .bf symbol. */
2116 finfo->last_bf = *auxp;
2117 finfo->last_bf_index = (((outsym - finfo->outsyms)
2118 / osymesz)
2119 + syment_base);
2120 }
2121 }
2122 }
2123
2124 if (h == NULL)
2125 {
2126 bfd_coff_swap_aux_out (output_bfd, (PTR) auxp, isymp->n_type,
2127 isymp->n_sclass, i, isymp->n_numaux,
2128 (PTR) outsym);
2129 outsym += osymesz;
2130 }
2131
2132 esym += isymesz;
2133 }
2134 }
2135
2136 indexp += add;
2137 isymp += add;
2138 sym_hash += add;
2139 }
2140
2141 /* Relocate the line numbers, unless we are stripping them. */
2142 if (finfo->info->strip == strip_none
2143 || finfo->info->strip == strip_some)
2144 {
2145 for (o = input_bfd->sections; o != NULL; o = o->next)
2146 {
2147 bfd_vma offset;
2148 bfd_byte *eline;
2149 bfd_byte *elineend;
2150 bfd_byte *oeline;
2151 boolean skipping;
2152 file_ptr pos;
2153 bfd_size_type amt;
2154
2155 /* FIXME: If SEC_HAS_CONTENTS is not for the section, then
2156 build_link_order in ldwrite.c will not have created a
2157 link order, which means that we will not have seen this
2158 input section in _bfd_coff_final_link, which means that
2159 we will not have allocated space for the line numbers of
2160 this section. I don't think line numbers can be
2161 meaningful for a section which does not have
2162 SEC_HAS_CONTENTS set, but, if they do, this must be
2163 changed. */
2164 if (o->lineno_count == 0
2165 || (o->output_section->flags & SEC_HAS_CONTENTS) == 0)
2166 continue;
2167
2168 if (bfd_seek (input_bfd, o->line_filepos, SEEK_SET) != 0
2169 || bfd_bread (finfo->linenos, linesz * o->lineno_count,
2170 input_bfd) != linesz * o->lineno_count)
2171 return false;
2172
2173 offset = o->output_section->vma + o->output_offset - o->vma;
2174 eline = finfo->linenos;
2175 oeline = finfo->linenos;
2176 elineend = eline + linesz * o->lineno_count;
2177 skipping = false;
2178 for (; eline < elineend; eline += linesz)
2179 {
2180 struct internal_lineno iline;
2181
2182 bfd_coff_swap_lineno_in (input_bfd, (PTR) eline, (PTR) &iline);
2183
2184 if (iline.l_lnno != 0)
2185 iline.l_addr.l_paddr += offset;
2186 else if (iline.l_addr.l_symndx >= 0
2187 && ((unsigned long) iline.l_addr.l_symndx
2188 < obj_raw_syment_count (input_bfd)))
2189 {
2190 long indx;
2191
2192 indx = finfo->sym_indices[iline.l_addr.l_symndx];
2193
2194 if (indx < 0)
2195 {
2196 /* These line numbers are attached to a symbol
2197 which we are stripping. We must discard the
2198 line numbers because reading them back with
2199 no associated symbol (or associating them all
2200 with symbol #0) will fail. We can't regain
2201 the space in the output file, but at least
2202 they're dense. */
2203 skipping = true;
2204 }
2205 else
2206 {
2207 struct internal_syment is;
2208 union internal_auxent ia;
2209
2210 /* Fix up the lnnoptr field in the aux entry of
2211 the symbol. It turns out that we can't do
2212 this when we modify the symbol aux entries,
2213 because gas sometimes screws up the lnnoptr
2214 field and makes it an offset from the start
2215 of the line numbers rather than an absolute
2216 file index. */
2217 bfd_coff_swap_sym_in (output_bfd,
2218 (PTR) (finfo->outsyms
2219 + ((indx - syment_base)
2220 * osymesz)),
2221 (PTR) &is);
2222 if ((ISFCN (is.n_type)
2223 || is.n_sclass == C_BLOCK)
2224 && is.n_numaux >= 1)
2225 {
2226 PTR auxptr;
2227
2228 auxptr = (PTR) (finfo->outsyms
2229 + ((indx - syment_base + 1)
2230 * osymesz));
2231 bfd_coff_swap_aux_in (output_bfd, auxptr,
2232 is.n_type, is.n_sclass,
2233 0, is.n_numaux, (PTR) &ia);
2234 ia.x_sym.x_fcnary.x_fcn.x_lnnoptr =
2235 (o->output_section->line_filepos
2236 + o->output_section->lineno_count * linesz
2237 + eline - finfo->linenos);
2238 bfd_coff_swap_aux_out (output_bfd, (PTR) &ia,
2239 is.n_type, is.n_sclass, 0,
2240 is.n_numaux, auxptr);
2241 }
2242
2243 skipping = false;
2244 }
2245
2246 iline.l_addr.l_symndx = indx;
2247 }
2248
2249 if (!skipping)
2250 {
2251 bfd_coff_swap_lineno_out (output_bfd, (PTR) &iline,
2252 (PTR) oeline);
2253 oeline += linesz;
2254 }
2255 }
2256
2257 pos = o->output_section->line_filepos;
2258 pos += o->output_section->lineno_count * linesz;
2259 amt = oeline - finfo->linenos;
2260 if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
2261 || bfd_bwrite (finfo->linenos, amt, output_bfd) != amt)
2262 return false;
2263
2264 o->output_section->lineno_count += amt / linesz;
2265 }
2266 }
2267
2268 /* If we swapped out a C_FILE symbol, guess that the next C_FILE
2269 symbol will be the first symbol in the next input file. In the
2270 normal case, this will save us from writing out the C_FILE symbol
2271 again. */
2272 if (finfo->last_file_index != -1
2273 && (bfd_size_type) finfo->last_file_index >= syment_base)
2274 {
2275 finfo->last_file.n_value = output_index;
2276 bfd_coff_swap_sym_out (output_bfd, (PTR) &finfo->last_file,
2277 (PTR) (finfo->outsyms
2278 + ((finfo->last_file_index - syment_base)
2279 * osymesz)));
2280 }
2281
2282 /* Write the modified symbols to the output file. */
2283 if (outsym > finfo->outsyms)
2284 {
2285 file_ptr pos;
2286 bfd_size_type amt;
2287
2288 pos = obj_sym_filepos (output_bfd) + syment_base * osymesz;
2289 amt = outsym - finfo->outsyms;
2290 if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
2291 || bfd_bwrite (finfo->outsyms, amt, output_bfd) != amt)
2292 return false;
2293
2294 BFD_ASSERT ((obj_raw_syment_count (output_bfd)
2295 + (outsym - finfo->outsyms) / osymesz)
2296 == output_index);
2297
2298 obj_raw_syment_count (output_bfd) = output_index;
2299 }
2300
2301 /* Relocate the contents of each section. */
2302 adjust_symndx = coff_backend_info (input_bfd)->_bfd_coff_adjust_symndx;
2303 for (o = input_bfd->sections; o != NULL; o = o->next)
2304 {
2305 bfd_byte *contents;
2306 struct coff_section_tdata *secdata;
2307
2308 if (! o->linker_mark)
2309 {
2310 /* This section was omitted from the link. */
2311 continue;
2312 }
2313
2314 if ((o->flags & SEC_HAS_CONTENTS) == 0
2315 || (o->_raw_size == 0 && (o->flags & SEC_RELOC) == 0))
2316 {
2317 if ((o->flags & SEC_RELOC) != 0
2318 && o->reloc_count != 0)
2319 {
2320 ((*_bfd_error_handler)
2321 (_("%s: relocs in section `%s', but it has no contents"),
2322 bfd_archive_filename (input_bfd),
2323 bfd_get_section_name (input_bfd, o)));
2324 bfd_set_error (bfd_error_no_contents);
2325 return false;
2326 }
2327
2328 continue;
2329 }
2330
2331 secdata = coff_section_data (input_bfd, o);
2332 if (secdata != NULL && secdata->contents != NULL)
2333 contents = secdata->contents;
2334 else
2335 {
2336 if (! bfd_get_section_contents (input_bfd, o, finfo->contents,
2337 (file_ptr) 0, o->_raw_size))
2338 return false;
2339 contents = finfo->contents;
2340 }
2341
2342 if ((o->flags & SEC_RELOC) != 0)
2343 {
2344 int target_index;
2345 struct internal_reloc *internal_relocs;
2346 struct internal_reloc *irel;
2347
2348 /* Read in the relocs. */
2349 target_index = o->output_section->target_index;
2350 internal_relocs = (_bfd_coff_read_internal_relocs
2351 (input_bfd, o, false, finfo->external_relocs,
2352 finfo->info->relocateable,
2353 (finfo->info->relocateable
2354 ? (finfo->section_info[target_index].relocs
2355 + o->output_section->reloc_count)
2356 : finfo->internal_relocs)));
2357 if (internal_relocs == NULL)
2358 return false;
2359
2360 /* Call processor specific code to relocate the section
2361 contents. */
2362 if (! bfd_coff_relocate_section (output_bfd, finfo->info,
2363 input_bfd, o,
2364 contents,
2365 internal_relocs,
2366 finfo->internal_syms,
2367 finfo->sec_ptrs))
2368 return false;
2369
2370 if (finfo->info->relocateable)
2371 {
2372 bfd_vma offset;
2373 struct internal_reloc *irelend;
2374 struct coff_link_hash_entry **rel_hash;
2375
2376 offset = o->output_section->vma + o->output_offset - o->vma;
2377 irel = internal_relocs;
2378 irelend = irel + o->reloc_count;
2379 rel_hash = (finfo->section_info[target_index].rel_hashes
2380 + o->output_section->reloc_count);
2381 for (; irel < irelend; irel++, rel_hash++)
2382 {
2383 struct coff_link_hash_entry *h;
2384 boolean adjusted;
2385
2386 *rel_hash = NULL;
2387
2388 /* Adjust the reloc address and symbol index. */
2389
2390 irel->r_vaddr += offset;
2391
2392 if (irel->r_symndx == -1)
2393 continue;
2394
2395 if (adjust_symndx)
2396 {
2397 if (! (*adjust_symndx) (output_bfd, finfo->info,
2398 input_bfd, o, irel,
2399 &adjusted))
2400 return false;
2401 if (adjusted)
2402 continue;
2403 }
2404
2405 h = obj_coff_sym_hashes (input_bfd)[irel->r_symndx];
2406 if (h != NULL)
2407 {
2408 /* This is a global symbol. */
2409 if (h->indx >= 0)
2410 irel->r_symndx = h->indx;
2411 else
2412 {
2413 /* This symbol is being written at the end
2414 of the file, and we do not yet know the
2415 symbol index. We save the pointer to the
2416 hash table entry in the rel_hash list.
2417 We set the indx field to -2 to indicate
2418 that this symbol must not be stripped. */
2419 *rel_hash = h;
2420 h->indx = -2;
2421 }
2422 }
2423 else
2424 {
2425 long indx;
2426
2427 indx = finfo->sym_indices[irel->r_symndx];
2428 if (indx != -1)
2429 irel->r_symndx = indx;
2430 else
2431 {
2432 struct internal_syment *is;
2433 const char *name;
2434 char buf[SYMNMLEN + 1];
2435
2436 /* This reloc is against a symbol we are
2437 stripping. This should have been handled
2438 by the 'dont_skip_symbol' code in the while
2439 loop at the top of this function. */
2440
2441 is = finfo->internal_syms + irel->r_symndx;
2442
2443 name = (_bfd_coff_internal_syment_name
2444 (input_bfd, is, buf));
2445 if (name == NULL)
2446 return false;
2447
2448 if (! ((*finfo->info->callbacks->unattached_reloc)
2449 (finfo->info, name, input_bfd, o,
2450 irel->r_vaddr)))
2451 return false;
2452 }
2453 }
2454 }
2455
2456 o->output_section->reloc_count += o->reloc_count;
2457 }
2458 }
2459
2460 /* Write out the modified section contents. */
2461 if (secdata == NULL || secdata->stab_info == NULL)
2462 {
2463 file_ptr loc = o->output_offset * bfd_octets_per_byte (output_bfd);
2464 bfd_size_type amt = (o->_cooked_size != 0
2465 ? o->_cooked_size : o->_raw_size);
2466 if (! bfd_set_section_contents (output_bfd, o->output_section,
2467 contents, loc, amt))
2468 return false;
2469 }
2470 else
2471 {
2472 if (! (_bfd_write_section_stabs
2473 (output_bfd, &coff_hash_table (finfo->info)->stab_info,
2474 o, &secdata->stab_info, contents)))
2475 return false;
2476 }
2477 }
2478
2479 if (! finfo->info->keep_memory)
2480 {
2481 if (! _bfd_coff_free_symbols (input_bfd))
2482 return false;
2483 }
2484
2485 return true;
2486 }
2487
2488 /* Write out a global symbol. Called via coff_link_hash_traverse. */
2489
2490 boolean
2491 _bfd_coff_write_global_sym (h, data)
2492 struct coff_link_hash_entry *h;
2493 PTR data;
2494 {
2495 struct coff_final_link_info *finfo = (struct coff_final_link_info *) data;
2496 bfd *output_bfd;
2497 struct internal_syment isym;
2498 bfd_size_type symesz;
2499 unsigned int i;
2500 file_ptr pos;
2501
2502 output_bfd = finfo->output_bfd;
2503
2504 if (h->root.type == bfd_link_hash_warning)
2505 {
2506 h = (struct coff_link_hash_entry *) h->root.u.i.link;
2507 if (h->root.type == bfd_link_hash_new)
2508 return true;
2509 }
2510
2511 if (h->indx >= 0)
2512 return true;
2513
2514 if (h->indx != -2
2515 && (finfo->info->strip == strip_all
2516 || (finfo->info->strip == strip_some
2517 && (bfd_hash_lookup (finfo->info->keep_hash,
2518 h->root.root.string, false, false)
2519 == NULL))))
2520 return true;
2521
2522 switch (h->root.type)
2523 {
2524 default:
2525 case bfd_link_hash_new:
2526 case bfd_link_hash_warning:
2527 abort ();
2528 return false;
2529
2530 case bfd_link_hash_undefined:
2531 case bfd_link_hash_undefweak:
2532 isym.n_scnum = N_UNDEF;
2533 isym.n_value = 0;
2534 break;
2535
2536 case bfd_link_hash_defined:
2537 case bfd_link_hash_defweak:
2538 {
2539 asection *sec;
2540
2541 sec = h->root.u.def.section->output_section;
2542 if (bfd_is_abs_section (sec))
2543 isym.n_scnum = N_ABS;
2544 else
2545 isym.n_scnum = sec->target_index;
2546 isym.n_value = (h->root.u.def.value
2547 + h->root.u.def.section->output_offset);
2548 if (! obj_pe (finfo->output_bfd))
2549 isym.n_value += sec->vma;
2550 }
2551 break;
2552
2553 case bfd_link_hash_common:
2554 isym.n_scnum = N_UNDEF;
2555 isym.n_value = h->root.u.c.size;
2556 break;
2557
2558 case bfd_link_hash_indirect:
2559 /* Just ignore these. They can't be handled anyhow. */
2560 return true;
2561 }
2562
2563 if (strlen (h->root.root.string) <= SYMNMLEN)
2564 strncpy (isym._n._n_name, h->root.root.string, SYMNMLEN);
2565 else
2566 {
2567 boolean hash;
2568 bfd_size_type indx;
2569
2570 hash = true;
2571 if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
2572 hash = false;
2573 indx = _bfd_stringtab_add (finfo->strtab, h->root.root.string, hash,
2574 false);
2575 if (indx == (bfd_size_type) -1)
2576 {
2577 finfo->failed = true;
2578 return false;
2579 }
2580 isym._n._n_n._n_zeroes = 0;
2581 isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
2582 }
2583
2584 isym.n_sclass = h->class;
2585 isym.n_type = h->type;
2586
2587 if (isym.n_sclass == C_NULL)
2588 isym.n_sclass = C_EXT;
2589
2590 /* If doing task linking and this is the pass where we convert
2591 defined globals to statics, then do that conversion now. If the
2592 symbol is not being converted, just ignore it and it will be
2593 output during a later pass. */
2594 if (finfo->global_to_static)
2595 {
2596 if (! IS_EXTERNAL (output_bfd, isym))
2597 return true;
2598
2599 isym.n_sclass = C_STAT;
2600 }
2601
2602 /* When a weak symbol is not overriden by a strong one,
2603 turn it into an external symbol when not building a
2604 shared or relocateable object. */
2605 if (! finfo->info->shared
2606 && ! finfo->info->relocateable
2607 && IS_WEAK_EXTERNAL (finfo->output_bfd, isym))
2608 isym.n_sclass = C_EXT;
2609
2610 isym.n_numaux = h->numaux;
2611
2612 bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) finfo->outsyms);
2613
2614 symesz = bfd_coff_symesz (output_bfd);
2615
2616 pos = obj_sym_filepos (output_bfd);
2617 pos += obj_raw_syment_count (output_bfd) * symesz;
2618 if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
2619 || bfd_bwrite (finfo->outsyms, symesz, output_bfd) != symesz)
2620 {
2621 finfo->failed = true;
2622 return false;
2623 }
2624
2625 h->indx = obj_raw_syment_count (output_bfd);
2626
2627 ++obj_raw_syment_count (output_bfd);
2628
2629 /* Write out any associated aux entries. Most of the aux entries
2630 will have been modified in _bfd_coff_link_input_bfd. We have to
2631 handle section aux entries here, now that we have the final
2632 relocation and line number counts. */
2633 for (i = 0; i < isym.n_numaux; i++)
2634 {
2635 union internal_auxent *auxp;
2636
2637 auxp = h->aux + i;
2638
2639 /* Look for a section aux entry here using the same tests that
2640 coff_swap_aux_out uses. */
2641 if (i == 0
2642 && (isym.n_sclass == C_STAT
2643 || isym.n_sclass == C_HIDDEN)
2644 && isym.n_type == T_NULL
2645 && (h->root.type == bfd_link_hash_defined
2646 || h->root.type == bfd_link_hash_defweak))
2647 {
2648 asection *sec;
2649
2650 sec = h->root.u.def.section->output_section;
2651 if (sec != NULL)
2652 {
2653 auxp->x_scn.x_scnlen = (sec->_cooked_size != 0
2654 ? sec->_cooked_size
2655 : sec->_raw_size);
2656
2657 /* For PE, an overflow on the final link reportedly does
2658 not matter. FIXME: Why not? */
2659
2660 if (sec->reloc_count > 0xffff
2661 && (! obj_pe (output_bfd)
2662 || finfo->info->relocateable))
2663 (*_bfd_error_handler)
2664 (_("%s: %s: reloc overflow: 0x%lx > 0xffff"),
2665 bfd_get_filename (output_bfd),
2666 bfd_get_section_name (output_bfd, sec),
2667 sec->reloc_count);
2668
2669 if (sec->lineno_count > 0xffff
2670 && (! obj_pe (output_bfd)
2671 || finfo->info->relocateable))
2672 (*_bfd_error_handler)
2673 (_("%s: warning: %s: line number overflow: 0x%lx > 0xffff"),
2674 bfd_get_filename (output_bfd),
2675 bfd_get_section_name (output_bfd, sec),
2676 sec->lineno_count);
2677
2678 auxp->x_scn.x_nreloc = sec->reloc_count;
2679 auxp->x_scn.x_nlinno = sec->lineno_count;
2680 auxp->x_scn.x_checksum = 0;
2681 auxp->x_scn.x_associated = 0;
2682 auxp->x_scn.x_comdat = 0;
2683 }
2684 }
2685
2686 bfd_coff_swap_aux_out (output_bfd, (PTR) auxp, isym.n_type,
2687 isym.n_sclass, (int) i, isym.n_numaux,
2688 (PTR) finfo->outsyms);
2689 if (bfd_bwrite (finfo->outsyms, symesz, output_bfd) != symesz)
2690 {
2691 finfo->failed = true;
2692 return false;
2693 }
2694 ++obj_raw_syment_count (output_bfd);
2695 }
2696
2697 return true;
2698 }
2699
2700 /* Write out task global symbols, converting them to statics. Called
2701 via coff_link_hash_traverse. Calls bfd_coff_write_global_sym to do
2702 the dirty work, if the symbol we are processing needs conversion. */
2703
2704 boolean
2705 _bfd_coff_write_task_globals (h, data)
2706 struct coff_link_hash_entry *h;
2707 PTR data;
2708 {
2709 struct coff_final_link_info *finfo = (struct coff_final_link_info *) data;
2710 boolean rtnval = true;
2711 boolean save_global_to_static;
2712
2713 if (h->root.type == bfd_link_hash_warning)
2714 h = (struct coff_link_hash_entry *) h->root.u.i.link;
2715
2716 if (h->indx < 0)
2717 {
2718 switch (h->root.type)
2719 {
2720 case bfd_link_hash_defined:
2721 case bfd_link_hash_defweak:
2722 save_global_to_static = finfo->global_to_static;
2723 finfo->global_to_static = true;
2724 rtnval = _bfd_coff_write_global_sym (h, data);
2725 finfo->global_to_static = save_global_to_static;
2726 break;
2727 default:
2728 break;
2729 }
2730 }
2731 return (rtnval);
2732 }
2733
2734 /* Handle a link order which is supposed to generate a reloc. */
2735
2736 boolean
2737 _bfd_coff_reloc_link_order (output_bfd, finfo, output_section, link_order)
2738 bfd *output_bfd;
2739 struct coff_final_link_info *finfo;
2740 asection *output_section;
2741 struct bfd_link_order *link_order;
2742 {
2743 reloc_howto_type *howto;
2744 struct internal_reloc *irel;
2745 struct coff_link_hash_entry **rel_hash_ptr;
2746
2747 howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
2748 if (howto == NULL)
2749 {
2750 bfd_set_error (bfd_error_bad_value);
2751 return false;
2752 }
2753
2754 if (link_order->u.reloc.p->addend != 0)
2755 {
2756 bfd_size_type size;
2757 bfd_byte *buf;
2758 bfd_reloc_status_type rstat;
2759 boolean ok;
2760 file_ptr loc;
2761
2762 size = bfd_get_reloc_size (howto);
2763 buf = (bfd_byte *) bfd_zmalloc (size);
2764 if (buf == NULL)
2765 return false;
2766
2767 rstat = _bfd_relocate_contents (howto, output_bfd,
2768 (bfd_vma) link_order->u.reloc.p->addend,\
2769 buf);
2770 switch (rstat)
2771 {
2772 case bfd_reloc_ok:
2773 break;
2774 default:
2775 case bfd_reloc_outofrange:
2776 abort ();
2777 case bfd_reloc_overflow:
2778 if (! ((*finfo->info->callbacks->reloc_overflow)
2779 (finfo->info,
2780 (link_order->type == bfd_section_reloc_link_order
2781 ? bfd_section_name (output_bfd,
2782 link_order->u.reloc.p->u.section)
2783 : link_order->u.reloc.p->u.name),
2784 howto->name, link_order->u.reloc.p->addend,
2785 (bfd *) NULL, (asection *) NULL, (bfd_vma) 0)))
2786 {
2787 free (buf);
2788 return false;
2789 }
2790 break;
2791 }
2792 loc = link_order->offset * bfd_octets_per_byte (output_bfd);
2793 ok = bfd_set_section_contents (output_bfd, output_section, (PTR) buf,
2794 loc, size);
2795 free (buf);
2796 if (! ok)
2797 return false;
2798 }
2799
2800 /* Store the reloc information in the right place. It will get
2801 swapped and written out at the end of the final_link routine. */
2802
2803 irel = (finfo->section_info[output_section->target_index].relocs
2804 + output_section->reloc_count);
2805 rel_hash_ptr = (finfo->section_info[output_section->target_index].rel_hashes
2806 + output_section->reloc_count);
2807
2808 memset (irel, 0, sizeof (struct internal_reloc));
2809 *rel_hash_ptr = NULL;
2810
2811 irel->r_vaddr = output_section->vma + link_order->offset;
2812
2813 if (link_order->type == bfd_section_reloc_link_order)
2814 {
2815 /* We need to somehow locate a symbol in the right section. The
2816 symbol must either have a value of zero, or we must adjust
2817 the addend by the value of the symbol. FIXME: Write this
2818 when we need it. The old linker couldn't handle this anyhow. */
2819 abort ();
2820 *rel_hash_ptr = NULL;
2821 irel->r_symndx = 0;
2822 }
2823 else
2824 {
2825 struct coff_link_hash_entry *h;
2826
2827 h = ((struct coff_link_hash_entry *)
2828 bfd_wrapped_link_hash_lookup (output_bfd, finfo->info,
2829 link_order->u.reloc.p->u.name,
2830 false, false, true));
2831 if (h != NULL)
2832 {
2833 if (h->indx >= 0)
2834 irel->r_symndx = h->indx;
2835 else
2836 {
2837 /* Set the index to -2 to force this symbol to get
2838 written out. */
2839 h->indx = -2;
2840 *rel_hash_ptr = h;
2841 irel->r_symndx = 0;
2842 }
2843 }
2844 else
2845 {
2846 if (! ((*finfo->info->callbacks->unattached_reloc)
2847 (finfo->info, link_order->u.reloc.p->u.name, (bfd *) NULL,
2848 (asection *) NULL, (bfd_vma) 0)))
2849 return false;
2850 irel->r_symndx = 0;
2851 }
2852 }
2853
2854 /* FIXME: Is this always right? */
2855 irel->r_type = howto->type;
2856
2857 /* r_size is only used on the RS/6000, which needs its own linker
2858 routines anyhow. r_extern is only used for ECOFF. */
2859
2860 /* FIXME: What is the right value for r_offset? Is zero OK? */
2861
2862 ++output_section->reloc_count;
2863
2864 return true;
2865 }
2866
2867 /* A basic reloc handling routine which may be used by processors with
2868 simple relocs. */
2869
2870 boolean
2871 _bfd_coff_generic_relocate_section (output_bfd, info, input_bfd,
2872 input_section, contents, relocs, syms,
2873 sections)
2874 bfd *output_bfd;
2875 struct bfd_link_info *info;
2876 bfd *input_bfd;
2877 asection *input_section;
2878 bfd_byte *contents;
2879 struct internal_reloc *relocs;
2880 struct internal_syment *syms;
2881 asection **sections;
2882 {
2883 struct internal_reloc *rel;
2884 struct internal_reloc *relend;
2885
2886 rel = relocs;
2887 relend = rel + input_section->reloc_count;
2888 for (; rel < relend; rel++)
2889 {
2890 long symndx;
2891 struct coff_link_hash_entry *h;
2892 struct internal_syment *sym;
2893 bfd_vma addend;
2894 bfd_vma val;
2895 reloc_howto_type *howto;
2896 bfd_reloc_status_type rstat;
2897
2898 symndx = rel->r_symndx;
2899
2900 if (symndx == -1)
2901 {
2902 h = NULL;
2903 sym = NULL;
2904 }
2905 else if (symndx < 0
2906 || (unsigned long) symndx >= obj_raw_syment_count (input_bfd))
2907 {
2908 (*_bfd_error_handler)
2909 ("%s: illegal symbol index %ld in relocs",
2910 bfd_archive_filename (input_bfd), symndx);
2911 return false;
2912 }
2913 else
2914 {
2915 h = obj_coff_sym_hashes (input_bfd)[symndx];
2916 sym = syms + symndx;
2917 }
2918
2919 /* COFF treats common symbols in one of two ways. Either the
2920 size of the symbol is included in the section contents, or it
2921 is not. We assume that the size is not included, and force
2922 the rtype_to_howto function to adjust the addend as needed. */
2923
2924 if (sym != NULL && sym->n_scnum != 0)
2925 addend = - sym->n_value;
2926 else
2927 addend = 0;
2928
2929 howto = bfd_coff_rtype_to_howto (input_bfd, input_section, rel, h,
2930 sym, &addend);
2931 if (howto == NULL)
2932 return false;
2933
2934 /* If we are doing a relocateable link, then we can just ignore
2935 a PC relative reloc that is pcrel_offset. It will already
2936 have the correct value. If this is not a relocateable link,
2937 then we should ignore the symbol value. */
2938 if (howto->pc_relative && howto->pcrel_offset)
2939 {
2940 if (info->relocateable)
2941 continue;
2942 if (sym != NULL && sym->n_scnum != 0)
2943 addend += sym->n_value;
2944 }
2945
2946 val = 0;
2947
2948 if (h == NULL)
2949 {
2950 asection *sec;
2951
2952 if (symndx == -1)
2953 {
2954 sec = bfd_abs_section_ptr;
2955 val = 0;
2956 }
2957 else
2958 {
2959 sec = sections[symndx];
2960 val = (sec->output_section->vma
2961 + sec->output_offset
2962 + sym->n_value);
2963 if (! obj_pe (input_bfd))
2964 val -= sec->vma;
2965 }
2966 }
2967 else
2968 {
2969 if (h->root.type == bfd_link_hash_defined
2970 || h->root.type == bfd_link_hash_defweak)
2971 {
2972 asection *sec;
2973
2974 sec = h->root.u.def.section;
2975 val = (h->root.u.def.value
2976 + sec->output_section->vma
2977 + sec->output_offset);
2978 }
2979
2980 else if (h->root.type == bfd_link_hash_undefweak)
2981 val = 0;
2982
2983 else if (! info->relocateable)
2984 {
2985 if (! ((*info->callbacks->undefined_symbol)
2986 (info, h->root.root.string, input_bfd, input_section,
2987 rel->r_vaddr - input_section->vma, true)))
2988 return false;
2989 }
2990 }
2991
2992 if (info->base_file)
2993 {
2994 /* Emit a reloc if the backend thinks it needs it. */
2995 if (sym && pe_data (output_bfd)->in_reloc_p (output_bfd, howto))
2996 {
2997 /* Relocation to a symbol in a section which isn't
2998 absolute. We output the address here to a file.
2999 This file is then read by dlltool when generating the
3000 reloc section. Note that the base file is not
3001 portable between systems. We write out a long here,
3002 and dlltool reads in a long. */
3003 long addr = (rel->r_vaddr
3004 - input_section->vma
3005 + input_section->output_offset
3006 + input_section->output_section->vma);
3007 if (coff_data (output_bfd)->pe)
3008 addr -= pe_data(output_bfd)->pe_opthdr.ImageBase;
3009 if (fwrite (&addr, 1, sizeof (long), (FILE *) info->base_file)
3010 != sizeof (long))
3011 {
3012 bfd_set_error (bfd_error_system_call);
3013 return false;
3014 }
3015 }
3016 }
3017
3018 rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
3019 contents,
3020 rel->r_vaddr - input_section->vma,
3021 val, addend);
3022
3023 switch (rstat)
3024 {
3025 default:
3026 abort ();
3027 case bfd_reloc_ok:
3028 break;
3029 case bfd_reloc_outofrange:
3030 (*_bfd_error_handler)
3031 (_("%s: bad reloc address 0x%lx in section `%s'"),
3032 bfd_archive_filename (input_bfd),
3033 (unsigned long) rel->r_vaddr,
3034 bfd_get_section_name (input_bfd, input_section));
3035 return false;
3036 case bfd_reloc_overflow:
3037 {
3038 const char *name;
3039 char buf[SYMNMLEN + 1];
3040
3041 if (symndx == -1)
3042 name = "*ABS*";
3043 else if (h != NULL)
3044 name = h->root.root.string;
3045 else
3046 {
3047 name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
3048 if (name == NULL)
3049 return false;
3050 }
3051
3052 if (! ((*info->callbacks->reloc_overflow)
3053 (info, name, howto->name, (bfd_vma) 0, input_bfd,
3054 input_section, rel->r_vaddr - input_section->vma)))
3055 return false;
3056 }
3057 }
3058 }
3059 return true;
3060 }
This page took 0.123394 seconds and 4 git commands to generate.