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