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