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