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