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