PR24390, Don't decode mtfsb field as a cr field
[deliverable/binutils-gdb.git] / bfd / coffgen.c
CommitLineData
252b5132 1/* Support for the generic parts of COFF, for BFD.
82704155 2 Copyright (C) 1990-2019 Free Software Foundation, Inc.
252b5132
RH
3 Written by Cygnus Support.
4
c8e7bf0d 5 This file is part of BFD, the Binary File Descriptor library.
252b5132 6
c8e7bf0d
NC
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
cd123cb7 9 the Free Software Foundation; either version 3 of the License, or
c8e7bf0d 10 (at your option) any later version.
252b5132 11
c8e7bf0d
NC
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
252b5132 16
c8e7bf0d
NC
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
cd123cb7
NC
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
252b5132
RH
21
22/* Most of this hacked by Steve Chamberlain, sac@cygnus.com.
23 Split out of coffcode.h by Ian Taylor, ian@cygnus.com. */
24
25/* This file contains COFF code that is not dependent on any
26 particular COFF target. There is only one version of this file in
27 libbfd.a, so no target specific code may be put in here. Or, to
28 put it another way,
29
30 ********** DO NOT PUT TARGET SPECIFIC CODE IN THIS FILE **********
31
32 If you need to add some target specific behaviour, add a new hook
33 function to bfd_coff_backend_data.
34
35 Some of these functions are also called by the ECOFF routines.
36 Those functions may not use any COFF specific information, such as
37 coff_data (abfd). */
38
252b5132 39#include "sysdep.h"
7a6e0d89 40#include <limits.h>
3db64b00 41#include "bfd.h"
252b5132
RH
42#include "libbfd.h"
43#include "coff/internal.h"
44#include "libcoff.h"
45
252b5132
RH
46/* Take a section header read from a coff file (in HOST byte order),
47 and make a BFD "section" out of it. This is used by ECOFF. */
c8e7bf0d 48
b34976b6 49static bfd_boolean
c8e7bf0d
NC
50make_a_section_from_file (bfd *abfd,
51 struct internal_scnhdr *hdr,
52 unsigned int target_index)
252b5132
RH
53{
54 asection *return_section;
55 char *name;
b34976b6 56 bfd_boolean result = TRUE;
7c8ca0e4 57 flagword flags;
252b5132
RH
58
59 name = NULL;
60
88183869
DK
61 /* Handle long section names as in PE. On reading, we want to
62 accept long names if the format permits them at all, regardless
63 of the current state of the flag that dictates if we would generate
64 them in outputs; this construct checks if that is the case by
65 attempting to set the flag, without changing its state; the call
66 will fail for formats that do not support long names at all. */
67 if (bfd_coff_set_long_section_names (abfd, bfd_coff_long_section_names (abfd))
252b5132
RH
68 && hdr->s_name[0] == '/')
69 {
70 char buf[SCNNMLEN];
71 long strindex;
72 char *p;
73 const char *strings;
74
0408dee6 75 /* Flag that this BFD uses long names, even though the format might
07d6d2b8
AM
76 expect them to be off by default. This won't directly affect the
77 format of any output BFD created from this one, but the information
78 can be used to decide what to do. */
0408dee6 79 bfd_coff_set_long_section_names (abfd, TRUE);
252b5132
RH
80 memcpy (buf, hdr->s_name + 1, SCNNMLEN - 1);
81 buf[SCNNMLEN - 1] = '\0';
82 strindex = strtol (buf, &p, 10);
83 if (*p == '\0' && strindex >= 0)
84 {
85 strings = _bfd_coff_read_string_table (abfd);
86 if (strings == NULL)
b34976b6 87 return FALSE;
5a3f568b
NC
88 if ((bfd_size_type)(strindex + 2) >= obj_coff_strings_len (abfd))
89 return FALSE;
252b5132 90 strings += strindex;
a50b1753 91 name = (char *) bfd_alloc (abfd,
07d6d2b8 92 (bfd_size_type) strlen (strings) + 1 + 1);
252b5132 93 if (name == NULL)
b34976b6 94 return FALSE;
252b5132
RH
95 strcpy (name, strings);
96 }
97 }
98
99 if (name == NULL)
100 {
101 /* Assorted wastage to null-terminate the name, thanks AT&T! */
a50b1753 102 name = (char *) bfd_alloc (abfd,
07d6d2b8 103 (bfd_size_type) sizeof (hdr->s_name) + 1 + 1);
252b5132 104 if (name == NULL)
b34976b6 105 return FALSE;
252b5132
RH
106 strncpy (name, (char *) &hdr->s_name[0], sizeof (hdr->s_name));
107 name[sizeof (hdr->s_name)] = 0;
108 }
109
110 return_section = bfd_make_section_anyway (abfd, name);
111 if (return_section == NULL)
b34976b6 112 return FALSE;
252b5132
RH
113
114 return_section->vma = hdr->s_vaddr;
115 return_section->lma = hdr->s_paddr;
eea6121a 116 return_section->size = hdr->s_size;
252b5132
RH
117 return_section->filepos = hdr->s_scnptr;
118 return_section->rel_filepos = hdr->s_relptr;
119 return_section->reloc_count = hdr->s_nreloc;
120
121 bfd_coff_set_alignment_hook (abfd, return_section, hdr);
122
123 return_section->line_filepos = hdr->s_lnnoptr;
124
125 return_section->lineno_count = hdr->s_nlnno;
126 return_section->userdata = NULL;
c8e7bf0d 127 return_section->next = NULL;
252b5132 128 return_section->target_index = target_index;
7c8ca0e4
NC
129
130 if (! bfd_coff_styp_to_sec_flags_hook (abfd, hdr, name, return_section,
131 & flags))
b34976b6 132 result = FALSE;
dc810e39 133
7c8ca0e4 134 return_section->flags = flags;
252b5132
RH
135
136 /* At least on i386-coff, the line number count for a shared library
137 section must be ignored. */
138 if ((return_section->flags & SEC_COFF_SHARED_LIBRARY) != 0)
139 return_section->lineno_count = 0;
140
141 if (hdr->s_nreloc != 0)
142 return_section->flags |= SEC_RELOC;
c8e7bf0d 143 /* FIXME: should this check 'hdr->s_size > 0'. */
252b5132
RH
144 if (hdr->s_scnptr != 0)
145 return_section->flags |= SEC_HAS_CONTENTS;
7c8ca0e4 146
a29a8af8
KT
147 /* Compress/decompress DWARF debug sections with names: .debug_* and
148 .zdebug_*, after the section flags is set. */
149 if ((flags & SEC_DEBUGGING)
a1165289 150 && strlen (name) > 7
a29a8af8 151 && ((name[1] == 'd' && name[6] == '_')
a1165289 152 || (strlen (name) > 8 && name[1] == 'z' && name[7] == '_')))
a29a8af8
KT
153 {
154 enum { nothing, compress, decompress } action = nothing;
155 char *new_name = NULL;
156
157 if (bfd_is_section_compressed (abfd, return_section))
158 {
159 /* Compressed section. Check if we should decompress. */
160 if ((abfd->flags & BFD_DECOMPRESS))
161 action = decompress;
162 }
163 else if (!bfd_is_section_compressed (abfd, return_section))
164 {
165 /* Normal section. Check if we should compress. */
166 if ((abfd->flags & BFD_COMPRESS) && return_section->size != 0)
167 action = compress;
168 }
169
170 switch (action)
171 {
172 case nothing:
173 break;
174 case compress:
175 if (!bfd_init_section_compress_status (abfd, return_section))
176 {
4eca0228 177 _bfd_error_handler
695344c0 178 /* xgettext: c-format */
871b3ab2 179 (_("%pB: unable to initialize compress status for section %s"),
a29a8af8
KT
180 abfd, name);
181 return FALSE;
182 }
273a4985 183 if (return_section->compress_status == COMPRESS_SECTION_DONE)
a29a8af8 184 {
273a4985
JT
185 if (name[1] != 'z')
186 {
187 unsigned int len = strlen (name);
188
189 new_name = bfd_alloc (abfd, len + 2);
190 if (new_name == NULL)
191 return FALSE;
192 new_name[0] = '.';
193 new_name[1] = 'z';
194 memcpy (new_name + 2, name + 1, len);
195 }
a29a8af8 196 }
07d6d2b8 197 break;
a29a8af8
KT
198 case decompress:
199 if (!bfd_init_section_decompress_status (abfd, return_section))
200 {
4eca0228 201 _bfd_error_handler
695344c0 202 /* xgettext: c-format */
871b3ab2 203 (_("%pB: unable to initialize decompress status for section %s"),
a29a8af8
KT
204 abfd, name);
205 return FALSE;
206 }
207 if (name[1] == 'z')
208 {
209 unsigned int len = strlen (name);
210
211 new_name = bfd_alloc (abfd, len);
212 if (new_name == NULL)
213 return FALSE;
214 new_name[0] = '.';
215 memcpy (new_name + 1, name + 2, len - 1);
216 }
217 break;
218 }
219 if (new_name != NULL)
220 bfd_rename_section (abfd, return_section, new_name);
221 }
222
7c8ca0e4 223 return result;
252b5132
RH
224}
225
226/* Read in a COFF object and make it into a BFD. This is used by
227 ECOFF as well. */
ce63b7b3
KT
228const bfd_target *
229coff_real_object_p (bfd *,
07d6d2b8
AM
230 unsigned,
231 struct internal_filehdr *,
232 struct internal_aouthdr *);
ce63b7b3 233const bfd_target *
c8e7bf0d
NC
234coff_real_object_p (bfd *abfd,
235 unsigned nscns,
236 struct internal_filehdr *internal_f,
237 struct internal_aouthdr *internal_a)
252b5132
RH
238{
239 flagword oflags = abfd->flags;
240 bfd_vma ostart = bfd_get_start_address (abfd);
c8e7bf0d
NC
241 void * tdata;
242 void * tdata_save;
243 bfd_size_type readsize; /* Length of file_info. */
252b5132
RH
244 unsigned int scnhsz;
245 char *external_sections;
246
247 if (!(internal_f->f_flags & F_RELFLG))
248 abfd->flags |= HAS_RELOC;
249 if ((internal_f->f_flags & F_EXEC))
250 abfd->flags |= EXEC_P;
251 if (!(internal_f->f_flags & F_LNNO))
252 abfd->flags |= HAS_LINENO;
253 if (!(internal_f->f_flags & F_LSYMS))
254 abfd->flags |= HAS_LOCALS;
255
256 /* FIXME: How can we set D_PAGED correctly? */
257 if ((internal_f->f_flags & F_EXEC) != 0)
258 abfd->flags |= D_PAGED;
259
260 bfd_get_symcount (abfd) = internal_f->f_nsyms;
261 if (internal_f->f_nsyms)
262 abfd->flags |= HAS_SYMS;
263
264 if (internal_a != (struct internal_aouthdr *) NULL)
265 bfd_get_start_address (abfd) = internal_a->entry;
266 else
267 bfd_get_start_address (abfd) = 0;
268
269 /* Set up the tdata area. ECOFF uses its own routine, and overrides
270 abfd->flags. */
487e54f2 271 tdata_save = abfd->tdata.any;
c8e7bf0d 272 tdata = bfd_coff_mkobject_hook (abfd, (void *) internal_f, (void *) internal_a);
252b5132 273 if (tdata == NULL)
487e54f2 274 goto fail2;
252b5132
RH
275
276 scnhsz = bfd_coff_scnhsz (abfd);
dc810e39 277 readsize = (bfd_size_type) nscns * scnhsz;
a50b1753 278 external_sections = (char *) bfd_alloc (abfd, readsize);
252b5132
RH
279 if (!external_sections)
280 goto fail;
281
c8e7bf0d 282 if (bfd_bread ((void *) external_sections, readsize, abfd) != readsize)
252b5132
RH
283 goto fail;
284
363d7b14 285 /* Set the arch/mach *before* swapping in sections; section header swapping
244148ad 286 may depend on arch/mach info. */
c8e7bf0d 287 if (! bfd_coff_set_arch_mach_hook (abfd, (void *) internal_f))
363d7b14
TW
288 goto fail;
289
e16bb312 290 /* Now copy data as required; construct all asections etc. */
252b5132
RH
291 if (nscns != 0)
292 {
293 unsigned int i;
294 for (i = 0; i < nscns; i++)
295 {
296 struct internal_scnhdr tmp;
297 bfd_coff_swap_scnhdr_in (abfd,
c8e7bf0d
NC
298 (void *) (external_sections + i * scnhsz),
299 (void *) & tmp);
252b5132
RH
300 if (! make_a_section_from_file (abfd, &tmp, i + 1))
301 goto fail;
302 }
303 }
304
252b5132
RH
305 return abfd->xvec;
306
307 fail:
308 bfd_release (abfd, tdata);
487e54f2
AM
309 fail2:
310 abfd->tdata.any = tdata_save;
252b5132
RH
311 abfd->flags = oflags;
312 bfd_get_start_address (abfd) = ostart;
313 return (const bfd_target *) NULL;
314}
315
316/* Turn a COFF file into a BFD, but fail with bfd_error_wrong_format if it is
317 not a COFF file. This is also used by ECOFF. */
318
319const bfd_target *
c8e7bf0d 320coff_object_p (bfd *abfd)
252b5132 321{
dc810e39
AM
322 bfd_size_type filhsz;
323 bfd_size_type aoutsz;
324 unsigned int nscns;
c8e7bf0d 325 void * filehdr;
252b5132
RH
326 struct internal_filehdr internal_f;
327 struct internal_aouthdr internal_a;
328
c8e7bf0d 329 /* Figure out how much to read. */
252b5132
RH
330 filhsz = bfd_coff_filhsz (abfd);
331 aoutsz = bfd_coff_aoutsz (abfd);
332
333 filehdr = bfd_alloc (abfd, filhsz);
334 if (filehdr == NULL)
487e54f2 335 return NULL;
dc810e39 336 if (bfd_bread (filehdr, filhsz, abfd) != filhsz)
252b5132
RH
337 {
338 if (bfd_get_error () != bfd_error_system_call)
339 bfd_set_error (bfd_error_wrong_format);
487e54f2
AM
340 bfd_release (abfd, filehdr);
341 return NULL;
252b5132
RH
342 }
343 bfd_coff_swap_filehdr_in (abfd, filehdr, &internal_f);
344 bfd_release (abfd, filehdr);
345
b8819ab2
NC
346 /* The XCOFF format has two sizes for the f_opthdr. SMALL_AOUTSZ
347 (less than aoutsz) used in object files and AOUTSZ (equal to
348 aoutsz) in executables. The bfd_coff_swap_aouthdr_in function
349 expects this header to be aoutsz bytes in length, so we use that
350 value in the call to bfd_alloc below. But we must be careful to
351 only read in f_opthdr bytes in the call to bfd_bread. We should
352 also attempt to catch corrupt or non-COFF binaries with a strange
353 value for f_opthdr. */
82e51918 354 if (! bfd_coff_bad_format_hook (abfd, &internal_f)
95f7d9f7 355 || internal_f.f_opthdr > aoutsz)
252b5132
RH
356 {
357 bfd_set_error (bfd_error_wrong_format);
487e54f2 358 return NULL;
252b5132
RH
359 }
360 nscns = internal_f.f_nscns;
361
362 if (internal_f.f_opthdr)
363 {
c8e7bf0d 364 void * opthdr;
252b5132
RH
365
366 opthdr = bfd_alloc (abfd, aoutsz);
367 if (opthdr == NULL)
487e54f2 368 return NULL;
dc810e39 369 if (bfd_bread (opthdr, (bfd_size_type) internal_f.f_opthdr, abfd)
252b5132
RH
370 != internal_f.f_opthdr)
371 {
487e54f2
AM
372 bfd_release (abfd, opthdr);
373 return NULL;
252b5132 374 }
a1165289
NC
375 /* PR 17512: file: 11056-1136-0.004. */
376 if (internal_f.f_opthdr < aoutsz)
377 memset (((char *) opthdr) + internal_f.f_opthdr, 0, aoutsz - internal_f.f_opthdr);
378
c8e7bf0d 379 bfd_coff_swap_aouthdr_in (abfd, opthdr, (void *) &internal_a);
487e54f2 380 bfd_release (abfd, opthdr);
252b5132
RH
381 }
382
383 return coff_real_object_p (abfd, nscns, &internal_f,
384 (internal_f.f_opthdr != 0
385 ? &internal_a
386 : (struct internal_aouthdr *) NULL));
387}
388
389/* Get the BFD section from a COFF symbol section number. */
390
391asection *
91d6fa6a 392coff_section_from_bfd_index (bfd *abfd, int section_index)
252b5132 393{
198beae2 394 struct bfd_section *answer = abfd->sections;
252b5132 395
91d6fa6a 396 if (section_index == N_ABS)
252b5132 397 return bfd_abs_section_ptr;
91d6fa6a 398 if (section_index == N_UNDEF)
252b5132 399 return bfd_und_section_ptr;
91d6fa6a 400 if (section_index == N_DEBUG)
252b5132
RH
401 return bfd_abs_section_ptr;
402
403 while (answer)
404 {
91d6fa6a 405 if (answer->target_index == section_index)
252b5132
RH
406 return answer;
407 answer = answer->next;
408 }
409
410 /* We should not reach this point, but the SCO 3.2v4 /lib/libc_s.a
411 has a bad symbol table in biglitpow.o. */
412 return bfd_und_section_ptr;
413}
414
415/* Get the upper bound of a COFF symbol table. */
416
417long
c8e7bf0d 418coff_get_symtab_upper_bound (bfd *abfd)
252b5132
RH
419{
420 if (!bfd_coff_slurp_symbol_table (abfd))
421 return -1;
422
423 return (bfd_get_symcount (abfd) + 1) * (sizeof (coff_symbol_type *));
424}
425
252b5132
RH
426/* Canonicalize a COFF symbol table. */
427
428long
c8e7bf0d 429coff_canonicalize_symtab (bfd *abfd, asymbol **alocation)
252b5132
RH
430{
431 unsigned int counter;
432 coff_symbol_type *symbase;
433 coff_symbol_type **location = (coff_symbol_type **) alocation;
434
435 if (!bfd_coff_slurp_symbol_table (abfd))
436 return -1;
437
438 symbase = obj_symbols (abfd);
439 counter = bfd_get_symcount (abfd);
440 while (counter-- > 0)
441 *location++ = symbase++;
442
443 *location = NULL;
444
445 return bfd_get_symcount (abfd);
446}
447
448/* Get the name of a symbol. The caller must pass in a buffer of size
449 >= SYMNMLEN + 1. */
450
451const char *
c8e7bf0d
NC
452_bfd_coff_internal_syment_name (bfd *abfd,
453 const struct internal_syment *sym,
454 char *buf)
252b5132
RH
455{
456 /* FIXME: It's not clear this will work correctly if sizeof
457 (_n_zeroes) != 4. */
458 if (sym->_n._n_n._n_zeroes != 0
459 || sym->_n._n_n._n_offset == 0)
460 {
461 memcpy (buf, sym->_n._n_name, SYMNMLEN);
462 buf[SYMNMLEN] = '\0';
463 return buf;
464 }
465 else
466 {
467 const char *strings;
468
469 BFD_ASSERT (sym->_n._n_n._n_offset >= STRING_SIZE_SIZE);
470 strings = obj_coff_strings (abfd);
471 if (strings == NULL)
472 {
473 strings = _bfd_coff_read_string_table (abfd);
474 if (strings == NULL)
475 return NULL;
476 }
cdb602b1
NC
477 /* PR 17910: Only check for string overflow if the length has been set.
478 Some DLLs, eg those produced by Visual Studio, may not set the length field. */
479 if (obj_coff_strings_len (abfd) > 0
480 && sym->_n._n_n._n_offset >= obj_coff_strings_len (abfd))
5a3f568b 481 return NULL;
252b5132
RH
482 return strings + sym->_n._n_n._n_offset;
483 }
484}
485
486/* Read in and swap the relocs. This returns a buffer holding the
b34976b6 487 relocs for section SEC in file ABFD. If CACHE is TRUE and
252b5132
RH
488 INTERNAL_RELOCS is NULL, the relocs read in will be saved in case
489 the function is called again. If EXTERNAL_RELOCS is not NULL, it
490 is a buffer large enough to hold the unswapped relocs. If
491 INTERNAL_RELOCS is not NULL, it is a buffer large enough to hold
b34976b6 492 the swapped relocs. If REQUIRE_INTERNAL is TRUE, then the return
252b5132
RH
493 value must be INTERNAL_RELOCS. The function returns NULL on error. */
494
495struct internal_reloc *
c8e7bf0d
NC
496_bfd_coff_read_internal_relocs (bfd *abfd,
497 asection *sec,
498 bfd_boolean cache,
499 bfd_byte *external_relocs,
500 bfd_boolean require_internal,
501 struct internal_reloc *internal_relocs)
252b5132
RH
502{
503 bfd_size_type relsz;
504 bfd_byte *free_external = NULL;
505 struct internal_reloc *free_internal = NULL;
506 bfd_byte *erel;
507 bfd_byte *erel_end;
508 struct internal_reloc *irel;
dc810e39 509 bfd_size_type amt;
252b5132 510
9d7038d3
MS
511 if (sec->reloc_count == 0)
512 return internal_relocs; /* Nothing to do. */
513
252b5132
RH
514 if (coff_section_data (abfd, sec) != NULL
515 && coff_section_data (abfd, sec)->relocs != NULL)
516 {
517 if (! require_internal)
518 return coff_section_data (abfd, sec)->relocs;
519 memcpy (internal_relocs, coff_section_data (abfd, sec)->relocs,
520 sec->reloc_count * sizeof (struct internal_reloc));
521 return internal_relocs;
522 }
523
524 relsz = bfd_coff_relsz (abfd);
525
dc810e39 526 amt = sec->reloc_count * relsz;
252b5132
RH
527 if (external_relocs == NULL)
528 {
a50b1753 529 free_external = (bfd_byte *) bfd_malloc (amt);
9d7038d3 530 if (free_external == NULL)
252b5132
RH
531 goto error_return;
532 external_relocs = free_external;
533 }
534
535 if (bfd_seek (abfd, sec->rel_filepos, SEEK_SET) != 0
dc810e39 536 || bfd_bread (external_relocs, amt, abfd) != amt)
252b5132
RH
537 goto error_return;
538
539 if (internal_relocs == NULL)
540 {
dc810e39
AM
541 amt = sec->reloc_count;
542 amt *= sizeof (struct internal_reloc);
a50b1753 543 free_internal = (struct internal_reloc *) bfd_malloc (amt);
9d7038d3 544 if (free_internal == NULL)
252b5132
RH
545 goto error_return;
546 internal_relocs = free_internal;
547 }
548
549 /* Swap in the relocs. */
550 erel = external_relocs;
551 erel_end = erel + relsz * sec->reloc_count;
552 irel = internal_relocs;
553 for (; erel < erel_end; erel += relsz, irel++)
c8e7bf0d 554 bfd_coff_swap_reloc_in (abfd, (void *) erel, (void *) irel);
252b5132
RH
555
556 if (free_external != NULL)
557 {
558 free (free_external);
559 free_external = NULL;
560 }
561
9ee2139f 562 if (cache && free_internal != NULL)
252b5132 563 {
9ee2139f 564 if (coff_section_data (abfd, sec) == NULL)
252b5132 565 {
9ee2139f
MS
566 amt = sizeof (struct coff_section_tdata);
567 sec->used_by_bfd = bfd_zalloc (abfd, amt);
568 if (sec->used_by_bfd == NULL)
569 goto error_return;
570 coff_section_data (abfd, sec)->contents = NULL;
252b5132 571 }
9ee2139f 572 coff_section_data (abfd, sec)->relocs = free_internal;
252b5132
RH
573 }
574
575 return internal_relocs;
576
577 error_return:
578 if (free_external != NULL)
579 free (free_external);
580 if (free_internal != NULL)
581 free (free_internal);
582 return NULL;
583}
584
585/* Set lineno_count for the output sections of a COFF file. */
586
587int
c8e7bf0d 588coff_count_linenumbers (bfd *abfd)
252b5132
RH
589{
590 unsigned int limit = bfd_get_symcount (abfd);
591 unsigned int i;
592 int total = 0;
593 asymbol **p;
594 asection *s;
595
596 if (limit == 0)
597 {
598 /* This may be from the backend linker, in which case the
07d6d2b8 599 lineno_count in the sections is correct. */
252b5132
RH
600 for (s = abfd->sections; s != NULL; s = s->next)
601 total += s->lineno_count;
602 return total;
603 }
604
605 for (s = abfd->sections; s != NULL; s = s->next)
606 BFD_ASSERT (s->lineno_count == 0);
607
608 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
609 {
610 asymbol *q_maybe = *p;
611
9bd09e22 612 if (bfd_family_coff (bfd_asymbol_bfd (q_maybe)))
252b5132
RH
613 {
614 coff_symbol_type *q = coffsymbol (q_maybe);
615
616 /* The AIX 4.1 compiler can sometimes generate line numbers
07d6d2b8
AM
617 attached to debugging symbols. We try to simply ignore
618 those here. */
252b5132
RH
619 if (q->lineno != NULL
620 && q->symbol.section->owner != NULL)
621 {
622 /* This symbol has line numbers. Increment the owning
07d6d2b8 623 section's linenumber count. */
252b5132
RH
624 alent *l = q->lineno;
625
84c254c6 626 do
252b5132 627 {
84c254c6 628 asection * sec = q->symbol.section->output_section;
b34976b6 629
84c254c6
NC
630 /* Do not try to update fields in read-only sections. */
631 if (! bfd_is_const_section (sec))
632 sec->lineno_count ++;
633
252b5132 634 ++total;
252b5132
RH
635 ++l;
636 }
84c254c6 637 while (l->line_number != 0);
252b5132
RH
638 }
639 }
640 }
641
642 return total;
643}
644
252b5132 645static void
c8e7bf0d
NC
646fixup_symbol_value (bfd *abfd,
647 coff_symbol_type *coff_symbol_ptr,
648 struct internal_syment *syment)
252b5132 649{
c8e7bf0d 650 /* Normalize the symbol flags. */
68ffbac6 651 if (coff_symbol_ptr->symbol.section
ac38308c 652 && bfd_is_com_section (coff_symbol_ptr->symbol.section))
252b5132 653 {
c8e7bf0d 654 /* A common symbol is undefined with a value. */
252b5132
RH
655 syment->n_scnum = N_UNDEF;
656 syment->n_value = coff_symbol_ptr->symbol.value;
657 }
703153b5
ILT
658 else if ((coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) != 0
659 && (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING_RELOC) == 0)
252b5132
RH
660 {
661 syment->n_value = coff_symbol_ptr->symbol.value;
662 }
663 else if (bfd_is_und_section (coff_symbol_ptr->symbol.section))
664 {
665 syment->n_scnum = N_UNDEF;
666 syment->n_value = 0;
667 }
7bb9db4d 668 /* FIXME: Do we need to handle the absolute section here? */
252b5132
RH
669 else
670 {
671 if (coff_symbol_ptr->symbol.section)
672 {
673 syment->n_scnum =
674 coff_symbol_ptr->symbol.section->output_section->target_index;
675
676 syment->n_value = (coff_symbol_ptr->symbol.value
677 + coff_symbol_ptr->symbol.section->output_offset);
678 if (! obj_pe (abfd))
07d6d2b8
AM
679 {
680 syment->n_value += (syment->n_sclass == C_STATLAB)
681 ? coff_symbol_ptr->symbol.section->output_section->lma
682 : coff_symbol_ptr->symbol.section->output_section->vma;
683 }
252b5132
RH
684 }
685 else
686 {
687 BFD_ASSERT (0);
688 /* This can happen, but I don't know why yet (steve@cygnus.com) */
689 syment->n_scnum = N_ABS;
690 syment->n_value = coff_symbol_ptr->symbol.value;
691 }
692 }
693}
694
695/* Run through all the symbols in the symbol table and work out what
696 their indexes into the symbol table will be when output.
697
698 Coff requires that each C_FILE symbol points to the next one in the
699 chain, and that the last one points to the first external symbol. We
700 do that here too. */
701
b34976b6 702bfd_boolean
c8e7bf0d 703coff_renumber_symbols (bfd *bfd_ptr, int *first_undef)
252b5132
RH
704{
705 unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
706 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
707 unsigned int native_index = 0;
c8e7bf0d 708 struct internal_syment *last_file = NULL;
252b5132
RH
709 unsigned int symbol_index;
710
711 /* COFF demands that undefined symbols come after all other symbols.
712 Since we don't need to impose this extra knowledge on all our
713 client programs, deal with that here. Sort the symbol table;
714 just move the undefined symbols to the end, leaving the rest
715 alone. The O'Reilly book says that defined global symbols come
716 at the end before the undefined symbols, so we do that here as
717 well. */
718 /* @@ Do we have some condition we could test for, so we don't always
719 have to do this? I don't think relocatability is quite right, but
720 I'm not certain. [raeburn:19920508.1711EST] */
721 {
722 asymbol **newsyms;
723 unsigned int i;
dc810e39 724 bfd_size_type amt;
252b5132 725
dc810e39 726 amt = sizeof (asymbol *) * ((bfd_size_type) symbol_count + 1);
a50b1753 727 newsyms = (asymbol **) bfd_alloc (bfd_ptr, amt);
252b5132 728 if (!newsyms)
b34976b6 729 return FALSE;
252b5132
RH
730 bfd_ptr->outsymbols = newsyms;
731 for (i = 0; i < symbol_count; i++)
732 if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) != 0
733 || (!bfd_is_und_section (symbol_ptr_ptr[i]->section)
734 && !bfd_is_com_section (symbol_ptr_ptr[i]->section)
735 && ((symbol_ptr_ptr[i]->flags & BSF_FUNCTION) != 0
736 || ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_WEAK))
737 == 0))))
738 *newsyms++ = symbol_ptr_ptr[i];
739
740 for (i = 0; i < symbol_count; i++)
741 if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0
742 && !bfd_is_und_section (symbol_ptr_ptr[i]->section)
743 && (bfd_is_com_section (symbol_ptr_ptr[i]->section)
744 || ((symbol_ptr_ptr[i]->flags & BSF_FUNCTION) == 0
745 && ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_WEAK))
746 != 0))))
747 *newsyms++ = symbol_ptr_ptr[i];
748
749 *first_undef = newsyms - bfd_ptr->outsymbols;
750
751 for (i = 0; i < symbol_count; i++)
752 if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0
753 && bfd_is_und_section (symbol_ptr_ptr[i]->section))
754 *newsyms++ = symbol_ptr_ptr[i];
755 *newsyms = (asymbol *) NULL;
756 symbol_ptr_ptr = bfd_ptr->outsymbols;
757 }
758
759 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
760 {
f4943d82 761 coff_symbol_type *coff_symbol_ptr;
a5c71af8 762
f4943d82 763 coff_symbol_ptr = coff_symbol_from (symbol_ptr_ptr[symbol_index]);
244148ad 764 symbol_ptr_ptr[symbol_index]->udata.i = symbol_index;
252b5132
RH
765 if (coff_symbol_ptr && coff_symbol_ptr->native)
766 {
767 combined_entry_type *s = coff_symbol_ptr->native;
768 int i;
769
a5c71af8 770 BFD_ASSERT (s->is_sym);
252b5132
RH
771 if (s->u.syment.n_sclass == C_FILE)
772 {
c8e7bf0d 773 if (last_file != NULL)
252b5132
RH
774 last_file->n_value = native_index;
775 last_file = &(s->u.syment);
776 }
777 else
c8e7bf0d
NC
778 /* Modify the symbol values according to their section and
779 type. */
780 fixup_symbol_value (bfd_ptr, coff_symbol_ptr, &(s->u.syment));
252b5132 781
252b5132
RH
782 for (i = 0; i < s->u.syment.n_numaux + 1; i++)
783 s[i].offset = native_index++;
784 }
785 else
c8e7bf0d 786 native_index++;
252b5132 787 }
c8e7bf0d 788
252b5132
RH
789 obj_conv_table_size (bfd_ptr) = native_index;
790
b34976b6 791 return TRUE;
252b5132
RH
792}
793
794/* Run thorough the symbol table again, and fix it so that all
795 pointers to entries are changed to the entries' index in the output
796 symbol table. */
797
798void
c8e7bf0d 799coff_mangle_symbols (bfd *bfd_ptr)
252b5132
RH
800{
801 unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
802 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
803 unsigned int symbol_index;
804
805 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
806 {
f4943d82 807 coff_symbol_type *coff_symbol_ptr;
252b5132 808
f4943d82 809 coff_symbol_ptr = coff_symbol_from (symbol_ptr_ptr[symbol_index]);
252b5132
RH
810 if (coff_symbol_ptr && coff_symbol_ptr->native)
811 {
812 int i;
813 combined_entry_type *s = coff_symbol_ptr->native;
814
a5c71af8 815 BFD_ASSERT (s->is_sym);
252b5132
RH
816 if (s->fix_value)
817 {
818 /* FIXME: We should use a union here. */
dc810e39 819 s->u.syment.n_value =
d2df793a
NC
820 (bfd_hostptr_t) ((combined_entry_type *)
821 ((bfd_hostptr_t) s->u.syment.n_value))->offset;
252b5132
RH
822 s->fix_value = 0;
823 }
824 if (s->fix_line)
825 {
826 /* The value is the offset into the line number entries
07d6d2b8
AM
827 for the symbol's section. On output, the symbol's
828 section should be N_DEBUG. */
252b5132
RH
829 s->u.syment.n_value =
830 (coff_symbol_ptr->symbol.section->output_section->line_filepos
831 + s->u.syment.n_value * bfd_coff_linesz (bfd_ptr));
832 coff_symbol_ptr->symbol.section =
833 coff_section_from_bfd_index (bfd_ptr, N_DEBUG);
834 BFD_ASSERT (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING);
835 }
836 for (i = 0; i < s->u.syment.n_numaux; i++)
837 {
838 combined_entry_type *a = s + i + 1;
e9af4700 839
a5c71af8 840 BFD_ASSERT (! a->is_sym);
252b5132
RH
841 if (a->fix_tag)
842 {
843 a->u.auxent.x_sym.x_tagndx.l =
844 a->u.auxent.x_sym.x_tagndx.p->offset;
845 a->fix_tag = 0;
846 }
847 if (a->fix_end)
848 {
849 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l =
850 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p->offset;
851 a->fix_end = 0;
852 }
853 if (a->fix_scnlen)
854 {
855 a->u.auxent.x_csect.x_scnlen.l =
856 a->u.auxent.x_csect.x_scnlen.p->offset;
857 a->fix_scnlen = 0;
858 }
859 }
860 }
861 }
862}
863
864static void
c8e7bf0d
NC
865coff_fix_symbol_name (bfd *abfd,
866 asymbol *symbol,
867 combined_entry_type *native,
868 bfd_size_type *string_size_p,
869 asection **debug_string_section_p,
870 bfd_size_type *debug_string_size_p)
252b5132
RH
871{
872 unsigned int name_length;
873 union internal_auxent *auxent;
874 char *name = (char *) (symbol->name);
875
c8e7bf0d 876 if (name == NULL)
252b5132 877 {
c8e7bf0d 878 /* COFF symbols always have names, so we'll make one up. */
252b5132
RH
879 symbol->name = "strange";
880 name = (char *) symbol->name;
881 }
882 name_length = strlen (name);
883
a5c71af8 884 BFD_ASSERT (native->is_sym);
252b5132
RH
885 if (native->u.syment.n_sclass == C_FILE
886 && native->u.syment.n_numaux > 0)
887 {
692b7d62
ILT
888 unsigned int filnmlen;
889
7f6d05e8
CP
890 if (bfd_coff_force_symnames_in_strings (abfd))
891 {
07d6d2b8 892 native->u.syment._n._n_n._n_offset =
7f6d05e8
CP
893 (*string_size_p + STRING_SIZE_SIZE);
894 native->u.syment._n._n_n._n_zeroes = 0;
895 *string_size_p += 6; /* strlen(".file") + 1 */
896 }
897 else
07d6d2b8 898 strncpy (native->u.syment._n._n_name, ".file", SYMNMLEN);
7f6d05e8 899
a5c71af8 900 BFD_ASSERT (! (native + 1)->is_sym);
252b5132
RH
901 auxent = &(native + 1)->u.auxent;
902
692b7d62
ILT
903 filnmlen = bfd_coff_filnmlen (abfd);
904
252b5132
RH
905 if (bfd_coff_long_filenames (abfd))
906 {
692b7d62 907 if (name_length <= filnmlen)
c8e7bf0d 908 strncpy (auxent->x_file.x_fname, name, filnmlen);
252b5132
RH
909 else
910 {
911 auxent->x_file.x_n.x_offset = *string_size_p + STRING_SIZE_SIZE;
912 auxent->x_file.x_n.x_zeroes = 0;
913 *string_size_p += name_length + 1;
914 }
915 }
916 else
917 {
692b7d62
ILT
918 strncpy (auxent->x_file.x_fname, name, filnmlen);
919 if (name_length > filnmlen)
920 name[filnmlen] = '\0';
252b5132
RH
921 }
922 }
923 else
924 {
7f6d05e8 925 if (name_length <= SYMNMLEN && !bfd_coff_force_symnames_in_strings (abfd))
c8e7bf0d
NC
926 /* This name will fit into the symbol neatly. */
927 strncpy (native->u.syment._n._n_name, symbol->name, SYMNMLEN);
928
252b5132
RH
929 else if (!bfd_coff_symname_in_debug (abfd, &native->u.syment))
930 {
931 native->u.syment._n._n_n._n_offset = (*string_size_p
932 + STRING_SIZE_SIZE);
933 native->u.syment._n._n_n._n_zeroes = 0;
934 *string_size_p += name_length + 1;
935 }
936 else
937 {
dc810e39 938 file_ptr filepos;
7f6d05e8
CP
939 bfd_byte buf[4];
940 int prefix_len = bfd_coff_debug_string_prefix_length (abfd);
252b5132
RH
941
942 /* This name should be written into the .debug section. For
943 some reason each name is preceded by a two byte length
944 and also followed by a null byte. FIXME: We assume that
945 the .debug section has already been created, and that it
946 is large enough. */
947 if (*debug_string_section_p == (asection *) NULL)
948 *debug_string_section_p = bfd_get_section_by_name (abfd, ".debug");
949 filepos = bfd_tell (abfd);
7f6d05e8 950 if (prefix_len == 4)
dc810e39 951 bfd_put_32 (abfd, (bfd_vma) (name_length + 1), buf);
7f6d05e8 952 else
dc810e39 953 bfd_put_16 (abfd, (bfd_vma) (name_length + 1), buf);
7f6d05e8 954
252b5132
RH
955 if (!bfd_set_section_contents (abfd,
956 *debug_string_section_p,
c8e7bf0d 957 (void *) buf,
252b5132 958 (file_ptr) *debug_string_size_p,
7f6d05e8 959 (bfd_size_type) prefix_len)
252b5132
RH
960 || !bfd_set_section_contents (abfd,
961 *debug_string_section_p,
c8e7bf0d 962 (void *) symbol->name,
dc810e39
AM
963 (file_ptr) (*debug_string_size_p
964 + prefix_len),
252b5132
RH
965 (bfd_size_type) name_length + 1))
966 abort ();
967 if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
968 abort ();
244148ad 969 native->u.syment._n._n_n._n_offset =
7f6d05e8 970 *debug_string_size_p + prefix_len;
252b5132 971 native->u.syment._n._n_n._n_zeroes = 0;
7f6d05e8 972 *debug_string_size_p += name_length + 1 + prefix_len;
252b5132
RH
973 }
974 }
975}
976
977/* We need to keep track of the symbol index so that when we write out
978 the relocs we can get the index for a symbol. This method is a
979 hack. FIXME. */
980
981#define set_index(symbol, idx) ((symbol)->udata.i = (idx))
982
983/* Write a symbol out to a COFF file. */
984
b34976b6 985static bfd_boolean
c8e7bf0d
NC
986coff_write_symbol (bfd *abfd,
987 asymbol *symbol,
988 combined_entry_type *native,
989 bfd_vma *written,
990 bfd_size_type *string_size_p,
991 asection **debug_string_section_p,
992 bfd_size_type *debug_string_size_p)
252b5132
RH
993{
994 unsigned int numaux = native->u.syment.n_numaux;
995 int type = native->u.syment.n_type;
a50b1753 996 int n_sclass = (int) native->u.syment.n_sclass;
88e59394
DK
997 asection *output_section = symbol->section->output_section
998 ? symbol->section->output_section
999 : symbol->section;
c8e7bf0d 1000 void * buf;
252b5132
RH
1001 bfd_size_type symesz;
1002
a5c71af8
NC
1003 BFD_ASSERT (native->is_sym);
1004
252b5132
RH
1005 if (native->u.syment.n_sclass == C_FILE)
1006 symbol->flags |= BSF_DEBUGGING;
1007
1008 if (symbol->flags & BSF_DEBUGGING
1009 && bfd_is_abs_section (symbol->section))
c8e7bf0d
NC
1010 native->u.syment.n_scnum = N_DEBUG;
1011
252b5132 1012 else if (bfd_is_abs_section (symbol->section))
c8e7bf0d
NC
1013 native->u.syment.n_scnum = N_ABS;
1014
252b5132 1015 else if (bfd_is_und_section (symbol->section))
c8e7bf0d
NC
1016 native->u.syment.n_scnum = N_UNDEF;
1017
252b5132 1018 else
c8e7bf0d 1019 native->u.syment.n_scnum =
88e59394 1020 output_section->target_index;
252b5132
RH
1021
1022 coff_fix_symbol_name (abfd, symbol, native, string_size_p,
1023 debug_string_section_p, debug_string_size_p);
1024
1025 symesz = bfd_coff_symesz (abfd);
1026 buf = bfd_alloc (abfd, symesz);
1027 if (!buf)
b34976b6 1028 return FALSE;
252b5132 1029 bfd_coff_swap_sym_out (abfd, &native->u.syment, buf);
dc810e39 1030 if (bfd_bwrite (buf, symesz, abfd) != symesz)
b34976b6 1031 return FALSE;
252b5132
RH
1032 bfd_release (abfd, buf);
1033
1034 if (native->u.syment.n_numaux > 0)
1035 {
1036 bfd_size_type auxesz;
1037 unsigned int j;
1038
1039 auxesz = bfd_coff_auxesz (abfd);
1040 buf = bfd_alloc (abfd, auxesz);
1041 if (!buf)
b34976b6 1042 return FALSE;
252b5132
RH
1043 for (j = 0; j < native->u.syment.n_numaux; j++)
1044 {
a5c71af8 1045 BFD_ASSERT (! (native + j + 1)->is_sym);
252b5132
RH
1046 bfd_coff_swap_aux_out (abfd,
1047 &((native + j + 1)->u.auxent),
96d56e9f 1048 type, n_sclass, (int) j,
252b5132
RH
1049 native->u.syment.n_numaux,
1050 buf);
dc810e39 1051 if (bfd_bwrite (buf, auxesz, abfd) != auxesz)
b34976b6 1052 return FALSE;
252b5132
RH
1053 }
1054 bfd_release (abfd, buf);
1055 }
1056
1057 /* Store the index for use when we write out the relocs. */
1058 set_index (symbol, *written);
1059
1060 *written += numaux + 1;
b34976b6 1061 return TRUE;
252b5132
RH
1062}
1063
1064/* Write out a symbol to a COFF file that does not come from a COFF
1065 file originally. This symbol may have been created by the linker,
1066 or we may be linking a non COFF file to a COFF file. */
1067
e7ebb214 1068bfd_boolean
c8e7bf0d
NC
1069coff_write_alien_symbol (bfd *abfd,
1070 asymbol *symbol,
e7ebb214 1071 struct internal_syment *isym,
270f8245 1072 union internal_auxent *iaux,
c8e7bf0d
NC
1073 bfd_vma *written,
1074 bfd_size_type *string_size_p,
1075 asection **debug_string_section_p,
1076 bfd_size_type *debug_string_size_p)
252b5132
RH
1077{
1078 combined_entry_type *native;
e7ebb214 1079 combined_entry_type dummy[2];
88e59394
DK
1080 asection *output_section = symbol->section->output_section
1081 ? symbol->section->output_section
1082 : symbol->section;
07c7ed6d 1083 struct bfd_link_info *link_info = coff_data (abfd)->link_info;
e7ebb214 1084 bfd_boolean ret;
252b5132 1085
07c7ed6d
KT
1086 if ((!link_info || link_info->strip_discarded)
1087 && !bfd_is_abs_section (symbol->section)
1088 && symbol->section->output_section == bfd_abs_section_ptr)
1089 {
1090 symbol->name = "";
e7ebb214 1091 if (isym != NULL)
07d6d2b8 1092 memset (isym, 0, sizeof (*isym));
07c7ed6d
KT
1093 return TRUE;
1094 }
e7ebb214 1095 native = dummy;
a5c71af8
NC
1096 native->is_sym = TRUE;
1097 native[1].is_sym = FALSE;
252b5132
RH
1098 native->u.syment.n_type = T_NULL;
1099 native->u.syment.n_flags = 0;
e7ebb214 1100 native->u.syment.n_numaux = 0;
252b5132
RH
1101 if (bfd_is_und_section (symbol->section))
1102 {
1103 native->u.syment.n_scnum = N_UNDEF;
1104 native->u.syment.n_value = symbol->value;
1105 }
1106 else if (bfd_is_com_section (symbol->section))
1107 {
1108 native->u.syment.n_scnum = N_UNDEF;
1109 native->u.syment.n_value = symbol->value;
1110 }
e7ebb214
JB
1111 else if (symbol->flags & BSF_FILE)
1112 {
1113 native->u.syment.n_scnum = N_DEBUG;
1114 native->u.syment.n_numaux = 1;
1115 }
252b5132
RH
1116 else if (symbol->flags & BSF_DEBUGGING)
1117 {
1118 /* There isn't much point to writing out a debugging symbol
07d6d2b8
AM
1119 unless we are prepared to convert it into COFF debugging
1120 format. So, we just ignore them. We must clobber the symbol
1121 name to keep it from being put in the string table. */
252b5132 1122 symbol->name = "";
e7ebb214 1123 if (isym != NULL)
07d6d2b8 1124 memset (isym, 0, sizeof (*isym));
b34976b6 1125 return TRUE;
252b5132
RH
1126 }
1127 else
1128 {
88e59394 1129 native->u.syment.n_scnum = output_section->target_index;
252b5132
RH
1130 native->u.syment.n_value = (symbol->value
1131 + symbol->section->output_offset);
1132 if (! obj_pe (abfd))
88e59394 1133 native->u.syment.n_value += output_section->vma;
252b5132 1134
08da05b0 1135 /* Copy the any flags from the file header into the symbol.
07d6d2b8 1136 FIXME: Why? */
252b5132 1137 {
f4943d82 1138 coff_symbol_type *c = coff_symbol_from (symbol);
252b5132
RH
1139 if (c != (coff_symbol_type *) NULL)
1140 native->u.syment.n_flags = bfd_asymbol_bfd (&c->symbol)->flags;
1141 }
1142 }
1143
1144 native->u.syment.n_type = 0;
e7ebb214
JB
1145 if (symbol->flags & BSF_FILE)
1146 native->u.syment.n_sclass = C_FILE;
1147 else if (symbol->flags & BSF_LOCAL)
252b5132
RH
1148 native->u.syment.n_sclass = C_STAT;
1149 else if (symbol->flags & BSF_WEAK)
1150 native->u.syment.n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT;
1151 else
1152 native->u.syment.n_sclass = C_EXT;
252b5132 1153
e7ebb214
JB
1154 ret = coff_write_symbol (abfd, symbol, native, written, string_size_p,
1155 debug_string_section_p, debug_string_size_p);
1156 if (isym != NULL)
1157 *isym = native->u.syment;
270f8245
JB
1158 if (iaux != NULL && native->u.syment.n_numaux)
1159 *iaux = native[1].u.auxent;
e7ebb214 1160 return ret;
252b5132
RH
1161}
1162
1163/* Write a native symbol to a COFF file. */
1164
b34976b6 1165static bfd_boolean
c8e7bf0d
NC
1166coff_write_native_symbol (bfd *abfd,
1167 coff_symbol_type *symbol,
1168 bfd_vma *written,
1169 bfd_size_type *string_size_p,
1170 asection **debug_string_section_p,
1171 bfd_size_type *debug_string_size_p)
252b5132
RH
1172{
1173 combined_entry_type *native = symbol->native;
1174 alent *lineno = symbol->lineno;
07c7ed6d
KT
1175 struct bfd_link_info *link_info = coff_data (abfd)->link_info;
1176
1177 if ((!link_info || link_info->strip_discarded)
1178 && !bfd_is_abs_section (symbol->symbol.section)
1179 && symbol->symbol.section->output_section == bfd_abs_section_ptr)
1180 {
1181 symbol->symbol.name = "";
1182 return TRUE;
1183 }
252b5132 1184
a5c71af8 1185 BFD_ASSERT (native->is_sym);
252b5132
RH
1186 /* If this symbol has an associated line number, we must store the
1187 symbol index in the line number field. We also tag the auxent to
1188 point to the right place in the lineno table. */
1189 if (lineno && !symbol->done_lineno && symbol->symbol.section->owner != NULL)
1190 {
1191 unsigned int count = 0;
c8e7bf0d 1192
252b5132
RH
1193 lineno[count].u.offset = *written;
1194 if (native->u.syment.n_numaux)
1195 {
1196 union internal_auxent *a = &((native + 1)->u.auxent);
1197
1198 a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
1199 symbol->symbol.section->output_section->moving_line_filepos;
1200 }
1201
1202 /* Count and relocate all other linenumbers. */
1203 count++;
1204 while (lineno[count].line_number != 0)
1205 {
252b5132
RH
1206 lineno[count].u.offset +=
1207 (symbol->symbol.section->output_section->vma
1208 + symbol->symbol.section->output_offset);
252b5132
RH
1209 count++;
1210 }
b34976b6 1211 symbol->done_lineno = TRUE;
252b5132 1212
84c254c6
NC
1213 if (! bfd_is_const_section (symbol->symbol.section->output_section))
1214 symbol->symbol.section->output_section->moving_line_filepos +=
1215 count * bfd_coff_linesz (abfd);
252b5132
RH
1216 }
1217
1218 return coff_write_symbol (abfd, &(symbol->symbol), native, written,
1219 string_size_p, debug_string_section_p,
1220 debug_string_size_p);
1221}
1222
e144674a 1223static void
52d45da3
AM
1224null_error_handler (const char *fmt ATTRIBUTE_UNUSED,
1225 va_list ap ATTRIBUTE_UNUSED)
e144674a
NC
1226{
1227}
1228
252b5132
RH
1229/* Write out the COFF symbols. */
1230
b34976b6 1231bfd_boolean
c8e7bf0d 1232coff_write_symbols (bfd *abfd)
252b5132
RH
1233{
1234 bfd_size_type string_size;
1235 asection *debug_string_section;
1236 bfd_size_type debug_string_size;
1237 unsigned int i;
1238 unsigned int limit = bfd_get_symcount (abfd);
f075ee0c 1239 bfd_vma written = 0;
252b5132
RH
1240 asymbol **p;
1241
1242 string_size = 0;
1243 debug_string_section = NULL;
1244 debug_string_size = 0;
1245
1246 /* If this target supports long section names, they must be put into
1247 the string table. This is supported by PE. This code must
1248 handle section names just as they are handled in
1249 coff_write_object_contents. */
1250 if (bfd_coff_long_section_names (abfd))
1251 {
1252 asection *o;
1253
1254 for (o = abfd->sections; o != NULL; o = o->next)
1255 {
1256 size_t len;
1257
1258 len = strlen (o->name);
1259 if (len > SCNNMLEN)
1260 string_size += len + 1;
1261 }
1262 }
1263
c8e7bf0d 1264 /* Seek to the right place. */
252b5132 1265 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0)
b34976b6 1266 return FALSE;
252b5132 1267
c8e7bf0d 1268 /* Output all the symbols we have. */
252b5132
RH
1269 written = 0;
1270 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
1271 {
1272 asymbol *symbol = *p;
f4943d82 1273 coff_symbol_type *c_symbol = coff_symbol_from (symbol);
252b5132
RH
1274
1275 if (c_symbol == (coff_symbol_type *) NULL
1276 || c_symbol->native == (combined_entry_type *) NULL)
1277 {
270f8245 1278 if (!coff_write_alien_symbol (abfd, symbol, NULL, NULL, &written,
e7ebb214 1279 &string_size, &debug_string_section,
252b5132 1280 &debug_string_size))
b34976b6 1281 return FALSE;
252b5132
RH
1282 }
1283 else
1284 {
e144674a
NC
1285 if (coff_backend_info (abfd)->_bfd_coff_classify_symbol != NULL)
1286 {
1287 bfd_error_handler_type current_error_handler;
96d56e9f 1288 enum coff_symbol_classification sym_class;
e144674a
NC
1289 unsigned char *n_sclass;
1290
1291 /* Suppress error reporting by bfd_coff_classify_symbol.
1292 Error messages can be generated when we are processing a local
1293 symbol which has no associated section and we do not have to
1294 worry about this, all we need to know is that it is local. */
1295 current_error_handler = bfd_set_error_handler (null_error_handler);
a5c71af8 1296 BFD_ASSERT (c_symbol->native->is_sym);
96d56e9f 1297 sym_class = bfd_coff_classify_symbol (abfd,
a5c71af8 1298 &c_symbol->native->u.syment);
e144674a 1299 (void) bfd_set_error_handler (current_error_handler);
96d56e9f 1300
e144674a
NC
1301 n_sclass = &c_symbol->native->u.syment.n_sclass;
1302
1303 /* If the symbol class has been changed (eg objcopy/ld script/etc)
1304 we cannot retain the existing sclass from the original symbol.
1305 Weak symbols only have one valid sclass, so just set it always.
1306 If it is not local class and should be, set it C_STAT.
1307 If it is global and not classified as global, or if it is
1308 weak (which is also classified as global), set it C_EXT. */
1309
1310 if (symbol->flags & BSF_WEAK)
1311 *n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT;
96d56e9f 1312 else if (symbol->flags & BSF_LOCAL && sym_class != COFF_SYMBOL_LOCAL)
e144674a
NC
1313 *n_sclass = C_STAT;
1314 else if (symbol->flags & BSF_GLOBAL
96d56e9f 1315 && (sym_class != COFF_SYMBOL_GLOBAL
e144674a
NC
1316#ifdef COFF_WITH_PE
1317 || *n_sclass == C_NT_WEAK
1318#endif
1319 || *n_sclass == C_WEAKEXT))
1320 c_symbol->native->u.syment.n_sclass = C_EXT;
1321 }
1322
252b5132
RH
1323 if (!coff_write_native_symbol (abfd, c_symbol, &written,
1324 &string_size, &debug_string_section,
1325 &debug_string_size))
b34976b6 1326 return FALSE;
252b5132
RH
1327 }
1328 }
1329
1330 obj_raw_syment_count (abfd) = written;
1331
c8e7bf0d 1332 /* Now write out strings. */
252b5132
RH
1333 if (string_size != 0)
1334 {
1335 unsigned int size = string_size + STRING_SIZE_SIZE;
1336 bfd_byte buffer[STRING_SIZE_SIZE];
1337
1338#if STRING_SIZE_SIZE == 4
dc810e39 1339 H_PUT_32 (abfd, size, buffer);
252b5132 1340#else
dc810e39 1341 #error Change H_PUT_32
252b5132 1342#endif
c8e7bf0d 1343 if (bfd_bwrite ((void *) buffer, (bfd_size_type) sizeof (buffer), abfd)
dc810e39 1344 != sizeof (buffer))
b34976b6 1345 return FALSE;
252b5132
RH
1346
1347 /* Handle long section names. This code must handle section
1348 names just as they are handled in coff_write_object_contents. */
1349 if (bfd_coff_long_section_names (abfd))
1350 {
1351 asection *o;
1352
1353 for (o = abfd->sections; o != NULL; o = o->next)
1354 {
1355 size_t len;
1356
1357 len = strlen (o->name);
1358 if (len > SCNNMLEN)
1359 {
dc810e39
AM
1360 if (bfd_bwrite (o->name, (bfd_size_type) (len + 1), abfd)
1361 != len + 1)
b34976b6 1362 return FALSE;
252b5132
RH
1363 }
1364 }
1365 }
1366
1367 for (p = abfd->outsymbols, i = 0;
1368 i < limit;
1369 i++, p++)
1370 {
1371 asymbol *q = *p;
1372 size_t name_length = strlen (q->name);
f4943d82 1373 coff_symbol_type *c_symbol = coff_symbol_from (q);
252b5132
RH
1374 size_t maxlen;
1375
1376 /* Figure out whether the symbol name should go in the string
1377 table. Symbol names that are short enough are stored
1378 directly in the syment structure. File names permit a
1379 different, longer, length in the syment structure. On
1380 XCOFF, some symbol names are stored in the .debug section
1381 rather than in the string table. */
1382
1383 if (c_symbol == NULL
1384 || c_symbol->native == NULL)
c8e7bf0d
NC
1385 /* This is not a COFF symbol, so it certainly is not a
1386 file name, nor does it go in the .debug section. */
1387 maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
1388
a5c71af8
NC
1389 else if (! c_symbol->native->is_sym)
1390 maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
1b786873 1391
252b5132
RH
1392 else if (bfd_coff_symname_in_debug (abfd,
1393 &c_symbol->native->u.syment))
c8e7bf0d
NC
1394 /* This symbol name is in the XCOFF .debug section.
1395 Don't write it into the string table. */
1396 maxlen = name_length;
1397
252b5132
RH
1398 else if (c_symbol->native->u.syment.n_sclass == C_FILE
1399 && c_symbol->native->u.syment.n_numaux > 0)
7f6d05e8 1400 {
244148ad 1401 if (bfd_coff_force_symnames_in_strings (abfd))
dc810e39
AM
1402 {
1403 if (bfd_bwrite (".file", (bfd_size_type) 6, abfd) != 6)
b34976b6 1404 return FALSE;
dc810e39 1405 }
7f6d05e8
CP
1406 maxlen = bfd_coff_filnmlen (abfd);
1407 }
252b5132 1408 else
7f6d05e8 1409 maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
252b5132
RH
1410
1411 if (name_length > maxlen)
1412 {
c8e7bf0d 1413 if (bfd_bwrite ((void *) (q->name), (bfd_size_type) name_length + 1,
dc810e39 1414 abfd) != name_length + 1)
b34976b6 1415 return FALSE;
252b5132
RH
1416 }
1417 }
1418 }
1419 else
1420 {
1421 /* We would normally not write anything here, but we'll write
07d6d2b8
AM
1422 out 4 so that any stupid coff reader which tries to read the
1423 string table even when there isn't one won't croak. */
252b5132
RH
1424 unsigned int size = STRING_SIZE_SIZE;
1425 bfd_byte buffer[STRING_SIZE_SIZE];
1426
1427#if STRING_SIZE_SIZE == 4
dc810e39 1428 H_PUT_32 (abfd, size, buffer);
252b5132 1429#else
dc810e39 1430 #error Change H_PUT_32
252b5132 1431#endif
c8e7bf0d 1432 if (bfd_bwrite ((void *) buffer, (bfd_size_type) STRING_SIZE_SIZE, abfd)
252b5132 1433 != STRING_SIZE_SIZE)
b34976b6 1434 return FALSE;
252b5132
RH
1435 }
1436
1437 /* Make sure the .debug section was created to be the correct size.
1438 We should create it ourselves on the fly, but we don't because
1439 BFD won't let us write to any section until we know how large all
1440 the sections are. We could still do it by making another pass
1441 over the symbols. FIXME. */
1442 BFD_ASSERT (debug_string_size == 0
1443 || (debug_string_section != (asection *) NULL
1444 && (BFD_ALIGN (debug_string_size,
1445 1 << debug_string_section->alignment_power)
eea6121a 1446 == debug_string_section->size)));
252b5132 1447
b34976b6 1448 return TRUE;
252b5132
RH
1449}
1450
b34976b6 1451bfd_boolean
c8e7bf0d 1452coff_write_linenumbers (bfd *abfd)
252b5132
RH
1453{
1454 asection *s;
1455 bfd_size_type linesz;
c8e7bf0d 1456 void * buff;
252b5132
RH
1457
1458 linesz = bfd_coff_linesz (abfd);
1459 buff = bfd_alloc (abfd, linesz);
1460 if (!buff)
b34976b6 1461 return FALSE;
252b5132
RH
1462 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
1463 {
1464 if (s->lineno_count)
1465 {
1466 asymbol **q = abfd->outsymbols;
1467 if (bfd_seek (abfd, s->line_filepos, SEEK_SET) != 0)
b34976b6 1468 return FALSE;
c8e7bf0d 1469 /* Find all the linenumbers in this section. */
252b5132
RH
1470 while (*q)
1471 {
1472 asymbol *p = *q;
1473 if (p->section->output_section == s)
1474 {
1475 alent *l =
1476 BFD_SEND (bfd_asymbol_bfd (p), _get_lineno,
1477 (bfd_asymbol_bfd (p), p));
1478 if (l)
1479 {
c8e7bf0d 1480 /* Found a linenumber entry, output. */
252b5132 1481 struct internal_lineno out;
a5c71af8 1482
c8e7bf0d 1483 memset ((void *) & out, 0, sizeof (out));
252b5132
RH
1484 out.l_lnno = 0;
1485 out.l_addr.l_symndx = l->u.offset;
1486 bfd_coff_swap_lineno_out (abfd, &out, buff);
dc810e39
AM
1487 if (bfd_bwrite (buff, (bfd_size_type) linesz, abfd)
1488 != linesz)
b34976b6 1489 return FALSE;
252b5132
RH
1490 l++;
1491 while (l->line_number)
1492 {
1493 out.l_lnno = l->line_number;
1494 out.l_addr.l_symndx = l->u.offset;
1495 bfd_coff_swap_lineno_out (abfd, &out, buff);
dc810e39
AM
1496 if (bfd_bwrite (buff, (bfd_size_type) linesz, abfd)
1497 != linesz)
b34976b6 1498 return FALSE;
252b5132
RH
1499 l++;
1500 }
1501 }
1502 }
1503 q++;
1504 }
1505 }
1506 }
1507 bfd_release (abfd, buff);
b34976b6 1508 return TRUE;
252b5132
RH
1509}
1510
252b5132 1511alent *
c8e7bf0d 1512coff_get_lineno (bfd *ignore_abfd ATTRIBUTE_UNUSED, asymbol *symbol)
252b5132
RH
1513{
1514 return coffsymbol (symbol)->lineno;
1515}
1516
252b5132
RH
1517/* This function transforms the offsets into the symbol table into
1518 pointers to syments. */
1519
1520static void
c8e7bf0d
NC
1521coff_pointerize_aux (bfd *abfd,
1522 combined_entry_type *table_base,
1523 combined_entry_type *symbol,
1524 unsigned int indaux,
334d4ced
NC
1525 combined_entry_type *auxent,
1526 combined_entry_type *table_end)
252b5132
RH
1527{
1528 unsigned int type = symbol->u.syment.n_type;
96d56e9f 1529 unsigned int n_sclass = symbol->u.syment.n_sclass;
252b5132 1530
a5c71af8 1531 BFD_ASSERT (symbol->is_sym);
252b5132
RH
1532 if (coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook)
1533 {
1534 if ((*coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook)
1535 (abfd, table_base, symbol, indaux, auxent))
1536 return;
1537 }
1538
c8e7bf0d 1539 /* Don't bother if this is a file or a section. */
96d56e9f 1540 if (n_sclass == C_STAT && type == T_NULL)
252b5132 1541 return;
96d56e9f 1542 if (n_sclass == C_FILE)
252b5132
RH
1543 return;
1544
a5c71af8 1545 BFD_ASSERT (! auxent->is_sym);
c8e7bf0d
NC
1546 /* Otherwise patch up. */
1547#define N_TMASK coff_data (abfd)->local_n_tmask
252b5132 1548#define N_BTSHFT coff_data (abfd)->local_n_btshft
68ffbac6 1549
96d56e9f
NC
1550 if ((ISFCN (type) || ISTAG (n_sclass) || n_sclass == C_BLOCK
1551 || n_sclass == C_FCN)
e9af4700
NC
1552 && auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l > 0
1553 && auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l
334d4ced
NC
1554 < (long) obj_raw_syment_count (abfd)
1555 && table_base + auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l
1556 < table_end)
252b5132
RH
1557 {
1558 auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p =
1559 table_base + auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
1560 auxent->fix_end = 1;
1561 }
334d4ced 1562
252b5132
RH
1563 /* A negative tagndx is meaningless, but the SCO 3.2v4 cc can
1564 generate one, so we must be careful to ignore it. */
eb77f6a4 1565 if ((unsigned long) auxent->u.auxent.x_sym.x_tagndx.l
334d4ced
NC
1566 < obj_raw_syment_count (abfd)
1567 && table_base + auxent->u.auxent.x_sym.x_tagndx.l < table_end)
252b5132
RH
1568 {
1569 auxent->u.auxent.x_sym.x_tagndx.p =
1570 table_base + auxent->u.auxent.x_sym.x_tagndx.l;
1571 auxent->fix_tag = 1;
1572 }
1573}
1574
1575/* Allocate space for the ".debug" section, and read it.
1576 We did not read the debug section until now, because
244148ad 1577 we didn't want to go to the trouble until someone needed it. */
252b5132
RH
1578
1579static char *
5a3f568b 1580build_debug_section (bfd *abfd, asection ** sect_return)
252b5132
RH
1581{
1582 char *debug_section;
dc810e39
AM
1583 file_ptr position;
1584 bfd_size_type sec_size;
252b5132
RH
1585
1586 asection *sect = bfd_get_section_by_name (abfd, ".debug");
1587
1588 if (!sect)
1589 {
1590 bfd_set_error (bfd_error_no_debug_section);
1591 return NULL;
1592 }
1593
eea6121a 1594 sec_size = sect->size;
a50b1753 1595 debug_section = (char *) bfd_alloc (abfd, sec_size);
252b5132
RH
1596 if (debug_section == NULL)
1597 return NULL;
1598
244148ad 1599 /* Seek to the beginning of the `.debug' section and read it.
252b5132
RH
1600 Save the current position first; it is needed by our caller.
1601 Then read debug section and reset the file pointer. */
1602
1603 position = bfd_tell (abfd);
1604 if (bfd_seek (abfd, sect->filepos, SEEK_SET) != 0
dc810e39 1605 || bfd_bread (debug_section, sec_size, abfd) != sec_size
252b5132
RH
1606 || bfd_seek (abfd, position, SEEK_SET) != 0)
1607 return NULL;
5a3f568b
NC
1608
1609 * sect_return = sect;
252b5132
RH
1610 return debug_section;
1611}
1612
252b5132
RH
1613/* Return a pointer to a malloc'd copy of 'name'. 'name' may not be
1614 \0-terminated, but will not exceed 'maxlen' characters. The copy *will*
1615 be \0-terminated. */
c8e7bf0d 1616
252b5132 1617static char *
c8e7bf0d 1618copy_name (bfd *abfd, char *name, size_t maxlen)
252b5132 1619{
dc810e39 1620 size_t len;
252b5132
RH
1621 char *newname;
1622
1623 for (len = 0; len < maxlen; ++len)
c8e7bf0d
NC
1624 if (name[len] == '\0')
1625 break;
1626
a50b1753 1627 if ((newname = (char *) bfd_alloc (abfd, (bfd_size_type) len + 1)) == NULL)
c8e7bf0d 1628 return NULL;
252b5132 1629
252b5132
RH
1630 strncpy (newname, name, len);
1631 newname[len] = '\0';
1632 return newname;
1633}
1634
1635/* Read in the external symbols. */
1636
b34976b6 1637bfd_boolean
c8e7bf0d 1638_bfd_coff_get_external_symbols (bfd *abfd)
252b5132
RH
1639{
1640 bfd_size_type symesz;
dc810e39 1641 bfd_size_type size;
c8e7bf0d 1642 void * syms;
252b5132
RH
1643
1644 if (obj_coff_external_syms (abfd) != NULL)
b34976b6 1645 return TRUE;
252b5132
RH
1646
1647 symesz = bfd_coff_symesz (abfd);
1648
1649 size = obj_raw_syment_count (abfd) * symesz;
353c5574
MS
1650 if (size == 0)
1651 return TRUE;
6cee8979
NC
1652 /* Check for integer overflow and for unreasonable symbol counts. */
1653 if (size < obj_raw_syment_count (abfd)
1654 || (bfd_get_file_size (abfd) > 0
1655 && size > bfd_get_file_size (abfd)))
07d6d2b8 1656
6cee8979 1657 {
2dcf00ce
AM
1658 _bfd_error_handler (_("%pB: corrupt symbol count: %#" PRIx64 ""),
1659 abfd, (uint64_t) obj_raw_syment_count (abfd));
6cee8979
NC
1660 return FALSE;
1661 }
252b5132 1662
c8e7bf0d 1663 syms = bfd_malloc (size);
353c5574 1664 if (syms == NULL)
98f02962
NC
1665 {
1666 /* PR 21013: Provide an error message when the alloc fails. */
2dcf00ce
AM
1667 _bfd_error_handler (_("%pB: not enough memory to allocate space "
1668 "for %#" PRIx64 " symbols of size %#" PRIx64),
1669 abfd, (uint64_t) obj_raw_syment_count (abfd),
1670 (uint64_t) symesz);
98f02962
NC
1671 return FALSE;
1672 }
252b5132
RH
1673
1674 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
dc810e39 1675 || bfd_bread (syms, size, abfd) != size)
252b5132
RH
1676 {
1677 if (syms != NULL)
1678 free (syms);
b34976b6 1679 return FALSE;
252b5132
RH
1680 }
1681
1682 obj_coff_external_syms (abfd) = syms;
b34976b6 1683 return TRUE;
252b5132
RH
1684}
1685
1686/* Read in the external strings. The strings are not loaded until
1687 they are needed. This is because we have no simple way of
5a3f568b
NC
1688 detecting a missing string table in an archive. If the strings
1689 are loaded then the STRINGS and STRINGS_LEN fields in the
1690 coff_tdata structure will be set. */
252b5132
RH
1691
1692const char *
c8e7bf0d 1693_bfd_coff_read_string_table (bfd *abfd)
252b5132
RH
1694{
1695 char extstrsize[STRING_SIZE_SIZE];
dc810e39 1696 bfd_size_type strsize;
252b5132 1697 char *strings;
dc810e39 1698 file_ptr pos;
252b5132
RH
1699
1700 if (obj_coff_strings (abfd) != NULL)
1701 return obj_coff_strings (abfd);
1702
1703 if (obj_sym_filepos (abfd) == 0)
1704 {
1705 bfd_set_error (bfd_error_no_symbols);
1706 return NULL;
1707 }
1708
dc810e39
AM
1709 pos = obj_sym_filepos (abfd);
1710 pos += obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd);
1711 if (bfd_seek (abfd, pos, SEEK_SET) != 0)
252b5132 1712 return NULL;
244148ad 1713
dc810e39
AM
1714 if (bfd_bread (extstrsize, (bfd_size_type) sizeof extstrsize, abfd)
1715 != sizeof extstrsize)
252b5132
RH
1716 {
1717 if (bfd_get_error () != bfd_error_file_truncated)
1718 return NULL;
1719
1720 /* There is no string table. */
1721 strsize = STRING_SIZE_SIZE;
1722 }
1723 else
1724 {
1725#if STRING_SIZE_SIZE == 4
dc810e39 1726 strsize = H_GET_32 (abfd, extstrsize);
252b5132 1727#else
dc810e39 1728 #error Change H_GET_32
252b5132
RH
1729#endif
1730 }
1731
b0029dce 1732 if (strsize < STRING_SIZE_SIZE || strsize > bfd_get_file_size (abfd))
252b5132 1733 {
4eca0228 1734 _bfd_error_handler
695344c0 1735 /* xgettext: c-format */
2dcf00ce 1736 (_("%pB: bad string table size %" PRIu64), abfd, (uint64_t) strsize);
252b5132
RH
1737 bfd_set_error (bfd_error_bad_value);
1738 return NULL;
1739 }
07d6d2b8 1740
36e9d67b 1741 strings = (char *) bfd_malloc (strsize + 1);
cd11f78f
AC
1742 if (strings == NULL)
1743 return NULL;
1744
36e9d67b
NC
1745 /* PR 17521 file: 079-54929-0.004.
1746 A corrupt file could contain an index that points into the first
1747 STRING_SIZE_SIZE bytes of the string table, so make sure that
1748 they are zero. */
1749 memset (strings, 0, STRING_SIZE_SIZE);
1750
dc810e39 1751 if (bfd_bread (strings + STRING_SIZE_SIZE, strsize - STRING_SIZE_SIZE, abfd)
252b5132
RH
1752 != strsize - STRING_SIZE_SIZE)
1753 {
1754 free (strings);
1755 return NULL;
1756 }
1757
1758 obj_coff_strings (abfd) = strings;
5a3f568b 1759 obj_coff_strings_len (abfd) = strsize;
36e9d67b
NC
1760 /* Terminate the string table, just in case. */
1761 strings[strsize] = 0;
252b5132
RH
1762 return strings;
1763}
1764
1765/* Free up the external symbols and strings read from a COFF file. */
1766
b34976b6 1767bfd_boolean
c8e7bf0d 1768_bfd_coff_free_symbols (bfd *abfd)
252b5132 1769{
ee357486
NC
1770 if (! bfd_family_coff (abfd))
1771 return FALSE;
1772
252b5132
RH
1773 if (obj_coff_external_syms (abfd) != NULL
1774 && ! obj_coff_keep_syms (abfd))
1775 {
1776 free (obj_coff_external_syms (abfd));
1777 obj_coff_external_syms (abfd) = NULL;
1778 }
ee357486 1779
252b5132
RH
1780 if (obj_coff_strings (abfd) != NULL
1781 && ! obj_coff_keep_strings (abfd))
1782 {
1783 free (obj_coff_strings (abfd));
1784 obj_coff_strings (abfd) = NULL;
5a3f568b 1785 obj_coff_strings_len (abfd) = 0;
252b5132 1786 }
ee357486 1787
b34976b6 1788 return TRUE;
252b5132
RH
1789}
1790
1791/* Read a symbol table into freshly bfd_allocated memory, swap it, and
1792 knit the symbol names into a normalized form. By normalized here I
1793 mean that all symbols have an n_offset pointer that points to a null-
1794 terminated string. */
1795
1796combined_entry_type *
c8e7bf0d 1797coff_get_normalized_symtab (bfd *abfd)
252b5132
RH
1798{
1799 combined_entry_type *internal;
1800 combined_entry_type *internal_ptr;
1801 combined_entry_type *symbol_ptr;
1802 combined_entry_type *internal_end;
dc810e39 1803 size_t symesz;
252b5132
RH
1804 char *raw_src;
1805 char *raw_end;
1806 const char *string_table = NULL;
5a3f568b
NC
1807 asection * debug_sec = NULL;
1808 char *debug_sec_data = NULL;
dc810e39 1809 bfd_size_type size;
252b5132
RH
1810
1811 if (obj_raw_syments (abfd) != NULL)
1812 return obj_raw_syments (abfd);
1813
201159ec
NC
1814 if (! _bfd_coff_get_external_symbols (abfd))
1815 return NULL;
1816
40572405 1817 size = obj_raw_syment_count (abfd) * sizeof (combined_entry_type);
6cee8979
NC
1818 /* Check for integer overflow. */
1819 if (size < obj_raw_syment_count (abfd))
1820 return NULL;
a50b1753 1821 internal = (combined_entry_type *) bfd_zalloc (abfd, size);
252b5132
RH
1822 if (internal == NULL && size != 0)
1823 return NULL;
1824 internal_end = internal + obj_raw_syment_count (abfd);
1b786873 1825
252b5132
RH
1826 raw_src = (char *) obj_coff_external_syms (abfd);
1827
c8e7bf0d 1828 /* Mark the end of the symbols. */
252b5132
RH
1829 symesz = bfd_coff_symesz (abfd);
1830 raw_end = (char *) raw_src + obj_raw_syment_count (abfd) * symesz;
1831
1832 /* FIXME SOMEDAY. A string table size of zero is very weird, but
1833 probably possible. If one shows up, it will probably kill us. */
1834
c8e7bf0d 1835 /* Swap all the raw entries. */
252b5132
RH
1836 for (internal_ptr = internal;
1837 raw_src < raw_end;
1838 raw_src += symesz, internal_ptr++)
1839 {
252b5132 1840 unsigned int i;
7e760b06 1841
c8e7bf0d
NC
1842 bfd_coff_swap_sym_in (abfd, (void *) raw_src,
1843 (void *) & internal_ptr->u.syment);
252b5132 1844 symbol_ptr = internal_ptr;
a5c71af8 1845 internal_ptr->is_sym = TRUE;
252b5132 1846
0a9d414a
NC
1847 /* PR 17512: file: 1353-1166-0.004. */
1848 if (symbol_ptr->u.syment.n_sclass == C_FILE
1849 && symbol_ptr->u.syment.n_numaux > 0
1850 && raw_src + symesz + symbol_ptr->u.syment.n_numaux
fc42baf3 1851 * symesz > raw_end)
0a9d414a
NC
1852 {
1853 bfd_release (abfd, internal);
1854 return NULL;
1855 }
1856
252b5132
RH
1857 for (i = 0;
1858 i < symbol_ptr->u.syment.n_numaux;
1859 i++)
1860 {
1861 internal_ptr++;
7e760b06
NC
1862 /* PR 17512: Prevent buffer overrun. */
1863 if (internal_ptr >= internal_end)
0a9d414a
NC
1864 {
1865 bfd_release (abfd, internal);
1866 return NULL;
1867 }
7e760b06 1868
252b5132 1869 raw_src += symesz;
c8e7bf0d 1870 bfd_coff_swap_aux_in (abfd, (void *) raw_src,
252b5132
RH
1871 symbol_ptr->u.syment.n_type,
1872 symbol_ptr->u.syment.n_sclass,
dc810e39 1873 (int) i, symbol_ptr->u.syment.n_numaux,
252b5132 1874 &(internal_ptr->u.auxent));
0a9d414a 1875
a5c71af8 1876 internal_ptr->is_sym = FALSE;
252b5132 1877 coff_pointerize_aux (abfd, internal, symbol_ptr, i,
334d4ced 1878 internal_ptr, internal_end);
252b5132
RH
1879 }
1880 }
1881
1882 /* Free the raw symbols, but not the strings (if we have them). */
b34976b6 1883 obj_coff_keep_strings (abfd) = TRUE;
252b5132
RH
1884 if (! _bfd_coff_free_symbols (abfd))
1885 return NULL;
1886
1887 for (internal_ptr = internal; internal_ptr < internal_end;
1888 internal_ptr++)
1889 {
a5c71af8
NC
1890 BFD_ASSERT (internal_ptr->is_sym);
1891
252b5132
RH
1892 if (internal_ptr->u.syment.n_sclass == C_FILE
1893 && internal_ptr->u.syment.n_numaux > 0)
1894 {
a5c71af8
NC
1895 combined_entry_type * aux = internal_ptr + 1;
1896
c8e7bf0d
NC
1897 /* Make a file symbol point to the name in the auxent, since
1898 the text ".file" is redundant. */
a5c71af8
NC
1899 BFD_ASSERT (! aux->is_sym);
1900
1901 if (aux->u.auxent.x_file.x_n.x_zeroes == 0)
252b5132 1902 {
c8e7bf0d 1903 /* The filename is a long one, point into the string table. */
252b5132
RH
1904 if (string_table == NULL)
1905 {
1906 string_table = _bfd_coff_read_string_table (abfd);
1907 if (string_table == NULL)
1908 return NULL;
1909 }
a5c71af8
NC
1910
1911 if ((bfd_size_type)(aux->u.auxent.x_file.x_n.x_offset)
5a3f568b
NC
1912 >= obj_coff_strings_len (abfd))
1913 internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) _("<corrupt>");
1914 else
1915 internal_ptr->u.syment._n._n_n._n_offset =
a5c71af8 1916 (bfd_hostptr_t) (string_table + (aux->u.auxent.x_file.x_n.x_offset));
252b5132
RH
1917 }
1918 else
1919 {
7bb9db4d 1920 /* Ordinary short filename, put into memory anyway. The
07d6d2b8
AM
1921 Microsoft PE tools sometimes store a filename in
1922 multiple AUX entries. */
ec0ef80e
DD
1923 if (internal_ptr->u.syment.n_numaux > 1
1924 && coff_data (abfd)->pe)
c8e7bf0d 1925 internal_ptr->u.syment._n._n_n._n_offset =
a5c71af8
NC
1926 (bfd_hostptr_t)
1927 copy_name (abfd,
1928 aux->u.auxent.x_file.x_fname,
1929 internal_ptr->u.syment.n_numaux * symesz);
ec0ef80e 1930 else
c8e7bf0d 1931 internal_ptr->u.syment._n._n_n._n_offset =
d2df793a 1932 ((bfd_hostptr_t)
c8e7bf0d 1933 copy_name (abfd,
a5c71af8 1934 aux->u.auxent.x_file.x_fname,
c8e7bf0d 1935 (size_t) bfd_coff_filnmlen (abfd)));
252b5132
RH
1936 }
1937 }
1938 else
1939 {
1940 if (internal_ptr->u.syment._n._n_n._n_zeroes != 0)
1941 {
1942 /* This is a "short" name. Make it long. */
dc810e39
AM
1943 size_t i;
1944 char *newstring;
252b5132 1945
c8e7bf0d 1946 /* Find the length of this string without walking into memory
07d6d2b8 1947 that isn't ours. */
252b5132 1948 for (i = 0; i < 8; ++i)
dc810e39
AM
1949 if (internal_ptr->u.syment._n._n_name[i] == '\0')
1950 break;
252b5132 1951
a50b1753 1952 newstring = (char *) bfd_zalloc (abfd, (bfd_size_type) (i + 1));
dc810e39 1953 if (newstring == NULL)
c8e7bf0d 1954 return NULL;
dc810e39 1955 strncpy (newstring, internal_ptr->u.syment._n._n_name, i);
d2df793a 1956 internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) newstring;
252b5132
RH
1957 internal_ptr->u.syment._n._n_n._n_zeroes = 0;
1958 }
1959 else if (internal_ptr->u.syment._n._n_n._n_offset == 0)
649aeae3 1960 internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) "";
252b5132
RH
1961 else if (!bfd_coff_symname_in_debug (abfd, &internal_ptr->u.syment))
1962 {
1963 /* Long name already. Point symbol at the string in the
07d6d2b8 1964 table. */
252b5132
RH
1965 if (string_table == NULL)
1966 {
1967 string_table = _bfd_coff_read_string_table (abfd);
1968 if (string_table == NULL)
1969 return NULL;
1970 }
36e9d67b
NC
1971 if (internal_ptr->u.syment._n._n_n._n_offset >= obj_coff_strings_len (abfd)
1972 || string_table + internal_ptr->u.syment._n._n_n._n_offset < string_table)
5a3f568b
NC
1973 internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) _("<corrupt>");
1974 else
1975 internal_ptr->u.syment._n._n_n._n_offset =
1976 ((bfd_hostptr_t)
1977 (string_table
1978 + internal_ptr->u.syment._n._n_n._n_offset));
252b5132
RH
1979 }
1980 else
1981 {
1982 /* Long name in debug section. Very similar. */
5a3f568b
NC
1983 if (debug_sec_data == NULL)
1984 debug_sec_data = build_debug_section (abfd, & debug_sec);
1985 if (debug_sec_data != NULL)
1986 {
1987 BFD_ASSERT (debug_sec != NULL);
1988 /* PR binutils/17512: Catch out of range offsets into the debug data. */
36e9d67b
NC
1989 if (internal_ptr->u.syment._n._n_n._n_offset > debug_sec->size
1990 || debug_sec_data + internal_ptr->u.syment._n._n_n._n_offset < debug_sec_data)
5a3f568b
NC
1991 internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) _("<corrupt>");
1992 else
1993 internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t)
1994 (debug_sec_data + internal_ptr->u.syment._n._n_n._n_offset);
1995 }
1996 else
1997 internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) "";
252b5132
RH
1998 }
1999 }
2000 internal_ptr += internal_ptr->u.syment.n_numaux;
2001 }
2002
2003 obj_raw_syments (abfd) = internal;
2004 BFD_ASSERT (obj_raw_syment_count (abfd)
2005 == (unsigned int) (internal_ptr - internal));
2006
c8e7bf0d
NC
2007 return internal;
2008}
252b5132 2009
7a6e0d89
AM
2010#if GCC_VERSION >= 4003
2011# pragma GCC diagnostic push
2012# pragma GCC diagnostic ignored "-Wtype-limits"
2013#endif
252b5132 2014long
c8e7bf0d 2015coff_get_reloc_upper_bound (bfd *abfd, sec_ptr asect)
252b5132
RH
2016{
2017 if (bfd_get_format (abfd) != bfd_object)
2018 {
2019 bfd_set_error (bfd_error_invalid_operation);
2020 return -1;
2021 }
7a6e0d89
AM
2022 if (asect->reloc_count >= LONG_MAX / sizeof (arelent *))
2023 {
2024 bfd_set_error (bfd_error_file_too_big);
2025 return -1;
2026 }
252b5132
RH
2027 return (asect->reloc_count + 1) * sizeof (arelent *);
2028}
7a6e0d89
AM
2029#if GCC_VERSION >= 4003
2030# pragma GCC diagnostic pop
2031#endif
252b5132
RH
2032
2033asymbol *
c8e7bf0d 2034coff_make_empty_symbol (bfd *abfd)
252b5132 2035{
dc810e39 2036 bfd_size_type amt = sizeof (coff_symbol_type);
d3ce72d0 2037 coff_symbol_type *new_symbol = (coff_symbol_type *) bfd_zalloc (abfd, amt);
c8e7bf0d 2038
d3ce72d0 2039 if (new_symbol == NULL)
c8e7bf0d 2040 return NULL;
d3ce72d0 2041 new_symbol->symbol.section = 0;
a5c71af8 2042 new_symbol->native = NULL;
d3ce72d0
NC
2043 new_symbol->lineno = NULL;
2044 new_symbol->done_lineno = FALSE;
2045 new_symbol->symbol.the_bfd = abfd;
c8e7bf0d 2046
d3ce72d0 2047 return & new_symbol->symbol;
252b5132
RH
2048}
2049
2050/* Make a debugging symbol. */
2051
2052asymbol *
c8e7bf0d
NC
2053coff_bfd_make_debug_symbol (bfd *abfd,
2054 void * ptr ATTRIBUTE_UNUSED,
2055 unsigned long sz ATTRIBUTE_UNUSED)
252b5132 2056{
dc810e39 2057 bfd_size_type amt = sizeof (coff_symbol_type);
d3ce72d0 2058 coff_symbol_type *new_symbol = (coff_symbol_type *) bfd_alloc (abfd, amt);
c8e7bf0d 2059
d3ce72d0 2060 if (new_symbol == NULL)
c8e7bf0d 2061 return NULL;
252b5132
RH
2062 /* @@ The 10 is a guess at a plausible maximum number of aux entries
2063 (but shouldn't be a constant). */
dc810e39 2064 amt = sizeof (combined_entry_type) * 10;
d3ce72d0
NC
2065 new_symbol->native = (combined_entry_type *) bfd_zalloc (abfd, amt);
2066 if (!new_symbol->native)
c8e7bf0d 2067 return NULL;
a5c71af8 2068 new_symbol->native->is_sym = TRUE;
d3ce72d0
NC
2069 new_symbol->symbol.section = bfd_abs_section_ptr;
2070 new_symbol->symbol.flags = BSF_DEBUGGING;
2071 new_symbol->lineno = NULL;
2072 new_symbol->done_lineno = FALSE;
2073 new_symbol->symbol.the_bfd = abfd;
68ffbac6 2074
d3ce72d0 2075 return & new_symbol->symbol;
252b5132
RH
2076}
2077
252b5132 2078void
c8e7bf0d 2079coff_get_symbol_info (bfd *abfd, asymbol *symbol, symbol_info *ret)
252b5132
RH
2080{
2081 bfd_symbol_info (symbol, ret);
c8e7bf0d 2082
252b5132 2083 if (coffsymbol (symbol)->native != NULL
a5c71af8
NC
2084 && coffsymbol (symbol)->native->fix_value
2085 && coffsymbol (symbol)->native->is_sym)
c8e7bf0d 2086 ret->value = coffsymbol (symbol)->native->u.syment.n_value -
d2df793a 2087 (bfd_hostptr_t) obj_raw_syments (abfd);
252b5132
RH
2088}
2089
252b5132
RH
2090/* Print out information about COFF symbol. */
2091
2092void
c8e7bf0d
NC
2093coff_print_symbol (bfd *abfd,
2094 void * filep,
2095 asymbol *symbol,
2096 bfd_print_symbol_type how)
252b5132 2097{
c8e7bf0d 2098 FILE * file = (FILE *) filep;
252b5132
RH
2099
2100 switch (how)
2101 {
2102 case bfd_print_symbol_name:
2103 fprintf (file, "%s", symbol->name);
2104 break;
2105
2106 case bfd_print_symbol_more:
2107 fprintf (file, "coff %s %s",
2108 coffsymbol (symbol)->native ? "n" : "g",
2109 coffsymbol (symbol)->lineno ? "l" : " ");
2110 break;
2111
2112 case bfd_print_symbol_all:
2113 if (coffsymbol (symbol)->native)
2114 {
beb1bf64 2115 bfd_vma val;
252b5132
RH
2116 unsigned int aux;
2117 combined_entry_type *combined = coffsymbol (symbol)->native;
2118 combined_entry_type *root = obj_raw_syments (abfd);
2119 struct lineno_cache_entry *l = coffsymbol (symbol)->lineno;
2120
2121 fprintf (file, "[%3ld]", (long) (combined - root));
2122
f41e4712
NC
2123 /* PR 17512: file: 079-33786-0.001:0.1. */
2124 if (combined < obj_raw_syments (abfd)
2125 || combined >= obj_raw_syments (abfd) + obj_raw_syment_count (abfd))
2126 {
2127 fprintf (file, _("<corrupt info> %s"), symbol->name);
2128 break;
2129 }
2130
a5c71af8 2131 BFD_ASSERT (combined->is_sym);
252b5132 2132 if (! combined->fix_value)
beb1bf64 2133 val = (bfd_vma) combined->u.syment.n_value;
252b5132 2134 else
d2df793a 2135 val = combined->u.syment.n_value - (bfd_hostptr_t) root;
252b5132 2136
7920ce38 2137 fprintf (file, "(sec %2d)(fl 0x%02x)(ty %3x)(scl %3d) (nx %d) 0x",
252b5132
RH
2138 combined->u.syment.n_scnum,
2139 combined->u.syment.n_flags,
2140 combined->u.syment.n_type,
2141 combined->u.syment.n_sclass,
745c12f8 2142 combined->u.syment.n_numaux);
ebf12fbe 2143 bfd_fprintf_vma (abfd, file, val);
745c12f8 2144 fprintf (file, " %s", symbol->name);
252b5132
RH
2145
2146 for (aux = 0; aux < combined->u.syment.n_numaux; aux++)
2147 {
2148 combined_entry_type *auxp = combined + aux + 1;
2149 long tagndx;
2150
a5c71af8 2151 BFD_ASSERT (! auxp->is_sym);
252b5132
RH
2152 if (auxp->fix_tag)
2153 tagndx = auxp->u.auxent.x_sym.x_tagndx.p - root;
2154 else
2155 tagndx = auxp->u.auxent.x_sym.x_tagndx.l;
2156
2157 fprintf (file, "\n");
2158
2159 if (bfd_coff_print_aux (abfd, file, root, combined, auxp, aux))
2160 continue;
2161
2162 switch (combined->u.syment.n_sclass)
2163 {
2164 case C_FILE:
2165 fprintf (file, "File ");
2166 break;
2167
2168 case C_STAT:
2169 if (combined->u.syment.n_type == T_NULL)
c8e7bf0d 2170 /* Probably a section symbol ? */
252b5132
RH
2171 {
2172 fprintf (file, "AUX scnlen 0x%lx nreloc %d nlnno %d",
0af1713e 2173 (unsigned long) auxp->u.auxent.x_scn.x_scnlen,
252b5132
RH
2174 auxp->u.auxent.x_scn.x_nreloc,
2175 auxp->u.auxent.x_scn.x_nlinno);
2176 if (auxp->u.auxent.x_scn.x_checksum != 0
2177 || auxp->u.auxent.x_scn.x_associated != 0
2178 || auxp->u.auxent.x_scn.x_comdat != 0)
2179 fprintf (file, " checksum 0x%lx assoc %d comdat %d",
2180 auxp->u.auxent.x_scn.x_checksum,
2181 auxp->u.auxent.x_scn.x_associated,
2182 auxp->u.auxent.x_scn.x_comdat);
2183 break;
2184 }
1a0670f3 2185 /* Fall through. */
312191a6 2186 case C_EXT:
8602d4fe 2187 case C_AIX_WEAKEXT:
312191a6
ILT
2188 if (ISFCN (combined->u.syment.n_type))
2189 {
cea4409c
AM
2190 long next, llnos;
2191
2192 if (auxp->fix_end)
2193 next = (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p
2194 - root);
2195 else
2196 next = auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
2197 llnos = auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_lnnoptr;
312191a6 2198 fprintf (file,
3d66c4f7 2199 "AUX tagndx %ld ttlsiz 0x%lx lnnos %ld next %ld",
0af1713e
AM
2200 tagndx,
2201 (unsigned long) auxp->u.auxent.x_sym.x_misc.x_fsize,
cea4409c 2202 llnos, next);
312191a6
ILT
2203 break;
2204 }
1a0670f3 2205 /* Fall through. */
252b5132
RH
2206 default:
2207 fprintf (file, "AUX lnno %d size 0x%x tagndx %ld",
2208 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_lnno,
2209 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_size,
2210 tagndx);
2211 if (auxp->fix_end)
2212 fprintf (file, " endndx %ld",
2213 ((long)
2214 (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p
2215 - root)));
2216 break;
2217 }
2218 }
2219
2220 if (l)
2221 {
2222 fprintf (file, "\n%s :", l->u.sym->name);
2223 l++;
2224 while (l->line_number)
2225 {
f41e4712
NC
2226 if (l->line_number > 0)
2227 {
2228 fprintf (file, "\n%4d : ", l->line_number);
2229 bfd_fprintf_vma (abfd, file, l->u.offset + symbol->section->vma);
2230 }
252b5132
RH
2231 l++;
2232 }
2233 }
2234 }
2235 else
2236 {
c8e7bf0d 2237 bfd_print_symbol_vandf (abfd, (void *) file, symbol);
252b5132
RH
2238 fprintf (file, " %-5s %s %s %s",
2239 symbol->section->name,
2240 coffsymbol (symbol)->native ? "n" : "g",
2241 coffsymbol (symbol)->lineno ? "l" : " ",
2242 symbol->name);
2243 }
2244 }
2245}
2246
2247/* Return whether a symbol name implies a local symbol. In COFF,
2248 local symbols generally start with ``.L''. Most targets use this
2249 function for the is_local_label_name entry point, but some may
2250 override it. */
2251
b34976b6 2252bfd_boolean
c8e7bf0d
NC
2253_bfd_coff_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
2254 const char *name)
252b5132 2255{
b34976b6 2256 return name[0] == '.' && name[1] == 'L';
252b5132
RH
2257}
2258
9a968f43
NC
2259/* Provided a BFD, a section and an offset (in bytes, not octets) into the
2260 section, calculate and return the name of the source file and the line
2261 nearest to the wanted location. */
435b1e90 2262
b34976b6 2263bfd_boolean
fc28f9aa 2264coff_find_nearest_line_with_names (bfd *abfd,
07d6d2b8
AM
2265 asymbol **symbols,
2266 asection *section,
2267 bfd_vma offset,
2268 const char **filename_ptr,
2269 const char **functionname_ptr,
2270 unsigned int *line_ptr,
2271 const struct dwarf_debug_section *debug_sections)
252b5132 2272{
b34976b6 2273 bfd_boolean found;
252b5132
RH
2274 unsigned int i;
2275 unsigned int line_base;
2276 coff_data_type *cof = coff_data (abfd);
c8e7bf0d 2277 /* Run through the raw syments if available. */
252b5132
RH
2278 combined_entry_type *p;
2279 combined_entry_type *pend;
2280 alent *l;
2281 struct coff_section_tdata *sec_data;
dc810e39 2282 bfd_size_type amt;
252b5132
RH
2283
2284 /* Before looking through the symbol table, try to use a .stab
2285 section to find the information. */
2286 if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
2287 &found, filename_ptr,
2288 functionname_ptr, line_ptr,
51db3708 2289 &coff_data(abfd)->line_info))
b34976b6 2290 return FALSE;
51db3708 2291
4ca29a6a 2292 if (found)
b34976b6 2293 return TRUE;
4ca29a6a 2294
51db3708 2295 /* Also try examining DWARF2 debugging information. */
fb167eb2 2296 if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
51db3708 2297 filename_ptr, functionname_ptr,
fb167eb2 2298 line_ptr, NULL, debug_sections, 0,
51db3708 2299 &coff_data(abfd)->dwarf2_find_line_info))
b34976b6 2300 return TRUE;
51db3708 2301
e643cb45
NC
2302 sec_data = coff_section_data (abfd, section);
2303
425bd9e1
NC
2304 /* If the DWARF lookup failed, but there is DWARF information available
2305 then the problem might be that the file has been rebased. This tool
2306 changes the VMAs of all the sections, but it does not update the DWARF
2307 information. So try again, using a bias against the address sought. */
2308 if (coff_data (abfd)->dwarf2_find_line_info != NULL)
2309 {
219d6836 2310 bfd_signed_vma bias = 0;
425bd9e1 2311
e643cb45
NC
2312 /* Create a cache of the result for the next call. */
2313 if (sec_data == NULL && section->owner == abfd)
2314 {
2315 amt = sizeof (struct coff_section_tdata);
2316 section->used_by_bfd = bfd_zalloc (abfd, amt);
2317 sec_data = (struct coff_section_tdata *) section->used_by_bfd;
2318 }
2319
2320 if (sec_data != NULL && sec_data->saved_bias)
2321 bias = sec_data->saved_bias;
219d6836 2322 else if (symbols)
e643cb45
NC
2323 {
2324 bias = _bfd_dwarf2_find_symbol_bias (symbols,
2325 & coff_data (abfd)->dwarf2_find_line_info);
219d6836 2326
e643cb45
NC
2327 if (sec_data)
2328 {
2329 sec_data->saved_bias = TRUE;
2330 sec_data->bias = bias;
2331 }
2332 }
1b786873 2333
425bd9e1
NC
2334 if (bias
2335 && _bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section,
2336 offset + bias,
2337 filename_ptr, functionname_ptr,
2338 line_ptr, NULL, debug_sections, 0,
2339 &coff_data(abfd)->dwarf2_find_line_info))
2340 return TRUE;
2341 }
2342
252b5132
RH
2343 *filename_ptr = 0;
2344 *functionname_ptr = 0;
2345 *line_ptr = 0;
2346
c8e7bf0d 2347 /* Don't try and find line numbers in a non coff file. */
9bd09e22 2348 if (!bfd_family_coff (abfd))
b34976b6 2349 return FALSE;
252b5132
RH
2350
2351 if (cof == NULL)
b34976b6 2352 return FALSE;
252b5132
RH
2353
2354 /* Find the first C_FILE symbol. */
2355 p = cof->raw_syments;
2356 if (!p)
b34976b6 2357 return FALSE;
252b5132
RH
2358
2359 pend = p + cof->raw_syment_count;
2360 while (p < pend)
2361 {
a5c71af8 2362 BFD_ASSERT (p->is_sym);
252b5132
RH
2363 if (p->u.syment.n_sclass == C_FILE)
2364 break;
2365 p += 1 + p->u.syment.n_numaux;
2366 }
2367
2368 if (p < pend)
2369 {
2370 bfd_vma sec_vma;
2371 bfd_vma maxdiff;
2372
2373 /* Look through the C_FILE symbols to find the best one. */
2374 sec_vma = bfd_get_section_vma (abfd, section);
2375 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
2376 maxdiff = (bfd_vma) 0 - (bfd_vma) 1;
2377 while (1)
2378 {
4d9e2b27 2379 bfd_vma file_addr;
252b5132
RH
2380 combined_entry_type *p2;
2381
2382 for (p2 = p + 1 + p->u.syment.n_numaux;
2383 p2 < pend;
2384 p2 += 1 + p2->u.syment.n_numaux)
2385 {
a5c71af8 2386 BFD_ASSERT (p2->is_sym);
252b5132
RH
2387 if (p2->u.syment.n_scnum > 0
2388 && (section
2389 == coff_section_from_bfd_index (abfd,
2390 p2->u.syment.n_scnum)))
2391 break;
2392 if (p2->u.syment.n_sclass == C_FILE)
2393 {
2394 p2 = pend;
2395 break;
2396 }
2397 }
a5c71af8
NC
2398 if (p2 >= pend)
2399 break;
252b5132 2400
4d9e2b27
NC
2401 file_addr = (bfd_vma) p2->u.syment.n_value;
2402 /* PR 11512: Include the section address of the function name symbol. */
2403 if (p2->u.syment.n_scnum > 0)
2404 file_addr += coff_section_from_bfd_index (abfd,
2405 p2->u.syment.n_scnum)->vma;
798c1fb8 2406 /* We use <= MAXDIFF here so that if we get a zero length
07d6d2b8 2407 file, we actually use the next file entry. */
252b5132 2408 if (p2 < pend
4d9e2b27
NC
2409 && offset + sec_vma >= file_addr
2410 && offset + sec_vma - file_addr <= maxdiff)
252b5132
RH
2411 {
2412 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
2413 maxdiff = offset + sec_vma - p2->u.syment.n_value;
2414 }
2415
2416 /* Avoid endless loops on erroneous files by ensuring that
2417 we always move forward in the file. */
cea4409c 2418 if (p >= cof->raw_syments + p->u.syment.n_value)
252b5132
RH
2419 break;
2420
2421 p = cof->raw_syments + p->u.syment.n_value;
2422 if (p > pend || p->u.syment.n_sclass != C_FILE)
2423 break;
2424 }
2425 }
2426
e643cb45
NC
2427 if (section->lineno_count == 0)
2428 {
2429 *functionname_ptr = NULL;
2430 *line_ptr = 0;
2431 return TRUE;
2432 }
2433
2434 /* Now wander though the raw linenumbers of the section.
2435 If we have been called on this section before, and the offset
2436 we want is further down then we can prime the lookup loop. */
252b5132
RH
2437 if (sec_data != NULL
2438 && sec_data->i > 0
2439 && offset >= sec_data->offset)
2440 {
2441 i = sec_data->i;
2442 *functionname_ptr = sec_data->function;
2443 line_base = sec_data->line_base;
2444 }
2445 else
2446 {
2447 i = 0;
2448 line_base = 0;
2449 }
2450
2451 if (section->lineno != NULL)
2452 {
798c1fb8
ILT
2453 bfd_vma last_value = 0;
2454
252b5132
RH
2455 l = &section->lineno[i];
2456
2457 for (; i < section->lineno_count; i++)
2458 {
2459 if (l->line_number == 0)
2460 {
c8e7bf0d 2461 /* Get the symbol this line number points at. */
252b5132
RH
2462 coff_symbol_type *coff = (coff_symbol_type *) (l->u.sym);
2463 if (coff->symbol.value > offset)
2464 break;
e643cb45 2465
252b5132 2466 *functionname_ptr = coff->symbol.name;
798c1fb8 2467 last_value = coff->symbol.value;
252b5132
RH
2468 if (coff->native)
2469 {
2470 combined_entry_type *s = coff->native;
a5c71af8
NC
2471
2472 BFD_ASSERT (s->is_sym);
252b5132
RH
2473 s = s + 1 + s->u.syment.n_numaux;
2474
2475 /* In XCOFF a debugging symbol can follow the
2476 function symbol. */
2477 if (s->u.syment.n_scnum == N_DEBUG)
2478 s = s + 1 + s->u.syment.n_numaux;
2479
2480 /* S should now point to the .bf of the function. */
2481 if (s->u.syment.n_numaux)
2482 {
2483 /* The linenumber is stored in the auxent. */
2484 union internal_auxent *a = &((s + 1)->u.auxent);
a5c71af8 2485
252b5132
RH
2486 line_base = a->x_sym.x_misc.x_lnsz.x_lnno;
2487 *line_ptr = line_base;
2488 }
2489 }
2490 }
2491 else
2492 {
2493 if (l->u.offset > offset)
2494 break;
2495 *line_ptr = l->line_number + line_base - 1;
2496 }
2497 l++;
2498 }
798c1fb8
ILT
2499
2500 /* If we fell off the end of the loop, then assume that this
2501 symbol has no line number info. Otherwise, symbols with no
2502 line number info get reported with the line number of the
2503 last line of the last symbol which does have line number
2504 info. We use 0x100 as a slop to account for cases where the
2505 last line has executable code. */
2506 if (i >= section->lineno_count
2507 && last_value != 0
2508 && offset - last_value > 0x100)
2509 {
2510 *functionname_ptr = NULL;
2511 *line_ptr = 0;
2512 }
252b5132
RH
2513 }
2514
2515 /* Cache the results for the next call. */
2516 if (sec_data == NULL && section->owner == abfd)
2517 {
dc810e39 2518 amt = sizeof (struct coff_section_tdata);
c8e7bf0d 2519 section->used_by_bfd = bfd_zalloc (abfd, amt);
252b5132
RH
2520 sec_data = (struct coff_section_tdata *) section->used_by_bfd;
2521 }
e643cb45 2522
252b5132
RH
2523 if (sec_data != NULL)
2524 {
2525 sec_data->offset = offset;
70df0c05 2526 sec_data->i = i - 1;
252b5132
RH
2527 sec_data->function = *functionname_ptr;
2528 sec_data->line_base = line_base;
2529 }
2530
b34976b6 2531 return TRUE;
252b5132
RH
2532}
2533
fc28f9aa
TG
2534bfd_boolean
2535coff_find_nearest_line (bfd *abfd,
fc28f9aa 2536 asymbol **symbols,
fb167eb2 2537 asection *section,
fc28f9aa
TG
2538 bfd_vma offset,
2539 const char **filename_ptr,
2540 const char **functionname_ptr,
fb167eb2
AM
2541 unsigned int *line_ptr,
2542 unsigned int *discriminator_ptr)
fc28f9aa 2543{
fb167eb2
AM
2544 if (discriminator_ptr)
2545 *discriminator_ptr = 0;
2546 return coff_find_nearest_line_with_names (abfd, symbols, section, offset,
07d6d2b8
AM
2547 filename_ptr, functionname_ptr,
2548 line_ptr, dwarf_debug_sections);
fc28f9aa
TG
2549}
2550
4ab527b0
FF
2551bfd_boolean
2552coff_find_inliner_info (bfd *abfd,
2553 const char **filename_ptr,
2554 const char **functionname_ptr,
2555 unsigned int *line_ptr)
2556{
2557 bfd_boolean found;
2558
2559 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
2560 functionname_ptr, line_ptr,
2561 &coff_data(abfd)->dwarf2_find_line_info);
2562 return (found);
2563}
2564
252b5132 2565int
a6b96beb 2566coff_sizeof_headers (bfd *abfd, struct bfd_link_info *info)
252b5132
RH
2567{
2568 size_t size;
2569
0e1862bb 2570 if (!bfd_link_relocatable (info))
c8e7bf0d 2571 size = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
252b5132 2572 else
c8e7bf0d 2573 size = bfd_coff_filhsz (abfd);
252b5132
RH
2574
2575 size += abfd->section_count * bfd_coff_scnhsz (abfd);
2576 return size;
2577}
2578
2579/* Change the class of a coff symbol held by BFD. */
c8e7bf0d 2580
b34976b6 2581bfd_boolean
07d6d2b8
AM
2582bfd_coff_set_symbol_class (bfd * abfd,
2583 asymbol * symbol,
2584 unsigned int symbol_class)
252b5132
RH
2585{
2586 coff_symbol_type * csym;
2587
f4943d82 2588 csym = coff_symbol_from (symbol);
252b5132
RH
2589 if (csym == NULL)
2590 {
2591 bfd_set_error (bfd_error_invalid_operation);
b34976b6 2592 return FALSE;
252b5132
RH
2593 }
2594 else if (csym->native == NULL)
2595 {
2596 /* This is an alien symbol which no native coff backend data.
2597 We cheat here by creating a fake native entry for it and
2598 then filling in the class. This code is based on that in
2599 coff_write_alien_symbol(). */
244148ad 2600
252b5132 2601 combined_entry_type * native;
dc810e39 2602 bfd_size_type amt = sizeof (* native);
252b5132 2603
a50b1753 2604 native = (combined_entry_type *) bfd_zalloc (abfd, amt);
252b5132 2605 if (native == NULL)
b34976b6 2606 return FALSE;
252b5132 2607
a5c71af8 2608 native->is_sym = TRUE;
252b5132 2609 native->u.syment.n_type = T_NULL;
96d56e9f 2610 native->u.syment.n_sclass = symbol_class;
244148ad 2611
252b5132
RH
2612 if (bfd_is_und_section (symbol->section))
2613 {
2614 native->u.syment.n_scnum = N_UNDEF;
2615 native->u.syment.n_value = symbol->value;
2616 }
2617 else if (bfd_is_com_section (symbol->section))
2618 {
2619 native->u.syment.n_scnum = N_UNDEF;
2620 native->u.syment.n_value = symbol->value;
2621 }
2622 else
2623 {
2624 native->u.syment.n_scnum =
2625 symbol->section->output_section->target_index;
2626 native->u.syment.n_value = (symbol->value
2627 + symbol->section->output_offset);
2628 if (! obj_pe (abfd))
2629 native->u.syment.n_value += symbol->section->output_section->vma;
244148ad 2630
08da05b0 2631 /* Copy the any flags from the file header into the symbol.
252b5132
RH
2632 FIXME: Why? */
2633 native->u.syment.n_flags = bfd_asymbol_bfd (& csym->symbol)->flags;
2634 }
244148ad 2635
252b5132
RH
2636 csym->native = native;
2637 }
2638 else
96d56e9f 2639 csym->native->u.syment.n_sclass = symbol_class;
244148ad 2640
b34976b6 2641 return TRUE;
252b5132 2642}
082b7297 2643
c77ec726
AM
2644bfd_boolean
2645_bfd_coff_section_already_linked (bfd *abfd,
2646 asection *sec,
2647 struct bfd_link_info *info)
2648{
2649 flagword flags;
2650 const char *name, *key;
2651 struct bfd_section_already_linked *l;
2652 struct bfd_section_already_linked_hash_entry *already_linked_list;
2653 struct coff_comdat_info *s_comdat;
2654
2219ae0b
L
2655 if (sec->output_section == bfd_abs_section_ptr)
2656 return FALSE;
2657
c77ec726
AM
2658 flags = sec->flags;
2659 if ((flags & SEC_LINK_ONCE) == 0)
2660 return FALSE;
2661
2662 /* The COFF backend linker doesn't support group sections. */
2663 if ((flags & SEC_GROUP) != 0)
2664 return FALSE;
2665
2666 name = bfd_get_section_name (abfd, sec);
2667 s_comdat = bfd_coff_get_comdat_section (abfd, sec);
2668
2669 if (s_comdat != NULL)
2670 key = s_comdat->name;
2671 else
2672 {
2673 if (CONST_STRNEQ (name, ".gnu.linkonce.")
2674 && (key = strchr (name + sizeof (".gnu.linkonce.") - 1, '.')) != NULL)
2675 key++;
2676 else
2677 /* FIXME: gcc as of 2011-09 emits sections like .text$<key>,
2678 .xdata$<key> and .pdata$<key> only the first of which has a
2679 comdat key. Should these all match the LTO IR key? */
2680 key = name;
2681 }
2682
2683 already_linked_list = bfd_section_already_linked_table_lookup (key);
2684
2685 for (l = already_linked_list->entry; l != NULL; l = l->next)
2686 {
2687 struct coff_comdat_info *l_comdat;
2688
2689 l_comdat = bfd_coff_get_comdat_section (l->sec->owner, l->sec);
2690
2691 /* The section names must match, and both sections must be
2692 comdat and have the same comdat name, or both sections must
2693 be non-comdat. LTO IR plugin sections are an exception. They
2694 are always named .gnu.linkonce.t.<key> (<key> is some string)
2695 and match any comdat section with comdat name of <key>, and
2696 any linkonce section with the same suffix, ie.
2697 .gnu.linkonce.*.<key>. */
2698 if (((s_comdat != NULL) == (l_comdat != NULL)
2699 && strcmp (name, l->sec->name) == 0)
2700 || (l->sec->owner->flags & BFD_PLUGIN) != 0)
2701 {
2702 /* The section has already been linked. See if we should
2703 issue a warning. */
2704 return _bfd_handle_already_linked (sec, l, info);
2705 }
2706 }
2707
2708 /* This is the first section with this name. Record it. */
2709 if (!bfd_section_already_linked_table_insert (already_linked_list, sec))
2710 info->callbacks->einfo (_("%F%P: already_linked_table: %E\n"));
2711 return FALSE;
2712}
0f088b2a
KT
2713
2714/* Initialize COOKIE for input bfd ABFD. */
2715
2716static bfd_boolean
2717init_reloc_cookie (struct coff_reloc_cookie *cookie,
2718 struct bfd_link_info *info ATTRIBUTE_UNUSED,
2719 bfd *abfd)
2720{
2721 /* Sometimes the symbol table does not yet have been loaded here. */
2722 bfd_coff_slurp_symbol_table (abfd);
2723
2724 cookie->abfd = abfd;
2725 cookie->sym_hashes = obj_coff_sym_hashes (abfd);
2726
2727 cookie->symbols = obj_symbols (abfd);
2728
2729 return TRUE;
2730}
2731
2732/* Free the memory allocated by init_reloc_cookie, if appropriate. */
2733
2734static void
2735fini_reloc_cookie (struct coff_reloc_cookie *cookie ATTRIBUTE_UNUSED,
2736 bfd *abfd ATTRIBUTE_UNUSED)
2737{
2738 /* Nothing to do. */
2739}
2740
2741/* Initialize the relocation information in COOKIE for input section SEC
2742 of input bfd ABFD. */
2743
2744static bfd_boolean
2745init_reloc_cookie_rels (struct coff_reloc_cookie *cookie,
2746 struct bfd_link_info *info ATTRIBUTE_UNUSED,
2747 bfd *abfd,
2748 asection *sec)
2749{
2750 if (sec->reloc_count == 0)
2751 {
2752 cookie->rels = NULL;
2753 cookie->relend = NULL;
2754 cookie->rel = NULL;
2755 return TRUE;
2756 }
2757
2758 cookie->rels = _bfd_coff_read_internal_relocs (abfd, sec, FALSE, NULL, 0, NULL);
2759
2760 if (cookie->rels == NULL)
2761 return FALSE;
2762
2763 cookie->rel = cookie->rels;
2764 cookie->relend = (cookie->rels + sec->reloc_count);
2765 return TRUE;
2766}
2767
2768/* Free the memory allocated by init_reloc_cookie_rels,
2769 if appropriate. */
2770
2771static void
2772fini_reloc_cookie_rels (struct coff_reloc_cookie *cookie,
2773 asection *sec)
2774{
147d994b
NC
2775 if (cookie->rels
2776 /* PR 20401. The relocs may not have been cached, so check first.
2777 If the relocs were loaded by init_reloc_cookie_rels() then this
2778 will be the case. FIXME: Would performance be improved if the
2779 relocs *were* cached ? */
2780 && coff_section_data (NULL, sec)
2781 && coff_section_data (NULL, sec)->relocs != cookie->rels)
0f088b2a
KT
2782 free (cookie->rels);
2783}
2784
2785/* Initialize the whole of COOKIE for input section SEC. */
2786
2787static bfd_boolean
2788init_reloc_cookie_for_section (struct coff_reloc_cookie *cookie,
2789 struct bfd_link_info *info,
2790 asection *sec)
2791{
2792 if (!init_reloc_cookie (cookie, info, sec->owner))
2793 return FALSE;
2794
2795 if (!init_reloc_cookie_rels (cookie, info, sec->owner, sec))
2796 {
2797 fini_reloc_cookie (cookie, sec->owner);
2798 return FALSE;
2799 }
2800 return TRUE;
2801}
2802
2803/* Free the memory allocated by init_reloc_cookie_for_section,
2804 if appropriate. */
2805
2806static void
2807fini_reloc_cookie_for_section (struct coff_reloc_cookie *cookie,
2808 asection *sec)
2809{
2810 fini_reloc_cookie_rels (cookie, sec);
2811 fini_reloc_cookie (cookie, sec->owner);
2812}
2813
2814static asection *
2815_bfd_coff_gc_mark_hook (asection *sec,
2816 struct bfd_link_info *info ATTRIBUTE_UNUSED,
2817 struct internal_reloc *rel ATTRIBUTE_UNUSED,
2818 struct coff_link_hash_entry *h,
2819 struct internal_syment *sym)
2820{
2821 if (h != NULL)
2822 {
2823 switch (h->root.type)
07d6d2b8
AM
2824 {
2825 case bfd_link_hash_defined:
2826 case bfd_link_hash_defweak:
2827 return h->root.u.def.section;
0f088b2a 2828
07d6d2b8
AM
2829 case bfd_link_hash_common:
2830 return h->root.u.c.p->section;
0f088b2a 2831
0f088b2a 2832 case bfd_link_hash_undefweak:
1fd6d111
TG
2833 if (h->symbol_class == C_NT_WEAK && h->numaux == 1)
2834 {
2835 /* PE weak externals. A weak symbol may include an auxiliary
2836 record indicating that if the weak symbol is not resolved,
2837 another external symbol is used instead. */
2838 struct coff_link_hash_entry *h2 =
2839 h->auxbfd->tdata.coff_obj_data->sym_hashes[
2840 h->aux->x_sym.x_tagndx.l];
2841
2842 if (h2 && h2->root.type != bfd_link_hash_undefined)
2843 return h2->root.u.def.section;
2844 }
2845 break;
2846
2847 case bfd_link_hash_undefined:
07d6d2b8
AM
2848 default:
2849 break;
2850 }
0f088b2a
KT
2851 return NULL;
2852 }
2853
2854 return coff_section_from_bfd_index (sec->owner, sym->n_scnum);
2855}
2856
2857/* COOKIE->rel describes a relocation against section SEC, which is
2858 a section we've decided to keep. Return the section that contains
2859 the relocation symbol, or NULL if no section contains it. */
2860
2861static asection *
2862_bfd_coff_gc_mark_rsec (struct bfd_link_info *info, asection *sec,
2863 coff_gc_mark_hook_fn gc_mark_hook,
2864 struct coff_reloc_cookie *cookie)
2865{
2866 struct coff_link_hash_entry *h;
2867
2868 h = cookie->sym_hashes[cookie->rel->r_symndx];
2869 if (h != NULL)
2870 {
2871 while (h->root.type == bfd_link_hash_indirect
2872 || h->root.type == bfd_link_hash_warning)
2873 h = (struct coff_link_hash_entry *) h->root.u.i.link;
2874
2875 return (*gc_mark_hook) (sec, info, cookie->rel, h, NULL);
2876 }
2877
2878 return (*gc_mark_hook) (sec, info, cookie->rel, NULL,
2879 &(cookie->symbols
2880 + obj_convert (sec->owner)[cookie->rel->r_symndx])->native->u.syment);
2881}
2882
2883static bfd_boolean _bfd_coff_gc_mark
2884 (struct bfd_link_info *, asection *, coff_gc_mark_hook_fn);
2885
2886/* COOKIE->rel describes a relocation against section SEC, which is
2887 a section we've decided to keep. Mark the section that contains
2888 the relocation symbol. */
2889
2890static bfd_boolean
2891_bfd_coff_gc_mark_reloc (struct bfd_link_info *info,
2892 asection *sec,
2893 coff_gc_mark_hook_fn gc_mark_hook,
2894 struct coff_reloc_cookie *cookie)
2895{
2896 asection *rsec;
2897
2898 rsec = _bfd_coff_gc_mark_rsec (info, sec, gc_mark_hook, cookie);
2899 if (rsec && !rsec->gc_mark)
2900 {
2901 if (bfd_get_flavour (rsec->owner) != bfd_target_coff_flavour)
2902 rsec->gc_mark = 1;
2903 else if (!_bfd_coff_gc_mark (info, rsec, gc_mark_hook))
2904 return FALSE;
2905 }
2906 return TRUE;
2907}
2908
2909/* The mark phase of garbage collection. For a given section, mark
2910 it and any sections in this section's group, and all the sections
2911 which define symbols to which it refers. */
2912
2913static bfd_boolean
2914_bfd_coff_gc_mark (struct bfd_link_info *info,
2915 asection *sec,
2916 coff_gc_mark_hook_fn gc_mark_hook)
2917{
2918 bfd_boolean ret = TRUE;
2919
2920 sec->gc_mark = 1;
2921
2922 /* Look through the section relocs. */
2923 if ((sec->flags & SEC_RELOC) != 0
2924 && sec->reloc_count > 0)
2925 {
2926 struct coff_reloc_cookie cookie;
2927
2928 if (!init_reloc_cookie_for_section (&cookie, info, sec))
07d6d2b8 2929 ret = FALSE;
0f088b2a 2930 else
07d6d2b8
AM
2931 {
2932 for (; cookie.rel < cookie.relend; cookie.rel++)
2933 {
0f088b2a
KT
2934 if (!_bfd_coff_gc_mark_reloc (info, sec, gc_mark_hook, &cookie))
2935 {
2936 ret = FALSE;
2937 break;
2938 }
2939 }
07d6d2b8
AM
2940 fini_reloc_cookie_for_section (&cookie, sec);
2941 }
0f088b2a
KT
2942 }
2943
2944 return ret;
2945}
2946
2947static bfd_boolean
2948_bfd_coff_gc_mark_extra_sections (struct bfd_link_info *info,
2949 coff_gc_mark_hook_fn mark_hook ATTRIBUTE_UNUSED)
2950{
2951 bfd *ibfd;
2952
2953 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2954 {
2955 asection *isec;
2956 bfd_boolean some_kept;
2957
1fd6d111 2958 if (bfd_get_flavour (ibfd) != bfd_target_coff_flavour)
0f088b2a
KT
2959 continue;
2960
2961 /* Ensure all linker created sections are kept, and see whether
2962 any other section is already marked. */
2963 some_kept = FALSE;
2964 for (isec = ibfd->sections; isec != NULL; isec = isec->next)
2965 {
2966 if ((isec->flags & SEC_LINKER_CREATED) != 0)
2967 isec->gc_mark = 1;
2968 else if (isec->gc_mark)
2969 some_kept = TRUE;
2970 }
2971
2972 /* If no section in this file will be kept, then we can
2973 toss out debug sections. */
2974 if (!some_kept)
2975 continue;
2976
2977 /* Keep debug and special sections like .comment when they are
2978 not part of a group, or when we have single-member groups. */
2979 for (isec = ibfd->sections; isec != NULL; isec = isec->next)
2980 if ((isec->flags & SEC_DEBUGGING) != 0
2981 || (isec->flags & (SEC_ALLOC | SEC_LOAD | SEC_RELOC)) == 0)
2982 isec->gc_mark = 1;
2983 }
2984 return TRUE;
2985}
2986
2987/* Sweep symbols in swept sections. Called via coff_link_hash_traverse. */
2988
2989static bfd_boolean
2990coff_gc_sweep_symbol (struct coff_link_hash_entry *h,
2991 void *data ATTRIBUTE_UNUSED)
2992{
2993 if (h->root.type == bfd_link_hash_warning)
2994 h = (struct coff_link_hash_entry *) h->root.u.i.link;
2995
2996 if ((h->root.type == bfd_link_hash_defined
2997 || h->root.type == bfd_link_hash_defweak)
2998 && !h->root.u.def.section->gc_mark
2999 && !(h->root.u.def.section->owner->flags & DYNAMIC))
3000 {
3001 /* Do our best to hide the symbol. */
3002 h->root.u.def.section = bfd_und_section_ptr;
3003 h->symbol_class = C_HIDDEN;
3004 }
3005
3006 return TRUE;
3007}
3008
3009/* The sweep phase of garbage collection. Remove all garbage sections. */
3010
3011typedef bfd_boolean (*gc_sweep_hook_fn)
3012 (bfd *, struct bfd_link_info *, asection *, const struct internal_reloc *);
3013
3014static bfd_boolean
3015coff_gc_sweep (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
3016{
3017 bfd *sub;
3018
3019 for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
3020 {
3021 asection *o;
3022
3023 if (bfd_get_flavour (sub) != bfd_target_coff_flavour)
3024 continue;
3025
3026 for (o = sub->sections; o != NULL; o = o->next)
3027 {
3028 /* Keep debug and special sections. */
07d6d2b8 3029 if ((o->flags & (SEC_DEBUGGING | SEC_LINKER_CREATED)) != 0
0f088b2a
KT
3030 || (o->flags & (SEC_ALLOC | SEC_LOAD | SEC_RELOC)) == 0)
3031 o->gc_mark = 1;
07d6d2b8 3032 else if (CONST_STRNEQ (o->name, ".idata")
0f088b2a
KT
3033 || CONST_STRNEQ (o->name, ".pdata")
3034 || CONST_STRNEQ (o->name, ".xdata")
3035 || CONST_STRNEQ (o->name, ".rsrc"))
3036 o->gc_mark = 1;
3037
3038 if (o->gc_mark)
3039 continue;
3040
3041 /* Skip sweeping sections already excluded. */
3042 if (o->flags & SEC_EXCLUDE)
3043 continue;
3044
3045 /* Since this is early in the link process, it is simple
3046 to remove a section from the output. */
3047 o->flags |= SEC_EXCLUDE;
3048
3049 if (info->print_gc_sections && o->size != 0)
695344c0 3050 /* xgettext: c-format */
59d08d6c 3051 _bfd_error_handler (_("removing unused section '%pA' in file '%pB'"),
dae82561 3052 o, sub);
0f088b2a
KT
3053
3054#if 0
3055 /* But we also have to update some of the relocation
3056 info we collected before. */
3057 if (gc_sweep_hook
3058 && (o->flags & SEC_RELOC) != 0
3059 && o->reloc_count > 0
3060 && !bfd_is_abs_section (o->output_section))
3061 {
3062 struct internal_reloc *internal_relocs;
3063 bfd_boolean r;
3064
3065 internal_relocs
3066 = _bfd_coff_link_read_relocs (o->owner, o, NULL, NULL,
3067 info->keep_memory);
3068 if (internal_relocs == NULL)
3069 return FALSE;
3070
3071 r = (*gc_sweep_hook) (o->owner, info, o, internal_relocs);
3072
3073 if (coff_section_data (o)->relocs != internal_relocs)
3074 free (internal_relocs);
3075
3076 if (!r)
3077 return FALSE;
3078 }
3079#endif
3080 }
3081 }
3082
3083 /* Remove the symbols that were in the swept sections from the dynamic
3084 symbol table. */
3085 coff_link_hash_traverse (coff_hash_table (info), coff_gc_sweep_symbol,
3086 NULL);
3087
3088 return TRUE;
3089}
3090
3091/* Keep all sections containing symbols undefined on the command-line,
3092 and the section containing the entry symbol. */
3093
3094static void
3095_bfd_coff_gc_keep (struct bfd_link_info *info)
3096{
3097 struct bfd_sym_chain *sym;
3098
3099 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
3100 {
3101 struct coff_link_hash_entry *h;
3102
3103 h = coff_link_hash_lookup (coff_hash_table (info), sym->name,
3104 FALSE, FALSE, FALSE);
3105
3106 if (h != NULL
3107 && (h->root.type == bfd_link_hash_defined
3108 || h->root.type == bfd_link_hash_defweak)
3109 && !bfd_is_abs_section (h->root.u.def.section))
3110 h->root.u.def.section->flags |= SEC_KEEP;
3111 }
3112}
3113
3114/* Do mark and sweep of unused sections. */
3115
3116bfd_boolean
3117bfd_coff_gc_sections (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
3118{
3119 bfd *sub;
3120
3121 /* FIXME: Should we implement this? */
3122#if 0
3123 const bfd_coff_backend_data *bed = coff_backend_info (abfd);
3124
3125 if (!bed->can_gc_sections
3126 || !is_coff_hash_table (info->hash))
3127 {
59d08d6c 3128 _bfd_error_handler(_("warning: gc-sections option ignored"));
0f088b2a
KT
3129 return TRUE;
3130 }
3131#endif
3132
3133 _bfd_coff_gc_keep (info);
3134
3135 /* Grovel through relocs to find out who stays ... */
3136 for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
3137 {
3138 asection *o;
3139
3140 if (bfd_get_flavour (sub) != bfd_target_coff_flavour)
07d6d2b8 3141 continue;
0f088b2a
KT
3142
3143 for (o = sub->sections; o != NULL; o = o->next)
07d6d2b8 3144 {
0f088b2a
KT
3145 if (((o->flags & (SEC_EXCLUDE | SEC_KEEP)) == SEC_KEEP
3146 || CONST_STRNEQ (o->name, ".vectors")
3147 || CONST_STRNEQ (o->name, ".ctors")
3148 || CONST_STRNEQ (o->name, ".dtors"))
3149 && !o->gc_mark)
3150 {
3151 if (!_bfd_coff_gc_mark (info, o, _bfd_coff_gc_mark_hook))
3152 return FALSE;
3153 }
07d6d2b8 3154 }
0f088b2a
KT
3155 }
3156
3157 /* Allow the backend to mark additional target specific sections. */
3158 _bfd_coff_gc_mark_extra_sections (info, _bfd_coff_gc_mark_hook);
3159
3160 /* ... and mark SEC_EXCLUDE for those that go. */
3161 return coff_gc_sweep (abfd, info);
3162}
This page took 1.58878 seconds and 4 git commands to generate.