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