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