]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/coffgen.c
Fix typo
[thirdparty/binutils-gdb.git] / bfd / coffgen.c
CommitLineData
252b5132 1/* Support for the generic parts of COFF, for BFD.
7898deda
NC
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001
252b5132
RH
4 Free Software Foundation, Inc.
5 Written by Cygnus Support.
6
7This file is part of BFD, the Binary File Descriptor library.
8
9This program is free software; you can redistribute it and/or modify
10it under the terms of the GNU General Public License as published by
11the Free Software Foundation; either version 2 of the License, or
12(at your option) any later version.
13
14This program is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with this program; if not, write to the Free Software
21Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22
23/* Most of this hacked by Steve Chamberlain, sac@cygnus.com.
24 Split out of coffcode.h by Ian Taylor, ian@cygnus.com. */
25
26/* This file contains COFF code that is not dependent on any
27 particular COFF target. There is only one version of this file in
28 libbfd.a, so no target specific code may be put in here. Or, to
29 put it another way,
30
31 ********** DO NOT PUT TARGET SPECIFIC CODE IN THIS FILE **********
32
33 If you need to add some target specific behaviour, add a new hook
34 function to bfd_coff_backend_data.
35
36 Some of these functions are also called by the ECOFF routines.
37 Those functions may not use any COFF specific information, such as
38 coff_data (abfd). */
39
40#include "bfd.h"
41#include "sysdep.h"
42#include "libbfd.h"
43#include "coff/internal.h"
44#include "libcoff.h"
45
46static void coff_fix_symbol_name
47 PARAMS ((bfd *, asymbol *, combined_entry_type *, bfd_size_type *,
48 asection **, bfd_size_type *));
49static boolean coff_write_symbol
beb1bf64 50 PARAMS ((bfd *, asymbol *, combined_entry_type *, bfd_vma *,
252b5132
RH
51 bfd_size_type *, asection **, bfd_size_type *));
52static boolean coff_write_alien_symbol
beb1bf64 53 PARAMS ((bfd *, asymbol *, bfd_vma *, bfd_size_type *,
252b5132
RH
54 asection **, bfd_size_type *));
55static boolean coff_write_native_symbol
beb1bf64 56 PARAMS ((bfd *, coff_symbol_type *, bfd_vma *, bfd_size_type *,
252b5132
RH
57 asection **, bfd_size_type *));
58static void coff_pointerize_aux
59 PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
60 unsigned int, combined_entry_type *));
61static boolean make_a_section_from_file
62 PARAMS ((bfd *, struct internal_scnhdr *, unsigned int));
63static const bfd_target *coff_real_object_p
244148ad 64 PARAMS ((bfd *, unsigned, struct internal_filehdr *,
252b5132
RH
65 struct internal_aouthdr *));
66static void fixup_symbol_value
67 PARAMS ((bfd *, coff_symbol_type *, struct internal_syment *));
68static char *build_debug_section
69 PARAMS ((bfd *));
70static char *copy_name
71 PARAMS ((bfd *, char *, int));
72
73#define STRING_SIZE_SIZE (4)
74
75/* Take a section header read from a coff file (in HOST byte order),
76 and make a BFD "section" out of it. This is used by ECOFF. */
77static boolean
78make_a_section_from_file (abfd, hdr, target_index)
79 bfd *abfd;
80 struct internal_scnhdr *hdr;
81 unsigned int target_index;
82{
83 asection *return_section;
84 char *name;
7c8ca0e4
NC
85 boolean result = true;
86 flagword flags;
252b5132
RH
87
88 name = NULL;
89
90 /* Handle long section names as in PE. */
91 if (bfd_coff_long_section_names (abfd)
92 && hdr->s_name[0] == '/')
93 {
94 char buf[SCNNMLEN];
95 long strindex;
96 char *p;
97 const char *strings;
98
99 memcpy (buf, hdr->s_name + 1, SCNNMLEN - 1);
100 buf[SCNNMLEN - 1] = '\0';
101 strindex = strtol (buf, &p, 10);
102 if (*p == '\0' && strindex >= 0)
103 {
104 strings = _bfd_coff_read_string_table (abfd);
105 if (strings == NULL)
106 return false;
107 /* FIXME: For extra safety, we should make sure that
108 strindex does not run us past the end, but right now we
109 don't know the length of the string table. */
110 strings += strindex;
111 name = bfd_alloc (abfd, strlen (strings) + 1);
112 if (name == NULL)
113 return false;
114 strcpy (name, strings);
115 }
116 }
117
118 if (name == NULL)
119 {
120 /* Assorted wastage to null-terminate the name, thanks AT&T! */
121 name = bfd_alloc (abfd, sizeof (hdr->s_name) + 1);
122 if (name == NULL)
123 return false;
124 strncpy (name, (char *) &hdr->s_name[0], sizeof (hdr->s_name));
125 name[sizeof (hdr->s_name)] = 0;
126 }
127
128 return_section = bfd_make_section_anyway (abfd, name);
129 if (return_section == NULL)
130 return false;
131
132 return_section->vma = hdr->s_vaddr;
133 return_section->lma = hdr->s_paddr;
134 return_section->_raw_size = hdr->s_size;
135 return_section->filepos = hdr->s_scnptr;
136 return_section->rel_filepos = hdr->s_relptr;
137 return_section->reloc_count = hdr->s_nreloc;
138
139 bfd_coff_set_alignment_hook (abfd, return_section, hdr);
140
141 return_section->line_filepos = hdr->s_lnnoptr;
142
143 return_section->lineno_count = hdr->s_nlnno;
144 return_section->userdata = NULL;
145 return_section->next = (asection *) NULL;
252b5132 146 return_section->target_index = target_index;
7c8ca0e4
NC
147
148 if (! bfd_coff_styp_to_sec_flags_hook (abfd, hdr, name, return_section,
149 & flags))
150 result = false;
151
152 return_section->flags = flags;
252b5132
RH
153
154 /* At least on i386-coff, the line number count for a shared library
155 section must be ignored. */
156 if ((return_section->flags & SEC_COFF_SHARED_LIBRARY) != 0)
157 return_section->lineno_count = 0;
158
159 if (hdr->s_nreloc != 0)
160 return_section->flags |= SEC_RELOC;
161 /* FIXME: should this check 'hdr->s_size > 0' */
162 if (hdr->s_scnptr != 0)
163 return_section->flags |= SEC_HAS_CONTENTS;
7c8ca0e4
NC
164
165 return result;
252b5132
RH
166}
167
168/* Read in a COFF object and make it into a BFD. This is used by
169 ECOFF as well. */
170
171static const bfd_target *
172coff_real_object_p (abfd, nscns, internal_f, internal_a)
173 bfd *abfd;
174 unsigned nscns;
175 struct internal_filehdr *internal_f;
176 struct internal_aouthdr *internal_a;
177{
178 flagword oflags = abfd->flags;
179 bfd_vma ostart = bfd_get_start_address (abfd);
180 PTR tdata;
181 size_t readsize; /* length of file_info */
182 unsigned int scnhsz;
183 char *external_sections;
184
185 if (!(internal_f->f_flags & F_RELFLG))
186 abfd->flags |= HAS_RELOC;
187 if ((internal_f->f_flags & F_EXEC))
188 abfd->flags |= EXEC_P;
189 if (!(internal_f->f_flags & F_LNNO))
190 abfd->flags |= HAS_LINENO;
191 if (!(internal_f->f_flags & F_LSYMS))
192 abfd->flags |= HAS_LOCALS;
193
194 /* FIXME: How can we set D_PAGED correctly? */
195 if ((internal_f->f_flags & F_EXEC) != 0)
196 abfd->flags |= D_PAGED;
197
198 bfd_get_symcount (abfd) = internal_f->f_nsyms;
199 if (internal_f->f_nsyms)
200 abfd->flags |= HAS_SYMS;
201
202 if (internal_a != (struct internal_aouthdr *) NULL)
203 bfd_get_start_address (abfd) = internal_a->entry;
204 else
205 bfd_get_start_address (abfd) = 0;
206
207 /* Set up the tdata area. ECOFF uses its own routine, and overrides
208 abfd->flags. */
209 tdata = bfd_coff_mkobject_hook (abfd, (PTR) internal_f, (PTR) internal_a);
210 if (tdata == NULL)
211 return 0;
212
213 scnhsz = bfd_coff_scnhsz (abfd);
214 readsize = nscns * scnhsz;
215 external_sections = (char *) bfd_alloc (abfd, readsize);
216 if (!external_sections)
217 goto fail;
218
219 if (bfd_read ((PTR) external_sections, 1, readsize, abfd) != readsize)
220 goto fail;
221
363d7b14 222 /* Set the arch/mach *before* swapping in sections; section header swapping
244148ad 223 may depend on arch/mach info. */
363d7b14
TW
224 if (bfd_coff_set_arch_mach_hook (abfd, (PTR) internal_f) == false)
225 goto fail;
226
252b5132
RH
227 /* Now copy data as required; construct all asections etc */
228 if (nscns != 0)
229 {
230 unsigned int i;
231 for (i = 0; i < nscns; i++)
232 {
233 struct internal_scnhdr tmp;
234 bfd_coff_swap_scnhdr_in (abfd,
235 (PTR) (external_sections + i * scnhsz),
236 (PTR) & tmp);
237 if (! make_a_section_from_file (abfd, &tmp, i + 1))
238 goto fail;
239 }
240 }
241
242 /* make_abs_section (abfd); */
243
252b5132
RH
244 return abfd->xvec;
245
246 fail:
247 bfd_release (abfd, tdata);
248 abfd->flags = oflags;
249 bfd_get_start_address (abfd) = ostart;
250 return (const bfd_target *) NULL;
251}
252
253/* Turn a COFF file into a BFD, but fail with bfd_error_wrong_format if it is
254 not a COFF file. This is also used by ECOFF. */
255
256const bfd_target *
257coff_object_p (abfd)
258 bfd *abfd;
259{
260 unsigned int filhsz;
261 unsigned int aoutsz;
262 int nscns;
263 PTR filehdr;
264 struct internal_filehdr internal_f;
265 struct internal_aouthdr internal_a;
266
267 /* figure out how much to read */
268 filhsz = bfd_coff_filhsz (abfd);
269 aoutsz = bfd_coff_aoutsz (abfd);
270
271 filehdr = bfd_alloc (abfd, filhsz);
272 if (filehdr == NULL)
273 return 0;
274 if (bfd_read (filehdr, 1, filhsz, abfd) != filhsz)
275 {
276 if (bfd_get_error () != bfd_error_system_call)
277 bfd_set_error (bfd_error_wrong_format);
278 return 0;
279 }
280 bfd_coff_swap_filehdr_in (abfd, filehdr, &internal_f);
281 bfd_release (abfd, filehdr);
282
283 if (bfd_coff_bad_format_hook (abfd, &internal_f) == false)
284 {
285 bfd_set_error (bfd_error_wrong_format);
286 return 0;
287 }
288 nscns = internal_f.f_nscns;
289
290 if (internal_f.f_opthdr)
291 {
292 PTR opthdr;
293
294 opthdr = bfd_alloc (abfd, aoutsz);
295 if (opthdr == NULL)
296 return 0;;
297 if (bfd_read (opthdr, 1, internal_f.f_opthdr, abfd)
298 != internal_f.f_opthdr)
299 {
300 return 0;
301 }
302 bfd_coff_swap_aouthdr_in (abfd, opthdr, (PTR) &internal_a);
303 }
304
305 return coff_real_object_p (abfd, nscns, &internal_f,
306 (internal_f.f_opthdr != 0
307 ? &internal_a
308 : (struct internal_aouthdr *) NULL));
309}
310
311/* Get the BFD section from a COFF symbol section number. */
312
313asection *
314coff_section_from_bfd_index (abfd, index)
315 bfd *abfd;
316 int index;
317{
318 struct sec *answer = abfd->sections;
319
320 if (index == N_ABS)
321 return bfd_abs_section_ptr;
322 if (index == N_UNDEF)
323 return bfd_und_section_ptr;
324 if (index == N_DEBUG)
325 return bfd_abs_section_ptr;
326
327 while (answer)
328 {
329 if (answer->target_index == index)
330 return answer;
331 answer = answer->next;
332 }
333
334 /* We should not reach this point, but the SCO 3.2v4 /lib/libc_s.a
335 has a bad symbol table in biglitpow.o. */
336 return bfd_und_section_ptr;
337}
338
339/* Get the upper bound of a COFF symbol table. */
340
341long
342coff_get_symtab_upper_bound (abfd)
343 bfd *abfd;
344{
345 if (!bfd_coff_slurp_symbol_table (abfd))
346 return -1;
347
348 return (bfd_get_symcount (abfd) + 1) * (sizeof (coff_symbol_type *));
349}
350
252b5132
RH
351/* Canonicalize a COFF symbol table. */
352
353long
354coff_get_symtab (abfd, alocation)
355 bfd *abfd;
356 asymbol **alocation;
357{
358 unsigned int counter;
359 coff_symbol_type *symbase;
360 coff_symbol_type **location = (coff_symbol_type **) alocation;
361
362 if (!bfd_coff_slurp_symbol_table (abfd))
363 return -1;
364
365 symbase = obj_symbols (abfd);
366 counter = bfd_get_symcount (abfd);
367 while (counter-- > 0)
368 *location++ = symbase++;
369
370 *location = NULL;
371
372 return bfd_get_symcount (abfd);
373}
374
375/* Get the name of a symbol. The caller must pass in a buffer of size
376 >= SYMNMLEN + 1. */
377
378const char *
379_bfd_coff_internal_syment_name (abfd, sym, buf)
380 bfd *abfd;
381 const struct internal_syment *sym;
382 char *buf;
383{
384 /* FIXME: It's not clear this will work correctly if sizeof
385 (_n_zeroes) != 4. */
386 if (sym->_n._n_n._n_zeroes != 0
387 || sym->_n._n_n._n_offset == 0)
388 {
389 memcpy (buf, sym->_n._n_name, SYMNMLEN);
390 buf[SYMNMLEN] = '\0';
391 return buf;
392 }
393 else
394 {
395 const char *strings;
396
397 BFD_ASSERT (sym->_n._n_n._n_offset >= STRING_SIZE_SIZE);
398 strings = obj_coff_strings (abfd);
399 if (strings == NULL)
400 {
401 strings = _bfd_coff_read_string_table (abfd);
402 if (strings == NULL)
403 return NULL;
404 }
405 return strings + sym->_n._n_n._n_offset;
406 }
407}
408
409/* Read in and swap the relocs. This returns a buffer holding the
410 relocs for section SEC in file ABFD. If CACHE is true and
411 INTERNAL_RELOCS is NULL, the relocs read in will be saved in case
412 the function is called again. If EXTERNAL_RELOCS is not NULL, it
413 is a buffer large enough to hold the unswapped relocs. If
414 INTERNAL_RELOCS is not NULL, it is a buffer large enough to hold
415 the swapped relocs. If REQUIRE_INTERNAL is true, then the return
416 value must be INTERNAL_RELOCS. The function returns NULL on error. */
417
418struct internal_reloc *
419_bfd_coff_read_internal_relocs (abfd, sec, cache, external_relocs,
420 require_internal, internal_relocs)
421 bfd *abfd;
422 asection *sec;
423 boolean cache;
424 bfd_byte *external_relocs;
425 boolean require_internal;
426 struct internal_reloc *internal_relocs;
427{
428 bfd_size_type relsz;
429 bfd_byte *free_external = NULL;
430 struct internal_reloc *free_internal = NULL;
431 bfd_byte *erel;
432 bfd_byte *erel_end;
433 struct internal_reloc *irel;
434
435 if (coff_section_data (abfd, sec) != NULL
436 && coff_section_data (abfd, sec)->relocs != NULL)
437 {
438 if (! require_internal)
439 return coff_section_data (abfd, sec)->relocs;
440 memcpy (internal_relocs, coff_section_data (abfd, sec)->relocs,
441 sec->reloc_count * sizeof (struct internal_reloc));
442 return internal_relocs;
443 }
444
445 relsz = bfd_coff_relsz (abfd);
446
447 if (external_relocs == NULL)
448 {
449 free_external = (bfd_byte *) bfd_malloc (sec->reloc_count * relsz);
450 if (free_external == NULL && sec->reloc_count > 0)
451 goto error_return;
452 external_relocs = free_external;
453 }
454
455 if (bfd_seek (abfd, sec->rel_filepos, SEEK_SET) != 0
456 || (bfd_read (external_relocs, relsz, sec->reloc_count, abfd)
457 != relsz * sec->reloc_count))
458 goto error_return;
459
460 if (internal_relocs == NULL)
461 {
462 free_internal = ((struct internal_reloc *)
463 bfd_malloc (sec->reloc_count
464 * sizeof (struct internal_reloc)));
465 if (free_internal == NULL && sec->reloc_count > 0)
466 goto error_return;
467 internal_relocs = free_internal;
468 }
469
470 /* Swap in the relocs. */
471 erel = external_relocs;
472 erel_end = erel + relsz * sec->reloc_count;
473 irel = internal_relocs;
474 for (; erel < erel_end; erel += relsz, irel++)
475 bfd_coff_swap_reloc_in (abfd, (PTR) erel, (PTR) irel);
476
477 if (free_external != NULL)
478 {
479 free (free_external);
480 free_external = NULL;
481 }
482
483 if (cache && free_internal != NULL)
484 {
485 if (coff_section_data (abfd, sec) == NULL)
486 {
487 sec->used_by_bfd =
488 (PTR) bfd_zalloc (abfd,
489 sizeof (struct coff_section_tdata));
490 if (sec->used_by_bfd == NULL)
491 goto error_return;
492 coff_section_data (abfd, sec)->contents = NULL;
493 }
494 coff_section_data (abfd, sec)->relocs = free_internal;
495 }
496
497 return internal_relocs;
498
499 error_return:
500 if (free_external != NULL)
501 free (free_external);
502 if (free_internal != NULL)
503 free (free_internal);
504 return NULL;
505}
506
507/* Set lineno_count for the output sections of a COFF file. */
508
509int
510coff_count_linenumbers (abfd)
511 bfd *abfd;
512{
513 unsigned int limit = bfd_get_symcount (abfd);
514 unsigned int i;
515 int total = 0;
516 asymbol **p;
517 asection *s;
518
519 if (limit == 0)
520 {
521 /* This may be from the backend linker, in which case the
522 lineno_count in the sections is correct. */
523 for (s = abfd->sections; s != NULL; s = s->next)
524 total += s->lineno_count;
525 return total;
526 }
527
528 for (s = abfd->sections; s != NULL; s = s->next)
529 BFD_ASSERT (s->lineno_count == 0);
530
531 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
532 {
533 asymbol *q_maybe = *p;
534
9bd09e22 535 if (bfd_family_coff (bfd_asymbol_bfd (q_maybe)))
252b5132
RH
536 {
537 coff_symbol_type *q = coffsymbol (q_maybe);
538
539 /* The AIX 4.1 compiler can sometimes generate line numbers
540 attached to debugging symbols. We try to simply ignore
541 those here. */
542 if (q->lineno != NULL
543 && q->symbol.section->owner != NULL)
544 {
545 /* This symbol has line numbers. Increment the owning
546 section's linenumber count. */
547 alent *l = q->lineno;
548
549 ++q->symbol.section->output_section->lineno_count;
550 ++total;
551 ++l;
552 while (l->line_number != 0)
553 {
554 ++total;
555 ++q->symbol.section->output_section->lineno_count;
556 ++l;
557 }
558 }
559 }
560 }
561
562 return total;
563}
564
565/* Takes a bfd and a symbol, returns a pointer to the coff specific
566 area of the symbol if there is one. */
567
252b5132
RH
568coff_symbol_type *
569coff_symbol_from (ignore_abfd, symbol)
7442e600 570 bfd *ignore_abfd ATTRIBUTE_UNUSED;
252b5132
RH
571 asymbol *symbol;
572{
9bd09e22 573 if (!bfd_family_coff (bfd_asymbol_bfd (symbol)))
252b5132
RH
574 return (coff_symbol_type *) NULL;
575
576 if (bfd_asymbol_bfd (symbol)->tdata.coff_obj_data == (coff_data_type *) NULL)
577 return (coff_symbol_type *) NULL;
578
579 return (coff_symbol_type *) symbol;
580}
581
582static void
583fixup_symbol_value (abfd, coff_symbol_ptr, syment)
584 bfd *abfd;
585 coff_symbol_type *coff_symbol_ptr;
586 struct internal_syment *syment;
587{
588
589 /* Normalize the symbol flags */
590 if (bfd_is_com_section (coff_symbol_ptr->symbol.section))
591 {
592 /* a common symbol is undefined with a value */
593 syment->n_scnum = N_UNDEF;
594 syment->n_value = coff_symbol_ptr->symbol.value;
595 }
703153b5
ILT
596 else if ((coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) != 0
597 && (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING_RELOC) == 0)
252b5132
RH
598 {
599 syment->n_value = coff_symbol_ptr->symbol.value;
600 }
601 else if (bfd_is_und_section (coff_symbol_ptr->symbol.section))
602 {
603 syment->n_scnum = N_UNDEF;
604 syment->n_value = 0;
605 }
7bb9db4d 606 /* FIXME: Do we need to handle the absolute section here? */
252b5132
RH
607 else
608 {
609 if (coff_symbol_ptr->symbol.section)
610 {
611 syment->n_scnum =
612 coff_symbol_ptr->symbol.section->output_section->target_index;
613
614 syment->n_value = (coff_symbol_ptr->symbol.value
615 + coff_symbol_ptr->symbol.section->output_offset);
616 if (! obj_pe (abfd))
34cbe64e
TW
617 {
618 syment->n_value += (syment->n_sclass == C_STATLAB)
619 ? coff_symbol_ptr->symbol.section->output_section->lma
620 : coff_symbol_ptr->symbol.section->output_section->vma;
621 }
252b5132
RH
622 }
623 else
624 {
625 BFD_ASSERT (0);
626 /* This can happen, but I don't know why yet (steve@cygnus.com) */
627 syment->n_scnum = N_ABS;
628 syment->n_value = coff_symbol_ptr->symbol.value;
629 }
630 }
631}
632
633/* Run through all the symbols in the symbol table and work out what
634 their indexes into the symbol table will be when output.
635
636 Coff requires that each C_FILE symbol points to the next one in the
637 chain, and that the last one points to the first external symbol. We
638 do that here too. */
639
640boolean
641coff_renumber_symbols (bfd_ptr, first_undef)
642 bfd *bfd_ptr;
643 int *first_undef;
644{
645 unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
646 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
647 unsigned int native_index = 0;
648 struct internal_syment *last_file = (struct internal_syment *) NULL;
649 unsigned int symbol_index;
650
651 /* COFF demands that undefined symbols come after all other symbols.
652 Since we don't need to impose this extra knowledge on all our
653 client programs, deal with that here. Sort the symbol table;
654 just move the undefined symbols to the end, leaving the rest
655 alone. The O'Reilly book says that defined global symbols come
656 at the end before the undefined symbols, so we do that here as
657 well. */
658 /* @@ Do we have some condition we could test for, so we don't always
659 have to do this? I don't think relocatability is quite right, but
660 I'm not certain. [raeburn:19920508.1711EST] */
661 {
662 asymbol **newsyms;
663 unsigned int i;
664
665 newsyms = (asymbol **) bfd_alloc (bfd_ptr,
666 sizeof (asymbol *) * (symbol_count + 1));
667 if (!newsyms)
668 return false;
669 bfd_ptr->outsymbols = newsyms;
670 for (i = 0; i < symbol_count; i++)
671 if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) != 0
672 || (!bfd_is_und_section (symbol_ptr_ptr[i]->section)
673 && !bfd_is_com_section (symbol_ptr_ptr[i]->section)
674 && ((symbol_ptr_ptr[i]->flags & BSF_FUNCTION) != 0
675 || ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_WEAK))
676 == 0))))
677 *newsyms++ = symbol_ptr_ptr[i];
678
679 for (i = 0; i < symbol_count; i++)
680 if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0
681 && !bfd_is_und_section (symbol_ptr_ptr[i]->section)
682 && (bfd_is_com_section (symbol_ptr_ptr[i]->section)
683 || ((symbol_ptr_ptr[i]->flags & BSF_FUNCTION) == 0
684 && ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_WEAK))
685 != 0))))
686 *newsyms++ = symbol_ptr_ptr[i];
687
688 *first_undef = newsyms - bfd_ptr->outsymbols;
689
690 for (i = 0; i < symbol_count; i++)
691 if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0
692 && bfd_is_und_section (symbol_ptr_ptr[i]->section))
693 *newsyms++ = symbol_ptr_ptr[i];
694 *newsyms = (asymbol *) NULL;
695 symbol_ptr_ptr = bfd_ptr->outsymbols;
696 }
697
698 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
699 {
700 coff_symbol_type *coff_symbol_ptr = coff_symbol_from (bfd_ptr, symbol_ptr_ptr[symbol_index]);
244148ad 701 symbol_ptr_ptr[symbol_index]->udata.i = symbol_index;
252b5132
RH
702 if (coff_symbol_ptr && coff_symbol_ptr->native)
703 {
704 combined_entry_type *s = coff_symbol_ptr->native;
705 int i;
706
707 if (s->u.syment.n_sclass == C_FILE)
708 {
709 if (last_file != (struct internal_syment *) NULL)
710 last_file->n_value = native_index;
711 last_file = &(s->u.syment);
712 }
713 else
714 {
715
716 /* Modify the symbol values according to their section and
717 type */
718
719 fixup_symbol_value (bfd_ptr, coff_symbol_ptr, &(s->u.syment));
720 }
721 for (i = 0; i < s->u.syment.n_numaux + 1; i++)
722 s[i].offset = native_index++;
723 }
724 else
725 {
726 native_index++;
727 }
728 }
729 obj_conv_table_size (bfd_ptr) = native_index;
730
731 return true;
732}
733
734/* Run thorough the symbol table again, and fix it so that all
735 pointers to entries are changed to the entries' index in the output
736 symbol table. */
737
738void
739coff_mangle_symbols (bfd_ptr)
740 bfd *bfd_ptr;
741{
742 unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
743 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
744 unsigned int symbol_index;
745
746 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
747 {
748 coff_symbol_type *coff_symbol_ptr =
749 coff_symbol_from (bfd_ptr, symbol_ptr_ptr[symbol_index]);
750
751 if (coff_symbol_ptr && coff_symbol_ptr->native)
752 {
753 int i;
754 combined_entry_type *s = coff_symbol_ptr->native;
755
756 if (s->fix_value)
757 {
758 /* FIXME: We should use a union here. */
beb1bf64
TR
759 s->u.syment.n_value =
760 (bfd_vma)((combined_entry_type *)
761 ((unsigned long) s->u.syment.n_value))->offset;
252b5132
RH
762 s->fix_value = 0;
763 }
764 if (s->fix_line)
765 {
766 /* The value is the offset into the line number entries
767 for the symbol's section. On output, the symbol's
768 section should be N_DEBUG. */
769 s->u.syment.n_value =
770 (coff_symbol_ptr->symbol.section->output_section->line_filepos
771 + s->u.syment.n_value * bfd_coff_linesz (bfd_ptr));
772 coff_symbol_ptr->symbol.section =
773 coff_section_from_bfd_index (bfd_ptr, N_DEBUG);
774 BFD_ASSERT (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING);
775 }
776 for (i = 0; i < s->u.syment.n_numaux; i++)
777 {
778 combined_entry_type *a = s + i + 1;
779 if (a->fix_tag)
780 {
781 a->u.auxent.x_sym.x_tagndx.l =
782 a->u.auxent.x_sym.x_tagndx.p->offset;
783 a->fix_tag = 0;
784 }
785 if (a->fix_end)
786 {
787 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l =
788 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p->offset;
789 a->fix_end = 0;
790 }
791 if (a->fix_scnlen)
792 {
793 a->u.auxent.x_csect.x_scnlen.l =
794 a->u.auxent.x_csect.x_scnlen.p->offset;
795 a->fix_scnlen = 0;
796 }
797 }
798 }
799 }
800}
801
802static void
803coff_fix_symbol_name (abfd, symbol, native, string_size_p,
804 debug_string_section_p, debug_string_size_p)
805 bfd *abfd;
806 asymbol *symbol;
807 combined_entry_type *native;
808 bfd_size_type *string_size_p;
809 asection **debug_string_section_p;
810 bfd_size_type *debug_string_size_p;
811{
812 unsigned int name_length;
813 union internal_auxent *auxent;
814 char *name = (char *) (symbol->name);
815
816 if (name == (char *) NULL)
817 {
818 /* coff symbols always have names, so we'll make one up */
819 symbol->name = "strange";
820 name = (char *) symbol->name;
821 }
822 name_length = strlen (name);
823
824 if (native->u.syment.n_sclass == C_FILE
825 && native->u.syment.n_numaux > 0)
826 {
692b7d62
ILT
827 unsigned int filnmlen;
828
7f6d05e8
CP
829 if (bfd_coff_force_symnames_in_strings (abfd))
830 {
244148ad 831 native->u.syment._n._n_n._n_offset =
7f6d05e8
CP
832 (*string_size_p + STRING_SIZE_SIZE);
833 native->u.syment._n._n_n._n_zeroes = 0;
834 *string_size_p += 6; /* strlen(".file") + 1 */
835 }
836 else
837 strncpy (native->u.syment._n._n_name, ".file", SYMNMLEN);
838
252b5132
RH
839 auxent = &(native + 1)->u.auxent;
840
692b7d62
ILT
841 filnmlen = bfd_coff_filnmlen (abfd);
842
252b5132
RH
843 if (bfd_coff_long_filenames (abfd))
844 {
692b7d62 845 if (name_length <= filnmlen)
252b5132 846 {
692b7d62 847 strncpy (auxent->x_file.x_fname, name, filnmlen);
252b5132
RH
848 }
849 else
850 {
851 auxent->x_file.x_n.x_offset = *string_size_p + STRING_SIZE_SIZE;
852 auxent->x_file.x_n.x_zeroes = 0;
853 *string_size_p += name_length + 1;
854 }
855 }
856 else
857 {
692b7d62
ILT
858 strncpy (auxent->x_file.x_fname, name, filnmlen);
859 if (name_length > filnmlen)
860 name[filnmlen] = '\0';
252b5132
RH
861 }
862 }
863 else
864 {
7f6d05e8 865 if (name_length <= SYMNMLEN && !bfd_coff_force_symnames_in_strings (abfd))
252b5132
RH
866 {
867 /* This name will fit into the symbol neatly */
868 strncpy (native->u.syment._n._n_name, symbol->name, SYMNMLEN);
869 }
870 else if (!bfd_coff_symname_in_debug (abfd, &native->u.syment))
871 {
872 native->u.syment._n._n_n._n_offset = (*string_size_p
873 + STRING_SIZE_SIZE);
874 native->u.syment._n._n_n._n_zeroes = 0;
875 *string_size_p += name_length + 1;
876 }
877 else
878 {
879 long filepos;
7f6d05e8
CP
880 bfd_byte buf[4];
881 int prefix_len = bfd_coff_debug_string_prefix_length (abfd);
252b5132
RH
882
883 /* This name should be written into the .debug section. For
884 some reason each name is preceded by a two byte length
885 and also followed by a null byte. FIXME: We assume that
886 the .debug section has already been created, and that it
887 is large enough. */
888 if (*debug_string_section_p == (asection *) NULL)
889 *debug_string_section_p = bfd_get_section_by_name (abfd, ".debug");
890 filepos = bfd_tell (abfd);
7f6d05e8
CP
891 if (prefix_len == 4)
892 bfd_put_32 (abfd, name_length + 1, buf);
893 else
894 bfd_put_16 (abfd, name_length + 1, buf);
895
252b5132
RH
896 if (!bfd_set_section_contents (abfd,
897 *debug_string_section_p,
898 (PTR) buf,
899 (file_ptr) *debug_string_size_p,
7f6d05e8 900 (bfd_size_type) prefix_len)
252b5132
RH
901 || !bfd_set_section_contents (abfd,
902 *debug_string_section_p,
903 (PTR) symbol->name,
904 ((file_ptr) *debug_string_size_p
7f6d05e8 905 + prefix_len),
252b5132
RH
906 (bfd_size_type) name_length + 1))
907 abort ();
908 if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
909 abort ();
244148ad 910 native->u.syment._n._n_n._n_offset =
7f6d05e8 911 *debug_string_size_p + prefix_len;
252b5132 912 native->u.syment._n._n_n._n_zeroes = 0;
7f6d05e8 913 *debug_string_size_p += name_length + 1 + prefix_len;
252b5132
RH
914 }
915 }
916}
917
918/* We need to keep track of the symbol index so that when we write out
919 the relocs we can get the index for a symbol. This method is a
920 hack. FIXME. */
921
922#define set_index(symbol, idx) ((symbol)->udata.i = (idx))
923
924/* Write a symbol out to a COFF file. */
925
926static boolean
927coff_write_symbol (abfd, symbol, native, written, string_size_p,
928 debug_string_section_p, debug_string_size_p)
929 bfd *abfd;
930 asymbol *symbol;
931 combined_entry_type *native;
beb1bf64 932 bfd_vma *written;
252b5132
RH
933 bfd_size_type *string_size_p;
934 asection **debug_string_section_p;
935 bfd_size_type *debug_string_size_p;
936{
937 unsigned int numaux = native->u.syment.n_numaux;
938 int type = native->u.syment.n_type;
939 int class = native->u.syment.n_sclass;
940 PTR buf;
941 bfd_size_type symesz;
942
943 if (native->u.syment.n_sclass == C_FILE)
944 symbol->flags |= BSF_DEBUGGING;
945
946 if (symbol->flags & BSF_DEBUGGING
947 && bfd_is_abs_section (symbol->section))
948 {
949 native->u.syment.n_scnum = N_DEBUG;
950 }
951 else if (bfd_is_abs_section (symbol->section))
952 {
953 native->u.syment.n_scnum = N_ABS;
954 }
955 else if (bfd_is_und_section (symbol->section))
956 {
957 native->u.syment.n_scnum = N_UNDEF;
958 }
959 else
960 {
961 native->u.syment.n_scnum =
962 symbol->section->output_section->target_index;
963 }
964
965 coff_fix_symbol_name (abfd, symbol, native, string_size_p,
966 debug_string_section_p, debug_string_size_p);
967
968 symesz = bfd_coff_symesz (abfd);
969 buf = bfd_alloc (abfd, symesz);
970 if (!buf)
971 return false;
972 bfd_coff_swap_sym_out (abfd, &native->u.syment, buf);
973 if (bfd_write (buf, 1, symesz, abfd) != symesz)
974 return false;
975 bfd_release (abfd, buf);
976
977 if (native->u.syment.n_numaux > 0)
978 {
979 bfd_size_type auxesz;
980 unsigned int j;
981
982 auxesz = bfd_coff_auxesz (abfd);
983 buf = bfd_alloc (abfd, auxesz);
984 if (!buf)
985 return false;
986 for (j = 0; j < native->u.syment.n_numaux; j++)
987 {
988 bfd_coff_swap_aux_out (abfd,
989 &((native + j + 1)->u.auxent),
990 type,
991 class,
992 j,
993 native->u.syment.n_numaux,
994 buf);
995 if (bfd_write (buf, 1, auxesz, abfd) != auxesz)
996 return false;
997 }
998 bfd_release (abfd, buf);
999 }
1000
1001 /* Store the index for use when we write out the relocs. */
1002 set_index (symbol, *written);
1003
1004 *written += numaux + 1;
1005 return true;
1006}
1007
1008/* Write out a symbol to a COFF file that does not come from a COFF
1009 file originally. This symbol may have been created by the linker,
1010 or we may be linking a non COFF file to a COFF file. */
1011
1012static boolean
1013coff_write_alien_symbol (abfd, symbol, written, string_size_p,
1014 debug_string_section_p, debug_string_size_p)
1015 bfd *abfd;
1016 asymbol *symbol;
beb1bf64 1017 bfd_vma *written;
252b5132
RH
1018 bfd_size_type *string_size_p;
1019 asection **debug_string_section_p;
1020 bfd_size_type *debug_string_size_p;
1021{
1022 combined_entry_type *native;
1023 combined_entry_type dummy;
1024
1025 native = &dummy;
1026 native->u.syment.n_type = T_NULL;
1027 native->u.syment.n_flags = 0;
1028 if (bfd_is_und_section (symbol->section))
1029 {
1030 native->u.syment.n_scnum = N_UNDEF;
1031 native->u.syment.n_value = symbol->value;
1032 }
1033 else if (bfd_is_com_section (symbol->section))
1034 {
1035 native->u.syment.n_scnum = N_UNDEF;
1036 native->u.syment.n_value = symbol->value;
1037 }
1038 else if (symbol->flags & BSF_DEBUGGING)
1039 {
1040 /* There isn't much point to writing out a debugging symbol
1041 unless we are prepared to convert it into COFF debugging
1042 format. So, we just ignore them. We must clobber the symbol
1043 name to keep it from being put in the string table. */
1044 symbol->name = "";
1045 return true;
1046 }
1047 else
1048 {
1049 native->u.syment.n_scnum =
1050 symbol->section->output_section->target_index;
1051 native->u.syment.n_value = (symbol->value
1052 + symbol->section->output_offset);
1053 if (! obj_pe (abfd))
1054 native->u.syment.n_value += symbol->section->output_section->vma;
1055
1056 /* Copy the any flags from the the file header into the symbol.
1057 FIXME: Why? */
1058 {
1059 coff_symbol_type *c = coff_symbol_from (abfd, symbol);
1060 if (c != (coff_symbol_type *) NULL)
1061 native->u.syment.n_flags = bfd_asymbol_bfd (&c->symbol)->flags;
1062 }
1063 }
1064
1065 native->u.syment.n_type = 0;
1066 if (symbol->flags & BSF_LOCAL)
1067 native->u.syment.n_sclass = C_STAT;
1068 else if (symbol->flags & BSF_WEAK)
1069 native->u.syment.n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT;
1070 else
1071 native->u.syment.n_sclass = C_EXT;
1072 native->u.syment.n_numaux = 0;
1073
1074 return coff_write_symbol (abfd, symbol, native, written, string_size_p,
1075 debug_string_section_p, debug_string_size_p);
1076}
1077
1078/* Write a native symbol to a COFF file. */
1079
1080static boolean
1081coff_write_native_symbol (abfd, symbol, written, string_size_p,
1082 debug_string_section_p, debug_string_size_p)
1083 bfd *abfd;
1084 coff_symbol_type *symbol;
beb1bf64 1085 bfd_vma *written;
252b5132
RH
1086 bfd_size_type *string_size_p;
1087 asection **debug_string_section_p;
1088 bfd_size_type *debug_string_size_p;
1089{
1090 combined_entry_type *native = symbol->native;
1091 alent *lineno = symbol->lineno;
1092
1093 /* If this symbol has an associated line number, we must store the
1094 symbol index in the line number field. We also tag the auxent to
1095 point to the right place in the lineno table. */
1096 if (lineno && !symbol->done_lineno && symbol->symbol.section->owner != NULL)
1097 {
1098 unsigned int count = 0;
1099 lineno[count].u.offset = *written;
1100 if (native->u.syment.n_numaux)
1101 {
1102 union internal_auxent *a = &((native + 1)->u.auxent);
1103
1104 a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
1105 symbol->symbol.section->output_section->moving_line_filepos;
1106 }
1107
1108 /* Count and relocate all other linenumbers. */
1109 count++;
1110 while (lineno[count].line_number != 0)
1111 {
1112#if 0
244148ad 1113 /* 13 april 92. sac
252b5132
RH
1114 I've been told this, but still need proof:
1115 > The second bug is also in `bfd/coffcode.h'. This bug
1116 > causes the linker to screw up the pc-relocations for
1117 > all the line numbers in COFF code. This bug isn't only
1118 > specific to A29K implementations, but affects all
1119 > systems using COFF format binaries. Note that in COFF
1120 > object files, the line number core offsets output by
1121 > the assembler are relative to the start of each
1122 > procedure, not to the start of the .text section. This
1123 > patch relocates the line numbers relative to the
1124 > `native->u.syment.n_value' instead of the section
1125 > virtual address.
1126 > modular!olson@cs.arizona.edu (Jon Olson)
1127 */
1128 lineno[count].u.offset += native->u.syment.n_value;
1129#else
1130 lineno[count].u.offset +=
1131 (symbol->symbol.section->output_section->vma
1132 + symbol->symbol.section->output_offset);
1133#endif
1134 count++;
1135 }
1136 symbol->done_lineno = true;
1137
1138 symbol->symbol.section->output_section->moving_line_filepos +=
1139 count * bfd_coff_linesz (abfd);
1140 }
1141
1142 return coff_write_symbol (abfd, &(symbol->symbol), native, written,
1143 string_size_p, debug_string_section_p,
1144 debug_string_size_p);
1145}
1146
1147/* Write out the COFF symbols. */
1148
1149boolean
1150coff_write_symbols (abfd)
1151 bfd *abfd;
1152{
1153 bfd_size_type string_size;
1154 asection *debug_string_section;
1155 bfd_size_type debug_string_size;
1156 unsigned int i;
1157 unsigned int limit = bfd_get_symcount (abfd);
beb1bf64 1158 bfd_signed_vma written = 0;
252b5132
RH
1159 asymbol **p;
1160
1161 string_size = 0;
1162 debug_string_section = NULL;
1163 debug_string_size = 0;
1164
1165 /* If this target supports long section names, they must be put into
1166 the string table. This is supported by PE. This code must
1167 handle section names just as they are handled in
1168 coff_write_object_contents. */
1169 if (bfd_coff_long_section_names (abfd))
1170 {
1171 asection *o;
1172
1173 for (o = abfd->sections; o != NULL; o = o->next)
1174 {
1175 size_t len;
1176
1177 len = strlen (o->name);
1178 if (len > SCNNMLEN)
1179 string_size += len + 1;
1180 }
1181 }
1182
1183 /* Seek to the right place */
1184 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0)
1185 return false;
1186
1187 /* Output all the symbols we have */
1188
1189 written = 0;
1190 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
1191 {
1192 asymbol *symbol = *p;
1193 coff_symbol_type *c_symbol = coff_symbol_from (abfd, symbol);
1194
1195 if (c_symbol == (coff_symbol_type *) NULL
1196 || c_symbol->native == (combined_entry_type *) NULL)
1197 {
1198 if (!coff_write_alien_symbol (abfd, symbol, &written, &string_size,
1199 &debug_string_section,
1200 &debug_string_size))
1201 return false;
1202 }
1203 else
1204 {
1205 if (!coff_write_native_symbol (abfd, c_symbol, &written,
1206 &string_size, &debug_string_section,
1207 &debug_string_size))
1208 return false;
1209 }
1210 }
1211
1212 obj_raw_syment_count (abfd) = written;
1213
1214 /* Now write out strings */
1215
1216 if (string_size != 0)
1217 {
1218 unsigned int size = string_size + STRING_SIZE_SIZE;
1219 bfd_byte buffer[STRING_SIZE_SIZE];
1220
1221#if STRING_SIZE_SIZE == 4
1222 bfd_h_put_32 (abfd, size, buffer);
1223#else
1224 #error Change bfd_h_put_32
1225#endif
1226 if (bfd_write ((PTR) buffer, 1, sizeof (buffer), abfd) != sizeof (buffer))
1227 return false;
1228
1229 /* Handle long section names. This code must handle section
1230 names just as they are handled in coff_write_object_contents. */
1231 if (bfd_coff_long_section_names (abfd))
1232 {
1233 asection *o;
1234
1235 for (o = abfd->sections; o != NULL; o = o->next)
1236 {
1237 size_t len;
1238
1239 len = strlen (o->name);
1240 if (len > SCNNMLEN)
1241 {
1242 if (bfd_write (o->name, 1, len + 1, abfd) != len + 1)
1243 return false;
1244 }
1245 }
1246 }
1247
1248 for (p = abfd->outsymbols, i = 0;
1249 i < limit;
1250 i++, p++)
1251 {
1252 asymbol *q = *p;
1253 size_t name_length = strlen (q->name);
1254 coff_symbol_type *c_symbol = coff_symbol_from (abfd, q);
1255 size_t maxlen;
1256
1257 /* Figure out whether the symbol name should go in the string
1258 table. Symbol names that are short enough are stored
1259 directly in the syment structure. File names permit a
1260 different, longer, length in the syment structure. On
1261 XCOFF, some symbol names are stored in the .debug section
1262 rather than in the string table. */
1263
1264 if (c_symbol == NULL
1265 || c_symbol->native == NULL)
1266 {
1267 /* This is not a COFF symbol, so it certainly is not a
1268 file name, nor does it go in the .debug section. */
7f6d05e8 1269 maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
252b5132
RH
1270 }
1271 else if (bfd_coff_symname_in_debug (abfd,
1272 &c_symbol->native->u.syment))
1273 {
1274 /* This symbol name is in the XCOFF .debug section.
1275 Don't write it into the string table. */
1276 maxlen = name_length;
1277 }
1278 else if (c_symbol->native->u.syment.n_sclass == C_FILE
1279 && c_symbol->native->u.syment.n_numaux > 0)
7f6d05e8 1280 {
244148ad 1281 if (bfd_coff_force_symnames_in_strings (abfd))
7f6d05e8
CP
1282 bfd_write (".file", 1, 6, abfd);
1283 maxlen = bfd_coff_filnmlen (abfd);
1284 }
252b5132 1285 else
7f6d05e8 1286 maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
252b5132
RH
1287
1288 if (name_length > maxlen)
1289 {
1290 if (bfd_write ((PTR) (q->name), 1, name_length + 1, abfd)
1291 != name_length + 1)
1292 return false;
1293 }
1294 }
1295 }
1296 else
1297 {
1298 /* We would normally not write anything here, but we'll write
1299 out 4 so that any stupid coff reader which tries to read the
1300 string table even when there isn't one won't croak. */
1301 unsigned int size = STRING_SIZE_SIZE;
1302 bfd_byte buffer[STRING_SIZE_SIZE];
1303
1304#if STRING_SIZE_SIZE == 4
1305 bfd_h_put_32 (abfd, size, buffer);
1306#else
1307 #error Change bfd_h_put_32
1308#endif
1309 if (bfd_write ((PTR) buffer, 1, STRING_SIZE_SIZE, abfd)
1310 != STRING_SIZE_SIZE)
1311 return false;
1312 }
1313
1314 /* Make sure the .debug section was created to be the correct size.
1315 We should create it ourselves on the fly, but we don't because
1316 BFD won't let us write to any section until we know how large all
1317 the sections are. We could still do it by making another pass
1318 over the symbols. FIXME. */
1319 BFD_ASSERT (debug_string_size == 0
1320 || (debug_string_section != (asection *) NULL
1321 && (BFD_ALIGN (debug_string_size,
1322 1 << debug_string_section->alignment_power)
1323 == bfd_section_size (abfd, debug_string_section))));
1324
1325 return true;
1326}
1327
1328boolean
1329coff_write_linenumbers (abfd)
1330 bfd *abfd;
1331{
1332 asection *s;
1333 bfd_size_type linesz;
1334 PTR buff;
1335
1336 linesz = bfd_coff_linesz (abfd);
1337 buff = bfd_alloc (abfd, linesz);
1338 if (!buff)
1339 return false;
1340 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
1341 {
1342 if (s->lineno_count)
1343 {
1344 asymbol **q = abfd->outsymbols;
1345 if (bfd_seek (abfd, s->line_filepos, SEEK_SET) != 0)
1346 return false;
1347 /* Find all the linenumbers in this section */
1348 while (*q)
1349 {
1350 asymbol *p = *q;
1351 if (p->section->output_section == s)
1352 {
1353 alent *l =
1354 BFD_SEND (bfd_asymbol_bfd (p), _get_lineno,
1355 (bfd_asymbol_bfd (p), p));
1356 if (l)
1357 {
1358 /* Found a linenumber entry, output */
1359 struct internal_lineno out;
1360 memset ((PTR) & out, 0, sizeof (out));
1361 out.l_lnno = 0;
1362 out.l_addr.l_symndx = l->u.offset;
1363 bfd_coff_swap_lineno_out (abfd, &out, buff);
1364 if (bfd_write (buff, 1, linesz, abfd) != linesz)
1365 return false;
1366 l++;
1367 while (l->line_number)
1368 {
1369 out.l_lnno = l->line_number;
1370 out.l_addr.l_symndx = l->u.offset;
1371 bfd_coff_swap_lineno_out (abfd, &out, buff);
1372 if (bfd_write (buff, 1, linesz, abfd) != linesz)
1373 return false;
1374 l++;
1375 }
1376 }
1377 }
1378 q++;
1379 }
1380 }
1381 }
1382 bfd_release (abfd, buff);
1383 return true;
1384}
1385
252b5132
RH
1386alent *
1387coff_get_lineno (ignore_abfd, symbol)
7442e600 1388 bfd *ignore_abfd ATTRIBUTE_UNUSED;
252b5132
RH
1389 asymbol *symbol;
1390{
1391 return coffsymbol (symbol)->lineno;
1392}
1393
1394#if 0
1395
1396/* This is only called from coff_add_missing_symbols, which has been
1397 disabled. */
1398
1399asymbol *
1400coff_section_symbol (abfd, name)
1401 bfd *abfd;
1402 char *name;
1403{
1404 asection *sec = bfd_make_section_old_way (abfd, name);
1405 asymbol *sym;
1406 combined_entry_type *csym;
1407
1408 sym = sec->symbol;
1409 csym = coff_symbol_from (abfd, sym)->native;
1410 /* Make sure back-end COFF stuff is there. */
1411 if (csym == 0)
1412 {
1413 struct foo
1414 {
1415 coff_symbol_type sym;
1416 /* @@FIXME This shouldn't use a fixed size!! */
1417 combined_entry_type e[10];
1418 };
1419 struct foo *f;
1420 f = (struct foo *) bfd_alloc (abfd, sizeof (*f));
1421 if (!f)
1422 {
1423 bfd_set_error (bfd_error_no_error);
1424 return NULL;
1425 }
1426 memset ((char *) f, 0, sizeof (*f));
1427 coff_symbol_from (abfd, sym)->native = csym = f->e;
1428 }
1429 csym[0].u.syment.n_sclass = C_STAT;
1430 csym[0].u.syment.n_numaux = 1;
1431/* SF_SET_STATICS (sym); @@ ??? */
1432 csym[1].u.auxent.x_scn.x_scnlen = sec->_raw_size;
1433 csym[1].u.auxent.x_scn.x_nreloc = sec->reloc_count;
1434 csym[1].u.auxent.x_scn.x_nlinno = sec->lineno_count;
1435
1436 if (sec->output_section == NULL)
1437 {
1438 sec->output_section = sec;
1439 sec->output_offset = 0;
1440 }
1441
1442 return sym;
1443}
1444
1445#endif /* 0 */
1446
1447/* This function transforms the offsets into the symbol table into
1448 pointers to syments. */
1449
1450static void
1451coff_pointerize_aux (abfd, table_base, symbol, indaux, auxent)
1452 bfd *abfd;
1453 combined_entry_type *table_base;
1454 combined_entry_type *symbol;
1455 unsigned int indaux;
1456 combined_entry_type *auxent;
1457{
1458 unsigned int type = symbol->u.syment.n_type;
1459 unsigned int class = symbol->u.syment.n_sclass;
1460
1461 if (coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook)
1462 {
1463 if ((*coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook)
1464 (abfd, table_base, symbol, indaux, auxent))
1465 return;
1466 }
1467
1468 /* Don't bother if this is a file or a section */
1469 if (class == C_STAT && type == T_NULL)
1470 return;
1471 if (class == C_FILE)
1472 return;
1473
1474 /* Otherwise patch up */
1475#define N_TMASK coff_data (abfd)->local_n_tmask
1476#define N_BTSHFT coff_data (abfd)->local_n_btshft
1477 if ((ISFCN (type) || ISTAG (class) || class == C_BLOCK || class == C_FCN)
1478 && auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l > 0)
1479 {
1480 auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p =
1481 table_base + auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
1482 auxent->fix_end = 1;
1483 }
1484 /* A negative tagndx is meaningless, but the SCO 3.2v4 cc can
1485 generate one, so we must be careful to ignore it. */
1486 if (auxent->u.auxent.x_sym.x_tagndx.l > 0)
1487 {
1488 auxent->u.auxent.x_sym.x_tagndx.p =
1489 table_base + auxent->u.auxent.x_sym.x_tagndx.l;
1490 auxent->fix_tag = 1;
1491 }
1492}
1493
1494/* Allocate space for the ".debug" section, and read it.
1495 We did not read the debug section until now, because
244148ad 1496 we didn't want to go to the trouble until someone needed it. */
252b5132
RH
1497
1498static char *
1499build_debug_section (abfd)
1500 bfd *abfd;
1501{
1502 char *debug_section;
1503 long position;
1504
1505 asection *sect = bfd_get_section_by_name (abfd, ".debug");
1506
1507 if (!sect)
1508 {
1509 bfd_set_error (bfd_error_no_debug_section);
1510 return NULL;
1511 }
1512
1513 debug_section = (PTR) bfd_alloc (abfd,
1514 bfd_get_section_size_before_reloc (sect));
1515 if (debug_section == NULL)
1516 return NULL;
1517
244148ad 1518 /* Seek to the beginning of the `.debug' section and read it.
252b5132
RH
1519 Save the current position first; it is needed by our caller.
1520 Then read debug section and reset the file pointer. */
1521
1522 position = bfd_tell (abfd);
1523 if (bfd_seek (abfd, sect->filepos, SEEK_SET) != 0
1524 || (bfd_read (debug_section,
1525 bfd_get_section_size_before_reloc (sect), 1, abfd)
1526 != bfd_get_section_size_before_reloc (sect))
1527 || bfd_seek (abfd, position, SEEK_SET) != 0)
1528 return NULL;
1529 return debug_section;
1530}
1531
252b5132
RH
1532/* Return a pointer to a malloc'd copy of 'name'. 'name' may not be
1533 \0-terminated, but will not exceed 'maxlen' characters. The copy *will*
1534 be \0-terminated. */
1535static char *
1536copy_name (abfd, name, maxlen)
1537 bfd *abfd;
1538 char *name;
1539 int maxlen;
1540{
1541 int len;
1542 char *newname;
1543
1544 for (len = 0; len < maxlen; ++len)
1545 {
1546 if (name[len] == '\0')
1547 {
1548 break;
1549 }
1550 }
1551
1552 if ((newname = (PTR) bfd_alloc (abfd, len + 1)) == NULL)
1553 return (NULL);
1554 strncpy (newname, name, len);
1555 newname[len] = '\0';
1556 return newname;
1557}
1558
1559/* Read in the external symbols. */
1560
1561boolean
1562_bfd_coff_get_external_symbols (abfd)
1563 bfd *abfd;
1564{
1565 bfd_size_type symesz;
1566 size_t size;
1567 PTR syms;
1568
1569 if (obj_coff_external_syms (abfd) != NULL)
1570 return true;
1571
1572 symesz = bfd_coff_symesz (abfd);
1573
1574 size = obj_raw_syment_count (abfd) * symesz;
1575
1576 syms = (PTR) bfd_malloc (size);
1577 if (syms == NULL && size != 0)
1578 return false;
1579
1580 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
1581 || bfd_read (syms, size, 1, abfd) != size)
1582 {
1583 if (syms != NULL)
1584 free (syms);
1585 return false;
1586 }
1587
1588 obj_coff_external_syms (abfd) = syms;
1589
1590 return true;
1591}
1592
1593/* Read in the external strings. The strings are not loaded until
1594 they are needed. This is because we have no simple way of
1595 detecting a missing string table in an archive. */
1596
1597const char *
1598_bfd_coff_read_string_table (abfd)
1599 bfd *abfd;
1600{
1601 char extstrsize[STRING_SIZE_SIZE];
1602 size_t strsize;
1603 char *strings;
1604
1605 if (obj_coff_strings (abfd) != NULL)
1606 return obj_coff_strings (abfd);
1607
1608 if (obj_sym_filepos (abfd) == 0)
1609 {
1610 bfd_set_error (bfd_error_no_symbols);
1611 return NULL;
1612 }
1613
1614 if (bfd_seek (abfd,
1615 (obj_sym_filepos (abfd)
1616 + obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd)),
1617 SEEK_SET) != 0)
1618 return NULL;
244148ad 1619
252b5132
RH
1620 if (bfd_read (extstrsize, sizeof extstrsize, 1, abfd) != sizeof extstrsize)
1621 {
1622 if (bfd_get_error () != bfd_error_file_truncated)
1623 return NULL;
1624
1625 /* There is no string table. */
1626 strsize = STRING_SIZE_SIZE;
1627 }
1628 else
1629 {
1630#if STRING_SIZE_SIZE == 4
1631 strsize = bfd_h_get_32 (abfd, (bfd_byte *) extstrsize);
1632#else
1633 #error Change bfd_h_get_32
1634#endif
1635 }
1636
1637 if (strsize < STRING_SIZE_SIZE)
1638 {
1639 (*_bfd_error_handler)
1640 (_("%s: bad string table size %lu"), bfd_get_filename (abfd),
1641 (unsigned long) strsize);
1642 bfd_set_error (bfd_error_bad_value);
1643 return NULL;
1644 }
1645
1646 strings = (char *) bfd_malloc (strsize);
1647 if (strings == NULL)
1648 return NULL;
1649
1650 if (bfd_read (strings + STRING_SIZE_SIZE,
1651 strsize - STRING_SIZE_SIZE, 1, abfd)
1652 != strsize - STRING_SIZE_SIZE)
1653 {
1654 free (strings);
1655 return NULL;
1656 }
1657
1658 obj_coff_strings (abfd) = strings;
1659
1660 return strings;
1661}
1662
1663/* Free up the external symbols and strings read from a COFF file. */
1664
1665boolean
1666_bfd_coff_free_symbols (abfd)
1667 bfd *abfd;
1668{
1669 if (obj_coff_external_syms (abfd) != NULL
1670 && ! obj_coff_keep_syms (abfd))
1671 {
1672 free (obj_coff_external_syms (abfd));
1673 obj_coff_external_syms (abfd) = NULL;
1674 }
1675 if (obj_coff_strings (abfd) != NULL
1676 && ! obj_coff_keep_strings (abfd))
1677 {
1678 free (obj_coff_strings (abfd));
1679 obj_coff_strings (abfd) = NULL;
1680 }
1681 return true;
1682}
1683
1684/* Read a symbol table into freshly bfd_allocated memory, swap it, and
1685 knit the symbol names into a normalized form. By normalized here I
1686 mean that all symbols have an n_offset pointer that points to a null-
1687 terminated string. */
1688
1689combined_entry_type *
1690coff_get_normalized_symtab (abfd)
1691 bfd *abfd;
1692{
1693 combined_entry_type *internal;
1694 combined_entry_type *internal_ptr;
1695 combined_entry_type *symbol_ptr;
1696 combined_entry_type *internal_end;
1697 bfd_size_type symesz;
1698 char *raw_src;
1699 char *raw_end;
1700 const char *string_table = NULL;
1701 char *debug_section = NULL;
1702 unsigned long size;
1703
1704 if (obj_raw_syments (abfd) != NULL)
1705 return obj_raw_syments (abfd);
1706
1707 size = obj_raw_syment_count (abfd) * sizeof (combined_entry_type);
1708 internal = (combined_entry_type *) bfd_zalloc (abfd, size);
1709 if (internal == NULL && size != 0)
1710 return NULL;
1711 internal_end = internal + obj_raw_syment_count (abfd);
1712
1713 if (! _bfd_coff_get_external_symbols (abfd))
1714 return NULL;
1715
1716 raw_src = (char *) obj_coff_external_syms (abfd);
1717
1718 /* mark the end of the symbols */
1719 symesz = bfd_coff_symesz (abfd);
1720 raw_end = (char *) raw_src + obj_raw_syment_count (abfd) * symesz;
1721
1722 /* FIXME SOMEDAY. A string table size of zero is very weird, but
1723 probably possible. If one shows up, it will probably kill us. */
1724
1725 /* Swap all the raw entries */
1726 for (internal_ptr = internal;
1727 raw_src < raw_end;
1728 raw_src += symesz, internal_ptr++)
1729 {
1730
1731 unsigned int i;
1732 bfd_coff_swap_sym_in (abfd, (PTR) raw_src,
1733 (PTR) & internal_ptr->u.syment);
1734 symbol_ptr = internal_ptr;
1735
1736 for (i = 0;
1737 i < symbol_ptr->u.syment.n_numaux;
1738 i++)
1739 {
1740 internal_ptr++;
1741 raw_src += symesz;
1742 bfd_coff_swap_aux_in (abfd, (PTR) raw_src,
1743 symbol_ptr->u.syment.n_type,
1744 symbol_ptr->u.syment.n_sclass,
1745 i, symbol_ptr->u.syment.n_numaux,
1746 &(internal_ptr->u.auxent));
1747 coff_pointerize_aux (abfd, internal, symbol_ptr, i,
1748 internal_ptr);
1749 }
1750 }
1751
1752 /* Free the raw symbols, but not the strings (if we have them). */
1753 obj_coff_keep_strings (abfd) = true;
1754 if (! _bfd_coff_free_symbols (abfd))
1755 return NULL;
1756
1757 for (internal_ptr = internal; internal_ptr < internal_end;
1758 internal_ptr++)
1759 {
1760 if (internal_ptr->u.syment.n_sclass == C_FILE
1761 && internal_ptr->u.syment.n_numaux > 0)
1762 {
1763 /* make a file symbol point to the name in the auxent, since
1764 the text ".file" is redundant */
1765 if ((internal_ptr + 1)->u.auxent.x_file.x_n.x_zeroes == 0)
1766 {
1767 /* the filename is a long one, point into the string table */
1768 if (string_table == NULL)
1769 {
1770 string_table = _bfd_coff_read_string_table (abfd);
1771 if (string_table == NULL)
1772 return NULL;
1773 }
1774
1775 internal_ptr->u.syment._n._n_n._n_offset =
1776 ((long)
1777 (string_table
1778 + (internal_ptr + 1)->u.auxent.x_file.x_n.x_offset));
1779 }
1780 else
1781 {
7bb9db4d
ILT
1782 /* Ordinary short filename, put into memory anyway. The
1783 Microsoft PE tools sometimes store a filename in
1784 multiple AUX entries. */
ec0ef80e
DD
1785 if (internal_ptr->u.syment.n_numaux > 1
1786 && coff_data (abfd)->pe)
1787 {
7bb9db4d
ILT
1788 internal_ptr->u.syment._n._n_n._n_offset =
1789 ((long)
1790 copy_name (abfd,
1791 (internal_ptr + 1)->u.auxent.x_file.x_fname,
1792 internal_ptr->u.syment.n_numaux * symesz));
ec0ef80e
DD
1793 }
1794 else
1795 {
7bb9db4d
ILT
1796 internal_ptr->u.syment._n._n_n._n_offset =
1797 ((long)
1798 copy_name (abfd,
1799 (internal_ptr + 1)->u.auxent.x_file.x_fname,
692b7d62 1800 bfd_coff_filnmlen (abfd)));
ec0ef80e 1801 }
252b5132
RH
1802 }
1803 }
1804 else
1805 {
1806 if (internal_ptr->u.syment._n._n_n._n_zeroes != 0)
1807 {
1808 /* This is a "short" name. Make it long. */
1809 unsigned long i = 0;
1810 char *newstring = NULL;
1811
1812 /* find the length of this string without walking into memory
1813 that isn't ours. */
1814 for (i = 0; i < 8; ++i)
1815 {
1816 if (internal_ptr->u.syment._n._n_name[i] == '\0')
1817 {
1818 break;
1819 } /* if end of string */
244148ad 1820 } /* possible lengths of this string. */
252b5132
RH
1821
1822 if ((newstring = (PTR) bfd_alloc (abfd, ++i)) == NULL)
1823 return (NULL);
1824 memset (newstring, 0, i);
1825 strncpy (newstring, internal_ptr->u.syment._n._n_name, i - 1);
1826 internal_ptr->u.syment._n._n_n._n_offset = (long int) newstring;
1827 internal_ptr->u.syment._n._n_n._n_zeroes = 0;
1828 }
1829 else if (internal_ptr->u.syment._n._n_n._n_offset == 0)
1830 internal_ptr->u.syment._n._n_n._n_offset = (long int) "";
1831 else if (!bfd_coff_symname_in_debug (abfd, &internal_ptr->u.syment))
1832 {
1833 /* Long name already. Point symbol at the string in the
1834 table. */
1835 if (string_table == NULL)
1836 {
1837 string_table = _bfd_coff_read_string_table (abfd);
1838 if (string_table == NULL)
1839 return NULL;
1840 }
1841 internal_ptr->u.syment._n._n_n._n_offset =
1842 ((long int)
1843 (string_table
1844 + internal_ptr->u.syment._n._n_n._n_offset));
1845 }
1846 else
1847 {
1848 /* Long name in debug section. Very similar. */
1849 if (debug_section == NULL)
1850 debug_section = build_debug_section (abfd);
1851 internal_ptr->u.syment._n._n_n._n_offset = (long int)
1852 (debug_section + internal_ptr->u.syment._n._n_n._n_offset);
1853 }
1854 }
1855 internal_ptr += internal_ptr->u.syment.n_numaux;
1856 }
1857
1858 obj_raw_syments (abfd) = internal;
1859 BFD_ASSERT (obj_raw_syment_count (abfd)
1860 == (unsigned int) (internal_ptr - internal));
1861
1862 return (internal);
1863} /* coff_get_normalized_symtab() */
1864
1865long
1866coff_get_reloc_upper_bound (abfd, asect)
1867 bfd *abfd;
1868 sec_ptr asect;
1869{
1870 if (bfd_get_format (abfd) != bfd_object)
1871 {
1872 bfd_set_error (bfd_error_invalid_operation);
1873 return -1;
1874 }
1875 return (asect->reloc_count + 1) * sizeof (arelent *);
1876}
1877
1878asymbol *
1879coff_make_empty_symbol (abfd)
1880 bfd *abfd;
1881{
1882 coff_symbol_type *new = (coff_symbol_type *) bfd_alloc (abfd, sizeof (coff_symbol_type));
1883 if (new == NULL)
1884 return (NULL);
1885 memset (new, 0, sizeof *new);
1886 new->symbol.section = 0;
1887 new->native = 0;
1888 new->lineno = (alent *) NULL;
1889 new->done_lineno = false;
1890 new->symbol.the_bfd = abfd;
1891 return &new->symbol;
1892}
1893
1894/* Make a debugging symbol. */
1895
1896asymbol *
1897coff_bfd_make_debug_symbol (abfd, ptr, sz)
1898 bfd *abfd;
7442e600
ILT
1899 PTR ptr ATTRIBUTE_UNUSED;
1900 unsigned long sz ATTRIBUTE_UNUSED;
252b5132
RH
1901{
1902 coff_symbol_type *new = (coff_symbol_type *) bfd_alloc (abfd, sizeof (coff_symbol_type));
1903 if (new == NULL)
1904 return (NULL);
1905 /* @@ The 10 is a guess at a plausible maximum number of aux entries
1906 (but shouldn't be a constant). */
1907 new->native = (combined_entry_type *) bfd_zalloc (abfd, sizeof (combined_entry_type) * 10);
1908 if (!new->native)
1909 return (NULL);
1910 new->symbol.section = bfd_abs_section_ptr;
1911 new->symbol.flags = BSF_DEBUGGING;
1912 new->lineno = (alent *) NULL;
1913 new->done_lineno = false;
1914 new->symbol.the_bfd = abfd;
1915 return &new->symbol;
1916}
1917
252b5132
RH
1918void
1919coff_get_symbol_info (abfd, symbol, ret)
1920 bfd *abfd;
1921 asymbol *symbol;
1922 symbol_info *ret;
1923{
1924 bfd_symbol_info (symbol, ret);
1925 if (coffsymbol (symbol)->native != NULL
1926 && coffsymbol (symbol)->native->fix_value)
1927 {
beb1bf64
TR
1928 ret->value = coffsymbol (symbol)->native->u.syment.n_value -
1929 (unsigned long) obj_raw_syments (abfd);
252b5132
RH
1930 }
1931}
1932
1933/* Return the COFF syment for a symbol. */
1934
1935boolean
1936bfd_coff_get_syment (abfd, symbol, psyment)
1937 bfd *abfd;
1938 asymbol *symbol;
1939 struct internal_syment *psyment;
1940{
1941 coff_symbol_type *csym;
1942
1943 csym = coff_symbol_from (abfd, symbol);
1944 if (csym == NULL || csym->native == NULL)
1945 {
1946 bfd_set_error (bfd_error_invalid_operation);
1947 return false;
1948 }
1949
1950 *psyment = csym->native->u.syment;
1951
1952 if (csym->native->fix_value)
beb1bf64
TR
1953 psyment->n_value = psyment->n_value -
1954 (unsigned long) obj_raw_syments (abfd);
252b5132
RH
1955
1956 /* FIXME: We should handle fix_line here. */
1957
1958 return true;
1959}
1960
1961/* Return the COFF auxent for a symbol. */
1962
1963boolean
1964bfd_coff_get_auxent (abfd, symbol, indx, pauxent)
1965 bfd *abfd;
1966 asymbol *symbol;
1967 int indx;
1968 union internal_auxent *pauxent;
1969{
1970 coff_symbol_type *csym;
1971 combined_entry_type *ent;
1972
1973 csym = coff_symbol_from (abfd, symbol);
1974
1975 if (csym == NULL
1976 || csym->native == NULL
1977 || indx >= csym->native->u.syment.n_numaux)
1978 {
1979 bfd_set_error (bfd_error_invalid_operation);
1980 return false;
1981 }
1982
1983 ent = csym->native + indx + 1;
1984
1985 *pauxent = ent->u.auxent;
1986
1987 if (ent->fix_tag)
1988 pauxent->x_sym.x_tagndx.l =
1989 ((combined_entry_type *) pauxent->x_sym.x_tagndx.p
1990 - obj_raw_syments (abfd));
1991
1992 if (ent->fix_end)
1993 pauxent->x_sym.x_fcnary.x_fcn.x_endndx.l =
1994 ((combined_entry_type *) pauxent->x_sym.x_fcnary.x_fcn.x_endndx.p
1995 - obj_raw_syments (abfd));
1996
1997 if (ent->fix_scnlen)
1998 pauxent->x_csect.x_scnlen.l =
1999 ((combined_entry_type *) pauxent->x_csect.x_scnlen.p
2000 - obj_raw_syments (abfd));
2001
2002 return true;
2003}
2004
2005/* Print out information about COFF symbol. */
2006
2007void
2008coff_print_symbol (abfd, filep, symbol, how)
2009 bfd *abfd;
2010 PTR filep;
2011 asymbol *symbol;
2012 bfd_print_symbol_type how;
2013{
2014 FILE *file = (FILE *) filep;
2015
2016 switch (how)
2017 {
2018 case bfd_print_symbol_name:
2019 fprintf (file, "%s", symbol->name);
2020 break;
2021
2022 case bfd_print_symbol_more:
2023 fprintf (file, "coff %s %s",
2024 coffsymbol (symbol)->native ? "n" : "g",
2025 coffsymbol (symbol)->lineno ? "l" : " ");
2026 break;
2027
2028 case bfd_print_symbol_all:
2029 if (coffsymbol (symbol)->native)
2030 {
beb1bf64 2031 bfd_vma val;
252b5132
RH
2032 unsigned int aux;
2033 combined_entry_type *combined = coffsymbol (symbol)->native;
2034 combined_entry_type *root = obj_raw_syments (abfd);
2035 struct lineno_cache_entry *l = coffsymbol (symbol)->lineno;
2036
2037 fprintf (file, "[%3ld]", (long) (combined - root));
2038
2039 if (! combined->fix_value)
beb1bf64 2040 val = (bfd_vma) combined->u.syment.n_value;
252b5132 2041 else
beb1bf64 2042 val = combined->u.syment.n_value - (unsigned long) root;
252b5132 2043
beb1bf64 2044#ifndef XCOFF64
252b5132
RH
2045 fprintf (file,
2046 "(sec %2d)(fl 0x%02x)(ty %3x)(scl %3d) (nx %d) 0x%08lx %s",
2047 combined->u.syment.n_scnum,
2048 combined->u.syment.n_flags,
2049 combined->u.syment.n_type,
2050 combined->u.syment.n_sclass,
2051 combined->u.syment.n_numaux,
beb1bf64
TR
2052 (unsigned long) val,
2053 symbol->name);
2054#else
2055 /* Print out the wide, 64 bit, symbol value */
2056 fprintf (file,
2057 "(sec %2d)(fl 0x%02x)(ty %3x)(scl %3d) (nx %d) 0x%016llx %s",
2058 combined->u.syment.n_scnum,
2059 combined->u.syment.n_flags,
2060 combined->u.syment.n_type,
2061 combined->u.syment.n_sclass,
2062 combined->u.syment.n_numaux,
252b5132
RH
2063 val,
2064 symbol->name);
beb1bf64 2065#endif
252b5132
RH
2066
2067 for (aux = 0; aux < combined->u.syment.n_numaux; aux++)
2068 {
2069 combined_entry_type *auxp = combined + aux + 1;
2070 long tagndx;
2071
2072 if (auxp->fix_tag)
2073 tagndx = auxp->u.auxent.x_sym.x_tagndx.p - root;
2074 else
2075 tagndx = auxp->u.auxent.x_sym.x_tagndx.l;
2076
2077 fprintf (file, "\n");
2078
2079 if (bfd_coff_print_aux (abfd, file, root, combined, auxp, aux))
2080 continue;
2081
2082 switch (combined->u.syment.n_sclass)
2083 {
2084 case C_FILE:
2085 fprintf (file, "File ");
2086 break;
2087
2088 case C_STAT:
2089 if (combined->u.syment.n_type == T_NULL)
2090 /* probably a section symbol? */
2091 {
2092 fprintf (file, "AUX scnlen 0x%lx nreloc %d nlnno %d",
2093 (long) auxp->u.auxent.x_scn.x_scnlen,
2094 auxp->u.auxent.x_scn.x_nreloc,
2095 auxp->u.auxent.x_scn.x_nlinno);
2096 if (auxp->u.auxent.x_scn.x_checksum != 0
2097 || auxp->u.auxent.x_scn.x_associated != 0
2098 || auxp->u.auxent.x_scn.x_comdat != 0)
2099 fprintf (file, " checksum 0x%lx assoc %d comdat %d",
2100 auxp->u.auxent.x_scn.x_checksum,
2101 auxp->u.auxent.x_scn.x_associated,
2102 auxp->u.auxent.x_scn.x_comdat);
2103 break;
2104 }
312191a6
ILT
2105 /* else fall through */
2106 case C_EXT:
2107 if (ISFCN (combined->u.syment.n_type))
2108 {
cea4409c
AM
2109 long next, llnos;
2110
2111 if (auxp->fix_end)
2112 next = (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p
2113 - root);
2114 else
2115 next = auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
2116 llnos = auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_lnnoptr;
312191a6
ILT
2117 fprintf (file,
2118 _("AUX tagndx %ld ttlsiz 0x%lx lnnos %ld next %ld"),
cea4409c
AM
2119 tagndx, auxp->u.auxent.x_sym.x_misc.x_fsize,
2120 llnos, next);
312191a6
ILT
2121 break;
2122 }
252b5132 2123 /* else fall through */
252b5132
RH
2124 default:
2125 fprintf (file, "AUX lnno %d size 0x%x tagndx %ld",
2126 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_lnno,
2127 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_size,
2128 tagndx);
2129 if (auxp->fix_end)
2130 fprintf (file, " endndx %ld",
2131 ((long)
2132 (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p
2133 - root)));
2134 break;
2135 }
2136 }
2137
2138 if (l)
2139 {
2140 fprintf (file, "\n%s :", l->u.sym->name);
2141 l++;
2142 while (l->line_number)
2143 {
2144 fprintf (file, "\n%4d : 0x%lx",
2145 l->line_number,
2146 ((unsigned long)
2147 (l->u.offset + symbol->section->vma)));
2148 l++;
2149 }
2150 }
2151 }
2152 else
2153 {
60b89a18 2154 bfd_print_symbol_vandf (abfd, (PTR) file, symbol);
252b5132
RH
2155 fprintf (file, " %-5s %s %s %s",
2156 symbol->section->name,
2157 coffsymbol (symbol)->native ? "n" : "g",
2158 coffsymbol (symbol)->lineno ? "l" : " ",
2159 symbol->name);
2160 }
2161 }
2162}
2163
2164/* Return whether a symbol name implies a local symbol. In COFF,
2165 local symbols generally start with ``.L''. Most targets use this
2166 function for the is_local_label_name entry point, but some may
2167 override it. */
2168
2169boolean
2170_bfd_coff_is_local_label_name (abfd, name)
7442e600 2171 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
2172 const char *name;
2173{
2174 return name[0] == '.' && name[1] == 'L';
2175}
2176
9a968f43
NC
2177/* Provided a BFD, a section and an offset (in bytes, not octets) into the
2178 section, calculate and return the name of the source file and the line
2179 nearest to the wanted location. */
435b1e90 2180
252b5132
RH
2181boolean
2182coff_find_nearest_line (abfd, section, symbols, offset, filename_ptr,
2183 functionname_ptr, line_ptr)
2184 bfd *abfd;
2185 asection *section;
2186 asymbol **symbols;
2187 bfd_vma offset;
2188 CONST char **filename_ptr;
2189 CONST char **functionname_ptr;
2190 unsigned int *line_ptr;
2191{
2192 boolean found;
2193 unsigned int i;
2194 unsigned int line_base;
2195 coff_data_type *cof = coff_data (abfd);
2196 /* Run through the raw syments if available */
2197 combined_entry_type *p;
2198 combined_entry_type *pend;
2199 alent *l;
2200 struct coff_section_tdata *sec_data;
2201
2202 /* Before looking through the symbol table, try to use a .stab
2203 section to find the information. */
2204 if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
2205 &found, filename_ptr,
2206 functionname_ptr, line_ptr,
51db3708 2207 &coff_data(abfd)->line_info))
252b5132 2208 return false;
51db3708 2209
4ca29a6a
NC
2210 if (found)
2211 return true;
2212
51db3708
NC
2213 /* Also try examining DWARF2 debugging information. */
2214 if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
2215 filename_ptr, functionname_ptr,
2216 line_ptr, 0,
2217 &coff_data(abfd)->dwarf2_find_line_info))
2218 return true;
2219
252b5132
RH
2220 *filename_ptr = 0;
2221 *functionname_ptr = 0;
2222 *line_ptr = 0;
2223
2224 /* Don't try and find line numbers in a non coff file */
9bd09e22 2225 if (!bfd_family_coff (abfd))
252b5132
RH
2226 return false;
2227
2228 if (cof == NULL)
2229 return false;
2230
2231 /* Find the first C_FILE symbol. */
2232 p = cof->raw_syments;
2233 if (!p)
2234 return false;
2235
2236 pend = p + cof->raw_syment_count;
2237 while (p < pend)
2238 {
2239 if (p->u.syment.n_sclass == C_FILE)
2240 break;
2241 p += 1 + p->u.syment.n_numaux;
2242 }
2243
2244 if (p < pend)
2245 {
2246 bfd_vma sec_vma;
2247 bfd_vma maxdiff;
2248
2249 /* Look through the C_FILE symbols to find the best one. */
2250 sec_vma = bfd_get_section_vma (abfd, section);
2251 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
2252 maxdiff = (bfd_vma) 0 - (bfd_vma) 1;
2253 while (1)
2254 {
2255 combined_entry_type *p2;
2256
2257 for (p2 = p + 1 + p->u.syment.n_numaux;
2258 p2 < pend;
2259 p2 += 1 + p2->u.syment.n_numaux)
2260 {
2261 if (p2->u.syment.n_scnum > 0
2262 && (section
2263 == coff_section_from_bfd_index (abfd,
2264 p2->u.syment.n_scnum)))
2265 break;
2266 if (p2->u.syment.n_sclass == C_FILE)
2267 {
2268 p2 = pend;
2269 break;
2270 }
2271 }
2272
798c1fb8
ILT
2273 /* We use <= MAXDIFF here so that if we get a zero length
2274 file, we actually use the next file entry. */
252b5132
RH
2275 if (p2 < pend
2276 && offset + sec_vma >= (bfd_vma) p2->u.syment.n_value
798c1fb8 2277 && offset + sec_vma - (bfd_vma) p2->u.syment.n_value <= maxdiff)
252b5132
RH
2278 {
2279 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
2280 maxdiff = offset + sec_vma - p2->u.syment.n_value;
2281 }
2282
2283 /* Avoid endless loops on erroneous files by ensuring that
2284 we always move forward in the file. */
cea4409c 2285 if (p >= cof->raw_syments + p->u.syment.n_value)
252b5132
RH
2286 break;
2287
2288 p = cof->raw_syments + p->u.syment.n_value;
2289 if (p > pend || p->u.syment.n_sclass != C_FILE)
2290 break;
2291 }
2292 }
2293
2294 /* Now wander though the raw linenumbers of the section */
2295 /* If we have been called on this section before, and the offset we
2296 want is further down then we can prime the lookup loop. */
2297 sec_data = coff_section_data (abfd, section);
2298 if (sec_data != NULL
2299 && sec_data->i > 0
2300 && offset >= sec_data->offset)
2301 {
2302 i = sec_data->i;
2303 *functionname_ptr = sec_data->function;
2304 line_base = sec_data->line_base;
2305 }
2306 else
2307 {
2308 i = 0;
2309 line_base = 0;
2310 }
2311
2312 if (section->lineno != NULL)
2313 {
798c1fb8
ILT
2314 bfd_vma last_value = 0;
2315
252b5132
RH
2316 l = &section->lineno[i];
2317
2318 for (; i < section->lineno_count; i++)
2319 {
2320 if (l->line_number == 0)
2321 {
2322 /* Get the symbol this line number points at */
2323 coff_symbol_type *coff = (coff_symbol_type *) (l->u.sym);
2324 if (coff->symbol.value > offset)
2325 break;
2326 *functionname_ptr = coff->symbol.name;
798c1fb8 2327 last_value = coff->symbol.value;
252b5132
RH
2328 if (coff->native)
2329 {
2330 combined_entry_type *s = coff->native;
2331 s = s + 1 + s->u.syment.n_numaux;
2332
2333 /* In XCOFF a debugging symbol can follow the
2334 function symbol. */
2335 if (s->u.syment.n_scnum == N_DEBUG)
2336 s = s + 1 + s->u.syment.n_numaux;
2337
2338 /* S should now point to the .bf of the function. */
2339 if (s->u.syment.n_numaux)
2340 {
2341 /* The linenumber is stored in the auxent. */
2342 union internal_auxent *a = &((s + 1)->u.auxent);
2343 line_base = a->x_sym.x_misc.x_lnsz.x_lnno;
2344 *line_ptr = line_base;
2345 }
2346 }
2347 }
2348 else
2349 {
2350 if (l->u.offset > offset)
2351 break;
2352 *line_ptr = l->line_number + line_base - 1;
2353 }
2354 l++;
2355 }
798c1fb8
ILT
2356
2357 /* If we fell off the end of the loop, then assume that this
2358 symbol has no line number info. Otherwise, symbols with no
2359 line number info get reported with the line number of the
2360 last line of the last symbol which does have line number
2361 info. We use 0x100 as a slop to account for cases where the
2362 last line has executable code. */
2363 if (i >= section->lineno_count
2364 && last_value != 0
2365 && offset - last_value > 0x100)
2366 {
2367 *functionname_ptr = NULL;
2368 *line_ptr = 0;
2369 }
252b5132
RH
2370 }
2371
2372 /* Cache the results for the next call. */
2373 if (sec_data == NULL && section->owner == abfd)
2374 {
2375 section->used_by_bfd =
2376 ((PTR) bfd_zalloc (abfd,
2377 sizeof (struct coff_section_tdata)));
2378 sec_data = (struct coff_section_tdata *) section->used_by_bfd;
2379 }
2380 if (sec_data != NULL)
2381 {
2382 sec_data->offset = offset;
2383 sec_data->i = i;
2384 sec_data->function = *functionname_ptr;
2385 sec_data->line_base = line_base;
2386 }
2387
2388 return true;
2389}
2390
2391int
2392coff_sizeof_headers (abfd, reloc)
2393 bfd *abfd;
2394 boolean reloc;
2395{
2396 size_t size;
2397
2398 if (reloc == false)
2399 {
2400 size = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
2401 }
2402 else
2403 {
2404 size = bfd_coff_filhsz (abfd);
2405 }
2406
2407 size += abfd->section_count * bfd_coff_scnhsz (abfd);
2408 return size;
2409}
2410
2411/* Change the class of a coff symbol held by BFD. */
2412boolean
2413bfd_coff_set_symbol_class (abfd, symbol, class)
2414 bfd * abfd;
2415 asymbol * symbol;
2416 unsigned int class;
2417{
2418 coff_symbol_type * csym;
2419
2420 csym = coff_symbol_from (abfd, symbol);
2421 if (csym == NULL)
2422 {
2423 bfd_set_error (bfd_error_invalid_operation);
2424 return false;
2425 }
2426 else if (csym->native == NULL)
2427 {
2428 /* This is an alien symbol which no native coff backend data.
2429 We cheat here by creating a fake native entry for it and
2430 then filling in the class. This code is based on that in
2431 coff_write_alien_symbol(). */
244148ad 2432
252b5132
RH
2433 combined_entry_type * native;
2434
2435 native = (combined_entry_type *) bfd_alloc (abfd, sizeof (* native));
2436 if (native == NULL)
2437 return false;
2438
2439 memset (native, 0, sizeof (* native));
244148ad 2440
252b5132
RH
2441 native->u.syment.n_type = T_NULL;
2442 native->u.syment.n_sclass = class;
244148ad 2443
252b5132
RH
2444 if (bfd_is_und_section (symbol->section))
2445 {
2446 native->u.syment.n_scnum = N_UNDEF;
2447 native->u.syment.n_value = symbol->value;
2448 }
2449 else if (bfd_is_com_section (symbol->section))
2450 {
2451 native->u.syment.n_scnum = N_UNDEF;
2452 native->u.syment.n_value = symbol->value;
2453 }
2454 else
2455 {
2456 native->u.syment.n_scnum =
2457 symbol->section->output_section->target_index;
2458 native->u.syment.n_value = (symbol->value
2459 + symbol->section->output_offset);
2460 if (! obj_pe (abfd))
2461 native->u.syment.n_value += symbol->section->output_section->vma;
244148ad 2462
252b5132
RH
2463 /* Copy the any flags from the the file header into the symbol.
2464 FIXME: Why? */
2465 native->u.syment.n_flags = bfd_asymbol_bfd (& csym->symbol)->flags;
2466 }
244148ad 2467
252b5132
RH
2468 csym->native = native;
2469 }
2470 else
2471 {
2472 csym->native->u.syment.n_sclass = class;
2473 }
244148ad 2474
252b5132
RH
2475 return true;
2476}