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