Coverage Report

Created: 2023-08-28 06:31

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