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