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