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