Coverage Report

Created: 2023-06-29 07:13

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