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