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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [bfd/] [coffcode.h] - Blame information for rev 1765

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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