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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gdb-7.2/] [bfd/] [coffcode.h] - Blame information for rev 859

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 330 jeremybenn
/* Support for the generic parts of most COFF variants, for BFD.
2
   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3
   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4
   Free Software Foundation, Inc.
5
   Written by Cygnus Support.
6
 
7
   This file is part of BFD, the Binary File Descriptor library.
8
 
9
   This program is free software; you can redistribute it and/or modify
10
   it under the terms of the GNU General Public License as published by
11
   the Free Software Foundation; either version 3 of the License, or
12
   (at your option) any later version.
13
 
14
   This program is distributed in the hope that it will be useful,
15
   but WITHOUT ANY WARRANTY; without even the implied warranty of
16
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
   GNU General Public License for more details.
18
 
19
   You should have received a copy of the GNU General Public License
20
   along with this program; if not, write to the Free Software
21
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22
   MA 02110-1301, USA.  */
23
 
24
/* Most of this hacked by  Steve Chamberlain,
25
                        sac@cygnus.com.  */
26
/*
27
SECTION
28
        coff backends
29
 
30
        BFD supports a number of different flavours of coff format.
31
        The major differences between formats are the sizes and
32
        alignments of fields in structures on disk, and the occasional
33
        extra field.
34
 
35
        Coff in all its varieties is implemented with a few common
36
        files and a number of implementation specific files. For
37
        example, The 88k bcs coff format is implemented in the file
38
        @file{coff-m88k.c}. This file @code{#include}s
39
        @file{coff/m88k.h} which defines the external structure of the
40
        coff format for the 88k, and @file{coff/internal.h} which
41
        defines the internal structure. @file{coff-m88k.c} also
42
        defines the relocations used by the 88k format
43
        @xref{Relocations}.
44
 
45
        The Intel i960 processor version of coff is implemented in
46
        @file{coff-i960.c}. This file has the same structure as
47
        @file{coff-m88k.c}, except that it includes @file{coff/i960.h}
48
        rather than @file{coff-m88k.h}.
49
 
50
SUBSECTION
51
        Porting to a new version of coff
52
 
53
        The recommended method is to select from the existing
54
        implementations the version of coff which is most like the one
55
        you want to use.  For example, we'll say that i386 coff is
56
        the one you select, and that your coff flavour is called foo.
57
        Copy @file{i386coff.c} to @file{foocoff.c}, copy
58
        @file{../include/coff/i386.h} to @file{../include/coff/foo.h},
59
        and add the lines to @file{targets.c} and @file{Makefile.in}
60
        so that your new back end is used. Alter the shapes of the
61
        structures in @file{../include/coff/foo.h} so that they match
62
        what you need. You will probably also have to add
63
        @code{#ifdef}s to the code in @file{coff/internal.h} and
64
        @file{coffcode.h} if your version of coff is too wild.
65
 
66
        You can verify that your new BFD backend works quite simply by
67
        building @file{objdump} from the @file{binutils} directory,
68
        and making sure that its version of what's going on and your
69
        host system's idea (assuming it has the pretty standard coff
70
        dump utility, usually called @code{att-dump} or just
71
        @code{dump}) are the same.  Then clean up your code, and send
72
        what you've done to Cygnus. Then your stuff will be in the
73
        next release, and you won't have to keep integrating it.
74
 
75
SUBSECTION
76
        How the coff backend works
77
 
78
SUBSUBSECTION
79
        File layout
80
 
81
        The Coff backend is split into generic routines that are
82
        applicable to any Coff target and routines that are specific
83
        to a particular target.  The target-specific routines are
84
        further split into ones which are basically the same for all
85
        Coff targets except that they use the external symbol format
86
        or use different values for certain constants.
87
 
88
        The generic routines are in @file{coffgen.c}.  These routines
89
        work for any Coff target.  They use some hooks into the target
90
        specific code; the hooks are in a @code{bfd_coff_backend_data}
91
        structure, one of which exists for each target.
92
 
93
        The essentially similar target-specific routines are in
94
        @file{coffcode.h}.  This header file includes executable C code.
95
        The various Coff targets first include the appropriate Coff
96
        header file, make any special defines that are needed, and
97
        then include @file{coffcode.h}.
98
 
99
        Some of the Coff targets then also have additional routines in
100
        the target source file itself.
101
 
102
        For example, @file{coff-i960.c} includes
103
        @file{coff/internal.h} and @file{coff/i960.h}.  It then
104
        defines a few constants, such as @code{I960}, and includes
105
        @file{coffcode.h}.  Since the i960 has complex relocation
106
        types, @file{coff-i960.c} also includes some code to
107
        manipulate the i960 relocs.  This code is not in
108
        @file{coffcode.h} because it would not be used by any other
109
        target.
110
 
111
SUBSUBSECTION
112
        Coff long section names
113
 
114
        In the standard Coff object format, section names are limited to
115
        the eight bytes available in the @code{s_name} field of the
116
        @code{SCNHDR} section header structure.  The format requires the
117
        field to be NUL-padded, but not necessarily NUL-terminated, so
118
        the longest section names permitted are a full eight characters.
119
 
120
        The Microsoft PE variants of the Coff object file format add
121
        an extension to support the use of long section names.  This
122
        extension is defined in section 4 of the Microsoft PE/COFF
123
        specification (rev 8.1).  If a section name is too long to fit
124
        into the section header's @code{s_name} field, it is instead
125
        placed into the string table, and the @code{s_name} field is
126
        filled with a slash ("/") followed by the ASCII decimal
127
        representation of the offset of the full name relative to the
128
        string table base.
129
 
130
        Note that this implies that the extension can only be used in object
131
        files, as executables do not contain a string table.  The standard
132
        specifies that long section names from objects emitted into executable
133
        images are to be truncated.
134
 
135
        However, as a GNU extension, BFD can generate executable images
136
        that contain a string table and long section names.  This
137
        would appear to be technically valid, as the standard only says
138
        that Coff debugging information is deprecated, not forbidden,
139
        and in practice it works, although some tools that parse PE files
140
        expecting the MS standard format may become confused; @file{PEview} is
141
        one known example.
142
 
143
        The functionality is supported in BFD by code implemented under
144
        the control of the macro @code{COFF_LONG_SECTION_NAMES}.  If not
145
        defined, the format does not support long section names in any way.
146
        If defined, it is used to initialise a flag,
147
        @code{_bfd_coff_long_section_names}, and a hook function pointer,
148
        @code{_bfd_coff_set_long_section_names}, in the Coff backend data
149
        structure.  The flag controls the generation of long section names
150
        in output BFDs at runtime; if it is false, as it will be by default
151
        when generating an executable image, long section names are truncated;
152
        if true, the long section names extension is employed.  The hook
153
        points to a function that allows the value of the flag to be altered
154
        at runtime, on formats that support long section names at all; on
155
        other formats it points to a stub that returns an error indication.
156
 
157
        With input BFDs, the flag is set according to whether any long section
158
        names are detected while reading the section headers.  For a completely
159
        new BFD, the flag is set to the default for the target format.  This
160
        information can be used by a client of the BFD library when deciding
161
        what output format to generate, and means that a BFD that is opened
162
        for read and subsequently converted to a writeable BFD and modified
163
        in-place will retain whatever format it had on input.
164
 
165
        If @code{COFF_LONG_SECTION_NAMES} is simply defined (blank), or is
166
        defined to the value "1", then long section names are enabled by
167
        default; if it is defined to the value zero, they are disabled by
168
        default (but still accepted in input BFDs).  The header @file{coffcode.h}
169
        defines a macro, @code{COFF_DEFAULT_LONG_SECTION_NAMES}, which is
170
        used in the backends to initialise the backend data structure fields
171
        appropriately; see the comments for further detail.
172
 
173
SUBSUBSECTION
174
        Bit twiddling
175
 
176
        Each flavour of coff supported in BFD has its own header file
177
        describing the external layout of the structures. There is also
178
        an internal description of the coff layout, in
179
        @file{coff/internal.h}. A major function of the
180
        coff backend is swapping the bytes and twiddling the bits to
181
        translate the external form of the structures into the normal
182
        internal form. This is all performed in the
183
        @code{bfd_swap}_@i{thing}_@i{direction} routines. Some
184
        elements are different sizes between different versions of
185
        coff; it is the duty of the coff version specific include file
186
        to override the definitions of various packing routines in
187
        @file{coffcode.h}. E.g., the size of line number entry in coff is
188
        sometimes 16 bits, and sometimes 32 bits. @code{#define}ing
189
        @code{PUT_LNSZ_LNNO} and @code{GET_LNSZ_LNNO} will select the
190
        correct one. No doubt, some day someone will find a version of
191
        coff which has a varying field size not catered to at the
192
        moment. To port BFD, that person will have to add more @code{#defines}.
193
        Three of the bit twiddling routines are exported to
194
        @code{gdb}; @code{coff_swap_aux_in}, @code{coff_swap_sym_in}
195
        and @code{coff_swap_lineno_in}. @code{GDB} reads the symbol
196
        table on its own, but uses BFD to fix things up.  More of the
197
        bit twiddlers are exported for @code{gas};
198
        @code{coff_swap_aux_out}, @code{coff_swap_sym_out},
199
        @code{coff_swap_lineno_out}, @code{coff_swap_reloc_out},
200
        @code{coff_swap_filehdr_out}, @code{coff_swap_aouthdr_out},
201
        @code{coff_swap_scnhdr_out}. @code{Gas} currently keeps track
202
        of all the symbol table and reloc drudgery itself, thereby
203
        saving the internal BFD overhead, but uses BFD to swap things
204
        on the way out, making cross ports much safer.  Doing so also
205
        allows BFD (and thus the linker) to use the same header files
206
        as @code{gas}, which makes one avenue to disaster disappear.
207
 
208
SUBSUBSECTION
209
        Symbol reading
210
 
211
        The simple canonical form for symbols used by BFD is not rich
212
        enough to keep all the information available in a coff symbol
213
        table. The back end gets around this problem by keeping the original
214
        symbol table around, "behind the scenes".
215
 
216
        When a symbol table is requested (through a call to
217
        @code{bfd_canonicalize_symtab}), a request gets through to
218
        @code{coff_get_normalized_symtab}. This reads the symbol table from
219
        the coff file and swaps all the structures inside into the
220
        internal form. It also fixes up all the pointers in the table
221
        (represented in the file by offsets from the first symbol in
222
        the table) into physical pointers to elements in the new
223
        internal table. This involves some work since the meanings of
224
        fields change depending upon context: a field that is a
225
        pointer to another structure in the symbol table at one moment
226
        may be the size in bytes of a structure at the next.  Another
227
        pass is made over the table. All symbols which mark file names
228
        (<<C_FILE>> symbols) are modified so that the internal
229
        string points to the value in the auxent (the real filename)
230
        rather than the normal text associated with the symbol
231
        (@code{".file"}).
232
 
233
        At this time the symbol names are moved around. Coff stores
234
        all symbols less than nine characters long physically
235
        within the symbol table; longer strings are kept at the end of
236
        the file in the string table. This pass moves all strings
237
        into memory and replaces them with pointers to the strings.
238
 
239
        The symbol table is massaged once again, this time to create
240
        the canonical table used by the BFD application. Each symbol
241
        is inspected in turn, and a decision made (using the
242
        @code{sclass} field) about the various flags to set in the
243
        @code{asymbol}.  @xref{Symbols}. The generated canonical table
244
        shares strings with the hidden internal symbol table.
245
 
246
        Any linenumbers are read from the coff file too, and attached
247
        to the symbols which own the functions the linenumbers belong to.
248
 
249
SUBSUBSECTION
250
        Symbol writing
251
 
252
        Writing a symbol to a coff file which didn't come from a coff
253
        file will lose any debugging information. The @code{asymbol}
254
        structure remembers the BFD from which the symbol was taken, and on
255
        output the back end makes sure that the same destination target as
256
        source target is present.
257
 
258
        When the symbols have come from a coff file then all the
259
        debugging information is preserved.
260
 
261
        Symbol tables are provided for writing to the back end in a
262
        vector of pointers to pointers. This allows applications like
263
        the linker to accumulate and output large symbol tables
264
        without having to do too much byte copying.
265
 
266
        This function runs through the provided symbol table and
267
        patches each symbol marked as a file place holder
268
        (@code{C_FILE}) to point to the next file place holder in the
269
        list. It also marks each @code{offset} field in the list with
270
        the offset from the first symbol of the current symbol.
271
 
272
        Another function of this procedure is to turn the canonical
273
        value form of BFD into the form used by coff. Internally, BFD
274
        expects symbol values to be offsets from a section base; so a
275
        symbol physically at 0x120, but in a section starting at
276
        0x100, would have the value 0x20. Coff expects symbols to
277
        contain their final value, so symbols have their values
278
        changed at this point to reflect their sum with their owning
279
        section.  This transformation uses the
280
        <<output_section>> field of the @code{asymbol}'s
281
        @code{asection} @xref{Sections}.
282
 
283
        o <<coff_mangle_symbols>>
284
 
285
        This routine runs though the provided symbol table and uses
286
        the offsets generated by the previous pass and the pointers
287
        generated when the symbol table was read in to create the
288
        structured hierarchy required by coff. It changes each pointer
289
        to a symbol into the index into the symbol table of the asymbol.
290
 
291
        o <<coff_write_symbols>>
292
 
293
        This routine runs through the symbol table and patches up the
294
        symbols from their internal form into the coff way, calls the
295
        bit twiddlers, and writes out the table to the file.
296
 
297
*/
298
 
299
/*
300
INTERNAL_DEFINITION
301
        coff_symbol_type
302
 
303
DESCRIPTION
304
        The hidden information for an <<asymbol>> is described in a
305
        <<combined_entry_type>>:
306
 
307
CODE_FRAGMENT
308
.
309
.typedef struct coff_ptr_struct
310
.{
311
.  {* Remembers the offset from the first symbol in the file for
312
.     this symbol. Generated by coff_renumber_symbols. *}
313
.  unsigned int offset;
314
.
315
.  {* Should the value of this symbol be renumbered.  Used for
316
.     XCOFF C_BSTAT symbols.  Set by coff_slurp_symbol_table.  *}
317
.  unsigned int fix_value : 1;
318
.
319
.  {* Should the tag field of this symbol be renumbered.
320
.     Created by coff_pointerize_aux. *}
321
.  unsigned int fix_tag : 1;
322
.
323
.  {* Should the endidx field of this symbol be renumbered.
324
.     Created by coff_pointerize_aux. *}
325
.  unsigned int fix_end : 1;
326
.
327
.  {* Should the x_csect.x_scnlen field be renumbered.
328
.     Created by coff_pointerize_aux. *}
329
.  unsigned int fix_scnlen : 1;
330
.
331
.  {* Fix up an XCOFF C_BINCL/C_EINCL symbol.  The value is the
332
.     index into the line number entries.  Set by coff_slurp_symbol_table.  *}
333
.  unsigned int fix_line : 1;
334
.
335
.  {* The container for the symbol structure as read and translated
336
.     from the file. *}
337
.  union
338
.  {
339
.    union internal_auxent auxent;
340
.    struct internal_syment syment;
341
.  } u;
342
.} combined_entry_type;
343
.
344
.
345
.{* Each canonical asymbol really looks like this: *}
346
.
347
.typedef struct coff_symbol_struct
348
.{
349
.  {* The actual symbol which the rest of BFD works with *}
350
.  asymbol symbol;
351
.
352
.  {* A pointer to the hidden information for this symbol *}
353
.  combined_entry_type *native;
354
.
355
.  {* A pointer to the linenumber information for this symbol *}
356
.  struct lineno_cache_entry *lineno;
357
.
358
.  {* Have the line numbers been relocated yet ? *}
359
.  bfd_boolean done_lineno;
360
.} coff_symbol_type;
361
 
362
*/
363
 
364
#include "libiberty.h"
365
 
366
#ifdef COFF_WITH_PE
367
#include "peicode.h"
368
#else
369
#include "coffswap.h"
370
#endif
371
 
372
#define STRING_SIZE_SIZE 4
373
 
374
#define DOT_DEBUG       ".debug"
375
#define GNU_LINKONCE_WI ".gnu.linkonce.wi."
376
#define DOT_RELOC       ".reloc"
377
 
378
#if defined (COFF_LONG_SECTION_NAMES)
379
/* Needed to expand the inputs to BLANKOR1TOODD.  */
380
#define COFFLONGSECTIONCATHELPER(x,y)    x ## y
381
/* If the input macro Y is blank or '1', return an odd number; if it is
382
   '0', return an even number.  Result undefined in all other cases.  */
383
#define BLANKOR1TOODD(y)                 COFFLONGSECTIONCATHELPER(1,y)
384
/* Defined to numerical 0 or 1 according to whether generation of long
385
   section names is disabled or enabled by default.  */
386
#define COFF_ENABLE_LONG_SECTION_NAMES   (BLANKOR1TOODD(COFF_LONG_SECTION_NAMES) & 1)
387
/* Where long section names are supported, we allow them to be enabled
388
   and disabled at runtime, so select an appropriate hook function for
389
   _bfd_coff_set_long_section_names.  */
390
#define COFF_LONG_SECTION_NAMES_SETTER   bfd_coff_set_long_section_names_allowed
391
#else /* !defined (COFF_LONG_SECTION_NAMES) */
392
/* If long section names are not supported, this stub disallows any
393
   attempt to enable them at run-time.  */
394
#define COFF_LONG_SECTION_NAMES_SETTER   bfd_coff_set_long_section_names_disallowed
395
#endif /* defined (COFF_LONG_SECTION_NAMES) */
396
 
397
/* Define a macro that can be used to initialise both the fields relating
398
   to long section names in the backend data struct simultaneously.  */
399
#if COFF_ENABLE_LONG_SECTION_NAMES
400
#define COFF_DEFAULT_LONG_SECTION_NAMES  (TRUE), COFF_LONG_SECTION_NAMES_SETTER
401
#else /* !COFF_ENABLE_LONG_SECTION_NAMES */
402
#define COFF_DEFAULT_LONG_SECTION_NAMES  (FALSE), COFF_LONG_SECTION_NAMES_SETTER
403
#endif /* COFF_ENABLE_LONG_SECTION_NAMES */
404
 
405
#if defined (COFF_LONG_SECTION_NAMES)
406
static bfd_boolean bfd_coff_set_long_section_names_allowed
407
  (bfd *, int);
408
#else /* !defined (COFF_LONG_SECTION_NAMES) */
409
static bfd_boolean bfd_coff_set_long_section_names_disallowed
410
  (bfd *, int);
411
#endif /* defined (COFF_LONG_SECTION_NAMES) */
412
static long sec_to_styp_flags
413
  (const char *, flagword);
414
static bfd_boolean styp_to_sec_flags
415
  (bfd *, void *, const char *, asection *, flagword *);
416
static bfd_boolean coff_bad_format_hook
417
  (bfd *, void *);
418
static void coff_set_custom_section_alignment
419
  (bfd *, asection *, const struct coff_section_alignment_entry *,
420
   const unsigned int);
421
static bfd_boolean coff_new_section_hook
422
  (bfd *, asection *);
423
static bfd_boolean coff_set_arch_mach_hook
424
  (bfd *, void *);
425
static bfd_boolean coff_write_relocs
426
  (bfd *, int);
427
static bfd_boolean coff_set_flags
428
  (bfd *, unsigned int *, unsigned short *);
429
static bfd_boolean coff_set_arch_mach
430
  (bfd *, enum bfd_architecture, unsigned long) ATTRIBUTE_UNUSED;
431
static bfd_boolean coff_compute_section_file_positions
432
  (bfd *);
433
static bfd_boolean coff_write_object_contents
434
  (bfd *) ATTRIBUTE_UNUSED;
435
static bfd_boolean coff_set_section_contents
436
  (bfd *, asection *, const void *, file_ptr, bfd_size_type);
437
static void * buy_and_read
438
  (bfd *, file_ptr, bfd_size_type);
439
static bfd_boolean coff_slurp_line_table
440
  (bfd *, asection *);
441
static bfd_boolean coff_slurp_symbol_table
442
  (bfd *);
443
static enum coff_symbol_classification coff_classify_symbol
444
  (bfd *, struct internal_syment *);
445
static bfd_boolean coff_slurp_reloc_table
446
  (bfd *, asection *, asymbol **);
447
static long coff_canonicalize_reloc
448
  (bfd *, asection *, arelent **, asymbol **);
449
#ifndef coff_mkobject_hook
450
static void * coff_mkobject_hook
451
  (bfd *, void *,  void *);
452
#endif
453
#ifdef COFF_WITH_PE
454
static flagword handle_COMDAT
455
  (bfd *, flagword, void *, const char *, asection *);
456
#endif
457
#ifdef COFF_IMAGE_WITH_PE
458
static bfd_boolean coff_read_word
459
  (bfd *, unsigned int *);
460
static unsigned int coff_compute_checksum
461
  (bfd *);
462
static bfd_boolean coff_apply_checksum
463
  (bfd *);
464
#endif
465
#ifdef TICOFF
466
static bfd_boolean ticoff0_bad_format_hook
467
  (bfd *, void * );
468
static bfd_boolean ticoff1_bad_format_hook
469
  (bfd *, void * );
470
#endif
471
 
472
/* void warning(); */
473
 
474
#if defined (COFF_LONG_SECTION_NAMES)
475
static bfd_boolean
476
bfd_coff_set_long_section_names_allowed (bfd *abfd, int enable)
477
{
478
  coff_backend_info (abfd)->_bfd_coff_long_section_names = enable;
479
  return TRUE;
480
}
481
#else /* !defined (COFF_LONG_SECTION_NAMES) */
482
static bfd_boolean
483
bfd_coff_set_long_section_names_disallowed (bfd *abfd, int enable)
484
{
485
  (void) abfd;
486
  (void) enable;
487
  return FALSE;
488
}
489
#endif /* defined (COFF_LONG_SECTION_NAMES) */
490
 
491
/* Return a word with STYP_* (scnhdr.s_flags) flags set to represent
492
   the incoming SEC_* flags.  The inverse of this function is
493
   styp_to_sec_flags().  NOTE: If you add to/change this routine, you
494
   should probably mirror the changes in styp_to_sec_flags().  */
495
 
496
#ifndef COFF_WITH_PE
497
 
498
/* Macros for setting debugging flags.  */
499
 
500
#ifdef STYP_DEBUG
501
#define STYP_XCOFF_DEBUG STYP_DEBUG
502
#else
503
#define STYP_XCOFF_DEBUG STYP_INFO
504
#endif
505
 
506
#ifdef COFF_ALIGN_IN_S_FLAGS
507
#define STYP_DEBUG_INFO STYP_DSECT
508
#else
509
#define STYP_DEBUG_INFO STYP_INFO
510
#endif
511
 
512
static long
513
sec_to_styp_flags (const char *sec_name, flagword sec_flags)
514
{
515
  long styp_flags = 0;
516
 
517
  if (!strcmp (sec_name, _TEXT))
518
    {
519
      styp_flags = STYP_TEXT;
520
    }
521
  else if (!strcmp (sec_name, _DATA))
522
    {
523
      styp_flags = STYP_DATA;
524
    }
525
  else if (!strcmp (sec_name, _BSS))
526
    {
527
      styp_flags = STYP_BSS;
528
#ifdef _COMMENT
529
    }
530
  else if (!strcmp (sec_name, _COMMENT))
531
    {
532
      styp_flags = STYP_INFO;
533
#endif /* _COMMENT */
534
#ifdef _LIB
535
    }
536
  else if (!strcmp (sec_name, _LIB))
537
    {
538
      styp_flags = STYP_LIB;
539
#endif /* _LIB */
540
#ifdef _LIT
541
    }
542
  else if (!strcmp (sec_name, _LIT))
543
    {
544
      styp_flags = STYP_LIT;
545
#endif /* _LIT */
546
    }
547
  else if (CONST_STRNEQ (sec_name, DOT_DEBUG))
548
    {
549
      /* Handle the XCOFF debug section and DWARF2 debug sections.  */
550
      if (!sec_name[6])
551
        styp_flags = STYP_XCOFF_DEBUG;
552
      else
553
        styp_flags = STYP_DEBUG_INFO;
554
    }
555
  else if (CONST_STRNEQ (sec_name, ".stab"))
556
    {
557
      styp_flags = STYP_DEBUG_INFO;
558
    }
559
#ifdef COFF_LONG_SECTION_NAMES
560
  else if (CONST_STRNEQ (sec_name, GNU_LINKONCE_WI))
561
    {
562
      styp_flags = STYP_DEBUG_INFO;
563
    }
564
#endif
565
#ifdef RS6000COFF_C
566
  else if (!strcmp (sec_name, _PAD))
567
    {
568
      styp_flags = STYP_PAD;
569
    }
570
  else if (!strcmp (sec_name, _LOADER))
571
    {
572
      styp_flags = STYP_LOADER;
573
    }
574
  else if (!strcmp (sec_name, _EXCEPT))
575
    {
576
      styp_flags = STYP_EXCEPT;
577
    }
578
  else if (!strcmp (sec_name, _TYPCHK))
579
    {
580
      styp_flags = STYP_TYPCHK;
581
    }
582
#endif
583
  /* Try and figure out what it should be */
584
  else if (sec_flags & SEC_CODE)
585
    {
586
      styp_flags = STYP_TEXT;
587
    }
588
  else if (sec_flags & SEC_DATA)
589
    {
590
      styp_flags = STYP_DATA;
591
    }
592
  else if (sec_flags & SEC_READONLY)
593
    {
594
#ifdef STYP_LIT                 /* 29k readonly text/data section */
595
      styp_flags = STYP_LIT;
596
#else
597
      styp_flags = STYP_TEXT;
598
#endif /* STYP_LIT */
599
    }
600
  else if (sec_flags & SEC_LOAD)
601
    {
602
      styp_flags = STYP_TEXT;
603
    }
604
  else if (sec_flags & SEC_ALLOC)
605
    {
606
      styp_flags = STYP_BSS;
607
    }
608
 
609
#ifdef STYP_CLINK
610
  if (sec_flags & SEC_TIC54X_CLINK)
611
    styp_flags |= STYP_CLINK;
612
#endif
613
 
614
#ifdef STYP_BLOCK
615
  if (sec_flags & SEC_TIC54X_BLOCK)
616
    styp_flags |= STYP_BLOCK;
617
#endif
618
 
619
#ifdef STYP_NOLOAD
620
  if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0)
621
    styp_flags |= STYP_NOLOAD;
622
#endif
623
 
624
  return styp_flags;
625
}
626
 
627
#else /* COFF_WITH_PE */
628
 
629
/* The PE version; see above for the general comments.  The non-PE
630
   case seems to be more guessing, and breaks PE format; specifically,
631
   .rdata is readonly, but it sure ain't text.  Really, all this
632
   should be set up properly in gas (or whatever assembler is in use),
633
   and honor whatever objcopy/strip, etc. sent us as input.  */
634
 
635
static long
636
sec_to_styp_flags (const char *sec_name, flagword sec_flags)
637
{
638
  long styp_flags = 0;
639
 
640
  /* caution: there are at least three groups of symbols that have
641
     very similar bits and meanings: IMAGE_SCN*, SEC_*, and STYP_*.
642
     SEC_* are the BFD internal flags, used for generic BFD
643
     information.  STYP_* are the COFF section flags which appear in
644
     COFF files.  IMAGE_SCN_* are the PE section flags which appear in
645
     PE files.  The STYP_* flags and the IMAGE_SCN_* flags overlap,
646
     but there are more IMAGE_SCN_* flags.  */
647
 
648
  /* FIXME: There is no gas syntax to specify the debug section flag.  */
649
  if (CONST_STRNEQ (sec_name, DOT_DEBUG)
650
      || CONST_STRNEQ (sec_name, GNU_LINKONCE_WI))
651
    sec_flags = SEC_DEBUGGING | SEC_READONLY;
652
 
653
  /* skip LOAD */
654
  /* READONLY later */
655
  /* skip RELOC */
656
  if ((sec_flags & SEC_CODE) != 0)
657
    styp_flags |= IMAGE_SCN_CNT_CODE;
658
  if ((sec_flags & SEC_DATA) != 0)
659
    styp_flags |= IMAGE_SCN_CNT_INITIALIZED_DATA;
660
  if ((sec_flags & SEC_ALLOC) != 0 && (sec_flags & SEC_LOAD) == 0)
661
    styp_flags |= IMAGE_SCN_CNT_UNINITIALIZED_DATA;  /* ==STYP_BSS */
662
  /* skip ROM */
663
  /* skip constRUCTOR */
664
  /* skip CONTENTS */
665
  if ((sec_flags & SEC_IS_COMMON) != 0)
666
    styp_flags |= IMAGE_SCN_LNK_COMDAT;
667
  if ((sec_flags & SEC_DEBUGGING) != 0)
668
    styp_flags |= IMAGE_SCN_MEM_DISCARDABLE;
669
  if ((sec_flags & SEC_EXCLUDE) != 0)
670
    styp_flags |= IMAGE_SCN_LNK_REMOVE;
671
  if ((sec_flags & SEC_NEVER_LOAD) != 0)
672
    styp_flags |= IMAGE_SCN_LNK_REMOVE;
673
  /* skip IN_MEMORY */
674
  /* skip SORT */
675
  if (sec_flags & SEC_LINK_ONCE)
676
    styp_flags |= IMAGE_SCN_LNK_COMDAT;
677
  /* skip LINK_DUPLICATES */
678
  /* skip LINKER_CREATED */
679
 
680
  if ((sec_flags & SEC_COFF_NOREAD) == 0)
681
    styp_flags |= IMAGE_SCN_MEM_READ;     /* Invert NOREAD for read.  */
682
  if ((sec_flags & SEC_READONLY) == 0)
683
    styp_flags |= IMAGE_SCN_MEM_WRITE;    /* Invert READONLY for write.  */
684
  if (sec_flags & SEC_CODE)
685
    styp_flags |= IMAGE_SCN_MEM_EXECUTE;  /* CODE->EXECUTE.  */
686
  if (sec_flags & SEC_COFF_SHARED)
687
    styp_flags |= IMAGE_SCN_MEM_SHARED;   /* Shared remains meaningful.  */
688
 
689
  return styp_flags;
690
}
691
 
692
#endif /* COFF_WITH_PE */
693
 
694
/* Return a word with SEC_* flags set to represent the incoming STYP_*
695
   flags (from scnhdr.s_flags).  The inverse of this function is
696
   sec_to_styp_flags().  NOTE: If you add to/change this routine, you
697
   should probably mirror the changes in sec_to_styp_flags().  */
698
 
699
#ifndef COFF_WITH_PE
700
 
701
static bfd_boolean
702
styp_to_sec_flags (bfd *abfd ATTRIBUTE_UNUSED,
703
                   void * hdr,
704
                   const char *name,
705
                   asection *section ATTRIBUTE_UNUSED,
706
                   flagword *flags_ptr)
707
{
708
  struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
709
  long styp_flags = internal_s->s_flags;
710
  flagword sec_flags = 0;
711
 
712
#ifdef STYP_BLOCK
713
  if (styp_flags & STYP_BLOCK)
714
    sec_flags |= SEC_TIC54X_BLOCK;
715
#endif
716
 
717
#ifdef STYP_CLINK
718
  if (styp_flags & STYP_CLINK)
719
    sec_flags |= SEC_TIC54X_CLINK;
720
#endif
721
 
722
#ifdef STYP_NOLOAD
723
  if (styp_flags & STYP_NOLOAD)
724
    sec_flags |= SEC_NEVER_LOAD;
725
#endif /* STYP_NOLOAD */
726
 
727
  /* For 386 COFF, at least, an unloadable text or data section is
728
     actually a shared library section.  */
729
  if (styp_flags & STYP_TEXT)
730
    {
731
      if (sec_flags & SEC_NEVER_LOAD)
732
        sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
733
      else
734
        sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
735
    }
736
  else if (styp_flags & STYP_DATA)
737
    {
738
      if (sec_flags & SEC_NEVER_LOAD)
739
        sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY;
740
      else
741
        sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
742
    }
743
  else if (styp_flags & STYP_BSS)
744
    {
745
#ifdef BSS_NOLOAD_IS_SHARED_LIBRARY
746
      if (sec_flags & SEC_NEVER_LOAD)
747
        sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY;
748
      else
749
#endif
750
        sec_flags |= SEC_ALLOC;
751
    }
752
  else if (styp_flags & STYP_INFO)
753
    {
754
      /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is
755
         defined.  coff_compute_section_file_positions uses
756
         COFF_PAGE_SIZE to ensure that the low order bits of the
757
         section VMA and the file offset match.  If we don't know
758
         COFF_PAGE_SIZE, we can't ensure the correct correspondence,
759
         and demand page loading of the file will fail.  */
760
#if defined (COFF_PAGE_SIZE) && !defined (COFF_ALIGN_IN_S_FLAGS)
761
      sec_flags |= SEC_DEBUGGING;
762
#endif
763
    }
764
  else if (styp_flags & STYP_PAD)
765
    sec_flags = 0;
766
  else if (strcmp (name, _TEXT) == 0)
767
    {
768
      if (sec_flags & SEC_NEVER_LOAD)
769
        sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
770
      else
771
        sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
772
    }
773
  else if (strcmp (name, _DATA) == 0)
774
    {
775
      if (sec_flags & SEC_NEVER_LOAD)
776
        sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY;
777
      else
778
        sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
779
    }
780
  else if (strcmp (name, _BSS) == 0)
781
    {
782
#ifdef BSS_NOLOAD_IS_SHARED_LIBRARY
783
      if (sec_flags & SEC_NEVER_LOAD)
784
        sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY;
785
      else
786
#endif
787
        sec_flags |= SEC_ALLOC;
788
    }
789
  else if (CONST_STRNEQ (name, DOT_DEBUG)
790
#ifdef _COMMENT
791
           || strcmp (name, _COMMENT) == 0
792
#endif
793
#ifdef COFF_LONG_SECTION_NAMES
794
           || CONST_STRNEQ (name, GNU_LINKONCE_WI)
795
#endif
796
           || CONST_STRNEQ (name, ".stab"))
797
    {
798
#ifdef COFF_PAGE_SIZE
799
      sec_flags |= SEC_DEBUGGING;
800
#endif
801
    }
802
#ifdef _LIB
803
  else if (strcmp (name, _LIB) == 0)
804
    ;
805
#endif
806
#ifdef _LIT
807
  else if (strcmp (name, _LIT) == 0)
808
    sec_flags = SEC_LOAD | SEC_ALLOC | SEC_READONLY;
809
#endif
810
  else
811
    sec_flags |= SEC_ALLOC | SEC_LOAD;
812
 
813
#ifdef STYP_LIT                 /* A29k readonly text/data section type.  */
814
  if ((styp_flags & STYP_LIT) == STYP_LIT)
815
    sec_flags = (SEC_LOAD | SEC_ALLOC | SEC_READONLY);
816
#endif /* STYP_LIT */
817
 
818
#ifdef STYP_OTHER_LOAD          /* Other loaded sections.  */
819
  if (styp_flags & STYP_OTHER_LOAD)
820
    sec_flags = (SEC_LOAD | SEC_ALLOC);
821
#endif /* STYP_SDATA */
822
 
823
#if defined (COFF_LONG_SECTION_NAMES) && defined (COFF_SUPPORT_GNU_LINKONCE)
824
  /* As a GNU extension, if the name begins with .gnu.linkonce, we
825
     only link a single copy of the section.  This is used to support
826
     g++.  g++ will emit each template expansion in its own section.
827
     The symbols will be defined as weak, so that multiple definitions
828
     are permitted.  The GNU linker extension is to actually discard
829
     all but one of the sections.  */
830
  if (CONST_STRNEQ (name, ".gnu.linkonce"))
831
    sec_flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
832
#endif
833
 
834
  if (flags_ptr == NULL)
835
    return FALSE;
836
 
837
  * flags_ptr = sec_flags;
838
  return TRUE;
839
}
840
 
841
#else /* COFF_WITH_PE */
842
 
843
static flagword
844
handle_COMDAT (bfd * abfd,
845
               flagword sec_flags,
846
               void * hdr,
847
               const char *name,
848
               asection *section)
849
{
850
  struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
851
  bfd_byte *esymstart, *esym, *esymend;
852
  int seen_state = 0;
853
  char *target_name = NULL;
854
 
855
  sec_flags |= SEC_LINK_ONCE;
856
 
857
  /* Unfortunately, the PE format stores essential information in
858
     the symbol table, of all places.  We need to extract that
859
     information now, so that objdump and the linker will know how
860
     to handle the section without worrying about the symbols.  We
861
     can't call slurp_symtab, because the linker doesn't want the
862
     swapped symbols.  */
863
 
864
  /* COMDAT sections are special.  The first symbol is the section
865
     symbol, which tells what kind of COMDAT section it is.  The
866
     second symbol is the "comdat symbol" - the one with the
867
     unique name.  GNU uses the section symbol for the unique
868
     name; MS uses ".text" for every comdat section.  Sigh.  - DJ */
869
 
870
  /* This is not mirrored in sec_to_styp_flags(), but there
871
     doesn't seem to be a need to, either, and it would at best be
872
     rather messy.  */
873
 
874
  if (! _bfd_coff_get_external_symbols (abfd))
875
    return sec_flags;
876
 
877
  esymstart = esym = (bfd_byte *) obj_coff_external_syms (abfd);
878
  esymend = esym + obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd);
879
 
880
  while (esym < esymend)
881
    {
882
      struct internal_syment isym;
883
      char buf[SYMNMLEN + 1];
884
      const char *symname;
885
 
886
      bfd_coff_swap_sym_in (abfd, esym, & isym);
887
 
888
      if (sizeof (internal_s->s_name) > SYMNMLEN)
889
        {
890
          /* This case implies that the matching
891
             symbol name will be in the string table.  */
892
          abort ();
893
        }
894
 
895
      if (isym.n_scnum == section->target_index)
896
        {
897
          /* According to the MSVC documentation, the first
898
             TWO entries with the section # are both of
899
             interest to us.  The first one is the "section
900
             symbol" (section name).  The second is the comdat
901
             symbol name.  Here, we've found the first
902
             qualifying entry; we distinguish it from the
903
             second with a state flag.
904
 
905
             In the case of gas-generated (at least until that
906
             is fixed) .o files, it isn't necessarily the
907
             second one.  It may be some other later symbol.
908
 
909
             Since gas also doesn't follow MS conventions and
910
             emits the section similar to .text$<name>, where
911
             <something> is the name we're looking for, we
912
             distinguish the two as follows:
913
 
914
             If the section name is simply a section name (no
915
             $) we presume it's MS-generated, and look at
916
             precisely the second symbol for the comdat name.
917
             If the section name has a $, we assume it's
918
             gas-generated, and look for <something> (whatever
919
             follows the $) as the comdat symbol.  */
920
 
921
          /* All 3 branches use this.  */
922
          symname = _bfd_coff_internal_syment_name (abfd, &isym, buf);
923
 
924
          if (symname == NULL)
925
            abort ();
926
 
927
          switch (seen_state)
928
            {
929
            case 0:
930
              {
931
                /* The first time we've seen the symbol.  */
932
                union internal_auxent aux;
933
 
934
                /* If it isn't the stuff we're expecting, die;
935
                   The MS documentation is vague, but it
936
                   appears that the second entry serves BOTH
937
                   as the comdat symbol and the defining
938
                   symbol record (either C_STAT or C_EXT,
939
                   possibly with an aux entry with debug
940
                   information if it's a function.)  It
941
                   appears the only way to find the second one
942
                   is to count.  (On Intel, they appear to be
943
                   adjacent, but on Alpha, they have been
944
                   found separated.)
945
 
946
                   Here, we think we've found the first one,
947
                   but there's some checking we can do to be
948
                   sure.  */
949
 
950
                if (! ((isym.n_sclass == C_STAT
951
                        || isym.n_sclass == C_EXT)
952
                       && isym.n_type == T_NULL
953
                       && isym.n_value == 0))
954
                  abort ();
955
 
956
                /* FIXME LATER: MSVC generates section names
957
                   like .text for comdats.  Gas generates
958
                   names like .text$foo__Fv (in the case of a
959
                   function).  See comment above for more.  */
960
 
961
                if (isym.n_sclass == C_STAT && strcmp (name, symname) != 0)
962
                  _bfd_error_handler (_("%B: warning: COMDAT symbol '%s' does not match section name '%s'"),
963
                                      abfd, symname, name);
964
 
965
                seen_state = 1;
966
 
967
                /* This is the section symbol.  */
968
                bfd_coff_swap_aux_in (abfd, (esym + bfd_coff_symesz (abfd)),
969
                                      isym.n_type, isym.n_sclass,
970
                                      0, isym.n_numaux, & aux);
971
 
972
                target_name = strchr (name, '$');
973
                if (target_name != NULL)
974
                  {
975
                    /* Gas mode.  */
976
                    seen_state = 2;
977
                    /* Skip the `$'.  */
978
                    target_name += 1;
979
                  }
980
 
981
                /* FIXME: Microsoft uses NODUPLICATES and
982
                   ASSOCIATIVE, but gnu uses ANY and
983
                   SAME_SIZE.  Unfortunately, gnu doesn't do
984
                   the comdat symbols right.  So, until we can
985
                   fix it to do the right thing, we are
986
                   temporarily disabling comdats for the MS
987
                   types (they're used in DLLs and C++, but we
988
                   don't support *their* C++ libraries anyway
989
                   - DJ.  */
990
 
991
                /* Cygwin does not follow the MS style, and
992
                   uses ANY and SAME_SIZE where NODUPLICATES
993
                   and ASSOCIATIVE should be used.  For
994
                   Interix, we just do the right thing up
995
                   front.  */
996
 
997
                switch (aux.x_scn.x_comdat)
998
                  {
999
                  case IMAGE_COMDAT_SELECT_NODUPLICATES:
1000
#ifdef STRICT_PE_FORMAT
1001
                    sec_flags |= SEC_LINK_DUPLICATES_ONE_ONLY;
1002
#else
1003
                    sec_flags &= ~SEC_LINK_ONCE;
1004
#endif
1005
                    break;
1006
 
1007
                  case IMAGE_COMDAT_SELECT_ANY:
1008
                    sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
1009
                    break;
1010
 
1011
                  case IMAGE_COMDAT_SELECT_SAME_SIZE:
1012
                    sec_flags |= SEC_LINK_DUPLICATES_SAME_SIZE;
1013
                    break;
1014
 
1015
                  case IMAGE_COMDAT_SELECT_EXACT_MATCH:
1016
                    /* Not yet fully implemented ??? */
1017
                    sec_flags |= SEC_LINK_DUPLICATES_SAME_CONTENTS;
1018
                    break;
1019
 
1020
                    /* debug$S gets this case; other
1021
                       implications ??? */
1022
 
1023
                    /* There may be no symbol... we'll search
1024
                       the whole table... Is this the right
1025
                       place to play this game? Or should we do
1026
                       it when reading it in.  */
1027
                  case IMAGE_COMDAT_SELECT_ASSOCIATIVE:
1028
#ifdef STRICT_PE_FORMAT
1029
                    /* FIXME: This is not currently implemented.  */
1030
                    sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
1031
#else
1032
                    sec_flags &= ~SEC_LINK_ONCE;
1033
#endif
1034
                    break;
1035
 
1036
                  default:  /* 0 means "no symbol" */
1037
                    /* debug$F gets this case; other
1038
                       implications ??? */
1039
                    sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
1040
                    break;
1041
                  }
1042
              }
1043
              break;
1044
 
1045
            case 2:
1046
              /* Gas mode: the first matching on partial name.  */
1047
 
1048
#ifndef TARGET_UNDERSCORE
1049
#define TARGET_UNDERSCORE 0
1050
#endif
1051
              /* Is this the name we're looking for ?  */
1052
              if (strcmp (target_name,
1053
                          symname + (TARGET_UNDERSCORE ? 1 : 0)) != 0)
1054
                {
1055
                  /* Not the name we're looking for */
1056
                  esym += (isym.n_numaux + 1) * bfd_coff_symesz (abfd);
1057
                  continue;
1058
                }
1059
              /* Fall through.  */
1060
            case 1:
1061
              /* MSVC mode: the lexically second symbol (or
1062
                 drop through from the above).  */
1063
              {
1064
                char *newname;
1065
                bfd_size_type amt;
1066
 
1067
                /* This must the second symbol with the
1068
                   section #.  It is the actual symbol name.
1069
                   Intel puts the two adjacent, but Alpha (at
1070
                   least) spreads them out.  */
1071
 
1072
                amt = sizeof (struct coff_comdat_info);
1073
                coff_section_data (abfd, section)->comdat
1074
                  = (struct coff_comdat_info *) bfd_alloc (abfd, amt);
1075
                if (coff_section_data (abfd, section)->comdat == NULL)
1076
                  abort ();
1077
 
1078
                coff_section_data (abfd, section)->comdat->symbol =
1079
                  (esym - esymstart) / bfd_coff_symesz (abfd);
1080
 
1081
                amt = strlen (symname) + 1;
1082
                newname = (char *) bfd_alloc (abfd, amt);
1083
                if (newname == NULL)
1084
                  abort ();
1085
 
1086
                strcpy (newname, symname);
1087
                coff_section_data (abfd, section)->comdat->name
1088
                  = newname;
1089
              }
1090
 
1091
              goto breakloop;
1092
            }
1093
        }
1094
 
1095
      esym += (isym.n_numaux + 1) * bfd_coff_symesz (abfd);
1096
    }
1097
 
1098
 breakloop:
1099
  return sec_flags;
1100
}
1101
 
1102
 
1103
/* The PE version; see above for the general comments.
1104
 
1105
   Since to set the SEC_LINK_ONCE and associated flags, we have to
1106
   look at the symbol table anyway, we return the symbol table index
1107
   of the symbol being used as the COMDAT symbol.  This is admittedly
1108
   ugly, but there's really nowhere else that we have access to the
1109
   required information.  FIXME: Is the COMDAT symbol index used for
1110
   any purpose other than objdump?  */
1111
 
1112
static bfd_boolean
1113
styp_to_sec_flags (bfd *abfd,
1114
                   void * hdr,
1115
                   const char *name,
1116
                   asection *section,
1117
                   flagword *flags_ptr)
1118
{
1119
  struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
1120
  long styp_flags = internal_s->s_flags;
1121
  flagword sec_flags;
1122
  bfd_boolean result = TRUE;
1123
 
1124
  /* Assume read only unless IMAGE_SCN_MEM_WRITE is specified.  */
1125
  sec_flags = SEC_READONLY;
1126
 
1127
  /* If section disallows read, then set the NOREAD flag. */
1128
  if ((styp_flags & IMAGE_SCN_MEM_READ) == 0)
1129
    sec_flags |= SEC_COFF_NOREAD;
1130
 
1131
  /* Process each flag bit in styp_flags in turn.  */
1132
  while (styp_flags)
1133
    {
1134
      long flag = styp_flags & - styp_flags;
1135
      char * unhandled = NULL;
1136
 
1137
      styp_flags &= ~ flag;
1138
 
1139
      /* We infer from the distinct read/write/execute bits the settings
1140
         of some of the bfd flags; the actual values, should we need them,
1141
         are also in pei_section_data (abfd, section)->pe_flags.  */
1142
 
1143
      switch (flag)
1144
        {
1145
        case STYP_DSECT:
1146
          unhandled = "STYP_DSECT";
1147
          break;
1148
        case STYP_GROUP:
1149
          unhandled = "STYP_GROUP";
1150
          break;
1151
        case STYP_COPY:
1152
          unhandled = "STYP_COPY";
1153
          break;
1154
        case STYP_OVER:
1155
          unhandled = "STYP_OVER";
1156
          break;
1157
#ifdef SEC_NEVER_LOAD
1158
        case STYP_NOLOAD:
1159
          sec_flags |= SEC_NEVER_LOAD;
1160
          break;
1161
#endif
1162
        case IMAGE_SCN_MEM_READ:
1163
          sec_flags &= ~SEC_COFF_NOREAD;
1164
          break;
1165
        case IMAGE_SCN_TYPE_NO_PAD:
1166
          /* Skip.  */
1167
          break;
1168
        case IMAGE_SCN_LNK_OTHER:
1169
          unhandled = "IMAGE_SCN_LNK_OTHER";
1170
          break;
1171
        case IMAGE_SCN_MEM_NOT_CACHED:
1172
          unhandled = "IMAGE_SCN_MEM_NOT_CACHED";
1173
          break;
1174
        case IMAGE_SCN_MEM_NOT_PAGED:
1175
          /* Generate a warning message rather using the 'unhandled'
1176
             variable as this will allow some .sys files generate by
1177
             other toolchains to be processed.  See bugzilla issue 196.  */
1178
          _bfd_error_handler (_("%B: Warning: Ignoring section flag IMAGE_SCN_MEM_NOT_PAGED in section %s"),
1179
                              abfd, name);
1180
          break;
1181
        case IMAGE_SCN_MEM_EXECUTE:
1182
          sec_flags |= SEC_CODE;
1183
          break;
1184
        case IMAGE_SCN_MEM_WRITE:
1185
          sec_flags &= ~ SEC_READONLY;
1186
          break;
1187
        case IMAGE_SCN_MEM_DISCARDABLE:
1188
          /* The MS PE spec says that debug sections are DISCARDABLE,
1189
             but the presence of a DISCARDABLE flag does not necessarily
1190
             mean that a given section contains debug information.  Thus
1191
             we only set the SEC_DEBUGGING flag on sections that we
1192
             recognise as containing debug information.  */
1193
             if (CONST_STRNEQ (name, DOT_DEBUG)
1194
#ifdef _COMMENT
1195
              || strcmp (name, _COMMENT) == 0
1196
#endif
1197
#ifdef COFF_LONG_SECTION_NAMES
1198
              || CONST_STRNEQ (name, GNU_LINKONCE_WI)
1199
#endif
1200
              || CONST_STRNEQ (name, ".stab"))
1201
            sec_flags |= SEC_DEBUGGING;
1202
          break;
1203
        case IMAGE_SCN_MEM_SHARED:
1204
          sec_flags |= SEC_COFF_SHARED;
1205
          break;
1206
        case IMAGE_SCN_LNK_REMOVE:
1207
          sec_flags |= SEC_EXCLUDE;
1208
          break;
1209
        case IMAGE_SCN_CNT_CODE:
1210
          sec_flags |= SEC_CODE | SEC_ALLOC | SEC_LOAD;
1211
          break;
1212
        case IMAGE_SCN_CNT_INITIALIZED_DATA:
1213
          sec_flags |= SEC_DATA | SEC_ALLOC | SEC_LOAD;
1214
          break;
1215
        case IMAGE_SCN_CNT_UNINITIALIZED_DATA:
1216
          sec_flags |= SEC_ALLOC;
1217
          break;
1218
        case IMAGE_SCN_LNK_INFO:
1219
          /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is
1220
             defined.  coff_compute_section_file_positions uses
1221
             COFF_PAGE_SIZE to ensure that the low order bits of the
1222
             section VMA and the file offset match.  If we don't know
1223
             COFF_PAGE_SIZE, we can't ensure the correct correspondence,
1224
             and demand page loading of the file will fail.  */
1225
#ifdef COFF_PAGE_SIZE
1226
          sec_flags |= SEC_DEBUGGING;
1227
#endif
1228
          break;
1229
        case IMAGE_SCN_LNK_COMDAT:
1230
          /* COMDAT gets very special treatment.  */
1231
          sec_flags = handle_COMDAT (abfd, sec_flags, hdr, name, section);
1232
          break;
1233
        default:
1234
          /* Silently ignore for now.  */
1235
          break;
1236
        }
1237
 
1238
      /* If the section flag was not handled, report it here.  */
1239
      if (unhandled != NULL)
1240
        {
1241
          (*_bfd_error_handler)
1242
            (_("%B (%s): Section flag %s (0x%x) ignored"),
1243
             abfd, name, unhandled, flag);
1244
          result = FALSE;
1245
        }
1246
    }
1247
 
1248
#if defined (COFF_LONG_SECTION_NAMES) && defined (COFF_SUPPORT_GNU_LINKONCE)
1249
  /* As a GNU extension, if the name begins with .gnu.linkonce, we
1250
     only link a single copy of the section.  This is used to support
1251
     g++.  g++ will emit each template expansion in its own section.
1252
     The symbols will be defined as weak, so that multiple definitions
1253
     are permitted.  The GNU linker extension is to actually discard
1254
     all but one of the sections.  */
1255
  if (CONST_STRNEQ (name, ".gnu.linkonce"))
1256
    sec_flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
1257
#endif
1258
 
1259
  if (flags_ptr)
1260
    * flags_ptr = sec_flags;
1261
 
1262
  return result;
1263
}
1264
 
1265
#endif /* COFF_WITH_PE */
1266
 
1267
#define get_index(symbol)       ((symbol)->udata.i)
1268
 
1269
/*
1270
INTERNAL_DEFINITION
1271
        bfd_coff_backend_data
1272
 
1273
CODE_FRAGMENT
1274
 
1275
.{* COFF symbol classifications.  *}
1276
.
1277
.enum coff_symbol_classification
1278
.{
1279
.  {* Global symbol.  *}
1280
.  COFF_SYMBOL_GLOBAL,
1281
.  {* Common symbol.  *}
1282
.  COFF_SYMBOL_COMMON,
1283
.  {* Undefined symbol.  *}
1284
.  COFF_SYMBOL_UNDEFINED,
1285
.  {* Local symbol.  *}
1286
.  COFF_SYMBOL_LOCAL,
1287
.  {* PE section symbol.  *}
1288
.  COFF_SYMBOL_PE_SECTION
1289
.};
1290
.
1291
Special entry points for gdb to swap in coff symbol table parts:
1292
.typedef struct
1293
.{
1294
.  void (*_bfd_coff_swap_aux_in)
1295
.    (bfd *, void *, int, int, int, int, void *);
1296
.
1297
.  void (*_bfd_coff_swap_sym_in)
1298
.    (bfd *, void *, void *);
1299
.
1300
.  void (*_bfd_coff_swap_lineno_in)
1301
.    (bfd *, void *, void *);
1302
.
1303
.  unsigned int (*_bfd_coff_swap_aux_out)
1304
.    (bfd *, void *, int, int, int, int, void *);
1305
.
1306
.  unsigned int (*_bfd_coff_swap_sym_out)
1307
.    (bfd *, void *, void *);
1308
.
1309
.  unsigned int (*_bfd_coff_swap_lineno_out)
1310
.    (bfd *, void *, void *);
1311
.
1312
.  unsigned int (*_bfd_coff_swap_reloc_out)
1313
.    (bfd *, void *, void *);
1314
.
1315
.  unsigned int (*_bfd_coff_swap_filehdr_out)
1316
.    (bfd *, void *, void *);
1317
.
1318
.  unsigned int (*_bfd_coff_swap_aouthdr_out)
1319
.    (bfd *, void *, void *);
1320
.
1321
.  unsigned int (*_bfd_coff_swap_scnhdr_out)
1322
.    (bfd *, void *, void *);
1323
.
1324
.  unsigned int _bfd_filhsz;
1325
.  unsigned int _bfd_aoutsz;
1326
.  unsigned int _bfd_scnhsz;
1327
.  unsigned int _bfd_symesz;
1328
.  unsigned int _bfd_auxesz;
1329
.  unsigned int _bfd_relsz;
1330
.  unsigned int _bfd_linesz;
1331
.  unsigned int _bfd_filnmlen;
1332
.  bfd_boolean _bfd_coff_long_filenames;
1333
.
1334
.  bfd_boolean _bfd_coff_long_section_names;
1335
.  bfd_boolean (*_bfd_coff_set_long_section_names)
1336
.    (bfd *, int);
1337
.
1338
.  unsigned int _bfd_coff_default_section_alignment_power;
1339
.  bfd_boolean _bfd_coff_force_symnames_in_strings;
1340
.  unsigned int _bfd_coff_debug_string_prefix_length;
1341
.
1342
.  void (*_bfd_coff_swap_filehdr_in)
1343
.    (bfd *, void *, void *);
1344
.
1345
.  void (*_bfd_coff_swap_aouthdr_in)
1346
.    (bfd *, void *, void *);
1347
.
1348
.  void (*_bfd_coff_swap_scnhdr_in)
1349
.    (bfd *, void *, void *);
1350
.
1351
.  void (*_bfd_coff_swap_reloc_in)
1352
.    (bfd *abfd, void *, void *);
1353
.
1354
.  bfd_boolean (*_bfd_coff_bad_format_hook)
1355
.    (bfd *, void *);
1356
.
1357
.  bfd_boolean (*_bfd_coff_set_arch_mach_hook)
1358
.    (bfd *, void *);
1359
.
1360
.  void * (*_bfd_coff_mkobject_hook)
1361
.    (bfd *, void *, void *);
1362
.
1363
.  bfd_boolean (*_bfd_styp_to_sec_flags_hook)
1364
.    (bfd *, void *, const char *, asection *, flagword *);
1365
.
1366
.  void (*_bfd_set_alignment_hook)
1367
.    (bfd *, asection *, void *);
1368
.
1369
.  bfd_boolean (*_bfd_coff_slurp_symbol_table)
1370
.    (bfd *);
1371
.
1372
.  bfd_boolean (*_bfd_coff_symname_in_debug)
1373
.    (bfd *, struct internal_syment *);
1374
.
1375
.  bfd_boolean (*_bfd_coff_pointerize_aux_hook)
1376
.    (bfd *, combined_entry_type *, combined_entry_type *,
1377
.            unsigned int, combined_entry_type *);
1378
.
1379
.  bfd_boolean (*_bfd_coff_print_aux)
1380
.    (bfd *, FILE *, combined_entry_type *, combined_entry_type *,
1381
.            combined_entry_type *, unsigned int);
1382
.
1383
.  void (*_bfd_coff_reloc16_extra_cases)
1384
.    (bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *,
1385
.           bfd_byte *, unsigned int *, unsigned int *);
1386
.
1387
.  int (*_bfd_coff_reloc16_estimate)
1388
.    (bfd *, asection *, arelent *, unsigned int,
1389
.            struct bfd_link_info *);
1390
.
1391
.  enum coff_symbol_classification (*_bfd_coff_classify_symbol)
1392
.    (bfd *, struct internal_syment *);
1393
.
1394
.  bfd_boolean (*_bfd_coff_compute_section_file_positions)
1395
.    (bfd *);
1396
.
1397
.  bfd_boolean (*_bfd_coff_start_final_link)
1398
.    (bfd *, struct bfd_link_info *);
1399
.
1400
.  bfd_boolean (*_bfd_coff_relocate_section)
1401
.    (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
1402
.            struct internal_reloc *, struct internal_syment *, asection **);
1403
.
1404
.  reloc_howto_type *(*_bfd_coff_rtype_to_howto)
1405
.    (bfd *, asection *, struct internal_reloc *,
1406
.            struct coff_link_hash_entry *, struct internal_syment *,
1407
.            bfd_vma *);
1408
.
1409
.  bfd_boolean (*_bfd_coff_adjust_symndx)
1410
.    (bfd *, struct bfd_link_info *, bfd *, asection *,
1411
.            struct internal_reloc *, bfd_boolean *);
1412
.
1413
.  bfd_boolean (*_bfd_coff_link_add_one_symbol)
1414
.    (struct bfd_link_info *, bfd *, const char *, flagword,
1415
.            asection *, bfd_vma, const char *, bfd_boolean, bfd_boolean,
1416
.            struct bfd_link_hash_entry **);
1417
.
1418
.  bfd_boolean (*_bfd_coff_link_output_has_begun)
1419
.    (bfd *, struct coff_final_link_info *);
1420
.
1421
.  bfd_boolean (*_bfd_coff_final_link_postscript)
1422
.    (bfd *, struct coff_final_link_info *);
1423
.
1424
.  bfd_boolean (*_bfd_coff_print_pdata)
1425
.    (bfd *, void *);
1426
.
1427
.} bfd_coff_backend_data;
1428
.
1429
.#define coff_backend_info(abfd) \
1430
.  ((bfd_coff_backend_data *) (abfd)->xvec->backend_data)
1431
.
1432
.#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \
1433
.  ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i))
1434
.
1435
.#define bfd_coff_swap_sym_in(a,e,i) \
1436
.  ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i))
1437
.
1438
.#define bfd_coff_swap_lineno_in(a,e,i) \
1439
.  ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i))
1440
.
1441
.#define bfd_coff_swap_reloc_out(abfd, i, o) \
1442
.  ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o))
1443
.
1444
.#define bfd_coff_swap_lineno_out(abfd, i, o) \
1445
.  ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o))
1446
.
1447
.#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \
1448
.  ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o))
1449
.
1450
.#define bfd_coff_swap_sym_out(abfd, i,o) \
1451
.  ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
1452
.
1453
.#define bfd_coff_swap_scnhdr_out(abfd, i,o) \
1454
.  ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
1455
.
1456
.#define bfd_coff_swap_filehdr_out(abfd, i,o) \
1457
.  ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
1458
.
1459
.#define bfd_coff_swap_aouthdr_out(abfd, i,o) \
1460
.  ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o))
1461
.
1462
.#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz)
1463
.#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz)
1464
.#define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz)
1465
.#define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz)
1466
.#define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz)
1467
.#define bfd_coff_relsz(abfd)  (coff_backend_info (abfd)->_bfd_relsz)
1468
.#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz)
1469
.#define bfd_coff_filnmlen(abfd) (coff_backend_info (abfd)->_bfd_filnmlen)
1470
.#define bfd_coff_long_filenames(abfd) \
1471
.  (coff_backend_info (abfd)->_bfd_coff_long_filenames)
1472
.#define bfd_coff_long_section_names(abfd) \
1473
.  (coff_backend_info (abfd)->_bfd_coff_long_section_names)
1474
.#define bfd_coff_set_long_section_names(abfd, enable) \
1475
.  ((coff_backend_info (abfd)->_bfd_coff_set_long_section_names) (abfd, enable))
1476
.#define bfd_coff_default_section_alignment_power(abfd) \
1477
.  (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power)
1478
.#define bfd_coff_swap_filehdr_in(abfd, i,o) \
1479
.  ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))
1480
.
1481
.#define bfd_coff_swap_aouthdr_in(abfd, i,o) \
1482
.  ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o))
1483
.
1484
.#define bfd_coff_swap_scnhdr_in(abfd, i,o) \
1485
.  ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o))
1486
.
1487
.#define bfd_coff_swap_reloc_in(abfd, i, o) \
1488
.  ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o))
1489
.
1490
.#define bfd_coff_bad_format_hook(abfd, filehdr) \
1491
.  ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr))
1492
.
1493
.#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\
1494
.  ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr))
1495
.#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\
1496
.  ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook)\
1497
.   (abfd, filehdr, aouthdr))
1498
.
1499
.#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section, flags_ptr)\
1500
.  ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\
1501
.   (abfd, scnhdr, name, section, flags_ptr))
1502
.
1503
.#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\
1504
.  ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr))
1505
.
1506
.#define bfd_coff_slurp_symbol_table(abfd)\
1507
.  ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd))
1508
.
1509
.#define bfd_coff_symname_in_debug(abfd, sym)\
1510
.  ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
1511
.
1512
.#define bfd_coff_force_symnames_in_strings(abfd)\
1513
.  (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings)
1514
.
1515
.#define bfd_coff_debug_string_prefix_length(abfd)\
1516
.  (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length)
1517
.
1518
.#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\
1519
.  ((coff_backend_info (abfd)->_bfd_coff_print_aux)\
1520
.   (abfd, file, base, symbol, aux, indaux))
1521
.
1522
.#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order,\
1523
.                                     reloc, data, src_ptr, dst_ptr)\
1524
.  ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
1525
.   (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
1526
.
1527
.#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\
1528
.  ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\
1529
.   (abfd, section, reloc, shrink, link_info))
1530
.
1531
.#define bfd_coff_classify_symbol(abfd, sym)\
1532
.  ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\
1533
.   (abfd, sym))
1534
.
1535
.#define bfd_coff_compute_section_file_positions(abfd)\
1536
.  ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\
1537
.   (abfd))
1538
.
1539
.#define bfd_coff_start_final_link(obfd, info)\
1540
.  ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\
1541
.   (obfd, info))
1542
.#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\
1543
.  ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\
1544
.   (obfd, info, ibfd, o, con, rel, isyms, secs))
1545
.#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\
1546
.  ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\
1547
.   (abfd, sec, rel, h, sym, addendp))
1548
.#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\
1549
.  ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\
1550
.   (obfd, info, ibfd, sec, rel, adjustedp))
1551
.#define bfd_coff_link_add_one_symbol(info, abfd, name, flags, section,\
1552
.                                     value, string, cp, coll, hashp)\
1553
.  ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\
1554
.   (info, abfd, name, flags, section, value, string, cp, coll, hashp))
1555
.
1556
.#define bfd_coff_link_output_has_begun(a,p) \
1557
.  ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a, p))
1558
.#define bfd_coff_final_link_postscript(a,p) \
1559
.  ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a, p))
1560
.
1561
.#define bfd_coff_have_print_pdata(a) \
1562
.  (coff_backend_info (a)->_bfd_coff_print_pdata)
1563
.#define bfd_coff_print_pdata(a,p) \
1564
.  ((coff_backend_info (a)->_bfd_coff_print_pdata) (a, p))
1565
.
1566
.{* Macro: Returns true if the bfd is a PE executable as opposed to a
1567
.   PE object file.  *}
1568
.#define bfd_pei_p(abfd) \
1569
.  (CONST_STRNEQ ((abfd)->xvec->name, "pei-"))
1570
*/
1571
 
1572
/* See whether the magic number matches.  */
1573
 
1574
static bfd_boolean
1575
coff_bad_format_hook (bfd * abfd ATTRIBUTE_UNUSED, void * filehdr)
1576
{
1577
  struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1578
 
1579
  if (BADMAG (*internal_f))
1580
    return FALSE;
1581
 
1582
  /* If the optional header is NULL or not the correct size then
1583
     quit; the only difference I can see between m88k dgux headers (MC88DMAGIC)
1584
     and Intel 960 readwrite headers (I960WRMAGIC) is that the
1585
     optional header is of a different size.
1586
 
1587
     But the mips keeps extra stuff in it's opthdr, so dont check
1588
     when doing that.  */
1589
 
1590
#if defined(M88) || defined(I960)
1591
  if (internal_f->f_opthdr != 0 && bfd_coff_aoutsz (abfd) != internal_f->f_opthdr)
1592
    return FALSE;
1593
#endif
1594
 
1595
  return TRUE;
1596
}
1597
 
1598
#ifdef TICOFF
1599
static bfd_boolean
1600
ticoff0_bad_format_hook (bfd *abfd ATTRIBUTE_UNUSED, void * filehdr)
1601
{
1602
  struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1603
 
1604
  if (COFF0_BADMAG (*internal_f))
1605
    return FALSE;
1606
 
1607
  return TRUE;
1608
}
1609
#endif
1610
 
1611
#ifdef TICOFF
1612
static bfd_boolean
1613
ticoff1_bad_format_hook (bfd *abfd ATTRIBUTE_UNUSED, void * filehdr)
1614
{
1615
  struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1616
 
1617
  if (COFF1_BADMAG (*internal_f))
1618
    return FALSE;
1619
 
1620
  return TRUE;
1621
}
1622
#endif
1623
 
1624
/* Check whether this section uses an alignment other than the
1625
   default.  */
1626
 
1627
static void
1628
coff_set_custom_section_alignment (bfd *abfd ATTRIBUTE_UNUSED,
1629
                                   asection *section,
1630
                                   const struct coff_section_alignment_entry *alignment_table,
1631
                                   const unsigned int table_size)
1632
{
1633
  const unsigned int default_alignment = COFF_DEFAULT_SECTION_ALIGNMENT_POWER;
1634
  unsigned int i;
1635
 
1636
  for (i = 0; i < table_size; ++i)
1637
    {
1638
      const char *secname = bfd_get_section_name (abfd, section);
1639
 
1640
      if (alignment_table[i].comparison_length == (unsigned int) -1
1641
          ? strcmp (alignment_table[i].name, secname) == 0
1642
          : strncmp (alignment_table[i].name, secname,
1643
                     alignment_table[i].comparison_length) == 0)
1644
        break;
1645
    }
1646
  if (i >= table_size)
1647
    return;
1648
 
1649
  if (alignment_table[i].default_alignment_min != COFF_ALIGNMENT_FIELD_EMPTY
1650
      && default_alignment < alignment_table[i].default_alignment_min)
1651
    return;
1652
 
1653
  if (alignment_table[i].default_alignment_max != COFF_ALIGNMENT_FIELD_EMPTY
1654
#if COFF_DEFAULT_SECTION_ALIGNMENT_POWER != 0
1655
      && default_alignment > alignment_table[i].default_alignment_max
1656
#endif
1657
      )
1658
    return;
1659
 
1660
  section->alignment_power = alignment_table[i].alignment_power;
1661
}
1662
 
1663
/* Custom section alignment records.  */
1664
 
1665
static const struct coff_section_alignment_entry
1666
coff_section_alignment_table[] =
1667
{
1668
#ifdef COFF_SECTION_ALIGNMENT_ENTRIES
1669
  COFF_SECTION_ALIGNMENT_ENTRIES,
1670
#endif
1671
  /* There must not be any gaps between .stabstr sections.  */
1672
  { COFF_SECTION_NAME_PARTIAL_MATCH (".stabstr"),
1673
    1, COFF_ALIGNMENT_FIELD_EMPTY, 0 },
1674
  /* The .stab section must be aligned to 2**2 at most, to avoid gaps.  */
1675
  { COFF_SECTION_NAME_PARTIAL_MATCH (".stab"),
1676
    3, COFF_ALIGNMENT_FIELD_EMPTY, 2 },
1677
  /* Similarly for the .ctors and .dtors sections.  */
1678
  { COFF_SECTION_NAME_EXACT_MATCH (".ctors"),
1679
    3, COFF_ALIGNMENT_FIELD_EMPTY, 2 },
1680
  { COFF_SECTION_NAME_EXACT_MATCH (".dtors"),
1681
    3, COFF_ALIGNMENT_FIELD_EMPTY, 2 }
1682
};
1683
 
1684
static const unsigned int coff_section_alignment_table_size =
1685
  sizeof coff_section_alignment_table / sizeof coff_section_alignment_table[0];
1686
 
1687
/* Initialize a section structure with information peculiar to this
1688
   particular implementation of COFF.  */
1689
 
1690
static bfd_boolean
1691
coff_new_section_hook (bfd * abfd, asection * section)
1692
{
1693
  combined_entry_type *native;
1694
  bfd_size_type amt;
1695
 
1696
  section->alignment_power = COFF_DEFAULT_SECTION_ALIGNMENT_POWER;
1697
 
1698
#ifdef RS6000COFF_C
1699
  if (bfd_xcoff_text_align_power (abfd) != 0
1700
      && strcmp (bfd_get_section_name (abfd, section), ".text") == 0)
1701
    section->alignment_power = bfd_xcoff_text_align_power (abfd);
1702
  if (bfd_xcoff_data_align_power (abfd) != 0
1703
      && strcmp (bfd_get_section_name (abfd, section), ".data") == 0)
1704
    section->alignment_power = bfd_xcoff_data_align_power (abfd);
1705
#endif
1706
 
1707
  /* Set up the section symbol.  */
1708
  if (!_bfd_generic_new_section_hook (abfd, section))
1709
    return FALSE;
1710
 
1711
  /* Allocate aux records for section symbols, to store size and
1712
     related info.
1713
 
1714
     @@ The 10 is a guess at a plausible maximum number of aux entries
1715
     (but shouldn't be a constant).  */
1716
  amt = sizeof (combined_entry_type) * 10;
1717
  native = (combined_entry_type *) bfd_zalloc (abfd, amt);
1718
  if (native == NULL)
1719
    return FALSE;
1720
 
1721
  /* We don't need to set up n_name, n_value, or n_scnum in the native
1722
     symbol information, since they'll be overridden by the BFD symbol
1723
     anyhow.  However, we do need to set the type and storage class,
1724
     in case this symbol winds up getting written out.  The value 0
1725
     for n_numaux is already correct.  */
1726
 
1727
  native->u.syment.n_type = T_NULL;
1728
  native->u.syment.n_sclass = C_STAT;
1729
 
1730
  coffsymbol (section->symbol)->native = native;
1731
 
1732
  coff_set_custom_section_alignment (abfd, section,
1733
                                     coff_section_alignment_table,
1734
                                     coff_section_alignment_table_size);
1735
 
1736
  return TRUE;
1737
}
1738
 
1739
#ifdef COFF_ALIGN_IN_SECTION_HEADER
1740
 
1741
/* Set the alignment of a BFD section.  */
1742
 
1743
static void
1744
coff_set_alignment_hook (bfd * abfd ATTRIBUTE_UNUSED,
1745
                         asection * section,
1746
                         void * scnhdr)
1747
{
1748
  struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
1749
  unsigned int i;
1750
 
1751
#ifdef I960
1752
  /* Extract ALIGN from 2**ALIGN stored in section header.  */
1753
  for (i = 0; i < 32; i++)
1754
    if ((1 << i) >= hdr->s_align)
1755
      break;
1756
#endif
1757
#ifdef TIC80COFF
1758
  /* TI tools puts the alignment power in bits 8-11.  */
1759
  i = (hdr->s_flags >> 8) & 0xF ;
1760
#endif
1761
#ifdef COFF_DECODE_ALIGNMENT
1762
  i = COFF_DECODE_ALIGNMENT(hdr->s_flags);
1763
#endif
1764
  section->alignment_power = i;
1765
 
1766
#ifdef coff_set_section_load_page
1767
  coff_set_section_load_page (section, hdr->s_page);
1768
#endif
1769
}
1770
 
1771
#else /* ! COFF_ALIGN_IN_SECTION_HEADER */
1772
#ifdef COFF_WITH_PE
1773
 
1774
static void
1775
coff_set_alignment_hook (bfd * abfd ATTRIBUTE_UNUSED,
1776
                         asection * section,
1777
                         void * scnhdr)
1778
{
1779
  struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
1780
  bfd_size_type amt;
1781
  unsigned int alignment_power_const
1782
    = hdr->s_flags & IMAGE_SCN_ALIGN_POWER_BIT_MASK;
1783
 
1784
  switch (alignment_power_const)
1785
    {
1786
    case IMAGE_SCN_ALIGN_8192BYTES:
1787
    case IMAGE_SCN_ALIGN_4096BYTES:
1788
    case IMAGE_SCN_ALIGN_2048BYTES:
1789
    case IMAGE_SCN_ALIGN_1024BYTES:
1790
    case IMAGE_SCN_ALIGN_512BYTES:
1791
    case IMAGE_SCN_ALIGN_256BYTES:
1792
    case IMAGE_SCN_ALIGN_128BYTES:
1793
    case IMAGE_SCN_ALIGN_64BYTES:
1794
    case IMAGE_SCN_ALIGN_32BYTES:
1795
    case IMAGE_SCN_ALIGN_16BYTES:
1796
    case IMAGE_SCN_ALIGN_8BYTES:
1797
    case IMAGE_SCN_ALIGN_4BYTES:
1798
    case IMAGE_SCN_ALIGN_2BYTES:
1799
    case IMAGE_SCN_ALIGN_1BYTES:
1800
      section->alignment_power
1801
        = IMAGE_SCN_ALIGN_POWER_NUM (alignment_power_const);
1802
      break;
1803
    default:
1804
      break;
1805
    }
1806
 
1807
  /* In a PE image file, the s_paddr field holds the virtual size of a
1808
     section, while the s_size field holds the raw size.  We also keep
1809
     the original section flag value, since not every bit can be
1810
     mapped onto a generic BFD section bit.  */
1811
  if (coff_section_data (abfd, section) == NULL)
1812
    {
1813
      amt = sizeof (struct coff_section_tdata);
1814
      section->used_by_bfd = bfd_zalloc (abfd, amt);
1815
      if (section->used_by_bfd == NULL)
1816
        /* FIXME: Return error.  */
1817
        abort ();
1818
    }
1819
 
1820
  if (pei_section_data (abfd, section) == NULL)
1821
    {
1822
      amt = sizeof (struct pei_section_tdata);
1823
      coff_section_data (abfd, section)->tdata = bfd_zalloc (abfd, amt);
1824
      if (coff_section_data (abfd, section)->tdata == NULL)
1825
        /* FIXME: Return error.  */
1826
        abort ();
1827
    }
1828
  pei_section_data (abfd, section)->virt_size = hdr->s_paddr;
1829
  pei_section_data (abfd, section)->pe_flags = hdr->s_flags;
1830
 
1831
  section->lma = hdr->s_vaddr;
1832
 
1833
  /* Check for extended relocs.  */
1834
  if (hdr->s_flags & IMAGE_SCN_LNK_NRELOC_OVFL)
1835
    {
1836
      struct external_reloc dst;
1837
      struct internal_reloc n;
1838
      file_ptr oldpos = bfd_tell (abfd);
1839
      bfd_size_type relsz = bfd_coff_relsz (abfd);
1840
 
1841
      bfd_seek (abfd, (file_ptr) hdr->s_relptr, 0);
1842
      if (bfd_bread (& dst, relsz, abfd) != relsz)
1843
        return;
1844
 
1845
      coff_swap_reloc_in (abfd, &dst, &n);
1846
      bfd_seek (abfd, oldpos, 0);
1847
      section->reloc_count = hdr->s_nreloc = n.r_vaddr - 1;
1848
      section->rel_filepos += relsz;
1849
    }
1850
  else if (hdr->s_nreloc == 0xffff)
1851
    (*_bfd_error_handler)
1852
      ("%s: warning: claims to have 0xffff relocs, without overflow",
1853
       bfd_get_filename (abfd));
1854
}
1855
#undef ALIGN_SET
1856
#undef ELIFALIGN_SET
1857
 
1858
#else /* ! COFF_WITH_PE */
1859
#ifdef RS6000COFF_C
1860
 
1861
/* We grossly abuse this function to handle XCOFF overflow headers.
1862
   When we see one, we correct the reloc and line number counts in the
1863
   real header, and remove the section we just created.  */
1864
 
1865
static void
1866
coff_set_alignment_hook (bfd *abfd, asection *section, void * scnhdr)
1867
{
1868
  struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
1869
  asection *real_sec;
1870
 
1871
  if ((hdr->s_flags & STYP_OVRFLO) == 0)
1872
    return;
1873
 
1874
  real_sec = coff_section_from_bfd_index (abfd, (int) hdr->s_nreloc);
1875
  if (real_sec == NULL)
1876
    return;
1877
 
1878
  real_sec->reloc_count = hdr->s_paddr;
1879
  real_sec->lineno_count = hdr->s_vaddr;
1880
 
1881
  if (!bfd_section_removed_from_list (abfd, section))
1882
    {
1883
      bfd_section_list_remove (abfd, section);
1884
      --abfd->section_count;
1885
    }
1886
}
1887
 
1888
#else /* ! RS6000COFF_C */
1889
 
1890
#define coff_set_alignment_hook \
1891
  ((void (*) (bfd *, asection *, void *)) bfd_void)
1892
 
1893
#endif /* ! RS6000COFF_C */
1894
#endif /* ! COFF_WITH_PE */
1895
#endif /* ! COFF_ALIGN_IN_SECTION_HEADER */
1896
 
1897
#ifndef coff_mkobject
1898
 
1899
static bfd_boolean
1900
coff_mkobject (bfd * abfd)
1901
{
1902
  coff_data_type *coff;
1903
  bfd_size_type amt = sizeof (coff_data_type);
1904
 
1905
  abfd->tdata.coff_obj_data = bfd_zalloc (abfd, amt);
1906
  if (abfd->tdata.coff_obj_data == NULL)
1907
    return FALSE;
1908
  coff = coff_data (abfd);
1909
  coff->symbols = NULL;
1910
  coff->conversion_table = NULL;
1911
  coff->raw_syments = NULL;
1912
  coff->relocbase = 0;
1913
  coff->local_toc_sym_map = 0;
1914
 
1915
/*  make_abs_section(abfd);*/
1916
 
1917
  return TRUE;
1918
}
1919
#endif
1920
 
1921
/* Create the COFF backend specific information.  */
1922
 
1923
#ifndef coff_mkobject_hook
1924
static void *
1925
coff_mkobject_hook (bfd * abfd,
1926
                    void * filehdr,
1927
                    void * aouthdr ATTRIBUTE_UNUSED)
1928
{
1929
  struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1930
  coff_data_type *coff;
1931
 
1932
  if (! coff_mkobject (abfd))
1933
    return NULL;
1934
 
1935
  coff = coff_data (abfd);
1936
 
1937
  coff->sym_filepos = internal_f->f_symptr;
1938
 
1939
  /* These members communicate important constants about the symbol
1940
     table to GDB's symbol-reading code.  These `constants'
1941
     unfortunately vary among coff implementations...  */
1942
  coff->local_n_btmask = N_BTMASK;
1943
  coff->local_n_btshft = N_BTSHFT;
1944
  coff->local_n_tmask = N_TMASK;
1945
  coff->local_n_tshift = N_TSHIFT;
1946
  coff->local_symesz = bfd_coff_symesz (abfd);
1947
  coff->local_auxesz = bfd_coff_auxesz (abfd);
1948
  coff->local_linesz = bfd_coff_linesz (abfd);
1949
 
1950
  coff->timestamp = internal_f->f_timdat;
1951
 
1952
  obj_raw_syment_count (abfd) =
1953
    obj_conv_table_size (abfd) =
1954
      internal_f->f_nsyms;
1955
 
1956
#ifdef RS6000COFF_C
1957
  if ((internal_f->f_flags & F_SHROBJ) != 0)
1958
    abfd->flags |= DYNAMIC;
1959
  if (aouthdr != NULL && internal_f->f_opthdr >= bfd_coff_aoutsz (abfd))
1960
    {
1961
      struct internal_aouthdr *internal_a =
1962
        (struct internal_aouthdr *) aouthdr;
1963
      struct xcoff_tdata *xcoff;
1964
 
1965
      xcoff = xcoff_data (abfd);
1966
# ifdef U803XTOCMAGIC
1967
      xcoff->xcoff64 = internal_f->f_magic == U803XTOCMAGIC;
1968
# else
1969
      xcoff->xcoff64 = 0;
1970
# endif
1971
      xcoff->full_aouthdr = TRUE;
1972
      xcoff->toc = internal_a->o_toc;
1973
      xcoff->sntoc = internal_a->o_sntoc;
1974
      xcoff->snentry = internal_a->o_snentry;
1975
      bfd_xcoff_text_align_power (abfd) = internal_a->o_algntext;
1976
      bfd_xcoff_data_align_power (abfd) = internal_a->o_algndata;
1977
      xcoff->modtype = internal_a->o_modtype;
1978
      xcoff->cputype = internal_a->o_cputype;
1979
      xcoff->maxdata = internal_a->o_maxdata;
1980
      xcoff->maxstack = internal_a->o_maxstack;
1981
    }
1982
#endif
1983
 
1984
#ifdef ARM
1985
  /* Set the flags field from the COFF header read in.  */
1986
  if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
1987
    coff->flags = 0;
1988
#endif
1989
 
1990
#ifdef COFF_WITH_PE
1991
  /* FIXME: I'm not sure this is ever executed, since peicode.h
1992
     defines coff_mkobject_hook.  */
1993
  if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
1994
    abfd->flags |= HAS_DEBUG;
1995
#endif
1996
 
1997
  if ((internal_f->f_flags & F_GO32STUB) != 0)
1998
    coff->go32stub = (char *) bfd_alloc (abfd, (bfd_size_type) GO32_STUBSIZE);
1999
  if (coff->go32stub != NULL)
2000
    memcpy (coff->go32stub, internal_f->go32stub, GO32_STUBSIZE);
2001
 
2002
  return coff;
2003
}
2004
#endif
2005
 
2006
/* Determine the machine architecture and type.  FIXME: This is target
2007
   dependent because the magic numbers are defined in the target
2008
   dependent header files.  But there is no particular need for this.
2009
   If the magic numbers were moved to a separate file, this function
2010
   would be target independent and would also be much more successful
2011
   at linking together COFF files for different architectures.  */
2012
 
2013
static bfd_boolean
2014
coff_set_arch_mach_hook (bfd *abfd, void * filehdr)
2015
{
2016
  unsigned long machine;
2017
  enum bfd_architecture arch;
2018
  struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
2019
 
2020
  /* Zero selects the default machine for an arch.  */
2021
  machine = 0;
2022
  switch (internal_f->f_magic)
2023
    {
2024
#ifdef OR32_MAGIC_BIG
2025
    case OR32_MAGIC_BIG:
2026
    case OR32_MAGIC_LITTLE:
2027
      arch = bfd_arch_or32;
2028
      break;
2029
#endif
2030
#ifdef PPCMAGIC
2031
    case PPCMAGIC:
2032
      arch = bfd_arch_powerpc;
2033
      break;
2034
#endif
2035
#ifdef I386MAGIC
2036
    case I386MAGIC:
2037
    case I386PTXMAGIC:
2038
    case I386AIXMAGIC:          /* Danbury PS/2 AIX C Compiler.  */
2039
    case LYNXCOFFMAGIC:         /* Shadows the m68k Lynx number below, sigh.  */
2040
      arch = bfd_arch_i386;
2041
      break;
2042
#endif
2043
#ifdef AMD64MAGIC
2044
    case AMD64MAGIC:
2045
      arch = bfd_arch_i386;
2046
      machine = bfd_mach_x86_64;
2047
      break;
2048
#endif
2049
#ifdef IA64MAGIC
2050
    case IA64MAGIC:
2051
      arch = bfd_arch_ia64;
2052
      break;
2053
#endif
2054
#ifdef ARMMAGIC
2055
    case ARMMAGIC:
2056
    case ARMPEMAGIC:
2057
    case THUMBPEMAGIC:
2058
      arch = bfd_arch_arm;
2059
      machine = bfd_arm_get_mach_from_notes (abfd, ARM_NOTE_SECTION);
2060
      if (machine == bfd_mach_arm_unknown)
2061
        {
2062
          switch (internal_f->f_flags & F_ARM_ARCHITECTURE_MASK)
2063
            {
2064
            case F_ARM_2:  machine = bfd_mach_arm_2;  break;
2065
            case F_ARM_2a: machine = bfd_mach_arm_2a; break;
2066
            case F_ARM_3:  machine = bfd_mach_arm_3;  break;
2067
            default:
2068
            case F_ARM_3M: machine = bfd_mach_arm_3M; break;
2069
            case F_ARM_4:  machine = bfd_mach_arm_4;  break;
2070
            case F_ARM_4T: machine = bfd_mach_arm_4T; break;
2071
              /* The COFF header does not have enough bits available
2072
                 to cover all the different ARM architectures.  So
2073
                 we interpret F_ARM_5, the highest flag value to mean
2074
                 "the highest ARM architecture known to BFD" which is
2075
                 currently the XScale.  */
2076
            case F_ARM_5:  machine = bfd_mach_arm_XScale;  break;
2077
            }
2078
        }
2079
      break;
2080
#endif
2081
#ifdef MC68MAGIC
2082
    case MC68MAGIC:
2083
    case M68MAGIC:
2084
#ifdef MC68KBCSMAGIC
2085
    case MC68KBCSMAGIC:
2086
#endif
2087
#ifdef APOLLOM68KMAGIC
2088
    case APOLLOM68KMAGIC:
2089
#endif
2090
#ifdef LYNXCOFFMAGIC
2091
    case LYNXCOFFMAGIC:
2092
#endif
2093
      arch = bfd_arch_m68k;
2094
      machine = bfd_mach_m68020;
2095
      break;
2096
#endif
2097
#ifdef MC88MAGIC
2098
    case MC88MAGIC:
2099
    case MC88DMAGIC:
2100
    case MC88OMAGIC:
2101
      arch = bfd_arch_m88k;
2102
      machine = 88100;
2103
      break;
2104
#endif
2105
#ifdef Z80MAGIC
2106
    case Z80MAGIC:
2107
      arch = bfd_arch_z80;
2108
      switch (internal_f->f_flags & F_MACHMASK)
2109
        {
2110
        case 0:
2111
        case bfd_mach_z80strict << 12:
2112
        case bfd_mach_z80 << 12:
2113
        case bfd_mach_z80full << 12:
2114
        case bfd_mach_r800 << 12:
2115
          machine = ((unsigned)internal_f->f_flags & F_MACHMASK) >> 12;
2116
          break;
2117
        default:
2118
          return FALSE;
2119
        }
2120
      break;
2121
#endif
2122
#ifdef Z8KMAGIC
2123
    case Z8KMAGIC:
2124
      arch = bfd_arch_z8k;
2125
      switch (internal_f->f_flags & F_MACHMASK)
2126
        {
2127
        case F_Z8001:
2128
          machine = bfd_mach_z8001;
2129
          break;
2130
        case F_Z8002:
2131
          machine = bfd_mach_z8002;
2132
          break;
2133
        default:
2134
          return FALSE;
2135
        }
2136
      break;
2137
#endif
2138
#ifdef I860
2139
    case I860MAGIC:
2140
      arch = bfd_arch_i860;
2141
      break;
2142
#endif
2143
#ifdef I960
2144
#ifdef I960ROMAGIC
2145
    case I960ROMAGIC:
2146
    case I960RWMAGIC:
2147
      arch = bfd_arch_i960;
2148
      switch (F_I960TYPE & internal_f->f_flags)
2149
        {
2150
        default:
2151
        case F_I960CORE:
2152
          machine = bfd_mach_i960_core;
2153
          break;
2154
        case F_I960KB:
2155
          machine = bfd_mach_i960_kb_sb;
2156
          break;
2157
        case F_I960MC:
2158
          machine = bfd_mach_i960_mc;
2159
          break;
2160
        case F_I960XA:
2161
          machine = bfd_mach_i960_xa;
2162
          break;
2163
        case F_I960CA:
2164
          machine = bfd_mach_i960_ca;
2165
          break;
2166
        case F_I960KA:
2167
          machine = bfd_mach_i960_ka_sa;
2168
          break;
2169
        case F_I960JX:
2170
          machine = bfd_mach_i960_jx;
2171
          break;
2172
        case F_I960HX:
2173
          machine = bfd_mach_i960_hx;
2174
          break;
2175
        }
2176
      break;
2177
#endif
2178
#endif
2179
 
2180
#ifdef RS6000COFF_C
2181
#ifdef XCOFF64
2182
    case U64_TOCMAGIC:
2183
    case U803XTOCMAGIC:
2184
#else
2185
    case U802ROMAGIC:
2186
    case U802WRMAGIC:
2187
    case U802TOCMAGIC:
2188
#endif
2189
      {
2190
        int cputype;
2191
 
2192
        if (xcoff_data (abfd)->cputype != -1)
2193
          cputype = xcoff_data (abfd)->cputype & 0xff;
2194
        else
2195
          {
2196
            /* We did not get a value from the a.out header.  If the
2197
               file has not been stripped, we may be able to get the
2198
               architecture information from the first symbol, if it
2199
               is a .file symbol.  */
2200
            if (obj_raw_syment_count (abfd) == 0)
2201
              cputype = 0;
2202
            else
2203
              {
2204
                bfd_byte *buf;
2205
                struct internal_syment sym;
2206
                bfd_size_type amt = bfd_coff_symesz (abfd);
2207
 
2208
                buf = bfd_malloc (amt);
2209
                if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
2210
                    || bfd_bread (buf, amt, abfd) != amt)
2211
                  {
2212
                    free (buf);
2213
                    return FALSE;
2214
                  }
2215
                bfd_coff_swap_sym_in (abfd, buf, & sym);
2216
                if (sym.n_sclass == C_FILE)
2217
                  cputype = sym.n_type & 0xff;
2218
                else
2219
                  cputype = 0;
2220
                free (buf);
2221
              }
2222
          }
2223
 
2224
        /* FIXME: We don't handle all cases here.  */
2225
        switch (cputype)
2226
          {
2227
          default:
2228
          case 0:
2229
            arch = bfd_xcoff_architecture (abfd);
2230
            machine = bfd_xcoff_machine (abfd);
2231
            break;
2232
 
2233
          case 1:
2234
            arch = bfd_arch_powerpc;
2235
            machine = bfd_mach_ppc_601;
2236
            break;
2237
          case 2: /* 64 bit PowerPC */
2238
            arch = bfd_arch_powerpc;
2239
            machine = bfd_mach_ppc_620;
2240
            break;
2241
          case 3:
2242
            arch = bfd_arch_powerpc;
2243
            machine = bfd_mach_ppc;
2244
            break;
2245
          case 4:
2246
            arch = bfd_arch_rs6000;
2247
            machine = bfd_mach_rs6k;
2248
            break;
2249
          }
2250
      }
2251
      break;
2252
#endif
2253
 
2254
#ifdef WE32KMAGIC
2255
    case WE32KMAGIC:
2256
      arch = bfd_arch_we32k;
2257
      break;
2258
#endif
2259
 
2260
#ifdef H8300MAGIC
2261
    case H8300MAGIC:
2262
      arch = bfd_arch_h8300;
2263
      machine = bfd_mach_h8300;
2264
      /* !! FIXME this probably isn't the right place for this.  */
2265
      abfd->flags |= BFD_IS_RELAXABLE;
2266
      break;
2267
#endif
2268
 
2269
#ifdef H8300HMAGIC
2270
    case H8300HMAGIC:
2271
      arch = bfd_arch_h8300;
2272
      machine = bfd_mach_h8300h;
2273
      /* !! FIXME this probably isn't the right place for this.  */
2274
      abfd->flags |= BFD_IS_RELAXABLE;
2275
      break;
2276
#endif
2277
 
2278
#ifdef H8300SMAGIC
2279
    case H8300SMAGIC:
2280
      arch = bfd_arch_h8300;
2281
      machine = bfd_mach_h8300s;
2282
      /* !! FIXME this probably isn't the right place for this.  */
2283
      abfd->flags |= BFD_IS_RELAXABLE;
2284
      break;
2285
#endif
2286
 
2287
#ifdef H8300HNMAGIC
2288
    case H8300HNMAGIC:
2289
      arch = bfd_arch_h8300;
2290
      machine = bfd_mach_h8300hn;
2291
      /* !! FIXME this probably isn't the right place for this.  */
2292
      abfd->flags |= BFD_IS_RELAXABLE;
2293
      break;
2294
#endif
2295
 
2296
#ifdef H8300SNMAGIC
2297
    case H8300SNMAGIC:
2298
      arch = bfd_arch_h8300;
2299
      machine = bfd_mach_h8300sn;
2300
      /* !! FIXME this probably isn't the right place for this.  */
2301
      abfd->flags |= BFD_IS_RELAXABLE;
2302
      break;
2303
#endif
2304
 
2305
#ifdef SH_ARCH_MAGIC_BIG
2306
    case SH_ARCH_MAGIC_BIG:
2307
    case SH_ARCH_MAGIC_LITTLE:
2308
#ifdef COFF_WITH_PE
2309
    case SH_ARCH_MAGIC_WINCE:
2310
#endif
2311
      arch = bfd_arch_sh;
2312
      break;
2313
#endif
2314
 
2315
#ifdef MIPS_ARCH_MAGIC_WINCE
2316
    case MIPS_ARCH_MAGIC_WINCE:
2317
      arch = bfd_arch_mips;
2318
      break;
2319
#endif
2320
 
2321
#ifdef H8500MAGIC
2322
    case H8500MAGIC:
2323
      arch = bfd_arch_h8500;
2324
      break;
2325
#endif
2326
 
2327
#ifdef SPARCMAGIC
2328
    case SPARCMAGIC:
2329
#ifdef LYNXCOFFMAGIC
2330
    case LYNXCOFFMAGIC:
2331
#endif
2332
      arch = bfd_arch_sparc;
2333
      break;
2334
#endif
2335
 
2336
#ifdef TIC30MAGIC
2337
    case TIC30MAGIC:
2338
      arch = bfd_arch_tic30;
2339
      break;
2340
#endif
2341
 
2342
#ifdef TICOFF0MAGIC
2343
#ifdef TICOFF_TARGET_ARCH
2344
      /* This TI COFF section should be used by all new TI COFF v0 targets.  */
2345
    case TICOFF0MAGIC:
2346
      arch = TICOFF_TARGET_ARCH;
2347
      machine = TICOFF_TARGET_MACHINE_GET (internal_f->f_flags);
2348
      break;
2349
#endif
2350
#endif
2351
 
2352
#ifdef TICOFF1MAGIC
2353
      /* This TI COFF section should be used by all new TI COFF v1/2 targets.  */
2354
      /* TI COFF1 and COFF2 use the target_id field to specify which arch.  */
2355
    case TICOFF1MAGIC:
2356
    case TICOFF2MAGIC:
2357
      switch (internal_f->f_target_id)
2358
        {
2359
#ifdef TI_TARGET_ID
2360
        case TI_TARGET_ID:
2361
          arch = TICOFF_TARGET_ARCH;
2362
          machine = TICOFF_TARGET_MACHINE_GET (internal_f->f_flags);
2363
          break;
2364
#endif
2365
        default:
2366
          arch = bfd_arch_obscure;
2367
          (*_bfd_error_handler)
2368
            (_("Unrecognized TI COFF target id '0x%x'"),
2369
             internal_f->f_target_id);
2370
          break;
2371
        }
2372
      break;
2373
#endif
2374
 
2375
#ifdef TIC80_ARCH_MAGIC
2376
    case TIC80_ARCH_MAGIC:
2377
      arch = bfd_arch_tic80;
2378
      break;
2379
#endif
2380
 
2381
#ifdef MCOREMAGIC
2382
    case MCOREMAGIC:
2383
      arch = bfd_arch_mcore;
2384
      break;
2385
#endif
2386
 
2387
#ifdef W65MAGIC
2388
    case W65MAGIC:
2389
      arch = bfd_arch_w65;
2390
      break;
2391
#endif
2392
 
2393
    default:                    /* Unreadable input file type.  */
2394
      arch = bfd_arch_obscure;
2395
      break;
2396
    }
2397
 
2398
  bfd_default_set_arch_mach (abfd, arch, machine);
2399
  return TRUE;
2400
}
2401
 
2402
#ifdef SYMNAME_IN_DEBUG
2403
 
2404
static bfd_boolean
2405
symname_in_debug_hook (bfd * abfd ATTRIBUTE_UNUSED, struct internal_syment *sym)
2406
{
2407
  return SYMNAME_IN_DEBUG (sym) != 0;
2408
}
2409
 
2410
#else
2411
 
2412
#define symname_in_debug_hook \
2413
  (bfd_boolean (*) (bfd *, struct internal_syment *)) bfd_false
2414
 
2415
#endif
2416
 
2417
#ifdef RS6000COFF_C
2418
 
2419
#ifdef XCOFF64
2420
#define FORCE_SYMNAMES_IN_STRINGS
2421
#endif
2422
 
2423
/* Handle the csect auxent of a C_EXT, C_AIX_WEAKEXT or C_HIDEXT symbol.  */
2424
 
2425
static bfd_boolean
2426
coff_pointerize_aux_hook (bfd *abfd ATTRIBUTE_UNUSED,
2427
                          combined_entry_type *table_base,
2428
                          combined_entry_type *symbol,
2429
                          unsigned int indaux,
2430
                          combined_entry_type *aux)
2431
{
2432
  int n_sclass = symbol->u.syment.n_sclass;
2433
 
2434
  if (CSECT_SYM_P (n_sclass)
2435
      && indaux + 1 == symbol->u.syment.n_numaux)
2436
    {
2437
      if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) == XTY_LD)
2438
        {
2439
          aux->u.auxent.x_csect.x_scnlen.p =
2440
            table_base + aux->u.auxent.x_csect.x_scnlen.l;
2441
          aux->fix_scnlen = 1;
2442
        }
2443
 
2444
      /* Return TRUE to indicate that the caller should not do any
2445
         further work on this auxent.  */
2446
      return TRUE;
2447
    }
2448
 
2449
  /* Return FALSE to indicate that this auxent should be handled by
2450
     the caller.  */
2451
  return FALSE;
2452
}
2453
 
2454
#else
2455
#ifdef I960
2456
 
2457
/* We don't want to pointerize bal entries.  */
2458
 
2459
static bfd_boolean
2460
coff_pointerize_aux_hook (bfd *abfd ATTRIBUTE_UNUSED,
2461
                          combined_entry_type *table_base ATTRIBUTE_UNUSED,
2462
                          combined_entry_type *symbol,
2463
                          unsigned int indaux,
2464
                          combined_entry_type *aux ATTRIBUTE_UNUSED)
2465
{
2466
  /* Return TRUE if we don't want to pointerize this aux entry, which
2467
     is the case for the lastfirst aux entry for a C_LEAFPROC symbol.  */
2468
  return (indaux == 1
2469
          && (symbol->u.syment.n_sclass == C_LEAFPROC
2470
              || symbol->u.syment.n_sclass == C_LEAFSTAT
2471
              || symbol->u.syment.n_sclass == C_LEAFEXT));
2472
}
2473
 
2474
#else /* ! I960 */
2475
 
2476
#define coff_pointerize_aux_hook 0
2477
 
2478
#endif /* ! I960 */
2479
#endif /* ! RS6000COFF_C */
2480
 
2481
/* Print an aux entry.  This returns TRUE if it has printed it.  */
2482
 
2483
static bfd_boolean
2484
coff_print_aux (bfd *abfd ATTRIBUTE_UNUSED,
2485
                FILE *file ATTRIBUTE_UNUSED,
2486
                combined_entry_type *table_base ATTRIBUTE_UNUSED,
2487
                combined_entry_type *symbol ATTRIBUTE_UNUSED,
2488
                combined_entry_type *aux ATTRIBUTE_UNUSED,
2489
                unsigned int indaux ATTRIBUTE_UNUSED)
2490
{
2491
#ifdef RS6000COFF_C
2492
  if (CSECT_SYM_P (symbol->u.syment.n_sclass)
2493
      && indaux + 1 == symbol->u.syment.n_numaux)
2494
    {
2495
      /* This is a csect entry.  */
2496
      fprintf (file, "AUX ");
2497
      if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) != XTY_LD)
2498
        {
2499
          BFD_ASSERT (! aux->fix_scnlen);
2500
#ifdef XCOFF64
2501
          fprintf (file, "val %5lld",
2502
                   (long long) aux->u.auxent.x_csect.x_scnlen.l);
2503
#else
2504
          fprintf (file, "val %5ld", (long) aux->u.auxent.x_csect.x_scnlen.l);
2505
#endif
2506
        }
2507
      else
2508
        {
2509
          fprintf (file, "indx ");
2510
          if (! aux->fix_scnlen)
2511
#ifdef XCOFF64
2512
            fprintf (file, "%4lld",
2513
                     (long long) aux->u.auxent.x_csect.x_scnlen.l);
2514
#else
2515
            fprintf (file, "%4ld", (long) aux->u.auxent.x_csect.x_scnlen.l);
2516
#endif
2517
          else
2518
            fprintf (file, "%4ld",
2519
                     (long) (aux->u.auxent.x_csect.x_scnlen.p - table_base));
2520
        }
2521
      fprintf (file,
2522
               " prmhsh %ld snhsh %u typ %d algn %d clss %u stb %ld snstb %u",
2523
               aux->u.auxent.x_csect.x_parmhash,
2524
               (unsigned int) aux->u.auxent.x_csect.x_snhash,
2525
               SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp),
2526
               SMTYP_ALIGN (aux->u.auxent.x_csect.x_smtyp),
2527
               (unsigned int) aux->u.auxent.x_csect.x_smclas,
2528
               aux->u.auxent.x_csect.x_stab,
2529
               (unsigned int) aux->u.auxent.x_csect.x_snstab);
2530
      return TRUE;
2531
    }
2532
#endif
2533
 
2534
  /* Return FALSE to indicate that no special action was taken.  */
2535
  return FALSE;
2536
}
2537
 
2538
/*
2539
SUBSUBSECTION
2540
        Writing relocations
2541
 
2542
        To write relocations, the back end steps though the
2543
        canonical relocation table and create an
2544
        @code{internal_reloc}. The symbol index to use is removed from
2545
        the @code{offset} field in the symbol table supplied.  The
2546
        address comes directly from the sum of the section base
2547
        address and the relocation offset; the type is dug directly
2548
        from the howto field.  Then the @code{internal_reloc} is
2549
        swapped into the shape of an @code{external_reloc} and written
2550
        out to disk.
2551
 
2552
*/
2553
 
2554
#ifdef TARG_AUX
2555
 
2556
 
2557
/* AUX's ld wants relocations to be sorted.  */
2558
static int
2559
compare_arelent_ptr (const void * x, const void * y)
2560
{
2561
  const arelent **a = (const arelent **) x;
2562
  const arelent **b = (const arelent **) y;
2563
  bfd_size_type aadr = (*a)->address;
2564
  bfd_size_type badr = (*b)->address;
2565
 
2566
  return (aadr < badr ? -1 : badr < aadr ? 1 : 0);
2567
}
2568
 
2569
#endif /* TARG_AUX */
2570
 
2571
static bfd_boolean
2572
coff_write_relocs (bfd * abfd, int first_undef)
2573
{
2574
  asection *s;
2575
 
2576
  for (s = abfd->sections; s != NULL; s = s->next)
2577
    {
2578
      unsigned int i;
2579
      struct external_reloc dst;
2580
      arelent **p;
2581
 
2582
#ifndef TARG_AUX
2583
      p = s->orelocation;
2584
#else
2585
      {
2586
        /* Sort relocations before we write them out.  */
2587
        bfd_size_type amt;
2588
 
2589
        amt = s->reloc_count;
2590
        amt *= sizeof (arelent *);
2591
        p = bfd_malloc (amt);
2592
        if (p == NULL && s->reloc_count > 0)
2593
          return FALSE;
2594
        memcpy (p, s->orelocation, (size_t) amt);
2595
        qsort (p, s->reloc_count, sizeof (arelent *), compare_arelent_ptr);
2596
      }
2597
#endif
2598
 
2599
      if (bfd_seek (abfd, s->rel_filepos, SEEK_SET) != 0)
2600
        return FALSE;
2601
 
2602
#ifdef COFF_WITH_PE
2603
      if (obj_pe (abfd) && s->reloc_count >= 0xffff)
2604
        {
2605
          /* Encode real count here as first reloc.  */
2606
          struct internal_reloc n;
2607
 
2608
          memset (& n, 0, sizeof (n));
2609
          /* Add one to count *this* reloc (grr).  */
2610
          n.r_vaddr = s->reloc_count + 1;
2611
          coff_swap_reloc_out (abfd, &n, &dst);
2612
          if (bfd_bwrite (& dst, (bfd_size_type) bfd_coff_relsz (abfd),
2613
                          abfd) != bfd_coff_relsz (abfd))
2614
            return FALSE;
2615
        }
2616
#endif
2617
 
2618
      for (i = 0; i < s->reloc_count; i++)
2619
        {
2620
          struct internal_reloc n;
2621
          arelent *q = p[i];
2622
 
2623
          memset (& n, 0, sizeof (n));
2624
 
2625
          /* Now we've renumbered the symbols we know where the
2626
             undefined symbols live in the table.  Check the reloc
2627
             entries for symbols who's output bfd isn't the right one.
2628
             This is because the symbol was undefined (which means
2629
             that all the pointers are never made to point to the same
2630
             place). This is a bad thing,'cause the symbols attached
2631
             to the output bfd are indexed, so that the relocation
2632
             entries know which symbol index they point to.  So we
2633
             have to look up the output symbol here.  */
2634
 
2635
          if (q->sym_ptr_ptr[0] != NULL && q->sym_ptr_ptr[0]->the_bfd != abfd)
2636
            {
2637
              int j;
2638
              const char *sname = q->sym_ptr_ptr[0]->name;
2639
              asymbol **outsyms = abfd->outsymbols;
2640
 
2641
              for (j = first_undef; outsyms[j]; j++)
2642
                {
2643
                  const char *intable = outsyms[j]->name;
2644
 
2645
                  if (strcmp (intable, sname) == 0)
2646
                    {
2647
                      /* Got a hit, so repoint the reloc.  */
2648
                      q->sym_ptr_ptr = outsyms + j;
2649
                      break;
2650
                    }
2651
                }
2652
            }
2653
 
2654
          n.r_vaddr = q->address + s->vma;
2655
 
2656
#ifdef R_IHCONST
2657
          /* The 29k const/consth reloc pair is a real kludge.  The consth
2658
             part doesn't have a symbol; it has an offset.  So rebuilt
2659
             that here.  */
2660
          if (q->howto->type == R_IHCONST)
2661
            n.r_symndx = q->addend;
2662
          else
2663
#endif
2664
            if (q->sym_ptr_ptr && q->sym_ptr_ptr[0] != NULL)
2665
              {
2666
#ifdef SECTION_RELATIVE_ABSOLUTE_SYMBOL_P
2667
                if (SECTION_RELATIVE_ABSOLUTE_SYMBOL_P (q, s))
2668
#else
2669
                if ((*q->sym_ptr_ptr)->section == bfd_abs_section_ptr
2670
                    && ((*q->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0)
2671
#endif
2672
                  /* This is a relocation relative to the absolute symbol.  */
2673
                  n.r_symndx = -1;
2674
                else
2675
                  {
2676
                    n.r_symndx = get_index ((*(q->sym_ptr_ptr)));
2677
                    /* Check to see if the symbol reloc points to a symbol
2678
                       we don't have in our symbol table.  */
2679
                    if (n.r_symndx > obj_conv_table_size (abfd))
2680
                      {
2681
                        bfd_set_error (bfd_error_bad_value);
2682
                        _bfd_error_handler (_("%B: reloc against a non-existant symbol index: %ld"),
2683
                                            abfd, n.r_symndx);
2684
                        return FALSE;
2685
                      }
2686
                  }
2687
              }
2688
 
2689
#ifdef SWAP_OUT_RELOC_OFFSET
2690
          n.r_offset = q->addend;
2691
#endif
2692
 
2693
#ifdef SELECT_RELOC
2694
          /* Work out reloc type from what is required.  */
2695
          SELECT_RELOC (n, q->howto);
2696
#else
2697
          n.r_type = q->howto->type;
2698
#endif
2699
          coff_swap_reloc_out (abfd, &n, &dst);
2700
 
2701
          if (bfd_bwrite (& dst, (bfd_size_type) bfd_coff_relsz (abfd),
2702
                         abfd) != bfd_coff_relsz (abfd))
2703
            return FALSE;
2704
        }
2705
 
2706
#ifdef TARG_AUX
2707
      if (p != NULL)
2708
        free (p);
2709
#endif
2710
    }
2711
 
2712
  return TRUE;
2713
}
2714
 
2715
/* Set flags and magic number of a coff file from architecture and machine
2716
   type.  Result is TRUE if we can represent the arch&type, FALSE if not.  */
2717
 
2718
static bfd_boolean
2719
coff_set_flags (bfd * abfd,
2720
                unsigned int *magicp ATTRIBUTE_UNUSED,
2721
                unsigned short *flagsp ATTRIBUTE_UNUSED)
2722
{
2723
  switch (bfd_get_arch (abfd))
2724
    {
2725
#ifdef Z80MAGIC
2726
    case bfd_arch_z80:
2727
      *magicp = Z80MAGIC;
2728
      switch (bfd_get_mach (abfd))
2729
        {
2730
        case 0:
2731
        case bfd_mach_z80strict:
2732
        case bfd_mach_z80:
2733
        case bfd_mach_z80full:
2734
        case bfd_mach_r800:
2735
          *flagsp = bfd_get_mach (abfd) << 12;
2736
          break;
2737
        default:
2738
          return FALSE;
2739
        }
2740
      return TRUE;
2741
#endif
2742
 
2743
#ifdef Z8KMAGIC
2744
    case bfd_arch_z8k:
2745
      *magicp = Z8KMAGIC;
2746
 
2747
      switch (bfd_get_mach (abfd))
2748
        {
2749
        case bfd_mach_z8001: *flagsp = F_Z8001; break;
2750
        case bfd_mach_z8002: *flagsp = F_Z8002; break;
2751
        default:             return FALSE;
2752
        }
2753
      return TRUE;
2754
#endif
2755
 
2756
#ifdef I960ROMAGIC
2757
    case bfd_arch_i960:
2758
 
2759
      {
2760
        unsigned flags;
2761
 
2762
        *magicp = I960ROMAGIC;
2763
 
2764
        switch (bfd_get_mach (abfd))
2765
          {
2766
          case bfd_mach_i960_core:  flags = F_I960CORE; break;
2767
          case bfd_mach_i960_kb_sb: flags = F_I960KB;   break;
2768
          case bfd_mach_i960_mc:    flags = F_I960MC;   break;
2769
          case bfd_mach_i960_xa:    flags = F_I960XA;   break;
2770
          case bfd_mach_i960_ca:    flags = F_I960CA;   break;
2771
          case bfd_mach_i960_ka_sa: flags = F_I960KA;   break;
2772
          case bfd_mach_i960_jx:    flags = F_I960JX;   break;
2773
          case bfd_mach_i960_hx:    flags = F_I960HX;   break;
2774
          default:                  return FALSE;
2775
          }
2776
        *flagsp = flags;
2777
        return TRUE;
2778
      }
2779
      break;
2780
#endif
2781
 
2782
#ifdef TIC30MAGIC
2783
    case bfd_arch_tic30:
2784
      *magicp = TIC30MAGIC;
2785
      return TRUE;
2786
#endif
2787
 
2788
#ifdef TICOFF_DEFAULT_MAGIC
2789
    case TICOFF_TARGET_ARCH:
2790
      /* If there's no indication of which version we want, use the default.  */
2791
      if (!abfd->xvec )
2792
        *magicp = TICOFF_DEFAULT_MAGIC;
2793
      else
2794
        {
2795
          /* We may want to output in a different COFF version.  */
2796
          switch (abfd->xvec->name[4])
2797
            {
2798
            case '0':
2799
              *magicp = TICOFF0MAGIC;
2800
              break;
2801
            case '1':
2802
              *magicp = TICOFF1MAGIC;
2803
              break;
2804
            case '2':
2805
              *magicp = TICOFF2MAGIC;
2806
              break;
2807
            default:
2808
              return FALSE;
2809
            }
2810
        }
2811
      TICOFF_TARGET_MACHINE_SET (flagsp, bfd_get_mach (abfd));
2812
      return TRUE;
2813
#endif
2814
 
2815
#ifdef TIC80_ARCH_MAGIC
2816
    case bfd_arch_tic80:
2817
      *magicp = TIC80_ARCH_MAGIC;
2818
      return TRUE;
2819
#endif
2820
 
2821
#ifdef ARMMAGIC
2822
    case bfd_arch_arm:
2823
#ifdef ARM_WINCE
2824
      * magicp = ARMPEMAGIC;
2825
#else
2826
      * magicp = ARMMAGIC;
2827
#endif
2828
      * flagsp = 0;
2829
      if (APCS_SET (abfd))
2830
        {
2831
          if (APCS_26_FLAG (abfd))
2832
            * flagsp |= F_APCS26;
2833
 
2834
          if (APCS_FLOAT_FLAG (abfd))
2835
            * flagsp |= F_APCS_FLOAT;
2836
 
2837
          if (PIC_FLAG (abfd))
2838
            * flagsp |= F_PIC;
2839
        }
2840
      if (INTERWORK_SET (abfd) && INTERWORK_FLAG (abfd))
2841
        * flagsp |= F_INTERWORK;
2842
      switch (bfd_get_mach (abfd))
2843
        {
2844
        case bfd_mach_arm_2:  * flagsp |= F_ARM_2;  break;
2845
        case bfd_mach_arm_2a: * flagsp |= F_ARM_2a; break;
2846
        case bfd_mach_arm_3:  * flagsp |= F_ARM_3;  break;
2847
        case bfd_mach_arm_3M: * flagsp |= F_ARM_3M; break;
2848
        case bfd_mach_arm_4:  * flagsp |= F_ARM_4;  break;
2849
        case bfd_mach_arm_4T: * flagsp |= F_ARM_4T; break;
2850
        case bfd_mach_arm_5:  * flagsp |= F_ARM_5;  break;
2851
          /* FIXME: we do not have F_ARM vaues greater than F_ARM_5.
2852
             See also the comment in coff_set_arch_mach_hook().  */
2853
        case bfd_mach_arm_5T: * flagsp |= F_ARM_5;  break;
2854
        case bfd_mach_arm_5TE: * flagsp |= F_ARM_5; break;
2855
        case bfd_mach_arm_XScale: * flagsp |= F_ARM_5; break;
2856
        }
2857
      return TRUE;
2858
#endif
2859
 
2860
#ifdef PPCMAGIC
2861
    case bfd_arch_powerpc:
2862
      *magicp = PPCMAGIC;
2863
      return TRUE;
2864
#endif
2865
 
2866
#if defined(I386MAGIC) || defined(AMD64MAGIC)
2867
    case bfd_arch_i386:
2868
#if defined(I386MAGIC)
2869
      *magicp = I386MAGIC;
2870
#endif
2871
#if defined LYNXOS
2872
      /* Just overwrite the usual value if we're doing Lynx.  */
2873
      *magicp = LYNXCOFFMAGIC;
2874
#endif
2875
#if defined AMD64MAGIC
2876
      *magicp = AMD64MAGIC;
2877
#endif
2878
      return TRUE;
2879
#endif
2880
 
2881
#ifdef I860MAGIC
2882
    case bfd_arch_i860:
2883
      *magicp = I860MAGIC;
2884
      return TRUE;
2885
#endif
2886
 
2887
#ifdef IA64MAGIC
2888
    case bfd_arch_ia64:
2889
      *magicp = IA64MAGIC;
2890
      return TRUE;
2891
#endif
2892
 
2893
#ifdef MC68MAGIC
2894
    case bfd_arch_m68k:
2895
#ifdef APOLLOM68KMAGIC
2896
      *magicp = APOLLO_COFF_VERSION_NUMBER;
2897
#else
2898
      /* NAMES_HAVE_UNDERSCORE may be defined by coff-u68k.c.  */
2899
#ifdef NAMES_HAVE_UNDERSCORE
2900
      *magicp = MC68KBCSMAGIC;
2901
#else
2902
      *magicp = MC68MAGIC;
2903
#endif
2904
#endif
2905
#ifdef LYNXOS
2906
      /* Just overwrite the usual value if we're doing Lynx.  */
2907
      *magicp = LYNXCOFFMAGIC;
2908
#endif
2909
      return TRUE;
2910
#endif
2911
 
2912
#ifdef MC88MAGIC
2913
    case bfd_arch_m88k:
2914
      *magicp = MC88OMAGIC;
2915
      return TRUE;
2916
#endif
2917
 
2918
#ifdef H8300MAGIC
2919
    case bfd_arch_h8300:
2920
      switch (bfd_get_mach (abfd))
2921
        {
2922
        case bfd_mach_h8300:   *magicp = H8300MAGIC;   return TRUE;
2923
        case bfd_mach_h8300h:  *magicp = H8300HMAGIC;  return TRUE;
2924
        case bfd_mach_h8300s:  *magicp = H8300SMAGIC;  return TRUE;
2925
        case bfd_mach_h8300hn: *magicp = H8300HNMAGIC; return TRUE;
2926
        case bfd_mach_h8300sn: *magicp = H8300SNMAGIC; return TRUE;
2927
        default: break;
2928
        }
2929
      break;
2930
#endif
2931
 
2932
#ifdef SH_ARCH_MAGIC_BIG
2933
    case bfd_arch_sh:
2934
#ifdef COFF_IMAGE_WITH_PE
2935
      *magicp = SH_ARCH_MAGIC_WINCE;
2936
#else
2937
      if (bfd_big_endian (abfd))
2938
        *magicp = SH_ARCH_MAGIC_BIG;
2939
      else
2940
        *magicp = SH_ARCH_MAGIC_LITTLE;
2941
#endif
2942
      return TRUE;
2943
#endif
2944
 
2945
#ifdef MIPS_ARCH_MAGIC_WINCE
2946
    case bfd_arch_mips:
2947
      *magicp = MIPS_ARCH_MAGIC_WINCE;
2948
      return TRUE;
2949
#endif
2950
 
2951
#ifdef SPARCMAGIC
2952
    case bfd_arch_sparc:
2953
      *magicp = SPARCMAGIC;
2954
#ifdef LYNXOS
2955
      /* Just overwrite the usual value if we're doing Lynx.  */
2956
      *magicp = LYNXCOFFMAGIC;
2957
#endif
2958
      return TRUE;
2959
#endif
2960
 
2961
#ifdef H8500MAGIC
2962
    case bfd_arch_h8500:
2963
      *magicp = H8500MAGIC;
2964
      return TRUE;
2965
      break;
2966
#endif
2967
 
2968
#ifdef WE32KMAGIC
2969
    case bfd_arch_we32k:
2970
      *magicp = WE32KMAGIC;
2971
      return TRUE;
2972
#endif
2973
 
2974
#ifdef RS6000COFF_C
2975
    case bfd_arch_rs6000:
2976
#ifndef PPCMAGIC
2977
    case bfd_arch_powerpc:
2978
#endif
2979
      BFD_ASSERT (bfd_get_flavour (abfd) == bfd_target_xcoff_flavour);
2980
      *magicp = bfd_xcoff_magic_number (abfd);
2981
      return TRUE;
2982
#endif
2983
 
2984
#ifdef MCOREMAGIC
2985
    case bfd_arch_mcore:
2986
      * magicp = MCOREMAGIC;
2987
      return TRUE;
2988
#endif
2989
 
2990
#ifdef W65MAGIC
2991
    case bfd_arch_w65:
2992
      *magicp = W65MAGIC;
2993
      return TRUE;
2994
#endif
2995
 
2996
#ifdef OR32_MAGIC_BIG
2997
    case bfd_arch_or32:
2998
      if (bfd_big_endian (abfd))
2999
        * magicp = OR32_MAGIC_BIG;
3000
      else
3001
        * magicp = OR32_MAGIC_LITTLE;
3002
      return TRUE;
3003
#endif
3004
 
3005
    default:                    /* Unknown architecture.  */
3006
      /* Fall through to "return FALSE" below, to avoid
3007
         "statement never reached" errors on the one below.  */
3008
      break;
3009
    }
3010
 
3011
  return FALSE;
3012
}
3013
 
3014
static bfd_boolean
3015
coff_set_arch_mach (bfd * abfd,
3016
                    enum bfd_architecture arch,
3017
                    unsigned long machine)
3018
{
3019
  unsigned dummy1;
3020
  unsigned short dummy2;
3021
 
3022
  if (! bfd_default_set_arch_mach (abfd, arch, machine))
3023
    return FALSE;
3024
 
3025
  if (arch != bfd_arch_unknown
3026
      && ! coff_set_flags (abfd, &dummy1, &dummy2))
3027
    return FALSE;               /* We can't represent this type.  */
3028
 
3029
  return TRUE;                  /* We're easy...  */
3030
}
3031
 
3032
#ifdef COFF_IMAGE_WITH_PE
3033
 
3034
/* This is used to sort sections by VMA, as required by PE image
3035
   files.  */
3036
 
3037
static int
3038
sort_by_secaddr (const void * arg1, const void * arg2)
3039
{
3040
  const asection *a = *(const asection **) arg1;
3041
  const asection *b = *(const asection **) arg2;
3042
 
3043
  if (a->vma < b->vma)
3044
    return -1;
3045
  else if (a->vma > b->vma)
3046
    return 1;
3047
 
3048
  return 0;
3049
}
3050
 
3051
#endif /* COFF_IMAGE_WITH_PE */
3052
 
3053
/* Calculate the file position for each section.  */
3054
 
3055
#ifndef I960
3056
#define ALIGN_SECTIONS_IN_FILE
3057
#endif
3058
#if defined(TIC80COFF) || defined(TICOFF)
3059
#undef ALIGN_SECTIONS_IN_FILE
3060
#endif
3061
 
3062
static bfd_boolean
3063
coff_compute_section_file_positions (bfd * abfd)
3064
{
3065
  asection *current;
3066
  file_ptr sofar = bfd_coff_filhsz (abfd);
3067
  bfd_boolean align_adjust;
3068
  int target_index;
3069
#ifdef ALIGN_SECTIONS_IN_FILE
3070
  asection *previous = NULL;
3071
  file_ptr old_sofar;
3072
#endif
3073
 
3074
#ifdef COFF_IMAGE_WITH_PE
3075
  int page_size;
3076
 
3077
  if (coff_data (abfd)->link_info)
3078
    {
3079
      page_size = pe_data (abfd)->pe_opthdr.FileAlignment;
3080
 
3081
      /* If no file alignment has been set, default to one.
3082
         This repairs 'ld -r' for arm-wince-pe target.  */
3083
      if (page_size == 0)
3084
        page_size = 1;
3085
    }
3086
  else
3087
    page_size = PE_DEF_FILE_ALIGNMENT;
3088
#else
3089
#ifdef COFF_PAGE_SIZE
3090
  int page_size = COFF_PAGE_SIZE;
3091
#endif
3092
#endif
3093
 
3094
#ifdef RS6000COFF_C
3095
  /* On XCOFF, if we have symbols, set up the .debug section.  */
3096
  if (bfd_get_symcount (abfd) > 0)
3097
    {
3098
      bfd_size_type sz;
3099
      bfd_size_type i, symcount;
3100
      asymbol **symp;
3101
 
3102
      sz = 0;
3103
      symcount = bfd_get_symcount (abfd);
3104
      for (symp = abfd->outsymbols, i = 0; i < symcount; symp++, i++)
3105
        {
3106
          coff_symbol_type *cf;
3107
 
3108
          cf = coff_symbol_from (abfd, *symp);
3109
          if (cf != NULL
3110
              && cf->native != NULL
3111
              && SYMNAME_IN_DEBUG (&cf->native->u.syment))
3112
            {
3113
              size_t len;
3114
 
3115
              len = strlen (bfd_asymbol_name (*symp));
3116
              if (len > SYMNMLEN || bfd_coff_force_symnames_in_strings (abfd))
3117
                sz += len + 1 + bfd_coff_debug_string_prefix_length (abfd);
3118
            }
3119
        }
3120
      if (sz > 0)
3121
        {
3122
          asection *dsec;
3123
 
3124
          dsec = bfd_make_section_old_way (abfd, DOT_DEBUG);
3125
          if (dsec == NULL)
3126
            abort ();
3127
          dsec->size = sz;
3128
          dsec->flags |= SEC_HAS_CONTENTS;
3129
        }
3130
    }
3131
#endif
3132
 
3133
  if (bfd_get_start_address (abfd))
3134
    /*  A start address may have been added to the original file. In this
3135
        case it will need an optional header to record it.  */
3136
    abfd->flags |= EXEC_P;
3137
 
3138
  if (abfd->flags & EXEC_P)
3139
    sofar += bfd_coff_aoutsz (abfd);
3140
#ifdef RS6000COFF_C
3141
  else if (xcoff_data (abfd)->full_aouthdr)
3142
    sofar += bfd_coff_aoutsz (abfd);
3143
  else
3144
    sofar += SMALL_AOUTSZ;
3145
#endif
3146
 
3147
  sofar += abfd->section_count * bfd_coff_scnhsz (abfd);
3148
 
3149
#ifdef RS6000COFF_C
3150
  /* XCOFF handles overflows in the reloc and line number count fields
3151
     by allocating a new section header to hold the correct counts.  */
3152
  for (current = abfd->sections; current != NULL; current = current->next)
3153
    if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3154
      sofar += bfd_coff_scnhsz (abfd);
3155
#endif
3156
 
3157
#ifdef COFF_IMAGE_WITH_PE
3158
  {
3159
    /* PE requires the sections to be in memory order when listed in
3160
       the section headers.  It also does not like empty loadable
3161
       sections.  The sections apparently do not have to be in the
3162
       right order in the image file itself, but we do need to get the
3163
       target_index values right.  */
3164
 
3165
    unsigned int count;
3166
    asection **section_list;
3167
    unsigned int i;
3168
    bfd_size_type amt;
3169
 
3170
#ifdef COFF_PAGE_SIZE
3171
    /* Clear D_PAGED if section alignment is smaller than
3172
       COFF_PAGE_SIZE.  */
3173
   if (pe_data (abfd)->pe_opthdr.SectionAlignment < COFF_PAGE_SIZE)
3174
     abfd->flags &= ~D_PAGED;
3175
#endif
3176
 
3177
    count = 0;
3178
    for (current = abfd->sections; current != NULL; current = current->next)
3179
      ++count;
3180
 
3181
    /* We allocate an extra cell to simplify the final loop.  */
3182
    amt = sizeof (struct asection *) * (count + 1);
3183
    section_list = (asection **) bfd_malloc (amt);
3184
    if (section_list == NULL)
3185
      return FALSE;
3186
 
3187
    i = 0;
3188
    for (current = abfd->sections; current != NULL; current = current->next)
3189
      {
3190
        section_list[i] = current;
3191
        ++i;
3192
      }
3193
    section_list[i] = NULL;
3194
 
3195
    qsort (section_list, count, sizeof (asection *), sort_by_secaddr);
3196
 
3197
    /* Rethread the linked list into sorted order; at the same time,
3198
       assign target_index values.  */
3199
    target_index = 1;
3200
    abfd->sections = NULL;
3201
    abfd->section_last = NULL;
3202
    for (i = 0; i < count; i++)
3203
      {
3204
        current = section_list[i];
3205
        bfd_section_list_append (abfd, current);
3206
 
3207
        /* Later, if the section has zero size, we'll be throwing it
3208
           away, so we don't want to number it now.  Note that having
3209
           a zero size and having real contents are different
3210
           concepts: .bss has no contents, but (usually) non-zero
3211
           size.  */
3212
        if (current->size == 0)
3213
          {
3214
            /* Discard.  However, it still might have (valid) symbols
3215
               in it, so arbitrarily set it to section 1 (indexing is
3216
               1-based here; usually .text).  __end__ and other
3217
               contents of .endsection really have this happen.
3218
               FIXME: This seems somewhat dubious.  */
3219
            current->target_index = 1;
3220
          }
3221
        else
3222
          current->target_index = target_index++;
3223
      }
3224
 
3225
    free (section_list);
3226
  }
3227
#else /* ! COFF_IMAGE_WITH_PE */
3228
  {
3229
    /* Set the target_index field.  */
3230
    target_index = 1;
3231
    for (current = abfd->sections; current != NULL; current = current->next)
3232
      current->target_index = target_index++;
3233
  }
3234
#endif /* ! COFF_IMAGE_WITH_PE */
3235
 
3236
  if (target_index >= 32768)
3237
    {
3238
      bfd_set_error (bfd_error_file_too_big);
3239
      (*_bfd_error_handler)
3240
        (_("%B: too many sections (%d)"), abfd, target_index);
3241
      return FALSE;
3242
    }
3243
 
3244
  align_adjust = FALSE;
3245
  for (current = abfd->sections;
3246
       current != NULL;
3247
       current = current->next)
3248
    {
3249
#ifdef COFF_IMAGE_WITH_PE
3250
      /* With PE we have to pad each section to be a multiple of its
3251
         page size too, and remember both sizes.  */
3252
      if (coff_section_data (abfd, current) == NULL)
3253
        {
3254
          bfd_size_type amt = sizeof (struct coff_section_tdata);
3255
 
3256
          current->used_by_bfd = bfd_zalloc (abfd, amt);
3257
          if (current->used_by_bfd == NULL)
3258
            return FALSE;
3259
        }
3260
      if (pei_section_data (abfd, current) == NULL)
3261
        {
3262
          bfd_size_type amt = sizeof (struct pei_section_tdata);
3263
 
3264
          coff_section_data (abfd, current)->tdata = bfd_zalloc (abfd, amt);
3265
          if (coff_section_data (abfd, current)->tdata == NULL)
3266
            return FALSE;
3267
        }
3268
      if (pei_section_data (abfd, current)->virt_size == 0)
3269
        pei_section_data (abfd, current)->virt_size = current->size;
3270
#endif
3271
 
3272
      /* Only deal with sections which have contents.  */
3273
      if (!(current->flags & SEC_HAS_CONTENTS))
3274
        continue;
3275
 
3276
#ifdef COFF_IMAGE_WITH_PE
3277
      /* Make sure we skip empty sections in a PE image.  */
3278
      if (current->size == 0)
3279
        continue;
3280
#endif
3281
 
3282
      /* Align the sections in the file to the same boundary on
3283
         which they are aligned in virtual memory.  I960 doesn't
3284
         do this (FIXME) so we can stay in sync with Intel.  960
3285
         doesn't yet page from files...  */
3286
#ifdef ALIGN_SECTIONS_IN_FILE
3287
      if ((abfd->flags & EXEC_P) != 0)
3288
        {
3289
          /* Make sure this section is aligned on the right boundary - by
3290
             padding the previous section up if necessary.  */
3291
          old_sofar = sofar;
3292
 
3293
#ifdef RS6000COFF_C
3294
          /* AIX loader checks the text section alignment of (vma - filepos)
3295
             So even though the filepos may be aligned wrt the o_algntext, for
3296
             AIX executables, this check fails. This shows up when a native
3297
             AIX executable is stripped with gnu strip because the default vma
3298
             of native is 0x10000150 but default for gnu is 0x10000140.  Gnu
3299
             stripped gnu excutable passes this check because the filepos is
3300
             0x0140.  This problem also show up with 64 bit shared objects. The
3301
             data section must also be aligned.  */
3302
          if (!strcmp (current->name, _TEXT)
3303
              || !strcmp (current->name, _DATA))
3304
            {
3305
              bfd_vma pad;
3306
              bfd_vma align;
3307
 
3308
              sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
3309
 
3310
              align = 1 << current->alignment_power;
3311
              pad = abs (current->vma - sofar) % align;
3312
 
3313
              if (pad)
3314
                {
3315
                  pad = align - pad;
3316
                  sofar += pad;
3317
                }
3318
            }
3319
          else
3320
#else
3321
            {
3322
              sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
3323
            }
3324
#endif
3325
          if (previous != NULL)
3326
            previous->size += sofar - old_sofar;
3327
        }
3328
 
3329
#endif
3330
 
3331
      /* In demand paged files the low order bits of the file offset
3332
         must match the low order bits of the virtual address.  */
3333
#ifdef COFF_PAGE_SIZE
3334
      if ((abfd->flags & D_PAGED) != 0
3335
          && (current->flags & SEC_ALLOC) != 0)
3336
        sofar += (current->vma - (bfd_vma) sofar) % page_size;
3337
#endif
3338
      current->filepos = sofar;
3339
 
3340
#ifdef COFF_IMAGE_WITH_PE
3341
      /* Set the padded size.  */
3342
      current->size = (current->size + page_size -1) & -page_size;
3343
#endif
3344
 
3345
      sofar += current->size;
3346
 
3347
#ifdef ALIGN_SECTIONS_IN_FILE
3348
      /* Make sure that this section is of the right size too.  */
3349
      if ((abfd->flags & EXEC_P) == 0)
3350
        {
3351
          bfd_size_type old_size;
3352
 
3353
          old_size = current->size;
3354
          current->size = BFD_ALIGN (current->size,
3355
                                     1 << current->alignment_power);
3356
          align_adjust = current->size != old_size;
3357
          sofar += current->size - old_size;
3358
        }
3359
      else
3360
        {
3361
          old_sofar = sofar;
3362
          sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
3363
          align_adjust = sofar != old_sofar;
3364
          current->size += sofar - old_sofar;
3365
        }
3366
#endif
3367
 
3368
#ifdef COFF_IMAGE_WITH_PE
3369
      /* For PE we need to make sure we pad out to the aligned
3370
         size, in case the caller only writes out data to the
3371
         unaligned size.  */
3372
      if (pei_section_data (abfd, current)->virt_size < current->size)
3373
        align_adjust = TRUE;
3374
#endif
3375
 
3376
#ifdef _LIB
3377
      /* Force .lib sections to start at zero.  The vma is then
3378
         incremented in coff_set_section_contents.  This is right for
3379
         SVR3.2.  */
3380
      if (strcmp (current->name, _LIB) == 0)
3381
        bfd_set_section_vma (abfd, current, 0);
3382
#endif
3383
 
3384
#ifdef ALIGN_SECTIONS_IN_FILE
3385
      previous = current;
3386
#endif
3387
    }
3388
 
3389
  /* It is now safe to write to the output file.  If we needed an
3390
     alignment adjustment for the last section, then make sure that
3391
     there is a byte at offset sofar.  If there are no symbols and no
3392
     relocs, then nothing follows the last section.  If we don't force
3393
     the last byte out, then the file may appear to be truncated.  */
3394
  if (align_adjust)
3395
    {
3396
      bfd_byte b;
3397
 
3398
      b = 0;
3399
      if (bfd_seek (abfd, sofar - 1, SEEK_SET) != 0
3400
          || bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
3401
        return FALSE;
3402
    }
3403
 
3404
  /* Make sure the relocations are aligned.  We don't need to make
3405
     sure that this byte exists, because it will only matter if there
3406
     really are relocs.  */
3407
  sofar = BFD_ALIGN (sofar, 1 << COFF_DEFAULT_SECTION_ALIGNMENT_POWER);
3408
 
3409
  obj_relocbase (abfd) = sofar;
3410
  abfd->output_has_begun = TRUE;
3411
 
3412
  return TRUE;
3413
}
3414
 
3415
#ifdef COFF_IMAGE_WITH_PE
3416
 
3417
static unsigned int pelength;
3418
static unsigned int peheader;
3419
 
3420
static bfd_boolean
3421
coff_read_word (bfd *abfd, unsigned int *value)
3422
{
3423
  unsigned char b[2];
3424
  int status;
3425
 
3426
  status = bfd_bread (b, (bfd_size_type) 2, abfd);
3427
  if (status < 1)
3428
    {
3429
      *value = 0;
3430
      return FALSE;
3431
    }
3432
 
3433
  if (status == 1)
3434
    *value = (unsigned int) b[0];
3435
  else
3436
    *value = (unsigned int) (b[0] + (b[1] << 8));
3437
 
3438
  pelength += (unsigned int) status;
3439
 
3440
  return TRUE;
3441
}
3442
 
3443
static unsigned int
3444
coff_compute_checksum (bfd *abfd)
3445
{
3446
  bfd_boolean more_data;
3447
  file_ptr filepos;
3448
  unsigned int value;
3449
  unsigned int total;
3450
 
3451
  total = 0;
3452
  pelength = 0;
3453
  filepos = (file_ptr) 0;
3454
 
3455
  do
3456
    {
3457
      if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
3458
        return 0;
3459
 
3460
      more_data = coff_read_word (abfd, &value);
3461
      total += value;
3462
      total = 0xffff & (total + (total >> 0x10));
3463
      filepos += 2;
3464
    }
3465
  while (more_data);
3466
 
3467
  return (0xffff & (total + (total >> 0x10)));
3468
}
3469
 
3470
static bfd_boolean
3471
coff_apply_checksum (bfd *abfd)
3472
{
3473
  unsigned int computed;
3474
  unsigned int checksum = 0;
3475
 
3476
  if (bfd_seek (abfd, 0x3c, SEEK_SET) != 0)
3477
    return FALSE;
3478
 
3479
  if (!coff_read_word (abfd, &peheader))
3480
    return FALSE;
3481
 
3482
  if (bfd_seek (abfd, peheader + 0x58, SEEK_SET) != 0)
3483
    return FALSE;
3484
 
3485
  checksum = 0;
3486
  bfd_bwrite (&checksum, (bfd_size_type) 4, abfd);
3487
 
3488
  if (bfd_seek (abfd, peheader, SEEK_SET) != 0)
3489
    return FALSE;
3490
 
3491
  computed = coff_compute_checksum (abfd);
3492
 
3493
  checksum = computed + pelength;
3494
 
3495
  if (bfd_seek (abfd, peheader + 0x58, SEEK_SET) != 0)
3496
    return FALSE;
3497
 
3498
  bfd_bwrite (&checksum, (bfd_size_type) 4, abfd);
3499
 
3500
  return TRUE;
3501
}
3502
 
3503
#endif /* COFF_IMAGE_WITH_PE */
3504
 
3505
static bfd_boolean
3506
coff_write_object_contents (bfd * abfd)
3507
{
3508
  asection *current;
3509
  bfd_boolean hasrelocs = FALSE;
3510
  bfd_boolean haslinno = FALSE;
3511
#ifdef COFF_IMAGE_WITH_PE
3512
  bfd_boolean hasdebug = FALSE;
3513
#endif
3514
  file_ptr scn_base;
3515
  file_ptr reloc_base;
3516
  file_ptr lineno_base;
3517
  file_ptr sym_base;
3518
  unsigned long reloc_size = 0, reloc_count = 0;
3519
  unsigned long lnno_size = 0;
3520
  bfd_boolean long_section_names;
3521
  asection *text_sec = NULL;
3522
  asection *data_sec = NULL;
3523
  asection *bss_sec = NULL;
3524
  struct internal_filehdr internal_f;
3525
  struct internal_aouthdr internal_a;
3526
#ifdef COFF_LONG_SECTION_NAMES
3527
  size_t string_size = STRING_SIZE_SIZE;
3528
#endif
3529
 
3530
  bfd_set_error (bfd_error_system_call);
3531
 
3532
  /* Make a pass through the symbol table to count line number entries and
3533
     put them into the correct asections.  */
3534
  lnno_size = coff_count_linenumbers (abfd) * bfd_coff_linesz (abfd);
3535
 
3536
  if (! abfd->output_has_begun)
3537
    {
3538
      if (! coff_compute_section_file_positions (abfd))
3539
        return FALSE;
3540
    }
3541
 
3542
  reloc_base = obj_relocbase (abfd);
3543
 
3544
  /* Work out the size of the reloc and linno areas.  */
3545
 
3546
  for (current = abfd->sections; current != NULL; current =
3547
       current->next)
3548
    {
3549
#ifdef COFF_WITH_PE
3550
      /* We store the actual reloc count in the first reloc's addr.  */
3551
      if (obj_pe (abfd) && current->reloc_count >= 0xffff)
3552
        reloc_count ++;
3553
#endif
3554
      reloc_count += current->reloc_count;
3555
    }
3556
 
3557
  reloc_size = reloc_count * bfd_coff_relsz (abfd);
3558
 
3559
  lineno_base = reloc_base + reloc_size;
3560
  sym_base = lineno_base + lnno_size;
3561
 
3562
  /* Indicate in each section->line_filepos its actual file address.  */
3563
  for (current = abfd->sections; current != NULL; current =
3564
       current->next)
3565
    {
3566
      if (current->lineno_count)
3567
        {
3568
          current->line_filepos = lineno_base;
3569
          current->moving_line_filepos = lineno_base;
3570
          lineno_base += current->lineno_count * bfd_coff_linesz (abfd);
3571
        }
3572
      else
3573
        current->line_filepos = 0;
3574
 
3575
      if (current->reloc_count)
3576
        {
3577
          current->rel_filepos = reloc_base;
3578
          reloc_base += current->reloc_count * bfd_coff_relsz (abfd);
3579
#ifdef COFF_WITH_PE
3580
          /* Extra reloc to hold real count.  */
3581
          if (obj_pe (abfd) && current->reloc_count >= 0xffff)
3582
            reloc_base += bfd_coff_relsz (abfd);
3583
#endif
3584
        }
3585
      else
3586
        current->rel_filepos = 0;
3587
    }
3588
 
3589
  /* Write section headers to the file.  */
3590
  internal_f.f_nscns = 0;
3591
 
3592
  if ((abfd->flags & EXEC_P) != 0)
3593
    scn_base = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
3594
  else
3595
    {
3596
      scn_base = bfd_coff_filhsz (abfd);
3597
#ifdef RS6000COFF_C
3598
#ifndef XCOFF64
3599
      if (xcoff_data (abfd)->full_aouthdr)
3600
        scn_base += bfd_coff_aoutsz (abfd);
3601
      else
3602
        scn_base += SMALL_AOUTSZ;
3603
#endif
3604
#endif
3605
    }
3606
 
3607
  if (bfd_seek (abfd, scn_base, SEEK_SET) != 0)
3608
    return FALSE;
3609
 
3610
  long_section_names = FALSE;
3611
  for (current = abfd->sections;
3612
       current != NULL;
3613
       current = current->next)
3614
    {
3615
      struct internal_scnhdr section;
3616
#ifdef COFF_IMAGE_WITH_PE
3617
      bfd_boolean is_reloc_section = FALSE;
3618
 
3619
      if (strcmp (current->name, DOT_RELOC) == 0)
3620
        {
3621
          is_reloc_section = TRUE;
3622
          hasrelocs = TRUE;
3623
          pe_data (abfd)->has_reloc_section = 1;
3624
        }
3625
#endif
3626
 
3627
      internal_f.f_nscns++;
3628
 
3629
      strncpy (section.s_name, current->name, SCNNMLEN);
3630
 
3631
#ifdef COFF_LONG_SECTION_NAMES
3632
      /* Handle long section names as in PE.  This must be compatible
3633
         with the code in coff_write_symbols and _bfd_coff_final_link.  */
3634
      if (bfd_coff_long_section_names (abfd))
3635
        {
3636
          size_t len;
3637
 
3638
          len = strlen (current->name);
3639
          if (len > SCNNMLEN)
3640
            {
3641
              /* The s_name field is defined to be NUL-padded but need not be
3642
                 NUL-terminated.  We use a temporary buffer so that we can still
3643
                 sprintf all eight chars without splatting a terminating NUL
3644
                 over the first byte of the following member (s_paddr).  */
3645
              char s_name_buf[SCNNMLEN + 1];
3646
 
3647
              /* An inherent limitation of the /nnnnnnn notation used to indicate
3648
                 the offset of the long name in the string table is that we
3649
                 cannot address entries beyone the ten million byte boundary.  */
3650
              if (string_size >= 10000000)
3651
                {
3652
                  bfd_set_error (bfd_error_file_too_big);
3653
                  (*_bfd_error_handler)
3654
                    (_("%B: section %s: string table overflow at offset %ld"),
3655
                    abfd, current->name, string_size);
3656
                  return FALSE;
3657
                }
3658
 
3659
              /* snprintf not strictly necessary now we've verified the value
3660
                 has less than eight ASCII digits, but never mind.  */
3661
              snprintf (s_name_buf, SCNNMLEN + 1, "/%lu", (unsigned long) string_size);
3662
              /* Then strncpy takes care of any padding for us.  */
3663
              strncpy (section.s_name, s_name_buf, SCNNMLEN);
3664
              string_size += len + 1;
3665
              long_section_names = TRUE;
3666
            }
3667
        }
3668
#endif
3669
 
3670
#ifdef _LIB
3671
      /* Always set s_vaddr of .lib to 0.  This is right for SVR3.2
3672
         Ian Taylor <ian@cygnus.com>.  */
3673
      if (strcmp (current->name, _LIB) == 0)
3674
        section.s_vaddr = 0;
3675
      else
3676
#endif
3677
      section.s_vaddr = current->vma;
3678
      section.s_paddr = current->lma;
3679
      section.s_size =  current->size;
3680
#ifdef coff_get_section_load_page
3681
      section.s_page = coff_get_section_load_page (current);
3682
#else
3683
      section.s_page = 0;
3684
#endif
3685
 
3686
#ifdef COFF_WITH_PE
3687
      section.s_paddr = 0;
3688
#endif
3689
#ifdef COFF_IMAGE_WITH_PE
3690
      /* Reminder: s_paddr holds the virtual size of the section.  */
3691
      if (coff_section_data (abfd, current) != NULL
3692
          && pei_section_data (abfd, current) != NULL)
3693
        section.s_paddr = pei_section_data (abfd, current)->virt_size;
3694
      else
3695
        section.s_paddr = 0;
3696
#endif
3697
 
3698
      /* If this section has no size or is unloadable then the scnptr
3699
         will be 0 too.  */
3700
      if (current->size == 0
3701
          || (current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
3702
        section.s_scnptr = 0;
3703
      else
3704
        section.s_scnptr = current->filepos;
3705
 
3706
      section.s_relptr = current->rel_filepos;
3707
      section.s_lnnoptr = current->line_filepos;
3708
      section.s_nreloc = current->reloc_count;
3709
      section.s_nlnno = current->lineno_count;
3710
#ifndef COFF_IMAGE_WITH_PE
3711
      /* In PEI, relocs come in the .reloc section.  */
3712
      if (current->reloc_count != 0)
3713
        hasrelocs = TRUE;
3714
#endif
3715
      if (current->lineno_count != 0)
3716
        haslinno = TRUE;
3717
#ifdef COFF_IMAGE_WITH_PE
3718
      if ((current->flags & SEC_DEBUGGING) != 0
3719
          && ! is_reloc_section)
3720
        hasdebug = TRUE;
3721
#endif
3722
 
3723
#ifdef RS6000COFF_C
3724
#ifndef XCOFF64
3725
      /* Indicate the use of an XCOFF overflow section header.  */
3726
      if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3727
        {
3728
          section.s_nreloc = 0xffff;
3729
          section.s_nlnno = 0xffff;
3730
        }
3731
#endif
3732
#endif
3733
 
3734
      section.s_flags = sec_to_styp_flags (current->name, current->flags);
3735
 
3736
      if (!strcmp (current->name, _TEXT))
3737
        text_sec = current;
3738
      else if (!strcmp (current->name, _DATA))
3739
        data_sec = current;
3740
      else if (!strcmp (current->name, _BSS))
3741
        bss_sec = current;
3742
 
3743
#ifdef I960
3744
      section.s_align = (current->alignment_power
3745
                         ? 1 << current->alignment_power
3746
                         : 0);
3747
#endif
3748
#ifdef TIC80COFF
3749
      /* TI COFF puts the alignment power in bits 8-11 of the flags.  */
3750
      section.s_flags |= (current->alignment_power & 0xF) << 8;
3751
#endif
3752
#ifdef COFF_ENCODE_ALIGNMENT
3753
      COFF_ENCODE_ALIGNMENT(section, current->alignment_power);
3754
#endif
3755
 
3756
#ifdef COFF_IMAGE_WITH_PE
3757
      /* Suppress output of the sections if they are null.  ld
3758
         includes the bss and data sections even if there is no size
3759
         assigned to them.  NT loader doesn't like it if these section
3760
         headers are included if the sections themselves are not
3761
         needed.  See also coff_compute_section_file_positions.  */
3762
      if (section.s_size == 0)
3763
        internal_f.f_nscns--;
3764
      else
3765
#endif
3766
        {
3767
          SCNHDR buff;
3768
          bfd_size_type amt = bfd_coff_scnhsz (abfd);
3769
 
3770
          if (coff_swap_scnhdr_out (abfd, &section, &buff) == 0
3771
              || bfd_bwrite (& buff, amt, abfd) != amt)
3772
            return FALSE;
3773
        }
3774
 
3775
#ifdef COFF_WITH_PE
3776
      /* PE stores COMDAT section information in the symbol table.  If
3777
         this section is supposed to have some COMDAT info, track down
3778
         the symbol in the symbol table and modify it.  */
3779
      if ((current->flags & SEC_LINK_ONCE) != 0)
3780
        {
3781
          unsigned int i, count;
3782
          asymbol **psym;
3783
          coff_symbol_type *csym = NULL;
3784
          asymbol **psymsec;
3785
 
3786
          psymsec = NULL;
3787
          count = bfd_get_symcount (abfd);
3788
          for (i = 0, psym = abfd->outsymbols; i < count; i++, psym++)
3789
            {
3790
              if ((*psym)->section != current)
3791
                continue;
3792
 
3793
              /* Remember the location of the first symbol in this
3794
                 section.  */
3795
              if (psymsec == NULL)
3796
                psymsec = psym;
3797
 
3798
              /* See if this is the section symbol.  */
3799
              if (strcmp ((*psym)->name, current->name) == 0)
3800
                {
3801
                  csym = coff_symbol_from (abfd, *psym);
3802
                  if (csym == NULL
3803
                      || csym->native == NULL
3804
                      || csym->native->u.syment.n_numaux < 1
3805
                      || csym->native->u.syment.n_sclass != C_STAT
3806
                      || csym->native->u.syment.n_type != T_NULL)
3807
                    continue;
3808
 
3809
                  /* Here *PSYM is the section symbol for CURRENT.  */
3810
 
3811
                  break;
3812
                }
3813
            }
3814
 
3815
          /* Did we find it?
3816
             Note that we might not if we're converting the file from
3817
             some other object file format.  */
3818
          if (i < count)
3819
            {
3820
              combined_entry_type *aux;
3821
 
3822
              /* We don't touch the x_checksum field.  The
3823
                 x_associated field is not currently supported.  */
3824
 
3825
              aux = csym->native + 1;
3826
              switch (current->flags & SEC_LINK_DUPLICATES)
3827
                {
3828
                case SEC_LINK_DUPLICATES_DISCARD:
3829
                  aux->u.auxent.x_scn.x_comdat = IMAGE_COMDAT_SELECT_ANY;
3830
                  break;
3831
 
3832
                case SEC_LINK_DUPLICATES_ONE_ONLY:
3833
                  aux->u.auxent.x_scn.x_comdat =
3834
                    IMAGE_COMDAT_SELECT_NODUPLICATES;
3835
                  break;
3836
 
3837
                case SEC_LINK_DUPLICATES_SAME_SIZE:
3838
                  aux->u.auxent.x_scn.x_comdat =
3839
                    IMAGE_COMDAT_SELECT_SAME_SIZE;
3840
                  break;
3841
 
3842
                case SEC_LINK_DUPLICATES_SAME_CONTENTS:
3843
                  aux->u.auxent.x_scn.x_comdat =
3844
                    IMAGE_COMDAT_SELECT_EXACT_MATCH;
3845
                  break;
3846
                }
3847
 
3848
              /* The COMDAT symbol must be the first symbol from this
3849
                 section in the symbol table.  In order to make this
3850
                 work, we move the COMDAT symbol before the first
3851
                 symbol we found in the search above.  It's OK to
3852
                 rearrange the symbol table at this point, because
3853
                 coff_renumber_symbols is going to rearrange it
3854
                 further and fix up all the aux entries.  */
3855
              if (psym != psymsec)
3856
                {
3857
                  asymbol *hold;
3858
                  asymbol **pcopy;
3859
 
3860
                  hold = *psym;
3861
                  for (pcopy = psym; pcopy > psymsec; pcopy--)
3862
                    pcopy[0] = pcopy[-1];
3863
                  *psymsec = hold;
3864
                }
3865
            }
3866
        }
3867
#endif /* COFF_WITH_PE */
3868
    }
3869
 
3870
#ifdef RS6000COFF_C
3871
#ifndef XCOFF64
3872
  /* XCOFF handles overflows in the reloc and line number count fields
3873
     by creating a new section header to hold the correct values.  */
3874
  for (current = abfd->sections; current != NULL; current = current->next)
3875
    {
3876
      if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3877
        {
3878
          struct internal_scnhdr scnhdr;
3879
          SCNHDR buff;
3880
          bfd_size_type amt;
3881
 
3882
          internal_f.f_nscns++;
3883
          strncpy (&(scnhdr.s_name[0]), current->name, 8);
3884
          scnhdr.s_paddr = current->reloc_count;
3885
          scnhdr.s_vaddr = current->lineno_count;
3886
          scnhdr.s_size = 0;
3887
          scnhdr.s_scnptr = 0;
3888
          scnhdr.s_relptr = current->rel_filepos;
3889
          scnhdr.s_lnnoptr = current->line_filepos;
3890
          scnhdr.s_nreloc = current->target_index;
3891
          scnhdr.s_nlnno = current->target_index;
3892
          scnhdr.s_flags = STYP_OVRFLO;
3893
          amt = bfd_coff_scnhsz (abfd);
3894
          if (coff_swap_scnhdr_out (abfd, &scnhdr, &buff) == 0
3895
              || bfd_bwrite (& buff, amt, abfd) != amt)
3896
            return FALSE;
3897
        }
3898
    }
3899
#endif
3900
#endif
3901
 
3902
  /* OK, now set up the filehdr...  */
3903
 
3904
  /* Don't include the internal abs section in the section count */
3905
 
3906
  /* We will NOT put a fucking timestamp in the header here. Every time you
3907
     put it back, I will come in and take it out again.  I'm sorry.  This
3908
     field does not belong here.  We fill it with a 0 so it compares the
3909
     same but is not a reasonable time. -- gnu@cygnus.com  */
3910
  internal_f.f_timdat = 0;
3911
  internal_f.f_flags = 0;
3912
 
3913
  if (abfd->flags & EXEC_P)
3914
    internal_f.f_opthdr = bfd_coff_aoutsz (abfd);
3915
  else
3916
    {
3917
      internal_f.f_opthdr = 0;
3918
#ifdef RS6000COFF_C
3919
#ifndef XCOFF64
3920
      if (xcoff_data (abfd)->full_aouthdr)
3921
        internal_f.f_opthdr = bfd_coff_aoutsz (abfd);
3922
      else
3923
        internal_f.f_opthdr = SMALL_AOUTSZ;
3924
#endif
3925
#endif
3926
    }
3927
 
3928
  if (!hasrelocs)
3929
    internal_f.f_flags |= F_RELFLG;
3930
  if (!haslinno)
3931
    internal_f.f_flags |= F_LNNO;
3932
  if (abfd->flags & EXEC_P)
3933
    internal_f.f_flags |= F_EXEC;
3934
#ifdef COFF_IMAGE_WITH_PE
3935
  if (! hasdebug)
3936
    internal_f.f_flags |= IMAGE_FILE_DEBUG_STRIPPED;
3937
  if (pe_data (abfd)->real_flags & IMAGE_FILE_LARGE_ADDRESS_AWARE)
3938
    internal_f.f_flags |= IMAGE_FILE_LARGE_ADDRESS_AWARE;
3939
#endif
3940
 
3941
#ifndef COFF_WITH_pex64
3942
#ifdef COFF_WITH_PE
3943
  internal_f.f_flags |= IMAGE_FILE_32BIT_MACHINE;
3944
#else
3945
  if (bfd_little_endian (abfd))
3946
    internal_f.f_flags |= F_AR32WR;
3947
  else
3948
    internal_f.f_flags |= F_AR32W;
3949
#endif
3950
#endif
3951
 
3952
#ifdef TI_TARGET_ID
3953
  /* Target id is used in TI COFF v1 and later; COFF0 won't use this field,
3954
     but it doesn't hurt to set it internally.  */
3955
  internal_f.f_target_id = TI_TARGET_ID;
3956
#endif
3957
#ifdef TIC80_TARGET_ID
3958
  internal_f.f_target_id = TIC80_TARGET_ID;
3959
#endif
3960
 
3961
  /* FIXME, should do something about the other byte orders and
3962
     architectures.  */
3963
 
3964
#ifdef RS6000COFF_C
3965
  if ((abfd->flags & DYNAMIC) != 0)
3966
    internal_f.f_flags |= F_SHROBJ;
3967
  if (bfd_get_section_by_name (abfd, _LOADER) != NULL)
3968
    internal_f.f_flags |= F_DYNLOAD;
3969
#endif
3970
 
3971
  memset (&internal_a, 0, sizeof internal_a);
3972
 
3973
  /* Set up architecture-dependent stuff.  */
3974
  {
3975
    unsigned int magic = 0;
3976
    unsigned short flags = 0;
3977
 
3978
    coff_set_flags (abfd, &magic, &flags);
3979
    internal_f.f_magic = magic;
3980
    internal_f.f_flags |= flags;
3981
    /* ...and the "opt"hdr...  */
3982
 
3983
#ifdef TICOFF_AOUT_MAGIC
3984
    internal_a.magic = TICOFF_AOUT_MAGIC;
3985
#define __A_MAGIC_SET__
3986
#endif
3987
#ifdef TIC80COFF
3988
    internal_a.magic = TIC80_ARCH_MAGIC;
3989
#define __A_MAGIC_SET__
3990
#endif /* TIC80 */
3991
#ifdef I860
3992
    /* FIXME: What are the a.out magic numbers for the i860?  */
3993
    internal_a.magic = 0;
3994
#define __A_MAGIC_SET__
3995
#endif /* I860 */
3996
#ifdef I960
3997
    internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC);
3998
#define __A_MAGIC_SET__
3999
#endif /* I960 */
4000
#if M88
4001
#define __A_MAGIC_SET__
4002
    internal_a.magic = PAGEMAGICBCS;
4003
#endif /* M88 */
4004
 
4005
#if APOLLO_M68
4006
#define __A_MAGIC_SET__
4007
    internal_a.magic = APOLLO_COFF_VERSION_NUMBER;
4008
#endif
4009
 
4010
#if defined(M68) || defined(WE32K) || defined(M68K)
4011
#define __A_MAGIC_SET__
4012
#if defined(LYNXOS)
4013
    internal_a.magic = LYNXCOFFMAGIC;
4014
#else
4015
#if defined(TARG_AUX)
4016
    internal_a.magic = (abfd->flags & D_PAGED ? PAGEMAGICPEXECPAGED :
4017
                        abfd->flags & WP_TEXT ? PAGEMAGICPEXECSWAPPED :
4018
                        PAGEMAGICEXECSWAPPED);
4019
#else
4020
#if defined (PAGEMAGICPEXECPAGED)
4021
    internal_a.magic = PAGEMAGICPEXECPAGED;
4022
#endif
4023
#endif /* TARG_AUX */
4024
#endif /* LYNXOS */
4025
#endif /* M68 || WE32K || M68K */
4026
 
4027
#if defined(ARM)
4028
#define __A_MAGIC_SET__
4029
    internal_a.magic = ZMAGIC;
4030
#endif
4031
 
4032
#if defined(PPC_PE)
4033
#define __A_MAGIC_SET__
4034
    internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
4035
#endif
4036
 
4037
#if defined MCORE_PE
4038
#define __A_MAGIC_SET__
4039
    internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
4040
#endif
4041
 
4042
#if defined(I386)
4043
#define __A_MAGIC_SET__
4044
#if defined LYNXOS
4045
    internal_a.magic = LYNXCOFFMAGIC;
4046
#elif defined AMD64
4047
    internal_a.magic = IMAGE_NT_OPTIONAL_HDR64_MAGIC;
4048
#else
4049
    internal_a.magic = ZMAGIC;
4050
#endif
4051
#endif /* I386 */
4052
 
4053
#if defined(IA64)
4054
#define __A_MAGIC_SET__
4055
    internal_a.magic = PE32PMAGIC;
4056
#endif /* IA64 */
4057
 
4058
#if defined(SPARC)
4059
#define __A_MAGIC_SET__
4060
#if defined(LYNXOS)
4061
    internal_a.magic = LYNXCOFFMAGIC;
4062
#endif /* LYNXOS */
4063
#endif /* SPARC */
4064
 
4065
#ifdef RS6000COFF_C
4066
#define __A_MAGIC_SET__
4067
    internal_a.magic = (abfd->flags & D_PAGED) ? RS6K_AOUTHDR_ZMAGIC :
4068
    (abfd->flags & WP_TEXT) ? RS6K_AOUTHDR_NMAGIC :
4069
    RS6K_AOUTHDR_OMAGIC;
4070
#endif
4071
 
4072
#if defined(SH) && defined(COFF_WITH_PE)
4073
#define __A_MAGIC_SET__
4074
    internal_a.magic = SH_PE_MAGIC;
4075
#endif
4076
 
4077
#if defined(MIPS) && defined(COFF_WITH_PE)
4078
#define __A_MAGIC_SET__
4079
    internal_a.magic = MIPS_PE_MAGIC;
4080
#endif
4081
 
4082
#ifdef OR32
4083
#define __A_MAGIC_SET__
4084
    internal_a.magic = NMAGIC; /* Assume separate i/d.  */
4085
#endif
4086
 
4087
#ifndef __A_MAGIC_SET__
4088
#include "Your aouthdr magic number is not being set!"
4089
#else
4090
#undef __A_MAGIC_SET__
4091
#endif
4092
  }
4093
 
4094
  /* FIXME: Does anybody ever set this to another value?  */
4095
  internal_a.vstamp = 0;
4096
 
4097
  /* Now should write relocs, strings, syms.  */
4098
  obj_sym_filepos (abfd) = sym_base;
4099
 
4100
  if (bfd_get_symcount (abfd) != 0)
4101
    {
4102
      int firstundef;
4103
 
4104
      if (!coff_renumber_symbols (abfd, &firstundef))
4105
        return FALSE;
4106
      coff_mangle_symbols (abfd);
4107
      if (! coff_write_symbols (abfd))
4108
        return FALSE;
4109
      if (! coff_write_linenumbers (abfd))
4110
        return FALSE;
4111
      if (! coff_write_relocs (abfd, firstundef))
4112
        return FALSE;
4113
    }
4114
#ifdef COFF_LONG_SECTION_NAMES
4115
  else if (long_section_names && ! obj_coff_strings_written (abfd))
4116
    {
4117
      /* If we have long section names we have to write out the string
4118
         table even if there are no symbols.  */
4119
      if (! coff_write_symbols (abfd))
4120
        return FALSE;
4121
    }
4122
#endif
4123
#ifdef COFF_IMAGE_WITH_PE
4124
#ifdef PPC_PE
4125
  else if ((abfd->flags & EXEC_P) != 0)
4126
    {
4127
      bfd_byte b;
4128
 
4129
      /* PowerPC PE appears to require that all executable files be
4130
         rounded up to the page size.  */
4131
      b = 0;
4132
      if (bfd_seek (abfd,
4133
                    (file_ptr) BFD_ALIGN (sym_base, COFF_PAGE_SIZE) - 1,
4134
                    SEEK_SET) != 0
4135
          || bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
4136
        return FALSE;
4137
    }
4138
#endif
4139
#endif
4140
 
4141
  /* If bfd_get_symcount (abfd) != 0, then we are not using the COFF
4142
     backend linker, and obj_raw_syment_count is not valid until after
4143
     coff_write_symbols is called.  */
4144
  if (obj_raw_syment_count (abfd) != 0)
4145
    {
4146
      internal_f.f_symptr = sym_base;
4147
#ifdef RS6000COFF_C
4148
      /* AIX appears to require that F_RELFLG not be set if there are
4149
         local symbols but no relocations.  */
4150
      internal_f.f_flags &=~ F_RELFLG;
4151
#endif
4152
    }
4153
  else
4154
    {
4155
      if (long_section_names)
4156
        internal_f.f_symptr = sym_base;
4157
      else
4158
        internal_f.f_symptr = 0;
4159
      internal_f.f_flags |= F_LSYMS;
4160
    }
4161
 
4162
  if (text_sec)
4163
    {
4164
      internal_a.tsize = text_sec->size;
4165
      internal_a.text_start = internal_a.tsize ? text_sec->vma : 0;
4166
    }
4167
  if (data_sec)
4168
    {
4169
      internal_a.dsize = data_sec->size;
4170
      internal_a.data_start = internal_a.dsize ? data_sec->vma : 0;
4171
    }
4172
  if (bss_sec)
4173
    {
4174
      internal_a.bsize = bss_sec->size;
4175
      if (internal_a.bsize && bss_sec->vma < internal_a.data_start)
4176
        internal_a.data_start = bss_sec->vma;
4177
    }
4178
 
4179
  internal_a.entry = bfd_get_start_address (abfd);
4180
  internal_f.f_nsyms = obj_raw_syment_count (abfd);
4181
 
4182
#ifdef RS6000COFF_C
4183
  if (xcoff_data (abfd)->full_aouthdr)
4184
    {
4185
      bfd_vma toc;
4186
      asection *loader_sec;
4187
 
4188
      internal_a.vstamp = 1;
4189
 
4190
      internal_a.o_snentry = xcoff_data (abfd)->snentry;
4191
      if (internal_a.o_snentry == 0)
4192
        internal_a.entry = (bfd_vma) -1;
4193
 
4194
      if (text_sec != NULL)
4195
        {
4196
          internal_a.o_sntext = text_sec->target_index;
4197
          internal_a.o_algntext = bfd_get_section_alignment (abfd, text_sec);
4198
        }
4199
      else
4200
        {
4201
          internal_a.o_sntext = 0;
4202
          internal_a.o_algntext = 0;
4203
        }
4204
      if (data_sec != NULL)
4205
        {
4206
          internal_a.o_sndata = data_sec->target_index;
4207
          internal_a.o_algndata = bfd_get_section_alignment (abfd, data_sec);
4208
        }
4209
      else
4210
        {
4211
          internal_a.o_sndata = 0;
4212
          internal_a.o_algndata = 0;
4213
        }
4214
      loader_sec = bfd_get_section_by_name (abfd, ".loader");
4215
      if (loader_sec != NULL)
4216
        internal_a.o_snloader = loader_sec->target_index;
4217
      else
4218
        internal_a.o_snloader = 0;
4219
      if (bss_sec != NULL)
4220
        internal_a.o_snbss = bss_sec->target_index;
4221
      else
4222
        internal_a.o_snbss = 0;
4223
 
4224
      toc = xcoff_data (abfd)->toc;
4225
      internal_a.o_toc = toc;
4226
      internal_a.o_sntoc = xcoff_data (abfd)->sntoc;
4227
 
4228
      internal_a.o_modtype = xcoff_data (abfd)->modtype;
4229
      if (xcoff_data (abfd)->cputype != -1)
4230
        internal_a.o_cputype = xcoff_data (abfd)->cputype;
4231
      else
4232
        {
4233
          switch (bfd_get_arch (abfd))
4234
            {
4235
            case bfd_arch_rs6000:
4236
              internal_a.o_cputype = 4;
4237
              break;
4238
            case bfd_arch_powerpc:
4239
              if (bfd_get_mach (abfd) == bfd_mach_ppc)
4240
                internal_a.o_cputype = 3;
4241
              else
4242
                internal_a.o_cputype = 1;
4243
              break;
4244
            default:
4245
              abort ();
4246
            }
4247
        }
4248
      internal_a.o_maxstack = xcoff_data (abfd)->maxstack;
4249
      internal_a.o_maxdata = xcoff_data (abfd)->maxdata;
4250
    }
4251
#endif
4252
 
4253
  /* Now write them.  */
4254
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
4255
    return FALSE;
4256
 
4257
  {
4258
    char * buff;
4259
    bfd_size_type amount = bfd_coff_filhsz (abfd);
4260
 
4261
    buff = (char *) bfd_malloc (amount);
4262
    if (buff == NULL)
4263
      return FALSE;
4264
 
4265
    bfd_coff_swap_filehdr_out (abfd, & internal_f, buff);
4266
    amount = bfd_bwrite (buff, amount, abfd);
4267
 
4268
    free (buff);
4269
 
4270
    if (amount != bfd_coff_filhsz (abfd))
4271
      return FALSE;
4272
  }
4273
 
4274
  if (abfd->flags & EXEC_P)
4275
    {
4276
      /* Note that peicode.h fills in a PEAOUTHDR, not an AOUTHDR.
4277
         include/coff/pe.h sets AOUTSZ == sizeof (PEAOUTHDR)).  */
4278
      char * buff;
4279
      bfd_size_type amount = bfd_coff_aoutsz (abfd);
4280
 
4281
      buff = (char *) bfd_malloc (amount);
4282
      if (buff == NULL)
4283
        return FALSE;
4284
 
4285
      coff_swap_aouthdr_out (abfd, & internal_a, buff);
4286
      amount = bfd_bwrite (buff, amount, abfd);
4287
 
4288
      free (buff);
4289
 
4290
      if (amount != bfd_coff_aoutsz (abfd))
4291
        return FALSE;
4292
 
4293
#ifdef COFF_IMAGE_WITH_PE
4294
      if (! coff_apply_checksum (abfd))
4295
        return FALSE;
4296
#endif
4297
    }
4298
#ifdef RS6000COFF_C
4299
  else
4300
    {
4301
      AOUTHDR buff;
4302
      size_t size;
4303
 
4304
      /* XCOFF seems to always write at least a small a.out header.  */
4305
      coff_swap_aouthdr_out (abfd, & internal_a, & buff);
4306
      if (xcoff_data (abfd)->full_aouthdr)
4307
        size = bfd_coff_aoutsz (abfd);
4308
      else
4309
        size = SMALL_AOUTSZ;
4310
      if (bfd_bwrite (& buff, (bfd_size_type) size, abfd) != size)
4311
        return FALSE;
4312
    }
4313
#endif
4314
 
4315
  return TRUE;
4316
}
4317
 
4318
static bfd_boolean
4319
coff_set_section_contents (bfd * abfd,
4320
                           sec_ptr section,
4321
                           const void * location,
4322
                           file_ptr offset,
4323
                           bfd_size_type count)
4324
{
4325
  if (! abfd->output_has_begun) /* Set by bfd.c handler.  */
4326
    {
4327
      if (! coff_compute_section_file_positions (abfd))
4328
        return FALSE;
4329
    }
4330
 
4331
#if defined(_LIB) && !defined(TARG_AUX)
4332
   /* The physical address field of a .lib section is used to hold the
4333
      number of shared libraries in the section.  This code counts the
4334
      number of sections being written, and increments the lma field
4335
      with the number.
4336
 
4337
      I have found no documentation on the contents of this section.
4338
      Experimentation indicates that the section contains zero or more
4339
      records, each of which has the following structure:
4340
 
4341
      - a (four byte) word holding the length of this record, in words,
4342
      - a word that always seems to be set to "2",
4343
      - the path to a shared library, null-terminated and then padded
4344
        to a whole word boundary.
4345
 
4346
      bfd_assert calls have been added to alert if an attempt is made
4347
      to write a section which doesn't follow these assumptions.  The
4348
      code has been tested on ISC 4.1 by me, and on SCO by Robert Lipe
4349
      <robertl@arnet.com> (Thanks!).
4350
 
4351
      Gvran Uddeborg <gvran@uddeborg.pp.se>.  */
4352
    if (strcmp (section->name, _LIB) == 0)
4353
      {
4354
        bfd_byte *rec, *recend;
4355
 
4356
        rec = (bfd_byte *) location;
4357
        recend = rec + count;
4358
        while (rec < recend)
4359
          {
4360
            ++section->lma;
4361
            rec += bfd_get_32 (abfd, rec) * 4;
4362
          }
4363
 
4364
        BFD_ASSERT (rec == recend);
4365
      }
4366
#endif
4367
 
4368
  /* Don't write out bss sections - one way to do this is to
4369
       see if the filepos has not been set.  */
4370
  if (section->filepos == 0)
4371
    return TRUE;
4372
 
4373
  if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0)
4374
    return FALSE;
4375
 
4376
  if (count == 0)
4377
    return TRUE;
4378
 
4379
  return bfd_bwrite (location, count, abfd) == count;
4380
}
4381
 
4382
static void *
4383
buy_and_read (bfd *abfd, file_ptr where, bfd_size_type size)
4384
{
4385
  void * area = bfd_alloc (abfd, size);
4386
 
4387
  if (!area)
4388
    return (NULL);
4389
  if (bfd_seek (abfd, where, SEEK_SET) != 0
4390
      || bfd_bread (area, size, abfd) != size)
4391
    return (NULL);
4392
  return (area);
4393
}
4394
 
4395
/*
4396
SUBSUBSECTION
4397
        Reading linenumbers
4398
 
4399
        Creating the linenumber table is done by reading in the entire
4400
        coff linenumber table, and creating another table for internal use.
4401
 
4402
        A coff linenumber table is structured so that each function
4403
        is marked as having a line number of 0. Each line within the
4404
        function is an offset from the first line in the function. The
4405
        base of the line number information for the table is stored in
4406
        the symbol associated with the function.
4407
 
4408
        Note: The PE format uses line number 0 for a flag indicating a
4409
        new source file.
4410
 
4411
        The information is copied from the external to the internal
4412
        table, and each symbol which marks a function is marked by
4413
        pointing its...
4414
 
4415
        How does this work ?
4416
*/
4417
 
4418
static int
4419
coff_sort_func_alent (const void * arg1, const void * arg2)
4420
{
4421
  const alent *al1 = *(const alent **) arg1;
4422
  const alent *al2 = *(const alent **) arg2;
4423
  const coff_symbol_type *s1 = (const coff_symbol_type *) (al1->u.sym);
4424
  const coff_symbol_type *s2 = (const coff_symbol_type *) (al2->u.sym);
4425
 
4426
  if (s1->symbol.value < s2->symbol.value)
4427
    return -1;
4428
  else if (s1->symbol.value > s2->symbol.value)
4429
    return 1;
4430
 
4431
  return 0;
4432
}
4433
 
4434
static bfd_boolean
4435
coff_slurp_line_table (bfd *abfd, asection *asect)
4436
{
4437
  LINENO *native_lineno;
4438
  alent *lineno_cache;
4439
  bfd_size_type amt;
4440
  unsigned int counter;
4441
  alent *cache_ptr;
4442
  bfd_vma prev_offset = 0;
4443
  int ordered = 1;
4444
  unsigned int nbr_func;
4445
  LINENO *src;
4446
 
4447
  BFD_ASSERT (asect->lineno == NULL);
4448
 
4449
  amt = ((bfd_size_type) asect->lineno_count + 1) * sizeof (alent);
4450
  lineno_cache = (alent *) bfd_alloc (abfd, amt);
4451
  if (lineno_cache == NULL)
4452
    return FALSE;
4453
 
4454
  amt = (bfd_size_type) bfd_coff_linesz (abfd) * asect->lineno_count;
4455
  native_lineno = (LINENO *) buy_and_read (abfd, asect->line_filepos, amt);
4456
  if (native_lineno == NULL)
4457
    {
4458
      (*_bfd_error_handler)
4459
        (_("%B: warning: line number table read failed"), abfd);
4460
      bfd_release (abfd, lineno_cache);
4461
      return FALSE;
4462
    }
4463
 
4464
  cache_ptr = lineno_cache;
4465
  asect->lineno = lineno_cache;
4466
  src = native_lineno;
4467
  nbr_func = 0;
4468
 
4469
  for (counter = 0; counter < asect->lineno_count; counter++)
4470
    {
4471
      struct internal_lineno dst;
4472
 
4473
      bfd_coff_swap_lineno_in (abfd, src, &dst);
4474
      cache_ptr->line_number = dst.l_lnno;
4475
 
4476
      if (cache_ptr->line_number == 0)
4477
        {
4478
          bfd_boolean warned;
4479
          bfd_signed_vma symndx;
4480
          coff_symbol_type *sym;
4481
 
4482
          nbr_func++;
4483
          warned = FALSE;
4484
          symndx = dst.l_addr.l_symndx;
4485
          if (symndx < 0
4486
              || (bfd_vma) symndx >= obj_raw_syment_count (abfd))
4487
            {
4488
              (*_bfd_error_handler)
4489
                (_("%B: warning: illegal symbol index %ld in line numbers"),
4490
                 abfd, dst.l_addr.l_symndx);
4491
              symndx = 0;
4492
              warned = TRUE;
4493
            }
4494
 
4495
          /* FIXME: We should not be casting between ints and
4496
             pointers like this.  */
4497
          sym = ((coff_symbol_type *)
4498
                 ((symndx + obj_raw_syments (abfd))
4499
                  ->u.syment._n._n_n._n_zeroes));
4500
          cache_ptr->u.sym = (asymbol *) sym;
4501
          if (sym->lineno != NULL && ! warned)
4502
            (*_bfd_error_handler)
4503
              (_("%B: warning: duplicate line number information for `%s'"),
4504
               abfd, bfd_asymbol_name (&sym->symbol));
4505
 
4506
          sym->lineno = cache_ptr;
4507
          if (sym->symbol.value < prev_offset)
4508
            ordered = 0;
4509
          prev_offset = sym->symbol.value;
4510
        }
4511
      else
4512
        cache_ptr->u.offset = dst.l_addr.l_paddr
4513
          - bfd_section_vma (abfd, asect);
4514
 
4515
      cache_ptr++;
4516
      src++;
4517
    }
4518
  cache_ptr->line_number = 0;
4519
  bfd_release (abfd, native_lineno);
4520
 
4521
  /* On some systems (eg AIX5.3) the lineno table may not be sorted.  */
4522
  if (!ordered)
4523
    {
4524
      /* Sort the table.  */
4525
      alent **func_table;
4526
      alent *n_lineno_cache;
4527
 
4528
      /* Create a table of functions.  */
4529
      func_table = (alent **) bfd_alloc (abfd, nbr_func * sizeof (alent *));
4530
      if (func_table != NULL)
4531
        {
4532
          alent **p = func_table;
4533
          unsigned int i;
4534
 
4535
          for (i = 0; i < counter; i++)
4536
            if (lineno_cache[i].line_number == 0)
4537
              *p++ = &lineno_cache[i];
4538
 
4539
          /* Sort by functions.  */
4540
          qsort (func_table, nbr_func, sizeof (alent *), coff_sort_func_alent);
4541
 
4542
          /* Create the new sorted table.  */
4543
          amt = ((bfd_size_type) asect->lineno_count + 1) * sizeof (alent);
4544
          n_lineno_cache = (alent *) bfd_alloc (abfd, amt);
4545
          if (n_lineno_cache != NULL)
4546
            {
4547
              alent *n_cache_ptr = n_lineno_cache;
4548
 
4549
              for (i = 0; i < nbr_func; i++)
4550
                {
4551
                  coff_symbol_type *sym;
4552
                  alent *old_ptr = func_table[i];
4553
 
4554
                  /* Copy the function entry and update it.  */
4555
                  *n_cache_ptr = *old_ptr;
4556
                  sym = (coff_symbol_type *)n_cache_ptr->u.sym;
4557
                  sym->lineno = n_cache_ptr;
4558
                  n_cache_ptr++;
4559
                  old_ptr++;
4560
 
4561
                  /* Copy the line number entries.  */
4562
                  while (old_ptr->line_number != 0)
4563
                    *n_cache_ptr++ = *old_ptr++;
4564
                }
4565
              n_cache_ptr->line_number = 0;
4566
              memcpy (lineno_cache, n_lineno_cache, amt);
4567
            }
4568
          bfd_release (abfd, func_table);
4569
        }
4570
    }
4571
 
4572
  return TRUE;
4573
}
4574
 
4575
/* Slurp in the symbol table, converting it to generic form.  Note
4576
   that if coff_relocate_section is defined, the linker will read
4577
   symbols via coff_link_add_symbols, rather than via this routine.  */
4578
 
4579
static bfd_boolean
4580
coff_slurp_symbol_table (bfd * abfd)
4581
{
4582
  combined_entry_type *native_symbols;
4583
  coff_symbol_type *cached_area;
4584
  unsigned int *table_ptr;
4585
  bfd_size_type amt;
4586
  unsigned int number_of_symbols = 0;
4587
 
4588
  if (obj_symbols (abfd))
4589
    return TRUE;
4590
 
4591
  /* Read in the symbol table.  */
4592
  if ((native_symbols = coff_get_normalized_symtab (abfd)) == NULL)
4593
    return FALSE;
4594
 
4595
  /* Allocate enough room for all the symbols in cached form.  */
4596
  amt = obj_raw_syment_count (abfd);
4597
  amt *= sizeof (coff_symbol_type);
4598
  cached_area = (coff_symbol_type *) bfd_alloc (abfd, amt);
4599
  if (cached_area == NULL)
4600
    return FALSE;
4601
 
4602
  amt = obj_raw_syment_count (abfd);
4603
  amt *= sizeof (unsigned int);
4604
  table_ptr = (unsigned int *) bfd_alloc (abfd, amt);
4605
 
4606
  if (table_ptr == NULL)
4607
    return FALSE;
4608
  else
4609
    {
4610
      coff_symbol_type *dst = cached_area;
4611
      unsigned int last_native_index = obj_raw_syment_count (abfd);
4612
      unsigned int this_index = 0;
4613
 
4614
      while (this_index < last_native_index)
4615
        {
4616
          combined_entry_type *src = native_symbols + this_index;
4617
          table_ptr[this_index] = number_of_symbols;
4618
          dst->symbol.the_bfd = abfd;
4619
 
4620
          dst->symbol.name = (char *) (src->u.syment._n._n_n._n_offset);
4621
          /* We use the native name field to point to the cached field.  */
4622
          src->u.syment._n._n_n._n_zeroes = (bfd_hostptr_t) dst;
4623
          dst->symbol.section = coff_section_from_bfd_index (abfd,
4624
                                                     src->u.syment.n_scnum);
4625
          dst->symbol.flags = 0;
4626
          dst->done_lineno = FALSE;
4627
 
4628
          switch (src->u.syment.n_sclass)
4629
            {
4630
#ifdef I960
4631
            case C_LEAFEXT:
4632
              /* Fall through to next case.  */
4633
#endif
4634
 
4635
            case C_EXT:
4636
            case C_WEAKEXT:
4637
#if defined ARM
4638
            case C_THUMBEXT:
4639
            case C_THUMBEXTFUNC:
4640
#endif
4641
#ifdef RS6000COFF_C
4642
            case C_HIDEXT:
4643
#endif
4644
#ifdef C_SYSTEM
4645
            case C_SYSTEM:      /* System Wide variable.  */
4646
#endif
4647
#ifdef COFF_WITH_PE
4648
            /* In PE, 0x68 (104) denotes a section symbol.  */
4649
            case C_SECTION:
4650
            /* In PE, 0x69 (105) denotes a weak external symbol.  */
4651
            case C_NT_WEAK:
4652
#endif
4653
              switch (coff_classify_symbol (abfd, &src->u.syment))
4654
                {
4655
                case COFF_SYMBOL_GLOBAL:
4656
                  dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
4657
#if defined COFF_WITH_PE
4658
                  /* PE sets the symbol to a value relative to the
4659
                     start of the section.  */
4660
                  dst->symbol.value = src->u.syment.n_value;
4661
#else
4662
                  dst->symbol.value = (src->u.syment.n_value
4663
                                       - dst->symbol.section->vma);
4664
#endif
4665
                  if (ISFCN ((src->u.syment.n_type)))
4666
                    /* A function ext does not go at the end of a
4667
                       file.  */
4668
                    dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
4669
                  break;
4670
 
4671
                case COFF_SYMBOL_COMMON:
4672
                  dst->symbol.section = bfd_com_section_ptr;
4673
                  dst->symbol.value = src->u.syment.n_value;
4674
                  break;
4675
 
4676
                case COFF_SYMBOL_UNDEFINED:
4677
                  dst->symbol.section = bfd_und_section_ptr;
4678
                  dst->symbol.value = 0;
4679
                  break;
4680
 
4681
                case COFF_SYMBOL_PE_SECTION:
4682
                  dst->symbol.flags |= BSF_EXPORT | BSF_SECTION_SYM;
4683
                  dst->symbol.value = 0;
4684
                  break;
4685
 
4686
                case COFF_SYMBOL_LOCAL:
4687
                  dst->symbol.flags = BSF_LOCAL;
4688
#if defined COFF_WITH_PE
4689
                  /* PE sets the symbol to a value relative to the
4690
                     start of the section.  */
4691
                  dst->symbol.value = src->u.syment.n_value;
4692
#else
4693
                  dst->symbol.value = (src->u.syment.n_value
4694
                                       - dst->symbol.section->vma);
4695
#endif
4696
                  if (ISFCN ((src->u.syment.n_type)))
4697
                    dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
4698
                  break;
4699
                }
4700
 
4701
#ifdef RS6000COFF_C
4702
              /* A symbol with a csect entry should not go at the end.  */
4703
              if (src->u.syment.n_numaux > 0)
4704
                dst->symbol.flags |= BSF_NOT_AT_END;
4705
#endif
4706
 
4707
#ifdef COFF_WITH_PE
4708
              if (src->u.syment.n_sclass == C_NT_WEAK)
4709
                dst->symbol.flags |= BSF_WEAK;
4710
 
4711
              if (src->u.syment.n_sclass == C_SECTION
4712
                  && src->u.syment.n_scnum > 0)
4713
                dst->symbol.flags = BSF_LOCAL;
4714
#endif
4715
              if (src->u.syment.n_sclass == C_WEAKEXT)
4716
                dst->symbol.flags |= BSF_WEAK;
4717
 
4718
              break;
4719
 
4720
            case C_STAT:         /* Static.  */
4721
#ifdef I960
4722
            case C_LEAFSTAT:     /* Static leaf procedure.  */
4723
#endif
4724
#if defined ARM
4725
            case C_THUMBSTAT:    /* Thumb static.  */
4726
            case C_THUMBLABEL:   /* Thumb label.  */
4727
            case C_THUMBSTATFUNC:/* Thumb static function.  */
4728
#endif
4729
            case C_LABEL:        /* Label.  */
4730
              if (src->u.syment.n_scnum == N_DEBUG)
4731
                dst->symbol.flags = BSF_DEBUGGING;
4732
              else
4733
                dst->symbol.flags = BSF_LOCAL;
4734
 
4735
              /* Base the value as an index from the base of the
4736
                 section, if there is one.  */
4737
              if (dst->symbol.section)
4738
                {
4739
#if defined COFF_WITH_PE
4740
                  /* PE sets the symbol to a value relative to the
4741
                     start of the section.  */
4742
                  dst->symbol.value = src->u.syment.n_value;
4743
#else
4744
                  dst->symbol.value = (src->u.syment.n_value
4745
                                       - dst->symbol.section->vma);
4746
#endif
4747
                }
4748
              else
4749
                dst->symbol.value = src->u.syment.n_value;
4750
              break;
4751
 
4752
            case C_MOS:         /* Member of structure.  */
4753
            case C_EOS:         /* End of structure.  */
4754
            case C_REGPARM:     /* Register parameter.  */
4755
            case C_REG:         /* register variable.  */
4756
              /* C_AUTOARG conflicts with TI COFF C_UEXT.  */
4757
#if !defined (TIC80COFF) && !defined (TICOFF)
4758
#ifdef C_AUTOARG
4759
            case C_AUTOARG:     /* 960-specific storage class.  */
4760
#endif
4761
#endif
4762
            case C_TPDEF:       /* Type definition.  */
4763
            case C_ARG:
4764
            case C_AUTO:        /* Automatic variable.  */
4765
            case C_FIELD:       /* Bit field.  */
4766
            case C_ENTAG:       /* Enumeration tag.  */
4767
            case C_MOE:         /* Member of enumeration.  */
4768
            case C_MOU:         /* Member of union.  */
4769
            case C_UNTAG:       /* Union tag.  */
4770
              dst->symbol.flags = BSF_DEBUGGING;
4771
              dst->symbol.value = (src->u.syment.n_value);
4772
              break;
4773
 
4774
            case C_FILE:        /* File name.  */
4775
            case C_STRTAG:      /* Structure tag.  */
4776
#ifdef RS6000COFF_C
4777
            case C_GSYM:
4778
            case C_LSYM:
4779
            case C_PSYM:
4780
            case C_RSYM:
4781
            case C_RPSYM:
4782
            case C_STSYM:
4783
            case C_TCSYM:
4784
            case C_BCOMM:
4785
            case C_ECOML:
4786
            case C_ECOMM:
4787
            case C_DECL:
4788
            case C_ENTRY:
4789
            case C_FUN:
4790
            case C_ESTAT:
4791
#endif
4792
              dst->symbol.flags = BSF_DEBUGGING;
4793
              dst->symbol.value = (src->u.syment.n_value);
4794
              break;
4795
 
4796
#ifdef RS6000COFF_C
4797
            case C_BINCL:       /* Beginning of include file.  */
4798
            case C_EINCL:       /* Ending of include file.  */
4799
              /* The value is actually a pointer into the line numbers
4800
                 of the file.  We locate the line number entry, and
4801
                 set the section to the section which contains it, and
4802
                 the value to the index in that section.  */
4803
              {
4804
                asection *sec;
4805
 
4806
                dst->symbol.flags = BSF_DEBUGGING;
4807
                for (sec = abfd->sections; sec != NULL; sec = sec->next)
4808
                  if (sec->line_filepos <= (file_ptr) src->u.syment.n_value
4809
                      && ((file_ptr) (sec->line_filepos
4810
                                      + sec->lineno_count * bfd_coff_linesz (abfd))
4811
                          > (file_ptr) src->u.syment.n_value))
4812
                    break;
4813
                if (sec == NULL)
4814
                  dst->symbol.value = 0;
4815
                else
4816
                  {
4817
                    dst->symbol.section = sec;
4818
                    dst->symbol.value = ((src->u.syment.n_value
4819
                                          - sec->line_filepos)
4820
                                         / bfd_coff_linesz (abfd));
4821
                    src->fix_line = 1;
4822
                  }
4823
              }
4824
              break;
4825
 
4826
            case C_BSTAT:
4827
              dst->symbol.flags = BSF_DEBUGGING;
4828
 
4829
              /* The value is actually a symbol index.  Save a pointer
4830
                 to the symbol instead of the index.  FIXME: This
4831
                 should use a union.  */
4832
              src->u.syment.n_value =
4833
                (long) (native_symbols + src->u.syment.n_value);
4834
              dst->symbol.value = src->u.syment.n_value;
4835
              src->fix_value = 1;
4836
              break;
4837
#endif
4838
 
4839
            case C_BLOCK:       /* ".bb" or ".eb".  */
4840
            case C_FCN:         /* ".bf" or ".ef" (or PE ".lf").  */
4841
            case C_EFCN:        /* Physical end of function.  */
4842
#if defined COFF_WITH_PE
4843
              /* PE sets the symbol to a value relative to the start
4844
                 of the section.  */
4845
              dst->symbol.value = src->u.syment.n_value;
4846
              if (strcmp (dst->symbol.name, ".bf") != 0)
4847
                {
4848
                  /* PE uses funny values for .ef and .lf; don't
4849
                     relocate them.  */
4850
                  dst->symbol.flags = BSF_DEBUGGING;
4851
                }
4852
              else
4853
                dst->symbol.flags = BSF_DEBUGGING | BSF_DEBUGGING_RELOC;
4854
#else
4855
              /* Base the value as an index from the base of the
4856
                 section.  */
4857
              dst->symbol.flags = BSF_LOCAL;
4858
              dst->symbol.value = (src->u.syment.n_value
4859
                                   - dst->symbol.section->vma);
4860
#endif
4861
              break;
4862
 
4863
            case C_STATLAB:     /* Static load time label.  */
4864
              dst->symbol.value = src->u.syment.n_value;
4865
              dst->symbol.flags = BSF_GLOBAL;
4866
              break;
4867
 
4868
            case C_NULL:
4869
              /* PE DLLs sometimes have zeroed out symbols for some
4870
                 reason.  Just ignore them without a warning.  */
4871
              if (src->u.syment.n_type == 0
4872
                  && src->u.syment.n_value == 0
4873
                  && src->u.syment.n_scnum == 0)
4874
                break;
4875
              /* Fall through.  */
4876
            case C_EXTDEF:      /* External definition.  */
4877
            case C_ULABEL:      /* Undefined label.  */
4878
            case C_USTATIC:     /* Undefined static.  */
4879
#ifndef COFF_WITH_PE
4880
            /* C_LINE in regular coff is 0x68.  NT has taken over this storage
4881
               class to represent a section symbol.  */
4882
            case C_LINE:        /* line # reformatted as symbol table entry.  */
4883
              /* NT uses 0x67 for a weak symbol, not C_ALIAS.  */
4884
            case C_ALIAS:       /* Duplicate tag.  */
4885
#endif
4886
              /* New storage classes for TI COFF.  */
4887
#if defined(TIC80COFF) || defined(TICOFF)
4888
            case C_UEXT:        /* Tentative external definition.  */
4889
#endif
4890
            case C_EXTLAB:      /* External load time label.  */
4891
            case C_HIDDEN:      /* Ext symbol in dmert public lib.  */
4892
            default:
4893
              (*_bfd_error_handler)
4894
                (_("%B: Unrecognized storage class %d for %s symbol `%s'"),
4895
                 abfd, src->u.syment.n_sclass,
4896
                 dst->symbol.section->name, dst->symbol.name);
4897
              dst->symbol.flags = BSF_DEBUGGING;
4898
              dst->symbol.value = (src->u.syment.n_value);
4899
              break;
4900
            }
4901
 
4902
          dst->native = src;
4903
 
4904
          dst->symbol.udata.i = 0;
4905
          dst->lineno = NULL;
4906
          this_index += (src->u.syment.n_numaux) + 1;
4907
          dst++;
4908
          number_of_symbols++;
4909
        }
4910
    }
4911
 
4912
  obj_symbols (abfd) = cached_area;
4913
  obj_raw_syments (abfd) = native_symbols;
4914
 
4915
  bfd_get_symcount (abfd) = number_of_symbols;
4916
  obj_convert (abfd) = table_ptr;
4917
  /* Slurp the line tables for each section too.  */
4918
  {
4919
    asection *p;
4920
 
4921
    p = abfd->sections;
4922
    while (p)
4923
      {
4924
        coff_slurp_line_table (abfd, p);
4925
        p = p->next;
4926
      }
4927
  }
4928
 
4929
  return TRUE;
4930
}
4931
 
4932
/* Classify a COFF symbol.  A couple of targets have globally visible
4933
   symbols which are not class C_EXT, and this handles those.  It also
4934
   recognizes some special PE cases.  */
4935
 
4936
static enum coff_symbol_classification
4937
coff_classify_symbol (bfd *abfd,
4938
                      struct internal_syment *syment)
4939
{
4940
  /* FIXME: This partially duplicates the switch in
4941
     coff_slurp_symbol_table.  */
4942
  switch (syment->n_sclass)
4943
    {
4944
    case C_EXT:
4945
    case C_WEAKEXT:
4946
#ifdef I960
4947
    case C_LEAFEXT:
4948
#endif
4949
#ifdef ARM
4950
    case C_THUMBEXT:
4951
    case C_THUMBEXTFUNC:
4952
#endif
4953
#ifdef C_SYSTEM
4954
    case C_SYSTEM:
4955
#endif
4956
#ifdef COFF_WITH_PE
4957
    case C_NT_WEAK:
4958
#endif
4959
      if (syment->n_scnum == 0)
4960
        {
4961
          if (syment->n_value == 0)
4962
            return COFF_SYMBOL_UNDEFINED;
4963
          else
4964
            return COFF_SYMBOL_COMMON;
4965
        }
4966
      return COFF_SYMBOL_GLOBAL;
4967
 
4968
    default:
4969
      break;
4970
    }
4971
 
4972
#ifdef COFF_WITH_PE
4973
  if (syment->n_sclass == C_STAT)
4974
    {
4975
      if (syment->n_scnum == 0)
4976
        /* The Microsoft compiler sometimes generates these if a
4977
           small static function is inlined every time it is used.
4978
           The function is discarded, but the symbol table entry
4979
           remains.  */
4980
        return COFF_SYMBOL_LOCAL;
4981
 
4982
#ifdef STRICT_PE_FORMAT
4983
      /* This is correct for Microsoft generated objects, but it
4984
         breaks gas generated objects.  */
4985
      if (syment->n_value == 0)
4986
        {
4987
          asection *sec;
4988
          char buf[SYMNMLEN + 1];
4989
 
4990
          sec = coff_section_from_bfd_index (abfd, syment->n_scnum);
4991
          if (sec != NULL
4992
              && (strcmp (bfd_get_section_name (abfd, sec),
4993
                          _bfd_coff_internal_syment_name (abfd, syment, buf))
4994
                  == 0))
4995
            return COFF_SYMBOL_PE_SECTION;
4996
        }
4997
#endif
4998
 
4999
      return COFF_SYMBOL_LOCAL;
5000
    }
5001
 
5002
  if (syment->n_sclass == C_SECTION)
5003
    {
5004
      /* In some cases in a DLL generated by the Microsoft linker, the
5005
         n_value field will contain garbage.  FIXME: This should
5006
         probably be handled by the swapping function instead.  */
5007
      syment->n_value = 0;
5008
      if (syment->n_scnum == 0)
5009
        return COFF_SYMBOL_UNDEFINED;
5010
      return COFF_SYMBOL_PE_SECTION;
5011
    }
5012
#endif /* COFF_WITH_PE */
5013
 
5014
  /* If it is not a global symbol, we presume it is a local symbol.  */
5015
  if (syment->n_scnum == 0)
5016
    {
5017
      char buf[SYMNMLEN + 1];
5018
 
5019
      (*_bfd_error_handler)
5020
        (_("warning: %B: local symbol `%s' has no section"),
5021
         abfd, _bfd_coff_internal_syment_name (abfd, syment, buf));
5022
    }
5023
 
5024
  return COFF_SYMBOL_LOCAL;
5025
}
5026
 
5027
/*
5028
SUBSUBSECTION
5029
        Reading relocations
5030
 
5031
        Coff relocations are easily transformed into the internal BFD form
5032
        (@code{arelent}).
5033
 
5034
        Reading a coff relocation table is done in the following stages:
5035
 
5036
        o Read the entire coff relocation table into memory.
5037
 
5038
        o Process each relocation in turn; first swap it from the
5039
        external to the internal form.
5040
 
5041
        o Turn the symbol referenced in the relocation's symbol index
5042
        into a pointer into the canonical symbol table.
5043
        This table is the same as the one returned by a call to
5044
        @code{bfd_canonicalize_symtab}. The back end will call that
5045
        routine and save the result if a canonicalization hasn't been done.
5046
 
5047
        o The reloc index is turned into a pointer to a howto
5048
        structure, in a back end specific way. For instance, the 386
5049
        and 960 use the @code{r_type} to directly produce an index
5050
        into a howto table vector; the 88k subtracts a number from the
5051
        @code{r_type} field and creates an addend field.
5052
*/
5053
 
5054
#ifndef CALC_ADDEND
5055
#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)                \
5056
  {                                                             \
5057
    coff_symbol_type *coffsym = NULL;                           \
5058
                                                                \
5059
    if (ptr && bfd_asymbol_bfd (ptr) != abfd)                   \
5060
      coffsym = (obj_symbols (abfd)                             \
5061
                 + (cache_ptr->sym_ptr_ptr - symbols));         \
5062
    else if (ptr)                                               \
5063
      coffsym = coff_symbol_from (abfd, ptr);                   \
5064
    if (coffsym != NULL                                         \
5065
        && coffsym->native->u.syment.n_scnum == 0)               \
5066
      cache_ptr->addend = 0;                                     \
5067
    else if (ptr && bfd_asymbol_bfd (ptr) == abfd               \
5068
             && ptr->section != NULL)                           \
5069
      cache_ptr->addend = - (ptr->section->vma + ptr->value);   \
5070
    else                                                        \
5071
      cache_ptr->addend = 0;                                     \
5072
  }
5073
#endif
5074
 
5075
static bfd_boolean
5076
coff_slurp_reloc_table (bfd * abfd, sec_ptr asect, asymbol ** symbols)
5077
{
5078
  RELOC *native_relocs;
5079
  arelent *reloc_cache;
5080
  arelent *cache_ptr;
5081
  unsigned int idx;
5082
  bfd_size_type amt;
5083
 
5084
  if (asect->relocation)
5085
    return TRUE;
5086
  if (asect->reloc_count == 0)
5087
    return TRUE;
5088
  if (asect->flags & SEC_CONSTRUCTOR)
5089
    return TRUE;
5090
  if (!coff_slurp_symbol_table (abfd))
5091
    return FALSE;
5092
 
5093
  amt = (bfd_size_type) bfd_coff_relsz (abfd) * asect->reloc_count;
5094
  native_relocs = (RELOC *) buy_and_read (abfd, asect->rel_filepos, amt);
5095
  amt = (bfd_size_type) asect->reloc_count * sizeof (arelent);
5096
  reloc_cache = (arelent *) bfd_alloc (abfd, amt);
5097
 
5098
  if (reloc_cache == NULL || native_relocs == NULL)
5099
    return FALSE;
5100
 
5101
  for (idx = 0; idx < asect->reloc_count; idx++)
5102
    {
5103
      struct internal_reloc dst;
5104
      struct external_reloc *src;
5105
#ifndef RELOC_PROCESSING
5106
      asymbol *ptr;
5107
#endif
5108
 
5109
      cache_ptr = reloc_cache + idx;
5110
      src = native_relocs + idx;
5111
 
5112
      dst.r_offset = 0;
5113
      coff_swap_reloc_in (abfd, src, &dst);
5114
 
5115
#ifdef RELOC_PROCESSING
5116
      RELOC_PROCESSING (cache_ptr, &dst, symbols, abfd, asect);
5117
#else
5118
      cache_ptr->address = dst.r_vaddr;
5119
 
5120
      if (dst.r_symndx != -1)
5121
        {
5122
          if (dst.r_symndx < 0 || dst.r_symndx >= obj_conv_table_size (abfd))
5123
            {
5124
              (*_bfd_error_handler)
5125
                (_("%B: warning: illegal symbol index %ld in relocs"),
5126
                 abfd, dst.r_symndx);
5127
              cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
5128
              ptr = NULL;
5129
            }
5130
          else
5131
            {
5132
              cache_ptr->sym_ptr_ptr = (symbols
5133
                                        + obj_convert (abfd)[dst.r_symndx]);
5134
              ptr = *(cache_ptr->sym_ptr_ptr);
5135
            }
5136
        }
5137
      else
5138
        {
5139
          cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
5140
          ptr = NULL;
5141
        }
5142
 
5143
      /* The symbols definitions that we have read in have been
5144
         relocated as if their sections started at 0. But the offsets
5145
         refering to the symbols in the raw data have not been
5146
         modified, so we have to have a negative addend to compensate.
5147
 
5148
         Note that symbols which used to be common must be left alone.  */
5149
 
5150
      /* Calculate any reloc addend by looking at the symbol.  */
5151
      CALC_ADDEND (abfd, ptr, dst, cache_ptr);
5152
      (void) ptr;
5153
 
5154
      cache_ptr->address -= asect->vma;
5155
      /* !! cache_ptr->section = NULL;*/
5156
 
5157
      /* Fill in the cache_ptr->howto field from dst.r_type.  */
5158
      RTYPE2HOWTO (cache_ptr, &dst);
5159
#endif  /* RELOC_PROCESSING */
5160
 
5161
      if (cache_ptr->howto == NULL)
5162
        {
5163
          (*_bfd_error_handler)
5164
            (_("%B: illegal relocation type %d at address 0x%lx"),
5165
             abfd, dst.r_type, (long) dst.r_vaddr);
5166
          bfd_set_error (bfd_error_bad_value);
5167
          return FALSE;
5168
        }
5169
    }
5170
 
5171
  asect->relocation = reloc_cache;
5172
  return TRUE;
5173
}
5174
 
5175
#ifndef coff_rtype_to_howto
5176
#ifdef RTYPE2HOWTO
5177
 
5178
/* Get the howto structure for a reloc.  This is only used if the file
5179
   including this one defines coff_relocate_section to be
5180
   _bfd_coff_generic_relocate_section, so it is OK if it does not
5181
   always work.  It is the responsibility of the including file to
5182
   make sure it is reasonable if it is needed.  */
5183
 
5184
static reloc_howto_type *
5185
coff_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
5186
                     asection *sec ATTRIBUTE_UNUSED,
5187
                     struct internal_reloc *rel,
5188
                     struct coff_link_hash_entry *h ATTRIBUTE_UNUSED,
5189
                     struct internal_syment *sym ATTRIBUTE_UNUSED,
5190
                     bfd_vma *addendp ATTRIBUTE_UNUSED)
5191
{
5192
  arelent genrel;
5193
 
5194
  genrel.howto = NULL;
5195
  RTYPE2HOWTO (&genrel, rel);
5196
  return genrel.howto;
5197
}
5198
 
5199
#else /* ! defined (RTYPE2HOWTO) */
5200
 
5201
#define coff_rtype_to_howto NULL
5202
 
5203
#endif /* ! defined (RTYPE2HOWTO) */
5204
#endif /* ! defined (coff_rtype_to_howto) */
5205
 
5206
/* This is stupid.  This function should be a boolean predicate.  */
5207
 
5208
static long
5209
coff_canonicalize_reloc (bfd * abfd,
5210
                         sec_ptr section,
5211
                         arelent ** relptr,
5212
                         asymbol ** symbols)
5213
{
5214
  arelent *tblptr = section->relocation;
5215
  unsigned int count = 0;
5216
 
5217
  if (section->flags & SEC_CONSTRUCTOR)
5218
    {
5219
      /* This section has relocs made up by us, they are not in the
5220
         file, so take them out of their chain and place them into
5221
         the data area provided.  */
5222
      arelent_chain *chain = section->constructor_chain;
5223
 
5224
      for (count = 0; count < section->reloc_count; count++)
5225
        {
5226
          *relptr++ = &chain->relent;
5227
          chain = chain->next;
5228
        }
5229
    }
5230
  else
5231
    {
5232
      if (! coff_slurp_reloc_table (abfd, section, symbols))
5233
        return -1;
5234
 
5235
      tblptr = section->relocation;
5236
 
5237
      for (; count++ < section->reloc_count;)
5238
        *relptr++ = tblptr++;
5239
    }
5240
  *relptr = 0;
5241
  return section->reloc_count;
5242
}
5243
 
5244
#ifndef coff_reloc16_estimate
5245
#define coff_reloc16_estimate dummy_reloc16_estimate
5246
 
5247
static int
5248
dummy_reloc16_estimate (bfd *abfd ATTRIBUTE_UNUSED,
5249
                        asection *input_section ATTRIBUTE_UNUSED,
5250
                        arelent *reloc ATTRIBUTE_UNUSED,
5251
                        unsigned int shrink ATTRIBUTE_UNUSED,
5252
                        struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
5253
{
5254
  abort ();
5255
  return 0;
5256
}
5257
 
5258
#endif
5259
 
5260
#ifndef coff_reloc16_extra_cases
5261
 
5262
#define coff_reloc16_extra_cases dummy_reloc16_extra_cases
5263
 
5264
/* This works even if abort is not declared in any header file.  */
5265
 
5266
static void
5267
dummy_reloc16_extra_cases (bfd *abfd ATTRIBUTE_UNUSED,
5268
                           struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
5269
                           struct bfd_link_order *link_order ATTRIBUTE_UNUSED,
5270
                           arelent *reloc ATTRIBUTE_UNUSED,
5271
                           bfd_byte *data ATTRIBUTE_UNUSED,
5272
                           unsigned int *src_ptr ATTRIBUTE_UNUSED,
5273
                           unsigned int *dst_ptr ATTRIBUTE_UNUSED)
5274
{
5275
  abort ();
5276
}
5277
#endif
5278
 
5279
#ifndef coff_bfd_link_hash_table_free
5280
#define coff_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
5281
#endif
5282
 
5283
/* If coff_relocate_section is defined, we can use the optimized COFF
5284
   backend linker.  Otherwise we must continue to use the old linker.  */
5285
 
5286
#ifdef coff_relocate_section
5287
 
5288
#ifndef coff_bfd_link_hash_table_create
5289
#define coff_bfd_link_hash_table_create _bfd_coff_link_hash_table_create
5290
#endif
5291
#ifndef coff_bfd_link_add_symbols
5292
#define coff_bfd_link_add_symbols _bfd_coff_link_add_symbols
5293
#endif
5294
#ifndef coff_bfd_final_link
5295
#define coff_bfd_final_link _bfd_coff_final_link
5296
#endif
5297
 
5298
#else /* ! defined (coff_relocate_section) */
5299
 
5300
#define coff_relocate_section NULL
5301
#ifndef coff_bfd_link_hash_table_create
5302
#define coff_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
5303
#endif
5304
#ifndef coff_bfd_link_add_symbols
5305
#define coff_bfd_link_add_symbols _bfd_generic_link_add_symbols
5306
#endif
5307
#define coff_bfd_final_link _bfd_generic_final_link
5308
 
5309
#endif /* ! defined (coff_relocate_section) */
5310
 
5311
#define coff_bfd_link_just_syms      _bfd_generic_link_just_syms
5312
#define coff_bfd_copy_link_hash_symbol_type \
5313
  _bfd_generic_copy_link_hash_symbol_type
5314
#define coff_bfd_link_split_section  _bfd_generic_link_split_section
5315
 
5316
#ifndef coff_start_final_link
5317
#define coff_start_final_link NULL
5318
#endif
5319
 
5320
#ifndef coff_adjust_symndx
5321
#define coff_adjust_symndx NULL
5322
#endif
5323
 
5324
#ifndef coff_link_add_one_symbol
5325
#define coff_link_add_one_symbol _bfd_generic_link_add_one_symbol
5326
#endif
5327
 
5328
#ifndef coff_link_output_has_begun
5329
 
5330
static bfd_boolean
5331
coff_link_output_has_begun (bfd * abfd,
5332
                            struct coff_final_link_info * info ATTRIBUTE_UNUSED)
5333
{
5334
  return abfd->output_has_begun;
5335
}
5336
#endif
5337
 
5338
#ifndef coff_final_link_postscript
5339
 
5340
static bfd_boolean
5341
coff_final_link_postscript (bfd * abfd ATTRIBUTE_UNUSED,
5342
                            struct coff_final_link_info * pfinfo ATTRIBUTE_UNUSED)
5343
{
5344
  return TRUE;
5345
}
5346
#endif
5347
 
5348
#ifndef coff_SWAP_aux_in
5349
#define coff_SWAP_aux_in coff_swap_aux_in
5350
#endif
5351
#ifndef coff_SWAP_sym_in
5352
#define coff_SWAP_sym_in coff_swap_sym_in
5353
#endif
5354
#ifndef coff_SWAP_lineno_in
5355
#define coff_SWAP_lineno_in coff_swap_lineno_in
5356
#endif
5357
#ifndef coff_SWAP_aux_out
5358
#define coff_SWAP_aux_out coff_swap_aux_out
5359
#endif
5360
#ifndef coff_SWAP_sym_out
5361
#define coff_SWAP_sym_out coff_swap_sym_out
5362
#endif
5363
#ifndef coff_SWAP_lineno_out
5364
#define coff_SWAP_lineno_out coff_swap_lineno_out
5365
#endif
5366
#ifndef coff_SWAP_reloc_out
5367
#define coff_SWAP_reloc_out coff_swap_reloc_out
5368
#endif
5369
#ifndef coff_SWAP_filehdr_out
5370
#define coff_SWAP_filehdr_out coff_swap_filehdr_out
5371
#endif
5372
#ifndef coff_SWAP_aouthdr_out
5373
#define coff_SWAP_aouthdr_out coff_swap_aouthdr_out
5374
#endif
5375
#ifndef coff_SWAP_scnhdr_out
5376
#define coff_SWAP_scnhdr_out coff_swap_scnhdr_out
5377
#endif
5378
#ifndef coff_SWAP_reloc_in
5379
#define coff_SWAP_reloc_in coff_swap_reloc_in
5380
#endif
5381
#ifndef coff_SWAP_filehdr_in
5382
#define coff_SWAP_filehdr_in coff_swap_filehdr_in
5383
#endif
5384
#ifndef coff_SWAP_aouthdr_in
5385
#define coff_SWAP_aouthdr_in coff_swap_aouthdr_in
5386
#endif
5387
#ifndef coff_SWAP_scnhdr_in
5388
#define coff_SWAP_scnhdr_in coff_swap_scnhdr_in
5389
#endif
5390
 
5391
static bfd_coff_backend_data bfd_coff_std_swap_table ATTRIBUTE_UNUSED =
5392
{
5393
  coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in,
5394
  coff_SWAP_aux_out, coff_SWAP_sym_out,
5395
  coff_SWAP_lineno_out, coff_SWAP_reloc_out,
5396
  coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out,
5397
  coff_SWAP_scnhdr_out,
5398
  FILHSZ, AOUTSZ, SCNHSZ, SYMESZ, AUXESZ, RELSZ, LINESZ, FILNMLEN,
5399
#ifdef COFF_LONG_FILENAMES
5400
  TRUE,
5401
#else
5402
  FALSE,
5403
#endif
5404
  COFF_DEFAULT_LONG_SECTION_NAMES,
5405
  COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
5406
#ifdef COFF_FORCE_SYMBOLS_IN_STRINGS
5407
  TRUE,
5408
#else
5409
  FALSE,
5410
#endif
5411
#ifdef COFF_DEBUG_STRING_WIDE_PREFIX
5412
  4,
5413
#else
5414
  2,
5415
#endif
5416
  coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
5417
  coff_SWAP_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
5418
  coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
5419
  coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
5420
  coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
5421
  coff_classify_symbol, coff_compute_section_file_positions,
5422
  coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
5423
  coff_adjust_symndx, coff_link_add_one_symbol,
5424
  coff_link_output_has_begun, coff_final_link_postscript,
5425
  bfd_pe_print_pdata
5426
};
5427
 
5428
#ifdef TICOFF
5429
/* COFF0 differs in file/section header size and relocation entry size.  */
5430
 
5431
static bfd_coff_backend_data ticoff0_swap_table =
5432
{
5433
  coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in,
5434
  coff_SWAP_aux_out, coff_SWAP_sym_out,
5435
  coff_SWAP_lineno_out, coff_SWAP_reloc_out,
5436
  coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out,
5437
  coff_SWAP_scnhdr_out,
5438
  FILHSZ_V0, AOUTSZ, SCNHSZ_V01, SYMESZ, AUXESZ, RELSZ_V0, LINESZ, FILNMLEN,
5439
#ifdef COFF_LONG_FILENAMES
5440
  TRUE,
5441
#else
5442
  FALSE,
5443
#endif
5444
  COFF_DEFAULT_LONG_SECTION_NAMES,
5445
  COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
5446
#ifdef COFF_FORCE_SYMBOLS_IN_STRINGS
5447
  TRUE,
5448
#else
5449
  FALSE,
5450
#endif
5451
#ifdef COFF_DEBUG_STRING_WIDE_PREFIX
5452
  4,
5453
#else
5454
  2,
5455
#endif
5456
  coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
5457
  coff_SWAP_reloc_in, ticoff0_bad_format_hook, coff_set_arch_mach_hook,
5458
  coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
5459
  coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
5460
  coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
5461
  coff_classify_symbol, coff_compute_section_file_positions,
5462
  coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
5463
  coff_adjust_symndx, coff_link_add_one_symbol,
5464
  coff_link_output_has_begun, coff_final_link_postscript,
5465
  bfd_pe_print_pdata
5466
};
5467
#endif
5468
 
5469
#ifdef TICOFF
5470
/* COFF1 differs in section header size.  */
5471
 
5472
static bfd_coff_backend_data ticoff1_swap_table =
5473
{
5474
  coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in,
5475
  coff_SWAP_aux_out, coff_SWAP_sym_out,
5476
  coff_SWAP_lineno_out, coff_SWAP_reloc_out,
5477
  coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out,
5478
  coff_SWAP_scnhdr_out,
5479
  FILHSZ, AOUTSZ, SCNHSZ_V01, SYMESZ, AUXESZ, RELSZ, LINESZ, FILNMLEN,
5480
#ifdef COFF_LONG_FILENAMES
5481
  TRUE,
5482
#else
5483
  FALSE,
5484
#endif
5485
  COFF_DEFAULT_LONG_SECTION_NAMES,
5486
  COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
5487
#ifdef COFF_FORCE_SYMBOLS_IN_STRINGS
5488
  TRUE,
5489
#else
5490
  FALSE,
5491
#endif
5492
#ifdef COFF_DEBUG_STRING_WIDE_PREFIX
5493
  4,
5494
#else
5495
  2,
5496
#endif
5497
  coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
5498
  coff_SWAP_reloc_in, ticoff1_bad_format_hook, coff_set_arch_mach_hook,
5499
  coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
5500
  coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
5501
  coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
5502
  coff_classify_symbol, coff_compute_section_file_positions,
5503
  coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
5504
  coff_adjust_symndx, coff_link_add_one_symbol,
5505
  coff_link_output_has_begun, coff_final_link_postscript,
5506
  bfd_pe_print_pdata    /* huh */
5507
};
5508
#endif
5509
 
5510
#ifndef coff_close_and_cleanup
5511
#define coff_close_and_cleanup              _bfd_generic_close_and_cleanup
5512
#endif
5513
 
5514
#ifndef coff_bfd_free_cached_info
5515
#define coff_bfd_free_cached_info           _bfd_generic_bfd_free_cached_info
5516
#endif
5517
 
5518
#ifndef coff_get_section_contents
5519
#define coff_get_section_contents           _bfd_generic_get_section_contents
5520
#endif
5521
 
5522
#ifndef coff_bfd_copy_private_symbol_data
5523
#define coff_bfd_copy_private_symbol_data   _bfd_generic_bfd_copy_private_symbol_data
5524
#endif
5525
 
5526
#ifndef coff_bfd_copy_private_header_data
5527
#define coff_bfd_copy_private_header_data   _bfd_generic_bfd_copy_private_header_data
5528
#endif
5529
 
5530
#ifndef coff_bfd_copy_private_section_data
5531
#define coff_bfd_copy_private_section_data  _bfd_generic_bfd_copy_private_section_data
5532
#endif
5533
 
5534
#ifndef coff_bfd_copy_private_bfd_data
5535
#define coff_bfd_copy_private_bfd_data      _bfd_generic_bfd_copy_private_bfd_data
5536
#endif
5537
 
5538
#ifndef coff_bfd_merge_private_bfd_data
5539
#define coff_bfd_merge_private_bfd_data     _bfd_generic_bfd_merge_private_bfd_data
5540
#endif
5541
 
5542
#ifndef coff_bfd_set_private_flags
5543
#define coff_bfd_set_private_flags          _bfd_generic_bfd_set_private_flags
5544
#endif
5545
 
5546
#ifndef coff_bfd_print_private_bfd_data
5547
#define coff_bfd_print_private_bfd_data     _bfd_generic_bfd_print_private_bfd_data
5548
#endif
5549
 
5550
#ifndef coff_bfd_is_local_label_name
5551
#define coff_bfd_is_local_label_name        _bfd_coff_is_local_label_name
5552
#endif
5553
 
5554
#ifndef coff_bfd_is_target_special_symbol
5555
#define coff_bfd_is_target_special_symbol   ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
5556
#endif
5557
 
5558
#ifndef coff_read_minisymbols
5559
#define coff_read_minisymbols               _bfd_generic_read_minisymbols
5560
#endif
5561
 
5562
#ifndef coff_minisymbol_to_symbol
5563
#define coff_minisymbol_to_symbol           _bfd_generic_minisymbol_to_symbol
5564
#endif
5565
 
5566
/* The reloc lookup routine must be supplied by each individual COFF
5567
   backend.  */
5568
#ifndef coff_bfd_reloc_type_lookup
5569
#define coff_bfd_reloc_type_lookup          _bfd_norelocs_bfd_reloc_type_lookup
5570
#endif
5571
#ifndef coff_bfd_reloc_name_lookup
5572
#define coff_bfd_reloc_name_lookup    _bfd_norelocs_bfd_reloc_name_lookup
5573
#endif
5574
 
5575
#ifndef coff_bfd_get_relocated_section_contents
5576
#define coff_bfd_get_relocated_section_contents \
5577
  bfd_generic_get_relocated_section_contents
5578
#endif
5579
 
5580
#ifndef coff_bfd_relax_section
5581
#define coff_bfd_relax_section              bfd_generic_relax_section
5582
#endif
5583
 
5584
#ifndef coff_bfd_gc_sections
5585
#define coff_bfd_gc_sections                bfd_generic_gc_sections
5586
#endif
5587
 
5588
#ifndef coff_bfd_merge_sections
5589
#define coff_bfd_merge_sections             bfd_generic_merge_sections
5590
#endif
5591
 
5592
#ifndef coff_bfd_is_group_section
5593
#define coff_bfd_is_group_section           bfd_generic_is_group_section
5594
#endif
5595
 
5596
#ifndef coff_bfd_discard_group
5597
#define coff_bfd_discard_group              bfd_generic_discard_group
5598
#endif
5599
 
5600
#ifndef coff_section_already_linked
5601
#define coff_section_already_linked \
5602
  _bfd_generic_section_already_linked
5603
#endif
5604
 
5605
#ifndef coff_bfd_define_common_symbol
5606
#define coff_bfd_define_common_symbol       bfd_generic_define_common_symbol
5607
#endif
5608
 
5609
#define CREATE_BIG_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE, SWAP_TABLE)     \
5610
const bfd_target VAR =                                                  \
5611
{                                                                       \
5612
  NAME ,                                                                \
5613
  bfd_target_coff_flavour,                                              \
5614
  BFD_ENDIAN_BIG,               /* Data byte order is big.  */          \
5615
  BFD_ENDIAN_BIG,               /* Header byte order is big.  */        \
5616
  /* object flags */                                                    \
5617
  (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG |                        \
5618
   HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS),                    \
5619
  /* section flags */                                                   \
5620
  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
5621
  UNDER,                        /* Leading symbol underscore.  */       \
5622
  '/',                          /* AR_pad_char.  */                     \
5623
  15,                           /* AR_max_namelen.  */                  \
5624
                                                                        \
5625
  /* Data conversion functions.  */                                     \
5626
  bfd_getb64, bfd_getb_signed_64, bfd_putb64,                           \
5627
  bfd_getb32, bfd_getb_signed_32, bfd_putb32,                           \
5628
  bfd_getb16, bfd_getb_signed_16, bfd_putb16,                           \
5629
                                                                        \
5630
  /* Header conversion functions.  */                                   \
5631
  bfd_getb64, bfd_getb_signed_64, bfd_putb64,                           \
5632
  bfd_getb32, bfd_getb_signed_32, bfd_putb32,                           \
5633
  bfd_getb16, bfd_getb_signed_16, bfd_putb16,                           \
5634
                                                                        \
5635
        /* bfd_check_format.  */                                        \
5636
  { _bfd_dummy_target, coff_object_p, bfd_generic_archive_p,            \
5637
    _bfd_dummy_target },                                                \
5638
        /* bfd_set_format.  */                                          \
5639
  { bfd_false, coff_mkobject, _bfd_generic_mkarchive, bfd_false },      \
5640
        /* bfd_write_contents.  */                                      \
5641
  { bfd_false, coff_write_object_contents, _bfd_write_archive_contents, \
5642
    bfd_false },                                                        \
5643
                                                                        \
5644
  BFD_JUMP_TABLE_GENERIC (coff),                                        \
5645
  BFD_JUMP_TABLE_COPY (coff),                                           \
5646
  BFD_JUMP_TABLE_CORE (_bfd_nocore),                                    \
5647
  BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),                           \
5648
  BFD_JUMP_TABLE_SYMBOLS (coff),                                        \
5649
  BFD_JUMP_TABLE_RELOCS (coff),                                         \
5650
  BFD_JUMP_TABLE_WRITE (coff),                                          \
5651
  BFD_JUMP_TABLE_LINK (coff),                                           \
5652
  BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),                              \
5653
                                                                        \
5654
  ALTERNATIVE,                                                          \
5655
                                                                        \
5656
  SWAP_TABLE                                                            \
5657
};
5658
 
5659
#define CREATE_BIGHDR_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE, SWAP_TABLE)  \
5660
const bfd_target VAR =                                                  \
5661
{                                                                       \
5662
  NAME ,                                                                \
5663
  bfd_target_coff_flavour,                                              \
5664
  BFD_ENDIAN_LITTLE,            /* Data byte order is little.  */       \
5665
  BFD_ENDIAN_BIG,               /* Header byte order is big.  */        \
5666
  /* object flags */                                                    \
5667
  (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG |                        \
5668
   HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS),                    \
5669
  /* section flags */                                                   \
5670
  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
5671
  UNDER,                        /* Leading symbol underscore.  */       \
5672
  '/',                          /* AR_pad_char.  */                     \
5673
  15,                           /* AR_max_namelen.  */                  \
5674
                                                                        \
5675
  /* Data conversion functions.  */                                     \
5676
  bfd_getb64, bfd_getb_signed_64, bfd_putb64,                           \
5677
  bfd_getb32, bfd_getb_signed_32, bfd_putb32,                           \
5678
  bfd_getb16, bfd_getb_signed_16, bfd_putb16,                           \
5679
                                                                        \
5680
  /* Header conversion functions.  */                                   \
5681
  bfd_getb64, bfd_getb_signed_64, bfd_putb64,                           \
5682
  bfd_getb32, bfd_getb_signed_32, bfd_putb32,                           \
5683
  bfd_getb16, bfd_getb_signed_16, bfd_putb16,                           \
5684
                                                                        \
5685
        /* bfd_check_format.  */                                        \
5686
  { _bfd_dummy_target, coff_object_p, bfd_generic_archive_p,            \
5687
    _bfd_dummy_target },                                                \
5688
        /* bfd_set_format.  */                                          \
5689
  { bfd_false, coff_mkobject, _bfd_generic_mkarchive, bfd_false },      \
5690
        /* bfd_write_contents.  */                                      \
5691
  { bfd_false, coff_write_object_contents, _bfd_write_archive_contents, \
5692
    bfd_false },                                                        \
5693
                                                                        \
5694
  BFD_JUMP_TABLE_GENERIC (coff),                                        \
5695
  BFD_JUMP_TABLE_COPY (coff),                                           \
5696
  BFD_JUMP_TABLE_CORE (_bfd_nocore),                                    \
5697
  BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),                           \
5698
  BFD_JUMP_TABLE_SYMBOLS (coff),                                        \
5699
  BFD_JUMP_TABLE_RELOCS (coff),                                         \
5700
  BFD_JUMP_TABLE_WRITE (coff),                                          \
5701
  BFD_JUMP_TABLE_LINK (coff),                                           \
5702
  BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),                              \
5703
                                                                        \
5704
  ALTERNATIVE,                                                          \
5705
                                                                        \
5706
  SWAP_TABLE                                                            \
5707
};
5708
 
5709
#define CREATE_LITTLE_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE, SWAP_TABLE)  \
5710
const bfd_target VAR =                                                  \
5711
{                                                                       \
5712
  NAME ,                                                                \
5713
  bfd_target_coff_flavour,                                              \
5714
  BFD_ENDIAN_LITTLE,            /* Data byte order is little.  */       \
5715
  BFD_ENDIAN_LITTLE,            /* Header byte order is little.  */     \
5716
        /* object flags */                                              \
5717
  (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG |                        \
5718
   HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS),                    \
5719
        /* section flags */                                             \
5720
  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
5721
  UNDER,                        /* Leading symbol underscore.  */       \
5722
  '/',                          /* AR_pad_char.  */                     \
5723
  15,                           /* AR_max_namelen.  */                  \
5724
                                                                        \
5725
  /* Data conversion functions.  */                                     \
5726
  bfd_getl64, bfd_getl_signed_64, bfd_putl64,                           \
5727
  bfd_getl32, bfd_getl_signed_32, bfd_putl32,                           \
5728
  bfd_getl16, bfd_getl_signed_16, bfd_putl16,                           \
5729
  /* Header conversion functions.  */                                   \
5730
  bfd_getl64, bfd_getl_signed_64, bfd_putl64,                           \
5731
  bfd_getl32, bfd_getl_signed_32, bfd_putl32,                           \
5732
  bfd_getl16, bfd_getl_signed_16, bfd_putl16,                           \
5733
        /* bfd_check_format.  */                                        \
5734
  { _bfd_dummy_target, coff_object_p, bfd_generic_archive_p,            \
5735
    _bfd_dummy_target },                                                \
5736
       /* bfd_set_format.  */                                           \
5737
  { bfd_false, coff_mkobject, _bfd_generic_mkarchive, bfd_false },      \
5738
        /* bfd_write_contents.  */                                      \
5739
  { bfd_false, coff_write_object_contents, _bfd_write_archive_contents, \
5740
    bfd_false },                                                        \
5741
                                                                        \
5742
  BFD_JUMP_TABLE_GENERIC (coff),                                        \
5743
  BFD_JUMP_TABLE_COPY (coff),                                           \
5744
  BFD_JUMP_TABLE_CORE (_bfd_nocore),                                    \
5745
  BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),                           \
5746
  BFD_JUMP_TABLE_SYMBOLS (coff),                                        \
5747
  BFD_JUMP_TABLE_RELOCS (coff),                                         \
5748
  BFD_JUMP_TABLE_WRITE (coff),                                          \
5749
  BFD_JUMP_TABLE_LINK (coff),                                           \
5750
  BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),                              \
5751
                                                                        \
5752
  ALTERNATIVE,                                                          \
5753
                                                                        \
5754
  SWAP_TABLE                                                            \
5755
};

powered by: WebSVN 2.1.0

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