include/coff/
[deliverable/binutils-gdb.git] / bfd / coffgen.c
CommitLineData
252b5132 1/* Support for the generic parts of COFF, for BFD.
7898deda 2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
88183869 3 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009
252b5132
RH
4 Free Software Foundation, Inc.
5 Written by Cygnus Support.
6
c8e7bf0d 7 This file is part of BFD, the Binary File Descriptor library.
252b5132 8
c8e7bf0d
NC
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
cd123cb7 11 the Free Software Foundation; either version 3 of the License, or
c8e7bf0d 12 (at your option) any later version.
252b5132 13
c8e7bf0d
NC
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
252b5132 18
c8e7bf0d
NC
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
cd123cb7
NC
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22 MA 02110-1301, USA. */
252b5132
RH
23
24/* Most of this hacked by Steve Chamberlain, sac@cygnus.com.
25 Split out of coffcode.h by Ian Taylor, ian@cygnus.com. */
26
27/* This file contains COFF code that is not dependent on any
28 particular COFF target. There is only one version of this file in
29 libbfd.a, so no target specific code may be put in here. Or, to
30 put it another way,
31
32 ********** DO NOT PUT TARGET SPECIFIC CODE IN THIS FILE **********
33
34 If you need to add some target specific behaviour, add a new hook
35 function to bfd_coff_backend_data.
36
37 Some of these functions are also called by the ECOFF routines.
38 Those functions may not use any COFF specific information, such as
39 coff_data (abfd). */
40
252b5132 41#include "sysdep.h"
3db64b00 42#include "bfd.h"
252b5132
RH
43#include "libbfd.h"
44#include "coff/internal.h"
45#include "libcoff.h"
46
252b5132
RH
47/* Take a section header read from a coff file (in HOST byte order),
48 and make a BFD "section" out of it. This is used by ECOFF. */
c8e7bf0d 49
b34976b6 50static bfd_boolean
c8e7bf0d
NC
51make_a_section_from_file (bfd *abfd,
52 struct internal_scnhdr *hdr,
53 unsigned int target_index)
252b5132
RH
54{
55 asection *return_section;
56 char *name;
b34976b6 57 bfd_boolean result = TRUE;
7c8ca0e4 58 flagword flags;
252b5132
RH
59
60 name = NULL;
61
88183869
DK
62 /* Handle long section names as in PE. On reading, we want to
63 accept long names if the format permits them at all, regardless
64 of the current state of the flag that dictates if we would generate
65 them in outputs; this construct checks if that is the case by
66 attempting to set the flag, without changing its state; the call
67 will fail for formats that do not support long names at all. */
68 if (bfd_coff_set_long_section_names (abfd, bfd_coff_long_section_names (abfd))
252b5132
RH
69 && hdr->s_name[0] == '/')
70 {
71 char buf[SCNNMLEN];
72 long strindex;
73 char *p;
74 const char *strings;
75
76 memcpy (buf, hdr->s_name + 1, SCNNMLEN - 1);
77 buf[SCNNMLEN - 1] = '\0';
78 strindex = strtol (buf, &p, 10);
79 if (*p == '\0' && strindex >= 0)
80 {
81 strings = _bfd_coff_read_string_table (abfd);
82 if (strings == NULL)
b34976b6 83 return FALSE;
252b5132
RH
84 /* FIXME: For extra safety, we should make sure that
85 strindex does not run us past the end, but right now we
86 don't know the length of the string table. */
87 strings += strindex;
dc810e39 88 name = bfd_alloc (abfd, (bfd_size_type) strlen (strings) + 1);
252b5132 89 if (name == NULL)
b34976b6 90 return FALSE;
252b5132
RH
91 strcpy (name, strings);
92 }
93 }
94
95 if (name == NULL)
96 {
97 /* Assorted wastage to null-terminate the name, thanks AT&T! */
dc810e39 98 name = bfd_alloc (abfd, (bfd_size_type) sizeof (hdr->s_name) + 1);
252b5132 99 if (name == NULL)
b34976b6 100 return FALSE;
252b5132
RH
101 strncpy (name, (char *) &hdr->s_name[0], sizeof (hdr->s_name));
102 name[sizeof (hdr->s_name)] = 0;
103 }
104
105 return_section = bfd_make_section_anyway (abfd, name);
106 if (return_section == NULL)
b34976b6 107 return FALSE;
252b5132
RH
108
109 return_section->vma = hdr->s_vaddr;
110 return_section->lma = hdr->s_paddr;
eea6121a 111 return_section->size = hdr->s_size;
252b5132
RH
112 return_section->filepos = hdr->s_scnptr;
113 return_section->rel_filepos = hdr->s_relptr;
114 return_section->reloc_count = hdr->s_nreloc;
115
116 bfd_coff_set_alignment_hook (abfd, return_section, hdr);
117
118 return_section->line_filepos = hdr->s_lnnoptr;
119
120 return_section->lineno_count = hdr->s_nlnno;
121 return_section->userdata = NULL;
c8e7bf0d 122 return_section->next = NULL;
252b5132 123 return_section->target_index = target_index;
7c8ca0e4
NC
124
125 if (! bfd_coff_styp_to_sec_flags_hook (abfd, hdr, name, return_section,
126 & flags))
b34976b6 127 result = FALSE;
dc810e39 128
7c8ca0e4 129 return_section->flags = flags;
252b5132
RH
130
131 /* At least on i386-coff, the line number count for a shared library
132 section must be ignored. */
133 if ((return_section->flags & SEC_COFF_SHARED_LIBRARY) != 0)
134 return_section->lineno_count = 0;
135
136 if (hdr->s_nreloc != 0)
137 return_section->flags |= SEC_RELOC;
c8e7bf0d 138 /* FIXME: should this check 'hdr->s_size > 0'. */
252b5132
RH
139 if (hdr->s_scnptr != 0)
140 return_section->flags |= SEC_HAS_CONTENTS;
7c8ca0e4
NC
141
142 return result;
252b5132
RH
143}
144
145/* Read in a COFF object and make it into a BFD. This is used by
146 ECOFF as well. */
147
148static const bfd_target *
c8e7bf0d
NC
149coff_real_object_p (bfd *abfd,
150 unsigned nscns,
151 struct internal_filehdr *internal_f,
152 struct internal_aouthdr *internal_a)
252b5132
RH
153{
154 flagword oflags = abfd->flags;
155 bfd_vma ostart = bfd_get_start_address (abfd);
c8e7bf0d
NC
156 void * tdata;
157 void * tdata_save;
158 bfd_size_type readsize; /* Length of file_info. */
252b5132
RH
159 unsigned int scnhsz;
160 char *external_sections;
161
162 if (!(internal_f->f_flags & F_RELFLG))
163 abfd->flags |= HAS_RELOC;
164 if ((internal_f->f_flags & F_EXEC))
165 abfd->flags |= EXEC_P;
166 if (!(internal_f->f_flags & F_LNNO))
167 abfd->flags |= HAS_LINENO;
168 if (!(internal_f->f_flags & F_LSYMS))
169 abfd->flags |= HAS_LOCALS;
170
171 /* FIXME: How can we set D_PAGED correctly? */
172 if ((internal_f->f_flags & F_EXEC) != 0)
173 abfd->flags |= D_PAGED;
174
175 bfd_get_symcount (abfd) = internal_f->f_nsyms;
176 if (internal_f->f_nsyms)
177 abfd->flags |= HAS_SYMS;
178
179 if (internal_a != (struct internal_aouthdr *) NULL)
180 bfd_get_start_address (abfd) = internal_a->entry;
181 else
182 bfd_get_start_address (abfd) = 0;
183
184 /* Set up the tdata area. ECOFF uses its own routine, and overrides
185 abfd->flags. */
487e54f2 186 tdata_save = abfd->tdata.any;
c8e7bf0d 187 tdata = bfd_coff_mkobject_hook (abfd, (void *) internal_f, (void *) internal_a);
252b5132 188 if (tdata == NULL)
487e54f2 189 goto fail2;
252b5132
RH
190
191 scnhsz = bfd_coff_scnhsz (abfd);
dc810e39 192 readsize = (bfd_size_type) nscns * scnhsz;
c8e7bf0d 193 external_sections = bfd_alloc (abfd, readsize);
252b5132
RH
194 if (!external_sections)
195 goto fail;
196
c8e7bf0d 197 if (bfd_bread ((void *) external_sections, readsize, abfd) != readsize)
252b5132
RH
198 goto fail;
199
363d7b14 200 /* Set the arch/mach *before* swapping in sections; section header swapping
244148ad 201 may depend on arch/mach info. */
c8e7bf0d 202 if (! bfd_coff_set_arch_mach_hook (abfd, (void *) internal_f))
363d7b14
TW
203 goto fail;
204
e16bb312 205 /* Now copy data as required; construct all asections etc. */
252b5132
RH
206 if (nscns != 0)
207 {
208 unsigned int i;
209 for (i = 0; i < nscns; i++)
210 {
211 struct internal_scnhdr tmp;
212 bfd_coff_swap_scnhdr_in (abfd,
c8e7bf0d
NC
213 (void *) (external_sections + i * scnhsz),
214 (void *) & tmp);
252b5132
RH
215 if (! make_a_section_from_file (abfd, &tmp, i + 1))
216 goto fail;
217 }
218 }
219
252b5132
RH
220 return abfd->xvec;
221
222 fail:
223 bfd_release (abfd, tdata);
487e54f2
AM
224 fail2:
225 abfd->tdata.any = tdata_save;
252b5132
RH
226 abfd->flags = oflags;
227 bfd_get_start_address (abfd) = ostart;
228 return (const bfd_target *) NULL;
229}
230
231/* Turn a COFF file into a BFD, but fail with bfd_error_wrong_format if it is
232 not a COFF file. This is also used by ECOFF. */
233
234const bfd_target *
c8e7bf0d 235coff_object_p (bfd *abfd)
252b5132 236{
dc810e39
AM
237 bfd_size_type filhsz;
238 bfd_size_type aoutsz;
239 unsigned int nscns;
c8e7bf0d 240 void * filehdr;
252b5132
RH
241 struct internal_filehdr internal_f;
242 struct internal_aouthdr internal_a;
243
c8e7bf0d 244 /* Figure out how much to read. */
252b5132
RH
245 filhsz = bfd_coff_filhsz (abfd);
246 aoutsz = bfd_coff_aoutsz (abfd);
247
248 filehdr = bfd_alloc (abfd, filhsz);
249 if (filehdr == NULL)
487e54f2 250 return NULL;
dc810e39 251 if (bfd_bread (filehdr, filhsz, abfd) != filhsz)
252b5132
RH
252 {
253 if (bfd_get_error () != bfd_error_system_call)
254 bfd_set_error (bfd_error_wrong_format);
487e54f2
AM
255 bfd_release (abfd, filehdr);
256 return NULL;
252b5132
RH
257 }
258 bfd_coff_swap_filehdr_in (abfd, filehdr, &internal_f);
259 bfd_release (abfd, filehdr);
260
b8819ab2
NC
261 /* The XCOFF format has two sizes for the f_opthdr. SMALL_AOUTSZ
262 (less than aoutsz) used in object files and AOUTSZ (equal to
263 aoutsz) in executables. The bfd_coff_swap_aouthdr_in function
264 expects this header to be aoutsz bytes in length, so we use that
265 value in the call to bfd_alloc below. But we must be careful to
266 only read in f_opthdr bytes in the call to bfd_bread. We should
267 also attempt to catch corrupt or non-COFF binaries with a strange
268 value for f_opthdr. */
82e51918 269 if (! bfd_coff_bad_format_hook (abfd, &internal_f)
95f7d9f7 270 || internal_f.f_opthdr > aoutsz)
252b5132
RH
271 {
272 bfd_set_error (bfd_error_wrong_format);
487e54f2 273 return NULL;
252b5132
RH
274 }
275 nscns = internal_f.f_nscns;
276
277 if (internal_f.f_opthdr)
278 {
c8e7bf0d 279 void * opthdr;
252b5132
RH
280
281 opthdr = bfd_alloc (abfd, aoutsz);
282 if (opthdr == NULL)
487e54f2 283 return NULL;
dc810e39 284 if (bfd_bread (opthdr, (bfd_size_type) internal_f.f_opthdr, abfd)
252b5132
RH
285 != internal_f.f_opthdr)
286 {
487e54f2
AM
287 bfd_release (abfd, opthdr);
288 return NULL;
252b5132 289 }
c8e7bf0d 290 bfd_coff_swap_aouthdr_in (abfd, opthdr, (void *) &internal_a);
487e54f2 291 bfd_release (abfd, opthdr);
252b5132
RH
292 }
293
294 return coff_real_object_p (abfd, nscns, &internal_f,
295 (internal_f.f_opthdr != 0
296 ? &internal_a
297 : (struct internal_aouthdr *) NULL));
298}
299
300/* Get the BFD section from a COFF symbol section number. */
301
302asection *
c8e7bf0d 303coff_section_from_bfd_index (bfd *abfd, int index)
252b5132 304{
198beae2 305 struct bfd_section *answer = abfd->sections;
252b5132
RH
306
307 if (index == N_ABS)
308 return bfd_abs_section_ptr;
309 if (index == N_UNDEF)
310 return bfd_und_section_ptr;
311 if (index == N_DEBUG)
312 return bfd_abs_section_ptr;
313
314 while (answer)
315 {
316 if (answer->target_index == index)
317 return answer;
318 answer = answer->next;
319 }
320
321 /* We should not reach this point, but the SCO 3.2v4 /lib/libc_s.a
322 has a bad symbol table in biglitpow.o. */
323 return bfd_und_section_ptr;
324}
325
326/* Get the upper bound of a COFF symbol table. */
327
328long
c8e7bf0d 329coff_get_symtab_upper_bound (bfd *abfd)
252b5132
RH
330{
331 if (!bfd_coff_slurp_symbol_table (abfd))
332 return -1;
333
334 return (bfd_get_symcount (abfd) + 1) * (sizeof (coff_symbol_type *));
335}
336
252b5132
RH
337/* Canonicalize a COFF symbol table. */
338
339long
c8e7bf0d 340coff_canonicalize_symtab (bfd *abfd, asymbol **alocation)
252b5132
RH
341{
342 unsigned int counter;
343 coff_symbol_type *symbase;
344 coff_symbol_type **location = (coff_symbol_type **) alocation;
345
346 if (!bfd_coff_slurp_symbol_table (abfd))
347 return -1;
348
349 symbase = obj_symbols (abfd);
350 counter = bfd_get_symcount (abfd);
351 while (counter-- > 0)
352 *location++ = symbase++;
353
354 *location = NULL;
355
356 return bfd_get_symcount (abfd);
357}
358
359/* Get the name of a symbol. The caller must pass in a buffer of size
360 >= SYMNMLEN + 1. */
361
362const char *
c8e7bf0d
NC
363_bfd_coff_internal_syment_name (bfd *abfd,
364 const struct internal_syment *sym,
365 char *buf)
252b5132
RH
366{
367 /* FIXME: It's not clear this will work correctly if sizeof
368 (_n_zeroes) != 4. */
369 if (sym->_n._n_n._n_zeroes != 0
370 || sym->_n._n_n._n_offset == 0)
371 {
372 memcpy (buf, sym->_n._n_name, SYMNMLEN);
373 buf[SYMNMLEN] = '\0';
374 return buf;
375 }
376 else
377 {
378 const char *strings;
379
380 BFD_ASSERT (sym->_n._n_n._n_offset >= STRING_SIZE_SIZE);
381 strings = obj_coff_strings (abfd);
382 if (strings == NULL)
383 {
384 strings = _bfd_coff_read_string_table (abfd);
385 if (strings == NULL)
386 return NULL;
387 }
388 return strings + sym->_n._n_n._n_offset;
389 }
390}
391
392/* Read in and swap the relocs. This returns a buffer holding the
b34976b6 393 relocs for section SEC in file ABFD. If CACHE is TRUE and
252b5132
RH
394 INTERNAL_RELOCS is NULL, the relocs read in will be saved in case
395 the function is called again. If EXTERNAL_RELOCS is not NULL, it
396 is a buffer large enough to hold the unswapped relocs. If
397 INTERNAL_RELOCS is not NULL, it is a buffer large enough to hold
b34976b6 398 the swapped relocs. If REQUIRE_INTERNAL is TRUE, then the return
252b5132
RH
399 value must be INTERNAL_RELOCS. The function returns NULL on error. */
400
401struct internal_reloc *
c8e7bf0d
NC
402_bfd_coff_read_internal_relocs (bfd *abfd,
403 asection *sec,
404 bfd_boolean cache,
405 bfd_byte *external_relocs,
406 bfd_boolean require_internal,
407 struct internal_reloc *internal_relocs)
252b5132
RH
408{
409 bfd_size_type relsz;
410 bfd_byte *free_external = NULL;
411 struct internal_reloc *free_internal = NULL;
412 bfd_byte *erel;
413 bfd_byte *erel_end;
414 struct internal_reloc *irel;
dc810e39 415 bfd_size_type amt;
252b5132 416
9d7038d3
MS
417 if (sec->reloc_count == 0)
418 return internal_relocs; /* Nothing to do. */
419
252b5132
RH
420 if (coff_section_data (abfd, sec) != NULL
421 && coff_section_data (abfd, sec)->relocs != NULL)
422 {
423 if (! require_internal)
424 return coff_section_data (abfd, sec)->relocs;
425 memcpy (internal_relocs, coff_section_data (abfd, sec)->relocs,
426 sec->reloc_count * sizeof (struct internal_reloc));
427 return internal_relocs;
428 }
429
430 relsz = bfd_coff_relsz (abfd);
431
dc810e39 432 amt = sec->reloc_count * relsz;
252b5132
RH
433 if (external_relocs == NULL)
434 {
c8e7bf0d 435 free_external = bfd_malloc (amt);
9d7038d3 436 if (free_external == NULL)
252b5132
RH
437 goto error_return;
438 external_relocs = free_external;
439 }
440
441 if (bfd_seek (abfd, sec->rel_filepos, SEEK_SET) != 0
dc810e39 442 || bfd_bread (external_relocs, amt, abfd) != amt)
252b5132
RH
443 goto error_return;
444
445 if (internal_relocs == NULL)
446 {
dc810e39
AM
447 amt = sec->reloc_count;
448 amt *= sizeof (struct internal_reloc);
c8e7bf0d 449 free_internal = bfd_malloc (amt);
9d7038d3 450 if (free_internal == NULL)
252b5132
RH
451 goto error_return;
452 internal_relocs = free_internal;
453 }
454
455 /* Swap in the relocs. */
456 erel = external_relocs;
457 erel_end = erel + relsz * sec->reloc_count;
458 irel = internal_relocs;
459 for (; erel < erel_end; erel += relsz, irel++)
c8e7bf0d 460 bfd_coff_swap_reloc_in (abfd, (void *) erel, (void *) irel);
252b5132
RH
461
462 if (free_external != NULL)
463 {
464 free (free_external);
465 free_external = NULL;
466 }
467
9ee2139f 468 if (cache && free_internal != NULL)
252b5132 469 {
9ee2139f 470 if (coff_section_data (abfd, sec) == NULL)
252b5132 471 {
9ee2139f
MS
472 amt = sizeof (struct coff_section_tdata);
473 sec->used_by_bfd = bfd_zalloc (abfd, amt);
474 if (sec->used_by_bfd == NULL)
475 goto error_return;
476 coff_section_data (abfd, sec)->contents = NULL;
252b5132 477 }
9ee2139f 478 coff_section_data (abfd, sec)->relocs = free_internal;
252b5132
RH
479 }
480
481 return internal_relocs;
482
483 error_return:
484 if (free_external != NULL)
485 free (free_external);
486 if (free_internal != NULL)
487 free (free_internal);
488 return NULL;
489}
490
491/* Set lineno_count for the output sections of a COFF file. */
492
493int
c8e7bf0d 494coff_count_linenumbers (bfd *abfd)
252b5132
RH
495{
496 unsigned int limit = bfd_get_symcount (abfd);
497 unsigned int i;
498 int total = 0;
499 asymbol **p;
500 asection *s;
501
502 if (limit == 0)
503 {
504 /* This may be from the backend linker, in which case the
505 lineno_count in the sections is correct. */
506 for (s = abfd->sections; s != NULL; s = s->next)
507 total += s->lineno_count;
508 return total;
509 }
510
511 for (s = abfd->sections; s != NULL; s = s->next)
512 BFD_ASSERT (s->lineno_count == 0);
513
514 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
515 {
516 asymbol *q_maybe = *p;
517
9bd09e22 518 if (bfd_family_coff (bfd_asymbol_bfd (q_maybe)))
252b5132
RH
519 {
520 coff_symbol_type *q = coffsymbol (q_maybe);
521
522 /* The AIX 4.1 compiler can sometimes generate line numbers
523 attached to debugging symbols. We try to simply ignore
524 those here. */
525 if (q->lineno != NULL
526 && q->symbol.section->owner != NULL)
527 {
528 /* This symbol has line numbers. Increment the owning
529 section's linenumber count. */
530 alent *l = q->lineno;
531
84c254c6 532 do
252b5132 533 {
84c254c6 534 asection * sec = q->symbol.section->output_section;
b34976b6 535
84c254c6
NC
536 /* Do not try to update fields in read-only sections. */
537 if (! bfd_is_const_section (sec))
538 sec->lineno_count ++;
539
252b5132 540 ++total;
252b5132
RH
541 ++l;
542 }
84c254c6 543 while (l->line_number != 0);
252b5132
RH
544 }
545 }
546 }
547
548 return total;
549}
550
551/* Takes a bfd and a symbol, returns a pointer to the coff specific
552 area of the symbol if there is one. */
553
252b5132 554coff_symbol_type *
c8e7bf0d
NC
555coff_symbol_from (bfd *ignore_abfd ATTRIBUTE_UNUSED,
556 asymbol *symbol)
252b5132 557{
9bd09e22 558 if (!bfd_family_coff (bfd_asymbol_bfd (symbol)))
252b5132
RH
559 return (coff_symbol_type *) NULL;
560
561 if (bfd_asymbol_bfd (symbol)->tdata.coff_obj_data == (coff_data_type *) NULL)
562 return (coff_symbol_type *) NULL;
563
564 return (coff_symbol_type *) symbol;
565}
566
567static void
c8e7bf0d
NC
568fixup_symbol_value (bfd *abfd,
569 coff_symbol_type *coff_symbol_ptr,
570 struct internal_syment *syment)
252b5132 571{
c8e7bf0d 572 /* Normalize the symbol flags. */
ac38308c
MS
573 if (coff_symbol_ptr->symbol.section
574 && bfd_is_com_section (coff_symbol_ptr->symbol.section))
252b5132 575 {
c8e7bf0d 576 /* A common symbol is undefined with a value. */
252b5132
RH
577 syment->n_scnum = N_UNDEF;
578 syment->n_value = coff_symbol_ptr->symbol.value;
579 }
703153b5
ILT
580 else if ((coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) != 0
581 && (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING_RELOC) == 0)
252b5132
RH
582 {
583 syment->n_value = coff_symbol_ptr->symbol.value;
584 }
585 else if (bfd_is_und_section (coff_symbol_ptr->symbol.section))
586 {
587 syment->n_scnum = N_UNDEF;
588 syment->n_value = 0;
589 }
7bb9db4d 590 /* FIXME: Do we need to handle the absolute section here? */
252b5132
RH
591 else
592 {
593 if (coff_symbol_ptr->symbol.section)
594 {
595 syment->n_scnum =
596 coff_symbol_ptr->symbol.section->output_section->target_index;
597
598 syment->n_value = (coff_symbol_ptr->symbol.value
599 + coff_symbol_ptr->symbol.section->output_offset);
600 if (! obj_pe (abfd))
34cbe64e
TW
601 {
602 syment->n_value += (syment->n_sclass == C_STATLAB)
603 ? coff_symbol_ptr->symbol.section->output_section->lma
604 : coff_symbol_ptr->symbol.section->output_section->vma;
605 }
252b5132
RH
606 }
607 else
608 {
609 BFD_ASSERT (0);
610 /* This can happen, but I don't know why yet (steve@cygnus.com) */
611 syment->n_scnum = N_ABS;
612 syment->n_value = coff_symbol_ptr->symbol.value;
613 }
614 }
615}
616
617/* Run through all the symbols in the symbol table and work out what
618 their indexes into the symbol table will be when output.
619
620 Coff requires that each C_FILE symbol points to the next one in the
621 chain, and that the last one points to the first external symbol. We
622 do that here too. */
623
b34976b6 624bfd_boolean
c8e7bf0d 625coff_renumber_symbols (bfd *bfd_ptr, int *first_undef)
252b5132
RH
626{
627 unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
628 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
629 unsigned int native_index = 0;
c8e7bf0d 630 struct internal_syment *last_file = NULL;
252b5132
RH
631 unsigned int symbol_index;
632
633 /* COFF demands that undefined symbols come after all other symbols.
634 Since we don't need to impose this extra knowledge on all our
635 client programs, deal with that here. Sort the symbol table;
636 just move the undefined symbols to the end, leaving the rest
637 alone. The O'Reilly book says that defined global symbols come
638 at the end before the undefined symbols, so we do that here as
639 well. */
640 /* @@ Do we have some condition we could test for, so we don't always
641 have to do this? I don't think relocatability is quite right, but
642 I'm not certain. [raeburn:19920508.1711EST] */
643 {
644 asymbol **newsyms;
645 unsigned int i;
dc810e39 646 bfd_size_type amt;
252b5132 647
dc810e39 648 amt = sizeof (asymbol *) * ((bfd_size_type) symbol_count + 1);
c8e7bf0d 649 newsyms = bfd_alloc (bfd_ptr, amt);
252b5132 650 if (!newsyms)
b34976b6 651 return FALSE;
252b5132
RH
652 bfd_ptr->outsymbols = newsyms;
653 for (i = 0; i < symbol_count; i++)
654 if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) != 0
655 || (!bfd_is_und_section (symbol_ptr_ptr[i]->section)
656 && !bfd_is_com_section (symbol_ptr_ptr[i]->section)
657 && ((symbol_ptr_ptr[i]->flags & BSF_FUNCTION) != 0
658 || ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_WEAK))
659 == 0))))
660 *newsyms++ = symbol_ptr_ptr[i];
661
662 for (i = 0; i < symbol_count; i++)
663 if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0
664 && !bfd_is_und_section (symbol_ptr_ptr[i]->section)
665 && (bfd_is_com_section (symbol_ptr_ptr[i]->section)
666 || ((symbol_ptr_ptr[i]->flags & BSF_FUNCTION) == 0
667 && ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_WEAK))
668 != 0))))
669 *newsyms++ = symbol_ptr_ptr[i];
670
671 *first_undef = newsyms - bfd_ptr->outsymbols;
672
673 for (i = 0; i < symbol_count; i++)
674 if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0
675 && bfd_is_und_section (symbol_ptr_ptr[i]->section))
676 *newsyms++ = symbol_ptr_ptr[i];
677 *newsyms = (asymbol *) NULL;
678 symbol_ptr_ptr = bfd_ptr->outsymbols;
679 }
680
681 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
682 {
683 coff_symbol_type *coff_symbol_ptr = coff_symbol_from (bfd_ptr, symbol_ptr_ptr[symbol_index]);
244148ad 684 symbol_ptr_ptr[symbol_index]->udata.i = symbol_index;
252b5132
RH
685 if (coff_symbol_ptr && coff_symbol_ptr->native)
686 {
687 combined_entry_type *s = coff_symbol_ptr->native;
688 int i;
689
690 if (s->u.syment.n_sclass == C_FILE)
691 {
c8e7bf0d 692 if (last_file != NULL)
252b5132
RH
693 last_file->n_value = native_index;
694 last_file = &(s->u.syment);
695 }
696 else
c8e7bf0d
NC
697 /* Modify the symbol values according to their section and
698 type. */
699 fixup_symbol_value (bfd_ptr, coff_symbol_ptr, &(s->u.syment));
252b5132 700
252b5132
RH
701 for (i = 0; i < s->u.syment.n_numaux + 1; i++)
702 s[i].offset = native_index++;
703 }
704 else
c8e7bf0d 705 native_index++;
252b5132 706 }
c8e7bf0d 707
252b5132
RH
708 obj_conv_table_size (bfd_ptr) = native_index;
709
b34976b6 710 return TRUE;
252b5132
RH
711}
712
713/* Run thorough the symbol table again, and fix it so that all
714 pointers to entries are changed to the entries' index in the output
715 symbol table. */
716
717void
c8e7bf0d 718coff_mangle_symbols (bfd *bfd_ptr)
252b5132
RH
719{
720 unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
721 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
722 unsigned int symbol_index;
723
724 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
725 {
726 coff_symbol_type *coff_symbol_ptr =
727 coff_symbol_from (bfd_ptr, symbol_ptr_ptr[symbol_index]);
728
729 if (coff_symbol_ptr && coff_symbol_ptr->native)
730 {
731 int i;
732 combined_entry_type *s = coff_symbol_ptr->native;
733
734 if (s->fix_value)
735 {
736 /* FIXME: We should use a union here. */
dc810e39 737 s->u.syment.n_value =
d2df793a
NC
738 (bfd_hostptr_t) ((combined_entry_type *)
739 ((bfd_hostptr_t) s->u.syment.n_value))->offset;
252b5132
RH
740 s->fix_value = 0;
741 }
742 if (s->fix_line)
743 {
744 /* The value is the offset into the line number entries
745 for the symbol's section. On output, the symbol's
746 section should be N_DEBUG. */
747 s->u.syment.n_value =
748 (coff_symbol_ptr->symbol.section->output_section->line_filepos
749 + s->u.syment.n_value * bfd_coff_linesz (bfd_ptr));
750 coff_symbol_ptr->symbol.section =
751 coff_section_from_bfd_index (bfd_ptr, N_DEBUG);
752 BFD_ASSERT (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING);
753 }
754 for (i = 0; i < s->u.syment.n_numaux; i++)
755 {
756 combined_entry_type *a = s + i + 1;
757 if (a->fix_tag)
758 {
759 a->u.auxent.x_sym.x_tagndx.l =
760 a->u.auxent.x_sym.x_tagndx.p->offset;
761 a->fix_tag = 0;
762 }
763 if (a->fix_end)
764 {
765 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l =
766 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p->offset;
767 a->fix_end = 0;
768 }
769 if (a->fix_scnlen)
770 {
771 a->u.auxent.x_csect.x_scnlen.l =
772 a->u.auxent.x_csect.x_scnlen.p->offset;
773 a->fix_scnlen = 0;
774 }
775 }
776 }
777 }
778}
779
780static void
c8e7bf0d
NC
781coff_fix_symbol_name (bfd *abfd,
782 asymbol *symbol,
783 combined_entry_type *native,
784 bfd_size_type *string_size_p,
785 asection **debug_string_section_p,
786 bfd_size_type *debug_string_size_p)
252b5132
RH
787{
788 unsigned int name_length;
789 union internal_auxent *auxent;
790 char *name = (char *) (symbol->name);
791
c8e7bf0d 792 if (name == NULL)
252b5132 793 {
c8e7bf0d 794 /* COFF symbols always have names, so we'll make one up. */
252b5132
RH
795 symbol->name = "strange";
796 name = (char *) symbol->name;
797 }
798 name_length = strlen (name);
799
800 if (native->u.syment.n_sclass == C_FILE
801 && native->u.syment.n_numaux > 0)
802 {
692b7d62
ILT
803 unsigned int filnmlen;
804
7f6d05e8
CP
805 if (bfd_coff_force_symnames_in_strings (abfd))
806 {
244148ad 807 native->u.syment._n._n_n._n_offset =
7f6d05e8
CP
808 (*string_size_p + STRING_SIZE_SIZE);
809 native->u.syment._n._n_n._n_zeroes = 0;
810 *string_size_p += 6; /* strlen(".file") + 1 */
811 }
812 else
813 strncpy (native->u.syment._n._n_name, ".file", SYMNMLEN);
814
252b5132
RH
815 auxent = &(native + 1)->u.auxent;
816
692b7d62
ILT
817 filnmlen = bfd_coff_filnmlen (abfd);
818
252b5132
RH
819 if (bfd_coff_long_filenames (abfd))
820 {
692b7d62 821 if (name_length <= filnmlen)
c8e7bf0d 822 strncpy (auxent->x_file.x_fname, name, filnmlen);
252b5132
RH
823 else
824 {
825 auxent->x_file.x_n.x_offset = *string_size_p + STRING_SIZE_SIZE;
826 auxent->x_file.x_n.x_zeroes = 0;
827 *string_size_p += name_length + 1;
828 }
829 }
830 else
831 {
692b7d62
ILT
832 strncpy (auxent->x_file.x_fname, name, filnmlen);
833 if (name_length > filnmlen)
834 name[filnmlen] = '\0';
252b5132
RH
835 }
836 }
837 else
838 {
7f6d05e8 839 if (name_length <= SYMNMLEN && !bfd_coff_force_symnames_in_strings (abfd))
c8e7bf0d
NC
840 /* This name will fit into the symbol neatly. */
841 strncpy (native->u.syment._n._n_name, symbol->name, SYMNMLEN);
842
252b5132
RH
843 else if (!bfd_coff_symname_in_debug (abfd, &native->u.syment))
844 {
845 native->u.syment._n._n_n._n_offset = (*string_size_p
846 + STRING_SIZE_SIZE);
847 native->u.syment._n._n_n._n_zeroes = 0;
848 *string_size_p += name_length + 1;
849 }
850 else
851 {
dc810e39 852 file_ptr filepos;
7f6d05e8
CP
853 bfd_byte buf[4];
854 int prefix_len = bfd_coff_debug_string_prefix_length (abfd);
252b5132
RH
855
856 /* This name should be written into the .debug section. For
857 some reason each name is preceded by a two byte length
858 and also followed by a null byte. FIXME: We assume that
859 the .debug section has already been created, and that it
860 is large enough. */
861 if (*debug_string_section_p == (asection *) NULL)
862 *debug_string_section_p = bfd_get_section_by_name (abfd, ".debug");
863 filepos = bfd_tell (abfd);
7f6d05e8 864 if (prefix_len == 4)
dc810e39 865 bfd_put_32 (abfd, (bfd_vma) (name_length + 1), buf);
7f6d05e8 866 else
dc810e39 867 bfd_put_16 (abfd, (bfd_vma) (name_length + 1), buf);
7f6d05e8 868
252b5132
RH
869 if (!bfd_set_section_contents (abfd,
870 *debug_string_section_p,
c8e7bf0d 871 (void *) buf,
252b5132 872 (file_ptr) *debug_string_size_p,
7f6d05e8 873 (bfd_size_type) prefix_len)
252b5132
RH
874 || !bfd_set_section_contents (abfd,
875 *debug_string_section_p,
c8e7bf0d 876 (void *) symbol->name,
dc810e39
AM
877 (file_ptr) (*debug_string_size_p
878 + prefix_len),
252b5132
RH
879 (bfd_size_type) name_length + 1))
880 abort ();
881 if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
882 abort ();
244148ad 883 native->u.syment._n._n_n._n_offset =
7f6d05e8 884 *debug_string_size_p + prefix_len;
252b5132 885 native->u.syment._n._n_n._n_zeroes = 0;
7f6d05e8 886 *debug_string_size_p += name_length + 1 + prefix_len;
252b5132
RH
887 }
888 }
889}
890
891/* We need to keep track of the symbol index so that when we write out
892 the relocs we can get the index for a symbol. This method is a
893 hack. FIXME. */
894
895#define set_index(symbol, idx) ((symbol)->udata.i = (idx))
896
897/* Write a symbol out to a COFF file. */
898
b34976b6 899static bfd_boolean
c8e7bf0d
NC
900coff_write_symbol (bfd *abfd,
901 asymbol *symbol,
902 combined_entry_type *native,
903 bfd_vma *written,
904 bfd_size_type *string_size_p,
905 asection **debug_string_section_p,
906 bfd_size_type *debug_string_size_p)
252b5132
RH
907{
908 unsigned int numaux = native->u.syment.n_numaux;
909 int type = native->u.syment.n_type;
910 int class = native->u.syment.n_sclass;
c8e7bf0d 911 void * buf;
252b5132
RH
912 bfd_size_type symesz;
913
914 if (native->u.syment.n_sclass == C_FILE)
915 symbol->flags |= BSF_DEBUGGING;
916
917 if (symbol->flags & BSF_DEBUGGING
918 && bfd_is_abs_section (symbol->section))
c8e7bf0d
NC
919 native->u.syment.n_scnum = N_DEBUG;
920
252b5132 921 else if (bfd_is_abs_section (symbol->section))
c8e7bf0d
NC
922 native->u.syment.n_scnum = N_ABS;
923
252b5132 924 else if (bfd_is_und_section (symbol->section))
c8e7bf0d
NC
925 native->u.syment.n_scnum = N_UNDEF;
926
252b5132 927 else
c8e7bf0d
NC
928 native->u.syment.n_scnum =
929 symbol->section->output_section->target_index;
252b5132
RH
930
931 coff_fix_symbol_name (abfd, symbol, native, string_size_p,
932 debug_string_section_p, debug_string_size_p);
933
934 symesz = bfd_coff_symesz (abfd);
935 buf = bfd_alloc (abfd, symesz);
936 if (!buf)
b34976b6 937 return FALSE;
252b5132 938 bfd_coff_swap_sym_out (abfd, &native->u.syment, buf);
dc810e39 939 if (bfd_bwrite (buf, symesz, abfd) != symesz)
b34976b6 940 return FALSE;
252b5132
RH
941 bfd_release (abfd, buf);
942
943 if (native->u.syment.n_numaux > 0)
944 {
945 bfd_size_type auxesz;
946 unsigned int j;
947
948 auxesz = bfd_coff_auxesz (abfd);
949 buf = bfd_alloc (abfd, auxesz);
950 if (!buf)
b34976b6 951 return FALSE;
252b5132
RH
952 for (j = 0; j < native->u.syment.n_numaux; j++)
953 {
954 bfd_coff_swap_aux_out (abfd,
955 &((native + j + 1)->u.auxent),
c8e7bf0d 956 type, class, (int) j,
252b5132
RH
957 native->u.syment.n_numaux,
958 buf);
dc810e39 959 if (bfd_bwrite (buf, auxesz, abfd) != auxesz)
b34976b6 960 return FALSE;
252b5132
RH
961 }
962 bfd_release (abfd, buf);
963 }
964
965 /* Store the index for use when we write out the relocs. */
966 set_index (symbol, *written);
967
968 *written += numaux + 1;
b34976b6 969 return TRUE;
252b5132
RH
970}
971
972/* Write out a symbol to a COFF file that does not come from a COFF
973 file originally. This symbol may have been created by the linker,
974 or we may be linking a non COFF file to a COFF file. */
975
b34976b6 976static bfd_boolean
c8e7bf0d
NC
977coff_write_alien_symbol (bfd *abfd,
978 asymbol *symbol,
979 bfd_vma *written,
980 bfd_size_type *string_size_p,
981 asection **debug_string_section_p,
982 bfd_size_type *debug_string_size_p)
252b5132
RH
983{
984 combined_entry_type *native;
985 combined_entry_type dummy;
986
987 native = &dummy;
988 native->u.syment.n_type = T_NULL;
989 native->u.syment.n_flags = 0;
990 if (bfd_is_und_section (symbol->section))
991 {
992 native->u.syment.n_scnum = N_UNDEF;
993 native->u.syment.n_value = symbol->value;
994 }
995 else if (bfd_is_com_section (symbol->section))
996 {
997 native->u.syment.n_scnum = N_UNDEF;
998 native->u.syment.n_value = symbol->value;
999 }
1000 else if (symbol->flags & BSF_DEBUGGING)
1001 {
1002 /* There isn't much point to writing out a debugging symbol
1003 unless we are prepared to convert it into COFF debugging
1004 format. So, we just ignore them. We must clobber the symbol
1005 name to keep it from being put in the string table. */
1006 symbol->name = "";
b34976b6 1007 return TRUE;
252b5132
RH
1008 }
1009 else
1010 {
1011 native->u.syment.n_scnum =
1012 symbol->section->output_section->target_index;
1013 native->u.syment.n_value = (symbol->value
1014 + symbol->section->output_offset);
1015 if (! obj_pe (abfd))
1016 native->u.syment.n_value += symbol->section->output_section->vma;
1017
08da05b0 1018 /* Copy the any flags from the file header into the symbol.
252b5132
RH
1019 FIXME: Why? */
1020 {
1021 coff_symbol_type *c = coff_symbol_from (abfd, symbol);
1022 if (c != (coff_symbol_type *) NULL)
1023 native->u.syment.n_flags = bfd_asymbol_bfd (&c->symbol)->flags;
1024 }
1025 }
1026
1027 native->u.syment.n_type = 0;
1028 if (symbol->flags & BSF_LOCAL)
1029 native->u.syment.n_sclass = C_STAT;
1030 else if (symbol->flags & BSF_WEAK)
1031 native->u.syment.n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT;
1032 else
1033 native->u.syment.n_sclass = C_EXT;
1034 native->u.syment.n_numaux = 0;
1035
1036 return coff_write_symbol (abfd, symbol, native, written, string_size_p,
1037 debug_string_section_p, debug_string_size_p);
1038}
1039
1040/* Write a native symbol to a COFF file. */
1041
b34976b6 1042static bfd_boolean
c8e7bf0d
NC
1043coff_write_native_symbol (bfd *abfd,
1044 coff_symbol_type *symbol,
1045 bfd_vma *written,
1046 bfd_size_type *string_size_p,
1047 asection **debug_string_section_p,
1048 bfd_size_type *debug_string_size_p)
252b5132
RH
1049{
1050 combined_entry_type *native = symbol->native;
1051 alent *lineno = symbol->lineno;
1052
1053 /* If this symbol has an associated line number, we must store the
1054 symbol index in the line number field. We also tag the auxent to
1055 point to the right place in the lineno table. */
1056 if (lineno && !symbol->done_lineno && symbol->symbol.section->owner != NULL)
1057 {
1058 unsigned int count = 0;
c8e7bf0d 1059
252b5132
RH
1060 lineno[count].u.offset = *written;
1061 if (native->u.syment.n_numaux)
1062 {
1063 union internal_auxent *a = &((native + 1)->u.auxent);
1064
1065 a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
1066 symbol->symbol.section->output_section->moving_line_filepos;
1067 }
1068
1069 /* Count and relocate all other linenumbers. */
1070 count++;
1071 while (lineno[count].line_number != 0)
1072 {
252b5132
RH
1073 lineno[count].u.offset +=
1074 (symbol->symbol.section->output_section->vma
1075 + symbol->symbol.section->output_offset);
252b5132
RH
1076 count++;
1077 }
b34976b6 1078 symbol->done_lineno = TRUE;
252b5132 1079
84c254c6
NC
1080 if (! bfd_is_const_section (symbol->symbol.section->output_section))
1081 symbol->symbol.section->output_section->moving_line_filepos +=
1082 count * bfd_coff_linesz (abfd);
252b5132
RH
1083 }
1084
1085 return coff_write_symbol (abfd, &(symbol->symbol), native, written,
1086 string_size_p, debug_string_section_p,
1087 debug_string_size_p);
1088}
1089
e144674a
NC
1090static void
1091null_error_handler (const char * fmt ATTRIBUTE_UNUSED, ...)
1092{
1093}
1094
252b5132
RH
1095/* Write out the COFF symbols. */
1096
b34976b6 1097bfd_boolean
c8e7bf0d 1098coff_write_symbols (bfd *abfd)
252b5132
RH
1099{
1100 bfd_size_type string_size;
1101 asection *debug_string_section;
1102 bfd_size_type debug_string_size;
1103 unsigned int i;
1104 unsigned int limit = bfd_get_symcount (abfd);
f075ee0c 1105 bfd_vma written = 0;
252b5132
RH
1106 asymbol **p;
1107
1108 string_size = 0;
1109 debug_string_section = NULL;
1110 debug_string_size = 0;
1111
1112 /* If this target supports long section names, they must be put into
1113 the string table. This is supported by PE. This code must
1114 handle section names just as they are handled in
1115 coff_write_object_contents. */
1116 if (bfd_coff_long_section_names (abfd))
1117 {
1118 asection *o;
1119
1120 for (o = abfd->sections; o != NULL; o = o->next)
1121 {
1122 size_t len;
1123
1124 len = strlen (o->name);
1125 if (len > SCNNMLEN)
1126 string_size += len + 1;
1127 }
1128 }
1129
c8e7bf0d 1130 /* Seek to the right place. */
252b5132 1131 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0)
b34976b6 1132 return FALSE;
252b5132 1133
c8e7bf0d 1134 /* Output all the symbols we have. */
252b5132
RH
1135 written = 0;
1136 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
1137 {
1138 asymbol *symbol = *p;
1139 coff_symbol_type *c_symbol = coff_symbol_from (abfd, symbol);
1140
1141 if (c_symbol == (coff_symbol_type *) NULL
1142 || c_symbol->native == (combined_entry_type *) NULL)
1143 {
1144 if (!coff_write_alien_symbol (abfd, symbol, &written, &string_size,
1145 &debug_string_section,
1146 &debug_string_size))
b34976b6 1147 return FALSE;
252b5132
RH
1148 }
1149 else
1150 {
e144674a
NC
1151 if (coff_backend_info (abfd)->_bfd_coff_classify_symbol != NULL)
1152 {
1153 bfd_error_handler_type current_error_handler;
1154 enum coff_symbol_classification class;
1155 unsigned char *n_sclass;
1156
1157 /* Suppress error reporting by bfd_coff_classify_symbol.
1158 Error messages can be generated when we are processing a local
1159 symbol which has no associated section and we do not have to
1160 worry about this, all we need to know is that it is local. */
1161 current_error_handler = bfd_set_error_handler (null_error_handler);
1162 class = bfd_coff_classify_symbol (abfd, &c_symbol->native->u.syment);
1163 (void) bfd_set_error_handler (current_error_handler);
1164
1165 n_sclass = &c_symbol->native->u.syment.n_sclass;
1166
1167 /* If the symbol class has been changed (eg objcopy/ld script/etc)
1168 we cannot retain the existing sclass from the original symbol.
1169 Weak symbols only have one valid sclass, so just set it always.
1170 If it is not local class and should be, set it C_STAT.
1171 If it is global and not classified as global, or if it is
1172 weak (which is also classified as global), set it C_EXT. */
1173
1174 if (symbol->flags & BSF_WEAK)
1175 *n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT;
1176 else if (symbol->flags & BSF_LOCAL && class != COFF_SYMBOL_LOCAL)
1177 *n_sclass = C_STAT;
1178 else if (symbol->flags & BSF_GLOBAL
1179 && (class != COFF_SYMBOL_GLOBAL
1180#ifdef COFF_WITH_PE
1181 || *n_sclass == C_NT_WEAK
1182#endif
1183 || *n_sclass == C_WEAKEXT))
1184 c_symbol->native->u.syment.n_sclass = C_EXT;
1185 }
1186
252b5132
RH
1187 if (!coff_write_native_symbol (abfd, c_symbol, &written,
1188 &string_size, &debug_string_section,
1189 &debug_string_size))
b34976b6 1190 return FALSE;
252b5132
RH
1191 }
1192 }
1193
1194 obj_raw_syment_count (abfd) = written;
1195
c8e7bf0d 1196 /* Now write out strings. */
252b5132
RH
1197 if (string_size != 0)
1198 {
1199 unsigned int size = string_size + STRING_SIZE_SIZE;
1200 bfd_byte buffer[STRING_SIZE_SIZE];
1201
1202#if STRING_SIZE_SIZE == 4
dc810e39 1203 H_PUT_32 (abfd, size, buffer);
252b5132 1204#else
dc810e39 1205 #error Change H_PUT_32
252b5132 1206#endif
c8e7bf0d 1207 if (bfd_bwrite ((void *) buffer, (bfd_size_type) sizeof (buffer), abfd)
dc810e39 1208 != sizeof (buffer))
b34976b6 1209 return FALSE;
252b5132
RH
1210
1211 /* Handle long section names. This code must handle section
1212 names just as they are handled in coff_write_object_contents. */
1213 if (bfd_coff_long_section_names (abfd))
1214 {
1215 asection *o;
1216
1217 for (o = abfd->sections; o != NULL; o = o->next)
1218 {
1219 size_t len;
1220
1221 len = strlen (o->name);
1222 if (len > SCNNMLEN)
1223 {
dc810e39
AM
1224 if (bfd_bwrite (o->name, (bfd_size_type) (len + 1), abfd)
1225 != len + 1)
b34976b6 1226 return FALSE;
252b5132
RH
1227 }
1228 }
1229 }
1230
1231 for (p = abfd->outsymbols, i = 0;
1232 i < limit;
1233 i++, p++)
1234 {
1235 asymbol *q = *p;
1236 size_t name_length = strlen (q->name);
1237 coff_symbol_type *c_symbol = coff_symbol_from (abfd, q);
1238 size_t maxlen;
1239
1240 /* Figure out whether the symbol name should go in the string
1241 table. Symbol names that are short enough are stored
1242 directly in the syment structure. File names permit a
1243 different, longer, length in the syment structure. On
1244 XCOFF, some symbol names are stored in the .debug section
1245 rather than in the string table. */
1246
1247 if (c_symbol == NULL
1248 || c_symbol->native == NULL)
c8e7bf0d
NC
1249 /* This is not a COFF symbol, so it certainly is not a
1250 file name, nor does it go in the .debug section. */
1251 maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
1252
252b5132
RH
1253 else if (bfd_coff_symname_in_debug (abfd,
1254 &c_symbol->native->u.syment))
c8e7bf0d
NC
1255 /* This symbol name is in the XCOFF .debug section.
1256 Don't write it into the string table. */
1257 maxlen = name_length;
1258
252b5132
RH
1259 else if (c_symbol->native->u.syment.n_sclass == C_FILE
1260 && c_symbol->native->u.syment.n_numaux > 0)
7f6d05e8 1261 {
244148ad 1262 if (bfd_coff_force_symnames_in_strings (abfd))
dc810e39
AM
1263 {
1264 if (bfd_bwrite (".file", (bfd_size_type) 6, abfd) != 6)
b34976b6 1265 return FALSE;
dc810e39 1266 }
7f6d05e8
CP
1267 maxlen = bfd_coff_filnmlen (abfd);
1268 }
252b5132 1269 else
7f6d05e8 1270 maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
252b5132
RH
1271
1272 if (name_length > maxlen)
1273 {
c8e7bf0d 1274 if (bfd_bwrite ((void *) (q->name), (bfd_size_type) name_length + 1,
dc810e39 1275 abfd) != name_length + 1)
b34976b6 1276 return FALSE;
252b5132
RH
1277 }
1278 }
1279 }
1280 else
1281 {
1282 /* We would normally not write anything here, but we'll write
1283 out 4 so that any stupid coff reader which tries to read the
1284 string table even when there isn't one won't croak. */
1285 unsigned int size = STRING_SIZE_SIZE;
1286 bfd_byte buffer[STRING_SIZE_SIZE];
1287
1288#if STRING_SIZE_SIZE == 4
dc810e39 1289 H_PUT_32 (abfd, size, buffer);
252b5132 1290#else
dc810e39 1291 #error Change H_PUT_32
252b5132 1292#endif
c8e7bf0d 1293 if (bfd_bwrite ((void *) buffer, (bfd_size_type) STRING_SIZE_SIZE, abfd)
252b5132 1294 != STRING_SIZE_SIZE)
b34976b6 1295 return FALSE;
252b5132
RH
1296 }
1297
1298 /* Make sure the .debug section was created to be the correct size.
1299 We should create it ourselves on the fly, but we don't because
1300 BFD won't let us write to any section until we know how large all
1301 the sections are. We could still do it by making another pass
1302 over the symbols. FIXME. */
1303 BFD_ASSERT (debug_string_size == 0
1304 || (debug_string_section != (asection *) NULL
1305 && (BFD_ALIGN (debug_string_size,
1306 1 << debug_string_section->alignment_power)
eea6121a 1307 == debug_string_section->size)));
252b5132 1308
b34976b6 1309 return TRUE;
252b5132
RH
1310}
1311
b34976b6 1312bfd_boolean
c8e7bf0d 1313coff_write_linenumbers (bfd *abfd)
252b5132
RH
1314{
1315 asection *s;
1316 bfd_size_type linesz;
c8e7bf0d 1317 void * buff;
252b5132
RH
1318
1319 linesz = bfd_coff_linesz (abfd);
1320 buff = bfd_alloc (abfd, linesz);
1321 if (!buff)
b34976b6 1322 return FALSE;
252b5132
RH
1323 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
1324 {
1325 if (s->lineno_count)
1326 {
1327 asymbol **q = abfd->outsymbols;
1328 if (bfd_seek (abfd, s->line_filepos, SEEK_SET) != 0)
b34976b6 1329 return FALSE;
c8e7bf0d 1330 /* Find all the linenumbers in this section. */
252b5132
RH
1331 while (*q)
1332 {
1333 asymbol *p = *q;
1334 if (p->section->output_section == s)
1335 {
1336 alent *l =
1337 BFD_SEND (bfd_asymbol_bfd (p), _get_lineno,
1338 (bfd_asymbol_bfd (p), p));
1339 if (l)
1340 {
c8e7bf0d 1341 /* Found a linenumber entry, output. */
252b5132 1342 struct internal_lineno out;
c8e7bf0d 1343 memset ((void *) & out, 0, sizeof (out));
252b5132
RH
1344 out.l_lnno = 0;
1345 out.l_addr.l_symndx = l->u.offset;
1346 bfd_coff_swap_lineno_out (abfd, &out, buff);
dc810e39
AM
1347 if (bfd_bwrite (buff, (bfd_size_type) linesz, abfd)
1348 != linesz)
b34976b6 1349 return FALSE;
252b5132
RH
1350 l++;
1351 while (l->line_number)
1352 {
1353 out.l_lnno = l->line_number;
1354 out.l_addr.l_symndx = l->u.offset;
1355 bfd_coff_swap_lineno_out (abfd, &out, buff);
dc810e39
AM
1356 if (bfd_bwrite (buff, (bfd_size_type) linesz, abfd)
1357 != linesz)
b34976b6 1358 return FALSE;
252b5132
RH
1359 l++;
1360 }
1361 }
1362 }
1363 q++;
1364 }
1365 }
1366 }
1367 bfd_release (abfd, buff);
b34976b6 1368 return TRUE;
252b5132
RH
1369}
1370
252b5132 1371alent *
c8e7bf0d 1372coff_get_lineno (bfd *ignore_abfd ATTRIBUTE_UNUSED, asymbol *symbol)
252b5132
RH
1373{
1374 return coffsymbol (symbol)->lineno;
1375}
1376
252b5132
RH
1377/* This function transforms the offsets into the symbol table into
1378 pointers to syments. */
1379
1380static void
c8e7bf0d
NC
1381coff_pointerize_aux (bfd *abfd,
1382 combined_entry_type *table_base,
1383 combined_entry_type *symbol,
1384 unsigned int indaux,
1385 combined_entry_type *auxent)
252b5132
RH
1386{
1387 unsigned int type = symbol->u.syment.n_type;
1388 unsigned int class = symbol->u.syment.n_sclass;
1389
1390 if (coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook)
1391 {
1392 if ((*coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook)
1393 (abfd, table_base, symbol, indaux, auxent))
1394 return;
1395 }
1396
c8e7bf0d 1397 /* Don't bother if this is a file or a section. */
252b5132
RH
1398 if (class == C_STAT && type == T_NULL)
1399 return;
1400 if (class == C_FILE)
1401 return;
1402
c8e7bf0d
NC
1403 /* Otherwise patch up. */
1404#define N_TMASK coff_data (abfd)->local_n_tmask
252b5132 1405#define N_BTSHFT coff_data (abfd)->local_n_btshft
c8e7bf0d 1406
252b5132
RH
1407 if ((ISFCN (type) || ISTAG (class) || class == C_BLOCK || class == C_FCN)
1408 && auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l > 0)
1409 {
1410 auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p =
1411 table_base + auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
1412 auxent->fix_end = 1;
1413 }
1414 /* A negative tagndx is meaningless, but the SCO 3.2v4 cc can
1415 generate one, so we must be careful to ignore it. */
1416 if (auxent->u.auxent.x_sym.x_tagndx.l > 0)
1417 {
1418 auxent->u.auxent.x_sym.x_tagndx.p =
1419 table_base + auxent->u.auxent.x_sym.x_tagndx.l;
1420 auxent->fix_tag = 1;
1421 }
1422}
1423
1424/* Allocate space for the ".debug" section, and read it.
1425 We did not read the debug section until now, because
244148ad 1426 we didn't want to go to the trouble until someone needed it. */
252b5132
RH
1427
1428static char *
c8e7bf0d 1429build_debug_section (bfd *abfd)
252b5132
RH
1430{
1431 char *debug_section;
dc810e39
AM
1432 file_ptr position;
1433 bfd_size_type sec_size;
252b5132
RH
1434
1435 asection *sect = bfd_get_section_by_name (abfd, ".debug");
1436
1437 if (!sect)
1438 {
1439 bfd_set_error (bfd_error_no_debug_section);
1440 return NULL;
1441 }
1442
eea6121a 1443 sec_size = sect->size;
c8e7bf0d 1444 debug_section = bfd_alloc (abfd, sec_size);
252b5132
RH
1445 if (debug_section == NULL)
1446 return NULL;
1447
244148ad 1448 /* Seek to the beginning of the `.debug' section and read it.
252b5132
RH
1449 Save the current position first; it is needed by our caller.
1450 Then read debug section and reset the file pointer. */
1451
1452 position = bfd_tell (abfd);
1453 if (bfd_seek (abfd, sect->filepos, SEEK_SET) != 0
dc810e39 1454 || bfd_bread (debug_section, sec_size, abfd) != sec_size
252b5132
RH
1455 || bfd_seek (abfd, position, SEEK_SET) != 0)
1456 return NULL;
1457 return debug_section;
1458}
1459
252b5132
RH
1460/* Return a pointer to a malloc'd copy of 'name'. 'name' may not be
1461 \0-terminated, but will not exceed 'maxlen' characters. The copy *will*
1462 be \0-terminated. */
c8e7bf0d 1463
252b5132 1464static char *
c8e7bf0d 1465copy_name (bfd *abfd, char *name, size_t maxlen)
252b5132 1466{
dc810e39 1467 size_t len;
252b5132
RH
1468 char *newname;
1469
1470 for (len = 0; len < maxlen; ++len)
c8e7bf0d
NC
1471 if (name[len] == '\0')
1472 break;
1473
1474 if ((newname = bfd_alloc (abfd, (bfd_size_type) len + 1)) == NULL)
1475 return NULL;
252b5132 1476
252b5132
RH
1477 strncpy (newname, name, len);
1478 newname[len] = '\0';
1479 return newname;
1480}
1481
1482/* Read in the external symbols. */
1483
b34976b6 1484bfd_boolean
c8e7bf0d 1485_bfd_coff_get_external_symbols (bfd *abfd)
252b5132
RH
1486{
1487 bfd_size_type symesz;
dc810e39 1488 bfd_size_type size;
c8e7bf0d 1489 void * syms;
252b5132
RH
1490
1491 if (obj_coff_external_syms (abfd) != NULL)
b34976b6 1492 return TRUE;
252b5132
RH
1493
1494 symesz = bfd_coff_symesz (abfd);
1495
1496 size = obj_raw_syment_count (abfd) * symesz;
353c5574
MS
1497 if (size == 0)
1498 return TRUE;
252b5132 1499
c8e7bf0d 1500 syms = bfd_malloc (size);
353c5574 1501 if (syms == NULL)
b34976b6 1502 return FALSE;
252b5132
RH
1503
1504 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
dc810e39 1505 || bfd_bread (syms, size, abfd) != size)
252b5132
RH
1506 {
1507 if (syms != NULL)
1508 free (syms);
b34976b6 1509 return FALSE;
252b5132
RH
1510 }
1511
1512 obj_coff_external_syms (abfd) = syms;
1513
b34976b6 1514 return TRUE;
252b5132
RH
1515}
1516
1517/* Read in the external strings. The strings are not loaded until
1518 they are needed. This is because we have no simple way of
1519 detecting a missing string table in an archive. */
1520
1521const char *
c8e7bf0d 1522_bfd_coff_read_string_table (bfd *abfd)
252b5132
RH
1523{
1524 char extstrsize[STRING_SIZE_SIZE];
dc810e39 1525 bfd_size_type strsize;
252b5132 1526 char *strings;
dc810e39 1527 file_ptr pos;
252b5132
RH
1528
1529 if (obj_coff_strings (abfd) != NULL)
1530 return obj_coff_strings (abfd);
1531
1532 if (obj_sym_filepos (abfd) == 0)
1533 {
1534 bfd_set_error (bfd_error_no_symbols);
1535 return NULL;
1536 }
1537
dc810e39
AM
1538 pos = obj_sym_filepos (abfd);
1539 pos += obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd);
1540 if (bfd_seek (abfd, pos, SEEK_SET) != 0)
252b5132 1541 return NULL;
244148ad 1542
dc810e39
AM
1543 if (bfd_bread (extstrsize, (bfd_size_type) sizeof extstrsize, abfd)
1544 != sizeof extstrsize)
252b5132
RH
1545 {
1546 if (bfd_get_error () != bfd_error_file_truncated)
1547 return NULL;
1548
1549 /* There is no string table. */
1550 strsize = STRING_SIZE_SIZE;
1551 }
1552 else
1553 {
1554#if STRING_SIZE_SIZE == 4
dc810e39 1555 strsize = H_GET_32 (abfd, extstrsize);
252b5132 1556#else
dc810e39 1557 #error Change H_GET_32
252b5132
RH
1558#endif
1559 }
1560
1561 if (strsize < STRING_SIZE_SIZE)
1562 {
1563 (*_bfd_error_handler)
d003868e 1564 (_("%B: bad string table size %lu"), abfd, (unsigned long) strsize);
252b5132
RH
1565 bfd_set_error (bfd_error_bad_value);
1566 return NULL;
1567 }
1568
c8e7bf0d 1569 strings = bfd_malloc (strsize);
252b5132
RH
1570 if (strings == NULL)
1571 return NULL;
1572
dc810e39 1573 if (bfd_bread (strings + STRING_SIZE_SIZE, strsize - STRING_SIZE_SIZE, abfd)
252b5132
RH
1574 != strsize - STRING_SIZE_SIZE)
1575 {
1576 free (strings);
1577 return NULL;
1578 }
1579
1580 obj_coff_strings (abfd) = strings;
1581
1582 return strings;
1583}
1584
1585/* Free up the external symbols and strings read from a COFF file. */
1586
b34976b6 1587bfd_boolean
c8e7bf0d 1588_bfd_coff_free_symbols (bfd *abfd)
252b5132
RH
1589{
1590 if (obj_coff_external_syms (abfd) != NULL
1591 && ! obj_coff_keep_syms (abfd))
1592 {
1593 free (obj_coff_external_syms (abfd));
1594 obj_coff_external_syms (abfd) = NULL;
1595 }
1596 if (obj_coff_strings (abfd) != NULL
1597 && ! obj_coff_keep_strings (abfd))
1598 {
1599 free (obj_coff_strings (abfd));
1600 obj_coff_strings (abfd) = NULL;
1601 }
b34976b6 1602 return TRUE;
252b5132
RH
1603}
1604
1605/* Read a symbol table into freshly bfd_allocated memory, swap it, and
1606 knit the symbol names into a normalized form. By normalized here I
1607 mean that all symbols have an n_offset pointer that points to a null-
1608 terminated string. */
1609
1610combined_entry_type *
c8e7bf0d 1611coff_get_normalized_symtab (bfd *abfd)
252b5132
RH
1612{
1613 combined_entry_type *internal;
1614 combined_entry_type *internal_ptr;
1615 combined_entry_type *symbol_ptr;
1616 combined_entry_type *internal_end;
dc810e39 1617 size_t symesz;
252b5132
RH
1618 char *raw_src;
1619 char *raw_end;
1620 const char *string_table = NULL;
1621 char *debug_section = NULL;
dc810e39 1622 bfd_size_type size;
252b5132
RH
1623
1624 if (obj_raw_syments (abfd) != NULL)
1625 return obj_raw_syments (abfd);
1626
1627 size = obj_raw_syment_count (abfd) * sizeof (combined_entry_type);
c8e7bf0d 1628 internal = bfd_zalloc (abfd, size);
252b5132
RH
1629 if (internal == NULL && size != 0)
1630 return NULL;
1631 internal_end = internal + obj_raw_syment_count (abfd);
1632
1633 if (! _bfd_coff_get_external_symbols (abfd))
1634 return NULL;
1635
1636 raw_src = (char *) obj_coff_external_syms (abfd);
1637
c8e7bf0d 1638 /* Mark the end of the symbols. */
252b5132
RH
1639 symesz = bfd_coff_symesz (abfd);
1640 raw_end = (char *) raw_src + obj_raw_syment_count (abfd) * symesz;
1641
1642 /* FIXME SOMEDAY. A string table size of zero is very weird, but
1643 probably possible. If one shows up, it will probably kill us. */
1644
c8e7bf0d 1645 /* Swap all the raw entries. */
252b5132
RH
1646 for (internal_ptr = internal;
1647 raw_src < raw_end;
1648 raw_src += symesz, internal_ptr++)
1649 {
1650
1651 unsigned int i;
c8e7bf0d
NC
1652 bfd_coff_swap_sym_in (abfd, (void *) raw_src,
1653 (void *) & internal_ptr->u.syment);
252b5132
RH
1654 symbol_ptr = internal_ptr;
1655
1656 for (i = 0;
1657 i < symbol_ptr->u.syment.n_numaux;
1658 i++)
1659 {
1660 internal_ptr++;
1661 raw_src += symesz;
c8e7bf0d 1662 bfd_coff_swap_aux_in (abfd, (void *) raw_src,
252b5132
RH
1663 symbol_ptr->u.syment.n_type,
1664 symbol_ptr->u.syment.n_sclass,
dc810e39 1665 (int) i, symbol_ptr->u.syment.n_numaux,
252b5132
RH
1666 &(internal_ptr->u.auxent));
1667 coff_pointerize_aux (abfd, internal, symbol_ptr, i,
1668 internal_ptr);
1669 }
1670 }
1671
1672 /* Free the raw symbols, but not the strings (if we have them). */
b34976b6 1673 obj_coff_keep_strings (abfd) = TRUE;
252b5132
RH
1674 if (! _bfd_coff_free_symbols (abfd))
1675 return NULL;
1676
1677 for (internal_ptr = internal; internal_ptr < internal_end;
1678 internal_ptr++)
1679 {
1680 if (internal_ptr->u.syment.n_sclass == C_FILE
1681 && internal_ptr->u.syment.n_numaux > 0)
1682 {
c8e7bf0d
NC
1683 /* Make a file symbol point to the name in the auxent, since
1684 the text ".file" is redundant. */
252b5132
RH
1685 if ((internal_ptr + 1)->u.auxent.x_file.x_n.x_zeroes == 0)
1686 {
c8e7bf0d 1687 /* The filename is a long one, point into the string table. */
252b5132
RH
1688 if (string_table == NULL)
1689 {
1690 string_table = _bfd_coff_read_string_table (abfd);
1691 if (string_table == NULL)
1692 return NULL;
1693 }
1694
1695 internal_ptr->u.syment._n._n_n._n_offset =
d2df793a 1696 ((bfd_hostptr_t)
252b5132
RH
1697 (string_table
1698 + (internal_ptr + 1)->u.auxent.x_file.x_n.x_offset));
1699 }
1700 else
1701 {
7bb9db4d
ILT
1702 /* Ordinary short filename, put into memory anyway. The
1703 Microsoft PE tools sometimes store a filename in
1704 multiple AUX entries. */
ec0ef80e
DD
1705 if (internal_ptr->u.syment.n_numaux > 1
1706 && coff_data (abfd)->pe)
c8e7bf0d 1707 internal_ptr->u.syment._n._n_n._n_offset =
d2df793a 1708 ((bfd_hostptr_t)
c8e7bf0d
NC
1709 copy_name (abfd,
1710 (internal_ptr + 1)->u.auxent.x_file.x_fname,
1711 internal_ptr->u.syment.n_numaux * symesz));
ec0ef80e 1712 else
c8e7bf0d 1713 internal_ptr->u.syment._n._n_n._n_offset =
d2df793a 1714 ((bfd_hostptr_t)
c8e7bf0d
NC
1715 copy_name (abfd,
1716 (internal_ptr + 1)->u.auxent.x_file.x_fname,
1717 (size_t) bfd_coff_filnmlen (abfd)));
252b5132
RH
1718 }
1719 }
1720 else
1721 {
1722 if (internal_ptr->u.syment._n._n_n._n_zeroes != 0)
1723 {
1724 /* This is a "short" name. Make it long. */
dc810e39
AM
1725 size_t i;
1726 char *newstring;
252b5132 1727
c8e7bf0d 1728 /* Find the length of this string without walking into memory
252b5132
RH
1729 that isn't ours. */
1730 for (i = 0; i < 8; ++i)
dc810e39
AM
1731 if (internal_ptr->u.syment._n._n_name[i] == '\0')
1732 break;
252b5132 1733
c8e7bf0d 1734 newstring = bfd_zalloc (abfd, (bfd_size_type) (i + 1));
dc810e39 1735 if (newstring == NULL)
c8e7bf0d 1736 return NULL;
dc810e39 1737 strncpy (newstring, internal_ptr->u.syment._n._n_name, i);
d2df793a 1738 internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) newstring;
252b5132
RH
1739 internal_ptr->u.syment._n._n_n._n_zeroes = 0;
1740 }
1741 else if (internal_ptr->u.syment._n._n_n._n_offset == 0)
649aeae3 1742 internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) "";
252b5132
RH
1743 else if (!bfd_coff_symname_in_debug (abfd, &internal_ptr->u.syment))
1744 {
1745 /* Long name already. Point symbol at the string in the
1746 table. */
1747 if (string_table == NULL)
1748 {
1749 string_table = _bfd_coff_read_string_table (abfd);
1750 if (string_table == NULL)
1751 return NULL;
1752 }
1753 internal_ptr->u.syment._n._n_n._n_offset =
d2df793a 1754 ((bfd_hostptr_t)
252b5132
RH
1755 (string_table
1756 + internal_ptr->u.syment._n._n_n._n_offset));
1757 }
1758 else
1759 {
1760 /* Long name in debug section. Very similar. */
1761 if (debug_section == NULL)
1762 debug_section = build_debug_section (abfd);
d2df793a 1763 internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t)
252b5132
RH
1764 (debug_section + internal_ptr->u.syment._n._n_n._n_offset);
1765 }
1766 }
1767 internal_ptr += internal_ptr->u.syment.n_numaux;
1768 }
1769
1770 obj_raw_syments (abfd) = internal;
1771 BFD_ASSERT (obj_raw_syment_count (abfd)
1772 == (unsigned int) (internal_ptr - internal));
1773
c8e7bf0d
NC
1774 return internal;
1775}
252b5132
RH
1776
1777long
c8e7bf0d 1778coff_get_reloc_upper_bound (bfd *abfd, sec_ptr asect)
252b5132
RH
1779{
1780 if (bfd_get_format (abfd) != bfd_object)
1781 {
1782 bfd_set_error (bfd_error_invalid_operation);
1783 return -1;
1784 }
1785 return (asect->reloc_count + 1) * sizeof (arelent *);
1786}
1787
1788asymbol *
c8e7bf0d 1789coff_make_empty_symbol (bfd *abfd)
252b5132 1790{
dc810e39 1791 bfd_size_type amt = sizeof (coff_symbol_type);
c8e7bf0d
NC
1792 coff_symbol_type *new = bfd_zalloc (abfd, amt);
1793
252b5132 1794 if (new == NULL)
c8e7bf0d 1795 return NULL;
252b5132
RH
1796 new->symbol.section = 0;
1797 new->native = 0;
c8e7bf0d 1798 new->lineno = NULL;
b34976b6 1799 new->done_lineno = FALSE;
252b5132 1800 new->symbol.the_bfd = abfd;
c8e7bf0d
NC
1801
1802 return & new->symbol;
252b5132
RH
1803}
1804
1805/* Make a debugging symbol. */
1806
1807asymbol *
c8e7bf0d
NC
1808coff_bfd_make_debug_symbol (bfd *abfd,
1809 void * ptr ATTRIBUTE_UNUSED,
1810 unsigned long sz ATTRIBUTE_UNUSED)
252b5132 1811{
dc810e39 1812 bfd_size_type amt = sizeof (coff_symbol_type);
c8e7bf0d
NC
1813 coff_symbol_type *new = bfd_alloc (abfd, amt);
1814
252b5132 1815 if (new == NULL)
c8e7bf0d 1816 return NULL;
252b5132
RH
1817 /* @@ The 10 is a guess at a plausible maximum number of aux entries
1818 (but shouldn't be a constant). */
dc810e39 1819 amt = sizeof (combined_entry_type) * 10;
c8e7bf0d 1820 new->native = bfd_zalloc (abfd, amt);
252b5132 1821 if (!new->native)
c8e7bf0d 1822 return NULL;
252b5132
RH
1823 new->symbol.section = bfd_abs_section_ptr;
1824 new->symbol.flags = BSF_DEBUGGING;
c8e7bf0d 1825 new->lineno = NULL;
b34976b6 1826 new->done_lineno = FALSE;
252b5132 1827 new->symbol.the_bfd = abfd;
c8e7bf0d
NC
1828
1829 return & new->symbol;
252b5132
RH
1830}
1831
252b5132 1832void
c8e7bf0d 1833coff_get_symbol_info (bfd *abfd, asymbol *symbol, symbol_info *ret)
252b5132
RH
1834{
1835 bfd_symbol_info (symbol, ret);
c8e7bf0d 1836
252b5132
RH
1837 if (coffsymbol (symbol)->native != NULL
1838 && coffsymbol (symbol)->native->fix_value)
c8e7bf0d 1839 ret->value = coffsymbol (symbol)->native->u.syment.n_value -
d2df793a 1840 (bfd_hostptr_t) obj_raw_syments (abfd);
252b5132
RH
1841}
1842
1843/* Return the COFF syment for a symbol. */
1844
b34976b6 1845bfd_boolean
c8e7bf0d
NC
1846bfd_coff_get_syment (bfd *abfd,
1847 asymbol *symbol,
1848 struct internal_syment *psyment)
252b5132
RH
1849{
1850 coff_symbol_type *csym;
1851
1852 csym = coff_symbol_from (abfd, symbol);
1853 if (csym == NULL || csym->native == NULL)
1854 {
1855 bfd_set_error (bfd_error_invalid_operation);
b34976b6 1856 return FALSE;
252b5132
RH
1857 }
1858
1859 *psyment = csym->native->u.syment;
1860
1861 if (csym->native->fix_value)
dc810e39 1862 psyment->n_value = psyment->n_value -
d2df793a 1863 (bfd_hostptr_t) obj_raw_syments (abfd);
252b5132
RH
1864
1865 /* FIXME: We should handle fix_line here. */
1866
b34976b6 1867 return TRUE;
252b5132
RH
1868}
1869
1870/* Return the COFF auxent for a symbol. */
1871
b34976b6 1872bfd_boolean
c8e7bf0d
NC
1873bfd_coff_get_auxent (bfd *abfd,
1874 asymbol *symbol,
1875 int indx,
1876 union internal_auxent *pauxent)
252b5132
RH
1877{
1878 coff_symbol_type *csym;
1879 combined_entry_type *ent;
1880
1881 csym = coff_symbol_from (abfd, symbol);
1882
1883 if (csym == NULL
1884 || csym->native == NULL
1885 || indx >= csym->native->u.syment.n_numaux)
1886 {
1887 bfd_set_error (bfd_error_invalid_operation);
b34976b6 1888 return FALSE;
252b5132
RH
1889 }
1890
1891 ent = csym->native + indx + 1;
1892
1893 *pauxent = ent->u.auxent;
1894
1895 if (ent->fix_tag)
1896 pauxent->x_sym.x_tagndx.l =
1897 ((combined_entry_type *) pauxent->x_sym.x_tagndx.p
1898 - obj_raw_syments (abfd));
1899
1900 if (ent->fix_end)
1901 pauxent->x_sym.x_fcnary.x_fcn.x_endndx.l =
1902 ((combined_entry_type *) pauxent->x_sym.x_fcnary.x_fcn.x_endndx.p
1903 - obj_raw_syments (abfd));
1904
1905 if (ent->fix_scnlen)
1906 pauxent->x_csect.x_scnlen.l =
1907 ((combined_entry_type *) pauxent->x_csect.x_scnlen.p
1908 - obj_raw_syments (abfd));
1909
b34976b6 1910 return TRUE;
252b5132
RH
1911}
1912
1913/* Print out information about COFF symbol. */
1914
1915void
c8e7bf0d
NC
1916coff_print_symbol (bfd *abfd,
1917 void * filep,
1918 asymbol *symbol,
1919 bfd_print_symbol_type how)
252b5132 1920{
c8e7bf0d 1921 FILE * file = (FILE *) filep;
252b5132
RH
1922
1923 switch (how)
1924 {
1925 case bfd_print_symbol_name:
1926 fprintf (file, "%s", symbol->name);
1927 break;
1928
1929 case bfd_print_symbol_more:
1930 fprintf (file, "coff %s %s",
1931 coffsymbol (symbol)->native ? "n" : "g",
1932 coffsymbol (symbol)->lineno ? "l" : " ");
1933 break;
1934
1935 case bfd_print_symbol_all:
1936 if (coffsymbol (symbol)->native)
1937 {
beb1bf64 1938 bfd_vma val;
252b5132
RH
1939 unsigned int aux;
1940 combined_entry_type *combined = coffsymbol (symbol)->native;
1941 combined_entry_type *root = obj_raw_syments (abfd);
1942 struct lineno_cache_entry *l = coffsymbol (symbol)->lineno;
1943
1944 fprintf (file, "[%3ld]", (long) (combined - root));
1945
1946 if (! combined->fix_value)
beb1bf64 1947 val = (bfd_vma) combined->u.syment.n_value;
252b5132 1948 else
d2df793a 1949 val = combined->u.syment.n_value - (bfd_hostptr_t) root;
252b5132 1950
7920ce38 1951 fprintf (file, "(sec %2d)(fl 0x%02x)(ty %3x)(scl %3d) (nx %d) 0x",
252b5132
RH
1952 combined->u.syment.n_scnum,
1953 combined->u.syment.n_flags,
1954 combined->u.syment.n_type,
1955 combined->u.syment.n_sclass,
745c12f8 1956 combined->u.syment.n_numaux);
970ccc77
NC
1957#ifdef BFD64
1958 /* fprintf_vma() on a 64-bit enabled host will always print a 64-bit
1959 value, but really we want to display the address in the target's
1960 address size. Since we do not have a field in the bfd structure
1961 to tell us this, we take a guess, based on the target's name. */
1962 if (strstr (bfd_get_target (abfd), "64") == NULL)
1963 fprintf (file, "%08lx", (unsigned long) (val & 0xffffffff));
1964 else
1965#endif
1966 fprintf_vma (file, val);
745c12f8 1967 fprintf (file, " %s", symbol->name);
252b5132
RH
1968
1969 for (aux = 0; aux < combined->u.syment.n_numaux; aux++)
1970 {
1971 combined_entry_type *auxp = combined + aux + 1;
1972 long tagndx;
1973
1974 if (auxp->fix_tag)
1975 tagndx = auxp->u.auxent.x_sym.x_tagndx.p - root;
1976 else
1977 tagndx = auxp->u.auxent.x_sym.x_tagndx.l;
1978
1979 fprintf (file, "\n");
1980
1981 if (bfd_coff_print_aux (abfd, file, root, combined, auxp, aux))
1982 continue;
1983
1984 switch (combined->u.syment.n_sclass)
1985 {
1986 case C_FILE:
1987 fprintf (file, "File ");
1988 break;
1989
1990 case C_STAT:
1991 if (combined->u.syment.n_type == T_NULL)
c8e7bf0d 1992 /* Probably a section symbol ? */
252b5132
RH
1993 {
1994 fprintf (file, "AUX scnlen 0x%lx nreloc %d nlnno %d",
0af1713e 1995 (unsigned long) auxp->u.auxent.x_scn.x_scnlen,
252b5132
RH
1996 auxp->u.auxent.x_scn.x_nreloc,
1997 auxp->u.auxent.x_scn.x_nlinno);
1998 if (auxp->u.auxent.x_scn.x_checksum != 0
1999 || auxp->u.auxent.x_scn.x_associated != 0
2000 || auxp->u.auxent.x_scn.x_comdat != 0)
2001 fprintf (file, " checksum 0x%lx assoc %d comdat %d",
2002 auxp->u.auxent.x_scn.x_checksum,
2003 auxp->u.auxent.x_scn.x_associated,
2004 auxp->u.auxent.x_scn.x_comdat);
2005 break;
2006 }
c8e7bf0d 2007 /* Otherwise fall through. */
312191a6 2008 case C_EXT:
8602d4fe 2009 case C_AIX_WEAKEXT:
312191a6
ILT
2010 if (ISFCN (combined->u.syment.n_type))
2011 {
cea4409c
AM
2012 long next, llnos;
2013
2014 if (auxp->fix_end)
2015 next = (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p
2016 - root);
2017 else
2018 next = auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
2019 llnos = auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_lnnoptr;
312191a6 2020 fprintf (file,
3d66c4f7 2021 "AUX tagndx %ld ttlsiz 0x%lx lnnos %ld next %ld",
0af1713e
AM
2022 tagndx,
2023 (unsigned long) auxp->u.auxent.x_sym.x_misc.x_fsize,
cea4409c 2024 llnos, next);
312191a6
ILT
2025 break;
2026 }
c8e7bf0d 2027 /* Otherwise fall through. */
252b5132
RH
2028 default:
2029 fprintf (file, "AUX lnno %d size 0x%x tagndx %ld",
2030 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_lnno,
2031 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_size,
2032 tagndx);
2033 if (auxp->fix_end)
2034 fprintf (file, " endndx %ld",
2035 ((long)
2036 (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p
2037 - root)));
2038 break;
2039 }
2040 }
2041
2042 if (l)
2043 {
2044 fprintf (file, "\n%s :", l->u.sym->name);
2045 l++;
2046 while (l->line_number)
2047 {
745c12f8
NC
2048 fprintf (file, "\n%4d : ", l->line_number);
2049 fprintf_vma (file, l->u.offset + symbol->section->vma);
252b5132
RH
2050 l++;
2051 }
2052 }
2053 }
2054 else
2055 {
c8e7bf0d 2056 bfd_print_symbol_vandf (abfd, (void *) file, symbol);
252b5132
RH
2057 fprintf (file, " %-5s %s %s %s",
2058 symbol->section->name,
2059 coffsymbol (symbol)->native ? "n" : "g",
2060 coffsymbol (symbol)->lineno ? "l" : " ",
2061 symbol->name);
2062 }
2063 }
2064}
2065
2066/* Return whether a symbol name implies a local symbol. In COFF,
2067 local symbols generally start with ``.L''. Most targets use this
2068 function for the is_local_label_name entry point, but some may
2069 override it. */
2070
b34976b6 2071bfd_boolean
c8e7bf0d
NC
2072_bfd_coff_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
2073 const char *name)
252b5132 2074{
b34976b6 2075 return name[0] == '.' && name[1] == 'L';
252b5132
RH
2076}
2077
9a968f43
NC
2078/* Provided a BFD, a section and an offset (in bytes, not octets) into the
2079 section, calculate and return the name of the source file and the line
2080 nearest to the wanted location. */
435b1e90 2081
b34976b6 2082bfd_boolean
c8e7bf0d
NC
2083coff_find_nearest_line (bfd *abfd,
2084 asection *section,
2085 asymbol **symbols,
2086 bfd_vma offset,
2087 const char **filename_ptr,
2088 const char **functionname_ptr,
2089 unsigned int *line_ptr)
252b5132 2090{
b34976b6 2091 bfd_boolean found;
252b5132
RH
2092 unsigned int i;
2093 unsigned int line_base;
2094 coff_data_type *cof = coff_data (abfd);
c8e7bf0d 2095 /* Run through the raw syments if available. */
252b5132
RH
2096 combined_entry_type *p;
2097 combined_entry_type *pend;
2098 alent *l;
2099 struct coff_section_tdata *sec_data;
dc810e39 2100 bfd_size_type amt;
252b5132
RH
2101
2102 /* Before looking through the symbol table, try to use a .stab
2103 section to find the information. */
2104 if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
2105 &found, filename_ptr,
2106 functionname_ptr, line_ptr,
51db3708 2107 &coff_data(abfd)->line_info))
b34976b6 2108 return FALSE;
51db3708 2109
4ca29a6a 2110 if (found)
b34976b6 2111 return TRUE;
4ca29a6a 2112
51db3708
NC
2113 /* Also try examining DWARF2 debugging information. */
2114 if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
2115 filename_ptr, functionname_ptr,
2116 line_ptr, 0,
2117 &coff_data(abfd)->dwarf2_find_line_info))
b34976b6 2118 return TRUE;
51db3708 2119
252b5132
RH
2120 *filename_ptr = 0;
2121 *functionname_ptr = 0;
2122 *line_ptr = 0;
2123
c8e7bf0d 2124 /* Don't try and find line numbers in a non coff file. */
9bd09e22 2125 if (!bfd_family_coff (abfd))
b34976b6 2126 return FALSE;
252b5132
RH
2127
2128 if (cof == NULL)
b34976b6 2129 return FALSE;
252b5132
RH
2130
2131 /* Find the first C_FILE symbol. */
2132 p = cof->raw_syments;
2133 if (!p)
b34976b6 2134 return FALSE;
252b5132
RH
2135
2136 pend = p + cof->raw_syment_count;
2137 while (p < pend)
2138 {
2139 if (p->u.syment.n_sclass == C_FILE)
2140 break;
2141 p += 1 + p->u.syment.n_numaux;
2142 }
2143
2144 if (p < pend)
2145 {
2146 bfd_vma sec_vma;
2147 bfd_vma maxdiff;
2148
2149 /* Look through the C_FILE symbols to find the best one. */
2150 sec_vma = bfd_get_section_vma (abfd, section);
2151 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
2152 maxdiff = (bfd_vma) 0 - (bfd_vma) 1;
2153 while (1)
2154 {
2155 combined_entry_type *p2;
2156
2157 for (p2 = p + 1 + p->u.syment.n_numaux;
2158 p2 < pend;
2159 p2 += 1 + p2->u.syment.n_numaux)
2160 {
2161 if (p2->u.syment.n_scnum > 0
2162 && (section
2163 == coff_section_from_bfd_index (abfd,
2164 p2->u.syment.n_scnum)))
2165 break;
2166 if (p2->u.syment.n_sclass == C_FILE)
2167 {
2168 p2 = pend;
2169 break;
2170 }
2171 }
2172
798c1fb8
ILT
2173 /* We use <= MAXDIFF here so that if we get a zero length
2174 file, we actually use the next file entry. */
252b5132
RH
2175 if (p2 < pend
2176 && offset + sec_vma >= (bfd_vma) p2->u.syment.n_value
798c1fb8 2177 && offset + sec_vma - (bfd_vma) p2->u.syment.n_value <= maxdiff)
252b5132
RH
2178 {
2179 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
2180 maxdiff = offset + sec_vma - p2->u.syment.n_value;
2181 }
2182
2183 /* Avoid endless loops on erroneous files by ensuring that
2184 we always move forward in the file. */
cea4409c 2185 if (p >= cof->raw_syments + p->u.syment.n_value)
252b5132
RH
2186 break;
2187
2188 p = cof->raw_syments + p->u.syment.n_value;
2189 if (p > pend || p->u.syment.n_sclass != C_FILE)
2190 break;
2191 }
2192 }
2193
c8e7bf0d 2194 /* Now wander though the raw linenumbers of the section. */
70df0c05 2195 /* If we have been called on this section before, and the offset we
252b5132
RH
2196 want is further down then we can prime the lookup loop. */
2197 sec_data = coff_section_data (abfd, section);
2198 if (sec_data != NULL
2199 && sec_data->i > 0
2200 && offset >= sec_data->offset)
2201 {
2202 i = sec_data->i;
2203 *functionname_ptr = sec_data->function;
2204 line_base = sec_data->line_base;
2205 }
2206 else
2207 {
2208 i = 0;
2209 line_base = 0;
2210 }
2211
2212 if (section->lineno != NULL)
2213 {
798c1fb8
ILT
2214 bfd_vma last_value = 0;
2215
252b5132
RH
2216 l = &section->lineno[i];
2217
2218 for (; i < section->lineno_count; i++)
2219 {
2220 if (l->line_number == 0)
2221 {
c8e7bf0d 2222 /* Get the symbol this line number points at. */
252b5132
RH
2223 coff_symbol_type *coff = (coff_symbol_type *) (l->u.sym);
2224 if (coff->symbol.value > offset)
2225 break;
2226 *functionname_ptr = coff->symbol.name;
798c1fb8 2227 last_value = coff->symbol.value;
252b5132
RH
2228 if (coff->native)
2229 {
2230 combined_entry_type *s = coff->native;
2231 s = s + 1 + s->u.syment.n_numaux;
2232
2233 /* In XCOFF a debugging symbol can follow the
2234 function symbol. */
2235 if (s->u.syment.n_scnum == N_DEBUG)
2236 s = s + 1 + s->u.syment.n_numaux;
2237
2238 /* S should now point to the .bf of the function. */
2239 if (s->u.syment.n_numaux)
2240 {
2241 /* The linenumber is stored in the auxent. */
2242 union internal_auxent *a = &((s + 1)->u.auxent);
2243 line_base = a->x_sym.x_misc.x_lnsz.x_lnno;
2244 *line_ptr = line_base;
2245 }
2246 }
2247 }
2248 else
2249 {
2250 if (l->u.offset > offset)
2251 break;
2252 *line_ptr = l->line_number + line_base - 1;
2253 }
2254 l++;
2255 }
798c1fb8
ILT
2256
2257 /* If we fell off the end of the loop, then assume that this
2258 symbol has no line number info. Otherwise, symbols with no
2259 line number info get reported with the line number of the
2260 last line of the last symbol which does have line number
2261 info. We use 0x100 as a slop to account for cases where the
2262 last line has executable code. */
2263 if (i >= section->lineno_count
2264 && last_value != 0
2265 && offset - last_value > 0x100)
2266 {
2267 *functionname_ptr = NULL;
2268 *line_ptr = 0;
2269 }
252b5132
RH
2270 }
2271
2272 /* Cache the results for the next call. */
2273 if (sec_data == NULL && section->owner == abfd)
2274 {
dc810e39 2275 amt = sizeof (struct coff_section_tdata);
c8e7bf0d 2276 section->used_by_bfd = bfd_zalloc (abfd, amt);
252b5132
RH
2277 sec_data = (struct coff_section_tdata *) section->used_by_bfd;
2278 }
2279 if (sec_data != NULL)
2280 {
2281 sec_data->offset = offset;
70df0c05 2282 sec_data->i = i - 1;
252b5132
RH
2283 sec_data->function = *functionname_ptr;
2284 sec_data->line_base = line_base;
2285 }
2286
b34976b6 2287 return TRUE;
252b5132
RH
2288}
2289
4ab527b0
FF
2290bfd_boolean
2291coff_find_inliner_info (bfd *abfd,
2292 const char **filename_ptr,
2293 const char **functionname_ptr,
2294 unsigned int *line_ptr)
2295{
2296 bfd_boolean found;
2297
2298 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
2299 functionname_ptr, line_ptr,
2300 &coff_data(abfd)->dwarf2_find_line_info);
2301 return (found);
2302}
2303
252b5132 2304int
a6b96beb 2305coff_sizeof_headers (bfd *abfd, struct bfd_link_info *info)
252b5132
RH
2306{
2307 size_t size;
2308
a6b96beb 2309 if (!info->relocatable)
c8e7bf0d 2310 size = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
252b5132 2311 else
c8e7bf0d 2312 size = bfd_coff_filhsz (abfd);
252b5132
RH
2313
2314 size += abfd->section_count * bfd_coff_scnhsz (abfd);
2315 return size;
2316}
2317
2318/* Change the class of a coff symbol held by BFD. */
c8e7bf0d 2319
b34976b6 2320bfd_boolean
c8e7bf0d
NC
2321bfd_coff_set_symbol_class (bfd * abfd,
2322 asymbol * symbol,
2323 unsigned int class)
252b5132
RH
2324{
2325 coff_symbol_type * csym;
2326
2327 csym = coff_symbol_from (abfd, symbol);
2328 if (csym == NULL)
2329 {
2330 bfd_set_error (bfd_error_invalid_operation);
b34976b6 2331 return FALSE;
252b5132
RH
2332 }
2333 else if (csym->native == NULL)
2334 {
2335 /* This is an alien symbol which no native coff backend data.
2336 We cheat here by creating a fake native entry for it and
2337 then filling in the class. This code is based on that in
2338 coff_write_alien_symbol(). */
244148ad 2339
252b5132 2340 combined_entry_type * native;
dc810e39 2341 bfd_size_type amt = sizeof (* native);
252b5132 2342
c8e7bf0d 2343 native = bfd_zalloc (abfd, amt);
252b5132 2344 if (native == NULL)
b34976b6 2345 return FALSE;
252b5132 2346
252b5132
RH
2347 native->u.syment.n_type = T_NULL;
2348 native->u.syment.n_sclass = class;
244148ad 2349
252b5132
RH
2350 if (bfd_is_und_section (symbol->section))
2351 {
2352 native->u.syment.n_scnum = N_UNDEF;
2353 native->u.syment.n_value = symbol->value;
2354 }
2355 else if (bfd_is_com_section (symbol->section))
2356 {
2357 native->u.syment.n_scnum = N_UNDEF;
2358 native->u.syment.n_value = symbol->value;
2359 }
2360 else
2361 {
2362 native->u.syment.n_scnum =
2363 symbol->section->output_section->target_index;
2364 native->u.syment.n_value = (symbol->value
2365 + symbol->section->output_offset);
2366 if (! obj_pe (abfd))
2367 native->u.syment.n_value += symbol->section->output_section->vma;
244148ad 2368
08da05b0 2369 /* Copy the any flags from the file header into the symbol.
252b5132
RH
2370 FIXME: Why? */
2371 native->u.syment.n_flags = bfd_asymbol_bfd (& csym->symbol)->flags;
2372 }
244148ad 2373
252b5132
RH
2374 csym->native = native;
2375 }
2376 else
c8e7bf0d 2377 csym->native->u.syment.n_sclass = class;
244148ad 2378
b34976b6 2379 return TRUE;
252b5132 2380}
082b7297
L
2381
2382struct coff_comdat_info *
2383bfd_coff_get_comdat_section (bfd *abfd, struct bfd_section *sec)
2384{
fedf8d51
AM
2385 if (bfd_get_flavour (abfd) == bfd_target_coff_flavour
2386 && coff_section_data (abfd, sec) != NULL)
082b7297
L
2387 return coff_section_data (abfd, sec)->comdat;
2388 else
2389 return NULL;
2390}
This page took 0.564024 seconds and 4 git commands to generate.