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