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