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