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