* remote-vx.c (vx_attach): Interpret the command argument as an
[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
a74d1517 183 obj_conv_table_size (abfd) = 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
JL
342coff_count_linenumbers (abfd)
343 bfd *abfd;
075caafd
ILT
344{
345 unsigned int limit = bfd_get_symcount(abfd);
346 unsigned int i;
27f524a3 347 int total = 0;
075caafd 348 asymbol **p;
27f524a3
ILT
349 {
350 asection *s = abfd->sections->output_section;
351 while (s) {
352 BFD_ASSERT(s->lineno_count == 0);
353 s = s->next;
354 }
355 }
075caafd
ILT
356
357
358 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++) {
359 asymbol *q_maybe = *p;
360 if (bfd_asymbol_flavour(q_maybe) == bfd_target_coff_flavour) {
361 coff_symbol_type *q = coffsymbol(q_maybe);
362 if (q->lineno) {
363 /*
364 This symbol has a linenumber, increment the owning
365 section's linenumber count
366 */
367 alent *l = q->lineno;
368 q->symbol.section->output_section->lineno_count++;
27f524a3 369 total ++;
075caafd
ILT
370 l++;
371 while (l->line_number) {
27f524a3 372 total ++;
075caafd
ILT
373 q->symbol.section->output_section->lineno_count++;
374 l++;
375 }
376 }
377 }
378 }
27f524a3 379 return total;
075caafd
ILT
380}
381
382/* Takes a bfd and a symbol, returns a pointer to the coff specific
383 area of the symbol if there is one. */
384
330595d0 385/*ARGSUSED*/
075caafd 386coff_symbol_type *
25057836
JL
387coff_symbol_from (ignore_abfd, symbol)
388 bfd *ignore_abfd;
389 asymbol *symbol;
075caafd
ILT
390{
391 if (bfd_asymbol_flavour(symbol) != bfd_target_coff_flavour)
392 return (coff_symbol_type *)NULL;
393
394 if (bfd_asymbol_bfd(symbol)->tdata.coff_obj_data == (coff_data_type*)NULL)
395 return (coff_symbol_type *)NULL;
396
397 return (coff_symbol_type *) symbol;
398}
399
400static void
25057836
JL
401fixup_symbol_value (coff_symbol_ptr, syment)
402 coff_symbol_type *coff_symbol_ptr;
403 struct internal_syment *syment;
075caafd
ILT
404{
405
406 /* Normalize the symbol flags */
e61cfdf8 407 if (bfd_is_com_section (coff_symbol_ptr->symbol.section)) {
075caafd
ILT
408 /* a common symbol is undefined with a value */
409 syment->n_scnum = N_UNDEF;
410 syment->n_value = coff_symbol_ptr->symbol.value;
411 }
412 else if (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) {
413 syment->n_value = coff_symbol_ptr->symbol.value;
414 }
e8fbe6d9 415 else if (bfd_is_und_section (coff_symbol_ptr->symbol.section)) {
075caafd
ILT
416 syment->n_scnum = N_UNDEF;
417 syment->n_value = 0;
418 }
419 else {
420 if (coff_symbol_ptr->symbol.section) {
421 syment->n_scnum =
422 coff_symbol_ptr->symbol.section->output_section->target_index;
423
424 syment->n_value =
425 coff_symbol_ptr->symbol.value +
426 coff_symbol_ptr->symbol.section->output_offset +
427 coff_symbol_ptr->symbol.section->output_section->vma;
428 }
429 else {
430 BFD_ASSERT(0);
431 /* This can happen, but I don't know why yet (steve@cygnus.com) */
432 syment->n_scnum = N_ABS;
433 syment->n_value = coff_symbol_ptr->symbol.value;
434 }
435 }
436}
437
438/* run through all the symbols in the symbol table and work out what
439 their indexes into the symbol table will be when output
440
441 Coff requires that each C_FILE symbol points to the next one in the
442 chain, and that the last one points to the first external symbol. We
443 do that here too.
444
445*/
9783e04a 446boolean
25057836
JL
447coff_renumber_symbols (bfd_ptr)
448 bfd *bfd_ptr;
075caafd
ILT
449{
450 unsigned int symbol_count = bfd_get_symcount(bfd_ptr);
451 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
452 unsigned int native_index = 0;
453 struct internal_syment *last_file = (struct internal_syment *)NULL;
454 unsigned int symbol_index;
455
456 /* COFF demands that undefined symbols come after all other symbols.
457 Since we don't need to impose this extra knowledge on all our client
458 programs, deal with that here. Sort the symbol table; just move the
459 undefined symbols to the end, leaving the rest alone. */
460 /* @@ Do we have some condition we could test for, so we don't always
461 have to do this? I don't think relocatability is quite right, but
462 I'm not certain. [raeburn:19920508.1711EST] */
463 {
464 asymbol **newsyms;
465 int i;
466
467 newsyms = (asymbol **) bfd_alloc_by_size_t (bfd_ptr,
468 sizeof (asymbol *)
469 * (symbol_count + 1));
9783e04a
DM
470 if (!newsyms)
471 {
d1ad85a6 472 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
473 return false;
474 }
075caafd
ILT
475 bfd_ptr->outsymbols = newsyms;
476 for (i = 0; i < symbol_count; i++)
e8fbe6d9 477 if (! bfd_is_und_section (symbol_ptr_ptr[i]->section))
075caafd
ILT
478 *newsyms++ = symbol_ptr_ptr[i];
479 for (i = 0; i < symbol_count; i++)
e8fbe6d9 480 if (bfd_is_und_section (symbol_ptr_ptr[i]->section))
075caafd
ILT
481 *newsyms++ = symbol_ptr_ptr[i];
482 *newsyms = (asymbol *) NULL;
483 symbol_ptr_ptr = bfd_ptr->outsymbols;
484 }
485
486 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
487 {
488 coff_symbol_type *coff_symbol_ptr = coff_symbol_from(bfd_ptr, symbol_ptr_ptr[symbol_index]);
489 if (coff_symbol_ptr && coff_symbol_ptr->native) {
490 combined_entry_type *s = coff_symbol_ptr->native;
491 int i;
492
493 if (s->u.syment.n_sclass == C_FILE)
494 {
495 if (last_file != (struct internal_syment *)NULL) {
496 last_file->n_value = native_index;
497 }
498 last_file = &(s->u.syment);
499 }
500 else {
501
502 /* Modify the symbol values according to their section and
503 type */
504
505 fixup_symbol_value(coff_symbol_ptr, &(s->u.syment));
506 }
507 for (i = 0; i < s->u.syment.n_numaux + 1; i++) {
508 s[i].offset = native_index ++;
509 }
510 }
511 else {
512 native_index++;
513 }
514 }
515 obj_conv_table_size (bfd_ptr) = native_index;
9783e04a 516 return true;
075caafd
ILT
517}
518
519/*
520 Run thorough the symbol table again, and fix it so that all pointers to
521 entries are changed to the entries' index in the output symbol table.
522
523*/
524void
9783e04a
DM
525coff_mangle_symbols (bfd_ptr)
526 bfd *bfd_ptr;
075caafd 527{
9783e04a 528 unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
075caafd
ILT
529 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
530 unsigned int symbol_index;
531
532 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
9783e04a
DM
533 {
534 coff_symbol_type *coff_symbol_ptr =
535 coff_symbol_from (bfd_ptr, symbol_ptr_ptr[symbol_index]);
075caafd 536
9783e04a
DM
537 if (coff_symbol_ptr && coff_symbol_ptr->native)
538 {
075caafd
ILT
539 int i;
540 combined_entry_type *s = coff_symbol_ptr->native;
541
9783e04a
DM
542 if (s->fix_value)
543 {
544 /* FIXME: We should use a union here. */
545 s->u.syment.n_value =
546 ((combined_entry_type *) s->u.syment.n_value)->offset;
547 s->fix_value = 0;
075caafd 548 }
9783e04a
DM
549 for (i = 0; i < s->u.syment.n_numaux ; i++)
550 {
551 combined_entry_type *a = s + i + 1;
552 if (a->fix_tag)
553 {
554 a->u.auxent.x_sym.x_tagndx.l =
555 a->u.auxent.x_sym.x_tagndx.p->offset;
556 a->fix_tag = 0;
557 }
558 if (a->fix_end)
559 {
560 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l =
561 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p->offset;
562 a->fix_end = 0;
563 }
564 if (a->fix_scnlen)
565 {
566 a->u.auxent.x_csect.x_scnlen.l =
567 a->u.auxent.x_csect.x_scnlen.p->offset;
568 a->fix_scnlen = 0;
569 }
075caafd 570 }
075caafd 571 }
9783e04a 572 }
075caafd
ILT
573}
574
9783e04a
DM
575static bfd_size_type string_size;
576static bfd_size_type debug_string_size;
577static asection *debug_string_section;
075caafd
ILT
578
579static void
25057836
JL
580coff_fix_symbol_name (abfd, symbol, native)
581 bfd *abfd;
582 asymbol *symbol;
583 combined_entry_type *native;
075caafd
ILT
584{
585 unsigned int name_length;
586 union internal_auxent *auxent;
587 char * name = ( char *)(symbol->name);
588
589 if (name == (char *) NULL) {
590 /* coff symbols always have names, so we'll make one up */
591 symbol->name = "strange";
592 name = (char *)symbol->name;
593 }
594 name_length = strlen(name);
595
596 if (native->u.syment.n_sclass == C_FILE) {
597 strncpy(native->u.syment._n._n_name, ".file", SYMNMLEN);
598 auxent = &(native+1)->u.auxent;
599
600 if (bfd_coff_long_filenames (abfd)) {
601 if (name_length <= FILNMLEN) {
602 strncpy(auxent->x_file.x_fname, name, FILNMLEN);
603 }
604 else {
9fbe895a 605 auxent->x_file.x_n.x_offset = string_size + STRING_SIZE_SIZE;
075caafd
ILT
606 auxent->x_file.x_n.x_zeroes = 0;
607 string_size += name_length + 1;
608 }
609 }
610 else {
611 strncpy(auxent->x_file.x_fname, name, FILNMLEN);
612 if (name_length > FILNMLEN) {
613 name[FILNMLEN] = '\0';
614 }
615 }
616 }
617 else
9783e04a
DM
618 { /* NOT A C_FILE SYMBOL */
619 if (name_length <= SYMNMLEN)
620 {
075caafd
ILT
621 /* This name will fit into the symbol neatly */
622 strncpy(native->u.syment._n._n_name, symbol->name, SYMNMLEN);
623 }
9783e04a
DM
624 else if (! bfd_coff_symname_in_debug (abfd, &native->u.syment))
625 {
9fbe895a 626 native->u.syment._n._n_n._n_offset = string_size + STRING_SIZE_SIZE;
075caafd
ILT
627 native->u.syment._n._n_n._n_zeroes = 0;
628 string_size += name_length + 1;
629 }
9783e04a
DM
630 else
631 {
632 long filepos;
633 bfd_byte buf[2];
634
635 /* This name should be written into the .debug section. For
636 some reason each name is preceded by a two byte length
637 and also followed by a null byte. FIXME: We assume that
638 the .debug section has already been created, and that it
639 is large enough. */
640 if (debug_string_section == (asection *) NULL)
641 debug_string_section = bfd_get_section_by_name (abfd, ".debug");
642 filepos = bfd_tell (abfd);
643 bfd_put_16 (abfd, name_length + 1, buf);
644 if (! bfd_set_section_contents (abfd,
645 debug_string_section,
646 (PTR) buf,
647 (file_ptr) debug_string_size,
648 (bfd_size_type) 2)
649 || ! bfd_set_section_contents (abfd,
650 debug_string_section,
651 (PTR) symbol->name,
652 (file_ptr) debug_string_size + 2,
653 (bfd_size_type) name_length + 1))
654 abort ();
655 if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
656 abort ();
657 native->u.syment._n._n_n._n_offset = debug_string_size + 2;
658 native->u.syment._n._n_n._n_zeroes = 0;
659 debug_string_size += name_length + 3;
660 }
661 }
075caafd
ILT
662}
663
bfe8224f
ILT
664/* We need to keep track of the symbol index so that when we write out
665 the relocs we can get the index for a symbol. This method is a
666 hack. FIXME. */
667
668#define set_index(symbol, idx) ((symbol)->udata = (PTR) (idx))
669
670/* Write a symbol out to a COFF file. */
075caafd 671
bfe8224f 672static boolean
25057836
JL
673coff_write_symbol (abfd, symbol, native, written)
674 bfd *abfd;
675 asymbol *symbol;
676 combined_entry_type *native;
bfe8224f 677 unsigned int *written;
075caafd 678{
bfe8224f
ILT
679 unsigned int numaux = native->u.syment.n_numaux;
680 int type = native->u.syment.n_type;
681 int class = native->u.syment.n_sclass;
075caafd
ILT
682 PTR buf;
683 bfd_size_type symesz;
684
bfe8224f
ILT
685 /* @@ bfd_debug_section isn't accessible outside this file, but we
686 know that C_FILE symbols belong there. So move them. */
075caafd
ILT
687 if (native->u.syment.n_sclass == C_FILE)
688 symbol->section = &bfd_debug_section;
689
e8fbe6d9 690 if (bfd_is_abs_section (symbol->section))
bfe8224f
ILT
691 {
692 native->u.syment.n_scnum = N_ABS;
693 }
075caafd 694 else if (symbol->section == &bfd_debug_section)
bfe8224f
ILT
695 {
696 native->u.syment.n_scnum = N_DEBUG;
697 }
e8fbe6d9 698 else if (bfd_is_und_section (symbol->section))
bfe8224f
ILT
699 {
700 native->u.syment.n_scnum = N_UNDEF;
701 }
075caafd 702 else
bfe8224f
ILT
703 {
704 native->u.syment.n_scnum =
705 symbol->section->output_section->target_index;
706 }
075caafd 707
bfe8224f 708 coff_fix_symbol_name (abfd, symbol, native);
075caafd
ILT
709
710 symesz = bfd_coff_symesz (abfd);
711 buf = bfd_alloc (abfd, symesz);
9783e04a
DM
712 if (!buf)
713 {
d1ad85a6 714 bfd_set_error (bfd_error_no_memory);
bfe8224f 715 return false;
9783e04a 716 }
bfe8224f
ILT
717 bfd_coff_swap_sym_out (abfd, &native->u.syment, buf);
718 if (bfd_write (buf, 1, symesz, abfd) != symesz)
719 return false;
075caafd
ILT
720 bfd_release (abfd, buf);
721
722 if (native->u.syment.n_numaux > 0)
723 {
724 bfd_size_type auxesz;
725 unsigned int j;
726
727 auxesz = bfd_coff_auxesz (abfd);
728 buf = bfd_alloc (abfd, auxesz);
9783e04a
DM
729 if (!buf)
730 {
d1ad85a6 731 bfd_set_error (bfd_error_no_memory);
bfe8224f 732 return false;
9783e04a 733 }
075caafd
ILT
734 for (j = 0; j < native->u.syment.n_numaux; j++)
735 {
bfe8224f
ILT
736 bfd_coff_swap_aux_out (abfd,
737 &((native + j + 1)->u.auxent),
738 type,
739 class,
740 j,
741 native->u.syment.n_numaux,
742 buf);
743 if (bfd_write (buf, 1, auxesz, abfd)!= auxesz)
744 return false;
075caafd
ILT
745 }
746 bfd_release (abfd, buf);
747 }
bfe8224f
ILT
748
749 /* Store the index for use when we write out the relocs. */
750 set_index (symbol, *written);
751
752 *written += numaux + 1;
753 return true;
075caafd
ILT
754}
755
bfe8224f
ILT
756/* Write out a symbol to a COFF file that does not come from a COFF
757 file originally. This symbol may have been created by the linker,
758 or we may be linking a non COFF file to a COFF file. */
075caafd 759
bfe8224f 760static boolean
25057836
JL
761coff_write_alien_symbol (abfd, symbol, written)
762 bfd *abfd;
763 asymbol *symbol;
bfe8224f 764 unsigned int *written;
075caafd 765{
075caafd
ILT
766 combined_entry_type *native;
767 combined_entry_type dummy;
bfe8224f 768
075caafd
ILT
769 native = &dummy;
770 native->u.syment.n_type = T_NULL;
771 native->u.syment.n_flags = 0;
e8fbe6d9 772 if (bfd_is_und_section (symbol->section))
bfe8224f
ILT
773 {
774 native->u.syment.n_scnum = N_UNDEF;
775 native->u.syment.n_value = symbol->value;
075caafd 776 }
e61cfdf8 777 else if (bfd_is_com_section (symbol->section))
bfe8224f
ILT
778 {
779 native->u.syment.n_scnum = N_UNDEF;
780 native->u.syment.n_value = symbol->value;
075caafd 781 }
bfe8224f 782 else if (symbol->flags & BSF_DEBUGGING)
075caafd 783 {
a74d1517
ILT
784 /* There isn't much point to writing out a debugging symbol
785 unless we are prepared to convert it into COFF debugging
786 format. So, we just ignore them. */
787 return true;
075caafd 788 }
bfe8224f
ILT
789 else
790 {
791 native->u.syment.n_scnum =
792 symbol->section->output_section->target_index;
793 native->u.syment.n_value = (symbol->value
794 + symbol->section->output_section->vma
795 + symbol->section->output_offset);
796
797 /* Copy the any flags from the the file header into the symbol.
798 FIXME: Why? */
799 {
800 coff_symbol_type *c = coff_symbol_from (abfd, symbol);
801 if (c != (coff_symbol_type *) NULL)
802 native->u.syment.n_flags = bfd_asymbol_bfd (&c->symbol)->flags;
803 }
075caafd
ILT
804 }
805
bfe8224f 806 native->u.syment.n_type = 0;
075caafd 807 if (symbol->flags & BSF_LOCAL)
bfe8224f 808 native->u.syment.n_sclass = C_STAT;
075caafd 809 else
bfe8224f
ILT
810 native->u.syment.n_sclass = C_EXT;
811 native->u.syment.n_numaux = 0;
075caafd 812
bfe8224f 813 return coff_write_symbol (abfd, symbol, native, written);
075caafd
ILT
814}
815
bfe8224f
ILT
816/* Write a native symbol to a COFF file. */
817
818static boolean
25057836
JL
819coff_write_native_symbol (abfd, symbol, written)
820 bfd *abfd;
821 coff_symbol_type *symbol;
bfe8224f 822 unsigned int *written;
075caafd 823{
075caafd 824 combined_entry_type *native = symbol->native;
bfe8224f 825 alent *lineno = symbol->lineno;
075caafd 826
bfe8224f
ILT
827 /* If this symbol has an associated line number, we must store the
828 symbol index in the line number field. We also tag the auxent to
829 point to the right place in the lineno table. */
830 if (lineno && !symbol->done_lineno)
831 {
832 unsigned int count = 0;
833 lineno[count].u.offset = *written;
834 if (native->u.syment.n_numaux)
835 {
836 union internal_auxent *a = &((native+1)->u.auxent);
075caafd 837
bfe8224f
ILT
838 a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
839 symbol->symbol.section->output_section->moving_line_filepos;
840 }
075caafd 841
bfe8224f
ILT
842 /* Count and relocate all other linenumbers. */
843 count++;
844 while (lineno[count].line_number != 0)
845 {
075caafd 846#if 0
bfe8224f
ILT
847 /* 13 april 92. sac
848 I've been told this, but still need proof:
849 > The second bug is also in `bfd/coffcode.h'. This bug
850 > causes the linker to screw up the pc-relocations for
851 > all the line numbers in COFF code. This bug isn't only
852 > specific to A29K implementations, but affects all
853 > systems using COFF format binaries. Note that in COFF
854 > object files, the line number core offsets output by
855 > the assembler are relative to the start of each
856 > procedure, not to the start of the .text section. This
857 > patch relocates the line numbers relative to the
858 > `native->u.syment.n_value' instead of the section
859 > virtual address.
860 > modular!olson@cs.arizona.edu (Jon Olson)
861 */
862 lineno[count].u.offset += native->u.syment.n_value;
075caafd 863#else
bfe8224f
ILT
864 lineno[count].u.offset +=
865 (symbol->symbol.section->output_section->vma
866 + symbol->symbol.section->output_offset);
075caafd 867#endif
bfe8224f
ILT
868 count++;
869 }
870 symbol->done_lineno = true;
075caafd 871
bfe8224f
ILT
872 symbol->symbol.section->output_section->moving_line_filepos +=
873 count * bfd_coff_linesz (abfd);
874 }
875
876 return coff_write_symbol (abfd, &(symbol->symbol), native, written);
075caafd
ILT
877}
878
bfe8224f
ILT
879/* Write out the COFF symbols. */
880
881boolean
25057836 882coff_write_symbols (abfd)
bfe8224f 883 bfd *abfd;
075caafd 884{
bfe8224f
ILT
885 unsigned int i;
886 unsigned int limit = bfd_get_symcount(abfd);
887 unsigned int written = 0;
888 asymbol **p;
075caafd
ILT
889
890 string_size = 0;
9783e04a 891 debug_string_size = 0;
075caafd
ILT
892
893 /* Seek to the right place */
bfe8224f
ILT
894 if (bfd_seek (abfd, obj_sym_filepos(abfd), SEEK_SET) != 0)
895 return false;
075caafd
ILT
896
897 /* Output all the symbols we have */
898
899 written = 0;
900 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
bfe8224f
ILT
901 {
902 asymbol *symbol = *p;
903 coff_symbol_type *c_symbol = coff_symbol_from (abfd, symbol);
075caafd 904
bfe8224f
ILT
905 if (c_symbol == (coff_symbol_type *) NULL
906 || c_symbol->native == (combined_entry_type *)NULL)
907 {
908 if (! coff_write_alien_symbol (abfd, symbol, &written))
909 return false;
910 }
911 else
912 {
913 if (! coff_write_native_symbol (abfd, c_symbol, &written))
914 return false;
915 }
916 }
075caafd 917
bfe8224f 918 bfd_get_symcount (abfd) = written;
075caafd
ILT
919
920 /* Now write out strings */
921
922 if (string_size != 0)
923 {
9fbe895a
ILT
924 unsigned int size = string_size + STRING_SIZE_SIZE;
925 bfd_byte buffer[STRING_SIZE_SIZE];
075caafd 926
9fbe895a 927#if STRING_SIZE_SIZE == 4
bfe8224f 928 bfd_h_put_32 (abfd, size, buffer);
9fbe895a
ILT
929#else
930 #error Change bfd_h_put_32
931#endif
c16313f0
ILT
932 if (bfd_write ((PTR) buffer, 1, sizeof (buffer), abfd) != sizeof (buffer))
933 return false;
075caafd
ILT
934 for (p = abfd->outsymbols, i = 0;
935 i < limit;
936 i++, p++)
bfe8224f
ILT
937 {
938 asymbol *q = *p;
939 size_t name_length = strlen (q->name);
940 coff_symbol_type *c_symbol = coff_symbol_from (abfd, q);
941 size_t maxlen;
942
943 /* Figure out whether the symbol name should go in the string
944 table. Symbol names that are short enough are stored
945 directly in the syment structure. File names permit a
946 different, longer, length in the syment structure. On
947 XCOFF, some symbol names are stored in the .debug section
948 rather than in the string table. */
949
950 if (c_symbol == NULL
951 || c_symbol->native == NULL)
952 {
953 /* This is not a COFF symbol, so it certainly is not a
954 file name, nor does it go in the .debug section. */
955 maxlen = SYMNMLEN;
956 }
957 else if (bfd_coff_symname_in_debug (abfd,
958 &c_symbol->native->u.syment))
959 {
960 /* This symbol name is in the XCOFF .debug section.
961 Don't write it into the string table. */
962 maxlen = name_length;
963 }
964 else if (c_symbol->native->u.syment.n_sclass == C_FILE)
965 maxlen = FILNMLEN;
966 else
967 maxlen = SYMNMLEN;
968
969 if (name_length > maxlen)
970 {
971 if (bfd_write ((PTR) (q->name), 1, name_length + 1, abfd)
972 != name_length + 1)
973 return false;
974 }
975 }
075caafd 976 }
bfe8224f
ILT
977 else
978 {
979 /* We would normally not write anything here, but we'll write
980 out 4 so that any stupid coff reader which tries to read the
981 string table even when there isn't one won't croak. */
9fbe895a
ILT
982 unsigned int size = STRING_SIZE_SIZE;
983 bfd_byte buffer[STRING_SIZE_SIZE];
bfe8224f 984
9fbe895a 985#if STRING_SIZE_SIZE == 4
bfe8224f 986 bfd_h_put_32 (abfd, size, buffer);
9fbe895a
ILT
987#else
988 #error Change bfd_h_put_32
989#endif
990 if (bfd_write ((PTR) buffer, 1, STRING_SIZE_SIZE, abfd)
991 != STRING_SIZE_SIZE)
bfe8224f
ILT
992 return false;
993 }
9783e04a 994
bfe8224f
ILT
995 /* Make sure the .debug section was created to be the correct size.
996 We should create it ourselves on the fly, but we don't because
997 BFD won't let us write to any section until we know how large all
998 the sections are. We could still do it by making another pass
999 over the symbols. FIXME. */
9783e04a
DM
1000 BFD_ASSERT (debug_string_size == 0
1001 || (debug_string_section != (asection *) NULL
1002 && (BFD_ALIGN (debug_string_size,
1003 1 << debug_string_section->alignment_power)
1004 == bfd_section_size (abfd, debug_string_section))));
bfe8224f
ILT
1005
1006 return true;
075caafd
ILT
1007}
1008
9783e04a 1009boolean
25057836
JL
1010coff_write_linenumbers (abfd)
1011 bfd *abfd;
075caafd
ILT
1012{
1013 asection *s;
1014 bfd_size_type linesz;
1015 PTR buff;
1016
1017 linesz = bfd_coff_linesz (abfd);
1018 buff = bfd_alloc (abfd, linesz);
9783e04a
DM
1019 if (!buff)
1020 {
d1ad85a6 1021 bfd_set_error (bfd_error_no_memory);
25057836 1022 return false;
9783e04a 1023 }
075caafd
ILT
1024 for (s = abfd->sections; s != (asection *) NULL; s = s->next) {
1025 if (s->lineno_count) {
1026 asymbol **q = abfd->outsymbols;
c16313f0
ILT
1027 if (bfd_seek(abfd, s->line_filepos, SEEK_SET) != 0)
1028 return false;
075caafd
ILT
1029 /* Find all the linenumbers in this section */
1030 while (*q) {
1031 asymbol *p = *q;
27f524a3
ILT
1032 if (p->section->output_section == s) {
1033 alent *l =
1034 BFD_SEND(bfd_asymbol_bfd(p), _get_lineno, (bfd_asymbol_bfd(p), p));
1035 if (l) {
1036 /* Found a linenumber entry, output */
1037 struct internal_lineno out;
1038 memset( (PTR)&out, 0, sizeof(out));
1039 out.l_lnno = 0;
075caafd
ILT
1040 out.l_addr.l_symndx = l->u.offset;
1041 bfd_coff_swap_lineno_out(abfd, &out, buff);
c16313f0
ILT
1042 if (bfd_write(buff, 1, linesz, abfd) != linesz)
1043 return false;
075caafd 1044 l++;
27f524a3
ILT
1045 while (l->line_number) {
1046 out.l_lnno = l->line_number;
1047 out.l_addr.l_symndx = l->u.offset;
1048 bfd_coff_swap_lineno_out(abfd, &out, buff);
c16313f0
ILT
1049 if (bfd_write(buff, 1, linesz, abfd) != linesz)
1050 return false;
27f524a3
ILT
1051 l++;
1052 }
075caafd
ILT
1053 }
1054 }
1055 q++;
1056 }
1057 }
1058 }
1059 bfd_release (abfd, buff);
9783e04a 1060 return true;
075caafd
ILT
1061}
1062
330595d0 1063/*ARGSUSED*/
075caafd 1064alent *
25057836
JL
1065coff_get_lineno (ignore_abfd, symbol)
1066 bfd *ignore_abfd;
1067 asymbol *symbol;
075caafd
ILT
1068{
1069 return coffsymbol(symbol)->lineno;
1070}
1071
1072asymbol *
1073coff_section_symbol (abfd, name)
1074 bfd *abfd;
1075 char *name;
1076{
1077 asection *sec = bfd_make_section_old_way (abfd, name);
1078 asymbol *sym;
1079 combined_entry_type *csym;
1080
1081 sym = sec->symbol;
4c3721d5 1082 csym = coff_symbol_from (abfd, sym)->native;
075caafd
ILT
1083 /* Make sure back-end COFF stuff is there. */
1084 if (csym == 0)
1085 {
1086 struct foo {
1087 coff_symbol_type sym;
1088 /* @@FIXME This shouldn't use a fixed size!! */
1089 combined_entry_type e[10];
1090 };
1091 struct foo *f;
1092 f = (struct foo *) bfd_alloc_by_size_t (abfd, sizeof (*f));
9783e04a
DM
1093 if (!f)
1094 {
d1ad85a6 1095 bfd_set_error (bfd_error_no_error);
9783e04a
DM
1096 return NULL;
1097 }
075caafd
ILT
1098 memset ((char *) f, 0, sizeof (*f));
1099 coff_symbol_from (abfd, sym)->native = csym = f->e;
1100 }
1101 csym[0].u.syment.n_sclass = C_STAT;
1102 csym[0].u.syment.n_numaux = 1;
1103/* SF_SET_STATICS (sym); @@ ??? */
4c3721d5
ILT
1104 csym[1].u.auxent.x_scn.x_scnlen = sec->_raw_size;
1105 csym[1].u.auxent.x_scn.x_nreloc = sec->reloc_count;
1106 csym[1].u.auxent.x_scn.x_nlinno = sec->lineno_count;
1107
1108 if (sec->output_section == NULL)
075caafd 1109 {
4c3721d5
ILT
1110 sec->output_section = sec;
1111 sec->output_offset = 0;
075caafd 1112 }
4c3721d5 1113
075caafd
ILT
1114 return sym;
1115}
1116
1117/* This function transforms the offsets into the symbol table into
1118 pointers to syments. */
1119
1120static void
25057836
JL
1121coff_pointerize_aux (abfd, table_base, type, class, auxent)
1122 bfd *abfd;
1123 combined_entry_type *table_base;
1124 int type;
1125 int class;
1126 combined_entry_type *auxent;
075caafd
ILT
1127{
1128 /* Don't bother if this is a file or a section */
1129 if (class == C_STAT && type == T_NULL) return;
1130 if (class == C_FILE) return;
1131
1132 /* Otherwise patch up */
1133#define N_TMASK coff_data (abfd)->local_n_tmask
1134#define N_BTSHFT coff_data (abfd)->local_n_btshft
1135 if (ISFCN(type) || ISTAG(class) || class == C_BLOCK) {
1136 auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p = table_base +
1137 auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
1138 auxent->fix_end = 1;
1139 }
1140 /* A negative tagndx is meaningless, but the SCO 3.2v4 cc can
1141 generate one, so we must be careful to ignore it. */
1142 if (auxent->u.auxent.x_sym.x_tagndx.l > 0) {
1143 auxent->u.auxent.x_sym.x_tagndx.p =
1144 table_base + auxent->u.auxent.x_sym.x_tagndx.l;
1145 auxent->fix_tag = 1;
1146 }
1147}
1148
1149static char *
25057836
JL
1150build_string_table (abfd)
1151 bfd *abfd;
075caafd 1152{
9fbe895a 1153 char string_table_size_buffer[STRING_SIZE_SIZE];
075caafd
ILT
1154 unsigned int string_table_size;
1155 char *string_table;
1156
1157 /* At this point we should be "seek"'d to the end of the
1158 symbols === the symbol table size. */
1159 if (bfd_read((char *) string_table_size_buffer,
1160 sizeof(string_table_size_buffer),
25057836 1161 1, abfd) != sizeof(string_table_size))
075caafd 1162 return (NULL);
075caafd 1163
9fbe895a 1164#if STRING_SIZE_SIZE == 4
075caafd 1165 string_table_size = bfd_h_get_32(abfd, (bfd_byte *) string_table_size_buffer);
9fbe895a
ILT
1166#else
1167 #error Change bfd_h_get_32
1168#endif
075caafd 1169
9fbe895a
ILT
1170 if ((string_table = (PTR) bfd_alloc(abfd,
1171 string_table_size -= STRING_SIZE_SIZE))
1172 == NULL)
1173 {
1174 bfd_set_error (bfd_error_no_memory);
1175 return (NULL);
1176 } /* on mallocation error */
25057836 1177 if (bfd_read(string_table, string_table_size, 1, abfd) != string_table_size)
075caafd 1178 return (NULL);
075caafd
ILT
1179 return string_table;
1180}
1181
1182/* Allocate space for the ".debug" section, and read it.
1183 We did not read the debug section until now, because
1184 we didn't want to go to the trouble until someone needed it. */
1185
1186static char *
25057836
JL
1187build_debug_section (abfd)
1188 bfd *abfd;
075caafd
ILT
1189{
1190 char *debug_section;
1191 long position;
1192
1193 asection *sect = bfd_get_section_by_name (abfd, ".debug");
1194
1195 if (!sect) {
d1ad85a6 1196 bfd_set_error (bfd_error_no_debug_section);
075caafd
ILT
1197 return NULL;
1198 }
1199
1200 debug_section = (PTR) bfd_alloc (abfd,
1201 bfd_get_section_size_before_reloc (sect));
1202 if (debug_section == NULL) {
d1ad85a6 1203 bfd_set_error (bfd_error_no_memory);
075caafd
ILT
1204 return NULL;
1205 }
1206
1207 /* Seek to the beginning of the `.debug' section and read it.
1208 Save the current position first; it is needed by our caller.
1209 Then read debug section and reset the file pointer. */
1210
1211 position = bfd_tell (abfd);
c16313f0
ILT
1212 if (bfd_seek (abfd, sect->filepos, SEEK_SET) != 0
1213 || (bfd_read (debug_section,
1214 bfd_get_section_size_before_reloc (sect), 1, abfd)
1215 != bfd_get_section_size_before_reloc(sect))
1216 || bfd_seek (abfd, position, SEEK_SET) != 0)
075caafd 1217 return NULL;
075caafd
ILT
1218 return debug_section;
1219}
1220
1221
1222/* Return a pointer to a malloc'd copy of 'name'. 'name' may not be
1223 \0-terminated, but will not exceed 'maxlen' characters. The copy *will*
1224 be \0-terminated. */
1225static char *
25057836
JL
1226copy_name (abfd, name, maxlen)
1227 bfd *abfd;
1228 char *name;
1229 int maxlen;
075caafd
ILT
1230{
1231 int len;
1232 char *newname;
1233
1234 for (len = 0; len < maxlen; ++len) {
1235 if (name[len] == '\0') {
1236 break;
1237 }
1238 }
1239
1240 if ((newname = (PTR) bfd_alloc(abfd, len+1)) == NULL) {
d1ad85a6 1241 bfd_set_error (bfd_error_no_memory);
075caafd
ILT
1242 return (NULL);
1243 }
1244 strncpy(newname, name, len);
1245 newname[len] = '\0';
1246 return newname;
1247}
1248
1249/* Read a symbol table into freshly bfd_allocated memory, swap it, and
1250 knit the symbol names into a normalized form. By normalized here I
1251 mean that all symbols have an n_offset pointer that points to a null-
1252 terminated string. */
1253
1254combined_entry_type *
25057836
JL
1255coff_get_normalized_symtab (abfd)
1256 bfd *abfd;
075caafd
ILT
1257{
1258 combined_entry_type *internal;
1259 combined_entry_type *internal_ptr;
1260 combined_entry_type *symbol_ptr;
1261 combined_entry_type *internal_end;
1262 bfd_size_type symesz;
1263 PTR raw;
1264 char *raw_src;
1265 char *raw_end;
1266 char *string_table = NULL;
1267 char *debug_section = NULL;
1268 unsigned long size;
1269
1270 unsigned int raw_size;
1271 if (obj_raw_syments(abfd) != (combined_entry_type *)NULL) {
1272 return obj_raw_syments(abfd);
1273 }
1274 if ((size = bfd_get_symcount(abfd) * sizeof(combined_entry_type)) == 0) {
d1ad85a6 1275 bfd_set_error (bfd_error_no_symbols);
075caafd
ILT
1276 return (NULL);
1277 }
1278
1279 internal = (combined_entry_type *)bfd_alloc(abfd, size);
9783e04a
DM
1280 if (!internal)
1281 {
d1ad85a6 1282 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
1283 return NULL;
1284 }
075caafd
ILT
1285 internal_end = internal + bfd_get_symcount(abfd);
1286
1287 symesz = bfd_coff_symesz (abfd);
1288 raw_size = bfd_get_symcount(abfd) * symesz;
1289 raw = bfd_alloc(abfd,raw_size);
9783e04a
DM
1290 if (!raw)
1291 {
d1ad85a6 1292 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
1293 return NULL;
1294 }
075caafd
ILT
1295
1296 if (bfd_seek(abfd, obj_sym_filepos(abfd), SEEK_SET) == -1
25057836 1297 || bfd_read(raw, raw_size, 1, abfd) != raw_size)
075caafd 1298 return (NULL);
075caafd
ILT
1299 /* mark the end of the symbols */
1300 raw_end = (char *) raw + bfd_get_symcount(abfd) * symesz;
1301 /*
1302 FIXME SOMEDAY. A string table size of zero is very weird, but
1303 probably possible. If one shows up, it will probably kill us.
1304 */
1305
1306 /* Swap all the raw entries */
1307 for (raw_src = (char *) raw, internal_ptr = internal;
1308 raw_src < raw_end;
1309 raw_src += symesz, internal_ptr++) {
1310
1311 unsigned int i;
1312 bfd_coff_swap_sym_in(abfd, (PTR)raw_src, (PTR)&internal_ptr->u.syment);
9783e04a 1313 internal_ptr->fix_value = 0;
075caafd
ILT
1314 internal_ptr->fix_tag = 0;
1315 internal_ptr->fix_end = 0;
9783e04a 1316 internal_ptr->fix_scnlen = 0;
075caafd 1317 symbol_ptr = internal_ptr;
85fe7cff 1318
075caafd
ILT
1319 for (i = 0;
1320 i < symbol_ptr->u.syment.n_numaux;
1321 i++)
1322 {
1323 internal_ptr++;
1324 raw_src += symesz;
1325
9783e04a 1326 internal_ptr->fix_value = 0;
075caafd
ILT
1327 internal_ptr->fix_tag = 0;
1328 internal_ptr->fix_end = 0;
9783e04a 1329 internal_ptr->fix_scnlen = 0;
075caafd
ILT
1330 bfd_coff_swap_aux_in(abfd, (PTR) raw_src,
1331 symbol_ptr->u.syment.n_type,
1332 symbol_ptr->u.syment.n_sclass,
330595d0 1333 i, symbol_ptr->u.syment.n_numaux,
075caafd
ILT
1334 &(internal_ptr->u.auxent));
1335 /* Remember that bal entries arn't pointerized */
1336 if (i != 1 || symbol_ptr->u.syment.n_sclass != C_LEAFPROC)
1337 {
1338
1339 coff_pointerize_aux(abfd,
1340 internal,
1341 symbol_ptr->u.syment.n_type,
1342 symbol_ptr->u.syment.n_sclass,
1343 internal_ptr);
1344 }
1345
1346 }
1347 }
1348
1349 /* Free all the raw stuff */
1350 bfd_release(abfd, raw);
1351
1352 for (internal_ptr = internal; internal_ptr < internal_end;
1353 internal_ptr ++)
1354 {
a74d1517
ILT
1355 if (internal_ptr->u.syment.n_sclass == C_FILE
1356 && internal_ptr->u.syment.n_numaux > 0) {
075caafd
ILT
1357 /* make a file symbol point to the name in the auxent, since
1358 the text ".file" is redundant */
1359 if ((internal_ptr+1)->u.auxent.x_file.x_n.x_zeroes == 0) {
1360 /* the filename is a long one, point into the string table */
1361 if (string_table == NULL) {
1362 string_table = build_string_table(abfd);
1363 }
1364
1365 internal_ptr->u.syment._n._n_n._n_offset =
9fbe895a 1366 (long) (string_table - STRING_SIZE_SIZE +
075caafd
ILT
1367 (internal_ptr+1)->u.auxent.x_file.x_n.x_offset);
1368 }
1369 else {
1370 /* ordinary short filename, put into memory anyway */
e4b6b3e7 1371 internal_ptr->u.syment._n._n_n._n_offset = (long)
075caafd
ILT
1372 copy_name(abfd, (internal_ptr+1)->u.auxent.x_file.x_fname,
1373 FILNMLEN);
1374 }
1375 }
1376 else {
1377 if (internal_ptr->u.syment._n._n_n._n_zeroes != 0) {
1378 /* This is a "short" name. Make it long. */
1379 unsigned long i = 0;
1380 char *newstring = NULL;
1381
1382 /* find the length of this string without walking into memory
1383 that isn't ours. */
1384 for (i = 0; i < 8; ++i) {
1385 if (internal_ptr->u.syment._n._n_name[i] == '\0') {
1386 break;
1387 } /* if end of string */
1388 } /* possible lengths of this string. */
1389
1390 if ((newstring = (PTR) bfd_alloc(abfd, ++i)) == NULL) {
d1ad85a6 1391 bfd_set_error (bfd_error_no_memory);
075caafd
ILT
1392 return (NULL);
1393 } /* on error */
1394 memset(newstring, 0, i);
1395 strncpy(newstring, internal_ptr->u.syment._n._n_name, i-1);
e4b6b3e7 1396 internal_ptr->u.syment._n._n_n._n_offset = (long int) newstring;
075caafd
ILT
1397 internal_ptr->u.syment._n._n_n._n_zeroes = 0;
1398 }
9783e04a
DM
1399 else if (internal_ptr->u.syment._n._n_n._n_offset == 0)
1400 internal_ptr->u.syment._n._n_n._n_offset = (long int) "";
075caafd
ILT
1401 else if (!bfd_coff_symname_in_debug(abfd, &internal_ptr->u.syment)) {
1402 /* Long name already. Point symbol at the string in the table. */
1403 if (string_table == NULL) {
1404 string_table = build_string_table(abfd);
1405 }
e4b6b3e7 1406 internal_ptr->u.syment._n._n_n._n_offset = (long int)
9fbe895a
ILT
1407 (string_table
1408 - STRING_SIZE_SIZE
1409 + internal_ptr->u.syment._n._n_n._n_offset);
075caafd
ILT
1410 }
1411 else {
1412 /* Long name in debug section. Very similar. */
1413 if (debug_section == NULL) {
1414 debug_section = build_debug_section(abfd);
1415 }
e4b6b3e7 1416 internal_ptr->u.syment._n._n_n._n_offset = (long int)
075caafd
ILT
1417 (debug_section + internal_ptr->u.syment._n._n_n._n_offset);
1418 }
1419 }
1420 internal_ptr += internal_ptr->u.syment.n_numaux;
1421 }
1422
1423 obj_raw_syments(abfd) = internal;
85fe7cff 1424 obj_raw_syment_count(abfd) = internal_ptr - internal;
075caafd
ILT
1425
1426 return (internal);
1427} /* coff_get_normalized_symtab() */
1428
326e32d7 1429long
25057836
JL
1430coff_get_reloc_upper_bound (abfd, asect)
1431 bfd *abfd;
1432 sec_ptr asect;
075caafd
ILT
1433{
1434 if (bfd_get_format(abfd) != bfd_object) {
d1ad85a6 1435 bfd_set_error (bfd_error_invalid_operation);
326e32d7 1436 return -1;
075caafd
ILT
1437 }
1438 return (asect->reloc_count + 1) * sizeof(arelent *);
1439}
1440
1441asymbol *
25057836
JL
1442coff_make_empty_symbol (abfd)
1443 bfd *abfd;
075caafd
ILT
1444{
1445 coff_symbol_type *new = (coff_symbol_type *) bfd_alloc(abfd, sizeof(coff_symbol_type));
1446 if (new == NULL) {
d1ad85a6 1447 bfd_set_error (bfd_error_no_memory);
075caafd
ILT
1448 return (NULL);
1449 } /* on error */
9783e04a 1450 memset (new, 0, sizeof *new);
075caafd
ILT
1451 new->symbol.section = 0;
1452 new->native = 0;
1453 new->lineno = (alent *) NULL;
1454 new->done_lineno = false;
1455 new->symbol.the_bfd = abfd;
1456 return &new->symbol;
1457}
1458
2d1e6c9c
KR
1459/* Make a debugging symbol. */
1460
075caafd 1461asymbol *
2d1e6c9c
KR
1462coff_bfd_make_debug_symbol (abfd, ptr, sz)
1463 bfd *abfd;
1464 PTR ptr;
1465 unsigned long sz;
075caafd
ILT
1466{
1467 coff_symbol_type *new = (coff_symbol_type *) bfd_alloc(abfd, sizeof(coff_symbol_type));
1468 if (new == NULL) {
d1ad85a6 1469 bfd_set_error (bfd_error_no_memory);
075caafd
ILT
1470 return (NULL);
1471 } /* on error */
1472 /* @@ This shouldn't be using a constant multiplier. */
1473 new->native = (combined_entry_type *) bfd_zalloc (abfd, sizeof (combined_entry_type) * 10);
9783e04a
DM
1474 if (!new->native)
1475 {
d1ad85a6 1476 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
1477 return (NULL);
1478 } /* on error */
075caafd
ILT
1479 new->symbol.section = &bfd_debug_section;
1480 new->lineno = (alent *) NULL;
1481 new->done_lineno = false;
1482 new->symbol.the_bfd = abfd;
1483 return &new->symbol;
1484}
1485
330595d0 1486/*ARGSUSED*/
2d1e6c9c
KR
1487void
1488coff_get_symbol_info (abfd, symbol, ret)
1489 bfd *abfd;
1490 asymbol *symbol;
1491 symbol_info *ret;
1492{
1493 bfd_symbol_info (symbol, ret);
1494}
1495
e61cfdf8
ILT
1496/* Print out information about COFF symbol. */
1497
075caafd 1498void
e61cfdf8
ILT
1499coff_print_symbol (abfd, filep, symbol, how)
1500 bfd *abfd;
1501 PTR filep;
1502 asymbol *symbol;
1503 bfd_print_symbol_type how;
075caafd 1504{
e61cfdf8
ILT
1505 FILE *file = (FILE *) filep;
1506
1507 switch (how)
1508 {
075caafd 1509 case bfd_print_symbol_name:
e61cfdf8 1510 fprintf (file, "%s", symbol->name);
075caafd 1511 break;
e61cfdf8 1512
075caafd 1513 case bfd_print_symbol_more:
e61cfdf8
ILT
1514 fprintf (file, "coff %s %s",
1515 coffsymbol(symbol)->native ? "n" : "g",
1516 coffsymbol(symbol)->lineno ? "l" : " ");
075caafd 1517 break;
075caafd 1518
e61cfdf8 1519 case bfd_print_symbol_all:
075caafd 1520 if (coffsymbol(symbol)->native)
075caafd 1521 {
e61cfdf8
ILT
1522 unsigned int aux;
1523 combined_entry_type *combined = coffsymbol (symbol)->native;
1524 combined_entry_type *root = obj_raw_syments (abfd);
1525 struct lineno_cache_entry *l = coffsymbol(symbol)->lineno;
1526
1527 fprintf (file,"[%3d]", combined - root);
1528
1529 fprintf (file,
4c3721d5 1530 "(sc %2d)(fl 0x%02x)(ty %3x)(sc %3d) (nx %d) 0x%08lx %s",
e61cfdf8
ILT
1531 combined->u.syment.n_scnum,
1532 combined->u.syment.n_flags,
1533 combined->u.syment.n_type,
1534 combined->u.syment.n_sclass,
1535 combined->u.syment.n_numaux,
4c3721d5 1536 (unsigned long) combined->u.syment.n_value,
e61cfdf8
ILT
1537 symbol->name);
1538
1539 for (aux = 0; aux < combined->u.syment.n_numaux; aux++)
1540 {
1541 combined_entry_type *auxp = combined + aux + 1;
1542 long tagndx;
1543
1544 if (auxp->fix_tag)
1545 tagndx = auxp->u.auxent.x_sym.x_tagndx.p - root;
1546 else
1547 tagndx = auxp->u.auxent.x_sym.x_tagndx.l;
1548
1549 fprintf (file, "\n");
1550 switch (combined->u.syment.n_sclass)
1551 {
1552 case C_FILE:
1553 fprintf (file, "File ");
1554 break;
1555 default:
1556
4c3721d5 1557 fprintf (file, "AUX lnno %d size 0x%x tagndx %ld",
e61cfdf8
ILT
1558 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_lnno,
1559 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_size,
1560 tagndx);
1561 break;
1562 }
075caafd 1563 }
075caafd 1564
e61cfdf8
ILT
1565 if (l)
1566 {
e4b6b3e7 1567 fprintf (file, "\n%s :", l->u.sym->name);
e61cfdf8
ILT
1568 l++;
1569 while (l->line_number)
1570 {
4c3721d5
ILT
1571 fprintf (file, "\n%4d : 0x%lx",
1572 l->line_number,
1573 ((unsigned long)
1574 (l->u.offset + symbol->section->vma)));
e61cfdf8
ILT
1575 l++;
1576 }
1577 }
1578 }
1579 else
075caafd 1580 {
e61cfdf8
ILT
1581 bfd_print_symbol_vandf ((PTR) file, symbol);
1582 fprintf (file, " %-5s %s %s %s",
1583 symbol->section->name,
1584 coffsymbol(symbol)->native ? "n" : "g",
1585 coffsymbol(symbol)->lineno ? "l" : " ",
1586 symbol->name);
075caafd 1587 }
075caafd
ILT
1588 }
1589}
1590
1591/* Provided a BFD, a section and an offset into the section, calculate
1592 and return the name of the source file and the line nearest to the
1593 wanted location. */
1594
330595d0 1595/*ARGSUSED*/
075caafd 1596boolean
25057836
JL
1597coff_find_nearest_line (abfd, section, ignore_symbols, offset, filename_ptr,
1598 functionname_ptr, line_ptr)
1599 bfd *abfd;
1600 asection *section;
1601 asymbol **ignore_symbols;
1602 bfd_vma offset;
1603 CONST char **filename_ptr;
1604 CONST char **functionname_ptr;
1605 unsigned int *line_ptr;
075caafd
ILT
1606{
1607 static bfd *cache_abfd;
1608 static asection *cache_section;
1609 static bfd_vma cache_offset;
1610 static unsigned int cache_i;
85fe7cff
PB
1611 static CONST char *cache_function;
1612 static unsigned int line_base = 0;
075caafd 1613
a74d1517 1614 unsigned int i;
075caafd
ILT
1615 coff_data_type *cof = coff_data(abfd);
1616 /* Run through the raw syments if available */
1617 combined_entry_type *p;
a74d1517 1618 combined_entry_type *pend;
075caafd 1619 alent *l;
075caafd
ILT
1620
1621
1622 *filename_ptr = 0;
1623 *functionname_ptr = 0;
1624 *line_ptr = 0;
1625
1626 /* Don't try and find line numbers in a non coff file */
1627 if (abfd->xvec->flavour != bfd_target_coff_flavour)
1628 return false;
1629
1630 if (cof == NULL)
1631 return false;
1632
a74d1517 1633 /* Find the first C_FILE symbol. */
075caafd 1634 p = cof->raw_syments;
a74d1517
ILT
1635 pend = p + cof->raw_syment_count;
1636 while (p < pend)
1637 {
1638 if (p->u.syment.n_sclass == C_FILE)
1639 break;
1640 p += 1 + p->u.syment.n_numaux;
1641 }
075caafd 1642
a74d1517
ILT
1643 if (p < pend)
1644 {
1645 /* Look through the C_FILE symbols to find the best one. */
075caafd 1646 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
a74d1517
ILT
1647 i = 0;
1648 while (1)
1649 {
1650 combined_entry_type *p2;
1651
1652 /* Avoid endless loops on erroneous files by ensuring that
1653 we always move forward in the file. */
1654 if (i >= p->u.syment.n_value)
1655 break;
1656
1657 i = p->u.syment.n_value;
1658 if (i >= cof->raw_syment_count)
1659 break;
1660
1661 p = cof->raw_syments + i;
1662 if (p->u.syment.n_sclass != C_FILE)
1663 break;
1664
1665 for (p2 = p; p2 < pend; p2 += 1 + p2->u.syment.n_numaux)
1666 {
1667 if (section ==
1668 coff_section_from_bfd_index (abfd, p2->u.syment.n_scnum))
1669 break;
1670 }
1671 if (p2 < pend
1672 && offset < p2->u.syment.n_value)
1673 break;
1674
1675 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
1676 }
075caafd 1677 }
a74d1517 1678
075caafd
ILT
1679 /* Now wander though the raw linenumbers of the section */
1680 /*
1681 If this is the same BFD as we were previously called with and this is
1682 the same section, and the offset we want is further down then we can
1683 prime the lookup loop
1684 */
1685 if (abfd == cache_abfd &&
1686 section == cache_section &&
1687 offset >= cache_offset) {
1688 i = cache_i;
85fe7cff 1689 *functionname_ptr = cache_function;
075caafd
ILT
1690 }
1691 else {
1692 i = 0;
075caafd 1693 }
85fe7cff 1694 l = &section->lineno[i];
075caafd
ILT
1695
1696 for (; i < section->lineno_count; i++) {
1697 if (l->line_number == 0) {
1698 /* Get the symbol this line number points at */
1699 coff_symbol_type *coff = (coff_symbol_type *) (l->u.sym);
85fe7cff
PB
1700 if (coff->symbol.value > offset)
1701 break;
075caafd
ILT
1702 *functionname_ptr = coff->symbol.name;
1703 if (coff->native) {
1704 combined_entry_type *s = coff->native;
1705 s = s + 1 + s->u.syment.n_numaux;
a74d1517
ILT
1706
1707 /* In XCOFF a debugging symbol can follow the function
1708 symbol. */
1709 if (s->u.syment.n_scnum == N_DEBUG)
1710 s = s + 1 + s->u.syment.n_numaux;
1711
075caafd
ILT
1712 /*
1713 S should now point to the .bf of the function
1714 */
1715 if (s->u.syment.n_numaux) {
1716 /*
1717 The linenumber is stored in the auxent
1718 */
1719 union internal_auxent *a = &((s + 1)->u.auxent);
1720 line_base = a->x_sym.x_misc.x_lnsz.x_lnno;
85fe7cff 1721 *line_ptr = line_base;
075caafd
ILT
1722 }
1723 }
1724 }
1725 else {
a74d1517 1726 if (l->u.offset + bfd_get_section_vma (abfd, section) > offset)
075caafd 1727 break;
85fe7cff 1728 *line_ptr = l->line_number + line_base - 1;
075caafd
ILT
1729 }
1730 l++;
1731 }
1732
1733 cache_abfd = abfd;
1734 cache_section = section;
1735 cache_offset = offset;
1736 cache_i = i;
85fe7cff 1737 cache_function = *functionname_ptr;
075caafd
ILT
1738
1739 return true;
1740}
1741
1742int
25057836
JL
1743coff_sizeof_headers (abfd, reloc)
1744 bfd *abfd;
1745 boolean reloc;
075caafd
ILT
1746{
1747 size_t size;
1748
1749 if (reloc == false) {
1750 size = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
1751 }
1752 else {
1753 size = bfd_coff_filhsz (abfd);
1754 }
1755
1756 size += abfd->section_count * bfd_coff_scnhsz (abfd);
1757 return size;
1758}
This page took 0.168371 seconds and 4 git commands to generate.