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