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