Home | History | Annotate | Line # | Download | only in bfd
pdp11.c revision 1.1.1.10
      1 /* BFD back-end for PDP-11 a.out binaries.
      2    Copyright (C) 2001-2024 Free Software Foundation, Inc.
      3 
      4    This file is part of BFD, the Binary File Descriptor library.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3 of the License, or
      9    (at your option) any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; if not, write to the Free Software
     18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     19    MA 02110-1301, USA. */
     20 
     21 
     22 /* BFD backend for PDP-11, running 2.11BSD in particular.
     23 
     24    This file was hacked up by looking hard at the existing vaxnetbsd
     25    back end and the header files in 2.11BSD.  The symbol table format
     26    of 2.11BSD has been extended to accommodate .stab symbols.  See
     27    struct pdp11_external_nlist below for details.
     28 
     29    TODO
     30    * support for V7 file formats
     31    * support for overlay object files (see 2.11 a.out(5))
     32    * support for old and very old archives
     33    (see 2.11 ar(5), historical section)
     34 
     35    Search for TODO to find other areas needing more work.  */
     36 
     37 #define	BYTES_IN_WORD	2
     38 #define	BYTES_IN_LONG	4
     39 #define ARCH_SIZE	16
     40 #undef TARGET_IS_BIG_ENDIAN_P
     41 
     42 #define	TARGET_PAGE_SIZE	8192
     43 #define	SEGMENT__SIZE	TARGET_PAGE_SIZE
     44 
     45 #define	DEFAULT_ARCH	bfd_arch_pdp11
     46 #define	DEFAULT_MID	M_PDP11
     47 
     48 /* Do not "beautify" the CONCAT* macro args.  Traditional C will not
     49    remove whitespace added here, and thus will fail to concatenate
     50    the tokens.  */
     51 #define MY(OP) CONCAT2 (pdp11_aout_,OP)
     52 
     53 /* This needs to start with a.out so GDB knows it is an a.out variant.  */
     54 #define TARGETNAME "a.out-pdp11"
     55 
     56 /* This is the normal load address for executables.  */
     57 #define TEXT_START_ADDR		0
     58 
     59 /* The header is not included in the text segment.  */
     60 #define N_HEADER_IN_TEXT(x)	0
     61 
     62 /* There is no flags field.  */
     63 #define N_FLAGS(execp)		0
     64 
     65 #define N_SET_FLAGS(execp, flags) do { } while (0)
     66 #define N_BADMAG(x) (N_MAGIC(x) != OMAGIC	\
     67 		     && N_MAGIC(x) != NMAGIC	\
     68 		     && N_MAGIC(x) != IMAGIC	\
     69 		     && N_MAGIC(x) != ZMAGIC)
     70 
     71 #include "sysdep.h"
     72 #include <limits.h>
     73 #include "bfd.h"
     74 
     75 #define external_exec pdp11_external_exec
     76 struct pdp11_external_exec
     77 {
     78   bfd_byte e_info[2];		/* Magic number.  */
     79   bfd_byte e_text[2];		/* Length of text section in bytes.  */
     80   bfd_byte e_data[2];		/* Length of data section in bytes.  */
     81   bfd_byte e_bss[2];		/* Length of bss area in bytes.  */
     82   bfd_byte e_syms[2];		/* Length of symbol table in bytes.  */
     83   bfd_byte e_entry[2];		/* Start address.  */
     84   bfd_byte e_unused[2];		/* Not used.  */
     85   bfd_byte e_flag[2];		/* Relocation info stripped.  */
     86   bfd_byte e_relocatable;	/* Ugly hack.  */
     87 };
     88 
     89 #define	EXEC_BYTES_SIZE	(8 * 2)
     90 
     91 #define	A_MAGIC1	OMAGIC
     92 #define OMAGIC		0407	/* ...object file or impure executable.  */
     93 #define	A_MAGIC2	NMAGIC
     94 #define NMAGIC		0410	/* Pure executable.  */
     95 #define ZMAGIC		0413	/* Demand-paged executable.  */
     96 #define	IMAGIC		0411	/* Separated I&D.  */
     97 #define	A_MAGIC3	IMAGIC
     98 #define	A_MAGIC4	0405	/* Overlay.  */
     99 #define	A_MAGIC5	0430	/* Auto-overlay (nonseparate).  */
    100 #define	A_MAGIC6	0431	/* Auto-overlay (separate).  */
    101 #define QMAGIC		0
    102 #define BMAGIC		0
    103 
    104 #define A_FLAG_RELOC_STRIPPED	0x0001
    105 
    106 /* The following struct defines the format of an entry in the object file
    107    symbol table.  In the original 2.11BSD struct the index into the string
    108    table is stored as a long, but the PDP11 C convention for storing a long in
    109    memory placed the most significant word first even though the bytes within a
    110    word are stored least significant first.  So here the string table index is
    111    considered to be just 16 bits and the first two bytes of the struct were
    112    previously named e_unused.  To extend the symbol table format to accommodate
    113    .stab symbols, the e_unused bytes are renamed e_desc to store the desc field
    114    of the .stab symbol.  The GDP Project's STABS document says that the "other"
    115    field is almost always unused and can be set to zero; the only nonzero cases
    116    identified were for stabs in their own sections, which does not apply for
    117    pdp11 a.out format, and for a special case of GNU Modula2 which is not
    118    supported for the PDP11.  */
    119 #define external_nlist pdp11_external_nlist
    120 struct pdp11_external_nlist
    121 {
    122   bfd_byte e_desc[2];		/* The desc field for .stab symbols, else 0.  */
    123   bfd_byte e_strx[2];		/* Index into string table of name.  */
    124   bfd_byte e_type[1];		/* Type of symbol.  */
    125   bfd_byte e_ovly[1];		/* Overlay number.  */
    126   bfd_byte e_value[2];		/* Value of symbol.  */
    127 };
    128 
    129 #define	EXTERNAL_NLIST_SIZE	8
    130 
    131 #define N_TXTOFF(x)	(EXEC_BYTES_SIZE)
    132 #define N_DATOFF(x)	(N_TXTOFF(x) + (x)->a_text)
    133 #define N_TRELOFF(x)	(N_DATOFF(x) + (x)->a_data)
    134 #define N_DRELOFF(x)	(N_TRELOFF(x) + (x)->a_trsize)
    135 #define N_SYMOFF(x)	(N_DRELOFF(x) + (x)->a_drsize)
    136 #define N_STROFF(x)	(N_SYMOFF(x) + (x)->a_syms)
    137 
    138 #define WRITE_HEADERS(abfd, execp) pdp11_aout_write_headers (abfd, execp)
    139 
    140 #include "libbfd.h"
    141 #include "libaout.h"
    142 
    143 #define SWAP_MAGIC(ext) bfd_getl16 (ext)
    144 
    145 #define MY_entry_is_text_address 1
    146 
    147 #define MY_write_object_contents MY(write_object_contents)
    148 static bool MY(write_object_contents) (bfd *);
    149 #define MY_text_includes_header 1
    150 
    151 #define MY_BFD_TARGET
    152 
    153 #include "aout-target.h"
    154 
    155 /* Start of modified aoutx.h.  */
    156 #define KEEPIT udata.i
    157 
    158 #include <string.h>		/* For strchr and friends.  */
    159 #include "bfd.h"
    160 #include "sysdep.h"
    161 #include "safe-ctype.h"
    162 #include "bfdlink.h"
    163 
    164 #include "libaout.h"
    165 #include "aout/aout64.h"
    166 #include "aout/stab_gnu.h"
    167 #include "aout/ar.h"
    168 
    169 /* The symbol type numbers for the 16-bit a.out format from 2.11BSD differ from
    170    those defined in aout64.h so we must redefine them here.  N_EXT changes from
    171    0x01 to 0x20 which creates a conflict with some .stab values, in particular
    172    between undefined externals (N_UNDF+N_EXT) vs. global variables (N_GYSM) and
    173    between external bss symbols (N_BSS+N_EXT) vs. function names (N_FUN).  We
    174    disambiguate those conflicts with a hack in is_stab() to look for the ':' in
    175    the global variable or function name string.  */
    176 #undef N_TYPE
    177 #undef N_UNDF
    178 #undef N_ABS
    179 #undef N_TEXT
    180 #undef N_DATA
    181 #undef N_BSS
    182 #undef N_REG
    183 #undef N_FN
    184 #undef N_EXT
    185 #undef N_STAB
    186 #define N_TYPE		0x1f	/* Type mask.  */
    187 #define N_UNDF		0x00	/* Undefined.  */
    188 #define N_ABS		0x01	/* Absolute.  */
    189 #define N_TEXT		0x02	/* Text segment.  */
    190 #define N_DATA		0x03	/* Data segment.  */
    191 #define N_BSS		0x04	/* Bss segment.  */
    192 #define N_REG		0x14	/* Register symbol.  */
    193 #define N_FN		0x1f	/* File name.  */
    194 #define N_EXT		0x20	/* External flag.  */
    195 /* Type numbers from .stab entries that could conflict:
    196 	N_GSYM		0x20	   Global variable [conflict with external undef]
    197 	N_FNAME		0x22	   Function name (for BSD Fortran) [ignored]
    198 	N_FUN		0x24	   Function name [conflict with external BSS]
    199 	N_NOMAP		0x34	   No DST map for sym. [ext. reg. doesn't exist]
    200 */
    201 
    202 #define RELOC_SIZE 2
    203 
    204 #define RELFLG		0x0001	/* PC-relative flag.  */
    205 #define RTYPE		0x000e	/* Type mask.  */
    206 #define RIDXMASK	0xfff0	/* Index mask.  */
    207 
    208 #define RABS		0x00	/* Absolute.  */
    209 #define RTEXT		0x02	/* Text.  */
    210 #define RDATA		0x04	/* Data.  */
    211 #define RBSS		0x06	/* Bss.  */
    212 #define REXT		0x08	/* External.  */
    213 
    214 #define RINDEX(x)	(((x) & 0xfff0) >> 4)
    215 
    216 #ifndef MY_final_link_relocate
    217 #define MY_final_link_relocate _bfd_final_link_relocate
    218 #endif
    219 
    220 #ifndef MY_relocate_contents
    221 #define MY_relocate_contents _bfd_relocate_contents
    222 #endif
    223 
    224 /* A hash table used for header files with N_BINCL entries.  */
    225 
    226 struct aout_link_includes_table
    227 {
    228   struct bfd_hash_table root;
    229 };
    230 
    231 /* A linked list of totals that we have found for a particular header
    232    file.  */
    233 
    234 struct aout_link_includes_totals
    235 {
    236   struct aout_link_includes_totals *next;
    237   bfd_vma total;
    238 };
    239 
    240 /* An entry in the header file hash table.  */
    241 
    242 struct aout_link_includes_entry
    243 {
    244   struct bfd_hash_entry root;
    245   /* List of totals we have found for this file.  */
    246   struct aout_link_includes_totals *totals;
    247 };
    248 
    249 /* During the final link step we need to pass around a bunch of
    250    information, so we do it in an instance of this structure.  */
    251 
    252 struct aout_final_link_info
    253 {
    254   /* General link information.  */
    255   struct bfd_link_info *info;
    256   /* Output bfd.  */
    257   bfd *output_bfd;
    258   /* Reloc file positions.  */
    259   file_ptr treloff, dreloff;
    260   /* File position of symbols.  */
    261   file_ptr symoff;
    262   /* String table.  */
    263   struct bfd_strtab_hash *strtab;
    264   /* Header file hash table.  */
    265   struct aout_link_includes_table includes;
    266   /* A buffer large enough to hold the contents of any section.  */
    267   bfd_byte *contents;
    268   /* A buffer large enough to hold the relocs of any section.  */
    269   void * relocs;
    270   /* A buffer large enough to hold the symbol map of any input BFD.  */
    271   int *symbol_map;
    272   /* A buffer large enough to hold output symbols of any input BFD.  */
    273   struct external_nlist *output_syms;
    274 };
    275 
    276 /* Copy of the link_info.separate_code boolean to select the output format with
    277    separate instruction and data spaces selected by --imagic */
    278 static bool separate_i_d = false;
    279 
    280 reloc_howto_type howto_table_pdp11[] =
    281 {
    282   /* type	       rs size bsz  pcrel bitpos ovrf			  sf name     part_inpl readmask  setmask    pcdone */
    283 HOWTO( 0,	       0,  2,  16,  false, 0, complain_overflow_dont,0,"16",	true, 0x0000ffff,0x0000ffff, false),
    284 HOWTO( 1,	       0,  2,  16,  true,  0, complain_overflow_dont,0,"DISP16",	true, 0x0000ffff,0x0000ffff, false),
    285 HOWTO( 2,	       0,  4,  32,  false, 0, complain_overflow_dont,0,"32",	true, 0x0000ffff,0x0000ffff, false),
    286 };
    287 
    288 #define TABLE_SIZE(TABLE)	(sizeof(TABLE)/sizeof(TABLE[0]))
    289 
    290 
    291 static bool aout_link_check_archive_element (bfd *, struct bfd_link_info *,
    292 					     struct bfd_link_hash_entry *,
    293 					     const char *, bool *);
    294 static bool aout_link_add_object_symbols (bfd *, struct bfd_link_info *);
    295 static bool aout_link_add_symbols (bfd *, struct bfd_link_info *);
    296 static bool aout_link_write_symbols (struct aout_final_link_info *, bfd *);
    297 
    298 
    299 reloc_howto_type *
    300 NAME (aout, reloc_type_lookup) (bfd * abfd ATTRIBUTE_UNUSED,
    301 				bfd_reloc_code_real_type code)
    302 {
    303   switch (code)
    304     {
    305     case BFD_RELOC_16:
    306       return &howto_table_pdp11[0];
    307     case BFD_RELOC_16_PCREL:
    308       return &howto_table_pdp11[1];
    309     case BFD_RELOC_32:
    310       return &howto_table_pdp11[2];
    311     default:
    312       return NULL;
    313     }
    314 }
    315 
    316 reloc_howto_type *
    317 NAME (aout, reloc_name_lookup) (bfd *abfd ATTRIBUTE_UNUSED,
    318 				      const char *r_name)
    319 {
    320   unsigned int i;
    321 
    322   for (i = 0;
    323        i < sizeof (howto_table_pdp11) / sizeof (howto_table_pdp11[0]);
    324        i++)
    325     if (howto_table_pdp11[i].name != NULL
    326 	&& strcasecmp (howto_table_pdp11[i].name, r_name) == 0)
    327       return &howto_table_pdp11[i];
    328 
    329   return NULL;
    330 }
    331 
    332 /* Disambiguate conflicts between normal symbol types and .stab symbol types
    333    (undefined externals N_UNDF+N_EXT vs. global variables N_GYSM and external
    334    bss symbols N_BSS+N_EXT vs. function names N_FUN) with a hack to look for
    335    the ':' in the global variable or function name string.  */
    336 
    337 static int
    338 is_stab (int type, const char *name)
    339 {
    340   if (type == N_GSYM || type == N_FUN)
    341     return strchr (name, ':') != NULL;
    342   return type > N_FUN;
    343 }
    344 
    345 static int
    346 pdp11_aout_write_headers (bfd *abfd, struct internal_exec *execp)
    347 {
    348   struct external_exec exec_bytes;
    349 
    350   if (adata(abfd).magic == undecided_magic)
    351     NAME (aout, adjust_sizes_and_vmas) (abfd);
    352 
    353   execp->a_syms = bfd_get_symcount (abfd) * EXTERNAL_NLIST_SIZE;
    354   execp->a_entry = bfd_get_start_address (abfd);
    355 
    356   if (obj_textsec (abfd)->reloc_count > 0
    357       || obj_datasec (abfd)->reloc_count > 0)
    358     {
    359       execp->a_trsize = execp->a_text;
    360       execp->a_drsize = execp->a_data;
    361     }
    362   else
    363     {
    364       execp->a_trsize = 0;
    365       execp->a_drsize = 0;
    366     }
    367 
    368   NAME (aout, swap_exec_header_out) (abfd, execp, & exec_bytes);
    369 
    370   if (bfd_seek (abfd, 0, SEEK_SET) != 0)
    371     return false;
    372 
    373   if (bfd_write (&exec_bytes, EXEC_BYTES_SIZE, abfd) != EXEC_BYTES_SIZE)
    374     return false;
    375 
    376   /* Now write out reloc info, followed by syms and strings.  */
    377   if (bfd_get_outsymbols (abfd) != NULL
    378       && bfd_get_symcount (abfd) != 0)
    379     {
    380       if (bfd_seek (abfd, N_SYMOFF (execp), SEEK_SET) != 0)
    381 	return false;
    382 
    383       if (! NAME (aout, write_syms) (abfd))
    384 	return false;
    385     }
    386 
    387   if (obj_textsec (abfd)->reloc_count > 0
    388       || obj_datasec (abfd)->reloc_count > 0)
    389     {
    390       if (bfd_seek (abfd, N_TRELOFF (execp), SEEK_SET) != 0
    391 	  || !NAME (aout, squirt_out_relocs) (abfd, obj_textsec (abfd))
    392 	  || bfd_seek (abfd, N_DRELOFF (execp), SEEK_SET) != 0
    393 	  || !NAME (aout, squirt_out_relocs) (abfd, obj_datasec (abfd)))
    394 	return false;
    395     }
    396 
    397   return true;
    398 }
    399 
    400 /* Write an object file.
    401    Section contents have already been written.  We write the
    402    file header, symbols, and relocation.  */
    403 
    404 static bool
    405 MY(write_object_contents) (bfd *abfd)
    406 {
    407   struct internal_exec *execp = exec_hdr (abfd);
    408 
    409   /* We must make certain that the magic number has been set.  This
    410      will normally have been done by set_section_contents, but only if
    411      there actually are some section contents.  */
    412   if (! abfd->output_has_begun)
    413     NAME (aout, adjust_sizes_and_vmas) (abfd);
    414 
    415   obj_reloc_entry_size (abfd) = RELOC_SIZE;
    416 
    417   return WRITE_HEADERS (abfd, execp);
    418 }
    419 
    420 /* Swap the information in an executable header @var{raw_bytes} taken
    421    from a raw byte stream memory image into the internal exec header
    422    structure "execp".  */
    423 
    424 #ifndef NAME_swap_exec_header_in
    425 void
    426 NAME (aout, swap_exec_header_in) (bfd *abfd,
    427 				  struct external_exec *bytes,
    428 				  struct internal_exec *execp)
    429 {
    430   /* The internal_exec structure has some fields that are unused in this
    431      configuration (IE for i960), so ensure that all such uninitialized
    432      fields are zero'd out.  There are places where two of these structs
    433      are memcmp'd, and thus the contents do matter.  */
    434   memset ((void *) execp, 0, sizeof (struct internal_exec));
    435   /* Now fill in fields in the execp, from the bytes in the raw data.  */
    436   execp->a_info   = GET_MAGIC (abfd, bytes->e_info);
    437   execp->a_text   = GET_WORD (abfd, bytes->e_text);
    438   execp->a_data   = GET_WORD (abfd, bytes->e_data);
    439   execp->a_bss    = GET_WORD (abfd, bytes->e_bss);
    440   execp->a_syms   = GET_WORD (abfd, bytes->e_syms);
    441   execp->a_entry  = GET_WORD (abfd, bytes->e_entry);
    442 
    443   if (GET_WORD (abfd, bytes->e_flag) & A_FLAG_RELOC_STRIPPED)
    444     {
    445       execp->a_trsize = 0;
    446       execp->a_drsize = 0;
    447     }
    448   else
    449     {
    450       execp->a_trsize = execp->a_text;
    451       execp->a_drsize = execp->a_data;
    452     }
    453 }
    454 #define NAME_swap_exec_header_in NAME (aout, swap_exec_header_in)
    455 #endif
    456 
    457 /*  Swap the information in an internal exec header structure
    458     "execp" into the buffer "bytes" ready for writing to disk.  */
    459 void
    460 NAME (aout, swap_exec_header_out) (bfd *abfd,
    461 				   struct internal_exec *execp,
    462 				   struct external_exec *bytes)
    463 {
    464   /* Now fill in fields in the raw data, from the fields in the exec struct.  */
    465   PUT_MAGIC (abfd, execp->a_info,		bytes->e_info);
    466   PUT_WORD (abfd, execp->a_text,		bytes->e_text);
    467   PUT_WORD (abfd, execp->a_data,		bytes->e_data);
    468   PUT_WORD (abfd, execp->a_bss,			bytes->e_bss);
    469   PUT_WORD (abfd, execp->a_syms,		bytes->e_syms);
    470   PUT_WORD (abfd, execp->a_entry,		bytes->e_entry);
    471   PUT_WORD (abfd, 0,				bytes->e_unused);
    472 
    473   if ((execp->a_trsize == 0 || execp->a_text == 0)
    474       && (execp->a_drsize == 0 || execp->a_data == 0))
    475     PUT_WORD (abfd, A_FLAG_RELOC_STRIPPED, bytes->e_flag);
    476   else if (execp->a_trsize == execp->a_text
    477 	   && execp->a_drsize == execp->a_data)
    478     PUT_WORD (abfd, 0, bytes->e_flag);
    479   else
    480     {
    481       /* TODO: print a proper warning message.  */
    482       fprintf (stderr, "BFD:%s:%d: internal error\n", __FILE__, __LINE__);
    483       PUT_WORD (abfd, 0,			bytes->e_flag);
    484     }
    485 }
    486 
    487 /* Make all the section for an a.out file.  */
    488 
    489 bool
    490 NAME (aout, make_sections) (bfd *abfd)
    491 {
    492   if (obj_textsec (abfd) == NULL && bfd_make_section (abfd, ".text") == NULL)
    493     return false;
    494   if (obj_datasec (abfd) == NULL && bfd_make_section (abfd, ".data") == NULL)
    495     return false;
    496   if (obj_bsssec (abfd) == NULL  && bfd_make_section (abfd, ".bss") == NULL)
    497     return false;
    498   return true;
    499 }
    500 
    501 /* Some a.out variant thinks that the file open in ABFD
    502    checking is an a.out file.  Do some more checking, and set up
    503    for access if it really is.  Call back to the calling
    504    environment's "finish up" function just before returning, to
    505    handle any last-minute setup.  */
    506 
    507 bfd_cleanup
    508 NAME (aout, some_aout_object_p) (bfd *abfd,
    509 				 struct internal_exec *execp,
    510 				 bfd_cleanup (*callback_to_real_object_p) (bfd *))
    511 {
    512   struct aout_data_struct *rawptr, *oldrawptr;
    513   bfd_cleanup cleanup;
    514   size_t amt = sizeof (struct aout_data_struct);
    515 
    516   rawptr = bfd_zalloc (abfd, amt);
    517   if (rawptr == NULL)
    518     return 0;
    519 
    520   oldrawptr = abfd->tdata.aout_data;
    521   abfd->tdata.aout_data = rawptr;
    522 
    523   /* Copy the contents of the old tdata struct.  */
    524   if (oldrawptr != NULL)
    525     *abfd->tdata.aout_data = *oldrawptr;
    526 
    527   abfd->tdata.aout_data->a.hdr = &rawptr->e;
    528   *(abfd->tdata.aout_data->a.hdr) = *execp;	/* Copy in the internal_exec struct.  */
    529   execp = abfd->tdata.aout_data->a.hdr;
    530 
    531   /* Set the file flags.  */
    532   abfd->flags = BFD_NO_FLAGS;
    533   if (execp->a_drsize || execp->a_trsize)
    534     abfd->flags |= HAS_RELOC;
    535   /* Setting of EXEC_P has been deferred to the bottom of this function.  */
    536   if (execp->a_syms)
    537     abfd->flags |= HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS;
    538   if (N_DYNAMIC (execp))
    539     abfd->flags |= DYNAMIC;
    540 
    541   if (N_MAGIC (execp) == ZMAGIC)
    542     {
    543       abfd->flags |= D_PAGED | WP_TEXT;
    544       adata (abfd).magic = z_magic;
    545     }
    546   else if (N_MAGIC (execp) == NMAGIC)
    547     {
    548       abfd->flags |= WP_TEXT;
    549       adata (abfd).magic = n_magic;
    550     }
    551   else if (N_MAGIC (execp) == OMAGIC)
    552     adata (abfd).magic = o_magic;
    553   else if (N_MAGIC (execp) == IMAGIC)
    554     adata (abfd).magic = i_magic;
    555   else
    556     {
    557       /* Should have been checked with N_BADMAG before this routine
    558 	 was called.  */
    559       abort ();
    560     }
    561 
    562   abfd->start_address = execp->a_entry;
    563 
    564   obj_aout_symbols (abfd) = NULL;
    565   abfd->symcount = execp->a_syms / sizeof (struct external_nlist);
    566 
    567   /* The default relocation entry size is that of traditional V7 Unix.  */
    568   obj_reloc_entry_size (abfd) = RELOC_SIZE;
    569 
    570   /* The default symbol entry size is that of traditional Unix.  */
    571   obj_symbol_entry_size (abfd) = EXTERNAL_NLIST_SIZE;
    572 
    573 #ifdef USE_MMAP
    574   bfd_init_window (&obj_aout_sym_window (abfd));
    575   bfd_init_window (&obj_aout_string_window (abfd));
    576 #endif
    577 
    578   obj_aout_external_syms (abfd) = NULL;
    579   obj_aout_external_strings (abfd) = NULL;
    580   obj_aout_sym_hashes (abfd) = NULL;
    581 
    582   if (! NAME (aout, make_sections) (abfd))
    583     return NULL;
    584 
    585   obj_datasec (abfd)->size = execp->a_data;
    586   obj_bsssec (abfd)->size = execp->a_bss;
    587 
    588   obj_textsec (abfd)->flags =
    589     (execp->a_trsize != 0
    590      ? (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS | SEC_RELOC)
    591      : (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS));
    592   obj_datasec (abfd)->flags =
    593     (execp->a_drsize != 0
    594      ? (SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS | SEC_RELOC)
    595      : (SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS));
    596   obj_bsssec (abfd)->flags = SEC_ALLOC;
    597 
    598 #ifdef THIS_IS_ONLY_DOCUMENTATION
    599   /* The common code can't fill in these things because they depend
    600      on either the start address of the text segment, the rounding
    601      up of virtual addresses between segments, or the starting file
    602      position of the text segment -- all of which varies among different
    603      versions of a.out.  */
    604 
    605   /* Call back to the format-dependent code to fill in the rest of the
    606      fields and do any further cleanup.  Things that should be filled
    607      in by the callback:  */
    608   struct exec *execp = exec_hdr (abfd);
    609 
    610   obj_textsec (abfd)->size = N_TXTSIZE (execp);
    611   /* Data and bss are already filled in since they're so standard.  */
    612 
    613   /* The virtual memory addresses of the sections.  */
    614   obj_textsec (abfd)->vma = N_TXTADDR (execp);
    615   obj_datasec (abfd)->vma = N_DATADDR (execp);
    616   obj_bsssec  (abfd)->vma = N_BSSADDR (execp);
    617 
    618   /* The file offsets of the sections.  */
    619   obj_textsec (abfd)->filepos = N_TXTOFF (execp);
    620   obj_datasec (abfd)->filepos = N_DATOFF (execp);
    621 
    622   /* The file offsets of the relocation info.  */
    623   obj_textsec (abfd)->rel_filepos = N_TRELOFF (execp);
    624   obj_datasec (abfd)->rel_filepos = N_DRELOFF (execp);
    625 
    626   /* The file offsets of the string table and symbol table.  */
    627   obj_str_filepos (abfd) = N_STROFF (execp);
    628   obj_sym_filepos (abfd) = N_SYMOFF (execp);
    629 
    630   /* Determine the architecture and machine type of the object file.  */
    631   abfd->obj_arch = bfd_arch_obscure;
    632 
    633   adata(abfd)->page_size = TARGET_PAGE_SIZE;
    634   adata(abfd)->segment_size = SEGMENT_SIZE;
    635   adata(abfd)->exec_bytes_size = EXEC_BYTES_SIZE;
    636 
    637   return _bfd_no_cleanup;
    638 
    639   /* The architecture is encoded in various ways in various a.out variants,
    640      or is not encoded at all in some of them.  The relocation size depends
    641      on the architecture and the a.out variant.  Finally, the return value
    642      is the bfd_target vector in use.  If an error occurs, return zero and
    643      set bfd_error to the appropriate error code.
    644 
    645      Formats such as b.out, which have additional fields in the a.out
    646      header, should cope with them in this callback as well.  */
    647 #endif	/* DOCUMENTATION */
    648 
    649   cleanup = (*callback_to_real_object_p)(abfd);
    650 
    651   /* Now that the segment addresses have been worked out, take a better
    652      guess at whether the file is executable.  If the entry point
    653      is within the text segment, assume it is.  (This makes files
    654      executable even if their entry point address is 0, as long as
    655      their text starts at zero.).
    656 
    657      This test had to be changed to deal with systems where the text segment
    658      runs at a different location than the default.  The problem is that the
    659      entry address can appear to be outside the text segment, thus causing an
    660      erroneous conclusion that the file isn't executable.
    661 
    662      To fix this, we now accept any non-zero entry point as an indication of
    663      executability.  This will work most of the time, since only the linker
    664      sets the entry point, and that is likely to be non-zero for most systems. */
    665 
    666   if (execp->a_entry != 0
    667       || (execp->a_entry >= obj_textsec (abfd)->vma
    668 	  && execp->a_entry < (obj_textsec (abfd)->vma
    669 			       + obj_textsec (abfd)->size)
    670 	  && execp->a_trsize == 0
    671 	  && execp->a_drsize == 0))
    672     abfd->flags |= EXEC_P;
    673 #ifdef STAT_FOR_EXEC
    674   else
    675     {
    676       struct stat stat_buf;
    677 
    678       /* The original heuristic doesn't work in some important cases.
    679 	The a.out file has no information about the text start
    680 	address.  For files (like kernels) linked to non-standard
    681 	addresses (ld -Ttext nnn) the entry point may not be between
    682 	the default text start (obj_textsec(abfd)->vma) and
    683 	(obj_textsec(abfd)->vma) + text size.  This is not just a mach
    684 	issue.  Many kernels are loaded at non standard addresses.  */
    685       if (abfd->iostream != NULL
    686 	  && (abfd->flags & BFD_IN_MEMORY) == 0
    687 	  && (fstat(fileno((FILE *) (abfd->iostream)), &stat_buf) == 0)
    688 	  && ((stat_buf.st_mode & 0111) != 0))
    689 	abfd->flags |= EXEC_P;
    690     }
    691 #endif /* STAT_FOR_EXEC */
    692 
    693   if (!cleanup)
    694     {
    695       free (rawptr);
    696       abfd->tdata.aout_data = oldrawptr;
    697     }
    698   return cleanup;
    699 }
    700 
    701 /* Initialize ABFD for use with a.out files.  */
    702 
    703 bool
    704 NAME (aout, mkobject) (bfd *abfd)
    705 {
    706   struct aout_data_struct  *rawptr;
    707   size_t amt = sizeof (struct aout_data_struct);
    708 
    709   bfd_set_error (bfd_error_system_call);
    710 
    711   /* Use an intermediate variable for clarity.  */
    712   rawptr = bfd_zalloc (abfd, amt);
    713 
    714   if (rawptr == NULL)
    715     return false;
    716 
    717   abfd->tdata.aout_data = rawptr;
    718   exec_hdr (abfd) = &(rawptr->e);
    719 
    720   obj_textsec (abfd) = NULL;
    721   obj_datasec (abfd) = NULL;
    722   obj_bsssec (abfd)  = NULL;
    723 
    724   return true;
    725 }
    726 
    727 /* Keep track of machine architecture and machine type for
    728    a.out's. Return the <<machine_type>> for a particular
    729    architecture and machine, or <<M_UNKNOWN>> if that exact architecture
    730    and machine can't be represented in a.out format.
    731 
    732    If the architecture is understood, machine type 0 (default)
    733    is always understood.  */
    734 
    735 enum machine_type
    736 NAME (aout, machine_type) (enum bfd_architecture arch,
    737 			   unsigned long machine,
    738 			   bool *unknown)
    739 {
    740   enum machine_type arch_flags;
    741 
    742   arch_flags = M_UNKNOWN;
    743   *unknown = true;
    744 
    745   switch (arch)
    746     {
    747     case bfd_arch_sparc:
    748       if (machine == 0
    749 	  || machine == bfd_mach_sparc
    750 	  || machine == bfd_mach_sparc_sparclite
    751 	  || machine == bfd_mach_sparc_v9)
    752 	arch_flags = M_SPARC;
    753       else if (machine == bfd_mach_sparc_sparclet)
    754 	arch_flags = M_SPARCLET;
    755       break;
    756 
    757     case bfd_arch_i386:
    758       if (machine == 0
    759 	  || machine == bfd_mach_i386_i386
    760 	  || machine == bfd_mach_i386_i386_intel_syntax)
    761 	arch_flags = M_386;
    762       break;
    763 
    764     case bfd_arch_arm:
    765       if (machine == 0)	arch_flags = M_ARM;
    766       break;
    767 
    768     case bfd_arch_mips:
    769       switch (machine)
    770 	{
    771 	case 0:
    772 	case 2000:
    773 	case bfd_mach_mips3000:
    774 	  arch_flags = M_MIPS1;
    775 	  break;
    776 	case bfd_mach_mips4000: /* MIPS3 */
    777 	case bfd_mach_mips4400:
    778 	case bfd_mach_mips8000: /* MIPS4 */
    779 	case bfd_mach_mips6000: /* Real MIPS2: */
    780 	  arch_flags = M_MIPS2;
    781 	  break;
    782 	default:
    783 	  arch_flags = M_UNKNOWN;
    784 	  break;
    785 	}
    786       break;
    787 
    788     case bfd_arch_ns32k:
    789       switch (machine)
    790 	{
    791 	case 0:			arch_flags = M_NS32532; break;
    792 	case 32032:		arch_flags = M_NS32032; break;
    793 	case 32532:		arch_flags = M_NS32532; break;
    794 	default:		arch_flags = M_UNKNOWN; break;
    795 	}
    796       break;
    797 
    798     case bfd_arch_pdp11:
    799       /* TODO: arch_flags = M_PDP11; */
    800       *unknown = false;
    801       break;
    802 
    803     case bfd_arch_vax:
    804       *unknown = false;
    805       break;
    806 
    807     default:
    808       arch_flags = M_UNKNOWN;
    809     }
    810 
    811   if (arch_flags != M_UNKNOWN)
    812     *unknown = false;
    813 
    814   return arch_flags;
    815 }
    816 
    817 /* Set the architecture and the machine of the ABFD to the
    818    values ARCH and MACHINE.  Verify that @ABFD's format
    819    can support the architecture required.  */
    820 
    821 bool
    822 NAME (aout, set_arch_mach) (bfd *abfd,
    823 			    enum bfd_architecture arch,
    824 			    unsigned long machine)
    825 {
    826   if (! bfd_default_set_arch_mach (abfd, arch, machine))
    827     return false;
    828 
    829   if (arch != bfd_arch_unknown)
    830     {
    831       bool unknown;
    832 
    833       NAME (aout, machine_type) (arch, machine, &unknown);
    834       if (unknown)
    835 	return false;
    836     }
    837 
    838   obj_reloc_entry_size (abfd) = RELOC_SIZE;
    839 
    840   return (*aout_backend_info(abfd)->set_sizes) (abfd);
    841 }
    842 
    843 static void
    844 adjust_o_magic (bfd *abfd, struct internal_exec *execp)
    845 {
    846   file_ptr pos = adata (abfd).exec_bytes_size;
    847   bfd_vma vma = 0;
    848   int pad = 0;
    849   asection *text = obj_textsec (abfd);
    850   asection *data = obj_datasec (abfd);
    851   asection *bss = obj_bsssec (abfd);
    852 
    853   /* Text.  */
    854   text->filepos = pos;
    855   if (!text->user_set_vma)
    856     text->vma = vma;
    857   else
    858     vma = text->vma;
    859 
    860   pos += execp->a_text;
    861   vma += execp->a_text;
    862 
    863   /* Data.  */
    864   if (!data->user_set_vma)
    865     {
    866       pos += pad;
    867       vma += pad;
    868       data->vma = vma;
    869     }
    870   else
    871     vma = data->vma;
    872   execp->a_text += pad;
    873 
    874   data->filepos = pos;
    875   pos += data->size;
    876   vma += data->size;
    877 
    878   /* BSS.  */
    879   if (!bss->user_set_vma)
    880     {
    881       pos += pad;
    882       vma += pad;
    883       bss->vma = vma;
    884     }
    885   else if (data->size > 0 || bss->size > 0) /* PR25677: for objcopy --extract-symbol */
    886     {
    887       /* The VMA of the .bss section is set by the VMA of the
    888 	 .data section plus the size of the .data section.  We may
    889 	 need to add padding bytes to make this true.  */
    890       pad = bss->vma - vma;
    891       if (pad < 0)
    892 	pad = 0;
    893       pos += pad;
    894     }
    895   execp->a_data = data->size + pad;
    896   bss->filepos = pos;
    897   execp->a_bss = bss->size;
    898 
    899   N_SET_MAGIC (execp, OMAGIC);
    900 }
    901 
    902 static void
    903 adjust_z_magic (bfd *abfd, struct internal_exec *execp)
    904 {
    905   bfd_size_type data_pad, text_pad;
    906   file_ptr text_end;
    907   const struct aout_backend_data *abdp;
    908   /* TRUE if text includes exec header.  */
    909   bool ztih;
    910   asection *text = obj_textsec (abfd);
    911   asection *data = obj_datasec (abfd);
    912   asection *bss = obj_bsssec (abfd);
    913 
    914   abdp = aout_backend_info (abfd);
    915 
    916   /* Text.  */
    917   ztih = (abdp != NULL
    918 	  && (abdp->text_includes_header
    919 	      || obj_aout_subformat (abfd) == q_magic_format));
    920   text->filepos = (ztih
    921 		   ? adata (abfd).exec_bytes_size
    922 		   : adata (abfd).zmagic_disk_block_size);
    923   if (!text->user_set_vma)
    924     {
    925       /* ?? Do we really need to check for relocs here?  */
    926       text->vma = ((abfd->flags & HAS_RELOC)
    927 		   ? 0
    928 		   : (ztih
    929 		      ? abdp->default_text_vma + adata (abfd).exec_bytes_size
    930 		      : abdp->default_text_vma));
    931       text_pad = 0;
    932     }
    933   else
    934     {
    935       /* The .text section is being loaded at an unusual address.  We
    936 	 may need to pad it such that the .data section starts at a page
    937 	 boundary.  */
    938       if (ztih)
    939 	text_pad = ((text->filepos - text->vma)
    940 		    & (adata (abfd).page_size - 1));
    941       else
    942 	text_pad = (-text->vma
    943 		    & (adata (abfd).page_size - 1));
    944     }
    945 
    946   /* Find start of data.  */
    947   if (ztih)
    948     {
    949       text_end = text->filepos + execp->a_text;
    950       text_pad += BFD_ALIGN (text_end, adata (abfd).page_size) - text_end;
    951     }
    952   else
    953     {
    954       /* Note that if page_size == zmagic_disk_block_size, then
    955 	 filepos == page_size, and this case is the same as the ztih
    956 	 case.  */
    957       text_end = execp->a_text;
    958       text_pad += BFD_ALIGN (text_end, adata (abfd).page_size) - text_end;
    959       text_end += text->filepos;
    960     }
    961   execp->a_text += text_pad;
    962 
    963   /* Data.  */
    964   if (!data->user_set_vma)
    965     {
    966       bfd_vma vma;
    967       vma = text->vma + execp->a_text;
    968       data->vma = BFD_ALIGN (vma, adata (abfd).segment_size);
    969     }
    970   if (abdp && abdp->zmagic_mapped_contiguous)
    971     {
    972       text_pad = data->vma - (text->vma + execp->a_text);
    973       /* Only pad the text section if the data
    974 	 section is going to be placed after it.  */
    975       if (text_pad > 0)
    976 	execp->a_text += text_pad;
    977     }
    978   data->filepos = text->filepos + execp->a_text;
    979 
    980   /* Fix up exec header while we're at it.  */
    981   if (ztih && (!abdp || (abdp && !abdp->exec_header_not_counted)))
    982     execp->a_text += adata (abfd).exec_bytes_size;
    983   N_SET_MAGIC (execp, ZMAGIC);
    984 
    985   /* Spec says data section should be rounded up to page boundary.  */
    986   execp->a_data = align_power (data->size, bss->alignment_power);
    987   execp->a_data = BFD_ALIGN (execp->a_data, adata (abfd).page_size);
    988   data_pad = execp->a_data - data->size;
    989 
    990   /* BSS.  */
    991   if (!bss->user_set_vma)
    992     bss->vma = data->vma + execp->a_data;
    993   /* If the BSS immediately follows the data section and extra space
    994      in the page is left after the data section, fudge data
    995      in the header so that the bss section looks smaller by that
    996      amount.  We'll start the bss section there, and lie to the OS.
    997      (Note that a linker script, as well as the above assignment,
    998      could have explicitly set the BSS vma to immediately follow
    999      the data section.)  */
   1000   if (align_power (bss->vma, bss->alignment_power) == data->vma + execp->a_data)
   1001     execp->a_bss = data_pad > bss->size ? 0 : bss->size - data_pad;
   1002   else
   1003     execp->a_bss = bss->size;
   1004 }
   1005 
   1006 static void
   1007 adjust_n_magic (bfd *abfd, struct internal_exec *execp)
   1008 {
   1009   file_ptr pos = adata (abfd).exec_bytes_size;
   1010   bfd_vma vma = 0;
   1011   int pad;
   1012   asection *text = obj_textsec (abfd);
   1013   asection *data = obj_datasec (abfd);
   1014   asection *bss = obj_bsssec (abfd);
   1015 
   1016   /* Text.  */
   1017   text->filepos = pos;
   1018   if (!text->user_set_vma)
   1019     text->vma = vma;
   1020   else
   1021     vma = text->vma;
   1022   pos += execp->a_text;
   1023   vma += execp->a_text;
   1024 
   1025   /* Data.  */
   1026   data->filepos = pos;
   1027   if (!data->user_set_vma)
   1028     data->vma = BFD_ALIGN (vma, adata (abfd).segment_size);
   1029   vma = data->vma;
   1030 
   1031   /* Since BSS follows data immediately, see if it needs alignment.  */
   1032   vma += data->size;
   1033   pad = align_power (vma, bss->alignment_power) - vma;
   1034   execp->a_data = data->size + pad;
   1035   pos += execp->a_data;
   1036 
   1037   /* BSS.  */
   1038   if (!bss->user_set_vma)
   1039     bss->vma = vma;
   1040   else
   1041     vma = bss->vma;
   1042 
   1043   /* Fix up exec header.  */
   1044   execp->a_bss = bss->size;
   1045   N_SET_MAGIC (execp, NMAGIC);
   1046 }
   1047 
   1048 static void
   1049 adjust_i_magic (bfd *abfd, struct internal_exec *execp)
   1050 {
   1051   file_ptr pos = adata (abfd).exec_bytes_size;
   1052   bfd_vma vma = 0;
   1053   int pad;
   1054   asection *text = obj_textsec (abfd);
   1055   asection *data = obj_datasec (abfd);
   1056   asection *bss = obj_bsssec (abfd);
   1057 
   1058   /* Text.  */
   1059   text->filepos = pos;
   1060   if (!text->user_set_vma)
   1061     text->vma = vma;
   1062   else
   1063     vma = text->vma;
   1064   pos += execp->a_text;
   1065 
   1066   /* Data.  */
   1067   data->filepos = pos;
   1068   if (!data->user_set_vma)
   1069     data->vma = 0;
   1070   vma = data->vma;
   1071 
   1072   /* Since BSS follows data immediately, see if it needs alignment.  */
   1073   vma += data->size;
   1074   pad = align_power (vma, bss->alignment_power) - vma;
   1075   execp->a_data = data->size + pad;
   1076   pos += execp->a_data;
   1077 
   1078   /* BSS.  */
   1079   if (!bss->user_set_vma)
   1080     bss->vma = vma;
   1081   else
   1082     vma = bss->vma;
   1083 
   1084   /* Fix up exec header.  */
   1085   execp->a_bss = bss->size;
   1086   N_SET_MAGIC (execp, IMAGIC);
   1087 }
   1088 
   1089 bool
   1090 NAME (aout, adjust_sizes_and_vmas) (bfd *abfd)
   1091 {
   1092   struct internal_exec *execp = exec_hdr (abfd);
   1093 
   1094   if (! NAME (aout, make_sections) (abfd))
   1095     return false;
   1096 
   1097   if (adata (abfd).magic != undecided_magic)
   1098     return true;
   1099 
   1100   execp->a_text = align_power (obj_textsec (abfd)->size,
   1101 			       obj_textsec (abfd)->alignment_power);
   1102 
   1103   /* Rule (heuristic) for when to pad to a new page.  Note that there
   1104      are (at least) two ways demand-paged (ZMAGIC) files have been
   1105      handled.  Most Berkeley-based systems start the text segment at
   1106      (TARGET_PAGE_SIZE).  However, newer versions of SUNOS start the text
   1107      segment right after the exec header; the latter is counted in the
   1108      text segment size, and is paged in by the kernel with the rest of
   1109      the text.  */
   1110 
   1111   /* This perhaps isn't the right way to do this, but made it simpler for me
   1112      to understand enough to implement it.  Better would probably be to go
   1113      right from BFD flags to alignment/positioning characteristics.  But the
   1114      old code was sloppy enough about handling the flags, and had enough
   1115      other magic, that it was a little hard for me to understand.  I think
   1116      I understand it better now, but I haven't time to do the cleanup this
   1117      minute.  */
   1118 
   1119   if (separate_i_d)
   1120     adata (abfd).magic = i_magic;
   1121   else if (abfd->flags & WP_TEXT)
   1122     adata (abfd).magic = n_magic;
   1123   else
   1124     adata (abfd).magic = o_magic;
   1125 
   1126 #ifdef BFD_AOUT_DEBUG /* requires gcc2 */
   1127 #if __GNUC__ >= 2
   1128   fprintf (stderr, "%s text=<%x,%x,%x> data=<%x,%x,%x> bss=<%x,%x,%x>\n",
   1129 	   ({ char *str;
   1130 	      switch (adata (abfd).magic)
   1131 		{
   1132 		case n_magic: str = "NMAGIC"; break;
   1133 		case o_magic: str = "OMAGIC"; break;
   1134 		case i_magic: str = "IMAGIC"; break;
   1135 		case z_magic: str = "ZMAGIC"; break;
   1136 		default: abort ();
   1137 		}
   1138 	      str;
   1139 	    }),
   1140 	   obj_textsec (abfd)->vma, obj_textsec (abfd)->size,
   1141 		obj_textsec (abfd)->alignment_power,
   1142 	   obj_datasec (abfd)->vma, obj_datasec (abfd)->size,
   1143 		obj_datasec (abfd)->alignment_power,
   1144 	   obj_bsssec (abfd)->vma, obj_bsssec (abfd)->size,
   1145 		obj_bsssec (abfd)->alignment_power);
   1146 #endif
   1147 #endif
   1148 
   1149   switch (adata (abfd).magic)
   1150     {
   1151     case o_magic:
   1152       adjust_o_magic (abfd, execp);
   1153       break;
   1154     case z_magic:
   1155       adjust_z_magic (abfd, execp);
   1156       break;
   1157     case n_magic:
   1158       adjust_n_magic (abfd, execp);
   1159       break;
   1160     case i_magic:
   1161       adjust_i_magic (abfd, execp);
   1162       break;
   1163     default:
   1164       abort ();
   1165     }
   1166 
   1167 #ifdef BFD_AOUT_DEBUG
   1168   fprintf (stderr, "       text=<%x,%x,%x> data=<%x,%x,%x> bss=<%x,%x>\n",
   1169 	   obj_textsec (abfd)->vma, execp->a_text,
   1170 		obj_textsec (abfd)->filepos,
   1171 	   obj_datasec (abfd)->vma, execp->a_data,
   1172 		obj_datasec (abfd)->filepos,
   1173 	   obj_bsssec (abfd)->vma, execp->a_bss);
   1174 #endif
   1175 
   1176   return true;
   1177 }
   1178 
   1179 /* Called by the BFD in response to a bfd_make_section request.  */
   1180 
   1181 bool
   1182 NAME (aout, new_section_hook) (bfd *abfd, asection *newsect)
   1183 {
   1184   /* Align to double at least.  */
   1185   newsect->alignment_power = bfd_get_arch_info(abfd)->section_align_power;
   1186 
   1187   if (bfd_get_format (abfd) == bfd_object)
   1188     {
   1189       if (obj_textsec (abfd) == NULL
   1190 	  && !strcmp (newsect->name, ".text"))
   1191 	{
   1192 	  obj_textsec(abfd)= newsect;
   1193 	  newsect->target_index = N_TEXT;
   1194 	}
   1195       else if (obj_datasec (abfd) == NULL
   1196 	       && !strcmp (newsect->name, ".data"))
   1197 	{
   1198 	  obj_datasec (abfd) = newsect;
   1199 	  newsect->target_index = N_DATA;
   1200 	}
   1201       else if (obj_bsssec (abfd) == NULL
   1202 	       && !strcmp (newsect->name, ".bss"))
   1203 	{
   1204 	  obj_bsssec (abfd) = newsect;
   1205 	  newsect->target_index = N_BSS;
   1206 	}
   1207     }
   1208 
   1209   /* We allow more than three sections internally.  */
   1210   return _bfd_generic_new_section_hook (abfd, newsect);
   1211 }
   1212 
   1213 bool
   1214 NAME (aout, set_section_contents) (bfd *abfd,
   1215 				   sec_ptr section,
   1216 				   const void * location,
   1217 				   file_ptr offset,
   1218 				   bfd_size_type count)
   1219 {
   1220   if (! abfd->output_has_begun)
   1221     {
   1222       if (! NAME (aout, adjust_sizes_and_vmas) (abfd))
   1223 	return false;
   1224     }
   1225 
   1226   if (section == obj_bsssec (abfd))
   1227     {
   1228       bfd_set_error (bfd_error_no_contents);
   1229       return false;
   1230     }
   1231 
   1232   if (section != obj_textsec (abfd)
   1233       && section != obj_datasec (abfd))
   1234     {
   1235       _bfd_error_handler
   1236 	/* xgettext:c-format */
   1237 	(_("%pB: can not represent section `%pA' in a.out object file format"),
   1238 	 abfd, section);
   1239       bfd_set_error (bfd_error_nonrepresentable_section);
   1240       return false;
   1241     }
   1242 
   1243   if (count != 0)
   1244     {
   1245       if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
   1246 	  || bfd_write (location, count, abfd) != count)
   1247 	return false;
   1248     }
   1249 
   1250   return true;
   1251 }
   1252 
   1253 /* Read the external symbols from an a.out file.  */
   1255 
   1256 static bool
   1257 aout_get_external_symbols (bfd *abfd)
   1258 {
   1259   if (obj_aout_external_syms (abfd) == NULL)
   1260     {
   1261       bfd_size_type count;
   1262       struct external_nlist *syms;
   1263 
   1264       count = exec_hdr (abfd)->a_syms / EXTERNAL_NLIST_SIZE;
   1265 
   1266       /* PR 17512: file: 011f5a08.  */
   1267       if (count == 0)
   1268 	{
   1269 	  obj_aout_external_syms (abfd) = NULL;
   1270 	  obj_aout_external_sym_count (abfd) = count;
   1271 	  return true;
   1272 	}
   1273 
   1274 #ifdef USE_MMAP
   1275       if (! bfd_get_file_window (abfd, obj_sym_filepos (abfd),
   1276 				 exec_hdr (abfd)->a_syms,
   1277 				 &obj_aout_sym_window (abfd), true))
   1278 	return false;
   1279       syms = (struct external_nlist *) obj_aout_sym_window (abfd).data;
   1280 #else
   1281       /* We allocate using malloc to make the values easy to free
   1282 	 later on.  If we put them on the objalloc it might not be
   1283 	 possible to free them.  */
   1284       if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0)
   1285 	return false;
   1286       syms = (struct external_nlist *)
   1287 	_bfd_malloc_and_read (abfd, count * EXTERNAL_NLIST_SIZE,
   1288 			      count * EXTERNAL_NLIST_SIZE);
   1289       if (syms == NULL)
   1290 	return false;
   1291 #endif
   1292 
   1293       obj_aout_external_syms (abfd) = syms;
   1294       obj_aout_external_sym_count (abfd) = count;
   1295     }
   1296 
   1297   if (obj_aout_external_strings (abfd) == NULL
   1298       && exec_hdr (abfd)->a_syms != 0)
   1299     {
   1300       unsigned char string_chars[BYTES_IN_LONG];
   1301       bfd_size_type stringsize;
   1302       char *strings;
   1303       bfd_size_type amt = BYTES_IN_LONG;
   1304 
   1305       /* Get the size of the strings.  */
   1306       if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0
   1307 	  || bfd_read (string_chars, amt, abfd) != amt)
   1308 	return false;
   1309       stringsize = H_GET_32 (abfd, string_chars);
   1310       if (stringsize == 0)
   1311 	stringsize = 1;
   1312       else if (stringsize < BYTES_IN_LONG
   1313 	       || (size_t) stringsize != stringsize)
   1314 	{
   1315 	  bfd_set_error (bfd_error_bad_value);
   1316 	  return false;
   1317 	}
   1318 
   1319 #ifdef USE_MMAP
   1320       if (stringsize >= BYTES_IN_LONG)
   1321 	{
   1322 	  if (! bfd_get_file_window (abfd, obj_str_filepos (abfd), stringsize + 1,
   1323 				     &obj_aout_string_window (abfd), true))
   1324 	    return false;
   1325 	  strings = (char *) obj_aout_string_window (abfd).data;
   1326 	}
   1327       else
   1328 #endif
   1329 	{
   1330 	  strings = (char *) bfd_malloc (stringsize + 1);
   1331 	  if (strings == NULL)
   1332 	    return false;
   1333 
   1334 	  if (stringsize >= BYTES_IN_LONG)
   1335 	    {
   1336 	      amt = stringsize - BYTES_IN_LONG;
   1337 	      if (bfd_read (strings + BYTES_IN_LONG, amt, abfd) != amt)
   1338 		{
   1339 		  free (strings);
   1340 		  return false;
   1341 		}
   1342 	    }
   1343 	}
   1344       /* Ensure that a zero index yields an empty string.  */
   1345       if (stringsize >= BYTES_IN_WORD)
   1346 	memset (strings, 0, BYTES_IN_LONG);
   1347 
   1348       /* Ensure that the string buffer is NUL terminated.  */
   1349       strings[stringsize] = 0;
   1350 
   1351       obj_aout_external_strings (abfd) = strings;
   1352       obj_aout_external_string_size (abfd) = stringsize;
   1353     }
   1354 
   1355   return true;
   1356 }
   1357 
   1358 /* Translate an a.out symbol into a BFD symbol.  The desc, other, type
   1359    and symbol->value fields of CACHE_PTR will be set from the a.out
   1360    nlist structure.  This function is responsible for setting
   1361    symbol->flags and symbol->section, and adjusting symbol->value.  */
   1362 
   1363 static bool
   1364 translate_from_native_sym_flags (bfd *abfd,
   1365 				 aout_symbol_type *cache_ptr)
   1366 {
   1367   flagword visible;
   1368 
   1369   if (is_stab (cache_ptr->type, cache_ptr->symbol.name))
   1370     {
   1371       asection *sec;
   1372 
   1373       /* This is a debugging symbol.  */
   1374       cache_ptr->symbol.flags = BSF_DEBUGGING;
   1375 
   1376       /* Work out the symbol section.  */
   1377       switch (cache_ptr->type)
   1378 	{
   1379 	case N_SO:
   1380 	case N_SOL:
   1381 	case N_FUN:
   1382 	case N_ENTRY:
   1383 	case N_SLINE:
   1384 	case N_FN:
   1385 	  sec = obj_textsec (abfd);
   1386 	  break;
   1387 	case N_STSYM:
   1388 	case N_DSLINE:
   1389 	  sec = obj_datasec (abfd);
   1390 	  break;
   1391 	case N_LCSYM:
   1392 	case N_BSLINE:
   1393 	  sec = obj_bsssec (abfd);
   1394 	  break;
   1395 	default:
   1396 	  sec = bfd_abs_section_ptr;
   1397 	  break;
   1398 	}
   1399 
   1400       cache_ptr->symbol.section = sec;
   1401       cache_ptr->symbol.value -= sec->vma;
   1402 
   1403       return true;
   1404     }
   1405 
   1406   /* Get the default visibility.  This does not apply to all types, so
   1407      we just hold it in a local variable to use if wanted.  */
   1408   if ((cache_ptr->type & N_EXT) == 0)
   1409     visible = BSF_LOCAL;
   1410   else
   1411     visible = BSF_GLOBAL;
   1412 
   1413   switch (cache_ptr->type)
   1414     {
   1415     default:
   1416     case N_ABS: case N_ABS | N_EXT:
   1417       cache_ptr->symbol.section = bfd_abs_section_ptr;
   1418       cache_ptr->symbol.flags = visible;
   1419       break;
   1420 
   1421     case N_UNDF | N_EXT:
   1422       if (cache_ptr->symbol.value != 0)
   1423 	{
   1424 	  /* This is a common symbol.  */
   1425 	  cache_ptr->symbol.flags = BSF_GLOBAL;
   1426 	  cache_ptr->symbol.section = bfd_com_section_ptr;
   1427 	}
   1428       else
   1429 	{
   1430 	  cache_ptr->symbol.flags = 0;
   1431 	  cache_ptr->symbol.section = bfd_und_section_ptr;
   1432 	}
   1433       break;
   1434 
   1435     case N_TEXT: case N_TEXT | N_EXT:
   1436       cache_ptr->symbol.section = obj_textsec (abfd);
   1437       cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
   1438       cache_ptr->symbol.flags = visible;
   1439       break;
   1440 
   1441     case N_DATA: case N_DATA | N_EXT:
   1442       cache_ptr->symbol.section = obj_datasec (abfd);
   1443       cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
   1444       cache_ptr->symbol.flags = visible;
   1445       break;
   1446 
   1447     case N_BSS: case N_BSS | N_EXT:
   1448       cache_ptr->symbol.section = obj_bsssec (abfd);
   1449       cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
   1450       cache_ptr->symbol.flags = visible;
   1451       break;
   1452     }
   1453 
   1454   return true;
   1455 }
   1456 
   1457 /* Set the fields of SYM_POINTER according to CACHE_PTR.  */
   1458 
   1459 static bool
   1460 translate_to_native_sym_flags (bfd *abfd,
   1461 			       asymbol *cache_ptr,
   1462 			       struct external_nlist *sym_pointer)
   1463 {
   1464   bfd_vma value = cache_ptr->value;
   1465   asection *sec;
   1466   bfd_vma off;
   1467   const char *name = cache_ptr->name != NULL ? cache_ptr->name : "*unknown*";
   1468 
   1469   /* Mask out any existing type bits in case copying from one section
   1470      to another.  */
   1471   if (!is_stab (sym_pointer->e_type[0], name))
   1472     sym_pointer->e_type[0] &= ~N_TYPE;
   1473 
   1474   sec = bfd_asymbol_section (cache_ptr);
   1475   off = 0;
   1476 
   1477   if (sec == NULL)
   1478     {
   1479       /* This case occurs, e.g., for the *DEBUG* section of a COFF
   1480 	 file.  */
   1481       _bfd_error_handler
   1482 	/* xgettext:c-format */
   1483 	(_("%pB: can not represent section for symbol `%s' in a.out object file format"),
   1484 	 abfd, name);
   1485       bfd_set_error (bfd_error_nonrepresentable_section);
   1486       return false;
   1487     }
   1488 
   1489   if (sec->output_section != NULL)
   1490     {
   1491       off = sec->output_offset;
   1492       sec = sec->output_section;
   1493     }
   1494 
   1495   if (bfd_is_abs_section (sec))
   1496     sym_pointer->e_type[0] |= N_ABS;
   1497   else if (sec == obj_textsec (abfd))
   1498     sym_pointer->e_type[0] |= N_TEXT;
   1499   else if (sec == obj_datasec (abfd))
   1500     sym_pointer->e_type[0] |= N_DATA;
   1501   else if (sec == obj_bsssec (abfd))
   1502     sym_pointer->e_type[0] |= N_BSS;
   1503   else if (bfd_is_und_section (sec))
   1504     sym_pointer->e_type[0] = N_UNDF | N_EXT;
   1505   else if (bfd_is_com_section (sec))
   1506     sym_pointer->e_type[0] = N_UNDF | N_EXT;
   1507   else
   1508     {
   1509       _bfd_error_handler
   1510 	/* xgettext:c-format */
   1511 	(_("%pB: can not represent section `%pA' in a.out object file format"),
   1512 	 abfd, sec);
   1513       bfd_set_error (bfd_error_nonrepresentable_section);
   1514       return false;
   1515     }
   1516 
   1517   /* Turn the symbol from section relative to absolute again */
   1518   value += sec->vma + off;
   1519 
   1520   if ((cache_ptr->flags & BSF_DEBUGGING) != 0)
   1521     sym_pointer->e_type[0] = ((aout_symbol_type *) cache_ptr)->type;
   1522   else if ((cache_ptr->flags & BSF_GLOBAL) != 0)
   1523     sym_pointer->e_type[0] |= N_EXT;
   1524 
   1525   PUT_WORD(abfd, value, sym_pointer->e_value);
   1526 
   1527   return true;
   1528 }
   1529 
   1530 /* Native-level interface to symbols. */
   1532 
   1533 asymbol *
   1534 NAME (aout, make_empty_symbol) (bfd *abfd)
   1535 {
   1536   size_t amt = sizeof (aout_symbol_type);
   1537   aout_symbol_type *new_symbol_type = bfd_zalloc (abfd, amt);
   1538 
   1539   if (!new_symbol_type)
   1540     return NULL;
   1541   new_symbol_type->symbol.the_bfd = abfd;
   1542 
   1543   return &new_symbol_type->symbol;
   1544 }
   1545 
   1546 /* Translate a set of external symbols into internal symbols.  */
   1547 
   1548 bool
   1549 NAME (aout, translate_symbol_table) (bfd *abfd,
   1550 				     aout_symbol_type *in,
   1551 				     struct external_nlist *ext,
   1552 				     bfd_size_type count,
   1553 				     char *str,
   1554 				     bfd_size_type strsize,
   1555 				     bool dynamic)
   1556 {
   1557   struct external_nlist *ext_end;
   1558 
   1559   ext_end = ext + count;
   1560   for (; ext < ext_end; ext++, in++)
   1561     {
   1562       bfd_vma x;
   1563       int ovly;
   1564 
   1565       x = GET_WORD (abfd, ext->e_strx);
   1566       in->symbol.the_bfd = abfd;
   1567 
   1568       /* For the normal symbols, the zero index points at the number
   1569 	 of bytes in the string table but is to be interpreted as the
   1570 	 null string.  For the dynamic symbols, the number of bytes in
   1571 	 the string table is stored in the __DYNAMIC structure and the
   1572 	 zero index points at an actual string.  */
   1573       if (x == 0 && ! dynamic)
   1574 	in->symbol.name = "";
   1575       else if (x < strsize)
   1576 	in->symbol.name = str + x;
   1577       else
   1578 	{
   1579 	  _bfd_error_handler
   1580 	    (_("%pB: invalid string offset %" PRIu64 " >= %" PRIu64),
   1581 	     abfd, (uint64_t) x, (uint64_t) strsize);
   1582 	  bfd_set_error (bfd_error_bad_value);
   1583 	  return false;
   1584 	}
   1585 
   1586       ovly = H_GET_8 (abfd, ext->e_ovly);
   1587       if (ovly != 0)
   1588 	{
   1589 	  _bfd_error_handler
   1590 	    (_("%pB: symbol indicates overlay (not supported)"), abfd);
   1591 	  bfd_set_error (bfd_error_bad_value);
   1592 	  return false;
   1593 	}
   1594 
   1595       in->symbol.value = GET_WORD (abfd,  ext->e_value);
   1596       /* e_desc is zero for normal symbols but for .stab symbols it
   1597 	 carries the desc field in our extended 2.11BSD format. */
   1598       in->desc = H_GET_16 (abfd, ext->e_desc);
   1599       in->other = 0;
   1600       in->type = H_GET_8 (abfd,  ext->e_type);
   1601       in->symbol.udata.p = NULL;
   1602 
   1603       if (! translate_from_native_sym_flags (abfd, in))
   1604 	return false;
   1605 
   1606       if (dynamic)
   1607 	in->symbol.flags |= BSF_DYNAMIC;
   1608     }
   1609 
   1610   return true;
   1611 }
   1612 
   1613 /* We read the symbols into a buffer, which is discarded when this
   1614    function exits.  We read the strings into a buffer large enough to
   1615    hold them all plus all the cached symbol entries.  */
   1616 
   1617 bool
   1618 NAME (aout, slurp_symbol_table) (bfd *abfd)
   1619 {
   1620   struct external_nlist *old_external_syms;
   1621   aout_symbol_type *cached;
   1622   bfd_size_type cached_size;
   1623 
   1624   /* If there's no work to be done, don't do any.  */
   1625   if (obj_aout_symbols (abfd) != NULL)
   1626     return true;
   1627 
   1628   old_external_syms = obj_aout_external_syms (abfd);
   1629 
   1630   if (! aout_get_external_symbols (abfd))
   1631     return false;
   1632 
   1633   cached_size = obj_aout_external_sym_count (abfd);
   1634   cached_size *= sizeof (aout_symbol_type);
   1635   cached = bfd_zmalloc (cached_size);
   1636   if (cached == NULL && cached_size != 0)
   1637     return false;
   1638 
   1639   /* Convert from external symbol information to internal.  */
   1640   if (! (NAME (aout, translate_symbol_table)
   1641 	 (abfd, cached,
   1642 	  obj_aout_external_syms (abfd),
   1643 	  obj_aout_external_sym_count (abfd),
   1644 	  obj_aout_external_strings (abfd),
   1645 	  obj_aout_external_string_size (abfd),
   1646 	  false)))
   1647     {
   1648       free (cached);
   1649       return false;
   1650     }
   1651 
   1652   abfd->symcount = obj_aout_external_sym_count (abfd);
   1653 
   1654   obj_aout_symbols (abfd) = cached;
   1655 
   1656   /* It is very likely that anybody who calls this function will not
   1657      want the external symbol information, so if it was allocated
   1658      because of our call to aout_get_external_symbols, we free it up
   1659      right away to save space.  */
   1660   if (old_external_syms == NULL
   1661       && obj_aout_external_syms (abfd) != NULL)
   1662     {
   1663 #ifdef USE_MMAP
   1664       bfd_free_window (&obj_aout_sym_window (abfd));
   1665 #else
   1666       free (obj_aout_external_syms (abfd));
   1667 #endif
   1668       obj_aout_external_syms (abfd) = NULL;
   1669     }
   1670 
   1671   return true;
   1672 }
   1673 
   1674 /* We use a hash table when writing out symbols so that we only write
   1676    out a particular string once.  This helps particularly when the
   1677    linker writes out stabs debugging entries, because each different
   1678    contributing object file tends to have many duplicate stabs
   1679    strings.
   1680 
   1681    This hash table code breaks dbx on SunOS 4.1.3, so we don't do it
   1682    if BFD_TRADITIONAL_FORMAT is set.  */
   1683 
   1684 /* Get the index of a string in a strtab, adding it if it is not
   1685    already present.  */
   1686 
   1687 static inline bfd_size_type
   1688 add_to_stringtab (bfd *abfd,
   1689 		  struct bfd_strtab_hash *tab,
   1690 		  const char *str,
   1691 		  bool copy)
   1692 {
   1693   bool hash;
   1694   bfd_size_type str_index;
   1695 
   1696   /* An index of 0 always means the empty string.  */
   1697   if (str == 0 || *str == '\0')
   1698     return 0;
   1699 
   1700   /* Don't hash if BFD_TRADITIONAL_FORMAT is set, because SunOS dbx
   1701      doesn't understand a hashed string table.  */
   1702   hash = true;
   1703   if ((abfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
   1704     hash = false;
   1705 
   1706   str_index = _bfd_stringtab_add (tab, str, hash, copy);
   1707 
   1708   if (str_index != (bfd_size_type) -1)
   1709     /* Add BYTES_IN_LONG to the return value to account for the
   1710        space taken up by the string table size.  */
   1711     str_index += BYTES_IN_LONG;
   1712 
   1713   return str_index;
   1714 }
   1715 
   1716 /* Write out a strtab.  ABFD is already at the right location in the
   1717    file.  */
   1718 
   1719 static bool
   1720 emit_stringtab (bfd *abfd, struct bfd_strtab_hash *tab)
   1721 {
   1722   bfd_byte buffer[BYTES_IN_LONG];
   1723 
   1724   /* The string table starts with the size.  */
   1725   H_PUT_32 (abfd, _bfd_stringtab_size (tab) + BYTES_IN_LONG, buffer);
   1726   if (bfd_write (buffer, BYTES_IN_LONG, abfd) != BYTES_IN_LONG)
   1727     return false;
   1728 
   1729   return _bfd_stringtab_emit (abfd, tab);
   1730 }
   1731 
   1732 bool
   1734 NAME (aout, write_syms) (bfd *abfd)
   1735 {
   1736   unsigned int count ;
   1737   asymbol **generic = bfd_get_outsymbols (abfd);
   1738   struct bfd_strtab_hash *strtab;
   1739 
   1740   strtab = _bfd_stringtab_init ();
   1741   if (strtab == NULL)
   1742     return false;
   1743 
   1744   for (count = 0; count < bfd_get_symcount (abfd); count++)
   1745     {
   1746       asymbol *g = generic[count];
   1747       bfd_size_type indx;
   1748       struct external_nlist nsp;
   1749 
   1750       indx = add_to_stringtab (abfd, strtab, g->name, false);
   1751       if (indx == (bfd_size_type) -1)
   1752 	goto error_return;
   1753       PUT_WORD (abfd, indx, nsp.e_strx);
   1754 
   1755       if (bfd_asymbol_flavour(g) == abfd->xvec->flavour)
   1756 	{
   1757 	  H_PUT_16 (abfd, aout_symbol (g)->desc,  nsp.e_desc);
   1758 	  H_PUT_8 (abfd, 0, nsp.e_ovly);
   1759 	  H_PUT_8 (abfd, aout_symbol (g)->type,  nsp.e_type);
   1760 	}
   1761       else
   1762 	{
   1763 	  H_PUT_16 (abfd, 0, nsp.e_desc);
   1764 	  H_PUT_8 (abfd, 0, nsp.e_ovly);
   1765 	  H_PUT_8 (abfd, 0, nsp.e_type);
   1766 	}
   1767 
   1768       if (! translate_to_native_sym_flags (abfd, g, &nsp))
   1769 	goto error_return;
   1770 
   1771       if (bfd_write (&nsp, EXTERNAL_NLIST_SIZE, abfd) != EXTERNAL_NLIST_SIZE)
   1772 	goto error_return;
   1773 
   1774       /* NB: `KEEPIT' currently overlays `udata.p', so set this only
   1775 	 here, at the end.  */
   1776       g->KEEPIT = count;
   1777     }
   1778 
   1779   if (! emit_stringtab (abfd, strtab))
   1780     goto error_return;
   1781 
   1782   _bfd_stringtab_free (strtab);
   1783 
   1784   return true;
   1785 
   1786  error_return:
   1787   _bfd_stringtab_free (strtab);
   1788   return false;
   1789 }
   1790 
   1791 
   1792 long
   1794 NAME (aout, canonicalize_symtab) (bfd *abfd, asymbol **location)
   1795 {
   1796   unsigned int counter = 0;
   1797   aout_symbol_type *symbase;
   1798 
   1799   if (!NAME (aout, slurp_symbol_table) (abfd))
   1800     return -1;
   1801 
   1802   for (symbase = obj_aout_symbols (abfd); counter++ < bfd_get_symcount (abfd);)
   1803     *(location++) = (asymbol *)(symbase++);
   1804   *location++ =0;
   1805   return bfd_get_symcount (abfd);
   1806 }
   1807 
   1808 
   1809 /* Output extended relocation information to a file in target byte order.  */
   1811 
   1812 static void
   1813 pdp11_aout_swap_reloc_out (bfd *abfd, arelent *g, bfd_byte *natptr)
   1814 {
   1815   int r_index;
   1816   int r_pcrel;
   1817   int reloc_entry;
   1818   int r_type;
   1819   asymbol *sym = *(g->sym_ptr_ptr);
   1820   asection *output_section = sym->section->output_section;
   1821 
   1822   if (g->addend != 0)
   1823     fprintf (stderr, "BFD: can't do this reloc addend stuff\n");
   1824 
   1825   r_pcrel = g->howto->pc_relative;
   1826 
   1827   if (bfd_is_abs_section (output_section))
   1828     r_type = RABS;
   1829   else if (output_section == obj_textsec (abfd))
   1830     r_type = RTEXT;
   1831   else if (output_section == obj_datasec (abfd))
   1832     r_type = RDATA;
   1833   else if (output_section == obj_bsssec (abfd))
   1834     r_type = RBSS;
   1835   else if (bfd_is_und_section (output_section))
   1836     r_type = REXT;
   1837   else if (bfd_is_com_section (output_section))
   1838     r_type = REXT;
   1839   else
   1840     r_type = -1;
   1841 
   1842   BFD_ASSERT (r_type != -1);
   1843 
   1844   if (r_type == RABS)
   1845     r_index = 0;
   1846   else
   1847     r_index = (*(g->sym_ptr_ptr))->KEEPIT;
   1848 
   1849   reloc_entry = r_index << 4 | r_type | r_pcrel;
   1850 
   1851   PUT_WORD (abfd, reloc_entry, natptr);
   1852 }
   1853 
   1854 /* BFD deals internally with all things based from the section they're
   1855    in. so, something in 10 bytes into a text section  with a base of
   1856    50 would have a symbol (.text+10) and know .text vma was 50.
   1857 
   1858    Aout keeps all it's symbols based from zero, so the symbol would
   1859    contain 60. This macro subs the base of each section from the value
   1860    to give the true offset from the section */
   1861 
   1862 
   1863 #define MOVE_ADDRESS(ad)						\
   1864   if (r_extern)								\
   1865     {									\
   1866       /* Undefined symbol.  */						\
   1867       if (symbols != NULL && r_index < bfd_get_symcount (abfd))		\
   1868 	cache_ptr->sym_ptr_ptr = symbols + r_index;			\
   1869       else								\
   1870 	cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;	\
   1871       cache_ptr->addend = ad;						\
   1872     }									\
   1873   else									\
   1874     {									\
   1875       /* Defined, section relative. replace symbol with pointer to	\
   1876 	 symbol which points to section.  */				\
   1877       switch (r_index)							\
   1878 	{								\
   1879 	case N_TEXT:							\
   1880 	case N_TEXT | N_EXT:						\
   1881 	  cache_ptr->sym_ptr_ptr  = obj_textsec (abfd)->symbol_ptr_ptr;	\
   1882 	  cache_ptr->addend = ad  - su->textsec->vma;			\
   1883 	  break;							\
   1884 	case N_DATA:							\
   1885 	case N_DATA | N_EXT:						\
   1886 	  cache_ptr->sym_ptr_ptr  = obj_datasec (abfd)->symbol_ptr_ptr;	\
   1887 	  cache_ptr->addend = ad - su->datasec->vma;			\
   1888 	  break;							\
   1889 	case N_BSS:							\
   1890 	case N_BSS | N_EXT:						\
   1891 	  cache_ptr->sym_ptr_ptr  = obj_bsssec (abfd)->symbol_ptr_ptr;	\
   1892 	  cache_ptr->addend = ad - su->bsssec->vma;			\
   1893 	  break;							\
   1894 	default:							\
   1895 	case N_ABS:							\
   1896 	case N_ABS | N_EXT:						\
   1897 	  cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;	\
   1898 	  cache_ptr->addend = ad;					\
   1899 	  break;							\
   1900 	}								\
   1901     }
   1902 
   1903 static void
   1904 pdp11_aout_swap_reloc_in (bfd *		 abfd,
   1905 			  bfd_byte *	 bytes,
   1906 			  arelent *	 cache_ptr,
   1907 			  bfd_size_type	 offset,
   1908 			  asymbol **	 symbols,
   1909 			  bfd_size_type	 symcount)
   1910 {
   1911   struct aoutdata *su = &(abfd->tdata.aout_data->a);
   1912   unsigned int r_index;
   1913   int reloc_entry;
   1914   int r_extern;
   1915   int r_pcrel;
   1916 
   1917   reloc_entry = GET_WORD (abfd, (void *) bytes);
   1918 
   1919   r_pcrel = reloc_entry & RELFLG;
   1920 
   1921   cache_ptr->address = offset;
   1922   cache_ptr->howto = howto_table_pdp11 + (r_pcrel ? 1 : 0);
   1923 
   1924   if ((reloc_entry & RTYPE) == RABS)
   1925     r_index = N_ABS;
   1926   else
   1927     r_index = RINDEX (reloc_entry);
   1928 
   1929   /* r_extern reflects whether the symbol the reloc is against is
   1930      local or global.  */
   1931   r_extern = (reloc_entry & RTYPE) == REXT;
   1932 
   1933   if (r_extern && r_index >= symcount)
   1934     {
   1935       /* We could arrange to return an error, but it might be useful
   1936 	 to see the file even if it is bad.  FIXME: Of course this
   1937 	 means that objdump -r *doesn't* see the actual reloc, and
   1938 	 objcopy silently writes a different reloc.  */
   1939       r_extern = 0;
   1940       r_index = N_ABS;
   1941     }
   1942 
   1943   MOVE_ADDRESS(0);
   1944 }
   1945 
   1946 /* Read and swap the relocs for a section.  */
   1947 
   1948 bool
   1949 NAME (aout, slurp_reloc_table) (bfd *abfd, sec_ptr asect, asymbol **symbols)
   1950 {
   1951   bfd_byte *rptr;
   1952   bfd_size_type count;
   1953   bfd_size_type reloc_size;
   1954   void * relocs;
   1955   arelent *reloc_cache;
   1956   size_t each_size;
   1957   unsigned int counter = 0;
   1958   arelent *cache_ptr;
   1959 
   1960   if (asect->relocation)
   1961     return true;
   1962 
   1963   if (asect->flags & SEC_CONSTRUCTOR)
   1964     return true;
   1965 
   1966   if (asect == obj_datasec (abfd))
   1967     reloc_size = exec_hdr(abfd)->a_drsize;
   1968   else if (asect == obj_textsec (abfd))
   1969     reloc_size = exec_hdr(abfd)->a_trsize;
   1970   else if (asect == obj_bsssec (abfd))
   1971     reloc_size = 0;
   1972   else
   1973     {
   1974       bfd_set_error (bfd_error_invalid_operation);
   1975       return false;
   1976     }
   1977 
   1978   if (bfd_seek (abfd, asect->rel_filepos, SEEK_SET) != 0)
   1979     return false;
   1980   relocs = _bfd_malloc_and_read (abfd, reloc_size, reloc_size);
   1981   if (relocs == NULL && reloc_size != 0)
   1982     return false;
   1983 
   1984   each_size = obj_reloc_entry_size (abfd);
   1985   count = reloc_size / each_size;
   1986 
   1987   /* Count the number of NON-ZERO relocs, this is the count we want.  */
   1988   {
   1989     unsigned int real_count = 0;
   1990 
   1991     for (counter = 0; counter < count; counter++)
   1992       {
   1993 	int x;
   1994 
   1995 	x = GET_WORD (abfd, (char *) relocs + each_size * counter);
   1996 	if (x != 0)
   1997 	  real_count++;
   1998       }
   1999 
   2000     count = real_count;
   2001   }
   2002 
   2003   reloc_cache = bfd_zmalloc (count * sizeof (arelent));
   2004   if (reloc_cache == NULL && count != 0)
   2005     return false;
   2006 
   2007   cache_ptr = reloc_cache;
   2008 
   2009   rptr = relocs;
   2010   for (counter = 0;
   2011        counter < count;
   2012        counter++, rptr += RELOC_SIZE, cache_ptr++)
   2013     {
   2014       while (GET_WORD (abfd, (void *) rptr) == 0)
   2015 	{
   2016 	  rptr += RELOC_SIZE;
   2017 	  if ((char *) rptr >= (char *) relocs + reloc_size)
   2018 	    goto done;
   2019 	}
   2020 
   2021       pdp11_aout_swap_reloc_in (abfd, rptr, cache_ptr,
   2022 				(bfd_size_type) ((char *) rptr - (char *) relocs),
   2023 				symbols,
   2024 				(bfd_size_type) bfd_get_symcount (abfd));
   2025     }
   2026  done:
   2027   /* Just in case, if rptr >= relocs + reloc_size should happen
   2028      too early.  */
   2029   BFD_ASSERT (counter == count);
   2030 
   2031   free (relocs);
   2032 
   2033   asect->relocation = reloc_cache;
   2034   asect->reloc_count = cache_ptr - reloc_cache;
   2035 
   2036   return true;
   2037 }
   2038 
   2039 /* Write out a relocation section into an object file.  */
   2040 
   2041 bool
   2042 NAME (aout, squirt_out_relocs) (bfd *abfd, asection *section)
   2043 {
   2044   arelent **generic;
   2045   unsigned char *native;
   2046   unsigned int count = section->reloc_count;
   2047   bfd_size_type natsize;
   2048 
   2049   natsize = section->size;
   2050   native = bfd_zalloc (abfd, natsize);
   2051   if (!native)
   2052     return false;
   2053 
   2054   generic = section->orelocation;
   2055   if (generic != NULL)
   2056     {
   2057       while (count > 0)
   2058 	{
   2059 	  bfd_byte *r;
   2060 
   2061 	  if ((*generic)->howto == NULL
   2062 	      || (*generic)->sym_ptr_ptr == NULL)
   2063 	    {
   2064 	      bfd_set_error (bfd_error_invalid_operation);
   2065 	      _bfd_error_handler (_("%pB: attempt to write out "
   2066 				    "unknown reloc type"), abfd);
   2067 	      bfd_release (abfd, native);
   2068 	      return false;
   2069 	    }
   2070 	  r = native + (*generic)->address;
   2071 	  pdp11_aout_swap_reloc_out (abfd, *generic, r);
   2072 	  count--;
   2073 	  generic++;
   2074 	}
   2075     }
   2076 
   2077   if (bfd_write (native, natsize, abfd) != natsize)
   2078     {
   2079       bfd_release (abfd, native);
   2080       return false;
   2081     }
   2082 
   2083   bfd_release (abfd, native);
   2084   return true;
   2085 }
   2086 
   2087 /* This is stupid.  This function should be a boolean predicate.  */
   2088 
   2089 long
   2090 NAME (aout, canonicalize_reloc) (bfd *abfd,
   2091 				 sec_ptr section,
   2092 				 arelent **relptr,
   2093 				 asymbol **symbols)
   2094 {
   2095   arelent *tblptr = section->relocation;
   2096   unsigned int count;
   2097 
   2098   if (section == obj_bsssec (abfd))
   2099     {
   2100       *relptr = NULL;
   2101       return 0;
   2102     }
   2103 
   2104   if (!(tblptr || NAME (aout, slurp_reloc_table)(abfd, section, symbols)))
   2105     return -1;
   2106 
   2107   if (section->flags & SEC_CONSTRUCTOR)
   2108     {
   2109       arelent_chain *chain = section->constructor_chain;
   2110 
   2111       for (count = 0; count < section->reloc_count; count ++)
   2112 	{
   2113 	  *relptr ++ = &chain->relent;
   2114 	  chain = chain->next;
   2115 	}
   2116     }
   2117   else
   2118     {
   2119       tblptr = section->relocation;
   2120 
   2121       for (count = 0; count++ < section->reloc_count;)
   2122 	*relptr++ = tblptr++;
   2123     }
   2124 
   2125   *relptr = 0;
   2126 
   2127   return section->reloc_count;
   2128 }
   2129 
   2130 long
   2131 NAME (aout, get_reloc_upper_bound) (bfd *abfd, sec_ptr asect)
   2132 {
   2133   size_t count, raw;
   2134 
   2135   if (asect->flags & SEC_CONSTRUCTOR)
   2136     count = asect->reloc_count;
   2137   else if (asect == obj_datasec (abfd))
   2138     count = exec_hdr (abfd)->a_drsize / obj_reloc_entry_size (abfd);
   2139   else if (asect == obj_textsec (abfd))
   2140     count = exec_hdr (abfd)->a_trsize / obj_reloc_entry_size (abfd);
   2141   else if (asect == obj_bsssec (abfd))
   2142     count = 0;
   2143   else
   2144     {
   2145       bfd_set_error (bfd_error_invalid_operation);
   2146       return -1;
   2147     }
   2148 
   2149   if (count >= LONG_MAX / sizeof (arelent *)
   2150       || _bfd_mul_overflow (count, obj_reloc_entry_size (abfd), &raw))
   2151     {
   2152       bfd_set_error (bfd_error_file_too_big);
   2153       return -1;
   2154     }
   2155   if (!bfd_write_p (abfd))
   2156     {
   2157       ufile_ptr filesize = bfd_get_file_size (abfd);
   2158       if (filesize != 0 && raw > filesize)
   2159 	{
   2160 	  bfd_set_error (bfd_error_file_truncated);
   2161 	  return -1;
   2162 	}
   2163     }
   2164   return (count + 1) * sizeof (arelent *);
   2165 }
   2166 
   2167 
   2168 long
   2170 NAME (aout, get_symtab_upper_bound) (bfd *abfd)
   2171 {
   2172   if (!NAME (aout, slurp_symbol_table) (abfd))
   2173     return -1;
   2174 
   2175   return (bfd_get_symcount (abfd) + 1) * (sizeof (aout_symbol_type *));
   2176 }
   2177 
   2178 alent *
   2179 NAME (aout, get_lineno) (bfd * abfd ATTRIBUTE_UNUSED,
   2180 			 asymbol * symbol ATTRIBUTE_UNUSED)
   2181 {
   2182   return NULL;
   2183 }
   2184 
   2185 void
   2186 NAME (aout, get_symbol_info) (bfd * abfd ATTRIBUTE_UNUSED,
   2187 			      asymbol *symbol,
   2188 			      symbol_info *ret)
   2189 {
   2190   bfd_symbol_info (symbol, ret);
   2191 
   2192   if (ret->type == '?')
   2193     {
   2194       int type_code = aout_symbol(symbol)->type & 0xff;
   2195       const char *stab_name = bfd_get_stab_name (type_code);
   2196       static char buf[10];
   2197 
   2198       if (stab_name == NULL)
   2199 	{
   2200 	  sprintf(buf, "(%d)", type_code);
   2201 	  stab_name = buf;
   2202 	}
   2203       ret->type = '-';
   2204       ret->stab_type  = type_code;
   2205       ret->stab_other = (unsigned) (aout_symbol(symbol)->other & 0xff);
   2206       ret->stab_desc  = (unsigned) (aout_symbol(symbol)->desc & 0xffff);
   2207       ret->stab_name  = stab_name;
   2208     }
   2209 }
   2210 
   2211 void
   2212 NAME (aout, print_symbol) (bfd * abfd,
   2213 			   void * afile,
   2214 			   asymbol *symbol,
   2215 			   bfd_print_symbol_type how)
   2216 {
   2217   FILE *file = (FILE *) afile;
   2218 
   2219   switch (how)
   2220     {
   2221     case bfd_print_symbol_name:
   2222       if (symbol->name)
   2223 	fprintf(file,"%s", symbol->name);
   2224       break;
   2225     case bfd_print_symbol_more:
   2226       fprintf(file,"%4x %2x %2x",
   2227 	      (unsigned) (aout_symbol (symbol)->desc & 0xffff),
   2228 	      (unsigned) (aout_symbol (symbol)->other & 0xff),
   2229 	      (unsigned) (aout_symbol (symbol)->type));
   2230       break;
   2231     case bfd_print_symbol_all:
   2232       {
   2233 	const char *section_name = symbol->section->name;
   2234 
   2235 	bfd_print_symbol_vandf (abfd, (void *) file, symbol);
   2236 
   2237 	fprintf (file," %-5s %04x %02x %02x",
   2238 		 section_name,
   2239 		 (unsigned) (aout_symbol (symbol)->desc & 0xffff),
   2240 		 (unsigned) (aout_symbol (symbol)->other & 0xff),
   2241 		 (unsigned) (aout_symbol (symbol)->type  & 0xff));
   2242 	if (symbol->name)
   2243 	  fprintf(file," %s", symbol->name);
   2244       }
   2245       break;
   2246     }
   2247 }
   2248 
   2249 /* If we don't have to allocate more than 1MB to hold the generic
   2250    symbols, we use the generic minisymbol method: it's faster, since
   2251    it only translates the symbols once, not multiple times.  */
   2252 #define MINISYM_THRESHOLD (1000000 / sizeof (asymbol))
   2253 
   2254 /* Read minisymbols.  For minisymbols, we use the unmodified a.out
   2255    symbols.  The minisymbol_to_symbol function translates these into
   2256    BFD asymbol structures.  */
   2257 
   2258 long
   2259 NAME (aout, read_minisymbols) (bfd *abfd,
   2260 			       bool dynamic,
   2261 			       void * *minisymsp,
   2262 			       unsigned int *sizep)
   2263 {
   2264   if (dynamic)
   2265     /* We could handle the dynamic symbols here as well, but it's
   2266        easier to hand them off.  */
   2267     return _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep);
   2268 
   2269   if (! aout_get_external_symbols (abfd))
   2270     return -1;
   2271 
   2272   if (obj_aout_external_sym_count (abfd) < MINISYM_THRESHOLD)
   2273     return _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep);
   2274 
   2275   *minisymsp = (void *) obj_aout_external_syms (abfd);
   2276 
   2277   /* By passing the external symbols back from this routine, we are
   2278      giving up control over the memory block.  Clear
   2279      obj_aout_external_syms, so that we do not try to free it
   2280      ourselves.  */
   2281   obj_aout_external_syms (abfd) = NULL;
   2282 
   2283   *sizep = EXTERNAL_NLIST_SIZE;
   2284   return obj_aout_external_sym_count (abfd);
   2285 }
   2286 
   2287 /* Convert a minisymbol to a BFD asymbol.  A minisymbol is just an
   2288    unmodified a.out symbol.  The SYM argument is a structure returned
   2289    by bfd_make_empty_symbol, which we fill in here.  */
   2290 
   2291 asymbol *
   2292 NAME (aout, minisymbol_to_symbol) (bfd *abfd,
   2293 				   bool dynamic,
   2294 				   const void * minisym,
   2295 				   asymbol *sym)
   2296 {
   2297   if (dynamic
   2298       || obj_aout_external_sym_count (abfd) < MINISYM_THRESHOLD)
   2299     return _bfd_generic_minisymbol_to_symbol (abfd, dynamic, minisym, sym);
   2300 
   2301   memset (sym, 0, sizeof (aout_symbol_type));
   2302 
   2303   /* We call translate_symbol_table to translate a single symbol.  */
   2304   if (! (NAME (aout, translate_symbol_table)
   2305 	 (abfd,
   2306 	  (aout_symbol_type *) sym,
   2307 	  (struct external_nlist *) minisym,
   2308 	  (bfd_size_type) 1,
   2309 	  obj_aout_external_strings (abfd),
   2310 	  obj_aout_external_string_size (abfd),
   2311 	  false)))
   2312     return NULL;
   2313 
   2314   return sym;
   2315 }
   2316 
   2317 /* Provided a BFD, a section and an offset into the section, calculate
   2318    and return the name of the source file and the line nearest to the
   2319    wanted location.  */
   2320 
   2321 bool
   2322 NAME (aout, find_nearest_line) (bfd *abfd,
   2323 				asymbol **symbols,
   2324 				asection *section,
   2325 				bfd_vma offset,
   2326 				const char **filename_ptr,
   2327 				const char **functionname_ptr,
   2328 				unsigned int *line_ptr,
   2329 				unsigned int *discriminator_ptr)
   2330 {
   2331   /* Run down the file looking for the filename, function and linenumber.  */
   2332   asymbol **p;
   2333   const char *directory_name = NULL;
   2334   const char *main_file_name = NULL;
   2335   const char *current_file_name = NULL;
   2336   const char *line_file_name = NULL; /* Value of current_file_name at line number.  */
   2337   bfd_vma low_line_vma = 0;
   2338   bfd_vma low_func_vma = 0;
   2339   asymbol *func = 0;
   2340   size_t filelen, funclen;
   2341   char *buf;
   2342 
   2343   *filename_ptr = bfd_get_filename (abfd);
   2344   *functionname_ptr = NULL;
   2345   *line_ptr = 0;
   2346   if (discriminator_ptr)
   2347     *discriminator_ptr = 0;
   2348 
   2349   if (symbols != NULL)
   2350     {
   2351       for (p = symbols; *p; p++)
   2352 	{
   2353 	  aout_symbol_type  *q = (aout_symbol_type *)(*p);
   2354 	next:
   2355 	  switch (q->type)
   2356 	    {
   2357 	    case N_TEXT:
   2358 	      /* If this looks like a file name symbol, and it comes after
   2359 		 the line number we have found so far, but before the
   2360 		 offset, then we have probably not found the right line
   2361 		 number.  */
   2362 	      if (q->symbol.value <= offset
   2363 		  && ((q->symbol.value > low_line_vma
   2364 		       && (line_file_name != NULL
   2365 			   || *line_ptr != 0))
   2366 		      || (q->symbol.value > low_func_vma
   2367 			  && func != NULL)))
   2368 		{
   2369 		  const char * symname;
   2370 
   2371 		  symname = q->symbol.name;
   2372 
   2373 		  if (symname != NULL
   2374 		      && strlen (symname) > 2
   2375 		      && strcmp (symname + strlen (symname) - 2, ".o") == 0)
   2376 		    {
   2377 		      if (q->symbol.value > low_line_vma)
   2378 			{
   2379 			  *line_ptr = 0;
   2380 			  line_file_name = NULL;
   2381 			}
   2382 		      if (q->symbol.value > low_func_vma)
   2383 			func = NULL;
   2384 		    }
   2385 		}
   2386 	      break;
   2387 
   2388 	    case N_SO:
   2389 	      /* If this symbol is less than the offset, but greater than
   2390 		 the line number we have found so far, then we have not
   2391 		 found the right line number.  */
   2392 	      if (q->symbol.value <= offset)
   2393 		{
   2394 		  if (q->symbol.value > low_line_vma)
   2395 		    {
   2396 		      *line_ptr = 0;
   2397 		      line_file_name = NULL;
   2398 		    }
   2399 		  if (q->symbol.value > low_func_vma)
   2400 		    func = NULL;
   2401 		}
   2402 
   2403 	      main_file_name = current_file_name = q->symbol.name;
   2404 	      /* Look ahead to next symbol to check if that too is an N_SO.  */
   2405 	      p++;
   2406 	      if (*p == NULL)
   2407 		goto done;
   2408 	      q = (aout_symbol_type *)(*p);
   2409 	      if (q->type != (int) N_SO)
   2410 		goto next;
   2411 
   2412 	      /* Found a second N_SO  First is directory; second is filename.  */
   2413 	      directory_name = current_file_name;
   2414 	      main_file_name = current_file_name = q->symbol.name;
   2415 	      if (obj_textsec(abfd) != section)
   2416 		goto done;
   2417 	      break;
   2418 	    case N_SOL:
   2419 	      current_file_name = q->symbol.name;
   2420 	      break;
   2421 
   2422 	    case N_SLINE:
   2423 	    case N_DSLINE:
   2424 	    case N_BSLINE:
   2425 	      /* We'll keep this if it resolves nearer than the one we have
   2426 		 already.  */
   2427 	      if (q->symbol.value >= low_line_vma
   2428 		  && q->symbol.value <= offset)
   2429 		{
   2430 		  *line_ptr = q->desc;
   2431 		  low_line_vma = q->symbol.value;
   2432 		  line_file_name = current_file_name;
   2433 		}
   2434 	      break;
   2435 
   2436 	    case N_FUN:
   2437 	      {
   2438 		/* We'll keep this if it is nearer than the one we have already.  */
   2439 		if (q->symbol.value >= low_func_vma &&
   2440 		    q->symbol.value <= offset)
   2441 		  {
   2442 		    low_func_vma = q->symbol.value;
   2443 		    func = (asymbol *) q;
   2444 		  }
   2445 		else if (q->symbol.value > offset)
   2446 		  goto done;
   2447 	      }
   2448 	      break;
   2449 	    }
   2450 	}
   2451     }
   2452 
   2453  done:
   2454   if (*line_ptr != 0)
   2455     main_file_name = line_file_name;
   2456 
   2457   if (main_file_name == NULL
   2458       || main_file_name[0] == '/'
   2459       || directory_name == NULL)
   2460     filelen = 0;
   2461   else
   2462     filelen = strlen (directory_name) + strlen (main_file_name);
   2463   if (func == NULL)
   2464     funclen = 0;
   2465   else
   2466     funclen = strlen (bfd_asymbol_name (func));
   2467 
   2468   free (adata (abfd).line_buf);
   2469   if (filelen + funclen == 0)
   2470     adata (abfd).line_buf = buf = NULL;
   2471   else
   2472     {
   2473       buf = bfd_malloc ((bfd_size_type) filelen + funclen + 3);
   2474       adata (abfd).line_buf = buf;
   2475       if (buf == NULL)
   2476 	return false;
   2477     }
   2478 
   2479   if (main_file_name != NULL)
   2480     {
   2481       if (main_file_name[0] == '/' || directory_name == NULL)
   2482 	*filename_ptr = main_file_name;
   2483       else
   2484 	{
   2485 	  if (buf == NULL)
   2486 	    /* PR binutils/20891: In a corrupt input file both
   2487 	       main_file_name and directory_name can be empty...  */
   2488 	    * filename_ptr = NULL;
   2489 	  else
   2490 	    {
   2491 	      snprintf (buf, filelen + 1, "%s%s", directory_name,
   2492 			main_file_name);
   2493 	      *filename_ptr = buf;
   2494 	      buf += filelen + 1;
   2495 	    }
   2496 	}
   2497     }
   2498 
   2499   if (func)
   2500     {
   2501       const char *function = func->name;
   2502       char *colon;
   2503 
   2504       if (buf == NULL)
   2505 	{
   2506 	  /* PR binutils/20892: In a corrupt input file func can be empty.  */
   2507 	  * functionname_ptr = NULL;
   2508 	  return true;
   2509 	}
   2510       /* The caller expects a symbol name.  We actually have a
   2511 	 function name, without the leading underscore.  Put the
   2512 	 underscore back in, so that the caller gets a symbol name.  */
   2513       if (bfd_get_symbol_leading_char (abfd) == '\0')
   2514 	strcpy (buf, function);
   2515       else
   2516 	{
   2517 	  buf[0] = bfd_get_symbol_leading_char (abfd);
   2518 	  strcpy (buf + 1, function);
   2519 	}
   2520 
   2521       /* Have to remove : stuff.  */
   2522       colon = strchr (buf, ':');
   2523       if (colon != NULL)
   2524 	*colon = '\0';
   2525       *functionname_ptr = buf;
   2526     }
   2527 
   2528   return true;
   2529 }
   2530 
   2531 int
   2532 NAME (aout, sizeof_headers) (bfd *abfd,
   2533 			     struct bfd_link_info *info ATTRIBUTE_UNUSED)
   2534 {
   2535   return adata (abfd).exec_bytes_size;
   2536 }
   2537 
   2538 /* Throw away most malloc'd and alloc'd information for this BFD.  */
   2539 
   2540 bool
   2541 NAME (aout, bfd_free_cached_info) (bfd *abfd)
   2542 {
   2543   if ((bfd_get_format (abfd) == bfd_object
   2544        || bfd_get_format (abfd) == bfd_core)
   2545       && abfd->tdata.aout_data != NULL)
   2546     {
   2547 #define BFCI_FREE(x) do { free (x); x = NULL; } while (0)
   2548       BFCI_FREE (adata (abfd).line_buf);
   2549       BFCI_FREE (obj_aout_symbols (abfd));
   2550 #ifdef USE_MMAP
   2551       obj_aout_external_syms (abfd) = 0;
   2552       bfd_free_window (&obj_aout_sym_window (abfd));
   2553       bfd_free_window (&obj_aout_string_window (abfd));
   2554       obj_aout_external_strings (abfd) = 0;
   2555 #else
   2556       BFCI_FREE (obj_aout_external_syms (abfd));
   2557       BFCI_FREE (obj_aout_external_strings (abfd));
   2558 #endif
   2559       for (asection *o = abfd->sections; o != NULL; o = o->next)
   2560 	BFCI_FREE (o->relocation);
   2561 #undef BFCI_FREE
   2562     }
   2563 
   2564   return _bfd_generic_bfd_free_cached_info (abfd);
   2565 }
   2566 
   2567 /* Routine to create an entry in an a.out link hash table.  */
   2569 
   2570 struct bfd_hash_entry *
   2571 NAME (aout, link_hash_newfunc) (struct bfd_hash_entry *entry,
   2572 				struct bfd_hash_table *table,
   2573 				const char *string)
   2574 {
   2575   struct aout_link_hash_entry *ret = (struct aout_link_hash_entry *) entry;
   2576 
   2577   /* Allocate the structure if it has not already been allocated by a
   2578      subclass.  */
   2579   if (ret == NULL)
   2580     ret = bfd_hash_allocate (table, sizeof (* ret));
   2581   if (ret == NULL)
   2582     return NULL;
   2583 
   2584   /* Call the allocation method of the superclass.  */
   2585   ret = (struct aout_link_hash_entry *)
   2586 	 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret, table, string);
   2587   if (ret)
   2588     {
   2589       /* Set local fields.  */
   2590       ret->written = false;
   2591       ret->indx = -1;
   2592     }
   2593 
   2594   return (struct bfd_hash_entry *) ret;
   2595 }
   2596 
   2597 /* Initialize an a.out link hash table.  */
   2598 
   2599 bool
   2600 NAME (aout, link_hash_table_init) (struct aout_link_hash_table *table,
   2601 				   bfd *abfd,
   2602 				   struct bfd_hash_entry *(*newfunc) (struct bfd_hash_entry *,
   2603 								     struct bfd_hash_table *,
   2604 								     const char *),
   2605 				   unsigned int entsize)
   2606 {
   2607   return _bfd_link_hash_table_init (&table->root, abfd, newfunc, entsize);
   2608 }
   2609 
   2610 /* Create an a.out link hash table.  */
   2611 
   2612 struct bfd_link_hash_table *
   2613 NAME (aout, link_hash_table_create) (bfd *abfd)
   2614 {
   2615   struct aout_link_hash_table *ret;
   2616   size_t amt = sizeof (struct aout_link_hash_table);
   2617 
   2618   ret = bfd_malloc (amt);
   2619   if (ret == NULL)
   2620     return NULL;
   2621   if (! NAME (aout, link_hash_table_init) (ret, abfd,
   2622 					   NAME (aout, link_hash_newfunc),
   2623 					   sizeof (struct aout_link_hash_entry)))
   2624     {
   2625       free (ret);
   2626       return NULL;
   2627     }
   2628   return &ret->root;
   2629 }
   2630 
   2631 /* Free up the internal symbols read from an a.out file.  */
   2632 
   2633 static bool
   2634 aout_link_free_symbols (bfd *abfd)
   2635 {
   2636   if (obj_aout_external_syms (abfd) != NULL)
   2637     {
   2638 #ifdef USE_MMAP
   2639       bfd_free_window (&obj_aout_sym_window (abfd));
   2640 #else
   2641       free ((void *) obj_aout_external_syms (abfd));
   2642 #endif
   2643       obj_aout_external_syms (abfd) = NULL;
   2644     }
   2645 
   2646   if (obj_aout_external_strings (abfd) != NULL)
   2647     {
   2648 #ifdef USE_MMAP
   2649       bfd_free_window (&obj_aout_string_window (abfd));
   2650 #else
   2651       free ((void *) obj_aout_external_strings (abfd));
   2652 #endif
   2653       obj_aout_external_strings (abfd) = NULL;
   2654     }
   2655   return true;
   2656 }
   2657 
   2658 /* Given an a.out BFD, add symbols to the global hash table as
   2659    appropriate.  */
   2660 
   2661 bool
   2662 NAME (aout, link_add_symbols) (bfd *abfd, struct bfd_link_info *info)
   2663 {
   2664   switch (bfd_get_format (abfd))
   2665     {
   2666     case bfd_object:
   2667       return aout_link_add_object_symbols (abfd, info);
   2668     case bfd_archive:
   2669       return _bfd_generic_link_add_archive_symbols
   2670 	(abfd, info, aout_link_check_archive_element);
   2671     default:
   2672       bfd_set_error (bfd_error_wrong_format);
   2673       return false;
   2674     }
   2675 }
   2676 
   2677 /* Add symbols from an a.out object file.  */
   2678 
   2679 static bool
   2680 aout_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
   2681 {
   2682   if (! aout_get_external_symbols (abfd))
   2683     return false;
   2684   if (! aout_link_add_symbols (abfd, info))
   2685     return false;
   2686   if (! info->keep_memory)
   2687     {
   2688       if (! aout_link_free_symbols (abfd))
   2689 	return false;
   2690     }
   2691   return true;
   2692 }
   2693 
   2694 /* Look through the internal symbols to see if this object file should
   2695    be included in the link.  We should include this object file if it
   2696    defines any symbols which are currently undefined.  If this object
   2697    file defines a common symbol, then we may adjust the size of the
   2698    known symbol but we do not include the object file in the link
   2699    (unless there is some other reason to include it).  */
   2700 
   2701 static bool
   2702 aout_link_check_ar_symbols (bfd *abfd,
   2703 			    struct bfd_link_info *info,
   2704 			    bool *pneeded,
   2705 			    bfd **subsbfd)
   2706 {
   2707   struct external_nlist *p;
   2708   struct external_nlist *pend;
   2709   char *strings;
   2710 
   2711   *pneeded = false;
   2712 
   2713   /* Look through all the symbols.  */
   2714   p = obj_aout_external_syms (abfd);
   2715   pend = p + obj_aout_external_sym_count (abfd);
   2716   strings = obj_aout_external_strings (abfd);
   2717   for (; p < pend; p++)
   2718     {
   2719       int type = H_GET_8 (abfd, p->e_type);
   2720       const char *name = strings + GET_WORD (abfd, p->e_strx);
   2721       struct bfd_link_hash_entry *h;
   2722 
   2723       /* Ignore symbols that are not externally visible.  This is an
   2724 	 optimization only, as we check the type more thoroughly
   2725 	 below.  */
   2726       if ((type & N_EXT) == 0
   2727 	  || is_stab(type, name)
   2728 	  || type == N_FN)
   2729 	continue;
   2730 
   2731       h = bfd_link_hash_lookup (info->hash, name, false, false, true);
   2732 
   2733       /* We are only interested in symbols that are currently
   2734 	 undefined or common.  */
   2735       if (h == NULL
   2736 	  || (h->type != bfd_link_hash_undefined
   2737 	      && h->type != bfd_link_hash_common))
   2738 	continue;
   2739 
   2740       if (type == (N_TEXT | N_EXT)
   2741 	  || type == (N_DATA | N_EXT)
   2742 	  || type == (N_BSS | N_EXT)
   2743 	  || type == (N_ABS | N_EXT))
   2744 	{
   2745 	  /* This object file defines this symbol.  We must link it
   2746 	     in.  This is true regardless of whether the current
   2747 	     definition of the symbol is undefined or common.  If the
   2748 	     current definition is common, we have a case in which we
   2749 	     have already seen an object file including
   2750 		 int a;
   2751 	     and this object file from the archive includes
   2752 		 int a = 5;
   2753 	     In such a case we must include this object file.
   2754 
   2755 	     FIXME: The SunOS 4.1.3 linker will pull in the archive
   2756 	     element if the symbol is defined in the .data section,
   2757 	     but not if it is defined in the .text section.  That
   2758 	     seems a bit crazy to me, and I haven't implemented it.
   2759 	     However, it might be correct.  */
   2760 	  if (!(*info->callbacks
   2761 		->add_archive_element) (info, abfd, name, subsbfd))
   2762 	    continue;
   2763 	  *pneeded = true;
   2764 	  return true;
   2765 	}
   2766 
   2767       if (type == (N_UNDF | N_EXT))
   2768 	{
   2769 	  bfd_vma value;
   2770 
   2771 	  value = GET_WORD (abfd, p->e_value);
   2772 	  if (value != 0)
   2773 	    {
   2774 	      /* This symbol is common in the object from the archive
   2775 		 file.  */
   2776 	      if (h->type == bfd_link_hash_undefined)
   2777 		{
   2778 		  bfd *symbfd;
   2779 		  unsigned int power;
   2780 
   2781 		  symbfd = h->u.undef.abfd;
   2782 		  if (symbfd == NULL)
   2783 		    {
   2784 		      /* This symbol was created as undefined from
   2785 			 outside BFD.  We assume that we should link
   2786 			 in the object file.  This is done for the -u
   2787 			 option in the linker.  */
   2788 		      if (!(*info->callbacks
   2789 			    ->add_archive_element) (info, abfd, name, subsbfd))
   2790 			return false;
   2791 		      *pneeded = true;
   2792 		      return true;
   2793 		    }
   2794 		  /* Turn the current link symbol into a common
   2795 		     symbol.  It is already on the undefs list.  */
   2796 		  h->type = bfd_link_hash_common;
   2797 		  h->u.c.p = bfd_hash_allocate (&info->hash->table,
   2798 						sizeof (struct bfd_link_hash_common_entry));
   2799 		  if (h->u.c.p == NULL)
   2800 		    return false;
   2801 
   2802 		  h->u.c.size = value;
   2803 
   2804 		  /* FIXME: This isn't quite right.  The maximum
   2805 		     alignment of a common symbol should be set by the
   2806 		     architecture of the output file, not of the input
   2807 		     file.  */
   2808 		  power = bfd_log2 (value);
   2809 		  if (power > bfd_get_arch_info (abfd)->section_align_power)
   2810 		    power = bfd_get_arch_info (abfd)->section_align_power;
   2811 		  h->u.c.p->alignment_power = power;
   2812 
   2813 		  h->u.c.p->section = bfd_make_section_old_way (symbfd,
   2814 								"COMMON");
   2815 		}
   2816 	      else
   2817 		{
   2818 		  /* Adjust the size of the common symbol if
   2819 		     necessary.  */
   2820 		  if (value > h->u.c.size)
   2821 		    h->u.c.size = value;
   2822 		}
   2823 	    }
   2824 	}
   2825     }
   2826 
   2827   /* We do not need this object file.  */
   2828   return true;
   2829 }
   2830 
   2831 /* Check a single archive element to see if we need to include it in
   2832    the link.  *PNEEDED is set according to whether this element is
   2833    needed in the link or not.  This is called from
   2834    _bfd_generic_link_add_archive_symbols.  */
   2835 
   2836 static bool
   2837 aout_link_check_archive_element (bfd *abfd,
   2838 				 struct bfd_link_info *info,
   2839 				 struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED,
   2840 				 const char *name ATTRIBUTE_UNUSED,
   2841 				 bool *pneeded)
   2842 {
   2843   bfd *oldbfd;
   2844   bool needed;
   2845 
   2846   if (!aout_get_external_symbols (abfd))
   2847     return false;
   2848 
   2849   oldbfd = abfd;
   2850   if (!aout_link_check_ar_symbols (abfd, info, pneeded, &abfd))
   2851     return false;
   2852 
   2853   needed = *pneeded;
   2854   if (needed)
   2855     {
   2856       /* Potentially, the add_archive_element hook may have set a
   2857 	 substitute BFD for us.  */
   2858       if (abfd != oldbfd)
   2859 	{
   2860 	  if (!info->keep_memory
   2861 	      && !aout_link_free_symbols (oldbfd))
   2862 	    return false;
   2863 	  if (!aout_get_external_symbols (abfd))
   2864 	    return false;
   2865 	}
   2866       if (!aout_link_add_symbols (abfd, info))
   2867 	return false;
   2868     }
   2869 
   2870   if (!info->keep_memory || !needed)
   2871     {
   2872       if (!aout_link_free_symbols (abfd))
   2873 	return false;
   2874     }
   2875 
   2876   return true;
   2877 }
   2878 
   2879 /* Add all symbols from an object file to the hash table.  */
   2880 
   2881 static bool
   2882 aout_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
   2883 {
   2884   bool (*add_one_symbol)
   2885     (struct bfd_link_info *, bfd *, const char *, flagword, asection *,
   2886      bfd_vma, const char *, bool, bool, struct bfd_link_hash_entry **);
   2887   struct external_nlist *syms;
   2888   bfd_size_type sym_count;
   2889   char *strings;
   2890   bool copy;
   2891   struct aout_link_hash_entry **sym_hash;
   2892   struct external_nlist *p;
   2893   struct external_nlist *pend;
   2894 
   2895   syms = obj_aout_external_syms (abfd);
   2896   sym_count = obj_aout_external_sym_count (abfd);
   2897   strings = obj_aout_external_strings (abfd);
   2898   if (info->keep_memory)
   2899     copy = false;
   2900   else
   2901     copy = true;
   2902 
   2903   if (aout_backend_info (abfd)->add_dynamic_symbols != NULL)
   2904     {
   2905       if (! ((*aout_backend_info (abfd)->add_dynamic_symbols)
   2906 	     (abfd, info, &syms, &sym_count, &strings)))
   2907 	return false;
   2908     }
   2909 
   2910   /* We keep a list of the linker hash table entries that correspond
   2911      to particular symbols.  We could just look them up in the hash
   2912      table, but keeping the list is more efficient.  Perhaps this
   2913      should be conditional on info->keep_memory.  */
   2914   sym_hash = bfd_alloc (abfd,
   2915 			sym_count * sizeof (struct aout_link_hash_entry *));
   2916   if (sym_hash == NULL && sym_count != 0)
   2917     return false;
   2918   obj_aout_sym_hashes (abfd) = sym_hash;
   2919 
   2920   add_one_symbol = aout_backend_info (abfd)->add_one_symbol;
   2921   if (add_one_symbol == NULL)
   2922     add_one_symbol = _bfd_generic_link_add_one_symbol;
   2923 
   2924   p = syms;
   2925   pend = p + sym_count;
   2926   for (; p < pend; p++, sym_hash++)
   2927     {
   2928       int type;
   2929       const char *name;
   2930       bfd_vma value;
   2931       asection *section;
   2932       flagword flags;
   2933       const char *string;
   2934 
   2935       *sym_hash = NULL;
   2936 
   2937       type = H_GET_8 (abfd, p->e_type);
   2938 
   2939       /* PR 19629: Corrupt binaries can contain illegal string offsets.  */
   2940       if (GET_WORD (abfd, p->e_strx) >= obj_aout_external_string_size (abfd))
   2941 	return false;
   2942       name = strings + GET_WORD (abfd, p->e_strx);
   2943 
   2944       /* Ignore debugging symbols.  */
   2945       if (is_stab (type, name))
   2946 	continue;
   2947 
   2948       value = GET_WORD (abfd, p->e_value);
   2949       flags = BSF_GLOBAL;
   2950       string = NULL;
   2951       switch (type)
   2952 	{
   2953 	default:
   2954 	  /* Shouldn't be any types not covered.  */
   2955 	  BFD_ASSERT (0);
   2956 	  continue;
   2957 
   2958 	case N_UNDF:
   2959 	case N_ABS:
   2960 	case N_TEXT:
   2961 	case N_DATA:
   2962 	case N_BSS:
   2963 	case N_REG:
   2964 	case N_FN:
   2965 	  /* Ignore symbols that are not externally visible.  */
   2966 	  continue;
   2967 
   2968 	case N_UNDF | N_EXT:
   2969 	  if (value == 0)
   2970 	    {
   2971 	      section = bfd_und_section_ptr;
   2972 	      flags = 0;
   2973 	    }
   2974 	  else
   2975 	    section = bfd_com_section_ptr;
   2976 	  break;
   2977 	case N_ABS | N_EXT:
   2978 	  section = bfd_abs_section_ptr;
   2979 	  break;
   2980 	case N_TEXT | N_EXT:
   2981 	  section = obj_textsec (abfd);
   2982 	  value -= bfd_section_vma (section);
   2983 	  break;
   2984 	case N_DATA | N_EXT:
   2985 	  /* Treat N_SETV symbols as N_DATA symbol; see comment in
   2986 	     translate_from_native_sym_flags.  */
   2987 	  section = obj_datasec (abfd);
   2988 	  value -= bfd_section_vma (section);
   2989 	  break;
   2990 	case N_BSS | N_EXT:
   2991 	  section = obj_bsssec (abfd);
   2992 	  value -= bfd_section_vma (section);
   2993 	  break;
   2994 	}
   2995 
   2996       if (! ((*add_one_symbol)
   2997 	     (info, abfd, name, flags, section, value, string, copy, false,
   2998 	      (struct bfd_link_hash_entry **) sym_hash)))
   2999 	return false;
   3000 
   3001       /* Restrict the maximum alignment of a common symbol based on
   3002 	 the architecture, since a.out has no way to represent
   3003 	 alignment requirements of a section in a .o file.  FIXME:
   3004 	 This isn't quite right: it should use the architecture of the
   3005 	 output file, not the input files.  */
   3006       if ((*sym_hash)->root.type == bfd_link_hash_common
   3007 	  && ((*sym_hash)->root.u.c.p->alignment_power >
   3008 	      bfd_get_arch_info (abfd)->section_align_power))
   3009 	(*sym_hash)->root.u.c.p->alignment_power =
   3010 	  bfd_get_arch_info (abfd)->section_align_power;
   3011 
   3012       /* If this is a set symbol, and we are not building sets, then
   3013 	 it is possible for the hash entry to not have been set.  In
   3014 	 such a case, treat the symbol as not globally defined.  */
   3015       if ((*sym_hash)->root.type == bfd_link_hash_new)
   3016 	{
   3017 	  BFD_ASSERT ((flags & BSF_CONSTRUCTOR) != 0);
   3018 	  *sym_hash = NULL;
   3019 	}
   3020     }
   3021 
   3022   return true;
   3023 }
   3024 
   3025 /* Look up an entry in an the header file hash table.  */
   3027 
   3028 #define aout_link_includes_lookup(table, string, create, copy) \
   3029   ((struct aout_link_includes_entry *) \
   3030    bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
   3031 
   3032 /* The function to create a new entry in the header file hash table.  */
   3033 
   3034 static struct bfd_hash_entry *
   3035 aout_link_includes_newfunc (struct bfd_hash_entry *entry,
   3036 			    struct bfd_hash_table *table,
   3037 			    const char *string)
   3038 {
   3039   struct aout_link_includes_entry * ret =
   3040     (struct aout_link_includes_entry *) entry;
   3041 
   3042   /* Allocate the structure if it has not already been allocated by a
   3043      subclass.  */
   3044   if (ret == NULL)
   3045     ret = bfd_hash_allocate (table,
   3046 			     sizeof (struct aout_link_includes_entry));
   3047   if (ret == NULL)
   3048     return NULL;
   3049 
   3050   /* Call the allocation method of the superclass.  */
   3051   ret = ((struct aout_link_includes_entry *)
   3052 	 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
   3053   if (ret)
   3054     /* Set local fields.  */
   3055     ret->totals = NULL;
   3056 
   3057   return (struct bfd_hash_entry *) ret;
   3058 }
   3059 
   3060 /* Write out a symbol that was not associated with an a.out input
   3061    object.  */
   3062 
   3063 static bool
   3064 aout_link_write_other_symbol (struct bfd_hash_entry *bh, void *data)
   3065 {
   3066   struct aout_link_hash_entry *h = (struct aout_link_hash_entry *) bh;
   3067   struct aout_final_link_info *flaginfo = (struct aout_final_link_info *) data;
   3068   bfd *output_bfd;
   3069   int type;
   3070   bfd_vma val;
   3071   struct external_nlist outsym;
   3072   bfd_size_type indx;
   3073   size_t amt;
   3074 
   3075   if (h->root.type == bfd_link_hash_warning)
   3076     {
   3077       h = (struct aout_link_hash_entry *) h->root.u.i.link;
   3078       if (h->root.type == bfd_link_hash_new)
   3079 	return true;
   3080     }
   3081 
   3082   output_bfd = flaginfo->output_bfd;
   3083 
   3084   if (aout_backend_info (output_bfd)->write_dynamic_symbol != NULL)
   3085     {
   3086       if (! ((*aout_backend_info (output_bfd)->write_dynamic_symbol)
   3087 	     (output_bfd, flaginfo->info, h)))
   3088 	{
   3089 	  /* FIXME: No way to handle errors.  */
   3090 	  abort ();
   3091 	}
   3092     }
   3093 
   3094   if (h->written)
   3095     return true;
   3096 
   3097   h->written = true;
   3098 
   3099   /* An indx of -2 means the symbol must be written.  */
   3100   if (h->indx != -2
   3101       && (flaginfo->info->strip == strip_all
   3102 	  || (flaginfo->info->strip == strip_some
   3103 	      && bfd_hash_lookup (flaginfo->info->keep_hash, h->root.root.string,
   3104 				  false, false) == NULL)))
   3105     return true;
   3106 
   3107   switch (h->root.type)
   3108     {
   3109     default:
   3110       abort ();
   3111       /* Avoid variable not initialized warnings.  */
   3112       return true;
   3113     case bfd_link_hash_new:
   3114       /* This can happen for set symbols when sets are not being
   3115 	 built.  */
   3116       return true;
   3117     case bfd_link_hash_undefined:
   3118       type = N_UNDF | N_EXT;
   3119       val = 0;
   3120       break;
   3121     case bfd_link_hash_defined:
   3122     case bfd_link_hash_defweak:
   3123       {
   3124 	asection *sec;
   3125 
   3126 	sec = h->root.u.def.section->output_section;
   3127 	BFD_ASSERT (bfd_is_abs_section (sec)
   3128 		    || sec->owner == output_bfd);
   3129 	if (sec == obj_textsec (output_bfd))
   3130 	  type = h->root.type == bfd_link_hash_defined ? N_TEXT : N_WEAKT;
   3131 	else if (sec == obj_datasec (output_bfd))
   3132 	  type = h->root.type == bfd_link_hash_defined ? N_DATA : N_WEAKD;
   3133 	else if (sec == obj_bsssec (output_bfd))
   3134 	  type = h->root.type == bfd_link_hash_defined ? N_BSS : N_WEAKB;
   3135 	else
   3136 	  type = h->root.type == bfd_link_hash_defined ? N_ABS : N_WEAKA;
   3137 	type |= N_EXT;
   3138 	val = (h->root.u.def.value
   3139 	       + sec->vma
   3140 	       + h->root.u.def.section->output_offset);
   3141       }
   3142       break;
   3143     case bfd_link_hash_common:
   3144       type = N_UNDF | N_EXT;
   3145       val = h->root.u.c.size;
   3146       break;
   3147     case bfd_link_hash_undefweak:
   3148       type = N_WEAKU;
   3149       val = 0;
   3150       /* Fall through.  */
   3151     case bfd_link_hash_indirect:
   3152     case bfd_link_hash_warning:
   3153       /* FIXME: Ignore these for now.  The circumstances under which
   3154 	 they should be written out are not clear to me.  */
   3155       return true;
   3156     }
   3157 
   3158   H_PUT_8 (output_bfd, type, outsym.e_type);
   3159   H_PUT_8 (output_bfd, 0, outsym.e_ovly);
   3160   indx = add_to_stringtab (output_bfd, flaginfo->strtab, h->root.root.string,
   3161 			   false);
   3162   if (indx == (bfd_size_type) -1)
   3163     /* FIXME: No way to handle errors.  */
   3164     abort ();
   3165 
   3166   PUT_WORD (output_bfd, 0, outsym.e_desc);
   3167   PUT_WORD (output_bfd, indx, outsym.e_strx);
   3168   PUT_WORD (output_bfd, val, outsym.e_value);
   3169 
   3170   amt = EXTERNAL_NLIST_SIZE;
   3171   if (bfd_seek (output_bfd, flaginfo->symoff, SEEK_SET) != 0
   3172       || bfd_write (&outsym, amt, output_bfd) != amt)
   3173     /* FIXME: No way to handle errors.  */
   3174     abort ();
   3175 
   3176   flaginfo->symoff += amt;
   3177   h->indx = obj_aout_external_sym_count (output_bfd);
   3178   ++obj_aout_external_sym_count (output_bfd);
   3179 
   3180   return true;
   3181 }
   3182 
   3183 /* Handle a link order which is supposed to generate a reloc.  */
   3184 
   3185 static bool
   3186 aout_link_reloc_link_order (struct aout_final_link_info *flaginfo,
   3187 			    asection *o,
   3188 			    struct bfd_link_order *p)
   3189 {
   3190   struct bfd_link_order_reloc *pr;
   3191   int r_index;
   3192   int r_extern;
   3193   reloc_howto_type *howto;
   3194   file_ptr *reloff_ptr;
   3195   struct reloc_std_external srel;
   3196   void * rel_ptr;
   3197   bfd_size_type rel_size;
   3198 
   3199   pr = p->u.reloc.p;
   3200 
   3201   if (p->type == bfd_section_reloc_link_order)
   3202     {
   3203       r_extern = 0;
   3204       if (bfd_is_abs_section (pr->u.section))
   3205 	r_index = N_ABS | N_EXT;
   3206       else
   3207 	{
   3208 	  BFD_ASSERT (pr->u.section->owner == flaginfo->output_bfd);
   3209 	  r_index = pr->u.section->target_index;
   3210 	}
   3211     }
   3212   else
   3213     {
   3214       struct aout_link_hash_entry *h;
   3215 
   3216       BFD_ASSERT (p->type == bfd_symbol_reloc_link_order);
   3217       r_extern = 1;
   3218       h = ((struct aout_link_hash_entry *)
   3219 	   bfd_wrapped_link_hash_lookup (flaginfo->output_bfd, flaginfo->info,
   3220 					 pr->u.name, false, false, true));
   3221       if (h != NULL
   3222 	  && h->indx >= 0)
   3223 	r_index = h->indx;
   3224       else if (h != NULL)
   3225 	{
   3226 	  /* We decided to strip this symbol, but it turns out that we
   3227 	     can't.  Note that we lose the other and desc information
   3228 	     here.  I don't think that will ever matter for a global
   3229 	     symbol.  */
   3230 	  h->indx = -2;
   3231 	  h->written = false;
   3232 	  if (!aout_link_write_other_symbol (&h->root.root, flaginfo))
   3233 	    return false;
   3234 	  r_index = h->indx;
   3235 	}
   3236       else
   3237 	{
   3238 	  (*flaginfo->info->callbacks->unattached_reloc)
   3239 	    (flaginfo->info, pr->u.name, NULL, NULL, (bfd_vma) 0);
   3240 	  r_index = 0;
   3241 	}
   3242     }
   3243 
   3244   howto = bfd_reloc_type_lookup (flaginfo->output_bfd, pr->reloc);
   3245   if (howto == 0)
   3246     {
   3247       bfd_set_error (bfd_error_bad_value);
   3248       return false;
   3249     }
   3250 
   3251   if (o == obj_textsec (flaginfo->output_bfd))
   3252     reloff_ptr = &flaginfo->treloff;
   3253   else if (o == obj_datasec (flaginfo->output_bfd))
   3254     reloff_ptr = &flaginfo->dreloff;
   3255   else
   3256     abort ();
   3257 
   3258 #ifdef MY_put_reloc
   3259   MY_put_reloc(flaginfo->output_bfd, r_extern, r_index, p->offset, howto,
   3260 	       &srel);
   3261 #else
   3262   {
   3263     int r_pcrel;
   3264     int r_baserel;
   3265     int r_jmptable;
   3266     int r_relative;
   3267     int r_length;
   3268 
   3269     fprintf (stderr, "TODO: line %d in bfd/pdp11.c\n", __LINE__);
   3270 
   3271     r_pcrel = howto->pc_relative;
   3272     r_baserel = (howto->type & 8) != 0;
   3273     r_jmptable = (howto->type & 16) != 0;
   3274     r_relative = (howto->type & 32) != 0;
   3275     r_length = bfd_log2 (bfd_get_reloc_size (howto));
   3276 
   3277     PUT_WORD (flaginfo->output_bfd, p->offset, srel.r_address);
   3278     if (bfd_header_big_endian (flaginfo->output_bfd))
   3279       {
   3280 	srel.r_index[0] = r_index >> 16;
   3281 	srel.r_index[1] = r_index >> 8;
   3282 	srel.r_index[2] = r_index;
   3283 	srel.r_type[0] =
   3284 	  ((r_extern ?     RELOC_STD_BITS_EXTERN_BIG : 0)
   3285 	   | (r_pcrel ?    RELOC_STD_BITS_PCREL_BIG : 0)
   3286 	   | (r_baserel ?  RELOC_STD_BITS_BASEREL_BIG : 0)
   3287 	   | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_BIG : 0)
   3288 	   | (r_relative ? RELOC_STD_BITS_RELATIVE_BIG : 0)
   3289 	   | (r_length <<  RELOC_STD_BITS_LENGTH_SH_BIG));
   3290       }
   3291     else
   3292       {
   3293 	srel.r_index[2] = r_index >> 16;
   3294 	srel.r_index[1] = r_index >> 8;
   3295 	srel.r_index[0] = r_index;
   3296 	srel.r_type[0] =
   3297 	  ((r_extern ?     RELOC_STD_BITS_EXTERN_LITTLE : 0)
   3298 	   | (r_pcrel ?    RELOC_STD_BITS_PCREL_LITTLE : 0)
   3299 	   | (r_baserel ?  RELOC_STD_BITS_BASEREL_LITTLE : 0)
   3300 	   | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_LITTLE : 0)
   3301 	   | (r_relative ? RELOC_STD_BITS_RELATIVE_LITTLE : 0)
   3302 	   | (r_length <<  RELOC_STD_BITS_LENGTH_SH_LITTLE));
   3303       }
   3304   }
   3305 #endif
   3306   rel_ptr = (void *) &srel;
   3307 
   3308   /* We have to write the addend into the object file, since
   3309      standard a.out relocs are in place.  It would be more
   3310      reliable if we had the current contents of the file here,
   3311      rather than assuming zeroes, but we can't read the file since
   3312      it was opened using bfd_openw.  */
   3313   if (pr->addend != 0)
   3314     {
   3315       bfd_size_type size;
   3316       bfd_reloc_status_type r;
   3317       bfd_byte *buf;
   3318       bool ok;
   3319 
   3320       size = bfd_get_reloc_size (howto);
   3321       buf = bfd_zmalloc (size);
   3322       if (buf == NULL && size != 0)
   3323 	return false;
   3324       r = MY_relocate_contents (howto, flaginfo->output_bfd,
   3325 				pr->addend, buf);
   3326       switch (r)
   3327 	{
   3328 	case bfd_reloc_ok:
   3329 	  break;
   3330 	default:
   3331 	case bfd_reloc_outofrange:
   3332 	  abort ();
   3333 	case bfd_reloc_overflow:
   3334 	  (*flaginfo->info->callbacks->reloc_overflow)
   3335 	    (flaginfo->info, NULL,
   3336 	     (p->type == bfd_section_reloc_link_order
   3337 	      ? bfd_section_name (pr->u.section)
   3338 	      : pr->u.name),
   3339 	     howto->name, pr->addend, NULL,
   3340 	     (asection *) NULL, (bfd_vma) 0);
   3341 	  break;
   3342 	}
   3343       ok = bfd_set_section_contents (flaginfo->output_bfd, o,
   3344 				     (void *) buf,
   3345 				     (file_ptr) p->offset,
   3346 				     size);
   3347       free (buf);
   3348       if (! ok)
   3349 	return false;
   3350     }
   3351 
   3352   rel_size = obj_reloc_entry_size (flaginfo->output_bfd);
   3353   if (bfd_seek (flaginfo->output_bfd, *reloff_ptr, SEEK_SET) != 0
   3354       || bfd_write (rel_ptr, rel_size, flaginfo->output_bfd) != rel_size)
   3355     return false;
   3356 
   3357   *reloff_ptr += rel_size;
   3358 
   3359   /* Assert that the relocs have not run into the symbols, and that n
   3360      the text relocs have not run into the data relocs.  */
   3361   BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (flaginfo->output_bfd)
   3362 	      && (reloff_ptr != &flaginfo->treloff
   3363 		  || (*reloff_ptr
   3364 		      <= obj_datasec (flaginfo->output_bfd)->rel_filepos)));
   3365 
   3366   return true;
   3367 }
   3368 
   3369 /* Get the section corresponding to a reloc index.  */
   3370 
   3371 static inline asection *
   3372 aout_reloc_type_to_section (bfd *abfd, int type)
   3373 {
   3374   switch (type)
   3375     {
   3376     case RTEXT:	return obj_textsec (abfd);
   3377     case RDATA: return obj_datasec (abfd);
   3378     case RBSS:  return obj_bsssec (abfd);
   3379     case RABS:  return bfd_abs_section_ptr;
   3380     case REXT:  return bfd_und_section_ptr;
   3381     default:    abort ();
   3382     }
   3383 }
   3384 
   3385 static bool
   3386 pdp11_aout_link_input_section (struct aout_final_link_info *flaginfo,
   3387 			       bfd *input_bfd,
   3388 			       asection *input_section,
   3389 			       bfd_byte *relocs,
   3390 			       bfd_size_type rel_size,
   3391 			       bfd_byte *contents)
   3392 {
   3393   bool (*check_dynamic_reloc)
   3394     (struct bfd_link_info *, bfd *, asection *,
   3395      struct aout_link_hash_entry *, void *, bfd_byte *, bool *, bfd_vma *);
   3396   bfd *output_bfd;
   3397   bool relocatable;
   3398   struct external_nlist *syms;
   3399   char *strings;
   3400   struct aout_link_hash_entry **sym_hashes;
   3401   int *symbol_map;
   3402   bfd_byte *rel;
   3403   bfd_byte *rel_end;
   3404 
   3405   output_bfd = flaginfo->output_bfd;
   3406   check_dynamic_reloc = aout_backend_info (output_bfd)->check_dynamic_reloc;
   3407 
   3408   BFD_ASSERT (obj_reloc_entry_size (input_bfd) == RELOC_SIZE);
   3409   BFD_ASSERT (input_bfd->xvec->header_byteorder
   3410 	      == output_bfd->xvec->header_byteorder);
   3411 
   3412   relocatable = bfd_link_relocatable (flaginfo->info);
   3413   syms = obj_aout_external_syms (input_bfd);
   3414   strings = obj_aout_external_strings (input_bfd);
   3415   sym_hashes = obj_aout_sym_hashes (input_bfd);
   3416   symbol_map = flaginfo->symbol_map;
   3417 
   3418   rel = relocs;
   3419   rel_end = rel + rel_size;
   3420   for (; rel < rel_end; rel += RELOC_SIZE)
   3421     {
   3422       bfd_vma r_addr;
   3423       int r_index;
   3424       int r_type;
   3425       int r_pcrel;
   3426       int r_extern;
   3427       reloc_howto_type *howto;
   3428       struct aout_link_hash_entry *h = NULL;
   3429       bfd_vma relocation;
   3430       bfd_reloc_status_type r;
   3431       int reloc_entry;
   3432 
   3433       reloc_entry = GET_WORD (input_bfd, (void *) rel);
   3434       if (reloc_entry == 0)
   3435 	continue;
   3436 
   3437       {
   3438 	unsigned int howto_idx;
   3439 
   3440 	r_index = (reloc_entry & RIDXMASK) >> 4;
   3441 	r_type = reloc_entry & RTYPE;
   3442 	r_pcrel = reloc_entry & RELFLG;
   3443 	r_addr = (char *) rel - (char *) relocs;
   3444 
   3445 	r_extern = (r_type == REXT);
   3446 
   3447 	howto_idx = r_pcrel;
   3448 	if (howto_idx < TABLE_SIZE (howto_table_pdp11))
   3449 	  howto = howto_table_pdp11 + howto_idx;
   3450 	else
   3451 	  {
   3452 	    _bfd_error_handler (_("%pB: unsupported relocation type"),
   3453 				input_bfd);
   3454 	    bfd_set_error (bfd_error_bad_value);
   3455 	    return false;
   3456 	  }
   3457       }
   3458 
   3459       if (relocatable)
   3460 	{
   3461 	  /* We are generating a relocatable output file, and must
   3462 	     modify the reloc accordingly.  */
   3463 	  if (r_extern)
   3464 	    {
   3465 	      /* If we know the symbol this relocation is against,
   3466 		 convert it into a relocation against a section.  This
   3467 		 is what the native linker does.  */
   3468 	      h = sym_hashes[r_index];
   3469 	      if (h != NULL
   3470 		  && (h->root.type == bfd_link_hash_defined
   3471 		      || h->root.type == bfd_link_hash_defweak))
   3472 		{
   3473 		  asection *output_section;
   3474 
   3475 		  /* Compute a new r_index.  */
   3476 		  output_section = h->root.u.def.section->output_section;
   3477 		  if (output_section == obj_textsec (output_bfd))
   3478 		    r_type = N_TEXT;
   3479 		  else if (output_section == obj_datasec (output_bfd))
   3480 		    r_type = N_DATA;
   3481 		  else if (output_section == obj_bsssec (output_bfd))
   3482 		    r_type = N_BSS;
   3483 		  else
   3484 		    r_type = N_ABS;
   3485 
   3486 		  /* Add the symbol value and the section VMA to the
   3487 		     addend stored in the contents.  */
   3488 		  relocation = (h->root.u.def.value
   3489 				+ output_section->vma
   3490 				+ h->root.u.def.section->output_offset);
   3491 		}
   3492 	      else
   3493 		{
   3494 		  /* We must change r_index according to the symbol
   3495 		     map.  */
   3496 		  r_index = symbol_map[r_index];
   3497 
   3498 		  if (r_index == -1)
   3499 		    {
   3500 		      if (h != NULL)
   3501 			{
   3502 			  /* We decided to strip this symbol, but it
   3503 			     turns out that we can't.  Note that we
   3504 			     lose the other and desc information here.
   3505 			     I don't think that will ever matter for a
   3506 			     global symbol.  */
   3507 			  if (h->indx < 0)
   3508 			    {
   3509 			      h->indx = -2;
   3510 			      h->written = false;
   3511 			      if (!aout_link_write_other_symbol (&h->root.root,
   3512 								 flaginfo))
   3513 				return false;
   3514 			    }
   3515 			  r_index = h->indx;
   3516 			}
   3517 		      else
   3518 			{
   3519 			  const char *name;
   3520 
   3521 			  name = strings + GET_WORD (input_bfd,
   3522 						     syms[r_index].e_strx);
   3523 			  (*flaginfo->info->callbacks->unattached_reloc)
   3524 			    (flaginfo->info, name, input_bfd, input_section,
   3525 			     r_addr);
   3526 			  r_index = 0;
   3527 			}
   3528 		    }
   3529 
   3530 		  relocation = 0;
   3531 		}
   3532 
   3533 	      /* Write out the new r_index value.  */
   3534 	      reloc_entry = GET_WORD (input_bfd, rel);
   3535 	      reloc_entry &= RIDXMASK;
   3536 	      reloc_entry |= r_index << 4;
   3537 	      PUT_WORD (input_bfd, reloc_entry, rel);
   3538 	    }
   3539 	  else
   3540 	    {
   3541 	      asection *section;
   3542 
   3543 	      /* This is a relocation against a section.  We must
   3544 		 adjust by the amount that the section moved.  */
   3545 	      section = aout_reloc_type_to_section (input_bfd, r_type);
   3546 	      relocation = (section->output_section->vma
   3547 			    + section->output_offset
   3548 			    - section->vma);
   3549 	    }
   3550 
   3551 	  /* Change the address of the relocation.  */
   3552 	  fprintf (stderr, "TODO: change the address of the relocation\n");
   3553 
   3554 	  /* Adjust a PC relative relocation by removing the reference
   3555 	     to the original address in the section and including the
   3556 	     reference to the new address.  */
   3557 	  if (r_pcrel)
   3558 	    relocation -= (input_section->output_section->vma
   3559 			   + input_section->output_offset
   3560 			   - input_section->vma);
   3561 
   3562 #ifdef MY_relocatable_reloc
   3563 	  MY_relocatable_reloc (howto, output_bfd, rel, relocation, r_addr);
   3564 #endif
   3565 
   3566 	  if (relocation == 0)
   3567 	    r = bfd_reloc_ok;
   3568 	  else
   3569 	    r = MY_relocate_contents (howto,
   3570 				      input_bfd, relocation,
   3571 				      contents + r_addr);
   3572 	}
   3573       else
   3574 	{
   3575 	  bool hundef;
   3576 
   3577 	  /* We are generating an executable, and must do a full
   3578 	     relocation.  */
   3579 	  hundef = false;
   3580 	  if (r_extern)
   3581 	    {
   3582 	      h = sym_hashes[r_index];
   3583 
   3584 	      if (h != NULL
   3585 		  && (h->root.type == bfd_link_hash_defined
   3586 		      || h->root.type == bfd_link_hash_defweak))
   3587 		{
   3588 		  relocation = (h->root.u.def.value
   3589 				+ h->root.u.def.section->output_section->vma
   3590 				+ h->root.u.def.section->output_offset);
   3591 		}
   3592 	      else if (h != NULL
   3593 		       && h->root.type == bfd_link_hash_undefweak)
   3594 		relocation = 0;
   3595 	      else
   3596 		{
   3597 		  hundef = true;
   3598 		  relocation = 0;
   3599 		}
   3600 	    }
   3601 	  else
   3602 	    {
   3603 	      asection *section;
   3604 
   3605 	      section = aout_reloc_type_to_section (input_bfd, r_type);
   3606 	      relocation = (section->output_section->vma
   3607 			    + section->output_offset
   3608 			    - section->vma);
   3609 	      if (r_pcrel)
   3610 		relocation += input_section->vma;
   3611 	    }
   3612 
   3613 	  if (check_dynamic_reloc != NULL)
   3614 	    {
   3615 	      bool skip;
   3616 
   3617 	      if (! ((*check_dynamic_reloc)
   3618 		     (flaginfo->info, input_bfd, input_section, h,
   3619 		      (void *) rel, contents, &skip, &relocation)))
   3620 		return false;
   3621 	      if (skip)
   3622 		continue;
   3623 	    }
   3624 
   3625 	  /* Now warn if a global symbol is undefined.  We could not
   3626 	     do this earlier, because check_dynamic_reloc might want
   3627 	     to skip this reloc.  */
   3628 	  if (hundef && ! bfd_link_pic (flaginfo->info))
   3629 	    {
   3630 	      const char *name;
   3631 
   3632 	      if (h != NULL)
   3633 		name = h->root.root.string;
   3634 	      else
   3635 		name = strings + GET_WORD (input_bfd, syms[r_index].e_strx);
   3636 	      (*flaginfo->info->callbacks->undefined_symbol)
   3637 		(flaginfo->info, name, input_bfd, input_section,
   3638 		 r_addr, true);
   3639 	    }
   3640 
   3641 	  r = MY_final_link_relocate (howto,
   3642 				      input_bfd, input_section,
   3643 				      contents, r_addr, relocation,
   3644 				      (bfd_vma) 0);
   3645 	}
   3646 
   3647       if (r != bfd_reloc_ok)
   3648 	{
   3649 	  switch (r)
   3650 	    {
   3651 	    default:
   3652 	    case bfd_reloc_outofrange:
   3653 	      abort ();
   3654 	    case bfd_reloc_overflow:
   3655 	      {
   3656 		const char *name;
   3657 
   3658 		if (h != NULL)
   3659 		  name = NULL;
   3660 		else if (r_extern)
   3661 		  name = strings + GET_WORD (input_bfd,
   3662 					     syms[r_index].e_strx);
   3663 		else
   3664 		  {
   3665 		    asection *s;
   3666 
   3667 		    s = aout_reloc_type_to_section (input_bfd, r_type);
   3668 		    name = bfd_section_name (s);
   3669 		  }
   3670 		(*flaginfo->info->callbacks->reloc_overflow)
   3671 		  (flaginfo->info, (h ? &h->root : NULL), name, howto->name,
   3672 		   (bfd_vma) 0, input_bfd, input_section, r_addr);
   3673 	      }
   3674 	      break;
   3675 	    }
   3676 	}
   3677     }
   3678 
   3679   return true;
   3680 }
   3681 
   3682 /* Link an a.out section into the output file.  */
   3683 
   3684 static bool
   3685 aout_link_input_section (struct aout_final_link_info *flaginfo,
   3686 			 bfd *input_bfd,
   3687 			 asection *input_section,
   3688 			 file_ptr *reloff_ptr,
   3689 			 bfd_size_type rel_size)
   3690 {
   3691   bfd_size_type input_size;
   3692   void * relocs;
   3693 
   3694   /* Get the section contents.  */
   3695   input_size = input_section->size;
   3696   if (! bfd_get_section_contents (input_bfd, input_section,
   3697 				  (void *) flaginfo->contents,
   3698 				  (file_ptr) 0, input_size))
   3699     return false;
   3700 
   3701   /* Read in the relocs if we haven't already done it.  */
   3702   if (aout_section_data (input_section) != NULL
   3703       && aout_section_data (input_section)->relocs != NULL)
   3704     relocs = aout_section_data (input_section)->relocs;
   3705   else
   3706     {
   3707       relocs = flaginfo->relocs;
   3708       if (rel_size > 0)
   3709 	{
   3710 	  if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0
   3711 	      || bfd_read (relocs, rel_size, input_bfd) != rel_size)
   3712 	    return false;
   3713 	}
   3714     }
   3715 
   3716   /* Relocate the section contents.  */
   3717   if (! pdp11_aout_link_input_section (flaginfo, input_bfd, input_section,
   3718 				       (bfd_byte *) relocs,
   3719 				       rel_size, flaginfo->contents))
   3720     return false;
   3721 
   3722   /* Write out the section contents.  */
   3723   if (! bfd_set_section_contents (flaginfo->output_bfd,
   3724 				  input_section->output_section,
   3725 				  (void *) flaginfo->contents,
   3726 				  (file_ptr) input_section->output_offset,
   3727 				  input_size))
   3728     return false;
   3729 
   3730   /* If we are producing relocatable output, the relocs were
   3731      modified, and we now write them out.  */
   3732   if (bfd_link_relocatable (flaginfo->info) && rel_size > 0)
   3733     {
   3734       if (bfd_seek (flaginfo->output_bfd, *reloff_ptr, SEEK_SET) != 0)
   3735 	return false;
   3736       if (bfd_write (relocs, rel_size, flaginfo->output_bfd) != rel_size)
   3737 	return false;
   3738       *reloff_ptr += rel_size;
   3739 
   3740       /* Assert that the relocs have not run into the symbols, and
   3741 	 that if these are the text relocs they have not run into the
   3742 	 data relocs.  */
   3743       BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (flaginfo->output_bfd)
   3744 		  && (reloff_ptr != &flaginfo->treloff
   3745 		      || (*reloff_ptr
   3746 			  <= obj_datasec (flaginfo->output_bfd)->rel_filepos)));
   3747     }
   3748 
   3749   return true;
   3750 }
   3751 
   3752 /* Link an a.out input BFD into the output file.  */
   3753 
   3754 static bool
   3755 aout_link_input_bfd (struct aout_final_link_info *flaginfo, bfd *input_bfd)
   3756 {
   3757   BFD_ASSERT (bfd_get_format (input_bfd) == bfd_object);
   3758 
   3759   /* If this is a dynamic object, it may need special handling.  */
   3760   if ((input_bfd->flags & DYNAMIC) != 0
   3761       && aout_backend_info (input_bfd)->link_dynamic_object != NULL)
   3762     return ((*aout_backend_info (input_bfd)->link_dynamic_object)
   3763 	    (flaginfo->info, input_bfd));
   3764 
   3765   /* Get the symbols.  We probably have them already, unless
   3766      flaginfo->info->keep_memory is FALSE.  */
   3767   if (! aout_get_external_symbols (input_bfd))
   3768     return false;
   3769 
   3770   /* Write out the symbols and get a map of the new indices.  The map
   3771      is placed into flaginfo->symbol_map.  */
   3772   if (! aout_link_write_symbols (flaginfo, input_bfd))
   3773     return false;
   3774 
   3775   /* Relocate and write out the sections.  These functions use the
   3776      symbol map created by aout_link_write_symbols.  The linker_mark
   3777      field will be set if these sections are to be included in the
   3778      link, which will normally be the case.  */
   3779   if (obj_textsec (input_bfd)->linker_mark)
   3780     {
   3781       if (! aout_link_input_section (flaginfo, input_bfd,
   3782 				     obj_textsec (input_bfd),
   3783 				     &flaginfo->treloff,
   3784 				     exec_hdr (input_bfd)->a_trsize))
   3785 	return false;
   3786     }
   3787   if (obj_datasec (input_bfd)->linker_mark)
   3788     {
   3789       if (! aout_link_input_section (flaginfo, input_bfd,
   3790 				     obj_datasec (input_bfd),
   3791 				     &flaginfo->dreloff,
   3792 				     exec_hdr (input_bfd)->a_drsize))
   3793 	return false;
   3794     }
   3795 
   3796   /* If we are not keeping memory, we don't need the symbols any
   3797      longer.  We still need them if we are keeping memory, because the
   3798      strings in the hash table point into them.  */
   3799   if (! flaginfo->info->keep_memory)
   3800     {
   3801       if (! aout_link_free_symbols (input_bfd))
   3802 	return false;
   3803     }
   3804 
   3805   return true;
   3806 }
   3807 
   3808 /* Do the final link step.  This is called on the output BFD.  The
   3809    INFO structure should point to a list of BFDs linked through the
   3810    link.next field which can be used to find each BFD which takes part
   3811    in the output.  Also, each section in ABFD should point to a list
   3812    of bfd_link_order structures which list all the input sections for
   3813    the output section.  */
   3814 
   3815 bool
   3816 NAME (aout, final_link) (bfd *abfd,
   3817 			 struct bfd_link_info *info,
   3818 			 void (*callback) (bfd *, file_ptr *, file_ptr *, file_ptr *))
   3819 {
   3820   struct aout_final_link_info aout_info;
   3821   bool includes_hash_initialized = false;
   3822   bfd *sub;
   3823   bfd_size_type trsize, drsize;
   3824   bfd_size_type max_contents_size;
   3825   bfd_size_type max_relocs_size;
   3826   bfd_size_type max_sym_count;
   3827   struct bfd_link_order *p;
   3828   asection *o;
   3829   bool have_link_order_relocs;
   3830 
   3831   if (bfd_link_pic (info))
   3832     abfd->flags |= DYNAMIC;
   3833 
   3834   separate_i_d = info->separate_code;
   3835   aout_info.info = info;
   3836   aout_info.output_bfd = abfd;
   3837   aout_info.contents = NULL;
   3838   aout_info.relocs = NULL;
   3839   aout_info.symbol_map = NULL;
   3840   aout_info.output_syms = NULL;
   3841 
   3842   if (!bfd_hash_table_init_n (&aout_info.includes.root,
   3843 			      aout_link_includes_newfunc,
   3844 			      sizeof (struct aout_link_includes_entry),
   3845 			      251))
   3846     goto error_return;
   3847   includes_hash_initialized = true;
   3848 
   3849   /* Figure out the largest section size.  Also, if generating
   3850      relocatable output, count the relocs.  */
   3851   trsize = 0;
   3852   drsize = 0;
   3853   max_contents_size = 0;
   3854   max_relocs_size = 0;
   3855   max_sym_count = 0;
   3856   for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
   3857     {
   3858       size_t sz;
   3859 
   3860       if (bfd_link_relocatable (info))
   3861 	{
   3862 	  if (bfd_get_flavour (sub) == bfd_target_aout_flavour)
   3863 	    {
   3864 	      trsize += exec_hdr (sub)->a_trsize;
   3865 	      drsize += exec_hdr (sub)->a_drsize;
   3866 	    }
   3867 	  else
   3868 	    {
   3869 	      /* FIXME: We need to identify the .text and .data sections
   3870 		 and call get_reloc_upper_bound and canonicalize_reloc to
   3871 		 work out the number of relocs needed, and then multiply
   3872 		 by the reloc size.  */
   3873 	      _bfd_error_handler
   3874 		/* xgettext:c-format */
   3875 		(_("%pB: relocatable link from %s to %s not supported"),
   3876 		 abfd, sub->xvec->name, abfd->xvec->name);
   3877 	      bfd_set_error (bfd_error_invalid_operation);
   3878 	      goto error_return;
   3879 	    }
   3880 	}
   3881 
   3882       if (bfd_get_flavour (sub) == bfd_target_aout_flavour)
   3883 	{
   3884 	  sz = obj_textsec (sub)->size;
   3885 	  if (sz > max_contents_size)
   3886 	    max_contents_size = sz;
   3887 	  sz = obj_datasec (sub)->size;
   3888 	  if (sz > max_contents_size)
   3889 	    max_contents_size = sz;
   3890 
   3891 	  sz = exec_hdr (sub)->a_trsize;
   3892 	  if (sz > max_relocs_size)
   3893 	    max_relocs_size = sz;
   3894 	  sz = exec_hdr (sub)->a_drsize;
   3895 	  if (sz > max_relocs_size)
   3896 	    max_relocs_size = sz;
   3897 
   3898 	  sz = obj_aout_external_sym_count (sub);
   3899 	  if (sz > max_sym_count)
   3900 	    max_sym_count = sz;
   3901 	}
   3902     }
   3903 
   3904   if (bfd_link_relocatable (info))
   3905     {
   3906       if (obj_textsec (abfd) != NULL)
   3907 	trsize += (_bfd_count_link_order_relocs (obj_textsec (abfd)
   3908 						 ->map_head.link_order)
   3909 		   * obj_reloc_entry_size (abfd));
   3910       if (obj_datasec (abfd) != NULL)
   3911 	drsize += (_bfd_count_link_order_relocs (obj_datasec (abfd)
   3912 						 ->map_head.link_order)
   3913 		   * obj_reloc_entry_size (abfd));
   3914     }
   3915 
   3916   exec_hdr (abfd)->a_trsize = trsize;
   3917   exec_hdr (abfd)->a_drsize = drsize;
   3918   exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd);
   3919 
   3920   /* Adjust the section sizes and vmas according to the magic number.
   3921      This sets a_text, a_data and a_bss in the exec_hdr and sets the
   3922      filepos for each section.  */
   3923   if (! NAME (aout, adjust_sizes_and_vmas) (abfd))
   3924     goto error_return;
   3925 
   3926   /* The relocation and symbol file positions differ among a.out
   3927      targets.  We are passed a callback routine from the backend
   3928      specific code to handle this.
   3929      FIXME: At this point we do not know how much space the symbol
   3930      table will require.  This will not work for any (nonstandard)
   3931      a.out target that needs to know the symbol table size before it
   3932      can compute the relocation file positions.  */
   3933   (*callback) (abfd, &aout_info.treloff, &aout_info.dreloff,
   3934 	       &aout_info.symoff);
   3935   obj_textsec (abfd)->rel_filepos = aout_info.treloff;
   3936   obj_datasec (abfd)->rel_filepos = aout_info.dreloff;
   3937   obj_sym_filepos (abfd) = aout_info.symoff;
   3938 
   3939   /* We keep a count of the symbols as we output them.  */
   3940   obj_aout_external_sym_count (abfd) = 0;
   3941 
   3942   /* We accumulate the string table as we write out the symbols.  */
   3943   aout_info.strtab = _bfd_stringtab_init ();
   3944   if (aout_info.strtab == NULL)
   3945     goto error_return;
   3946 
   3947   /* Allocate buffers to hold section contents and relocs.  */
   3948   aout_info.contents = bfd_malloc (max_contents_size);
   3949   aout_info.relocs = bfd_malloc (max_relocs_size);
   3950   aout_info.symbol_map = bfd_malloc (max_sym_count * sizeof (int *));
   3951   aout_info.output_syms = bfd_malloc ((max_sym_count + 1)
   3952 				      * sizeof (struct external_nlist));
   3953   if ((aout_info.contents == NULL && max_contents_size != 0)
   3954       || (aout_info.relocs == NULL && max_relocs_size != 0)
   3955       || (aout_info.symbol_map == NULL && max_sym_count != 0)
   3956       || aout_info.output_syms == NULL)
   3957     goto error_return;
   3958 
   3959   /* If we have a symbol named __DYNAMIC, force it out now.  This is
   3960      required by SunOS.  Doing this here rather than in sunos.c is a
   3961      hack, but it's easier than exporting everything which would be
   3962      needed.  */
   3963   {
   3964     struct aout_link_hash_entry *h;
   3965 
   3966     h = aout_link_hash_lookup (aout_hash_table (info), "__DYNAMIC",
   3967 			       false, false, false);
   3968     if (h != NULL)
   3969       aout_link_write_other_symbol (&h->root.root, &aout_info);
   3970   }
   3971 
   3972   /* The most time efficient way to do the link would be to read all
   3973      the input object files into memory and then sort out the
   3974      information into the output file.  Unfortunately, that will
   3975      probably use too much memory.  Another method would be to step
   3976      through everything that composes the text section and write it
   3977      out, and then everything that composes the data section and write
   3978      it out, and then write out the relocs, and then write out the
   3979      symbols.  Unfortunately, that requires reading stuff from each
   3980      input file several times, and we will not be able to keep all the
   3981      input files open simultaneously, and reopening them will be slow.
   3982 
   3983      What we do is basically process one input file at a time.  We do
   3984      everything we need to do with an input file once--copy over the
   3985      section contents, handle the relocation information, and write
   3986      out the symbols--and then we throw away the information we read
   3987      from it.  This approach requires a lot of lseeks of the output
   3988      file, which is unfortunate but still faster than reopening a lot
   3989      of files.
   3990 
   3991      We use the output_has_begun field of the input BFDs to see
   3992      whether we have already handled it.  */
   3993   for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
   3994     sub->output_has_begun = false;
   3995 
   3996   /* Mark all sections which are to be included in the link.  This
   3997      will normally be every section.  We need to do this so that we
   3998      can identify any sections which the linker has decided to not
   3999      include.  */
   4000   for (o = abfd->sections; o != NULL; o = o->next)
   4001     {
   4002       for (p = o->map_head.link_order; p != NULL; p = p->next)
   4003 	if (p->type == bfd_indirect_link_order)
   4004 	  p->u.indirect.section->linker_mark = true;
   4005     }
   4006 
   4007   have_link_order_relocs = false;
   4008   for (o = abfd->sections; o != NULL; o = o->next)
   4009     {
   4010       for (p = o->map_head.link_order;
   4011 	   p != NULL;
   4012 	   p = p->next)
   4013 	{
   4014 	  if (p->type == bfd_indirect_link_order
   4015 	      && (bfd_get_flavour (p->u.indirect.section->owner)
   4016 		  == bfd_target_aout_flavour))
   4017 	    {
   4018 	      bfd *input_bfd;
   4019 
   4020 	      input_bfd = p->u.indirect.section->owner;
   4021 	      if (! input_bfd->output_has_begun)
   4022 		{
   4023 		  if (! aout_link_input_bfd (&aout_info, input_bfd))
   4024 		    goto error_return;
   4025 		  input_bfd->output_has_begun = true;
   4026 		}
   4027 	    }
   4028 	  else if (p->type == bfd_section_reloc_link_order
   4029 		   || p->type == bfd_symbol_reloc_link_order)
   4030 	    /* These are handled below.  */
   4031 	    have_link_order_relocs = true;
   4032 	  else
   4033 	    {
   4034 	      if (! _bfd_default_link_order (abfd, info, o, p))
   4035 		goto error_return;
   4036 	    }
   4037 	}
   4038     }
   4039 
   4040   /* Write out any symbols that we have not already written out.  */
   4041   bfd_hash_traverse (&info->hash->table,
   4042 		     aout_link_write_other_symbol,
   4043 		     &aout_info);
   4044 
   4045   /* Now handle any relocs we were asked to create by the linker.
   4046      These did not come from any input file.  We must do these after
   4047      we have written out all the symbols, so that we know the symbol
   4048      indices to use.  */
   4049   if (have_link_order_relocs)
   4050     {
   4051       for (o = abfd->sections; o != NULL; o = o->next)
   4052 	{
   4053 	  for (p = o->map_head.link_order;
   4054 	       p != NULL;
   4055 	       p = p->next)
   4056 	    {
   4057 	      if (p->type == bfd_section_reloc_link_order
   4058 		  || p->type == bfd_symbol_reloc_link_order)
   4059 		{
   4060 		  if (! aout_link_reloc_link_order (&aout_info, o, p))
   4061 		    goto error_return;
   4062 		}
   4063 	    }
   4064 	}
   4065     }
   4066 
   4067   free (aout_info.contents);
   4068   aout_info.contents = NULL;
   4069   free (aout_info.relocs);
   4070   aout_info.relocs = NULL;
   4071   free (aout_info.symbol_map);
   4072   aout_info.symbol_map = NULL;
   4073   free (aout_info.output_syms);
   4074   aout_info.output_syms = NULL;
   4075   if (includes_hash_initialized)
   4076     {
   4077       bfd_hash_table_free (&aout_info.includes.root);
   4078       includes_hash_initialized = false;
   4079     }
   4080 
   4081   /* Finish up any dynamic linking we may be doing.  */
   4082   if (aout_backend_info (abfd)->finish_dynamic_link != NULL)
   4083     {
   4084       if (! (*aout_backend_info (abfd)->finish_dynamic_link) (abfd, info))
   4085 	goto error_return;
   4086     }
   4087 
   4088   /* Update the header information.  */
   4089   abfd->symcount = obj_aout_external_sym_count (abfd);
   4090   exec_hdr (abfd)->a_syms = abfd->symcount * EXTERNAL_NLIST_SIZE;
   4091   obj_str_filepos (abfd) = obj_sym_filepos (abfd) + exec_hdr (abfd)->a_syms;
   4092   obj_textsec (abfd)->reloc_count =
   4093     exec_hdr (abfd)->a_trsize / obj_reloc_entry_size (abfd);
   4094   obj_datasec (abfd)->reloc_count =
   4095     exec_hdr (abfd)->a_drsize / obj_reloc_entry_size (abfd);
   4096 
   4097   /* Write out the string table, unless there are no symbols.  */
   4098   if (abfd->symcount > 0)
   4099     {
   4100       if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0
   4101 	  || ! emit_stringtab (abfd, aout_info.strtab))
   4102 	goto error_return;
   4103     }
   4104   else if (obj_textsec (abfd)->reloc_count == 0
   4105 	   && obj_datasec (abfd)->reloc_count == 0)
   4106     {
   4107       /* The layout of a typical a.out file is header, text, data,
   4108 	 relocs, symbols, string table.  When there are no relocs,
   4109 	 symbols or string table, the last thing in the file is data
   4110 	 and a_data may be rounded up.  However we may have a smaller
   4111 	 sized .data section and thus not written final padding.  The
   4112 	 same thing can happen with text if there is no data.  Write
   4113 	 final padding here to extend the file.  */
   4114       file_ptr pos = 0;
   4115 
   4116       if (exec_hdr (abfd)->a_data > obj_datasec (abfd)->size)
   4117 	pos = obj_datasec (abfd)->filepos + exec_hdr (abfd)->a_data;
   4118       else if (obj_datasec (abfd)->size == 0
   4119 	       && exec_hdr (abfd)->a_text > obj_textsec (abfd)->size)
   4120 	pos = obj_textsec (abfd)->filepos + exec_hdr (abfd)->a_text;
   4121       if (pos != 0)
   4122 	{
   4123 	  bfd_byte b = 0;
   4124 
   4125 	  if (bfd_seek (abfd, pos - 1, SEEK_SET) != 0
   4126 	      || bfd_write (&b, 1, abfd) != 1)
   4127 	    goto error_return;
   4128 	}
   4129     }
   4130 
   4131   return true;
   4132 
   4133  error_return:
   4134   free (aout_info.contents);
   4135   free (aout_info.relocs);
   4136   free (aout_info.symbol_map);
   4137   free (aout_info.output_syms);
   4138   if (includes_hash_initialized)
   4139     bfd_hash_table_free (&aout_info.includes.root);
   4140   return false;
   4141 }
   4142 
   4143 /* Adjust and write out the symbols for an a.out file.  Set the new
   4144    symbol indices into a symbol_map.  */
   4145 
   4146 static bool
   4147 aout_link_write_symbols (struct aout_final_link_info *flaginfo, bfd *input_bfd)
   4148 {
   4149   bfd *output_bfd;
   4150   bfd_size_type sym_count;
   4151   char *strings;
   4152   enum bfd_link_strip strip;
   4153   enum bfd_link_discard discard;
   4154   struct external_nlist *outsym;
   4155   bfd_size_type strtab_index;
   4156   struct external_nlist *sym;
   4157   struct external_nlist *sym_end;
   4158   struct aout_link_hash_entry **sym_hash;
   4159   int *symbol_map;
   4160   bool pass;
   4161   bool skip_next;
   4162 
   4163   output_bfd = flaginfo->output_bfd;
   4164   sym_count = obj_aout_external_sym_count (input_bfd);
   4165   strings = obj_aout_external_strings (input_bfd);
   4166   strip = flaginfo->info->strip;
   4167   discard = flaginfo->info->discard;
   4168   outsym = flaginfo->output_syms;
   4169 
   4170   /* First write out a symbol for this object file, unless we are
   4171      discarding such symbols.  */
   4172   if (strip != strip_all
   4173       && (strip != strip_some
   4174 	  || bfd_hash_lookup (flaginfo->info->keep_hash,
   4175 			      bfd_get_filename (input_bfd),
   4176 			      false, false) != NULL)
   4177       && discard != discard_all)
   4178     {
   4179       H_PUT_8 (output_bfd, N_TEXT, outsym->e_type);
   4180       H_PUT_8 (output_bfd, 0, outsym->e_ovly);
   4181       H_PUT_16 (output_bfd, 0, outsym->e_desc);
   4182       strtab_index = add_to_stringtab (output_bfd, flaginfo->strtab,
   4183 				       bfd_get_filename (input_bfd), false);
   4184       if (strtab_index == (bfd_size_type) -1)
   4185 	return false;
   4186       PUT_WORD (output_bfd, strtab_index, outsym->e_strx);
   4187       PUT_WORD (output_bfd,
   4188 		(bfd_section_vma (obj_textsec (input_bfd)->output_section)
   4189 		 + obj_textsec (input_bfd)->output_offset),
   4190 		outsym->e_value);
   4191       ++obj_aout_external_sym_count (output_bfd);
   4192       ++outsym;
   4193     }
   4194 
   4195   pass = false;
   4196   skip_next = false;
   4197   sym = obj_aout_external_syms (input_bfd);
   4198   sym_end = sym + sym_count;
   4199   sym_hash = obj_aout_sym_hashes (input_bfd);
   4200   symbol_map = flaginfo->symbol_map;
   4201   memset (symbol_map, 0, (size_t) sym_count * sizeof *symbol_map);
   4202   for (; sym < sym_end; sym++, sym_hash++, symbol_map++)
   4203     {
   4204       const char *name;
   4205       int type;
   4206       struct aout_link_hash_entry *h;
   4207       bool skip;
   4208       asection *symsec;
   4209       bfd_vma val = 0;
   4210       bool copy;
   4211 
   4212       /* We set *symbol_map to 0 above for all symbols.  If it has
   4213 	 already been set to -1 for this symbol, it means that we are
   4214 	 discarding it because it appears in a duplicate header file.
   4215 	 See the N_BINCL code below.  */
   4216       if (*symbol_map == -1)
   4217 	continue;
   4218 
   4219       /* Initialize *symbol_map to -1, which means that the symbol was
   4220 	 not copied into the output file.  We will change it later if
   4221 	 we do copy the symbol over.  */
   4222       *symbol_map = -1;
   4223 
   4224       type = H_GET_8 (input_bfd, sym->e_type);
   4225       name = strings + GET_WORD (input_bfd, sym->e_strx);
   4226 
   4227       h = NULL;
   4228 
   4229       if (pass)
   4230 	{
   4231 	  /* Pass this symbol through.  It is the target of an
   4232 	     indirect or warning symbol.  */
   4233 	  val = GET_WORD (input_bfd, sym->e_value);
   4234 	  pass = false;
   4235 	}
   4236       else if (skip_next)
   4237 	{
   4238 	  /* Skip this symbol, which is the target of an indirect
   4239 	     symbol that we have changed to no longer be an indirect
   4240 	     symbol.  */
   4241 	  skip_next = false;
   4242 	  continue;
   4243 	}
   4244       else
   4245 	{
   4246 	  struct aout_link_hash_entry *hresolve;
   4247 
   4248 	  /* We have saved the hash table entry for this symbol, if
   4249 	     there is one.  Note that we could just look it up again
   4250 	     in the hash table, provided we first check that it is an
   4251 	     external symbol. */
   4252 	  h = *sym_hash;
   4253 
   4254 	  /* Use the name from the hash table, in case the symbol was
   4255 	     wrapped.  */
   4256 	  if (h != NULL)
   4257 	    name = h->root.root.string;
   4258 
   4259 	  /* If this is an indirect or warning symbol, then change
   4260 	     hresolve to the base symbol.  We also change *sym_hash so
   4261 	     that the relocation routines relocate against the real
   4262 	     symbol.  */
   4263 	  hresolve = h;
   4264 	  if (h != NULL
   4265 	      && (h->root.type == bfd_link_hash_indirect
   4266 		  || h->root.type == bfd_link_hash_warning))
   4267 	    {
   4268 	      hresolve = (struct aout_link_hash_entry *) h->root.u.i.link;
   4269 	      while (hresolve->root.type == bfd_link_hash_indirect
   4270 		     || hresolve->root.type == bfd_link_hash_warning)
   4271 		hresolve = ((struct aout_link_hash_entry *)
   4272 			    hresolve->root.u.i.link);
   4273 	      *sym_hash = hresolve;
   4274 	    }
   4275 
   4276 	  /* If the symbol has already been written out, skip it.  */
   4277 	  if (h != NULL
   4278 	      && h->root.type != bfd_link_hash_warning
   4279 	      && h->written)
   4280 	    {
   4281 	      if ((type & N_TYPE) == N_INDR
   4282 		  || type == N_WARNING)
   4283 		skip_next = true;
   4284 	      *symbol_map = h->indx;
   4285 	      continue;
   4286 	    }
   4287 
   4288 	  /* See if we are stripping this symbol.  */
   4289 	  skip = false;
   4290 	  switch (strip)
   4291 	    {
   4292 	    case strip_none:
   4293 	      break;
   4294 	    case strip_debugger:
   4295 	      if (is_stab (type, name))
   4296 		skip = true;
   4297 	      break;
   4298 	    case strip_some:
   4299 	      if (bfd_hash_lookup (flaginfo->info->keep_hash, name,
   4300 				   false, false) == NULL)
   4301 		skip = true;
   4302 	      break;
   4303 	    case strip_all:
   4304 	      skip = true;
   4305 	      break;
   4306 	    }
   4307 	  if (skip)
   4308 	    {
   4309 	      if (h != NULL)
   4310 		h->written = true;
   4311 	      continue;
   4312 	    }
   4313 
   4314 	  /* Get the value of the symbol.  */
   4315 	  if (is_stab (type, name))
   4316 	    {
   4317 	      switch (type)
   4318 		{
   4319 		default:
   4320 		  symsec = bfd_abs_section_ptr;
   4321 		  break;
   4322 		case N_SO:
   4323 		case N_SOL:
   4324 		case N_FUN:
   4325 		case N_ENTRY:
   4326 		case N_SLINE:
   4327 		case N_FN:
   4328 		  symsec = obj_textsec (input_bfd);
   4329 		  break;
   4330 		case N_STSYM:
   4331 		case N_DSLINE:
   4332 		  symsec = obj_datasec (input_bfd);
   4333 		  break;
   4334 		case N_LCSYM:
   4335 		case N_BSLINE:
   4336 		  symsec = obj_bsssec (input_bfd);
   4337 		  break;
   4338 		}
   4339 	      val = GET_WORD (input_bfd, sym->e_value);
   4340 	    }
   4341 	  else if ((type & N_TYPE) == N_TEXT
   4342 	      || type == N_WEAKT)
   4343 	    symsec = obj_textsec (input_bfd);
   4344 	  else if ((type & N_TYPE) == N_DATA
   4345 		   || type == N_WEAKD)
   4346 	    symsec = obj_datasec (input_bfd);
   4347 	  else if ((type & N_TYPE) == N_BSS
   4348 		   || type == N_WEAKB)
   4349 	    symsec = obj_bsssec (input_bfd);
   4350 	  else if ((type & N_TYPE) == N_ABS
   4351 		   || type == N_WEAKA)
   4352 	    symsec = bfd_abs_section_ptr;
   4353 	  else if (((type & N_TYPE) == N_INDR
   4354 		    && (hresolve == NULL
   4355 			|| (hresolve->root.type != bfd_link_hash_defined
   4356 			    && hresolve->root.type != bfd_link_hash_defweak
   4357 			    && hresolve->root.type != bfd_link_hash_common)))
   4358 		   || type == N_WARNING)
   4359 	    {
   4360 	      /* Pass the next symbol through unchanged.  The
   4361 		 condition above for indirect symbols is so that if
   4362 		 the indirect symbol was defined, we output it with
   4363 		 the correct definition so the debugger will
   4364 		 understand it.  */
   4365 	      pass = true;
   4366 	      val = GET_WORD (input_bfd, sym->e_value);
   4367 	      symsec = NULL;
   4368 	    }
   4369 	  else
   4370 	    {
   4371 	      /* If we get here with an indirect symbol, it means that
   4372 		 we are outputting it with a real definition.  In such
   4373 		 a case we do not want to output the next symbol,
   4374 		 which is the target of the indirection.  */
   4375 	      if ((type & N_TYPE) == N_INDR)
   4376 		skip_next = true;
   4377 
   4378 	      symsec = NULL;
   4379 
   4380 	      /* We need to get the value from the hash table.  We use
   4381 		 hresolve so that if we have defined an indirect
   4382 		 symbol we output the final definition.  */
   4383 	      if (h == NULL)
   4384 		{
   4385 		  switch (type & N_TYPE)
   4386 		    {
   4387 		    case N_SETT:
   4388 		      symsec = obj_textsec (input_bfd);
   4389 		      break;
   4390 		    case N_SETD:
   4391 		      symsec = obj_datasec (input_bfd);
   4392 		      break;
   4393 		    case N_SETB:
   4394 		      symsec = obj_bsssec (input_bfd);
   4395 		      break;
   4396 		    case N_SETA:
   4397 		      symsec = bfd_abs_section_ptr;
   4398 		      break;
   4399 		    default:
   4400 		      val = 0;
   4401 		      break;
   4402 		    }
   4403 		}
   4404 	      else if (hresolve->root.type == bfd_link_hash_defined
   4405 		       || hresolve->root.type == bfd_link_hash_defweak)
   4406 		{
   4407 		  asection *input_section;
   4408 		  asection *output_section;
   4409 
   4410 		  /* This case usually means a common symbol which was
   4411 		     turned into a defined symbol.  */
   4412 		  input_section = hresolve->root.u.def.section;
   4413 		  output_section = input_section->output_section;
   4414 		  BFD_ASSERT (bfd_is_abs_section (output_section)
   4415 			      || output_section->owner == output_bfd);
   4416 		  val = (hresolve->root.u.def.value
   4417 			 + bfd_section_vma (output_section)
   4418 			 + input_section->output_offset);
   4419 
   4420 		  /* Get the correct type based on the section.  If
   4421 		     this is a constructed set, force it to be
   4422 		     globally visible.  */
   4423 		  if (type == N_SETT
   4424 		      || type == N_SETD
   4425 		      || type == N_SETB
   4426 		      || type == N_SETA)
   4427 		    type |= N_EXT;
   4428 
   4429 		  type &=~ N_TYPE;
   4430 
   4431 		  if (output_section == obj_textsec (output_bfd))
   4432 		    type |= (hresolve->root.type == bfd_link_hash_defined
   4433 			     ? N_TEXT
   4434 			     : N_WEAKT);
   4435 		  else if (output_section == obj_datasec (output_bfd))
   4436 		    type |= (hresolve->root.type == bfd_link_hash_defined
   4437 			     ? N_DATA
   4438 			     : N_WEAKD);
   4439 		  else if (output_section == obj_bsssec (output_bfd))
   4440 		    type |= (hresolve->root.type == bfd_link_hash_defined
   4441 			     ? N_BSS
   4442 			     : N_WEAKB);
   4443 		  else
   4444 		    type |= (hresolve->root.type == bfd_link_hash_defined
   4445 			     ? N_ABS
   4446 			     : N_WEAKA);
   4447 		}
   4448 	      else if (hresolve->root.type == bfd_link_hash_common)
   4449 		val = hresolve->root.u.c.size;
   4450 	      else if (hresolve->root.type == bfd_link_hash_undefweak)
   4451 		{
   4452 		  val = 0;
   4453 		  type = N_WEAKU;
   4454 		}
   4455 	      else
   4456 		val = 0;
   4457 	    }
   4458 	  if (symsec != NULL)
   4459 	    val = (symsec->output_section->vma
   4460 		   + symsec->output_offset
   4461 		   + (GET_WORD (input_bfd, sym->e_value)
   4462 		      - symsec->vma));
   4463 
   4464 	  /* If this is a global symbol set the written flag, and if
   4465 	     it is a local symbol see if we should discard it.  */
   4466 	  if (h != NULL)
   4467 	    {
   4468 	      h->written = true;
   4469 	      h->indx = obj_aout_external_sym_count (output_bfd);
   4470 	    }
   4471 	  else if ((type & N_TYPE) != N_SETT
   4472 		   && (type & N_TYPE) != N_SETD
   4473 		   && (type & N_TYPE) != N_SETB
   4474 		   && (type & N_TYPE) != N_SETA)
   4475 	    {
   4476 	      switch (discard)
   4477 		{
   4478 		case discard_none:
   4479 		case discard_sec_merge:
   4480 		  break;
   4481 		case discard_l:
   4482 		  if (!is_stab (type, name)
   4483 		      && bfd_is_local_label_name (input_bfd, name))
   4484 		    skip = true;
   4485 		  break;
   4486 		case discard_all:
   4487 		  skip = true;
   4488 		  break;
   4489 		}
   4490 	      if (skip)
   4491 		{
   4492 		  pass = false;
   4493 		  continue;
   4494 		}
   4495 	    }
   4496 
   4497 	  /* An N_BINCL symbol indicates the start of the stabs
   4498 	     entries for a header file.  We need to scan ahead to the
   4499 	     next N_EINCL symbol, ignoring nesting, adding up all the
   4500 	     characters in the symbol names, not including the file
   4501 	     numbers in types (the first number after an open
   4502 	     parenthesis).  */
   4503 	  if (type == N_BINCL)
   4504 	    {
   4505 	      struct external_nlist *incl_sym;
   4506 	      int nest;
   4507 	      struct aout_link_includes_entry *incl_entry;
   4508 	      struct aout_link_includes_totals *t;
   4509 
   4510 	      val = 0;
   4511 	      nest = 0;
   4512 	      for (incl_sym = sym + 1; incl_sym < sym_end; incl_sym++)
   4513 		{
   4514 		  int incl_type;
   4515 
   4516 		  incl_type = H_GET_8 (input_bfd, incl_sym->e_type);
   4517 		  if (incl_type == N_EINCL)
   4518 		    {
   4519 		      if (nest == 0)
   4520 			break;
   4521 		      --nest;
   4522 		    }
   4523 		  else if (incl_type == N_BINCL)
   4524 		    ++nest;
   4525 		  else if (nest == 0)
   4526 		    {
   4527 		      const char *s;
   4528 
   4529 		      s = strings + GET_WORD (input_bfd, incl_sym->e_strx);
   4530 		      for (; *s != '\0'; s++)
   4531 			{
   4532 			  val += *s;
   4533 			  if (*s == '(')
   4534 			    {
   4535 			      /* Skip the file number.  */
   4536 			      ++s;
   4537 			      while (ISDIGIT (*s))
   4538 				++s;
   4539 			      --s;
   4540 			    }
   4541 			}
   4542 		    }
   4543 		}
   4544 
   4545 	      /* If we have already included a header file with the
   4546 		 same value, then replace this one with an N_EXCL
   4547 		 symbol.  */
   4548 	      copy = ! flaginfo->info->keep_memory;
   4549 	      incl_entry = aout_link_includes_lookup (&flaginfo->includes,
   4550 						      name, true, copy);
   4551 	      if (incl_entry == NULL)
   4552 		return false;
   4553 	      for (t = incl_entry->totals; t != NULL; t = t->next)
   4554 		if (t->total == val)
   4555 		  break;
   4556 	      if (t == NULL)
   4557 		{
   4558 		  /* This is the first time we have seen this header
   4559 		     file with this set of stabs strings.  */
   4560 		  t = bfd_hash_allocate (&flaginfo->includes.root,
   4561 					 sizeof *t);
   4562 		  if (t == NULL)
   4563 		    return false;
   4564 		  t->total = val;
   4565 		  t->next = incl_entry->totals;
   4566 		  incl_entry->totals = t;
   4567 		}
   4568 	      else
   4569 		{
   4570 		  int *incl_map;
   4571 
   4572 		  /* This is a duplicate header file.  We must change
   4573 		     it to be an N_EXCL entry, and mark all the
   4574 		     included symbols to prevent outputting them.  */
   4575 		  type = N_EXCL;
   4576 
   4577 		  nest = 0;
   4578 		  for (incl_sym = sym + 1, incl_map = symbol_map + 1;
   4579 		       incl_sym < sym_end;
   4580 		       incl_sym++, incl_map++)
   4581 		    {
   4582 		      int incl_type;
   4583 
   4584 		      incl_type = H_GET_8 (input_bfd, incl_sym->e_type);
   4585 		      if (incl_type == N_EINCL)
   4586 			{
   4587 			  if (nest == 0)
   4588 			    {
   4589 			      *incl_map = -1;
   4590 			      break;
   4591 			    }
   4592 			  --nest;
   4593 			}
   4594 		      else if (incl_type == N_BINCL)
   4595 			++nest;
   4596 		      else if (nest == 0)
   4597 			*incl_map = -1;
   4598 		    }
   4599 		}
   4600 	    }
   4601 	}
   4602 
   4603       /* Copy this symbol into the list of symbols we are going to
   4604 	 write out.  */
   4605       H_PUT_8 (output_bfd, type, outsym->e_type);
   4606       H_PUT_8 (output_bfd, H_GET_8 (input_bfd, sym->e_ovly), outsym->e_ovly);
   4607       H_PUT_16 (output_bfd, H_GET_16 (input_bfd, sym->e_desc), outsym->e_desc);
   4608       copy = false;
   4609       if (! flaginfo->info->keep_memory)
   4610 	{
   4611 	  /* name points into a string table which we are going to
   4612 	     free.  If there is a hash table entry, use that string.
   4613 	     Otherwise, copy name into memory.  */
   4614 	  if (h != NULL)
   4615 	    name = h->root.root.string;
   4616 	  else
   4617 	    copy = true;
   4618 	}
   4619       strtab_index = add_to_stringtab (output_bfd, flaginfo->strtab,
   4620 				       name, copy);
   4621       if (strtab_index == (bfd_size_type) -1)
   4622 	return false;
   4623       PUT_WORD (output_bfd, strtab_index, outsym->e_strx);
   4624       PUT_WORD (output_bfd, val, outsym->e_value);
   4625       *symbol_map = obj_aout_external_sym_count (output_bfd);
   4626       ++obj_aout_external_sym_count (output_bfd);
   4627       ++outsym;
   4628     }
   4629 
   4630   /* Write out the output symbols we have just constructed.  */
   4631   if (outsym > flaginfo->output_syms)
   4632     {
   4633       bfd_size_type size;
   4634 
   4635       if (bfd_seek (output_bfd, flaginfo->symoff, SEEK_SET) != 0)
   4636 	return false;
   4637       size = outsym - flaginfo->output_syms;
   4638       size *= EXTERNAL_NLIST_SIZE;
   4639       if (bfd_write (flaginfo->output_syms, size, output_bfd) != size)
   4640 	return false;
   4641       flaginfo->symoff += size;
   4642     }
   4643 
   4644   return true;
   4645 }
   4646 
   4647 /* Write out a symbol that was not associated with an a.out input
   4648    object.  */
   4649 
   4650 static bfd_vma
   4651 bfd_getp32 (const void *p)
   4652 {
   4653   const bfd_byte *addr = p;
   4654   unsigned long v;
   4655 
   4656   v = (unsigned long) addr[1] << 24;
   4657   v |= (unsigned long) addr[0] << 16;
   4658   v |= (unsigned long) addr[3] << 8;
   4659   v |= (unsigned long) addr[2];
   4660   return v;
   4661 }
   4662 
   4663 #define COERCE32(x) (((bfd_signed_vma) (x) ^ 0x80000000) - 0x80000000)
   4664 
   4665 static bfd_signed_vma
   4666 bfd_getp_signed_32 (const void *p)
   4667 {
   4668   const bfd_byte *addr = p;
   4669   unsigned long v;
   4670 
   4671   v = (unsigned long) addr[1] << 24;
   4672   v |= (unsigned long) addr[0] << 16;
   4673   v |= (unsigned long) addr[3] << 8;
   4674   v |= (unsigned long) addr[2];
   4675   return COERCE32 (v);
   4676 }
   4677 
   4678 static void
   4679 bfd_putp32 (bfd_vma data, void *p)
   4680 {
   4681   bfd_byte *addr = p;
   4682 
   4683   addr[0] = (data >> 16) & 0xff;
   4684   addr[1] = (data >> 24) & 0xff;
   4685   addr[2] = (data >> 0) & 0xff;
   4686   addr[3] = (data >> 8) & 0xff;
   4687 }
   4688 
   4689 const bfd_target MY (vec) =
   4690 {
   4691   TARGETNAME,			/* Name.  */
   4692   bfd_target_aout_flavour,
   4693   BFD_ENDIAN_LITTLE,		/* Target byte order (little).  */
   4694   BFD_ENDIAN_LITTLE,		/* Target headers byte order (little).  */
   4695   (HAS_RELOC | EXEC_P |		/* Object flags.  */
   4696    HAS_LINENO | HAS_DEBUG |
   4697    HAS_SYMS | HAS_LOCALS | WP_TEXT),
   4698   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA),
   4699   MY_symbol_leading_char,
   4700   AR_PAD_CHAR,			/* AR_pad_char.  */
   4701   15,				/* AR_max_namelen.  */
   4702   0,				/* match priority.  */
   4703   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
   4704   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
   4705      bfd_getp32, bfd_getp_signed_32, bfd_putp32,
   4706      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Data.  */
   4707   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
   4708      bfd_getp32, bfd_getp_signed_32, bfd_putp32,
   4709      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Headers.  */
   4710   {				/* bfd_check_format.  */
   4711     _bfd_dummy_target,
   4712     MY_object_p,
   4713     bfd_generic_archive_p,
   4714     MY_core_file_p
   4715   },
   4716   {				/* bfd_set_format.  */
   4717     _bfd_bool_bfd_false_error,
   4718     MY_mkobject,
   4719     _bfd_generic_mkarchive,
   4720     _bfd_bool_bfd_false_error
   4721   },
   4722   {			/* bfd_write_contents.  */
   4723     _bfd_bool_bfd_false_error,
   4724     MY_write_object_contents,
   4725     _bfd_write_archive_contents,
   4726     _bfd_bool_bfd_false_error
   4727   },
   4728 
   4729   BFD_JUMP_TABLE_GENERIC (MY),
   4730   BFD_JUMP_TABLE_COPY (MY),
   4731   BFD_JUMP_TABLE_CORE (MY),
   4732   BFD_JUMP_TABLE_ARCHIVE (MY),
   4733   BFD_JUMP_TABLE_SYMBOLS (MY),
   4734   BFD_JUMP_TABLE_RELOCS (MY),
   4735   BFD_JUMP_TABLE_WRITE (MY),
   4736   BFD_JUMP_TABLE_LINK (MY),
   4737   BFD_JUMP_TABLE_DYNAMIC (MY),
   4738 
   4739   /* Alternative_target.  */
   4740   NULL,
   4741 
   4742   (void *) MY_backend_data
   4743 };
   4744