Home | History | Annotate | Download | only in bfd
      1 /* BFD semi-generic back-end for a.out binaries.
      2    Copyright (C) 1990-2014 Free Software Foundation, Inc.
      3    Written by Cygnus Support.
      4 
      5    This file is part of BFD, the Binary File Descriptor library.
      6 
      7    This program is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3 of the License, or
     10    (at your option) any later version.
     11 
     12    This program is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with this program; if not, write to the Free Software
     19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     20    MA 02110-1301, USA.  */
     21 
     22 /*
     23 SECTION
     24 	a.out backends
     25 
     26 DESCRIPTION
     27 
     28 	BFD supports a number of different flavours of a.out format,
     29 	though the major differences are only the sizes of the
     30 	structures on disk, and the shape of the relocation
     31 	information.
     32 
     33 	The support is split into a basic support file @file{aoutx.h}
     34 	and other files which derive functions from the base. One
     35 	derivation file is @file{aoutf1.h} (for a.out flavour 1), and
     36 	adds to the basic a.out functions support for sun3, sun4, 386
     37 	and 29k a.out files, to create a target jump vector for a
     38 	specific target.
     39 
     40 	This information is further split out into more specific files
     41 	for each machine, including @file{sunos.c} for sun3 and sun4,
     42 	@file{newsos3.c} for the Sony NEWS, and @file{demo64.c} for a
     43 	demonstration of a 64 bit a.out format.
     44 
     45 	The base file @file{aoutx.h} defines general mechanisms for
     46 	reading and writing records to and from disk and various
     47 	other methods which BFD requires. It is included by
     48 	@file{aout32.c} and @file{aout64.c} to form the names
     49 	<<aout_32_swap_exec_header_in>>, <<aout_64_swap_exec_header_in>>, etc.
     50 
     51 	As an example, this is what goes on to make the back end for a
     52 	sun4, from @file{aout32.c}:
     53 
     54 |	#define ARCH_SIZE 32
     55 |	#include "aoutx.h"
     56 
     57 	Which exports names:
     58 
     59 |	...
     60 |	aout_32_canonicalize_reloc
     61 |	aout_32_find_nearest_line
     62 |	aout_32_get_lineno
     63 |	aout_32_get_reloc_upper_bound
     64 |	...
     65 
     66 	from @file{sunos.c}:
     67 
     68 |	#define TARGET_NAME "a.out-sunos-big"
     69 |	#define VECNAME    sparc_aout_sunos_be_vec
     70 |	#include "aoutf1.h"
     71 
     72 	requires all the names from @file{aout32.c}, and produces the jump vector
     73 
     74 |	sparc_aout_sunos_be_vec
     75 
     76 	The file @file{host-aout.c} is a special case.  It is for a large set
     77 	of hosts that use ``more or less standard'' a.out files, and
     78 	for which cross-debugging is not interesting.  It uses the
     79 	standard 32-bit a.out support routines, but determines the
     80 	file offsets and addresses of the text, data, and BSS
     81 	sections, the machine architecture and machine type, and the
     82 	entry point address, in a host-dependent manner.  Once these
     83 	values have been determined, generic code is used to handle
     84 	the  object file.
     85 
     86 	When porting it to run on a new system, you must supply:
     87 
     88 |        HOST_PAGE_SIZE
     89 |        HOST_SEGMENT_SIZE
     90 |        HOST_MACHINE_ARCH       (optional)
     91 |        HOST_MACHINE_MACHINE    (optional)
     92 |        HOST_TEXT_START_ADDR
     93 |        HOST_STACK_END_ADDR
     94 
     95 	in the file @file{../include/sys/h-@var{XXX}.h} (for your host).  These
     96 	values, plus the structures and macros defined in @file{a.out.h} on
     97 	your host system, will produce a BFD target that will access
     98 	ordinary a.out files on your host. To configure a new machine
     99 	to use @file{host-aout.c}, specify:
    100 
    101 |	TDEFAULTS = -DDEFAULT_VECTOR=host_aout_big_vec
    102 |	TDEPFILES= host-aout.o trad-core.o
    103 
    104 	in the @file{config/@var{XXX}.mt} file, and modify @file{configure.ac}
    105 	to use the
    106 	@file{@var{XXX}.mt} file (by setting "<<bfd_target=XXX>>") when your
    107 	configuration is selected.  */
    108 
    109 /* Some assumptions:
    110    * Any BFD with D_PAGED set is ZMAGIC, and vice versa.
    111      Doesn't matter what the setting of WP_TEXT is on output, but it'll
    112      get set on input.
    113    * Any BFD with D_PAGED clear and WP_TEXT set is NMAGIC.
    114    * Any BFD with both flags clear is OMAGIC.
    115    (Just want to make these explicit, so the conditions tested in this
    116    file make sense if you're more familiar with a.out than with BFD.)  */
    117 
    118 #define KEEPIT udata.i
    119 
    120 #include "sysdep.h"
    121 #include "bfd.h"
    122 #include "safe-ctype.h"
    123 #include "bfdlink.h"
    124 
    125 #include "libaout.h"
    126 #include "libbfd.h"
    127 #include "aout/aout64.h"
    128 #include "aout/stab_gnu.h"
    129 #include "aout/ar.h"
    130 
    131 /*
    132 SUBSECTION
    133 	Relocations
    134 
    135 DESCRIPTION
    136 	The file @file{aoutx.h} provides for both the @emph{standard}
    137 	and @emph{extended} forms of a.out relocation records.
    138 
    139 	The standard records contain only an
    140 	address, a symbol index, and a type field. The extended records
    141 	(used on 29ks and sparcs) also have a full integer for an
    142 	addend.  */
    143 
    144 #ifndef CTOR_TABLE_RELOC_HOWTO
    145 #define CTOR_TABLE_RELOC_IDX 2
    146 #define CTOR_TABLE_RELOC_HOWTO(BFD)					\
    147   ((obj_reloc_entry_size (BFD) == RELOC_EXT_SIZE			\
    148     ? howto_table_ext : howto_table_std)				\
    149    + CTOR_TABLE_RELOC_IDX)
    150 #endif
    151 
    152 #ifndef MY_swap_std_reloc_in
    153 #define MY_swap_std_reloc_in NAME (aout, swap_std_reloc_in)
    154 #endif
    155 
    156 #ifndef MY_swap_ext_reloc_in
    157 #define MY_swap_ext_reloc_in NAME (aout, swap_ext_reloc_in)
    158 #endif
    159 
    160 #ifndef MY_swap_std_reloc_out
    161 #define MY_swap_std_reloc_out NAME (aout, swap_std_reloc_out)
    162 #endif
    163 
    164 #ifndef MY_swap_ext_reloc_out
    165 #define MY_swap_ext_reloc_out NAME (aout, swap_ext_reloc_out)
    166 #endif
    167 
    168 #ifndef MY_final_link_relocate
    169 #define MY_final_link_relocate _bfd_final_link_relocate
    170 #endif
    171 
    172 #ifndef MY_relocate_contents
    173 #define MY_relocate_contents _bfd_relocate_contents
    174 #endif
    175 
    176 #define howto_table_ext NAME (aout, ext_howto_table)
    177 #define howto_table_std NAME (aout, std_howto_table)
    178 
    179 reloc_howto_type howto_table_ext[] =
    180 {
    181   /*     Type         rs   size bsz  pcrel bitpos ovrf                  sf name          part_inpl readmask setmask pcdone.  */
    182   HOWTO (RELOC_8,       0,  0,  8,  FALSE, 0, complain_overflow_bitfield, 0, "8",           FALSE, 0, 0x000000ff, FALSE),
    183   HOWTO (RELOC_16,      0,  1, 	16, FALSE, 0, complain_overflow_bitfield, 0, "16",          FALSE, 0, 0x0000ffff, FALSE),
    184   HOWTO (RELOC_32,      0,  2, 	32, FALSE, 0, complain_overflow_bitfield, 0, "32",          FALSE, 0, 0xffffffff, FALSE),
    185   HOWTO (RELOC_DISP8,   0,  0, 	8,  TRUE,  0, complain_overflow_signed,   0, "DISP8", 	    FALSE, 0, 0x000000ff, FALSE),
    186   HOWTO (RELOC_DISP16,  0,  1, 	16, TRUE,  0, complain_overflow_signed,   0, "DISP16", 	    FALSE, 0, 0x0000ffff, FALSE),
    187   HOWTO (RELOC_DISP32,  0,  2, 	32, TRUE,  0, complain_overflow_signed,   0, "DISP32", 	    FALSE, 0, 0xffffffff, FALSE),
    188   HOWTO (RELOC_WDISP30, 2,  2, 	30, TRUE,  0, complain_overflow_signed,   0, "WDISP30",     FALSE, 0, 0x3fffffff, FALSE),
    189   HOWTO (RELOC_WDISP22, 2,  2, 	22, TRUE,  0, complain_overflow_signed,   0, "WDISP22",     FALSE, 0, 0x003fffff, FALSE),
    190   HOWTO (RELOC_HI22,   10,  2, 	22, FALSE, 0, complain_overflow_bitfield, 0, "HI22",	    FALSE, 0, 0x003fffff, FALSE),
    191   HOWTO (RELOC_22,      0,  2, 	22, FALSE, 0, complain_overflow_bitfield, 0, "22",          FALSE, 0, 0x003fffff, FALSE),
    192   HOWTO (RELOC_13,      0,  2, 	13, FALSE, 0, complain_overflow_bitfield, 0, "13",          FALSE, 0, 0x00001fff, FALSE),
    193   HOWTO (RELOC_LO10,    0,  2, 	10, FALSE, 0, complain_overflow_dont,     0, "LO10",        FALSE, 0, 0x000003ff, FALSE),
    194   HOWTO (RELOC_SFA_BASE,0,  2, 	32, FALSE, 0, complain_overflow_bitfield, 0, "SFA_BASE",    FALSE, 0, 0xffffffff, FALSE),
    195   HOWTO (RELOC_SFA_OFF13,0, 2, 	32, FALSE, 0, complain_overflow_bitfield, 0, "SFA_OFF13",   FALSE, 0, 0xffffffff, FALSE),
    196   HOWTO (RELOC_BASE10,  0,  2, 	10, FALSE, 0, complain_overflow_dont,     0, "BASE10",      FALSE, 0, 0x000003ff, FALSE),
    197   HOWTO (RELOC_BASE13,  0,  2,	13, FALSE, 0, complain_overflow_signed,   0, "BASE13",      FALSE, 0, 0x00001fff, FALSE),
    198   HOWTO (RELOC_BASE22, 10,  2,	22, FALSE, 0, complain_overflow_bitfield, 0, "BASE22",      FALSE, 0, 0x003fffff, FALSE),
    199   HOWTO (RELOC_PC10,    0,  2,	10, TRUE,  0, complain_overflow_dont,     0, "PC10",	    FALSE, 0, 0x000003ff, TRUE),
    200   HOWTO (RELOC_PC22,   10,  2,	22, TRUE,  0, complain_overflow_signed,   0, "PC22",  	    FALSE, 0, 0x003fffff, TRUE),
    201   HOWTO (RELOC_JMP_TBL, 2,  2, 	30, TRUE,  0, complain_overflow_signed,   0, "JMP_TBL",     FALSE, 0, 0x3fffffff, FALSE),
    202   HOWTO (RELOC_SEGOFF16,0,  2,	0,  FALSE, 0, complain_overflow_bitfield, 0, "SEGOFF16",    FALSE, 0, 0x00000000, FALSE),
    203   HOWTO (RELOC_GLOB_DAT,0,  2,	0,  FALSE, 0, complain_overflow_bitfield, 0, "GLOB_DAT",    FALSE, 0, 0x00000000, FALSE),
    204   HOWTO (RELOC_JMP_SLOT,0,  2,	0,  FALSE, 0, complain_overflow_bitfield, 0, "JMP_SLOT",    FALSE, 0, 0x00000000, FALSE),
    205   HOWTO (RELOC_RELATIVE,0,  2,	0,  FALSE, 0, complain_overflow_bitfield, 0, "RELATIVE",    FALSE, 0, 0x00000000, FALSE),
    206   HOWTO (0,             0,  0,  0,  FALSE, 0, complain_overflow_dont,     0, "R_SPARC_NONE",FALSE, 0, 0x00000000, TRUE),
    207   HOWTO (0,             0,  0,  0,  FALSE, 0, complain_overflow_dont,     0, "R_SPARC_NONE",FALSE, 0, 0x00000000, TRUE),
    208 #define RELOC_SPARC_REV32 RELOC_WDISP19
    209   HOWTO (RELOC_SPARC_REV32, 0, 2, 32, FALSE, 0, complain_overflow_dont,   0,"R_SPARC_REV32",FALSE, 0, 0xffffffff, FALSE),
    210 };
    211 
    212 /* Convert standard reloc records to "arelent" format (incl byte swap).  */
    213 
    214 reloc_howto_type howto_table_std[] =
    215 {
    216   /* type              rs size bsz  pcrel bitpos ovrf                     sf name     part_inpl readmask  setmask    pcdone.  */
    217 HOWTO ( 0,	       0,  0,  	8,  FALSE, 0, complain_overflow_bitfield,0,"8",		TRUE, 0x000000ff,0x000000ff, FALSE),
    218 HOWTO ( 1,	       0,  1, 	16, FALSE, 0, complain_overflow_bitfield,0,"16",	TRUE, 0x0000ffff,0x0000ffff, FALSE),
    219 HOWTO ( 2,	       0,  2, 	32, FALSE, 0, complain_overflow_bitfield,0,"32",	TRUE, 0xffffffff,0xffffffff, FALSE),
    220 HOWTO ( 3,	       0,  4, 	64, FALSE, 0, complain_overflow_bitfield,0,"64",	TRUE, 0xdeaddead,0xdeaddead, FALSE),
    221 HOWTO ( 4,	       0,  0, 	8,  TRUE,  0, complain_overflow_signed,  0,"DISP8",	TRUE, 0x000000ff,0x000000ff, FALSE),
    222 HOWTO ( 5,	       0,  1, 	16, TRUE,  0, complain_overflow_signed,  0,"DISP16",	TRUE, 0x0000ffff,0x0000ffff, FALSE),
    223 HOWTO ( 6,	       0,  2, 	32, TRUE,  0, complain_overflow_signed,  0,"DISP32",	TRUE, 0xffffffff,0xffffffff, FALSE),
    224 HOWTO ( 7,	       0,  4, 	64, TRUE,  0, complain_overflow_signed,  0,"DISP64",	TRUE, 0xfeedface,0xfeedface, FALSE),
    225 HOWTO ( 8,	       0,  2,    0, FALSE, 0, complain_overflow_bitfield,0,"GOT_REL",	FALSE,         0,0x00000000, FALSE),
    226 HOWTO ( 9,	       0,  1,   16, FALSE, 0, complain_overflow_bitfield,0,"BASE16",	FALSE,0xffffffff,0xffffffff, FALSE),
    227 HOWTO (10,	       0,  2,   32, FALSE, 0, complain_overflow_bitfield,0,"BASE32",	FALSE,0xffffffff,0xffffffff, FALSE),
    228 EMPTY_HOWTO (-1),
    229 EMPTY_HOWTO (-1),
    230 EMPTY_HOWTO (-1),
    231 EMPTY_HOWTO (-1),
    232 EMPTY_HOWTO (-1),
    233   HOWTO (16,	       0,  2,	 0, FALSE, 0, complain_overflow_bitfield,0,"JMP_TABLE", FALSE,         0,0x00000000, FALSE),
    234 EMPTY_HOWTO (-1),
    235 EMPTY_HOWTO (-1),
    236 EMPTY_HOWTO (-1),
    237 EMPTY_HOWTO (-1),
    238 EMPTY_HOWTO (-1),
    239 EMPTY_HOWTO (-1),
    240 EMPTY_HOWTO (-1),
    241 EMPTY_HOWTO (-1),
    242 EMPTY_HOWTO (-1),
    243 EMPTY_HOWTO (-1),
    244 EMPTY_HOWTO (-1),
    245 EMPTY_HOWTO (-1),
    246 EMPTY_HOWTO (-1),
    247 EMPTY_HOWTO (-1),
    248 EMPTY_HOWTO (-1),
    249   HOWTO (32,	       0,  2,	 0, FALSE, 0, complain_overflow_bitfield,0,"RELATIVE",  FALSE,         0,0x00000000, FALSE),
    250 EMPTY_HOWTO (-1),
    251 EMPTY_HOWTO (-1),
    252 EMPTY_HOWTO (-1),
    253 EMPTY_HOWTO (-1),
    254 EMPTY_HOWTO (-1),
    255 EMPTY_HOWTO (-1),
    256 EMPTY_HOWTO (-1),
    257   HOWTO (40,	       0,  2,	 0, FALSE, 0, complain_overflow_bitfield,0,"BASEREL",   FALSE,         0,0x00000000, FALSE),
    258 };
    259 
    260 #define TABLE_SIZE(TABLE)	(sizeof (TABLE) / sizeof (TABLE[0]))
    261 
    262 reloc_howto_type *
    263 NAME (aout, reloc_type_lookup) (bfd *abfd, bfd_reloc_code_real_type code)
    264 {
    265 #define EXT(i, j)	case i: return & howto_table_ext [j]
    266 #define STD(i, j)	case i: return & howto_table_std [j]
    267   int ext = obj_reloc_entry_size (abfd) == RELOC_EXT_SIZE;
    268 
    269   if (code == BFD_RELOC_CTOR)
    270     switch (bfd_arch_bits_per_address (abfd))
    271       {
    272       case 32:
    273 	code = BFD_RELOC_32;
    274 	break;
    275       case 64:
    276 	code = BFD_RELOC_64;
    277 	break;
    278       }
    279 
    280   if (ext)
    281     switch (code)
    282       {
    283 	EXT (BFD_RELOC_8, 0);
    284 	EXT (BFD_RELOC_16, 1);
    285 	EXT (BFD_RELOC_32, 2);
    286 	EXT (BFD_RELOC_HI22, 8);
    287 	EXT (BFD_RELOC_LO10, 11);
    288 	EXT (BFD_RELOC_32_PCREL_S2, 6);
    289 	EXT (BFD_RELOC_SPARC_WDISP22, 7);
    290 	EXT (BFD_RELOC_SPARC13, 10);
    291 	EXT (BFD_RELOC_SPARC_GOT10, 14);
    292 	EXT (BFD_RELOC_SPARC_BASE13, 15);
    293 	EXT (BFD_RELOC_SPARC_GOT13, 15);
    294 	EXT (BFD_RELOC_SPARC_GOT22, 16);
    295 	EXT (BFD_RELOC_SPARC_PC10, 17);
    296 	EXT (BFD_RELOC_SPARC_PC22, 18);
    297 	EXT (BFD_RELOC_SPARC_WPLT30, 19);
    298 	EXT (BFD_RELOC_SPARC_REV32, 26);
    299       default:
    300 	return NULL;
    301       }
    302   else
    303     /* std relocs.  */
    304     switch (code)
    305       {
    306 	STD (BFD_RELOC_8, 0);
    307 	STD (BFD_RELOC_16, 1);
    308 	STD (BFD_RELOC_32, 2);
    309 	STD (BFD_RELOC_8_PCREL, 4);
    310 	STD (BFD_RELOC_16_PCREL, 5);
    311 	STD (BFD_RELOC_32_PCREL, 6);
    312 	STD (BFD_RELOC_16_BASEREL, 9);
    313 	STD (BFD_RELOC_32_BASEREL, 10);
    314       default:
    315 	return NULL;
    316       }
    317 }
    318 
    319 reloc_howto_type *
    320 NAME (aout, reloc_name_lookup) (bfd *abfd, const char *r_name)
    321 {
    322   unsigned int i, size;
    323   reloc_howto_type *howto_table;
    324 
    325   if (obj_reloc_entry_size (abfd) == RELOC_EXT_SIZE)
    326     {
    327       howto_table = howto_table_ext;
    328       size = sizeof (howto_table_ext) / sizeof (howto_table_ext[0]);
    329     }
    330   else
    331     {
    332       howto_table = howto_table_std;
    333       size = sizeof (howto_table_std) / sizeof (howto_table_std[0]);
    334     }
    335 
    336   for (i = 0; i < size; i++)
    337     if (howto_table[i].name != NULL
    338 	&& strcasecmp (howto_table[i].name, r_name) == 0)
    339       return &howto_table[i];
    340 
    341   return NULL;
    342 }
    343 
    344 /*
    345 SUBSECTION
    346 	Internal entry points
    347 
    348 DESCRIPTION
    349 	@file{aoutx.h} exports several routines for accessing the
    350 	contents of an a.out file, which are gathered and exported in
    351 	turn by various format specific files (eg sunos.c).
    352 */
    353 
    354 /*
    355 FUNCTION
    356 	 aout_@var{size}_swap_exec_header_in
    357 
    358 SYNOPSIS
    359 	void aout_@var{size}_swap_exec_header_in,
    360            (bfd *abfd,
    361             struct external_exec *bytes,
    362             struct internal_exec *execp);
    363 
    364 DESCRIPTION
    365 	Swap the information in an executable header @var{raw_bytes} taken
    366 	from a raw byte stream memory image into the internal exec header
    367 	structure @var{execp}.
    368 */
    369 
    370 #ifndef NAME_swap_exec_header_in
    371 void
    372 NAME (aout, swap_exec_header_in) (bfd *abfd,
    373 				  struct external_exec *bytes,
    374 				  struct internal_exec *execp)
    375 {
    376   /* The internal_exec structure has some fields that are unused in this
    377      configuration (IE for i960), so ensure that all such uninitialized
    378      fields are zero'd out.  There are places where two of these structs
    379      are memcmp'd, and thus the contents do matter.  */
    380   memset ((void *) execp, 0, sizeof (struct internal_exec));
    381   /* Now fill in fields in the execp, from the bytes in the raw data.  */
    382   execp->a_info   = H_GET_32 (abfd, bytes->e_info);
    383   execp->a_text   = GET_WORD (abfd, bytes->e_text);
    384   execp->a_data   = GET_WORD (abfd, bytes->e_data);
    385   execp->a_bss    = GET_WORD (abfd, bytes->e_bss);
    386   execp->a_syms   = GET_WORD (abfd, bytes->e_syms);
    387   execp->a_entry  = GET_WORD (abfd, bytes->e_entry);
    388   execp->a_trsize = GET_WORD (abfd, bytes->e_trsize);
    389   execp->a_drsize = GET_WORD (abfd, bytes->e_drsize);
    390 }
    391 #define NAME_swap_exec_header_in NAME (aout, swap_exec_header_in)
    392 #endif
    393 
    394 /*
    395 FUNCTION
    396 	aout_@var{size}_swap_exec_header_out
    397 
    398 SYNOPSIS
    399 	void aout_@var{size}_swap_exec_header_out
    400 	  (bfd *abfd,
    401 	   struct internal_exec *execp,
    402 	   struct external_exec *raw_bytes);
    403 
    404 DESCRIPTION
    405 	Swap the information in an internal exec header structure
    406 	@var{execp} into the buffer @var{raw_bytes} ready for writing to disk.
    407 */
    408 void
    409 NAME (aout, swap_exec_header_out) (bfd *abfd,
    410 				   struct internal_exec *execp,
    411 				   struct external_exec *bytes)
    412 {
    413   /* Now fill in fields in the raw data, from the fields in the exec struct.  */
    414   H_PUT_32 (abfd, execp->a_info  , bytes->e_info);
    415   PUT_WORD (abfd, execp->a_text  , bytes->e_text);
    416   PUT_WORD (abfd, execp->a_data  , bytes->e_data);
    417   PUT_WORD (abfd, execp->a_bss   , bytes->e_bss);
    418   PUT_WORD (abfd, execp->a_syms  , bytes->e_syms);
    419   PUT_WORD (abfd, execp->a_entry , bytes->e_entry);
    420   PUT_WORD (abfd, execp->a_trsize, bytes->e_trsize);
    421   PUT_WORD (abfd, execp->a_drsize, bytes->e_drsize);
    422 }
    423 
    424 /* Make all the section for an a.out file.  */
    425 
    426 bfd_boolean
    427 NAME (aout, make_sections) (bfd *abfd)
    428 {
    429   if (obj_textsec (abfd) == NULL && bfd_make_section (abfd, ".text") == NULL)
    430     return FALSE;
    431   if (obj_datasec (abfd) == NULL && bfd_make_section (abfd, ".data") == NULL)
    432     return FALSE;
    433   if (obj_bsssec (abfd) == NULL && bfd_make_section (abfd, ".bss") == NULL)
    434     return FALSE;
    435   return TRUE;
    436 }
    437 
    438 /*
    439 FUNCTION
    440 	aout_@var{size}_some_aout_object_p
    441 
    442 SYNOPSIS
    443 	const bfd_target *aout_@var{size}_some_aout_object_p
    444 	 (bfd *abfd,
    445           struct internal_exec *execp,
    446 	  const bfd_target *(*callback_to_real_object_p) (bfd *));
    447 
    448 DESCRIPTION
    449 	Some a.out variant thinks that the file open in @var{abfd}
    450 	checking is an a.out file.  Do some more checking, and set up
    451 	for access if it really is.  Call back to the calling
    452 	environment's "finish up" function just before returning, to
    453 	handle any last-minute setup.
    454 */
    455 
    456 const bfd_target *
    457 NAME (aout, some_aout_object_p) (bfd *abfd,
    458 				 struct internal_exec *execp,
    459 				 const bfd_target *(*callback_to_real_object_p) (bfd *))
    460 {
    461   struct aout_data_struct *rawptr, *oldrawptr;
    462   const bfd_target *result;
    463   bfd_size_type amt = sizeof (* rawptr);
    464 
    465   rawptr = (struct aout_data_struct *) bfd_zalloc (abfd, amt);
    466   if (rawptr == NULL)
    467     return NULL;
    468 
    469   oldrawptr = abfd->tdata.aout_data;
    470   abfd->tdata.aout_data = rawptr;
    471 
    472   /* Copy the contents of the old tdata struct.
    473      In particular, we want the subformat, since for hpux it was set in
    474      hp300hpux.c:swap_exec_header_in and will be used in
    475      hp300hpux.c:callback.  */
    476   if (oldrawptr != NULL)
    477     *abfd->tdata.aout_data = *oldrawptr;
    478 
    479   abfd->tdata.aout_data->a.hdr = &rawptr->e;
    480   /* Copy in the internal_exec struct.  */
    481   *(abfd->tdata.aout_data->a.hdr) = *execp;
    482   execp = abfd->tdata.aout_data->a.hdr;
    483 
    484   /* Set the file flags.  */
    485   abfd->flags = BFD_NO_FLAGS;
    486   if (execp->a_drsize || execp->a_trsize)
    487     abfd->flags |= HAS_RELOC;
    488   /* Setting of EXEC_P has been deferred to the bottom of this function.  */
    489   if (execp->a_syms)
    490     abfd->flags |= HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS;
    491   if (N_DYNAMIC (*execp))
    492     abfd->flags |= DYNAMIC;
    493 
    494   if (N_MAGIC (*execp) == ZMAGIC)
    495     {
    496       abfd->flags |= D_PAGED | WP_TEXT;
    497       adata (abfd).magic = z_magic;
    498     }
    499   else if (N_MAGIC (*execp) == QMAGIC)
    500     {
    501       abfd->flags |= D_PAGED | WP_TEXT;
    502       adata (abfd).magic = z_magic;
    503       adata (abfd).subformat = q_magic_format;
    504     }
    505   else if (N_MAGIC (*execp) == NMAGIC)
    506     {
    507       abfd->flags |= WP_TEXT;
    508       adata (abfd).magic = n_magic;
    509     }
    510   else if (N_MAGIC (*execp) == OMAGIC
    511 	   || N_MAGIC (*execp) == BMAGIC)
    512     adata (abfd).magic = o_magic;
    513   else
    514     /* Should have been checked with N_BADMAG before this routine
    515        was called.  */
    516     abort ();
    517 
    518   bfd_get_start_address (abfd) = execp->a_entry;
    519 
    520   obj_aout_symbols (abfd) = NULL;
    521   bfd_get_symcount (abfd) = execp->a_syms / sizeof (struct external_nlist);
    522 
    523   /* The default relocation entry size is that of traditional V7 Unix.  */
    524   obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
    525 
    526   /* The default symbol entry size is that of traditional Unix.  */
    527   obj_symbol_entry_size (abfd) = EXTERNAL_NLIST_SIZE;
    528 
    529 #ifdef USE_MMAP
    530   bfd_init_window (&obj_aout_sym_window (abfd));
    531   bfd_init_window (&obj_aout_string_window (abfd));
    532 #endif
    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     goto error_ret;
    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 
    564   struct exec *execp = exec_hdr (abfd);
    565 
    566   obj_textsec (abfd)->size = N_TXTSIZE (*execp);
    567   /* Data and bss are already filled in since they're so standard.  */
    568 
    569   /* The virtual memory addresses of the sections.  */
    570   obj_textsec (abfd)->vma = N_TXTADDR (*execp);
    571   obj_datasec (abfd)->vma = N_DATADDR (*execp);
    572   obj_bsssec  (abfd)->vma = N_BSSADDR (*execp);
    573 
    574   /* The file offsets of the sections.  */
    575   obj_textsec (abfd)->filepos = N_TXTOFF (*execp);
    576   obj_datasec (abfd)->filepos = N_DATOFF (*execp);
    577 
    578   /* The file offsets of the relocation info.  */
    579   obj_textsec (abfd)->rel_filepos = N_TRELOFF (*execp);
    580   obj_datasec (abfd)->rel_filepos = N_DRELOFF (*execp);
    581 
    582   /* The file offsets of the string table and symbol table.  */
    583   obj_str_filepos (abfd) = N_STROFF (*execp);
    584   obj_sym_filepos (abfd) = N_SYMOFF (*execp);
    585 
    586   /* Determine the architecture and machine type of the object file.  */
    587   switch (N_MACHTYPE (*exec_hdr (abfd)))
    588     {
    589     default:
    590       abfd->obj_arch = bfd_arch_obscure;
    591       break;
    592     }
    593 
    594   adata (abfd)->page_size = TARGET_PAGE_SIZE;
    595   adata (abfd)->segment_size = SEGMENT_SIZE;
    596   adata (abfd)->exec_bytes_size = EXEC_BYTES_SIZE;
    597 
    598   return abfd->xvec;
    599 
    600   /* The architecture is encoded in various ways in various a.out variants,
    601      or is not encoded at all in some of them.  The relocation size depends
    602      on the architecture and the a.out variant.  Finally, the return value
    603      is the bfd_target vector in use.  If an error occurs, return zero and
    604      set bfd_error to the appropriate error code.
    605 
    606      Formats such as b.out, which have additional fields in the a.out
    607      header, should cope with them in this callback as well.  */
    608 #endif				/* DOCUMENTATION */
    609 
    610   result = (*callback_to_real_object_p) (abfd);
    611 
    612   /* Now that the segment addresses have been worked out, take a better
    613      guess at whether the file is executable.  If the entry point
    614      is within the text segment, assume it is.  (This makes files
    615      executable even if their entry point address is 0, as long as
    616      their text starts at zero.).
    617 
    618      This test had to be changed to deal with systems where the text segment
    619      runs at a different location than the default.  The problem is that the
    620      entry address can appear to be outside the text segment, thus causing an
    621      erroneous conclusion that the file isn't executable.
    622 
    623      To fix this, we now accept any non-zero entry point as an indication of
    624      executability.  This will work most of the time, since only the linker
    625      sets the entry point, and that is likely to be non-zero for most systems.  */
    626 
    627   if (execp->a_entry != 0
    628       || (execp->a_entry >= obj_textsec (abfd)->vma
    629 	  && execp->a_entry < (obj_textsec (abfd)->vma
    630 			       + obj_textsec (abfd)->size)
    631 	  && execp->a_trsize == 0
    632 	  && execp->a_drsize == 0))
    633     abfd->flags |= EXEC_P;
    634 #ifdef STAT_FOR_EXEC
    635   else
    636     {
    637       struct stat stat_buf;
    638 
    639       /* The original heuristic doesn't work in some important cases.
    640         The a.out file has no information about the text start
    641         address.  For files (like kernels) linked to non-standard
    642         addresses (ld -Ttext nnn) the entry point may not be between
    643         the default text start (obj_textsec(abfd)->vma) and
    644         (obj_textsec(abfd)->vma) + text size.  This is not just a mach
    645         issue.  Many kernels are loaded at non standard addresses.  */
    646       if (abfd->iostream != NULL
    647 	  && (abfd->flags & BFD_IN_MEMORY) == 0
    648 	  && (fstat (fileno ((FILE *) (abfd->iostream)), &stat_buf) == 0)
    649 	  && ((stat_buf.st_mode & 0111) != 0))
    650 	abfd->flags |= EXEC_P;
    651     }
    652 #endif /* STAT_FOR_EXEC */
    653 
    654   if (result)
    655     return result;
    656 
    657  error_ret:
    658   bfd_release (abfd, rawptr);
    659   abfd->tdata.aout_data = oldrawptr;
    660   return NULL;
    661 }
    662 
    663 /*
    664 FUNCTION
    665 	aout_@var{size}_mkobject
    666 
    667 SYNOPSIS
    668 	bfd_boolean aout_@var{size}_mkobject, (bfd *abfd);
    669 
    670 DESCRIPTION
    671 	Initialize BFD @var{abfd} for use with a.out files.
    672 */
    673 
    674 bfd_boolean
    675 NAME (aout, mkobject) (bfd *abfd)
    676 {
    677   struct aout_data_struct *rawptr;
    678   bfd_size_type amt = sizeof (* rawptr);
    679 
    680   bfd_set_error (bfd_error_system_call);
    681 
    682   rawptr = (struct aout_data_struct *) bfd_zalloc (abfd, amt);
    683   if (rawptr == NULL)
    684     return FALSE;
    685 
    686   abfd->tdata.aout_data = rawptr;
    687   exec_hdr (abfd) = &(rawptr->e);
    688 
    689   obj_textsec (abfd) = NULL;
    690   obj_datasec (abfd) = NULL;
    691   obj_bsssec (abfd) = NULL;
    692 
    693   return TRUE;
    694 }
    695 
    696 /*
    697 FUNCTION
    698 	aout_@var{size}_machine_type
    699 
    700 SYNOPSIS
    701 	enum machine_type  aout_@var{size}_machine_type
    702 	 (enum bfd_architecture arch,
    703 	  unsigned long machine,
    704           bfd_boolean *unknown);
    705 
    706 DESCRIPTION
    707 	Keep track of machine architecture and machine type for
    708 	a.out's. Return the <<machine_type>> for a particular
    709 	architecture and machine, or <<M_UNKNOWN>> if that exact architecture
    710 	and machine can't be represented in a.out format.
    711 
    712 	If the architecture is understood, machine type 0 (default)
    713 	is always understood.
    714 */
    715 
    716 enum machine_type
    717 NAME (aout, machine_type) (enum bfd_architecture arch,
    718 			   unsigned long machine,
    719 			   bfd_boolean *unknown)
    720 {
    721   enum machine_type arch_flags;
    722 
    723   arch_flags = M_UNKNOWN;
    724   *unknown = TRUE;
    725 
    726   switch (arch)
    727     {
    728     case bfd_arch_sparc:
    729       if (machine == 0
    730 	  || machine == bfd_mach_sparc
    731 	  || machine == bfd_mach_sparc_sparclite
    732 	  || machine == bfd_mach_sparc_sparclite_le
    733 	  || machine == bfd_mach_sparc_v8plus
    734 	  || machine == bfd_mach_sparc_v8plusa
    735 	  || machine == bfd_mach_sparc_v8plusb
    736 	  || machine == bfd_mach_sparc_v9
    737 	  || machine == bfd_mach_sparc_v9a
    738 	  || machine == bfd_mach_sparc_v9b)
    739 	arch_flags = M_SPARC;
    740       else if (machine == bfd_mach_sparc_sparclet)
    741 	arch_flags = M_SPARCLET;
    742       break;
    743 
    744     case bfd_arch_m68k:
    745       switch (machine)
    746 	{
    747 	case 0:		      arch_flags = M_68010; break;
    748 	case bfd_mach_m68000: arch_flags = M_UNKNOWN; *unknown = FALSE; break;
    749 	case bfd_mach_m68010: arch_flags = M_68010; break;
    750 	case bfd_mach_m68020: arch_flags = M_68020; break;
    751 	default:	      arch_flags = M_UNKNOWN; break;
    752 	}
    753       break;
    754 
    755     case bfd_arch_i386:
    756       if (machine == 0
    757 	  || machine == bfd_mach_i386_i386
    758 	  || machine == bfd_mach_i386_i386_intel_syntax)
    759 	arch_flags = M_386;
    760       break;
    761 
    762     case bfd_arch_arm:
    763       if (machine == 0)
    764 	arch_flags = M_ARM;
    765       break;
    766 
    767     case bfd_arch_mips:
    768       switch (machine)
    769 	{
    770 	case 0:
    771 	case bfd_mach_mips3000:
    772 	case bfd_mach_mips3900:
    773 	  arch_flags = M_MIPS1;
    774 	  break;
    775 	case bfd_mach_mips6000:
    776 	  arch_flags = M_MIPS2;
    777 	  break;
    778 	case bfd_mach_mips4000:
    779 	case bfd_mach_mips4010:
    780 	case bfd_mach_mips4100:
    781 	case bfd_mach_mips4300:
    782 	case bfd_mach_mips4400:
    783 	case bfd_mach_mips4600:
    784 	case bfd_mach_mips4650:
    785 	case bfd_mach_mips8000:
    786 	case bfd_mach_mips9000:
    787 	case bfd_mach_mips10000:
    788 	case bfd_mach_mips12000:
    789 	case bfd_mach_mips14000:
    790 	case bfd_mach_mips16000:
    791 	case bfd_mach_mips16:
    792 	case bfd_mach_mipsisa32:
    793 	case bfd_mach_mipsisa32r2:
    794 	case bfd_mach_mipsisa32r3:
    795 	case bfd_mach_mipsisa32r5:
    796 	case bfd_mach_mipsisa32r6:
    797 	case bfd_mach_mips5:
    798 	case bfd_mach_mipsisa64:
    799 	case bfd_mach_mipsisa64r2:
    800 	case bfd_mach_mipsisa64r3:
    801 	case bfd_mach_mipsisa64r5:
    802 	case bfd_mach_mipsisa64r6:
    803 	case bfd_mach_mips_sb1:
    804 	case bfd_mach_mips_xlr:
    805 	  /* FIXME: These should be MIPS3, MIPS4, MIPS16, MIPS32, etc.  */
    806 	  arch_flags = M_MIPS2;
    807 	  break;
    808 	default:
    809 	  arch_flags = M_UNKNOWN;
    810 	  break;
    811 	}
    812       break;
    813 
    814     case bfd_arch_ns32k:
    815       switch (machine)
    816 	{
    817 	case 0:    	arch_flags = M_NS32532; break;
    818 	case 32032:	arch_flags = M_NS32032; break;
    819 	case 32532:	arch_flags = M_NS32532; break;
    820 	default:	arch_flags = M_UNKNOWN; break;
    821 	}
    822       break;
    823 
    824     case bfd_arch_vax:
    825       *unknown = FALSE;
    826       break;
    827 
    828     case bfd_arch_cris:
    829       if (machine == 0 || machine == 255)
    830 	arch_flags = M_CRIS;
    831       break;
    832 
    833     case bfd_arch_m88k:
    834       *unknown = FALSE;
    835       break;
    836 
    837     default:
    838       arch_flags = M_UNKNOWN;
    839     }
    840 
    841   if (arch_flags != M_UNKNOWN)
    842     *unknown = FALSE;
    843 
    844   return arch_flags;
    845 }
    846 
    847 /*
    848 FUNCTION
    849 	aout_@var{size}_set_arch_mach
    850 
    851 SYNOPSIS
    852 	bfd_boolean aout_@var{size}_set_arch_mach,
    853 	 (bfd *,
    854 	  enum bfd_architecture arch,
    855 	  unsigned long machine);
    856 
    857 DESCRIPTION
    858 	Set the architecture and the machine of the BFD @var{abfd} to the
    859 	values @var{arch} and @var{machine}.  Verify that @var{abfd}'s format
    860 	can support the architecture required.
    861 */
    862 
    863 bfd_boolean
    864 NAME (aout, set_arch_mach) (bfd *abfd,
    865 			    enum bfd_architecture arch,
    866 			    unsigned long machine)
    867 {
    868   if (! bfd_default_set_arch_mach (abfd, arch, machine))
    869     return FALSE;
    870 
    871   if (arch != bfd_arch_unknown)
    872     {
    873       bfd_boolean unknown;
    874 
    875       NAME (aout, machine_type) (arch, machine, &unknown);
    876       if (unknown)
    877 	return FALSE;
    878     }
    879 
    880   /* Determine the size of a relocation entry.  */
    881   switch (arch)
    882     {
    883     case bfd_arch_sparc:
    884     case bfd_arch_mips:
    885       obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE;
    886       break;
    887     default:
    888       obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
    889       break;
    890     }
    891 
    892   return (*aout_backend_info (abfd)->set_sizes) (abfd);
    893 }
    894 
    895 static void
    896 adjust_o_magic (bfd *abfd, struct internal_exec *execp)
    897 {
    898   file_ptr pos = adata (abfd).exec_bytes_size;
    899   bfd_vma vma = 0;
    900   int pad = 0;
    901 
    902   /* Text.  */
    903   obj_textsec (abfd)->filepos = pos;
    904   if (!obj_textsec (abfd)->user_set_vma)
    905     obj_textsec (abfd)->vma = vma;
    906   else
    907     vma = obj_textsec (abfd)->vma;
    908 
    909   pos += obj_textsec (abfd)->size;
    910   vma += obj_textsec (abfd)->size;
    911 
    912   /* Data.  */
    913   if (!obj_datasec (abfd)->user_set_vma)
    914     {
    915       obj_textsec (abfd)->size += pad;
    916       pos += pad;
    917       vma += pad;
    918       obj_datasec (abfd)->vma = vma;
    919     }
    920   else
    921     vma = obj_datasec (abfd)->vma;
    922   obj_datasec (abfd)->filepos = pos;
    923   pos += obj_datasec (abfd)->size;
    924   vma += obj_datasec (abfd)->size;
    925 
    926   /* BSS.  */
    927   if (!obj_bsssec (abfd)->user_set_vma)
    928     {
    929       obj_datasec (abfd)->size += pad;
    930       pos += pad;
    931       vma += pad;
    932       obj_bsssec (abfd)->vma = vma;
    933     }
    934   else
    935     {
    936       /* The VMA of the .bss section is set by the VMA of the
    937          .data section plus the size of the .data section.  We may
    938          need to add padding bytes to make this true.  */
    939       pad = obj_bsssec (abfd)->vma - vma;
    940       if (pad > 0)
    941 	{
    942 	  obj_datasec (abfd)->size += pad;
    943 	  pos += pad;
    944 	}
    945     }
    946   obj_bsssec (abfd)->filepos = pos;
    947 
    948   /* Fix up the exec header.  */
    949   execp->a_text = obj_textsec (abfd)->size;
    950   execp->a_data = obj_datasec (abfd)->size;
    951   execp->a_bss = obj_bsssec (abfd)->size;
    952   N_SET_MAGIC (*execp, OMAGIC);
    953 }
    954 
    955 static void
    956 adjust_z_magic (bfd *abfd, struct internal_exec *execp)
    957 {
    958   bfd_size_type data_pad, text_pad;
    959   file_ptr text_end;
    960   const struct aout_backend_data *abdp;
    961   /* TRUE if text includes exec header.  */
    962   bfd_boolean ztih;
    963 
    964   abdp = aout_backend_info (abfd);
    965 
    966   /* Text.  */
    967   ztih = (abdp != NULL
    968 	  && (abdp->text_includes_header
    969 	      || obj_aout_subformat (abfd) == q_magic_format));
    970   obj_textsec (abfd)->filepos = (ztih
    971 				 ? adata (abfd).exec_bytes_size
    972 				 : adata (abfd).zmagic_disk_block_size);
    973   if (! obj_textsec (abfd)->user_set_vma)
    974     {
    975       /* ?? Do we really need to check for relocs here?  */
    976       obj_textsec (abfd)->vma = ((abfd->flags & HAS_RELOC)
    977 				 ? 0
    978 				 : (ztih
    979 				    ? (abdp->default_text_vma
    980 				       + adata (abfd).exec_bytes_size)
    981 				    : abdp->default_text_vma));
    982       text_pad = 0;
    983     }
    984   else
    985     {
    986       /* The .text section is being loaded at an unusual address.  We
    987          may need to pad it such that the .data section starts at a page
    988          boundary.  */
    989       if (ztih)
    990 	text_pad = ((obj_textsec (abfd)->filepos - obj_textsec (abfd)->vma)
    991 		    & (adata (abfd).page_size - 1));
    992       else
    993 	text_pad = ((- obj_textsec (abfd)->vma)
    994 		    & (adata (abfd).page_size - 1));
    995     }
    996 
    997   /* Find start of data.  */
    998   if (ztih)
    999     {
   1000       text_end = obj_textsec (abfd)->filepos + obj_textsec (abfd)->size;
   1001       text_pad += BFD_ALIGN (text_end, adata (abfd).page_size) - text_end;
   1002     }
   1003   else
   1004     {
   1005       /* Note that if page_size == zmagic_disk_block_size, then
   1006 	 filepos == page_size, and this case is the same as the ztih
   1007 	 case.  */
   1008       text_end = obj_textsec (abfd)->size;
   1009       text_pad += BFD_ALIGN (text_end, adata (abfd).page_size) - text_end;
   1010       text_end += obj_textsec (abfd)->filepos;
   1011     }
   1012   obj_textsec (abfd)->size += text_pad;
   1013   text_end += text_pad;
   1014 
   1015   /* Data.  */
   1016   if (!obj_datasec (abfd)->user_set_vma)
   1017     {
   1018       bfd_vma vma;
   1019       vma = obj_textsec (abfd)->vma + obj_textsec (abfd)->size;
   1020       obj_datasec (abfd)->vma = BFD_ALIGN (vma, adata (abfd).segment_size);
   1021     }
   1022   if (abdp && abdp->zmagic_mapped_contiguous)
   1023     {
   1024       asection * text = obj_textsec (abfd);
   1025       asection * data = obj_datasec (abfd);
   1026 
   1027       text_pad = data->vma - (text->vma + text->size);
   1028       /* Only pad the text section if the data
   1029 	 section is going to be placed after it.  */
   1030       if (text_pad > 0)
   1031 	text->size += text_pad;
   1032     }
   1033   obj_datasec (abfd)->filepos = (obj_textsec (abfd)->filepos
   1034 				 + obj_textsec (abfd)->size);
   1035 
   1036   /* Fix up exec header while we're at it.  */
   1037   execp->a_text = obj_textsec (abfd)->size;
   1038   if (ztih && (!abdp || (abdp && !abdp->exec_header_not_counted)))
   1039     execp->a_text += adata (abfd).exec_bytes_size;
   1040   if (obj_aout_subformat (abfd) == q_magic_format)
   1041     N_SET_MAGIC (*execp, QMAGIC);
   1042   else
   1043     N_SET_MAGIC (*execp, ZMAGIC);
   1044 
   1045   /* Spec says data section should be rounded up to page boundary.  */
   1046   obj_datasec (abfd)->size
   1047     = align_power (obj_datasec (abfd)->size,
   1048 		   obj_bsssec (abfd)->alignment_power);
   1049   execp->a_data = BFD_ALIGN (obj_datasec (abfd)->size,
   1050 			     adata (abfd).page_size);
   1051   data_pad = execp->a_data - obj_datasec (abfd)->size;
   1052 
   1053   /* BSS.  */
   1054   if (!obj_bsssec (abfd)->user_set_vma)
   1055     obj_bsssec (abfd)->vma = (obj_datasec (abfd)->vma
   1056 			      + obj_datasec (abfd)->size);
   1057   /* If the BSS immediately follows the data section and extra space
   1058      in the page is left after the data section, fudge data
   1059      in the header so that the bss section looks smaller by that
   1060      amount.  We'll start the bss section there, and lie to the OS.
   1061      (Note that a linker script, as well as the above assignment,
   1062      could have explicitly set the BSS vma to immediately follow
   1063      the data section.)  */
   1064   if (align_power (obj_bsssec (abfd)->vma, obj_bsssec (abfd)->alignment_power)
   1065       == obj_datasec (abfd)->vma + obj_datasec (abfd)->size)
   1066     execp->a_bss = (data_pad > obj_bsssec (abfd)->size
   1067 		    ? 0 : obj_bsssec (abfd)->size - data_pad);
   1068   else
   1069     execp->a_bss = obj_bsssec (abfd)->size;
   1070 }
   1071 
   1072 static void
   1073 adjust_n_magic (bfd *abfd, struct internal_exec *execp)
   1074 {
   1075   file_ptr pos = adata (abfd).exec_bytes_size;
   1076   bfd_vma vma = 0;
   1077   int pad;
   1078 
   1079   /* Text.  */
   1080   obj_textsec (abfd)->filepos = pos;
   1081   if (!obj_textsec (abfd)->user_set_vma)
   1082     obj_textsec (abfd)->vma = vma;
   1083   else
   1084     vma = obj_textsec (abfd)->vma;
   1085   pos += obj_textsec (abfd)->size;
   1086   vma += obj_textsec (abfd)->size;
   1087 
   1088   /* Data.  */
   1089   obj_datasec (abfd)->filepos = pos;
   1090   if (!obj_datasec (abfd)->user_set_vma)
   1091     obj_datasec (abfd)->vma = BFD_ALIGN (vma, adata (abfd).segment_size);
   1092   vma = obj_datasec (abfd)->vma;
   1093 
   1094   /* Since BSS follows data immediately, see if it needs alignment.  */
   1095   vma += obj_datasec (abfd)->size;
   1096   pad = align_power (vma, obj_bsssec (abfd)->alignment_power) - vma;
   1097   obj_datasec (abfd)->size += pad;
   1098   pos += obj_datasec (abfd)->size;
   1099 
   1100   /* BSS.  */
   1101   if (!obj_bsssec (abfd)->user_set_vma)
   1102     obj_bsssec (abfd)->vma = vma;
   1103   else
   1104     vma = obj_bsssec (abfd)->vma;
   1105 
   1106   /* Fix up exec header.  */
   1107   execp->a_text = obj_textsec (abfd)->size;
   1108   execp->a_data = obj_datasec (abfd)->size;
   1109   execp->a_bss = obj_bsssec (abfd)->size;
   1110   N_SET_MAGIC (*execp, NMAGIC);
   1111 }
   1112 
   1113 bfd_boolean
   1114 NAME (aout, adjust_sizes_and_vmas) (bfd *abfd,
   1115 				    bfd_size_type *text_size,
   1116 				    file_ptr *text_end ATTRIBUTE_UNUSED)
   1117 {
   1118   struct internal_exec *execp = exec_hdr (abfd);
   1119 
   1120   if (! NAME (aout, make_sections) (abfd))
   1121     return FALSE;
   1122 
   1123   if (adata (abfd).magic != undecided_magic)
   1124     return TRUE;
   1125 
   1126   obj_textsec (abfd)->size =
   1127     align_power (obj_textsec (abfd)->size,
   1128 		 obj_textsec (abfd)->alignment_power);
   1129 
   1130   *text_size = obj_textsec (abfd)->size;
   1131   /* Rule (heuristic) for when to pad to a new page.  Note that there
   1132      are (at least) two ways demand-paged (ZMAGIC) files have been
   1133      handled.  Most Berkeley-based systems start the text segment at
   1134      (TARGET_PAGE_SIZE).  However, newer versions of SUNOS start the text
   1135      segment right after the exec header; the latter is counted in the
   1136      text segment size, and is paged in by the kernel with the rest of
   1137      the text.  */
   1138 
   1139   /* This perhaps isn't the right way to do this, but made it simpler for me
   1140      to understand enough to implement it.  Better would probably be to go
   1141      right from BFD flags to alignment/positioning characteristics.  But the
   1142      old code was sloppy enough about handling the flags, and had enough
   1143      other magic, that it was a little hard for me to understand.  I think
   1144      I understand it better now, but I haven't time to do the cleanup this
   1145      minute.  */
   1146 
   1147   if (abfd->flags & D_PAGED)
   1148     /* Whether or not WP_TEXT is set -- let D_PAGED override.  */
   1149     adata (abfd).magic = z_magic;
   1150   else if (abfd->flags & WP_TEXT)
   1151     adata (abfd).magic = n_magic;
   1152   else
   1153     adata (abfd).magic = o_magic;
   1154 
   1155 #ifdef BFD_AOUT_DEBUG /* requires gcc2 */
   1156 #if __GNUC__ >= 2
   1157   fprintf (stderr, "%s text=<%x,%x,%x> data=<%x,%x,%x> bss=<%x,%x,%x>\n",
   1158 	   ({ char *str;
   1159 	      switch (adata (abfd).magic)
   1160 		{
   1161 		case n_magic: str = "NMAGIC"; break;
   1162 		case o_magic: str = "OMAGIC"; break;
   1163 		case z_magic: str = "ZMAGIC"; break;
   1164 		default: abort ();
   1165 		}
   1166 	      str;
   1167 	    }),
   1168 	   obj_textsec (abfd)->vma, obj_textsec (abfd)->size,
   1169 	   	obj_textsec (abfd)->alignment_power,
   1170 	   obj_datasec (abfd)->vma, obj_datasec (abfd)->size,
   1171 	   	obj_datasec (abfd)->alignment_power,
   1172 	   obj_bsssec (abfd)->vma, obj_bsssec (abfd)->size,
   1173 	   	obj_bsssec (abfd)->alignment_power);
   1174 #endif
   1175 #endif
   1176 
   1177   switch (adata (abfd).magic)
   1178     {
   1179     case o_magic:
   1180       adjust_o_magic (abfd, execp);
   1181       break;
   1182     case z_magic:
   1183       adjust_z_magic (abfd, execp);
   1184       break;
   1185     case n_magic:
   1186       adjust_n_magic (abfd, execp);
   1187       break;
   1188     default:
   1189       abort ();
   1190     }
   1191 
   1192 #ifdef BFD_AOUT_DEBUG
   1193   fprintf (stderr, "       text=<%x,%x,%x> data=<%x,%x,%x> bss=<%x,%x>\n",
   1194 	   obj_textsec (abfd)->vma, obj_textsec (abfd)->size,
   1195 	   	obj_textsec (abfd)->filepos,
   1196 	   obj_datasec (abfd)->vma, obj_datasec (abfd)->size,
   1197 	   	obj_datasec (abfd)->filepos,
   1198 	   obj_bsssec (abfd)->vma, obj_bsssec (abfd)->size);
   1199 #endif
   1200 
   1201   return TRUE;
   1202 }
   1203 
   1204 /*
   1205 FUNCTION
   1206 	aout_@var{size}_new_section_hook
   1207 
   1208 SYNOPSIS
   1209         bfd_boolean aout_@var{size}_new_section_hook,
   1210 	   (bfd *abfd,
   1211 	    asection *newsect);
   1212 
   1213 DESCRIPTION
   1214 	Called by the BFD in response to a @code{bfd_make_section}
   1215 	request.
   1216 */
   1217 bfd_boolean
   1218 NAME (aout, new_section_hook) (bfd *abfd, asection *newsect)
   1219 {
   1220   /* Align to double at least.  */
   1221   newsect->alignment_power = bfd_get_arch_info (abfd)->section_align_power;
   1222 
   1223   if (bfd_get_format (abfd) == bfd_object)
   1224     {
   1225       if (obj_textsec (abfd) == NULL && !strcmp (newsect->name, ".text"))
   1226 	{
   1227 	  obj_textsec (abfd)= newsect;
   1228 	  newsect->target_index = N_TEXT;
   1229 	}
   1230       else if (obj_datasec (abfd) == NULL && !strcmp (newsect->name, ".data"))
   1231 	{
   1232 	  obj_datasec (abfd) = newsect;
   1233 	  newsect->target_index = N_DATA;
   1234 	}
   1235       else if (obj_bsssec (abfd) == NULL && !strcmp (newsect->name, ".bss"))
   1236 	{
   1237 	  obj_bsssec (abfd) = newsect;
   1238 	  newsect->target_index = N_BSS;
   1239 	}
   1240     }
   1241 
   1242   /* We allow more than three sections internally.  */
   1243   return _bfd_generic_new_section_hook (abfd, newsect);
   1244 }
   1245 
   1246 bfd_boolean
   1247 NAME (aout, set_section_contents) (bfd *abfd,
   1248 				   sec_ptr section,
   1249 				   const void * location,
   1250 				   file_ptr offset,
   1251 				   bfd_size_type count)
   1252 {
   1253   file_ptr text_end;
   1254   bfd_size_type text_size;
   1255 
   1256   if (! abfd->output_has_begun)
   1257     {
   1258       if (! NAME (aout, adjust_sizes_and_vmas) (abfd, &text_size, &text_end))
   1259 	return FALSE;
   1260     }
   1261 
   1262   if (section == obj_bsssec (abfd))
   1263     {
   1264       bfd_set_error (bfd_error_no_contents);
   1265       return FALSE;
   1266     }
   1267 
   1268   if (section != obj_textsec (abfd)
   1269       && section != obj_datasec (abfd))
   1270     {
   1271       if (aout_section_merge_with_text_p (abfd, section))
   1272 	section->filepos = obj_textsec (abfd)->filepos +
   1273 			   (section->vma - obj_textsec (abfd)->vma);
   1274       else
   1275 	{
   1276           (*_bfd_error_handler)
   1277 	   (_("%s: can not represent section `%s' in a.out object file format"),
   1278 	     bfd_get_filename (abfd), bfd_get_section_name (abfd, section));
   1279           bfd_set_error (bfd_error_nonrepresentable_section);
   1280           return FALSE;
   1281 	}
   1282     }
   1283 
   1284   if (count != 0)
   1285     {
   1286       if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
   1287 	  || bfd_bwrite (location, count, abfd) != count)
   1288 	return FALSE;
   1289     }
   1290 
   1291   return TRUE;
   1292 }
   1293 
   1294 /* Read the external symbols from an a.out file.  */
   1296 
   1297 static bfd_boolean
   1298 aout_get_external_symbols (bfd *abfd)
   1299 {
   1300   if (obj_aout_external_syms (abfd) == NULL)
   1301     {
   1302       bfd_size_type count;
   1303       struct external_nlist *syms;
   1304       bfd_size_type amt = exec_hdr (abfd)->a_syms;
   1305 
   1306       count = amt / EXTERNAL_NLIST_SIZE;
   1307       if (count == 0)
   1308 	return TRUE;		/* Nothing to do.  */
   1309 
   1310 #ifdef USE_MMAP
   1311       if (! bfd_get_file_window (abfd, obj_sym_filepos (abfd), amt,
   1312 				 &obj_aout_sym_window (abfd), TRUE))
   1313 	return FALSE;
   1314       syms = (struct external_nlist *) obj_aout_sym_window (abfd).data;
   1315 #else
   1316       /* We allocate using malloc to make the values easy to free
   1317 	 later on.  If we put them on the objalloc it might not be
   1318 	 possible to free them.  */
   1319       syms = (struct external_nlist *) bfd_malloc (amt);
   1320       if (syms == NULL)
   1321 	return FALSE;
   1322 
   1323       if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
   1324 	  || bfd_bread (syms, amt, abfd) != amt)
   1325 	{
   1326 	  free (syms);
   1327 	  return FALSE;
   1328 	}
   1329 #endif
   1330 
   1331       obj_aout_external_syms (abfd) = syms;
   1332       obj_aout_external_sym_count (abfd) = count;
   1333     }
   1334 
   1335   if (obj_aout_external_strings (abfd) == NULL
   1336       && exec_hdr (abfd)->a_syms != 0)
   1337     {
   1338       unsigned char string_chars[BYTES_IN_WORD];
   1339       bfd_size_type stringsize;
   1340       char *strings;
   1341       bfd_size_type amt = BYTES_IN_WORD;
   1342 
   1343       /* Get the size of the strings.  */
   1344       if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0
   1345 	  || bfd_bread ((void *) string_chars, amt, abfd) != amt)
   1346 	return FALSE;
   1347       stringsize = GET_WORD (abfd, string_chars);
   1348 
   1349 #ifdef USE_MMAP
   1350       if (! bfd_get_file_window (abfd, obj_str_filepos (abfd), stringsize,
   1351 				 &obj_aout_string_window (abfd), TRUE))
   1352 	return FALSE;
   1353       strings = (char *) obj_aout_string_window (abfd).data;
   1354 #else
   1355       strings = (char *) bfd_malloc (stringsize + 1);
   1356       if (strings == NULL)
   1357 	return FALSE;
   1358 
   1359       /* Skip space for the string count in the buffer for convenience
   1360 	 when using indexes.  */
   1361       amt = stringsize - BYTES_IN_WORD;
   1362       if (bfd_bread (strings + BYTES_IN_WORD, amt, abfd) != amt)
   1363 	{
   1364 	  free (strings);
   1365 	  return FALSE;
   1366 	}
   1367 #endif
   1368 
   1369       /* Ensure that a zero index yields an empty string.  */
   1370       strings[0] = '\0';
   1371 
   1372       strings[stringsize - 1] = 0;
   1373 
   1374       obj_aout_external_strings (abfd) = strings;
   1375       obj_aout_external_string_size (abfd) = stringsize;
   1376     }
   1377 
   1378   return TRUE;
   1379 }
   1380 
   1381 /* Translate an a.out symbol into a BFD symbol.  The desc, other, type
   1382    and symbol->value fields of CACHE_PTR will be set from the a.out
   1383    nlist structure.  This function is responsible for setting
   1384    symbol->flags and symbol->section, and adjusting symbol->value.  */
   1385 
   1386 static bfd_boolean
   1387 translate_from_native_sym_flags (bfd *abfd, aout_symbol_type *cache_ptr)
   1388 {
   1389   flagword visible;
   1390 
   1391   if ((cache_ptr->type & N_STAB) != 0
   1392       || cache_ptr->type == N_FN)
   1393     {
   1394       asection *sec;
   1395 
   1396       /* This is a debugging symbol.  */
   1397       cache_ptr->symbol.flags = BSF_DEBUGGING;
   1398 
   1399       /* Work out the symbol section.  */
   1400       switch (cache_ptr->type & N_TYPE)
   1401 	{
   1402 	case N_TEXT:
   1403 	case N_FN:
   1404 	  sec = obj_textsec (abfd);
   1405 	  break;
   1406 	case N_DATA:
   1407 	  sec = obj_datasec (abfd);
   1408 	  break;
   1409 	case N_BSS:
   1410 	  sec = obj_bsssec (abfd);
   1411 	  break;
   1412 	default:
   1413 	case N_ABS:
   1414 	  sec = bfd_abs_section_ptr;
   1415 	  break;
   1416 	}
   1417 
   1418       cache_ptr->symbol.section = sec;
   1419       cache_ptr->symbol.value -= sec->vma;
   1420 
   1421       return TRUE;
   1422     }
   1423 
   1424   /* Get the default visibility.  This does not apply to all types, so
   1425      we just hold it in a local variable to use if wanted.  */
   1426   if ((cache_ptr->type & N_EXT) == 0)
   1427     visible = BSF_LOCAL;
   1428   else
   1429     visible = BSF_GLOBAL;
   1430 
   1431   switch (cache_ptr->type)
   1432     {
   1433     default:
   1434     case N_ABS: case N_ABS | N_EXT:
   1435       cache_ptr->symbol.section = bfd_abs_section_ptr;
   1436       cache_ptr->symbol.flags = visible;
   1437       break;
   1438 
   1439     case N_UNDF | N_EXT:
   1440       if (cache_ptr->symbol.value != 0)
   1441 	{
   1442 	  /* This is a common symbol.  */
   1443 	  cache_ptr->symbol.flags = BSF_GLOBAL;
   1444 	  cache_ptr->symbol.section = bfd_com_section_ptr;
   1445 	}
   1446       else
   1447 	{
   1448 	  cache_ptr->symbol.flags = 0;
   1449 	  cache_ptr->symbol.section = bfd_und_section_ptr;
   1450 	}
   1451       break;
   1452 
   1453     case N_TEXT: case N_TEXT | N_EXT:
   1454       cache_ptr->symbol.section = obj_textsec (abfd);
   1455       cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
   1456       cache_ptr->symbol.flags = visible;
   1457       break;
   1458 
   1459       /* N_SETV symbols used to represent set vectors placed in the
   1460 	 data section.  They are no longer generated.  Theoretically,
   1461 	 it was possible to extract the entries and combine them with
   1462 	 new ones, although I don't know if that was ever actually
   1463 	 done.  Unless that feature is restored, treat them as data
   1464 	 symbols.  */
   1465     case N_SETV: case N_SETV | N_EXT:
   1466     case N_DATA: case N_DATA | N_EXT:
   1467       cache_ptr->symbol.section = obj_datasec (abfd);
   1468       cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
   1469       cache_ptr->symbol.flags = visible;
   1470       break;
   1471 
   1472     case N_BSS: case N_BSS | N_EXT:
   1473       cache_ptr->symbol.section = obj_bsssec (abfd);
   1474       cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
   1475       cache_ptr->symbol.flags = visible;
   1476       break;
   1477 
   1478     case N_SETA: case N_SETA | N_EXT:
   1479     case N_SETT: case N_SETT | N_EXT:
   1480     case N_SETD: case N_SETD | N_EXT:
   1481     case N_SETB: case N_SETB | N_EXT:
   1482       {
   1483 	/* This code is no longer needed.  It used to be used to make
   1484            the linker handle set symbols, but they are now handled in
   1485            the add_symbols routine instead.  */
   1486 	switch (cache_ptr->type & N_TYPE)
   1487 	  {
   1488 	  case N_SETA:
   1489 	    cache_ptr->symbol.section = bfd_abs_section_ptr;
   1490 	    break;
   1491 	  case N_SETT:
   1492 	    cache_ptr->symbol.section = obj_textsec (abfd);
   1493 	    break;
   1494 	  case N_SETD:
   1495 	    cache_ptr->symbol.section = obj_datasec (abfd);
   1496 	    break;
   1497 	  case N_SETB:
   1498 	    cache_ptr->symbol.section = obj_bsssec (abfd);
   1499 	    break;
   1500 	  }
   1501 
   1502 	cache_ptr->symbol.flags |= BSF_CONSTRUCTOR;
   1503       }
   1504       break;
   1505 
   1506     case N_WARNING:
   1507       /* This symbol is the text of a warning message.  The next
   1508 	 symbol is the symbol to associate the warning with.  If a
   1509 	 reference is made to that symbol, a warning is issued.  */
   1510       cache_ptr->symbol.flags = BSF_DEBUGGING | BSF_WARNING;
   1511       cache_ptr->symbol.section = bfd_abs_section_ptr;
   1512       break;
   1513 
   1514     case N_INDR: case N_INDR | N_EXT:
   1515       /* An indirect symbol.  This consists of two symbols in a row.
   1516 	 The first symbol is the name of the indirection.  The second
   1517 	 symbol is the name of the target.  A reference to the first
   1518 	 symbol becomes a reference to the second.  */
   1519       cache_ptr->symbol.flags = BSF_DEBUGGING | BSF_INDIRECT | visible;
   1520       cache_ptr->symbol.section = bfd_ind_section_ptr;
   1521       break;
   1522 
   1523     case N_WEAKU:
   1524       cache_ptr->symbol.section = bfd_und_section_ptr;
   1525       cache_ptr->symbol.flags = BSF_WEAK;
   1526       break;
   1527 
   1528     case N_WEAKA:
   1529       cache_ptr->symbol.section = bfd_abs_section_ptr;
   1530       cache_ptr->symbol.flags = BSF_WEAK;
   1531       break;
   1532 
   1533     case N_WEAKT:
   1534       cache_ptr->symbol.section = obj_textsec (abfd);
   1535       cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
   1536       cache_ptr->symbol.flags = BSF_WEAK;
   1537       break;
   1538 
   1539     case N_WEAKD:
   1540       cache_ptr->symbol.section = obj_datasec (abfd);
   1541       cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
   1542       cache_ptr->symbol.flags = BSF_WEAK;
   1543       break;
   1544 
   1545     case N_WEAKB:
   1546       cache_ptr->symbol.section = obj_bsssec (abfd);
   1547       cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
   1548       cache_ptr->symbol.flags = BSF_WEAK;
   1549       break;
   1550     }
   1551 
   1552   return TRUE;
   1553 }
   1554 
   1555 /* Set the fields of SYM_POINTER according to CACHE_PTR.  */
   1556 
   1557 static bfd_boolean
   1558 translate_to_native_sym_flags (bfd *abfd,
   1559 			       asymbol *cache_ptr,
   1560 			       struct external_nlist *sym_pointer)
   1561 {
   1562   bfd_vma value = cache_ptr->value;
   1563   asection *sec;
   1564   bfd_vma off;
   1565 
   1566   /* Mask out any existing type bits in case copying from one section
   1567      to another.  */
   1568   sym_pointer->e_type[0] &= ~N_TYPE;
   1569 
   1570   sec = bfd_get_section (cache_ptr);
   1571   off = 0;
   1572 
   1573   if (sec == NULL)
   1574     {
   1575       /* This case occurs, e.g., for the *DEBUG* section of a COFF
   1576 	 file.  */
   1577       (*_bfd_error_handler)
   1578 	(_("%s: can not represent section for symbol `%s' in a.out object file format"),
   1579 	 bfd_get_filename (abfd),
   1580 	 cache_ptr->name != NULL ? cache_ptr->name : _("*unknown*"));
   1581       bfd_set_error (bfd_error_nonrepresentable_section);
   1582       return FALSE;
   1583     }
   1584 
   1585   if (sec->output_section != NULL)
   1586     {
   1587       off = sec->output_offset;
   1588       sec = sec->output_section;
   1589     }
   1590 
   1591   if (bfd_is_abs_section (sec))
   1592     sym_pointer->e_type[0] |= N_ABS;
   1593   else if (sec == obj_textsec (abfd))
   1594     sym_pointer->e_type[0] |= N_TEXT;
   1595   else if (sec == obj_datasec (abfd))
   1596     sym_pointer->e_type[0] |= N_DATA;
   1597   else if (sec == obj_bsssec (abfd))
   1598     sym_pointer->e_type[0] |= N_BSS;
   1599   else if (bfd_is_und_section (sec))
   1600     sym_pointer->e_type[0] = N_UNDF | N_EXT;
   1601   else if (bfd_is_ind_section (sec))
   1602     sym_pointer->e_type[0] = N_INDR;
   1603   else if (bfd_is_com_section (sec))
   1604     sym_pointer->e_type[0] = N_UNDF | N_EXT;
   1605   else
   1606     {
   1607       if (aout_section_merge_with_text_p (abfd, sec))
   1608 	sym_pointer->e_type[0] |= N_TEXT;
   1609       else
   1610 	{
   1611           (*_bfd_error_handler)
   1612 	   (_("%s: can not represent section `%s' in a.out object file format"),
   1613 	     bfd_get_filename (abfd), bfd_get_section_name (abfd, sec));
   1614           bfd_set_error (bfd_error_nonrepresentable_section);
   1615           return FALSE;
   1616 	}
   1617     }
   1618 
   1619   /* Turn the symbol from section relative to absolute again.  */
   1620   value += sec->vma + off;
   1621 
   1622   if ((cache_ptr->flags & BSF_WARNING) != 0)
   1623     sym_pointer->e_type[0] = N_WARNING;
   1624 
   1625   if ((cache_ptr->flags & BSF_DEBUGGING) != 0)
   1626     sym_pointer->e_type[0] = ((aout_symbol_type *) cache_ptr)->type;
   1627   else if ((cache_ptr->flags & BSF_GLOBAL) != 0)
   1628     sym_pointer->e_type[0] |= N_EXT;
   1629   else if ((cache_ptr->flags & BSF_LOCAL) != 0)
   1630     sym_pointer->e_type[0] &= ~N_EXT;
   1631 
   1632   if ((cache_ptr->flags & BSF_CONSTRUCTOR) != 0)
   1633     {
   1634       int type = ((aout_symbol_type *) cache_ptr)->type;
   1635 
   1636       switch (type)
   1637 	{
   1638 	case N_ABS:	type = N_SETA; break;
   1639 	case N_TEXT:	type = N_SETT; break;
   1640 	case N_DATA:	type = N_SETD; break;
   1641 	case N_BSS:	type = N_SETB; break;
   1642 	}
   1643       sym_pointer->e_type[0] = type;
   1644     }
   1645 
   1646   if ((cache_ptr->flags & BSF_WEAK) != 0)
   1647     {
   1648       int type;
   1649 
   1650       switch (sym_pointer->e_type[0] & N_TYPE)
   1651 	{
   1652 	default:
   1653 	case N_ABS:	type = N_WEAKA; break;
   1654 	case N_TEXT:	type = N_WEAKT; break;
   1655 	case N_DATA:	type = N_WEAKD; break;
   1656 	case N_BSS:	type = N_WEAKB; break;
   1657 	case N_UNDF:	type = N_WEAKU; break;
   1658 	}
   1659       sym_pointer->e_type[0] = type;
   1660     }
   1661 
   1662   PUT_WORD (abfd, value, sym_pointer->e_value);
   1663 
   1664   return TRUE;
   1665 }
   1666 
   1667 /* Native-level interface to symbols.  */
   1669 
   1670 asymbol *
   1671 NAME (aout, make_empty_symbol) (bfd *abfd)
   1672 {
   1673   bfd_size_type amt = sizeof (aout_symbol_type);
   1674 
   1675   aout_symbol_type *new_symbol = (aout_symbol_type *) bfd_zalloc (abfd, amt);
   1676   if (!new_symbol)
   1677     return NULL;
   1678   new_symbol->symbol.the_bfd = abfd;
   1679 
   1680   return &new_symbol->symbol;
   1681 }
   1682 
   1683 /* Translate a set of internal symbols into external symbols.  */
   1684 
   1685 bfd_boolean
   1686 NAME (aout, translate_symbol_table) (bfd *abfd,
   1687 				     aout_symbol_type *in,
   1688 				     struct external_nlist *ext,
   1689 				     bfd_size_type count,
   1690 				     char *str,
   1691 				     bfd_size_type strsize,
   1692 				     bfd_boolean dynamic)
   1693 {
   1694   struct external_nlist *ext_end;
   1695 
   1696   ext_end = ext + count;
   1697   for (; ext < ext_end; ext++, in++)
   1698     {
   1699       bfd_vma x;
   1700 
   1701       x = GET_WORD (abfd, ext->e_strx);
   1702       in->symbol.the_bfd = abfd;
   1703 
   1704       /* For the normal symbols, the zero index points at the number
   1705 	 of bytes in the string table but is to be interpreted as the
   1706 	 null string.  For the dynamic symbols, the number of bytes in
   1707 	 the string table is stored in the __DYNAMIC structure and the
   1708 	 zero index points at an actual string.  */
   1709       if (x == 0 && ! dynamic)
   1710 	in->symbol.name = "";
   1711       else if (x < strsize)
   1712 	in->symbol.name = str + x;
   1713       else
   1714 	return FALSE;
   1715 
   1716       in->symbol.value = GET_SWORD (abfd,  ext->e_value);
   1717       in->desc = H_GET_16 (abfd, ext->e_desc);
   1718       in->other = H_GET_8 (abfd, ext->e_other);
   1719       in->type = H_GET_8 (abfd,  ext->e_type);
   1720       in->symbol.udata.p = NULL;
   1721 
   1722       if (! translate_from_native_sym_flags (abfd, in))
   1723 	return FALSE;
   1724 
   1725       if (dynamic)
   1726 	in->symbol.flags |= BSF_DYNAMIC;
   1727     }
   1728 
   1729   return TRUE;
   1730 }
   1731 
   1732 /* We read the symbols into a buffer, which is discarded when this
   1733    function exits.  We read the strings into a buffer large enough to
   1734    hold them all plus all the cached symbol entries.  */
   1735 
   1736 bfd_boolean
   1737 NAME (aout, slurp_symbol_table) (bfd *abfd)
   1738 {
   1739   struct external_nlist *old_external_syms;
   1740   aout_symbol_type *cached;
   1741   bfd_size_type cached_size;
   1742 
   1743   /* If there's no work to be done, don't do any.  */
   1744   if (obj_aout_symbols (abfd) != NULL)
   1745     return TRUE;
   1746 
   1747   old_external_syms = obj_aout_external_syms (abfd);
   1748 
   1749   if (! aout_get_external_symbols (abfd))
   1750     return FALSE;
   1751 
   1752   cached_size = obj_aout_external_sym_count (abfd);
   1753   if (cached_size == 0)
   1754     return TRUE;		/* Nothing to do.  */
   1755 
   1756   cached_size *= sizeof (aout_symbol_type);
   1757   cached = (aout_symbol_type *) bfd_zmalloc (cached_size);
   1758   if (cached == NULL)
   1759     return FALSE;
   1760 
   1761   /* Convert from external symbol information to internal.  */
   1762   if (! (NAME (aout, translate_symbol_table)
   1763 	 (abfd, cached,
   1764 	  obj_aout_external_syms (abfd),
   1765 	  obj_aout_external_sym_count (abfd),
   1766 	  obj_aout_external_strings (abfd),
   1767 	  obj_aout_external_string_size (abfd),
   1768 	  FALSE)))
   1769     {
   1770       free (cached);
   1771       return FALSE;
   1772     }
   1773 
   1774   bfd_get_symcount (abfd) = obj_aout_external_sym_count (abfd);
   1775 
   1776   obj_aout_symbols (abfd) = cached;
   1777 
   1778   /* It is very likely that anybody who calls this function will not
   1779      want the external symbol information, so if it was allocated
   1780      because of our call to aout_get_external_symbols, we free it up
   1781      right away to save space.  */
   1782   if (old_external_syms == NULL
   1783       && obj_aout_external_syms (abfd) != NULL)
   1784     {
   1785 #ifdef USE_MMAP
   1786       bfd_free_window (&obj_aout_sym_window (abfd));
   1787 #else
   1788       free (obj_aout_external_syms (abfd));
   1789 #endif
   1790       obj_aout_external_syms (abfd) = NULL;
   1791     }
   1792 
   1793   return TRUE;
   1794 }
   1795 
   1796 /* We use a hash table when writing out symbols so that we only write
   1798    out a particular string once.  This helps particularly when the
   1799    linker writes out stabs debugging entries, because each different
   1800    contributing object file tends to have many duplicate stabs
   1801    strings.
   1802 
   1803    This hash table code breaks dbx on SunOS 4.1.3, so we don't do it
   1804    if BFD_TRADITIONAL_FORMAT is set.  */
   1805 
   1806 /* Get the index of a string in a strtab, adding it if it is not
   1807    already present.  */
   1808 
   1809 static inline bfd_size_type
   1810 add_to_stringtab (bfd *abfd,
   1811 		  struct bfd_strtab_hash *tab,
   1812 		  const char *str,
   1813 		  bfd_boolean copy)
   1814 {
   1815   bfd_boolean hash;
   1816   bfd_size_type str_index;
   1817 
   1818   /* An index of 0 always means the empty string.  */
   1819   if (str == 0 || *str == '\0')
   1820     return 0;
   1821 
   1822   /* Don't hash if BFD_TRADITIONAL_FORMAT is set, because SunOS dbx
   1823      doesn't understand a hashed string table.  */
   1824   hash = TRUE;
   1825   if ((abfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
   1826     hash = FALSE;
   1827 
   1828   str_index = _bfd_stringtab_add (tab, str, hash, copy);
   1829 
   1830   if (str_index != (bfd_size_type) -1)
   1831     /* Add BYTES_IN_WORD to the return value to account for the
   1832        space taken up by the string table size.  */
   1833     str_index += BYTES_IN_WORD;
   1834 
   1835   return str_index;
   1836 }
   1837 
   1838 /* Write out a strtab.  ABFD is already at the right location in the
   1839    file.  */
   1840 
   1841 static bfd_boolean
   1842 emit_stringtab (bfd *abfd, struct bfd_strtab_hash *tab)
   1843 {
   1844   bfd_byte buffer[BYTES_IN_WORD];
   1845   bfd_size_type amt = BYTES_IN_WORD;
   1846 
   1847   /* The string table starts with the size.  */
   1848   PUT_WORD (abfd, _bfd_stringtab_size (tab) + BYTES_IN_WORD, buffer);
   1849   if (bfd_bwrite ((void *) buffer, amt, abfd) != amt)
   1850     return FALSE;
   1851 
   1852   return _bfd_stringtab_emit (abfd, tab);
   1853 }
   1854 
   1855 bfd_boolean
   1857 NAME (aout, write_syms) (bfd *abfd)
   1858 {
   1859   unsigned int count ;
   1860   asymbol **generic = bfd_get_outsymbols (abfd);
   1861   struct bfd_strtab_hash *strtab;
   1862 
   1863   strtab = _bfd_stringtab_init ();
   1864   if (strtab == NULL)
   1865     return FALSE;
   1866 
   1867   for (count = 0; count < bfd_get_symcount (abfd); count++)
   1868     {
   1869       asymbol *g = generic[count];
   1870       bfd_size_type indx;
   1871       struct external_nlist nsp;
   1872       bfd_size_type amt;
   1873 
   1874       indx = add_to_stringtab (abfd, strtab, g->name, FALSE);
   1875       if (indx == (bfd_size_type) -1)
   1876 	goto error_return;
   1877       PUT_WORD (abfd, indx, (bfd_byte *) nsp.e_strx);
   1878 
   1879       if (bfd_asymbol_flavour (g) == abfd->xvec->flavour)
   1880 	{
   1881 	  H_PUT_16 (abfd, aout_symbol (g)->desc,  nsp.e_desc);
   1882 	  H_PUT_8  (abfd, aout_symbol (g)->other, nsp.e_other);
   1883 	  H_PUT_8  (abfd, aout_symbol (g)->type,  nsp.e_type);
   1884 	}
   1885       else
   1886 	{
   1887 	  H_PUT_16 (abfd, 0, nsp.e_desc);
   1888 	  H_PUT_8  (abfd, 0, nsp.e_other);
   1889 	  H_PUT_8  (abfd, 0, nsp.e_type);
   1890 	}
   1891 
   1892       if (! translate_to_native_sym_flags (abfd, g, &nsp))
   1893 	goto error_return;
   1894 
   1895       amt = EXTERNAL_NLIST_SIZE;
   1896       if (bfd_bwrite ((void *) &nsp, amt, abfd) != amt)
   1897 	goto error_return;
   1898 
   1899       /* NB: `KEEPIT' currently overlays `udata.p', so set this only
   1900 	 here, at the end.  */
   1901       g->KEEPIT = count;
   1902     }
   1903 
   1904   if (! emit_stringtab (abfd, strtab))
   1905     goto error_return;
   1906 
   1907   _bfd_stringtab_free (strtab);
   1908 
   1909   return TRUE;
   1910 
   1911 error_return:
   1912   _bfd_stringtab_free (strtab);
   1913   return FALSE;
   1914 }
   1915 
   1916 long
   1918 NAME (aout, canonicalize_symtab) (bfd *abfd, asymbol **location)
   1919 {
   1920   unsigned int counter = 0;
   1921   aout_symbol_type *symbase;
   1922 
   1923   if (!NAME (aout, slurp_symbol_table) (abfd))
   1924     return -1;
   1925 
   1926   for (symbase = obj_aout_symbols (abfd);
   1927        counter++ < bfd_get_symcount (abfd);
   1928        )
   1929     *(location++) = (asymbol *) (symbase++);
   1930   *location++ =0;
   1931   return bfd_get_symcount (abfd);
   1932 }
   1933 
   1934 /* Standard reloc stuff.  */
   1936 /* Output standard relocation information to a file in target byte order.  */
   1937 
   1938 extern void  NAME (aout, swap_std_reloc_out)
   1939   (bfd *, arelent *, struct reloc_std_external *);
   1940 
   1941 void
   1942 NAME (aout, swap_std_reloc_out) (bfd *abfd,
   1943 				 arelent *g,
   1944 				 struct reloc_std_external *natptr)
   1945 {
   1946   int r_index;
   1947   asymbol *sym = *(g->sym_ptr_ptr);
   1948   int r_extern;
   1949   unsigned int r_length;
   1950   int r_pcrel;
   1951   int r_baserel, r_jmptable, r_relative;
   1952   asection *output_section = sym->section->output_section;
   1953 
   1954   PUT_WORD (abfd, g->address, natptr->r_address);
   1955 
   1956   r_length = g->howto->size ;	/* Size as a power of two.  */
   1957   r_pcrel  = (int) g->howto->pc_relative; /* Relative to PC?  */
   1958   /* XXX This relies on relocs coming from a.out files.  */
   1959   r_baserel = (g->howto->type & 8) != 0;
   1960   r_jmptable = (g->howto->type & 16) != 0;
   1961   r_relative = (g->howto->type & 32) != 0;
   1962 
   1963   /* Name was clobbered by aout_write_syms to be symbol index.  */
   1964 
   1965   /* If this relocation is relative to a symbol then set the
   1966      r_index to the symbols index, and the r_extern bit.
   1967 
   1968      Absolute symbols can come in in two ways, either as an offset
   1969      from the abs section, or as a symbol which has an abs value.
   1970      check for that here.  */
   1971 
   1972   if (bfd_is_com_section (output_section)
   1973       || bfd_is_abs_section (output_section)
   1974       || bfd_is_und_section (output_section)
   1975       /* PR gas/3041  a.out relocs against weak symbols
   1976 	 must be treated as if they were against externs.  */
   1977       || (sym->flags & BSF_WEAK))
   1978     {
   1979       if (bfd_abs_section_ptr->symbol == sym)
   1980 	{
   1981 	  /* Whoops, looked like an abs symbol, but is
   1982 	     really an offset from the abs section.  */
   1983 	  r_index = N_ABS;
   1984 	  r_extern = 0;
   1985 	}
   1986       else
   1987 	{
   1988 	  /* Fill in symbol.  */
   1989 	  r_extern = 1;
   1990 	  r_index = (*(g->sym_ptr_ptr))->KEEPIT;
   1991 	}
   1992     }
   1993   else
   1994     {
   1995       /* Just an ordinary section.  */
   1996       r_extern = 0;
   1997       r_index  = output_section->target_index;
   1998     }
   1999 
   2000   /* Now the fun stuff.  */
   2001   if (bfd_header_big_endian (abfd))
   2002     {
   2003       natptr->r_index[0] = r_index >> 16;
   2004       natptr->r_index[1] = r_index >> 8;
   2005       natptr->r_index[2] = r_index;
   2006       natptr->r_type[0] = ((r_extern ? RELOC_STD_BITS_EXTERN_BIG : 0)
   2007 			   | (r_pcrel ? RELOC_STD_BITS_PCREL_BIG : 0)
   2008 			   | (r_baserel ? RELOC_STD_BITS_BASEREL_BIG : 0)
   2009 			   | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_BIG : 0)
   2010 			   | (r_relative ? RELOC_STD_BITS_RELATIVE_BIG : 0)
   2011 			   | (r_length << RELOC_STD_BITS_LENGTH_SH_BIG));
   2012     }
   2013   else
   2014     {
   2015       natptr->r_index[2] = r_index >> 16;
   2016       natptr->r_index[1] = r_index >> 8;
   2017       natptr->r_index[0] = r_index;
   2018       natptr->r_type[0] = ((r_extern ? RELOC_STD_BITS_EXTERN_LITTLE : 0)
   2019 			   | (r_pcrel ? RELOC_STD_BITS_PCREL_LITTLE : 0)
   2020 			   | (r_baserel ? RELOC_STD_BITS_BASEREL_LITTLE : 0)
   2021 			   | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_LITTLE : 0)
   2022 			   | (r_relative ? RELOC_STD_BITS_RELATIVE_LITTLE : 0)
   2023 			   | (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE));
   2024     }
   2025 }
   2026 
   2027 /* Extended stuff.  */
   2028 /* Output extended relocation information to a file in target byte order.  */
   2029 
   2030 extern void NAME (aout, swap_ext_reloc_out)
   2031   (bfd *, arelent *, struct reloc_ext_external *);
   2032 
   2033 void
   2034 NAME (aout, swap_ext_reloc_out) (bfd *abfd,
   2035 				 arelent *g,
   2036 				 struct reloc_ext_external *natptr)
   2037 {
   2038   int r_index;
   2039   int r_extern;
   2040   unsigned int r_type;
   2041   bfd_vma r_addend;
   2042   asymbol *sym = *(g->sym_ptr_ptr);
   2043   asection *output_section = sym->section->output_section;
   2044 
   2045   PUT_WORD (abfd, g->address, natptr->r_address);
   2046 
   2047   r_type = (unsigned int) g->howto->type;
   2048 
   2049   r_addend = g->addend;
   2050   if ((sym->flags & BSF_SECTION_SYM) != 0)
   2051     r_addend += (*(g->sym_ptr_ptr))->section->output_section->vma;
   2052 
   2053   /* If this relocation is relative to a symbol then set the
   2054      r_index to the symbols index, and the r_extern bit.
   2055 
   2056      Absolute symbols can come in in two ways, either as an offset
   2057      from the abs section, or as a symbol which has an abs value.
   2058      check for that here.  */
   2059   if (bfd_is_abs_section (bfd_get_section (sym)))
   2060     {
   2061       r_extern = 0;
   2062       r_index = N_ABS;
   2063     }
   2064   else if ((sym->flags & BSF_SECTION_SYM) == 0)
   2065     {
   2066       if (bfd_is_und_section (bfd_get_section (sym))
   2067 	  || (sym->flags & BSF_GLOBAL) != 0)
   2068 	r_extern = 1;
   2069       else
   2070 	r_extern = 0;
   2071       r_index = (*(g->sym_ptr_ptr))->KEEPIT;
   2072     }
   2073   else
   2074     {
   2075       /* Just an ordinary section.  */
   2076       r_extern = 0;
   2077       r_index = output_section->target_index;
   2078     }
   2079 
   2080   /* Now the fun stuff.  */
   2081   if (bfd_header_big_endian (abfd))
   2082     {
   2083       natptr->r_index[0] = r_index >> 16;
   2084       natptr->r_index[1] = r_index >> 8;
   2085       natptr->r_index[2] = r_index;
   2086       natptr->r_type[0] = ((r_extern ? RELOC_EXT_BITS_EXTERN_BIG : 0)
   2087 			   | (r_type << RELOC_EXT_BITS_TYPE_SH_BIG));
   2088     }
   2089   else
   2090     {
   2091       natptr->r_index[2] = r_index >> 16;
   2092       natptr->r_index[1] = r_index >> 8;
   2093       natptr->r_index[0] = r_index;
   2094       natptr->r_type[0] = ((r_extern ? RELOC_EXT_BITS_EXTERN_LITTLE : 0)
   2095 			   | (r_type << RELOC_EXT_BITS_TYPE_SH_LITTLE));
   2096     }
   2097 
   2098   PUT_WORD (abfd, r_addend, natptr->r_addend);
   2099 }
   2100 
   2101 /* BFD deals internally with all things based from the section they're
   2102    in. so, something in 10 bytes into a text section  with a base of
   2103    50 would have a symbol (.text+10) and know .text vma was 50.
   2104 
   2105    Aout keeps all it's symbols based from zero, so the symbol would
   2106    contain 60. This macro subs the base of each section from the value
   2107    to give the true offset from the section.  */
   2108 
   2109 #define MOVE_ADDRESS(ad)						\
   2110   if (r_extern)								\
   2111     {									\
   2112       /* Undefined symbol.  */						\
   2113       cache_ptr->sym_ptr_ptr = symbols + r_index;			\
   2114       cache_ptr->addend = ad;						\
   2115     }									\
   2116    else									\
   2117     {									\
   2118       /* Defined, section relative.  Replace symbol with pointer to	\
   2119 	 symbol which points to section.  */				\
   2120       switch (r_index)							\
   2121 	{								\
   2122 	case N_TEXT:							\
   2123 	case N_TEXT | N_EXT:						\
   2124 	  cache_ptr->sym_ptr_ptr = obj_textsec (abfd)->symbol_ptr_ptr;	\
   2125 	  cache_ptr->addend = ad - su->textsec->vma;			\
   2126 	  break;							\
   2127 	case N_DATA:							\
   2128 	case N_DATA | N_EXT:						\
   2129 	  cache_ptr->sym_ptr_ptr = obj_datasec (abfd)->symbol_ptr_ptr;	\
   2130 	  cache_ptr->addend = ad - su->datasec->vma;			\
   2131 	  break;							\
   2132 	case N_BSS:							\
   2133 	case N_BSS | N_EXT:						\
   2134 	  cache_ptr->sym_ptr_ptr = obj_bsssec (abfd)->symbol_ptr_ptr;	\
   2135 	  cache_ptr->addend = ad - su->bsssec->vma;			\
   2136 	  break;							\
   2137 	default:							\
   2138 	case N_ABS:							\
   2139 	case N_ABS | N_EXT:						\
   2140 	  cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;	\
   2141 	  cache_ptr->addend = ad;					\
   2142 	  break;							\
   2143 	}								\
   2144     }
   2145 
   2146 void
   2147 NAME (aout, swap_ext_reloc_in) (bfd *abfd,
   2148 				struct reloc_ext_external *bytes,
   2149 				arelent *cache_ptr,
   2150 				asymbol **symbols,
   2151 				bfd_size_type symcount)
   2152 {
   2153   unsigned int r_index;
   2154   int r_extern;
   2155   unsigned int r_type;
   2156   struct aoutdata *su = &(abfd->tdata.aout_data->a);
   2157 
   2158   cache_ptr->address = (GET_SWORD (abfd, bytes->r_address));
   2159 
   2160   /* Now the fun stuff.  */
   2161   if (bfd_header_big_endian (abfd))
   2162     {
   2163       r_index = (((unsigned int) bytes->r_index[0] << 16)
   2164 		 | ((unsigned int) bytes->r_index[1] << 8)
   2165 		 | bytes->r_index[2]);
   2166       r_extern = (0 != (bytes->r_type[0] & RELOC_EXT_BITS_EXTERN_BIG));
   2167       r_type = ((bytes->r_type[0] & RELOC_EXT_BITS_TYPE_BIG)
   2168 		>> RELOC_EXT_BITS_TYPE_SH_BIG);
   2169     }
   2170   else
   2171     {
   2172       r_index =  (((unsigned int) bytes->r_index[2] << 16)
   2173 		  | ((unsigned int) bytes->r_index[1] << 8)
   2174 		  | bytes->r_index[0]);
   2175       r_extern = (0 != (bytes->r_type[0] & RELOC_EXT_BITS_EXTERN_LITTLE));
   2176       r_type = ((bytes->r_type[0] & RELOC_EXT_BITS_TYPE_LITTLE)
   2177 		>> RELOC_EXT_BITS_TYPE_SH_LITTLE);
   2178     }
   2179 
   2180   if (r_type < TABLE_SIZE (howto_table_ext))
   2181     cache_ptr->howto = howto_table_ext + r_type;
   2182   else
   2183     cache_ptr->howto = NULL;
   2184 
   2185   /* Base relative relocs are always against the symbol table,
   2186      regardless of the setting of r_extern.  r_extern just reflects
   2187      whether the symbol the reloc is against is local or global.  */
   2188   if (r_type == (unsigned int) RELOC_BASE10
   2189       || r_type == (unsigned int) RELOC_BASE13
   2190       || r_type == (unsigned int) RELOC_BASE22)
   2191     r_extern = 1;
   2192 
   2193   if (r_extern && r_index > symcount)
   2194     {
   2195       /* We could arrange to return an error, but it might be useful
   2196          to see the file even if it is bad.  */
   2197       r_extern = 0;
   2198       r_index = N_ABS;
   2199     }
   2200 
   2201   MOVE_ADDRESS (GET_SWORD (abfd, bytes->r_addend));
   2202 }
   2203 
   2204 void
   2205 NAME (aout, swap_std_reloc_in) (bfd *abfd,
   2206 				struct reloc_std_external *bytes,
   2207 				arelent *cache_ptr,
   2208 				asymbol **symbols,
   2209 				bfd_size_type symcount)
   2210 {
   2211   unsigned int r_index;
   2212   int r_extern;
   2213   unsigned int r_length;
   2214   int r_pcrel;
   2215   int r_baserel, r_jmptable, r_relative;
   2216   struct aoutdata  *su = &(abfd->tdata.aout_data->a);
   2217   unsigned int howto_idx;
   2218 
   2219   cache_ptr->address = H_GET_32 (abfd, bytes->r_address);
   2220 
   2221   /* Now the fun stuff.  */
   2222   if (bfd_header_big_endian (abfd))
   2223     {
   2224       r_index = (((unsigned int) bytes->r_index[0] << 16)
   2225 		 | ((unsigned int) bytes->r_index[1] << 8)
   2226 		 | bytes->r_index[2]);
   2227       r_extern  = (0 != (bytes->r_type[0] & RELOC_STD_BITS_EXTERN_BIG));
   2228       r_pcrel   = (0 != (bytes->r_type[0] & RELOC_STD_BITS_PCREL_BIG));
   2229       r_baserel = (0 != (bytes->r_type[0] & RELOC_STD_BITS_BASEREL_BIG));
   2230       r_jmptable= (0 != (bytes->r_type[0] & RELOC_STD_BITS_JMPTABLE_BIG));
   2231       r_relative= (0 != (bytes->r_type[0] & RELOC_STD_BITS_RELATIVE_BIG));
   2232       r_length  = ((bytes->r_type[0] & RELOC_STD_BITS_LENGTH_BIG)
   2233 		   >> RELOC_STD_BITS_LENGTH_SH_BIG);
   2234     }
   2235   else
   2236     {
   2237       r_index = (((unsigned int) bytes->r_index[2] << 16)
   2238 		 | ((unsigned int) bytes->r_index[1] << 8)
   2239 		 | bytes->r_index[0]);
   2240       r_extern  = (0 != (bytes->r_type[0] & RELOC_STD_BITS_EXTERN_LITTLE));
   2241       r_pcrel   = (0 != (bytes->r_type[0] & RELOC_STD_BITS_PCREL_LITTLE));
   2242       r_baserel = (0 != (bytes->r_type[0] & RELOC_STD_BITS_BASEREL_LITTLE));
   2243       r_jmptable= (0 != (bytes->r_type[0] & RELOC_STD_BITS_JMPTABLE_LITTLE));
   2244       r_relative= (0 != (bytes->r_type[0] & RELOC_STD_BITS_RELATIVE_LITTLE));
   2245       r_length  = ((bytes->r_type[0] & RELOC_STD_BITS_LENGTH_LITTLE)
   2246 		   >> RELOC_STD_BITS_LENGTH_SH_LITTLE);
   2247     }
   2248 
   2249   howto_idx = (r_length + 4 * r_pcrel + 8 * r_baserel
   2250 	       + 16 * r_jmptable + 32 * r_relative);
   2251   if (howto_idx < TABLE_SIZE (howto_table_std))
   2252     {
   2253       cache_ptr->howto = howto_table_std + howto_idx;
   2254       if (cache_ptr->howto->type == (unsigned int) -1)
   2255 	cache_ptr->howto = NULL;
   2256     }
   2257   else
   2258     cache_ptr->howto = NULL;
   2259 
   2260   /* Base relative relocs are always against the symbol table,
   2261      regardless of the setting of r_extern.  r_extern just reflects
   2262      whether the symbol the reloc is against is local or global.  */
   2263   if (r_baserel)
   2264     r_extern = 1;
   2265 
   2266   if (r_extern && r_index > symcount)
   2267     {
   2268       /* We could arrange to return an error, but it might be useful
   2269          to see the file even if it is bad.  */
   2270       r_extern = 0;
   2271       r_index = N_ABS;
   2272     }
   2273 
   2274   MOVE_ADDRESS (0);
   2275 }
   2276 
   2277 /* Read and swap the relocs for a section.  */
   2278 
   2279 bfd_boolean
   2280 NAME (aout, slurp_reloc_table) (bfd *abfd, sec_ptr asect, asymbol **symbols)
   2281 {
   2282   bfd_size_type count;
   2283   bfd_size_type reloc_size;
   2284   void * relocs;
   2285   arelent *reloc_cache;
   2286   size_t each_size;
   2287   unsigned int counter = 0;
   2288   arelent *cache_ptr;
   2289   bfd_size_type amt;
   2290 
   2291   if (asect->relocation)
   2292     return TRUE;
   2293 
   2294   if (asect->flags & SEC_CONSTRUCTOR)
   2295     return TRUE;
   2296 
   2297   if (asect == obj_datasec (abfd))
   2298     reloc_size = exec_hdr (abfd)->a_drsize;
   2299   else if (asect == obj_textsec (abfd))
   2300     reloc_size = exec_hdr (abfd)->a_trsize;
   2301   else if (asect == obj_bsssec (abfd))
   2302     reloc_size = 0;
   2303   else
   2304     {
   2305       bfd_set_error (bfd_error_invalid_operation);
   2306       return FALSE;
   2307     }
   2308 
   2309   if (reloc_size == 0)
   2310     return TRUE;		/* Nothing to be done.  */
   2311 
   2312   if (bfd_seek (abfd, asect->rel_filepos, SEEK_SET) != 0)
   2313     return FALSE;
   2314 
   2315   each_size = obj_reloc_entry_size (abfd);
   2316 
   2317   count = reloc_size / each_size;
   2318   if (count == 0)
   2319     return TRUE;		/* Nothing to be done.  */
   2320 
   2321   amt = count * sizeof (arelent);
   2322   reloc_cache = (arelent *) bfd_zmalloc (amt);
   2323   if (reloc_cache == NULL)
   2324     return FALSE;
   2325 
   2326   relocs = bfd_malloc (reloc_size);
   2327   if (relocs == NULL)
   2328     {
   2329       free (reloc_cache);
   2330       return FALSE;
   2331     }
   2332 
   2333   if (bfd_bread (relocs, reloc_size, abfd) != reloc_size)
   2334     {
   2335       free (relocs);
   2336       free (reloc_cache);
   2337       return FALSE;
   2338     }
   2339 
   2340   cache_ptr = reloc_cache;
   2341   if (each_size == RELOC_EXT_SIZE)
   2342     {
   2343       struct reloc_ext_external *rptr = (struct reloc_ext_external *) relocs;
   2344 
   2345       for (; counter < count; counter++, rptr++, cache_ptr++)
   2346 	MY_swap_ext_reloc_in (abfd, rptr, cache_ptr, symbols,
   2347 			      (bfd_size_type) bfd_get_symcount (abfd));
   2348     }
   2349   else
   2350     {
   2351       struct reloc_std_external *rptr = (struct reloc_std_external *) relocs;
   2352 
   2353       for (; counter < count; counter++, rptr++, cache_ptr++)
   2354 	MY_swap_std_reloc_in (abfd, rptr, cache_ptr, symbols,
   2355 			      (bfd_size_type) bfd_get_symcount (abfd));
   2356     }
   2357 
   2358   free (relocs);
   2359 
   2360   asect->relocation = reloc_cache;
   2361   asect->reloc_count = cache_ptr - reloc_cache;
   2362 
   2363   return TRUE;
   2364 }
   2365 
   2366 /* Write out a relocation section into an object file.  */
   2367 
   2368 bfd_boolean
   2369 NAME (aout, squirt_out_relocs) (bfd *abfd, asection *section)
   2370 {
   2371   arelent **generic;
   2372   unsigned char *native, *natptr;
   2373   size_t each_size;
   2374 
   2375   unsigned int count = section->reloc_count;
   2376   bfd_size_type natsize;
   2377 
   2378   if (count == 0 || section->orelocation == NULL)
   2379     return TRUE;
   2380 
   2381   each_size = obj_reloc_entry_size (abfd);
   2382   natsize = (bfd_size_type) each_size * count;
   2383   native = (unsigned char *) bfd_zalloc (abfd, natsize);
   2384   if (!native)
   2385     return FALSE;
   2386 
   2387   generic = section->orelocation;
   2388 
   2389   if (each_size == RELOC_EXT_SIZE)
   2390     {
   2391       for (natptr = native;
   2392 	   count != 0;
   2393 	   --count, natptr += each_size, ++generic)
   2394 	MY_swap_ext_reloc_out (abfd, *generic,
   2395 			       (struct reloc_ext_external *) natptr);
   2396     }
   2397   else
   2398     {
   2399       for (natptr = native;
   2400 	   count != 0;
   2401 	   --count, natptr += each_size, ++generic)
   2402 	MY_swap_std_reloc_out (abfd, *generic,
   2403 			       (struct reloc_std_external *) natptr);
   2404     }
   2405 
   2406   if (bfd_bwrite ((void *) native, natsize, abfd) != natsize)
   2407     {
   2408       bfd_release (abfd, native);
   2409       return FALSE;
   2410     }
   2411   bfd_release (abfd, native);
   2412 
   2413   return TRUE;
   2414 }
   2415 
   2416 /* This is stupid.  This function should be a boolean predicate.  */
   2417 
   2418 long
   2419 NAME (aout, canonicalize_reloc) (bfd *abfd,
   2420 				 sec_ptr section,
   2421 				 arelent **relptr,
   2422 				 asymbol **symbols)
   2423 {
   2424   arelent *tblptr = section->relocation;
   2425   unsigned int count;
   2426 
   2427   if (section == obj_bsssec (abfd))
   2428     {
   2429       *relptr = NULL;
   2430       return 0;
   2431     }
   2432 
   2433   if (!(tblptr || NAME (aout, slurp_reloc_table) (abfd, section, symbols)))
   2434     return -1;
   2435 
   2436   if (section->flags & SEC_CONSTRUCTOR)
   2437     {
   2438       arelent_chain *chain = section->constructor_chain;
   2439       for (count = 0; count < section->reloc_count; count ++)
   2440 	{
   2441 	  *relptr ++ = &chain->relent;
   2442 	  chain = chain->next;
   2443 	}
   2444     }
   2445   else
   2446     {
   2447       tblptr = section->relocation;
   2448 
   2449       for (count = 0; count++ < section->reloc_count; )
   2450 	{
   2451 	  *relptr++ = tblptr++;
   2452 	}
   2453     }
   2454   *relptr = 0;
   2455 
   2456   return section->reloc_count;
   2457 }
   2458 
   2459 long
   2460 NAME (aout, get_reloc_upper_bound) (bfd *abfd, sec_ptr asect)
   2461 {
   2462   if (bfd_get_format (abfd) != bfd_object)
   2463     {
   2464       bfd_set_error (bfd_error_invalid_operation);
   2465       return -1;
   2466     }
   2467 
   2468   if (asect->flags & SEC_CONSTRUCTOR)
   2469     return sizeof (arelent *) * (asect->reloc_count + 1);
   2470 
   2471   if (asect == obj_datasec (abfd))
   2472     return sizeof (arelent *)
   2473       * ((exec_hdr (abfd)->a_drsize / obj_reloc_entry_size (abfd))
   2474 	 + 1);
   2475 
   2476   if (asect == obj_textsec (abfd))
   2477     return sizeof (arelent *)
   2478       * ((exec_hdr (abfd)->a_trsize / obj_reloc_entry_size (abfd))
   2479 	 + 1);
   2480 
   2481   if (asect == obj_bsssec (abfd))
   2482     return sizeof (arelent *);
   2483 
   2484   if (asect == obj_bsssec (abfd))
   2485     return 0;
   2486 
   2487   bfd_set_error (bfd_error_invalid_operation);
   2488   return -1;
   2489 }
   2490 
   2491 long
   2493 NAME (aout, get_symtab_upper_bound) (bfd *abfd)
   2494 {
   2495   if (!NAME (aout, slurp_symbol_table) (abfd))
   2496     return -1;
   2497 
   2498   return (bfd_get_symcount (abfd)+1) * (sizeof (aout_symbol_type *));
   2499 }
   2500 
   2501 alent *
   2502 NAME (aout, get_lineno) (bfd *ignore_abfd ATTRIBUTE_UNUSED,
   2503 			 asymbol *ignore_symbol ATTRIBUTE_UNUSED)
   2504 {
   2505   return NULL;
   2506 }
   2507 
   2508 void
   2509 NAME (aout, get_symbol_info) (bfd *ignore_abfd ATTRIBUTE_UNUSED,
   2510 			      asymbol *symbol,
   2511 			      symbol_info *ret)
   2512 {
   2513   bfd_symbol_info (symbol, ret);
   2514 
   2515   if (ret->type == '?')
   2516     {
   2517       int type_code = aout_symbol (symbol)->type & 0xff;
   2518       const char *stab_name = bfd_get_stab_name (type_code);
   2519       static char buf[10];
   2520 
   2521       if (stab_name == NULL)
   2522 	{
   2523 	  sprintf (buf, "(%d)", type_code);
   2524 	  stab_name = buf;
   2525 	}
   2526       ret->type = '-';
   2527       ret->stab_type = type_code;
   2528       ret->stab_other = (unsigned) (aout_symbol (symbol)->other & 0xff);
   2529       ret->stab_desc = (unsigned) (aout_symbol (symbol)->desc & 0xffff);
   2530       ret->stab_name = stab_name;
   2531     }
   2532 }
   2533 
   2534 void
   2535 NAME (aout, print_symbol) (bfd *abfd,
   2536 			   void * afile,
   2537 			   asymbol *symbol,
   2538 			   bfd_print_symbol_type how)
   2539 {
   2540   FILE *file = (FILE *)afile;
   2541 
   2542   switch (how)
   2543     {
   2544     case bfd_print_symbol_name:
   2545       if (symbol->name)
   2546 	fprintf (file,"%s", symbol->name);
   2547       break;
   2548     case bfd_print_symbol_more:
   2549       fprintf (file,"%4x %2x %2x",
   2550 	       (unsigned) (aout_symbol (symbol)->desc & 0xffff),
   2551 	       (unsigned) (aout_symbol (symbol)->other & 0xff),
   2552 	       (unsigned) (aout_symbol (symbol)->type));
   2553       break;
   2554     case bfd_print_symbol_all:
   2555       {
   2556 	const char *section_name = symbol->section->name;
   2557 
   2558 	bfd_print_symbol_vandf (abfd, (void *)file, symbol);
   2559 
   2560 	fprintf (file," %-5s %04x %02x %02x",
   2561 		 section_name,
   2562 		 (unsigned) (aout_symbol (symbol)->desc & 0xffff),
   2563 		 (unsigned) (aout_symbol (symbol)->other & 0xff),
   2564 		 (unsigned) (aout_symbol (symbol)->type & 0xff));
   2565 	if (symbol->name)
   2566 	  fprintf (file," %s", symbol->name);
   2567       }
   2568       break;
   2569     }
   2570 }
   2571 
   2572 /* If we don't have to allocate more than 1MB to hold the generic
   2573    symbols, we use the generic minisymbol methord: it's faster, since
   2574    it only translates the symbols once, not multiple times.  */
   2575 #define MINISYM_THRESHOLD (1000000 / sizeof (asymbol))
   2576 
   2577 /* Read minisymbols.  For minisymbols, we use the unmodified a.out
   2578    symbols.  The minisymbol_to_symbol function translates these into
   2579    BFD asymbol structures.  */
   2580 
   2581 long
   2582 NAME (aout, read_minisymbols) (bfd *abfd,
   2583 			       bfd_boolean dynamic,
   2584 			       void * *minisymsp,
   2585 			       unsigned int *sizep)
   2586 {
   2587   if (dynamic)
   2588     /* We could handle the dynamic symbols here as well, but it's
   2589        easier to hand them off.  */
   2590     return _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep);
   2591 
   2592   if (! aout_get_external_symbols (abfd))
   2593     return -1;
   2594 
   2595   if (obj_aout_external_sym_count (abfd) < MINISYM_THRESHOLD)
   2596     return _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep);
   2597 
   2598   *minisymsp = (void *) obj_aout_external_syms (abfd);
   2599 
   2600   /* By passing the external symbols back from this routine, we are
   2601      giving up control over the memory block.  Clear
   2602      obj_aout_external_syms, so that we do not try to free it
   2603      ourselves.  */
   2604   obj_aout_external_syms (abfd) = NULL;
   2605 
   2606   *sizep = EXTERNAL_NLIST_SIZE;
   2607   return obj_aout_external_sym_count (abfd);
   2608 }
   2609 
   2610 /* Convert a minisymbol to a BFD asymbol.  A minisymbol is just an
   2611    unmodified a.out symbol.  The SYM argument is a structure returned
   2612    by bfd_make_empty_symbol, which we fill in here.  */
   2613 
   2614 asymbol *
   2615 NAME (aout, minisymbol_to_symbol) (bfd *abfd,
   2616 				   bfd_boolean dynamic,
   2617 				   const void * minisym,
   2618 				   asymbol *sym)
   2619 {
   2620   if (dynamic
   2621       || obj_aout_external_sym_count (abfd) < MINISYM_THRESHOLD)
   2622     return _bfd_generic_minisymbol_to_symbol (abfd, dynamic, minisym, sym);
   2623 
   2624   memset (sym, 0, sizeof (aout_symbol_type));
   2625 
   2626   /* We call translate_symbol_table to translate a single symbol.  */
   2627   if (! (NAME (aout, translate_symbol_table)
   2628 	 (abfd,
   2629 	  (aout_symbol_type *) sym,
   2630 	  (struct external_nlist *) minisym,
   2631 	  (bfd_size_type) 1,
   2632 	  obj_aout_external_strings (abfd),
   2633 	  obj_aout_external_string_size (abfd),
   2634 	  FALSE)))
   2635     return NULL;
   2636 
   2637   return sym;
   2638 }
   2639 
   2640 /* Provided a BFD, a section and an offset into the section, calculate
   2641    and return the name of the source file and the line nearest to the
   2642    wanted location.  */
   2643 
   2644 bfd_boolean
   2645 NAME (aout, find_nearest_line) (bfd *abfd,
   2646 				asymbol **symbols,
   2647 				asection *section,
   2648 				bfd_vma offset,
   2649 				const char **filename_ptr,
   2650 				const char **functionname_ptr,
   2651 				unsigned int *line_ptr,
   2652 				unsigned int *disriminator_ptr)
   2653 {
   2654   /* Run down the file looking for the filename, function and linenumber.  */
   2655   asymbol **p;
   2656   const char *directory_name = NULL;
   2657   const char *main_file_name = NULL;
   2658   const char *current_file_name = NULL;
   2659   const char *line_file_name = NULL;      /* Value of current_file_name at line number.  */
   2660   const char *line_directory_name = NULL; /* Value of directory_name at line number.  */
   2661   bfd_vma low_line_vma = 0;
   2662   bfd_vma low_func_vma = 0;
   2663   asymbol *func = 0;
   2664   bfd_size_type filelen, funclen;
   2665   char *buf;
   2666 
   2667   *filename_ptr = abfd->filename;
   2668   *functionname_ptr = 0;
   2669   *line_ptr = 0;
   2670   if (disriminator_ptr)
   2671     *disriminator_ptr = 0;
   2672 
   2673   if (symbols != NULL)
   2674     {
   2675       for (p = symbols; *p; p++)
   2676 	{
   2677 	  aout_symbol_type  *q = (aout_symbol_type *) (*p);
   2678 	next:
   2679 	  switch (q->type)
   2680 	    {
   2681 	    case N_TEXT:
   2682 	      /* If this looks like a file name symbol, and it comes after
   2683 		 the line number we have found so far, but before the
   2684 		 offset, then we have probably not found the right line
   2685 		 number.  */
   2686 	      if (q->symbol.value <= offset
   2687 		  && ((q->symbol.value > low_line_vma
   2688 		       && (line_file_name != NULL
   2689 			   || *line_ptr != 0))
   2690 		      || (q->symbol.value > low_func_vma
   2691 			  && func != NULL)))
   2692 		{
   2693 		  const char *symname;
   2694 
   2695 		  symname = q->symbol.name;
   2696 		  if (strcmp (symname + strlen (symname) - 2, ".o") == 0)
   2697 		    {
   2698 		      if (q->symbol.value > low_line_vma)
   2699 			{
   2700 			  *line_ptr = 0;
   2701 			  line_file_name = NULL;
   2702 			}
   2703 		      if (q->symbol.value > low_func_vma)
   2704 			func = NULL;
   2705 		    }
   2706 		}
   2707 	      break;
   2708 
   2709 	    case N_SO:
   2710 	      /* If this symbol is less than the offset, but greater than
   2711 		 the line number we have found so far, then we have not
   2712 		 found the right line number.  */
   2713 	      if (q->symbol.value <= offset)
   2714 		{
   2715 		  if (q->symbol.value > low_line_vma)
   2716 		    {
   2717 		      *line_ptr = 0;
   2718 		      line_file_name = NULL;
   2719 		    }
   2720 		  if (q->symbol.value > low_func_vma)
   2721 		    func = NULL;
   2722 		}
   2723 
   2724 	      main_file_name = current_file_name = q->symbol.name;
   2725 	      /* Look ahead to next symbol to check if that too is an N_SO.  */
   2726 	      p++;
   2727 	      if (*p == NULL)
   2728 		goto done;
   2729 	      q = (aout_symbol_type *) (*p);
   2730 	      if (q->type != (int)N_SO)
   2731 		goto next;
   2732 
   2733 	      /* Found a second N_SO  First is directory; second is filename.  */
   2734 	      directory_name = current_file_name;
   2735 	      main_file_name = current_file_name = q->symbol.name;
   2736 	      if (obj_textsec (abfd) != section)
   2737 		goto done;
   2738 	      break;
   2739 	    case N_SOL:
   2740 	      current_file_name = q->symbol.name;
   2741 	      break;
   2742 
   2743 	    case N_SLINE:
   2744 
   2745 	    case N_DSLINE:
   2746 	    case N_BSLINE:
   2747 	      /* We'll keep this if it resolves nearer than the one we have
   2748 		 already.  */
   2749 	      if (q->symbol.value >= low_line_vma
   2750 		  && q->symbol.value <= offset)
   2751 		{
   2752 		  *line_ptr = q->desc;
   2753 		  low_line_vma = q->symbol.value;
   2754 		  line_file_name = current_file_name;
   2755 		  line_directory_name = directory_name;
   2756 		}
   2757 	      break;
   2758 	    case N_FUN:
   2759 	      {
   2760 		/* We'll keep this if it is nearer than the one we have already.  */
   2761 		if (q->symbol.value >= low_func_vma &&
   2762 		    q->symbol.value <= offset)
   2763 		  {
   2764 		    low_func_vma = q->symbol.value;
   2765 		    func = (asymbol *)q;
   2766 		  }
   2767 		else if (q->symbol.value > offset)
   2768 		  goto done;
   2769 	      }
   2770 	      break;
   2771 	    }
   2772 	}
   2773     }
   2774 
   2775  done:
   2776   if (*line_ptr != 0)
   2777     {
   2778       main_file_name = line_file_name;
   2779       directory_name = line_directory_name;
   2780     }
   2781 
   2782   if (main_file_name == NULL
   2783       || IS_ABSOLUTE_PATH (main_file_name)
   2784       || directory_name == NULL)
   2785     filelen = 0;
   2786   else
   2787     filelen = strlen (directory_name) + strlen (main_file_name);
   2788 
   2789   if (func == NULL)
   2790     funclen = 0;
   2791   else
   2792     funclen = strlen (bfd_asymbol_name (func));
   2793 
   2794   if (adata (abfd).line_buf != NULL)
   2795     free (adata (abfd).line_buf);
   2796 
   2797   if (filelen + funclen == 0)
   2798     adata (abfd).line_buf = buf = NULL;
   2799   else
   2800     {
   2801       buf = (char *) bfd_malloc (filelen + funclen + 3);
   2802       adata (abfd).line_buf = buf;
   2803       if (buf == NULL)
   2804 	return FALSE;
   2805     }
   2806 
   2807   if (main_file_name != NULL)
   2808     {
   2809       if (IS_ABSOLUTE_PATH (main_file_name) || directory_name == NULL)
   2810 	*filename_ptr = main_file_name;
   2811       else
   2812 	{
   2813 	  sprintf (buf, "%s%s", directory_name, main_file_name);
   2814 	  *filename_ptr = buf;
   2815 	  buf += filelen + 1;
   2816 	}
   2817     }
   2818 
   2819   if (func)
   2820     {
   2821       const char *function = func->name;
   2822       char *colon;
   2823 
   2824       /* The caller expects a symbol name.  We actually have a
   2825 	 function name, without the leading underscore.  Put the
   2826 	 underscore back in, so that the caller gets a symbol name.  */
   2827       if (bfd_get_symbol_leading_char (abfd) == '\0')
   2828 	strcpy (buf, function);
   2829       else
   2830 	{
   2831 	  buf[0] = bfd_get_symbol_leading_char (abfd);
   2832 	  strcpy (buf + 1, function);
   2833 	}
   2834       /* Have to remove : stuff.  */
   2835       colon = strchr (buf, ':');
   2836       if (colon != NULL)
   2837 	*colon = '\0';
   2838       *functionname_ptr = buf;
   2839     }
   2840 
   2841   return TRUE;
   2842 }
   2843 
   2844 int
   2845 NAME (aout, sizeof_headers) (bfd *abfd,
   2846 			     struct bfd_link_info *info ATTRIBUTE_UNUSED)
   2847 {
   2848   return adata (abfd).exec_bytes_size;
   2849 }
   2850 
   2851 /* Free all information we have cached for this BFD.  We can always
   2852    read it again later if we need it.  */
   2853 
   2854 bfd_boolean
   2855 NAME (aout, bfd_free_cached_info) (bfd *abfd)
   2856 {
   2857   asection *o;
   2858 
   2859   if (bfd_get_format (abfd) != bfd_object
   2860       || abfd->tdata.aout_data == NULL)
   2861     return TRUE;
   2862 
   2863 #define BFCI_FREE(x) if (x != NULL) { free (x); x = NULL; }
   2864   BFCI_FREE (obj_aout_symbols (abfd));
   2865 #ifdef USE_MMAP
   2866   obj_aout_external_syms (abfd) = 0;
   2867   bfd_free_window (&obj_aout_sym_window (abfd));
   2868   bfd_free_window (&obj_aout_string_window (abfd));
   2869   obj_aout_external_strings (abfd) = 0;
   2870 #else
   2871   BFCI_FREE (obj_aout_external_syms (abfd));
   2872   BFCI_FREE (obj_aout_external_strings (abfd));
   2873 #endif
   2874   for (o = abfd->sections; o != NULL; o = o->next)
   2875     BFCI_FREE (o->relocation);
   2876 #undef BFCI_FREE
   2877 
   2878   return TRUE;
   2879 }
   2880 
   2881 /* a.out link code.  */
   2883 
   2884 /* Routine to create an entry in an a.out link hash table.  */
   2885 
   2886 struct bfd_hash_entry *
   2887 NAME (aout, link_hash_newfunc) (struct bfd_hash_entry *entry,
   2888 				struct bfd_hash_table *table,
   2889 				const char *string)
   2890 {
   2891   struct aout_link_hash_entry *ret = (struct aout_link_hash_entry *) entry;
   2892 
   2893   /* Allocate the structure if it has not already been allocated by a
   2894      subclass.  */
   2895   if (ret == NULL)
   2896     ret = (struct aout_link_hash_entry *) bfd_hash_allocate (table,
   2897                                                              sizeof (* ret));
   2898   if (ret == NULL)
   2899     return NULL;
   2900 
   2901   /* Call the allocation method of the superclass.  */
   2902   ret = ((struct aout_link_hash_entry *)
   2903 	 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
   2904 				 table, string));
   2905   if (ret)
   2906     {
   2907       /* Set local fields.  */
   2908       ret->written = FALSE;
   2909       ret->indx = -1;
   2910     }
   2911 
   2912   return (struct bfd_hash_entry *) ret;
   2913 }
   2914 
   2915 /* Initialize an a.out link hash table.  */
   2916 
   2917 bfd_boolean
   2918 NAME (aout, link_hash_table_init) (struct aout_link_hash_table *table,
   2919 				   bfd *abfd,
   2920 				   struct bfd_hash_entry *(*newfunc)
   2921 				   (struct bfd_hash_entry *, struct bfd_hash_table *,
   2922 				    const char *),
   2923 				   unsigned int entsize)
   2924 {
   2925   return _bfd_link_hash_table_init (&table->root, abfd, newfunc, entsize);
   2926 }
   2927 
   2928 /* Create an a.out link hash table.  */
   2929 
   2930 struct bfd_link_hash_table *
   2931 NAME (aout, link_hash_table_create) (bfd *abfd)
   2932 {
   2933   struct aout_link_hash_table *ret;
   2934   bfd_size_type amt = sizeof (* ret);
   2935 
   2936   ret = (struct aout_link_hash_table *) bfd_malloc (amt);
   2937   if (ret == NULL)
   2938     return NULL;
   2939 
   2940   if (!NAME (aout, link_hash_table_init) (ret, abfd,
   2941 					  NAME (aout, link_hash_newfunc),
   2942 					  sizeof (struct aout_link_hash_entry)))
   2943     {
   2944       free (ret);
   2945       return NULL;
   2946     }
   2947   return &ret->root;
   2948 }
   2949 
   2950 /* Add all symbols from an object file to the hash table.  */
   2951 
   2952 static bfd_boolean
   2953 aout_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
   2954 {
   2955   bfd_boolean (*add_one_symbol)
   2956     (struct bfd_link_info *, bfd *, const char *, flagword, asection *,
   2957 	     bfd_vma, const char *, bfd_boolean, bfd_boolean,
   2958 	     struct bfd_link_hash_entry **);
   2959   struct external_nlist *syms;
   2960   bfd_size_type sym_count;
   2961   char *strings;
   2962   bfd_boolean copy;
   2963   struct aout_link_hash_entry **sym_hash;
   2964   struct external_nlist *p;
   2965   struct external_nlist *pend;
   2966   bfd_size_type amt;
   2967 
   2968   syms = obj_aout_external_syms (abfd);
   2969   sym_count = obj_aout_external_sym_count (abfd);
   2970   strings = obj_aout_external_strings (abfd);
   2971   if (info->keep_memory)
   2972     copy = FALSE;
   2973   else
   2974     copy = TRUE;
   2975 
   2976   if (aout_backend_info (abfd)->add_dynamic_symbols != NULL)
   2977     {
   2978       if (! ((*aout_backend_info (abfd)->add_dynamic_symbols)
   2979 	     (abfd, info, &syms, &sym_count, &strings)))
   2980 	return FALSE;
   2981     }
   2982 
   2983   if (sym_count == 0)
   2984     return TRUE;		/* Nothing to do.  */
   2985 
   2986   /* We keep a list of the linker hash table entries that correspond
   2987      to particular symbols.  We could just look them up in the hash
   2988      table, but keeping the list is more efficient.  Perhaps this
   2989      should be conditional on info->keep_memory.  */
   2990   amt = sym_count * sizeof (struct aout_link_hash_entry *);
   2991   sym_hash = (struct aout_link_hash_entry **) bfd_alloc (abfd, amt);
   2992   if (sym_hash == NULL)
   2993     return FALSE;
   2994   obj_aout_sym_hashes (abfd) = sym_hash;
   2995 
   2996   add_one_symbol = aout_backend_info (abfd)->add_one_symbol;
   2997   if (add_one_symbol == NULL)
   2998     add_one_symbol = _bfd_generic_link_add_one_symbol;
   2999 
   3000   p = syms;
   3001   pend = p + sym_count;
   3002   for (; p < pend; p++, sym_hash++)
   3003     {
   3004       int type;
   3005       const char *name;
   3006       bfd_vma value;
   3007       asection *section;
   3008       flagword flags;
   3009       const char *string;
   3010 
   3011       *sym_hash = NULL;
   3012 
   3013       type = H_GET_8 (abfd, p->e_type);
   3014 
   3015       /* Ignore debugging symbols.  */
   3016       if ((type & N_STAB) != 0)
   3017 	continue;
   3018 
   3019       name = strings + GET_WORD (abfd, p->e_strx);
   3020       value = GET_WORD (abfd, p->e_value);
   3021       flags = BSF_GLOBAL;
   3022       string = NULL;
   3023       switch (type)
   3024 	{
   3025 	default:
   3026 	  abort ();
   3027 
   3028 	case N_UNDF:
   3029 	case N_ABS:
   3030 	case N_TEXT:
   3031 	case N_DATA:
   3032 	case N_BSS:
   3033 	case N_FN_SEQ:
   3034 	case N_COMM:
   3035 	case N_SETV:
   3036 	case N_FN:
   3037 	  /* Ignore symbols that are not externally visible.  */
   3038 	  continue;
   3039 	case N_INDR:
   3040 	  /* Ignore local indirect symbol.  */
   3041 	  ++p;
   3042 	  ++sym_hash;
   3043 	  continue;
   3044 
   3045 	case N_UNDF | N_EXT:
   3046 	  if (value == 0)
   3047 	    {
   3048 	      section = bfd_und_section_ptr;
   3049 	      flags = 0;
   3050 	    }
   3051 	  else
   3052 	    section = bfd_com_section_ptr;
   3053 	  break;
   3054 	case N_ABS | N_EXT:
   3055 	  section = bfd_abs_section_ptr;
   3056 	  break;
   3057 	case N_TEXT | N_EXT:
   3058 	  section = obj_textsec (abfd);
   3059 	  value -= bfd_get_section_vma (abfd, section);
   3060 	  break;
   3061 	case N_DATA | N_EXT:
   3062 	case N_SETV | N_EXT:
   3063 	  /* Treat N_SETV symbols as N_DATA symbol; see comment in
   3064 	     translate_from_native_sym_flags.  */
   3065 	  section = obj_datasec (abfd);
   3066 	  value -= bfd_get_section_vma (abfd, section);
   3067 	  break;
   3068 	case N_BSS | N_EXT:
   3069 	  section = obj_bsssec (abfd);
   3070 	  value -= bfd_get_section_vma (abfd, section);
   3071 	  break;
   3072 	case N_INDR | N_EXT:
   3073 	  /* An indirect symbol.  The next symbol is the symbol
   3074 	     which this one really is.  */
   3075 	  BFD_ASSERT (p + 1 < pend);
   3076 	  ++p;
   3077 	  string = strings + GET_WORD (abfd, p->e_strx);
   3078 	  section = bfd_ind_section_ptr;
   3079 	  flags |= BSF_INDIRECT;
   3080 	  break;
   3081 	case N_COMM | N_EXT:
   3082 	  section = bfd_com_section_ptr;
   3083 	  break;
   3084 	case N_SETA: case N_SETA | N_EXT:
   3085 	  section = bfd_abs_section_ptr;
   3086 	  flags |= BSF_CONSTRUCTOR;
   3087 	  break;
   3088 	case N_SETT: case N_SETT | N_EXT:
   3089 	  section = obj_textsec (abfd);
   3090 	  flags |= BSF_CONSTRUCTOR;
   3091 	  value -= bfd_get_section_vma (abfd, section);
   3092 	  break;
   3093 	case N_SETD: case N_SETD | N_EXT:
   3094 	  section = obj_datasec (abfd);
   3095 	  flags |= BSF_CONSTRUCTOR;
   3096 	  value -= bfd_get_section_vma (abfd, section);
   3097 	  break;
   3098 	case N_SETB: case N_SETB | N_EXT:
   3099 	  section = obj_bsssec (abfd);
   3100 	  flags |= BSF_CONSTRUCTOR;
   3101 	  value -= bfd_get_section_vma (abfd, section);
   3102 	  break;
   3103 	case N_WARNING:
   3104 	  /* A warning symbol.  The next symbol is the one to warn
   3105 	     about.  If there is no next symbol, just look away.  */
   3106 	  if (p + 1 >= pend)
   3107 	    return TRUE;
   3108 	  ++p;
   3109 	  string = name;
   3110 	  name = strings + GET_WORD (abfd, p->e_strx);
   3111 	  section = bfd_und_section_ptr;
   3112 	  flags |= BSF_WARNING;
   3113 	  break;
   3114 	case N_WEAKU:
   3115 	  section = bfd_und_section_ptr;
   3116 	  flags = BSF_WEAK;
   3117 	  break;
   3118 	case N_WEAKA:
   3119 	  section = bfd_abs_section_ptr;
   3120 	  flags = BSF_WEAK;
   3121 	  break;
   3122 	case N_WEAKT:
   3123 	  section = obj_textsec (abfd);
   3124 	  value -= bfd_get_section_vma (abfd, section);
   3125 	  flags = BSF_WEAK;
   3126 	  break;
   3127 	case N_WEAKD:
   3128 	  section = obj_datasec (abfd);
   3129 	  value -= bfd_get_section_vma (abfd, section);
   3130 	  flags = BSF_WEAK;
   3131 	  break;
   3132 	case N_WEAKB:
   3133 	  section = obj_bsssec (abfd);
   3134 	  value -= bfd_get_section_vma (abfd, section);
   3135 	  flags = BSF_WEAK;
   3136 	  break;
   3137 	}
   3138 
   3139       if (! ((*add_one_symbol)
   3140 	     (info, abfd, name, flags, section, value, string, copy, FALSE,
   3141 	      (struct bfd_link_hash_entry **) sym_hash)))
   3142 	return FALSE;
   3143 
   3144       /* Restrict the maximum alignment of a common symbol based on
   3145 	 the architecture, since a.out has no way to represent
   3146 	 alignment requirements of a section in a .o file.  FIXME:
   3147 	 This isn't quite right: it should use the architecture of the
   3148 	 output file, not the input files.  */
   3149       if ((*sym_hash)->root.type == bfd_link_hash_common
   3150 	  && ((*sym_hash)->root.u.c.p->alignment_power >
   3151 	      bfd_get_arch_info (abfd)->section_align_power))
   3152 	(*sym_hash)->root.u.c.p->alignment_power =
   3153 	  bfd_get_arch_info (abfd)->section_align_power;
   3154 
   3155       /* If this is a set symbol, and we are not building sets, then
   3156 	 it is possible for the hash entry to not have been set.  In
   3157 	 such a case, treat the symbol as not globally defined.  */
   3158       if ((*sym_hash)->root.type == bfd_link_hash_new)
   3159 	{
   3160 	  BFD_ASSERT ((flags & BSF_CONSTRUCTOR) != 0);
   3161 	  *sym_hash = NULL;
   3162 	}
   3163 
   3164       if (type == (N_INDR | N_EXT) || type == N_WARNING)
   3165 	++sym_hash;
   3166     }
   3167 
   3168   return TRUE;
   3169 }
   3170 
   3171 /* Free up the internal symbols read from an a.out file.  */
   3172 
   3173 static bfd_boolean
   3174 aout_link_free_symbols (bfd *abfd)
   3175 {
   3176   if (obj_aout_external_syms (abfd) != NULL)
   3177     {
   3178 #ifdef USE_MMAP
   3179       bfd_free_window (&obj_aout_sym_window (abfd));
   3180 #else
   3181       free ((void *) obj_aout_external_syms (abfd));
   3182 #endif
   3183       obj_aout_external_syms (abfd) = NULL;
   3184     }
   3185   if (obj_aout_external_strings (abfd) != NULL)
   3186     {
   3187 #ifdef USE_MMAP
   3188       bfd_free_window (&obj_aout_string_window (abfd));
   3189 #else
   3190       free ((void *) obj_aout_external_strings (abfd));
   3191 #endif
   3192       obj_aout_external_strings (abfd) = NULL;
   3193     }
   3194   return TRUE;
   3195 }
   3196 
   3197 /* Add symbols from an a.out object file.  */
   3198 
   3199 static bfd_boolean
   3200 aout_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
   3201 {
   3202   if (! aout_get_external_symbols (abfd))
   3203     return FALSE;
   3204   if (! aout_link_add_symbols (abfd, info))
   3205     return FALSE;
   3206   if (! info->keep_memory)
   3207     {
   3208       if (! aout_link_free_symbols (abfd))
   3209 	return FALSE;
   3210     }
   3211   return TRUE;
   3212 }
   3213 
   3214 /* Look through the internal symbols to see if this object file should
   3215    be included in the link.  We should include this object file if it
   3216    defines any symbols which are currently undefined.  If this object
   3217    file defines a common symbol, then we may adjust the size of the
   3218    known symbol but we do not include the object file in the link
   3219    (unless there is some other reason to include it).  */
   3220 
   3221 static bfd_boolean
   3222 aout_link_check_ar_symbols (bfd *abfd,
   3223 			    struct bfd_link_info *info,
   3224 			    bfd_boolean *pneeded,
   3225 			    bfd **subsbfd)
   3226 {
   3227   struct external_nlist *p;
   3228   struct external_nlist *pend;
   3229   char *strings;
   3230 
   3231   *pneeded = FALSE;
   3232 
   3233   /* Look through all the symbols.  */
   3234   p = obj_aout_external_syms (abfd);
   3235   pend = p + obj_aout_external_sym_count (abfd);
   3236   strings = obj_aout_external_strings (abfd);
   3237   for (; p < pend; p++)
   3238     {
   3239       int type = H_GET_8 (abfd, p->e_type);
   3240       const char *name;
   3241       struct bfd_link_hash_entry *h;
   3242 
   3243       /* Ignore symbols that are not externally visible.  This is an
   3244 	 optimization only, as we check the type more thoroughly
   3245 	 below.  */
   3246       if (((type & N_EXT) == 0
   3247 	   || (type & N_STAB) != 0
   3248 	   || type == N_FN)
   3249 	  && type != N_WEAKA
   3250 	  && type != N_WEAKT
   3251 	  && type != N_WEAKD
   3252 	  && type != N_WEAKB)
   3253 	{
   3254 	  if (type == N_WARNING
   3255 	      || type == N_INDR)
   3256 	    ++p;
   3257 	  continue;
   3258 	}
   3259 
   3260       name = strings + GET_WORD (abfd, p->e_strx);
   3261       h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
   3262 
   3263       /* We are only interested in symbols that are currently
   3264 	 undefined or common.  */
   3265       if (h == NULL
   3266 	  || (h->type != bfd_link_hash_undefined
   3267 	      && h->type != bfd_link_hash_common))
   3268 	{
   3269 	  if (type == (N_INDR | N_EXT))
   3270 	    ++p;
   3271 	  continue;
   3272 	}
   3273 
   3274       if (type == (N_TEXT | N_EXT)
   3275 	  || type == (N_DATA | N_EXT)
   3276 	  || type == (N_BSS | N_EXT)
   3277 	  || type == (N_ABS | N_EXT)
   3278 	  || type == (N_INDR | N_EXT))
   3279 	{
   3280 	  /* This object file defines this symbol.  We must link it
   3281 	     in.  This is true regardless of whether the current
   3282 	     definition of the symbol is undefined or common.
   3283 
   3284              If the current definition is common, we have a case in
   3285 	     which we have already seen an object file including:
   3286 	         int a;
   3287 	     and this object file from the archive includes:
   3288 	         int a = 5;
   3289 	     In such a case, whether to include this object is target
   3290              dependant for backward compatibility.
   3291 
   3292 	     FIXME: The SunOS 4.1.3 linker will pull in the archive
   3293 	     element if the symbol is defined in the .data section,
   3294 	     but not if it is defined in the .text section.  That
   3295 	     seems a bit crazy to me, and it has not been implemented
   3296 	     yet.  However, it might be correct.  */
   3297 	  if (h->type == bfd_link_hash_common)
   3298 	    {
   3299 	      int skip = 0;
   3300 
   3301 	      switch (info->common_skip_ar_symbols)
   3302 		{
   3303 		case bfd_link_common_skip_text:
   3304 		  skip = (type == (N_TEXT | N_EXT));
   3305 		  break;
   3306 		case bfd_link_common_skip_data:
   3307 		  skip = (type == (N_DATA | N_EXT));
   3308 		  break;
   3309 		default:
   3310 		case bfd_link_common_skip_all:
   3311 		  skip = 1;
   3312 		  break;
   3313 		}
   3314 
   3315 	      if (skip)
   3316 		continue;
   3317 	    }
   3318 
   3319 	  if (!(*info->callbacks
   3320 		->add_archive_element) (info, abfd, name, subsbfd))
   3321 	    return FALSE;
   3322 	  *pneeded = TRUE;
   3323 	  return TRUE;
   3324 	}
   3325 
   3326       if (type == (N_UNDF | N_EXT))
   3327 	{
   3328 	  bfd_vma value;
   3329 
   3330 	  value = GET_WORD (abfd, p->e_value);
   3331 	  if (value != 0)
   3332 	    {
   3333 	      /* This symbol is common in the object from the archive
   3334 		 file.  */
   3335 	      if (h->type == bfd_link_hash_undefined)
   3336 		{
   3337 		  bfd *symbfd;
   3338 		  unsigned int power;
   3339 
   3340 		  symbfd = h->u.undef.abfd;
   3341 		  if (symbfd == NULL)
   3342 		    {
   3343 		      /* This symbol was created as undefined from
   3344 			 outside BFD.  We assume that we should link
   3345 			 in the object file.  This is done for the -u
   3346 			 option in the linker.  */
   3347 		      if (!(*info->callbacks
   3348 			    ->add_archive_element) (info, abfd, name, subsbfd))
   3349 			return FALSE;
   3350 		      *pneeded = TRUE;
   3351 		      return TRUE;
   3352 		    }
   3353 		  /* Turn the current link symbol into a common
   3354 		     symbol.  It is already on the undefs list.  */
   3355 		  h->type = bfd_link_hash_common;
   3356 		  h->u.c.p = (struct bfd_link_hash_common_entry *)
   3357 		    bfd_hash_allocate (&info->hash->table,
   3358 				       sizeof (struct bfd_link_hash_common_entry));
   3359 		  if (h->u.c.p == NULL)
   3360 		    return FALSE;
   3361 
   3362 		  h->u.c.size = value;
   3363 
   3364 		  /* FIXME: This isn't quite right.  The maximum
   3365 		     alignment of a common symbol should be set by the
   3366 		     architecture of the output file, not of the input
   3367 		     file.  */
   3368 		  power = bfd_log2 (value);
   3369 		  if (power > bfd_get_arch_info (abfd)->section_align_power)
   3370 		    power = bfd_get_arch_info (abfd)->section_align_power;
   3371 		  h->u.c.p->alignment_power = power;
   3372 
   3373 		  h->u.c.p->section = bfd_make_section_old_way (symbfd,
   3374 								"COMMON");
   3375 		}
   3376 	      else
   3377 		{
   3378 		  /* Adjust the size of the common symbol if
   3379 		     necessary.  */
   3380 		  if (value > h->u.c.size)
   3381 		    h->u.c.size = value;
   3382 		}
   3383 	    }
   3384 	}
   3385 
   3386       if (type == N_WEAKA
   3387 	  || type == N_WEAKT
   3388 	  || type == N_WEAKD
   3389 	  || type == N_WEAKB)
   3390 	{
   3391 	  /* This symbol is weak but defined.  We must pull it in if
   3392 	     the current link symbol is undefined, but we don't want
   3393 	     it if the current link symbol is common.  */
   3394 	  if (h->type == bfd_link_hash_undefined)
   3395 	    {
   3396 	      if (!(*info->callbacks
   3397 		    ->add_archive_element) (info, abfd, name, subsbfd))
   3398 		return FALSE;
   3399 	      *pneeded = TRUE;
   3400 	      return TRUE;
   3401 	    }
   3402 	}
   3403     }
   3404 
   3405   /* We do not need this object file.  */
   3406   return TRUE;
   3407 }
   3408 /* Check a single archive element to see if we need to include it in
   3409    the link.  *PNEEDED is set according to whether this element is
   3410    needed in the link or not.  This is called from
   3411    _bfd_generic_link_add_archive_symbols.  */
   3412 
   3413 static bfd_boolean
   3414 aout_link_check_archive_element (bfd *abfd,
   3415 				 struct bfd_link_info *info,
   3416 				 struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED,
   3417 				 const char *name ATTRIBUTE_UNUSED,
   3418 				 bfd_boolean *pneeded)
   3419 {
   3420   bfd *oldbfd;
   3421   bfd_boolean needed;
   3422 
   3423   if (!aout_get_external_symbols (abfd))
   3424     return FALSE;
   3425 
   3426   oldbfd = abfd;
   3427   if (!aout_link_check_ar_symbols (abfd, info, pneeded, &abfd))
   3428     return FALSE;
   3429 
   3430   needed = *pneeded;
   3431   if (needed)
   3432     {
   3433       /* Potentially, the add_archive_element hook may have set a
   3434 	 substitute BFD for us.  */
   3435       if (abfd != oldbfd)
   3436 	{
   3437 	  if (!info->keep_memory
   3438 	      && !aout_link_free_symbols (oldbfd))
   3439 	    return FALSE;
   3440 	  if (!aout_get_external_symbols (abfd))
   3441 	    return FALSE;
   3442 	}
   3443       if (!aout_link_add_symbols (abfd, info))
   3444 	return FALSE;
   3445     }
   3446 
   3447   if (!info->keep_memory || !needed)
   3448     {
   3449       if (!aout_link_free_symbols (abfd))
   3450 	return FALSE;
   3451     }
   3452 
   3453   return TRUE;
   3454 }
   3455 
   3456 /* Given an a.out BFD, add symbols to the global hash table as
   3457    appropriate.  */
   3458 
   3459 bfd_boolean
   3460 NAME (aout, link_add_symbols) (bfd *abfd, struct bfd_link_info *info)
   3461 {
   3462   switch (bfd_get_format (abfd))
   3463     {
   3464     case bfd_object:
   3465       return aout_link_add_object_symbols (abfd, info);
   3466     case bfd_archive:
   3467       return _bfd_generic_link_add_archive_symbols
   3468 	(abfd, info, aout_link_check_archive_element);
   3469     default:
   3470       bfd_set_error (bfd_error_wrong_format);
   3471       return FALSE;
   3472     }
   3473 }
   3474 
   3475 /* A hash table used for header files with N_BINCL entries.  */
   3477 
   3478 struct aout_link_includes_table
   3479 {
   3480   struct bfd_hash_table root;
   3481 };
   3482 
   3483 /* A linked list of totals that we have found for a particular header
   3484    file.  */
   3485 
   3486 struct aout_link_includes_totals
   3487 {
   3488   struct aout_link_includes_totals *next;
   3489   bfd_vma total;
   3490 };
   3491 
   3492 /* An entry in the header file hash table.  */
   3493 
   3494 struct aout_link_includes_entry
   3495 {
   3496   struct bfd_hash_entry root;
   3497   /* List of totals we have found for this file.  */
   3498   struct aout_link_includes_totals *totals;
   3499 };
   3500 
   3501 /* Look up an entry in an the header file hash table.  */
   3502 
   3503 #define aout_link_includes_lookup(table, string, create, copy)		\
   3504   ((struct aout_link_includes_entry *)					\
   3505    bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
   3506 
   3507 /* During the final link step we need to pass around a bunch of
   3508    information, so we do it in an instance of this structure.  */
   3509 
   3510 struct aout_final_link_info
   3511 {
   3512   /* General link information.  */
   3513   struct bfd_link_info *info;
   3514   /* Output bfd.  */
   3515   bfd *output_bfd;
   3516   /* Reloc file positions.  */
   3517   file_ptr treloff, dreloff;
   3518   /* File position of symbols.  */
   3519   file_ptr symoff;
   3520   /* String table.  */
   3521   struct bfd_strtab_hash *strtab;
   3522   /* Header file hash table.  */
   3523   struct aout_link_includes_table includes;
   3524   /* A buffer large enough to hold the contents of any section.  */
   3525   bfd_byte *contents;
   3526   /* A buffer large enough to hold the relocs of any section.  */
   3527   void * relocs;
   3528   /* A buffer large enough to hold the symbol map of any input BFD.  */
   3529   int *symbol_map;
   3530   /* A buffer large enough to hold output symbols of any input BFD.  */
   3531   struct external_nlist *output_syms;
   3532 };
   3533 
   3534 /* The function to create a new entry in the header file hash table.  */
   3535 
   3536 static struct bfd_hash_entry *
   3537 aout_link_includes_newfunc (struct bfd_hash_entry *entry,
   3538 			    struct bfd_hash_table *table,
   3539 			    const char *string)
   3540 {
   3541   struct aout_link_includes_entry *ret =
   3542     (struct aout_link_includes_entry *) entry;
   3543 
   3544   /* Allocate the structure if it has not already been allocated by a
   3545      subclass.  */
   3546   if (ret == NULL)
   3547     ret = (struct aout_link_includes_entry *)
   3548         bfd_hash_allocate (table, sizeof (* ret));
   3549   if (ret == NULL)
   3550     return NULL;
   3551 
   3552   /* Call the allocation method of the superclass.  */
   3553   ret = ((struct aout_link_includes_entry *)
   3554 	 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
   3555   if (ret)
   3556     {
   3557       /* Set local fields.  */
   3558       ret->totals = NULL;
   3559     }
   3560 
   3561   return (struct bfd_hash_entry *) ret;
   3562 }
   3563 
   3564 /* Write out a symbol that was not associated with an a.out input
   3565    object.  */
   3566 
   3567 static bfd_boolean
   3568 aout_link_write_other_symbol (struct bfd_hash_entry *bh, void *data)
   3569 {
   3570   struct aout_link_hash_entry *h = (struct aout_link_hash_entry *) bh;
   3571   struct aout_final_link_info *flaginfo = (struct aout_final_link_info *) data;
   3572   bfd *output_bfd;
   3573   int type;
   3574   bfd_vma val;
   3575   struct external_nlist outsym;
   3576   bfd_size_type indx;
   3577   bfd_size_type amt;
   3578 
   3579   if (h->root.type == bfd_link_hash_warning)
   3580     {
   3581       h = (struct aout_link_hash_entry *) h->root.u.i.link;
   3582       if (h->root.type == bfd_link_hash_new)
   3583 	return TRUE;
   3584     }
   3585 
   3586   output_bfd = flaginfo->output_bfd;
   3587 
   3588   if (aout_backend_info (output_bfd)->write_dynamic_symbol != NULL)
   3589     {
   3590       if (! ((*aout_backend_info (output_bfd)->write_dynamic_symbol)
   3591 	     (output_bfd, flaginfo->info, h)))
   3592 	{
   3593 	  /* FIXME: No way to handle errors.  */
   3594 	  abort ();
   3595 	}
   3596     }
   3597 
   3598   if (h->written)
   3599     return TRUE;
   3600 
   3601   h->written = TRUE;
   3602 
   3603   /* An indx of -2 means the symbol must be written.  */
   3604   if (h->indx != -2
   3605       && (flaginfo->info->strip == strip_all
   3606 	  || (flaginfo->info->strip == strip_some
   3607 	      && bfd_hash_lookup (flaginfo->info->keep_hash, h->root.root.string,
   3608 				  FALSE, FALSE) == NULL)))
   3609     return TRUE;
   3610 
   3611   switch (h->root.type)
   3612     {
   3613     default:
   3614     case bfd_link_hash_warning:
   3615       abort ();
   3616       /* Avoid variable not initialized warnings.  */
   3617       return TRUE;
   3618     case bfd_link_hash_new:
   3619       /* This can happen for set symbols when sets are not being
   3620          built.  */
   3621       return TRUE;
   3622     case bfd_link_hash_undefined:
   3623       type = N_UNDF | N_EXT;
   3624       val = 0;
   3625       break;
   3626     case bfd_link_hash_defined:
   3627     case bfd_link_hash_defweak:
   3628       {
   3629 	asection *sec;
   3630 
   3631 	sec = h->root.u.def.section->output_section;
   3632 	BFD_ASSERT (bfd_is_abs_section (sec)
   3633 		    || sec->owner == output_bfd);
   3634 	if (sec == obj_textsec (output_bfd))
   3635 	  type = h->root.type == bfd_link_hash_defined ? N_TEXT : N_WEAKT;
   3636 	else if (sec == obj_datasec (output_bfd))
   3637 	  type = h->root.type == bfd_link_hash_defined ? N_DATA : N_WEAKD;
   3638 	else if (sec == obj_bsssec (output_bfd))
   3639 	  type = h->root.type == bfd_link_hash_defined ? N_BSS : N_WEAKB;
   3640 	else
   3641 	  type = h->root.type == bfd_link_hash_defined ? N_ABS : N_WEAKA;
   3642 	type |= N_EXT;
   3643 	val = (h->root.u.def.value
   3644 	       + sec->vma
   3645 	       + h->root.u.def.section->output_offset);
   3646       }
   3647       break;
   3648     case bfd_link_hash_common:
   3649       type = N_UNDF | N_EXT;
   3650       val = h->root.u.c.size;
   3651       break;
   3652     case bfd_link_hash_undefweak:
   3653       type = N_WEAKU;
   3654       val = 0;
   3655       break;
   3656     case bfd_link_hash_indirect:
   3657       /* We ignore these symbols, since the indirected symbol is
   3658 	 already in the hash table.  */
   3659       return TRUE;
   3660     }
   3661 
   3662   H_PUT_8 (output_bfd, type, outsym.e_type);
   3663   H_PUT_8 (output_bfd, 0, outsym.e_other);
   3664   H_PUT_16 (output_bfd, 0, outsym.e_desc);
   3665   indx = add_to_stringtab (output_bfd, flaginfo->strtab, h->root.root.string,
   3666 			   FALSE);
   3667   if (indx == - (bfd_size_type) 1)
   3668     /* FIXME: No way to handle errors.  */
   3669     abort ();
   3670 
   3671   PUT_WORD (output_bfd, indx, outsym.e_strx);
   3672   PUT_WORD (output_bfd, val, outsym.e_value);
   3673 
   3674   amt = EXTERNAL_NLIST_SIZE;
   3675   if (bfd_seek (output_bfd, flaginfo->symoff, SEEK_SET) != 0
   3676       || bfd_bwrite ((void *) &outsym, amt, output_bfd) != amt)
   3677     /* FIXME: No way to handle errors.  */
   3678     abort ();
   3679 
   3680   flaginfo->symoff += EXTERNAL_NLIST_SIZE;
   3681   h->indx = obj_aout_external_sym_count (output_bfd);
   3682   ++obj_aout_external_sym_count (output_bfd);
   3683 
   3684   return TRUE;
   3685 }
   3686 
   3687 /* Handle a link order which is supposed to generate a reloc.  */
   3688 
   3689 static bfd_boolean
   3690 aout_link_reloc_link_order (struct aout_final_link_info *flaginfo,
   3691 			    asection *o,
   3692 			    struct bfd_link_order *p)
   3693 {
   3694   struct bfd_link_order_reloc *pr;
   3695   int r_index;
   3696   int r_extern;
   3697   reloc_howto_type *howto;
   3698   file_ptr *reloff_ptr = NULL;
   3699   struct reloc_std_external srel;
   3700   struct reloc_ext_external erel;
   3701   void * rel_ptr;
   3702   bfd_size_type amt;
   3703 
   3704   pr = p->u.reloc.p;
   3705 
   3706   if (p->type == bfd_section_reloc_link_order)
   3707     {
   3708       r_extern = 0;
   3709       if (bfd_is_abs_section (pr->u.section))
   3710 	r_index = N_ABS | N_EXT;
   3711       else
   3712 	{
   3713 	  BFD_ASSERT (pr->u.section->owner == flaginfo->output_bfd);
   3714 	  r_index = pr->u.section->target_index;
   3715 	}
   3716     }
   3717   else
   3718     {
   3719       struct aout_link_hash_entry *h;
   3720 
   3721       BFD_ASSERT (p->type == bfd_symbol_reloc_link_order);
   3722       r_extern = 1;
   3723       h = ((struct aout_link_hash_entry *)
   3724 	   bfd_wrapped_link_hash_lookup (flaginfo->output_bfd, flaginfo->info,
   3725 					 pr->u.name, FALSE, FALSE, TRUE));
   3726       if (h != NULL
   3727 	  && h->indx >= 0)
   3728 	r_index = h->indx;
   3729       else if (h != NULL)
   3730 	{
   3731 	  /* We decided to strip this symbol, but it turns out that we
   3732 	     can't.  Note that we lose the other and desc information
   3733 	     here.  I don't think that will ever matter for a global
   3734 	     symbol.  */
   3735 	  h->indx = -2;
   3736 	  h->written = FALSE;
   3737 	  if (!aout_link_write_other_symbol (&h->root.root, flaginfo))
   3738 	    return FALSE;
   3739 	  r_index = h->indx;
   3740 	}
   3741       else
   3742 	{
   3743 	  if (! ((*flaginfo->info->callbacks->unattached_reloc)
   3744 		 (flaginfo->info, pr->u.name, NULL, NULL, (bfd_vma) 0)))
   3745 	    return FALSE;
   3746 	  r_index = 0;
   3747 	}
   3748     }
   3749 
   3750   howto = bfd_reloc_type_lookup (flaginfo->output_bfd, pr->reloc);
   3751   if (howto == 0)
   3752     {
   3753       bfd_set_error (bfd_error_bad_value);
   3754       return FALSE;
   3755     }
   3756 
   3757   if (o == obj_textsec (flaginfo->output_bfd))
   3758     reloff_ptr = &flaginfo->treloff;
   3759   else if (o == obj_datasec (flaginfo->output_bfd))
   3760     reloff_ptr = &flaginfo->dreloff;
   3761   else
   3762     abort ();
   3763 
   3764   if (obj_reloc_entry_size (flaginfo->output_bfd) == RELOC_STD_SIZE)
   3765     {
   3766 #ifdef MY_put_reloc
   3767       MY_put_reloc (flaginfo->output_bfd, r_extern, r_index, p->offset, howto,
   3768 		    &srel);
   3769 #else
   3770       {
   3771 	int r_pcrel;
   3772 	int r_baserel;
   3773 	int r_jmptable;
   3774 	int r_relative;
   3775 	int r_length;
   3776 
   3777 	r_pcrel = (int) howto->pc_relative;
   3778 	r_baserel = (howto->type & 8) != 0;
   3779 	r_jmptable = (howto->type & 16) != 0;
   3780 	r_relative = (howto->type & 32) != 0;
   3781 	r_length = howto->size;
   3782 
   3783 	PUT_WORD (flaginfo->output_bfd, p->offset, srel.r_address);
   3784 	if (bfd_header_big_endian (flaginfo->output_bfd))
   3785 	  {
   3786 	    srel.r_index[0] = r_index >> 16;
   3787 	    srel.r_index[1] = r_index >> 8;
   3788 	    srel.r_index[2] = r_index;
   3789 	    srel.r_type[0] =
   3790 	      ((r_extern ?     RELOC_STD_BITS_EXTERN_BIG : 0)
   3791 	       | (r_pcrel ?    RELOC_STD_BITS_PCREL_BIG : 0)
   3792 	       | (r_baserel ?  RELOC_STD_BITS_BASEREL_BIG : 0)
   3793 	       | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_BIG : 0)
   3794 	       | (r_relative ? RELOC_STD_BITS_RELATIVE_BIG : 0)
   3795 	       | (r_length <<  RELOC_STD_BITS_LENGTH_SH_BIG));
   3796 	  }
   3797 	else
   3798 	  {
   3799 	    srel.r_index[2] = r_index >> 16;
   3800 	    srel.r_index[1] = r_index >> 8;
   3801 	    srel.r_index[0] = r_index;
   3802 	    srel.r_type[0] =
   3803 	      ((r_extern ?     RELOC_STD_BITS_EXTERN_LITTLE : 0)
   3804 	       | (r_pcrel ?    RELOC_STD_BITS_PCREL_LITTLE : 0)
   3805 	       | (r_baserel ?  RELOC_STD_BITS_BASEREL_LITTLE : 0)
   3806 	       | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_LITTLE : 0)
   3807 	       | (r_relative ? RELOC_STD_BITS_RELATIVE_LITTLE : 0)
   3808 	       | (r_length <<  RELOC_STD_BITS_LENGTH_SH_LITTLE));
   3809 	  }
   3810       }
   3811 #endif
   3812       rel_ptr = (void *) &srel;
   3813 
   3814       /* We have to write the addend into the object file, since
   3815 	 standard a.out relocs are in place.  It would be more
   3816 	 reliable if we had the current contents of the file here,
   3817 	 rather than assuming zeroes, but we can't read the file since
   3818 	 it was opened using bfd_openw.  */
   3819       if (pr->addend != 0)
   3820 	{
   3821 	  bfd_size_type size;
   3822 	  bfd_reloc_status_type r;
   3823 	  bfd_byte *buf;
   3824 	  bfd_boolean ok;
   3825 
   3826 	  size = bfd_get_reloc_size (howto);
   3827 	  buf = (bfd_byte *) bfd_zmalloc (size);
   3828 	  if (buf == NULL)
   3829 	    return FALSE;
   3830 	  r = MY_relocate_contents (howto, flaginfo->output_bfd,
   3831 				    (bfd_vma) pr->addend, buf);
   3832 	  switch (r)
   3833 	    {
   3834 	    case bfd_reloc_ok:
   3835 	      break;
   3836 	    default:
   3837 	    case bfd_reloc_outofrange:
   3838 	      abort ();
   3839 	    case bfd_reloc_overflow:
   3840 	      if (! ((*flaginfo->info->callbacks->reloc_overflow)
   3841 		     (flaginfo->info, NULL,
   3842 		      (p->type == bfd_section_reloc_link_order
   3843 		       ? bfd_section_name (flaginfo->output_bfd,
   3844 					   pr->u.section)
   3845 		       : pr->u.name),
   3846 		      howto->name, pr->addend, NULL, NULL, (bfd_vma) 0)))
   3847 		{
   3848 		  free (buf);
   3849 		  return FALSE;
   3850 		}
   3851 	      break;
   3852 	    }
   3853 	  ok = bfd_set_section_contents (flaginfo->output_bfd, o, (void *) buf,
   3854 					 (file_ptr) p->offset, size);
   3855 	  free (buf);
   3856 	  if (! ok)
   3857 	    return FALSE;
   3858 	}
   3859     }
   3860   else
   3861     {
   3862 #ifdef MY_put_ext_reloc
   3863       MY_put_ext_reloc (flaginfo->output_bfd, r_extern, r_index, p->offset,
   3864 			howto, &erel, pr->addend);
   3865 #else
   3866       PUT_WORD (flaginfo->output_bfd, p->offset, erel.r_address);
   3867 
   3868       if (bfd_header_big_endian (flaginfo->output_bfd))
   3869 	{
   3870 	  erel.r_index[0] = r_index >> 16;
   3871 	  erel.r_index[1] = r_index >> 8;
   3872 	  erel.r_index[2] = r_index;
   3873 	  erel.r_type[0] =
   3874 	    ((r_extern ? RELOC_EXT_BITS_EXTERN_BIG : 0)
   3875 	     | (howto->type << RELOC_EXT_BITS_TYPE_SH_BIG));
   3876 	}
   3877       else
   3878 	{
   3879 	  erel.r_index[2] = r_index >> 16;
   3880 	  erel.r_index[1] = r_index >> 8;
   3881 	  erel.r_index[0] = r_index;
   3882 	  erel.r_type[0] =
   3883 	    (r_extern ? RELOC_EXT_BITS_EXTERN_LITTLE : 0)
   3884 	      | (howto->type << RELOC_EXT_BITS_TYPE_SH_LITTLE);
   3885 	}
   3886 
   3887       PUT_WORD (flaginfo->output_bfd, (bfd_vma) pr->addend, erel.r_addend);
   3888 #endif /* MY_put_ext_reloc */
   3889 
   3890       rel_ptr = (void *) &erel;
   3891     }
   3892 
   3893   amt = obj_reloc_entry_size (flaginfo->output_bfd);
   3894   if (bfd_seek (flaginfo->output_bfd, *reloff_ptr, SEEK_SET) != 0
   3895       || bfd_bwrite (rel_ptr, amt, flaginfo->output_bfd) != amt)
   3896     return FALSE;
   3897 
   3898   *reloff_ptr += obj_reloc_entry_size (flaginfo->output_bfd);
   3899 
   3900   /* Assert that the relocs have not run into the symbols, and that n
   3901      the text relocs have not run into the data relocs.  */
   3902   BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (flaginfo->output_bfd)
   3903 	      && (reloff_ptr != &flaginfo->treloff
   3904 		  || (*reloff_ptr
   3905 		      <= obj_datasec (flaginfo->output_bfd)->rel_filepos)));
   3906 
   3907   return TRUE;
   3908 }
   3909 
   3910 /* Get the section corresponding to a reloc index.  */
   3911 
   3912 static INLINE asection *
   3913 aout_reloc_index_to_section (bfd *abfd, int indx)
   3914 {
   3915   switch (indx & N_TYPE)
   3916     {
   3917     case N_TEXT:   return obj_textsec (abfd);
   3918     case N_DATA:   return obj_datasec (abfd);
   3919     case N_BSS:    return obj_bsssec (abfd);
   3920     case N_ABS:
   3921     case N_UNDF:   return bfd_abs_section_ptr;
   3922     default:       abort ();
   3923     }
   3924   return NULL;
   3925 }
   3926 
   3927 /* Relocate an a.out section using standard a.out relocs.  */
   3928 
   3929 static bfd_boolean
   3930 aout_link_input_section_std (struct aout_final_link_info *flaginfo,
   3931 			     bfd *input_bfd,
   3932 			     asection *input_section,
   3933 			     struct reloc_std_external *relocs,
   3934 			     bfd_size_type rel_size,
   3935 			     bfd_byte *contents)
   3936 {
   3937   bfd_boolean (*check_dynamic_reloc)
   3938     (struct bfd_link_info *, bfd *, asection *,
   3939 	     struct aout_link_hash_entry *, void *, bfd_byte *, bfd_boolean *,
   3940 	     bfd_vma *);
   3941   bfd *output_bfd;
   3942   bfd_boolean relocatable;
   3943   struct external_nlist *syms;
   3944   char *strings;
   3945   struct aout_link_hash_entry **sym_hashes;
   3946   int *symbol_map;
   3947   bfd_size_type reloc_count;
   3948   struct reloc_std_external *rel;
   3949   struct reloc_std_external *rel_end;
   3950 
   3951   output_bfd = flaginfo->output_bfd;
   3952   check_dynamic_reloc = aout_backend_info (output_bfd)->check_dynamic_reloc;
   3953 
   3954   BFD_ASSERT (obj_reloc_entry_size (input_bfd) == RELOC_STD_SIZE);
   3955   BFD_ASSERT (input_bfd->xvec->header_byteorder
   3956 	      == output_bfd->xvec->header_byteorder);
   3957 
   3958   relocatable = flaginfo->info->relocatable;
   3959   syms = obj_aout_external_syms (input_bfd);
   3960   strings = obj_aout_external_strings (input_bfd);
   3961   sym_hashes = obj_aout_sym_hashes (input_bfd);
   3962   symbol_map = flaginfo->symbol_map;
   3963 
   3964   reloc_count = rel_size / RELOC_STD_SIZE;
   3965   rel = relocs;
   3966   rel_end = rel + reloc_count;
   3967   for (; rel < rel_end; rel++)
   3968     {
   3969       bfd_vma r_addr;
   3970       int r_index;
   3971       int r_extern;
   3972       int r_pcrel;
   3973       int r_baserel = 0;
   3974       reloc_howto_type *howto;
   3975       struct aout_link_hash_entry *h = NULL;
   3976       bfd_vma relocation;
   3977       bfd_reloc_status_type r;
   3978 
   3979       r_addr = GET_SWORD (input_bfd, rel->r_address);
   3980 
   3981 #ifdef MY_reloc_howto
   3982       howto = MY_reloc_howto (input_bfd, rel, r_index, r_extern, r_pcrel);
   3983 #else
   3984       {
   3985 	int r_jmptable;
   3986 	int r_relative;
   3987 	int r_length;
   3988 	unsigned int howto_idx;
   3989 
   3990 	if (bfd_header_big_endian (input_bfd))
   3991 	  {
   3992 	    r_index   =  (((unsigned int) rel->r_index[0] << 16)
   3993 			  | ((unsigned int) rel->r_index[1] << 8)
   3994 			  | rel->r_index[2]);
   3995 	    r_extern  = (0 != (rel->r_type[0] & RELOC_STD_BITS_EXTERN_BIG));
   3996 	    r_pcrel   = (0 != (rel->r_type[0] & RELOC_STD_BITS_PCREL_BIG));
   3997 	    r_baserel = (0 != (rel->r_type[0] & RELOC_STD_BITS_BASEREL_BIG));
   3998 	    r_jmptable= (0 != (rel->r_type[0] & RELOC_STD_BITS_JMPTABLE_BIG));
   3999 	    r_relative= (0 != (rel->r_type[0] & RELOC_STD_BITS_RELATIVE_BIG));
   4000 	    r_length  = ((rel->r_type[0] & RELOC_STD_BITS_LENGTH_BIG)
   4001 			 >> RELOC_STD_BITS_LENGTH_SH_BIG);
   4002 	  }
   4003 	else
   4004 	  {
   4005 	    r_index   = (((unsigned int) rel->r_index[2] << 16)
   4006 			 | ((unsigned int) rel->r_index[1] << 8)
   4007 			 | rel->r_index[0]);
   4008 	    r_extern  = (0 != (rel->r_type[0] & RELOC_STD_BITS_EXTERN_LITTLE));
   4009 	    r_pcrel   = (0 != (rel->r_type[0] & RELOC_STD_BITS_PCREL_LITTLE));
   4010 	    r_baserel = (0 != (rel->r_type[0]
   4011 			       & RELOC_STD_BITS_BASEREL_LITTLE));
   4012 	    r_jmptable= (0 != (rel->r_type[0]
   4013 			       & RELOC_STD_BITS_JMPTABLE_LITTLE));
   4014 	    r_relative= (0 != (rel->r_type[0]
   4015 			       & RELOC_STD_BITS_RELATIVE_LITTLE));
   4016 	    r_length  = ((rel->r_type[0] & RELOC_STD_BITS_LENGTH_LITTLE)
   4017 			 >> RELOC_STD_BITS_LENGTH_SH_LITTLE);
   4018 	  }
   4019 
   4020 	howto_idx = (r_length + 4 * r_pcrel + 8 * r_baserel
   4021 		     + 16 * r_jmptable + 32 * r_relative);
   4022 	if (howto_idx < TABLE_SIZE (howto_table_std))
   4023 	  howto = howto_table_std + howto_idx;
   4024 	else
   4025 	  howto = NULL;
   4026       }
   4027 #endif
   4028 
   4029       if (howto == NULL)
   4030 	{
   4031 	  (*flaginfo->info->callbacks->einfo)
   4032 	    (_("%P: %B: unexpected relocation type\n"), input_bfd);
   4033 	  bfd_set_error (bfd_error_bad_value);
   4034 	  return FALSE;
   4035 	}
   4036 
   4037       if (relocatable)
   4038 	{
   4039 	  /* We are generating a relocatable output file, and must
   4040 	     modify the reloc accordingly.  */
   4041 	  if (r_extern)
   4042 	    {
   4043 	      /* If we know the symbol this relocation is against,
   4044 		 convert it into a relocation against a section.  This
   4045 		 is what the native linker does.  */
   4046 	      h = sym_hashes[r_index];
   4047 	      if (h != NULL
   4048 		  && (h->root.type == bfd_link_hash_defined
   4049 		      || h->root.type == bfd_link_hash_defweak))
   4050 		{
   4051 		  asection *output_section;
   4052 
   4053 		  /* Change the r_extern value.  */
   4054 		  if (bfd_header_big_endian (output_bfd))
   4055 		    rel->r_type[0] &=~ RELOC_STD_BITS_EXTERN_BIG;
   4056 		  else
   4057 		    rel->r_type[0] &=~ RELOC_STD_BITS_EXTERN_LITTLE;
   4058 
   4059 		  /* Compute a new r_index.  */
   4060 		  output_section = h->root.u.def.section->output_section;
   4061 		  if (output_section == obj_textsec (output_bfd))
   4062 		    r_index = N_TEXT;
   4063 		  else if (output_section == obj_datasec (output_bfd))
   4064 		    r_index = N_DATA;
   4065 		  else if (output_section == obj_bsssec (output_bfd))
   4066 		    r_index = N_BSS;
   4067 		  else
   4068 		    r_index = N_ABS;
   4069 
   4070 		  /* Add the symbol value and the section VMA to the
   4071 		     addend stored in the contents.  */
   4072 		  relocation = (h->root.u.def.value
   4073 				+ output_section->vma
   4074 				+ h->root.u.def.section->output_offset);
   4075 		}
   4076 	      else
   4077 		{
   4078 		  /* We must change r_index according to the symbol
   4079 		     map.  */
   4080 		  r_index = symbol_map[r_index];
   4081 
   4082 		  if (r_index == -1)
   4083 		    {
   4084 		      if (h != NULL)
   4085 			{
   4086 			  /* We decided to strip this symbol, but it
   4087                              turns out that we can't.  Note that we
   4088                              lose the other and desc information here.
   4089                              I don't think that will ever matter for a
   4090                              global symbol.  */
   4091 			  if (h->indx < 0)
   4092 			    {
   4093 			      h->indx = -2;
   4094 			      h->written = FALSE;
   4095 			      if (!aout_link_write_other_symbol (&h->root.root,
   4096 								 flaginfo))
   4097 				return FALSE;
   4098 			    }
   4099 			  r_index = h->indx;
   4100 			}
   4101 		      else
   4102 			{
   4103 			  const char *name;
   4104 
   4105 			  name = strings + GET_WORD (input_bfd,
   4106 						     syms[r_index].e_strx);
   4107 			  if (! ((*flaginfo->info->callbacks->unattached_reloc)
   4108 				 (flaginfo->info, name, input_bfd, input_section,
   4109 				  r_addr)))
   4110 			    return FALSE;
   4111 			  r_index = 0;
   4112 			}
   4113 		    }
   4114 
   4115 		  relocation = 0;
   4116 		}
   4117 
   4118 	      /* Write out the new r_index value.  */
   4119 	      if (bfd_header_big_endian (output_bfd))
   4120 		{
   4121 		  rel->r_index[0] = r_index >> 16;
   4122 		  rel->r_index[1] = r_index >> 8;
   4123 		  rel->r_index[2] = r_index;
   4124 		}
   4125 	      else
   4126 		{
   4127 		  rel->r_index[2] = r_index >> 16;
   4128 		  rel->r_index[1] = r_index >> 8;
   4129 		  rel->r_index[0] = r_index;
   4130 		}
   4131 	    }
   4132 	  else
   4133 	    {
   4134 	      asection *section;
   4135 
   4136 	      /* This is a relocation against a section.  We must
   4137 		 adjust by the amount that the section moved.  */
   4138 	      section = aout_reloc_index_to_section (input_bfd, r_index);
   4139 	      relocation = (section->output_section->vma
   4140 			    + section->output_offset
   4141 			    - section->vma);
   4142 	    }
   4143 
   4144 	  /* Change the address of the relocation.  */
   4145 	  PUT_WORD (output_bfd,
   4146 		    r_addr + input_section->output_offset,
   4147 		    rel->r_address);
   4148 
   4149 	  /* Adjust a PC relative relocation by removing the reference
   4150 	     to the original address in the section and including the
   4151 	     reference to the new address.  */
   4152 	  if (r_pcrel)
   4153 	    relocation -= (input_section->output_section->vma
   4154 			   + input_section->output_offset
   4155 			   - input_section->vma);
   4156 
   4157 #ifdef MY_relocatable_reloc
   4158 	  MY_relocatable_reloc (howto, output_bfd, rel, relocation, r_addr);
   4159 #endif
   4160 
   4161 	  if (relocation == 0)
   4162 	    r = bfd_reloc_ok;
   4163 	  else
   4164 	    r = MY_relocate_contents (howto,
   4165 					input_bfd, relocation,
   4166 					contents + r_addr);
   4167 	}
   4168       else
   4169 	{
   4170 	  bfd_boolean hundef;
   4171 
   4172 	  /* We are generating an executable, and must do a full
   4173 	     relocation.  */
   4174 	  hundef = FALSE;
   4175 
   4176 	  if (r_extern)
   4177 	    {
   4178 	      h = sym_hashes[r_index];
   4179 
   4180 	      if (h != NULL
   4181 		  && (h->root.type == bfd_link_hash_defined
   4182 		      || h->root.type == bfd_link_hash_defweak))
   4183 		{
   4184 		  relocation = (h->root.u.def.value
   4185 				+ h->root.u.def.section->output_section->vma
   4186 				+ h->root.u.def.section->output_offset);
   4187 		}
   4188 	      else if (h != NULL
   4189 		       && h->root.type == bfd_link_hash_undefweak)
   4190 		relocation = 0;
   4191 	      else
   4192 		{
   4193 		  hundef = TRUE;
   4194 		  relocation = 0;
   4195 		}
   4196 	    }
   4197 	  else
   4198 	    {
   4199 	      asection *section;
   4200 
   4201 	      section = aout_reloc_index_to_section (input_bfd, r_index);
   4202 	      relocation = (section->output_section->vma
   4203 			    + section->output_offset
   4204 			    - section->vma);
   4205 	      if (r_pcrel)
   4206 		relocation += input_section->vma;
   4207 	    }
   4208 
   4209 	  if (check_dynamic_reloc != NULL)
   4210 	    {
   4211 	      bfd_boolean skip;
   4212 
   4213 	      if (! ((*check_dynamic_reloc)
   4214 		     (flaginfo->info, input_bfd, input_section, h,
   4215 		      (void *) rel, contents, &skip, &relocation)))
   4216 		return FALSE;
   4217 	      if (skip)
   4218 		continue;
   4219 	    }
   4220 
   4221 	  /* Now warn if a global symbol is undefined.  We could not
   4222              do this earlier, because check_dynamic_reloc might want
   4223              to skip this reloc.  */
   4224 	  if (hundef && ! flaginfo->info->shared && ! r_baserel)
   4225 	    {
   4226 	      const char *name;
   4227 
   4228 	      if (h != NULL)
   4229 		name = h->root.root.string;
   4230 	      else
   4231 		name = strings + GET_WORD (input_bfd, syms[r_index].e_strx);
   4232 	      if (! ((*flaginfo->info->callbacks->undefined_symbol)
   4233 		     (flaginfo->info, name, input_bfd, input_section,
   4234 		     r_addr, TRUE)))
   4235 		return FALSE;
   4236 	    }
   4237 
   4238 	  r = MY_final_link_relocate (howto,
   4239 				      input_bfd, input_section,
   4240 				      contents, r_addr, relocation,
   4241 				      (bfd_vma) 0);
   4242 	}
   4243 
   4244       if (r != bfd_reloc_ok)
   4245 	{
   4246 	  switch (r)
   4247 	    {
   4248 	    default:
   4249 	    case bfd_reloc_outofrange:
   4250 	      abort ();
   4251 	    case bfd_reloc_overflow:
   4252 	      {
   4253 		const char *name;
   4254 
   4255 		if (h != NULL)
   4256 		  name = NULL;
   4257 		else if (r_extern)
   4258 		  name = strings + GET_WORD (input_bfd,
   4259 					     syms[r_index].e_strx);
   4260 		else
   4261 		  {
   4262 		    asection *s;
   4263 
   4264 		    s = aout_reloc_index_to_section (input_bfd, r_index);
   4265 		    name = bfd_section_name (input_bfd, s);
   4266 		  }
   4267 		if (! ((*flaginfo->info->callbacks->reloc_overflow)
   4268 		       (flaginfo->info, (h ? &h->root : NULL), name,
   4269 			howto->name, (bfd_vma) 0, input_bfd,
   4270 			input_section, r_addr)))
   4271 		  return FALSE;
   4272 	      }
   4273 	      break;
   4274 	    }
   4275 	}
   4276     }
   4277 
   4278   return TRUE;
   4279 }
   4280 
   4281 /* Relocate an a.out section using extended a.out relocs.  */
   4282 
   4283 static bfd_boolean
   4284 aout_link_input_section_ext (struct aout_final_link_info *flaginfo,
   4285 			     bfd *input_bfd,
   4286 			     asection *input_section,
   4287 			     struct reloc_ext_external *relocs,
   4288 			     bfd_size_type rel_size,
   4289 			     bfd_byte *contents)
   4290 {
   4291   bfd_boolean (*check_dynamic_reloc)
   4292     (struct bfd_link_info *, bfd *, asection *,
   4293 	     struct aout_link_hash_entry *, void *, bfd_byte *, bfd_boolean *,
   4294 	     bfd_vma *);
   4295   bfd *output_bfd;
   4296   bfd_boolean relocatable;
   4297   struct external_nlist *syms;
   4298   char *strings;
   4299   struct aout_link_hash_entry **sym_hashes;
   4300   int *symbol_map;
   4301   bfd_size_type reloc_count;
   4302   struct reloc_ext_external *rel;
   4303   struct reloc_ext_external *rel_end;
   4304 
   4305   output_bfd = flaginfo->output_bfd;
   4306   check_dynamic_reloc = aout_backend_info (output_bfd)->check_dynamic_reloc;
   4307 
   4308   BFD_ASSERT (obj_reloc_entry_size (input_bfd) == RELOC_EXT_SIZE);
   4309   BFD_ASSERT (input_bfd->xvec->header_byteorder
   4310 	      == output_bfd->xvec->header_byteorder);
   4311 
   4312   relocatable = flaginfo->info->relocatable;
   4313   syms = obj_aout_external_syms (input_bfd);
   4314   strings = obj_aout_external_strings (input_bfd);
   4315   sym_hashes = obj_aout_sym_hashes (input_bfd);
   4316   symbol_map = flaginfo->symbol_map;
   4317 
   4318   reloc_count = rel_size / RELOC_EXT_SIZE;
   4319   rel = relocs;
   4320   rel_end = rel + reloc_count;
   4321   for (; rel < rel_end; rel++)
   4322     {
   4323       bfd_vma r_addr;
   4324       int r_index;
   4325       int r_extern;
   4326       unsigned int r_type;
   4327       bfd_vma r_addend;
   4328       struct aout_link_hash_entry *h = NULL;
   4329       asection *r_section = NULL;
   4330       bfd_vma relocation;
   4331 
   4332       r_addr = GET_SWORD (input_bfd, rel->r_address);
   4333 
   4334       if (bfd_header_big_endian (input_bfd))
   4335 	{
   4336 	  r_index  = (((unsigned int) rel->r_index[0] << 16)
   4337 		      | ((unsigned int) rel->r_index[1] << 8)
   4338 		      | rel->r_index[2]);
   4339 	  r_extern = (0 != (rel->r_type[0] & RELOC_EXT_BITS_EXTERN_BIG));
   4340 	  r_type   = ((rel->r_type[0] & RELOC_EXT_BITS_TYPE_BIG)
   4341 		      >> RELOC_EXT_BITS_TYPE_SH_BIG);
   4342 	}
   4343       else
   4344 	{
   4345 	  r_index  = (((unsigned int) rel->r_index[2] << 16)
   4346 		      | ((unsigned int) rel->r_index[1] << 8)
   4347 		      | rel->r_index[0]);
   4348 	  r_extern = (0 != (rel->r_type[0] & RELOC_EXT_BITS_EXTERN_LITTLE));
   4349 	  r_type   = ((rel->r_type[0] & RELOC_EXT_BITS_TYPE_LITTLE)
   4350 		      >> RELOC_EXT_BITS_TYPE_SH_LITTLE);
   4351 	}
   4352 
   4353       r_addend = GET_SWORD (input_bfd, rel->r_addend);
   4354 
   4355       if (r_type >= TABLE_SIZE (howto_table_ext))
   4356 	{
   4357 	  (*flaginfo->info->callbacks->einfo)
   4358 	    (_("%P: %B: unexpected relocation type\n"), input_bfd);
   4359 	  bfd_set_error (bfd_error_bad_value);
   4360 	  return FALSE;
   4361 	}
   4362 
   4363       if (relocatable)
   4364 	{
   4365 	  /* We are generating a relocatable output file, and must
   4366 	     modify the reloc accordingly.  */
   4367 	  if (r_extern
   4368 	      || r_type == (unsigned int) RELOC_BASE10
   4369 	      || r_type == (unsigned int) RELOC_BASE13
   4370 	      || r_type == (unsigned int) RELOC_BASE22)
   4371 	    {
   4372 	      /* If we know the symbol this relocation is against,
   4373 		 convert it into a relocation against a section.  This
   4374 		 is what the native linker does.  */
   4375 	      if (r_type == (unsigned int) RELOC_BASE10
   4376 		  || r_type == (unsigned int) RELOC_BASE13
   4377 		  || r_type == (unsigned int) RELOC_BASE22)
   4378 		h = NULL;
   4379 	      else
   4380 		h = sym_hashes[r_index];
   4381 	      if (h != NULL
   4382 		  && (h->root.type == bfd_link_hash_defined
   4383 		      || h->root.type == bfd_link_hash_defweak))
   4384 		{
   4385 		  asection *output_section;
   4386 
   4387 		  /* Change the r_extern value.  */
   4388 		  if (bfd_header_big_endian (output_bfd))
   4389 		    rel->r_type[0] &=~ RELOC_EXT_BITS_EXTERN_BIG;
   4390 		  else
   4391 		    rel->r_type[0] &=~ RELOC_EXT_BITS_EXTERN_LITTLE;
   4392 
   4393 		  /* Compute a new r_index.  */
   4394 		  output_section = h->root.u.def.section->output_section;
   4395 		  if (output_section == obj_textsec (output_bfd))
   4396 		    r_index = N_TEXT;
   4397 		  else if (output_section == obj_datasec (output_bfd))
   4398 		    r_index = N_DATA;
   4399 		  else if (output_section == obj_bsssec (output_bfd))
   4400 		    r_index = N_BSS;
   4401 		  else
   4402 		    r_index = N_ABS;
   4403 
   4404 		  /* Add the symbol value and the section VMA to the
   4405 		     addend.  */
   4406 		  relocation = (h->root.u.def.value
   4407 				+ output_section->vma
   4408 				+ h->root.u.def.section->output_offset);
   4409 
   4410 		  /* Now RELOCATION is the VMA of the final
   4411 		     destination.  If this is a PC relative reloc,
   4412 		     then ADDEND is the negative of the source VMA.
   4413 		     We want to set ADDEND to the difference between
   4414 		     the destination VMA and the source VMA, which
   4415 		     means we must adjust RELOCATION by the change in
   4416 		     the source VMA.  This is done below.  */
   4417 		}
   4418 	      else
   4419 		{
   4420 		  /* We must change r_index according to the symbol
   4421 		     map.  */
   4422 		  r_index = symbol_map[r_index];
   4423 
   4424 		  if (r_index == -1)
   4425 		    {
   4426 		      if (h != NULL)
   4427 			{
   4428 			  /* We decided to strip this symbol, but it
   4429                              turns out that we can't.  Note that we
   4430                              lose the other and desc information here.
   4431                              I don't think that will ever matter for a
   4432                              global symbol.  */
   4433 			  if (h->indx < 0)
   4434 			    {
   4435 			      h->indx = -2;
   4436 			      h->written = FALSE;
   4437 			      if (!aout_link_write_other_symbol (&h->root.root,
   4438 								 flaginfo))
   4439 				return FALSE;
   4440 			    }
   4441 			  r_index = h->indx;
   4442 			}
   4443 		      else
   4444 			{
   4445 			  const char *name;
   4446 
   4447 			  name = strings + GET_WORD (input_bfd,
   4448 						     syms[r_index].e_strx);
   4449 			  if (! ((*flaginfo->info->callbacks->unattached_reloc)
   4450 				 (flaginfo->info, name, input_bfd, input_section,
   4451 				  r_addr)))
   4452 			    return FALSE;
   4453 			  r_index = 0;
   4454 			}
   4455 		    }
   4456 
   4457 		  relocation = 0;
   4458 
   4459 		  /* If this is a PC relative reloc, then the addend
   4460 		     is the negative of the source VMA.  We must
   4461 		     adjust it by the change in the source VMA.  This
   4462 		     is done below.  */
   4463 		}
   4464 
   4465 	      /* Write out the new r_index value.  */
   4466 	      if (bfd_header_big_endian (output_bfd))
   4467 		{
   4468 		  rel->r_index[0] = r_index >> 16;
   4469 		  rel->r_index[1] = r_index >> 8;
   4470 		  rel->r_index[2] = r_index;
   4471 		}
   4472 	      else
   4473 		{
   4474 		  rel->r_index[2] = r_index >> 16;
   4475 		  rel->r_index[1] = r_index >> 8;
   4476 		  rel->r_index[0] = r_index;
   4477 		}
   4478 	    }
   4479 	  else
   4480 	    {
   4481 	      /* This is a relocation against a section.  We must
   4482 		 adjust by the amount that the section moved.  */
   4483 	      r_section = aout_reloc_index_to_section (input_bfd, r_index);
   4484 	      relocation = (r_section->output_section->vma
   4485 			    + r_section->output_offset
   4486 			    - r_section->vma);
   4487 
   4488 	      /* If this is a PC relative reloc, then the addend is
   4489 		 the difference in VMA between the destination and the
   4490 		 source.  We have just adjusted for the change in VMA
   4491 		 of the destination, so we must also adjust by the
   4492 		 change in VMA of the source.  This is done below.  */
   4493 	    }
   4494 
   4495 	  /* As described above, we must always adjust a PC relative
   4496 	     reloc by the change in VMA of the source.  However, if
   4497 	     pcrel_offset is set, then the addend does not include the
   4498 	     location within the section, in which case we don't need
   4499 	     to adjust anything.  */
   4500 	  if (howto_table_ext[r_type].pc_relative
   4501 	      && ! howto_table_ext[r_type].pcrel_offset)
   4502 	    relocation -= (input_section->output_section->vma
   4503 			   + input_section->output_offset
   4504 			   - input_section->vma);
   4505 
   4506 	  /* Change the addend if necessary.  */
   4507 	  if (relocation != 0)
   4508 	    PUT_WORD (output_bfd, r_addend + relocation, rel->r_addend);
   4509 
   4510 	  /* Change the address of the relocation.  */
   4511 	  PUT_WORD (output_bfd,
   4512 		    r_addr + input_section->output_offset,
   4513 		    rel->r_address);
   4514 	}
   4515       else
   4516 	{
   4517 	  bfd_boolean hundef;
   4518 	  bfd_reloc_status_type r;
   4519 
   4520 	  /* We are generating an executable, and must do a full
   4521 	     relocation.  */
   4522 	  hundef = FALSE;
   4523 
   4524 	  if (r_extern)
   4525 	    {
   4526 	      h = sym_hashes[r_index];
   4527 
   4528 	      if (h != NULL
   4529 		  && (h->root.type == bfd_link_hash_defined
   4530 		      || h->root.type == bfd_link_hash_defweak))
   4531 		{
   4532 		  relocation = (h->root.u.def.value
   4533 				+ h->root.u.def.section->output_section->vma
   4534 				+ h->root.u.def.section->output_offset);
   4535 		}
   4536 	      else if (h != NULL
   4537 		       && h->root.type == bfd_link_hash_undefweak)
   4538 		relocation = 0;
   4539 	      else
   4540 		{
   4541 		  hundef = TRUE;
   4542 		  relocation = 0;
   4543 		}
   4544 	    }
   4545 	  else if (r_type == (unsigned int) RELOC_BASE10
   4546 		   || r_type == (unsigned int) RELOC_BASE13
   4547 		   || r_type == (unsigned int) RELOC_BASE22)
   4548 	    {
   4549 	      struct external_nlist *sym;
   4550 	      int type;
   4551 
   4552 	      /* For base relative relocs, r_index is always an index
   4553                  into the symbol table, even if r_extern is 0.  */
   4554 	      sym = syms + r_index;
   4555 	      type = H_GET_8 (input_bfd, sym->e_type);
   4556 	      if ((type & N_TYPE) == N_TEXT
   4557 		  || type == N_WEAKT)
   4558 		r_section = obj_textsec (input_bfd);
   4559 	      else if ((type & N_TYPE) == N_DATA
   4560 		       || type == N_WEAKD)
   4561 		r_section = obj_datasec (input_bfd);
   4562 	      else if ((type & N_TYPE) == N_BSS
   4563 		       || type == N_WEAKB)
   4564 		r_section = obj_bsssec (input_bfd);
   4565 	      else if ((type & N_TYPE) == N_ABS
   4566 		       || type == N_WEAKA)
   4567 		r_section = bfd_abs_section_ptr;
   4568 	      else
   4569 		abort ();
   4570 	      relocation = (r_section->output_section->vma
   4571 			    + r_section->output_offset
   4572 			    + (GET_WORD (input_bfd, sym->e_value)
   4573 			       - r_section->vma));
   4574 	    }
   4575 	  else
   4576 	    {
   4577 	      r_section = aout_reloc_index_to_section (input_bfd, r_index);
   4578 
   4579 	      /* If this is a PC relative reloc, then R_ADDEND is the
   4580 		 difference between the two vmas, or
   4581 		   old_dest_sec + old_dest_off - (old_src_sec + old_src_off)
   4582 		 where
   4583 		   old_dest_sec == section->vma
   4584 		 and
   4585 		   old_src_sec == input_section->vma
   4586 		 and
   4587 		   old_src_off == r_addr
   4588 
   4589 		 _bfd_final_link_relocate expects RELOCATION +
   4590 		 R_ADDEND to be the VMA of the destination minus
   4591 		 r_addr (the minus r_addr is because this relocation
   4592 		 is not pcrel_offset, which is a bit confusing and
   4593 		 should, perhaps, be changed), or
   4594 		   new_dest_sec
   4595 		 where
   4596 		   new_dest_sec == output_section->vma + output_offset
   4597 		 We arrange for this to happen by setting RELOCATION to
   4598 		   new_dest_sec + old_src_sec - old_dest_sec
   4599 
   4600 		 If this is not a PC relative reloc, then R_ADDEND is
   4601 		 simply the VMA of the destination, so we set
   4602 		 RELOCATION to the change in the destination VMA, or
   4603 		   new_dest_sec - old_dest_sec
   4604 		 */
   4605 	      relocation = (r_section->output_section->vma
   4606 			    + r_section->output_offset
   4607 			    - r_section->vma);
   4608 	      if (howto_table_ext[r_type].pc_relative)
   4609 		relocation += input_section->vma;
   4610 	    }
   4611 
   4612 	  if (check_dynamic_reloc != NULL)
   4613 	    {
   4614 	      bfd_boolean skip;
   4615 
   4616 	      if (! ((*check_dynamic_reloc)
   4617 		     (flaginfo->info, input_bfd, input_section, h,
   4618 		      (void *) rel, contents, &skip, &relocation)))
   4619 		return FALSE;
   4620 	      if (skip)
   4621 		continue;
   4622 	    }
   4623 
   4624 	  /* Now warn if a global symbol is undefined.  We could not
   4625              do this earlier, because check_dynamic_reloc might want
   4626              to skip this reloc.  */
   4627 	  if (hundef
   4628 	      && ! flaginfo->info->shared
   4629 	      && r_type != (unsigned int) RELOC_BASE10
   4630 	      && r_type != (unsigned int) RELOC_BASE13
   4631 	      && r_type != (unsigned int) RELOC_BASE22)
   4632 	    {
   4633 	      const char *name;
   4634 
   4635 	      if (h != NULL)
   4636 		name = h->root.root.string;
   4637 	      else
   4638 		name = strings + GET_WORD (input_bfd, syms[r_index].e_strx);
   4639 	      if (! ((*flaginfo->info->callbacks->undefined_symbol)
   4640 		     (flaginfo->info, name, input_bfd, input_section,
   4641 		     r_addr, TRUE)))
   4642 		return FALSE;
   4643 	    }
   4644 
   4645 	  if (r_type != (unsigned int) RELOC_SPARC_REV32)
   4646 	    r = MY_final_link_relocate (howto_table_ext + r_type,
   4647 					input_bfd, input_section,
   4648 					contents, r_addr, relocation,
   4649 					r_addend);
   4650 	  else
   4651 	    {
   4652 	      bfd_vma x;
   4653 
   4654 	      x = bfd_get_32 (input_bfd, contents + r_addr);
   4655 	      x = x + relocation + r_addend;
   4656 	      bfd_putl32 (/*input_bfd,*/ x, contents + r_addr);
   4657 	      r = bfd_reloc_ok;
   4658 	    }
   4659 
   4660 	  if (r != bfd_reloc_ok)
   4661 	    {
   4662 	      switch (r)
   4663 		{
   4664 		default:
   4665 		case bfd_reloc_outofrange:
   4666 		  abort ();
   4667 		case bfd_reloc_overflow:
   4668 		  {
   4669 		    const char *name;
   4670 
   4671 		    if (h != NULL)
   4672 		      name = NULL;
   4673 		    else if (r_extern
   4674 			     || r_type == (unsigned int) RELOC_BASE10
   4675 			     || r_type == (unsigned int) RELOC_BASE13
   4676 			     || r_type == (unsigned int) RELOC_BASE22)
   4677 		      name = strings + GET_WORD (input_bfd,
   4678 						 syms[r_index].e_strx);
   4679 		    else
   4680 		      {
   4681 			asection *s;
   4682 
   4683 			s = aout_reloc_index_to_section (input_bfd, r_index);
   4684 			name = bfd_section_name (input_bfd, s);
   4685 		      }
   4686 		    if (! ((*flaginfo->info->callbacks->reloc_overflow)
   4687 			   (flaginfo->info, (h ? &h->root : NULL), name,
   4688 			    howto_table_ext[r_type].name,
   4689 			    r_addend, input_bfd, input_section, r_addr)))
   4690 		      return FALSE;
   4691 		  }
   4692 		  break;
   4693 		}
   4694 	    }
   4695 	}
   4696     }
   4697 
   4698   return TRUE;
   4699 }
   4700 
   4701 /* Link an a.out section into the output file.  */
   4702 
   4703 static bfd_boolean
   4704 aout_link_input_section (struct aout_final_link_info *flaginfo,
   4705 			 bfd *input_bfd,
   4706 			 asection *input_section,
   4707 			 file_ptr *reloff_ptr,
   4708 			 bfd_size_type rel_size)
   4709 {
   4710   bfd_size_type input_size;
   4711   void * relocs;
   4712 
   4713   /* Get the section contents.  */
   4714   input_size = input_section->size;
   4715   if (! bfd_get_section_contents (input_bfd, input_section,
   4716 				  (void *) flaginfo->contents,
   4717 				  (file_ptr) 0, input_size))
   4718     return FALSE;
   4719 
   4720   /* Read in the relocs if we haven't already done it.  */
   4721   if (aout_section_data (input_section) != NULL
   4722       && aout_section_data (input_section)->relocs != NULL)
   4723     relocs = aout_section_data (input_section)->relocs;
   4724   else
   4725     {
   4726       relocs = flaginfo->relocs;
   4727       if (rel_size > 0)
   4728 	{
   4729 	  if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0
   4730 	      || bfd_bread (relocs, rel_size, input_bfd) != rel_size)
   4731 	    return FALSE;
   4732 	}
   4733     }
   4734 
   4735   /* Relocate the section contents.  */
   4736   if (obj_reloc_entry_size (input_bfd) == RELOC_STD_SIZE)
   4737     {
   4738       if (! aout_link_input_section_std (flaginfo, input_bfd, input_section,
   4739 					 (struct reloc_std_external *) relocs,
   4740 					 rel_size, flaginfo->contents))
   4741 	return FALSE;
   4742     }
   4743   else
   4744     {
   4745       if (! aout_link_input_section_ext (flaginfo, input_bfd, input_section,
   4746 					 (struct reloc_ext_external *) relocs,
   4747 					 rel_size, flaginfo->contents))
   4748 	return FALSE;
   4749     }
   4750 
   4751   /* Write out the section contents.  */
   4752   if (! bfd_set_section_contents (flaginfo->output_bfd,
   4753 				  input_section->output_section,
   4754 				  (void *) flaginfo->contents,
   4755 				  (file_ptr) input_section->output_offset,
   4756 				  input_size))
   4757     return FALSE;
   4758 
   4759   /* If we are producing relocatable output, the relocs were
   4760      modified, and we now write them out.  */
   4761   if (flaginfo->info->relocatable && rel_size > 0)
   4762     {
   4763       if (bfd_seek (flaginfo->output_bfd, *reloff_ptr, SEEK_SET) != 0)
   4764 	return FALSE;
   4765       if (bfd_bwrite (relocs, rel_size, flaginfo->output_bfd) != rel_size)
   4766 	return FALSE;
   4767       *reloff_ptr += rel_size;
   4768 
   4769       /* Assert that the relocs have not run into the symbols, and
   4770 	 that if these are the text relocs they have not run into the
   4771 	 data relocs.  */
   4772       BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (flaginfo->output_bfd)
   4773 		  && (reloff_ptr != &flaginfo->treloff
   4774 		      || (*reloff_ptr
   4775 			  <= obj_datasec (flaginfo->output_bfd)->rel_filepos)));
   4776     }
   4777 
   4778   return TRUE;
   4779 }
   4780 
   4781 /* Adjust and write out the symbols for an a.out file.  Set the new
   4782    symbol indices into a symbol_map.  */
   4783 
   4784 static bfd_boolean
   4785 aout_link_write_symbols (struct aout_final_link_info *flaginfo, bfd *input_bfd)
   4786 {
   4787   bfd *output_bfd;
   4788   bfd_size_type sym_count;
   4789   char *strings;
   4790   enum bfd_link_strip strip;
   4791   enum bfd_link_discard discard;
   4792   struct external_nlist *outsym;
   4793   bfd_size_type strtab_index;
   4794   struct external_nlist *sym;
   4795   struct external_nlist *sym_end;
   4796   struct aout_link_hash_entry **sym_hash;
   4797   int *symbol_map;
   4798   bfd_boolean pass;
   4799   bfd_boolean skip_next;
   4800 
   4801   output_bfd = flaginfo->output_bfd;
   4802   sym_count = obj_aout_external_sym_count (input_bfd);
   4803   strings = obj_aout_external_strings (input_bfd);
   4804   strip = flaginfo->info->strip;
   4805   discard = flaginfo->info->discard;
   4806   outsym = flaginfo->output_syms;
   4807 
   4808   /* First write out a symbol for this object file, unless we are
   4809      discarding such symbols.  */
   4810   if (strip != strip_all
   4811       && (strip != strip_some
   4812 	  || bfd_hash_lookup (flaginfo->info->keep_hash, input_bfd->filename,
   4813 			      FALSE, FALSE) != NULL)
   4814       && discard != discard_all)
   4815     {
   4816       H_PUT_8 (output_bfd, N_TEXT, outsym->e_type);
   4817       H_PUT_8 (output_bfd, 0, outsym->e_other);
   4818       H_PUT_16 (output_bfd, 0, outsym->e_desc);
   4819       strtab_index = add_to_stringtab (output_bfd, flaginfo->strtab,
   4820 				       input_bfd->filename, FALSE);
   4821       if (strtab_index == (bfd_size_type) -1)
   4822 	return FALSE;
   4823       PUT_WORD (output_bfd, strtab_index, outsym->e_strx);
   4824       PUT_WORD (output_bfd,
   4825 		(bfd_get_section_vma (output_bfd,
   4826 				      obj_textsec (input_bfd)->output_section)
   4827 		 + obj_textsec (input_bfd)->output_offset),
   4828 		outsym->e_value);
   4829       ++obj_aout_external_sym_count (output_bfd);
   4830       ++outsym;
   4831     }
   4832 
   4833   pass = FALSE;
   4834   skip_next = FALSE;
   4835   sym = obj_aout_external_syms (input_bfd);
   4836   sym_end = sym + sym_count;
   4837   sym_hash = obj_aout_sym_hashes (input_bfd);
   4838   symbol_map = flaginfo->symbol_map;
   4839   memset (symbol_map, 0, (size_t) sym_count * sizeof *symbol_map);
   4840   for (; sym < sym_end; sym++, sym_hash++, symbol_map++)
   4841     {
   4842       const char *name;
   4843       int type;
   4844       struct aout_link_hash_entry *h;
   4845       bfd_boolean skip;
   4846       asection *symsec;
   4847       bfd_vma val = 0;
   4848       bfd_boolean copy;
   4849 
   4850       /* We set *symbol_map to 0 above for all symbols.  If it has
   4851          already been set to -1 for this symbol, it means that we are
   4852          discarding it because it appears in a duplicate header file.
   4853          See the N_BINCL code below.  */
   4854       if (*symbol_map == -1)
   4855 	continue;
   4856 
   4857       /* Initialize *symbol_map to -1, which means that the symbol was
   4858          not copied into the output file.  We will change it later if
   4859          we do copy the symbol over.  */
   4860       *symbol_map = -1;
   4861 
   4862       type = H_GET_8 (input_bfd, sym->e_type);
   4863       name = strings + GET_WORD (input_bfd, sym->e_strx);
   4864 
   4865       h = NULL;
   4866 
   4867       if (pass)
   4868 	{
   4869 	  /* Pass this symbol through.  It is the target of an
   4870 	     indirect or warning symbol.  */
   4871 	  val = GET_WORD (input_bfd, sym->e_value);
   4872 	  pass = FALSE;
   4873 	}
   4874       else if (skip_next)
   4875 	{
   4876 	  /* Skip this symbol, which is the target of an indirect
   4877 	     symbol that we have changed to no longer be an indirect
   4878 	     symbol.  */
   4879 	  skip_next = FALSE;
   4880 	  continue;
   4881 	}
   4882       else
   4883 	{
   4884 	  struct aout_link_hash_entry *hresolve;
   4885 
   4886 	  /* We have saved the hash table entry for this symbol, if
   4887 	     there is one.  Note that we could just look it up again
   4888 	     in the hash table, provided we first check that it is an
   4889 	     external symbol.  */
   4890 	  h = *sym_hash;
   4891 
   4892 	  /* Use the name from the hash table, in case the symbol was
   4893              wrapped.  */
   4894 	  if (h != NULL
   4895 	      && h->root.type != bfd_link_hash_warning)
   4896 	    name = h->root.root.string;
   4897 
   4898 	  /* If this is an indirect or warning symbol, then change
   4899 	     hresolve to the base symbol.  We also change *sym_hash so
   4900 	     that the relocation routines relocate against the real
   4901 	     symbol.  */
   4902 	  hresolve = h;
   4903 	  if (h != (struct aout_link_hash_entry *) NULL
   4904 	      && (h->root.type == bfd_link_hash_indirect
   4905 		  || h->root.type == bfd_link_hash_warning))
   4906 	    {
   4907 	      hresolve = (struct aout_link_hash_entry *) h->root.u.i.link;
   4908 	      while (hresolve->root.type == bfd_link_hash_indirect
   4909 		     || hresolve->root.type == bfd_link_hash_warning)
   4910 		hresolve = ((struct aout_link_hash_entry *)
   4911 			    hresolve->root.u.i.link);
   4912 	      *sym_hash = hresolve;
   4913 	    }
   4914 
   4915 	  /* If the symbol has already been written out, skip it.  */
   4916 	  if (h != NULL
   4917 	      && h->written)
   4918 	    {
   4919 	      if ((type & N_TYPE) == N_INDR
   4920 		  || type == N_WARNING)
   4921 		skip_next = TRUE;
   4922 	      *symbol_map = h->indx;
   4923 	      continue;
   4924 	    }
   4925 
   4926 	  /* See if we are stripping this symbol.  */
   4927 	  skip = FALSE;
   4928 	  switch (strip)
   4929 	    {
   4930 	    case strip_none:
   4931 	      break;
   4932 	    case strip_debugger:
   4933 	      if ((type & N_STAB) != 0)
   4934 		skip = TRUE;
   4935 	      break;
   4936 	    case strip_some:
   4937 	      if (bfd_hash_lookup (flaginfo->info->keep_hash, name, FALSE, FALSE)
   4938 		  == NULL)
   4939 		skip = TRUE;
   4940 	      break;
   4941 	    case strip_all:
   4942 	      skip = TRUE;
   4943 	      break;
   4944 	    }
   4945 	  if (skip)
   4946 	    {
   4947 	      if (h != NULL)
   4948 		h->written = TRUE;
   4949 	      continue;
   4950 	    }
   4951 
   4952 	  /* Get the value of the symbol.  */
   4953 	  if ((type & N_TYPE) == N_TEXT
   4954 	      || type == N_WEAKT)
   4955 	    symsec = obj_textsec (input_bfd);
   4956 	  else if ((type & N_TYPE) == N_DATA
   4957 		   || type == N_WEAKD)
   4958 	    symsec = obj_datasec (input_bfd);
   4959 	  else if ((type & N_TYPE) == N_BSS
   4960 		   || type == N_WEAKB)
   4961 	    symsec = obj_bsssec (input_bfd);
   4962 	  else if ((type & N_TYPE) == N_ABS
   4963 		   || type == N_WEAKA)
   4964 	    symsec = bfd_abs_section_ptr;
   4965 	  else if (((type & N_TYPE) == N_INDR
   4966 		    && (hresolve == NULL
   4967 			|| (hresolve->root.type != bfd_link_hash_defined
   4968 			    && hresolve->root.type != bfd_link_hash_defweak
   4969 			    && hresolve->root.type != bfd_link_hash_common)))
   4970 		   || type == N_WARNING)
   4971 	    {
   4972 	      /* Pass the next symbol through unchanged.  The
   4973 		 condition above for indirect symbols is so that if
   4974 		 the indirect symbol was defined, we output it with
   4975 		 the correct definition so the debugger will
   4976 		 understand it.  */
   4977 	      pass = TRUE;
   4978 	      val = GET_WORD (input_bfd, sym->e_value);
   4979 	      symsec = NULL;
   4980 	    }
   4981 	  else if ((type & N_STAB) != 0)
   4982 	    {
   4983 	      val = GET_WORD (input_bfd, sym->e_value);
   4984 	      symsec = NULL;
   4985 	    }
   4986 	  else
   4987 	    {
   4988 	      /* If we get here with an indirect symbol, it means that
   4989 		 we are outputting it with a real definition.  In such
   4990 		 a case we do not want to output the next symbol,
   4991 		 which is the target of the indirection.  */
   4992 	      if ((type & N_TYPE) == N_INDR)
   4993 		skip_next = TRUE;
   4994 
   4995 	      symsec = NULL;
   4996 
   4997 	      /* We need to get the value from the hash table.  We use
   4998 		 hresolve so that if we have defined an indirect
   4999 		 symbol we output the final definition.  */
   5000 	      if (h == NULL)
   5001 		{
   5002 		  switch (type & N_TYPE)
   5003 		    {
   5004 		    case N_SETT:
   5005 		      symsec = obj_textsec (input_bfd);
   5006 		      break;
   5007 		    case N_SETD:
   5008 		      symsec = obj_datasec (input_bfd);
   5009 		      break;
   5010 		    case N_SETB:
   5011 		      symsec = obj_bsssec (input_bfd);
   5012 		      break;
   5013 		    case N_SETA:
   5014 		      symsec = bfd_abs_section_ptr;
   5015 		      break;
   5016 		    default:
   5017 		      val = 0;
   5018 		      break;
   5019 		    }
   5020 		}
   5021 	      else if (hresolve->root.type == bfd_link_hash_defined
   5022 		       || hresolve->root.type == bfd_link_hash_defweak)
   5023 		{
   5024 		  asection *input_section;
   5025 		  asection *output_section;
   5026 
   5027 		  /* This case usually means a common symbol which was
   5028 		     turned into a defined symbol.  */
   5029 		  input_section = hresolve->root.u.def.section;
   5030 		  output_section = input_section->output_section;
   5031 		  BFD_ASSERT (bfd_is_abs_section (output_section)
   5032 			      || output_section->owner == output_bfd);
   5033 		  val = (hresolve->root.u.def.value
   5034 			 + bfd_get_section_vma (output_bfd, output_section)
   5035 			 + input_section->output_offset);
   5036 
   5037 		  /* Get the correct type based on the section.  If
   5038 		     this is a constructed set, force it to be
   5039 		     globally visible.  */
   5040 		  if (type == N_SETT
   5041 		      || type == N_SETD
   5042 		      || type == N_SETB
   5043 		      || type == N_SETA)
   5044 		    type |= N_EXT;
   5045 
   5046 		  type &=~ N_TYPE;
   5047 
   5048 		  if (output_section == obj_textsec (output_bfd))
   5049 		    type |= (hresolve->root.type == bfd_link_hash_defined
   5050 			     ? N_TEXT
   5051 			     : N_WEAKT);
   5052 		  else if (output_section == obj_datasec (output_bfd))
   5053 		    type |= (hresolve->root.type == bfd_link_hash_defined
   5054 			     ? N_DATA
   5055 			     : N_WEAKD);
   5056 		  else if (output_section == obj_bsssec (output_bfd))
   5057 		    type |= (hresolve->root.type == bfd_link_hash_defined
   5058 			     ? N_BSS
   5059 			     : N_WEAKB);
   5060 		  else
   5061 		    type |= (hresolve->root.type == bfd_link_hash_defined
   5062 			     ? N_ABS
   5063 			     : N_WEAKA);
   5064 		}
   5065 	      else if (hresolve->root.type == bfd_link_hash_common)
   5066 		val = hresolve->root.u.c.size;
   5067 	      else if (hresolve->root.type == bfd_link_hash_undefweak)
   5068 		{
   5069 		  val = 0;
   5070 		  type = N_WEAKU;
   5071 		}
   5072 	      else
   5073 		val = 0;
   5074 	    }
   5075 	  if (symsec != NULL)
   5076 	    val = (symsec->output_section->vma
   5077 		   + symsec->output_offset
   5078 		   + (GET_WORD (input_bfd, sym->e_value)
   5079 		      - symsec->vma));
   5080 
   5081 	  /* If this is a global symbol set the written flag, and if
   5082 	     it is a local symbol see if we should discard it.  */
   5083 	  if (h != NULL)
   5084 	    {
   5085 	      h->written = TRUE;
   5086 	      h->indx = obj_aout_external_sym_count (output_bfd);
   5087 	    }
   5088 	  else if ((type & N_TYPE) != N_SETT
   5089 		   && (type & N_TYPE) != N_SETD
   5090 		   && (type & N_TYPE) != N_SETB
   5091 		   && (type & N_TYPE) != N_SETA)
   5092 	    {
   5093 	      switch (discard)
   5094 		{
   5095 		case discard_none:
   5096 		case discard_sec_merge:
   5097 		  break;
   5098 		case discard_l:
   5099 		  if ((type & N_STAB) == 0
   5100 		      && bfd_is_local_label_name (input_bfd, name))
   5101 		    skip = TRUE;
   5102 		  break;
   5103 		case discard_all:
   5104 		  skip = TRUE;
   5105 		  break;
   5106 		}
   5107 	      if (skip)
   5108 		{
   5109 		  pass = FALSE;
   5110 		  continue;
   5111 		}
   5112 	    }
   5113 
   5114 	  /* An N_BINCL symbol indicates the start of the stabs
   5115 	     entries for a header file.  We need to scan ahead to the
   5116 	     next N_EINCL symbol, ignoring nesting, adding up all the
   5117 	     characters in the symbol names, not including the file
   5118 	     numbers in types (the first number after an open
   5119 	     parenthesis).  */
   5120 	  if (type == (int) N_BINCL)
   5121 	    {
   5122 	      struct external_nlist *incl_sym;
   5123 	      int nest;
   5124 	      struct aout_link_includes_entry *incl_entry;
   5125 	      struct aout_link_includes_totals *t;
   5126 
   5127 	      val = 0;
   5128 	      nest = 0;
   5129 	      for (incl_sym = sym + 1; incl_sym < sym_end; incl_sym++)
   5130 		{
   5131 		  int incl_type;
   5132 
   5133 		  incl_type = H_GET_8 (input_bfd, incl_sym->e_type);
   5134 		  if (incl_type == (int) N_EINCL)
   5135 		    {
   5136 		      if (nest == 0)
   5137 			break;
   5138 		      --nest;
   5139 		    }
   5140 		  else if (incl_type == (int) N_BINCL)
   5141 		    ++nest;
   5142 		  else if (nest == 0)
   5143 		    {
   5144 		      const char *s;
   5145 
   5146 		      s = strings + GET_WORD (input_bfd, incl_sym->e_strx);
   5147 		      for (; *s != '\0'; s++)
   5148 			{
   5149 			  val += *s;
   5150 			  if (*s == '(')
   5151 			    {
   5152 			      /* Skip the file number.  */
   5153 			      ++s;
   5154 			      while (ISDIGIT (*s))
   5155 				++s;
   5156 			      --s;
   5157 			    }
   5158 			}
   5159 		    }
   5160 		}
   5161 
   5162 	      /* If we have already included a header file with the
   5163                  same value, then replace this one with an N_EXCL
   5164                  symbol.  */
   5165 	      copy = (bfd_boolean) (! flaginfo->info->keep_memory);
   5166 	      incl_entry = aout_link_includes_lookup (&flaginfo->includes,
   5167 						      name, TRUE, copy);
   5168 	      if (incl_entry == NULL)
   5169 		return FALSE;
   5170 	      for (t = incl_entry->totals; t != NULL; t = t->next)
   5171 		if (t->total == val)
   5172 		  break;
   5173 	      if (t == NULL)
   5174 		{
   5175 		  /* This is the first time we have seen this header
   5176                      file with this set of stabs strings.  */
   5177 		  t = (struct aout_link_includes_totals *)
   5178                       bfd_hash_allocate (&flaginfo->includes.root,
   5179 					 sizeof *t);
   5180 		  if (t == NULL)
   5181 		    return FALSE;
   5182 		  t->total = val;
   5183 		  t->next = incl_entry->totals;
   5184 		  incl_entry->totals = t;
   5185 		}
   5186 	      else
   5187 		{
   5188 		  int *incl_map;
   5189 
   5190 		  /* This is a duplicate header file.  We must change
   5191                      it to be an N_EXCL entry, and mark all the
   5192                      included symbols to prevent outputting them.  */
   5193 		  type = (int) N_EXCL;
   5194 
   5195 		  nest = 0;
   5196 		  for (incl_sym = sym + 1, incl_map = symbol_map + 1;
   5197 		       incl_sym < sym_end;
   5198 		       incl_sym++, incl_map++)
   5199 		    {
   5200 		      int incl_type;
   5201 
   5202 		      incl_type = H_GET_8 (input_bfd, incl_sym->e_type);
   5203 		      if (incl_type == (int) N_EINCL)
   5204 			{
   5205 			  if (nest == 0)
   5206 			    {
   5207 			      *incl_map = -1;
   5208 			      break;
   5209 			    }
   5210 			  --nest;
   5211 			}
   5212 		      else if (incl_type == (int) N_BINCL)
   5213 			++nest;
   5214 		      else if (nest == 0)
   5215 			*incl_map = -1;
   5216 		    }
   5217 		}
   5218 	    }
   5219 	}
   5220 
   5221       /* Copy this symbol into the list of symbols we are going to
   5222 	 write out.  */
   5223       H_PUT_8 (output_bfd, type, outsym->e_type);
   5224       H_PUT_8 (output_bfd, H_GET_8 (input_bfd, sym->e_other), outsym->e_other);
   5225       H_PUT_16 (output_bfd, H_GET_16 (input_bfd, sym->e_desc), outsym->e_desc);
   5226       copy = FALSE;
   5227       if (! flaginfo->info->keep_memory)
   5228 	{
   5229 	  /* name points into a string table which we are going to
   5230 	     free.  If there is a hash table entry, use that string.
   5231 	     Otherwise, copy name into memory.  */
   5232 	  if (h != NULL)
   5233 	    name = h->root.root.string;
   5234 	  else
   5235 	    copy = TRUE;
   5236 	}
   5237       strtab_index = add_to_stringtab (output_bfd, flaginfo->strtab,
   5238 				       name, copy);
   5239       if (strtab_index == (bfd_size_type) -1)
   5240 	return FALSE;
   5241       PUT_WORD (output_bfd, strtab_index, outsym->e_strx);
   5242       PUT_WORD (output_bfd, val, outsym->e_value);
   5243       *symbol_map = obj_aout_external_sym_count (output_bfd);
   5244       ++obj_aout_external_sym_count (output_bfd);
   5245       ++outsym;
   5246     }
   5247 
   5248   /* Write out the output symbols we have just constructed.  */
   5249   if (outsym > flaginfo->output_syms)
   5250     {
   5251       bfd_size_type outsym_size;
   5252 
   5253       if (bfd_seek (output_bfd, flaginfo->symoff, SEEK_SET) != 0)
   5254 	return FALSE;
   5255       outsym_size = outsym - flaginfo->output_syms;
   5256       outsym_size *= EXTERNAL_NLIST_SIZE;
   5257       if (bfd_bwrite ((void *) flaginfo->output_syms, outsym_size, output_bfd)
   5258 	  != outsym_size)
   5259 	return FALSE;
   5260       flaginfo->symoff += outsym_size;
   5261     }
   5262 
   5263   return TRUE;
   5264 }
   5265 
   5266 /* Link an a.out input BFD into the output file.  */
   5267 
   5268 static bfd_boolean
   5269 aout_link_input_bfd (struct aout_final_link_info *flaginfo, bfd *input_bfd)
   5270 {
   5271   BFD_ASSERT (bfd_get_format (input_bfd) == bfd_object);
   5272 
   5273   /* If this is a dynamic object, it may need special handling.  */
   5274   if ((input_bfd->flags & DYNAMIC) != 0
   5275       && aout_backend_info (input_bfd)->link_dynamic_object != NULL)
   5276     return ((*aout_backend_info (input_bfd)->link_dynamic_object)
   5277 	    (flaginfo->info, input_bfd));
   5278 
   5279   /* Get the symbols.  We probably have them already, unless
   5280      flaginfo->info->keep_memory is FALSE.  */
   5281   if (! aout_get_external_symbols (input_bfd))
   5282     return FALSE;
   5283 
   5284   /* Write out the symbols and get a map of the new indices.  The map
   5285      is placed into flaginfo->symbol_map.  */
   5286   if (! aout_link_write_symbols (flaginfo, input_bfd))
   5287     return FALSE;
   5288 
   5289   /* Relocate and write out the sections.  These functions use the
   5290      symbol map created by aout_link_write_symbols.  The linker_mark
   5291      field will be set if these sections are to be included in the
   5292      link, which will normally be the case.  */
   5293   if (obj_textsec (input_bfd)->linker_mark)
   5294     {
   5295       if (! aout_link_input_section (flaginfo, input_bfd,
   5296 				     obj_textsec (input_bfd),
   5297 				     &flaginfo->treloff,
   5298 				     exec_hdr (input_bfd)->a_trsize))
   5299 	return FALSE;
   5300     }
   5301   if (obj_datasec (input_bfd)->linker_mark)
   5302     {
   5303       if (! aout_link_input_section (flaginfo, input_bfd,
   5304 				     obj_datasec (input_bfd),
   5305 				     &flaginfo->dreloff,
   5306 				     exec_hdr (input_bfd)->a_drsize))
   5307 	return FALSE;
   5308     }
   5309 
   5310   /* If we are not keeping memory, we don't need the symbols any
   5311      longer.  We still need them if we are keeping memory, because the
   5312      strings in the hash table point into them.  */
   5313   if (! flaginfo->info->keep_memory)
   5314     {
   5315       if (! aout_link_free_symbols (input_bfd))
   5316 	return FALSE;
   5317     }
   5318 
   5319   return TRUE;
   5320 }
   5321 
   5322 /* Do the final link step.  This is called on the output BFD.  The
   5323    INFO structure should point to a list of BFDs linked through the
   5324    link.next field which can be used to find each BFD which takes part
   5325    in the output.  Also, each section in ABFD should point to a list
   5326    of bfd_link_order structures which list all the input sections for
   5327    the output section.  */
   5328 
   5329 bfd_boolean
   5330 NAME (aout, final_link) (bfd *abfd,
   5331 			 struct bfd_link_info *info,
   5332 			 void (*callback) (bfd *, file_ptr *, file_ptr *, file_ptr *))
   5333 {
   5334   struct aout_final_link_info aout_info;
   5335   bfd_boolean includes_hash_initialized = FALSE;
   5336   bfd *sub;
   5337   bfd_size_type trsize, drsize;
   5338   bfd_size_type max_contents_size;
   5339   bfd_size_type max_relocs_size;
   5340   bfd_size_type max_sym_count;
   5341   bfd_size_type text_size;
   5342   file_ptr text_end;
   5343   struct bfd_link_order *p;
   5344   asection *o;
   5345   bfd_boolean have_link_order_relocs;
   5346 
   5347   if (info->shared)
   5348     abfd->flags |= DYNAMIC;
   5349 
   5350   aout_info.info = info;
   5351   aout_info.output_bfd = abfd;
   5352   aout_info.contents = NULL;
   5353   aout_info.relocs = NULL;
   5354   aout_info.symbol_map = NULL;
   5355   aout_info.output_syms = NULL;
   5356 
   5357   if (!bfd_hash_table_init_n (&aout_info.includes.root,
   5358 			      aout_link_includes_newfunc,
   5359 			      sizeof (struct aout_link_includes_entry),
   5360 			      251))
   5361     goto error_return;
   5362   includes_hash_initialized = TRUE;
   5363 
   5364   /* Figure out the largest section size.  Also, if generating
   5365      relocatable output, count the relocs.  */
   5366   trsize = 0;
   5367   drsize = 0;
   5368   max_contents_size = 0;
   5369   max_relocs_size = 0;
   5370   max_sym_count = 0;
   5371   for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
   5372     {
   5373       bfd_size_type sz;
   5374 
   5375       if (info->relocatable)
   5376 	{
   5377 	  if (bfd_get_flavour (sub) == bfd_target_aout_flavour)
   5378 	    {
   5379 	      trsize += exec_hdr (sub)->a_trsize;
   5380 	      drsize += exec_hdr (sub)->a_drsize;
   5381 	    }
   5382 	  else
   5383 	    {
   5384 	      /* FIXME: We need to identify the .text and .data sections
   5385 		 and call get_reloc_upper_bound and canonicalize_reloc to
   5386 		 work out the number of relocs needed, and then multiply
   5387 		 by the reloc size.  */
   5388 	      (*_bfd_error_handler)
   5389 		(_("%s: relocatable link from %s to %s not supported"),
   5390 		 bfd_get_filename (abfd),
   5391 		 sub->xvec->name, abfd->xvec->name);
   5392 	      bfd_set_error (bfd_error_invalid_operation);
   5393 	      goto error_return;
   5394 	    }
   5395 	}
   5396 
   5397       if (bfd_get_flavour (sub) == bfd_target_aout_flavour)
   5398 	{
   5399 	  sz = obj_textsec (sub)->size;
   5400 	  if (sz > max_contents_size)
   5401 	    max_contents_size = sz;
   5402 	  sz = obj_datasec (sub)->size;
   5403 	  if (sz > max_contents_size)
   5404 	    max_contents_size = sz;
   5405 
   5406 	  sz = exec_hdr (sub)->a_trsize;
   5407 	  if (sz > max_relocs_size)
   5408 	    max_relocs_size = sz;
   5409 	  sz = exec_hdr (sub)->a_drsize;
   5410 	  if (sz > max_relocs_size)
   5411 	    max_relocs_size = sz;
   5412 
   5413 	  sz = obj_aout_external_sym_count (sub);
   5414 	  if (sz > max_sym_count)
   5415 	    max_sym_count = sz;
   5416 	}
   5417     }
   5418 
   5419   if (info->relocatable)
   5420     {
   5421       if (obj_textsec (abfd) != NULL)
   5422 	trsize += (_bfd_count_link_order_relocs (obj_textsec (abfd)
   5423 						 ->map_head.link_order)
   5424 		   * obj_reloc_entry_size (abfd));
   5425       if (obj_datasec (abfd) != NULL)
   5426 	drsize += (_bfd_count_link_order_relocs (obj_datasec (abfd)
   5427 						 ->map_head.link_order)
   5428 		   * obj_reloc_entry_size (abfd));
   5429     }
   5430 
   5431   exec_hdr (abfd)->a_trsize = trsize;
   5432   exec_hdr (abfd)->a_drsize = drsize;
   5433 
   5434   exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd);
   5435 
   5436   /* Adjust the section sizes and vmas according to the magic number.
   5437      This sets a_text, a_data and a_bss in the exec_hdr and sets the
   5438      filepos for each section.  */
   5439   if (! NAME (aout, adjust_sizes_and_vmas) (abfd, &text_size, &text_end))
   5440     goto error_return;
   5441 
   5442   /* The relocation and symbol file positions differ among a.out
   5443      targets.  We are passed a callback routine from the backend
   5444      specific code to handle this.
   5445      FIXME: At this point we do not know how much space the symbol
   5446      table will require.  This will not work for any (nonstandard)
   5447      a.out target that needs to know the symbol table size before it
   5448      can compute the relocation file positions.  This may or may not
   5449      be the case for the hp300hpux target, for example.  */
   5450   (*callback) (abfd, &aout_info.treloff, &aout_info.dreloff,
   5451 	       &aout_info.symoff);
   5452   obj_textsec (abfd)->rel_filepos = aout_info.treloff;
   5453   obj_datasec (abfd)->rel_filepos = aout_info.dreloff;
   5454   obj_sym_filepos (abfd) = aout_info.symoff;
   5455 
   5456   /* We keep a count of the symbols as we output them.  */
   5457   obj_aout_external_sym_count (abfd) = 0;
   5458 
   5459   /* We accumulate the string table as we write out the symbols.  */
   5460   aout_info.strtab = _bfd_stringtab_init ();
   5461   if (aout_info.strtab == NULL)
   5462     goto error_return;
   5463 
   5464   /* Allocate buffers to hold section contents and relocs.  */
   5465   aout_info.contents = (bfd_byte *) bfd_malloc (max_contents_size);
   5466   aout_info.relocs = bfd_malloc (max_relocs_size);
   5467   aout_info.symbol_map = (int *) bfd_malloc (max_sym_count * sizeof (int));
   5468   aout_info.output_syms = (struct external_nlist *)
   5469       bfd_malloc ((max_sym_count + 1) * sizeof (struct external_nlist));
   5470   if ((aout_info.contents == NULL && max_contents_size != 0)
   5471       || (aout_info.relocs == NULL && max_relocs_size != 0)
   5472       || (aout_info.symbol_map == NULL && max_sym_count != 0)
   5473       || aout_info.output_syms == NULL)
   5474     goto error_return;
   5475 
   5476   /* If we have a symbol named __DYNAMIC, force it out now.  This is
   5477      required by SunOS.  Doing this here rather than in sunos.c is a
   5478      hack, but it's easier than exporting everything which would be
   5479      needed.  */
   5480   {
   5481     struct aout_link_hash_entry *h;
   5482 
   5483     h = aout_link_hash_lookup (aout_hash_table (info), "__DYNAMIC",
   5484 			       FALSE, FALSE, FALSE);
   5485     if (h != NULL)
   5486       aout_link_write_other_symbol (&h->root.root, &aout_info);
   5487   }
   5488 
   5489   /* The most time efficient way to do the link would be to read all
   5490      the input object files into memory and then sort out the
   5491      information into the output file.  Unfortunately, that will
   5492      probably use too much memory.  Another method would be to step
   5493      through everything that composes the text section and write it
   5494      out, and then everything that composes the data section and write
   5495      it out, and then write out the relocs, and then write out the
   5496      symbols.  Unfortunately, that requires reading stuff from each
   5497      input file several times, and we will not be able to keep all the
   5498      input files open simultaneously, and reopening them will be slow.
   5499 
   5500      What we do is basically process one input file at a time.  We do
   5501      everything we need to do with an input file once--copy over the
   5502      section contents, handle the relocation information, and write
   5503      out the symbols--and then we throw away the information we read
   5504      from it.  This approach requires a lot of lseeks of the output
   5505      file, which is unfortunate but still faster than reopening a lot
   5506      of files.
   5507 
   5508      We use the output_has_begun field of the input BFDs to see
   5509      whether we have already handled it.  */
   5510   for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
   5511     sub->output_has_begun = FALSE;
   5512 
   5513   /* Mark all sections which are to be included in the link.  This
   5514      will normally be every section.  We need to do this so that we
   5515      can identify any sections which the linker has decided to not
   5516      include.  */
   5517   for (o = abfd->sections; o != NULL; o = o->next)
   5518     {
   5519       for (p = o->map_head.link_order; p != NULL; p = p->next)
   5520 	if (p->type == bfd_indirect_link_order)
   5521 	  p->u.indirect.section->linker_mark = TRUE;
   5522     }
   5523 
   5524   have_link_order_relocs = FALSE;
   5525   for (o = abfd->sections; o != NULL; o = o->next)
   5526     {
   5527       for (p = o->map_head.link_order;
   5528 	   p != NULL;
   5529 	   p = p->next)
   5530 	{
   5531 	  if (p->type == bfd_indirect_link_order
   5532 	      && (bfd_get_flavour (p->u.indirect.section->owner)
   5533 		  == bfd_target_aout_flavour))
   5534 	    {
   5535 	      bfd *input_bfd;
   5536 
   5537 	      input_bfd = p->u.indirect.section->owner;
   5538 	      if (! input_bfd->output_has_begun)
   5539 		{
   5540 		  if (! aout_link_input_bfd (&aout_info, input_bfd))
   5541 		    goto error_return;
   5542 		  input_bfd->output_has_begun = TRUE;
   5543 		}
   5544 	    }
   5545 	  else if (p->type == bfd_section_reloc_link_order
   5546 		   || p->type == bfd_symbol_reloc_link_order)
   5547 	    {
   5548 	      /* These are handled below.  */
   5549 	      have_link_order_relocs = TRUE;
   5550 	    }
   5551 	  else
   5552 	    {
   5553 	      if (! _bfd_default_link_order (abfd, info, o, p))
   5554 		goto error_return;
   5555 	    }
   5556 	}
   5557     }
   5558 
   5559   /* Write out any symbols that we have not already written out.  */
   5560   bfd_hash_traverse (&info->hash->table,
   5561 		     aout_link_write_other_symbol,
   5562 		     &aout_info);
   5563 
   5564   /* Now handle any relocs we were asked to create by the linker.
   5565      These did not come from any input file.  We must do these after
   5566      we have written out all the symbols, so that we know the symbol
   5567      indices to use.  */
   5568   if (have_link_order_relocs)
   5569     {
   5570       for (o = abfd->sections; o != NULL; o = o->next)
   5571 	{
   5572 	  for (p = o->map_head.link_order;
   5573 	       p != NULL;
   5574 	       p = p->next)
   5575 	    {
   5576 	      if (p->type == bfd_section_reloc_link_order
   5577 		  || p->type == bfd_symbol_reloc_link_order)
   5578 		{
   5579 		  if (! aout_link_reloc_link_order (&aout_info, o, p))
   5580 		    goto error_return;
   5581 		}
   5582 	    }
   5583 	}
   5584     }
   5585 
   5586   if (aout_info.contents != NULL)
   5587     {
   5588       free (aout_info.contents);
   5589       aout_info.contents = NULL;
   5590     }
   5591   if (aout_info.relocs != NULL)
   5592     {
   5593       free (aout_info.relocs);
   5594       aout_info.relocs = NULL;
   5595     }
   5596   if (aout_info.symbol_map != NULL)
   5597     {
   5598       free (aout_info.symbol_map);
   5599       aout_info.symbol_map = NULL;
   5600     }
   5601   if (aout_info.output_syms != NULL)
   5602     {
   5603       free (aout_info.output_syms);
   5604       aout_info.output_syms = NULL;
   5605     }
   5606   if (includes_hash_initialized)
   5607     {
   5608       bfd_hash_table_free (&aout_info.includes.root);
   5609       includes_hash_initialized = FALSE;
   5610     }
   5611 
   5612   /* Finish up any dynamic linking we may be doing.  */
   5613   if (aout_backend_info (abfd)->finish_dynamic_link != NULL)
   5614     {
   5615       if (! (*aout_backend_info (abfd)->finish_dynamic_link) (abfd, info))
   5616 	goto error_return;
   5617     }
   5618 
   5619   /* Update the header information.  */
   5620   abfd->symcount = obj_aout_external_sym_count (abfd);
   5621   exec_hdr (abfd)->a_syms = abfd->symcount * EXTERNAL_NLIST_SIZE;
   5622   obj_str_filepos (abfd) = obj_sym_filepos (abfd) + exec_hdr (abfd)->a_syms;
   5623   obj_textsec (abfd)->reloc_count =
   5624     exec_hdr (abfd)->a_trsize / obj_reloc_entry_size (abfd);
   5625   obj_datasec (abfd)->reloc_count =
   5626     exec_hdr (abfd)->a_drsize / obj_reloc_entry_size (abfd);
   5627 
   5628   /* Write out the string table, unless there are no symbols.  */
   5629   if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0)
   5630     goto error_return;
   5631   if (abfd->symcount > 0)
   5632     {
   5633       if (!emit_stringtab (abfd, aout_info.strtab))
   5634 	goto error_return;
   5635     }
   5636   else
   5637     {
   5638       bfd_byte b[BYTES_IN_WORD];
   5639 
   5640       memset (b, 0, BYTES_IN_WORD);
   5641       if (bfd_bwrite (b, (bfd_size_type) BYTES_IN_WORD, abfd) != BYTES_IN_WORD)
   5642 	goto error_return;
   5643     }
   5644 
   5645   return TRUE;
   5646 
   5647  error_return:
   5648   if (aout_info.contents != NULL)
   5649     free (aout_info.contents);
   5650   if (aout_info.relocs != NULL)
   5651     free (aout_info.relocs);
   5652   if (aout_info.symbol_map != NULL)
   5653     free (aout_info.symbol_map);
   5654   if (aout_info.output_syms != NULL)
   5655     free (aout_info.output_syms);
   5656   if (includes_hash_initialized)
   5657     bfd_hash_table_free (&aout_info.includes.root);
   5658   return FALSE;
   5659 }
   5660