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