1 /* COFF specific linker code.
2 Copyright (C) 1994-2017 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor, Cygnus Support.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
22 /* This file contains the COFF backend linker code. */
28 #include "coff/internal.h"
30 #include "safe-ctype.h"
32 static bfd_boolean
coff_link_add_object_symbols (bfd
*, struct bfd_link_info
*);
33 static bfd_boolean coff_link_check_archive_element
34 (bfd
*, struct bfd_link_info
*, struct bfd_link_hash_entry
*, const char *,
36 static bfd_boolean
coff_link_add_symbols (bfd
*, struct bfd_link_info
*);
38 /* Return TRUE if SYM is a weak, external symbol. */
39 #define IS_WEAK_EXTERNAL(abfd, sym) \
40 ((sym).n_sclass == C_WEAKEXT \
41 || (obj_pe (abfd) && (sym).n_sclass == C_NT_WEAK))
43 /* Return TRUE if SYM is an external symbol. */
44 #define IS_EXTERNAL(abfd, sym) \
45 ((sym).n_sclass == C_EXT || IS_WEAK_EXTERNAL (abfd, sym))
47 /* Define macros so that the ISFCN, et. al., macros work correctly.
48 These macros are defined in include/coff/internal.h in terms of
49 N_TMASK, etc. These definitions require a user to define local
50 variables with the appropriate names, and with values from the
51 coff_data (abfd) structure. */
53 #define N_TMASK n_tmask
54 #define N_BTSHFT n_btshft
55 #define N_BTMASK n_btmask
57 /* Create an entry in a COFF linker hash table. */
59 struct bfd_hash_entry
*
60 _bfd_coff_link_hash_newfunc (struct bfd_hash_entry
*entry
,
61 struct bfd_hash_table
*table
,
64 struct coff_link_hash_entry
*ret
= (struct coff_link_hash_entry
*) entry
;
66 /* Allocate the structure if it has not already been allocated by a
68 if (ret
== (struct coff_link_hash_entry
*) NULL
)
69 ret
= ((struct coff_link_hash_entry
*)
70 bfd_hash_allocate (table
, sizeof (struct coff_link_hash_entry
)));
71 if (ret
== (struct coff_link_hash_entry
*) NULL
)
72 return (struct bfd_hash_entry
*) ret
;
74 /* Call the allocation method of the superclass. */
75 ret
= ((struct coff_link_hash_entry
*)
76 _bfd_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
78 if (ret
!= (struct coff_link_hash_entry
*) NULL
)
80 /* Set local fields. */
83 ret
->symbol_class
= C_NULL
;
89 return (struct bfd_hash_entry
*) ret
;
92 /* Initialize a COFF linker hash table. */
95 _bfd_coff_link_hash_table_init (struct coff_link_hash_table
*table
,
97 struct bfd_hash_entry
*(*newfunc
) (struct bfd_hash_entry
*,
98 struct bfd_hash_table
*,
100 unsigned int entsize
)
102 memset (&table
->stab_info
, 0, sizeof (table
->stab_info
));
103 return _bfd_link_hash_table_init (&table
->root
, abfd
, newfunc
, entsize
);
106 /* Create a COFF linker hash table. */
108 struct bfd_link_hash_table
*
109 _bfd_coff_link_hash_table_create (bfd
*abfd
)
111 struct coff_link_hash_table
*ret
;
112 bfd_size_type amt
= sizeof (struct coff_link_hash_table
);
114 ret
= (struct coff_link_hash_table
*) bfd_malloc (amt
);
118 if (! _bfd_coff_link_hash_table_init (ret
, abfd
,
119 _bfd_coff_link_hash_newfunc
,
120 sizeof (struct coff_link_hash_entry
)))
123 return (struct bfd_link_hash_table
*) NULL
;
128 /* Create an entry in a COFF debug merge hash table. */
130 struct bfd_hash_entry
*
131 _bfd_coff_debug_merge_hash_newfunc (struct bfd_hash_entry
*entry
,
132 struct bfd_hash_table
*table
,
135 struct coff_debug_merge_hash_entry
*ret
=
136 (struct coff_debug_merge_hash_entry
*) entry
;
138 /* Allocate the structure if it has not already been allocated by a
140 if (ret
== (struct coff_debug_merge_hash_entry
*) NULL
)
141 ret
= ((struct coff_debug_merge_hash_entry
*)
142 bfd_hash_allocate (table
,
143 sizeof (struct coff_debug_merge_hash_entry
)));
144 if (ret
== (struct coff_debug_merge_hash_entry
*) NULL
)
145 return (struct bfd_hash_entry
*) ret
;
147 /* Call the allocation method of the superclass. */
148 ret
= ((struct coff_debug_merge_hash_entry
*)
149 bfd_hash_newfunc ((struct bfd_hash_entry
*) ret
, table
, string
));
150 if (ret
!= (struct coff_debug_merge_hash_entry
*) NULL
)
152 /* Set local fields. */
156 return (struct bfd_hash_entry
*) ret
;
159 /* Given a COFF BFD, add symbols to the global hash table as
163 _bfd_coff_link_add_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
165 switch (bfd_get_format (abfd
))
168 return coff_link_add_object_symbols (abfd
, info
);
170 return _bfd_generic_link_add_archive_symbols
171 (abfd
, info
, coff_link_check_archive_element
);
173 bfd_set_error (bfd_error_wrong_format
);
178 /* Add symbols from a COFF object file. */
181 coff_link_add_object_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
183 if (! _bfd_coff_get_external_symbols (abfd
))
185 if (! coff_link_add_symbols (abfd
, info
))
188 if (! info
->keep_memory
189 && ! _bfd_coff_free_symbols (abfd
))
195 /* Check a single archive element to see if we need to include it in
196 the link. *PNEEDED is set according to whether this element is
197 needed in the link or not. This is called via
198 _bfd_generic_link_add_archive_symbols. */
201 coff_link_check_archive_element (bfd
*abfd
,
202 struct bfd_link_info
*info
,
203 struct bfd_link_hash_entry
*h
,
205 bfd_boolean
*pneeded
)
209 /* We are only interested in symbols that are currently undefined.
210 If a symbol is currently known to be common, COFF linkers do not
211 bring in an object file which defines it. */
212 if (h
->type
!= bfd_link_hash_undefined
)
215 /* Include this element? */
216 if (!(*info
->callbacks
->add_archive_element
) (info
, abfd
, name
, &abfd
))
220 return coff_link_add_object_symbols (abfd
, info
);
223 /* Add all the symbols from an object file to the hash table. */
226 coff_link_add_symbols (bfd
*abfd
,
227 struct bfd_link_info
*info
)
229 unsigned int n_tmask
= coff_data (abfd
)->local_n_tmask
;
230 unsigned int n_btshft
= coff_data (abfd
)->local_n_btshft
;
231 unsigned int n_btmask
= coff_data (abfd
)->local_n_btmask
;
232 bfd_boolean keep_syms
;
233 bfd_boolean default_copy
;
234 bfd_size_type symcount
;
235 struct coff_link_hash_entry
**sym_hash
;
236 bfd_size_type symesz
;
241 symcount
= obj_raw_syment_count (abfd
);
244 return TRUE
; /* Nothing to do. */
246 /* Keep the symbols during this function, in case the linker needs
247 to read the generic symbols in order to report an error message. */
248 keep_syms
= obj_coff_keep_syms (abfd
);
249 obj_coff_keep_syms (abfd
) = TRUE
;
251 if (info
->keep_memory
)
252 default_copy
= FALSE
;
256 /* We keep a list of the linker hash table entries that correspond
257 to particular symbols. */
258 amt
= symcount
* sizeof (struct coff_link_hash_entry
*);
259 sym_hash
= (struct coff_link_hash_entry
**) bfd_zalloc (abfd
, amt
);
260 if (sym_hash
== NULL
)
262 obj_coff_sym_hashes (abfd
) = sym_hash
;
264 symesz
= bfd_coff_symesz (abfd
);
265 BFD_ASSERT (symesz
== bfd_coff_auxesz (abfd
));
266 esym
= (bfd_byte
*) obj_coff_external_syms (abfd
);
267 esym_end
= esym
+ symcount
* symesz
;
268 while (esym
< esym_end
)
270 struct internal_syment sym
;
271 enum coff_symbol_classification classification
;
274 bfd_coff_swap_sym_in (abfd
, esym
, &sym
);
276 classification
= bfd_coff_classify_symbol (abfd
, &sym
);
277 if (classification
!= COFF_SYMBOL_LOCAL
)
280 char buf
[SYMNMLEN
+ 1];
286 /* This symbol is externally visible. */
288 name
= _bfd_coff_internal_syment_name (abfd
, &sym
, buf
);
292 /* We must copy the name into memory if we got it from the
293 syment itself, rather than the string table. */
295 if (sym
._n
._n_n
._n_zeroes
!= 0
296 || sym
._n
._n_n
._n_offset
== 0)
301 switch (classification
)
306 case COFF_SYMBOL_GLOBAL
:
307 flags
= BSF_EXPORT
| BSF_GLOBAL
;
308 section
= coff_section_from_bfd_index (abfd
, sym
.n_scnum
);
310 value
-= section
->vma
;
313 case COFF_SYMBOL_UNDEFINED
:
315 section
= bfd_und_section_ptr
;
318 case COFF_SYMBOL_COMMON
:
320 section
= bfd_com_section_ptr
;
323 case COFF_SYMBOL_PE_SECTION
:
324 flags
= BSF_SECTION_SYM
| BSF_GLOBAL
;
325 section
= coff_section_from_bfd_index (abfd
, sym
.n_scnum
);
329 if (IS_WEAK_EXTERNAL (abfd
, sym
))
334 /* In the PE format, section symbols actually refer to the
335 start of the output section. We handle them specially
337 if (obj_pe (abfd
) && (flags
& BSF_SECTION_SYM
) != 0)
339 *sym_hash
= coff_link_hash_lookup (coff_hash_table (info
),
340 name
, FALSE
, copy
, FALSE
);
341 if (*sym_hash
!= NULL
)
343 if (((*sym_hash
)->coff_link_hash_flags
344 & COFF_LINK_HASH_PE_SECTION_SYMBOL
) == 0
345 && (*sym_hash
)->root
.type
!= bfd_link_hash_undefined
346 && (*sym_hash
)->root
.type
!= bfd_link_hash_undefweak
)
348 (_("Warning: symbol `%s' is both section and non-section"),
355 /* The Microsoft Visual C compiler does string pooling by
356 hashing the constants to an internal symbol name, and
357 relying on the linker comdat support to discard
358 duplicate names. However, if one string is a literal and
359 one is a data initializer, one will end up in the .data
360 section and one will end up in the .rdata section. The
361 Microsoft linker will combine them into the .data
362 section, which seems to be wrong since it might cause the
365 As long as there are no external references to the
366 symbols, which there shouldn't be, we can treat the .data
367 and .rdata instances as separate symbols. The comdat
368 code in the linker will do the appropriate merging. Here
369 we avoid getting a multiple definition error for one of
370 these special symbols.
372 FIXME: I don't think this will work in the case where
373 there are two object files which use the constants as a
374 literal and two object files which use it as a data
375 initializer. One or the other of the second object files
376 is going to wind up with an inappropriate reference. */
378 && (classification
== COFF_SYMBOL_GLOBAL
379 || classification
== COFF_SYMBOL_PE_SECTION
)
380 && coff_section_data (abfd
, section
) != NULL
381 && coff_section_data (abfd
, section
)->comdat
!= NULL
382 && CONST_STRNEQ (name
, "??_")
383 && strcmp (name
, coff_section_data (abfd
, section
)->comdat
->name
) == 0)
385 if (*sym_hash
== NULL
)
386 *sym_hash
= coff_link_hash_lookup (coff_hash_table (info
),
387 name
, FALSE
, copy
, FALSE
);
388 if (*sym_hash
!= NULL
389 && (*sym_hash
)->root
.type
== bfd_link_hash_defined
390 && coff_section_data (abfd
, (*sym_hash
)->root
.u
.def
.section
)->comdat
!= NULL
391 && strcmp (coff_section_data (abfd
, (*sym_hash
)->root
.u
.def
.section
)->comdat
->name
,
392 coff_section_data (abfd
, section
)->comdat
->name
) == 0)
398 if (! (bfd_coff_link_add_one_symbol
399 (info
, abfd
, name
, flags
, section
, value
,
400 (const char *) NULL
, copy
, FALSE
,
401 (struct bfd_link_hash_entry
**) sym_hash
)))
405 if (obj_pe (abfd
) && (flags
& BSF_SECTION_SYM
) != 0)
406 (*sym_hash
)->coff_link_hash_flags
|=
407 COFF_LINK_HASH_PE_SECTION_SYMBOL
;
409 /* Limit the alignment of a common symbol to the possible
410 alignment of a section. There is no point to permitting
411 a higher alignment for a common symbol: we can not
412 guarantee it, and it may cause us to allocate extra space
413 in the common section. */
414 if (section
== bfd_com_section_ptr
415 && (*sym_hash
)->root
.type
== bfd_link_hash_common
416 && ((*sym_hash
)->root
.u
.c
.p
->alignment_power
417 > bfd_coff_default_section_alignment_power (abfd
)))
418 (*sym_hash
)->root
.u
.c
.p
->alignment_power
419 = bfd_coff_default_section_alignment_power (abfd
);
421 if (bfd_get_flavour (info
->output_bfd
) == bfd_get_flavour (abfd
))
423 /* If we don't have any symbol information currently in
424 the hash table, or if we are looking at a symbol
425 definition, then update the symbol class and type in
427 if (((*sym_hash
)->symbol_class
== C_NULL
428 && (*sym_hash
)->type
== T_NULL
)
431 && (*sym_hash
)->root
.type
!= bfd_link_hash_defined
432 && (*sym_hash
)->root
.type
!= bfd_link_hash_defweak
))
434 (*sym_hash
)->symbol_class
= sym
.n_sclass
;
435 if (sym
.n_type
!= T_NULL
)
437 /* We want to warn if the type changed, but not
438 if it changed from an unspecified type.
439 Testing the whole type byte may work, but the
440 change from (e.g.) a function of unspecified
441 type to function of known type also wants to
443 if ((*sym_hash
)->type
!= T_NULL
444 && (*sym_hash
)->type
!= sym
.n_type
445 && !(DTYPE ((*sym_hash
)->type
) == DTYPE (sym
.n_type
)
446 && (BTYPE ((*sym_hash
)->type
) == T_NULL
447 || BTYPE (sym
.n_type
) == T_NULL
)))
449 /* xgettext: c-format */
450 (_("Warning: type of symbol `%s' changed"
451 " from %d to %d in %B"),
452 name
, (*sym_hash
)->type
, sym
.n_type
, abfd
);
454 /* We don't want to change from a meaningful
455 base type to a null one, but if we know
456 nothing, take what little we might now know. */
457 if (BTYPE (sym
.n_type
) != T_NULL
458 || (*sym_hash
)->type
== T_NULL
)
459 (*sym_hash
)->type
= sym
.n_type
;
461 (*sym_hash
)->auxbfd
= abfd
;
462 if (sym
.n_numaux
!= 0)
464 union internal_auxent
*alloc
;
467 union internal_auxent
*iaux
;
469 (*sym_hash
)->numaux
= sym
.n_numaux
;
470 alloc
= ((union internal_auxent
*)
471 bfd_hash_allocate (&info
->hash
->table
,
473 * sizeof (*alloc
))));
476 for (i
= 0, eaux
= esym
+ symesz
, iaux
= alloc
;
478 i
++, eaux
+= symesz
, iaux
++)
479 bfd_coff_swap_aux_in (abfd
, eaux
, sym
.n_type
,
480 sym
.n_sclass
, (int) i
,
482 (*sym_hash
)->aux
= alloc
;
487 if (classification
== COFF_SYMBOL_PE_SECTION
488 && (*sym_hash
)->numaux
!= 0)
490 /* Some PE sections (such as .bss) have a zero size in
491 the section header, but a non-zero size in the AUX
492 record. Correct that here.
494 FIXME: This is not at all the right place to do this.
495 For example, it won't help objdump. This needs to be
496 done when we swap in the section header. */
497 BFD_ASSERT ((*sym_hash
)->numaux
== 1);
498 if (section
->size
== 0)
499 section
->size
= (*sym_hash
)->aux
[0].x_scn
.x_scnlen
;
501 /* FIXME: We could test whether the section sizes
502 matches the size in the aux entry, but apparently
503 that sometimes fails unexpectedly. */
507 esym
+= (sym
.n_numaux
+ 1) * symesz
;
508 sym_hash
+= sym
.n_numaux
+ 1;
511 /* If this is a non-traditional, non-relocatable link, try to
512 optimize the handling of any .stab/.stabstr sections. */
513 if (! bfd_link_relocatable (info
)
514 && ! info
->traditional_format
515 && bfd_get_flavour (info
->output_bfd
) == bfd_get_flavour (abfd
)
516 && (info
->strip
!= strip_all
&& info
->strip
!= strip_debugger
))
520 stabstr
= bfd_get_section_by_name (abfd
, ".stabstr");
524 bfd_size_type string_offset
= 0;
527 for (stab
= abfd
->sections
; stab
; stab
= stab
->next
)
528 if (CONST_STRNEQ (stab
->name
, ".stab")
530 || (stab
->name
[5] == '.' && ISDIGIT (stab
->name
[6]))))
532 struct coff_link_hash_table
*table
;
533 struct coff_section_tdata
*secdata
534 = coff_section_data (abfd
, stab
);
538 amt
= sizeof (struct coff_section_tdata
);
539 stab
->used_by_bfd
= bfd_zalloc (abfd
, amt
);
540 if (stab
->used_by_bfd
== NULL
)
542 secdata
= coff_section_data (abfd
, stab
);
545 table
= coff_hash_table (info
);
547 if (! _bfd_link_section_stabs (abfd
, &table
->stab_info
,
556 obj_coff_keep_syms (abfd
) = keep_syms
;
561 obj_coff_keep_syms (abfd
) = keep_syms
;
565 /* Do the final link step. */
568 _bfd_coff_final_link (bfd
*abfd
,
569 struct bfd_link_info
*info
)
571 bfd_size_type symesz
;
572 struct coff_final_link_info flaginfo
;
573 bfd_boolean debug_merge_allocated
;
574 bfd_boolean long_section_names
;
576 struct bfd_link_order
*p
;
577 bfd_size_type max_sym_count
;
578 bfd_size_type max_lineno_count
;
579 bfd_size_type max_reloc_count
;
580 bfd_size_type max_output_reloc_count
;
581 bfd_size_type max_contents_size
;
582 file_ptr rel_filepos
;
584 file_ptr line_filepos
;
587 bfd_byte
*external_relocs
= NULL
;
588 char strbuf
[STRING_SIZE_SIZE
];
591 symesz
= bfd_coff_symesz (abfd
);
593 flaginfo
.info
= info
;
594 flaginfo
.output_bfd
= abfd
;
595 flaginfo
.strtab
= NULL
;
596 flaginfo
.section_info
= NULL
;
597 flaginfo
.last_file_index
= -1;
598 flaginfo
.last_bf_index
= -1;
599 flaginfo
.internal_syms
= NULL
;
600 flaginfo
.sec_ptrs
= NULL
;
601 flaginfo
.sym_indices
= NULL
;
602 flaginfo
.outsyms
= NULL
;
603 flaginfo
.linenos
= NULL
;
604 flaginfo
.contents
= NULL
;
605 flaginfo
.external_relocs
= NULL
;
606 flaginfo
.internal_relocs
= NULL
;
607 flaginfo
.global_to_static
= FALSE
;
608 debug_merge_allocated
= FALSE
;
610 coff_data (abfd
)->link_info
= info
;
612 flaginfo
.strtab
= _bfd_stringtab_init ();
613 if (flaginfo
.strtab
== NULL
)
616 if (! coff_debug_merge_hash_table_init (&flaginfo
.debug_merge
))
618 debug_merge_allocated
= TRUE
;
620 /* Compute the file positions for all the sections. */
621 if (! abfd
->output_has_begun
)
623 if (! bfd_coff_compute_section_file_positions (abfd
))
627 /* Count the line numbers and relocation entries required for the
628 output file. Set the file positions for the relocs. */
629 rel_filepos
= obj_relocbase (abfd
);
630 relsz
= bfd_coff_relsz (abfd
);
631 max_contents_size
= 0;
632 max_lineno_count
= 0;
635 long_section_names
= FALSE
;
636 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
640 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
642 if (p
->type
== bfd_indirect_link_order
)
646 sec
= p
->u
.indirect
.section
;
648 /* Mark all sections which are to be included in the
649 link. This will normally be every section. We need
650 to do this so that we can identify any sections which
651 the linker has decided to not include. */
652 sec
->linker_mark
= TRUE
;
654 if (info
->strip
== strip_none
655 || info
->strip
== strip_some
)
656 o
->lineno_count
+= sec
->lineno_count
;
658 if (bfd_link_relocatable (info
))
659 o
->reloc_count
+= sec
->reloc_count
;
661 if (sec
->rawsize
> max_contents_size
)
662 max_contents_size
= sec
->rawsize
;
663 if (sec
->size
> max_contents_size
)
664 max_contents_size
= sec
->size
;
665 if (sec
->lineno_count
> max_lineno_count
)
666 max_lineno_count
= sec
->lineno_count
;
667 if (sec
->reloc_count
> max_reloc_count
)
668 max_reloc_count
= sec
->reloc_count
;
670 else if (bfd_link_relocatable (info
)
671 && (p
->type
== bfd_section_reloc_link_order
672 || p
->type
== bfd_symbol_reloc_link_order
))
675 if (o
->reloc_count
== 0)
679 o
->flags
|= SEC_RELOC
;
680 o
->rel_filepos
= rel_filepos
;
681 rel_filepos
+= o
->reloc_count
* relsz
;
682 /* In PE COFF, if there are at least 0xffff relocations an
683 extra relocation will be written out to encode the count. */
684 if (obj_pe (abfd
) && o
->reloc_count
>= 0xffff)
685 rel_filepos
+= relsz
;
688 if (bfd_coff_long_section_names (abfd
)
689 && strlen (o
->name
) > SCNNMLEN
)
691 /* This section has a long name which must go in the string
692 table. This must correspond to the code in
693 coff_write_object_contents which puts the string index
694 into the s_name field of the section header. That is why
695 we pass hash as FALSE. */
696 if (_bfd_stringtab_add (flaginfo
.strtab
, o
->name
, FALSE
, FALSE
)
697 == (bfd_size_type
) -1)
699 long_section_names
= TRUE
;
703 /* If doing a relocatable link, allocate space for the pointers we
705 if (bfd_link_relocatable (info
))
709 /* We use section_count + 1, rather than section_count, because
710 the target_index fields are 1 based. */
711 amt
= abfd
->section_count
+ 1;
712 amt
*= sizeof (struct coff_link_section_info
);
713 flaginfo
.section_info
= (struct coff_link_section_info
*) bfd_malloc (amt
);
714 if (flaginfo
.section_info
== NULL
)
716 for (i
= 0; i
<= abfd
->section_count
; i
++)
718 flaginfo
.section_info
[i
].relocs
= NULL
;
719 flaginfo
.section_info
[i
].rel_hashes
= NULL
;
723 /* We now know the size of the relocs, so we can determine the file
724 positions of the line numbers. */
725 line_filepos
= rel_filepos
;
726 linesz
= bfd_coff_linesz (abfd
);
727 max_output_reloc_count
= 0;
728 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
730 if (o
->lineno_count
== 0)
734 o
->line_filepos
= line_filepos
;
735 line_filepos
+= o
->lineno_count
* linesz
;
738 if (o
->reloc_count
!= 0)
740 /* We don't know the indices of global symbols until we have
741 written out all the local symbols. For each section in
742 the output file, we keep an array of pointers to hash
743 table entries. Each entry in the array corresponds to a
744 reloc. When we find a reloc against a global symbol, we
745 set the corresponding entry in this array so that we can
746 fix up the symbol index after we have written out all the
749 Because of this problem, we also keep the relocs in
750 memory until the end of the link. This wastes memory,
751 but only when doing a relocatable link, which is not the
753 BFD_ASSERT (bfd_link_relocatable (info
));
754 amt
= o
->reloc_count
;
755 amt
*= sizeof (struct internal_reloc
);
756 flaginfo
.section_info
[o
->target_index
].relocs
=
757 (struct internal_reloc
*) bfd_malloc (amt
);
758 amt
= o
->reloc_count
;
759 amt
*= sizeof (struct coff_link_hash_entry
*);
760 flaginfo
.section_info
[o
->target_index
].rel_hashes
=
761 (struct coff_link_hash_entry
**) bfd_malloc (amt
);
762 if (flaginfo
.section_info
[o
->target_index
].relocs
== NULL
763 || flaginfo
.section_info
[o
->target_index
].rel_hashes
== NULL
)
766 if (o
->reloc_count
> max_output_reloc_count
)
767 max_output_reloc_count
= o
->reloc_count
;
770 /* Reset the reloc and lineno counts, so that we can use them to
771 count the number of entries we have output so far. */
776 obj_sym_filepos (abfd
) = line_filepos
;
778 /* Figure out the largest number of symbols in an input BFD. Take
779 the opportunity to clear the output_has_begun fields of all the
782 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link
.next
)
786 sub
->output_has_begun
= FALSE
;
787 sz
= bfd_family_coff (sub
) ? obj_raw_syment_count (sub
) : 2;
788 if (sz
> max_sym_count
)
792 /* Allocate some buffers used while linking. */
793 amt
= max_sym_count
* sizeof (struct internal_syment
);
794 flaginfo
.internal_syms
= (struct internal_syment
*) bfd_malloc (amt
);
795 amt
= max_sym_count
* sizeof (asection
*);
796 flaginfo
.sec_ptrs
= (asection
**) bfd_malloc (amt
);
797 amt
= max_sym_count
* sizeof (long);
798 flaginfo
.sym_indices
= (long int *) bfd_malloc (amt
);
799 flaginfo
.outsyms
= (bfd_byte
*) bfd_malloc ((max_sym_count
+ 1) * symesz
);
800 amt
= max_lineno_count
* bfd_coff_linesz (abfd
);
801 flaginfo
.linenos
= (bfd_byte
*) bfd_malloc (amt
);
802 flaginfo
.contents
= (bfd_byte
*) bfd_malloc (max_contents_size
);
803 amt
= max_reloc_count
* relsz
;
804 flaginfo
.external_relocs
= (bfd_byte
*) bfd_malloc (amt
);
805 if (! bfd_link_relocatable (info
))
807 amt
= max_reloc_count
* sizeof (struct internal_reloc
);
808 flaginfo
.internal_relocs
= (struct internal_reloc
*) bfd_malloc (amt
);
810 if ((flaginfo
.internal_syms
== NULL
&& max_sym_count
> 0)
811 || (flaginfo
.sec_ptrs
== NULL
&& max_sym_count
> 0)
812 || (flaginfo
.sym_indices
== NULL
&& max_sym_count
> 0)
813 || flaginfo
.outsyms
== NULL
814 || (flaginfo
.linenos
== NULL
&& max_lineno_count
> 0)
815 || (flaginfo
.contents
== NULL
&& max_contents_size
> 0)
816 || (flaginfo
.external_relocs
== NULL
&& max_reloc_count
> 0)
817 || (! bfd_link_relocatable (info
)
818 && flaginfo
.internal_relocs
== NULL
819 && max_reloc_count
> 0))
822 /* We now know the position of everything in the file, except that
823 we don't know the size of the symbol table and therefore we don't
824 know where the string table starts. We just build the string
825 table in memory as we go along. We process all the relocations
826 for a single input file at once. */
827 obj_raw_syment_count (abfd
) = 0;
829 if (coff_backend_info (abfd
)->_bfd_coff_start_final_link
)
831 if (! bfd_coff_start_final_link (abfd
, info
))
835 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
837 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
839 if (p
->type
== bfd_indirect_link_order
840 && bfd_family_coff (p
->u
.indirect
.section
->owner
))
842 sub
= p
->u
.indirect
.section
->owner
;
843 if (! bfd_coff_link_output_has_begun (sub
, & flaginfo
))
845 if (! _bfd_coff_link_input_bfd (&flaginfo
, sub
))
847 sub
->output_has_begun
= TRUE
;
850 else if (p
->type
== bfd_section_reloc_link_order
851 || p
->type
== bfd_symbol_reloc_link_order
)
853 if (! _bfd_coff_reloc_link_order (abfd
, &flaginfo
, o
, p
))
858 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
864 if (flaginfo
.info
->strip
!= strip_all
&& flaginfo
.info
->discard
!= discard_all
)
866 /* Add local symbols from foreign inputs. */
867 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link
.next
)
871 if (bfd_family_coff (sub
) || ! bfd_get_outsymbols (sub
))
873 for (i
= 0; i
< bfd_get_symcount (sub
); ++i
)
875 asymbol
*sym
= bfd_get_outsymbols (sub
) [i
];
877 struct internal_syment isym
;
878 union internal_auxent iaux
;
879 bfd_size_type string_size
= 0, indx
;
881 bfd_boolean rewrite
= FALSE
, hash
;
883 if (! (sym
->flags
& BSF_LOCAL
)
884 || (sym
->flags
& (BSF_SECTION_SYM
| BSF_DEBUGGING_RELOC
885 | BSF_THREAD_LOCAL
| BSF_RELC
| BSF_SRELC
887 || ((sym
->flags
& BSF_DEBUGGING
)
888 && ! (sym
->flags
& BSF_FILE
)))
891 /* See if we are discarding symbols with this name. */
892 if ((flaginfo
.info
->strip
== strip_some
893 && (bfd_hash_lookup (flaginfo
.info
->keep_hash
,
894 bfd_asymbol_name(sym
), FALSE
, FALSE
)
896 || (((flaginfo
.info
->discard
== discard_sec_merge
897 && (bfd_get_section (sym
)->flags
& SEC_MERGE
)
898 && ! bfd_link_relocatable (flaginfo
.info
))
899 || flaginfo
.info
->discard
== discard_l
)
900 && bfd_is_local_label_name (sub
, bfd_asymbol_name(sym
))))
903 pos
= obj_sym_filepos (abfd
) + obj_raw_syment_count (abfd
)
905 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0)
907 if (! coff_write_alien_symbol(abfd
, sym
, &isym
, &iaux
, &written
,
908 &string_size
, NULL
, NULL
))
911 hash
= !flaginfo
.info
->traditional_format
;
913 if (string_size
>= 6 && isym
.n_sclass
== C_FILE
914 && ! isym
._n
._n_n
._n_zeroes
&& isym
.n_numaux
)
916 indx
= _bfd_stringtab_add (flaginfo
.strtab
, ".file", hash
,
918 if (indx
== (bfd_size_type
) -1)
920 isym
._n
._n_n
._n_offset
= STRING_SIZE_SIZE
+ indx
;
921 bfd_coff_swap_sym_out (abfd
, &isym
, flaginfo
.outsyms
);
922 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0
923 || bfd_bwrite (flaginfo
.outsyms
, symesz
,
931 indx
= _bfd_stringtab_add (flaginfo
.strtab
,
932 bfd_asymbol_name (sym
), hash
,
934 if (indx
== (bfd_size_type
) -1)
936 if (isym
.n_sclass
!= C_FILE
)
938 isym
._n
._n_n
._n_offset
= STRING_SIZE_SIZE
+ indx
;
939 bfd_coff_swap_sym_out (abfd
, &isym
, flaginfo
.outsyms
);
944 BFD_ASSERT (isym
.n_numaux
== 1);
945 iaux
.x_file
.x_n
.x_offset
= STRING_SIZE_SIZE
+ indx
;
946 bfd_coff_swap_aux_out (abfd
, &iaux
, isym
.n_type
, C_FILE
,
947 0, 1, flaginfo
.outsyms
+ symesz
);
948 if (bfd_seek (abfd
, pos
+ symesz
, SEEK_SET
) != 0
949 || bfd_bwrite (flaginfo
.outsyms
+ symesz
, symesz
,
955 if (isym
.n_sclass
== C_FILE
)
957 if (flaginfo
.last_file_index
!= -1)
959 flaginfo
.last_file
.n_value
= obj_raw_syment_count (abfd
);
960 bfd_coff_swap_sym_out (abfd
, &flaginfo
.last_file
,
962 pos
= obj_sym_filepos (abfd
) + flaginfo
.last_file_index
966 flaginfo
.last_file_index
= obj_raw_syment_count (abfd
);
967 flaginfo
.last_file
= isym
;
971 && (bfd_seek (abfd
, pos
, SEEK_SET
) != 0
972 || bfd_bwrite (flaginfo
.outsyms
, symesz
, abfd
) != symesz
))
975 obj_raw_syment_count (abfd
) += written
;
980 if (! bfd_coff_final_link_postscript (abfd
, & flaginfo
))
983 /* Free up the buffers used by _bfd_coff_link_input_bfd. */
985 coff_debug_merge_hash_table_free (&flaginfo
.debug_merge
);
986 debug_merge_allocated
= FALSE
;
988 if (flaginfo
.internal_syms
!= NULL
)
990 free (flaginfo
.internal_syms
);
991 flaginfo
.internal_syms
= NULL
;
993 if (flaginfo
.sec_ptrs
!= NULL
)
995 free (flaginfo
.sec_ptrs
);
996 flaginfo
.sec_ptrs
= NULL
;
998 if (flaginfo
.sym_indices
!= NULL
)
1000 free (flaginfo
.sym_indices
);
1001 flaginfo
.sym_indices
= NULL
;
1003 if (flaginfo
.linenos
!= NULL
)
1005 free (flaginfo
.linenos
);
1006 flaginfo
.linenos
= NULL
;
1008 if (flaginfo
.contents
!= NULL
)
1010 free (flaginfo
.contents
);
1011 flaginfo
.contents
= NULL
;
1013 if (flaginfo
.external_relocs
!= NULL
)
1015 free (flaginfo
.external_relocs
);
1016 flaginfo
.external_relocs
= NULL
;
1018 if (flaginfo
.internal_relocs
!= NULL
)
1020 free (flaginfo
.internal_relocs
);
1021 flaginfo
.internal_relocs
= NULL
;
1024 /* The value of the last C_FILE symbol is supposed to be the symbol
1025 index of the first external symbol. Write it out again if
1027 if (flaginfo
.last_file_index
!= -1
1028 && (unsigned int) flaginfo
.last_file
.n_value
!= obj_raw_syment_count (abfd
))
1032 flaginfo
.last_file
.n_value
= obj_raw_syment_count (abfd
);
1033 bfd_coff_swap_sym_out (abfd
, &flaginfo
.last_file
,
1036 pos
= obj_sym_filepos (abfd
) + flaginfo
.last_file_index
* symesz
;
1037 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0
1038 || bfd_bwrite (flaginfo
.outsyms
, symesz
, abfd
) != symesz
)
1042 /* If doing task linking (ld --task-link) then make a pass through the
1043 global symbols, writing out any that are defined, and making them
1045 if (info
->task_link
)
1047 flaginfo
.failed
= FALSE
;
1048 coff_link_hash_traverse (coff_hash_table (info
),
1049 _bfd_coff_write_task_globals
, &flaginfo
);
1050 if (flaginfo
.failed
)
1054 /* Write out the global symbols. */
1055 flaginfo
.failed
= FALSE
;
1056 bfd_hash_traverse (&info
->hash
->table
, _bfd_coff_write_global_sym
, &flaginfo
);
1057 if (flaginfo
.failed
)
1060 /* The outsyms buffer is used by _bfd_coff_write_global_sym. */
1061 if (flaginfo
.outsyms
!= NULL
)
1063 free (flaginfo
.outsyms
);
1064 flaginfo
.outsyms
= NULL
;
1067 if (bfd_link_relocatable (info
) && max_output_reloc_count
> 0)
1069 /* Now that we have written out all the global symbols, we know
1070 the symbol indices to use for relocs against them, and we can
1071 finally write out the relocs. */
1072 amt
= max_output_reloc_count
* relsz
;
1073 external_relocs
= (bfd_byte
*) bfd_malloc (amt
);
1074 if (external_relocs
== NULL
)
1077 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
1079 struct internal_reloc
*irel
;
1080 struct internal_reloc
*irelend
;
1081 struct coff_link_hash_entry
**rel_hash
;
1084 if (o
->reloc_count
== 0)
1087 irel
= flaginfo
.section_info
[o
->target_index
].relocs
;
1088 irelend
= irel
+ o
->reloc_count
;
1089 rel_hash
= flaginfo
.section_info
[o
->target_index
].rel_hashes
;
1090 erel
= external_relocs
;
1091 for (; irel
< irelend
; irel
++, rel_hash
++, erel
+= relsz
)
1093 if (*rel_hash
!= NULL
)
1095 BFD_ASSERT ((*rel_hash
)->indx
>= 0);
1096 irel
->r_symndx
= (*rel_hash
)->indx
;
1098 bfd_coff_swap_reloc_out (abfd
, irel
, erel
);
1101 if (bfd_seek (abfd
, o
->rel_filepos
, SEEK_SET
) != 0)
1103 if (obj_pe (abfd
) && o
->reloc_count
>= 0xffff)
1105 /* In PE COFF, write the count of relocs as the first
1106 reloc. The header overflow bit will be set
1108 struct internal_reloc incount
;
1109 bfd_byte
*excount
= (bfd_byte
*)bfd_malloc (relsz
);
1111 memset (&incount
, 0, sizeof (incount
));
1112 incount
.r_vaddr
= o
->reloc_count
+ 1;
1113 bfd_coff_swap_reloc_out (abfd
, &incount
, excount
);
1114 if (bfd_bwrite (excount
, relsz
, abfd
) != relsz
)
1115 /* We'll leak, but it's an error anyway. */
1119 if (bfd_bwrite (external_relocs
,
1120 (bfd_size_type
) relsz
* o
->reloc_count
, abfd
)
1121 != (bfd_size_type
) relsz
* o
->reloc_count
)
1125 free (external_relocs
);
1126 external_relocs
= NULL
;
1129 /* Free up the section information. */
1130 if (flaginfo
.section_info
!= NULL
)
1134 for (i
= 0; i
< abfd
->section_count
; i
++)
1136 if (flaginfo
.section_info
[i
].relocs
!= NULL
)
1137 free (flaginfo
.section_info
[i
].relocs
);
1138 if (flaginfo
.section_info
[i
].rel_hashes
!= NULL
)
1139 free (flaginfo
.section_info
[i
].rel_hashes
);
1141 free (flaginfo
.section_info
);
1142 flaginfo
.section_info
= NULL
;
1145 /* If we have optimized stabs strings, output them. */
1146 if (coff_hash_table (info
)->stab_info
.stabstr
!= NULL
)
1148 if (! _bfd_write_stab_strings (abfd
, &coff_hash_table (info
)->stab_info
))
1152 /* Write out the string table. */
1153 if (obj_raw_syment_count (abfd
) != 0 || long_section_names
)
1157 pos
= obj_sym_filepos (abfd
) + obj_raw_syment_count (abfd
) * symesz
;
1158 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0)
1161 #if STRING_SIZE_SIZE == 4
1163 _bfd_stringtab_size (flaginfo
.strtab
) + STRING_SIZE_SIZE
,
1166 #error Change H_PUT_32 above
1169 if (bfd_bwrite (strbuf
, (bfd_size_type
) STRING_SIZE_SIZE
, abfd
)
1170 != STRING_SIZE_SIZE
)
1173 if (! _bfd_stringtab_emit (abfd
, flaginfo
.strtab
))
1176 obj_coff_strings_written (abfd
) = TRUE
;
1179 _bfd_stringtab_free (flaginfo
.strtab
);
1181 /* Setting bfd_get_symcount to 0 will cause write_object_contents to
1182 not try to write out the symbols. */
1183 bfd_get_symcount (abfd
) = 0;
1188 if (debug_merge_allocated
)
1189 coff_debug_merge_hash_table_free (&flaginfo
.debug_merge
);
1190 if (flaginfo
.strtab
!= NULL
)
1191 _bfd_stringtab_free (flaginfo
.strtab
);
1192 if (flaginfo
.section_info
!= NULL
)
1196 for (i
= 0; i
< abfd
->section_count
; i
++)
1198 if (flaginfo
.section_info
[i
].relocs
!= NULL
)
1199 free (flaginfo
.section_info
[i
].relocs
);
1200 if (flaginfo
.section_info
[i
].rel_hashes
!= NULL
)
1201 free (flaginfo
.section_info
[i
].rel_hashes
);
1203 free (flaginfo
.section_info
);
1205 if (flaginfo
.internal_syms
!= NULL
)
1206 free (flaginfo
.internal_syms
);
1207 if (flaginfo
.sec_ptrs
!= NULL
)
1208 free (flaginfo
.sec_ptrs
);
1209 if (flaginfo
.sym_indices
!= NULL
)
1210 free (flaginfo
.sym_indices
);
1211 if (flaginfo
.outsyms
!= NULL
)
1212 free (flaginfo
.outsyms
);
1213 if (flaginfo
.linenos
!= NULL
)
1214 free (flaginfo
.linenos
);
1215 if (flaginfo
.contents
!= NULL
)
1216 free (flaginfo
.contents
);
1217 if (flaginfo
.external_relocs
!= NULL
)
1218 free (flaginfo
.external_relocs
);
1219 if (flaginfo
.internal_relocs
!= NULL
)
1220 free (flaginfo
.internal_relocs
);
1221 if (external_relocs
!= NULL
)
1222 free (external_relocs
);
1226 /* Parse out a -heap <reserved>,<commit> line. */
1229 dores_com (char *ptr
, bfd
*output_bfd
, int heap
)
1231 if (coff_data(output_bfd
)->pe
)
1233 int val
= strtoul (ptr
, &ptr
, 0);
1236 pe_data(output_bfd
)->pe_opthdr
.SizeOfHeapReserve
= val
;
1238 pe_data(output_bfd
)->pe_opthdr
.SizeOfStackReserve
= val
;
1242 val
= strtoul (ptr
+1, &ptr
, 0);
1244 pe_data(output_bfd
)->pe_opthdr
.SizeOfHeapCommit
= val
;
1246 pe_data(output_bfd
)->pe_opthdr
.SizeOfStackCommit
= val
;
1253 get_name (char *ptr
, char **dst
)
1258 while (*ptr
&& *ptr
!= ' ')
1264 /* Process any magic embedded commands in a section called .drectve. */
1267 process_embedded_commands (bfd
*output_bfd
,
1268 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
1271 asection
*sec
= bfd_get_section_by_name (abfd
, ".drectve");
1279 if (!bfd_malloc_and_get_section (abfd
, sec
, ©
))
1285 e
= (char *) copy
+ sec
->size
;
1287 for (s
= (char *) copy
; s
< e
; )
1294 if (CONST_STRNEQ (s
, "-attr"))
1304 s
= get_name (s
, &name
);
1305 s
= get_name (s
, &attribs
);
1325 asec
= bfd_get_section_by_name (abfd
, name
);
1329 asec
->flags
|= SEC_CODE
;
1331 asec
->flags
|= SEC_READONLY
;
1334 else if (CONST_STRNEQ (s
, "-heap"))
1335 s
= dores_com (s
+ 5, output_bfd
, 1);
1337 else if (CONST_STRNEQ (s
, "-stack"))
1338 s
= dores_com (s
+ 6, output_bfd
, 0);
1340 /* GNU extension for aligned commons. */
1341 else if (CONST_STRNEQ (s
, "-aligncomm:"))
1343 /* Common symbols must be aligned on reading, as it
1344 is too late to do anything here, after they have
1345 already been allocated, so just skip the directive. */
1356 /* Place a marker against all symbols which are used by relocations.
1357 This marker can be picked up by the 'do we skip this symbol ?'
1358 loop in _bfd_coff_link_input_bfd() and used to prevent skipping
1362 mark_relocs (struct coff_final_link_info
*flaginfo
, bfd
*input_bfd
)
1366 if ((bfd_get_file_flags (input_bfd
) & HAS_SYMS
) == 0)
1369 for (a
= input_bfd
->sections
; a
!= (asection
*) NULL
; a
= a
->next
)
1371 struct internal_reloc
* internal_relocs
;
1372 struct internal_reloc
* irel
;
1373 struct internal_reloc
* irelend
;
1375 if ((a
->flags
& SEC_RELOC
) == 0 || a
->reloc_count
< 1
1376 || a
->linker_mark
== 0)
1378 /* Don't mark relocs in excluded sections. */
1379 if (a
->output_section
== bfd_abs_section_ptr
)
1382 /* Read in the relocs. */
1383 internal_relocs
= _bfd_coff_read_internal_relocs
1384 (input_bfd
, a
, FALSE
,
1385 flaginfo
->external_relocs
,
1386 bfd_link_relocatable (flaginfo
->info
),
1387 (bfd_link_relocatable (flaginfo
->info
)
1388 ? (flaginfo
->section_info
[ a
->output_section
->target_index
].relocs
+ a
->output_section
->reloc_count
)
1389 : flaginfo
->internal_relocs
)
1392 if (internal_relocs
== NULL
)
1395 irel
= internal_relocs
;
1396 irelend
= irel
+ a
->reloc_count
;
1398 /* Place a mark in the sym_indices array (whose entries have
1399 been initialised to 0) for all of the symbols that are used
1400 in the relocation table. This will then be picked up in the
1401 skip/don't-skip pass. */
1402 for (; irel
< irelend
; irel
++)
1403 if ((unsigned long) irel
->r_symndx
< obj_raw_syment_count (input_bfd
))
1404 flaginfo
->sym_indices
[irel
->r_symndx
] = -1;
1408 /* Link an input file into the linker output file. This function
1409 handles all the sections and relocations of the input file at once. */
1412 _bfd_coff_link_input_bfd (struct coff_final_link_info
*flaginfo
, bfd
*input_bfd
)
1414 unsigned int n_tmask
= coff_data (input_bfd
)->local_n_tmask
;
1415 unsigned int n_btshft
= coff_data (input_bfd
)->local_n_btshft
;
1416 bfd_boolean (*adjust_symndx
)
1417 (bfd
*, struct bfd_link_info
*, bfd
*, asection
*,
1418 struct internal_reloc
*, bfd_boolean
*);
1420 const char *strings
;
1421 bfd_size_type syment_base
;
1422 bfd_boolean copy
, hash
;
1423 bfd_size_type isymesz
;
1424 bfd_size_type osymesz
;
1425 bfd_size_type linesz
;
1428 struct internal_syment
*isymp
;
1431 unsigned long output_index
;
1433 struct coff_link_hash_entry
**sym_hash
;
1436 /* Move all the symbols to the output file. */
1438 output_bfd
= flaginfo
->output_bfd
;
1440 syment_base
= obj_raw_syment_count (output_bfd
);
1441 isymesz
= bfd_coff_symesz (input_bfd
);
1442 osymesz
= bfd_coff_symesz (output_bfd
);
1443 linesz
= bfd_coff_linesz (input_bfd
);
1444 BFD_ASSERT (linesz
== bfd_coff_linesz (output_bfd
));
1447 if (! flaginfo
->info
->keep_memory
)
1450 if (flaginfo
->info
->traditional_format
)
1453 if (! _bfd_coff_get_external_symbols (input_bfd
))
1456 esym
= (bfd_byte
*) obj_coff_external_syms (input_bfd
);
1457 esym_end
= esym
+ obj_raw_syment_count (input_bfd
) * isymesz
;
1458 isymp
= flaginfo
->internal_syms
;
1459 secpp
= flaginfo
->sec_ptrs
;
1460 indexp
= flaginfo
->sym_indices
;
1461 output_index
= syment_base
;
1462 outsym
= flaginfo
->outsyms
;
1464 if (coff_data (output_bfd
)->pe
1465 && ! process_embedded_commands (output_bfd
, flaginfo
->info
, input_bfd
))
1468 /* If we are going to perform relocations and also strip/discard some
1469 symbols then we must make sure that we do not strip/discard those
1470 symbols that are going to be involved in the relocations. */
1471 if (( flaginfo
->info
->strip
!= strip_none
1472 || flaginfo
->info
->discard
!= discard_none
)
1473 && bfd_link_relocatable (flaginfo
->info
))
1475 /* Mark the symbol array as 'not-used'. */
1476 memset (indexp
, 0, obj_raw_syment_count (input_bfd
) * sizeof * indexp
);
1478 mark_relocs (flaginfo
, input_bfd
);
1481 while (esym
< esym_end
)
1483 struct internal_syment isym
;
1484 enum coff_symbol_classification classification
;
1487 bfd_boolean dont_skip_symbol
;
1490 bfd_coff_swap_sym_in (input_bfd
, esym
, isymp
);
1492 /* Make a copy of *isymp so that the relocate_section function
1493 always sees the original values. This is more reliable than
1494 always recomputing the symbol value even if we are stripping
1498 classification
= bfd_coff_classify_symbol (input_bfd
, &isym
);
1499 switch (classification
)
1503 case COFF_SYMBOL_GLOBAL
:
1504 case COFF_SYMBOL_PE_SECTION
:
1505 case COFF_SYMBOL_LOCAL
:
1506 *secpp
= coff_section_from_bfd_index (input_bfd
, isym
.n_scnum
);
1508 case COFF_SYMBOL_COMMON
:
1509 *secpp
= bfd_com_section_ptr
;
1511 case COFF_SYMBOL_UNDEFINED
:
1512 *secpp
= bfd_und_section_ptr
;
1516 /* Extract the flag indicating if this symbol is used by a
1518 if ((flaginfo
->info
->strip
!= strip_none
1519 || flaginfo
->info
->discard
!= discard_none
)
1520 && bfd_link_relocatable (flaginfo
->info
))
1521 dont_skip_symbol
= *indexp
;
1523 dont_skip_symbol
= FALSE
;
1529 add
= 1 + isym
.n_numaux
;
1531 /* If we are stripping all symbols, we want to skip this one. */
1532 if (flaginfo
->info
->strip
== strip_all
&& ! dont_skip_symbol
)
1537 switch (classification
)
1541 case COFF_SYMBOL_GLOBAL
:
1542 case COFF_SYMBOL_COMMON
:
1543 case COFF_SYMBOL_PE_SECTION
:
1544 /* This is a global symbol. Global symbols come at the
1545 end of the symbol table, so skip them for now.
1546 Locally defined function symbols, however, are an
1547 exception, and are not moved to the end. */
1549 if (! ISFCN (isym
.n_type
))
1553 case COFF_SYMBOL_UNDEFINED
:
1554 /* Undefined symbols are left for the end. */
1559 case COFF_SYMBOL_LOCAL
:
1560 /* This is a local symbol. Skip it if we are discarding
1562 if (flaginfo
->info
->discard
== discard_all
&& ! dont_skip_symbol
)
1568 #ifndef COFF_WITH_PE
1569 /* Skip section symbols for sections which are not going to be
1572 && !dont_skip_symbol
1573 && isym
.n_sclass
== C_STAT
1574 && isym
.n_type
== T_NULL
1575 && isym
.n_numaux
> 0
1576 && ((*secpp
)->output_section
== bfd_abs_section_ptr
1577 || bfd_section_removed_from_list (output_bfd
,
1578 (*secpp
)->output_section
)))
1582 /* If we stripping debugging symbols, and this is a debugging
1583 symbol, then skip it. FIXME: gas sets the section to N_ABS
1584 for some types of debugging symbols; I don't know if this is
1585 a bug or not. In any case, we handle it here. */
1587 && flaginfo
->info
->strip
== strip_debugger
1588 && ! dont_skip_symbol
1589 && (isym
.n_scnum
== N_DEBUG
1590 || (isym
.n_scnum
== N_ABS
1591 && (isym
.n_sclass
== C_AUTO
1592 || isym
.n_sclass
== C_REG
1593 || isym
.n_sclass
== C_MOS
1594 || isym
.n_sclass
== C_MOE
1595 || isym
.n_sclass
== C_MOU
1596 || isym
.n_sclass
== C_ARG
1597 || isym
.n_sclass
== C_REGPARM
1598 || isym
.n_sclass
== C_FIELD
1599 || isym
.n_sclass
== C_EOS
))))
1602 /* If some symbols are stripped based on the name, work out the
1603 name and decide whether to skip this symbol. */
1605 && (flaginfo
->info
->strip
== strip_some
1606 || flaginfo
->info
->discard
== discard_l
))
1609 char buf
[SYMNMLEN
+ 1];
1611 name
= _bfd_coff_internal_syment_name (input_bfd
, &isym
, buf
);
1615 if (! dont_skip_symbol
1616 && ((flaginfo
->info
->strip
== strip_some
1617 && (bfd_hash_lookup (flaginfo
->info
->keep_hash
, name
, FALSE
,
1620 && flaginfo
->info
->discard
== discard_l
1621 && bfd_is_local_label_name (input_bfd
, name
))))
1625 /* If this is an enum, struct, or union tag, see if we have
1626 already output an identical type. */
1628 && !flaginfo
->info
->traditional_format
1629 && (isym
.n_sclass
== C_ENTAG
1630 || isym
.n_sclass
== C_STRTAG
1631 || isym
.n_sclass
== C_UNTAG
)
1632 && isym
.n_numaux
== 1)
1635 char buf
[SYMNMLEN
+ 1];
1636 struct coff_debug_merge_hash_entry
*mh
;
1637 struct coff_debug_merge_type
*mt
;
1638 union internal_auxent aux
;
1639 struct coff_debug_merge_element
**epp
;
1640 bfd_byte
*esl
, *eslend
;
1641 struct internal_syment
*islp
;
1644 name
= _bfd_coff_internal_syment_name (input_bfd
, &isym
, buf
);
1648 /* Ignore fake names invented by compiler; treat them all as
1650 if (*name
== '~' || *name
== '.' || *name
== '$'
1651 || (*name
== bfd_get_symbol_leading_char (input_bfd
)
1652 && (name
[1] == '~' || name
[1] == '.' || name
[1] == '$')))
1655 mh
= coff_debug_merge_hash_lookup (&flaginfo
->debug_merge
, name
,
1660 /* Allocate memory to hold type information. If this turns
1661 out to be a duplicate, we pass this address to
1663 amt
= sizeof (struct coff_debug_merge_type
);
1664 mt
= (struct coff_debug_merge_type
*) bfd_alloc (input_bfd
, amt
);
1667 mt
->type_class
= isym
.n_sclass
;
1669 /* Pick up the aux entry, which points to the end of the tag
1671 bfd_coff_swap_aux_in (input_bfd
, (esym
+ isymesz
),
1672 isym
.n_type
, isym
.n_sclass
, 0, isym
.n_numaux
,
1675 /* Gather the elements. */
1676 epp
= &mt
->elements
;
1677 mt
->elements
= NULL
;
1679 esl
= esym
+ 2 * isymesz
;
1680 eslend
= ((bfd_byte
*) obj_coff_external_syms (input_bfd
)
1681 + aux
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
* isymesz
);
1682 while (esl
< eslend
)
1684 const char *elename
;
1685 char elebuf
[SYMNMLEN
+ 1];
1688 bfd_coff_swap_sym_in (input_bfd
, esl
, islp
);
1690 amt
= sizeof (struct coff_debug_merge_element
);
1691 *epp
= (struct coff_debug_merge_element
*)
1692 bfd_alloc (input_bfd
, amt
);
1696 elename
= _bfd_coff_internal_syment_name (input_bfd
, islp
,
1698 if (elename
== NULL
)
1701 amt
= strlen (elename
) + 1;
1702 name_copy
= (char *) bfd_alloc (input_bfd
, amt
);
1703 if (name_copy
== NULL
)
1705 strcpy (name_copy
, elename
);
1707 (*epp
)->name
= name_copy
;
1708 (*epp
)->type
= islp
->n_type
;
1710 if (islp
->n_numaux
>= 1
1711 && islp
->n_type
!= T_NULL
1712 && islp
->n_sclass
!= C_EOS
)
1714 union internal_auxent eleaux
;
1717 bfd_coff_swap_aux_in (input_bfd
, (esl
+ isymesz
),
1718 islp
->n_type
, islp
->n_sclass
, 0,
1719 islp
->n_numaux
, &eleaux
);
1720 indx
= eleaux
.x_sym
.x_tagndx
.l
;
1722 /* FIXME: If this tagndx entry refers to a symbol
1723 defined later in this file, we just ignore it.
1724 Handling this correctly would be tedious, and may
1729 (bfd_byte
*) obj_coff_external_syms (input_bfd
))
1732 (*epp
)->tagndx
= flaginfo
->sym_indices
[indx
];
1733 if ((*epp
)->tagndx
< 0)
1737 epp
= &(*epp
)->next
;
1740 esl
+= (islp
->n_numaux
+ 1) * isymesz
;
1741 islp
+= islp
->n_numaux
+ 1;
1744 /* See if we already have a definition which matches this
1745 type. We always output the type if it has no elements,
1747 if (mt
->elements
== NULL
)
1748 bfd_release (input_bfd
, mt
);
1751 struct coff_debug_merge_type
*mtl
;
1753 for (mtl
= mh
->types
; mtl
!= NULL
; mtl
= mtl
->next
)
1755 struct coff_debug_merge_element
*me
, *mel
;
1757 if (mtl
->type_class
!= mt
->type_class
)
1760 for (me
= mt
->elements
, mel
= mtl
->elements
;
1761 me
!= NULL
&& mel
!= NULL
;
1762 me
= me
->next
, mel
= mel
->next
)
1764 if (strcmp (me
->name
, mel
->name
) != 0
1765 || me
->type
!= mel
->type
1766 || me
->tagndx
!= mel
->tagndx
)
1770 if (me
== NULL
&& mel
== NULL
)
1774 if (mtl
== NULL
|| (bfd_size_type
) mtl
->indx
>= syment_base
)
1776 /* This is the first definition of this type. */
1777 mt
->indx
= output_index
;
1778 mt
->next
= mh
->types
;
1783 /* This is a redefinition which can be merged. */
1784 bfd_release (input_bfd
, mt
);
1785 *indexp
= mtl
->indx
;
1786 add
= (eslend
- esym
) / isymesz
;
1792 /* We now know whether we are to skip this symbol or not. */
1795 /* Adjust the symbol in order to output it. */
1797 if (isym
._n
._n_n
._n_zeroes
== 0
1798 && isym
._n
._n_n
._n_offset
!= 0)
1803 /* This symbol has a long name. Enter it in the string
1804 table we are building. Note that we do not check
1805 bfd_coff_symname_in_debug. That is only true for
1806 XCOFF, and XCOFF requires different linking code
1808 name
= _bfd_coff_internal_syment_name (input_bfd
, &isym
, NULL
);
1811 indx
= _bfd_stringtab_add (flaginfo
->strtab
, name
, hash
, copy
);
1812 if (indx
== (bfd_size_type
) -1)
1814 isym
._n
._n_n
._n_offset
= STRING_SIZE_SIZE
+ indx
;
1817 switch (isym
.n_sclass
)
1833 /* The symbol value should not be modified. */
1837 if (obj_pe (input_bfd
)
1838 && strcmp (isym
.n_name
, ".bf") != 0
1839 && isym
.n_scnum
> 0)
1841 /* For PE, .lf and .ef get their value left alone,
1842 while .bf gets relocated. However, they all have
1843 "real" section numbers, and need to be moved into
1845 isym
.n_scnum
= (*secpp
)->output_section
->target_index
;
1850 case C_LABEL
: /* Not completely sure about these 2 */
1859 /* Compute new symbol location. */
1860 if (isym
.n_scnum
> 0)
1862 isym
.n_scnum
= (*secpp
)->output_section
->target_index
;
1863 isym
.n_value
+= (*secpp
)->output_offset
;
1864 if (! obj_pe (input_bfd
))
1865 isym
.n_value
-= (*secpp
)->vma
;
1866 if (! obj_pe (flaginfo
->output_bfd
))
1867 isym
.n_value
+= (*secpp
)->output_section
->vma
;
1872 /* The value of a C_FILE symbol is the symbol index of
1873 the next C_FILE symbol. The value of the last C_FILE
1874 symbol is the symbol index to the first external
1875 symbol (actually, coff_renumber_symbols does not get
1876 this right--it just sets the value of the last C_FILE
1877 symbol to zero--and nobody has ever complained about
1878 it). We try to get this right, below, just before we
1879 write the symbols out, but in the general case we may
1880 have to write the symbol out twice. */
1881 if (flaginfo
->last_file_index
!= -1
1882 && flaginfo
->last_file
.n_value
!= (bfd_vma
) output_index
)
1884 /* We must correct the value of the last C_FILE
1886 flaginfo
->last_file
.n_value
= output_index
;
1887 if ((bfd_size_type
) flaginfo
->last_file_index
>= syment_base
)
1889 /* The last C_FILE symbol is in this input file. */
1890 bfd_coff_swap_sym_out (output_bfd
,
1891 &flaginfo
->last_file
,
1893 + ((flaginfo
->last_file_index
1901 /* We have already written out the last C_FILE
1902 symbol. We need to write it out again. We
1903 borrow *outsym temporarily. */
1904 bfd_coff_swap_sym_out (output_bfd
,
1905 &flaginfo
->last_file
, outsym
);
1906 pos
= obj_sym_filepos (output_bfd
);
1907 pos
+= flaginfo
->last_file_index
* osymesz
;
1908 if (bfd_seek (output_bfd
, pos
, SEEK_SET
) != 0
1909 || bfd_bwrite (outsym
, osymesz
, output_bfd
) != osymesz
)
1914 flaginfo
->last_file_index
= output_index
;
1915 flaginfo
->last_file
= isym
;
1919 /* If doing task linking, convert normal global function symbols to
1920 static functions. */
1921 if (flaginfo
->info
->task_link
&& IS_EXTERNAL (input_bfd
, isym
))
1922 isym
.n_sclass
= C_STAT
;
1924 /* Output the symbol. */
1925 bfd_coff_swap_sym_out (output_bfd
, &isym
, outsym
);
1927 *indexp
= output_index
;
1932 struct coff_link_hash_entry
*h
;
1934 indx
= ((esym
- (bfd_byte
*) obj_coff_external_syms (input_bfd
))
1936 h
= obj_coff_sym_hashes (input_bfd
)[indx
];
1939 /* This can happen if there were errors earlier in
1941 bfd_set_error (bfd_error_bad_value
);
1944 h
->indx
= output_index
;
1947 output_index
+= add
;
1948 outsym
+= add
* osymesz
;
1951 esym
+= add
* isymesz
;
1955 for (--add
; add
> 0; --add
)
1962 /* Fix up the aux entries. This must be done in a separate pass,
1963 because we don't know the correct symbol indices until we have
1964 already decided which symbols we are going to keep. */
1965 esym
= (bfd_byte
*) obj_coff_external_syms (input_bfd
);
1966 esym_end
= esym
+ obj_raw_syment_count (input_bfd
) * isymesz
;
1967 isymp
= flaginfo
->internal_syms
;
1968 indexp
= flaginfo
->sym_indices
;
1969 sym_hash
= obj_coff_sym_hashes (input_bfd
);
1970 outsym
= flaginfo
->outsyms
;
1972 while (esym
< esym_end
)
1976 add
= 1 + isymp
->n_numaux
;
1979 || (bfd_size_type
) *indexp
< syment_base
)
1980 && (*sym_hash
== NULL
1981 || (*sym_hash
)->auxbfd
!= input_bfd
))
1982 esym
+= add
* isymesz
;
1985 struct coff_link_hash_entry
*h
;
1993 /* The m68k-motorola-sysv assembler will sometimes
1994 generate two symbols with the same name, but only one
1995 will have aux entries. */
1996 BFD_ASSERT (isymp
->n_numaux
== 0
1998 || h
->numaux
== isymp
->n_numaux
);
2006 /* Handle the aux entries. This handling is based on
2007 coff_pointerize_aux. I don't know if it always correct. */
2008 for (i
= 0; i
< isymp
->n_numaux
&& esym
< esym_end
; i
++)
2010 union internal_auxent aux
;
2011 union internal_auxent
*auxp
;
2013 if (h
!= NULL
&& h
->aux
!= NULL
&& (h
->numaux
> i
))
2017 bfd_coff_swap_aux_in (input_bfd
, esym
, isymp
->n_type
,
2018 isymp
->n_sclass
, i
, isymp
->n_numaux
, &aux
);
2022 if (isymp
->n_sclass
== C_FILE
)
2024 /* If this is a long filename, we must put it in the
2026 if (auxp
->x_file
.x_n
.x_zeroes
== 0
2027 && auxp
->x_file
.x_n
.x_offset
!= 0)
2029 const char *filename
;
2032 BFD_ASSERT (auxp
->x_file
.x_n
.x_offset
2033 >= STRING_SIZE_SIZE
);
2034 if (strings
== NULL
)
2036 strings
= _bfd_coff_read_string_table (input_bfd
);
2037 if (strings
== NULL
)
2040 if ((bfd_size_type
) auxp
->x_file
.x_n
.x_offset
>= obj_coff_strings_len (input_bfd
))
2041 filename
= _("<corrupt>");
2043 filename
= strings
+ auxp
->x_file
.x_n
.x_offset
;
2044 indx
= _bfd_stringtab_add (flaginfo
->strtab
, filename
,
2046 if (indx
== (bfd_size_type
) -1)
2048 auxp
->x_file
.x_n
.x_offset
= STRING_SIZE_SIZE
+ indx
;
2051 else if ((isymp
->n_sclass
!= C_STAT
|| isymp
->n_type
!= T_NULL
)
2052 && isymp
->n_sclass
!= C_NT_WEAK
)
2056 if (ISFCN (isymp
->n_type
)
2057 || ISTAG (isymp
->n_sclass
)
2058 || isymp
->n_sclass
== C_BLOCK
2059 || isymp
->n_sclass
== C_FCN
)
2061 indx
= auxp
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
;
2063 && indx
< obj_raw_syment_count (input_bfd
))
2065 /* We look forward through the symbol for
2066 the index of the next symbol we are going
2067 to include. I don't know if this is
2069 while ((flaginfo
->sym_indices
[indx
] < 0
2070 || ((bfd_size_type
) flaginfo
->sym_indices
[indx
]
2072 && indx
< obj_raw_syment_count (input_bfd
))
2074 if (indx
>= obj_raw_syment_count (input_bfd
))
2075 indx
= output_index
;
2077 indx
= flaginfo
->sym_indices
[indx
];
2078 auxp
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
= indx
;
2082 indx
= auxp
->x_sym
.x_tagndx
.l
;
2083 if (indx
> 0 && indx
< obj_raw_syment_count (input_bfd
))
2087 symindx
= flaginfo
->sym_indices
[indx
];
2089 auxp
->x_sym
.x_tagndx
.l
= 0;
2091 auxp
->x_sym
.x_tagndx
.l
= symindx
;
2094 /* The .bf symbols are supposed to be linked through
2095 the endndx field. We need to carry this list
2096 across object files. */
2099 && isymp
->n_sclass
== C_FCN
2100 && (isymp
->_n
._n_n
._n_zeroes
!= 0
2101 || isymp
->_n
._n_n
._n_offset
== 0)
2102 && isymp
->_n
._n_name
[0] == '.'
2103 && isymp
->_n
._n_name
[1] == 'b'
2104 && isymp
->_n
._n_name
[2] == 'f'
2105 && isymp
->_n
._n_name
[3] == '\0')
2107 if (flaginfo
->last_bf_index
!= -1)
2109 flaginfo
->last_bf
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
=
2112 if ((bfd_size_type
) flaginfo
->last_bf_index
2117 /* The last .bf symbol is in this input
2118 file. This will only happen if the
2119 assembler did not set up the .bf
2120 endndx symbols correctly. */
2121 auxout
= (flaginfo
->outsyms
2122 + ((flaginfo
->last_bf_index
2126 bfd_coff_swap_aux_out (output_bfd
,
2137 /* We have already written out the last
2138 .bf aux entry. We need to write it
2139 out again. We borrow *outsym
2140 temporarily. FIXME: This case should
2142 bfd_coff_swap_aux_out (output_bfd
,
2148 pos
= obj_sym_filepos (output_bfd
);
2149 pos
+= flaginfo
->last_bf_index
* osymesz
;
2150 if (bfd_seek (output_bfd
, pos
, SEEK_SET
) != 0
2151 || (bfd_bwrite (outsym
, osymesz
, output_bfd
)
2157 if (auxp
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
!= 0)
2158 flaginfo
->last_bf_index
= -1;
2161 /* The endndx field of this aux entry must
2162 be updated with the symbol number of the
2164 flaginfo
->last_bf
= *auxp
;
2165 flaginfo
->last_bf_index
= (((outsym
- flaginfo
->outsyms
)
2174 bfd_coff_swap_aux_out (output_bfd
, auxp
, isymp
->n_type
,
2175 isymp
->n_sclass
, i
, isymp
->n_numaux
,
2189 /* Relocate the line numbers, unless we are stripping them. */
2190 if (flaginfo
->info
->strip
== strip_none
2191 || flaginfo
->info
->strip
== strip_some
)
2193 for (o
= input_bfd
->sections
; o
!= NULL
; o
= o
->next
)
2199 bfd_boolean skipping
;
2203 /* FIXME: If SEC_HAS_CONTENTS is not for the section, then
2204 build_link_order in ldwrite.c will not have created a
2205 link order, which means that we will not have seen this
2206 input section in _bfd_coff_final_link, which means that
2207 we will not have allocated space for the line numbers of
2208 this section. I don't think line numbers can be
2209 meaningful for a section which does not have
2210 SEC_HAS_CONTENTS set, but, if they do, this must be
2212 if (o
->lineno_count
== 0
2213 || (o
->output_section
->flags
& SEC_HAS_CONTENTS
) == 0)
2216 if (bfd_seek (input_bfd
, o
->line_filepos
, SEEK_SET
) != 0
2217 || bfd_bread (flaginfo
->linenos
, linesz
* o
->lineno_count
,
2218 input_bfd
) != linesz
* o
->lineno_count
)
2221 offset
= o
->output_section
->vma
+ o
->output_offset
- o
->vma
;
2222 eline
= flaginfo
->linenos
;
2223 oeline
= flaginfo
->linenos
;
2224 elineend
= eline
+ linesz
* o
->lineno_count
;
2226 for (; eline
< elineend
; eline
+= linesz
)
2228 struct internal_lineno iline
;
2230 bfd_coff_swap_lineno_in (input_bfd
, eline
, &iline
);
2232 if (iline
.l_lnno
!= 0)
2233 iline
.l_addr
.l_paddr
+= offset
;
2234 else if (iline
.l_addr
.l_symndx
>= 0
2235 && ((unsigned long) iline
.l_addr
.l_symndx
2236 < obj_raw_syment_count (input_bfd
)))
2240 indx
= flaginfo
->sym_indices
[iline
.l_addr
.l_symndx
];
2244 /* These line numbers are attached to a symbol
2245 which we are stripping. We must discard the
2246 line numbers because reading them back with
2247 no associated symbol (or associating them all
2248 with symbol #0) will fail. We can't regain
2249 the space in the output file, but at least
2255 struct internal_syment is
;
2256 union internal_auxent ia
;
2258 /* Fix up the lnnoptr field in the aux entry of
2259 the symbol. It turns out that we can't do
2260 this when we modify the symbol aux entries,
2261 because gas sometimes screws up the lnnoptr
2262 field and makes it an offset from the start
2263 of the line numbers rather than an absolute
2265 bfd_coff_swap_sym_in (output_bfd
,
2267 + ((indx
- syment_base
)
2269 if ((ISFCN (is
.n_type
)
2270 || is
.n_sclass
== C_BLOCK
)
2271 && is
.n_numaux
>= 1)
2275 auxptr
= (flaginfo
->outsyms
2276 + ((indx
- syment_base
+ 1)
2278 bfd_coff_swap_aux_in (output_bfd
, auxptr
,
2279 is
.n_type
, is
.n_sclass
,
2280 0, is
.n_numaux
, &ia
);
2281 ia
.x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
=
2282 (o
->output_section
->line_filepos
2283 + o
->output_section
->lineno_count
* linesz
2284 + eline
- flaginfo
->linenos
);
2285 bfd_coff_swap_aux_out (output_bfd
, &ia
,
2286 is
.n_type
, is
.n_sclass
, 0,
2287 is
.n_numaux
, auxptr
);
2293 iline
.l_addr
.l_symndx
= indx
;
2298 bfd_coff_swap_lineno_out (output_bfd
, &iline
, oeline
);
2303 pos
= o
->output_section
->line_filepos
;
2304 pos
+= o
->output_section
->lineno_count
* linesz
;
2305 amt
= oeline
- flaginfo
->linenos
;
2306 if (bfd_seek (output_bfd
, pos
, SEEK_SET
) != 0
2307 || bfd_bwrite (flaginfo
->linenos
, amt
, output_bfd
) != amt
)
2310 o
->output_section
->lineno_count
+= amt
/ linesz
;
2314 /* If we swapped out a C_FILE symbol, guess that the next C_FILE
2315 symbol will be the first symbol in the next input file. In the
2316 normal case, this will save us from writing out the C_FILE symbol
2318 if (flaginfo
->last_file_index
!= -1
2319 && (bfd_size_type
) flaginfo
->last_file_index
>= syment_base
)
2321 flaginfo
->last_file
.n_value
= output_index
;
2322 bfd_coff_swap_sym_out (output_bfd
, &flaginfo
->last_file
,
2324 + ((flaginfo
->last_file_index
- syment_base
)
2328 /* Write the modified symbols to the output file. */
2329 if (outsym
> flaginfo
->outsyms
)
2334 pos
= obj_sym_filepos (output_bfd
) + syment_base
* osymesz
;
2335 amt
= outsym
- flaginfo
->outsyms
;
2336 if (bfd_seek (output_bfd
, pos
, SEEK_SET
) != 0
2337 || bfd_bwrite (flaginfo
->outsyms
, amt
, output_bfd
) != amt
)
2340 BFD_ASSERT ((obj_raw_syment_count (output_bfd
)
2341 + (outsym
- flaginfo
->outsyms
) / osymesz
)
2344 obj_raw_syment_count (output_bfd
) = output_index
;
2347 /* Relocate the contents of each section. */
2348 adjust_symndx
= coff_backend_info (input_bfd
)->_bfd_coff_adjust_symndx
;
2349 for (o
= input_bfd
->sections
; o
!= NULL
; o
= o
->next
)
2352 struct coff_section_tdata
*secdata
;
2354 if (! o
->linker_mark
)
2355 /* This section was omitted from the link. */
2358 if ((o
->flags
& SEC_LINKER_CREATED
) != 0)
2361 if ((o
->flags
& SEC_HAS_CONTENTS
) == 0
2362 || (o
->size
== 0 && (o
->flags
& SEC_RELOC
) == 0))
2364 if ((o
->flags
& SEC_RELOC
) != 0
2365 && o
->reloc_count
!= 0)
2368 /* xgettext: c-format */
2369 (_("%B: relocs in section `%A', but it has no contents"),
2371 bfd_set_error (bfd_error_no_contents
);
2378 secdata
= coff_section_data (input_bfd
, o
);
2379 if (secdata
!= NULL
&& secdata
->contents
!= NULL
)
2380 contents
= secdata
->contents
;
2383 contents
= flaginfo
->contents
;
2384 if (! bfd_get_full_section_contents (input_bfd
, o
, &contents
))
2388 if ((o
->flags
& SEC_RELOC
) != 0)
2391 struct internal_reloc
*internal_relocs
;
2392 struct internal_reloc
*irel
;
2394 /* Read in the relocs. */
2395 target_index
= o
->output_section
->target_index
;
2396 internal_relocs
= (_bfd_coff_read_internal_relocs
2397 (input_bfd
, o
, FALSE
, flaginfo
->external_relocs
,
2398 bfd_link_relocatable (flaginfo
->info
),
2399 (bfd_link_relocatable (flaginfo
->info
)
2400 ? (flaginfo
->section_info
[target_index
].relocs
2401 + o
->output_section
->reloc_count
)
2402 : flaginfo
->internal_relocs
)));
2403 if (internal_relocs
== NULL
2404 && o
->reloc_count
> 0)
2407 /* Run through the relocs looking for relocs against symbols
2408 coming from discarded sections and complain about them. */
2409 irel
= internal_relocs
;
2410 for (; irel
< &internal_relocs
[o
->reloc_count
]; irel
++)
2412 struct coff_link_hash_entry
*h
;
2413 asection
*ps
= NULL
;
2414 long symndx
= irel
->r_symndx
;
2417 h
= obj_coff_sym_hashes (input_bfd
)[symndx
];
2420 while (h
->root
.type
== bfd_link_hash_indirect
2421 || h
->root
.type
== bfd_link_hash_warning
)
2422 h
= (struct coff_link_hash_entry
*) h
->root
.u
.i
.link
;
2423 if (h
->root
.type
== bfd_link_hash_defined
2424 || h
->root
.type
== bfd_link_hash_defweak
)
2425 ps
= h
->root
.u
.def
.section
;
2428 /* Complain if definition comes from an excluded section. */
2429 if (ps
->flags
& SEC_EXCLUDE
)
2430 (*flaginfo
->info
->callbacks
->einfo
)
2431 /* xgettext: c-format */
2432 (_("%X`%s' referenced in section `%A' of %B: "
2433 "defined in discarded section `%A' of %B\n"),
2434 h
->root
.root
.string
, o
, input_bfd
, ps
, ps
->owner
);
2437 /* Call processor specific code to relocate the section
2439 if (! bfd_coff_relocate_section (output_bfd
, flaginfo
->info
,
2443 flaginfo
->internal_syms
,
2444 flaginfo
->sec_ptrs
))
2447 if (bfd_link_relocatable (flaginfo
->info
))
2450 struct internal_reloc
*irelend
;
2451 struct coff_link_hash_entry
**rel_hash
;
2453 offset
= o
->output_section
->vma
+ o
->output_offset
- o
->vma
;
2454 irel
= internal_relocs
;
2455 irelend
= irel
+ o
->reloc_count
;
2456 rel_hash
= (flaginfo
->section_info
[target_index
].rel_hashes
2457 + o
->output_section
->reloc_count
);
2458 for (; irel
< irelend
; irel
++, rel_hash
++)
2460 struct coff_link_hash_entry
*h
;
2461 bfd_boolean adjusted
;
2465 /* Adjust the reloc address and symbol index. */
2466 irel
->r_vaddr
+= offset
;
2468 if (irel
->r_symndx
== -1)
2473 if (! (*adjust_symndx
) (output_bfd
, flaginfo
->info
,
2481 h
= obj_coff_sym_hashes (input_bfd
)[irel
->r_symndx
];
2484 /* This is a global symbol. */
2486 irel
->r_symndx
= h
->indx
;
2489 /* This symbol is being written at the end
2490 of the file, and we do not yet know the
2491 symbol index. We save the pointer to the
2492 hash table entry in the rel_hash list.
2493 We set the indx field to -2 to indicate
2494 that this symbol must not be stripped. */
2503 indx
= flaginfo
->sym_indices
[irel
->r_symndx
];
2505 irel
->r_symndx
= indx
;
2508 struct internal_syment
*is
;
2510 char buf
[SYMNMLEN
+ 1];
2512 /* This reloc is against a symbol we are
2513 stripping. This should have been handled
2514 by the 'dont_skip_symbol' code in the while
2515 loop at the top of this function. */
2516 is
= flaginfo
->internal_syms
+ irel
->r_symndx
;
2518 name
= (_bfd_coff_internal_syment_name
2519 (input_bfd
, is
, buf
));
2523 (*flaginfo
->info
->callbacks
->unattached_reloc
)
2524 (flaginfo
->info
, name
, input_bfd
, o
, irel
->r_vaddr
);
2529 o
->output_section
->reloc_count
+= o
->reloc_count
;
2533 /* Write out the modified section contents. */
2534 if (secdata
== NULL
|| secdata
->stab_info
== NULL
)
2536 file_ptr loc
= o
->output_offset
* bfd_octets_per_byte (output_bfd
);
2537 if (! bfd_set_section_contents (output_bfd
, o
->output_section
,
2538 contents
, loc
, o
->size
))
2543 if (! (_bfd_write_section_stabs
2544 (output_bfd
, &coff_hash_table (flaginfo
->info
)->stab_info
,
2545 o
, &secdata
->stab_info
, contents
)))
2550 if (! flaginfo
->info
->keep_memory
2551 && ! _bfd_coff_free_symbols (input_bfd
))
2557 /* Write out a global symbol. Called via bfd_hash_traverse. */
2560 _bfd_coff_write_global_sym (struct bfd_hash_entry
*bh
, void *data
)
2562 struct coff_link_hash_entry
*h
= (struct coff_link_hash_entry
*) bh
;
2563 struct coff_final_link_info
*flaginfo
= (struct coff_final_link_info
*) data
;
2565 struct internal_syment isym
;
2566 bfd_size_type symesz
;
2570 output_bfd
= flaginfo
->output_bfd
;
2572 if (h
->root
.type
== bfd_link_hash_warning
)
2574 h
= (struct coff_link_hash_entry
*) h
->root
.u
.i
.link
;
2575 if (h
->root
.type
== bfd_link_hash_new
)
2583 && (flaginfo
->info
->strip
== strip_all
2584 || (flaginfo
->info
->strip
== strip_some
2585 && (bfd_hash_lookup (flaginfo
->info
->keep_hash
,
2586 h
->root
.root
.string
, FALSE
, FALSE
)
2590 switch (h
->root
.type
)
2593 case bfd_link_hash_new
:
2594 case bfd_link_hash_warning
:
2598 case bfd_link_hash_undefined
:
2599 case bfd_link_hash_undefweak
:
2600 isym
.n_scnum
= N_UNDEF
;
2604 case bfd_link_hash_defined
:
2605 case bfd_link_hash_defweak
:
2609 sec
= h
->root
.u
.def
.section
->output_section
;
2610 if (bfd_is_abs_section (sec
))
2611 isym
.n_scnum
= N_ABS
;
2613 isym
.n_scnum
= sec
->target_index
;
2614 isym
.n_value
= (h
->root
.u
.def
.value
2615 + h
->root
.u
.def
.section
->output_offset
);
2616 if (! obj_pe (flaginfo
->output_bfd
))
2617 isym
.n_value
+= sec
->vma
;
2621 case bfd_link_hash_common
:
2622 isym
.n_scnum
= N_UNDEF
;
2623 isym
.n_value
= h
->root
.u
.c
.size
;
2626 case bfd_link_hash_indirect
:
2627 /* Just ignore these. They can't be handled anyhow. */
2631 if (strlen (h
->root
.root
.string
) <= SYMNMLEN
)
2632 strncpy (isym
._n
._n_name
, h
->root
.root
.string
, SYMNMLEN
);
2639 if (flaginfo
->info
->traditional_format
)
2641 indx
= _bfd_stringtab_add (flaginfo
->strtab
, h
->root
.root
.string
, hash
,
2643 if (indx
== (bfd_size_type
) -1)
2645 flaginfo
->failed
= TRUE
;
2648 isym
._n
._n_n
._n_zeroes
= 0;
2649 isym
._n
._n_n
._n_offset
= STRING_SIZE_SIZE
+ indx
;
2652 isym
.n_sclass
= h
->symbol_class
;
2653 isym
.n_type
= h
->type
;
2655 if (isym
.n_sclass
== C_NULL
)
2656 isym
.n_sclass
= C_EXT
;
2658 /* If doing task linking and this is the pass where we convert
2659 defined globals to statics, then do that conversion now. If the
2660 symbol is not being converted, just ignore it and it will be
2661 output during a later pass. */
2662 if (flaginfo
->global_to_static
)
2664 if (! IS_EXTERNAL (output_bfd
, isym
))
2667 isym
.n_sclass
= C_STAT
;
2670 /* When a weak symbol is not overridden by a strong one,
2671 turn it into an external symbol when not building a
2672 shared or relocatable object. */
2673 if (! bfd_link_pic (flaginfo
->info
)
2674 && ! bfd_link_relocatable (flaginfo
->info
)
2675 && IS_WEAK_EXTERNAL (flaginfo
->output_bfd
, isym
))
2676 isym
.n_sclass
= C_EXT
;
2678 isym
.n_numaux
= h
->numaux
;
2680 bfd_coff_swap_sym_out (output_bfd
, &isym
, flaginfo
->outsyms
);
2682 symesz
= bfd_coff_symesz (output_bfd
);
2684 pos
= obj_sym_filepos (output_bfd
);
2685 pos
+= obj_raw_syment_count (output_bfd
) * symesz
;
2686 if (bfd_seek (output_bfd
, pos
, SEEK_SET
) != 0
2687 || bfd_bwrite (flaginfo
->outsyms
, symesz
, output_bfd
) != symesz
)
2689 flaginfo
->failed
= TRUE
;
2693 h
->indx
= obj_raw_syment_count (output_bfd
);
2695 ++obj_raw_syment_count (output_bfd
);
2697 /* Write out any associated aux entries. Most of the aux entries
2698 will have been modified in _bfd_coff_link_input_bfd. We have to
2699 handle section aux entries here, now that we have the final
2700 relocation and line number counts. */
2701 for (i
= 0; i
< isym
.n_numaux
; i
++)
2703 union internal_auxent
*auxp
;
2707 /* Look for a section aux entry here using the same tests that
2708 coff_swap_aux_out uses. */
2710 && (isym
.n_sclass
== C_STAT
2711 || isym
.n_sclass
== C_HIDDEN
)
2712 && isym
.n_type
== T_NULL
2713 && (h
->root
.type
== bfd_link_hash_defined
2714 || h
->root
.type
== bfd_link_hash_defweak
))
2718 sec
= h
->root
.u
.def
.section
->output_section
;
2721 auxp
->x_scn
.x_scnlen
= sec
->size
;
2723 /* For PE, an overflow on the final link reportedly does
2724 not matter. FIXME: Why not? */
2725 if (sec
->reloc_count
> 0xffff
2726 && (! obj_pe (output_bfd
)
2727 || bfd_link_relocatable (flaginfo
->info
)))
2729 /* xgettext: c-format */
2730 (_("%B: %A: reloc overflow: %#x > 0xffff"),
2731 output_bfd
, sec
, sec
->reloc_count
);
2733 if (sec
->lineno_count
> 0xffff
2734 && (! obj_pe (output_bfd
)
2735 || bfd_link_relocatable (flaginfo
->info
)))
2737 /* xgettext: c-format */
2738 (_("%B: warning: %A: line number overflow: %#x > 0xffff"),
2739 output_bfd
, sec
, sec
->lineno_count
);
2741 auxp
->x_scn
.x_nreloc
= sec
->reloc_count
;
2742 auxp
->x_scn
.x_nlinno
= sec
->lineno_count
;
2743 auxp
->x_scn
.x_checksum
= 0;
2744 auxp
->x_scn
.x_associated
= 0;
2745 auxp
->x_scn
.x_comdat
= 0;
2749 bfd_coff_swap_aux_out (output_bfd
, auxp
, isym
.n_type
,
2750 isym
.n_sclass
, (int) i
, isym
.n_numaux
,
2752 if (bfd_bwrite (flaginfo
->outsyms
, symesz
, output_bfd
) != symesz
)
2754 flaginfo
->failed
= TRUE
;
2757 ++obj_raw_syment_count (output_bfd
);
2763 /* Write out task global symbols, converting them to statics. Called
2764 via coff_link_hash_traverse. Calls bfd_coff_write_global_sym to do
2765 the dirty work, if the symbol we are processing needs conversion. */
2768 _bfd_coff_write_task_globals (struct coff_link_hash_entry
*h
, void *data
)
2770 struct coff_final_link_info
*flaginfo
= (struct coff_final_link_info
*) data
;
2771 bfd_boolean rtnval
= TRUE
;
2772 bfd_boolean save_global_to_static
;
2774 if (h
->root
.type
== bfd_link_hash_warning
)
2775 h
= (struct coff_link_hash_entry
*) h
->root
.u
.i
.link
;
2779 switch (h
->root
.type
)
2781 case bfd_link_hash_defined
:
2782 case bfd_link_hash_defweak
:
2783 save_global_to_static
= flaginfo
->global_to_static
;
2784 flaginfo
->global_to_static
= TRUE
;
2785 rtnval
= _bfd_coff_write_global_sym (&h
->root
.root
, data
);
2786 flaginfo
->global_to_static
= save_global_to_static
;
2795 /* Handle a link order which is supposed to generate a reloc. */
2798 _bfd_coff_reloc_link_order (bfd
*output_bfd
,
2799 struct coff_final_link_info
*flaginfo
,
2800 asection
*output_section
,
2801 struct bfd_link_order
*link_order
)
2803 reloc_howto_type
*howto
;
2804 struct internal_reloc
*irel
;
2805 struct coff_link_hash_entry
**rel_hash_ptr
;
2807 howto
= bfd_reloc_type_lookup (output_bfd
, link_order
->u
.reloc
.p
->reloc
);
2810 bfd_set_error (bfd_error_bad_value
);
2814 if (link_order
->u
.reloc
.p
->addend
!= 0)
2818 bfd_reloc_status_type rstat
;
2822 size
= bfd_get_reloc_size (howto
);
2823 buf
= (bfd_byte
*) bfd_zmalloc (size
);
2824 if (buf
== NULL
&& size
!= 0)
2827 rstat
= _bfd_relocate_contents (howto
, output_bfd
,
2828 (bfd_vma
) link_order
->u
.reloc
.p
->addend
,\
2835 case bfd_reloc_outofrange
:
2837 case bfd_reloc_overflow
:
2838 (*flaginfo
->info
->callbacks
->reloc_overflow
)
2839 (flaginfo
->info
, NULL
,
2840 (link_order
->type
== bfd_section_reloc_link_order
2841 ? bfd_section_name (output_bfd
,
2842 link_order
->u
.reloc
.p
->u
.section
)
2843 : link_order
->u
.reloc
.p
->u
.name
),
2844 howto
->name
, link_order
->u
.reloc
.p
->addend
,
2845 (bfd
*) NULL
, (asection
*) NULL
, (bfd_vma
) 0);
2848 loc
= link_order
->offset
* bfd_octets_per_byte (output_bfd
);
2849 ok
= bfd_set_section_contents (output_bfd
, output_section
, buf
,
2856 /* Store the reloc information in the right place. It will get
2857 swapped and written out at the end of the final_link routine. */
2858 irel
= (flaginfo
->section_info
[output_section
->target_index
].relocs
2859 + output_section
->reloc_count
);
2860 rel_hash_ptr
= (flaginfo
->section_info
[output_section
->target_index
].rel_hashes
2861 + output_section
->reloc_count
);
2863 memset (irel
, 0, sizeof (struct internal_reloc
));
2864 *rel_hash_ptr
= NULL
;
2866 irel
->r_vaddr
= output_section
->vma
+ link_order
->offset
;
2868 if (link_order
->type
== bfd_section_reloc_link_order
)
2870 /* We need to somehow locate a symbol in the right section. The
2871 symbol must either have a value of zero, or we must adjust
2872 the addend by the value of the symbol. FIXME: Write this
2873 when we need it. The old linker couldn't handle this anyhow. */
2875 *rel_hash_ptr
= NULL
;
2880 struct coff_link_hash_entry
*h
;
2882 h
= ((struct coff_link_hash_entry
*)
2883 bfd_wrapped_link_hash_lookup (output_bfd
, flaginfo
->info
,
2884 link_order
->u
.reloc
.p
->u
.name
,
2885 FALSE
, FALSE
, TRUE
));
2889 irel
->r_symndx
= h
->indx
;
2892 /* Set the index to -2 to force this symbol to get
2901 (*flaginfo
->info
->callbacks
->unattached_reloc
)
2902 (flaginfo
->info
, link_order
->u
.reloc
.p
->u
.name
,
2903 (bfd
*) NULL
, (asection
*) NULL
, (bfd_vma
) 0);
2908 /* FIXME: Is this always right? */
2909 irel
->r_type
= howto
->type
;
2911 /* r_size is only used on the RS/6000, which needs its own linker
2912 routines anyhow. r_extern is only used for ECOFF. */
2914 /* FIXME: What is the right value for r_offset? Is zero OK? */
2915 ++output_section
->reloc_count
;
2920 /* A basic reloc handling routine which may be used by processors with
2924 _bfd_coff_generic_relocate_section (bfd
*output_bfd
,
2925 struct bfd_link_info
*info
,
2927 asection
*input_section
,
2929 struct internal_reloc
*relocs
,
2930 struct internal_syment
*syms
,
2931 asection
**sections
)
2933 struct internal_reloc
*rel
;
2934 struct internal_reloc
*relend
;
2937 relend
= rel
+ input_section
->reloc_count
;
2938 for (; rel
< relend
; rel
++)
2941 struct coff_link_hash_entry
*h
;
2942 struct internal_syment
*sym
;
2946 reloc_howto_type
*howto
;
2947 bfd_reloc_status_type rstat
;
2949 symndx
= rel
->r_symndx
;
2957 || (unsigned long) symndx
>= obj_raw_syment_count (input_bfd
))
2960 /* xgettext: c-format */
2961 (_("%B: illegal symbol index %ld in relocs"), input_bfd
, symndx
);
2966 h
= obj_coff_sym_hashes (input_bfd
)[symndx
];
2967 sym
= syms
+ symndx
;
2970 /* COFF treats common symbols in one of two ways. Either the
2971 size of the symbol is included in the section contents, or it
2972 is not. We assume that the size is not included, and force
2973 the rtype_to_howto function to adjust the addend as needed. */
2974 if (sym
!= NULL
&& sym
->n_scnum
!= 0)
2975 addend
= - sym
->n_value
;
2979 howto
= bfd_coff_rtype_to_howto (input_bfd
, input_section
, rel
, h
,
2984 /* If we are doing a relocatable link, then we can just ignore
2985 a PC relative reloc that is pcrel_offset. It will already
2986 have the correct value. If this is not a relocatable link,
2987 then we should ignore the symbol value. */
2988 if (howto
->pc_relative
&& howto
->pcrel_offset
)
2990 if (bfd_link_relocatable (info
))
2992 if (sym
!= NULL
&& sym
->n_scnum
!= 0)
2993 addend
+= sym
->n_value
;
3002 sec
= bfd_abs_section_ptr
;
3007 sec
= sections
[symndx
];
3009 /* PR 19623: Relocations against symbols in
3010 the absolute sections should ignored. */
3011 if (bfd_is_abs_section (sec
))
3014 val
= (sec
->output_section
->vma
3015 + sec
->output_offset
3017 if (! obj_pe (input_bfd
))
3023 if (h
->root
.type
== bfd_link_hash_defined
3024 || h
->root
.type
== bfd_link_hash_defweak
)
3026 /* Defined weak symbols are a GNU extension. */
3027 sec
= h
->root
.u
.def
.section
;
3028 val
= (h
->root
.u
.def
.value
3029 + sec
->output_section
->vma
3030 + sec
->output_offset
);
3033 else if (h
->root
.type
== bfd_link_hash_undefweak
)
3035 if (h
->symbol_class
== C_NT_WEAK
&& h
->numaux
== 1)
3037 /* See _Microsoft Portable Executable and Common Object
3038 File Format Specification_, section 5.5.3.
3039 Note that weak symbols without aux records are a GNU
3041 FIXME: All weak externals are treated as having
3042 characteristic IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY (1).
3043 These behave as per SVR4 ABI: A library member
3044 will resolve a weak external only if a normal
3045 external causes the library member to be linked.
3046 See also linker.c: generic_link_check_archive_element. */
3047 struct coff_link_hash_entry
*h2
=
3048 h
->auxbfd
->tdata
.coff_obj_data
->sym_hashes
[
3049 h
->aux
->x_sym
.x_tagndx
.l
];
3051 if (!h2
|| h2
->root
.type
== bfd_link_hash_undefined
)
3053 sec
= bfd_abs_section_ptr
;
3058 sec
= h2
->root
.u
.def
.section
;
3059 val
= h2
->root
.u
.def
.value
3060 + sec
->output_section
->vma
+ sec
->output_offset
;
3064 /* This is a GNU extension. */
3068 else if (! bfd_link_relocatable (info
))
3069 (*info
->callbacks
->undefined_symbol
)
3070 (info
, h
->root
.root
.string
, input_bfd
, input_section
,
3071 rel
->r_vaddr
- input_section
->vma
, TRUE
);
3074 /* If the input section defining the symbol has been discarded
3075 then zero this reloc field. */
3076 if (sec
!= NULL
&& discarded_section (sec
))
3078 _bfd_clear_contents (howto
, input_bfd
, input_section
,
3079 contents
+ (rel
->r_vaddr
- input_section
->vma
));
3083 if (info
->base_file
)
3085 /* Emit a reloc if the backend thinks it needs it. */
3086 if (sym
&& pe_data (output_bfd
)->in_reloc_p (output_bfd
, howto
))
3088 /* Relocation to a symbol in a section which isn't
3089 absolute. We output the address here to a file.
3090 This file is then read by dlltool when generating the
3091 reloc section. Note that the base file is not
3092 portable between systems. We write out a bfd_vma here,
3093 and dlltool reads in a bfd_vma. */
3094 bfd_vma addr
= (rel
->r_vaddr
3095 - input_section
->vma
3096 + input_section
->output_offset
3097 + input_section
->output_section
->vma
);
3098 if (coff_data (output_bfd
)->pe
)
3099 addr
-= pe_data(output_bfd
)->pe_opthdr
.ImageBase
;
3100 if (fwrite (&addr
, 1, sizeof (bfd_vma
), (FILE *) info
->base_file
)
3101 != sizeof (bfd_vma
))
3103 bfd_set_error (bfd_error_system_call
);
3109 rstat
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
3111 rel
->r_vaddr
- input_section
->vma
,
3120 case bfd_reloc_outofrange
:
3122 /* xgettext: c-format */
3123 (_("%B: bad reloc address %#Lx in section `%A'"),
3124 input_bfd
, rel
->r_vaddr
, input_section
);
3126 case bfd_reloc_overflow
:
3129 char buf
[SYMNMLEN
+ 1];
3137 name
= _bfd_coff_internal_syment_name (input_bfd
, sym
, buf
);
3142 (*info
->callbacks
->reloc_overflow
)
3143 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
3144 (bfd_vma
) 0, input_bfd
, input_section
,
3145 rel
->r_vaddr
- input_section
->vma
);