OSDN Git Service

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