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