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