~ubuntu-branches/ubuntu/utopic/binutils-arm64-cross/utopic

« back to all changes in this revision

Viewing changes to binutils-2.23.52.20130611/bfd/cofflink.c

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2013-06-20 17:38:09 UTC
  • Revision ID: package-import@ubuntu.com-20130620173809-app8lzgvymy5fg6c
Tags: 0.7
Build-depend on binutils-source (>= 2.23.52.20130620-1~).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* COFF specific linker code.
 
2
   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
 
3
   2004, 2005, 2006, 2007, 2008, 2009, 2011 Free Software Foundation, Inc.
 
4
   Written by Ian Lance Taylor, Cygnus Support.
 
5
 
 
6
   This file is part of BFD, the Binary File Descriptor library.
 
7
 
 
8
   This program is free software; you can redistribute it and/or modify
 
9
   it under the terms of the GNU General Public License as published by
 
10
   the Free Software Foundation; either version 3 of the License, or
 
11
   (at your option) any later version.
 
12
 
 
13
   This program is distributed in the hope that it will be useful,
 
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
16
   GNU General Public License for more details.
 
17
 
 
18
   You should have received a copy of the GNU General Public License
 
19
   along with this program; if not, write to the Free Software
 
20
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
 
21
   MA 02110-1301, USA.  */
 
22
 
 
23
/* This file contains the COFF backend linker code.  */
 
24
 
 
25
#include "sysdep.h"
 
26
#include "bfd.h"
 
27
#include "bfdlink.h"
 
28
#include "libbfd.h"
 
29
#include "coff/internal.h"
 
30
#include "libcoff.h"
 
31
#include "safe-ctype.h"
 
32
 
 
33
static bfd_boolean coff_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info);
 
34
static bfd_boolean coff_link_check_archive_element (bfd *abfd, struct bfd_link_info *info, bfd_boolean *pneeded);
 
35
static bfd_boolean coff_link_add_symbols (bfd *abfd, struct bfd_link_info *info);
 
36
 
 
37
/* Return TRUE if SYM is a weak, external symbol.  */
 
38
#define IS_WEAK_EXTERNAL(abfd, sym)                     \
 
39
  ((sym).n_sclass == C_WEAKEXT                          \
 
40
   || (obj_pe (abfd) && (sym).n_sclass == C_NT_WEAK))
 
41
 
 
42
/* Return TRUE if SYM is an external symbol.  */
 
43
#define IS_EXTERNAL(abfd, sym)                          \
 
44
  ((sym).n_sclass == C_EXT || IS_WEAK_EXTERNAL (abfd, sym))
 
45
 
 
46
/* Define macros so that the ISFCN, et. al., macros work correctly.
 
47
   These macros are defined in include/coff/internal.h in terms of
 
48
   N_TMASK, etc.  These definitions require a user to define local
 
49
   variables with the appropriate names, and with values from the
 
50
   coff_data (abfd) structure.  */
 
51
 
 
52
#define N_TMASK n_tmask
 
53
#define N_BTSHFT n_btshft
 
54
#define N_BTMASK n_btmask
 
55
 
 
56
/* Create an entry in a COFF linker hash table.  */
 
57
 
 
58
struct bfd_hash_entry *
 
59
_bfd_coff_link_hash_newfunc (struct bfd_hash_entry *entry,
 
60
                             struct bfd_hash_table *table,
 
61
                             const char *string)
 
62
{
 
63
  struct coff_link_hash_entry *ret = (struct coff_link_hash_entry *) entry;
 
64
 
 
65
  /* Allocate the structure if it has not already been allocated by a
 
66
     subclass.  */
 
67
  if (ret == (struct coff_link_hash_entry *) NULL)
 
68
    ret = ((struct coff_link_hash_entry *)
 
69
           bfd_hash_allocate (table, sizeof (struct coff_link_hash_entry)));
 
70
  if (ret == (struct coff_link_hash_entry *) NULL)
 
71
    return (struct bfd_hash_entry *) ret;
 
72
 
 
73
  /* Call the allocation method of the superclass.  */
 
74
  ret = ((struct coff_link_hash_entry *)
 
75
         _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
 
76
                                 table, string));
 
77
  if (ret != (struct coff_link_hash_entry *) NULL)
 
78
    {
 
79
      /* Set local fields.  */
 
80
      ret->indx = -1;
 
81
      ret->type = T_NULL;
 
82
      ret->symbol_class = C_NULL;
 
83
      ret->numaux = 0;
 
84
      ret->auxbfd = NULL;
 
85
      ret->aux = NULL;
 
86
    }
 
87
 
 
88
  return (struct bfd_hash_entry *) ret;
 
89
}
 
90
 
 
91
/* Initialize a COFF linker hash table.  */
 
92
 
 
93
bfd_boolean
 
94
_bfd_coff_link_hash_table_init (struct coff_link_hash_table *table,
 
95
                                bfd *abfd,
 
96
                                struct bfd_hash_entry *(*newfunc) (struct bfd_hash_entry *,
 
97
                                                                   struct bfd_hash_table *,
 
98
                                                                   const char *),
 
99
                                unsigned int entsize)
 
100
{
 
101
  memset (&table->stab_info, 0, sizeof (table->stab_info));
 
102
  return _bfd_link_hash_table_init (&table->root, abfd, newfunc, entsize);
 
103
}
 
104
 
 
105
/* Create a COFF linker hash table.  */
 
106
 
 
107
struct bfd_link_hash_table *
 
108
_bfd_coff_link_hash_table_create (bfd *abfd)
 
109
{
 
110
  struct coff_link_hash_table *ret;
 
111
  bfd_size_type amt = sizeof (struct coff_link_hash_table);
 
112
 
 
113
  ret = (struct coff_link_hash_table *) bfd_malloc (amt);
 
114
  if (ret == NULL)
 
115
    return NULL;
 
116
 
 
117
  if (! _bfd_coff_link_hash_table_init (ret, abfd,
 
118
                                        _bfd_coff_link_hash_newfunc,
 
119
                                        sizeof (struct coff_link_hash_entry)))
 
120
    {
 
121
      free (ret);
 
122
      return (struct bfd_link_hash_table *) NULL;
 
123
    }
 
124
  return &ret->root;
 
125
}
 
126
 
 
127
/* Create an entry in a COFF debug merge hash table.  */
 
128
 
 
129
struct bfd_hash_entry *
 
130
_bfd_coff_debug_merge_hash_newfunc (struct bfd_hash_entry *entry,
 
131
                                    struct bfd_hash_table *table,
 
132
                                    const char *string)
 
133
{
 
134
  struct coff_debug_merge_hash_entry *ret =
 
135
    (struct coff_debug_merge_hash_entry *) entry;
 
136
 
 
137
  /* Allocate the structure if it has not already been allocated by a
 
138
     subclass.  */
 
139
  if (ret == (struct coff_debug_merge_hash_entry *) NULL)
 
140
    ret = ((struct coff_debug_merge_hash_entry *)
 
141
           bfd_hash_allocate (table,
 
142
                              sizeof (struct coff_debug_merge_hash_entry)));
 
143
  if (ret == (struct coff_debug_merge_hash_entry *) NULL)
 
144
    return (struct bfd_hash_entry *) ret;
 
145
 
 
146
  /* Call the allocation method of the superclass.  */
 
147
  ret = ((struct coff_debug_merge_hash_entry *)
 
148
         bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
 
149
  if (ret != (struct coff_debug_merge_hash_entry *) NULL)
 
150
    {
 
151
      /* Set local fields.  */
 
152
      ret->types = NULL;
 
153
    }
 
154
 
 
155
  return (struct bfd_hash_entry *) ret;
 
156
}
 
157
 
 
158
/* Given a COFF BFD, add symbols to the global hash table as
 
159
   appropriate.  */
 
160
 
 
161
bfd_boolean
 
162
_bfd_coff_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
 
163
{
 
164
  switch (bfd_get_format (abfd))
 
165
    {
 
166
    case bfd_object:
 
167
      return coff_link_add_object_symbols (abfd, info);
 
168
    case bfd_archive:
 
169
      return _bfd_generic_link_add_archive_symbols
 
170
        (abfd, info, coff_link_check_archive_element);
 
171
    default:
 
172
      bfd_set_error (bfd_error_wrong_format);
 
173
      return FALSE;
 
174
    }
 
175
}
 
176
 
 
177
/* Add symbols from a COFF object file.  */
 
178
 
 
179
static bfd_boolean
 
180
coff_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
 
181
{
 
182
  if (! _bfd_coff_get_external_symbols (abfd))
 
183
    return FALSE;
 
184
  if (! coff_link_add_symbols (abfd, info))
 
185
    return FALSE;
 
186
 
 
187
  if (! info->keep_memory
 
188
      && ! _bfd_coff_free_symbols (abfd))
 
189
    return FALSE;
 
190
 
 
191
  return TRUE;
 
192
}
 
193
 
 
194
/* Look through the symbols to see if this object file should be
 
195
   included in the link.  */
 
196
 
 
197
static bfd_boolean
 
198
coff_link_check_ar_symbols (bfd *abfd,
 
199
                            struct bfd_link_info *info,
 
200
                            bfd_boolean *pneeded,
 
201
                            bfd **subsbfd)
 
202
{
 
203
  bfd_size_type symesz;
 
204
  bfd_byte *esym;
 
205
  bfd_byte *esym_end;
 
206
 
 
207
  *pneeded = FALSE;
 
208
 
 
209
  symesz = bfd_coff_symesz (abfd);
 
210
  esym = (bfd_byte *) obj_coff_external_syms (abfd);
 
211
  esym_end = esym + obj_raw_syment_count (abfd) * symesz;
 
212
  while (esym < esym_end)
 
213
    {
 
214
      struct internal_syment sym;
 
215
      enum coff_symbol_classification classification;
 
216
 
 
217
      bfd_coff_swap_sym_in (abfd, esym, &sym);
 
218
 
 
219
      classification = bfd_coff_classify_symbol (abfd, &sym);
 
220
      if (classification == COFF_SYMBOL_GLOBAL
 
221
          || classification == COFF_SYMBOL_COMMON)
 
222
        {
 
223
          const char *name;
 
224
          char buf[SYMNMLEN + 1];
 
225
          struct bfd_link_hash_entry *h;
 
226
 
 
227
          /* This symbol is externally visible, and is defined by this
 
228
             object file.  */
 
229
          name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
 
230
          if (name == NULL)
 
231
            return FALSE;
 
232
          h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
 
233
 
 
234
          /* Auto import.  */
 
235
          if (!h
 
236
              && info->pei386_auto_import
 
237
              && CONST_STRNEQ (name, "__imp_"))
 
238
            h = bfd_link_hash_lookup (info->hash, name + 6, FALSE, FALSE, TRUE);
 
239
 
 
240
          /* We are only interested in symbols that are currently
 
241
             undefined.  If a symbol is currently known to be common,
 
242
             COFF linkers do not bring in an object file which defines
 
243
             it.  */
 
244
          if (h != (struct bfd_link_hash_entry *) NULL
 
245
              && h->type == bfd_link_hash_undefined)
 
246
            {
 
247
              if (!(*info->callbacks
 
248
                    ->add_archive_element) (info, abfd, name, subsbfd))
 
249
                return FALSE;
 
250
              *pneeded = TRUE;
 
251
              return TRUE;
 
252
            }
 
253
        }
 
254
 
 
255
      esym += (sym.n_numaux + 1) * symesz;
 
256
    }
 
257
 
 
258
  /* We do not need this object file.  */
 
259
  return TRUE;
 
260
}
 
261
 
 
262
/* Check a single archive element to see if we need to include it in
 
263
   the link.  *PNEEDED is set according to whether this element is
 
264
   needed in the link or not.  This is called via
 
265
   _bfd_generic_link_add_archive_symbols.  */
 
266
 
 
267
static bfd_boolean
 
268
coff_link_check_archive_element (bfd *abfd,
 
269
                                 struct bfd_link_info *info,
 
270
                                 bfd_boolean *pneeded)
 
271
{
 
272
  bfd *oldbfd;
 
273
  bfd_boolean needed;
 
274
 
 
275
  if (!_bfd_coff_get_external_symbols (abfd))
 
276
    return FALSE;
 
277
 
 
278
  oldbfd = abfd;
 
279
  if (!coff_link_check_ar_symbols (abfd, info, pneeded, &abfd))
 
280
    return FALSE;
 
281
 
 
282
  needed = *pneeded;
 
283
  if (needed)
 
284
    {
 
285
      /* Potentially, the add_archive_element hook may have set a
 
286
         substitute BFD for us.  */
 
287
      if (abfd != oldbfd)
 
288
        {
 
289
          if (!info->keep_memory
 
290
              && !_bfd_coff_free_symbols (oldbfd))
 
291
            return FALSE;
 
292
          if (!_bfd_coff_get_external_symbols (abfd))
 
293
            return FALSE;
 
294
        }
 
295
      if (!coff_link_add_symbols (abfd, info))
 
296
        return FALSE;
 
297
    }
 
298
 
 
299
  if (!info->keep_memory || !needed)
 
300
    {
 
301
      if (!_bfd_coff_free_symbols (abfd))
 
302
        return FALSE;
 
303
    }
 
304
  return TRUE;
 
305
}
 
306
 
 
307
/* Add all the symbols from an object file to the hash table.  */
 
308
 
 
309
static bfd_boolean
 
310
coff_link_add_symbols (bfd *abfd,
 
311
                       struct bfd_link_info *info)
 
312
{
 
313
  unsigned int n_tmask = coff_data (abfd)->local_n_tmask;
 
314
  unsigned int n_btshft = coff_data (abfd)->local_n_btshft;
 
315
  unsigned int n_btmask = coff_data (abfd)->local_n_btmask;
 
316
  bfd_boolean keep_syms;
 
317
  bfd_boolean default_copy;
 
318
  bfd_size_type symcount;
 
319
  struct coff_link_hash_entry **sym_hash;
 
320
  bfd_size_type symesz;
 
321
  bfd_byte *esym;
 
322
  bfd_byte *esym_end;
 
323
  bfd_size_type amt;
 
324
 
 
325
  symcount = obj_raw_syment_count (abfd);
 
326
 
 
327
  if (symcount == 0)
 
328
    return TRUE;                /* Nothing to do.  */
 
329
 
 
330
  /* Keep the symbols during this function, in case the linker needs
 
331
     to read the generic symbols in order to report an error message.  */
 
332
  keep_syms = obj_coff_keep_syms (abfd);
 
333
  obj_coff_keep_syms (abfd) = TRUE;
 
334
 
 
335
  if (info->keep_memory)
 
336
    default_copy = FALSE;
 
337
  else
 
338
    default_copy = TRUE;
 
339
 
 
340
  /* We keep a list of the linker hash table entries that correspond
 
341
     to particular symbols.  */
 
342
  amt = symcount * sizeof (struct coff_link_hash_entry *);
 
343
  sym_hash = (struct coff_link_hash_entry **) bfd_zalloc (abfd, amt);
 
344
  if (sym_hash == NULL)
 
345
    goto error_return;
 
346
  obj_coff_sym_hashes (abfd) = sym_hash;
 
347
 
 
348
  symesz = bfd_coff_symesz (abfd);
 
349
  BFD_ASSERT (symesz == bfd_coff_auxesz (abfd));
 
350
  esym = (bfd_byte *) obj_coff_external_syms (abfd);
 
351
  esym_end = esym + symcount * symesz;
 
352
  while (esym < esym_end)
 
353
    {
 
354
      struct internal_syment sym;
 
355
      enum coff_symbol_classification classification;
 
356
      bfd_boolean copy;
 
357
 
 
358
      bfd_coff_swap_sym_in (abfd, esym, &sym);
 
359
 
 
360
      classification = bfd_coff_classify_symbol (abfd, &sym);
 
361
      if (classification != COFF_SYMBOL_LOCAL)
 
362
        {
 
363
          const char *name;
 
364
          char buf[SYMNMLEN + 1];
 
365
          flagword flags;
 
366
          asection *section;
 
367
          bfd_vma value;
 
368
          bfd_boolean addit;
 
369
 
 
370
          /* This symbol is externally visible.  */
 
371
 
 
372
          name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
 
373
          if (name == NULL)
 
374
            goto error_return;
 
375
 
 
376
          /* We must copy the name into memory if we got it from the
 
377
             syment itself, rather than the string table.  */
 
378
          copy = default_copy;
 
379
          if (sym._n._n_n._n_zeroes != 0
 
380
              || sym._n._n_n._n_offset == 0)
 
381
            copy = TRUE;
 
382
 
 
383
          value = sym.n_value;
 
384
 
 
385
          switch (classification)
 
386
            {
 
387
            default:
 
388
              abort ();
 
389
 
 
390
            case COFF_SYMBOL_GLOBAL:
 
391
              flags = BSF_EXPORT | BSF_GLOBAL;
 
392
              section = coff_section_from_bfd_index (abfd, sym.n_scnum);
 
393
              if (! obj_pe (abfd))
 
394
                value -= section->vma;
 
395
              break;
 
396
 
 
397
            case COFF_SYMBOL_UNDEFINED:
 
398
              flags = 0;
 
399
              section = bfd_und_section_ptr;
 
400
              break;
 
401
 
 
402
            case COFF_SYMBOL_COMMON:
 
403
              flags = BSF_GLOBAL;
 
404
              section = bfd_com_section_ptr;
 
405
              break;
 
406
 
 
407
            case COFF_SYMBOL_PE_SECTION:
 
408
              flags = BSF_SECTION_SYM | BSF_GLOBAL;
 
409
              section = coff_section_from_bfd_index (abfd, sym.n_scnum);
 
410
              break;
 
411
            }
 
412
 
 
413
          if (IS_WEAK_EXTERNAL (abfd, sym))
 
414
            flags = BSF_WEAK;
 
415
 
 
416
          addit = TRUE;
 
417
 
 
418
          /* In the PE format, section symbols actually refer to the
 
419
             start of the output section.  We handle them specially
 
420
             here.  */
 
421
          if (obj_pe (abfd) && (flags & BSF_SECTION_SYM) != 0)
 
422
            {
 
423
              *sym_hash = coff_link_hash_lookup (coff_hash_table (info),
 
424
                                                 name, FALSE, copy, FALSE);
 
425
              if (*sym_hash != NULL)
 
426
                {
 
427
                  if (((*sym_hash)->coff_link_hash_flags
 
428
                       & COFF_LINK_HASH_PE_SECTION_SYMBOL) == 0
 
429
                      && (*sym_hash)->root.type != bfd_link_hash_undefined
 
430
                      && (*sym_hash)->root.type != bfd_link_hash_undefweak)
 
431
                    (*_bfd_error_handler)
 
432
                      ("Warning: symbol `%s' is both section and non-section",
 
433
                       name);
 
434
 
 
435
                  addit = FALSE;
 
436
                }
 
437
            }
 
438
 
 
439
          /* The Microsoft Visual C compiler does string pooling by
 
440
             hashing the constants to an internal symbol name, and
 
441
             relying on the linker comdat support to discard
 
442
             duplicate names.  However, if one string is a literal and
 
443
             one is a data initializer, one will end up in the .data
 
444
             section and one will end up in the .rdata section.  The
 
445
             Microsoft linker will combine them into the .data
 
446
             section, which seems to be wrong since it might cause the
 
447
             literal to change.
 
448
 
 
449
             As long as there are no external references to the
 
450
             symbols, which there shouldn't be, we can treat the .data
 
451
             and .rdata instances as separate symbols.  The comdat
 
452
             code in the linker will do the appropriate merging.  Here
 
453
             we avoid getting a multiple definition error for one of
 
454
             these special symbols.
 
455
 
 
456
             FIXME: I don't think this will work in the case where
 
457
             there are two object files which use the constants as a
 
458
             literal and two object files which use it as a data
 
459
             initializer.  One or the other of the second object files
 
460
             is going to wind up with an inappropriate reference.  */
 
461
          if (obj_pe (abfd)
 
462
              && (classification == COFF_SYMBOL_GLOBAL
 
463
                  || classification == COFF_SYMBOL_PE_SECTION)
 
464
              && coff_section_data (abfd, section) != NULL
 
465
              && coff_section_data (abfd, section)->comdat != NULL
 
466
              && CONST_STRNEQ (name, "??_")
 
467
              && strcmp (name, coff_section_data (abfd, section)->comdat->name) == 0)
 
468
            {
 
469
              if (*sym_hash == NULL)
 
470
                *sym_hash = coff_link_hash_lookup (coff_hash_table (info),
 
471
                                                   name, FALSE, copy, FALSE);
 
472
              if (*sym_hash != NULL
 
473
                  && (*sym_hash)->root.type == bfd_link_hash_defined
 
474
                  && coff_section_data (abfd, (*sym_hash)->root.u.def.section)->comdat != NULL
 
475
                  && strcmp (coff_section_data (abfd, (*sym_hash)->root.u.def.section)->comdat->name,
 
476
                             coff_section_data (abfd, section)->comdat->name) == 0)
 
477
                addit = FALSE;
 
478
            }
 
479
 
 
480
          if (addit)
 
481
            {
 
482
              if (! (bfd_coff_link_add_one_symbol
 
483
                     (info, abfd, name, flags, section, value,
 
484
                      (const char *) NULL, copy, FALSE,
 
485
                      (struct bfd_link_hash_entry **) sym_hash)))
 
486
                goto error_return;
 
487
            }
 
488
 
 
489
          if (obj_pe (abfd) && (flags & BSF_SECTION_SYM) != 0)
 
490
            (*sym_hash)->coff_link_hash_flags |=
 
491
              COFF_LINK_HASH_PE_SECTION_SYMBOL;
 
492
 
 
493
          /* Limit the alignment of a common symbol to the possible
 
494
             alignment of a section.  There is no point to permitting
 
495
             a higher alignment for a common symbol: we can not
 
496
             guarantee it, and it may cause us to allocate extra space
 
497
             in the common section.  */
 
498
          if (section == bfd_com_section_ptr
 
499
              && (*sym_hash)->root.type == bfd_link_hash_common
 
500
              && ((*sym_hash)->root.u.c.p->alignment_power
 
501
                  > bfd_coff_default_section_alignment_power (abfd)))
 
502
            (*sym_hash)->root.u.c.p->alignment_power
 
503
              = bfd_coff_default_section_alignment_power (abfd);
 
504
 
 
505
          if (bfd_get_flavour (info->output_bfd) == bfd_get_flavour (abfd))
 
506
            {
 
507
              /* If we don't have any symbol information currently in
 
508
                 the hash table, or if we are looking at a symbol
 
509
                 definition, then update the symbol class and type in
 
510
                 the hash table.  */
 
511
              if (((*sym_hash)->symbol_class == C_NULL
 
512
                   && (*sym_hash)->type == T_NULL)
 
513
                  || sym.n_scnum != 0
 
514
                  || (sym.n_value != 0
 
515
                      && (*sym_hash)->root.type != bfd_link_hash_defined
 
516
                      && (*sym_hash)->root.type != bfd_link_hash_defweak))
 
517
                {
 
518
                  (*sym_hash)->symbol_class = sym.n_sclass;
 
519
                  if (sym.n_type != T_NULL)
 
520
                    {
 
521
                      /* We want to warn if the type changed, but not
 
522
                         if it changed from an unspecified type.
 
523
                         Testing the whole type byte may work, but the
 
524
                         change from (e.g.) a function of unspecified
 
525
                         type to function of known type also wants to
 
526
                         skip the warning.  */
 
527
                      if ((*sym_hash)->type != T_NULL
 
528
                          && (*sym_hash)->type != sym.n_type
 
529
                          && !(DTYPE ((*sym_hash)->type) == DTYPE (sym.n_type)
 
530
                               && (BTYPE ((*sym_hash)->type) == T_NULL
 
531
                                   || BTYPE (sym.n_type) == T_NULL)))
 
532
                        (*_bfd_error_handler)
 
533
                          (_("Warning: type of symbol `%s' changed from %d to %d in %B"),
 
534
                           abfd, name, (*sym_hash)->type, sym.n_type);
 
535
 
 
536
                      /* We don't want to change from a meaningful
 
537
                         base type to a null one, but if we know
 
538
                         nothing, take what little we might now know.  */
 
539
                      if (BTYPE (sym.n_type) != T_NULL
 
540
                          || (*sym_hash)->type == T_NULL)
 
541
                        (*sym_hash)->type = sym.n_type;
 
542
                    }
 
543
                  (*sym_hash)->auxbfd = abfd;
 
544
                  if (sym.n_numaux != 0)
 
545
                    {
 
546
                      union internal_auxent *alloc;
 
547
                      unsigned int i;
 
548
                      bfd_byte *eaux;
 
549
                      union internal_auxent *iaux;
 
550
 
 
551
                      (*sym_hash)->numaux = sym.n_numaux;
 
552
                      alloc = ((union internal_auxent *)
 
553
                               bfd_hash_allocate (&info->hash->table,
 
554
                                                  (sym.n_numaux
 
555
                                                   * sizeof (*alloc))));
 
556
                      if (alloc == NULL)
 
557
                        goto error_return;
 
558
                      for (i = 0, eaux = esym + symesz, iaux = alloc;
 
559
                           i < sym.n_numaux;
 
560
                           i++, eaux += symesz, iaux++)
 
561
                        bfd_coff_swap_aux_in (abfd, eaux, sym.n_type,
 
562
                                              sym.n_sclass, (int) i,
 
563
                                              sym.n_numaux, iaux);
 
564
                      (*sym_hash)->aux = alloc;
 
565
                    }
 
566
                }
 
567
            }
 
568
 
 
569
          if (classification == COFF_SYMBOL_PE_SECTION
 
570
              && (*sym_hash)->numaux != 0)
 
571
            {
 
572
              /* Some PE sections (such as .bss) have a zero size in
 
573
                 the section header, but a non-zero size in the AUX
 
574
                 record.  Correct that here.
 
575
 
 
576
                 FIXME: This is not at all the right place to do this.
 
577
                 For example, it won't help objdump.  This needs to be
 
578
                 done when we swap in the section header.  */
 
579
              BFD_ASSERT ((*sym_hash)->numaux == 1);
 
580
              if (section->size == 0)
 
581
                section->size = (*sym_hash)->aux[0].x_scn.x_scnlen;
 
582
 
 
583
              /* FIXME: We could test whether the section sizes
 
584
                 matches the size in the aux entry, but apparently
 
585
                 that sometimes fails unexpectedly.  */
 
586
            }
 
587
        }
 
588
 
 
589
      esym += (sym.n_numaux + 1) * symesz;
 
590
      sym_hash += sym.n_numaux + 1;
 
591
    }
 
592
 
 
593
  /* If this is a non-traditional, non-relocatable link, try to
 
594
     optimize the handling of any .stab/.stabstr sections.  */
 
595
  if (! info->relocatable
 
596
      && ! info->traditional_format
 
597
      && bfd_get_flavour (info->output_bfd) == bfd_get_flavour (abfd)
 
598
      && (info->strip != strip_all && info->strip != strip_debugger))
 
599
    {
 
600
      asection *stabstr;
 
601
 
 
602
      stabstr = bfd_get_section_by_name (abfd, ".stabstr");
 
603
 
 
604
      if (stabstr != NULL)
 
605
        {
 
606
          bfd_size_type string_offset = 0;
 
607
          asection *stab;
 
608
 
 
609
          for (stab = abfd->sections; stab; stab = stab->next)
 
610
            if (CONST_STRNEQ (stab->name, ".stab")
 
611
                && (!stab->name[5]
 
612
                    || (stab->name[5] == '.' && ISDIGIT (stab->name[6]))))
 
613
            {
 
614
              struct coff_link_hash_table *table;
 
615
              struct coff_section_tdata *secdata
 
616
                = coff_section_data (abfd, stab);
 
617
 
 
618
              if (secdata == NULL)
 
619
                {
 
620
                  amt = sizeof (struct coff_section_tdata);
 
621
                  stab->used_by_bfd = bfd_zalloc (abfd, amt);
 
622
                  if (stab->used_by_bfd == NULL)
 
623
                    goto error_return;
 
624
                  secdata = coff_section_data (abfd, stab);
 
625
                }
 
626
 
 
627
              table = coff_hash_table (info);
 
628
 
 
629
              if (! _bfd_link_section_stabs (abfd, &table->stab_info,
 
630
                                             stab, stabstr,
 
631
                                             &secdata->stab_info,
 
632
                                             &string_offset))
 
633
                goto error_return;
 
634
            }
 
635
        }
 
636
    }
 
637
 
 
638
  obj_coff_keep_syms (abfd) = keep_syms;
 
639
 
 
640
  return TRUE;
 
641
 
 
642
 error_return:
 
643
  obj_coff_keep_syms (abfd) = keep_syms;
 
644
  return FALSE;
 
645
}
 
646
 
 
647
/* Do the final link step.  */
 
648
 
 
649
bfd_boolean
 
650
_bfd_coff_final_link (bfd *abfd,
 
651
                      struct bfd_link_info *info)
 
652
{
 
653
  bfd_size_type symesz;
 
654
  struct coff_final_link_info flaginfo;
 
655
  bfd_boolean debug_merge_allocated;
 
656
  bfd_boolean long_section_names;
 
657
  asection *o;
 
658
  struct bfd_link_order *p;
 
659
  bfd_size_type max_sym_count;
 
660
  bfd_size_type max_lineno_count;
 
661
  bfd_size_type max_reloc_count;
 
662
  bfd_size_type max_output_reloc_count;
 
663
  bfd_size_type max_contents_size;
 
664
  file_ptr rel_filepos;
 
665
  unsigned int relsz;
 
666
  file_ptr line_filepos;
 
667
  unsigned int linesz;
 
668
  bfd *sub;
 
669
  bfd_byte *external_relocs = NULL;
 
670
  char strbuf[STRING_SIZE_SIZE];
 
671
  bfd_size_type amt;
 
672
 
 
673
  symesz = bfd_coff_symesz (abfd);
 
674
 
 
675
  flaginfo.info = info;
 
676
  flaginfo.output_bfd = abfd;
 
677
  flaginfo.strtab = NULL;
 
678
  flaginfo.section_info = NULL;
 
679
  flaginfo.last_file_index = -1;
 
680
  flaginfo.last_bf_index = -1;
 
681
  flaginfo.internal_syms = NULL;
 
682
  flaginfo.sec_ptrs = NULL;
 
683
  flaginfo.sym_indices = NULL;
 
684
  flaginfo.outsyms = NULL;
 
685
  flaginfo.linenos = NULL;
 
686
  flaginfo.contents = NULL;
 
687
  flaginfo.external_relocs = NULL;
 
688
  flaginfo.internal_relocs = NULL;
 
689
  flaginfo.global_to_static = FALSE;
 
690
  debug_merge_allocated = FALSE;
 
691
 
 
692
  coff_data (abfd)->link_info = info;
 
693
 
 
694
  flaginfo.strtab = _bfd_stringtab_init ();
 
695
  if (flaginfo.strtab == NULL)
 
696
    goto error_return;
 
697
 
 
698
  if (! coff_debug_merge_hash_table_init (&flaginfo.debug_merge))
 
699
    goto error_return;
 
700
  debug_merge_allocated = TRUE;
 
701
 
 
702
  /* Compute the file positions for all the sections.  */
 
703
  if (! abfd->output_has_begun)
 
704
    {
 
705
      if (! bfd_coff_compute_section_file_positions (abfd))
 
706
        goto error_return;
 
707
    }
 
708
 
 
709
  /* Count the line numbers and relocation entries required for the
 
710
     output file.  Set the file positions for the relocs.  */
 
711
  rel_filepos = obj_relocbase (abfd);
 
712
  relsz = bfd_coff_relsz (abfd);
 
713
  max_contents_size = 0;
 
714
  max_lineno_count = 0;
 
715
  max_reloc_count = 0;
 
716
 
 
717
  long_section_names = FALSE;
 
718
  for (o = abfd->sections; o != NULL; o = o->next)
 
719
    {
 
720
      o->reloc_count = 0;
 
721
      o->lineno_count = 0;
 
722
      for (p = o->map_head.link_order; p != NULL; p = p->next)
 
723
        {
 
724
          if (p->type == bfd_indirect_link_order)
 
725
            {
 
726
              asection *sec;
 
727
 
 
728
              sec = p->u.indirect.section;
 
729
 
 
730
              /* Mark all sections which are to be included in the
 
731
                 link.  This will normally be every section.  We need
 
732
                 to do this so that we can identify any sections which
 
733
                 the linker has decided to not include.  */
 
734
              sec->linker_mark = TRUE;
 
735
 
 
736
              if (info->strip == strip_none
 
737
                  || info->strip == strip_some)
 
738
                o->lineno_count += sec->lineno_count;
 
739
 
 
740
              if (info->relocatable)
 
741
                o->reloc_count += sec->reloc_count;
 
742
 
 
743
              if (sec->rawsize > max_contents_size)
 
744
                max_contents_size = sec->rawsize;
 
745
              if (sec->size > max_contents_size)
 
746
                max_contents_size = sec->size;
 
747
              if (sec->lineno_count > max_lineno_count)
 
748
                max_lineno_count = sec->lineno_count;
 
749
              if (sec->reloc_count > max_reloc_count)
 
750
                max_reloc_count = sec->reloc_count;
 
751
            }
 
752
          else if (info->relocatable
 
753
                   && (p->type == bfd_section_reloc_link_order
 
754
                       || p->type == bfd_symbol_reloc_link_order))
 
755
            ++o->reloc_count;
 
756
        }
 
757
      if (o->reloc_count == 0)
 
758
        o->rel_filepos = 0;
 
759
      else
 
760
        {
 
761
          o->flags |= SEC_RELOC;
 
762
          o->rel_filepos = rel_filepos;
 
763
          rel_filepos += o->reloc_count * relsz;
 
764
          /* In PE COFF, if there are at least 0xffff relocations an
 
765
             extra relocation will be written out to encode the count.  */
 
766
          if (obj_pe (abfd) && o->reloc_count >= 0xffff)
 
767
            rel_filepos += relsz;
 
768
        }
 
769
 
 
770
      if (bfd_coff_long_section_names (abfd)
 
771
          && strlen (o->name) > SCNNMLEN)
 
772
        {
 
773
          /* This section has a long name which must go in the string
 
774
             table.  This must correspond to the code in
 
775
             coff_write_object_contents which puts the string index
 
776
             into the s_name field of the section header.  That is why
 
777
             we pass hash as FALSE.  */
 
778
          if (_bfd_stringtab_add (flaginfo.strtab, o->name, FALSE, FALSE)
 
779
              == (bfd_size_type) -1)
 
780
            goto error_return;
 
781
          long_section_names = TRUE;
 
782
        }
 
783
    }
 
784
 
 
785
  /* If doing a relocatable link, allocate space for the pointers we
 
786
     need to keep.  */
 
787
  if (info->relocatable)
 
788
    {
 
789
      unsigned int i;
 
790
 
 
791
      /* We use section_count + 1, rather than section_count, because
 
792
         the target_index fields are 1 based.  */
 
793
      amt = abfd->section_count + 1;
 
794
      amt *= sizeof (struct coff_link_section_info);
 
795
      flaginfo.section_info = (struct coff_link_section_info *) bfd_malloc (amt);
 
796
      if (flaginfo.section_info == NULL)
 
797
        goto error_return;
 
798
      for (i = 0; i <= abfd->section_count; i++)
 
799
        {
 
800
          flaginfo.section_info[i].relocs = NULL;
 
801
          flaginfo.section_info[i].rel_hashes = NULL;
 
802
        }
 
803
    }
 
804
 
 
805
  /* We now know the size of the relocs, so we can determine the file
 
806
     positions of the line numbers.  */
 
807
  line_filepos = rel_filepos;
 
808
  linesz = bfd_coff_linesz (abfd);
 
809
  max_output_reloc_count = 0;
 
810
  for (o = abfd->sections; o != NULL; o = o->next)
 
811
    {
 
812
      if (o->lineno_count == 0)
 
813
        o->line_filepos = 0;
 
814
      else
 
815
        {
 
816
          o->line_filepos = line_filepos;
 
817
          line_filepos += o->lineno_count * linesz;
 
818
        }
 
819
 
 
820
      if (o->reloc_count != 0)
 
821
        {
 
822
          /* We don't know the indices of global symbols until we have
 
823
             written out all the local symbols.  For each section in
 
824
             the output file, we keep an array of pointers to hash
 
825
             table entries.  Each entry in the array corresponds to a
 
826
             reloc.  When we find a reloc against a global symbol, we
 
827
             set the corresponding entry in this array so that we can
 
828
             fix up the symbol index after we have written out all the
 
829
             local symbols.
 
830
 
 
831
             Because of this problem, we also keep the relocs in
 
832
             memory until the end of the link.  This wastes memory,
 
833
             but only when doing a relocatable link, which is not the
 
834
             common case.  */
 
835
          BFD_ASSERT (info->relocatable);
 
836
          amt = o->reloc_count;
 
837
          amt *= sizeof (struct internal_reloc);
 
838
          flaginfo.section_info[o->target_index].relocs =
 
839
              (struct internal_reloc *) bfd_malloc (amt);
 
840
          amt = o->reloc_count;
 
841
          amt *= sizeof (struct coff_link_hash_entry *);
 
842
          flaginfo.section_info[o->target_index].rel_hashes =
 
843
              (struct coff_link_hash_entry **) bfd_malloc (amt);
 
844
          if (flaginfo.section_info[o->target_index].relocs == NULL
 
845
              || flaginfo.section_info[o->target_index].rel_hashes == NULL)
 
846
            goto error_return;
 
847
 
 
848
          if (o->reloc_count > max_output_reloc_count)
 
849
            max_output_reloc_count = o->reloc_count;
 
850
        }
 
851
 
 
852
      /* Reset the reloc and lineno counts, so that we can use them to
 
853
         count the number of entries we have output so far.  */
 
854
      o->reloc_count = 0;
 
855
      o->lineno_count = 0;
 
856
    }
 
857
 
 
858
  obj_sym_filepos (abfd) = line_filepos;
 
859
 
 
860
  /* Figure out the largest number of symbols in an input BFD.  Take
 
861
     the opportunity to clear the output_has_begun fields of all the
 
862
     input BFD's.  */
 
863
  max_sym_count = 0;
 
864
  for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
 
865
    {
 
866
      size_t sz;
 
867
 
 
868
      sub->output_has_begun = FALSE;
 
869
      sz = bfd_family_coff (sub) ? obj_raw_syment_count (sub) : 2;
 
870
      if (sz > max_sym_count)
 
871
        max_sym_count = sz;
 
872
    }
 
873
 
 
874
  /* Allocate some buffers used while linking.  */
 
875
  amt = max_sym_count * sizeof (struct internal_syment);
 
876
  flaginfo.internal_syms = (struct internal_syment *) bfd_malloc (amt);
 
877
  amt = max_sym_count * sizeof (asection *);
 
878
  flaginfo.sec_ptrs = (asection **) bfd_malloc (amt);
 
879
  amt = max_sym_count * sizeof (long);
 
880
  flaginfo.sym_indices = (long int *) bfd_malloc (amt);
 
881
  flaginfo.outsyms = (bfd_byte *) bfd_malloc ((max_sym_count + 1) * symesz);
 
882
  amt = max_lineno_count * bfd_coff_linesz (abfd);
 
883
  flaginfo.linenos = (bfd_byte *) bfd_malloc (amt);
 
884
  flaginfo.contents = (bfd_byte *) bfd_malloc (max_contents_size);
 
885
  amt = max_reloc_count * relsz;
 
886
  flaginfo.external_relocs = (bfd_byte *) bfd_malloc (amt);
 
887
  if (! info->relocatable)
 
888
    {
 
889
      amt = max_reloc_count * sizeof (struct internal_reloc);
 
890
      flaginfo.internal_relocs = (struct internal_reloc *) bfd_malloc (amt);
 
891
    }
 
892
  if ((flaginfo.internal_syms == NULL && max_sym_count > 0)
 
893
      || (flaginfo.sec_ptrs == NULL && max_sym_count > 0)
 
894
      || (flaginfo.sym_indices == NULL && max_sym_count > 0)
 
895
      || flaginfo.outsyms == NULL
 
896
      || (flaginfo.linenos == NULL && max_lineno_count > 0)
 
897
      || (flaginfo.contents == NULL && max_contents_size > 0)
 
898
      || (flaginfo.external_relocs == NULL && max_reloc_count > 0)
 
899
      || (! info->relocatable
 
900
          && flaginfo.internal_relocs == NULL
 
901
          && max_reloc_count > 0))
 
902
    goto error_return;
 
903
 
 
904
  /* We now know the position of everything in the file, except that
 
905
     we don't know the size of the symbol table and therefore we don't
 
906
     know where the string table starts.  We just build the string
 
907
     table in memory as we go along.  We process all the relocations
 
908
     for a single input file at once.  */
 
909
  obj_raw_syment_count (abfd) = 0;
 
910
 
 
911
  if (coff_backend_info (abfd)->_bfd_coff_start_final_link)
 
912
    {
 
913
      if (! bfd_coff_start_final_link (abfd, info))
 
914
        goto error_return;
 
915
    }
 
916
 
 
917
  for (o = abfd->sections; o != NULL; o = o->next)
 
918
    {
 
919
      for (p = o->map_head.link_order; p != NULL; p = p->next)
 
920
        {
 
921
          if (p->type == bfd_indirect_link_order
 
922
              && bfd_family_coff (p->u.indirect.section->owner))
 
923
            {
 
924
              sub = p->u.indirect.section->owner;
 
925
              if (! bfd_coff_link_output_has_begun (sub, & flaginfo))
 
926
                {
 
927
                  if (! _bfd_coff_link_input_bfd (&flaginfo, sub))
 
928
                    goto error_return;
 
929
                  sub->output_has_begun = TRUE;
 
930
                }
 
931
            }
 
932
          else if (p->type == bfd_section_reloc_link_order
 
933
                   || p->type == bfd_symbol_reloc_link_order)
 
934
            {
 
935
              if (! _bfd_coff_reloc_link_order (abfd, &flaginfo, o, p))
 
936
                goto error_return;
 
937
            }
 
938
          else
 
939
            {
 
940
              if (! _bfd_default_link_order (abfd, info, o, p))
 
941
                goto error_return;
 
942
            }
 
943
        }
 
944
    }
 
945
 
 
946
  if (flaginfo.info->strip != strip_all && flaginfo.info->discard != discard_all)
 
947
    {
 
948
      /* Add local symbols from foreign inputs.  */
 
949
      for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
 
950
        {
 
951
          unsigned int i;
 
952
 
 
953
          if (bfd_family_coff (sub) || ! bfd_get_outsymbols (sub))
 
954
            continue;
 
955
          for (i = 0; i < bfd_get_symcount (sub); ++i)
 
956
            {
 
957
              asymbol *sym = bfd_get_outsymbols (sub) [i];
 
958
              file_ptr pos;
 
959
              struct internal_syment isym;
 
960
              bfd_size_type string_size = 0;
 
961
              bfd_vma written = 0;
 
962
              bfd_boolean rewrite = FALSE;
 
963
 
 
964
              if (! (sym->flags & BSF_LOCAL)
 
965
                  || (sym->flags & (BSF_SECTION_SYM | BSF_DEBUGGING_RELOC
 
966
                                    | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC
 
967
                                    | BSF_SYNTHETIC))
 
968
                  || ((sym->flags & BSF_DEBUGGING)
 
969
                      && ! (sym->flags & BSF_FILE)))
 
970
                continue;
 
971
 
 
972
              /* See if we are discarding symbols with this name.  */
 
973
              if ((flaginfo.info->strip == strip_some
 
974
                   && (bfd_hash_lookup (flaginfo.info->keep_hash,
 
975
                                        bfd_asymbol_name(sym), FALSE, FALSE)
 
976
                       == NULL))
 
977
                  || (((flaginfo.info->discard == discard_sec_merge
 
978
                        && (bfd_get_section (sym)->flags & SEC_MERGE)
 
979
                        && ! flaginfo.info->relocatable)
 
980
                       || flaginfo.info->discard == discard_l)
 
981
                      && bfd_is_local_label_name (sub, bfd_asymbol_name(sym))))
 
982
                continue;
 
983
 
 
984
              pos = obj_sym_filepos (abfd) + obj_raw_syment_count (abfd)
 
985
                                             * symesz;
 
986
              if (bfd_seek (abfd, pos, SEEK_SET) != 0)
 
987
                goto error_return;
 
988
              if (! coff_write_alien_symbol(abfd, sym, &isym, &written,
 
989
                                            &string_size, NULL, NULL))
 
990
                goto error_return;
 
991
 
 
992
              if (string_size)
 
993
                {
 
994
                  bfd_boolean hash = ! (abfd->flags & BFD_TRADITIONAL_FORMAT);
 
995
                  bfd_size_type indx;
 
996
 
 
997
                  indx = _bfd_stringtab_add (flaginfo.strtab,
 
998
                                             bfd_asymbol_name (sym), hash,
 
999
                                             FALSE);
 
1000
                  if (indx == (bfd_size_type) -1)
 
1001
                    goto error_return;
 
1002
                  isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
 
1003
                  bfd_coff_swap_sym_out (abfd, &isym, flaginfo.outsyms);
 
1004
                  rewrite = TRUE;
 
1005
                }
 
1006
 
 
1007
              if (isym.n_sclass == C_FILE)
 
1008
                {
 
1009
                  if (flaginfo.last_file_index != -1)
 
1010
                    {
 
1011
                      flaginfo.last_file.n_value = obj_raw_syment_count (abfd);
 
1012
                      bfd_coff_swap_sym_out (abfd, &flaginfo.last_file,
 
1013
                                             flaginfo.outsyms);
 
1014
                      pos = obj_sym_filepos (abfd) + flaginfo.last_file_index
 
1015
                                                     * symesz;
 
1016
                      rewrite = TRUE;
 
1017
                    }
 
1018
                  flaginfo.last_file_index = obj_raw_syment_count (abfd);
 
1019
                  flaginfo.last_file = isym;
 
1020
                }
 
1021
 
 
1022
              if (rewrite
 
1023
                  && (bfd_seek (abfd, pos, SEEK_SET) != 0
 
1024
                      || bfd_bwrite (flaginfo.outsyms, symesz, abfd) != symesz))
 
1025
                goto error_return;
 
1026
 
 
1027
              obj_raw_syment_count (abfd) += written;
 
1028
            }
 
1029
        }
 
1030
    }
 
1031
 
 
1032
  if (! bfd_coff_final_link_postscript (abfd, & flaginfo))
 
1033
    goto error_return;
 
1034
 
 
1035
  /* Free up the buffers used by _bfd_coff_link_input_bfd.  */
 
1036
 
 
1037
  coff_debug_merge_hash_table_free (&flaginfo.debug_merge);
 
1038
  debug_merge_allocated = FALSE;
 
1039
 
 
1040
  if (flaginfo.internal_syms != NULL)
 
1041
    {
 
1042
      free (flaginfo.internal_syms);
 
1043
      flaginfo.internal_syms = NULL;
 
1044
    }
 
1045
  if (flaginfo.sec_ptrs != NULL)
 
1046
    {
 
1047
      free (flaginfo.sec_ptrs);
 
1048
      flaginfo.sec_ptrs = NULL;
 
1049
    }
 
1050
  if (flaginfo.sym_indices != NULL)
 
1051
    {
 
1052
      free (flaginfo.sym_indices);
 
1053
      flaginfo.sym_indices = NULL;
 
1054
    }
 
1055
  if (flaginfo.linenos != NULL)
 
1056
    {
 
1057
      free (flaginfo.linenos);
 
1058
      flaginfo.linenos = NULL;
 
1059
    }
 
1060
  if (flaginfo.contents != NULL)
 
1061
    {
 
1062
      free (flaginfo.contents);
 
1063
      flaginfo.contents = NULL;
 
1064
    }
 
1065
  if (flaginfo.external_relocs != NULL)
 
1066
    {
 
1067
      free (flaginfo.external_relocs);
 
1068
      flaginfo.external_relocs = NULL;
 
1069
    }
 
1070
  if (flaginfo.internal_relocs != NULL)
 
1071
    {
 
1072
      free (flaginfo.internal_relocs);
 
1073
      flaginfo.internal_relocs = NULL;
 
1074
    }
 
1075
 
 
1076
  /* The value of the last C_FILE symbol is supposed to be the symbol
 
1077
     index of the first external symbol.  Write it out again if
 
1078
     necessary.  */
 
1079
  if (flaginfo.last_file_index != -1
 
1080
      && (unsigned int) flaginfo.last_file.n_value != obj_raw_syment_count (abfd))
 
1081
    {
 
1082
      file_ptr pos;
 
1083
 
 
1084
      flaginfo.last_file.n_value = obj_raw_syment_count (abfd);
 
1085
      bfd_coff_swap_sym_out (abfd, &flaginfo.last_file,
 
1086
                             flaginfo.outsyms);
 
1087
 
 
1088
      pos = obj_sym_filepos (abfd) + flaginfo.last_file_index * symesz;
 
1089
      if (bfd_seek (abfd, pos, SEEK_SET) != 0
 
1090
          || bfd_bwrite (flaginfo.outsyms, symesz, abfd) != symesz)
 
1091
        return FALSE;
 
1092
    }
 
1093
 
 
1094
  /* If doing task linking (ld --task-link) then make a pass through the
 
1095
     global symbols, writing out any that are defined, and making them
 
1096
     static.  */
 
1097
  if (info->task_link)
 
1098
    {
 
1099
      flaginfo.failed = FALSE;
 
1100
      coff_link_hash_traverse (coff_hash_table (info),
 
1101
                               _bfd_coff_write_task_globals, &flaginfo);
 
1102
      if (flaginfo.failed)
 
1103
        goto error_return;
 
1104
    }
 
1105
 
 
1106
  /* Write out the global symbols.  */
 
1107
  flaginfo.failed = FALSE;
 
1108
  bfd_hash_traverse (&info->hash->table, _bfd_coff_write_global_sym, &flaginfo);
 
1109
  if (flaginfo.failed)
 
1110
    goto error_return;
 
1111
 
 
1112
  /* The outsyms buffer is used by _bfd_coff_write_global_sym.  */
 
1113
  if (flaginfo.outsyms != NULL)
 
1114
    {
 
1115
      free (flaginfo.outsyms);
 
1116
      flaginfo.outsyms = NULL;
 
1117
    }
 
1118
 
 
1119
  if (info->relocatable && max_output_reloc_count > 0)
 
1120
    {
 
1121
      /* Now that we have written out all the global symbols, we know
 
1122
         the symbol indices to use for relocs against them, and we can
 
1123
         finally write out the relocs.  */
 
1124
      amt = max_output_reloc_count * relsz;
 
1125
      external_relocs = (bfd_byte *) bfd_malloc (amt);
 
1126
      if (external_relocs == NULL)
 
1127
        goto error_return;
 
1128
 
 
1129
      for (o = abfd->sections; o != NULL; o = o->next)
 
1130
        {
 
1131
          struct internal_reloc *irel;
 
1132
          struct internal_reloc *irelend;
 
1133
          struct coff_link_hash_entry **rel_hash;
 
1134
          bfd_byte *erel;
 
1135
 
 
1136
          if (o->reloc_count == 0)
 
1137
            continue;
 
1138
 
 
1139
          irel = flaginfo.section_info[o->target_index].relocs;
 
1140
          irelend = irel + o->reloc_count;
 
1141
          rel_hash = flaginfo.section_info[o->target_index].rel_hashes;
 
1142
          erel = external_relocs;
 
1143
          for (; irel < irelend; irel++, rel_hash++, erel += relsz)
 
1144
            {
 
1145
              if (*rel_hash != NULL)
 
1146
                {
 
1147
                  BFD_ASSERT ((*rel_hash)->indx >= 0);
 
1148
                  irel->r_symndx = (*rel_hash)->indx;
 
1149
                }
 
1150
              bfd_coff_swap_reloc_out (abfd, irel, erel);
 
1151
            }
 
1152
 
 
1153
          if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0)
 
1154
            goto error_return;
 
1155
          if (obj_pe (abfd) && o->reloc_count >= 0xffff)
 
1156
            {
 
1157
              /* In PE COFF, write the count of relocs as the first
 
1158
                 reloc.  The header overflow bit will be set
 
1159
                 elsewhere. */
 
1160
              struct internal_reloc incount;
 
1161
              bfd_byte *excount = (bfd_byte *)bfd_malloc (relsz);
 
1162
 
 
1163
              memset (&incount, 0, sizeof (incount));
 
1164
              incount.r_vaddr = o->reloc_count + 1;
 
1165
              bfd_coff_swap_reloc_out (abfd, &incount, excount);
 
1166
              if (bfd_bwrite (excount, relsz, abfd) != relsz)
 
1167
                /* We'll leak, but it's an error anyway. */
 
1168
                goto error_return;
 
1169
              free (excount);
 
1170
            }
 
1171
          if (bfd_bwrite (external_relocs,
 
1172
                          (bfd_size_type) relsz * o->reloc_count, abfd)
 
1173
              != (bfd_size_type) relsz * o->reloc_count)
 
1174
            goto error_return;
 
1175
        }
 
1176
 
 
1177
      free (external_relocs);
 
1178
      external_relocs = NULL;
 
1179
    }
 
1180
 
 
1181
  /* Free up the section information.  */
 
1182
  if (flaginfo.section_info != NULL)
 
1183
    {
 
1184
      unsigned int i;
 
1185
 
 
1186
      for (i = 0; i < abfd->section_count; i++)
 
1187
        {
 
1188
          if (flaginfo.section_info[i].relocs != NULL)
 
1189
            free (flaginfo.section_info[i].relocs);
 
1190
          if (flaginfo.section_info[i].rel_hashes != NULL)
 
1191
            free (flaginfo.section_info[i].rel_hashes);
 
1192
        }
 
1193
      free (flaginfo.section_info);
 
1194
      flaginfo.section_info = NULL;
 
1195
    }
 
1196
 
 
1197
  /* If we have optimized stabs strings, output them.  */
 
1198
  if (coff_hash_table (info)->stab_info.stabstr != NULL)
 
1199
    {
 
1200
      if (! _bfd_write_stab_strings (abfd, &coff_hash_table (info)->stab_info))
 
1201
        return FALSE;
 
1202
    }
 
1203
 
 
1204
  /* Write out the string table.  */
 
1205
  if (obj_raw_syment_count (abfd) != 0 || long_section_names)
 
1206
    {
 
1207
      file_ptr pos;
 
1208
 
 
1209
      pos = obj_sym_filepos (abfd) + obj_raw_syment_count (abfd) * symesz;
 
1210
      if (bfd_seek (abfd, pos, SEEK_SET) != 0)
 
1211
        return FALSE;
 
1212
 
 
1213
#if STRING_SIZE_SIZE == 4
 
1214
      H_PUT_32 (abfd,
 
1215
                _bfd_stringtab_size (flaginfo.strtab) + STRING_SIZE_SIZE,
 
1216
                strbuf);
 
1217
#else
 
1218
 #error Change H_PUT_32 above
 
1219
#endif
 
1220
 
 
1221
      if (bfd_bwrite (strbuf, (bfd_size_type) STRING_SIZE_SIZE, abfd)
 
1222
          != STRING_SIZE_SIZE)
 
1223
        return FALSE;
 
1224
 
 
1225
      if (! _bfd_stringtab_emit (abfd, flaginfo.strtab))
 
1226
        return FALSE;
 
1227
 
 
1228
      obj_coff_strings_written (abfd) = TRUE;
 
1229
    }
 
1230
 
 
1231
  _bfd_stringtab_free (flaginfo.strtab);
 
1232
 
 
1233
  /* Setting bfd_get_symcount to 0 will cause write_object_contents to
 
1234
     not try to write out the symbols.  */
 
1235
  bfd_get_symcount (abfd) = 0;
 
1236
 
 
1237
  return TRUE;
 
1238
 
 
1239
 error_return:
 
1240
  if (debug_merge_allocated)
 
1241
    coff_debug_merge_hash_table_free (&flaginfo.debug_merge);
 
1242
  if (flaginfo.strtab != NULL)
 
1243
    _bfd_stringtab_free (flaginfo.strtab);
 
1244
  if (flaginfo.section_info != NULL)
 
1245
    {
 
1246
      unsigned int i;
 
1247
 
 
1248
      for (i = 0; i < abfd->section_count; i++)
 
1249
        {
 
1250
          if (flaginfo.section_info[i].relocs != NULL)
 
1251
            free (flaginfo.section_info[i].relocs);
 
1252
          if (flaginfo.section_info[i].rel_hashes != NULL)
 
1253
            free (flaginfo.section_info[i].rel_hashes);
 
1254
        }
 
1255
      free (flaginfo.section_info);
 
1256
    }
 
1257
  if (flaginfo.internal_syms != NULL)
 
1258
    free (flaginfo.internal_syms);
 
1259
  if (flaginfo.sec_ptrs != NULL)
 
1260
    free (flaginfo.sec_ptrs);
 
1261
  if (flaginfo.sym_indices != NULL)
 
1262
    free (flaginfo.sym_indices);
 
1263
  if (flaginfo.outsyms != NULL)
 
1264
    free (flaginfo.outsyms);
 
1265
  if (flaginfo.linenos != NULL)
 
1266
    free (flaginfo.linenos);
 
1267
  if (flaginfo.contents != NULL)
 
1268
    free (flaginfo.contents);
 
1269
  if (flaginfo.external_relocs != NULL)
 
1270
    free (flaginfo.external_relocs);
 
1271
  if (flaginfo.internal_relocs != NULL)
 
1272
    free (flaginfo.internal_relocs);
 
1273
  if (external_relocs != NULL)
 
1274
    free (external_relocs);
 
1275
  return FALSE;
 
1276
}
 
1277
 
 
1278
/* Parse out a -heap <reserved>,<commit> line.  */
 
1279
 
 
1280
static char *
 
1281
dores_com (char *ptr, bfd *output_bfd, int heap)
 
1282
{
 
1283
  if (coff_data(output_bfd)->pe)
 
1284
    {
 
1285
      int val = strtoul (ptr, &ptr, 0);
 
1286
 
 
1287
      if (heap)
 
1288
        pe_data(output_bfd)->pe_opthdr.SizeOfHeapReserve = val;
 
1289
      else
 
1290
        pe_data(output_bfd)->pe_opthdr.SizeOfStackReserve = val;
 
1291
 
 
1292
      if (ptr[0] == ',')
 
1293
        {
 
1294
          val = strtoul (ptr+1, &ptr, 0);
 
1295
          if (heap)
 
1296
            pe_data(output_bfd)->pe_opthdr.SizeOfHeapCommit = val;
 
1297
          else
 
1298
            pe_data(output_bfd)->pe_opthdr.SizeOfStackCommit = val;
 
1299
        }
 
1300
    }
 
1301
  return ptr;
 
1302
}
 
1303
 
 
1304
static char *
 
1305
get_name (char *ptr, char **dst)
 
1306
{
 
1307
  while (*ptr == ' ')
 
1308
    ptr++;
 
1309
  *dst = ptr;
 
1310
  while (*ptr && *ptr != ' ')
 
1311
    ptr++;
 
1312
  *ptr = 0;
 
1313
  return ptr+1;
 
1314
}
 
1315
 
 
1316
/* Process any magic embedded commands in a section called .drectve.  */
 
1317
 
 
1318
static int
 
1319
process_embedded_commands (bfd *output_bfd,
 
1320
                           struct bfd_link_info *info ATTRIBUTE_UNUSED,
 
1321
                           bfd *abfd)
 
1322
{
 
1323
  asection *sec = bfd_get_section_by_name (abfd, ".drectve");
 
1324
  char *s;
 
1325
  char *e;
 
1326
  bfd_byte *copy;
 
1327
 
 
1328
  if (!sec)
 
1329
    return 1;
 
1330
 
 
1331
  if (!bfd_malloc_and_get_section (abfd, sec, &copy))
 
1332
    {
 
1333
      if (copy != NULL)
 
1334
        free (copy);
 
1335
      return 0;
 
1336
    }
 
1337
  e = (char *) copy + sec->size;
 
1338
 
 
1339
  for (s = (char *) copy; s < e ; )
 
1340
    {
 
1341
      if (s[0] != '-')
 
1342
        {
 
1343
          s++;
 
1344
          continue;
 
1345
        }
 
1346
      if (CONST_STRNEQ (s, "-attr"))
 
1347
        {
 
1348
          char *name;
 
1349
          char *attribs;
 
1350
          asection *asec;
 
1351
          int loop = 1;
 
1352
          int had_write = 0;
 
1353
          int had_exec= 0;
 
1354
 
 
1355
          s += 5;
 
1356
          s = get_name (s, &name);
 
1357
          s = get_name (s, &attribs);
 
1358
 
 
1359
          while (loop)
 
1360
            {
 
1361
              switch (*attribs++)
 
1362
                {
 
1363
                case 'W':
 
1364
                  had_write = 1;
 
1365
                  break;
 
1366
                case 'R':
 
1367
                  break;
 
1368
                case 'S':
 
1369
                  break;
 
1370
                case 'X':
 
1371
                  had_exec = 1;
 
1372
                  break;
 
1373
                default:
 
1374
                  loop = 0;
 
1375
                }
 
1376
            }
 
1377
          asec = bfd_get_section_by_name (abfd, name);
 
1378
          if (asec)
 
1379
            {
 
1380
              if (had_exec)
 
1381
                asec->flags |= SEC_CODE;
 
1382
              if (!had_write)
 
1383
                asec->flags |= SEC_READONLY;
 
1384
            }
 
1385
        }
 
1386
      else if (CONST_STRNEQ (s, "-heap"))
 
1387
        s = dores_com (s + 5, output_bfd, 1);
 
1388
 
 
1389
      else if (CONST_STRNEQ (s, "-stack"))
 
1390
        s = dores_com (s + 6, output_bfd, 0);
 
1391
 
 
1392
      /* GNU extension for aligned commons.  */
 
1393
      else if (CONST_STRNEQ (s, "-aligncomm:"))
 
1394
        {
 
1395
          /* Common symbols must be aligned on reading, as it
 
1396
          is too late to do anything here, after they have
 
1397
          already been allocated, so just skip the directive.  */
 
1398
          s += 11;
 
1399
        }
 
1400
 
 
1401
      else
 
1402
        s++;
 
1403
    }
 
1404
  free (copy);
 
1405
  return 1;
 
1406
}
 
1407
 
 
1408
/* Place a marker against all symbols which are used by relocations.
 
1409
   This marker can be picked up by the 'do we skip this symbol ?'
 
1410
   loop in _bfd_coff_link_input_bfd() and used to prevent skipping
 
1411
   that symbol.  */
 
1412
 
 
1413
static void
 
1414
mark_relocs (struct coff_final_link_info *flaginfo, bfd *input_bfd)
 
1415
{
 
1416
  asection * a;
 
1417
 
 
1418
  if ((bfd_get_file_flags (input_bfd) & HAS_SYMS) == 0)
 
1419
    return;
 
1420
 
 
1421
  for (a = input_bfd->sections; a != (asection *) NULL; a = a->next)
 
1422
    {
 
1423
      struct internal_reloc *   internal_relocs;
 
1424
      struct internal_reloc *   irel;
 
1425
      struct internal_reloc *   irelend;
 
1426
 
 
1427
      if ((a->flags & SEC_RELOC) == 0 || a->reloc_count  < 1
 
1428
          || a->linker_mark == 0)
 
1429
        continue;
 
1430
      /* Don't mark relocs in excluded sections.  */
 
1431
      if (a->output_section == bfd_abs_section_ptr)
 
1432
        continue;
 
1433
 
 
1434
      /* Read in the relocs.  */
 
1435
      internal_relocs = _bfd_coff_read_internal_relocs
 
1436
        (input_bfd, a, FALSE,
 
1437
         flaginfo->external_relocs,
 
1438
         flaginfo->info->relocatable,
 
1439
         (flaginfo->info->relocatable
 
1440
          ? (flaginfo->section_info[ a->output_section->target_index ].relocs + a->output_section->reloc_count)
 
1441
          : flaginfo->internal_relocs)
 
1442
        );
 
1443
 
 
1444
      if (internal_relocs == NULL)
 
1445
        continue;
 
1446
 
 
1447
      irel     = internal_relocs;
 
1448
      irelend  = irel + a->reloc_count;
 
1449
 
 
1450
      /* Place a mark in the sym_indices array (whose entries have
 
1451
         been initialised to 0) for all of the symbols that are used
 
1452
         in the relocation table.  This will then be picked up in the
 
1453
         skip/don't-skip pass.  */
 
1454
      for (; irel < irelend; irel++)
 
1455
        flaginfo->sym_indices[ irel->r_symndx ] = -1;
 
1456
    }
 
1457
}
 
1458
 
 
1459
/* Link an input file into the linker output file.  This function
 
1460
   handles all the sections and relocations of the input file at once.  */
 
1461
 
 
1462
bfd_boolean
 
1463
_bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
 
1464
{
 
1465
  unsigned int n_tmask = coff_data (input_bfd)->local_n_tmask;
 
1466
  unsigned int n_btshft = coff_data (input_bfd)->local_n_btshft;
 
1467
  bfd_boolean (*adjust_symndx)
 
1468
    (bfd *, struct bfd_link_info *, bfd *, asection *,
 
1469
     struct internal_reloc *, bfd_boolean *);
 
1470
  bfd *output_bfd;
 
1471
  const char *strings;
 
1472
  bfd_size_type syment_base;
 
1473
  bfd_boolean copy, hash;
 
1474
  bfd_size_type isymesz;
 
1475
  bfd_size_type osymesz;
 
1476
  bfd_size_type linesz;
 
1477
  bfd_byte *esym;
 
1478
  bfd_byte *esym_end;
 
1479
  struct internal_syment *isymp;
 
1480
  asection **secpp;
 
1481
  long *indexp;
 
1482
  unsigned long output_index;
 
1483
  bfd_byte *outsym;
 
1484
  struct coff_link_hash_entry **sym_hash;
 
1485
  asection *o;
 
1486
 
 
1487
  /* Move all the symbols to the output file.  */
 
1488
 
 
1489
  output_bfd = flaginfo->output_bfd;
 
1490
  strings = NULL;
 
1491
  syment_base = obj_raw_syment_count (output_bfd);
 
1492
  isymesz = bfd_coff_symesz (input_bfd);
 
1493
  osymesz = bfd_coff_symesz (output_bfd);
 
1494
  linesz = bfd_coff_linesz (input_bfd);
 
1495
  BFD_ASSERT (linesz == bfd_coff_linesz (output_bfd));
 
1496
 
 
1497
  copy = FALSE;
 
1498
  if (! flaginfo->info->keep_memory)
 
1499
    copy = TRUE;
 
1500
  hash = TRUE;
 
1501
  if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
 
1502
    hash = FALSE;
 
1503
 
 
1504
  if (! _bfd_coff_get_external_symbols (input_bfd))
 
1505
    return FALSE;
 
1506
 
 
1507
  esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
 
1508
  esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
 
1509
  isymp = flaginfo->internal_syms;
 
1510
  secpp = flaginfo->sec_ptrs;
 
1511
  indexp = flaginfo->sym_indices;
 
1512
  output_index = syment_base;
 
1513
  outsym = flaginfo->outsyms;
 
1514
 
 
1515
  if (coff_data (output_bfd)->pe
 
1516
      && ! process_embedded_commands (output_bfd, flaginfo->info, input_bfd))
 
1517
    return FALSE;
 
1518
 
 
1519
  /* If we are going to perform relocations and also strip/discard some
 
1520
     symbols then we must make sure that we do not strip/discard those
 
1521
     symbols that are going to be involved in the relocations.  */
 
1522
  if ((   flaginfo->info->strip   != strip_none
 
1523
       || flaginfo->info->discard != discard_none)
 
1524
      && flaginfo->info->relocatable)
 
1525
    {
 
1526
      /* Mark the symbol array as 'not-used'.  */
 
1527
      memset (indexp, 0, obj_raw_syment_count (input_bfd) * sizeof * indexp);
 
1528
 
 
1529
      mark_relocs (flaginfo, input_bfd);
 
1530
    }
 
1531
 
 
1532
  while (esym < esym_end)
 
1533
    {
 
1534
      struct internal_syment isym;
 
1535
      enum coff_symbol_classification classification;
 
1536
      bfd_boolean skip;
 
1537
      bfd_boolean global;
 
1538
      bfd_boolean dont_skip_symbol;
 
1539
      int add;
 
1540
 
 
1541
      bfd_coff_swap_sym_in (input_bfd, esym, isymp);
 
1542
 
 
1543
      /* Make a copy of *isymp so that the relocate_section function
 
1544
         always sees the original values.  This is more reliable than
 
1545
         always recomputing the symbol value even if we are stripping
 
1546
         the symbol.  */
 
1547
      isym = *isymp;
 
1548
 
 
1549
      classification = bfd_coff_classify_symbol (input_bfd, &isym);
 
1550
      switch (classification)
 
1551
        {
 
1552
        default:
 
1553
          abort ();
 
1554
        case COFF_SYMBOL_GLOBAL:
 
1555
        case COFF_SYMBOL_PE_SECTION:
 
1556
        case COFF_SYMBOL_LOCAL:
 
1557
          *secpp = coff_section_from_bfd_index (input_bfd, isym.n_scnum);
 
1558
          break;
 
1559
        case COFF_SYMBOL_COMMON:
 
1560
          *secpp = bfd_com_section_ptr;
 
1561
          break;
 
1562
        case COFF_SYMBOL_UNDEFINED:
 
1563
          *secpp = bfd_und_section_ptr;
 
1564
          break;
 
1565
        }
 
1566
 
 
1567
      /* Extract the flag indicating if this symbol is used by a
 
1568
         relocation.  */
 
1569
      if ((flaginfo->info->strip != strip_none
 
1570
           || flaginfo->info->discard != discard_none)
 
1571
          && flaginfo->info->relocatable)
 
1572
        dont_skip_symbol = *indexp;
 
1573
      else
 
1574
        dont_skip_symbol = FALSE;
 
1575
 
 
1576
      *indexp = -1;
 
1577
 
 
1578
      skip = FALSE;
 
1579
      global = FALSE;
 
1580
      add = 1 + isym.n_numaux;
 
1581
 
 
1582
      /* If we are stripping all symbols, we want to skip this one.  */
 
1583
      if (flaginfo->info->strip == strip_all && ! dont_skip_symbol)
 
1584
        skip = TRUE;
 
1585
 
 
1586
      if (! skip)
 
1587
        {
 
1588
          switch (classification)
 
1589
            {
 
1590
            default:
 
1591
              abort ();
 
1592
            case COFF_SYMBOL_GLOBAL:
 
1593
            case COFF_SYMBOL_COMMON:
 
1594
            case COFF_SYMBOL_PE_SECTION:
 
1595
              /* This is a global symbol.  Global symbols come at the
 
1596
                 end of the symbol table, so skip them for now.
 
1597
                 Locally defined function symbols, however, are an
 
1598
                 exception, and are not moved to the end.  */
 
1599
              global = TRUE;
 
1600
              if (! ISFCN (isym.n_type))
 
1601
                skip = TRUE;
 
1602
              break;
 
1603
 
 
1604
            case COFF_SYMBOL_UNDEFINED:
 
1605
              /* Undefined symbols are left for the end.  */
 
1606
              global = TRUE;
 
1607
              skip = TRUE;
 
1608
              break;
 
1609
 
 
1610
            case COFF_SYMBOL_LOCAL:
 
1611
              /* This is a local symbol.  Skip it if we are discarding
 
1612
                 local symbols.  */
 
1613
              if (flaginfo->info->discard == discard_all && ! dont_skip_symbol)
 
1614
                skip = TRUE;
 
1615
              break;
 
1616
            }
 
1617
        }
 
1618
 
 
1619
#ifndef COFF_WITH_PE
 
1620
      /* Skip section symbols for sections which are not going to be
 
1621
         emitted.  */
 
1622
      if (!skip
 
1623
          && !dont_skip_symbol
 
1624
          && isym.n_sclass == C_STAT
 
1625
          && isym.n_type == T_NULL
 
1626
          && isym.n_numaux > 0
 
1627
          && ((*secpp)->output_section == bfd_abs_section_ptr
 
1628
              || bfd_section_removed_from_list (output_bfd,
 
1629
                                                (*secpp)->output_section)))
 
1630
        skip = TRUE;
 
1631
#endif
 
1632
 
 
1633
      /* If we stripping debugging symbols, and this is a debugging
 
1634
         symbol, then skip it.  FIXME: gas sets the section to N_ABS
 
1635
         for some types of debugging symbols; I don't know if this is
 
1636
         a bug or not.  In any case, we handle it here.  */
 
1637
      if (! skip
 
1638
          && flaginfo->info->strip == strip_debugger
 
1639
          && ! dont_skip_symbol
 
1640
          && (isym.n_scnum == N_DEBUG
 
1641
              || (isym.n_scnum == N_ABS
 
1642
                  && (isym.n_sclass == C_AUTO
 
1643
                      || isym.n_sclass == C_REG
 
1644
                      || isym.n_sclass == C_MOS
 
1645
                      || isym.n_sclass == C_MOE
 
1646
                      || isym.n_sclass == C_MOU
 
1647
                      || isym.n_sclass == C_ARG
 
1648
                      || isym.n_sclass == C_REGPARM
 
1649
                      || isym.n_sclass == C_FIELD
 
1650
                      || isym.n_sclass == C_EOS))))
 
1651
        skip = TRUE;
 
1652
 
 
1653
      /* If some symbols are stripped based on the name, work out the
 
1654
         name and decide whether to skip this symbol.  */
 
1655
      if (! skip
 
1656
          && (flaginfo->info->strip == strip_some
 
1657
              || flaginfo->info->discard == discard_l))
 
1658
        {
 
1659
          const char *name;
 
1660
          char buf[SYMNMLEN + 1];
 
1661
 
 
1662
          name = _bfd_coff_internal_syment_name (input_bfd, &isym, buf);
 
1663
          if (name == NULL)
 
1664
            return FALSE;
 
1665
 
 
1666
          if (! dont_skip_symbol
 
1667
              && ((flaginfo->info->strip == strip_some
 
1668
                   && (bfd_hash_lookup (flaginfo->info->keep_hash, name, FALSE,
 
1669
                                    FALSE) == NULL))
 
1670
                   || (! global
 
1671
                       && flaginfo->info->discard == discard_l
 
1672
                       && bfd_is_local_label_name (input_bfd, name))))
 
1673
            skip = TRUE;
 
1674
        }
 
1675
 
 
1676
      /* If this is an enum, struct, or union tag, see if we have
 
1677
         already output an identical type.  */
 
1678
      if (! skip
 
1679
          && (flaginfo->output_bfd->flags & BFD_TRADITIONAL_FORMAT) == 0
 
1680
          && (isym.n_sclass == C_ENTAG
 
1681
              || isym.n_sclass == C_STRTAG
 
1682
              || isym.n_sclass == C_UNTAG)
 
1683
          && isym.n_numaux == 1)
 
1684
        {
 
1685
          const char *name;
 
1686
          char buf[SYMNMLEN + 1];
 
1687
          struct coff_debug_merge_hash_entry *mh;
 
1688
          struct coff_debug_merge_type *mt;
 
1689
          union internal_auxent aux;
 
1690
          struct coff_debug_merge_element **epp;
 
1691
          bfd_byte *esl, *eslend;
 
1692
          struct internal_syment *islp;
 
1693
          bfd_size_type amt;
 
1694
 
 
1695
          name = _bfd_coff_internal_syment_name (input_bfd, &isym, buf);
 
1696
          if (name == NULL)
 
1697
            return FALSE;
 
1698
 
 
1699
          /* Ignore fake names invented by compiler; treat them all as
 
1700
             the same name.  */
 
1701
          if (*name == '~' || *name == '.' || *name == '$'
 
1702
              || (*name == bfd_get_symbol_leading_char (input_bfd)
 
1703
                  && (name[1] == '~' || name[1] == '.' || name[1] == '$')))
 
1704
            name = "";
 
1705
 
 
1706
          mh = coff_debug_merge_hash_lookup (&flaginfo->debug_merge, name,
 
1707
                                             TRUE, TRUE);
 
1708
          if (mh == NULL)
 
1709
            return FALSE;
 
1710
 
 
1711
          /* Allocate memory to hold type information.  If this turns
 
1712
             out to be a duplicate, we pass this address to
 
1713
             bfd_release.  */
 
1714
          amt = sizeof (struct coff_debug_merge_type);
 
1715
          mt = (struct coff_debug_merge_type *) bfd_alloc (input_bfd, amt);
 
1716
          if (mt == NULL)
 
1717
            return FALSE;
 
1718
          mt->type_class = isym.n_sclass;
 
1719
 
 
1720
          /* Pick up the aux entry, which points to the end of the tag
 
1721
             entries.  */
 
1722
          bfd_coff_swap_aux_in (input_bfd, (esym + isymesz),
 
1723
                                isym.n_type, isym.n_sclass, 0, isym.n_numaux,
 
1724
                                &aux);
 
1725
 
 
1726
          /* Gather the elements.  */
 
1727
          epp = &mt->elements;
 
1728
          mt->elements = NULL;
 
1729
          islp = isymp + 2;
 
1730
          esl = esym + 2 * isymesz;
 
1731
          eslend = ((bfd_byte *) obj_coff_external_syms (input_bfd)
 
1732
                    + aux.x_sym.x_fcnary.x_fcn.x_endndx.l * isymesz);
 
1733
          while (esl < eslend)
 
1734
            {
 
1735
              const char *elename;
 
1736
              char elebuf[SYMNMLEN + 1];
 
1737
              char *name_copy;
 
1738
 
 
1739
              bfd_coff_swap_sym_in (input_bfd, esl, islp);
 
1740
 
 
1741
              amt = sizeof (struct coff_debug_merge_element);
 
1742
              *epp = (struct coff_debug_merge_element *)
 
1743
                  bfd_alloc (input_bfd, amt);
 
1744
              if (*epp == NULL)
 
1745
                return FALSE;
 
1746
 
 
1747
              elename = _bfd_coff_internal_syment_name (input_bfd, islp,
 
1748
                                                        elebuf);
 
1749
              if (elename == NULL)
 
1750
                return FALSE;
 
1751
 
 
1752
              amt = strlen (elename) + 1;
 
1753
              name_copy = (char *) bfd_alloc (input_bfd, amt);
 
1754
              if (name_copy == NULL)
 
1755
                return FALSE;
 
1756
              strcpy (name_copy, elename);
 
1757
 
 
1758
              (*epp)->name = name_copy;
 
1759
              (*epp)->type = islp->n_type;
 
1760
              (*epp)->tagndx = 0;
 
1761
              if (islp->n_numaux >= 1
 
1762
                  && islp->n_type != T_NULL
 
1763
                  && islp->n_sclass != C_EOS)
 
1764
                {
 
1765
                  union internal_auxent eleaux;
 
1766
                  long indx;
 
1767
 
 
1768
                  bfd_coff_swap_aux_in (input_bfd, (esl + isymesz),
 
1769
                                        islp->n_type, islp->n_sclass, 0,
 
1770
                                        islp->n_numaux, &eleaux);
 
1771
                  indx = eleaux.x_sym.x_tagndx.l;
 
1772
 
 
1773
                  /* FIXME: If this tagndx entry refers to a symbol
 
1774
                     defined later in this file, we just ignore it.
 
1775
                     Handling this correctly would be tedious, and may
 
1776
                     not be required.  */
 
1777
                  if (indx > 0
 
1778
                      && (indx
 
1779
                          < ((esym -
 
1780
                              (bfd_byte *) obj_coff_external_syms (input_bfd))
 
1781
                             / (long) isymesz)))
 
1782
                    {
 
1783
                      (*epp)->tagndx = flaginfo->sym_indices[indx];
 
1784
                      if ((*epp)->tagndx < 0)
 
1785
                        (*epp)->tagndx = 0;
 
1786
                    }
 
1787
                }
 
1788
              epp = &(*epp)->next;
 
1789
              *epp = NULL;
 
1790
 
 
1791
              esl += (islp->n_numaux + 1) * isymesz;
 
1792
              islp += islp->n_numaux + 1;
 
1793
            }
 
1794
 
 
1795
          /* See if we already have a definition which matches this
 
1796
             type.  We always output the type if it has no elements,
 
1797
             for simplicity.  */
 
1798
          if (mt->elements == NULL)
 
1799
            bfd_release (input_bfd, mt);
 
1800
          else
 
1801
            {
 
1802
              struct coff_debug_merge_type *mtl;
 
1803
 
 
1804
              for (mtl = mh->types; mtl != NULL; mtl = mtl->next)
 
1805
                {
 
1806
                  struct coff_debug_merge_element *me, *mel;
 
1807
 
 
1808
                  if (mtl->type_class != mt->type_class)
 
1809
                    continue;
 
1810
 
 
1811
                  for (me = mt->elements, mel = mtl->elements;
 
1812
                       me != NULL && mel != NULL;
 
1813
                       me = me->next, mel = mel->next)
 
1814
                    {
 
1815
                      if (strcmp (me->name, mel->name) != 0
 
1816
                          || me->type != mel->type
 
1817
                          || me->tagndx != mel->tagndx)
 
1818
                        break;
 
1819
                    }
 
1820
 
 
1821
                  if (me == NULL && mel == NULL)
 
1822
                    break;
 
1823
                }
 
1824
 
 
1825
              if (mtl == NULL || (bfd_size_type) mtl->indx >= syment_base)
 
1826
                {
 
1827
                  /* This is the first definition of this type.  */
 
1828
                  mt->indx = output_index;
 
1829
                  mt->next = mh->types;
 
1830
                  mh->types = mt;
 
1831
                }
 
1832
              else
 
1833
                {
 
1834
                  /* This is a redefinition which can be merged.  */
 
1835
                  bfd_release (input_bfd, mt);
 
1836
                  *indexp = mtl->indx;
 
1837
                  add = (eslend - esym) / isymesz;
 
1838
                  skip = TRUE;
 
1839
                }
 
1840
            }
 
1841
        }
 
1842
 
 
1843
      /* We now know whether we are to skip this symbol or not.  */
 
1844
      if (! skip)
 
1845
        {
 
1846
          /* Adjust the symbol in order to output it.  */
 
1847
 
 
1848
          if (isym._n._n_n._n_zeroes == 0
 
1849
              && isym._n._n_n._n_offset != 0)
 
1850
            {
 
1851
              const char *name;
 
1852
              bfd_size_type indx;
 
1853
 
 
1854
              /* This symbol has a long name.  Enter it in the string
 
1855
                 table we are building.  Note that we do not check
 
1856
                 bfd_coff_symname_in_debug.  That is only true for
 
1857
                 XCOFF, and XCOFF requires different linking code
 
1858
                 anyhow.  */
 
1859
              name = _bfd_coff_internal_syment_name (input_bfd, &isym, NULL);
 
1860
              if (name == NULL)
 
1861
                return FALSE;
 
1862
              indx = _bfd_stringtab_add (flaginfo->strtab, name, hash, copy);
 
1863
              if (indx == (bfd_size_type) -1)
 
1864
                return FALSE;
 
1865
              isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
 
1866
            }
 
1867
 
 
1868
          switch (isym.n_sclass)
 
1869
            {
 
1870
            case C_AUTO:
 
1871
            case C_MOS:
 
1872
            case C_EOS:
 
1873
            case C_MOE:
 
1874
            case C_MOU:
 
1875
            case C_UNTAG:
 
1876
            case C_STRTAG:
 
1877
            case C_ENTAG:
 
1878
            case C_TPDEF:
 
1879
            case C_ARG:
 
1880
            case C_USTATIC:
 
1881
            case C_REG:
 
1882
            case C_REGPARM:
 
1883
            case C_FIELD:
 
1884
              /* The symbol value should not be modified.  */
 
1885
              break;
 
1886
 
 
1887
            case C_FCN:
 
1888
              if (obj_pe (input_bfd)
 
1889
                  && strcmp (isym.n_name, ".bf") != 0
 
1890
                  && isym.n_scnum > 0)
 
1891
                {
 
1892
                  /* For PE, .lf and .ef get their value left alone,
 
1893
                     while .bf gets relocated.  However, they all have
 
1894
                     "real" section numbers, and need to be moved into
 
1895
                     the new section.  */
 
1896
                  isym.n_scnum = (*secpp)->output_section->target_index;
 
1897
                  break;
 
1898
                }
 
1899
              /* Fall through.  */
 
1900
            default:
 
1901
            case C_LABEL:  /* Not completely sure about these 2 */
 
1902
            case C_EXTDEF:
 
1903
            case C_BLOCK:
 
1904
            case C_EFCN:
 
1905
            case C_NULL:
 
1906
            case C_EXT:
 
1907
            case C_STAT:
 
1908
            case C_SECTION:
 
1909
            case C_NT_WEAK:
 
1910
              /* Compute new symbol location.  */
 
1911
            if (isym.n_scnum > 0)
 
1912
              {
 
1913
                isym.n_scnum = (*secpp)->output_section->target_index;
 
1914
                isym.n_value += (*secpp)->output_offset;
 
1915
                if (! obj_pe (input_bfd))
 
1916
                  isym.n_value -= (*secpp)->vma;
 
1917
                if (! obj_pe (flaginfo->output_bfd))
 
1918
                  isym.n_value += (*secpp)->output_section->vma;
 
1919
              }
 
1920
            break;
 
1921
 
 
1922
            case C_FILE:
 
1923
              /* The value of a C_FILE symbol is the symbol index of
 
1924
                 the next C_FILE symbol.  The value of the last C_FILE
 
1925
                 symbol is the symbol index to the first external
 
1926
                 symbol (actually, coff_renumber_symbols does not get
 
1927
                 this right--it just sets the value of the last C_FILE
 
1928
                 symbol to zero--and nobody has ever complained about
 
1929
                 it).  We try to get this right, below, just before we
 
1930
                 write the symbols out, but in the general case we may
 
1931
                 have to write the symbol out twice.  */
 
1932
              if (flaginfo->last_file_index != -1
 
1933
                  && flaginfo->last_file.n_value != (bfd_vma) output_index)
 
1934
                {
 
1935
                  /* We must correct the value of the last C_FILE
 
1936
                     entry.  */
 
1937
                  flaginfo->last_file.n_value = output_index;
 
1938
                  if ((bfd_size_type) flaginfo->last_file_index >= syment_base)
 
1939
                    {
 
1940
                      /* The last C_FILE symbol is in this input file.  */
 
1941
                      bfd_coff_swap_sym_out (output_bfd,
 
1942
                                             &flaginfo->last_file,
 
1943
                                             (flaginfo->outsyms
 
1944
                                              + ((flaginfo->last_file_index
 
1945
                                                  - syment_base)
 
1946
                                                 * osymesz)));
 
1947
                    }
 
1948
                  else
 
1949
                    {
 
1950
                      file_ptr pos;
 
1951
 
 
1952
                      /* We have already written out the last C_FILE
 
1953
                         symbol.  We need to write it out again.  We
 
1954
                         borrow *outsym temporarily.  */
 
1955
                      bfd_coff_swap_sym_out (output_bfd,
 
1956
                                             &flaginfo->last_file, outsym);
 
1957
                      pos = obj_sym_filepos (output_bfd);
 
1958
                      pos += flaginfo->last_file_index * osymesz;
 
1959
                      if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
 
1960
                          || bfd_bwrite (outsym, osymesz, output_bfd) != osymesz)
 
1961
                        return FALSE;
 
1962
                    }
 
1963
                }
 
1964
 
 
1965
              flaginfo->last_file_index = output_index;
 
1966
              flaginfo->last_file = isym;
 
1967
              break;
 
1968
            }
 
1969
 
 
1970
          /* If doing task linking, convert normal global function symbols to
 
1971
             static functions.  */
 
1972
          if (flaginfo->info->task_link && IS_EXTERNAL (input_bfd, isym))
 
1973
            isym.n_sclass = C_STAT;
 
1974
 
 
1975
          /* Output the symbol.  */
 
1976
          bfd_coff_swap_sym_out (output_bfd, &isym, outsym);
 
1977
 
 
1978
          *indexp = output_index;
 
1979
 
 
1980
          if (global)
 
1981
            {
 
1982
              long indx;
 
1983
              struct coff_link_hash_entry *h;
 
1984
 
 
1985
              indx = ((esym - (bfd_byte *) obj_coff_external_syms (input_bfd))
 
1986
                      / isymesz);
 
1987
              h = obj_coff_sym_hashes (input_bfd)[indx];
 
1988
              if (h == NULL)
 
1989
                {
 
1990
                  /* This can happen if there were errors earlier in
 
1991
                     the link.  */
 
1992
                  bfd_set_error (bfd_error_bad_value);
 
1993
                  return FALSE;
 
1994
                }
 
1995
              h->indx = output_index;
 
1996
            }
 
1997
 
 
1998
          output_index += add;
 
1999
          outsym += add * osymesz;
 
2000
        }
 
2001
 
 
2002
      esym += add * isymesz;
 
2003
      isymp += add;
 
2004
      ++secpp;
 
2005
      ++indexp;
 
2006
      for (--add; add > 0; --add)
 
2007
        {
 
2008
          *secpp++ = NULL;
 
2009
          *indexp++ = -1;
 
2010
        }
 
2011
    }
 
2012
 
 
2013
  /* Fix up the aux entries.  This must be done in a separate pass,
 
2014
     because we don't know the correct symbol indices until we have
 
2015
     already decided which symbols we are going to keep.  */
 
2016
  esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
 
2017
  esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
 
2018
  isymp = flaginfo->internal_syms;
 
2019
  indexp = flaginfo->sym_indices;
 
2020
  sym_hash = obj_coff_sym_hashes (input_bfd);
 
2021
  outsym = flaginfo->outsyms;
 
2022
 
 
2023
  while (esym < esym_end)
 
2024
    {
 
2025
      int add;
 
2026
 
 
2027
      add = 1 + isymp->n_numaux;
 
2028
 
 
2029
      if ((*indexp < 0
 
2030
           || (bfd_size_type) *indexp < syment_base)
 
2031
          && (*sym_hash == NULL
 
2032
              || (*sym_hash)->auxbfd != input_bfd))
 
2033
        esym += add * isymesz;
 
2034
      else
 
2035
        {
 
2036
          struct coff_link_hash_entry *h;
 
2037
          int i;
 
2038
 
 
2039
          h = NULL;
 
2040
          if (*indexp < 0)
 
2041
            {
 
2042
              h = *sym_hash;
 
2043
 
 
2044
              /* The m68k-motorola-sysv assembler will sometimes
 
2045
                 generate two symbols with the same name, but only one
 
2046
                 will have aux entries.  */
 
2047
              BFD_ASSERT (isymp->n_numaux == 0
 
2048
                          || h->numaux == 0
 
2049
                          || h->numaux == isymp->n_numaux);
 
2050
            }
 
2051
 
 
2052
          esym += isymesz;
 
2053
 
 
2054
          if (h == NULL)
 
2055
            outsym += osymesz;
 
2056
 
 
2057
          /* Handle the aux entries.  This handling is based on
 
2058
             coff_pointerize_aux.  I don't know if it always correct.  */
 
2059
          for (i = 0; i < isymp->n_numaux && esym < esym_end; i++)
 
2060
            {
 
2061
              union internal_auxent aux;
 
2062
              union internal_auxent *auxp;
 
2063
 
 
2064
              if (h != NULL && h->aux != NULL && (h->numaux > i))
 
2065
                auxp = h->aux + i;
 
2066
              else
 
2067
                {
 
2068
                  bfd_coff_swap_aux_in (input_bfd, esym, isymp->n_type,
 
2069
                                        isymp->n_sclass, i, isymp->n_numaux, &aux);
 
2070
                  auxp = &aux;
 
2071
                }
 
2072
 
 
2073
              if (isymp->n_sclass == C_FILE)
 
2074
                {
 
2075
                  /* If this is a long filename, we must put it in the
 
2076
                     string table.  */
 
2077
                  if (auxp->x_file.x_n.x_zeroes == 0
 
2078
                      && auxp->x_file.x_n.x_offset != 0)
 
2079
                    {
 
2080
                      const char *filename;
 
2081
                      bfd_size_type indx;
 
2082
 
 
2083
                      BFD_ASSERT (auxp->x_file.x_n.x_offset
 
2084
                                  >= STRING_SIZE_SIZE);
 
2085
                      if (strings == NULL)
 
2086
                        {
 
2087
                          strings = _bfd_coff_read_string_table (input_bfd);
 
2088
                          if (strings == NULL)
 
2089
                            return FALSE;
 
2090
                        }
 
2091
                      filename = strings + auxp->x_file.x_n.x_offset;
 
2092
                      indx = _bfd_stringtab_add (flaginfo->strtab, filename,
 
2093
                                                 hash, copy);
 
2094
                      if (indx == (bfd_size_type) -1)
 
2095
                        return FALSE;
 
2096
                      auxp->x_file.x_n.x_offset = STRING_SIZE_SIZE + indx;
 
2097
                    }
 
2098
                }
 
2099
              else if ((isymp->n_sclass != C_STAT || isymp->n_type != T_NULL)
 
2100
                       && isymp->n_sclass != C_NT_WEAK)
 
2101
                {
 
2102
                  unsigned long indx;
 
2103
 
 
2104
                  if (ISFCN (isymp->n_type)
 
2105
                      || ISTAG (isymp->n_sclass)
 
2106
                      || isymp->n_sclass == C_BLOCK
 
2107
                      || isymp->n_sclass == C_FCN)
 
2108
                    {
 
2109
                      indx = auxp->x_sym.x_fcnary.x_fcn.x_endndx.l;
 
2110
                      if (indx > 0
 
2111
                          && indx < obj_raw_syment_count (input_bfd))
 
2112
                        {
 
2113
                          /* We look forward through the symbol for
 
2114
                             the index of the next symbol we are going
 
2115
                             to include.  I don't know if this is
 
2116
                             entirely right.  */
 
2117
                          while ((flaginfo->sym_indices[indx] < 0
 
2118
                                  || ((bfd_size_type) flaginfo->sym_indices[indx]
 
2119
                                      < syment_base))
 
2120
                                 && indx < obj_raw_syment_count (input_bfd))
 
2121
                            ++indx;
 
2122
                          if (indx >= obj_raw_syment_count (input_bfd))
 
2123
                            indx = output_index;
 
2124
                          else
 
2125
                            indx = flaginfo->sym_indices[indx];
 
2126
                          auxp->x_sym.x_fcnary.x_fcn.x_endndx.l = indx;
 
2127
                        }
 
2128
                    }
 
2129
 
 
2130
                  indx = auxp->x_sym.x_tagndx.l;
 
2131
                  if (indx > 0 && indx < obj_raw_syment_count (input_bfd))
 
2132
                    {
 
2133
                      long symindx;
 
2134
 
 
2135
                      symindx = flaginfo->sym_indices[indx];
 
2136
                      if (symindx < 0)
 
2137
                        auxp->x_sym.x_tagndx.l = 0;
 
2138
                      else
 
2139
                        auxp->x_sym.x_tagndx.l = symindx;
 
2140
                    }
 
2141
 
 
2142
                  /* The .bf symbols are supposed to be linked through
 
2143
                     the endndx field.  We need to carry this list
 
2144
                     across object files.  */
 
2145
                  if (i == 0
 
2146
                      && h == NULL
 
2147
                      && isymp->n_sclass == C_FCN
 
2148
                      && (isymp->_n._n_n._n_zeroes != 0
 
2149
                          || isymp->_n._n_n._n_offset == 0)
 
2150
                      && isymp->_n._n_name[0] == '.'
 
2151
                      && isymp->_n._n_name[1] == 'b'
 
2152
                      && isymp->_n._n_name[2] == 'f'
 
2153
                      && isymp->_n._n_name[3] == '\0')
 
2154
                    {
 
2155
                      if (flaginfo->last_bf_index != -1)
 
2156
                        {
 
2157
                          flaginfo->last_bf.x_sym.x_fcnary.x_fcn.x_endndx.l =
 
2158
                            *indexp;
 
2159
 
 
2160
                          if ((bfd_size_type) flaginfo->last_bf_index
 
2161
                              >= syment_base)
 
2162
                            {
 
2163
                              void *auxout;
 
2164
 
 
2165
                              /* The last .bf symbol is in this input
 
2166
                                 file.  This will only happen if the
 
2167
                                 assembler did not set up the .bf
 
2168
                                 endndx symbols correctly.  */
 
2169
                              auxout = (flaginfo->outsyms
 
2170
                                        + ((flaginfo->last_bf_index
 
2171
                                            - syment_base)
 
2172
                                           * osymesz));
 
2173
 
 
2174
                              bfd_coff_swap_aux_out (output_bfd,
 
2175
                                                     &flaginfo->last_bf,
 
2176
                                                     isymp->n_type,
 
2177
                                                     isymp->n_sclass,
 
2178
                                                     0, isymp->n_numaux,
 
2179
                                                     auxout);
 
2180
                            }
 
2181
                          else
 
2182
                            {
 
2183
                              file_ptr pos;
 
2184
 
 
2185
                              /* We have already written out the last
 
2186
                                 .bf aux entry.  We need to write it
 
2187
                                 out again.  We borrow *outsym
 
2188
                                 temporarily.  FIXME: This case should
 
2189
                                 be made faster.  */
 
2190
                              bfd_coff_swap_aux_out (output_bfd,
 
2191
                                                     &flaginfo->last_bf,
 
2192
                                                     isymp->n_type,
 
2193
                                                     isymp->n_sclass,
 
2194
                                                     0, isymp->n_numaux,
 
2195
                                                     outsym);
 
2196
                              pos = obj_sym_filepos (output_bfd);
 
2197
                              pos += flaginfo->last_bf_index * osymesz;
 
2198
                              if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
 
2199
                                  || (bfd_bwrite (outsym, osymesz, output_bfd)
 
2200
                                      != osymesz))
 
2201
                                return FALSE;
 
2202
                            }
 
2203
                        }
 
2204
 
 
2205
                      if (auxp->x_sym.x_fcnary.x_fcn.x_endndx.l != 0)
 
2206
                        flaginfo->last_bf_index = -1;
 
2207
                      else
 
2208
                        {
 
2209
                          /* The endndx field of this aux entry must
 
2210
                             be updated with the symbol number of the
 
2211
                             next .bf symbol.  */
 
2212
                          flaginfo->last_bf = *auxp;
 
2213
                          flaginfo->last_bf_index = (((outsym - flaginfo->outsyms)
 
2214
                                                   / osymesz)
 
2215
                                                  + syment_base);
 
2216
                        }
 
2217
                    }
 
2218
                }
 
2219
 
 
2220
              if (h == NULL)
 
2221
                {
 
2222
                  bfd_coff_swap_aux_out (output_bfd, auxp, isymp->n_type,
 
2223
                                         isymp->n_sclass, i, isymp->n_numaux,
 
2224
                                         outsym);
 
2225
                  outsym += osymesz;
 
2226
                }
 
2227
 
 
2228
              esym += isymesz;
 
2229
            }
 
2230
        }
 
2231
 
 
2232
      indexp += add;
 
2233
      isymp += add;
 
2234
      sym_hash += add;
 
2235
    }
 
2236
 
 
2237
  /* Relocate the line numbers, unless we are stripping them.  */
 
2238
  if (flaginfo->info->strip == strip_none
 
2239
      || flaginfo->info->strip == strip_some)
 
2240
    {
 
2241
      for (o = input_bfd->sections; o != NULL; o = o->next)
 
2242
        {
 
2243
          bfd_vma offset;
 
2244
          bfd_byte *eline;
 
2245
          bfd_byte *elineend;
 
2246
          bfd_byte *oeline;
 
2247
          bfd_boolean skipping;
 
2248
          file_ptr pos;
 
2249
          bfd_size_type amt;
 
2250
 
 
2251
          /* FIXME: If SEC_HAS_CONTENTS is not for the section, then
 
2252
             build_link_order in ldwrite.c will not have created a
 
2253
             link order, which means that we will not have seen this
 
2254
             input section in _bfd_coff_final_link, which means that
 
2255
             we will not have allocated space for the line numbers of
 
2256
             this section.  I don't think line numbers can be
 
2257
             meaningful for a section which does not have
 
2258
             SEC_HAS_CONTENTS set, but, if they do, this must be
 
2259
             changed.  */
 
2260
          if (o->lineno_count == 0
 
2261
              || (o->output_section->flags & SEC_HAS_CONTENTS) == 0)
 
2262
            continue;
 
2263
 
 
2264
          if (bfd_seek (input_bfd, o->line_filepos, SEEK_SET) != 0
 
2265
              || bfd_bread (flaginfo->linenos, linesz * o->lineno_count,
 
2266
                           input_bfd) != linesz * o->lineno_count)
 
2267
            return FALSE;
 
2268
 
 
2269
          offset = o->output_section->vma + o->output_offset - o->vma;
 
2270
          eline = flaginfo->linenos;
 
2271
          oeline = flaginfo->linenos;
 
2272
          elineend = eline + linesz * o->lineno_count;
 
2273
          skipping = FALSE;
 
2274
          for (; eline < elineend; eline += linesz)
 
2275
            {
 
2276
              struct internal_lineno iline;
 
2277
 
 
2278
              bfd_coff_swap_lineno_in (input_bfd, eline, &iline);
 
2279
 
 
2280
              if (iline.l_lnno != 0)
 
2281
                iline.l_addr.l_paddr += offset;
 
2282
              else if (iline.l_addr.l_symndx >= 0
 
2283
                       && ((unsigned long) iline.l_addr.l_symndx
 
2284
                           < obj_raw_syment_count (input_bfd)))
 
2285
                {
 
2286
                  long indx;
 
2287
 
 
2288
                  indx = flaginfo->sym_indices[iline.l_addr.l_symndx];
 
2289
 
 
2290
                  if (indx < 0)
 
2291
                    {
 
2292
                      /* These line numbers are attached to a symbol
 
2293
                         which we are stripping.  We must discard the
 
2294
                         line numbers because reading them back with
 
2295
                         no associated symbol (or associating them all
 
2296
                         with symbol #0) will fail.  We can't regain
 
2297
                         the space in the output file, but at least
 
2298
                         they're dense.  */
 
2299
                      skipping = TRUE;
 
2300
                    }
 
2301
                  else
 
2302
                    {
 
2303
                      struct internal_syment is;
 
2304
                      union internal_auxent ia;
 
2305
 
 
2306
                      /* Fix up the lnnoptr field in the aux entry of
 
2307
                         the symbol.  It turns out that we can't do
 
2308
                         this when we modify the symbol aux entries,
 
2309
                         because gas sometimes screws up the lnnoptr
 
2310
                         field and makes it an offset from the start
 
2311
                         of the line numbers rather than an absolute
 
2312
                         file index.  */
 
2313
                      bfd_coff_swap_sym_in (output_bfd,
 
2314
                                            (flaginfo->outsyms
 
2315
                                             + ((indx - syment_base)
 
2316
                                                * osymesz)), &is);
 
2317
                      if ((ISFCN (is.n_type)
 
2318
                           || is.n_sclass == C_BLOCK)
 
2319
                          && is.n_numaux >= 1)
 
2320
                        {
 
2321
                          void *auxptr;
 
2322
 
 
2323
                          auxptr = (flaginfo->outsyms
 
2324
                                    + ((indx - syment_base + 1)
 
2325
                                       * osymesz));
 
2326
                          bfd_coff_swap_aux_in (output_bfd, auxptr,
 
2327
                                                is.n_type, is.n_sclass,
 
2328
                                                0, is.n_numaux, &ia);
 
2329
                          ia.x_sym.x_fcnary.x_fcn.x_lnnoptr =
 
2330
                            (o->output_section->line_filepos
 
2331
                             + o->output_section->lineno_count * linesz
 
2332
                             + eline - flaginfo->linenos);
 
2333
                          bfd_coff_swap_aux_out (output_bfd, &ia,
 
2334
                                                 is.n_type, is.n_sclass, 0,
 
2335
                                                 is.n_numaux, auxptr);
 
2336
                        }
 
2337
 
 
2338
                      skipping = FALSE;
 
2339
                    }
 
2340
 
 
2341
                  iline.l_addr.l_symndx = indx;
 
2342
                }
 
2343
 
 
2344
              if (!skipping)
 
2345
                {
 
2346
                  bfd_coff_swap_lineno_out (output_bfd, &iline, oeline);
 
2347
                  oeline += linesz;
 
2348
                }
 
2349
            }
 
2350
 
 
2351
          pos = o->output_section->line_filepos;
 
2352
          pos += o->output_section->lineno_count * linesz;
 
2353
          amt = oeline - flaginfo->linenos;
 
2354
          if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
 
2355
              || bfd_bwrite (flaginfo->linenos, amt, output_bfd) != amt)
 
2356
            return FALSE;
 
2357
 
 
2358
          o->output_section->lineno_count += amt / linesz;
 
2359
        }
 
2360
    }
 
2361
 
 
2362
  /* If we swapped out a C_FILE symbol, guess that the next C_FILE
 
2363
     symbol will be the first symbol in the next input file.  In the
 
2364
     normal case, this will save us from writing out the C_FILE symbol
 
2365
     again.  */
 
2366
  if (flaginfo->last_file_index != -1
 
2367
      && (bfd_size_type) flaginfo->last_file_index >= syment_base)
 
2368
    {
 
2369
      flaginfo->last_file.n_value = output_index;
 
2370
      bfd_coff_swap_sym_out (output_bfd, &flaginfo->last_file,
 
2371
                             (flaginfo->outsyms
 
2372
                              + ((flaginfo->last_file_index - syment_base)
 
2373
                                 * osymesz)));
 
2374
    }
 
2375
 
 
2376
  /* Write the modified symbols to the output file.  */
 
2377
  if (outsym > flaginfo->outsyms)
 
2378
    {
 
2379
      file_ptr pos;
 
2380
      bfd_size_type amt;
 
2381
 
 
2382
      pos = obj_sym_filepos (output_bfd) + syment_base * osymesz;
 
2383
      amt = outsym - flaginfo->outsyms;
 
2384
      if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
 
2385
          || bfd_bwrite (flaginfo->outsyms, amt, output_bfd) != amt)
 
2386
        return FALSE;
 
2387
 
 
2388
      BFD_ASSERT ((obj_raw_syment_count (output_bfd)
 
2389
                   + (outsym - flaginfo->outsyms) / osymesz)
 
2390
                  == output_index);
 
2391
 
 
2392
      obj_raw_syment_count (output_bfd) = output_index;
 
2393
    }
 
2394
 
 
2395
  /* Relocate the contents of each section.  */
 
2396
  adjust_symndx = coff_backend_info (input_bfd)->_bfd_coff_adjust_symndx;
 
2397
  for (o = input_bfd->sections; o != NULL; o = o->next)
 
2398
    {
 
2399
      bfd_byte *contents;
 
2400
      struct coff_section_tdata *secdata;
 
2401
 
 
2402
      if (! o->linker_mark)
 
2403
        /* This section was omitted from the link.  */
 
2404
        continue;
 
2405
 
 
2406
      if ((o->flags & SEC_LINKER_CREATED) != 0)
 
2407
        continue;
 
2408
 
 
2409
      if ((o->flags & SEC_HAS_CONTENTS) == 0
 
2410
          || (o->size == 0 && (o->flags & SEC_RELOC) == 0))
 
2411
        {
 
2412
          if ((o->flags & SEC_RELOC) != 0
 
2413
              && o->reloc_count != 0)
 
2414
            {
 
2415
              (*_bfd_error_handler)
 
2416
                (_("%B: relocs in section `%A', but it has no contents"),
 
2417
                 input_bfd, o);
 
2418
              bfd_set_error (bfd_error_no_contents);
 
2419
              return FALSE;
 
2420
            }
 
2421
 
 
2422
          continue;
 
2423
        }
 
2424
 
 
2425
      secdata = coff_section_data (input_bfd, o);
 
2426
      if (secdata != NULL && secdata->contents != NULL)
 
2427
        contents = secdata->contents;
 
2428
      else
 
2429
        {
 
2430
          contents = flaginfo->contents;
 
2431
          if (! bfd_get_full_section_contents (input_bfd, o, &contents))
 
2432
            return FALSE;
 
2433
        }
 
2434
 
 
2435
      if ((o->flags & SEC_RELOC) != 0)
 
2436
        {
 
2437
          int target_index;
 
2438
          struct internal_reloc *internal_relocs;
 
2439
          struct internal_reloc *irel;
 
2440
 
 
2441
          /* Read in the relocs.  */
 
2442
          target_index = o->output_section->target_index;
 
2443
          internal_relocs = (_bfd_coff_read_internal_relocs
 
2444
                             (input_bfd, o, FALSE, flaginfo->external_relocs,
 
2445
                              flaginfo->info->relocatable,
 
2446
                              (flaginfo->info->relocatable
 
2447
                               ? (flaginfo->section_info[target_index].relocs
 
2448
                                  + o->output_section->reloc_count)
 
2449
                               : flaginfo->internal_relocs)));
 
2450
          if (internal_relocs == NULL
 
2451
              && o->reloc_count > 0)
 
2452
            return FALSE;
 
2453
 
 
2454
          /* Run through the relocs looking for relocs against symbols
 
2455
             coming from discarded sections and complain about them.  */
 
2456
          irel = internal_relocs;
 
2457
          for (; irel < &internal_relocs[o->reloc_count]; irel++)
 
2458
            {
 
2459
              struct coff_link_hash_entry *h;
 
2460
              asection *ps = NULL;
 
2461
              long symndx = irel->r_symndx;
 
2462
              if (symndx < 0)
 
2463
                continue;
 
2464
              h = obj_coff_sym_hashes (input_bfd)[symndx];
 
2465
              if (h == NULL)
 
2466
                continue;
 
2467
              while (h->root.type == bfd_link_hash_indirect
 
2468
                     || h->root.type == bfd_link_hash_warning)
 
2469
                h = (struct coff_link_hash_entry *) h->root.u.i.link;
 
2470
              if (h->root.type == bfd_link_hash_defined
 
2471
                  || h->root.type == bfd_link_hash_defweak)
 
2472
                ps = h->root.u.def.section;
 
2473
              if (ps == NULL)
 
2474
                continue;
 
2475
              /* Complain if definition comes from an excluded section.  */
 
2476
              if (ps->flags & SEC_EXCLUDE)
 
2477
                (*flaginfo->info->callbacks->einfo)
 
2478
                  (_("%X`%s' referenced in section `%A' of %B: "
 
2479
                     "defined in discarded section `%A' of %B\n"),
 
2480
                   h->root.root.string, o, input_bfd, ps, ps->owner);
 
2481
            }
 
2482
 
 
2483
          /* Call processor specific code to relocate the section
 
2484
             contents.  */
 
2485
          if (! bfd_coff_relocate_section (output_bfd, flaginfo->info,
 
2486
                                           input_bfd, o,
 
2487
                                           contents,
 
2488
                                           internal_relocs,
 
2489
                                           flaginfo->internal_syms,
 
2490
                                           flaginfo->sec_ptrs))
 
2491
            return FALSE;
 
2492
 
 
2493
          if (flaginfo->info->relocatable)
 
2494
            {
 
2495
              bfd_vma offset;
 
2496
              struct internal_reloc *irelend;
 
2497
              struct coff_link_hash_entry **rel_hash;
 
2498
 
 
2499
              offset = o->output_section->vma + o->output_offset - o->vma;
 
2500
              irel = internal_relocs;
 
2501
              irelend = irel + o->reloc_count;
 
2502
              rel_hash = (flaginfo->section_info[target_index].rel_hashes
 
2503
                          + o->output_section->reloc_count);
 
2504
              for (; irel < irelend; irel++, rel_hash++)
 
2505
                {
 
2506
                  struct coff_link_hash_entry *h;
 
2507
                  bfd_boolean adjusted;
 
2508
 
 
2509
                  *rel_hash = NULL;
 
2510
 
 
2511
                  /* Adjust the reloc address and symbol index.  */
 
2512
                  irel->r_vaddr += offset;
 
2513
 
 
2514
                  if (irel->r_symndx == -1)
 
2515
                    continue;
 
2516
 
 
2517
                  if (adjust_symndx)
 
2518
                    {
 
2519
                      if (! (*adjust_symndx) (output_bfd, flaginfo->info,
 
2520
                                              input_bfd, o, irel,
 
2521
                                              &adjusted))
 
2522
                        return FALSE;
 
2523
                      if (adjusted)
 
2524
                        continue;
 
2525
                    }
 
2526
 
 
2527
                  h = obj_coff_sym_hashes (input_bfd)[irel->r_symndx];
 
2528
                  if (h != NULL)
 
2529
                    {
 
2530
                      /* This is a global symbol.  */
 
2531
                      if (h->indx >= 0)
 
2532
                        irel->r_symndx = h->indx;
 
2533
                      else
 
2534
                        {
 
2535
                          /* This symbol is being written at the end
 
2536
                             of the file, and we do not yet know the
 
2537
                             symbol index.  We save the pointer to the
 
2538
                             hash table entry in the rel_hash list.
 
2539
                             We set the indx field to -2 to indicate
 
2540
                             that this symbol must not be stripped.  */
 
2541
                          *rel_hash = h;
 
2542
                          h->indx = -2;
 
2543
                        }
 
2544
                    }
 
2545
                  else
 
2546
                    {
 
2547
                      long indx;
 
2548
 
 
2549
                      indx = flaginfo->sym_indices[irel->r_symndx];
 
2550
                      if (indx != -1)
 
2551
                        irel->r_symndx = indx;
 
2552
                      else
 
2553
                        {
 
2554
                          struct internal_syment *is;
 
2555
                          const char *name;
 
2556
                          char buf[SYMNMLEN + 1];
 
2557
 
 
2558
                          /* This reloc is against a symbol we are
 
2559
                             stripping.  This should have been handled
 
2560
                             by the 'dont_skip_symbol' code in the while
 
2561
                             loop at the top of this function.  */
 
2562
                          is = flaginfo->internal_syms + irel->r_symndx;
 
2563
 
 
2564
                          name = (_bfd_coff_internal_syment_name
 
2565
                                  (input_bfd, is, buf));
 
2566
                          if (name == NULL)
 
2567
                            return FALSE;
 
2568
 
 
2569
                          if (! ((*flaginfo->info->callbacks->unattached_reloc)
 
2570
                                 (flaginfo->info, name, input_bfd, o,
 
2571
                                  irel->r_vaddr)))
 
2572
                            return FALSE;
 
2573
                        }
 
2574
                    }
 
2575
                }
 
2576
 
 
2577
              o->output_section->reloc_count += o->reloc_count;
 
2578
            }
 
2579
        }
 
2580
 
 
2581
      /* Write out the modified section contents.  */
 
2582
      if (secdata == NULL || secdata->stab_info == NULL)
 
2583
        {
 
2584
          file_ptr loc = o->output_offset * bfd_octets_per_byte (output_bfd);
 
2585
          if (! bfd_set_section_contents (output_bfd, o->output_section,
 
2586
                                          contents, loc, o->size))
 
2587
            return FALSE;
 
2588
        }
 
2589
      else
 
2590
        {
 
2591
          if (! (_bfd_write_section_stabs
 
2592
                 (output_bfd, &coff_hash_table (flaginfo->info)->stab_info,
 
2593
                  o, &secdata->stab_info, contents)))
 
2594
            return FALSE;
 
2595
        }
 
2596
    }
 
2597
 
 
2598
  if (! flaginfo->info->keep_memory
 
2599
      && ! _bfd_coff_free_symbols (input_bfd))
 
2600
    return FALSE;
 
2601
 
 
2602
  return TRUE;
 
2603
}
 
2604
 
 
2605
/* Write out a global symbol.  Called via bfd_hash_traverse.  */
 
2606
 
 
2607
bfd_boolean
 
2608
_bfd_coff_write_global_sym (struct bfd_hash_entry *bh, void *data)
 
2609
{
 
2610
  struct coff_link_hash_entry *h = (struct coff_link_hash_entry *) bh;
 
2611
  struct coff_final_link_info *flaginfo = (struct coff_final_link_info *) data;
 
2612
  bfd *output_bfd;
 
2613
  struct internal_syment isym;
 
2614
  bfd_size_type symesz;
 
2615
  unsigned int i;
 
2616
  file_ptr pos;
 
2617
 
 
2618
  output_bfd = flaginfo->output_bfd;
 
2619
 
 
2620
  if (h->root.type == bfd_link_hash_warning)
 
2621
    {
 
2622
      h = (struct coff_link_hash_entry *) h->root.u.i.link;
 
2623
      if (h->root.type == bfd_link_hash_new)
 
2624
        return TRUE;
 
2625
    }
 
2626
 
 
2627
  if (h->indx >= 0)
 
2628
    return TRUE;
 
2629
 
 
2630
  if (h->indx != -2
 
2631
      && (flaginfo->info->strip == strip_all
 
2632
          || (flaginfo->info->strip == strip_some
 
2633
              && (bfd_hash_lookup (flaginfo->info->keep_hash,
 
2634
                                   h->root.root.string, FALSE, FALSE)
 
2635
                  == NULL))))
 
2636
    return TRUE;
 
2637
 
 
2638
  switch (h->root.type)
 
2639
    {
 
2640
    default:
 
2641
    case bfd_link_hash_new:
 
2642
    case bfd_link_hash_warning:
 
2643
      abort ();
 
2644
      return FALSE;
 
2645
 
 
2646
    case bfd_link_hash_undefined:
 
2647
    case bfd_link_hash_undefweak:
 
2648
      isym.n_scnum = N_UNDEF;
 
2649
      isym.n_value = 0;
 
2650
      break;
 
2651
 
 
2652
    case bfd_link_hash_defined:
 
2653
    case bfd_link_hash_defweak:
 
2654
      {
 
2655
        asection *sec;
 
2656
 
 
2657
        sec = h->root.u.def.section->output_section;
 
2658
        if (bfd_is_abs_section (sec))
 
2659
          isym.n_scnum = N_ABS;
 
2660
        else
 
2661
          isym.n_scnum = sec->target_index;
 
2662
        isym.n_value = (h->root.u.def.value
 
2663
                        + h->root.u.def.section->output_offset);
 
2664
        if (! obj_pe (flaginfo->output_bfd))
 
2665
          isym.n_value += sec->vma;
 
2666
      }
 
2667
      break;
 
2668
 
 
2669
    case bfd_link_hash_common:
 
2670
      isym.n_scnum = N_UNDEF;
 
2671
      isym.n_value = h->root.u.c.size;
 
2672
      break;
 
2673
 
 
2674
    case bfd_link_hash_indirect:
 
2675
      /* Just ignore these.  They can't be handled anyhow.  */
 
2676
      return TRUE;
 
2677
    }
 
2678
 
 
2679
  if (strlen (h->root.root.string) <= SYMNMLEN)
 
2680
    strncpy (isym._n._n_name, h->root.root.string, SYMNMLEN);
 
2681
  else
 
2682
    {
 
2683
      bfd_boolean hash;
 
2684
      bfd_size_type indx;
 
2685
 
 
2686
      hash = TRUE;
 
2687
      if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
 
2688
        hash = FALSE;
 
2689
      indx = _bfd_stringtab_add (flaginfo->strtab, h->root.root.string, hash,
 
2690
                                 FALSE);
 
2691
      if (indx == (bfd_size_type) -1)
 
2692
        {
 
2693
          flaginfo->failed = TRUE;
 
2694
          return FALSE;
 
2695
        }
 
2696
      isym._n._n_n._n_zeroes = 0;
 
2697
      isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
 
2698
    }
 
2699
 
 
2700
  isym.n_sclass = h->symbol_class;
 
2701
  isym.n_type = h->type;
 
2702
 
 
2703
  if (isym.n_sclass == C_NULL)
 
2704
    isym.n_sclass = C_EXT;
 
2705
 
 
2706
  /* If doing task linking and this is the pass where we convert
 
2707
     defined globals to statics, then do that conversion now.  If the
 
2708
     symbol is not being converted, just ignore it and it will be
 
2709
     output during a later pass.  */
 
2710
  if (flaginfo->global_to_static)
 
2711
    {
 
2712
      if (! IS_EXTERNAL (output_bfd, isym))
 
2713
        return TRUE;
 
2714
 
 
2715
      isym.n_sclass = C_STAT;
 
2716
    }
 
2717
 
 
2718
  /* When a weak symbol is not overridden by a strong one,
 
2719
     turn it into an external symbol when not building a
 
2720
     shared or relocatable object.  */
 
2721
  if (! flaginfo->info->shared
 
2722
      && ! flaginfo->info->relocatable
 
2723
      && IS_WEAK_EXTERNAL (flaginfo->output_bfd, isym))
 
2724
    isym.n_sclass = C_EXT;
 
2725
 
 
2726
  isym.n_numaux = h->numaux;
 
2727
 
 
2728
  bfd_coff_swap_sym_out (output_bfd, &isym, flaginfo->outsyms);
 
2729
 
 
2730
  symesz = bfd_coff_symesz (output_bfd);
 
2731
 
 
2732
  pos = obj_sym_filepos (output_bfd);
 
2733
  pos += obj_raw_syment_count (output_bfd) * symesz;
 
2734
  if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
 
2735
      || bfd_bwrite (flaginfo->outsyms, symesz, output_bfd) != symesz)
 
2736
    {
 
2737
      flaginfo->failed = TRUE;
 
2738
      return FALSE;
 
2739
    }
 
2740
 
 
2741
  h->indx = obj_raw_syment_count (output_bfd);
 
2742
 
 
2743
  ++obj_raw_syment_count (output_bfd);
 
2744
 
 
2745
  /* Write out any associated aux entries.  Most of the aux entries
 
2746
     will have been modified in _bfd_coff_link_input_bfd.  We have to
 
2747
     handle section aux entries here, now that we have the final
 
2748
     relocation and line number counts.  */
 
2749
  for (i = 0; i < isym.n_numaux; i++)
 
2750
    {
 
2751
      union internal_auxent *auxp;
 
2752
 
 
2753
      auxp = h->aux + i;
 
2754
 
 
2755
      /* Look for a section aux entry here using the same tests that
 
2756
         coff_swap_aux_out uses.  */
 
2757
      if (i == 0
 
2758
          && (isym.n_sclass == C_STAT
 
2759
              || isym.n_sclass == C_HIDDEN)
 
2760
          && isym.n_type == T_NULL
 
2761
          && (h->root.type == bfd_link_hash_defined
 
2762
              || h->root.type == bfd_link_hash_defweak))
 
2763
        {
 
2764
          asection *sec;
 
2765
 
 
2766
          sec = h->root.u.def.section->output_section;
 
2767
          if (sec != NULL)
 
2768
            {
 
2769
              auxp->x_scn.x_scnlen = sec->size;
 
2770
 
 
2771
              /* For PE, an overflow on the final link reportedly does
 
2772
                 not matter.  FIXME: Why not?  */
 
2773
              if (sec->reloc_count > 0xffff
 
2774
                  && (! obj_pe (output_bfd)
 
2775
                      || flaginfo->info->relocatable))
 
2776
                (*_bfd_error_handler)
 
2777
                  (_("%s: %s: reloc overflow: 0x%lx > 0xffff"),
 
2778
                   bfd_get_filename (output_bfd),
 
2779
                   bfd_get_section_name (output_bfd, sec),
 
2780
                   sec->reloc_count);
 
2781
 
 
2782
              if (sec->lineno_count > 0xffff
 
2783
                  && (! obj_pe (output_bfd)
 
2784
                      || flaginfo->info->relocatable))
 
2785
                (*_bfd_error_handler)
 
2786
                  (_("%s: warning: %s: line number overflow: 0x%lx > 0xffff"),
 
2787
                   bfd_get_filename (output_bfd),
 
2788
                   bfd_get_section_name (output_bfd, sec),
 
2789
                   sec->lineno_count);
 
2790
 
 
2791
              auxp->x_scn.x_nreloc = sec->reloc_count;
 
2792
              auxp->x_scn.x_nlinno = sec->lineno_count;
 
2793
              auxp->x_scn.x_checksum = 0;
 
2794
              auxp->x_scn.x_associated = 0;
 
2795
              auxp->x_scn.x_comdat = 0;
 
2796
            }
 
2797
        }
 
2798
 
 
2799
      bfd_coff_swap_aux_out (output_bfd, auxp, isym.n_type,
 
2800
                             isym.n_sclass, (int) i, isym.n_numaux,
 
2801
                             flaginfo->outsyms);
 
2802
      if (bfd_bwrite (flaginfo->outsyms, symesz, output_bfd) != symesz)
 
2803
        {
 
2804
          flaginfo->failed = TRUE;
 
2805
          return FALSE;
 
2806
        }
 
2807
      ++obj_raw_syment_count (output_bfd);
 
2808
    }
 
2809
 
 
2810
  return TRUE;
 
2811
}
 
2812
 
 
2813
/* Write out task global symbols, converting them to statics.  Called
 
2814
   via coff_link_hash_traverse.  Calls bfd_coff_write_global_sym to do
 
2815
   the dirty work, if the symbol we are processing needs conversion.  */
 
2816
 
 
2817
bfd_boolean
 
2818
_bfd_coff_write_task_globals (struct coff_link_hash_entry *h, void *data)
 
2819
{
 
2820
  struct coff_final_link_info *flaginfo = (struct coff_final_link_info *) data;
 
2821
  bfd_boolean rtnval = TRUE;
 
2822
  bfd_boolean save_global_to_static;
 
2823
 
 
2824
  if (h->root.type == bfd_link_hash_warning)
 
2825
    h = (struct coff_link_hash_entry *) h->root.u.i.link;
 
2826
 
 
2827
  if (h->indx < 0)
 
2828
    {
 
2829
      switch (h->root.type)
 
2830
        {
 
2831
        case bfd_link_hash_defined:
 
2832
        case bfd_link_hash_defweak:
 
2833
          save_global_to_static = flaginfo->global_to_static;
 
2834
          flaginfo->global_to_static = TRUE;
 
2835
          rtnval = _bfd_coff_write_global_sym (&h->root.root, data);
 
2836
          flaginfo->global_to_static = save_global_to_static;
 
2837
          break;
 
2838
        default:
 
2839
          break;
 
2840
        }
 
2841
    }
 
2842
  return (rtnval);
 
2843
}
 
2844
 
 
2845
/* Handle a link order which is supposed to generate a reloc.  */
 
2846
 
 
2847
bfd_boolean
 
2848
_bfd_coff_reloc_link_order (bfd *output_bfd,
 
2849
                            struct coff_final_link_info *flaginfo,
 
2850
                            asection *output_section,
 
2851
                            struct bfd_link_order *link_order)
 
2852
{
 
2853
  reloc_howto_type *howto;
 
2854
  struct internal_reloc *irel;
 
2855
  struct coff_link_hash_entry **rel_hash_ptr;
 
2856
 
 
2857
  howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
 
2858
  if (howto == NULL)
 
2859
    {
 
2860
      bfd_set_error (bfd_error_bad_value);
 
2861
      return FALSE;
 
2862
    }
 
2863
 
 
2864
  if (link_order->u.reloc.p->addend != 0)
 
2865
    {
 
2866
      bfd_size_type size;
 
2867
      bfd_byte *buf;
 
2868
      bfd_reloc_status_type rstat;
 
2869
      bfd_boolean ok;
 
2870
      file_ptr loc;
 
2871
 
 
2872
      size = bfd_get_reloc_size (howto);
 
2873
      buf = (bfd_byte *) bfd_zmalloc (size);
 
2874
      if (buf == NULL)
 
2875
        return FALSE;
 
2876
 
 
2877
      rstat = _bfd_relocate_contents (howto, output_bfd,
 
2878
                                      (bfd_vma) link_order->u.reloc.p->addend,\
 
2879
                                      buf);
 
2880
      switch (rstat)
 
2881
        {
 
2882
        case bfd_reloc_ok:
 
2883
          break;
 
2884
        default:
 
2885
        case bfd_reloc_outofrange:
 
2886
          abort ();
 
2887
        case bfd_reloc_overflow:
 
2888
          if (! ((*flaginfo->info->callbacks->reloc_overflow)
 
2889
                 (flaginfo->info, NULL,
 
2890
                  (link_order->type == bfd_section_reloc_link_order
 
2891
                   ? bfd_section_name (output_bfd,
 
2892
                                       link_order->u.reloc.p->u.section)
 
2893
                   : link_order->u.reloc.p->u.name),
 
2894
                  howto->name, link_order->u.reloc.p->addend,
 
2895
                  (bfd *) NULL, (asection *) NULL, (bfd_vma) 0)))
 
2896
            {
 
2897
              free (buf);
 
2898
              return FALSE;
 
2899
            }
 
2900
          break;
 
2901
        }
 
2902
      loc = link_order->offset * bfd_octets_per_byte (output_bfd);
 
2903
      ok = bfd_set_section_contents (output_bfd, output_section, buf,
 
2904
                                     loc, size);
 
2905
      free (buf);
 
2906
      if (! ok)
 
2907
        return FALSE;
 
2908
    }
 
2909
 
 
2910
  /* Store the reloc information in the right place.  It will get
 
2911
     swapped and written out at the end of the final_link routine.  */
 
2912
  irel = (flaginfo->section_info[output_section->target_index].relocs
 
2913
          + output_section->reloc_count);
 
2914
  rel_hash_ptr = (flaginfo->section_info[output_section->target_index].rel_hashes
 
2915
                  + output_section->reloc_count);
 
2916
 
 
2917
  memset (irel, 0, sizeof (struct internal_reloc));
 
2918
  *rel_hash_ptr = NULL;
 
2919
 
 
2920
  irel->r_vaddr = output_section->vma + link_order->offset;
 
2921
 
 
2922
  if (link_order->type == bfd_section_reloc_link_order)
 
2923
    {
 
2924
      /* We need to somehow locate a symbol in the right section.  The
 
2925
         symbol must either have a value of zero, or we must adjust
 
2926
         the addend by the value of the symbol.  FIXME: Write this
 
2927
         when we need it.  The old linker couldn't handle this anyhow.  */
 
2928
      abort ();
 
2929
      *rel_hash_ptr = NULL;
 
2930
      irel->r_symndx = 0;
 
2931
    }
 
2932
  else
 
2933
    {
 
2934
      struct coff_link_hash_entry *h;
 
2935
 
 
2936
      h = ((struct coff_link_hash_entry *)
 
2937
           bfd_wrapped_link_hash_lookup (output_bfd, flaginfo->info,
 
2938
                                         link_order->u.reloc.p->u.name,
 
2939
                                         FALSE, FALSE, TRUE));
 
2940
      if (h != NULL)
 
2941
        {
 
2942
          if (h->indx >= 0)
 
2943
            irel->r_symndx = h->indx;
 
2944
          else
 
2945
            {
 
2946
              /* Set the index to -2 to force this symbol to get
 
2947
                 written out.  */
 
2948
              h->indx = -2;
 
2949
              *rel_hash_ptr = h;
 
2950
              irel->r_symndx = 0;
 
2951
            }
 
2952
        }
 
2953
      else
 
2954
        {
 
2955
          if (! ((*flaginfo->info->callbacks->unattached_reloc)
 
2956
                 (flaginfo->info, link_order->u.reloc.p->u.name, (bfd *) NULL,
 
2957
                  (asection *) NULL, (bfd_vma) 0)))
 
2958
            return FALSE;
 
2959
          irel->r_symndx = 0;
 
2960
        }
 
2961
    }
 
2962
 
 
2963
  /* FIXME: Is this always right?  */
 
2964
  irel->r_type = howto->type;
 
2965
 
 
2966
  /* r_size is only used on the RS/6000, which needs its own linker
 
2967
     routines anyhow.  r_extern is only used for ECOFF.  */
 
2968
 
 
2969
  /* FIXME: What is the right value for r_offset?  Is zero OK?  */
 
2970
  ++output_section->reloc_count;
 
2971
 
 
2972
  return TRUE;
 
2973
}
 
2974
 
 
2975
/* A basic reloc handling routine which may be used by processors with
 
2976
   simple relocs.  */
 
2977
 
 
2978
bfd_boolean
 
2979
_bfd_coff_generic_relocate_section (bfd *output_bfd,
 
2980
                                    struct bfd_link_info *info,
 
2981
                                    bfd *input_bfd,
 
2982
                                    asection *input_section,
 
2983
                                    bfd_byte *contents,
 
2984
                                    struct internal_reloc *relocs,
 
2985
                                    struct internal_syment *syms,
 
2986
                                    asection **sections)
 
2987
{
 
2988
  struct internal_reloc *rel;
 
2989
  struct internal_reloc *relend;
 
2990
 
 
2991
  rel = relocs;
 
2992
  relend = rel + input_section->reloc_count;
 
2993
  for (; rel < relend; rel++)
 
2994
    {
 
2995
      long symndx;
 
2996
      struct coff_link_hash_entry *h;
 
2997
      struct internal_syment *sym;
 
2998
      bfd_vma addend;
 
2999
      bfd_vma val;
 
3000
      reloc_howto_type *howto;
 
3001
      bfd_reloc_status_type rstat;
 
3002
 
 
3003
      symndx = rel->r_symndx;
 
3004
 
 
3005
      if (symndx == -1)
 
3006
        {
 
3007
          h = NULL;
 
3008
          sym = NULL;
 
3009
        }
 
3010
      else if (symndx < 0
 
3011
               || (unsigned long) symndx >= obj_raw_syment_count (input_bfd))
 
3012
        {
 
3013
          (*_bfd_error_handler)
 
3014
            ("%B: illegal symbol index %ld in relocs", input_bfd, symndx);
 
3015
          return FALSE;
 
3016
        }
 
3017
      else
 
3018
        {
 
3019
          h = obj_coff_sym_hashes (input_bfd)[symndx];
 
3020
          sym = syms + symndx;
 
3021
        }
 
3022
 
 
3023
      /* COFF treats common symbols in one of two ways.  Either the
 
3024
         size of the symbol is included in the section contents, or it
 
3025
         is not.  We assume that the size is not included, and force
 
3026
         the rtype_to_howto function to adjust the addend as needed.  */
 
3027
      if (sym != NULL && sym->n_scnum != 0)
 
3028
        addend = - sym->n_value;
 
3029
      else
 
3030
        addend = 0;
 
3031
 
 
3032
      howto = bfd_coff_rtype_to_howto (input_bfd, input_section, rel, h,
 
3033
                                       sym, &addend);
 
3034
      if (howto == NULL)
 
3035
        return FALSE;
 
3036
 
 
3037
      /* If we are doing a relocatable link, then we can just ignore
 
3038
         a PC relative reloc that is pcrel_offset.  It will already
 
3039
         have the correct value.  If this is not a relocatable link,
 
3040
         then we should ignore the symbol value.  */
 
3041
      if (howto->pc_relative && howto->pcrel_offset)
 
3042
        {
 
3043
          if (info->relocatable)
 
3044
            continue;
 
3045
          if (sym != NULL && sym->n_scnum != 0)
 
3046
            addend += sym->n_value;
 
3047
        }
 
3048
 
 
3049
      val = 0;
 
3050
 
 
3051
      if (h == NULL)
 
3052
        {
 
3053
          asection *sec;
 
3054
 
 
3055
          if (symndx == -1)
 
3056
            {
 
3057
              sec = bfd_abs_section_ptr;
 
3058
              val = 0;
 
3059
            }
 
3060
          else
 
3061
            {
 
3062
              sec = sections[symndx];
 
3063
              val = (sec->output_section->vma
 
3064
                     + sec->output_offset
 
3065
                     + sym->n_value);
 
3066
              if (! obj_pe (input_bfd))
 
3067
                val -= sec->vma;
 
3068
            }
 
3069
        }
 
3070
      else
 
3071
        {
 
3072
          if (h->root.type == bfd_link_hash_defined
 
3073
              || h->root.type == bfd_link_hash_defweak)
 
3074
            {
 
3075
              /* Defined weak symbols are a GNU extension. */
 
3076
              asection *sec;
 
3077
 
 
3078
              sec = h->root.u.def.section;
 
3079
              val = (h->root.u.def.value
 
3080
                     + sec->output_section->vma
 
3081
                     + sec->output_offset);
 
3082
            }
 
3083
 
 
3084
          else if (h->root.type == bfd_link_hash_undefweak)
 
3085
            {
 
3086
              if (h->symbol_class == C_NT_WEAK && h->numaux == 1)
 
3087
                {
 
3088
                  /* See _Microsoft Portable Executable and Common Object
 
3089
                     File Format Specification_, section 5.5.3.
 
3090
                     Note that weak symbols without aux records are a GNU
 
3091
                     extension.
 
3092
                     FIXME: All weak externals are treated as having
 
3093
                     characteristic IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY (1).
 
3094
                     These behave as per SVR4 ABI:  A library member
 
3095
                     will resolve a weak external only if a normal
 
3096
                     external causes the library member to be linked.
 
3097
                     See also linker.c: generic_link_check_archive_element. */
 
3098
                  asection *sec;
 
3099
                  struct coff_link_hash_entry *h2 =
 
3100
                    h->auxbfd->tdata.coff_obj_data->sym_hashes[
 
3101
                    h->aux->x_sym.x_tagndx.l];
 
3102
 
 
3103
                  if (!h2 || h2->root.type == bfd_link_hash_undefined)
 
3104
                    {
 
3105
                      sec = bfd_abs_section_ptr;
 
3106
                      val = 0;
 
3107
                    }
 
3108
                  else
 
3109
                    {
 
3110
                      sec = h2->root.u.def.section;
 
3111
                      val = h2->root.u.def.value
 
3112
                        + sec->output_section->vma + sec->output_offset;
 
3113
                    }
 
3114
                }
 
3115
              else
 
3116
                /* This is a GNU extension.  */
 
3117
                val = 0;
 
3118
            }
 
3119
 
 
3120
          else if (! info->relocatable)
 
3121
            {
 
3122
              if (! ((*info->callbacks->undefined_symbol)
 
3123
                     (info, h->root.root.string, input_bfd, input_section,
 
3124
                      rel->r_vaddr - input_section->vma, TRUE)))
 
3125
                return FALSE;
 
3126
            }
 
3127
        }
 
3128
 
 
3129
      if (info->base_file)
 
3130
        {
 
3131
          /* Emit a reloc if the backend thinks it needs it.  */
 
3132
          if (sym && pe_data (output_bfd)->in_reloc_p (output_bfd, howto))
 
3133
            {
 
3134
              /* Relocation to a symbol in a section which isn't
 
3135
                 absolute.  We output the address here to a file.
 
3136
                 This file is then read by dlltool when generating the
 
3137
                 reloc section.  Note that the base file is not
 
3138
                 portable between systems.  We write out a bfd_vma here,
 
3139
                 and dlltool reads in a bfd_vma.  */
 
3140
              bfd_vma addr = (rel->r_vaddr
 
3141
                           - input_section->vma
 
3142
                           + input_section->output_offset
 
3143
                           + input_section->output_section->vma);
 
3144
              if (coff_data (output_bfd)->pe)
 
3145
                addr -= pe_data(output_bfd)->pe_opthdr.ImageBase;
 
3146
              if (fwrite (&addr, 1, sizeof (bfd_vma), (FILE *) info->base_file)
 
3147
                  != sizeof (bfd_vma))
 
3148
                {
 
3149
                  bfd_set_error (bfd_error_system_call);
 
3150
                  return FALSE;
 
3151
                }
 
3152
            }
 
3153
        }
 
3154
 
 
3155
      rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
 
3156
                                        contents,
 
3157
                                        rel->r_vaddr - input_section->vma,
 
3158
                                        val, addend);
 
3159
 
 
3160
      switch (rstat)
 
3161
        {
 
3162
        default:
 
3163
          abort ();
 
3164
        case bfd_reloc_ok:
 
3165
          break;
 
3166
        case bfd_reloc_outofrange:
 
3167
          (*_bfd_error_handler)
 
3168
            (_("%B: bad reloc address 0x%lx in section `%A'"),
 
3169
             input_bfd, input_section, (unsigned long) rel->r_vaddr);
 
3170
          return FALSE;
 
3171
        case bfd_reloc_overflow:
 
3172
          {
 
3173
            const char *name;
 
3174
            char buf[SYMNMLEN + 1];
 
3175
 
 
3176
            if (symndx == -1)
 
3177
              name = "*ABS*";
 
3178
            else if (h != NULL)
 
3179
              name = NULL;
 
3180
            else
 
3181
              {
 
3182
                name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
 
3183
                if (name == NULL)
 
3184
                  return FALSE;
 
3185
              }
 
3186
 
 
3187
            if (! ((*info->callbacks->reloc_overflow)
 
3188
                   (info, (h ? &h->root : NULL), name, howto->name,
 
3189
                    (bfd_vma) 0, input_bfd, input_section,
 
3190
                    rel->r_vaddr - input_section->vma)))
 
3191
              return FALSE;
 
3192
          }
 
3193
        }
 
3194
    }
 
3195
  return TRUE;
 
3196
}