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