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