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