1 /* BFD semi-generic back-end for a.out binaries.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
3 Written by Cygnus Support.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
28 BFD supports a number of different flavours of a.out format,
29 though the major differences are only the sizes of the
30 structures on disk, and the shape of the relocation
33 The support is split into a basic support file @file{aoutx.h}
34 and other files which derive functions from the base. One
35 derivation file is @file{aoutf1.h} (for a.out flavour 1), and
36 adds to the basic a.out functions support for sun3, sun4, 386
37 and 29k a.out files, to create a target jump vector for a
40 This information is further split out into more specific files
41 for each machine, including @file{sunos.c} for sun3 and sun4,
42 @file{newsos3.c} for the Sony NEWS, and @file{demo64.c} for a
43 demonstration of a 64 bit a.out format.
45 The base file @file{aoutx.h} defines general mechanisms for
46 reading and writing records to and from disk and various
47 other methods which BFD requires. It is included by
48 @file{aout32.c} and @file{aout64.c} to form the names
49 <<aout_32_swap_exec_header_in>>, <<aout_64_swap_exec_header_in>>, etc.
51 As an example, this is what goes on to make the back end for a
52 sun4, from @file{aout32.c}:
54 | #define ARCH_SIZE 32
60 | aout_32_canonicalize_reloc
61 | aout_32_find_nearest_line
63 | aout_32_get_reloc_upper_bound
68 | #define TARGET_NAME "a.out-sunos-big"
69 | #define VECNAME sunos_big_vec
72 requires all the names from @file{aout32.c}, and produces the jump vector
76 The file @file{host-aout.c} is a special case. It is for a large set
77 of hosts that use ``more or less standard'' a.out files, and
78 for which cross-debugging is not interesting. It uses the
79 standard 32-bit a.out support routines, but determines the
80 file offsets and addresses of the text, data, and BSS
81 sections, the machine architecture and machine type, and the
82 entry point address, in a host-dependent manner. Once these
83 values have been determined, generic code is used to handle
86 When porting it to run on a new system, you must supply:
90 | HOST_MACHINE_ARCH (optional)
91 | HOST_MACHINE_MACHINE (optional)
92 | HOST_TEXT_START_ADDR
95 in the file @file{../include/sys/h-@var{XXX}.h} (for your host). These
96 values, plus the structures and macros defined in @file{a.out.h} on
97 your host system, will produce a BFD target that will access
98 ordinary a.out files on your host. To configure a new machine
99 to use @file{host-aout.c}, specify:
101 | TDEFAULTS = -DDEFAULT_VECTOR=host_aout_big_vec
102 | TDEPFILES= host-aout.o trad-core.o
104 in the @file{config/@var{XXX}.mt} file, and modify @file{configure.in}
106 @file{@var{XXX}.mt} file (by setting "<<bfd_target=XXX>>") when your
107 configuration is selected.
112 * Any BFD with D_PAGED set is ZMAGIC, and vice versa.
113 Doesn't matter what the setting of WP_TEXT is on output, but it'll
115 * Any BFD with D_PAGED clear and WP_TEXT set is NMAGIC.
116 * Any BFD with both flags clear is OMAGIC.
117 (Just want to make these explicit, so the conditions tested in this
118 file make sense if you're more familiar with a.out than with BFD.) */
121 #define KEEPITTYPE int
123 #include <string.h> /* For strchr and friends */
130 #include "aout/aout64.h"
131 #include "aout/stab_gnu.h"
134 static boolean aout_get_external_symbols PARAMS ((bfd *));
135 static boolean translate_from_native_sym_flags
136 PARAMS ((bfd *, aout_symbol_type *));
137 static boolean translate_to_native_sym_flags
138 PARAMS ((bfd *, asymbol *, struct external_nlist *));
145 The file @file{aoutx.h} provides for both the @emph{standard}
146 and @emph{extended} forms of a.out relocation records.
148 The standard records contain only an
149 address, a symbol index, and a type field. The extended records
150 (used on 29ks and sparcs) also have a full integer for an
154 #ifndef CTOR_TABLE_RELOC_HOWTO
155 #define CTOR_TABLE_RELOC_IDX 2
156 #define CTOR_TABLE_RELOC_HOWTO(BFD) ((obj_reloc_entry_size(BFD) == RELOC_EXT_SIZE \
157 ? howto_table_ext : howto_table_std) \
158 + CTOR_TABLE_RELOC_IDX)
161 #ifndef MY_swap_std_reloc_in
162 #define MY_swap_std_reloc_in NAME(aout,swap_std_reloc_in)
165 #ifndef MY_swap_std_reloc_out
166 #define MY_swap_std_reloc_out NAME(aout,swap_std_reloc_out)
169 #define howto_table_ext NAME(aout,ext_howto_table)
170 #define howto_table_std NAME(aout,std_howto_table)
172 reloc_howto_type howto_table_ext[] =
174 /* type rs size bsz pcrel bitpos ovrf sf name part_inpl readmask setmask pcdone */
175 HOWTO(RELOC_8, 0, 0, 8, false, 0, complain_overflow_bitfield,0,"8", false, 0,0x000000ff, false),
176 HOWTO(RELOC_16, 0, 1, 16, false, 0, complain_overflow_bitfield,0,"16", false, 0,0x0000ffff, false),
177 HOWTO(RELOC_32, 0, 2, 32, false, 0, complain_overflow_bitfield,0,"32", false, 0,0xffffffff, false),
178 HOWTO(RELOC_DISP8, 0, 0, 8, true, 0, complain_overflow_signed,0,"DISP8", false, 0,0x000000ff, false),
179 HOWTO(RELOC_DISP16, 0, 1, 16, true, 0, complain_overflow_signed,0,"DISP16", false, 0,0x0000ffff, false),
180 HOWTO(RELOC_DISP32, 0, 2, 32, true, 0, complain_overflow_signed,0,"DISP32", false, 0,0xffffffff, false),
181 HOWTO(RELOC_WDISP30,2, 2, 30, true, 0, complain_overflow_signed,0,"WDISP30", false, 0,0x3fffffff, false),
182 HOWTO(RELOC_WDISP22,2, 2, 22, true, 0, complain_overflow_signed,0,"WDISP22", false, 0,0x003fffff, false),
183 HOWTO(RELOC_HI22, 10, 2, 22, false, 0, complain_overflow_bitfield,0,"HI22", false, 0,0x003fffff, false),
184 HOWTO(RELOC_22, 0, 2, 22, false, 0, complain_overflow_bitfield,0,"22", false, 0,0x003fffff, false),
185 HOWTO(RELOC_13, 0, 2, 13, false, 0, complain_overflow_bitfield,0,"13", false, 0,0x00001fff, false),
186 HOWTO(RELOC_LO10, 0, 2, 10, false, 0, complain_overflow_dont,0,"LO10", false, 0,0x000003ff, false),
187 HOWTO(RELOC_SFA_BASE,0, 2, 32, false, 0, complain_overflow_bitfield,0,"SFA_BASE", false, 0,0xffffffff, false),
188 HOWTO(RELOC_SFA_OFF13,0,2, 32, false, 0, complain_overflow_bitfield,0,"SFA_OFF13",false, 0,0xffffffff, false),
189 HOWTO(RELOC_BASE10, 0, 2, 16, false, 0, complain_overflow_bitfield,0,"BASE10", false, 0,0x0000ffff, false),
190 HOWTO(RELOC_BASE13, 0, 2, 13, false, 0, complain_overflow_bitfield,0,"BASE13", false, 0,0x00001fff, false),
191 HOWTO(RELOC_BASE22, 0, 2, 0, false, 0, complain_overflow_bitfield,0,"BASE22", false, 0,0x00000000, false),
192 HOWTO(RELOC_PC10, 0, 2, 10, false, 0, complain_overflow_bitfield,0,"PC10", false, 0,0x000003ff, false),
193 HOWTO(RELOC_PC22, 0, 2, 22, false, 0, complain_overflow_bitfield,0,"PC22", false, 0,0x003fffff, false),
194 HOWTO(RELOC_JMP_TBL,0, 2, 32, false, 0, complain_overflow_bitfield,0,"JMP_TBL", false, 0,0xffffffff, false),
195 HOWTO(RELOC_SEGOFF16,0, 2, 0, false, 0, complain_overflow_bitfield,0,"SEGOFF16", false, 0,0x00000000, false),
196 HOWTO(RELOC_GLOB_DAT,0, 2, 0, false, 0, complain_overflow_bitfield,0,"GLOB_DAT", false, 0,0x00000000, false),
197 HOWTO(RELOC_JMP_SLOT,0, 2, 0, false, 0, complain_overflow_bitfield,0,"JMP_SLOT", false, 0,0x00000000, false),
198 HOWTO(RELOC_RELATIVE,0, 2, 0, false, 0, complain_overflow_bitfield,0,"RELATIVE", false, 0,0x00000000, false),
201 /* Convert standard reloc records to "arelent" format (incl byte swap). */
203 reloc_howto_type howto_table_std[] = {
204 /* type rs size bsz pcrel bitpos ovrf sf name part_inpl readmask setmask pcdone */
205 HOWTO( 0, 0, 0, 8, false, 0, complain_overflow_bitfield,0,"8", true, 0x000000ff,0x000000ff, false),
206 HOWTO( 1, 0, 1, 16, false, 0, complain_overflow_bitfield,0,"16", true, 0x0000ffff,0x0000ffff, false),
207 HOWTO( 2, 0, 2, 32, false, 0, complain_overflow_bitfield,0,"32", true, 0xffffffff,0xffffffff, false),
208 HOWTO( 3, 0, 4, 64, false, 0, complain_overflow_bitfield,0,"64", true, 0xdeaddead,0xdeaddead, false),
209 HOWTO( 4, 0, 0, 8, true, 0, complain_overflow_signed, 0,"DISP8", true, 0x000000ff,0x000000ff, false),
210 HOWTO( 5, 0, 1, 16, true, 0, complain_overflow_signed, 0,"DISP16", true, 0x0000ffff,0x0000ffff, false),
211 HOWTO( 6, 0, 2, 32, true, 0, complain_overflow_signed, 0,"DISP32", true, 0xffffffff,0xffffffff, false),
212 HOWTO( 7, 0, 4, 64, true, 0, complain_overflow_signed, 0,"DISP64", true, 0xfeedface,0xfeedface, false),
213 HOWTO( 8, 0, 2, 0, false, 0, complain_overflow_bitfield,0,"GOT_REL", false, 0,0x00000000, false),
214 HOWTO( 9, 0, 1, 16, false, 0, complain_overflow_bitfield,0,"BASE16", false,0xffffffff,0xffffffff, false),
215 HOWTO(10, 0, 2, 32, false, 0, complain_overflow_bitfield,0,"BASE32", false,0xffffffff,0xffffffff, false),
221 HOWTO(16, 0, 2, 0, false, 0, complain_overflow_bitfield,0,"JMP_TABLE", false, 0,0x00000000, false),
229 { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 },
230 HOWTO(32, 0, 2, 0, false, 0, complain_overflow_bitfield,0,"RELATIVE", false, 0,0x00000000, false),
238 HOWTO(40, 0, 2, 0, false, 0, complain_overflow_bitfield,0,"BASEREL", false, 0,0x00000000, false),
241 #define TABLE_SIZE(TABLE) (sizeof(TABLE)/sizeof(TABLE[0]))
244 NAME(aout,reloc_type_lookup) (abfd,code)
246 bfd_reloc_code_real_type code;
248 #define EXT(i,j) case i: return &howto_table_ext[j]
249 #define STD(i,j) case i: return &howto_table_std[j]
250 int ext = obj_reloc_entry_size (abfd) == RELOC_EXT_SIZE;
251 if (code == BFD_RELOC_CTOR)
252 switch (bfd_get_arch_info (abfd)->bits_per_address)
264 EXT (BFD_RELOC_32, 2);
265 EXT (BFD_RELOC_HI22, 8);
266 EXT (BFD_RELOC_LO10, 11);
267 EXT (BFD_RELOC_32_PCREL_S2, 6);
268 EXT (BFD_RELOC_SPARC_WDISP22, 7);
269 EXT (BFD_RELOC_SPARC13, 10);
270 EXT (BFD_RELOC_SPARC_BASE13, 15);
271 default: return (reloc_howto_type *) NULL;
277 STD (BFD_RELOC_16, 1);
278 STD (BFD_RELOC_32, 2);
279 STD (BFD_RELOC_8_PCREL, 4);
280 STD (BFD_RELOC_16_PCREL, 5);
281 STD (BFD_RELOC_32_PCREL, 6);
282 STD (BFD_RELOC_16_BASEREL, 9);
283 STD (BFD_RELOC_32_BASEREL, 10);
284 default: return (reloc_howto_type *) NULL;
290 Internal entry points
293 @file{aoutx.h} exports several routines for accessing the
294 contents of an a.out file, which are gathered and exported in
295 turn by various format specific files (eg sunos.c).
301 aout_@var{size}_swap_exec_header_in
304 void aout_@var{size}_swap_exec_header_in,
306 struct external_exec *raw_bytes,
307 struct internal_exec *execp);
310 Swap the information in an executable header @var{raw_bytes} taken
311 from a raw byte stream memory image into the internal exec header
312 structure @var{execp}.
315 #ifndef NAME_swap_exec_header_in
317 NAME(aout,swap_exec_header_in) (abfd, raw_bytes, execp)
319 struct external_exec *raw_bytes;
320 struct internal_exec *execp;
322 struct external_exec *bytes = (struct external_exec *)raw_bytes;
324 /* The internal_exec structure has some fields that are unused in this
325 configuration (IE for i960), so ensure that all such uninitialized
326 fields are zero'd out. There are places where two of these structs
327 are memcmp'd, and thus the contents do matter. */
328 memset ((PTR) execp, 0, sizeof (struct internal_exec));
329 /* Now fill in fields in the execp, from the bytes in the raw data. */
330 execp->a_info = bfd_h_get_32 (abfd, bytes->e_info);
331 execp->a_text = GET_WORD (abfd, bytes->e_text);
332 execp->a_data = GET_WORD (abfd, bytes->e_data);
333 execp->a_bss = GET_WORD (abfd, bytes->e_bss);
334 execp->a_syms = GET_WORD (abfd, bytes->e_syms);
335 execp->a_entry = GET_WORD (abfd, bytes->e_entry);
336 execp->a_trsize = GET_WORD (abfd, bytes->e_trsize);
337 execp->a_drsize = GET_WORD (abfd, bytes->e_drsize);
339 #define NAME_swap_exec_header_in NAME(aout,swap_exec_header_in)
344 aout_@var{size}_swap_exec_header_out
347 void aout_@var{size}_swap_exec_header_out
349 struct internal_exec *execp,
350 struct external_exec *raw_bytes);
353 Swap the information in an internal exec header structure
354 @var{execp} into the buffer @var{raw_bytes} ready for writing to disk.
357 NAME(aout,swap_exec_header_out) (abfd, execp, raw_bytes)
359 struct internal_exec *execp;
360 struct external_exec *raw_bytes;
362 struct external_exec *bytes = (struct external_exec *)raw_bytes;
364 /* Now fill in fields in the raw data, from the fields in the exec struct. */
365 bfd_h_put_32 (abfd, execp->a_info , bytes->e_info);
366 PUT_WORD (abfd, execp->a_text , bytes->e_text);
367 PUT_WORD (abfd, execp->a_data , bytes->e_data);
368 PUT_WORD (abfd, execp->a_bss , bytes->e_bss);
369 PUT_WORD (abfd, execp->a_syms , bytes->e_syms);
370 PUT_WORD (abfd, execp->a_entry , bytes->e_entry);
371 PUT_WORD (abfd, execp->a_trsize, bytes->e_trsize);
372 PUT_WORD (abfd, execp->a_drsize, bytes->e_drsize);
375 /* Make all the section for an a.out file. */
378 NAME(aout,make_sections) (abfd)
381 if (obj_textsec (abfd) == (asection *) NULL
382 && bfd_make_section (abfd, ".text") == (asection *) NULL)
384 if (obj_datasec (abfd) == (asection *) NULL
385 && bfd_make_section (abfd, ".data") == (asection *) NULL)
387 if (obj_bsssec (abfd) == (asection *) NULL
388 && bfd_make_section (abfd, ".bss") == (asection *) NULL)
395 aout_@var{size}_some_aout_object_p
398 const bfd_target *aout_@var{size}_some_aout_object_p
400 const bfd_target *(*callback_to_real_object_p)());
403 Some a.out variant thinks that the file open in @var{abfd}
404 checking is an a.out file. Do some more checking, and set up
405 for access if it really is. Call back to the calling
406 environment's "finish up" function just before returning, to
407 handle any last-minute setup.
411 NAME(aout,some_aout_object_p) (abfd, execp, callback_to_real_object_p)
413 struct internal_exec *execp;
414 const bfd_target *(*callback_to_real_object_p) PARAMS ((bfd *));
416 struct aout_data_struct *rawptr, *oldrawptr;
417 const bfd_target *result;
419 rawptr = (struct aout_data_struct *) bfd_zalloc (abfd, sizeof (struct aout_data_struct ));
420 if (rawptr == NULL) {
421 bfd_set_error (bfd_error_no_memory);
425 oldrawptr = abfd->tdata.aout_data;
426 abfd->tdata.aout_data = rawptr;
428 /* Copy the contents of the old tdata struct.
429 In particular, we want the subformat, since for hpux it was set in
430 hp300hpux.c:swap_exec_header_in and will be used in
431 hp300hpux.c:callback. */
432 if (oldrawptr != NULL)
433 *abfd->tdata.aout_data = *oldrawptr;
435 abfd->tdata.aout_data->a.hdr = &rawptr->e;
436 *(abfd->tdata.aout_data->a.hdr) = *execp; /* Copy in the internal_exec struct */
437 execp = abfd->tdata.aout_data->a.hdr;
439 /* Set the file flags */
440 abfd->flags = NO_FLAGS;
441 if (execp->a_drsize || execp->a_trsize)
442 abfd->flags |= HAS_RELOC;
443 /* Setting of EXEC_P has been deferred to the bottom of this function */
445 abfd->flags |= HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS;
446 if (N_DYNAMIC(*execp))
447 abfd->flags |= DYNAMIC;
449 if (N_MAGIC (*execp) == ZMAGIC)
451 abfd->flags |= D_PAGED | WP_TEXT;
452 adata (abfd).magic = z_magic;
454 else if (N_MAGIC (*execp) == QMAGIC)
456 abfd->flags |= D_PAGED | WP_TEXT;
457 adata (abfd).magic = z_magic;
458 adata (abfd).subformat = q_magic_format;
460 else if (N_MAGIC (*execp) == NMAGIC)
462 abfd->flags |= WP_TEXT;
463 adata (abfd).magic = n_magic;
465 else if (N_MAGIC (*execp) == OMAGIC
466 || N_MAGIC (*execp) == BMAGIC)
467 adata (abfd).magic = o_magic;
470 /* Should have been checked with N_BADMAG before this routine
475 bfd_get_start_address (abfd) = execp->a_entry;
477 obj_aout_symbols (abfd) = (aout_symbol_type *)NULL;
478 bfd_get_symcount (abfd) = execp->a_syms / sizeof (struct external_nlist);
480 /* The default relocation entry size is that of traditional V7 Unix. */
481 obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
483 /* The default symbol entry size is that of traditional Unix. */
484 obj_symbol_entry_size (abfd) = EXTERNAL_NLIST_SIZE;
486 obj_aout_external_syms (abfd) = NULL;
487 obj_aout_external_strings (abfd) = NULL;
488 obj_aout_sym_hashes (abfd) = NULL;
490 if (! NAME(aout,make_sections) (abfd))
493 obj_datasec (abfd)->_raw_size = execp->a_data;
494 obj_bsssec (abfd)->_raw_size = execp->a_bss;
496 obj_textsec (abfd)->flags =
497 (execp->a_trsize != 0
498 ? (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS | SEC_RELOC)
499 : (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS));
500 obj_datasec (abfd)->flags =
501 (execp->a_drsize != 0
502 ? (SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS | SEC_RELOC)
503 : (SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS));
504 obj_bsssec (abfd)->flags = SEC_ALLOC;
506 #ifdef THIS_IS_ONLY_DOCUMENTATION
507 /* The common code can't fill in these things because they depend
508 on either the start address of the text segment, the rounding
509 up of virtual addresses between segments, or the starting file
510 position of the text segment -- all of which varies among different
511 versions of a.out. */
513 /* Call back to the format-dependent code to fill in the rest of the
514 fields and do any further cleanup. Things that should be filled
515 in by the callback: */
517 struct exec *execp = exec_hdr (abfd);
519 obj_textsec (abfd)->size = N_TXTSIZE(*execp);
520 obj_textsec (abfd)->raw_size = N_TXTSIZE(*execp);
521 /* data and bss are already filled in since they're so standard */
523 /* The virtual memory addresses of the sections */
524 obj_textsec (abfd)->vma = N_TXTADDR(*execp);
525 obj_datasec (abfd)->vma = N_DATADDR(*execp);
526 obj_bsssec (abfd)->vma = N_BSSADDR(*execp);
528 /* The file offsets of the sections */
529 obj_textsec (abfd)->filepos = N_TXTOFF(*execp);
530 obj_datasec (abfd)->filepos = N_DATOFF(*execp);
532 /* The file offsets of the relocation info */
533 obj_textsec (abfd)->rel_filepos = N_TRELOFF(*execp);
534 obj_datasec (abfd)->rel_filepos = N_DRELOFF(*execp);
536 /* The file offsets of the string table and symbol table. */
537 obj_str_filepos (abfd) = N_STROFF (*execp);
538 obj_sym_filepos (abfd) = N_SYMOFF (*execp);
540 /* Determine the architecture and machine type of the object file. */
541 switch (N_MACHTYPE (*exec_hdr (abfd))) {
543 abfd->obj_arch = bfd_arch_obscure;
547 adata(abfd)->page_size = PAGE_SIZE;
548 adata(abfd)->segment_size = SEGMENT_SIZE;
549 adata(abfd)->exec_bytes_size = EXEC_BYTES_SIZE;
553 /* The architecture is encoded in various ways in various a.out variants,
554 or is not encoded at all in some of them. The relocation size depends
555 on the architecture and the a.out variant. Finally, the return value
556 is the bfd_target vector in use. If an error occurs, return zero and
557 set bfd_error to the appropriate error code.
559 Formats such as b.out, which have additional fields in the a.out
560 header, should cope with them in this callback as well. */
561 #endif /* DOCUMENTATION */
563 result = (*callback_to_real_object_p)(abfd);
565 /* Now that the segment addresses have been worked out, take a better
566 guess at whether the file is executable. If the entry point
567 is within the text segment, assume it is. (This makes files
568 executable even if their entry point address is 0, as long as
569 their text starts at zero.). */
570 if ((execp->a_entry >= obj_textsec(abfd)->vma) &&
571 (execp->a_entry < obj_textsec(abfd)->vma + obj_textsec(abfd)->_raw_size))
572 abfd->flags |= EXEC_P;
576 struct stat stat_buf;
578 /* The original heuristic doesn't work in some important cases.
579 The a.out file has no information about the text start
580 address. For files (like kernels) linked to non-standard
581 addresses (ld -Ttext nnn) the entry point may not be between
582 the default text start (obj_textsec(abfd)->vma) and
583 (obj_textsec(abfd)->vma) + text size. This is not just a mach
584 issue. Many kernels are loaded at non standard addresses. */
586 && (fstat(fileno((FILE *) (abfd->iostream)), &stat_buf) == 0)
587 && ((stat_buf.st_mode & 0111) != 0))
588 abfd->flags |= EXEC_P;
590 #endif /* STAT_FOR_EXEC */
594 #if 0 /* These should be set correctly anyways. */
595 abfd->sections = obj_textsec (abfd);
596 obj_textsec (abfd)->next = obj_datasec (abfd);
597 obj_datasec (abfd)->next = obj_bsssec (abfd);
603 abfd->tdata.aout_data = oldrawptr;
610 aout_@var{size}_mkobject
613 boolean aout_@var{size}_mkobject, (bfd *abfd);
616 Initialize BFD @var{abfd} for use with a.out files.
620 NAME(aout,mkobject) (abfd)
623 struct aout_data_struct *rawptr;
625 bfd_set_error (bfd_error_system_call);
627 /* Use an intermediate variable for clarity */
628 rawptr = (struct aout_data_struct *)bfd_zalloc (abfd, sizeof (struct aout_data_struct ));
630 if (rawptr == NULL) {
631 bfd_set_error (bfd_error_no_memory);
635 abfd->tdata.aout_data = rawptr;
636 exec_hdr (abfd) = &(rawptr->e);
638 obj_textsec (abfd) = (asection *)NULL;
639 obj_datasec (abfd) = (asection *)NULL;
640 obj_bsssec (abfd) = (asection *)NULL;
648 aout_@var{size}_machine_type
651 enum machine_type aout_@var{size}_machine_type
652 (enum bfd_architecture arch,
653 unsigned long machine));
656 Keep track of machine architecture and machine type for
657 a.out's. Return the <<machine_type>> for a particular
658 architecture and machine, or <<M_UNKNOWN>> if that exact architecture
659 and machine can't be represented in a.out format.
661 If the architecture is understood, machine type 0 (default)
662 is always understood.
666 NAME(aout,machine_type) (arch, machine, unknown)
667 enum bfd_architecture arch;
668 unsigned long machine;
671 enum machine_type arch_flags;
673 arch_flags = M_UNKNOWN;
678 if (machine == 0) arch_flags = M_SPARC;
683 case 0: arch_flags = M_68010; break;
684 case 68000: arch_flags = M_UNKNOWN; *unknown = false; break;
685 case 68010: arch_flags = M_68010; break;
686 case 68020: arch_flags = M_68020; break;
687 default: arch_flags = M_UNKNOWN; break;
692 if (machine == 0) arch_flags = M_386;
696 if (machine == 0) arch_flags = M_29K;
700 if (machine == 0) arch_flags = M_ARM;
707 case 3000: arch_flags = M_MIPS1; break;
710 case 6000: arch_flags = M_MIPS2; break;
711 default: arch_flags = M_UNKNOWN; break;
717 case 0: arch_flags = M_NS32532; break;
718 case 32032: arch_flags = M_NS32032; break;
719 case 32532: arch_flags = M_NS32532; break;
720 default: arch_flags = M_UNKNOWN; break;
728 /* start-sanitize-rce */
732 /* end-sanitize-rce */
735 arch_flags = M_UNKNOWN;
738 if (arch_flags != M_UNKNOWN)
747 aout_@var{size}_set_arch_mach
750 boolean aout_@var{size}_set_arch_mach,
752 enum bfd_architecture arch,
753 unsigned long machine));
756 Set the architecture and the machine of the BFD @var{abfd} to the
757 values @var{arch} and @var{machine}. Verify that @var{abfd}'s format
758 can support the architecture required.
762 NAME(aout,set_arch_mach) (abfd, arch, machine)
764 enum bfd_architecture arch;
765 unsigned long machine;
767 if (! bfd_default_set_arch_mach (abfd, arch, machine))
770 if (arch != bfd_arch_unknown)
774 NAME(aout,machine_type) (arch, machine, &unknown);
779 /* Determine the size of a relocation entry */
784 obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE;
787 obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
791 return (*aout_backend_info(abfd)->set_sizes) (abfd);
795 adjust_o_magic (abfd, execp)
797 struct internal_exec *execp;
799 file_ptr pos = adata (abfd).exec_bytes_size;
804 obj_textsec(abfd)->filepos = pos;
805 if (!obj_textsec(abfd)->user_set_vma)
806 obj_textsec(abfd)->vma = vma;
808 vma = obj_textsec(abfd)->vma;
810 pos += obj_textsec(abfd)->_raw_size;
811 vma += obj_textsec(abfd)->_raw_size;
814 if (!obj_datasec(abfd)->user_set_vma)
816 #if 0 /* ?? Does alignment in the file image really matter? */
817 pad = align_power (vma, obj_datasec(abfd)->alignment_power) - vma;
819 obj_textsec(abfd)->_raw_size += pad;
822 obj_datasec(abfd)->vma = vma;
825 vma = obj_datasec(abfd)->vma;
826 obj_datasec(abfd)->filepos = pos;
827 pos += obj_datasec(abfd)->_raw_size;
828 vma += obj_datasec(abfd)->_raw_size;
831 if (!obj_bsssec(abfd)->user_set_vma)
834 pad = align_power (vma, obj_bsssec(abfd)->alignment_power) - vma;
836 obj_datasec(abfd)->_raw_size += pad;
839 obj_bsssec(abfd)->vma = vma;
843 /* The VMA of the .bss section is set by the the VMA of the
844 .data section plus the size of the .data section. We may
845 need to add padding bytes to make this true. */
846 pad = obj_bsssec (abfd)->vma - vma;
849 obj_datasec (abfd)->_raw_size += pad;
853 obj_bsssec(abfd)->filepos = pos;
855 /* Fix up the exec header. */
856 execp->a_text = obj_textsec(abfd)->_raw_size;
857 execp->a_data = obj_datasec(abfd)->_raw_size;
858 execp->a_bss = obj_bsssec(abfd)->_raw_size;
859 N_SET_MAGIC (*execp, OMAGIC);
863 adjust_z_magic (abfd, execp)
865 struct internal_exec *execp;
867 bfd_size_type data_pad, text_pad;
869 CONST struct aout_backend_data *abdp;
870 int ztih; /* Nonzero if text includes exec header. */
872 abdp = aout_backend_info (abfd);
876 && (abdp->text_includes_header
877 || obj_aout_subformat (abfd) == q_magic_format));
878 obj_textsec(abfd)->filepos = (ztih
879 ? adata(abfd).exec_bytes_size
880 : adata(abfd).zmagic_disk_block_size);
881 if (! obj_textsec(abfd)->user_set_vma)
883 /* ?? Do we really need to check for relocs here? */
884 obj_textsec(abfd)->vma = ((abfd->flags & HAS_RELOC)
887 ? (abdp->default_text_vma
888 + adata(abfd).exec_bytes_size)
889 : abdp->default_text_vma));
894 /* The .text section is being loaded at an unusual address. We
895 may need to pad it such that the .data section starts at a page
898 text_pad = ((obj_textsec (abfd)->filepos - obj_textsec (abfd)->vma)
899 & (adata (abfd).page_size - 1));
901 text_pad = ((- obj_textsec (abfd)->vma)
902 & (adata (abfd).page_size - 1));
905 /* Find start of data. */
908 text_end = obj_textsec (abfd)->filepos + obj_textsec (abfd)->_raw_size;
909 text_pad += BFD_ALIGN (text_end, adata (abfd).page_size) - text_end;
913 /* Note that if page_size == zmagic_disk_block_size, then
914 filepos == page_size, and this case is the same as the ztih
916 text_end = obj_textsec (abfd)->_raw_size;
917 text_pad += BFD_ALIGN (text_end, adata (abfd).page_size) - text_end;
918 text_end += obj_textsec (abfd)->filepos;
920 obj_textsec(abfd)->_raw_size += text_pad;
921 text_end += text_pad;
924 if (!obj_datasec(abfd)->user_set_vma)
927 vma = obj_textsec(abfd)->vma + obj_textsec(abfd)->_raw_size;
928 obj_datasec(abfd)->vma = BFD_ALIGN (vma, adata(abfd).segment_size);
930 if (abdp && abdp->zmagic_mapped_contiguous)
932 text_pad = (obj_datasec(abfd)->vma
933 - obj_textsec(abfd)->vma
934 - obj_textsec(abfd)->_raw_size);
935 obj_textsec(abfd)->_raw_size += text_pad;
937 obj_datasec(abfd)->filepos = (obj_textsec(abfd)->filepos
938 + obj_textsec(abfd)->_raw_size);
940 /* Fix up exec header while we're at it. */
941 execp->a_text = obj_textsec(abfd)->_raw_size;
942 if (ztih && (!abdp || (abdp && !abdp->exec_header_not_counted)))
943 execp->a_text += adata(abfd).exec_bytes_size;
944 if (obj_aout_subformat (abfd) == q_magic_format)
945 N_SET_MAGIC (*execp, QMAGIC);
947 N_SET_MAGIC (*execp, ZMAGIC);
949 /* Spec says data section should be rounded up to page boundary. */
950 obj_datasec(abfd)->_raw_size
951 = align_power (obj_datasec(abfd)->_raw_size,
952 obj_bsssec(abfd)->alignment_power);
953 execp->a_data = BFD_ALIGN (obj_datasec(abfd)->_raw_size,
954 adata(abfd).page_size);
955 data_pad = execp->a_data - obj_datasec(abfd)->_raw_size;
958 if (!obj_bsssec(abfd)->user_set_vma)
959 obj_bsssec(abfd)->vma = (obj_datasec(abfd)->vma
960 + obj_datasec(abfd)->_raw_size);
961 /* If the BSS immediately follows the data section and extra space
962 in the page is left after the data section, fudge data
963 in the header so that the bss section looks smaller by that
964 amount. We'll start the bss section there, and lie to the OS.
965 (Note that a linker script, as well as the above assignment,
966 could have explicitly set the BSS vma to immediately follow
967 the data section.) */
968 if (align_power (obj_bsssec(abfd)->vma, obj_bsssec(abfd)->alignment_power)
969 == obj_datasec(abfd)->vma + obj_datasec(abfd)->_raw_size)
970 execp->a_bss = (data_pad > obj_bsssec(abfd)->_raw_size) ? 0 :
971 obj_bsssec(abfd)->_raw_size - data_pad;
973 execp->a_bss = obj_bsssec(abfd)->_raw_size;
977 adjust_n_magic (abfd, execp)
979 struct internal_exec *execp;
981 file_ptr pos = adata(abfd).exec_bytes_size;
986 obj_textsec(abfd)->filepos = pos;
987 if (!obj_textsec(abfd)->user_set_vma)
988 obj_textsec(abfd)->vma = vma;
990 vma = obj_textsec(abfd)->vma;
991 pos += obj_textsec(abfd)->_raw_size;
992 vma += obj_textsec(abfd)->_raw_size;
995 obj_datasec(abfd)->filepos = pos;
996 if (!obj_datasec(abfd)->user_set_vma)
997 obj_datasec(abfd)->vma = BFD_ALIGN (vma, adata(abfd).segment_size);
998 vma = obj_datasec(abfd)->vma;
1000 /* Since BSS follows data immediately, see if it needs alignment. */
1001 vma += obj_datasec(abfd)->_raw_size;
1002 pad = align_power (vma, obj_bsssec(abfd)->alignment_power) - vma;
1003 obj_datasec(abfd)->_raw_size += pad;
1004 pos += obj_datasec(abfd)->_raw_size;
1007 if (!obj_bsssec(abfd)->user_set_vma)
1008 obj_bsssec(abfd)->vma = vma;
1010 vma = obj_bsssec(abfd)->vma;
1012 /* Fix up exec header. */
1013 execp->a_text = obj_textsec(abfd)->_raw_size;
1014 execp->a_data = obj_datasec(abfd)->_raw_size;
1015 execp->a_bss = obj_bsssec(abfd)->_raw_size;
1016 N_SET_MAGIC (*execp, NMAGIC);
1020 NAME(aout,adjust_sizes_and_vmas) (abfd, text_size, text_end)
1022 bfd_size_type *text_size;
1025 struct internal_exec *execp = exec_hdr (abfd);
1027 if (! NAME(aout,make_sections) (abfd))
1030 if (adata(abfd).magic != undecided_magic)
1033 obj_textsec(abfd)->_raw_size =
1034 align_power(obj_textsec(abfd)->_raw_size,
1035 obj_textsec(abfd)->alignment_power);
1037 *text_size = obj_textsec (abfd)->_raw_size;
1038 /* Rule (heuristic) for when to pad to a new page. Note that there
1039 are (at least) two ways demand-paged (ZMAGIC) files have been
1040 handled. Most Berkeley-based systems start the text segment at
1041 (PAGE_SIZE). However, newer versions of SUNOS start the text
1042 segment right after the exec header; the latter is counted in the
1043 text segment size, and is paged in by the kernel with the rest of
1046 /* This perhaps isn't the right way to do this, but made it simpler for me
1047 to understand enough to implement it. Better would probably be to go
1048 right from BFD flags to alignment/positioning characteristics. But the
1049 old code was sloppy enough about handling the flags, and had enough
1050 other magic, that it was a little hard for me to understand. I think
1051 I understand it better now, but I haven't time to do the cleanup this
1054 if (abfd->flags & D_PAGED)
1055 /* Whether or not WP_TEXT is set -- let D_PAGED override. */
1056 adata(abfd).magic = z_magic;
1057 else if (abfd->flags & WP_TEXT)
1058 adata(abfd).magic = n_magic;
1060 adata(abfd).magic = o_magic;
1062 #ifdef BFD_AOUT_DEBUG /* requires gcc2 */
1064 fprintf (stderr, "%s text=<%x,%x,%x> data=<%x,%x,%x> bss=<%x,%x,%x>\n",
1066 switch (adata(abfd).magic) {
1067 case n_magic: str = "NMAGIC"; break;
1068 case o_magic: str = "OMAGIC"; break;
1069 case z_magic: str = "ZMAGIC"; break;
1074 obj_textsec(abfd)->vma, obj_textsec(abfd)->_raw_size,
1075 obj_textsec(abfd)->alignment_power,
1076 obj_datasec(abfd)->vma, obj_datasec(abfd)->_raw_size,
1077 obj_datasec(abfd)->alignment_power,
1078 obj_bsssec(abfd)->vma, obj_bsssec(abfd)->_raw_size,
1079 obj_bsssec(abfd)->alignment_power);
1083 switch (adata(abfd).magic)
1086 adjust_o_magic (abfd, execp);
1089 adjust_z_magic (abfd, execp);
1092 adjust_n_magic (abfd, execp);
1098 #ifdef BFD_AOUT_DEBUG
1099 fprintf (stderr, " text=<%x,%x,%x> data=<%x,%x,%x> bss=<%x,%x>\n",
1100 obj_textsec(abfd)->vma, obj_textsec(abfd)->_raw_size,
1101 obj_textsec(abfd)->filepos,
1102 obj_datasec(abfd)->vma, obj_datasec(abfd)->_raw_size,
1103 obj_datasec(abfd)->filepos,
1104 obj_bsssec(abfd)->vma, obj_bsssec(abfd)->_raw_size);
1112 aout_@var{size}_new_section_hook
1115 boolean aout_@var{size}_new_section_hook,
1117 asection *newsect));
1120 Called by the BFD in response to a @code{bfd_make_section}
1124 NAME(aout,new_section_hook) (abfd, newsect)
1128 /* align to double at least */
1129 newsect->alignment_power = bfd_get_arch_info(abfd)->section_align_power;
1132 if (bfd_get_format (abfd) == bfd_object)
1134 if (obj_textsec(abfd) == NULL && !strcmp(newsect->name, ".text")) {
1135 obj_textsec(abfd)= newsect;
1136 newsect->target_index = N_TEXT;
1140 if (obj_datasec(abfd) == NULL && !strcmp(newsect->name, ".data")) {
1141 obj_datasec(abfd) = newsect;
1142 newsect->target_index = N_DATA;
1146 if (obj_bsssec(abfd) == NULL && !strcmp(newsect->name, ".bss")) {
1147 obj_bsssec(abfd) = newsect;
1148 newsect->target_index = N_BSS;
1154 /* We allow more than three sections internally */
1159 NAME(aout,set_section_contents) (abfd, section, location, offset, count)
1164 bfd_size_type count;
1167 bfd_size_type text_size;
1169 if (! abfd->output_has_begun)
1171 if (! NAME(aout,adjust_sizes_and_vmas) (abfd, &text_size, &text_end))
1175 if (section == obj_bsssec (abfd))
1177 bfd_set_error (bfd_error_no_contents);
1181 if (section != obj_textsec (abfd)
1182 && section != obj_datasec (abfd))
1184 bfd_set_error (bfd_error_nonrepresentable_section);
1190 if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
1191 || bfd_write (location, 1, count, abfd) != count)
1198 /* Read the external symbols from an a.out file. */
1201 aout_get_external_symbols (abfd)
1204 if (obj_aout_external_syms (abfd) == (struct external_nlist *) NULL)
1206 bfd_size_type count;
1207 struct external_nlist *syms;
1209 count = exec_hdr (abfd)->a_syms / EXTERNAL_NLIST_SIZE;
1211 /* We allocate using malloc to make the values easy to free
1212 later on. If we put them on the obstack it might not be
1213 possible to free them. */
1214 syms = ((struct external_nlist *)
1215 malloc ((size_t) count * EXTERNAL_NLIST_SIZE));
1216 if (syms == (struct external_nlist *) NULL && count != 0)
1218 bfd_set_error (bfd_error_no_memory);
1222 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
1223 || (bfd_read (syms, 1, exec_hdr (abfd)->a_syms, abfd)
1224 != exec_hdr (abfd)->a_syms))
1230 obj_aout_external_syms (abfd) = syms;
1231 obj_aout_external_sym_count (abfd) = count;
1234 if (obj_aout_external_strings (abfd) == NULL
1235 && exec_hdr (abfd)->a_syms != 0)
1237 unsigned char string_chars[BYTES_IN_WORD];
1238 bfd_size_type stringsize;
1241 /* Get the size of the strings. */
1242 if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0
1243 || (bfd_read ((PTR) string_chars, BYTES_IN_WORD, 1, abfd)
1246 stringsize = GET_WORD (abfd, string_chars);
1248 strings = (char *) malloc ((size_t) stringsize + 1);
1249 if (strings == NULL)
1251 bfd_set_error (bfd_error_no_memory);
1255 /* Skip space for the string count in the buffer for convenience
1256 when using indexes. */
1257 if (bfd_read (strings + BYTES_IN_WORD, 1, stringsize - BYTES_IN_WORD,
1259 != stringsize - BYTES_IN_WORD)
1265 /* Ensure that a zero index yields an empty string. */
1268 /* Sanity preservation. */
1269 strings[stringsize] = '\0';
1271 obj_aout_external_strings (abfd) = strings;
1272 obj_aout_external_string_size (abfd) = stringsize;
1278 /* Translate an a.out symbol into a BFD symbol. The desc, other, type
1279 and symbol->value fields of CACHE_PTR will be set from the a.out
1280 nlist structure. This function is responsible for setting
1281 symbol->flags and symbol->section, and adjusting symbol->value. */
1284 translate_from_native_sym_flags (abfd, cache_ptr)
1286 aout_symbol_type *cache_ptr;
1290 if ((cache_ptr->type & N_STAB) != 0
1291 || cache_ptr->type == N_FN)
1295 /* This is a debugging symbol. */
1297 cache_ptr->symbol.flags = BSF_DEBUGGING;
1299 /* Work out the symbol section. */
1300 switch (cache_ptr->type & N_TYPE)
1304 sec = obj_textsec (abfd);
1307 sec = obj_datasec (abfd);
1310 sec = obj_bsssec (abfd);
1314 sec = bfd_abs_section_ptr;
1318 cache_ptr->symbol.section = sec;
1319 cache_ptr->symbol.value -= sec->vma;
1324 /* Get the default visibility. This does not apply to all types, so
1325 we just hold it in a local variable to use if wanted. */
1326 if ((cache_ptr->type & N_EXT) == 0)
1327 visible = BSF_LOCAL;
1329 visible = BSF_GLOBAL;
1331 switch (cache_ptr->type)
1334 case N_ABS: case N_ABS | N_EXT:
1335 cache_ptr->symbol.section = bfd_abs_section_ptr;
1336 cache_ptr->symbol.flags = visible;
1339 case N_UNDF | N_EXT:
1340 if (cache_ptr->symbol.value != 0)
1342 /* This is a common symbol. */
1343 cache_ptr->symbol.flags = BSF_GLOBAL;
1344 cache_ptr->symbol.section = bfd_com_section_ptr;
1348 cache_ptr->symbol.flags = 0;
1349 cache_ptr->symbol.section = bfd_und_section_ptr;
1353 case N_TEXT: case N_TEXT | N_EXT:
1354 cache_ptr->symbol.section = obj_textsec (abfd);
1355 cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
1356 cache_ptr->symbol.flags = visible;
1359 /* N_SETV symbols used to represent set vectors placed in the
1360 data section. They are no longer generated. Theoretically,
1361 it was possible to extract the entries and combine them with
1362 new ones, although I don't know if that was ever actually
1363 done. Unless that feature is restored, treat them as data
1365 case N_SETV: case N_SETV | N_EXT:
1366 case N_DATA: case N_DATA | N_EXT:
1367 cache_ptr->symbol.section = obj_datasec (abfd);
1368 cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
1369 cache_ptr->symbol.flags = visible;
1372 case N_BSS: case N_BSS | N_EXT:
1373 cache_ptr->symbol.section = obj_bsssec (abfd);
1374 cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
1375 cache_ptr->symbol.flags = visible;
1378 case N_SETA: case N_SETA | N_EXT:
1379 case N_SETT: case N_SETT | N_EXT:
1380 case N_SETD: case N_SETD | N_EXT:
1381 case N_SETB: case N_SETB | N_EXT:
1384 arelent_chain *reloc;
1385 asection *into_section;
1387 /* This is a set symbol. The name of the symbol is the name
1388 of the set (e.g., __CTOR_LIST__). The value of the symbol
1389 is the value to add to the set. We create a section with
1390 the same name as the symbol, and add a reloc to insert the
1391 appropriate value into the section.
1393 This action is actually obsolete; it used to make the
1394 linker do the right thing, but the linker no longer uses
1397 section = bfd_get_section_by_name (abfd, cache_ptr->symbol.name);
1398 if (section == NULL)
1402 copy = bfd_alloc (abfd, strlen (cache_ptr->symbol.name) + 1);
1405 bfd_set_error (bfd_error_no_memory);
1409 strcpy (copy, cache_ptr->symbol.name);
1410 section = bfd_make_section (abfd, copy);
1411 if (section == NULL)
1415 reloc = (arelent_chain *) bfd_alloc (abfd, sizeof (arelent_chain));
1418 bfd_set_error (bfd_error_no_memory);
1422 /* Build a relocation entry for the constructor. */
1423 switch (cache_ptr->type & N_TYPE)
1426 into_section = bfd_abs_section_ptr;
1427 cache_ptr->type = N_ABS;
1430 into_section = obj_textsec (abfd);
1431 cache_ptr->type = N_TEXT;
1434 into_section = obj_datasec (abfd);
1435 cache_ptr->type = N_DATA;
1438 into_section = obj_bsssec (abfd);
1439 cache_ptr->type = N_BSS;
1443 /* Build a relocation pointing into the constructor section
1444 pointing at the symbol in the set vector specified. */
1445 reloc->relent.addend = cache_ptr->symbol.value;
1446 cache_ptr->symbol.section = into_section;
1447 reloc->relent.sym_ptr_ptr = into_section->symbol_ptr_ptr;
1449 /* We modify the symbol to belong to a section depending upon
1450 the name of the symbol, and add to the size of the section
1451 to contain a pointer to the symbol. Build a reloc entry to
1452 relocate to this symbol attached to this section. */
1453 section->flags = SEC_CONSTRUCTOR | SEC_RELOC;
1455 section->reloc_count++;
1456 section->alignment_power = 2;
1458 reloc->next = section->constructor_chain;
1459 section->constructor_chain = reloc;
1460 reloc->relent.address = section->_raw_size;
1461 section->_raw_size += BYTES_IN_WORD;
1463 reloc->relent.howto = CTOR_TABLE_RELOC_HOWTO(abfd);
1465 cache_ptr->symbol.flags |= BSF_CONSTRUCTOR;
1470 /* This symbol is the text of a warning message. The next
1471 symbol is the symbol to associate the warning with. If a
1472 reference is made to that symbol, a warning is issued. */
1473 cache_ptr->symbol.flags = BSF_DEBUGGING | BSF_WARNING;
1475 /* @@ Stuffing pointers into integers is a no-no. We can
1476 usually get away with it if the integer is large enough
1478 if (sizeof (cache_ptr + 1) > sizeof (bfd_vma))
1480 cache_ptr->symbol.value = (bfd_vma) (cache_ptr + 1);
1482 cache_ptr->symbol.section = bfd_abs_section_ptr;
1486 case N_INDR: case N_INDR | N_EXT:
1487 /* An indirect symbol. This consists of two symbols in a row.
1488 The first symbol is the name of the indirection. The second
1489 symbol is the name of the target. A reference to the first
1490 symbol becomes a reference to the second. */
1491 cache_ptr->symbol.flags = BSF_DEBUGGING | BSF_INDIRECT | visible;
1493 /* @@ Stuffing pointers into integers is a no-no. We can
1494 usually get away with it if the integer is large enough
1496 if (sizeof (cache_ptr + 1) > sizeof (bfd_vma))
1498 cache_ptr->symbol.value = (bfd_vma) (cache_ptr + 1);
1500 cache_ptr->symbol.section = bfd_ind_section_ptr;
1505 cache_ptr->symbol.section = bfd_und_section_ptr;
1506 cache_ptr->symbol.flags = BSF_WEAK;
1510 cache_ptr->symbol.section = bfd_abs_section_ptr;
1511 cache_ptr->symbol.flags = BSF_WEAK;
1515 cache_ptr->symbol.section = obj_textsec (abfd);
1516 cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
1517 cache_ptr->symbol.flags = BSF_WEAK;
1521 cache_ptr->symbol.section = obj_datasec (abfd);
1522 cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
1523 cache_ptr->symbol.flags = BSF_WEAK;
1527 cache_ptr->symbol.section = obj_bsssec (abfd);
1528 cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
1529 cache_ptr->symbol.flags = BSF_WEAK;
1536 /* Set the fields of SYM_POINTER according to CACHE_PTR. */
1539 translate_to_native_sym_flags (abfd, cache_ptr, sym_pointer)
1542 struct external_nlist *sym_pointer;
1544 bfd_vma value = cache_ptr->value;
1546 /* Mask out any existing type bits in case copying from one section
1548 sym_pointer->e_type[0] &= ~N_TYPE;
1550 if (bfd_is_abs_section (bfd_get_section (cache_ptr)))
1551 sym_pointer->e_type[0] |= N_ABS;
1552 else if (bfd_get_section (cache_ptr) == obj_textsec (abfd)
1553 || (bfd_get_section (cache_ptr)->output_section
1554 == obj_textsec (abfd)))
1555 sym_pointer->e_type[0] |= N_TEXT;
1556 else if (bfd_get_section (cache_ptr) == obj_datasec (abfd)
1557 || (bfd_get_section (cache_ptr)->output_section
1558 == obj_datasec (abfd)))
1559 sym_pointer->e_type[0] |= N_DATA;
1560 else if (bfd_get_section (cache_ptr) == obj_bsssec (abfd)
1561 || (bfd_get_section (cache_ptr)->output_section
1562 == obj_bsssec (abfd)))
1563 sym_pointer->e_type[0] |= N_BSS;
1564 else if (bfd_get_section (cache_ptr) == NULL)
1566 /* Protect the bfd_is_com_section call. This case occurs, e.g.,
1567 for the *DEBUG* section of a COFF file. */
1568 bfd_set_error (bfd_error_nonrepresentable_section);
1571 else if (bfd_is_und_section (bfd_get_section (cache_ptr)))
1572 sym_pointer->e_type[0] = N_UNDF | N_EXT;
1573 else if (bfd_is_ind_section (bfd_get_section (cache_ptr)))
1574 sym_pointer->e_type[0] = N_INDR;
1575 else if (bfd_is_com_section (bfd_get_section (cache_ptr)))
1576 sym_pointer->e_type[0] = N_UNDF | N_EXT;
1579 bfd_set_error (bfd_error_nonrepresentable_section);
1583 /* Turn the symbol from section relative to absolute again */
1584 if (cache_ptr->section->output_section != NULL)
1585 value += (cache_ptr->section->output_section->vma
1586 + cache_ptr->section->output_offset);
1588 value += cache_ptr->section->vma;
1590 if ((cache_ptr->flags & BSF_WARNING) != 0)
1591 sym_pointer->e_type[0] = N_WARNING;
1593 if ((cache_ptr->flags & BSF_DEBUGGING) != 0)
1594 sym_pointer->e_type[0] = ((aout_symbol_type *) cache_ptr)->type;
1595 else if ((cache_ptr->flags & BSF_GLOBAL) != 0)
1596 sym_pointer->e_type[0] |= N_EXT;
1598 if ((cache_ptr->flags & BSF_CONSTRUCTOR) != 0)
1600 int type = ((aout_symbol_type *) cache_ptr)->type;
1603 case N_ABS: type = N_SETA; break;
1604 case N_TEXT: type = N_SETT; break;
1605 case N_DATA: type = N_SETD; break;
1606 case N_BSS: type = N_SETB; break;
1608 sym_pointer->e_type[0] = type;
1611 if ((cache_ptr->flags & BSF_WEAK) != 0)
1615 switch (sym_pointer->e_type[0] & N_TYPE)
1618 case N_ABS: type = N_WEAKA; break;
1619 case N_TEXT: type = N_WEAKT; break;
1620 case N_DATA: type = N_WEAKD; break;
1621 case N_BSS: type = N_WEAKB; break;
1622 case N_UNDF: type = N_WEAKU; break;
1624 sym_pointer->e_type[0] = type;
1627 PUT_WORD(abfd, value, sym_pointer->e_value);
1632 /* Native-level interface to symbols. */
1635 NAME(aout,make_empty_symbol) (abfd)
1638 aout_symbol_type *new =
1639 (aout_symbol_type *)bfd_zalloc (abfd, sizeof (aout_symbol_type));
1642 bfd_set_error (bfd_error_no_memory);
1645 new->symbol.the_bfd = abfd;
1647 return &new->symbol;
1650 /* Translate a set of internal symbols into external symbols. */
1653 NAME(aout,translate_symbol_table) (abfd, in, ext, count, str, strsize, dynamic)
1655 aout_symbol_type *in;
1656 struct external_nlist *ext;
1657 bfd_size_type count;
1659 bfd_size_type strsize;
1662 struct external_nlist *ext_end;
1664 ext_end = ext + count;
1665 for (; ext < ext_end; ext++, in++)
1669 x = GET_WORD (abfd, ext->e_strx);
1670 in->symbol.the_bfd = abfd;
1672 /* For the normal symbols, the zero index points at the number
1673 of bytes in the string table but is to be interpreted as the
1674 null string. For the dynamic symbols, the number of bytes in
1675 the string table is stored in the __DYNAMIC structure and the
1676 zero index points at an actual string. */
1677 if (x == 0 && ! dynamic)
1678 in->symbol.name = "";
1679 else if (x < strsize)
1680 in->symbol.name = str + x;
1684 in->symbol.value = GET_SWORD (abfd, ext->e_value);
1685 in->desc = bfd_h_get_16 (abfd, ext->e_desc);
1686 in->other = bfd_h_get_8 (abfd, ext->e_other);
1687 in->type = bfd_h_get_8 (abfd, ext->e_type);
1688 in->symbol.udata.p = NULL;
1690 if (! translate_from_native_sym_flags (abfd, in))
1694 in->symbol.flags |= BSF_DYNAMIC;
1700 /* We read the symbols into a buffer, which is discarded when this
1701 function exits. We read the strings into a buffer large enough to
1702 hold them all plus all the cached symbol entries. */
1705 NAME(aout,slurp_symbol_table) (abfd)
1708 struct external_nlist *old_external_syms;
1709 aout_symbol_type *cached;
1712 /* If there's no work to be done, don't do any */
1713 if (obj_aout_symbols (abfd) != (aout_symbol_type *) NULL)
1716 old_external_syms = obj_aout_external_syms (abfd);
1718 if (! aout_get_external_symbols (abfd))
1721 cached_size = (obj_aout_external_sym_count (abfd)
1722 * sizeof (aout_symbol_type));
1723 cached = (aout_symbol_type *) malloc (cached_size);
1724 if (cached == NULL && cached_size != 0)
1726 bfd_set_error (bfd_error_no_memory);
1729 if (cached_size != 0)
1730 memset (cached, 0, cached_size);
1732 /* Convert from external symbol information to internal. */
1733 if (! (NAME(aout,translate_symbol_table)
1735 obj_aout_external_syms (abfd),
1736 obj_aout_external_sym_count (abfd),
1737 obj_aout_external_strings (abfd),
1738 obj_aout_external_string_size (abfd),
1745 bfd_get_symcount (abfd) = obj_aout_external_sym_count (abfd);
1747 obj_aout_symbols (abfd) = cached;
1749 /* It is very likely that anybody who calls this function will not
1750 want the external symbol information, so if it was allocated
1751 because of our call to aout_get_external_symbols, we free it up
1752 right away to save space. */
1753 if (old_external_syms == (struct external_nlist *) NULL
1754 && obj_aout_external_syms (abfd) != (struct external_nlist *) NULL)
1756 free (obj_aout_external_syms (abfd));
1757 obj_aout_external_syms (abfd) = NULL;
1763 /* We use a hash table when writing out symbols so that we only write
1764 out a particular string once. This helps particularly when the
1765 linker writes out stabs debugging entries, because each different
1766 contributing object file tends to have many duplicate stabs
1769 This hash table code breaks dbx on SunOS 4.1.3, so we don't do it
1770 if BFD_TRADITIONAL_FORMAT is set. */
1772 static bfd_size_type add_to_stringtab
1773 PARAMS ((bfd *, struct bfd_strtab_hash *, const char *, boolean));
1774 static boolean emit_stringtab PARAMS ((bfd *, struct bfd_strtab_hash *));
1776 /* Get the index of a string in a strtab, adding it if it is not
1779 static INLINE bfd_size_type
1780 add_to_stringtab (abfd, tab, str, copy)
1782 struct bfd_strtab_hash *tab;
1787 bfd_size_type index;
1789 /* An index of 0 always means the empty string. */
1790 if (str == 0 || *str == '\0')
1793 /* Don't hash if BFD_TRADITIONAL_FORMAT is set, because SunOS dbx
1794 doesn't understand a hashed string table. */
1796 if ((abfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
1799 index = _bfd_stringtab_add (tab, str, hash, copy);
1801 if (index != (bfd_size_type) -1)
1803 /* Add BYTES_IN_WORD to the return value to account for the
1804 space taken up by the string table size. */
1805 index += BYTES_IN_WORD;
1811 /* Write out a strtab. ABFD is already at the right location in the
1815 emit_stringtab (abfd, tab)
1817 struct bfd_strtab_hash *tab;
1819 bfd_byte buffer[BYTES_IN_WORD];
1821 /* The string table starts with the size. */
1822 PUT_WORD (abfd, _bfd_stringtab_size (tab) + BYTES_IN_WORD, buffer);
1823 if (bfd_write ((PTR) buffer, 1, BYTES_IN_WORD, abfd) != BYTES_IN_WORD)
1826 return _bfd_stringtab_emit (abfd, tab);
1830 NAME(aout,write_syms) (abfd)
1833 unsigned int count ;
1834 asymbol **generic = bfd_get_outsymbols (abfd);
1835 struct bfd_strtab_hash *strtab;
1837 strtab = _bfd_stringtab_init ();
1841 for (count = 0; count < bfd_get_symcount (abfd); count++)
1843 asymbol *g = generic[count];
1845 struct external_nlist nsp;
1847 indx = add_to_stringtab (abfd, strtab, g->name, false);
1848 if (indx == (bfd_size_type) -1)
1850 PUT_WORD (abfd, indx, (bfd_byte *) nsp.e_strx);
1852 if (bfd_asymbol_flavour(g) == abfd->xvec->flavour)
1854 bfd_h_put_16(abfd, aout_symbol(g)->desc, nsp.e_desc);
1855 bfd_h_put_8(abfd, aout_symbol(g)->other, nsp.e_other);
1856 bfd_h_put_8(abfd, aout_symbol(g)->type, nsp.e_type);
1860 bfd_h_put_16(abfd,0, nsp.e_desc);
1861 bfd_h_put_8(abfd, 0, nsp.e_other);
1862 bfd_h_put_8(abfd, 0, nsp.e_type);
1865 if (! translate_to_native_sym_flags (abfd, g, &nsp))
1868 if (bfd_write((PTR)&nsp,1,EXTERNAL_NLIST_SIZE, abfd)
1869 != EXTERNAL_NLIST_SIZE)
1872 /* NB: `KEEPIT' currently overlays `flags', so set this only
1873 here, at the end. */
1877 if (! emit_stringtab (abfd, strtab))
1880 _bfd_stringtab_free (strtab);
1885 _bfd_stringtab_free (strtab);
1891 NAME(aout,get_symtab) (abfd, location)
1895 unsigned int counter = 0;
1896 aout_symbol_type *symbase;
1898 if (!NAME(aout,slurp_symbol_table)(abfd))
1901 for (symbase = obj_aout_symbols(abfd); counter++ < bfd_get_symcount (abfd);)
1902 *(location++) = (asymbol *)( symbase++);
1904 return bfd_get_symcount (abfd);
1908 /* Standard reloc stuff */
1909 /* Output standard relocation information to a file in target byte order. */
1912 NAME(aout,swap_std_reloc_out) (abfd, g, natptr)
1915 struct reloc_std_external *natptr;
1918 asymbol *sym = *(g->sym_ptr_ptr);
1920 unsigned int r_length;
1922 int r_baserel, r_jmptable, r_relative;
1923 asection *output_section = sym->section->output_section;
1925 PUT_WORD(abfd, g->address, natptr->r_address);
1927 r_length = g->howto->size ; /* Size as a power of two */
1928 r_pcrel = (int) g->howto->pc_relative; /* Relative to PC? */
1929 /* XXX This relies on relocs coming from a.out files. */
1930 r_baserel = (g->howto->type & 8) != 0;
1931 r_jmptable = (g->howto->type & 16) != 0;
1932 r_relative = (g->howto->type & 32) != 0;
1935 /* For a standard reloc, the addend is in the object file. */
1936 r_addend = g->addend + (*(g->sym_ptr_ptr))->section->output_section->vma;
1939 /* name was clobbered by aout_write_syms to be symbol index */
1941 /* If this relocation is relative to a symbol then set the
1942 r_index to the symbols index, and the r_extern bit.
1944 Absolute symbols can come in in two ways, either as an offset
1945 from the abs section, or as a symbol which has an abs value.
1950 if (bfd_is_com_section (output_section)
1951 || bfd_is_abs_section (output_section)
1952 || bfd_is_und_section (output_section))
1954 if (bfd_abs_section_ptr->symbol == sym)
1956 /* Whoops, looked like an abs symbol, but is really an offset
1957 from the abs section */
1963 /* Fill in symbol */
1965 r_index = stoi((*(g->sym_ptr_ptr))->KEEPIT);
1971 /* Just an ordinary section */
1973 r_index = output_section->target_index;
1976 /* now the fun stuff */
1977 if (abfd->xvec->header_byteorder_big_p != false) {
1978 natptr->r_index[0] = r_index >> 16;
1979 natptr->r_index[1] = r_index >> 8;
1980 natptr->r_index[2] = r_index;
1982 (r_extern? RELOC_STD_BITS_EXTERN_BIG: 0)
1983 | (r_pcrel? RELOC_STD_BITS_PCREL_BIG: 0)
1984 | (r_baserel? RELOC_STD_BITS_BASEREL_BIG: 0)
1985 | (r_jmptable? RELOC_STD_BITS_JMPTABLE_BIG: 0)
1986 | (r_relative? RELOC_STD_BITS_RELATIVE_BIG: 0)
1987 | (r_length << RELOC_STD_BITS_LENGTH_SH_BIG);
1989 natptr->r_index[2] = r_index >> 16;
1990 natptr->r_index[1] = r_index >> 8;
1991 natptr->r_index[0] = r_index;
1993 (r_extern? RELOC_STD_BITS_EXTERN_LITTLE: 0)
1994 | (r_pcrel? RELOC_STD_BITS_PCREL_LITTLE: 0)
1995 | (r_baserel? RELOC_STD_BITS_BASEREL_LITTLE: 0)
1996 | (r_jmptable? RELOC_STD_BITS_JMPTABLE_LITTLE: 0)
1997 | (r_relative? RELOC_STD_BITS_RELATIVE_LITTLE: 0)
1998 | (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE);
2003 /* Extended stuff */
2004 /* Output extended relocation information to a file in target byte order. */
2007 NAME(aout,swap_ext_reloc_out) (abfd, g, natptr)
2010 register struct reloc_ext_external *natptr;
2014 unsigned int r_type;
2015 unsigned int r_addend;
2016 asymbol *sym = *(g->sym_ptr_ptr);
2017 asection *output_section = sym->section->output_section;
2019 PUT_WORD (abfd, g->address, natptr->r_address);
2021 r_type = (unsigned int) g->howto->type;
2023 r_addend = g->addend + (*(g->sym_ptr_ptr))->section->output_section->vma;
2025 /* If this relocation is relative to a symbol then set the
2026 r_index to the symbols index, and the r_extern bit.
2028 Absolute symbols can come in in two ways, either as an offset
2029 from the abs section, or as a symbol which has an abs value.
2030 check for that here. */
2032 if (bfd_is_com_section (output_section)
2033 || bfd_is_abs_section (output_section)
2034 || bfd_is_und_section (output_section))
2036 if (bfd_abs_section_ptr->symbol == sym)
2038 /* Whoops, looked like an abs symbol, but is really an offset
2039 from the abs section */
2046 r_index = stoi((*(g->sym_ptr_ptr))->KEEPIT);
2051 /* Just an ordinary section */
2053 r_index = output_section->target_index;
2056 /* now the fun stuff */
2057 if (abfd->xvec->header_byteorder_big_p != false) {
2058 natptr->r_index[0] = r_index >> 16;
2059 natptr->r_index[1] = r_index >> 8;
2060 natptr->r_index[2] = r_index;
2062 ((r_extern? RELOC_EXT_BITS_EXTERN_BIG: 0)
2063 | (r_type << RELOC_EXT_BITS_TYPE_SH_BIG));
2065 natptr->r_index[2] = r_index >> 16;
2066 natptr->r_index[1] = r_index >> 8;
2067 natptr->r_index[0] = r_index;
2069 (r_extern? RELOC_EXT_BITS_EXTERN_LITTLE: 0)
2070 | (r_type << RELOC_EXT_BITS_TYPE_SH_LITTLE);
2073 PUT_WORD (abfd, r_addend, natptr->r_addend);
2076 /* BFD deals internally with all things based from the section they're
2077 in. so, something in 10 bytes into a text section with a base of
2078 50 would have a symbol (.text+10) and know .text vma was 50.
2080 Aout keeps all it's symbols based from zero, so the symbol would
2081 contain 60. This macro subs the base of each section from the value
2082 to give the true offset from the section */
2085 #define MOVE_ADDRESS(ad) \
2087 /* undefined symbol */ \
2088 cache_ptr->sym_ptr_ptr = symbols + r_index; \
2089 cache_ptr->addend = ad; \
2091 /* defined, section relative. replace symbol with pointer to \
2092 symbol which points to section */ \
2093 switch (r_index) { \
2095 case N_TEXT | N_EXT: \
2096 cache_ptr->sym_ptr_ptr = obj_textsec(abfd)->symbol_ptr_ptr; \
2097 cache_ptr->addend = ad - su->textsec->vma; \
2100 case N_DATA | N_EXT: \
2101 cache_ptr->sym_ptr_ptr = obj_datasec(abfd)->symbol_ptr_ptr; \
2102 cache_ptr->addend = ad - su->datasec->vma; \
2105 case N_BSS | N_EXT: \
2106 cache_ptr->sym_ptr_ptr = obj_bsssec(abfd)->symbol_ptr_ptr; \
2107 cache_ptr->addend = ad - su->bsssec->vma; \
2111 case N_ABS | N_EXT: \
2112 cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; \
2113 cache_ptr->addend = ad; \
2119 NAME(aout,swap_ext_reloc_in) (abfd, bytes, cache_ptr, symbols)
2121 struct reloc_ext_external *bytes;
2127 unsigned int r_type;
2128 struct aoutdata *su = &(abfd->tdata.aout_data->a);
2130 cache_ptr->address = (GET_SWORD (abfd, bytes->r_address));
2132 /* now the fun stuff */
2133 if (abfd->xvec->header_byteorder_big_p != false) {
2134 r_index = (bytes->r_index[0] << 16)
2135 | (bytes->r_index[1] << 8)
2136 | bytes->r_index[2];
2137 r_extern = (0 != (bytes->r_type[0] & RELOC_EXT_BITS_EXTERN_BIG));
2138 r_type = (bytes->r_type[0] & RELOC_EXT_BITS_TYPE_BIG)
2139 >> RELOC_EXT_BITS_TYPE_SH_BIG;
2141 r_index = (bytes->r_index[2] << 16)
2142 | (bytes->r_index[1] << 8)
2143 | bytes->r_index[0];
2144 r_extern = (0 != (bytes->r_type[0] & RELOC_EXT_BITS_EXTERN_LITTLE));
2145 r_type = (bytes->r_type[0] & RELOC_EXT_BITS_TYPE_LITTLE)
2146 >> RELOC_EXT_BITS_TYPE_SH_LITTLE;
2149 if (r_extern && r_index > bfd_get_symcount (abfd))
2151 /* We could arrange to return an error, but it might be useful
2152 to see the file even if it is bad. */
2157 cache_ptr->howto = howto_table_ext + r_type;
2158 MOVE_ADDRESS(GET_SWORD(abfd, bytes->r_addend));
2162 NAME(aout,swap_std_reloc_in) (abfd, bytes, cache_ptr, symbols)
2164 struct reloc_std_external *bytes;
2170 unsigned int r_length;
2172 int r_baserel, r_jmptable, r_relative;
2173 struct aoutdata *su = &(abfd->tdata.aout_data->a);
2176 cache_ptr->address = bfd_h_get_32 (abfd, bytes->r_address);
2178 /* now the fun stuff */
2179 if (abfd->xvec->header_byteorder_big_p != false) {
2180 r_index = (bytes->r_index[0] << 16)
2181 | (bytes->r_index[1] << 8)
2182 | bytes->r_index[2];
2183 r_extern = (0 != (bytes->r_type[0] & RELOC_STD_BITS_EXTERN_BIG));
2184 r_pcrel = (0 != (bytes->r_type[0] & RELOC_STD_BITS_PCREL_BIG));
2185 r_baserel = (0 != (bytes->r_type[0] & RELOC_STD_BITS_BASEREL_BIG));
2186 r_jmptable= (0 != (bytes->r_type[0] & RELOC_STD_BITS_JMPTABLE_BIG));
2187 r_relative= (0 != (bytes->r_type[0] & RELOC_STD_BITS_RELATIVE_BIG));
2188 r_length = (bytes->r_type[0] & RELOC_STD_BITS_LENGTH_BIG)
2189 >> RELOC_STD_BITS_LENGTH_SH_BIG;
2191 r_index = (bytes->r_index[2] << 16)
2192 | (bytes->r_index[1] << 8)
2193 | bytes->r_index[0];
2194 r_extern = (0 != (bytes->r_type[0] & RELOC_STD_BITS_EXTERN_LITTLE));
2195 r_pcrel = (0 != (bytes->r_type[0] & RELOC_STD_BITS_PCREL_LITTLE));
2196 r_baserel = (0 != (bytes->r_type[0] & RELOC_STD_BITS_BASEREL_LITTLE));
2197 r_jmptable= (0 != (bytes->r_type[0] & RELOC_STD_BITS_JMPTABLE_LITTLE));
2198 r_relative= (0 != (bytes->r_type[0] & RELOC_STD_BITS_RELATIVE_LITTLE));
2199 r_length = (bytes->r_type[0] & RELOC_STD_BITS_LENGTH_LITTLE)
2200 >> RELOC_STD_BITS_LENGTH_SH_LITTLE;
2203 howto_idx = r_length + 4 * r_pcrel + 8 * r_baserel
2204 + 16 * r_jmptable + 32 * r_relative;
2205 BFD_ASSERT (howto_idx < TABLE_SIZE (howto_table_std));
2206 cache_ptr->howto = howto_table_std + howto_idx;
2207 BFD_ASSERT (cache_ptr->howto->type != -1);
2209 if (r_extern && r_index > bfd_get_symcount (abfd))
2211 /* We could arrange to return an error, but it might be useful
2212 to see the file even if it is bad. */
2220 /* Read and swap the relocs for a section. */
2223 NAME(aout,slurp_reloc_table) (abfd, asect, symbols)
2229 bfd_size_type reloc_size;
2231 arelent *reloc_cache;
2233 unsigned int counter = 0;
2236 if (asect->relocation)
2239 if (asect->flags & SEC_CONSTRUCTOR)
2242 if (asect == obj_datasec (abfd))
2243 reloc_size = exec_hdr(abfd)->a_drsize;
2244 else if (asect == obj_textsec (abfd))
2245 reloc_size = exec_hdr(abfd)->a_trsize;
2246 else if (asect == obj_bsssec (abfd))
2250 bfd_set_error (bfd_error_invalid_operation);
2254 if (bfd_seek (abfd, asect->rel_filepos, SEEK_SET) != 0)
2257 each_size = obj_reloc_entry_size (abfd);
2259 count = reloc_size / each_size;
2261 reloc_cache = (arelent *) malloc ((size_t) (count * sizeof (arelent)));
2262 if (reloc_cache == NULL && count != 0)
2264 bfd_set_error (bfd_error_no_memory);
2267 memset (reloc_cache, 0, count * sizeof (arelent));
2269 relocs = malloc (reloc_size);
2270 if (relocs == NULL && reloc_size != 0)
2273 bfd_set_error (bfd_error_no_memory);
2277 if (bfd_read (relocs, 1, reloc_size, abfd) != reloc_size)
2284 cache_ptr = reloc_cache;
2285 if (each_size == RELOC_EXT_SIZE)
2287 register struct reloc_ext_external *rptr =
2288 (struct reloc_ext_external *) relocs;
2290 for (; counter < count; counter++, rptr++, cache_ptr++)
2291 NAME(aout,swap_ext_reloc_in) (abfd, rptr, cache_ptr, symbols);
2295 register struct reloc_std_external *rptr =
2296 (struct reloc_std_external *) relocs;
2298 for (; counter < count; counter++, rptr++, cache_ptr++)
2299 MY_swap_std_reloc_in(abfd, rptr, cache_ptr, symbols);
2304 asect->relocation = reloc_cache;
2305 asect->reloc_count = cache_ptr - reloc_cache;
2310 /* Write out a relocation section into an object file. */
2313 NAME(aout,squirt_out_relocs) (abfd, section)
2318 unsigned char *native, *natptr;
2321 unsigned int count = section->reloc_count;
2324 if (count == 0) return true;
2326 each_size = obj_reloc_entry_size (abfd);
2327 natsize = each_size * count;
2328 native = (unsigned char *) bfd_zalloc (abfd, natsize);
2330 bfd_set_error (bfd_error_no_memory);
2334 generic = section->orelocation;
2336 if (each_size == RELOC_EXT_SIZE)
2338 for (natptr = native;
2340 --count, natptr += each_size, ++generic)
2341 NAME(aout,swap_ext_reloc_out) (abfd, *generic, (struct reloc_ext_external *)natptr);
2345 for (natptr = native;
2347 --count, natptr += each_size, ++generic)
2348 MY_swap_std_reloc_out(abfd, *generic, (struct reloc_std_external *)natptr);
2351 if ( bfd_write ((PTR) native, 1, natsize, abfd) != natsize) {
2352 bfd_release(abfd, native);
2355 bfd_release (abfd, native);
2360 /* This is stupid. This function should be a boolean predicate */
2362 NAME(aout,canonicalize_reloc) (abfd, section, relptr, symbols)
2368 arelent *tblptr = section->relocation;
2371 if (section == obj_bsssec (abfd))
2377 if (!(tblptr || NAME(aout,slurp_reloc_table)(abfd, section, symbols)))
2380 if (section->flags & SEC_CONSTRUCTOR) {
2381 arelent_chain *chain = section->constructor_chain;
2382 for (count = 0; count < section->reloc_count; count ++) {
2383 *relptr ++ = &chain->relent;
2384 chain = chain->next;
2388 tblptr = section->relocation;
2390 for (count = 0; count++ < section->reloc_count;)
2392 *relptr++ = tblptr++;
2397 return section->reloc_count;
2401 NAME(aout,get_reloc_upper_bound) (abfd, asect)
2405 if (bfd_get_format (abfd) != bfd_object) {
2406 bfd_set_error (bfd_error_invalid_operation);
2409 if (asect->flags & SEC_CONSTRUCTOR) {
2410 return (sizeof (arelent *) * (asect->reloc_count+1));
2413 if (asect == obj_datasec (abfd))
2414 return (sizeof (arelent *)
2415 * ((exec_hdr(abfd)->a_drsize / obj_reloc_entry_size (abfd))
2418 if (asect == obj_textsec (abfd))
2419 return (sizeof (arelent *)
2420 * ((exec_hdr(abfd)->a_trsize / obj_reloc_entry_size (abfd))
2423 if (asect == obj_bsssec (abfd))
2424 return sizeof (arelent *);
2426 if (asect == obj_bsssec (abfd))
2429 bfd_set_error (bfd_error_invalid_operation);
2435 NAME(aout,get_symtab_upper_bound) (abfd)
2438 if (!NAME(aout,slurp_symbol_table)(abfd))
2441 return (bfd_get_symcount (abfd)+1) * (sizeof (aout_symbol_type *));
2446 NAME(aout,get_lineno) (ignore_abfd, ignore_symbol)
2448 asymbol *ignore_symbol;
2450 return (alent *)NULL;
2455 NAME(aout,get_symbol_info) (ignore_abfd, symbol, ret)
2460 bfd_symbol_info (symbol, ret);
2462 if (ret->type == '?')
2464 int type_code = aout_symbol(symbol)->type & 0xff;
2465 CONST char *stab_name = aout_stab_name(type_code);
2466 static char buf[10];
2468 if (stab_name == NULL)
2470 sprintf(buf, "(%d)", type_code);
2474 ret->stab_other = (unsigned)(aout_symbol(symbol)->other & 0xff);
2475 ret->stab_desc = (unsigned)(aout_symbol(symbol)->desc & 0xffff);
2476 ret->stab_name = stab_name;
2482 NAME(aout,print_symbol) (ignore_abfd, afile, symbol, how)
2486 bfd_print_symbol_type how;
2488 FILE *file = (FILE *)afile;
2491 case bfd_print_symbol_name:
2493 fprintf(file,"%s", symbol->name);
2495 case bfd_print_symbol_more:
2496 fprintf(file,"%4x %2x %2x",(unsigned)(aout_symbol(symbol)->desc & 0xffff),
2497 (unsigned)(aout_symbol(symbol)->other & 0xff),
2498 (unsigned)(aout_symbol(symbol)->type));
2500 case bfd_print_symbol_all:
2502 CONST char *section_name = symbol->section->name;
2505 bfd_print_symbol_vandf((PTR)file,symbol);
2507 fprintf(file," %-5s %04x %02x %02x",
2509 (unsigned)(aout_symbol(symbol)->desc & 0xffff),
2510 (unsigned)(aout_symbol(symbol)->other & 0xff),
2511 (unsigned)(aout_symbol(symbol)->type & 0xff));
2513 fprintf(file," %s", symbol->name);
2520 provided a BFD, a section and an offset into the section, calculate
2521 and return the name of the source file and the line nearest to the
2526 NAME(aout,find_nearest_line)
2527 (abfd, section, symbols, offset, filename_ptr, functionname_ptr, line_ptr)
2532 CONST char **filename_ptr;
2533 CONST char **functionname_ptr;
2534 unsigned int *line_ptr;
2536 /* Run down the file looking for the filename, function and linenumber */
2538 static char buffer[100];
2539 static char filename_buffer[200];
2540 CONST char *directory_name = NULL;
2541 CONST char *main_file_name = NULL;
2542 CONST char *current_file_name = NULL;
2543 CONST char *line_file_name = NULL; /* Value of current_file_name at line number. */
2544 bfd_vma high_line_vma = ~0;
2545 bfd_vma low_func_vma = 0;
2547 *filename_ptr = abfd->filename;
2548 *functionname_ptr = 0;
2550 if (symbols != (asymbol **)NULL) {
2551 for (p = symbols; *p; p++) {
2552 aout_symbol_type *q = (aout_symbol_type *)(*p);
2556 main_file_name = current_file_name = q->symbol.name;
2557 /* Look ahead to next symbol to check if that too is an N_SO. */
2561 q = (aout_symbol_type *)(*p);
2562 if (q->type != (int)N_SO)
2565 /* Found a second N_SO First is directory; second is filename. */
2566 directory_name = current_file_name;
2567 main_file_name = current_file_name = q->symbol.name;
2568 if (obj_textsec(abfd) != section)
2572 current_file_name = q->symbol.name;
2579 /* We'll keep this if it resolves nearer than the one we have already */
2580 if (q->symbol.value >= offset &&
2581 q->symbol.value < high_line_vma) {
2582 *line_ptr = q->desc;
2583 high_line_vma = q->symbol.value;
2584 line_file_name = current_file_name;
2589 /* We'll keep this if it is nearer than the one we have already */
2590 if (q->symbol.value >= low_func_vma &&
2591 q->symbol.value <= offset) {
2592 low_func_vma = q->symbol.value;
2593 func = (asymbol *)q;
2595 if (*line_ptr && func) {
2596 CONST char *function = func->name;
2599 /* The caller expects a symbol name. We actually have a
2600 function name, without the leading underscore. Put the
2601 underscore back in, so that the caller gets a symbol
2603 if (bfd_get_symbol_leading_char (abfd) == '\0')
2604 strncpy (buffer, function, sizeof (buffer) - 1);
2607 buffer[0] = bfd_get_symbol_leading_char (abfd);
2608 strncpy (buffer + 1, function, sizeof (buffer) - 2);
2610 buffer[sizeof(buffer)-1] = 0;
2611 /* Have to remove : stuff */
2612 p = strchr(buffer,':');
2613 if (p != NULL) { *p = '\0'; }
2614 *functionname_ptr = buffer;
2626 main_file_name = line_file_name;
2627 if (main_file_name) {
2628 if (main_file_name[0] == '/' || directory_name == NULL)
2629 *filename_ptr = main_file_name;
2631 sprintf(filename_buffer, "%.140s%.50s",
2632 directory_name, main_file_name);
2633 *filename_ptr = filename_buffer;
2642 NAME(aout,sizeof_headers) (abfd, execable)
2646 return adata(abfd).exec_bytes_size;
2649 /* Free all information we have cached for this BFD. We can always
2650 read it again later if we need it. */
2653 NAME(aout,bfd_free_cached_info) (abfd)
2658 if (bfd_get_format (abfd) != bfd_object)
2661 #define BFCI_FREE(x) if (x != NULL) { free (x); x = NULL; }
2662 BFCI_FREE (obj_aout_symbols (abfd));
2663 BFCI_FREE (obj_aout_external_syms (abfd));
2664 BFCI_FREE (obj_aout_external_strings (abfd));
2665 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
2666 BFCI_FREE (o->relocation);
2672 /* a.out link code. */
2674 static boolean aout_link_add_object_symbols
2675 PARAMS ((bfd *, struct bfd_link_info *));
2676 static boolean aout_link_check_archive_element
2677 PARAMS ((bfd *, struct bfd_link_info *, boolean *));
2678 static boolean aout_link_free_symbols PARAMS ((bfd *));
2679 static boolean aout_link_check_ar_symbols
2680 PARAMS ((bfd *, struct bfd_link_info *, boolean *pneeded));
2681 static boolean aout_link_add_symbols
2682 PARAMS ((bfd *, struct bfd_link_info *));
2684 /* Routine to create an entry in an a.out link hash table. */
2686 struct bfd_hash_entry *
2687 NAME(aout,link_hash_newfunc) (entry, table, string)
2688 struct bfd_hash_entry *entry;
2689 struct bfd_hash_table *table;
2692 struct aout_link_hash_entry *ret = (struct aout_link_hash_entry *) entry;
2694 /* Allocate the structure if it has not already been allocated by a
2696 if (ret == (struct aout_link_hash_entry *) NULL)
2697 ret = ((struct aout_link_hash_entry *)
2698 bfd_hash_allocate (table, sizeof (struct aout_link_hash_entry)));
2699 if (ret == (struct aout_link_hash_entry *) NULL)
2701 bfd_set_error (bfd_error_no_memory);
2702 return (struct bfd_hash_entry *) ret;
2705 /* Call the allocation method of the superclass. */
2706 ret = ((struct aout_link_hash_entry *)
2707 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
2711 /* Set local fields. */
2712 ret->written = false;
2716 return (struct bfd_hash_entry *) ret;
2719 /* Initialize an a.out link hash table. */
2722 NAME(aout,link_hash_table_init) (table, abfd, newfunc)
2723 struct aout_link_hash_table *table;
2725 struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *,
2726 struct bfd_hash_table *,
2729 return _bfd_link_hash_table_init (&table->root, abfd, newfunc);
2732 /* Create an a.out link hash table. */
2734 struct bfd_link_hash_table *
2735 NAME(aout,link_hash_table_create) (abfd)
2738 struct aout_link_hash_table *ret;
2740 ret = ((struct aout_link_hash_table *)
2741 malloc (sizeof (struct aout_link_hash_table)));
2742 if (ret == (struct aout_link_hash_table *) NULL)
2744 bfd_set_error (bfd_error_no_memory);
2745 return (struct bfd_link_hash_table *) NULL;
2747 if (! NAME(aout,link_hash_table_init) (ret, abfd,
2748 NAME(aout,link_hash_newfunc)))
2751 return (struct bfd_link_hash_table *) NULL;
2756 /* Given an a.out BFD, add symbols to the global hash table as
2760 NAME(aout,link_add_symbols) (abfd, info)
2762 struct bfd_link_info *info;
2766 switch (bfd_get_format (abfd))
2769 return aout_link_add_object_symbols (abfd, info);
2771 first = bfd_openr_next_archived_file (abfd, (bfd *) NULL);
2774 if (! bfd_check_format (first, bfd_object))
2776 if (bfd_get_flavour (first) != bfd_target_aout_flavour)
2778 /* On Linux, we may have an ELF archive which got recognized
2779 as an a.out archive. Therefore, we treat all archives as
2780 though they were actually of the flavour of their first
2782 return (*first->xvec->_bfd_link_add_symbols) (abfd, info);
2784 return _bfd_generic_link_add_archive_symbols
2785 (abfd, info, aout_link_check_archive_element);
2787 bfd_set_error (bfd_error_wrong_format);
2792 /* Add symbols from an a.out object file. */
2795 aout_link_add_object_symbols (abfd, info)
2797 struct bfd_link_info *info;
2799 if (! aout_get_external_symbols (abfd))
2801 if (! aout_link_add_symbols (abfd, info))
2803 if (! info->keep_memory)
2805 if (! aout_link_free_symbols (abfd))
2811 /* Check a single archive element to see if we need to include it in
2812 the link. *PNEEDED is set according to whether this element is
2813 needed in the link or not. This is called from
2814 _bfd_generic_link_add_archive_symbols. */
2817 aout_link_check_archive_element (abfd, info, pneeded)
2819 struct bfd_link_info *info;
2822 if (! aout_get_external_symbols (abfd))
2825 if (! aout_link_check_ar_symbols (abfd, info, pneeded))
2830 if (! aout_link_add_symbols (abfd, info))
2834 if (! info->keep_memory || ! *pneeded)
2836 if (! aout_link_free_symbols (abfd))
2843 /* Free up the internal symbols read from an a.out file. */
2846 aout_link_free_symbols (abfd)
2849 if (obj_aout_external_syms (abfd) != (struct external_nlist *) NULL)
2851 free ((PTR) obj_aout_external_syms (abfd));
2852 obj_aout_external_syms (abfd) = (struct external_nlist *) NULL;
2854 if (obj_aout_external_strings (abfd) != (char *) NULL)
2856 free ((PTR) obj_aout_external_strings (abfd));
2857 obj_aout_external_strings (abfd) = (char *) NULL;
2862 /* Look through the internal symbols to see if this object file should
2863 be included in the link. We should include this object file if it
2864 defines any symbols which are currently undefined. If this object
2865 file defines a common symbol, then we may adjust the size of the
2866 known symbol but we do not include the object file in the link
2867 (unless there is some other reason to include it). */
2870 aout_link_check_ar_symbols (abfd, info, pneeded)
2872 struct bfd_link_info *info;
2875 register struct external_nlist *p;
2876 struct external_nlist *pend;
2881 /* Look through all the symbols. */
2882 p = obj_aout_external_syms (abfd);
2883 pend = p + obj_aout_external_sym_count (abfd);
2884 strings = obj_aout_external_strings (abfd);
2885 for (; p < pend; p++)
2887 int type = bfd_h_get_8 (abfd, p->e_type);
2889 struct bfd_link_hash_entry *h;
2891 /* Ignore symbols that are not externally visible. This is an
2892 optimization only, as we check the type more thoroughly
2894 if (((type & N_EXT) == 0
2895 || (type & N_STAB) != 0
2902 if (type == N_WARNING
2908 name = strings + GET_WORD (abfd, p->e_strx);
2909 h = bfd_link_hash_lookup (info->hash, name, false, false, true);
2911 /* We are only interested in symbols that are currently
2912 undefined or common. */
2913 if (h == (struct bfd_link_hash_entry *) NULL
2914 || (h->type != bfd_link_hash_undefined
2915 && h->type != bfd_link_hash_common))
2917 if (type == (N_INDR | N_EXT))
2922 if (type == (N_TEXT | N_EXT)
2923 || type == (N_DATA | N_EXT)
2924 || type == (N_BSS | N_EXT)
2925 || type == (N_ABS | N_EXT)
2926 || type == (N_INDR | N_EXT))
2928 /* This object file defines this symbol. We must link it
2929 in. This is true regardless of whether the current
2930 definition of the symbol is undefined or common. If the
2931 current definition is common, we have a case in which we
2932 have already seen an object file including
2934 and this object file from the archive includes
2936 In such a case we must include this object file.
2938 FIXME: The SunOS 4.1.3 linker will pull in the archive
2939 element if the symbol is defined in the .data section,
2940 but not if it is defined in the .text section. That
2941 seems a bit crazy to me, and I haven't implemented it.
2942 However, it might be correct. */
2943 if (! (*info->callbacks->add_archive_element) (info, abfd, name))
2949 if (type == (N_UNDF | N_EXT))
2953 value = GET_WORD (abfd, p->e_value);
2956 /* This symbol is common in the object from the archive
2958 if (h->type == bfd_link_hash_undefined)
2963 symbfd = h->u.undef.abfd;
2964 if (symbfd == (bfd *) NULL)
2966 /* This symbol was created as undefined from
2967 outside BFD. We assume that we should link
2968 in the object file. This is done for the -u
2969 option in the linker. */
2970 if (! (*info->callbacks->add_archive_element) (info,
2977 /* Turn the current link symbol into a common
2978 symbol. It is already on the undefs list. */
2979 h->type = bfd_link_hash_common;
2980 h->u.c.p = ((struct bfd_link_hash_common_entry *)
2981 bfd_hash_allocate (&info->hash->table,
2982 sizeof (struct bfd_link_hash_common_entry)));
2983 if (h->u.c.p == NULL)
2986 h->u.c.size = value;
2988 /* FIXME: This isn't quite right. The maximum
2989 alignment of a common symbol should be set by the
2990 architecture of the output file, not of the input
2992 power = bfd_log2 (value);
2993 if (power > bfd_get_arch_info (abfd)->section_align_power)
2994 power = bfd_get_arch_info (abfd)->section_align_power;
2995 h->u.c.p->alignment_power = power;
2997 h->u.c.p->section = bfd_make_section_old_way (symbfd,
3002 /* Adjust the size of the common symbol if
3004 if (value > h->u.c.size)
3005 h->u.c.size = value;
3015 /* This symbol is weak but defined. We must pull it in if
3016 the current link symbol is undefined, but we don't want
3017 it if the current link symbol is common. */
3018 if (h->type == bfd_link_hash_undefined)
3020 if (! (*info->callbacks->add_archive_element) (info, abfd, name))
3028 /* We do not need this object file. */
3032 /* Add all symbols from an object file to the hash table. */
3035 aout_link_add_symbols (abfd, info)
3037 struct bfd_link_info *info;
3039 boolean (*add_one_symbol) PARAMS ((struct bfd_link_info *, bfd *,
3040 const char *, flagword, asection *,
3041 bfd_vma, const char *, boolean,
3043 struct bfd_link_hash_entry **));
3044 bfd_size_type sym_count;
3047 struct aout_link_hash_entry **sym_hash;
3048 register struct external_nlist *p;
3049 struct external_nlist *pend;
3051 sym_count = obj_aout_external_sym_count (abfd);
3052 strings = obj_aout_external_strings (abfd);
3053 if (info->keep_memory)
3058 /* We keep a list of the linker hash table entries that correspond
3059 to particular symbols. We could just look them up in the hash
3060 table, but keeping the list is more efficient. Perhaps this
3061 should be conditional on info->keep_memory. */
3062 sym_hash = ((struct aout_link_hash_entry **)
3065 * sizeof (struct aout_link_hash_entry *))));
3066 if (sym_hash == NULL && sym_count != 0)
3068 bfd_set_error (bfd_error_no_memory);
3071 obj_aout_sym_hashes (abfd) = sym_hash;
3073 if ((abfd->flags & DYNAMIC) != 0
3074 && aout_backend_info (abfd)->add_dynamic_symbols != NULL)
3076 if (! (*aout_backend_info (abfd)->add_dynamic_symbols) (abfd, info))
3080 add_one_symbol = aout_backend_info (abfd)->add_one_symbol;
3081 if (add_one_symbol == NULL)
3082 add_one_symbol = _bfd_generic_link_add_one_symbol;
3084 p = obj_aout_external_syms (abfd);
3085 pend = p + sym_count;
3086 for (; p < pend; p++, sym_hash++)
3097 type = bfd_h_get_8 (abfd, p->e_type);
3099 /* Ignore debugging symbols. */
3100 if ((type & N_STAB) != 0)
3103 name = strings + GET_WORD (abfd, p->e_strx);
3104 value = GET_WORD (abfd, p->e_value);
3121 /* Ignore symbols that are not externally visible. */
3124 /* Ignore local indirect symbol. */
3129 case N_UNDF | N_EXT:
3132 section = bfd_und_section_ptr;
3136 section = bfd_com_section_ptr;
3139 section = bfd_abs_section_ptr;
3141 case N_TEXT | N_EXT:
3142 section = obj_textsec (abfd);
3143 value -= bfd_get_section_vma (abfd, section);
3145 case N_DATA | N_EXT:
3146 case N_SETV | N_EXT:
3147 /* Treat N_SETV symbols as N_DATA symbol; see comment in
3148 translate_from_native_sym_flags. */
3149 section = obj_datasec (abfd);
3150 value -= bfd_get_section_vma (abfd, section);
3153 section = obj_bsssec (abfd);
3154 value -= bfd_get_section_vma (abfd, section);
3156 case N_INDR | N_EXT:
3157 /* An indirect symbol. The next symbol is the symbol
3158 which this one really is. */
3159 BFD_ASSERT (p + 1 < pend);
3161 string = strings + GET_WORD (abfd, p->e_strx);
3162 section = bfd_ind_section_ptr;
3163 flags |= BSF_INDIRECT;
3165 case N_COMM | N_EXT:
3166 section = bfd_com_section_ptr;
3168 case N_SETA: case N_SETA | N_EXT:
3169 section = bfd_abs_section_ptr;
3170 flags |= BSF_CONSTRUCTOR;
3172 case N_SETT: case N_SETT | N_EXT:
3173 section = obj_textsec (abfd);
3174 flags |= BSF_CONSTRUCTOR;
3175 value -= bfd_get_section_vma (abfd, section);
3177 case N_SETD: case N_SETD | N_EXT:
3178 section = obj_datasec (abfd);
3179 flags |= BSF_CONSTRUCTOR;
3180 value -= bfd_get_section_vma (abfd, section);
3182 case N_SETB: case N_SETB | N_EXT:
3183 section = obj_bsssec (abfd);
3184 flags |= BSF_CONSTRUCTOR;
3185 value -= bfd_get_section_vma (abfd, section);
3188 /* A warning symbol. The next symbol is the one to warn
3190 BFD_ASSERT (p + 1 < pend);
3193 name = strings + GET_WORD (abfd, p->e_strx);
3194 section = bfd_und_section_ptr;
3195 flags |= BSF_WARNING;
3198 section = bfd_und_section_ptr;
3202 section = bfd_abs_section_ptr;
3206 section = obj_textsec (abfd);
3207 value -= bfd_get_section_vma (abfd, section);
3211 section = obj_datasec (abfd);
3212 value -= bfd_get_section_vma (abfd, section);
3216 section = obj_bsssec (abfd);
3217 value -= bfd_get_section_vma (abfd, section);
3222 if (! ((*add_one_symbol)
3223 (info, abfd, name, flags, section, value, string, copy, false,
3224 (struct bfd_link_hash_entry **) sym_hash)))
3227 /* Restrict the maximum alignment of a common symbol based on
3228 the architecture, since a.out has no way to represent
3229 alignment requirements of a section in a .o file. FIXME:
3230 This isn't quite right: it should use the architecture of the
3231 output file, not the input files. */
3232 if ((*sym_hash)->root.type == bfd_link_hash_common
3233 && ((*sym_hash)->root.u.c.p->alignment_power >
3234 bfd_get_arch_info (abfd)->section_align_power))
3235 (*sym_hash)->root.u.c.p->alignment_power =
3236 bfd_get_arch_info (abfd)->section_align_power;
3238 /* If this is a set symbol, and we are not building sets, then
3239 it is possible for the hash entry to not have been set. In
3240 such a case, treat the symbol as not globally defined. */
3241 if ((*sym_hash)->root.type == bfd_link_hash_new)
3243 BFD_ASSERT ((flags & BSF_CONSTRUCTOR) != 0);
3247 if (type == (N_INDR | N_EXT) || type == N_WARNING)
3254 /* During the final link step we need to pass around a bunch of
3255 information, so we do it in an instance of this structure. */
3257 struct aout_final_link_info
3259 /* General link information. */
3260 struct bfd_link_info *info;
3263 /* Reloc file positions. */
3264 file_ptr treloff, dreloff;
3265 /* File position of symbols. */
3268 struct bfd_strtab_hash *strtab;
3269 /* A buffer large enough to hold the contents of any section. */
3271 /* A buffer large enough to hold the relocs of any section. */
3273 /* A buffer large enough to hold the symbol map of any input BFD. */
3275 /* A buffer large enough to hold output symbols of any input BFD. */
3276 struct external_nlist *output_syms;
3279 static boolean aout_link_input_bfd
3280 PARAMS ((struct aout_final_link_info *, bfd *input_bfd));
3281 static boolean aout_link_write_symbols
3282 PARAMS ((struct aout_final_link_info *, bfd *input_bfd));
3283 static boolean aout_link_write_other_symbol
3284 PARAMS ((struct aout_link_hash_entry *, PTR));
3285 static boolean aout_link_input_section
3286 PARAMS ((struct aout_final_link_info *, bfd *input_bfd,
3287 asection *input_section, file_ptr *reloff_ptr,
3288 bfd_size_type rel_size));
3289 static boolean aout_link_input_section_std
3290 PARAMS ((struct aout_final_link_info *, bfd *input_bfd,
3291 asection *input_section, struct reloc_std_external *,
3292 bfd_size_type rel_size, bfd_byte *contents));
3293 static boolean aout_link_input_section_ext
3294 PARAMS ((struct aout_final_link_info *, bfd *input_bfd,
3295 asection *input_section, struct reloc_ext_external *,
3296 bfd_size_type rel_size, bfd_byte *contents));
3297 static INLINE asection *aout_reloc_index_to_section
3298 PARAMS ((bfd *, int));
3299 static boolean aout_link_reloc_link_order
3300 PARAMS ((struct aout_final_link_info *, asection *,
3301 struct bfd_link_order *));
3303 /* Do the final link step. This is called on the output BFD. The
3304 INFO structure should point to a list of BFDs linked through the
3305 link_next field which can be used to find each BFD which takes part
3306 in the output. Also, each section in ABFD should point to a list
3307 of bfd_link_order structures which list all the input sections for
3308 the output section. */
3311 NAME(aout,final_link) (abfd, info, callback)
3313 struct bfd_link_info *info;
3314 void (*callback) PARAMS ((bfd *, file_ptr *, file_ptr *, file_ptr *));
3316 struct aout_final_link_info aout_info;
3318 bfd_size_type trsize, drsize;
3319 size_t max_contents_size;
3320 size_t max_relocs_size;
3321 size_t max_sym_count;
3322 bfd_size_type text_size;
3324 register struct bfd_link_order *p;
3326 boolean have_link_order_relocs;
3328 aout_info.info = info;
3329 aout_info.output_bfd = abfd;
3330 aout_info.contents = NULL;
3331 aout_info.relocs = NULL;
3333 /* Figure out the largest section size. Also, if generating
3334 relocateable output, count the relocs. */
3337 max_contents_size = 0;
3338 max_relocs_size = 0;
3340 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
3344 if (info->relocateable)
3346 if (bfd_get_flavour (sub) == bfd_target_aout_flavour)
3348 trsize += exec_hdr (sub)->a_trsize;
3349 drsize += exec_hdr (sub)->a_drsize;
3353 /* FIXME: We need to identify the .text and .data sections
3354 and call get_reloc_upper_bound and canonicalize_reloc to
3355 work out the number of relocs needed, and then multiply
3356 by the reloc size. */
3361 if (bfd_get_flavour (sub) == bfd_target_aout_flavour)
3363 sz = bfd_section_size (sub, obj_textsec (sub));
3364 if (sz > max_contents_size)
3365 max_contents_size = sz;
3366 sz = bfd_section_size (sub, obj_datasec (sub));
3367 if (sz > max_contents_size)
3368 max_contents_size = sz;
3370 sz = exec_hdr (sub)->a_trsize;
3371 if (sz > max_relocs_size)
3372 max_relocs_size = sz;
3373 sz = exec_hdr (sub)->a_drsize;
3374 if (sz > max_relocs_size)
3375 max_relocs_size = sz;
3377 sz = obj_aout_external_sym_count (sub);
3378 if (sz > max_sym_count)
3383 if (info->relocateable)
3385 if (obj_textsec (abfd) != (asection *) NULL)
3386 trsize += (_bfd_count_link_order_relocs (obj_textsec (abfd)
3388 * obj_reloc_entry_size (abfd));
3389 if (obj_datasec (abfd) != (asection *) NULL)
3390 drsize += (_bfd_count_link_order_relocs (obj_datasec (abfd)
3392 * obj_reloc_entry_size (abfd));
3395 exec_hdr (abfd)->a_trsize = trsize;
3396 exec_hdr (abfd)->a_drsize = drsize;
3398 exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd);
3400 /* Adjust the section sizes and vmas according to the magic number.
3401 This sets a_text, a_data and a_bss in the exec_hdr and sets the
3402 filepos for each section. */
3403 if (! NAME(aout,adjust_sizes_and_vmas) (abfd, &text_size, &text_end))
3406 /* The relocation and symbol file positions differ among a.out
3407 targets. We are passed a callback routine from the backend
3408 specific code to handle this.
3409 FIXME: At this point we do not know how much space the symbol
3410 table will require. This will not work for any (nonstandard)
3411 a.out target that needs to know the symbol table size before it
3412 can compute the relocation file positions. This may or may not
3413 be the case for the hp300hpux target, for example. */
3414 (*callback) (abfd, &aout_info.treloff, &aout_info.dreloff,
3416 obj_textsec (abfd)->rel_filepos = aout_info.treloff;
3417 obj_datasec (abfd)->rel_filepos = aout_info.dreloff;
3418 obj_sym_filepos (abfd) = aout_info.symoff;
3420 /* We keep a count of the symbols as we output them. */
3421 obj_aout_external_sym_count (abfd) = 0;
3423 /* We accumulate the string table as we write out the symbols. */
3424 aout_info.strtab = _bfd_stringtab_init ();
3425 if (aout_info.strtab == NULL)
3428 /* Allocate buffers to hold section contents and relocs. */
3429 aout_info.contents = (bfd_byte *) malloc (max_contents_size);
3430 aout_info.relocs = (PTR) malloc (max_relocs_size);
3431 aout_info.symbol_map = (int *) malloc (max_sym_count * sizeof (int *));
3432 aout_info.output_syms = ((struct external_nlist *)
3433 malloc ((max_sym_count + 1)
3434 * sizeof (struct external_nlist)));
3435 if ((aout_info.contents == NULL && max_contents_size != 0)
3436 || (aout_info.relocs == NULL && max_relocs_size != 0)
3437 || (aout_info.symbol_map == NULL && max_sym_count != 0)
3438 || aout_info.output_syms == NULL)
3440 bfd_set_error (bfd_error_no_memory);
3444 /* The most time efficient way to do the link would be to read all
3445 the input object files into memory and then sort out the
3446 information into the output file. Unfortunately, that will
3447 probably use too much memory. Another method would be to step
3448 through everything that composes the text section and write it
3449 out, and then everything that composes the data section and write
3450 it out, and then write out the relocs, and then write out the
3451 symbols. Unfortunately, that requires reading stuff from each
3452 input file several times, and we will not be able to keep all the
3453 input files open simultaneously, and reopening them will be slow.
3455 What we do is basically process one input file at a time. We do
3456 everything we need to do with an input file once--copy over the
3457 section contents, handle the relocation information, and write
3458 out the symbols--and then we throw away the information we read
3459 from it. This approach requires a lot of lseeks of the output
3460 file, which is unfortunate but still faster than reopening a lot
3463 We use the output_has_begun field of the input BFDs to see
3464 whether we have already handled it. */
3465 for (sub = info->input_bfds; sub != (bfd *) NULL; sub = sub->link_next)
3466 sub->output_has_begun = false;
3468 have_link_order_relocs = false;
3469 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
3471 for (p = o->link_order_head;
3472 p != (struct bfd_link_order *) NULL;
3475 if (p->type == bfd_indirect_link_order
3476 && (bfd_get_flavour (p->u.indirect.section->owner)
3477 == bfd_target_aout_flavour))
3481 input_bfd = p->u.indirect.section->owner;
3482 if (! input_bfd->output_has_begun)
3484 if (! aout_link_input_bfd (&aout_info, input_bfd))
3486 input_bfd->output_has_begun = true;
3489 else if (p->type == bfd_section_reloc_link_order
3490 || p->type == bfd_symbol_reloc_link_order)
3492 /* These are handled below. */
3493 have_link_order_relocs = true;
3497 if (! _bfd_default_link_order (abfd, info, o, p))
3503 /* Write out any symbols that we have not already written out. */
3504 aout_link_hash_traverse (aout_hash_table (info),
3505 aout_link_write_other_symbol,
3508 /* Now handle any relocs we were asked to create by the linker.
3509 These did not come from any input file. We must do these after
3510 we have written out all the symbols, so that we know the symbol
3512 if (have_link_order_relocs)
3514 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
3516 for (p = o->link_order_head;
3517 p != (struct bfd_link_order *) NULL;
3520 if (p->type == bfd_section_reloc_link_order
3521 || p->type == bfd_symbol_reloc_link_order)
3523 if (! aout_link_reloc_link_order (&aout_info, o, p))
3530 if (aout_info.contents != NULL)
3532 free (aout_info.contents);
3533 aout_info.contents = NULL;
3535 if (aout_info.relocs != NULL)
3537 free (aout_info.relocs);
3538 aout_info.relocs = NULL;
3540 if (aout_info.symbol_map != NULL)
3542 free (aout_info.symbol_map);
3543 aout_info.symbol_map = NULL;
3545 if (aout_info.output_syms != NULL)
3547 free (aout_info.output_syms);
3548 aout_info.output_syms = NULL;
3551 /* Finish up any dynamic linking we may be doing. */
3552 if (aout_backend_info (abfd)->finish_dynamic_link != NULL)
3554 if (! (*aout_backend_info (abfd)->finish_dynamic_link) (abfd, info))
3558 /* Update the header information. */
3559 abfd->symcount = obj_aout_external_sym_count (abfd);
3560 exec_hdr (abfd)->a_syms = abfd->symcount * EXTERNAL_NLIST_SIZE;
3561 obj_str_filepos (abfd) = obj_sym_filepos (abfd) + exec_hdr (abfd)->a_syms;
3562 obj_textsec (abfd)->reloc_count =
3563 exec_hdr (abfd)->a_trsize / obj_reloc_entry_size (abfd);
3564 obj_datasec (abfd)->reloc_count =
3565 exec_hdr (abfd)->a_drsize / obj_reloc_entry_size (abfd);
3567 /* Write out the string table. */
3568 if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0)
3570 return emit_stringtab (abfd, aout_info.strtab);
3573 if (aout_info.contents != NULL)
3574 free (aout_info.contents);
3575 if (aout_info.relocs != NULL)
3576 free (aout_info.relocs);
3577 if (aout_info.symbol_map != NULL)
3578 free (aout_info.symbol_map);
3579 if (aout_info.output_syms != NULL)
3580 free (aout_info.output_syms);
3584 /* Link an a.out input BFD into the output file. */
3587 aout_link_input_bfd (finfo, input_bfd)
3588 struct aout_final_link_info *finfo;
3591 bfd_size_type sym_count;
3593 BFD_ASSERT (bfd_get_format (input_bfd) == bfd_object);
3595 /* If this is a dynamic object, it may need special handling. */
3596 if ((input_bfd->flags & DYNAMIC) != 0
3597 && aout_backend_info (input_bfd)->link_dynamic_object != NULL)
3599 return ((*aout_backend_info (input_bfd)->link_dynamic_object)
3600 (finfo->info, input_bfd));
3603 /* Get the symbols. We probably have them already, unless
3604 finfo->info->keep_memory is false. */
3605 if (! aout_get_external_symbols (input_bfd))
3608 sym_count = obj_aout_external_sym_count (input_bfd);
3610 /* Write out the symbols and get a map of the new indices. The map
3611 is placed into finfo->symbol_map. */
3612 if (! aout_link_write_symbols (finfo, input_bfd))
3615 /* Relocate and write out the sections. These functions use the
3616 symbol map created by aout_link_write_symbols. */
3617 if (! aout_link_input_section (finfo, input_bfd,
3618 obj_textsec (input_bfd),
3620 exec_hdr (input_bfd)->a_trsize)
3621 || ! aout_link_input_section (finfo, input_bfd,
3622 obj_datasec (input_bfd),
3624 exec_hdr (input_bfd)->a_drsize))
3627 /* If we are not keeping memory, we don't need the symbols any
3628 longer. We still need them if we are keeping memory, because the
3629 strings in the hash table point into them. */
3630 if (! finfo->info->keep_memory)
3632 if (! aout_link_free_symbols (input_bfd))
3639 /* Adjust and write out the symbols for an a.out file. Set the new
3640 symbol indices into a symbol_map. */
3643 aout_link_write_symbols (finfo, input_bfd)
3644 struct aout_final_link_info *finfo;
3648 bfd_size_type sym_count;
3650 enum bfd_link_strip strip;
3651 enum bfd_link_discard discard;
3652 struct external_nlist *outsym;
3653 bfd_size_type strtab_index;
3654 register struct external_nlist *sym;
3655 struct external_nlist *sym_end;
3656 struct aout_link_hash_entry **sym_hash;
3661 output_bfd = finfo->output_bfd;
3662 sym_count = obj_aout_external_sym_count (input_bfd);
3663 strings = obj_aout_external_strings (input_bfd);
3664 strip = finfo->info->strip;
3665 discard = finfo->info->discard;
3666 outsym = finfo->output_syms;
3668 /* First write out a symbol for this object file, unless we are
3669 discarding such symbols. */
3670 if (strip != strip_all
3671 && (strip != strip_some
3672 || bfd_hash_lookup (finfo->info->keep_hash, input_bfd->filename,
3673 false, false) != NULL)
3674 && discard != discard_all)
3676 bfd_h_put_8 (output_bfd, N_TEXT, outsym->e_type);
3677 bfd_h_put_8 (output_bfd, 0, outsym->e_other);
3678 bfd_h_put_16 (output_bfd, (bfd_vma) 0, outsym->e_desc);
3679 strtab_index = add_to_stringtab (output_bfd, finfo->strtab,
3680 input_bfd->filename, false);
3681 if (strtab_index == (bfd_size_type) -1)
3683 PUT_WORD (output_bfd, strtab_index, outsym->e_strx);
3684 PUT_WORD (output_bfd,
3685 (bfd_get_section_vma (output_bfd,
3686 obj_textsec (input_bfd)->output_section)
3687 + obj_textsec (input_bfd)->output_offset),
3689 ++obj_aout_external_sym_count (output_bfd);
3695 sym = obj_aout_external_syms (input_bfd);
3696 sym_end = sym + sym_count;
3697 sym_hash = obj_aout_sym_hashes (input_bfd);
3698 symbol_map = finfo->symbol_map;
3699 for (; sym < sym_end; sym++, sym_hash++, symbol_map++)
3703 struct aout_link_hash_entry *h;
3711 type = bfd_h_get_8 (input_bfd, sym->e_type);
3712 name = strings + GET_WORD (input_bfd, sym->e_strx);
3718 /* Pass this symbol through. It is the target of an
3719 indirect or warning symbol. */
3720 val = GET_WORD (input_bfd, sym->e_value);
3725 /* Skip this symbol, which is the target of an indirect
3726 symbol that we have changed to no longer be an indirect
3733 struct aout_link_hash_entry *hresolve;
3735 /* We have saved the hash table entry for this symbol, if
3736 there is one. Note that we could just look it up again
3737 in the hash table, provided we first check that it is an
3741 /* If this is an indirect or warning symbol, then change
3742 hresolve to the base symbol. We also change *sym_hash so
3743 that the relocation routines relocate against the real
3746 if (h != (struct aout_link_hash_entry *) NULL
3747 && (h->root.type == bfd_link_hash_indirect
3748 || h->root.type == bfd_link_hash_warning))
3750 hresolve = (struct aout_link_hash_entry *) h->root.u.i.link;
3751 while (hresolve->root.type == bfd_link_hash_indirect
3752 || hresolve->root.type == bfd_link_hash_warning)
3753 hresolve = ((struct aout_link_hash_entry *)
3754 hresolve->root.u.i.link);
3755 *sym_hash = hresolve;
3758 /* If the symbol has already been written out, skip it. */
3759 if (h != (struct aout_link_hash_entry *) NULL
3760 && h->root.type != bfd_link_hash_warning
3763 if ((type & N_TYPE) == N_INDR
3764 || type == N_WARNING)
3766 *symbol_map = h->indx;
3770 /* See if we are stripping this symbol. */
3776 case strip_debugger:
3777 if ((type & N_STAB) != 0)
3781 if (bfd_hash_lookup (finfo->info->keep_hash, name, false, false)
3791 if (h != (struct aout_link_hash_entry *) NULL)
3796 /* Get the value of the symbol. */
3797 if ((type & N_TYPE) == N_TEXT
3799 symsec = obj_textsec (input_bfd);
3800 else if ((type & N_TYPE) == N_DATA
3802 symsec = obj_datasec (input_bfd);
3803 else if ((type & N_TYPE) == N_BSS
3805 symsec = obj_bsssec (input_bfd);
3806 else if ((type & N_TYPE) == N_ABS
3808 symsec = bfd_abs_section_ptr;
3809 else if (((type & N_TYPE) == N_INDR
3810 && (hresolve == (struct aout_link_hash_entry *) NULL
3811 || (hresolve->root.type != bfd_link_hash_defined
3812 && hresolve->root.type != bfd_link_hash_defweak
3813 && hresolve->root.type != bfd_link_hash_common)))
3814 || type == N_WARNING)
3816 /* Pass the next symbol through unchanged. The
3817 condition above for indirect symbols is so that if
3818 the indirect symbol was defined, we output it with
3819 the correct definition so the debugger will
3822 val = GET_WORD (input_bfd, sym->e_value);
3825 else if ((type & N_STAB) != 0)
3827 val = GET_WORD (input_bfd, sym->e_value);
3832 /* If we get here with an indirect symbol, it means that
3833 we are outputting it with a real definition. In such
3834 a case we do not want to output the next symbol,
3835 which is the target of the indirection. */
3836 if ((type & N_TYPE) == N_INDR)
3841 /* We need to get the value from the hash table. We use
3842 hresolve so that if we have defined an indirect
3843 symbol we output the final definition. */
3844 if (h == (struct aout_link_hash_entry *) NULL)
3846 switch (type & N_TYPE)
3849 symsec = obj_textsec (input_bfd);
3852 symsec = obj_datasec (input_bfd);
3855 symsec = obj_bsssec (input_bfd);
3858 symsec = bfd_abs_section_ptr;
3865 else if (hresolve->root.type == bfd_link_hash_defined
3866 || hresolve->root.type == bfd_link_hash_defweak)
3868 asection *input_section;
3869 asection *output_section;
3871 /* This case usually means a common symbol which was
3872 turned into a defined symbol. */
3873 input_section = hresolve->root.u.def.section;
3874 output_section = input_section->output_section;
3875 BFD_ASSERT (bfd_is_abs_section (output_section)
3876 || output_section->owner == output_bfd);
3877 val = (hresolve->root.u.def.value
3878 + bfd_get_section_vma (output_bfd, output_section)
3879 + input_section->output_offset);
3881 /* Get the correct type based on the section. If
3882 this is a constructed set, force it to be
3883 globally visible. */
3892 if (output_section == obj_textsec (output_bfd))
3893 type |= (hresolve->root.type == bfd_link_hash_defined
3896 else if (output_section == obj_datasec (output_bfd))
3897 type |= (hresolve->root.type == bfd_link_hash_defined
3900 else if (output_section == obj_bsssec (output_bfd))
3901 type |= (hresolve->root.type == bfd_link_hash_defined
3905 type |= (hresolve->root.type == bfd_link_hash_defined
3909 else if (hresolve->root.type == bfd_link_hash_common)
3910 val = hresolve->root.u.c.size;
3911 else if (hresolve->root.type == bfd_link_hash_undefweak)
3919 if (symsec != (asection *) NULL)
3920 val = (symsec->output_section->vma
3921 + symsec->output_offset
3922 + (GET_WORD (input_bfd, sym->e_value)
3925 /* If this is a global symbol set the written flag, and if
3926 it is a local symbol see if we should discard it. */
3927 if (h != (struct aout_link_hash_entry *) NULL)
3930 h->indx = obj_aout_external_sym_count (output_bfd);
3932 else if ((type & N_TYPE) != N_SETT
3933 && (type & N_TYPE) != N_SETD
3934 && (type & N_TYPE) != N_SETB
3935 && (type & N_TYPE) != N_SETA)
3942 if (*name == *finfo->info->lprefix
3943 && (finfo->info->lprefix_len == 1
3944 || strncmp (name, finfo->info->lprefix,
3945 finfo->info->lprefix_len) == 0))
3960 /* Copy this symbol into the list of symbols we are going to
3962 bfd_h_put_8 (output_bfd, type, outsym->e_type);
3963 bfd_h_put_8 (output_bfd, bfd_h_get_8 (input_bfd, sym->e_other),
3965 bfd_h_put_16 (output_bfd, bfd_h_get_16 (input_bfd, sym->e_desc),
3968 if (! finfo->info->keep_memory)
3970 /* name points into a string table which we are going to
3971 free. If there is a hash table entry, use that string.
3972 Otherwise, copy name into memory. */
3973 if (h != (struct aout_link_hash_entry *) NULL)
3974 name = h->root.root.string;
3978 strtab_index = add_to_stringtab (output_bfd, finfo->strtab,
3980 if (strtab_index == (bfd_size_type) -1)
3982 PUT_WORD (output_bfd, strtab_index, outsym->e_strx);
3983 PUT_WORD (output_bfd, val, outsym->e_value);
3984 *symbol_map = obj_aout_external_sym_count (output_bfd);
3985 ++obj_aout_external_sym_count (output_bfd);
3989 /* Write out the output symbols we have just constructed. */
3990 if (outsym > finfo->output_syms)
3992 bfd_size_type outsym_count;
3994 if (bfd_seek (output_bfd, finfo->symoff, SEEK_SET) != 0)
3996 outsym_count = outsym - finfo->output_syms;
3997 if (bfd_write ((PTR) finfo->output_syms,
3998 (bfd_size_type) EXTERNAL_NLIST_SIZE,
3999 (bfd_size_type) outsym_count, output_bfd)
4000 != outsym_count * EXTERNAL_NLIST_SIZE)
4002 finfo->symoff += outsym_count * EXTERNAL_NLIST_SIZE;
4008 /* Write out a symbol that was not associated with an a.out input
4012 aout_link_write_other_symbol (h, data)
4013 struct aout_link_hash_entry *h;
4016 struct aout_final_link_info *finfo = (struct aout_final_link_info *) data;
4020 struct external_nlist outsym;
4023 output_bfd = finfo->output_bfd;
4025 if (aout_backend_info (output_bfd)->write_dynamic_symbol != NULL)
4027 if (! ((*aout_backend_info (output_bfd)->write_dynamic_symbol)
4028 (output_bfd, finfo->info, h)))
4030 /* FIXME: No way to handle errors. */
4040 /* An indx of -2 means the symbol must be written. */
4042 && (finfo->info->strip == strip_all
4043 || (finfo->info->strip == strip_some
4044 && bfd_hash_lookup (finfo->info->keep_hash, h->root.root.string,
4045 false, false) == NULL)))
4048 switch (h->root.type)
4052 /* Avoid variable not initialized warnings. */
4054 case bfd_link_hash_new:
4055 /* This can happen for set symbols when sets are not being
4058 case bfd_link_hash_undefined:
4059 type = N_UNDF | N_EXT;
4062 case bfd_link_hash_defined:
4063 case bfd_link_hash_defweak:
4067 sec = h->root.u.def.section->output_section;
4068 BFD_ASSERT (bfd_is_abs_section (sec)
4069 || sec->owner == output_bfd);
4070 if (sec == obj_textsec (output_bfd))
4071 type = h->root.type == bfd_link_hash_defined ? N_TEXT : N_WEAKT;
4072 else if (sec == obj_datasec (output_bfd))
4073 type = h->root.type == bfd_link_hash_defined ? N_DATA : N_WEAKD;
4074 else if (sec == obj_bsssec (output_bfd))
4075 type = h->root.type == bfd_link_hash_defined ? N_BSS : N_WEAKB;
4077 type = h->root.type == bfd_link_hash_defined ? N_ABS : N_WEAKA;
4079 val = (h->root.u.def.value
4081 + h->root.u.def.section->output_offset);
4084 case bfd_link_hash_common:
4085 type = N_UNDF | N_EXT;
4086 val = h->root.u.c.size;
4088 case bfd_link_hash_undefweak:
4091 case bfd_link_hash_indirect:
4092 case bfd_link_hash_warning:
4093 /* FIXME: Ignore these for now. The circumstances under which
4094 they should be written out are not clear to me. */
4098 bfd_h_put_8 (output_bfd, type, outsym.e_type);
4099 bfd_h_put_8 (output_bfd, 0, outsym.e_other);
4100 bfd_h_put_16 (output_bfd, 0, outsym.e_desc);
4101 indx = add_to_stringtab (output_bfd, finfo->strtab, h->root.root.string,
4103 if (indx == (bfd_size_type) -1)
4105 /* FIXME: No way to handle errors. */
4108 PUT_WORD (output_bfd, indx, outsym.e_strx);
4109 PUT_WORD (output_bfd, val, outsym.e_value);
4111 if (bfd_seek (output_bfd, finfo->symoff, SEEK_SET) != 0
4112 || bfd_write ((PTR) &outsym, (bfd_size_type) EXTERNAL_NLIST_SIZE,
4113 (bfd_size_type) 1, output_bfd) != EXTERNAL_NLIST_SIZE)
4115 /* FIXME: No way to handle errors. */
4119 finfo->symoff += EXTERNAL_NLIST_SIZE;
4120 h->indx = obj_aout_external_sym_count (output_bfd);
4121 ++obj_aout_external_sym_count (output_bfd);
4126 /* Link an a.out section into the output file. */
4129 aout_link_input_section (finfo, input_bfd, input_section, reloff_ptr,
4131 struct aout_final_link_info *finfo;
4133 asection *input_section;
4134 file_ptr *reloff_ptr;
4135 bfd_size_type rel_size;
4137 bfd_size_type input_size;
4140 /* Get the section contents. */
4141 input_size = bfd_section_size (input_bfd, input_section);
4142 if (! bfd_get_section_contents (input_bfd, input_section,
4143 (PTR) finfo->contents,
4144 (file_ptr) 0, input_size))
4147 /* Read in the relocs if we haven't already done it. */
4148 if (aout_section_data (input_section) != NULL
4149 && aout_section_data (input_section)->relocs != NULL)
4150 relocs = aout_section_data (input_section)->relocs;
4153 relocs = finfo->relocs;
4156 if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0
4157 || bfd_read (relocs, 1, rel_size, input_bfd) != rel_size)
4162 /* Relocate the section contents. */
4163 if (obj_reloc_entry_size (input_bfd) == RELOC_STD_SIZE)
4165 if (! aout_link_input_section_std (finfo, input_bfd, input_section,
4166 (struct reloc_std_external *) relocs,
4167 rel_size, finfo->contents))
4172 if (! aout_link_input_section_ext (finfo, input_bfd, input_section,
4173 (struct reloc_ext_external *) relocs,
4174 rel_size, finfo->contents))
4178 /* Write out the section contents. */
4179 if (! bfd_set_section_contents (finfo->output_bfd,
4180 input_section->output_section,
4181 (PTR) finfo->contents,
4182 input_section->output_offset,
4186 /* If we are producing relocateable output, the relocs were
4187 modified, and we now write them out. */
4188 if (finfo->info->relocateable && rel_size > 0)
4190 if (bfd_seek (finfo->output_bfd, *reloff_ptr, SEEK_SET) != 0)
4192 if (bfd_write (relocs, (bfd_size_type) 1, rel_size, finfo->output_bfd)
4195 *reloff_ptr += rel_size;
4197 /* Assert that the relocs have not run into the symbols, and
4198 that if these are the text relocs they have not run into the
4200 BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (finfo->output_bfd)
4201 && (reloff_ptr != &finfo->treloff
4203 <= obj_datasec (finfo->output_bfd)->rel_filepos)));
4209 /* Get the section corresponding to a reloc index. */
4211 static INLINE asection *
4212 aout_reloc_index_to_section (abfd, indx)
4216 switch (indx & N_TYPE)
4219 return obj_textsec (abfd);
4221 return obj_datasec (abfd);
4223 return obj_bsssec (abfd);
4226 return bfd_abs_section_ptr;
4232 /* Relocate an a.out section using standard a.out relocs. */
4235 aout_link_input_section_std (finfo, input_bfd, input_section, relocs,
4237 struct aout_final_link_info *finfo;
4239 asection *input_section;
4240 struct reloc_std_external *relocs;
4241 bfd_size_type rel_size;
4244 boolean (*check_dynamic_reloc) PARAMS ((struct bfd_link_info *,
4246 struct aout_link_hash_entry *,
4249 boolean relocateable;
4250 struct external_nlist *syms;
4252 struct aout_link_hash_entry **sym_hashes;
4254 bfd_size_type reloc_count;
4255 register struct reloc_std_external *rel;
4256 struct reloc_std_external *rel_end;
4258 output_bfd = finfo->output_bfd;
4259 check_dynamic_reloc = aout_backend_info (output_bfd)->check_dynamic_reloc;
4261 BFD_ASSERT (obj_reloc_entry_size (input_bfd) == RELOC_STD_SIZE);
4262 BFD_ASSERT (input_bfd->xvec->header_byteorder_big_p
4263 == output_bfd->xvec->header_byteorder_big_p);
4265 relocateable = finfo->info->relocateable;
4266 syms = obj_aout_external_syms (input_bfd);
4267 strings = obj_aout_external_strings (input_bfd);
4268 sym_hashes = obj_aout_sym_hashes (input_bfd);
4269 symbol_map = finfo->symbol_map;
4271 reloc_count = rel_size / RELOC_STD_SIZE;
4273 rel_end = rel + reloc_count;
4274 for (; rel < rel_end; rel++)
4285 reloc_howto_type *howto;
4287 bfd_reloc_status_type r;
4289 r_addr = GET_SWORD (input_bfd, rel->r_address);
4291 #ifdef MY_reloc_howto
4292 howto = MY_reloc_howto(input_bfd, rel, r_index, r_extern, r_pcrel);
4294 if (input_bfd->xvec->header_byteorder_big_p)
4296 r_index = ((rel->r_index[0] << 16)
4297 | (rel->r_index[1] << 8)
4299 r_extern = (0 != (rel->r_type[0] & RELOC_STD_BITS_EXTERN_BIG));
4300 r_pcrel = (0 != (rel->r_type[0] & RELOC_STD_BITS_PCREL_BIG));
4301 r_baserel = (0 != (rel->r_type[0] & RELOC_STD_BITS_BASEREL_BIG));
4302 r_jmptable= (0 != (rel->r_type[0] & RELOC_STD_BITS_JMPTABLE_BIG));
4303 r_relative= (0 != (rel->r_type[0] & RELOC_STD_BITS_RELATIVE_BIG));
4304 r_length = ((rel->r_type[0] & RELOC_STD_BITS_LENGTH_BIG)
4305 >> RELOC_STD_BITS_LENGTH_SH_BIG);
4309 r_index = ((rel->r_index[2] << 16)
4310 | (rel->r_index[1] << 8)
4312 r_extern = (0 != (rel->r_type[0] & RELOC_STD_BITS_EXTERN_LITTLE));
4313 r_pcrel = (0 != (rel->r_type[0] & RELOC_STD_BITS_PCREL_LITTLE));
4314 r_baserel = (0 != (rel->r_type[0] & RELOC_STD_BITS_BASEREL_LITTLE));
4315 r_jmptable= (0 != (rel->r_type[0] & RELOC_STD_BITS_JMPTABLE_LITTLE));
4316 r_relative= (0 != (rel->r_type[0] & RELOC_STD_BITS_RELATIVE_LITTLE));
4317 r_length = ((rel->r_type[0] & RELOC_STD_BITS_LENGTH_LITTLE)
4318 >> RELOC_STD_BITS_LENGTH_SH_LITTLE);
4321 howto_idx = r_length + 4 * r_pcrel + 8 * r_baserel
4322 + 16 * r_jmptable + 32 * r_relative;
4323 BFD_ASSERT (howto_idx < TABLE_SIZE (howto_table_std));
4324 howto = howto_table_std + howto_idx;
4329 /* We are generating a relocateable output file, and must
4330 modify the reloc accordingly. */
4333 struct aout_link_hash_entry *h;
4335 /* If we know the symbol this relocation is against,
4336 convert it into a relocation against a section. This
4337 is what the native linker does. */
4338 h = sym_hashes[r_index];
4339 if (h != (struct aout_link_hash_entry *) NULL
4340 && (h->root.type == bfd_link_hash_defined
4341 || h->root.type == bfd_link_hash_defweak))
4343 asection *output_section;
4345 /* Change the r_extern value. */
4346 if (output_bfd->xvec->header_byteorder_big_p)
4347 rel->r_type[0] &=~ RELOC_STD_BITS_EXTERN_BIG;
4349 rel->r_type[0] &=~ RELOC_STD_BITS_EXTERN_LITTLE;
4351 /* Compute a new r_index. */
4352 output_section = h->root.u.def.section->output_section;
4353 if (output_section == obj_textsec (output_bfd))
4355 else if (output_section == obj_datasec (output_bfd))
4357 else if (output_section == obj_bsssec (output_bfd))
4362 /* Add the symbol value and the section VMA to the
4363 addend stored in the contents. */
4364 relocation = (h->root.u.def.value
4365 + output_section->vma
4366 + h->root.u.def.section->output_offset);
4370 /* We must change r_index according to the symbol
4372 r_index = symbol_map[r_index];
4378 /* We decided to strip this symbol, but it
4379 turns out that we can't. Note that we
4380 lose the other and desc information here.
4381 I don't think that will ever matter for a
4387 if (! aout_link_write_other_symbol (h,
4397 name = strings + GET_WORD (input_bfd,
4398 syms[r_index].e_strx);
4399 if (! ((*finfo->info->callbacks->unattached_reloc)
4400 (finfo->info, name, input_bfd, input_section,
4410 /* Write out the new r_index value. */
4411 if (output_bfd->xvec->header_byteorder_big_p)
4413 rel->r_index[0] = r_index >> 16;
4414 rel->r_index[1] = r_index >> 8;
4415 rel->r_index[2] = r_index;
4419 rel->r_index[2] = r_index >> 16;
4420 rel->r_index[1] = r_index >> 8;
4421 rel->r_index[0] = r_index;
4428 /* This is a relocation against a section. We must
4429 adjust by the amount that the section moved. */
4430 section = aout_reloc_index_to_section (input_bfd, r_index);
4431 relocation = (section->output_section->vma
4432 + section->output_offset
4436 /* Change the address of the relocation. */
4437 PUT_WORD (output_bfd,
4438 r_addr + input_section->output_offset,
4441 /* Adjust a PC relative relocation by removing the reference
4442 to the original address in the section and including the
4443 reference to the new address. */
4445 relocation -= (input_section->output_section->vma
4446 + input_section->output_offset
4447 - input_section->vma);
4449 if (relocation == 0)
4452 r = _bfd_relocate_contents (howto,
4453 input_bfd, relocation,
4458 /* We are generating an executable, and must do a full
4462 struct aout_link_hash_entry *h;
4464 h = sym_hashes[r_index];
4466 if (check_dynamic_reloc != NULL)
4470 if (! ((*check_dynamic_reloc)
4471 (finfo->info, input_bfd, input_section, h,
4478 if (h != (struct aout_link_hash_entry *) NULL
4479 && (h->root.type == bfd_link_hash_defined
4480 || h->root.type == bfd_link_hash_defweak))
4482 relocation = (h->root.u.def.value
4483 + h->root.u.def.section->output_section->vma
4484 + h->root.u.def.section->output_offset);
4486 else if (h != (struct aout_link_hash_entry *) NULL
4487 && h->root.type == bfd_link_hash_undefweak)
4493 name = strings + GET_WORD (input_bfd, syms[r_index].e_strx);
4494 if (! ((*finfo->info->callbacks->undefined_symbol)
4495 (finfo->info, name, input_bfd, input_section,
4505 section = aout_reloc_index_to_section (input_bfd, r_index);
4506 relocation = (section->output_section->vma
4507 + section->output_offset
4510 relocation += input_section->vma;
4513 r = _bfd_final_link_relocate (howto,
4514 input_bfd, input_section,
4515 contents, r_addr, relocation,
4519 if (r != bfd_reloc_ok)
4524 case bfd_reloc_outofrange:
4526 case bfd_reloc_overflow:
4531 name = strings + GET_WORD (input_bfd,
4532 syms[r_index].e_strx);
4537 s = aout_reloc_index_to_section (input_bfd, r_index);
4538 name = bfd_section_name (input_bfd, s);
4540 if (! ((*finfo->info->callbacks->reloc_overflow)
4541 (finfo->info, name, howto->name,
4542 (bfd_vma) 0, input_bfd, input_section, r_addr)))
4553 /* Relocate an a.out section using extended a.out relocs. */
4556 aout_link_input_section_ext (finfo, input_bfd, input_section, relocs,
4558 struct aout_final_link_info *finfo;
4560 asection *input_section;
4561 struct reloc_ext_external *relocs;
4562 bfd_size_type rel_size;
4565 boolean (*check_dynamic_reloc) PARAMS ((struct bfd_link_info *,
4567 struct aout_link_hash_entry *,
4570 boolean relocateable;
4571 struct external_nlist *syms;
4573 struct aout_link_hash_entry **sym_hashes;
4575 bfd_size_type reloc_count;
4576 register struct reloc_ext_external *rel;
4577 struct reloc_ext_external *rel_end;
4579 output_bfd = finfo->output_bfd;
4580 check_dynamic_reloc = aout_backend_info (output_bfd)->check_dynamic_reloc;
4582 BFD_ASSERT (obj_reloc_entry_size (input_bfd) == RELOC_EXT_SIZE);
4583 BFD_ASSERT (input_bfd->xvec->header_byteorder_big_p
4584 == output_bfd->xvec->header_byteorder_big_p);
4586 relocateable = finfo->info->relocateable;
4587 syms = obj_aout_external_syms (input_bfd);
4588 strings = obj_aout_external_strings (input_bfd);
4589 sym_hashes = obj_aout_sym_hashes (input_bfd);
4590 symbol_map = finfo->symbol_map;
4592 reloc_count = rel_size / RELOC_EXT_SIZE;
4594 rel_end = rel + reloc_count;
4595 for (; rel < rel_end; rel++)
4604 r_addr = GET_SWORD (input_bfd, rel->r_address);
4606 if (input_bfd->xvec->header_byteorder_big_p)
4608 r_index = ((rel->r_index[0] << 16)
4609 | (rel->r_index[1] << 8)
4611 r_extern = (0 != (rel->r_type[0] & RELOC_EXT_BITS_EXTERN_BIG));
4612 r_type = ((rel->r_type[0] & RELOC_EXT_BITS_TYPE_BIG)
4613 >> RELOC_EXT_BITS_TYPE_SH_BIG);
4617 r_index = ((rel->r_index[2] << 16)
4618 | (rel->r_index[1] << 8)
4620 r_extern = (0 != (rel->r_type[0] & RELOC_EXT_BITS_EXTERN_LITTLE));
4621 r_type = ((rel->r_type[0] & RELOC_EXT_BITS_TYPE_LITTLE)
4622 >> RELOC_EXT_BITS_TYPE_SH_LITTLE);
4625 r_addend = GET_SWORD (input_bfd, rel->r_addend);
4627 BFD_ASSERT (r_type >= 0
4628 && r_type < TABLE_SIZE (howto_table_ext));
4632 /* We are generating a relocateable output file, and must
4633 modify the reloc accordingly. */
4636 struct aout_link_hash_entry *h;
4638 /* If we know the symbol this relocation is against,
4639 convert it into a relocation against a section. This
4640 is what the native linker does. */
4641 h = sym_hashes[r_index];
4642 if (h != (struct aout_link_hash_entry *) NULL
4643 && (h->root.type == bfd_link_hash_defined
4644 || h->root.type == bfd_link_hash_defweak))
4646 asection *output_section;
4648 /* Change the r_extern value. */
4649 if (output_bfd->xvec->header_byteorder_big_p)
4650 rel->r_type[0] &=~ RELOC_EXT_BITS_EXTERN_BIG;
4652 rel->r_type[0] &=~ RELOC_EXT_BITS_EXTERN_LITTLE;
4654 /* Compute a new r_index. */
4655 output_section = h->root.u.def.section->output_section;
4656 if (output_section == obj_textsec (output_bfd))
4658 else if (output_section == obj_datasec (output_bfd))
4660 else if (output_section == obj_bsssec (output_bfd))
4665 /* Add the symbol value and the section VMA to the
4667 relocation = (h->root.u.def.value
4668 + output_section->vma
4669 + h->root.u.def.section->output_offset);
4671 /* Now RELOCATION is the VMA of the final
4672 destination. If this is a PC relative reloc,
4673 then ADDEND is the negative of the source VMA.
4674 We want to set ADDEND to the difference between
4675 the destination VMA and the source VMA, which
4676 means we must adjust RELOCATION by the change in
4677 the source VMA. This is done below. */
4681 /* We must change r_index according to the symbol
4683 r_index = symbol_map[r_index];
4689 /* We decided to strip this symbol, but it
4690 turns out that we can't. Note that we
4691 lose the other and desc information here.
4692 I don't think that will ever matter for a
4698 if (! aout_link_write_other_symbol (h,
4708 name = strings + GET_WORD (input_bfd,
4709 syms[r_index].e_strx);
4710 if (! ((*finfo->info->callbacks->unattached_reloc)
4711 (finfo->info, name, input_bfd, input_section,
4720 /* If this is a PC relative reloc, then the addend
4721 is the negative of the source VMA. We must
4722 adjust it by the change in the source VMA. This
4726 /* Write out the new r_index value. */
4727 if (output_bfd->xvec->header_byteorder_big_p)
4729 rel->r_index[0] = r_index >> 16;
4730 rel->r_index[1] = r_index >> 8;
4731 rel->r_index[2] = r_index;
4735 rel->r_index[2] = r_index >> 16;
4736 rel->r_index[1] = r_index >> 8;
4737 rel->r_index[0] = r_index;
4744 /* This is a relocation against a section. We must
4745 adjust by the amount that the section moved. */
4746 section = aout_reloc_index_to_section (input_bfd, r_index);
4747 relocation = (section->output_section->vma
4748 + section->output_offset
4751 /* If this is a PC relative reloc, then the addend is
4752 the difference in VMA between the destination and the
4753 source. We have just adjusted for the change in VMA
4754 of the destination, so we must also adjust by the
4755 change in VMA of the source. This is done below. */
4758 /* As described above, we must always adjust a PC relative
4759 reloc by the change in VMA of the source. */
4760 if (howto_table_ext[r_type].pc_relative)
4761 relocation -= (input_section->output_section->vma
4762 + input_section->output_offset
4763 - input_section->vma);
4765 /* Change the addend if necessary. */
4766 if (relocation != 0)
4767 PUT_WORD (output_bfd, r_addend + relocation, rel->r_addend);
4769 /* Change the address of the relocation. */
4770 PUT_WORD (output_bfd,
4771 r_addr + input_section->output_offset,
4776 bfd_reloc_status_type r;
4778 /* We are generating an executable, and must do a full
4782 struct aout_link_hash_entry *h;
4784 h = sym_hashes[r_index];
4786 if (check_dynamic_reloc != NULL)
4790 if (! ((*check_dynamic_reloc)
4791 (finfo->info, input_bfd, input_section, h,
4798 if (h != (struct aout_link_hash_entry *) NULL
4799 && (h->root.type == bfd_link_hash_defined
4800 || h->root.type == bfd_link_hash_defweak))
4802 relocation = (h->root.u.def.value
4803 + h->root.u.def.section->output_section->vma
4804 + h->root.u.def.section->output_offset);
4806 else if (h != (struct aout_link_hash_entry *) NULL
4807 && h->root.type == bfd_link_hash_undefweak)
4813 name = strings + GET_WORD (input_bfd, syms[r_index].e_strx);
4814 if (! ((*finfo->info->callbacks->undefined_symbol)
4815 (finfo->info, name, input_bfd, input_section,
4825 section = aout_reloc_index_to_section (input_bfd, r_index);
4827 /* If this is a PC relative reloc, then R_ADDEND is the
4828 difference between the two vmas, or
4829 old_dest_sec + old_dest_off - (old_src_sec + old_src_off)
4831 old_dest_sec == section->vma
4833 old_src_sec == input_section->vma
4835 old_src_off == r_addr
4837 _bfd_final_link_relocate expects RELOCATION +
4838 R_ADDEND to be the VMA of the destination minus
4839 r_addr (the minus r_addr is because this relocation
4840 is not pcrel_offset, which is a bit confusing and
4841 should, perhaps, be changed), or
4844 new_dest_sec == output_section->vma + output_offset
4845 We arrange for this to happen by setting RELOCATION to
4846 new_dest_sec + old_src_sec - old_dest_sec
4848 If this is not a PC relative reloc, then R_ADDEND is
4849 simply the VMA of the destination, so we set
4850 RELOCATION to the change in the destination VMA, or
4851 new_dest_sec - old_dest_sec
4853 relocation = (section->output_section->vma
4854 + section->output_offset
4856 if (howto_table_ext[r_type].pc_relative)
4857 relocation += input_section->vma;
4860 r = _bfd_final_link_relocate (howto_table_ext + r_type,
4861 input_bfd, input_section,
4862 contents, r_addr, relocation,
4864 if (r != bfd_reloc_ok)
4869 case bfd_reloc_outofrange:
4871 case bfd_reloc_overflow:
4876 name = strings + GET_WORD (input_bfd,
4877 syms[r_index].e_strx);
4882 s = aout_reloc_index_to_section (input_bfd, r_index);
4883 name = bfd_section_name (input_bfd, s);
4885 if (! ((*finfo->info->callbacks->reloc_overflow)
4886 (finfo->info, name, howto_table_ext[r_type].name,
4887 r_addend, input_bfd, input_section, r_addr)))
4899 /* Handle a link order which is supposed to generate a reloc. */
4902 aout_link_reloc_link_order (finfo, o, p)
4903 struct aout_final_link_info *finfo;
4905 struct bfd_link_order *p;
4907 struct bfd_link_order_reloc *pr;
4910 reloc_howto_type *howto;
4911 file_ptr *reloff_ptr;
4912 struct reloc_std_external srel;
4913 struct reloc_ext_external erel;
4918 if (p->type == bfd_section_reloc_link_order)
4921 if (bfd_is_abs_section (pr->u.section))
4922 r_index = N_ABS | N_EXT;
4925 BFD_ASSERT (pr->u.section->owner == finfo->output_bfd);
4926 r_index = pr->u.section->target_index;
4931 struct aout_link_hash_entry *h;
4933 BFD_ASSERT (p->type == bfd_symbol_reloc_link_order);
4935 h = aout_link_hash_lookup (aout_hash_table (finfo->info),
4936 pr->u.name, false, false, true);
4937 if (h != (struct aout_link_hash_entry *) NULL
4942 /* We decided to strip this symbol, but it turns out that we
4943 can't. Note that we lose the other and desc information
4944 here. I don't think that will ever matter for a global
4948 if (! aout_link_write_other_symbol (h, (PTR) finfo))
4954 if (! ((*finfo->info->callbacks->unattached_reloc)
4955 (finfo->info, pr->u.name, (bfd *) NULL,
4956 (asection *) NULL, (bfd_vma) 0)))
4962 howto = bfd_reloc_type_lookup (finfo->output_bfd, pr->reloc);
4965 bfd_set_error (bfd_error_bad_value);
4969 if (o == obj_textsec (finfo->output_bfd))
4970 reloff_ptr = &finfo->treloff;
4971 else if (o == obj_datasec (finfo->output_bfd))
4972 reloff_ptr = &finfo->dreloff;
4976 if (obj_reloc_entry_size (finfo->output_bfd) == RELOC_STD_SIZE)
4985 MY_put_reloc(finfo->output_bfd, r_extern, r_index, p->offset, howto, &srel);
4987 r_pcrel = howto->pc_relative;
4988 r_baserel = (howto->type & 8) != 0;
4989 r_jmptable = (howto->type & 16) != 0;
4990 r_relative = (howto->type & 32) != 0;
4991 r_length = howto->size;
4993 PUT_WORD (finfo->output_bfd, p->offset, srel.r_address);
4994 if (finfo->output_bfd->xvec->header_byteorder_big_p)
4996 srel.r_index[0] = r_index >> 16;
4997 srel.r_index[1] = r_index >> 8;
4998 srel.r_index[2] = r_index;
5000 ((r_extern ? RELOC_STD_BITS_EXTERN_BIG : 0)
5001 | (r_pcrel ? RELOC_STD_BITS_PCREL_BIG : 0)
5002 | (r_baserel ? RELOC_STD_BITS_BASEREL_BIG : 0)
5003 | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_BIG : 0)
5004 | (r_relative ? RELOC_STD_BITS_RELATIVE_BIG : 0)
5005 | (r_length << RELOC_STD_BITS_LENGTH_SH_BIG));
5009 srel.r_index[2] = r_index >> 16;
5010 srel.r_index[1] = r_index >> 8;
5011 srel.r_index[0] = r_index;
5013 ((r_extern ? RELOC_STD_BITS_EXTERN_LITTLE : 0)
5014 | (r_pcrel ? RELOC_STD_BITS_PCREL_LITTLE : 0)
5015 | (r_baserel ? RELOC_STD_BITS_BASEREL_LITTLE : 0)
5016 | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_LITTLE : 0)
5017 | (r_relative ? RELOC_STD_BITS_RELATIVE_LITTLE : 0)
5018 | (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE));
5021 rel_ptr = (PTR) &srel;
5023 /* We have to write the addend into the object file, since
5024 standard a.out relocs are in place. It would be more
5025 reliable if we had the current contents of the file here,
5026 rather than assuming zeroes, but we can't read the file since
5027 it was opened using bfd_openw. */
5028 if (pr->addend != 0)
5031 bfd_reloc_status_type r;
5035 size = bfd_get_reloc_size (howto);
5036 buf = (bfd_byte *) bfd_zmalloc (size);
5037 if (buf == (bfd_byte *) NULL)
5039 bfd_set_error (bfd_error_no_memory);
5042 r = _bfd_relocate_contents (howto, finfo->output_bfd,
5049 case bfd_reloc_outofrange:
5051 case bfd_reloc_overflow:
5052 if (! ((*finfo->info->callbacks->reloc_overflow)
5054 (p->type == bfd_section_reloc_link_order
5055 ? bfd_section_name (finfo->output_bfd,
5058 howto->name, pr->addend, (bfd *) NULL,
5059 (asection *) NULL, (bfd_vma) 0)))
5066 ok = bfd_set_section_contents (finfo->output_bfd, o,
5068 (file_ptr) p->offset,
5077 PUT_WORD (finfo->output_bfd, p->offset, erel.r_address);
5079 if (finfo->output_bfd->xvec->header_byteorder_big_p)
5081 erel.r_index[0] = r_index >> 16;
5082 erel.r_index[1] = r_index >> 8;
5083 erel.r_index[2] = r_index;
5085 ((r_extern ? RELOC_EXT_BITS_EXTERN_BIG : 0)
5086 | (howto->type << RELOC_EXT_BITS_TYPE_SH_BIG));
5090 erel.r_index[2] = r_index >> 16;
5091 erel.r_index[1] = r_index >> 8;
5092 erel.r_index[0] = r_index;
5094 (r_extern ? RELOC_EXT_BITS_EXTERN_LITTLE : 0)
5095 | (howto->type << RELOC_EXT_BITS_TYPE_SH_LITTLE);
5098 PUT_WORD (finfo->output_bfd, pr->addend, erel.r_addend);
5100 rel_ptr = (PTR) &erel;
5103 if (bfd_seek (finfo->output_bfd, *reloff_ptr, SEEK_SET) != 0
5104 || (bfd_write (rel_ptr, (bfd_size_type) 1,
5105 obj_reloc_entry_size (finfo->output_bfd),
5107 != obj_reloc_entry_size (finfo->output_bfd)))
5110 *reloff_ptr += obj_reloc_entry_size (finfo->output_bfd);
5112 /* Assert that the relocs have not run into the symbols, and that n
5113 the text relocs have not run into the data relocs. */
5114 BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (finfo->output_bfd)
5115 && (reloff_ptr != &finfo->treloff
5117 <= obj_datasec (finfo->output_bfd)->rel_filepos)));