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