OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [coffgen.c] - Blame information for rev 163

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.