Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

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