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