Add Visium support to opcodes
[deliverable/binutils-gdb.git] / bfd / coffgen.c
CommitLineData
252b5132 1/* Support for the generic parts of COFF, for BFD.
4b95cf5c 2 Copyright (C) 1990-2014 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"
3db64b00 40#include "bfd.h"
252b5132
RH
41#include "libbfd.h"
42#include "coff/internal.h"
43#include "libcoff.h"
44
252b5132
RH
45/* Take a section header read from a coff file (in HOST byte order),
46 and make a BFD "section" out of it. This is used by ECOFF. */
c8e7bf0d 47
b34976b6 48static bfd_boolean
c8e7bf0d
NC
49make_a_section_from_file (bfd *abfd,
50 struct internal_scnhdr *hdr,
51 unsigned int target_index)
252b5132
RH
52{
53 asection *return_section;
54 char *name;
b34976b6 55 bfd_boolean result = TRUE;
7c8ca0e4 56 flagword flags;
252b5132
RH
57
58 name = NULL;
59
88183869
DK
60 /* Handle long section names as in PE. On reading, we want to
61 accept long names if the format permits them at all, regardless
62 of the current state of the flag that dictates if we would generate
63 them in outputs; this construct checks if that is the case by
64 attempting to set the flag, without changing its state; the call
65 will fail for formats that do not support long names at all. */
66 if (bfd_coff_set_long_section_names (abfd, bfd_coff_long_section_names (abfd))
252b5132
RH
67 && hdr->s_name[0] == '/')
68 {
69 char buf[SCNNMLEN];
70 long strindex;
71 char *p;
72 const char *strings;
73
0408dee6
DK
74 /* Flag that this BFD uses long names, even though the format might
75 expect them to be off by default. This won't directly affect the
76 format of any output BFD created from this one, but the information
77 can be used to decide what to do. */
78 bfd_coff_set_long_section_names (abfd, TRUE);
252b5132
RH
79 memcpy (buf, hdr->s_name + 1, SCNNMLEN - 1);
80 buf[SCNNMLEN - 1] = '\0';
81 strindex = strtol (buf, &p, 10);
82 if (*p == '\0' && strindex >= 0)
83 {
84 strings = _bfd_coff_read_string_table (abfd);
85 if (strings == NULL)
b34976b6 86 return FALSE;
5a3f568b
NC
87 if ((bfd_size_type)(strindex + 2) >= obj_coff_strings_len (abfd))
88 return FALSE;
252b5132 89 strings += strindex;
a50b1753 90 name = (char *) bfd_alloc (abfd,
a29a8af8 91 (bfd_size_type) strlen (strings) + 1 + 1);
252b5132 92 if (name == NULL)
b34976b6 93 return FALSE;
252b5132
RH
94 strcpy (name, strings);
95 }
96 }
97
98 if (name == NULL)
99 {
100 /* Assorted wastage to null-terminate the name, thanks AT&T! */
a50b1753 101 name = (char *) bfd_alloc (abfd,
a29a8af8 102 (bfd_size_type) sizeof (hdr->s_name) + 1 + 1);
252b5132 103 if (name == NULL)
b34976b6 104 return FALSE;
252b5132
RH
105 strncpy (name, (char *) &hdr->s_name[0], sizeof (hdr->s_name));
106 name[sizeof (hdr->s_name)] = 0;
107 }
108
109 return_section = bfd_make_section_anyway (abfd, name);
110 if (return_section == NULL)
b34976b6 111 return FALSE;
252b5132
RH
112
113 return_section->vma = hdr->s_vaddr;
114 return_section->lma = hdr->s_paddr;
eea6121a 115 return_section->size = hdr->s_size;
252b5132
RH
116 return_section->filepos = hdr->s_scnptr;
117 return_section->rel_filepos = hdr->s_relptr;
118 return_section->reloc_count = hdr->s_nreloc;
119
120 bfd_coff_set_alignment_hook (abfd, return_section, hdr);
121
122 return_section->line_filepos = hdr->s_lnnoptr;
123
124 return_section->lineno_count = hdr->s_nlnno;
125 return_section->userdata = NULL;
c8e7bf0d 126 return_section->next = NULL;
252b5132 127 return_section->target_index = target_index;
7c8ca0e4
NC
128
129 if (! bfd_coff_styp_to_sec_flags_hook (abfd, hdr, name, return_section,
130 & flags))
b34976b6 131 result = FALSE;
dc810e39 132
7c8ca0e4 133 return_section->flags = flags;
252b5132
RH
134
135 /* At least on i386-coff, the line number count for a shared library
136 section must be ignored. */
137 if ((return_section->flags & SEC_COFF_SHARED_LIBRARY) != 0)
138 return_section->lineno_count = 0;
139
140 if (hdr->s_nreloc != 0)
141 return_section->flags |= SEC_RELOC;
c8e7bf0d 142 /* FIXME: should this check 'hdr->s_size > 0'. */
252b5132
RH
143 if (hdr->s_scnptr != 0)
144 return_section->flags |= SEC_HAS_CONTENTS;
7c8ca0e4 145
a29a8af8
KT
146 /* Compress/decompress DWARF debug sections with names: .debug_* and
147 .zdebug_*, after the section flags is set. */
148 if ((flags & SEC_DEBUGGING)
a1165289 149 && strlen (name) > 7
a29a8af8 150 && ((name[1] == 'd' && name[6] == '_')
a1165289 151 || (strlen (name) > 8 && name[1] == 'z' && name[7] == '_')))
a29a8af8
KT
152 {
153 enum { nothing, compress, decompress } action = nothing;
154 char *new_name = NULL;
155
156 if (bfd_is_section_compressed (abfd, return_section))
157 {
158 /* Compressed section. Check if we should decompress. */
159 if ((abfd->flags & BFD_DECOMPRESS))
160 action = decompress;
161 }
162 else if (!bfd_is_section_compressed (abfd, return_section))
163 {
164 /* Normal section. Check if we should compress. */
165 if ((abfd->flags & BFD_COMPRESS) && return_section->size != 0)
166 action = compress;
167 }
168
169 switch (action)
170 {
171 case nothing:
172 break;
173 case compress:
174 if (!bfd_init_section_compress_status (abfd, return_section))
175 {
176 (*_bfd_error_handler)
177 (_("%B: unable to initialize compress status for section %s"),
178 abfd, name);
179 return FALSE;
180 }
181 if (name[1] != 'z')
182 {
183 unsigned int len = strlen (name);
184
185 new_name = bfd_alloc (abfd, len + 2);
186 if (new_name == NULL)
187 return FALSE;
188 new_name[0] = '.';
189 new_name[1] = 'z';
190 memcpy (new_name + 2, name + 1, len);
191 }
192 break;
193 case decompress:
194 if (!bfd_init_section_decompress_status (abfd, return_section))
195 {
196 (*_bfd_error_handler)
197 (_("%B: unable to initialize decompress status for section %s"),
198 abfd, name);
199 return FALSE;
200 }
201 if (name[1] == 'z')
202 {
203 unsigned int len = strlen (name);
204
205 new_name = bfd_alloc (abfd, len);
206 if (new_name == NULL)
207 return FALSE;
208 new_name[0] = '.';
209 memcpy (new_name + 1, name + 2, len - 1);
210 }
211 break;
212 }
213 if (new_name != NULL)
214 bfd_rename_section (abfd, return_section, new_name);
215 }
216
7c8ca0e4 217 return result;
252b5132
RH
218}
219
220/* Read in a COFF object and make it into a BFD. This is used by
221 ECOFF as well. */
ce63b7b3
KT
222const bfd_target *
223coff_real_object_p (bfd *,
224 unsigned,
225 struct internal_filehdr *,
226 struct internal_aouthdr *);
227const bfd_target *
c8e7bf0d
NC
228coff_real_object_p (bfd *abfd,
229 unsigned nscns,
230 struct internal_filehdr *internal_f,
231 struct internal_aouthdr *internal_a)
252b5132
RH
232{
233 flagword oflags = abfd->flags;
234 bfd_vma ostart = bfd_get_start_address (abfd);
c8e7bf0d
NC
235 void * tdata;
236 void * tdata_save;
237 bfd_size_type readsize; /* Length of file_info. */
252b5132
RH
238 unsigned int scnhsz;
239 char *external_sections;
240
241 if (!(internal_f->f_flags & F_RELFLG))
242 abfd->flags |= HAS_RELOC;
243 if ((internal_f->f_flags & F_EXEC))
244 abfd->flags |= EXEC_P;
245 if (!(internal_f->f_flags & F_LNNO))
246 abfd->flags |= HAS_LINENO;
247 if (!(internal_f->f_flags & F_LSYMS))
248 abfd->flags |= HAS_LOCALS;
249
250 /* FIXME: How can we set D_PAGED correctly? */
251 if ((internal_f->f_flags & F_EXEC) != 0)
252 abfd->flags |= D_PAGED;
253
254 bfd_get_symcount (abfd) = internal_f->f_nsyms;
255 if (internal_f->f_nsyms)
256 abfd->flags |= HAS_SYMS;
257
258 if (internal_a != (struct internal_aouthdr *) NULL)
259 bfd_get_start_address (abfd) = internal_a->entry;
260 else
261 bfd_get_start_address (abfd) = 0;
262
263 /* Set up the tdata area. ECOFF uses its own routine, and overrides
264 abfd->flags. */
487e54f2 265 tdata_save = abfd->tdata.any;
c8e7bf0d 266 tdata = bfd_coff_mkobject_hook (abfd, (void *) internal_f, (void *) internal_a);
252b5132 267 if (tdata == NULL)
487e54f2 268 goto fail2;
252b5132
RH
269
270 scnhsz = bfd_coff_scnhsz (abfd);
dc810e39 271 readsize = (bfd_size_type) nscns * scnhsz;
a50b1753 272 external_sections = (char *) bfd_alloc (abfd, readsize);
252b5132
RH
273 if (!external_sections)
274 goto fail;
275
c8e7bf0d 276 if (bfd_bread ((void *) external_sections, readsize, abfd) != readsize)
252b5132
RH
277 goto fail;
278
363d7b14 279 /* Set the arch/mach *before* swapping in sections; section header swapping
244148ad 280 may depend on arch/mach info. */
c8e7bf0d 281 if (! bfd_coff_set_arch_mach_hook (abfd, (void *) internal_f))
363d7b14
TW
282 goto fail;
283
e16bb312 284 /* Now copy data as required; construct all asections etc. */
252b5132
RH
285 if (nscns != 0)
286 {
287 unsigned int i;
288 for (i = 0; i < nscns; i++)
289 {
290 struct internal_scnhdr tmp;
291 bfd_coff_swap_scnhdr_in (abfd,
c8e7bf0d
NC
292 (void *) (external_sections + i * scnhsz),
293 (void *) & tmp);
252b5132
RH
294 if (! make_a_section_from_file (abfd, &tmp, i + 1))
295 goto fail;
296 }
297 }
298
252b5132
RH
299 return abfd->xvec;
300
301 fail:
302 bfd_release (abfd, tdata);
487e54f2
AM
303 fail2:
304 abfd->tdata.any = tdata_save;
252b5132
RH
305 abfd->flags = oflags;
306 bfd_get_start_address (abfd) = ostart;
307 return (const bfd_target *) NULL;
308}
309
310/* Turn a COFF file into a BFD, but fail with bfd_error_wrong_format if it is
311 not a COFF file. This is also used by ECOFF. */
312
313const bfd_target *
c8e7bf0d 314coff_object_p (bfd *abfd)
252b5132 315{
dc810e39
AM
316 bfd_size_type filhsz;
317 bfd_size_type aoutsz;
318 unsigned int nscns;
c8e7bf0d 319 void * filehdr;
252b5132
RH
320 struct internal_filehdr internal_f;
321 struct internal_aouthdr internal_a;
322
c8e7bf0d 323 /* Figure out how much to read. */
252b5132
RH
324 filhsz = bfd_coff_filhsz (abfd);
325 aoutsz = bfd_coff_aoutsz (abfd);
326
327 filehdr = bfd_alloc (abfd, filhsz);
328 if (filehdr == NULL)
487e54f2 329 return NULL;
dc810e39 330 if (bfd_bread (filehdr, filhsz, abfd) != filhsz)
252b5132
RH
331 {
332 if (bfd_get_error () != bfd_error_system_call)
333 bfd_set_error (bfd_error_wrong_format);
487e54f2
AM
334 bfd_release (abfd, filehdr);
335 return NULL;
252b5132
RH
336 }
337 bfd_coff_swap_filehdr_in (abfd, filehdr, &internal_f);
338 bfd_release (abfd, filehdr);
339
b8819ab2
NC
340 /* The XCOFF format has two sizes for the f_opthdr. SMALL_AOUTSZ
341 (less than aoutsz) used in object files and AOUTSZ (equal to
342 aoutsz) in executables. The bfd_coff_swap_aouthdr_in function
343 expects this header to be aoutsz bytes in length, so we use that
344 value in the call to bfd_alloc below. But we must be careful to
345 only read in f_opthdr bytes in the call to bfd_bread. We should
346 also attempt to catch corrupt or non-COFF binaries with a strange
347 value for f_opthdr. */
82e51918 348 if (! bfd_coff_bad_format_hook (abfd, &internal_f)
95f7d9f7 349 || internal_f.f_opthdr > aoutsz)
252b5132
RH
350 {
351 bfd_set_error (bfd_error_wrong_format);
487e54f2 352 return NULL;
252b5132
RH
353 }
354 nscns = internal_f.f_nscns;
355
356 if (internal_f.f_opthdr)
357 {
c8e7bf0d 358 void * opthdr;
252b5132
RH
359
360 opthdr = bfd_alloc (abfd, aoutsz);
361 if (opthdr == NULL)
487e54f2 362 return NULL;
dc810e39 363 if (bfd_bread (opthdr, (bfd_size_type) internal_f.f_opthdr, abfd)
252b5132
RH
364 != internal_f.f_opthdr)
365 {
487e54f2
AM
366 bfd_release (abfd, opthdr);
367 return NULL;
252b5132 368 }
a1165289
NC
369 /* PR 17512: file: 11056-1136-0.004. */
370 if (internal_f.f_opthdr < aoutsz)
371 memset (((char *) opthdr) + internal_f.f_opthdr, 0, aoutsz - internal_f.f_opthdr);
372
c8e7bf0d 373 bfd_coff_swap_aouthdr_in (abfd, opthdr, (void *) &internal_a);
487e54f2 374 bfd_release (abfd, opthdr);
252b5132
RH
375 }
376
377 return coff_real_object_p (abfd, nscns, &internal_f,
378 (internal_f.f_opthdr != 0
379 ? &internal_a
380 : (struct internal_aouthdr *) NULL));
381}
382
383/* Get the BFD section from a COFF symbol section number. */
384
385asection *
91d6fa6a 386coff_section_from_bfd_index (bfd *abfd, int section_index)
252b5132 387{
198beae2 388 struct bfd_section *answer = abfd->sections;
252b5132 389
91d6fa6a 390 if (section_index == N_ABS)
252b5132 391 return bfd_abs_section_ptr;
91d6fa6a 392 if (section_index == N_UNDEF)
252b5132 393 return bfd_und_section_ptr;
91d6fa6a 394 if (section_index == N_DEBUG)
252b5132
RH
395 return bfd_abs_section_ptr;
396
397 while (answer)
398 {
91d6fa6a 399 if (answer->target_index == section_index)
252b5132
RH
400 return answer;
401 answer = answer->next;
402 }
403
404 /* We should not reach this point, but the SCO 3.2v4 /lib/libc_s.a
405 has a bad symbol table in biglitpow.o. */
406 return bfd_und_section_ptr;
407}
408
409/* Get the upper bound of a COFF symbol table. */
410
411long
c8e7bf0d 412coff_get_symtab_upper_bound (bfd *abfd)
252b5132
RH
413{
414 if (!bfd_coff_slurp_symbol_table (abfd))
415 return -1;
416
417 return (bfd_get_symcount (abfd) + 1) * (sizeof (coff_symbol_type *));
418}
419
252b5132
RH
420/* Canonicalize a COFF symbol table. */
421
422long
c8e7bf0d 423coff_canonicalize_symtab (bfd *abfd, asymbol **alocation)
252b5132
RH
424{
425 unsigned int counter;
426 coff_symbol_type *symbase;
427 coff_symbol_type **location = (coff_symbol_type **) alocation;
428
429 if (!bfd_coff_slurp_symbol_table (abfd))
430 return -1;
431
432 symbase = obj_symbols (abfd);
433 counter = bfd_get_symcount (abfd);
434 while (counter-- > 0)
435 *location++ = symbase++;
436
437 *location = NULL;
438
439 return bfd_get_symcount (abfd);
440}
441
442/* Get the name of a symbol. The caller must pass in a buffer of size
443 >= SYMNMLEN + 1. */
444
445const char *
c8e7bf0d
NC
446_bfd_coff_internal_syment_name (bfd *abfd,
447 const struct internal_syment *sym,
448 char *buf)
252b5132
RH
449{
450 /* FIXME: It's not clear this will work correctly if sizeof
451 (_n_zeroes) != 4. */
452 if (sym->_n._n_n._n_zeroes != 0
453 || sym->_n._n_n._n_offset == 0)
454 {
455 memcpy (buf, sym->_n._n_name, SYMNMLEN);
456 buf[SYMNMLEN] = '\0';
457 return buf;
458 }
459 else
460 {
461 const char *strings;
462
463 BFD_ASSERT (sym->_n._n_n._n_offset >= STRING_SIZE_SIZE);
464 strings = obj_coff_strings (abfd);
465 if (strings == NULL)
466 {
467 strings = _bfd_coff_read_string_table (abfd);
468 if (strings == NULL)
469 return NULL;
470 }
5a3f568b
NC
471 if (sym->_n._n_n._n_offset >= obj_coff_strings_len (abfd))
472 return NULL;
252b5132
RH
473 return strings + sym->_n._n_n._n_offset;
474 }
475}
476
477/* Read in and swap the relocs. This returns a buffer holding the
b34976b6 478 relocs for section SEC in file ABFD. If CACHE is TRUE and
252b5132
RH
479 INTERNAL_RELOCS is NULL, the relocs read in will be saved in case
480 the function is called again. If EXTERNAL_RELOCS is not NULL, it
481 is a buffer large enough to hold the unswapped relocs. If
482 INTERNAL_RELOCS is not NULL, it is a buffer large enough to hold
b34976b6 483 the swapped relocs. If REQUIRE_INTERNAL is TRUE, then the return
252b5132
RH
484 value must be INTERNAL_RELOCS. The function returns NULL on error. */
485
486struct internal_reloc *
c8e7bf0d
NC
487_bfd_coff_read_internal_relocs (bfd *abfd,
488 asection *sec,
489 bfd_boolean cache,
490 bfd_byte *external_relocs,
491 bfd_boolean require_internal,
492 struct internal_reloc *internal_relocs)
252b5132
RH
493{
494 bfd_size_type relsz;
495 bfd_byte *free_external = NULL;
496 struct internal_reloc *free_internal = NULL;
497 bfd_byte *erel;
498 bfd_byte *erel_end;
499 struct internal_reloc *irel;
dc810e39 500 bfd_size_type amt;
252b5132 501
9d7038d3
MS
502 if (sec->reloc_count == 0)
503 return internal_relocs; /* Nothing to do. */
504
252b5132
RH
505 if (coff_section_data (abfd, sec) != NULL
506 && coff_section_data (abfd, sec)->relocs != NULL)
507 {
508 if (! require_internal)
509 return coff_section_data (abfd, sec)->relocs;
510 memcpy (internal_relocs, coff_section_data (abfd, sec)->relocs,
511 sec->reloc_count * sizeof (struct internal_reloc));
512 return internal_relocs;
513 }
514
515 relsz = bfd_coff_relsz (abfd);
516
dc810e39 517 amt = sec->reloc_count * relsz;
252b5132
RH
518 if (external_relocs == NULL)
519 {
a50b1753 520 free_external = (bfd_byte *) bfd_malloc (amt);
9d7038d3 521 if (free_external == NULL)
252b5132
RH
522 goto error_return;
523 external_relocs = free_external;
524 }
525
526 if (bfd_seek (abfd, sec->rel_filepos, SEEK_SET) != 0
dc810e39 527 || bfd_bread (external_relocs, amt, abfd) != amt)
252b5132
RH
528 goto error_return;
529
530 if (internal_relocs == NULL)
531 {
dc810e39
AM
532 amt = sec->reloc_count;
533 amt *= sizeof (struct internal_reloc);
a50b1753 534 free_internal = (struct internal_reloc *) bfd_malloc (amt);
9d7038d3 535 if (free_internal == NULL)
252b5132
RH
536 goto error_return;
537 internal_relocs = free_internal;
538 }
539
540 /* Swap in the relocs. */
541 erel = external_relocs;
542 erel_end = erel + relsz * sec->reloc_count;
543 irel = internal_relocs;
544 for (; erel < erel_end; erel += relsz, irel++)
c8e7bf0d 545 bfd_coff_swap_reloc_in (abfd, (void *) erel, (void *) irel);
252b5132
RH
546
547 if (free_external != NULL)
548 {
549 free (free_external);
550 free_external = NULL;
551 }
552
9ee2139f 553 if (cache && free_internal != NULL)
252b5132 554 {
9ee2139f 555 if (coff_section_data (abfd, sec) == NULL)
252b5132 556 {
9ee2139f
MS
557 amt = sizeof (struct coff_section_tdata);
558 sec->used_by_bfd = bfd_zalloc (abfd, amt);
559 if (sec->used_by_bfd == NULL)
560 goto error_return;
561 coff_section_data (abfd, sec)->contents = NULL;
252b5132 562 }
9ee2139f 563 coff_section_data (abfd, sec)->relocs = free_internal;
252b5132
RH
564 }
565
566 return internal_relocs;
567
568 error_return:
569 if (free_external != NULL)
570 free (free_external);
571 if (free_internal != NULL)
572 free (free_internal);
573 return NULL;
574}
575
576/* Set lineno_count for the output sections of a COFF file. */
577
578int
c8e7bf0d 579coff_count_linenumbers (bfd *abfd)
252b5132
RH
580{
581 unsigned int limit = bfd_get_symcount (abfd);
582 unsigned int i;
583 int total = 0;
584 asymbol **p;
585 asection *s;
586
587 if (limit == 0)
588 {
589 /* This may be from the backend linker, in which case the
590 lineno_count in the sections is correct. */
591 for (s = abfd->sections; s != NULL; s = s->next)
592 total += s->lineno_count;
593 return total;
594 }
595
596 for (s = abfd->sections; s != NULL; s = s->next)
597 BFD_ASSERT (s->lineno_count == 0);
598
599 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
600 {
601 asymbol *q_maybe = *p;
602
9bd09e22 603 if (bfd_family_coff (bfd_asymbol_bfd (q_maybe)))
252b5132
RH
604 {
605 coff_symbol_type *q = coffsymbol (q_maybe);
606
607 /* The AIX 4.1 compiler can sometimes generate line numbers
608 attached to debugging symbols. We try to simply ignore
609 those here. */
610 if (q->lineno != NULL
611 && q->symbol.section->owner != NULL)
612 {
613 /* This symbol has line numbers. Increment the owning
614 section's linenumber count. */
615 alent *l = q->lineno;
616
84c254c6 617 do
252b5132 618 {
84c254c6 619 asection * sec = q->symbol.section->output_section;
b34976b6 620
84c254c6
NC
621 /* Do not try to update fields in read-only sections. */
622 if (! bfd_is_const_section (sec))
623 sec->lineno_count ++;
624
252b5132 625 ++total;
252b5132
RH
626 ++l;
627 }
84c254c6 628 while (l->line_number != 0);
252b5132
RH
629 }
630 }
631 }
632
633 return total;
634}
635
636/* Takes a bfd and a symbol, returns a pointer to the coff specific
637 area of the symbol if there is one. */
638
252b5132 639coff_symbol_type *
c8e7bf0d
NC
640coff_symbol_from (bfd *ignore_abfd ATTRIBUTE_UNUSED,
641 asymbol *symbol)
252b5132 642{
9bd09e22 643 if (!bfd_family_coff (bfd_asymbol_bfd (symbol)))
252b5132
RH
644 return (coff_symbol_type *) NULL;
645
646 if (bfd_asymbol_bfd (symbol)->tdata.coff_obj_data == (coff_data_type *) NULL)
647 return (coff_symbol_type *) NULL;
648
649 return (coff_symbol_type *) symbol;
650}
651
652static void
c8e7bf0d
NC
653fixup_symbol_value (bfd *abfd,
654 coff_symbol_type *coff_symbol_ptr,
655 struct internal_syment *syment)
252b5132 656{
c8e7bf0d 657 /* Normalize the symbol flags. */
68ffbac6 658 if (coff_symbol_ptr->symbol.section
ac38308c 659 && bfd_is_com_section (coff_symbol_ptr->symbol.section))
252b5132 660 {
c8e7bf0d 661 /* A common symbol is undefined with a value. */
252b5132
RH
662 syment->n_scnum = N_UNDEF;
663 syment->n_value = coff_symbol_ptr->symbol.value;
664 }
703153b5
ILT
665 else if ((coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) != 0
666 && (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING_RELOC) == 0)
252b5132
RH
667 {
668 syment->n_value = coff_symbol_ptr->symbol.value;
669 }
670 else if (bfd_is_und_section (coff_symbol_ptr->symbol.section))
671 {
672 syment->n_scnum = N_UNDEF;
673 syment->n_value = 0;
674 }
7bb9db4d 675 /* FIXME: Do we need to handle the absolute section here? */
252b5132
RH
676 else
677 {
678 if (coff_symbol_ptr->symbol.section)
679 {
680 syment->n_scnum =
681 coff_symbol_ptr->symbol.section->output_section->target_index;
682
683 syment->n_value = (coff_symbol_ptr->symbol.value
684 + coff_symbol_ptr->symbol.section->output_offset);
685 if (! obj_pe (abfd))
34cbe64e
TW
686 {
687 syment->n_value += (syment->n_sclass == C_STATLAB)
688 ? coff_symbol_ptr->symbol.section->output_section->lma
689 : coff_symbol_ptr->symbol.section->output_section->vma;
690 }
252b5132
RH
691 }
692 else
693 {
694 BFD_ASSERT (0);
695 /* This can happen, but I don't know why yet (steve@cygnus.com) */
696 syment->n_scnum = N_ABS;
697 syment->n_value = coff_symbol_ptr->symbol.value;
698 }
699 }
700}
701
702/* Run through all the symbols in the symbol table and work out what
703 their indexes into the symbol table will be when output.
704
705 Coff requires that each C_FILE symbol points to the next one in the
706 chain, and that the last one points to the first external symbol. We
707 do that here too. */
708
b34976b6 709bfd_boolean
c8e7bf0d 710coff_renumber_symbols (bfd *bfd_ptr, int *first_undef)
252b5132
RH
711{
712 unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
713 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
714 unsigned int native_index = 0;
c8e7bf0d 715 struct internal_syment *last_file = NULL;
252b5132
RH
716 unsigned int symbol_index;
717
718 /* COFF demands that undefined symbols come after all other symbols.
719 Since we don't need to impose this extra knowledge on all our
720 client programs, deal with that here. Sort the symbol table;
721 just move the undefined symbols to the end, leaving the rest
722 alone. The O'Reilly book says that defined global symbols come
723 at the end before the undefined symbols, so we do that here as
724 well. */
725 /* @@ Do we have some condition we could test for, so we don't always
726 have to do this? I don't think relocatability is quite right, but
727 I'm not certain. [raeburn:19920508.1711EST] */
728 {
729 asymbol **newsyms;
730 unsigned int i;
dc810e39 731 bfd_size_type amt;
252b5132 732
dc810e39 733 amt = sizeof (asymbol *) * ((bfd_size_type) symbol_count + 1);
a50b1753 734 newsyms = (asymbol **) bfd_alloc (bfd_ptr, amt);
252b5132 735 if (!newsyms)
b34976b6 736 return FALSE;
252b5132
RH
737 bfd_ptr->outsymbols = newsyms;
738 for (i = 0; i < symbol_count; i++)
739 if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) != 0
740 || (!bfd_is_und_section (symbol_ptr_ptr[i]->section)
741 && !bfd_is_com_section (symbol_ptr_ptr[i]->section)
742 && ((symbol_ptr_ptr[i]->flags & BSF_FUNCTION) != 0
743 || ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_WEAK))
744 == 0))))
745 *newsyms++ = symbol_ptr_ptr[i];
746
747 for (i = 0; i < symbol_count; i++)
748 if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0
749 && !bfd_is_und_section (symbol_ptr_ptr[i]->section)
750 && (bfd_is_com_section (symbol_ptr_ptr[i]->section)
751 || ((symbol_ptr_ptr[i]->flags & BSF_FUNCTION) == 0
752 && ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_WEAK))
753 != 0))))
754 *newsyms++ = symbol_ptr_ptr[i];
755
756 *first_undef = newsyms - bfd_ptr->outsymbols;
757
758 for (i = 0; i < symbol_count; i++)
759 if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0
760 && bfd_is_und_section (symbol_ptr_ptr[i]->section))
761 *newsyms++ = symbol_ptr_ptr[i];
762 *newsyms = (asymbol *) NULL;
763 symbol_ptr_ptr = bfd_ptr->outsymbols;
764 }
765
766 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
767 {
768 coff_symbol_type *coff_symbol_ptr = coff_symbol_from (bfd_ptr, symbol_ptr_ptr[symbol_index]);
a5c71af8 769
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 {
813 coff_symbol_type *coff_symbol_ptr =
814 coff_symbol_from (bfd_ptr, symbol_ptr_ptr[symbol_index]);
815
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
833 for the symbol's section. On output, the symbol's
834 section should be N_DEBUG. */
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;
a5c71af8
NC
845
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 {
244148ad 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
904 strncpy (native->u.syment._n._n_name, ".file", SYMNMLEN);
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,
c8e7bf0d
NC
1078 bfd_vma *written,
1079 bfd_size_type *string_size_p,
1080 asection **debug_string_section_p,
1081 bfd_size_type *debug_string_size_p)
252b5132
RH
1082{
1083 combined_entry_type *native;
e7ebb214 1084 combined_entry_type dummy[2];
88e59394
DK
1085 asection *output_section = symbol->section->output_section
1086 ? symbol->section->output_section
1087 : symbol->section;
07c7ed6d 1088 struct bfd_link_info *link_info = coff_data (abfd)->link_info;
e7ebb214 1089 bfd_boolean ret;
252b5132 1090
07c7ed6d
KT
1091 if ((!link_info || link_info->strip_discarded)
1092 && !bfd_is_abs_section (symbol->section)
1093 && symbol->section->output_section == bfd_abs_section_ptr)
1094 {
1095 symbol->name = "";
e7ebb214 1096 if (isym != NULL)
a5c71af8 1097 memset (isym, 0, sizeof (*isym));
07c7ed6d
KT
1098 return TRUE;
1099 }
e7ebb214 1100 native = dummy;
a5c71af8
NC
1101 native->is_sym = TRUE;
1102 native[1].is_sym = FALSE;
252b5132
RH
1103 native->u.syment.n_type = T_NULL;
1104 native->u.syment.n_flags = 0;
e7ebb214 1105 native->u.syment.n_numaux = 0;
252b5132
RH
1106 if (bfd_is_und_section (symbol->section))
1107 {
1108 native->u.syment.n_scnum = N_UNDEF;
1109 native->u.syment.n_value = symbol->value;
1110 }
1111 else if (bfd_is_com_section (symbol->section))
1112 {
1113 native->u.syment.n_scnum = N_UNDEF;
1114 native->u.syment.n_value = symbol->value;
1115 }
e7ebb214
JB
1116 else if (symbol->flags & BSF_FILE)
1117 {
1118 native->u.syment.n_scnum = N_DEBUG;
1119 native->u.syment.n_numaux = 1;
1120 }
252b5132
RH
1121 else if (symbol->flags & BSF_DEBUGGING)
1122 {
1123 /* There isn't much point to writing out a debugging symbol
1124 unless we are prepared to convert it into COFF debugging
1125 format. So, we just ignore them. We must clobber the symbol
1126 name to keep it from being put in the string table. */
1127 symbol->name = "";
e7ebb214 1128 if (isym != NULL)
a5c71af8 1129 memset (isym, 0, sizeof (*isym));
b34976b6 1130 return TRUE;
252b5132
RH
1131 }
1132 else
1133 {
88e59394 1134 native->u.syment.n_scnum = output_section->target_index;
252b5132
RH
1135 native->u.syment.n_value = (symbol->value
1136 + symbol->section->output_offset);
1137 if (! obj_pe (abfd))
88e59394 1138 native->u.syment.n_value += output_section->vma;
252b5132 1139
08da05b0 1140 /* Copy the any flags from the file header into the symbol.
252b5132
RH
1141 FIXME: Why? */
1142 {
1143 coff_symbol_type *c = coff_symbol_from (abfd, symbol);
1144 if (c != (coff_symbol_type *) NULL)
1145 native->u.syment.n_flags = bfd_asymbol_bfd (&c->symbol)->flags;
1146 }
1147 }
1148
1149 native->u.syment.n_type = 0;
e7ebb214
JB
1150 if (symbol->flags & BSF_FILE)
1151 native->u.syment.n_sclass = C_FILE;
1152 else if (symbol->flags & BSF_LOCAL)
252b5132
RH
1153 native->u.syment.n_sclass = C_STAT;
1154 else if (symbol->flags & BSF_WEAK)
1155 native->u.syment.n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT;
1156 else
1157 native->u.syment.n_sclass = C_EXT;
252b5132 1158
e7ebb214
JB
1159 ret = coff_write_symbol (abfd, symbol, native, written, string_size_p,
1160 debug_string_section_p, debug_string_size_p);
1161 if (isym != NULL)
1162 *isym = native->u.syment;
1163 return ret;
252b5132
RH
1164}
1165
1166/* Write a native symbol to a COFF file. */
1167
b34976b6 1168static bfd_boolean
c8e7bf0d
NC
1169coff_write_native_symbol (bfd *abfd,
1170 coff_symbol_type *symbol,
1171 bfd_vma *written,
1172 bfd_size_type *string_size_p,
1173 asection **debug_string_section_p,
1174 bfd_size_type *debug_string_size_p)
252b5132
RH
1175{
1176 combined_entry_type *native = symbol->native;
1177 alent *lineno = symbol->lineno;
07c7ed6d
KT
1178 struct bfd_link_info *link_info = coff_data (abfd)->link_info;
1179
1180 if ((!link_info || link_info->strip_discarded)
1181 && !bfd_is_abs_section (symbol->symbol.section)
1182 && symbol->symbol.section->output_section == bfd_abs_section_ptr)
1183 {
1184 symbol->symbol.name = "";
1185 return TRUE;
1186 }
252b5132 1187
a5c71af8 1188 BFD_ASSERT (native->is_sym);
252b5132
RH
1189 /* If this symbol has an associated line number, we must store the
1190 symbol index in the line number field. We also tag the auxent to
1191 point to the right place in the lineno table. */
1192 if (lineno && !symbol->done_lineno && symbol->symbol.section->owner != NULL)
1193 {
1194 unsigned int count = 0;
c8e7bf0d 1195
252b5132
RH
1196 lineno[count].u.offset = *written;
1197 if (native->u.syment.n_numaux)
1198 {
1199 union internal_auxent *a = &((native + 1)->u.auxent);
1200
1201 a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
1202 symbol->symbol.section->output_section->moving_line_filepos;
1203 }
1204
1205 /* Count and relocate all other linenumbers. */
1206 count++;
1207 while (lineno[count].line_number != 0)
1208 {
252b5132
RH
1209 lineno[count].u.offset +=
1210 (symbol->symbol.section->output_section->vma
1211 + symbol->symbol.section->output_offset);
252b5132
RH
1212 count++;
1213 }
b34976b6 1214 symbol->done_lineno = TRUE;
252b5132 1215
84c254c6
NC
1216 if (! bfd_is_const_section (symbol->symbol.section->output_section))
1217 symbol->symbol.section->output_section->moving_line_filepos +=
1218 count * bfd_coff_linesz (abfd);
252b5132
RH
1219 }
1220
1221 return coff_write_symbol (abfd, &(symbol->symbol), native, written,
1222 string_size_p, debug_string_section_p,
1223 debug_string_size_p);
1224}
1225
e144674a
NC
1226static void
1227null_error_handler (const char * fmt ATTRIBUTE_UNUSED, ...)
1228{
1229}
1230
252b5132
RH
1231/* Write out the COFF symbols. */
1232
b34976b6 1233bfd_boolean
c8e7bf0d 1234coff_write_symbols (bfd *abfd)
252b5132
RH
1235{
1236 bfd_size_type string_size;
1237 asection *debug_string_section;
1238 bfd_size_type debug_string_size;
1239 unsigned int i;
1240 unsigned int limit = bfd_get_symcount (abfd);
f075ee0c 1241 bfd_vma written = 0;
252b5132
RH
1242 asymbol **p;
1243
1244 string_size = 0;
1245 debug_string_section = NULL;
1246 debug_string_size = 0;
1247
1248 /* If this target supports long section names, they must be put into
1249 the string table. This is supported by PE. This code must
1250 handle section names just as they are handled in
1251 coff_write_object_contents. */
1252 if (bfd_coff_long_section_names (abfd))
1253 {
1254 asection *o;
1255
1256 for (o = abfd->sections; o != NULL; o = o->next)
1257 {
1258 size_t len;
1259
1260 len = strlen (o->name);
1261 if (len > SCNNMLEN)
1262 string_size += len + 1;
1263 }
1264 }
1265
c8e7bf0d 1266 /* Seek to the right place. */
252b5132 1267 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0)
b34976b6 1268 return FALSE;
252b5132 1269
c8e7bf0d 1270 /* Output all the symbols we have. */
252b5132
RH
1271 written = 0;
1272 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
1273 {
1274 asymbol *symbol = *p;
1275 coff_symbol_type *c_symbol = coff_symbol_from (abfd, symbol);
1276
1277 if (c_symbol == (coff_symbol_type *) NULL
1278 || c_symbol->native == (combined_entry_type *) NULL)
1279 {
e7ebb214
JB
1280 if (!coff_write_alien_symbol (abfd, symbol, NULL, &written,
1281 &string_size, &debug_string_section,
252b5132 1282 &debug_string_size))
b34976b6 1283 return FALSE;
252b5132
RH
1284 }
1285 else
1286 {
e144674a
NC
1287 if (coff_backend_info (abfd)->_bfd_coff_classify_symbol != NULL)
1288 {
1289 bfd_error_handler_type current_error_handler;
96d56e9f 1290 enum coff_symbol_classification sym_class;
e144674a
NC
1291 unsigned char *n_sclass;
1292
1293 /* Suppress error reporting by bfd_coff_classify_symbol.
1294 Error messages can be generated when we are processing a local
1295 symbol which has no associated section and we do not have to
1296 worry about this, all we need to know is that it is local. */
1297 current_error_handler = bfd_set_error_handler (null_error_handler);
a5c71af8 1298 BFD_ASSERT (c_symbol->native->is_sym);
96d56e9f 1299 sym_class = bfd_coff_classify_symbol (abfd,
a5c71af8 1300 &c_symbol->native->u.syment);
e144674a 1301 (void) bfd_set_error_handler (current_error_handler);
96d56e9f 1302
e144674a
NC
1303 n_sclass = &c_symbol->native->u.syment.n_sclass;
1304
1305 /* If the symbol class has been changed (eg objcopy/ld script/etc)
1306 we cannot retain the existing sclass from the original symbol.
1307 Weak symbols only have one valid sclass, so just set it always.
1308 If it is not local class and should be, set it C_STAT.
1309 If it is global and not classified as global, or if it is
1310 weak (which is also classified as global), set it C_EXT. */
1311
1312 if (symbol->flags & BSF_WEAK)
1313 *n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT;
96d56e9f 1314 else if (symbol->flags & BSF_LOCAL && sym_class != COFF_SYMBOL_LOCAL)
e144674a
NC
1315 *n_sclass = C_STAT;
1316 else if (symbol->flags & BSF_GLOBAL
96d56e9f 1317 && (sym_class != COFF_SYMBOL_GLOBAL
e144674a
NC
1318#ifdef COFF_WITH_PE
1319 || *n_sclass == C_NT_WEAK
1320#endif
1321 || *n_sclass == C_WEAKEXT))
1322 c_symbol->native->u.syment.n_sclass = C_EXT;
1323 }
1324
252b5132
RH
1325 if (!coff_write_native_symbol (abfd, c_symbol, &written,
1326 &string_size, &debug_string_section,
1327 &debug_string_size))
b34976b6 1328 return FALSE;
252b5132
RH
1329 }
1330 }
1331
1332 obj_raw_syment_count (abfd) = written;
1333
c8e7bf0d 1334 /* Now write out strings. */
252b5132
RH
1335 if (string_size != 0)
1336 {
1337 unsigned int size = string_size + STRING_SIZE_SIZE;
1338 bfd_byte buffer[STRING_SIZE_SIZE];
1339
1340#if STRING_SIZE_SIZE == 4
dc810e39 1341 H_PUT_32 (abfd, size, buffer);
252b5132 1342#else
dc810e39 1343 #error Change H_PUT_32
252b5132 1344#endif
c8e7bf0d 1345 if (bfd_bwrite ((void *) buffer, (bfd_size_type) sizeof (buffer), abfd)
dc810e39 1346 != sizeof (buffer))
b34976b6 1347 return FALSE;
252b5132
RH
1348
1349 /* Handle long section names. This code must handle section
1350 names just as they are handled in coff_write_object_contents. */
1351 if (bfd_coff_long_section_names (abfd))
1352 {
1353 asection *o;
1354
1355 for (o = abfd->sections; o != NULL; o = o->next)
1356 {
1357 size_t len;
1358
1359 len = strlen (o->name);
1360 if (len > SCNNMLEN)
1361 {
dc810e39
AM
1362 if (bfd_bwrite (o->name, (bfd_size_type) (len + 1), abfd)
1363 != len + 1)
b34976b6 1364 return FALSE;
252b5132
RH
1365 }
1366 }
1367 }
1368
1369 for (p = abfd->outsymbols, i = 0;
1370 i < limit;
1371 i++, p++)
1372 {
1373 asymbol *q = *p;
1374 size_t name_length = strlen (q->name);
1375 coff_symbol_type *c_symbol = coff_symbol_from (abfd, q);
1376 size_t maxlen;
1377
1378 /* Figure out whether the symbol name should go in the string
1379 table. Symbol names that are short enough are stored
1380 directly in the syment structure. File names permit a
1381 different, longer, length in the syment structure. On
1382 XCOFF, some symbol names are stored in the .debug section
1383 rather than in the string table. */
1384
1385 if (c_symbol == NULL
1386 || c_symbol->native == NULL)
c8e7bf0d
NC
1387 /* This is not a COFF symbol, so it certainly is not a
1388 file name, nor does it go in the .debug section. */
1389 maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
1390
a5c71af8
NC
1391 else if (! c_symbol->native->is_sym)
1392 maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
1393
252b5132
RH
1394 else if (bfd_coff_symname_in_debug (abfd,
1395 &c_symbol->native->u.syment))
c8e7bf0d
NC
1396 /* This symbol name is in the XCOFF .debug section.
1397 Don't write it into the string table. */
1398 maxlen = name_length;
1399
252b5132
RH
1400 else if (c_symbol->native->u.syment.n_sclass == C_FILE
1401 && c_symbol->native->u.syment.n_numaux > 0)
7f6d05e8 1402 {
244148ad 1403 if (bfd_coff_force_symnames_in_strings (abfd))
dc810e39
AM
1404 {
1405 if (bfd_bwrite (".file", (bfd_size_type) 6, abfd) != 6)
b34976b6 1406 return FALSE;
dc810e39 1407 }
7f6d05e8
CP
1408 maxlen = bfd_coff_filnmlen (abfd);
1409 }
252b5132 1410 else
7f6d05e8 1411 maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
252b5132
RH
1412
1413 if (name_length > maxlen)
1414 {
c8e7bf0d 1415 if (bfd_bwrite ((void *) (q->name), (bfd_size_type) name_length + 1,
dc810e39 1416 abfd) != name_length + 1)
b34976b6 1417 return FALSE;
252b5132
RH
1418 }
1419 }
1420 }
1421 else
1422 {
1423 /* We would normally not write anything here, but we'll write
1424 out 4 so that any stupid coff reader which tries to read the
1425 string table even when there isn't one won't croak. */
1426 unsigned int size = STRING_SIZE_SIZE;
1427 bfd_byte buffer[STRING_SIZE_SIZE];
1428
1429#if STRING_SIZE_SIZE == 4
dc810e39 1430 H_PUT_32 (abfd, size, buffer);
252b5132 1431#else
dc810e39 1432 #error Change H_PUT_32
252b5132 1433#endif
c8e7bf0d 1434 if (bfd_bwrite ((void *) buffer, (bfd_size_type) STRING_SIZE_SIZE, abfd)
252b5132 1435 != STRING_SIZE_SIZE)
b34976b6 1436 return FALSE;
252b5132
RH
1437 }
1438
1439 /* Make sure the .debug section was created to be the correct size.
1440 We should create it ourselves on the fly, but we don't because
1441 BFD won't let us write to any section until we know how large all
1442 the sections are. We could still do it by making another pass
1443 over the symbols. FIXME. */
1444 BFD_ASSERT (debug_string_size == 0
1445 || (debug_string_section != (asection *) NULL
1446 && (BFD_ALIGN (debug_string_size,
1447 1 << debug_string_section->alignment_power)
eea6121a 1448 == debug_string_section->size)));
252b5132 1449
b34976b6 1450 return TRUE;
252b5132
RH
1451}
1452
b34976b6 1453bfd_boolean
c8e7bf0d 1454coff_write_linenumbers (bfd *abfd)
252b5132
RH
1455{
1456 asection *s;
1457 bfd_size_type linesz;
c8e7bf0d 1458 void * buff;
252b5132
RH
1459
1460 linesz = bfd_coff_linesz (abfd);
1461 buff = bfd_alloc (abfd, linesz);
1462 if (!buff)
b34976b6 1463 return FALSE;
252b5132
RH
1464 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
1465 {
1466 if (s->lineno_count)
1467 {
1468 asymbol **q = abfd->outsymbols;
1469 if (bfd_seek (abfd, s->line_filepos, SEEK_SET) != 0)
b34976b6 1470 return FALSE;
c8e7bf0d 1471 /* Find all the linenumbers in this section. */
252b5132
RH
1472 while (*q)
1473 {
1474 asymbol *p = *q;
1475 if (p->section->output_section == s)
1476 {
1477 alent *l =
1478 BFD_SEND (bfd_asymbol_bfd (p), _get_lineno,
1479 (bfd_asymbol_bfd (p), p));
1480 if (l)
1481 {
c8e7bf0d 1482 /* Found a linenumber entry, output. */
252b5132 1483 struct internal_lineno out;
a5c71af8 1484
c8e7bf0d 1485 memset ((void *) & out, 0, sizeof (out));
252b5132
RH
1486 out.l_lnno = 0;
1487 out.l_addr.l_symndx = l->u.offset;
1488 bfd_coff_swap_lineno_out (abfd, &out, buff);
dc810e39
AM
1489 if (bfd_bwrite (buff, (bfd_size_type) linesz, abfd)
1490 != linesz)
b34976b6 1491 return FALSE;
252b5132
RH
1492 l++;
1493 while (l->line_number)
1494 {
1495 out.l_lnno = l->line_number;
1496 out.l_addr.l_symndx = l->u.offset;
1497 bfd_coff_swap_lineno_out (abfd, &out, buff);
dc810e39
AM
1498 if (bfd_bwrite (buff, (bfd_size_type) linesz, abfd)
1499 != linesz)
b34976b6 1500 return FALSE;
252b5132
RH
1501 l++;
1502 }
1503 }
1504 }
1505 q++;
1506 }
1507 }
1508 }
1509 bfd_release (abfd, buff);
b34976b6 1510 return TRUE;
252b5132
RH
1511}
1512
252b5132 1513alent *
c8e7bf0d 1514coff_get_lineno (bfd *ignore_abfd ATTRIBUTE_UNUSED, asymbol *symbol)
252b5132
RH
1515{
1516 return coffsymbol (symbol)->lineno;
1517}
1518
252b5132
RH
1519/* This function transforms the offsets into the symbol table into
1520 pointers to syments. */
1521
1522static void
c8e7bf0d
NC
1523coff_pointerize_aux (bfd *abfd,
1524 combined_entry_type *table_base,
1525 combined_entry_type *symbol,
1526 unsigned int indaux,
1527 combined_entry_type *auxent)
252b5132
RH
1528{
1529 unsigned int type = symbol->u.syment.n_type;
96d56e9f 1530 unsigned int n_sclass = symbol->u.syment.n_sclass;
252b5132 1531
a5c71af8 1532 BFD_ASSERT (symbol->is_sym);
252b5132
RH
1533 if (coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook)
1534 {
1535 if ((*coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook)
1536 (abfd, table_base, symbol, indaux, auxent))
1537 return;
1538 }
1539
c8e7bf0d 1540 /* Don't bother if this is a file or a section. */
96d56e9f 1541 if (n_sclass == C_STAT && type == T_NULL)
252b5132 1542 return;
96d56e9f 1543 if (n_sclass == C_FILE)
252b5132
RH
1544 return;
1545
a5c71af8 1546 BFD_ASSERT (! auxent->is_sym);
c8e7bf0d
NC
1547 /* Otherwise patch up. */
1548#define N_TMASK coff_data (abfd)->local_n_tmask
252b5132 1549#define N_BTSHFT coff_data (abfd)->local_n_btshft
68ffbac6 1550
96d56e9f
NC
1551 if ((ISFCN (type) || ISTAG (n_sclass) || n_sclass == C_BLOCK
1552 || n_sclass == C_FCN)
252b5132
RH
1553 && auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l > 0)
1554 {
1555 auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p =
1556 table_base + auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
1557 auxent->fix_end = 1;
1558 }
1559 /* A negative tagndx is meaningless, but the SCO 3.2v4 cc can
1560 generate one, so we must be careful to ignore it. */
1561 if (auxent->u.auxent.x_sym.x_tagndx.l > 0)
1562 {
1563 auxent->u.auxent.x_sym.x_tagndx.p =
1564 table_base + auxent->u.auxent.x_sym.x_tagndx.l;
1565 auxent->fix_tag = 1;
1566 }
1567}
1568
1569/* Allocate space for the ".debug" section, and read it.
1570 We did not read the debug section until now, because
244148ad 1571 we didn't want to go to the trouble until someone needed it. */
252b5132
RH
1572
1573static char *
5a3f568b 1574build_debug_section (bfd *abfd, asection ** sect_return)
252b5132
RH
1575{
1576 char *debug_section;
dc810e39
AM
1577 file_ptr position;
1578 bfd_size_type sec_size;
252b5132
RH
1579
1580 asection *sect = bfd_get_section_by_name (abfd, ".debug");
1581
1582 if (!sect)
1583 {
1584 bfd_set_error (bfd_error_no_debug_section);
1585 return NULL;
1586 }
1587
eea6121a 1588 sec_size = sect->size;
a50b1753 1589 debug_section = (char *) bfd_alloc (abfd, sec_size);
252b5132
RH
1590 if (debug_section == NULL)
1591 return NULL;
1592
244148ad 1593 /* Seek to the beginning of the `.debug' section and read it.
252b5132
RH
1594 Save the current position first; it is needed by our caller.
1595 Then read debug section and reset the file pointer. */
1596
1597 position = bfd_tell (abfd);
1598 if (bfd_seek (abfd, sect->filepos, SEEK_SET) != 0
dc810e39 1599 || bfd_bread (debug_section, sec_size, abfd) != sec_size
252b5132
RH
1600 || bfd_seek (abfd, position, SEEK_SET) != 0)
1601 return NULL;
5a3f568b
NC
1602
1603 * sect_return = sect;
252b5132
RH
1604 return debug_section;
1605}
1606
252b5132
RH
1607/* Return a pointer to a malloc'd copy of 'name'. 'name' may not be
1608 \0-terminated, but will not exceed 'maxlen' characters. The copy *will*
1609 be \0-terminated. */
c8e7bf0d 1610
252b5132 1611static char *
c8e7bf0d 1612copy_name (bfd *abfd, char *name, size_t maxlen)
252b5132 1613{
dc810e39 1614 size_t len;
252b5132
RH
1615 char *newname;
1616
1617 for (len = 0; len < maxlen; ++len)
c8e7bf0d
NC
1618 if (name[len] == '\0')
1619 break;
1620
a50b1753 1621 if ((newname = (char *) bfd_alloc (abfd, (bfd_size_type) len + 1)) == NULL)
c8e7bf0d 1622 return NULL;
252b5132 1623
252b5132
RH
1624 strncpy (newname, name, len);
1625 newname[len] = '\0';
1626 return newname;
1627}
1628
1629/* Read in the external symbols. */
1630
b34976b6 1631bfd_boolean
c8e7bf0d 1632_bfd_coff_get_external_symbols (bfd *abfd)
252b5132
RH
1633{
1634 bfd_size_type symesz;
dc810e39 1635 bfd_size_type size;
c8e7bf0d 1636 void * syms;
252b5132
RH
1637
1638 if (obj_coff_external_syms (abfd) != NULL)
b34976b6 1639 return TRUE;
252b5132
RH
1640
1641 symesz = bfd_coff_symesz (abfd);
1642
1643 size = obj_raw_syment_count (abfd) * symesz;
353c5574
MS
1644 if (size == 0)
1645 return TRUE;
252b5132 1646
c8e7bf0d 1647 syms = bfd_malloc (size);
353c5574 1648 if (syms == NULL)
b34976b6 1649 return FALSE;
252b5132
RH
1650
1651 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
dc810e39 1652 || bfd_bread (syms, size, abfd) != size)
252b5132
RH
1653 {
1654 if (syms != NULL)
1655 free (syms);
b34976b6 1656 return FALSE;
252b5132
RH
1657 }
1658
1659 obj_coff_external_syms (abfd) = syms;
1660
b34976b6 1661 return TRUE;
252b5132
RH
1662}
1663
1664/* Read in the external strings. The strings are not loaded until
1665 they are needed. This is because we have no simple way of
5a3f568b
NC
1666 detecting a missing string table in an archive. If the strings
1667 are loaded then the STRINGS and STRINGS_LEN fields in the
1668 coff_tdata structure will be set. */
252b5132
RH
1669
1670const char *
c8e7bf0d 1671_bfd_coff_read_string_table (bfd *abfd)
252b5132
RH
1672{
1673 char extstrsize[STRING_SIZE_SIZE];
dc810e39 1674 bfd_size_type strsize;
252b5132 1675 char *strings;
dc810e39 1676 file_ptr pos;
252b5132
RH
1677
1678 if (obj_coff_strings (abfd) != NULL)
1679 return obj_coff_strings (abfd);
1680
1681 if (obj_sym_filepos (abfd) == 0)
1682 {
1683 bfd_set_error (bfd_error_no_symbols);
1684 return NULL;
1685 }
1686
dc810e39
AM
1687 pos = obj_sym_filepos (abfd);
1688 pos += obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd);
1689 if (bfd_seek (abfd, pos, SEEK_SET) != 0)
252b5132 1690 return NULL;
244148ad 1691
dc810e39
AM
1692 if (bfd_bread (extstrsize, (bfd_size_type) sizeof extstrsize, abfd)
1693 != sizeof extstrsize)
252b5132
RH
1694 {
1695 if (bfd_get_error () != bfd_error_file_truncated)
1696 return NULL;
1697
1698 /* There is no string table. */
1699 strsize = STRING_SIZE_SIZE;
1700 }
1701 else
1702 {
1703#if STRING_SIZE_SIZE == 4
dc810e39 1704 strsize = H_GET_32 (abfd, extstrsize);
252b5132 1705#else
dc810e39 1706 #error Change H_GET_32
252b5132
RH
1707#endif
1708 }
1709
1710 if (strsize < STRING_SIZE_SIZE)
1711 {
1712 (*_bfd_error_handler)
d003868e 1713 (_("%B: bad string table size %lu"), abfd, (unsigned long) strsize);
252b5132
RH
1714 bfd_set_error (bfd_error_bad_value);
1715 return NULL;
1716 }
1717
36e9d67b 1718 strings = (char *) bfd_malloc (strsize + 1);
cd11f78f
AC
1719 if (strings == NULL)
1720 return NULL;
1721
36e9d67b
NC
1722 /* PR 17521 file: 079-54929-0.004.
1723 A corrupt file could contain an index that points into the first
1724 STRING_SIZE_SIZE bytes of the string table, so make sure that
1725 they are zero. */
1726 memset (strings, 0, STRING_SIZE_SIZE);
1727
dc810e39 1728 if (bfd_bread (strings + STRING_SIZE_SIZE, strsize - STRING_SIZE_SIZE, abfd)
252b5132
RH
1729 != strsize - STRING_SIZE_SIZE)
1730 {
1731 free (strings);
1732 return NULL;
1733 }
1734
1735 obj_coff_strings (abfd) = strings;
5a3f568b 1736 obj_coff_strings_len (abfd) = strsize;
36e9d67b
NC
1737 /* Terminate the string table, just in case. */
1738 strings[strsize] = 0;
252b5132
RH
1739 return strings;
1740}
1741
1742/* Free up the external symbols and strings read from a COFF file. */
1743
b34976b6 1744bfd_boolean
c8e7bf0d 1745_bfd_coff_free_symbols (bfd *abfd)
252b5132
RH
1746{
1747 if (obj_coff_external_syms (abfd) != NULL
1748 && ! obj_coff_keep_syms (abfd))
1749 {
1750 free (obj_coff_external_syms (abfd));
1751 obj_coff_external_syms (abfd) = NULL;
1752 }
1753 if (obj_coff_strings (abfd) != NULL
1754 && ! obj_coff_keep_strings (abfd))
1755 {
1756 free (obj_coff_strings (abfd));
1757 obj_coff_strings (abfd) = NULL;
5a3f568b 1758 obj_coff_strings_len (abfd) = 0;
252b5132 1759 }
b34976b6 1760 return TRUE;
252b5132
RH
1761}
1762
1763/* Read a symbol table into freshly bfd_allocated memory, swap it, and
1764 knit the symbol names into a normalized form. By normalized here I
1765 mean that all symbols have an n_offset pointer that points to a null-
1766 terminated string. */
1767
1768combined_entry_type *
c8e7bf0d 1769coff_get_normalized_symtab (bfd *abfd)
252b5132
RH
1770{
1771 combined_entry_type *internal;
1772 combined_entry_type *internal_ptr;
1773 combined_entry_type *symbol_ptr;
1774 combined_entry_type *internal_end;
dc810e39 1775 size_t symesz;
252b5132
RH
1776 char *raw_src;
1777 char *raw_end;
1778 const char *string_table = NULL;
5a3f568b
NC
1779 asection * debug_sec = NULL;
1780 char *debug_sec_data = NULL;
dc810e39 1781 bfd_size_type size;
252b5132
RH
1782
1783 if (obj_raw_syments (abfd) != NULL)
1784 return obj_raw_syments (abfd);
1785
201159ec
NC
1786 if (! _bfd_coff_get_external_symbols (abfd))
1787 return NULL;
1788
40572405 1789 size = obj_raw_syment_count (abfd) * sizeof (combined_entry_type);
a50b1753 1790 internal = (combined_entry_type *) bfd_zalloc (abfd, size);
252b5132
RH
1791 if (internal == NULL && size != 0)
1792 return NULL;
1793 internal_end = internal + obj_raw_syment_count (abfd);
7e760b06 1794
252b5132
RH
1795 raw_src = (char *) obj_coff_external_syms (abfd);
1796
c8e7bf0d 1797 /* Mark the end of the symbols. */
252b5132
RH
1798 symesz = bfd_coff_symesz (abfd);
1799 raw_end = (char *) raw_src + obj_raw_syment_count (abfd) * symesz;
1800
1801 /* FIXME SOMEDAY. A string table size of zero is very weird, but
1802 probably possible. If one shows up, it will probably kill us. */
1803
c8e7bf0d 1804 /* Swap all the raw entries. */
252b5132
RH
1805 for (internal_ptr = internal;
1806 raw_src < raw_end;
1807 raw_src += symesz, internal_ptr++)
1808 {
252b5132 1809 unsigned int i;
7e760b06 1810
c8e7bf0d
NC
1811 bfd_coff_swap_sym_in (abfd, (void *) raw_src,
1812 (void *) & internal_ptr->u.syment);
252b5132 1813 symbol_ptr = internal_ptr;
a5c71af8 1814 internal_ptr->is_sym = TRUE;
252b5132 1815
0a9d414a
NC
1816 /* PR 17512: file: 1353-1166-0.004. */
1817 if (symbol_ptr->u.syment.n_sclass == C_FILE
1818 && symbol_ptr->u.syment.n_numaux > 0
1819 && raw_src + symesz + symbol_ptr->u.syment.n_numaux
1820 * sizeof (union internal_auxent) >= raw_end)
1821 {
1822 bfd_release (abfd, internal);
1823 return NULL;
1824 }
1825
252b5132
RH
1826 for (i = 0;
1827 i < symbol_ptr->u.syment.n_numaux;
1828 i++)
1829 {
1830 internal_ptr++;
7e760b06
NC
1831 /* PR 17512: Prevent buffer overrun. */
1832 if (internal_ptr >= internal_end)
0a9d414a
NC
1833 {
1834 bfd_release (abfd, internal);
1835 return NULL;
1836 }
7e760b06 1837
252b5132 1838 raw_src += symesz;
0a9d414a 1839
c8e7bf0d 1840 bfd_coff_swap_aux_in (abfd, (void *) raw_src,
252b5132
RH
1841 symbol_ptr->u.syment.n_type,
1842 symbol_ptr->u.syment.n_sclass,
dc810e39 1843 (int) i, symbol_ptr->u.syment.n_numaux,
252b5132 1844 &(internal_ptr->u.auxent));
0a9d414a 1845
a5c71af8 1846 internal_ptr->is_sym = FALSE;
252b5132
RH
1847 coff_pointerize_aux (abfd, internal, symbol_ptr, i,
1848 internal_ptr);
1849 }
1850 }
1851
1852 /* Free the raw symbols, but not the strings (if we have them). */
b34976b6 1853 obj_coff_keep_strings (abfd) = TRUE;
252b5132
RH
1854 if (! _bfd_coff_free_symbols (abfd))
1855 return NULL;
1856
1857 for (internal_ptr = internal; internal_ptr < internal_end;
1858 internal_ptr++)
1859 {
a5c71af8
NC
1860 BFD_ASSERT (internal_ptr->is_sym);
1861
252b5132
RH
1862 if (internal_ptr->u.syment.n_sclass == C_FILE
1863 && internal_ptr->u.syment.n_numaux > 0)
1864 {
a5c71af8
NC
1865 combined_entry_type * aux = internal_ptr + 1;
1866
c8e7bf0d
NC
1867 /* Make a file symbol point to the name in the auxent, since
1868 the text ".file" is redundant. */
a5c71af8
NC
1869 BFD_ASSERT (! aux->is_sym);
1870
1871 if (aux->u.auxent.x_file.x_n.x_zeroes == 0)
252b5132 1872 {
c8e7bf0d 1873 /* The filename is a long one, point into the string table. */
252b5132
RH
1874 if (string_table == NULL)
1875 {
1876 string_table = _bfd_coff_read_string_table (abfd);
1877 if (string_table == NULL)
1878 return NULL;
1879 }
a5c71af8
NC
1880
1881 if ((bfd_size_type)(aux->u.auxent.x_file.x_n.x_offset)
5a3f568b
NC
1882 >= obj_coff_strings_len (abfd))
1883 internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) _("<corrupt>");
1884 else
1885 internal_ptr->u.syment._n._n_n._n_offset =
a5c71af8 1886 (bfd_hostptr_t) (string_table + (aux->u.auxent.x_file.x_n.x_offset));
252b5132
RH
1887 }
1888 else
1889 {
7bb9db4d
ILT
1890 /* Ordinary short filename, put into memory anyway. The
1891 Microsoft PE tools sometimes store a filename in
1892 multiple AUX entries. */
ec0ef80e
DD
1893 if (internal_ptr->u.syment.n_numaux > 1
1894 && coff_data (abfd)->pe)
c8e7bf0d 1895 internal_ptr->u.syment._n._n_n._n_offset =
a5c71af8
NC
1896 (bfd_hostptr_t)
1897 copy_name (abfd,
1898 aux->u.auxent.x_file.x_fname,
1899 internal_ptr->u.syment.n_numaux * symesz);
ec0ef80e 1900 else
c8e7bf0d 1901 internal_ptr->u.syment._n._n_n._n_offset =
d2df793a 1902 ((bfd_hostptr_t)
c8e7bf0d 1903 copy_name (abfd,
a5c71af8 1904 aux->u.auxent.x_file.x_fname,
c8e7bf0d 1905 (size_t) bfd_coff_filnmlen (abfd)));
252b5132
RH
1906 }
1907 }
1908 else
1909 {
1910 if (internal_ptr->u.syment._n._n_n._n_zeroes != 0)
1911 {
1912 /* This is a "short" name. Make it long. */
dc810e39
AM
1913 size_t i;
1914 char *newstring;
252b5132 1915
c8e7bf0d 1916 /* Find the length of this string without walking into memory
252b5132
RH
1917 that isn't ours. */
1918 for (i = 0; i < 8; ++i)
dc810e39
AM
1919 if (internal_ptr->u.syment._n._n_name[i] == '\0')
1920 break;
252b5132 1921
a50b1753 1922 newstring = (char *) bfd_zalloc (abfd, (bfd_size_type) (i + 1));
dc810e39 1923 if (newstring == NULL)
c8e7bf0d 1924 return NULL;
dc810e39 1925 strncpy (newstring, internal_ptr->u.syment._n._n_name, i);
d2df793a 1926 internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) newstring;
252b5132
RH
1927 internal_ptr->u.syment._n._n_n._n_zeroes = 0;
1928 }
1929 else if (internal_ptr->u.syment._n._n_n._n_offset == 0)
649aeae3 1930 internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) "";
252b5132
RH
1931 else if (!bfd_coff_symname_in_debug (abfd, &internal_ptr->u.syment))
1932 {
1933 /* Long name already. Point symbol at the string in the
1934 table. */
1935 if (string_table == NULL)
1936 {
1937 string_table = _bfd_coff_read_string_table (abfd);
1938 if (string_table == NULL)
1939 return NULL;
1940 }
36e9d67b
NC
1941 if (internal_ptr->u.syment._n._n_n._n_offset >= obj_coff_strings_len (abfd)
1942 || string_table + internal_ptr->u.syment._n._n_n._n_offset < string_table)
5a3f568b
NC
1943 internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) _("<corrupt>");
1944 else
1945 internal_ptr->u.syment._n._n_n._n_offset =
1946 ((bfd_hostptr_t)
1947 (string_table
1948 + internal_ptr->u.syment._n._n_n._n_offset));
252b5132
RH
1949 }
1950 else
1951 {
1952 /* Long name in debug section. Very similar. */
5a3f568b
NC
1953 if (debug_sec_data == NULL)
1954 debug_sec_data = build_debug_section (abfd, & debug_sec);
1955 if (debug_sec_data != NULL)
1956 {
1957 BFD_ASSERT (debug_sec != NULL);
1958 /* PR binutils/17512: Catch out of range offsets into the debug data. */
36e9d67b
NC
1959 if (internal_ptr->u.syment._n._n_n._n_offset > debug_sec->size
1960 || debug_sec_data + internal_ptr->u.syment._n._n_n._n_offset < debug_sec_data)
5a3f568b
NC
1961 internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) _("<corrupt>");
1962 else
1963 internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t)
1964 (debug_sec_data + internal_ptr->u.syment._n._n_n._n_offset);
1965 }
1966 else
1967 internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) "";
252b5132
RH
1968 }
1969 }
1970 internal_ptr += internal_ptr->u.syment.n_numaux;
1971 }
1972
1973 obj_raw_syments (abfd) = internal;
1974 BFD_ASSERT (obj_raw_syment_count (abfd)
1975 == (unsigned int) (internal_ptr - internal));
1976
c8e7bf0d
NC
1977 return internal;
1978}
252b5132
RH
1979
1980long
c8e7bf0d 1981coff_get_reloc_upper_bound (bfd *abfd, sec_ptr asect)
252b5132
RH
1982{
1983 if (bfd_get_format (abfd) != bfd_object)
1984 {
1985 bfd_set_error (bfd_error_invalid_operation);
1986 return -1;
1987 }
1988 return (asect->reloc_count + 1) * sizeof (arelent *);
1989}
1990
1991asymbol *
c8e7bf0d 1992coff_make_empty_symbol (bfd *abfd)
252b5132 1993{
dc810e39 1994 bfd_size_type amt = sizeof (coff_symbol_type);
d3ce72d0 1995 coff_symbol_type *new_symbol = (coff_symbol_type *) bfd_zalloc (abfd, amt);
c8e7bf0d 1996
d3ce72d0 1997 if (new_symbol == NULL)
c8e7bf0d 1998 return NULL;
d3ce72d0 1999 new_symbol->symbol.section = 0;
a5c71af8 2000 new_symbol->native = NULL;
d3ce72d0
NC
2001 new_symbol->lineno = NULL;
2002 new_symbol->done_lineno = FALSE;
2003 new_symbol->symbol.the_bfd = abfd;
c8e7bf0d 2004
d3ce72d0 2005 return & new_symbol->symbol;
252b5132
RH
2006}
2007
2008/* Make a debugging symbol. */
2009
2010asymbol *
c8e7bf0d
NC
2011coff_bfd_make_debug_symbol (bfd *abfd,
2012 void * ptr ATTRIBUTE_UNUSED,
2013 unsigned long sz ATTRIBUTE_UNUSED)
252b5132 2014{
dc810e39 2015 bfd_size_type amt = sizeof (coff_symbol_type);
d3ce72d0 2016 coff_symbol_type *new_symbol = (coff_symbol_type *) bfd_alloc (abfd, amt);
c8e7bf0d 2017
d3ce72d0 2018 if (new_symbol == NULL)
c8e7bf0d 2019 return NULL;
252b5132
RH
2020 /* @@ The 10 is a guess at a plausible maximum number of aux entries
2021 (but shouldn't be a constant). */
dc810e39 2022 amt = sizeof (combined_entry_type) * 10;
d3ce72d0
NC
2023 new_symbol->native = (combined_entry_type *) bfd_zalloc (abfd, amt);
2024 if (!new_symbol->native)
c8e7bf0d 2025 return NULL;
a5c71af8 2026 new_symbol->native->is_sym = TRUE;
d3ce72d0
NC
2027 new_symbol->symbol.section = bfd_abs_section_ptr;
2028 new_symbol->symbol.flags = BSF_DEBUGGING;
2029 new_symbol->lineno = NULL;
2030 new_symbol->done_lineno = FALSE;
2031 new_symbol->symbol.the_bfd = abfd;
68ffbac6 2032
d3ce72d0 2033 return & new_symbol->symbol;
252b5132
RH
2034}
2035
252b5132 2036void
c8e7bf0d 2037coff_get_symbol_info (bfd *abfd, asymbol *symbol, symbol_info *ret)
252b5132
RH
2038{
2039 bfd_symbol_info (symbol, ret);
c8e7bf0d 2040
252b5132 2041 if (coffsymbol (symbol)->native != NULL
a5c71af8
NC
2042 && coffsymbol (symbol)->native->fix_value
2043 && coffsymbol (symbol)->native->is_sym)
c8e7bf0d 2044 ret->value = coffsymbol (symbol)->native->u.syment.n_value -
d2df793a 2045 (bfd_hostptr_t) obj_raw_syments (abfd);
252b5132
RH
2046}
2047
2048/* Return the COFF syment for a symbol. */
2049
b34976b6 2050bfd_boolean
c8e7bf0d
NC
2051bfd_coff_get_syment (bfd *abfd,
2052 asymbol *symbol,
2053 struct internal_syment *psyment)
252b5132
RH
2054{
2055 coff_symbol_type *csym;
2056
2057 csym = coff_symbol_from (abfd, symbol);
a5c71af8
NC
2058 if (csym == NULL || csym->native == NULL
2059 || ! csym->native->is_sym)
252b5132
RH
2060 {
2061 bfd_set_error (bfd_error_invalid_operation);
b34976b6 2062 return FALSE;
252b5132
RH
2063 }
2064
2065 *psyment = csym->native->u.syment;
2066
2067 if (csym->native->fix_value)
dc810e39 2068 psyment->n_value = psyment->n_value -
d2df793a 2069 (bfd_hostptr_t) obj_raw_syments (abfd);
252b5132
RH
2070
2071 /* FIXME: We should handle fix_line here. */
2072
b34976b6 2073 return TRUE;
252b5132
RH
2074}
2075
2076/* Return the COFF auxent for a symbol. */
2077
b34976b6 2078bfd_boolean
c8e7bf0d
NC
2079bfd_coff_get_auxent (bfd *abfd,
2080 asymbol *symbol,
2081 int indx,
2082 union internal_auxent *pauxent)
252b5132
RH
2083{
2084 coff_symbol_type *csym;
2085 combined_entry_type *ent;
2086
2087 csym = coff_symbol_from (abfd, symbol);
2088
2089 if (csym == NULL
2090 || csym->native == NULL
a5c71af8 2091 || ! csym->native->is_sym
252b5132
RH
2092 || indx >= csym->native->u.syment.n_numaux)
2093 {
2094 bfd_set_error (bfd_error_invalid_operation);
b34976b6 2095 return FALSE;
252b5132
RH
2096 }
2097
2098 ent = csym->native + indx + 1;
2099
a5c71af8 2100 BFD_ASSERT (! ent->is_sym);
252b5132
RH
2101 *pauxent = ent->u.auxent;
2102
2103 if (ent->fix_tag)
2104 pauxent->x_sym.x_tagndx.l =
2105 ((combined_entry_type *) pauxent->x_sym.x_tagndx.p
2106 - obj_raw_syments (abfd));
2107
2108 if (ent->fix_end)
2109 pauxent->x_sym.x_fcnary.x_fcn.x_endndx.l =
2110 ((combined_entry_type *) pauxent->x_sym.x_fcnary.x_fcn.x_endndx.p
2111 - obj_raw_syments (abfd));
2112
2113 if (ent->fix_scnlen)
2114 pauxent->x_csect.x_scnlen.l =
2115 ((combined_entry_type *) pauxent->x_csect.x_scnlen.p
2116 - obj_raw_syments (abfd));
2117
b34976b6 2118 return TRUE;
252b5132
RH
2119}
2120
2121/* Print out information about COFF symbol. */
2122
2123void
c8e7bf0d
NC
2124coff_print_symbol (bfd *abfd,
2125 void * filep,
2126 asymbol *symbol,
2127 bfd_print_symbol_type how)
252b5132 2128{
c8e7bf0d 2129 FILE * file = (FILE *) filep;
252b5132
RH
2130
2131 switch (how)
2132 {
2133 case bfd_print_symbol_name:
2134 fprintf (file, "%s", symbol->name);
2135 break;
2136
2137 case bfd_print_symbol_more:
2138 fprintf (file, "coff %s %s",
2139 coffsymbol (symbol)->native ? "n" : "g",
2140 coffsymbol (symbol)->lineno ? "l" : " ");
2141 break;
2142
2143 case bfd_print_symbol_all:
2144 if (coffsymbol (symbol)->native)
2145 {
beb1bf64 2146 bfd_vma val;
252b5132
RH
2147 unsigned int aux;
2148 combined_entry_type *combined = coffsymbol (symbol)->native;
2149 combined_entry_type *root = obj_raw_syments (abfd);
2150 struct lineno_cache_entry *l = coffsymbol (symbol)->lineno;
2151
2152 fprintf (file, "[%3ld]", (long) (combined - root));
2153
f41e4712
NC
2154 /* PR 17512: file: 079-33786-0.001:0.1. */
2155 if (combined < obj_raw_syments (abfd)
2156 || combined >= obj_raw_syments (abfd) + obj_raw_syment_count (abfd))
2157 {
2158 fprintf (file, _("<corrupt info> %s"), symbol->name);
2159 break;
2160 }
2161
a5c71af8 2162 BFD_ASSERT (combined->is_sym);
252b5132 2163 if (! combined->fix_value)
beb1bf64 2164 val = (bfd_vma) combined->u.syment.n_value;
252b5132 2165 else
d2df793a 2166 val = combined->u.syment.n_value - (bfd_hostptr_t) root;
252b5132 2167
7920ce38 2168 fprintf (file, "(sec %2d)(fl 0x%02x)(ty %3x)(scl %3d) (nx %d) 0x",
252b5132
RH
2169 combined->u.syment.n_scnum,
2170 combined->u.syment.n_flags,
2171 combined->u.syment.n_type,
2172 combined->u.syment.n_sclass,
745c12f8 2173 combined->u.syment.n_numaux);
ebf12fbe 2174 bfd_fprintf_vma (abfd, file, val);
745c12f8 2175 fprintf (file, " %s", symbol->name);
252b5132
RH
2176
2177 for (aux = 0; aux < combined->u.syment.n_numaux; aux++)
2178 {
2179 combined_entry_type *auxp = combined + aux + 1;
2180 long tagndx;
2181
a5c71af8 2182 BFD_ASSERT (! auxp->is_sym);
252b5132
RH
2183 if (auxp->fix_tag)
2184 tagndx = auxp->u.auxent.x_sym.x_tagndx.p - root;
2185 else
2186 tagndx = auxp->u.auxent.x_sym.x_tagndx.l;
2187
2188 fprintf (file, "\n");
2189
2190 if (bfd_coff_print_aux (abfd, file, root, combined, auxp, aux))
2191 continue;
2192
2193 switch (combined->u.syment.n_sclass)
2194 {
2195 case C_FILE:
2196 fprintf (file, "File ");
2197 break;
2198
2199 case C_STAT:
2200 if (combined->u.syment.n_type == T_NULL)
c8e7bf0d 2201 /* Probably a section symbol ? */
252b5132
RH
2202 {
2203 fprintf (file, "AUX scnlen 0x%lx nreloc %d nlnno %d",
0af1713e 2204 (unsigned long) auxp->u.auxent.x_scn.x_scnlen,
252b5132
RH
2205 auxp->u.auxent.x_scn.x_nreloc,
2206 auxp->u.auxent.x_scn.x_nlinno);
2207 if (auxp->u.auxent.x_scn.x_checksum != 0
2208 || auxp->u.auxent.x_scn.x_associated != 0
2209 || auxp->u.auxent.x_scn.x_comdat != 0)
2210 fprintf (file, " checksum 0x%lx assoc %d comdat %d",
2211 auxp->u.auxent.x_scn.x_checksum,
2212 auxp->u.auxent.x_scn.x_associated,
2213 auxp->u.auxent.x_scn.x_comdat);
2214 break;
2215 }
c8e7bf0d 2216 /* Otherwise fall through. */
312191a6 2217 case C_EXT:
8602d4fe 2218 case C_AIX_WEAKEXT:
312191a6
ILT
2219 if (ISFCN (combined->u.syment.n_type))
2220 {
cea4409c
AM
2221 long next, llnos;
2222
2223 if (auxp->fix_end)
2224 next = (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p
2225 - root);
2226 else
2227 next = auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
2228 llnos = auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_lnnoptr;
312191a6 2229 fprintf (file,
3d66c4f7 2230 "AUX tagndx %ld ttlsiz 0x%lx lnnos %ld next %ld",
0af1713e
AM
2231 tagndx,
2232 (unsigned long) auxp->u.auxent.x_sym.x_misc.x_fsize,
cea4409c 2233 llnos, next);
312191a6
ILT
2234 break;
2235 }
c8e7bf0d 2236 /* Otherwise fall through. */
252b5132
RH
2237 default:
2238 fprintf (file, "AUX lnno %d size 0x%x tagndx %ld",
2239 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_lnno,
2240 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_size,
2241 tagndx);
2242 if (auxp->fix_end)
2243 fprintf (file, " endndx %ld",
2244 ((long)
2245 (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p
2246 - root)));
2247 break;
2248 }
2249 }
2250
2251 if (l)
2252 {
2253 fprintf (file, "\n%s :", l->u.sym->name);
2254 l++;
2255 while (l->line_number)
2256 {
f41e4712
NC
2257 if (l->line_number > 0)
2258 {
2259 fprintf (file, "\n%4d : ", l->line_number);
2260 bfd_fprintf_vma (abfd, file, l->u.offset + symbol->section->vma);
2261 }
252b5132
RH
2262 l++;
2263 }
2264 }
2265 }
2266 else
2267 {
c8e7bf0d 2268 bfd_print_symbol_vandf (abfd, (void *) file, symbol);
252b5132
RH
2269 fprintf (file, " %-5s %s %s %s",
2270 symbol->section->name,
2271 coffsymbol (symbol)->native ? "n" : "g",
2272 coffsymbol (symbol)->lineno ? "l" : " ",
2273 symbol->name);
2274 }
2275 }
2276}
2277
2278/* Return whether a symbol name implies a local symbol. In COFF,
2279 local symbols generally start with ``.L''. Most targets use this
2280 function for the is_local_label_name entry point, but some may
2281 override it. */
2282
b34976b6 2283bfd_boolean
c8e7bf0d
NC
2284_bfd_coff_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
2285 const char *name)
252b5132 2286{
b34976b6 2287 return name[0] == '.' && name[1] == 'L';
252b5132
RH
2288}
2289
9a968f43
NC
2290/* Provided a BFD, a section and an offset (in bytes, not octets) into the
2291 section, calculate and return the name of the source file and the line
2292 nearest to the wanted location. */
435b1e90 2293
b34976b6 2294bfd_boolean
fc28f9aa 2295coff_find_nearest_line_with_names (bfd *abfd,
fc28f9aa 2296 asymbol **symbols,
fb167eb2 2297 asection *section,
fc28f9aa
TG
2298 bfd_vma offset,
2299 const char **filename_ptr,
2300 const char **functionname_ptr,
fb167eb2
AM
2301 unsigned int *line_ptr,
2302 const struct dwarf_debug_section *debug_sections)
252b5132 2303{
b34976b6 2304 bfd_boolean found;
252b5132
RH
2305 unsigned int i;
2306 unsigned int line_base;
2307 coff_data_type *cof = coff_data (abfd);
c8e7bf0d 2308 /* Run through the raw syments if available. */
252b5132
RH
2309 combined_entry_type *p;
2310 combined_entry_type *pend;
2311 alent *l;
2312 struct coff_section_tdata *sec_data;
dc810e39 2313 bfd_size_type amt;
252b5132
RH
2314
2315 /* Before looking through the symbol table, try to use a .stab
2316 section to find the information. */
2317 if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
2318 &found, filename_ptr,
2319 functionname_ptr, line_ptr,
51db3708 2320 &coff_data(abfd)->line_info))
b34976b6 2321 return FALSE;
51db3708 2322
4ca29a6a 2323 if (found)
b34976b6 2324 return TRUE;
4ca29a6a 2325
51db3708 2326 /* Also try examining DWARF2 debugging information. */
fb167eb2 2327 if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
51db3708 2328 filename_ptr, functionname_ptr,
fb167eb2 2329 line_ptr, NULL, debug_sections, 0,
51db3708 2330 &coff_data(abfd)->dwarf2_find_line_info))
b34976b6 2331 return TRUE;
51db3708 2332
252b5132
RH
2333 *filename_ptr = 0;
2334 *functionname_ptr = 0;
2335 *line_ptr = 0;
2336
c8e7bf0d 2337 /* Don't try and find line numbers in a non coff file. */
9bd09e22 2338 if (!bfd_family_coff (abfd))
b34976b6 2339 return FALSE;
252b5132
RH
2340
2341 if (cof == NULL)
b34976b6 2342 return FALSE;
252b5132
RH
2343
2344 /* Find the first C_FILE symbol. */
2345 p = cof->raw_syments;
2346 if (!p)
b34976b6 2347 return FALSE;
252b5132
RH
2348
2349 pend = p + cof->raw_syment_count;
2350 while (p < pend)
2351 {
a5c71af8 2352 BFD_ASSERT (p->is_sym);
252b5132
RH
2353 if (p->u.syment.n_sclass == C_FILE)
2354 break;
2355 p += 1 + p->u.syment.n_numaux;
2356 }
2357
2358 if (p < pend)
2359 {
2360 bfd_vma sec_vma;
2361 bfd_vma maxdiff;
2362
2363 /* Look through the C_FILE symbols to find the best one. */
2364 sec_vma = bfd_get_section_vma (abfd, section);
2365 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
2366 maxdiff = (bfd_vma) 0 - (bfd_vma) 1;
2367 while (1)
2368 {
4d9e2b27 2369 bfd_vma file_addr;
252b5132
RH
2370 combined_entry_type *p2;
2371
2372 for (p2 = p + 1 + p->u.syment.n_numaux;
2373 p2 < pend;
2374 p2 += 1 + p2->u.syment.n_numaux)
2375 {
a5c71af8 2376 BFD_ASSERT (p2->is_sym);
252b5132
RH
2377 if (p2->u.syment.n_scnum > 0
2378 && (section
2379 == coff_section_from_bfd_index (abfd,
2380 p2->u.syment.n_scnum)))
2381 break;
2382 if (p2->u.syment.n_sclass == C_FILE)
2383 {
2384 p2 = pend;
2385 break;
2386 }
2387 }
a5c71af8
NC
2388 if (p2 >= pend)
2389 break;
252b5132 2390
4d9e2b27
NC
2391 file_addr = (bfd_vma) p2->u.syment.n_value;
2392 /* PR 11512: Include the section address of the function name symbol. */
2393 if (p2->u.syment.n_scnum > 0)
2394 file_addr += coff_section_from_bfd_index (abfd,
2395 p2->u.syment.n_scnum)->vma;
798c1fb8
ILT
2396 /* We use <= MAXDIFF here so that if we get a zero length
2397 file, we actually use the next file entry. */
252b5132 2398 if (p2 < pend
4d9e2b27
NC
2399 && offset + sec_vma >= file_addr
2400 && offset + sec_vma - file_addr <= maxdiff)
252b5132
RH
2401 {
2402 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
2403 maxdiff = offset + sec_vma - p2->u.syment.n_value;
2404 }
2405
2406 /* Avoid endless loops on erroneous files by ensuring that
2407 we always move forward in the file. */
cea4409c 2408 if (p >= cof->raw_syments + p->u.syment.n_value)
252b5132
RH
2409 break;
2410
2411 p = cof->raw_syments + p->u.syment.n_value;
2412 if (p > pend || p->u.syment.n_sclass != C_FILE)
2413 break;
2414 }
2415 }
2416
c8e7bf0d 2417 /* Now wander though the raw linenumbers of the section. */
70df0c05 2418 /* If we have been called on this section before, and the offset we
252b5132
RH
2419 want is further down then we can prime the lookup loop. */
2420 sec_data = coff_section_data (abfd, section);
2421 if (sec_data != NULL
2422 && sec_data->i > 0
2423 && offset >= sec_data->offset)
2424 {
2425 i = sec_data->i;
2426 *functionname_ptr = sec_data->function;
2427 line_base = sec_data->line_base;
2428 }
2429 else
2430 {
2431 i = 0;
2432 line_base = 0;
2433 }
2434
2435 if (section->lineno != NULL)
2436 {
798c1fb8
ILT
2437 bfd_vma last_value = 0;
2438
252b5132
RH
2439 l = &section->lineno[i];
2440
2441 for (; i < section->lineno_count; i++)
2442 {
2443 if (l->line_number == 0)
2444 {
c8e7bf0d 2445 /* Get the symbol this line number points at. */
252b5132
RH
2446 coff_symbol_type *coff = (coff_symbol_type *) (l->u.sym);
2447 if (coff->symbol.value > offset)
2448 break;
2449 *functionname_ptr = coff->symbol.name;
798c1fb8 2450 last_value = coff->symbol.value;
252b5132
RH
2451 if (coff->native)
2452 {
2453 combined_entry_type *s = coff->native;
a5c71af8
NC
2454
2455 BFD_ASSERT (s->is_sym);
252b5132
RH
2456 s = s + 1 + s->u.syment.n_numaux;
2457
2458 /* In XCOFF a debugging symbol can follow the
2459 function symbol. */
2460 if (s->u.syment.n_scnum == N_DEBUG)
2461 s = s + 1 + s->u.syment.n_numaux;
2462
2463 /* S should now point to the .bf of the function. */
2464 if (s->u.syment.n_numaux)
2465 {
2466 /* The linenumber is stored in the auxent. */
2467 union internal_auxent *a = &((s + 1)->u.auxent);
a5c71af8 2468
252b5132
RH
2469 line_base = a->x_sym.x_misc.x_lnsz.x_lnno;
2470 *line_ptr = line_base;
2471 }
2472 }
2473 }
2474 else
2475 {
2476 if (l->u.offset > offset)
2477 break;
2478 *line_ptr = l->line_number + line_base - 1;
2479 }
2480 l++;
2481 }
798c1fb8
ILT
2482
2483 /* If we fell off the end of the loop, then assume that this
2484 symbol has no line number info. Otherwise, symbols with no
2485 line number info get reported with the line number of the
2486 last line of the last symbol which does have line number
2487 info. We use 0x100 as a slop to account for cases where the
2488 last line has executable code. */
2489 if (i >= section->lineno_count
2490 && last_value != 0
2491 && offset - last_value > 0x100)
2492 {
2493 *functionname_ptr = NULL;
2494 *line_ptr = 0;
2495 }
252b5132
RH
2496 }
2497
2498 /* Cache the results for the next call. */
2499 if (sec_data == NULL && section->owner == abfd)
2500 {
dc810e39 2501 amt = sizeof (struct coff_section_tdata);
c8e7bf0d 2502 section->used_by_bfd = bfd_zalloc (abfd, amt);
252b5132
RH
2503 sec_data = (struct coff_section_tdata *) section->used_by_bfd;
2504 }
2505 if (sec_data != NULL)
2506 {
2507 sec_data->offset = offset;
70df0c05 2508 sec_data->i = i - 1;
252b5132
RH
2509 sec_data->function = *functionname_ptr;
2510 sec_data->line_base = line_base;
2511 }
2512
b34976b6 2513 return TRUE;
252b5132
RH
2514}
2515
fc28f9aa
TG
2516bfd_boolean
2517coff_find_nearest_line (bfd *abfd,
fc28f9aa 2518 asymbol **symbols,
fb167eb2 2519 asection *section,
fc28f9aa
TG
2520 bfd_vma offset,
2521 const char **filename_ptr,
2522 const char **functionname_ptr,
fb167eb2
AM
2523 unsigned int *line_ptr,
2524 unsigned int *discriminator_ptr)
fc28f9aa 2525{
fb167eb2
AM
2526 if (discriminator_ptr)
2527 *discriminator_ptr = 0;
2528 return coff_find_nearest_line_with_names (abfd, symbols, section, offset,
fc28f9aa 2529 filename_ptr, functionname_ptr,
fb167eb2 2530 line_ptr, dwarf_debug_sections);
fc28f9aa
TG
2531}
2532
4ab527b0
FF
2533bfd_boolean
2534coff_find_inliner_info (bfd *abfd,
2535 const char **filename_ptr,
2536 const char **functionname_ptr,
2537 unsigned int *line_ptr)
2538{
2539 bfd_boolean found;
2540
2541 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
2542 functionname_ptr, line_ptr,
2543 &coff_data(abfd)->dwarf2_find_line_info);
2544 return (found);
2545}
2546
252b5132 2547int
a6b96beb 2548coff_sizeof_headers (bfd *abfd, struct bfd_link_info *info)
252b5132
RH
2549{
2550 size_t size;
2551
a6b96beb 2552 if (!info->relocatable)
c8e7bf0d 2553 size = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
252b5132 2554 else
c8e7bf0d 2555 size = bfd_coff_filhsz (abfd);
252b5132
RH
2556
2557 size += abfd->section_count * bfd_coff_scnhsz (abfd);
2558 return size;
2559}
2560
2561/* Change the class of a coff symbol held by BFD. */
c8e7bf0d 2562
b34976b6 2563bfd_boolean
c8e7bf0d
NC
2564bfd_coff_set_symbol_class (bfd * abfd,
2565 asymbol * symbol,
96d56e9f 2566 unsigned int symbol_class)
252b5132
RH
2567{
2568 coff_symbol_type * csym;
2569
2570 csym = coff_symbol_from (abfd, symbol);
2571 if (csym == NULL)
2572 {
2573 bfd_set_error (bfd_error_invalid_operation);
b34976b6 2574 return FALSE;
252b5132
RH
2575 }
2576 else if (csym->native == NULL)
2577 {
2578 /* This is an alien symbol which no native coff backend data.
2579 We cheat here by creating a fake native entry for it and
2580 then filling in the class. This code is based on that in
2581 coff_write_alien_symbol(). */
244148ad 2582
252b5132 2583 combined_entry_type * native;
dc810e39 2584 bfd_size_type amt = sizeof (* native);
252b5132 2585
a50b1753 2586 native = (combined_entry_type *) bfd_zalloc (abfd, amt);
252b5132 2587 if (native == NULL)
b34976b6 2588 return FALSE;
252b5132 2589
a5c71af8 2590 native->is_sym = TRUE;
252b5132 2591 native->u.syment.n_type = T_NULL;
96d56e9f 2592 native->u.syment.n_sclass = symbol_class;
244148ad 2593
252b5132
RH
2594 if (bfd_is_und_section (symbol->section))
2595 {
2596 native->u.syment.n_scnum = N_UNDEF;
2597 native->u.syment.n_value = symbol->value;
2598 }
2599 else if (bfd_is_com_section (symbol->section))
2600 {
2601 native->u.syment.n_scnum = N_UNDEF;
2602 native->u.syment.n_value = symbol->value;
2603 }
2604 else
2605 {
2606 native->u.syment.n_scnum =
2607 symbol->section->output_section->target_index;
2608 native->u.syment.n_value = (symbol->value
2609 + symbol->section->output_offset);
2610 if (! obj_pe (abfd))
2611 native->u.syment.n_value += symbol->section->output_section->vma;
244148ad 2612
08da05b0 2613 /* Copy the any flags from the file header into the symbol.
252b5132
RH
2614 FIXME: Why? */
2615 native->u.syment.n_flags = bfd_asymbol_bfd (& csym->symbol)->flags;
2616 }
244148ad 2617
252b5132
RH
2618 csym->native = native;
2619 }
2620 else
96d56e9f 2621 csym->native->u.syment.n_sclass = symbol_class;
244148ad 2622
b34976b6 2623 return TRUE;
252b5132 2624}
082b7297
L
2625
2626struct coff_comdat_info *
2627bfd_coff_get_comdat_section (bfd *abfd, struct bfd_section *sec)
2628{
fedf8d51
AM
2629 if (bfd_get_flavour (abfd) == bfd_target_coff_flavour
2630 && coff_section_data (abfd, sec) != NULL)
082b7297
L
2631 return coff_section_data (abfd, sec)->comdat;
2632 else
2633 return NULL;
2634}
c77ec726
AM
2635
2636bfd_boolean
2637_bfd_coff_section_already_linked (bfd *abfd,
2638 asection *sec,
2639 struct bfd_link_info *info)
2640{
2641 flagword flags;
2642 const char *name, *key;
2643 struct bfd_section_already_linked *l;
2644 struct bfd_section_already_linked_hash_entry *already_linked_list;
2645 struct coff_comdat_info *s_comdat;
2646
2647 flags = sec->flags;
2648 if ((flags & SEC_LINK_ONCE) == 0)
2649 return FALSE;
2650
2651 /* The COFF backend linker doesn't support group sections. */
2652 if ((flags & SEC_GROUP) != 0)
2653 return FALSE;
2654
2655 name = bfd_get_section_name (abfd, sec);
2656 s_comdat = bfd_coff_get_comdat_section (abfd, sec);
2657
2658 if (s_comdat != NULL)
2659 key = s_comdat->name;
2660 else
2661 {
2662 if (CONST_STRNEQ (name, ".gnu.linkonce.")
2663 && (key = strchr (name + sizeof (".gnu.linkonce.") - 1, '.')) != NULL)
2664 key++;
2665 else
2666 /* FIXME: gcc as of 2011-09 emits sections like .text$<key>,
2667 .xdata$<key> and .pdata$<key> only the first of which has a
2668 comdat key. Should these all match the LTO IR key? */
2669 key = name;
2670 }
2671
2672 already_linked_list = bfd_section_already_linked_table_lookup (key);
2673
2674 for (l = already_linked_list->entry; l != NULL; l = l->next)
2675 {
2676 struct coff_comdat_info *l_comdat;
2677
2678 l_comdat = bfd_coff_get_comdat_section (l->sec->owner, l->sec);
2679
2680 /* The section names must match, and both sections must be
2681 comdat and have the same comdat name, or both sections must
2682 be non-comdat. LTO IR plugin sections are an exception. They
2683 are always named .gnu.linkonce.t.<key> (<key> is some string)
2684 and match any comdat section with comdat name of <key>, and
2685 any linkonce section with the same suffix, ie.
2686 .gnu.linkonce.*.<key>. */
2687 if (((s_comdat != NULL) == (l_comdat != NULL)
2688 && strcmp (name, l->sec->name) == 0)
2689 || (l->sec->owner->flags & BFD_PLUGIN) != 0)
2690 {
2691 /* The section has already been linked. See if we should
2692 issue a warning. */
2693 return _bfd_handle_already_linked (sec, l, info);
2694 }
2695 }
2696
2697 /* This is the first section with this name. Record it. */
2698 if (!bfd_section_already_linked_table_insert (already_linked_list, sec))
2699 info->callbacks->einfo (_("%F%P: already_linked_table: %E\n"));
2700 return FALSE;
2701}
This page took 0.797427 seconds and 4 git commands to generate.