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