Coverage Report

Created: 2025-06-24 06:45

/src/binutils-gdb/bfd/xcofflink.c
Line
Count
Source (jump to first uncovered line)
1
/* POWER/PowerPC XCOFF linker support.
2
   Copyright (C) 1995-2025 Free Software Foundation, Inc.
3
   Written by Ian Lance Taylor <ian@cygnus.com>, Cygnus Support.
4
5
   This file is part of BFD, the Binary File Descriptor library.
6
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
22
#include "sysdep.h"
23
#include "bfd.h"
24
#include "bfdlink.h"
25
#include "libbfd.h"
26
#include "coff/internal.h"
27
#include "coff/xcoff.h"
28
#include "libcoff.h"
29
#include "libxcoff.h"
30
#include "libiberty.h"
31
#include "xcofflink.h"
32
33
/* This file holds the XCOFF linker code.  */
34
35
#undef  STRING_SIZE_SIZE
36
0
#define STRING_SIZE_SIZE 4
37
38
/* The list of import files.  */
39
40
struct xcoff_import_file
41
{
42
  /* The next entry in the list.  */
43
  struct xcoff_import_file *next;
44
  /* The path.  */
45
  const char *path;
46
  /* The file name.  */
47
  const char *file;
48
  /* The member name.  */
49
  const char *member;
50
};
51
52
/* Information we keep for each section in the output file during the
53
   final link phase.  */
54
55
struct xcoff_link_section_info
56
{
57
  /* The relocs to be output.  */
58
  struct internal_reloc *relocs;
59
  /* For each reloc against a global symbol whose index was not known
60
     when the reloc was handled, the global hash table entry.  */
61
  struct xcoff_link_hash_entry **rel_hashes;
62
  /* If there is a TOC relative reloc against a global symbol, and the
63
     index of the TOC symbol is not known when the reloc was handled,
64
     an entry is added to this linked list.  This is not an array,
65
     like rel_hashes, because this case is quite uncommon.  */
66
  struct xcoff_toc_rel_hash
67
  {
68
    struct xcoff_toc_rel_hash *next;
69
    struct xcoff_link_hash_entry *h;
70
    struct internal_reloc *rel;
71
  } *toc_rel_hashes;
72
};
73
74
/* Information that the XCOFF linker collects about an archive.  */
75
struct xcoff_archive_info
76
{
77
  /* The archive described by this entry.  */
78
  bfd *archive;
79
80
  /* The import path and import filename to use when referring to
81
     this archive in the .loader section.  */
82
  const char *imppath;
83
  const char *impfile;
84
85
  /* True if the archive contains a dynamic object.  */
86
  unsigned int contains_shared_object_p : 1;
87
88
  /* True if the previous field is valid.  */
89
  unsigned int know_contains_shared_object_p : 1;
90
};
91
92
struct xcoff_link_hash_table
93
{
94
  struct bfd_link_hash_table root;
95
96
  /* The stub hash table.  */
97
  struct bfd_hash_table stub_hash_table;
98
99
  /* Info passed by the linker.  */
100
  struct bfd_xcoff_link_params *params;
101
102
  /* The .debug string hash table.  We need to compute this while
103
     reading the input files, so that we know how large the .debug
104
     section will be before we assign section positions.  */
105
  struct bfd_strtab_hash *debug_strtab;
106
107
  /* The .debug section we will use for the final output.  */
108
  asection *debug_section;
109
110
  /* The .loader section we will use for the final output.  */
111
  asection *loader_section;
112
113
  /* The structure holding information about the .loader section.  */
114
  struct xcoff_loader_info ldinfo;
115
116
  /* The .loader section header.  */
117
  struct internal_ldhdr ldhdr;
118
119
  /* The .gl section we use to hold global linkage code.  */
120
  asection *linkage_section;
121
122
  /* The .tc section we use to hold toc entries we build for global
123
     linkage code.  */
124
  asection *toc_section;
125
126
  /* The .ds section we use to hold function descriptors which we
127
     create for exported symbols.  */
128
  asection *descriptor_section;
129
130
  /* The list of import files.  */
131
  struct xcoff_import_file *imports;
132
133
  /* Required alignment of sections within the output file.  */
134
  unsigned long file_align;
135
136
  /* Whether the .text section must be read-only.  */
137
  bool textro;
138
139
  /* Whether -brtl was specified.  */
140
  bool rtld;
141
142
  /* Whether garbage collection was done.  */
143
  bool gc;
144
145
  /* A linked list of symbols for which we have size information.  */
146
  struct xcoff_link_size_list
147
  {
148
    struct xcoff_link_size_list *next;
149
    struct xcoff_link_hash_entry *h;
150
    bfd_size_type size;
151
  }
152
  *size_list;
153
154
  /* Information about archives.  */
155
  htab_t archive_info;
156
157
  /* Magic sections: _text, _etext, _data, _edata, _end, end. */
158
  asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_SECTIONS];
159
};
160
161
/* Information that we pass around while doing the final link step.  */
162
163
struct xcoff_final_link_info
164
{
165
  /* General link information.  */
166
  struct bfd_link_info *info;
167
  /* Output BFD.  */
168
  bfd *output_bfd;
169
  /* Hash table for long symbol names.  */
170
  struct bfd_strtab_hash *strtab;
171
  /* Array of information kept for each output section, indexed by the
172
     target_index field.  */
173
  struct xcoff_link_section_info *section_info;
174
  /* Symbol index of last C_FILE symbol (-1 if none).  */
175
  long last_file_index;
176
  /* Contents of last C_FILE symbol.  */
177
  struct internal_syment last_file;
178
  /* Symbol index of TOC symbol.  */
179
  long toc_symindx;
180
  /* Start of .loader symbols.  */
181
  bfd_byte *ldsym;
182
  /* Next .loader reloc to swap out.  */
183
  bfd_byte *ldrel;
184
  /* File position of start of line numbers.  */
185
  file_ptr line_filepos;
186
  /* Buffer large enough to hold swapped symbols of any input file.  */
187
  struct internal_syment *internal_syms;
188
  /* Buffer large enough to hold output indices of symbols of any
189
     input file.  */
190
  long *sym_indices;
191
  /* Buffer large enough to hold output symbols for any input file.  */
192
  bfd_byte *outsyms;
193
  /* Buffer large enough to hold external line numbers for any input
194
     section.  */
195
  bfd_byte *linenos;
196
  /* Buffer large enough to hold any input section.  */
197
  bfd_byte *contents;
198
  /* Buffer large enough to hold external relocs of any input section.  */
199
  bfd_byte *external_relocs;
200
};
201
202
#define xcoff_stub_hash_entry(ent)    \
203
  ((struct xcoff_stub_hash_entry *)(ent))
204
205
#define xcoff_stub_hash_lookup(table, string, create, copy) \
206
0
  ((struct xcoff_stub_hash_entry *)       \
207
0
   bfd_hash_lookup ((table), (string), (create), (copy)))
208
209
static bool xcoff_mark (struct bfd_link_info *, asection *);
210
211

212
213
/* Routines to read XCOFF dynamic information.  This don't really
214
   belong here, but we already have the ldsym manipulation routines
215
   here.  */
216
217
/* Read the contents of a section.  */
218
219
static bfd_byte *
220
xcoff_get_section_contents (bfd *abfd, asection *sec)
221
0
{
222
0
  if (coff_section_data (abfd, sec) == NULL)
223
0
    {
224
0
      size_t amt = sizeof (struct coff_section_tdata);
225
226
0
      sec->used_by_bfd = bfd_zalloc (abfd, amt);
227
0
      if (sec->used_by_bfd == NULL)
228
0
       return NULL;
229
0
    }
230
231
0
  bfd_byte *contents = coff_section_data (abfd, sec)->contents;
232
0
  if (contents == NULL)
233
0
    {
234
0
      if (bfd_malloc_and_get_section (abfd, sec, &contents))
235
0
  coff_section_data (abfd, sec)->contents = contents;
236
0
      else
237
0
  {
238
0
    free (contents);
239
0
    contents = NULL;
240
0
  }
241
0
    }
242
243
0
  return contents;
244
0
}
245
246
/* Read .loader and swap in the header.  Sanity check to prevent
247
   buffer overflows.  Don't bother to check for overlap as that sort
248
   of insanity shouldn't lead to incorrect program behaviour.  */
249
250
static bfd_byte *
251
xcoff_get_ldhdr (bfd *abfd, asection *lsec, struct internal_ldhdr *ldhdr)
252
0
{
253
0
  bfd_byte *contents = xcoff_get_section_contents (abfd, lsec);
254
0
  if (contents)
255
0
    {
256
0
      bfd_xcoff_swap_ldhdr_in (abfd, contents, ldhdr);
257
0
      if (ldhdr->l_nsyms != 0)
258
0
  {
259
0
    bfd_vma symoff = bfd_xcoff_loader_symbol_offset (abfd, ldhdr);
260
0
    if (symoff > lsec->size)
261
0
      goto fail;
262
0
    bfd_size_type onesym = bfd_xcoff_ldsymsz (abfd);
263
0
    bfd_size_type syms;
264
0
    if (_bfd_mul_overflow (ldhdr->l_nsyms, onesym, &syms)
265
0
        || syms > lsec->size - symoff)
266
0
      goto fail;
267
0
  }
268
0
      if (ldhdr->l_stlen != 0
269
0
    && (ldhdr->l_stoff > lsec->size
270
0
        || ldhdr->l_stlen > lsec->size - ldhdr->l_stoff))
271
0
  goto fail;
272
0
      if (ldhdr->l_nreloc != 0)
273
0
  {
274
0
    bfd_vma reloff = bfd_xcoff_loader_reloc_offset (abfd, ldhdr);
275
0
    if (reloff > lsec->size)
276
0
      goto fail;
277
0
    bfd_size_type onerel = bfd_xcoff_ldrelsz (abfd);
278
0
    bfd_size_type rels;
279
0
    if (_bfd_mul_overflow (ldhdr->l_nreloc, onerel, &rels)
280
0
        || rels > lsec->size - reloff)
281
0
      goto fail;
282
0
  }
283
0
      if (ldhdr->l_nimpid != 0
284
0
    && (ldhdr->l_impoff > lsec->size
285
0
        || ldhdr->l_istlen > lsec->size - ldhdr->l_impoff))
286
0
  goto fail;
287
0
    }
288
0
  return contents;
289
290
0
 fail:
291
0
  bfd_set_error (bfd_error_file_truncated);
292
0
  return NULL;
293
0
}
294
295
/* Get the size required to hold the dynamic symbols.  */
296
297
long
298
_bfd_xcoff_get_dynamic_symtab_upper_bound (bfd *abfd)
299
197
{
300
197
  asection *lsec;
301
197
  bfd_byte *contents;
302
197
  struct internal_ldhdr ldhdr;
303
304
197
  if ((abfd->flags & DYNAMIC) == 0)
305
138
    {
306
138
      bfd_set_error (bfd_error_invalid_operation);
307
138
      return -1;
308
138
    }
309
310
59
  lsec = bfd_get_section_by_name (abfd, ".loader");
311
59
  if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0)
312
59
    {
313
59
      bfd_set_error (bfd_error_no_symbols);
314
59
      return -1;
315
59
    }
316
317
0
  contents = xcoff_get_ldhdr (abfd, lsec, &ldhdr);
318
0
  if (!contents)
319
0
    return -1;
320
321
0
  return (ldhdr.l_nsyms + 1) * sizeof (asymbol *);
322
0
}
323
324
/* Get the dynamic symbols.  */
325
326
long
327
_bfd_xcoff_canonicalize_dynamic_symtab (bfd *abfd, asymbol **psyms)
328
0
{
329
0
  asection *lsec;
330
0
  bfd_byte *contents;
331
0
  struct internal_ldhdr ldhdr;
332
0
  const char *strings;
333
0
  bfd_byte *elsym, *elsymend;
334
0
  coff_symbol_type *symbuf;
335
336
0
  if ((abfd->flags & DYNAMIC) == 0)
337
0
    {
338
0
      bfd_set_error (bfd_error_invalid_operation);
339
0
      return -1;
340
0
    }
341
342
0
  lsec = bfd_get_section_by_name (abfd, ".loader");
343
0
  if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0)
344
0
    {
345
0
      bfd_set_error (bfd_error_no_symbols);
346
0
      return -1;
347
0
    }
348
349
0
  contents = xcoff_get_ldhdr (abfd, lsec, &ldhdr);
350
0
  if (!contents)
351
0
    return -1;
352
353
0
  strings = (char *) contents + ldhdr.l_stoff;
354
355
0
  symbuf = bfd_zalloc (abfd, ldhdr.l_nsyms * sizeof (* symbuf));
356
0
  if (symbuf == NULL)
357
0
    return -1;
358
359
0
  elsym = contents + bfd_xcoff_loader_symbol_offset(abfd, &ldhdr);
360
361
0
  elsymend = elsym + ldhdr.l_nsyms * bfd_xcoff_ldsymsz(abfd);
362
0
  for (; elsym < elsymend; elsym += bfd_xcoff_ldsymsz(abfd), symbuf++, psyms++)
363
0
    {
364
0
      struct internal_ldsym ldsym;
365
366
0
      bfd_xcoff_swap_ldsym_in (abfd, elsym, &ldsym);
367
368
0
      symbuf->symbol.the_bfd = abfd;
369
370
0
      if (ldsym._l._l_l._l_zeroes != 0)
371
0
  {
372
0
    char *c;
373
374
0
    c = bfd_alloc (abfd, (bfd_size_type) SYMNMLEN + 1);
375
0
    if (c == NULL)
376
0
      return -1;
377
0
    memcpy (c, ldsym._l._l_name, SYMNMLEN);
378
0
    c[SYMNMLEN] = '\0';
379
0
    symbuf->symbol.name = c;
380
0
  }
381
0
      else if (ldsym._l._l_l._l_offset < ldhdr.l_stlen)
382
0
  symbuf->symbol.name = strings + ldsym._l._l_l._l_offset;
383
0
      else
384
0
  symbuf->symbol.name = _("<corrupt>");
385
386
0
      if (ldsym.l_smclas == XMC_XO)
387
0
  symbuf->symbol.section = bfd_abs_section_ptr;
388
0
      else
389
0
  symbuf->symbol.section = coff_section_from_bfd_index (abfd,
390
0
                    ldsym.l_scnum);
391
0
      symbuf->symbol.value = ldsym.l_value - symbuf->symbol.section->vma;
392
393
0
      symbuf->symbol.flags = BSF_NO_FLAGS;
394
0
      if ((ldsym.l_smtype & L_EXPORT) != 0)
395
0
  {
396
0
    if ((ldsym.l_smtype & L_WEAK) != 0)
397
0
      symbuf->symbol.flags |= BSF_WEAK;
398
0
    else
399
0
      symbuf->symbol.flags |= BSF_GLOBAL;
400
0
  }
401
402
      /* FIXME: We have no way to record the other information stored
403
   with the loader symbol.  */
404
0
      *psyms = (asymbol *) symbuf;
405
0
    }
406
407
0
  *psyms = NULL;
408
409
0
  return ldhdr.l_nsyms;
410
0
}
411
412
/* Get the size required to hold the dynamic relocs.  */
413
414
long
415
_bfd_xcoff_get_dynamic_reloc_upper_bound (bfd *abfd)
416
197
{
417
197
  asection *lsec;
418
197
  bfd_byte *contents;
419
197
  struct internal_ldhdr ldhdr;
420
421
197
  if ((abfd->flags & DYNAMIC) == 0)
422
138
    {
423
138
      bfd_set_error (bfd_error_invalid_operation);
424
138
      return -1;
425
138
    }
426
427
59
  lsec = bfd_get_section_by_name (abfd, ".loader");
428
59
  if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0)
429
59
    {
430
59
      bfd_set_error (bfd_error_no_symbols);
431
59
      return -1;
432
59
    }
433
434
0
  contents = xcoff_get_ldhdr (abfd, lsec, &ldhdr);
435
0
  if (!contents)
436
0
    return -1;
437
438
0
  return (ldhdr.l_nreloc + 1) * sizeof (arelent *);
439
0
}
440
441
/* Get the dynamic relocs.  */
442
443
long
444
_bfd_xcoff_canonicalize_dynamic_reloc (bfd *abfd,
445
               arelent **prelocs,
446
               asymbol **syms)
447
0
{
448
0
  asection *lsec;
449
0
  bfd_byte *contents;
450
0
  struct internal_ldhdr ldhdr;
451
0
  arelent *relbuf;
452
0
  bfd_byte *elrel, *elrelend;
453
454
0
  if ((abfd->flags & DYNAMIC) == 0)
455
0
    {
456
0
      bfd_set_error (bfd_error_invalid_operation);
457
0
      return -1;
458
0
    }
459
460
0
  lsec = bfd_get_section_by_name (abfd, ".loader");
461
0
  if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0)
462
0
    {
463
0
      bfd_set_error (bfd_error_no_symbols);
464
0
      return -1;
465
0
    }
466
467
0
  contents = xcoff_get_ldhdr (abfd, lsec, &ldhdr);
468
0
  if (!contents)
469
0
    return -1;
470
471
0
  relbuf = bfd_alloc (abfd, ldhdr.l_nreloc * sizeof (arelent));
472
0
  if (relbuf == NULL)
473
0
    return -1;
474
475
0
  elrel = contents + bfd_xcoff_loader_reloc_offset(abfd, &ldhdr);
476
477
0
  elrelend = elrel + ldhdr.l_nreloc * bfd_xcoff_ldrelsz(abfd);
478
0
  for (; elrel < elrelend; elrel += bfd_xcoff_ldrelsz(abfd), relbuf++,
479
0
   prelocs++)
480
0
    {
481
0
      struct internal_ldrel ldrel;
482
483
0
      bfd_xcoff_swap_ldrel_in (abfd, elrel, &ldrel);
484
485
0
      if (ldrel.l_symndx + 2 < 5)
486
0
  {
487
0
    static const char stdsec[5][8]
488
0
      = { ".tbss", ".tdata", ".text", ".data", ".bss" };
489
0
    const char *name = stdsec[ldrel.l_symndx + 2];
490
0
    asection *sec = bfd_get_section_by_name (abfd, name);
491
0
    if (sec == NULL)
492
0
      {
493
0
        bfd_set_error (bfd_error_bad_value);
494
0
        return -1;
495
0
      }
496
497
0
    relbuf->sym_ptr_ptr = &sec->symbol;
498
0
  }
499
0
      else if (ldrel.l_symndx - 3 < ldhdr.l_nsyms)
500
0
  relbuf->sym_ptr_ptr = syms + (ldrel.l_symndx - 3);
501
0
      else
502
0
  {
503
0
    _bfd_error_handler
504
      /* xgettext:c-format */
505
0
      (_("%pB: warning: illegal symbol index %lu in relocs"),
506
0
       abfd, (unsigned long) ldrel.l_symndx);
507
0
    relbuf->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
508
0
  }
509
510
0
      relbuf->address = ldrel.l_vaddr;
511
0
      relbuf->addend = 0;
512
513
      /* Most dynamic relocs have the same type.  FIXME: This is only
514
   correct if ldrel.l_rtype == 0.  In other cases, we should use
515
   a different howto.  */
516
0
      relbuf->howto = bfd_xcoff_dynamic_reloc_howto(abfd);
517
518
      /* FIXME: We have no way to record the l_rsecnm field.  */
519
520
0
      *prelocs = relbuf;
521
0
    }
522
523
0
  *prelocs = NULL;
524
525
0
  return ldhdr.l_nreloc;
526
0
}
527

528
/* Hash functions for xcoff_link_hash_table's archive_info.  */
529
530
static hashval_t
531
xcoff_archive_info_hash (const void *data)
532
0
{
533
0
  const struct xcoff_archive_info *info;
534
535
0
  info = (const struct xcoff_archive_info *) data;
536
0
  return htab_hash_pointer (info->archive);
537
0
}
538
539
static int
540
xcoff_archive_info_eq (const void *data1, const void *data2)
541
0
{
542
0
  const struct xcoff_archive_info *info1;
543
0
  const struct xcoff_archive_info *info2;
544
545
0
  info1 = (const struct xcoff_archive_info *) data1;
546
0
  info2 = (const struct xcoff_archive_info *) data2;
547
0
  return info1->archive == info2->archive;
548
0
}
549
550
/* Return information about archive ARCHIVE.  Return NULL on error.  */
551
552
static struct xcoff_archive_info *
553
xcoff_get_archive_info (struct bfd_link_info *info, bfd *archive)
554
0
{
555
0
  struct xcoff_link_hash_table *htab;
556
0
  struct xcoff_archive_info *entryp, entry;
557
0
  void **slot;
558
559
0
  htab = xcoff_hash_table (info);
560
0
  entry.archive = archive;
561
0
  slot = htab_find_slot (htab->archive_info, &entry, INSERT);
562
0
  if (!slot)
563
0
    return NULL;
564
565
0
  entryp = *slot;
566
0
  if (!entryp)
567
0
    {
568
0
      entryp = bfd_zalloc (info->output_bfd, sizeof (entry));
569
0
      if (!entryp)
570
0
  return NULL;
571
572
0
      entryp->archive = archive;
573
0
      *slot = entryp;
574
0
    }
575
0
  return entryp;
576
0
}
577

578
579
/* Initialize an entry in the stub hash table.  */
580
static struct bfd_hash_entry *
581
stub_hash_newfunc (struct bfd_hash_entry *entry,
582
       struct bfd_hash_table *table,
583
       const char *string)
584
0
{
585
  /* Allocate the structure if it has not already been allocated by a
586
     subclass.  */
587
0
  if (entry == NULL)
588
0
    {
589
0
      entry = bfd_hash_allocate (table,
590
0
         sizeof (struct xcoff_stub_hash_entry));
591
0
      if (entry == NULL)
592
0
  return entry;
593
0
    }
594
595
  /* Call the allocation method of the superclass.  */
596
0
  entry = bfd_hash_newfunc (entry, table, string);
597
0
  if (entry != NULL)
598
0
    {
599
0
      struct xcoff_stub_hash_entry *hsh;
600
601
      /* Initialize the local fields.  */
602
0
      hsh = (struct xcoff_stub_hash_entry *) entry;
603
0
      hsh->stub_type = xcoff_stub_none;
604
0
      hsh->hcsect = NULL;
605
0
      hsh->stub_offset = 0;
606
0
      hsh->target_section = NULL;
607
0
      hsh->htarget = NULL;
608
0
    }
609
610
0
  return entry;
611
0
}
612
613
/* Routine to create an entry in an XCOFF link hash table.  */
614
615
static struct bfd_hash_entry *
616
xcoff_link_hash_newfunc (struct bfd_hash_entry *entry,
617
       struct bfd_hash_table *table,
618
       const char *string)
619
0
{
620
0
  struct xcoff_link_hash_entry *ret = (struct xcoff_link_hash_entry *) entry;
621
622
  /* Allocate the structure if it has not already been allocated by a
623
     subclass.  */
624
0
  if (ret == NULL)
625
0
    ret = bfd_hash_allocate (table, sizeof (* ret));
626
0
  if (ret == NULL)
627
0
    return NULL;
628
629
  /* Call the allocation method of the superclass.  */
630
0
  ret = ((struct xcoff_link_hash_entry *)
631
0
   _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
632
0
         table, string));
633
0
  if (ret != NULL)
634
0
    {
635
      /* Set local fields.  */
636
0
      ret->indx = -1;
637
0
      ret->toc_section = NULL;
638
0
      ret->u.toc_indx = -1;
639
0
      ret->descriptor = NULL;
640
0
      ret->ldsym = NULL;
641
0
      ret->ldindx = -1;
642
0
      ret->flags = 0;
643
0
      ret->smclas = XMC_UA;
644
0
    }
645
646
0
  return (struct bfd_hash_entry *) ret;
647
0
}
648
649
/* Destroy an XCOFF link hash table.  */
650
651
static void
652
_bfd_xcoff_bfd_link_hash_table_free (bfd *obfd)
653
0
{
654
0
  struct xcoff_link_hash_table *ret;
655
656
0
  ret = (struct xcoff_link_hash_table *) obfd->link.hash;
657
0
  if (ret->archive_info)
658
0
    htab_delete (ret->archive_info);
659
0
  if (ret->debug_strtab)
660
0
    _bfd_stringtab_free (ret->debug_strtab);
661
662
0
  bfd_hash_table_free (&ret->stub_hash_table);
663
0
  _bfd_generic_link_hash_table_free (obfd);
664
0
}
665
666
/* Create an XCOFF link hash table.  */
667
668
struct bfd_link_hash_table *
669
_bfd_xcoff_bfd_link_hash_table_create (bfd *abfd)
670
0
{
671
0
  struct xcoff_link_hash_table *ret;
672
0
  bool isxcoff64 = false;
673
0
  size_t amt = sizeof (* ret);
674
675
0
  ret = bfd_zmalloc (amt);
676
0
  if (ret == NULL)
677
0
    return NULL;
678
0
  if (!_bfd_link_hash_table_init (&ret->root, abfd, xcoff_link_hash_newfunc,
679
0
          sizeof (struct xcoff_link_hash_entry)))
680
0
    {
681
0
      free (ret);
682
0
      return NULL;
683
0
    }
684
685
  /* Init the stub hash table too.  */
686
0
  if (!bfd_hash_table_init (&ret->stub_hash_table, stub_hash_newfunc,
687
0
          sizeof (struct xcoff_stub_hash_entry)))
688
0
    {
689
0
      _bfd_xcoff_bfd_link_hash_table_free (abfd);
690
0
      return NULL;
691
0
    }
692
693
0
  isxcoff64 = bfd_coff_debug_string_prefix_length (abfd) == 4;
694
695
0
  ret->debug_strtab = _bfd_xcoff_stringtab_init (isxcoff64);
696
0
  ret->archive_info = htab_create (37, xcoff_archive_info_hash,
697
0
           xcoff_archive_info_eq, NULL);
698
0
  if (!ret->debug_strtab || !ret->archive_info)
699
0
    {
700
0
      _bfd_xcoff_bfd_link_hash_table_free (abfd);
701
0
      return NULL;
702
0
    }
703
0
  ret->root.hash_table_free = _bfd_xcoff_bfd_link_hash_table_free;
704
705
  /* The linker will always generate a full a.out header.  We need to
706
     record that fact now, before the sizeof_headers routine could be
707
     called.  */
708
0
  xcoff_data (abfd)->full_aouthdr = true;
709
710
0
  return &ret->root;
711
0
}
712

713
/* Read internal relocs for an XCOFF csect.  This is a wrapper around
714
   _bfd_coff_read_internal_relocs which tries to take advantage of any
715
   relocs which may have been cached for the enclosing section.  */
716
717
static struct internal_reloc *
718
xcoff_read_internal_relocs (bfd *abfd,
719
          asection *sec,
720
          bool cache,
721
          bfd_byte *external_relocs,
722
          bool require_internal,
723
          struct internal_reloc *internal_relocs)
724
0
{
725
0
  if (coff_section_data (abfd, sec) != NULL
726
0
      && coff_section_data (abfd, sec)->relocs == NULL
727
0
      && xcoff_section_data (abfd, sec) != NULL)
728
0
    {
729
0
      asection *enclosing;
730
731
0
      enclosing = xcoff_section_data (abfd, sec)->enclosing;
732
733
0
      if (enclosing != NULL
734
0
    && (coff_section_data (abfd, enclosing) == NULL
735
0
        || coff_section_data (abfd, enclosing)->relocs == NULL)
736
0
    && cache
737
0
    && enclosing->reloc_count > 0)
738
0
  {
739
0
    if (_bfd_coff_read_internal_relocs (abfd, enclosing, true,
740
0
                external_relocs, false, NULL)
741
0
        == NULL)
742
0
      return NULL;
743
0
  }
744
745
0
      if (enclosing != NULL
746
0
    && coff_section_data (abfd, enclosing) != NULL
747
0
    && coff_section_data (abfd, enclosing)->relocs != NULL)
748
0
  {
749
0
    size_t off;
750
751
0
    off = ((sec->rel_filepos - enclosing->rel_filepos)
752
0
     / bfd_coff_relsz (abfd));
753
754
0
    if (! require_internal)
755
0
      return coff_section_data (abfd, enclosing)->relocs + off;
756
0
    memcpy (internal_relocs,
757
0
      coff_section_data (abfd, enclosing)->relocs + off,
758
0
      sec->reloc_count * sizeof (struct internal_reloc));
759
0
    return internal_relocs;
760
0
  }
761
0
    }
762
763
0
  return _bfd_coff_read_internal_relocs (abfd, sec, cache, external_relocs,
764
0
           require_internal, internal_relocs);
765
0
}
766

767
/* Split FILENAME into an import path and an import filename,
768
   storing them in *IMPPATH and *IMPFILE respectively.  */
769
770
bool
771
bfd_xcoff_split_import_path (bfd *abfd, const char *filename,
772
           const char **imppath, const char **impfile)
773
0
{
774
0
  const char *base;
775
0
  size_t length;
776
0
  char *path;
777
778
0
  base = lbasename (filename);
779
0
  length = base - filename;
780
0
  if (length == 0)
781
    /* The filename has no directory component, so use an empty path.  */
782
0
    *imppath = "";
783
0
  else if (length == 1)
784
    /* The filename is in the root directory.  */
785
0
    *imppath = "/";
786
0
  else
787
0
    {
788
      /* Extract the (non-empty) directory part.  Note that we don't
789
   need to strip duplicate directory separators from any part
790
   of the string; the native linker doesn't do that either.  */
791
0
      path = bfd_alloc (abfd, length);
792
0
      if (path == NULL)
793
0
  return false;
794
0
      memcpy (path, filename, length - 1);
795
0
      path[length - 1] = 0;
796
0
      *imppath = path;
797
0
    }
798
0
  *impfile = base;
799
0
  return true;
800
0
}
801
802
/* Set ARCHIVE's import path as though its filename had been given
803
   as FILENAME.  */
804
805
bool
806
bfd_xcoff_set_archive_import_path (struct bfd_link_info *info,
807
           bfd *archive, const char *filename)
808
0
{
809
0
  struct xcoff_archive_info *archive_info;
810
811
0
  archive_info = xcoff_get_archive_info (info, archive);
812
0
  return (archive_info != NULL
813
0
    && bfd_xcoff_split_import_path (archive, filename,
814
0
            &archive_info->imppath,
815
0
            &archive_info->impfile));
816
0
}
817
818
/* H is an imported symbol.  Set the import module's path, file and member
819
   to IMPATH, IMPFILE and IMPMEMBER respectively.  All three are null if
820
   no specific import module is specified.  */
821
822
static bool
823
xcoff_set_import_path (struct bfd_link_info *info,
824
           struct xcoff_link_hash_entry *h,
825
           const char *imppath, const char *impfile,
826
           const char *impmember)
827
0
{
828
0
  unsigned int c;
829
0
  struct xcoff_import_file **pp;
830
831
  /* We overload the ldindx field to hold the l_ifile value for this
832
     symbol.  */
833
0
  BFD_ASSERT (h->ldsym == NULL);
834
0
  BFD_ASSERT ((h->flags & XCOFF_BUILT_LDSYM) == 0);
835
0
  if (imppath == NULL)
836
0
    h->ldindx = -1;
837
0
  else
838
0
    {
839
      /* We start c at 1 because the first entry in the import list is
840
   reserved for the library search path.  */
841
0
      for (pp = &xcoff_hash_table (info)->imports, c = 1;
842
0
     *pp != NULL;
843
0
     pp = &(*pp)->next, ++c)
844
0
  {
845
0
    if (filename_cmp ((*pp)->path, imppath) == 0
846
0
        && filename_cmp ((*pp)->file, impfile) == 0
847
0
        && filename_cmp ((*pp)->member, impmember) == 0)
848
0
      break;
849
0
  }
850
851
0
      if (*pp == NULL)
852
0
  {
853
0
    struct xcoff_import_file *n;
854
0
    size_t amt = sizeof (*n);
855
856
0
    n = bfd_alloc (info->output_bfd, amt);
857
0
    if (n == NULL)
858
0
      return false;
859
0
    n->next = NULL;
860
0
    n->path = imppath;
861
0
    n->file = impfile;
862
0
    n->member = impmember;
863
0
    *pp = n;
864
0
  }
865
0
      h->ldindx = c;
866
0
    }
867
0
  return true;
868
0
}
869

870
/* H is the bfd symbol associated with exported .loader symbol LDSYM.
871
   Return true if LDSYM defines H.  */
872
873
static bool
874
xcoff_dynamic_definition_p (struct xcoff_link_hash_entry *h,
875
          struct internal_ldsym *ldsym)
876
0
{
877
  /* If we didn't know about H before processing LDSYM, LDSYM
878
     definitely defines H.  */
879
0
  if (h->root.type == bfd_link_hash_new)
880
0
    return true;
881
882
  /* If H is currently a weak dynamic symbol, and if LDSYM is a strong
883
     dynamic symbol, LDSYM trumps the current definition of H.  */
884
0
  if ((ldsym->l_smtype & L_WEAK) == 0
885
0
      && (h->flags & XCOFF_DEF_DYNAMIC) != 0
886
0
      && (h->flags & XCOFF_DEF_REGULAR) == 0
887
0
      && (h->root.type == bfd_link_hash_defweak
888
0
    || h->root.type == bfd_link_hash_undefweak))
889
0
    return true;
890
891
  /* If H is currently undefined, LDSYM defines it.
892
     However, if H has a hidden visibility, LDSYM must not
893
     define it.  */
894
0
  if ((h->flags & XCOFF_DEF_DYNAMIC) == 0
895
0
      && (h->root.type == bfd_link_hash_undefined
896
0
    || h->root.type == bfd_link_hash_undefweak)
897
0
      && (h->visibility != SYM_V_HIDDEN
898
0
    && h->visibility != SYM_V_INTERNAL))
899
0
    return true;
900
901
0
  return false;
902
0
}
903
904
/* This function is used to add symbols from a dynamic object to the
905
   global symbol table.  */
906
907
static bool
908
xcoff_link_add_dynamic_symbols (bfd *abfd, struct bfd_link_info *info)
909
0
{
910
0
  asection *lsec;
911
0
  bfd_byte *contents;
912
0
  struct internal_ldhdr ldhdr;
913
0
  const char *strings;
914
0
  bfd_byte *elsym, *elsymend;
915
0
  struct xcoff_import_file *n;
916
0
  unsigned int c;
917
0
  struct xcoff_import_file **pp;
918
919
  /* We can only handle a dynamic object if we are generating an XCOFF
920
     output file.  */
921
0
   if (info->output_bfd->xvec != abfd->xvec)
922
0
    {
923
0
      _bfd_error_handler
924
0
  (_("%pB: XCOFF shared object when not producing XCOFF output"),
925
0
   abfd);
926
0
      bfd_set_error (bfd_error_invalid_operation);
927
0
      return false;
928
0
    }
929
930
  /* The symbols we use from a dynamic object are not the symbols in
931
     the normal symbol table, but, rather, the symbols in the export
932
     table.  If there is a global symbol in a dynamic object which is
933
     not in the export table, the loader will not be able to find it,
934
     so we don't want to find it either.  Also, on AIX 4.1.3, shr.o in
935
     libc.a has symbols in the export table which are not in the
936
     symbol table.  */
937
938
  /* Read in the .loader section.  FIXME: We should really use the
939
     o_snloader field in the a.out header, rather than grabbing the
940
     section by name.  */
941
0
  lsec = bfd_get_section_by_name (abfd, ".loader");
942
0
  if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0)
943
0
    {
944
0
      _bfd_error_handler
945
0
  (_("%pB: dynamic object with no .loader section"),
946
0
   abfd);
947
0
      bfd_set_error (bfd_error_no_symbols);
948
0
      return false;
949
0
    }
950
951
0
  contents = xcoff_get_ldhdr (abfd, lsec, &ldhdr);
952
0
  if (!contents)
953
0
    return false;
954
955
  /* Remove the sections from this object, so that they do not get
956
     included in the link.  */
957
0
  bfd_section_list_clear (abfd);
958
959
0
  strings = (char *) contents + ldhdr.l_stoff;
960
961
0
  elsym = contents + bfd_xcoff_loader_symbol_offset(abfd, &ldhdr);
962
963
0
  elsymend = elsym + ldhdr.l_nsyms * bfd_xcoff_ldsymsz(abfd);
964
965
0
  for (; elsym < elsymend; elsym += bfd_xcoff_ldsymsz(abfd))
966
0
    {
967
0
      struct internal_ldsym ldsym;
968
0
      char nambuf[SYMNMLEN + 1];
969
0
      const char *name;
970
0
      struct xcoff_link_hash_entry *h;
971
972
0
      bfd_xcoff_swap_ldsym_in (abfd, elsym, &ldsym);
973
974
      /* We are only interested in exported symbols.  */
975
0
      if ((ldsym.l_smtype & L_EXPORT) == 0)
976
0
  continue;
977
978
0
      if (ldsym._l._l_l._l_zeroes != 0)
979
0
  {
980
0
    memcpy (nambuf, ldsym._l._l_name, SYMNMLEN);
981
0
    nambuf[SYMNMLEN] = '\0';
982
0
    name = nambuf;
983
0
  }
984
0
      else if (ldsym._l._l_l._l_offset < ldhdr.l_stlen)
985
0
  name = strings + ldsym._l._l_l._l_offset;
986
0
      else
987
0
  continue;
988
989
      /* Normally we could not call xcoff_link_hash_lookup in an add
990
   symbols routine, since we might not be using an XCOFF hash
991
   table.  However, we verified above that we are using an XCOFF
992
   hash table.  */
993
994
0
      h = xcoff_link_hash_lookup (xcoff_hash_table (info), name, true,
995
0
          true, true);
996
0
      if (h == NULL)
997
0
  return false;
998
999
0
      if (!xcoff_dynamic_definition_p (h, &ldsym))
1000
0
  continue;
1001
1002
0
      h->flags |= XCOFF_DEF_DYNAMIC;
1003
0
      h->smclas = ldsym.l_smclas;
1004
0
      if (h->smclas == XMC_XO)
1005
0
  {
1006
    /* This symbol has an absolute value.  */
1007
0
    if ((ldsym.l_smtype & L_WEAK) != 0)
1008
0
      h->root.type = bfd_link_hash_defweak;
1009
0
    else
1010
0
      h->root.type = bfd_link_hash_defined;
1011
0
    h->root.u.def.section = bfd_abs_section_ptr;
1012
0
    h->root.u.def.value = ldsym.l_value;
1013
0
  }
1014
0
      else
1015
0
  {
1016
    /* Otherwise, we don't bother to actually define the symbol,
1017
       since we don't have a section to put it in anyhow.
1018
       We assume instead that an undefined XCOFF_DEF_DYNAMIC symbol
1019
       should be imported from the symbol's undef.abfd.  */
1020
0
    if ((ldsym.l_smtype & L_WEAK) != 0)
1021
0
      h->root.type = bfd_link_hash_undefweak;
1022
0
    else
1023
0
      h->root.type = bfd_link_hash_undefined;
1024
0
    h->root.u.undef.abfd = abfd;
1025
0
  }
1026
1027
      /* If this symbol defines a function descriptor, then it
1028
   implicitly defines the function code as well.  */
1029
0
      if (h->smclas == XMC_DS
1030
0
    || (h->smclas == XMC_XO && name[0] != '.'))
1031
0
  h->flags |= XCOFF_DESCRIPTOR;
1032
0
      if ((h->flags & XCOFF_DESCRIPTOR) != 0)
1033
0
  {
1034
0
    struct xcoff_link_hash_entry *hds;
1035
1036
0
    hds = h->descriptor;
1037
0
    if (hds == NULL)
1038
0
      {
1039
0
        char *dsnm;
1040
1041
0
        dsnm = bfd_malloc ((bfd_size_type) strlen (name) + 2);
1042
0
        if (dsnm == NULL)
1043
0
    return false;
1044
0
        dsnm[0] = '.';
1045
0
        strcpy (dsnm + 1, name);
1046
0
        hds = xcoff_link_hash_lookup (xcoff_hash_table (info), dsnm,
1047
0
              true, true, true);
1048
0
        free (dsnm);
1049
0
        if (hds == NULL)
1050
0
    return false;
1051
1052
0
        hds->descriptor = h;
1053
0
        h->descriptor = hds;
1054
0
      }
1055
1056
0
    if (xcoff_dynamic_definition_p (hds, &ldsym))
1057
0
      {
1058
0
        hds->root.type = h->root.type;
1059
0
        hds->flags |= XCOFF_DEF_DYNAMIC;
1060
0
        if (h->smclas == XMC_XO)
1061
0
    {
1062
      /* An absolute symbol appears to actually define code, not a
1063
         function descriptor.  This is how some math functions are
1064
         implemented on AIX 4.1.  */
1065
0
      hds->smclas = XMC_XO;
1066
0
      hds->root.u.def.section = bfd_abs_section_ptr;
1067
0
      hds->root.u.def.value = ldsym.l_value;
1068
0
    }
1069
0
        else
1070
0
    {
1071
0
      hds->smclas = XMC_PR;
1072
0
      hds->root.u.undef.abfd = abfd;
1073
      /* We do not want to add this to the undefined
1074
         symbol list.  */
1075
0
    }
1076
0
      }
1077
0
  }
1078
0
    }
1079
1080
0
  free (contents);
1081
0
  coff_section_data (abfd, lsec)->contents = NULL;
1082
1083
  /* Record this file in the import files.  */
1084
0
  n = bfd_alloc (abfd, (bfd_size_type) sizeof (struct xcoff_import_file));
1085
0
  if (n == NULL)
1086
0
    return false;
1087
0
  n->next = NULL;
1088
1089
0
  if (abfd->my_archive == NULL || bfd_is_thin_archive (abfd->my_archive))
1090
0
    {
1091
0
      if (!bfd_xcoff_split_import_path (abfd, bfd_get_filename (abfd),
1092
0
          &n->path, &n->file))
1093
0
  return false;
1094
0
      n->member = "";
1095
0
    }
1096
0
  else
1097
0
    {
1098
0
      struct xcoff_archive_info *archive_info;
1099
1100
0
      archive_info = xcoff_get_archive_info (info, abfd->my_archive);
1101
0
      if (!archive_info->impfile)
1102
0
  {
1103
0
    if (!bfd_xcoff_split_import_path (archive_info->archive,
1104
0
              bfd_get_filename (archive_info
1105
0
                    ->archive),
1106
0
              &archive_info->imppath,
1107
0
              &archive_info->impfile))
1108
0
      return false;
1109
0
  }
1110
0
      n->path = archive_info->imppath;
1111
0
      n->file = archive_info->impfile;
1112
0
      n->member = bfd_get_filename (abfd);
1113
0
    }
1114
1115
  /* We start c at 1 because the first import file number is reserved
1116
     for LIBPATH.  */
1117
0
  for (pp = &xcoff_hash_table (info)->imports, c = 1;
1118
0
       *pp != NULL;
1119
0
       pp = &(*pp)->next, ++c)
1120
0
    ;
1121
0
  *pp = n;
1122
1123
0
  xcoff_data (abfd)->import_file_id = c;
1124
1125
0
  return true;
1126
0
}
1127
1128
/* xcoff_link_create_extra_sections
1129
1130
   Takes care of creating the .loader, .gl, .ds, .debug and sections.  */
1131
1132
static bool
1133
xcoff_link_create_extra_sections (bfd * abfd, struct bfd_link_info *info)
1134
0
{
1135
0
  bool return_value = false;
1136
1137
0
  if (info->output_bfd->xvec == abfd->xvec)
1138
0
    {
1139
      /* We need to build a .loader section, so we do it here.  This
1140
   won't work if we're producing an XCOFF output file with no
1141
   XCOFF input files.  FIXME.  */
1142
1143
0
      if (!bfd_link_relocatable (info)
1144
0
    && xcoff_hash_table (info)->loader_section == NULL)
1145
0
  {
1146
0
    asection *lsec;
1147
0
    flagword flags = SEC_HAS_CONTENTS | SEC_IN_MEMORY;
1148
1149
0
    lsec = bfd_make_section_anyway_with_flags (abfd, ".loader", flags);
1150
0
    if (lsec == NULL)
1151
0
      goto end_return;
1152
1153
0
    xcoff_hash_table (info)->loader_section = lsec;
1154
0
  }
1155
1156
      /* Likewise for the linkage section.  */
1157
0
      if (xcoff_hash_table (info)->linkage_section == NULL)
1158
0
  {
1159
0
    asection *lsec;
1160
0
    flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1161
0
          | SEC_IN_MEMORY);
1162
1163
0
    lsec = bfd_make_section_anyway_with_flags (abfd, ".gl", flags);
1164
0
    if (lsec == NULL)
1165
0
      goto end_return;
1166
1167
0
    xcoff_hash_table (info)->linkage_section = lsec;
1168
0
    lsec->alignment_power = 2;
1169
0
  }
1170
1171
      /* Likewise for the TOC section.  */
1172
0
      if (xcoff_hash_table (info)->toc_section == NULL)
1173
0
  {
1174
0
    asection *tsec;
1175
0
    flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1176
0
          | SEC_IN_MEMORY);
1177
1178
0
    tsec = bfd_make_section_anyway_with_flags (abfd, ".tc", flags);
1179
0
    if (tsec == NULL)
1180
0
      goto end_return;
1181
1182
0
    xcoff_hash_table (info)->toc_section = tsec;
1183
0
    tsec->alignment_power = 2;
1184
0
  }
1185
1186
      /* Likewise for the descriptor section.  */
1187
0
      if (xcoff_hash_table (info)->descriptor_section == NULL)
1188
0
  {
1189
0
    asection *dsec;
1190
0
    flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1191
0
          | SEC_IN_MEMORY);
1192
1193
0
    dsec = bfd_make_section_anyway_with_flags (abfd, ".ds", flags);
1194
0
    if (dsec == NULL)
1195
0
      goto end_return;
1196
1197
0
    xcoff_hash_table (info)->descriptor_section = dsec;
1198
0
    dsec->alignment_power = 2;
1199
0
  }
1200
1201
      /* Likewise for the .debug section.  */
1202
0
      if (xcoff_hash_table (info)->debug_section == NULL
1203
0
    && info->strip != strip_all)
1204
0
  {
1205
0
    asection *dsec;
1206
0
    flagword flags = SEC_HAS_CONTENTS | SEC_IN_MEMORY;
1207
1208
0
    dsec = bfd_make_section_anyway_with_flags (abfd, ".debug", flags);
1209
0
    if (dsec == NULL)
1210
0
      goto end_return;
1211
1212
0
    xcoff_hash_table (info)->debug_section = dsec;
1213
0
  }
1214
0
    }
1215
1216
0
  return_value = true;
1217
1218
0
 end_return:
1219
1220
0
  return return_value;
1221
0
}
1222
1223
/* Returns the index of reloc in RELOCS with the least address greater
1224
   than or equal to ADDRESS.  The relocs are sorted by address.  */
1225
1226
static bfd_size_type
1227
xcoff_find_reloc (struct internal_reloc *relocs,
1228
      bfd_size_type count,
1229
      bfd_vma address)
1230
0
{
1231
0
  bfd_size_type min, max, this;
1232
1233
0
  if (count < 2)
1234
0
    {
1235
0
      if (count == 1 && relocs[0].r_vaddr < address)
1236
0
  return 1;
1237
0
      else
1238
0
  return 0;
1239
0
    }
1240
1241
0
  min = 0;
1242
0
  max = count;
1243
1244
  /* Do a binary search over (min,max].  */
1245
0
  while (min + 1 < max)
1246
0
    {
1247
0
      bfd_vma raddr;
1248
1249
0
      this = (max + min) / 2;
1250
0
      raddr = relocs[this].r_vaddr;
1251
0
      if (raddr > address)
1252
0
  max = this;
1253
0
      else if (raddr < address)
1254
0
  min = this;
1255
0
      else
1256
0
  {
1257
0
    min = this;
1258
0
    break;
1259
0
  }
1260
0
    }
1261
1262
0
  if (relocs[min].r_vaddr < address)
1263
0
    return min + 1;
1264
1265
0
  while (min > 0
1266
0
   && relocs[min - 1].r_vaddr == address)
1267
0
    --min;
1268
1269
0
  return min;
1270
0
}
1271
1272
/* Return true if the symbol has to be added to the linker hash
1273
   table.  */
1274
static bool
1275
xcoff_link_add_symbols_to_hash_table (struct internal_syment sym,
1276
              union internal_auxent aux)
1277
0
{
1278
  /* External symbols must be added.  */
1279
0
  if (EXTERN_SYM_P (sym.n_sclass))
1280
0
    return true;
1281
1282
  /* Hidden TLS symbols must be added to verify TLS relocations
1283
     in xcoff_reloc_type_tls.  */
1284
0
  if (sym.n_sclass == C_HIDEXT
1285
0
      && ((aux.x_csect.x_smclas == XMC_TL
1286
0
     || aux.x_csect.x_smclas == XMC_UL)))
1287
0
    return true;
1288
1289
0
  return false;
1290
0
}
1291
1292
/* Add all the symbols from an object file to the hash table.
1293
1294
   XCOFF is a weird format.  A normal XCOFF .o files will have three
1295
   COFF sections--.text, .data, and .bss--but each COFF section will
1296
   contain many csects.  These csects are described in the symbol
1297
   table.  From the linker's point of view, each csect must be
1298
   considered a section in its own right.  For example, a TOC entry is
1299
   handled as a small XMC_TC csect.  The linker must be able to merge
1300
   different TOC entries together, which means that it must be able to
1301
   extract the XMC_TC csects from the .data section of the input .o
1302
   file.
1303
1304
   From the point of view of our linker, this is, of course, a hideous
1305
   nightmare.  We cope by actually creating sections for each csect,
1306
   and discarding the original sections.  We then have to handle the
1307
   relocation entries carefully, since the only way to tell which
1308
   csect they belong to is to examine the address.  */
1309
1310
static bool
1311
xcoff_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
1312
0
{
1313
0
  unsigned int n_tmask;
1314
0
  unsigned int n_btshft;
1315
0
  bool default_copy;
1316
0
  bfd_size_type symcount;
1317
0
  struct xcoff_link_hash_entry **sym_hash;
1318
0
  asection **csect_cache;
1319
0
  unsigned int *lineno_counts;
1320
0
  bfd_size_type linesz;
1321
0
  asection *o;
1322
0
  asection *last_real;
1323
0
  bool keep_syms;
1324
0
  asection *csect;
1325
0
  unsigned int csect_index;
1326
0
  asection *first_csect;
1327
0
  bfd_size_type symesz;
1328
0
  bfd_byte *esym;
1329
0
  bfd_byte *esym_end;
1330
0
  struct reloc_info_struct
1331
0
  {
1332
0
    struct internal_reloc *relocs;
1333
0
    asection **csects;
1334
0
    bfd_byte *linenos;
1335
0
  } *reloc_info = NULL;
1336
0
  bfd_size_type amt;
1337
0
  unsigned short visibility;
1338
1339
0
  keep_syms = obj_coff_keep_syms (abfd);
1340
1341
0
  if ((abfd->flags & DYNAMIC) != 0
1342
0
      && ! info->static_link)
1343
0
    {
1344
0
      if (! xcoff_link_add_dynamic_symbols (abfd, info))
1345
0
  return false;
1346
0
    }
1347
1348
  /* Create the loader, toc, gl, ds and debug sections, if needed.  */
1349
0
  if (! xcoff_link_create_extra_sections (abfd, info))
1350
0
    goto error_return;
1351
1352
0
  if ((abfd->flags & DYNAMIC) != 0
1353
0
      && ! info->static_link)
1354
0
    return true;
1355
1356
0
  n_tmask = coff_data (abfd)->local_n_tmask;
1357
0
  n_btshft = coff_data (abfd)->local_n_btshft;
1358
1359
  /* Define macros so that ISFCN, et. al., macros work correctly.  */
1360
0
#define N_TMASK n_tmask
1361
0
#define N_BTSHFT n_btshft
1362
1363
0
  if (info->keep_memory)
1364
0
    default_copy = false;
1365
0
  else
1366
0
    default_copy = true;
1367
1368
0
  symcount = obj_raw_syment_count (abfd);
1369
1370
  /* We keep a list of the linker hash table entries that correspond
1371
     to each external symbol.  */
1372
0
  amt = symcount * sizeof (struct xcoff_link_hash_entry *);
1373
0
  sym_hash = bfd_zalloc (abfd, amt);
1374
0
  if (sym_hash == NULL && symcount != 0)
1375
0
    goto error_return;
1376
0
  coff_data (abfd)->sym_hashes = (struct coff_link_hash_entry **) sym_hash;
1377
1378
  /* Because of the weird stuff we are doing with XCOFF csects, we can
1379
     not easily determine which section a symbol is in, so we store
1380
     the information in the tdata for the input file.  */
1381
0
  amt = symcount * sizeof (asection *);
1382
0
  csect_cache = bfd_zalloc (abfd, amt);
1383
0
  if (csect_cache == NULL && symcount != 0)
1384
0
    goto error_return;
1385
0
  xcoff_data (abfd)->csects = csect_cache;
1386
1387
  /* We garbage-collect line-number information on a symbol-by-symbol
1388
     basis, so we need to have quick access to the number of entries
1389
     per symbol.  */
1390
0
  amt = symcount * sizeof (unsigned int);
1391
0
  lineno_counts = bfd_zalloc (abfd, amt);
1392
0
  if (lineno_counts == NULL && symcount != 0)
1393
0
    goto error_return;
1394
0
  xcoff_data (abfd)->lineno_counts = lineno_counts;
1395
1396
  /* While splitting sections into csects, we need to assign the
1397
     relocs correctly.  The relocs and the csects must both be in
1398
     order by VMA within a given section, so we handle this by
1399
     scanning along the relocs as we process the csects.  We index
1400
     into reloc_info using the section target_index.  */
1401
0
  amt = abfd->section_count + 1;
1402
0
  amt *= sizeof (struct reloc_info_struct);
1403
0
  reloc_info = bfd_zmalloc (amt);
1404
0
  if (reloc_info == NULL)
1405
0
    goto error_return;
1406
1407
  /* Read in the relocs and line numbers for each section.  */
1408
0
  linesz = bfd_coff_linesz (abfd);
1409
0
  last_real = NULL;
1410
0
  for (o = abfd->sections; o != NULL; o = o->next)
1411
0
    {
1412
0
      last_real = o;
1413
1414
0
      if ((o->flags & SEC_RELOC) != 0)
1415
0
  {
1416
0
    reloc_info[o->target_index].relocs =
1417
0
      xcoff_read_internal_relocs (abfd, o, true, NULL, false, NULL);
1418
0
    amt = o->reloc_count;
1419
0
    amt *= sizeof (asection *);
1420
0
    reloc_info[o->target_index].csects = bfd_zmalloc (amt);
1421
0
    if (reloc_info[o->target_index].csects == NULL)
1422
0
      goto error_return;
1423
0
  }
1424
1425
0
      if ((info->strip == strip_none || info->strip == strip_some)
1426
0
    && o->lineno_count > 0)
1427
0
  {
1428
0
    bfd_byte *linenos;
1429
1430
0
    if (bfd_seek (abfd, o->line_filepos, SEEK_SET) != 0)
1431
0
      goto error_return;
1432
0
    if (_bfd_mul_overflow (linesz, o->lineno_count, &amt))
1433
0
      {
1434
0
        bfd_set_error (bfd_error_file_too_big);
1435
0
        goto error_return;
1436
0
      }
1437
0
    linenos = _bfd_malloc_and_read (abfd, amt, amt);
1438
0
    if (linenos == NULL)
1439
0
      goto error_return;
1440
0
    reloc_info[o->target_index].linenos = linenos;
1441
0
  }
1442
0
    }
1443
1444
  /* Don't let the linker relocation routines discard the symbols.  */
1445
0
  obj_coff_keep_syms (abfd) = true;
1446
1447
0
  csect = NULL;
1448
0
  csect_index = 0;
1449
0
  first_csect = NULL;
1450
1451
0
  symesz = bfd_coff_symesz (abfd);
1452
0
  BFD_ASSERT (symesz == bfd_coff_auxesz (abfd));
1453
0
  esym = (bfd_byte *) obj_coff_external_syms (abfd);
1454
0
  esym_end = esym + symcount * symesz;
1455
1456
0
  while (esym < esym_end)
1457
0
    {
1458
0
      struct internal_syment sym;
1459
0
      union internal_auxent aux;
1460
0
      const char *name;
1461
0
      char buf[SYMNMLEN + 1];
1462
0
      int smtyp;
1463
0
      asection *section;
1464
0
      bfd_vma value;
1465
0
      struct xcoff_link_hash_entry *set_toc;
1466
1467
0
      bfd_coff_swap_sym_in (abfd, (void *) esym, (void *) &sym);
1468
1469
      /* In this pass we are only interested in symbols with csect
1470
   information.  */
1471
0
      if (!CSECT_SYM_P (sym.n_sclass))
1472
0
  {
1473
    /* Set csect_cache,
1474
       Normally csect is a .pr, .rw  etc. created in the loop
1475
       If C_FILE or first time, handle special
1476
1477
       Advance esym, sym_hash, csect_hash ptrs.  */
1478
0
    if (sym.n_sclass == C_FILE || sym.n_sclass == C_DWARF)
1479
0
      csect = NULL;
1480
0
    if (csect != NULL)
1481
0
      *csect_cache = csect;
1482
0
    else if (first_csect == NULL
1483
0
       || sym.n_sclass == C_FILE || sym.n_sclass == C_DWARF)
1484
0
      *csect_cache = coff_section_from_bfd_index (abfd, sym.n_scnum);
1485
0
    else
1486
0
      *csect_cache = NULL;
1487
0
    esym += (sym.n_numaux + 1) * symesz;
1488
0
    sym_hash += sym.n_numaux + 1;
1489
0
    csect_cache += sym.n_numaux + 1;
1490
0
    lineno_counts += sym.n_numaux + 1;
1491
1492
0
    continue;
1493
0
  }
1494
1495
0
      name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
1496
1497
0
      if (name == NULL)
1498
0
  goto error_return;
1499
1500
      /* If this symbol has line number information attached to it,
1501
   and we're not stripping it, count the number of entries and
1502
   add them to the count for this csect.  In the final link pass
1503
   we are going to attach line number information by symbol,
1504
   rather than by section, in order to more easily handle
1505
   garbage collection.  */
1506
0
      if ((info->strip == strip_none || info->strip == strip_some)
1507
0
    && sym.n_numaux > 1
1508
0
    && csect != NULL
1509
0
    && ISFCN (sym.n_type))
1510
0
  {
1511
0
    union internal_auxent auxlin;
1512
1513
0
    bfd_coff_swap_aux_in (abfd, (void *) (esym + symesz),
1514
0
        sym.n_type, sym.n_sclass,
1515
0
        0, sym.n_numaux, (void *) &auxlin);
1516
1517
0
    if (auxlin.x_sym.x_fcnary.x_fcn.x_lnnoptr != 0)
1518
0
      {
1519
0
        asection *enclosing;
1520
0
        bfd_signed_vma linoff;
1521
1522
0
        enclosing = xcoff_section_data (abfd, csect)->enclosing;
1523
0
        if (enclosing == NULL)
1524
0
    {
1525
0
      _bfd_error_handler
1526
        /* xgettext:c-format */
1527
0
        (_("%pB: `%s' has line numbers but no enclosing section"),
1528
0
         abfd, name);
1529
0
      bfd_set_error (bfd_error_bad_value);
1530
0
      goto error_return;
1531
0
    }
1532
0
        linoff = (auxlin.x_sym.x_fcnary.x_fcn.x_lnnoptr
1533
0
      - enclosing->line_filepos);
1534
        /* Explicit cast to bfd_signed_vma for compiler.  */
1535
0
        if (linoff < (bfd_signed_vma) (enclosing->lineno_count * linesz))
1536
0
    {
1537
0
      struct internal_lineno lin;
1538
0
      bfd_byte *linpstart;
1539
1540
0
      linpstart = (reloc_info[enclosing->target_index].linenos
1541
0
             + linoff);
1542
0
      bfd_coff_swap_lineno_in (abfd, (void *) linpstart, (void *) &lin);
1543
0
      if (lin.l_lnno == 0
1544
0
          && ((bfd_size_type) lin.l_addr.l_symndx
1545
0
        == ((esym
1546
0
             - (bfd_byte *) obj_coff_external_syms (abfd))
1547
0
            / symesz)))
1548
0
        {
1549
0
          bfd_byte *linpend, *linp;
1550
1551
0
          linpend = (reloc_info[enclosing->target_index].linenos
1552
0
         + enclosing->lineno_count * linesz);
1553
0
          for (linp = linpstart + linesz;
1554
0
         linp < linpend;
1555
0
         linp += linesz)
1556
0
      {
1557
0
        bfd_coff_swap_lineno_in (abfd, (void *) linp,
1558
0
               (void *) &lin);
1559
0
        if (lin.l_lnno == 0)
1560
0
          break;
1561
0
      }
1562
0
          *lineno_counts = (linp - linpstart) / linesz;
1563
          /* The setting of line_filepos will only be
1564
       useful if all the line number entries for a
1565
       csect are contiguous; this only matters for
1566
       error reporting.  */
1567
0
          if (csect->line_filepos == 0)
1568
0
      csect->line_filepos =
1569
0
        auxlin.x_sym.x_fcnary.x_fcn.x_lnnoptr;
1570
0
        }
1571
0
    }
1572
0
      }
1573
0
  }
1574
1575
      /* Record visibility.  */
1576
0
      visibility = sym.n_type & SYM_V_MASK;
1577
1578
      /* Pick up the csect auxiliary information.  */
1579
0
      if (sym.n_numaux == 0)
1580
0
  {
1581
0
    _bfd_error_handler
1582
      /* xgettext:c-format */
1583
0
      (_("%pB: class %d symbol `%s' has no aux entries"),
1584
0
       abfd, sym.n_sclass, name);
1585
0
    bfd_set_error (bfd_error_bad_value);
1586
0
    goto error_return;
1587
0
  }
1588
1589
0
      bfd_coff_swap_aux_in (abfd,
1590
0
          (void *) (esym + symesz * sym.n_numaux),
1591
0
          sym.n_type, sym.n_sclass,
1592
0
          sym.n_numaux - 1, sym.n_numaux,
1593
0
          (void *) &aux);
1594
1595
0
      smtyp = SMTYP_SMTYP (aux.x_csect.x_smtyp);
1596
1597
0
      section = NULL;
1598
0
      value = 0;
1599
0
      set_toc = NULL;
1600
1601
0
      switch (smtyp)
1602
0
  {
1603
0
  default:
1604
0
    _bfd_error_handler
1605
      /* xgettext:c-format */
1606
0
      (_("%pB: symbol `%s' has unrecognized csect type %d"),
1607
0
       abfd, name, smtyp);
1608
0
    bfd_set_error (bfd_error_bad_value);
1609
0
    goto error_return;
1610
1611
0
  case XTY_ER:
1612
    /* This is an external reference.  */
1613
0
    if (sym.n_sclass == C_HIDEXT
1614
0
        || sym.n_scnum != N_UNDEF
1615
0
        || aux.x_csect.x_scnlen.u64 != 0)
1616
0
      {
1617
0
        _bfd_error_handler
1618
    /* xgettext:c-format */
1619
0
    (_("%pB: bad XTY_ER symbol `%s': class %d scnum %d "
1620
0
       "scnlen %" PRId64),
1621
0
     abfd, name, sym.n_sclass, sym.n_scnum,
1622
0
     aux.x_csect.x_scnlen.u64);
1623
0
        bfd_set_error (bfd_error_bad_value);
1624
0
        goto error_return;
1625
0
      }
1626
1627
    /* An XMC_XO external reference is actually a reference to
1628
       an absolute location.  */
1629
0
    if (aux.x_csect.x_smclas != XMC_XO)
1630
0
      section = bfd_und_section_ptr;
1631
0
    else
1632
0
      {
1633
0
        section = bfd_abs_section_ptr;
1634
0
        value = sym.n_value;
1635
0
      }
1636
0
    break;
1637
1638
0
  case XTY_SD:
1639
0
    csect = NULL;
1640
0
    csect_index = -(unsigned) 1;
1641
1642
    /* When we see a TOC anchor, we record the TOC value.  */
1643
0
    if (aux.x_csect.x_smclas == XMC_TC0)
1644
0
      {
1645
0
        if (sym.n_sclass != C_HIDEXT
1646
0
      || aux.x_csect.x_scnlen.u64 != 0)
1647
0
    {
1648
0
      _bfd_error_handler
1649
        /* xgettext:c-format */
1650
0
        (_("%pB: XMC_TC0 symbol `%s' is class %d scnlen %" PRIu64),
1651
0
         abfd, name, sym.n_sclass, aux.x_csect.x_scnlen.u64);
1652
0
      bfd_set_error (bfd_error_bad_value);
1653
0
      goto error_return;
1654
0
    }
1655
0
        xcoff_data (abfd)->toc = sym.n_value;
1656
0
      }
1657
1658
    /* We must merge TOC entries for the same symbol.  We can
1659
       merge two TOC entries if they are both C_HIDEXT, they
1660
       both have the same name, they are both 4 or 8 bytes long, and
1661
       they both have a relocation table entry for an external
1662
       symbol with the same name.  Unfortunately, this means
1663
       that we must look through the relocations.  Ick.
1664
1665
       Logic for 32 bit vs 64 bit.
1666
       32 bit has a csect length of 4 for TOC
1667
       64 bit has a csect length of 8 for TOC
1668
1669
       An exception is made for TOC entries with a R_TLSML
1670
       relocation.  This relocation is made for the loader.
1671
       We must check that the referenced symbol is the TOC entry
1672
       itself.
1673
1674
       The conditions to get past the if-check are not that bad.
1675
       They are what is used to create the TOC csects in the first
1676
       place.  */
1677
0
    if (aux.x_csect.x_smclas == XMC_TC
1678
0
        && sym.n_sclass == C_HIDEXT
1679
0
        && info->output_bfd->xvec == abfd->xvec
1680
0
        && ((bfd_xcoff_is_xcoff32 (abfd)
1681
0
       && aux.x_csect.x_scnlen.u64 == 4)
1682
0
      || (bfd_xcoff_is_xcoff64 (abfd)
1683
0
          && aux.x_csect.x_scnlen.u64 == 8)))
1684
0
      {
1685
0
        asection *enclosing;
1686
0
        struct internal_reloc *relocs;
1687
0
        bfd_size_type relindx;
1688
0
        struct internal_reloc *rel;
1689
1690
0
        enclosing = coff_section_from_bfd_index (abfd, sym.n_scnum);
1691
0
        if (enclosing == NULL)
1692
0
    goto error_return;
1693
1694
0
        relocs = reloc_info[enclosing->target_index].relocs;
1695
0
        amt = enclosing->reloc_count;
1696
0
        relindx = xcoff_find_reloc (relocs, amt, sym.n_value);
1697
0
        rel = relocs + relindx;
1698
1699
        /* 32 bit R_POS r_size is 31
1700
     64 bit R_POS r_size is 63  */
1701
0
        if (relindx < enclosing->reloc_count
1702
0
      && rel->r_vaddr == (bfd_vma) sym.n_value
1703
0
      && (rel->r_type == R_POS ||
1704
0
          rel->r_type == R_TLSML)
1705
0
      && ((bfd_xcoff_is_xcoff32 (abfd)
1706
0
           && rel->r_size == 31)
1707
0
          || (bfd_xcoff_is_xcoff64 (abfd)
1708
0
        && rel->r_size == 63)))
1709
0
    {
1710
0
      bfd_byte *erelsym;
1711
1712
0
      struct internal_syment relsym;
1713
1714
0
      erelsym = ((bfd_byte *) obj_coff_external_syms (abfd)
1715
0
           + rel->r_symndx * symesz);
1716
0
      bfd_coff_swap_sym_in (abfd, (void *) erelsym, (void *) &relsym);
1717
0
      if (EXTERN_SYM_P (relsym.n_sclass))
1718
0
        {
1719
0
          const char *relname;
1720
0
          char relbuf[SYMNMLEN + 1];
1721
0
          bool copy;
1722
0
          struct xcoff_link_hash_entry *h;
1723
1724
          /* At this point we know that the TOC entry is
1725
       for an externally visible symbol.  */
1726
0
          relname = _bfd_coff_internal_syment_name (abfd, &relsym,
1727
0
                relbuf);
1728
0
          if (relname == NULL)
1729
0
      goto error_return;
1730
1731
          /* We only merge TOC entries if the TC name is
1732
       the same as the symbol name.  This handles
1733
       the normal case, but not common cases like
1734
       SYM.P4 which gcc generates to store SYM + 4
1735
       in the TOC.  FIXME.  */
1736
0
          if (strcmp (name, relname) == 0)
1737
0
      {
1738
0
        copy = (! info->keep_memory
1739
0
          || relsym._n._n_n._n_zeroes != 0
1740
0
          || relsym._n._n_n._n_offset == 0);
1741
0
        h = xcoff_link_hash_lookup (xcoff_hash_table (info),
1742
0
                  relname, true, copy,
1743
0
                  false);
1744
0
        if (h == NULL)
1745
0
          goto error_return;
1746
1747
        /* At this point h->root.type could be
1748
           bfd_link_hash_new.  That should be OK,
1749
           since we know for sure that we will come
1750
           across this symbol as we step through the
1751
           file.  */
1752
1753
        /* We store h in *sym_hash for the
1754
           convenience of the relocate_section
1755
           function.  */
1756
0
        *sym_hash = h;
1757
1758
0
        if (h->toc_section != NULL)
1759
0
          {
1760
0
            asection **rel_csects;
1761
1762
            /* We already have a TOC entry for this
1763
         symbol, so we can just ignore this
1764
         one.  */
1765
0
            rel_csects =
1766
0
        reloc_info[enclosing->target_index].csects;
1767
0
            rel_csects[relindx] = bfd_und_section_ptr;
1768
0
            break;
1769
0
          }
1770
1771
        /* We are about to create a TOC entry for
1772
           this symbol.  */
1773
0
        set_toc = h;
1774
0
      }
1775
0
        }
1776
0
      else if (rel->r_type == R_TLSML)
1777
0
        {
1778
0
      csect_index = ((esym
1779
0
          - (bfd_byte *) obj_coff_external_syms (abfd))
1780
0
               / symesz);
1781
0
      if (((unsigned long) rel->r_symndx) != csect_index)
1782
0
        {
1783
0
          _bfd_error_handler
1784
            /* xgettext:c-format */
1785
0
            (_("%pB: TOC entry `%s' has a R_TLSML"
1786
0
         "relocation not targeting itself"),
1787
0
             abfd, name);
1788
0
          bfd_set_error (bfd_error_bad_value);
1789
0
          goto error_return;
1790
0
        }
1791
0
        }
1792
0
    }
1793
0
      }
1794
1795
0
    {
1796
0
      asection *enclosing;
1797
1798
      /* We need to create a new section.  We get the name from
1799
         the csect storage mapping class, so that the linker can
1800
         accumulate similar csects together.  */
1801
1802
0
      csect = bfd_xcoff_create_csect_from_smclas(abfd, &aux, name);
1803
0
      if (NULL == csect)
1804
0
        goto error_return;
1805
1806
      /* The enclosing section is the main section : .data, .text
1807
         or .bss that the csect is coming from.  */
1808
0
      enclosing = coff_section_from_bfd_index (abfd, sym.n_scnum);
1809
0
      if (enclosing == NULL)
1810
0
        goto error_return;
1811
1812
0
      if (! bfd_is_abs_section (enclosing)
1813
0
    && ((bfd_vma) sym.n_value < enclosing->vma
1814
0
        || (sym.n_value + aux.x_csect.x_scnlen.u64
1815
0
      > enclosing->vma + enclosing->size)))
1816
0
        {
1817
0
    _bfd_error_handler
1818
      /* xgettext:c-format */
1819
0
      (_("%pB: csect `%s' not in enclosing section"),
1820
0
       abfd, name);
1821
0
    bfd_set_error (bfd_error_bad_value);
1822
0
    goto error_return;
1823
0
        }
1824
0
      csect->vma = sym.n_value;
1825
0
      csect->filepos = (enclosing->filepos
1826
0
            + sym.n_value
1827
0
            - enclosing->vma);
1828
0
      csect->size = aux.x_csect.x_scnlen.u64;
1829
0
      csect->rawsize = aux.x_csect.x_scnlen.u64;
1830
0
      csect->flags |= SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS;
1831
0
      csect->alignment_power = SMTYP_ALIGN (aux.x_csect.x_smtyp);
1832
1833
      /* Record the enclosing section in the tdata for this new
1834
         section.  */
1835
0
      amt = sizeof (struct coff_section_tdata);
1836
0
      csect->used_by_bfd = bfd_zalloc (abfd, amt);
1837
0
      if (csect->used_by_bfd == NULL)
1838
0
        goto error_return;
1839
0
      amt = sizeof (struct xcoff_section_tdata);
1840
0
      coff_section_data (abfd, csect)->tdata = bfd_zalloc (abfd, amt);
1841
0
      if (coff_section_data (abfd, csect)->tdata == NULL)
1842
0
        goto error_return;
1843
0
      xcoff_section_data (abfd, csect)->enclosing = enclosing;
1844
0
      xcoff_section_data (abfd, csect)->lineno_count =
1845
0
        enclosing->lineno_count;
1846
1847
0
      if (enclosing->owner == abfd)
1848
0
        {
1849
0
    struct internal_reloc *relocs;
1850
0
    bfd_size_type relindx;
1851
0
    struct internal_reloc *rel;
1852
0
    asection **rel_csect;
1853
1854
0
    relocs = reloc_info[enclosing->target_index].relocs;
1855
0
    amt = enclosing->reloc_count;
1856
0
    relindx = xcoff_find_reloc (relocs, amt, csect->vma);
1857
1858
0
    rel = relocs + relindx;
1859
0
    rel_csect = (reloc_info[enclosing->target_index].csects
1860
0
           + relindx);
1861
1862
0
    csect->rel_filepos = (enclosing->rel_filepos
1863
0
              + relindx * bfd_coff_relsz (abfd));
1864
0
    while (relindx < enclosing->reloc_count
1865
0
           && *rel_csect == NULL
1866
0
           && rel->r_vaddr < csect->vma + csect->size)
1867
0
      {
1868
1869
0
        *rel_csect = csect;
1870
0
        csect->flags |= SEC_RELOC;
1871
0
        ++csect->reloc_count;
1872
0
        ++relindx;
1873
0
        ++rel;
1874
0
        ++rel_csect;
1875
0
      }
1876
0
        }
1877
1878
      /* There are a number of other fields and section flags
1879
         which we do not bother to set.  */
1880
1881
0
      csect_index = ((esym
1882
0
          - (bfd_byte *) obj_coff_external_syms (abfd))
1883
0
         / symesz);
1884
1885
0
      xcoff_section_data (abfd, csect)->first_symndx = csect_index;
1886
1887
0
      if (first_csect == NULL)
1888
0
        first_csect = csect;
1889
1890
      /* If this symbol must be added to the linker hash table,
1891
         we treat it as starting at the beginning of the newly
1892
         created section.  */
1893
0
      if (xcoff_link_add_symbols_to_hash_table (sym, aux))
1894
0
        {
1895
0
    section = csect;
1896
0
    value = 0;
1897
0
        }
1898
1899
      /* If this is a TOC section for a symbol, record it.  */
1900
0
      if (set_toc != NULL)
1901
0
        set_toc->toc_section = csect;
1902
0
    }
1903
0
    break;
1904
1905
0
  case XTY_LD:
1906
    /* This is a label definition.  The x_scnlen field is the
1907
       symbol index of the csect.  Usually the XTY_LD symbol will
1908
       follow its appropriate XTY_SD symbol.  The .set pseudo op can
1909
       cause the XTY_LD to not follow the XTY_SD symbol. */
1910
0
    {
1911
0
      bool bad;
1912
1913
0
      bad = false;
1914
0
      if (aux.x_csect.x_scnlen.u64
1915
0
    >= (size_t) (esym - (bfd_byte *) obj_coff_external_syms (abfd)))
1916
0
        bad = true;
1917
0
      if (! bad)
1918
0
        {
1919
0
    section = xcoff_data (abfd)->csects[aux.x_csect.x_scnlen.u64];
1920
0
    if (section == NULL
1921
0
        || (section->flags & SEC_HAS_CONTENTS) == 0)
1922
0
      bad = true;
1923
0
        }
1924
0
      if (bad)
1925
0
        {
1926
0
    _bfd_error_handler
1927
      /* xgettext:c-format */
1928
0
      (_("%pB: misplaced XTY_LD `%s'"),
1929
0
       abfd, name);
1930
0
    bfd_set_error (bfd_error_bad_value);
1931
0
    goto error_return;
1932
0
        }
1933
0
      csect = section;
1934
0
      value = sym.n_value - csect->vma;
1935
0
    }
1936
0
    break;
1937
1938
0
  case XTY_CM:
1939
    /* This is an unitialized csect.  We could base the name on
1940
       the storage mapping class, but we don't bother except for
1941
       an XMC_TD symbol.  If this csect is externally visible,
1942
       it is a common symbol.  We put XMC_TD symbols in sections
1943
       named .tocbss, and rely on the linker script to put that
1944
       in the TOC area.  */
1945
1946
0
    if (aux.x_csect.x_smclas == XMC_TD)
1947
0
      {
1948
        /* The linker script puts the .td section in the data
1949
     section after the .tc section.  */
1950
0
        csect = bfd_make_section_anyway_with_flags (abfd, ".td",
1951
0
                SEC_ALLOC);
1952
0
      }
1953
0
    else if (aux.x_csect.x_smclas == XMC_UL)
1954
0
      {
1955
        /* This is a thread-local unitialized csect.  */
1956
0
        csect = bfd_make_section_anyway_with_flags (abfd, ".tbss",
1957
0
                SEC_ALLOC | SEC_THREAD_LOCAL);
1958
0
      }
1959
0
    else
1960
0
      csect = bfd_make_section_anyway_with_flags (abfd, ".bss",
1961
0
              SEC_ALLOC);
1962
1963
0
    if (csect == NULL)
1964
0
      goto error_return;
1965
0
    csect->vma = sym.n_value;
1966
0
    csect->size = aux.x_csect.x_scnlen.u64;
1967
0
    csect->alignment_power = SMTYP_ALIGN (aux.x_csect.x_smtyp);
1968
    /* There are a number of other fields and section flags
1969
       which we do not bother to set.  */
1970
1971
0
    csect_index = ((esym
1972
0
        - (bfd_byte *) obj_coff_external_syms (abfd))
1973
0
       / symesz);
1974
1975
0
    amt = sizeof (struct coff_section_tdata);
1976
0
    csect->used_by_bfd = bfd_zalloc (abfd, amt);
1977
0
    if (csect->used_by_bfd == NULL)
1978
0
      goto error_return;
1979
0
    amt = sizeof (struct xcoff_section_tdata);
1980
0
    coff_section_data (abfd, csect)->tdata = bfd_zalloc (abfd, amt);
1981
0
    if (coff_section_data (abfd, csect)->tdata == NULL)
1982
0
      goto error_return;
1983
0
    xcoff_section_data (abfd, csect)->first_symndx = csect_index;
1984
1985
0
    if (first_csect == NULL)
1986
0
      first_csect = csect;
1987
1988
0
    if (xcoff_link_add_symbols_to_hash_table (sym, aux))
1989
0
      {
1990
0
        csect->flags |= SEC_IS_COMMON;
1991
0
        csect->size = 0;
1992
0
        section = csect;
1993
0
        value = aux.x_csect.x_scnlen.u64;
1994
0
      }
1995
1996
0
    break;
1997
0
  }
1998
1999
      /* Check for magic symbol names.  */
2000
0
      if ((smtyp == XTY_SD || smtyp == XTY_CM)
2001
0
    && aux.x_csect.x_smclas != XMC_TC
2002
0
    && aux.x_csect.x_smclas != XMC_TD)
2003
0
  {
2004
0
    int i = -1;
2005
2006
0
    if (name[0] == '_')
2007
0
      {
2008
0
        if (strcmp (name, "_text") == 0)
2009
0
    i = XCOFF_SPECIAL_SECTION_TEXT;
2010
0
        else if (strcmp (name, "_etext") == 0)
2011
0
    i = XCOFF_SPECIAL_SECTION_ETEXT;
2012
0
        else if (strcmp (name, "_data") == 0)
2013
0
    i = XCOFF_SPECIAL_SECTION_DATA;
2014
0
        else if (strcmp (name, "_edata") == 0)
2015
0
    i = XCOFF_SPECIAL_SECTION_EDATA;
2016
0
        else if (strcmp (name, "_end") == 0)
2017
0
    i = XCOFF_SPECIAL_SECTION_END;
2018
0
      }
2019
0
    else if (name[0] == 'e' && strcmp (name, "end") == 0)
2020
0
      i = XCOFF_SPECIAL_SECTION_END2;
2021
2022
0
    if (i != -1)
2023
0
      xcoff_hash_table (info)->special_sections[i] = csect;
2024
0
  }
2025
2026
      /* Now we have enough information to add the symbol to the
2027
   linker hash table.  */
2028
2029
0
      if (xcoff_link_add_symbols_to_hash_table (sym, aux))
2030
0
  {
2031
0
    bool copy, ok;
2032
0
    flagword flags;
2033
2034
0
    BFD_ASSERT (section != NULL);
2035
2036
    /* We must copy the name into memory if we got it from the
2037
       syment itself, rather than the string table.  */
2038
0
    copy = default_copy;
2039
0
    if (sym._n._n_n._n_zeroes != 0
2040
0
        || sym._n._n_n._n_offset == 0)
2041
0
      copy = true;
2042
2043
    /* Ignore global linkage code when linking statically.  */
2044
0
    if (info->static_link
2045
0
        && (smtyp == XTY_SD || smtyp == XTY_LD)
2046
0
        && aux.x_csect.x_smclas == XMC_GL)
2047
0
      {
2048
0
        section = bfd_und_section_ptr;
2049
0
        value = 0;
2050
0
      }
2051
2052
    /* The AIX linker appears to only detect multiple symbol
2053
       definitions when there is a reference to the symbol.  If
2054
       a symbol is defined multiple times, and the only
2055
       references are from the same object file, the AIX linker
2056
       appears to permit it.  It does not merge the different
2057
       definitions, but handles them independently.  On the
2058
       other hand, if there is a reference, the linker reports
2059
       an error.
2060
2061
       This matters because the AIX <net/net_globals.h> header
2062
       file actually defines an initialized array, so we have to
2063
       actually permit that to work.
2064
2065
       Just to make matters even more confusing, the AIX linker
2066
       appears to permit multiple symbol definitions whenever
2067
       the second definition is in an archive rather than an
2068
       object file.  This may be a consequence of the manner in
2069
       which it handles archives: I think it may load the entire
2070
       archive in as separate csects, and then let garbage
2071
       collection discard symbols.
2072
2073
       We also have to handle the case of statically linking a
2074
       shared object, which will cause symbol redefinitions,
2075
       although this is an easier case to detect.  */
2076
0
    else if (info->output_bfd->xvec == abfd->xvec)
2077
0
      {
2078
0
        if (! bfd_is_und_section (section))
2079
0
    *sym_hash = xcoff_link_hash_lookup (xcoff_hash_table (info),
2080
0
                name, true, copy, false);
2081
0
        else
2082
    /* Make a copy of the symbol name to prevent problems with
2083
       merging symbols.  */
2084
0
    *sym_hash = ((struct xcoff_link_hash_entry *)
2085
0
           bfd_wrapped_link_hash_lookup (abfd, info, name,
2086
0
                 true, true, false));
2087
2088
0
        if (*sym_hash == NULL)
2089
0
    goto error_return;
2090
0
        if (((*sym_hash)->root.type == bfd_link_hash_defined
2091
0
       || (*sym_hash)->root.type == bfd_link_hash_defweak)
2092
0
      && ! bfd_is_und_section (section)
2093
0
      && ! bfd_is_com_section (section))
2094
0
    {
2095
      /* This is a second definition of a defined symbol.  */
2096
0
      if (((*sym_hash)->flags & XCOFF_DEF_REGULAR) == 0
2097
0
          && ((*sym_hash)->flags & XCOFF_DEF_DYNAMIC) != 0)
2098
0
        {
2099
          /* The existing symbol is from a shared library.
2100
       Replace it.  */
2101
0
          (*sym_hash)->root.type = bfd_link_hash_undefined;
2102
0
          (*sym_hash)->root.u.undef.abfd =
2103
0
      (*sym_hash)->root.u.def.section->owner;
2104
0
        }
2105
0
      else if (abfd->my_archive != NULL)
2106
0
        {
2107
          /* This is a redefinition in an object contained
2108
       in an archive.  Just ignore it.  See the
2109
       comment above.  */
2110
0
          section = bfd_und_section_ptr;
2111
0
          value = 0;
2112
0
        }
2113
0
      else if (sym.n_sclass == C_AIX_WEAKEXT
2114
0
         || (*sym_hash)->root.type == bfd_link_hash_defweak)
2115
0
        {
2116
          /* At least one of the definitions is weak.
2117
       Allow the normal rules to take effect.  */
2118
0
        }
2119
0
      else if ((*sym_hash)->root.u.undef.next != NULL
2120
0
         || info->hash->undefs_tail == &(*sym_hash)->root)
2121
0
        {
2122
          /* This symbol has been referenced.  In this
2123
       case, we just continue and permit the
2124
       multiple definition error.  See the comment
2125
       above about the behaviour of the AIX linker.  */
2126
0
        }
2127
0
      else if ((*sym_hash)->smclas == aux.x_csect.x_smclas)
2128
0
        {
2129
          /* The symbols are both csects of the same
2130
       class.  There is at least a chance that this
2131
       is a semi-legitimate redefinition.  */
2132
0
          section = bfd_und_section_ptr;
2133
0
          value = 0;
2134
0
          (*sym_hash)->flags |= XCOFF_MULTIPLY_DEFINED;
2135
0
        }
2136
0
    }
2137
0
        else if (((*sym_hash)->flags & XCOFF_MULTIPLY_DEFINED) != 0
2138
0
           && (*sym_hash)->root.type == bfd_link_hash_defined
2139
0
           && (bfd_is_und_section (section)
2140
0
         || bfd_is_com_section (section)))
2141
0
    {
2142
      /* This is a reference to a multiply defined symbol.
2143
         Report the error now.  See the comment above
2144
         about the behaviour of the AIX linker.  We could
2145
         also do this with warning symbols, but I'm not
2146
         sure the XCOFF linker is wholly prepared to
2147
         handle them, and that would only be a warning,
2148
         not an error.  */
2149
0
      (*info->callbacks->multiple_definition) (info,
2150
0
                 &(*sym_hash)->root,
2151
0
                 NULL, NULL,
2152
0
                 (bfd_vma) 0);
2153
      /* Try not to give this error too many times.  */
2154
0
      (*sym_hash)->flags &= ~XCOFF_MULTIPLY_DEFINED;
2155
0
    }
2156
2157
2158
        /* If the symbol is hidden or internal, completely undo
2159
     any dynamic link state.  */
2160
0
        if ((*sym_hash)->flags & XCOFF_DEF_DYNAMIC
2161
0
      && (visibility == SYM_V_HIDDEN
2162
0
          || visibility == SYM_V_INTERNAL))
2163
0
      (*sym_hash)->flags &= ~XCOFF_DEF_DYNAMIC;
2164
0
        else
2165
0
    {
2166
      /* Keep the most constraining visibility.  */
2167
0
      unsigned short hvis = (*sym_hash)->visibility;
2168
0
      if (visibility && ( !hvis || visibility < hvis))
2169
0
        (*sym_hash)->visibility = visibility;
2170
0
    }
2171
2172
0
      }
2173
2174
    /* _bfd_generic_link_add_one_symbol may call the linker to
2175
       generate an error message, and the linker may try to read
2176
       the symbol table to give a good error.  Right now, the
2177
       line numbers are in an inconsistent state, since they are
2178
       counted both in the real sections and in the new csects.
2179
       We need to leave the count in the real sections so that
2180
       the linker can report the line number of the error
2181
       correctly, so temporarily clobber the link to the csects
2182
       so that the linker will not try to read the line numbers
2183
       a second time from the csects.  */
2184
0
    BFD_ASSERT (last_real->next == first_csect);
2185
0
    last_real->next = NULL;
2186
0
    flags = (sym.n_sclass == C_EXT ? BSF_GLOBAL : BSF_WEAK);
2187
0
    ok = (_bfd_generic_link_add_one_symbol
2188
0
    (info, abfd, name, flags, section, value, NULL, copy, true,
2189
0
     (struct bfd_link_hash_entry **) sym_hash));
2190
0
    last_real->next = first_csect;
2191
0
    if (!ok)
2192
0
      goto error_return;
2193
2194
0
    if (smtyp == XTY_CM)
2195
0
      {
2196
0
        if ((*sym_hash)->root.type != bfd_link_hash_common
2197
0
      || (*sym_hash)->root.u.c.p->section != csect)
2198
    /* We don't need the common csect we just created.  */
2199
0
    csect->size = 0;
2200
0
        else
2201
0
    (*sym_hash)->root.u.c.p->alignment_power
2202
0
      = csect->alignment_power;
2203
0
      }
2204
2205
0
    if (info->output_bfd->xvec == abfd->xvec)
2206
0
      {
2207
0
        int flag;
2208
2209
0
        if (smtyp == XTY_ER
2210
0
      || smtyp == XTY_CM
2211
0
      || section == bfd_und_section_ptr)
2212
0
    flag = XCOFF_REF_REGULAR;
2213
0
        else
2214
0
    flag = XCOFF_DEF_REGULAR;
2215
0
        (*sym_hash)->flags |= flag;
2216
2217
0
        if ((*sym_hash)->smclas == XMC_UA
2218
0
      || flag == XCOFF_DEF_REGULAR)
2219
0
    (*sym_hash)->smclas = aux.x_csect.x_smclas;
2220
0
      }
2221
0
  }
2222
2223
0
      if (smtyp == XTY_ER)
2224
0
  *csect_cache = section;
2225
0
      else
2226
0
  {
2227
0
    *csect_cache = csect;
2228
0
    if (csect != NULL)
2229
0
      xcoff_section_data (abfd, csect)->last_symndx
2230
0
        = (esym - (bfd_byte *) obj_coff_external_syms (abfd)) / symesz;
2231
0
  }
2232
2233
0
      esym += (sym.n_numaux + 1) * symesz;
2234
0
      sym_hash += sym.n_numaux + 1;
2235
0
      csect_cache += sym.n_numaux + 1;
2236
0
      lineno_counts += sym.n_numaux + 1;
2237
0
    }
2238
2239
0
  BFD_ASSERT (last_real == NULL || last_real->next == first_csect);
2240
2241
  /* Make sure that we have seen all the relocs.  */
2242
0
  for (o = abfd->sections; o != first_csect; o = o->next)
2243
0
    {
2244
      /* Debugging sections have no csects.  */
2245
0
      if (bfd_section_flags (o) & SEC_DEBUGGING)
2246
0
  continue;
2247
2248
      /* Reset the section size and the line number count, since the
2249
   data is now attached to the csects.  Don't reset the size of
2250
   the .debug section, since we need to read it below in
2251
   bfd_xcoff_size_dynamic_sections.  */
2252
0
      if (strcmp (bfd_section_name (o), ".debug") != 0)
2253
0
  o->size = 0;
2254
0
      o->lineno_count = 0;
2255
2256
0
      if ((o->flags & SEC_RELOC) != 0)
2257
0
  {
2258
0
    bfd_size_type i;
2259
0
    struct internal_reloc *rel;
2260
0
    asection **rel_csect;
2261
2262
0
    rel = reloc_info[o->target_index].relocs;
2263
0
    rel_csect = reloc_info[o->target_index].csects;
2264
2265
0
    for (i = 0; i < o->reloc_count; i++, rel++, rel_csect++)
2266
0
      {
2267
0
        if (*rel_csect == NULL)
2268
0
    {
2269
0
      _bfd_error_handler
2270
        /* xgettext:c-format */
2271
0
        (_("%pB: reloc %s:%" PRId64 " not in csect"),
2272
0
         abfd, o->name, (int64_t) i);
2273
0
      bfd_set_error (bfd_error_bad_value);
2274
0
      goto error_return;
2275
0
    }
2276
2277
        /* We identify all function symbols that are the target
2278
     of a relocation, so that we can create glue code for
2279
     functions imported from dynamic objects.  */
2280
0
        if (info->output_bfd->xvec == abfd->xvec
2281
0
      && *rel_csect != bfd_und_section_ptr
2282
0
      && obj_xcoff_sym_hashes (abfd)[rel->r_symndx] != NULL)
2283
0
    {
2284
0
      struct xcoff_link_hash_entry *h;
2285
2286
0
      h = obj_xcoff_sym_hashes (abfd)[rel->r_symndx];
2287
      /* If the symbol name starts with a period, it is
2288
         the code of a function.  If the symbol is
2289
         currently undefined, then add an undefined symbol
2290
         for the function descriptor.  This should do no
2291
         harm, because any regular object that defines the
2292
         function should also define the function
2293
         descriptor.  It helps, because it means that we
2294
         will identify the function descriptor with a
2295
         dynamic object if a dynamic object defines it.  */
2296
0
      if (h->root.root.string[0] == '.'
2297
0
          && h->descriptor == NULL)
2298
0
        {
2299
0
          struct xcoff_link_hash_entry *hds;
2300
0
          struct bfd_link_hash_entry *bh;
2301
2302
0
          hds = xcoff_link_hash_lookup (xcoff_hash_table (info),
2303
0
                h->root.root.string + 1,
2304
0
                true, false, true);
2305
0
          if (hds == NULL)
2306
0
      goto error_return;
2307
0
          if (hds->root.type == bfd_link_hash_new)
2308
0
      {
2309
0
        bh = &hds->root;
2310
0
        if (! (_bfd_generic_link_add_one_symbol
2311
0
         (info, abfd, hds->root.root.string,
2312
0
          (flagword) 0, bfd_und_section_ptr,
2313
0
          (bfd_vma) 0, NULL, false,
2314
0
          true, &bh)))
2315
0
          goto error_return;
2316
0
        hds = (struct xcoff_link_hash_entry *) bh;
2317
0
      }
2318
0
          hds->flags |= XCOFF_DESCRIPTOR;
2319
0
          BFD_ASSERT ((h->flags & XCOFF_DESCRIPTOR) == 0);
2320
0
          hds->descriptor = h;
2321
0
          h->descriptor = hds;
2322
0
        }
2323
0
      if (h->root.root.string[0] == '.')
2324
0
        h->flags |= XCOFF_CALLED;
2325
0
    }
2326
0
      }
2327
2328
0
    free (reloc_info[o->target_index].csects);
2329
0
    reloc_info[o->target_index].csects = NULL;
2330
2331
    /* Reset SEC_RELOC and the reloc_count, since the reloc
2332
       information is now attached to the csects.  */
2333
0
    o->flags &=~ SEC_RELOC;
2334
0
    o->reloc_count = 0;
2335
2336
    /* If we are not keeping memory, free the reloc information.  */
2337
0
    if (! info->keep_memory
2338
0
        && coff_section_data (abfd, o) != NULL)
2339
0
      {
2340
0
        free (coff_section_data (abfd, o)->relocs);
2341
0
        coff_section_data (abfd, o)->relocs = NULL;
2342
0
      }
2343
0
  }
2344
2345
      /* Free up the line numbers.  FIXME: We could cache these
2346
   somewhere for the final link, to avoid reading them again.  */
2347
0
      free (reloc_info[o->target_index].linenos);
2348
0
      reloc_info[o->target_index].linenos = NULL;
2349
0
    }
2350
2351
0
  free (reloc_info);
2352
2353
0
  obj_coff_keep_syms (abfd) = keep_syms;
2354
2355
0
  return true;
2356
2357
0
 error_return:
2358
0
  if (reloc_info != NULL)
2359
0
    {
2360
0
      for (o = abfd->sections; o != NULL; o = o->next)
2361
0
  {
2362
0
    free (reloc_info[o->target_index].csects);
2363
0
    free (reloc_info[o->target_index].linenos);
2364
0
  }
2365
0
      free (reloc_info);
2366
0
    }
2367
0
  obj_coff_keep_syms (abfd) = keep_syms;
2368
0
  return false;
2369
0
}
2370
2371
#undef N_TMASK
2372
#undef N_BTSHFT
2373
2374
/* Add symbols from an XCOFF object file.  */
2375
2376
static bool
2377
xcoff_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
2378
0
{
2379
0
  if (! _bfd_coff_get_external_symbols (abfd))
2380
0
    return false;
2381
0
  if (! xcoff_link_add_symbols (abfd, info))
2382
0
    return false;
2383
0
  if (! info->keep_memory)
2384
0
    {
2385
0
      if (! _bfd_coff_free_symbols (abfd))
2386
0
  return false;
2387
0
    }
2388
0
  return true;
2389
0
}
2390
2391
/* Look through the loader symbols to see if this dynamic object
2392
   should be included in the link.  The native linker uses the loader
2393
   symbols, not the normal symbol table, so we do too.  */
2394
2395
static bool
2396
xcoff_link_check_dynamic_ar_symbols (bfd *abfd,
2397
             struct bfd_link_info *info,
2398
             bool *pneeded,
2399
             bfd **subsbfd)
2400
0
{
2401
0
  asection *lsec;
2402
0
  bfd_byte *contents;
2403
0
  struct internal_ldhdr ldhdr;
2404
0
  const char *strings;
2405
0
  bfd_byte *elsym, *elsymend;
2406
2407
0
  *pneeded = false;
2408
2409
0
  lsec = bfd_get_section_by_name (abfd, ".loader");
2410
0
  if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0)
2411
    /* There are no symbols, so don't try to include it.  */
2412
0
    return true;
2413
2414
0
  contents = xcoff_get_ldhdr (abfd, lsec, &ldhdr);
2415
0
  if (!contents)
2416
0
    return false;
2417
2418
0
  strings = (char *) contents + ldhdr.l_stoff;
2419
2420
0
  elsym = contents + bfd_xcoff_loader_symbol_offset (abfd, &ldhdr);
2421
2422
0
  elsymend = elsym + ldhdr.l_nsyms * bfd_xcoff_ldsymsz (abfd);
2423
0
  for (; elsym < elsymend; elsym += bfd_xcoff_ldsymsz (abfd))
2424
0
    {
2425
0
      struct internal_ldsym ldsym;
2426
0
      char nambuf[SYMNMLEN + 1];
2427
0
      const char *name;
2428
0
      struct bfd_link_hash_entry *h;
2429
2430
0
      bfd_xcoff_swap_ldsym_in (abfd, elsym, &ldsym);
2431
2432
      /* We are only interested in exported symbols.  */
2433
0
      if ((ldsym.l_smtype & L_EXPORT) == 0)
2434
0
  continue;
2435
2436
0
      if (ldsym._l._l_l._l_zeroes != 0)
2437
0
  {
2438
0
    memcpy (nambuf, ldsym._l._l_name, SYMNMLEN);
2439
0
    nambuf[SYMNMLEN] = '\0';
2440
0
    name = nambuf;
2441
0
  }
2442
0
      else if (ldsym._l._l_l._l_offset < ldhdr.l_stlen)
2443
0
  name = strings + ldsym._l._l_l._l_offset;
2444
0
      else
2445
0
  continue;
2446
2447
0
      h = bfd_link_hash_lookup (info->hash, name, false, false, true);
2448
2449
      /* We are only interested in symbols that are currently
2450
   undefined.  At this point we know that we are using an XCOFF
2451
   hash table.  */
2452
0
      if (h != NULL
2453
0
    && h->type == bfd_link_hash_undefined
2454
0
    && (((struct xcoff_link_hash_entry *) h)->flags
2455
0
        & XCOFF_DEF_DYNAMIC) == 0)
2456
0
  {
2457
0
    if (!(*info->callbacks
2458
0
    ->add_archive_element) (info, abfd, name, subsbfd))
2459
0
      continue;
2460
0
    *pneeded = true;
2461
0
    return true;
2462
0
  }
2463
0
    }
2464
2465
  /* We do not need this shared object's .loader section.  */
2466
0
  free (contents);
2467
0
  coff_section_data (abfd, lsec)->contents = NULL;
2468
2469
0
  return true;
2470
0
}
2471
2472
/* Look through the symbols to see if this object file should be
2473
   included in the link.  */
2474
2475
static bool
2476
xcoff_link_check_ar_symbols (bfd *abfd,
2477
           struct bfd_link_info *info,
2478
           bool *pneeded,
2479
           bfd **subsbfd)
2480
0
{
2481
0
  bfd_size_type symesz;
2482
0
  bfd_byte *esym;
2483
0
  bfd_byte *esym_end;
2484
2485
0
  *pneeded = false;
2486
2487
0
  if ((abfd->flags & DYNAMIC) != 0
2488
0
      && ! info->static_link
2489
0
      && info->output_bfd->xvec == abfd->xvec)
2490
0
    return xcoff_link_check_dynamic_ar_symbols (abfd, info, pneeded, subsbfd);
2491
2492
0
  symesz = bfd_coff_symesz (abfd);
2493
0
  esym = (bfd_byte *) obj_coff_external_syms (abfd);
2494
0
  esym_end = esym + obj_raw_syment_count (abfd) * symesz;
2495
0
  while (esym < esym_end)
2496
0
    {
2497
0
      struct internal_syment sym;
2498
2499
0
      bfd_coff_swap_sym_in (abfd, (void *) esym, (void *) &sym);
2500
0
      esym += (sym.n_numaux + 1) * symesz;
2501
2502
0
      if (EXTERN_SYM_P (sym.n_sclass) && sym.n_scnum != N_UNDEF)
2503
0
  {
2504
0
    const char *name;
2505
0
    char buf[SYMNMLEN + 1];
2506
0
    struct bfd_link_hash_entry *h;
2507
2508
    /* This symbol is externally visible, and is defined by this
2509
       object file.  */
2510
0
    name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
2511
2512
0
    if (name == NULL)
2513
0
      return false;
2514
0
    h = bfd_link_hash_lookup (info->hash, name, false, false, true);
2515
2516
    /* We are only interested in symbols that are currently
2517
       undefined.  If a symbol is currently known to be common,
2518
       XCOFF linkers do not bring in an object file which
2519
       defines it.  We also don't bring in symbols to satisfy
2520
       undefined references in shared objects.  */
2521
0
    if (h != NULL
2522
0
        && h->type == bfd_link_hash_undefined
2523
0
        && (info->output_bfd->xvec != abfd->xvec
2524
0
      || (((struct xcoff_link_hash_entry *) h)->flags
2525
0
          & XCOFF_DEF_DYNAMIC) == 0))
2526
0
      {
2527
0
        if (!(*info->callbacks
2528
0
        ->add_archive_element) (info, abfd, name, subsbfd))
2529
0
    continue;
2530
0
        *pneeded = true;
2531
0
        return true;
2532
0
      }
2533
0
  }
2534
0
    }
2535
2536
  /* We do not need this object file.  */
2537
0
  return true;
2538
0
}
2539
2540
/* Check a single archive element to see if we need to include it in
2541
   the link.  *PNEEDED is set according to whether this element is
2542
   needed in the link or not.  This is called via
2543
   _bfd_generic_link_add_archive_symbols.  */
2544
2545
static bool
2546
xcoff_link_check_archive_element (bfd *abfd,
2547
          struct bfd_link_info *info,
2548
          struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED,
2549
          const char *name ATTRIBUTE_UNUSED,
2550
          bool *pneeded)
2551
0
{
2552
0
  bool keep_syms_p;
2553
0
  bfd *oldbfd;
2554
2555
0
  keep_syms_p = (obj_coff_external_syms (abfd) != NULL);
2556
0
  if (!_bfd_coff_get_external_symbols (abfd))
2557
0
    return false;
2558
2559
0
  oldbfd = abfd;
2560
0
  if (!xcoff_link_check_ar_symbols (abfd, info, pneeded, &abfd))
2561
0
    return false;
2562
2563
0
  if (*pneeded)
2564
0
    {
2565
      /* Potentially, the add_archive_element hook may have set a
2566
   substitute BFD for us.  */
2567
0
      if (abfd != oldbfd)
2568
0
  {
2569
0
    if (!keep_syms_p
2570
0
        && !_bfd_coff_free_symbols (oldbfd))
2571
0
      return false;
2572
0
    keep_syms_p = (obj_coff_external_syms (abfd) != NULL);
2573
0
    if (!_bfd_coff_get_external_symbols (abfd))
2574
0
      return false;
2575
0
  }
2576
0
      if (!xcoff_link_add_symbols (abfd, info))
2577
0
  return false;
2578
0
      if (info->keep_memory)
2579
0
  keep_syms_p = true;
2580
0
    }
2581
2582
0
  if (!keep_syms_p)
2583
0
    {
2584
0
      if (!_bfd_coff_free_symbols (abfd))
2585
0
  return false;
2586
0
    }
2587
2588
0
  return true;
2589
0
}
2590
2591
/* Given an XCOFF BFD, add symbols to the global hash table as
2592
   appropriate.  */
2593
2594
bool
2595
_bfd_xcoff_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
2596
0
{
2597
0
  switch (bfd_get_format (abfd))
2598
0
    {
2599
0
    case bfd_object:
2600
0
      return xcoff_link_add_object_symbols (abfd, info);
2601
2602
0
    case bfd_archive:
2603
      /* If the archive has a map, do the usual search.  We then need
2604
   to check the archive for dynamic objects, because they may not
2605
   appear in the archive map even though they should, perhaps, be
2606
   included.  If the archive has no map, we just consider each object
2607
   file in turn, since that apparently is what the AIX native linker
2608
   does.  */
2609
0
      if (bfd_has_map (abfd))
2610
0
  {
2611
0
    if (! (_bfd_generic_link_add_archive_symbols
2612
0
     (abfd, info, xcoff_link_check_archive_element)))
2613
0
      return false;
2614
0
  }
2615
2616
0
      {
2617
0
  bfd *member;
2618
2619
0
  member = bfd_openr_next_archived_file (abfd, NULL);
2620
0
  while (member != NULL)
2621
0
    {
2622
0
      if (bfd_check_format (member, bfd_object)
2623
0
    && (info->output_bfd->xvec == member->xvec)
2624
0
    && (! bfd_has_map (abfd) || (member->flags & DYNAMIC) != 0))
2625
0
        {
2626
0
    bool needed;
2627
2628
0
    if (! xcoff_link_check_archive_element (member, info,
2629
0
              NULL, NULL, &needed))
2630
0
      return false;
2631
0
    if (needed)
2632
0
      member->archive_pass = -1;
2633
0
        }
2634
0
      member = bfd_openr_next_archived_file (abfd, member);
2635
0
    }
2636
0
      }
2637
2638
0
      return true;
2639
2640
0
    default:
2641
0
      bfd_set_error (bfd_error_wrong_format);
2642
0
      return false;
2643
0
    }
2644
0
}
2645

2646
bool
2647
_bfd_xcoff_define_common_symbol (bfd *output_bfd ATTRIBUTE_UNUSED,
2648
         struct bfd_link_info *info ATTRIBUTE_UNUSED,
2649
         struct bfd_link_hash_entry *harg)
2650
0
{
2651
0
  struct xcoff_link_hash_entry *h;
2652
2653
0
  if (!bfd_generic_define_common_symbol (output_bfd, info, harg))
2654
0
    return false;
2655
2656
0
  h = (struct xcoff_link_hash_entry *) harg;
2657
0
  h->flags |= XCOFF_DEF_REGULAR;
2658
0
  return true;
2659
0
}
2660

2661
/* If symbol H has not been interpreted as a function descriptor,
2662
   see whether it should be.  Set up its descriptor information if so.  */
2663
2664
static bool
2665
xcoff_find_function (struct bfd_link_info *info,
2666
         struct xcoff_link_hash_entry *h)
2667
0
{
2668
0
  if ((h->flags & XCOFF_DESCRIPTOR) == 0
2669
0
      && h->root.root.string[0] != '.')
2670
0
    {
2671
0
      char *fnname;
2672
0
      struct xcoff_link_hash_entry *hfn;
2673
0
      size_t amt;
2674
2675
0
      amt = strlen (h->root.root.string) + 2;
2676
0
      fnname = bfd_malloc (amt);
2677
0
      if (fnname == NULL)
2678
0
  return false;
2679
0
      fnname[0] = '.';
2680
0
      strcpy (fnname + 1, h->root.root.string);
2681
0
      hfn = xcoff_link_hash_lookup (xcoff_hash_table (info),
2682
0
            fnname, false, false, true);
2683
0
      free (fnname);
2684
0
      if (hfn != NULL
2685
0
    && hfn->smclas == XMC_PR
2686
0
    && (hfn->root.type == bfd_link_hash_defined
2687
0
        || hfn->root.type == bfd_link_hash_defweak))
2688
0
  {
2689
0
    h->flags |= XCOFF_DESCRIPTOR;
2690
0
    h->descriptor = hfn;
2691
0
    hfn->descriptor = h;
2692
0
  }
2693
0
    }
2694
0
  return true;
2695
0
}
2696

2697
/* Return true if the given bfd contains at least one shared object.  */
2698
2699
static bool
2700
xcoff_archive_contains_shared_object_p (struct bfd_link_info *info,
2701
          bfd *archive)
2702
0
{
2703
0
  struct xcoff_archive_info *archive_info;
2704
0
  bfd *member;
2705
2706
0
  archive_info = xcoff_get_archive_info (info, archive);
2707
0
  if (!archive_info->know_contains_shared_object_p)
2708
0
    {
2709
0
      member = bfd_openr_next_archived_file (archive, NULL);
2710
0
      while (member != NULL && (member->flags & DYNAMIC) == 0)
2711
0
  member = bfd_openr_next_archived_file (archive, member);
2712
2713
0
      archive_info->contains_shared_object_p = (member != NULL);
2714
0
      archive_info->know_contains_shared_object_p = 1;
2715
0
    }
2716
0
  return archive_info->contains_shared_object_p;
2717
0
}
2718
2719
/* Symbol H qualifies for export by -bexpfull.  Return true if it also
2720
   qualifies for export by -bexpall.  */
2721
2722
static bool
2723
xcoff_covered_by_expall_p (struct xcoff_link_hash_entry *h)
2724
0
{
2725
  /* Exclude symbols beginning with '_'.  */
2726
0
  if (h->root.root.string[0] == '_')
2727
0
    return false;
2728
2729
  /* Exclude archive members that would otherwise be unreferenced.  */
2730
0
  if ((h->flags & XCOFF_MARK) == 0
2731
0
      && (h->root.type == bfd_link_hash_defined
2732
0
    || h->root.type == bfd_link_hash_defweak)
2733
0
      && h->root.u.def.section->owner != NULL
2734
0
      && h->root.u.def.section->owner->my_archive != NULL)
2735
0
    return false;
2736
2737
0
  return true;
2738
0
}
2739
2740
/* Return true if symbol H qualifies for the forms of automatic export
2741
   specified by AUTO_EXPORT_FLAGS.  */
2742
2743
static bool
2744
xcoff_auto_export_p (struct bfd_link_info *info,
2745
         struct xcoff_link_hash_entry *h,
2746
         unsigned int auto_export_flags)
2747
0
{
2748
  /* Don't automatically export things that were explicitly exported.  */
2749
0
  if ((h->flags & XCOFF_EXPORT) != 0)
2750
0
    return false;
2751
2752
  /* Don't export things that we don't define.  */
2753
0
  if ((h->flags & XCOFF_DEF_REGULAR) == 0)
2754
0
    return false;
2755
2756
  /* Don't export functions; export their descriptors instead.  */
2757
0
  if (h->root.root.string[0] == '.')
2758
0
    return false;
2759
2760
  /* Don't export hidden or internal symbols.  */
2761
0
  if (h->visibility == SYM_V_HIDDEN
2762
0
      || h->visibility == SYM_V_INTERNAL)
2763
0
    return false;
2764
2765
  /* We don't export a symbol which is being defined by an object
2766
     included from an archive which contains a shared object.  The
2767
     rationale is that if an archive contains both an unshared and
2768
     a shared object, then there must be some reason that the
2769
     unshared object is unshared, and we don't want to start
2770
     providing a shared version of it.  In particular, this solves
2771
     a bug involving the _savefNN set of functions.  gcc will call
2772
     those functions without providing a slot to restore the TOC,
2773
     so it is essential that these functions be linked in directly
2774
     and not from a shared object, which means that a shared
2775
     object which also happens to link them in must not export
2776
     them.  This is confusing, but I haven't been able to think of
2777
     a different approach.  Note that the symbols can, of course,
2778
     be exported explicitly.  */
2779
0
  if (h->root.type == bfd_link_hash_defined
2780
0
      || h->root.type == bfd_link_hash_defweak)
2781
0
    {
2782
0
      bfd *owner;
2783
2784
0
      owner = h->root.u.def.section->owner;
2785
0
      if (owner != NULL
2786
0
    && owner->my_archive != NULL
2787
0
    && xcoff_archive_contains_shared_object_p (info, owner->my_archive))
2788
0
  return false;
2789
0
    }
2790
2791
  /* Otherwise, all symbols are exported by -bexpfull.  */
2792
0
  if ((auto_export_flags & XCOFF_EXPFULL) != 0)
2793
0
    return true;
2794
2795
  /* Despite its name, -bexpall exports most but not all symbols.  */
2796
0
  if ((auto_export_flags & XCOFF_EXPALL) != 0
2797
0
      && xcoff_covered_by_expall_p (h))
2798
0
    return true;
2799
2800
0
  return false;
2801
0
}
2802

2803
/* Return true if relocation REL needs to be copied to the .loader section.
2804
   If REL is against a global symbol, H is that symbol, otherwise it
2805
   is null.  */
2806
2807
static bool
2808
xcoff_need_ldrel_p (struct bfd_link_info *info, struct internal_reloc *rel,
2809
        struct xcoff_link_hash_entry *h, asection *ssec)
2810
0
{
2811
0
  if (!xcoff_hash_table (info)->loader_section)
2812
0
    return false;
2813
2814
0
  switch (rel->r_type)
2815
0
    {
2816
0
    case R_TOC:
2817
0
    case R_GL:
2818
0
    case R_TCL:
2819
0
    case R_TRL:
2820
0
    case R_TRLA:
2821
      /* We should never need a .loader reloc for a TOC-relative reloc.  */
2822
0
      return false;
2823
2824
0
    default:
2825
      /* In this case, relocations against defined symbols can be resolved
2826
   statically.  */
2827
0
      if (h == NULL
2828
0
    || h->root.type == bfd_link_hash_defined
2829
0
    || h->root.type == bfd_link_hash_defweak
2830
0
    || h->root.type == bfd_link_hash_common)
2831
0
  return false;
2832
2833
      /* We will always provide a local definition of function symbols,
2834
   even if we don't have one yet.  */
2835
0
      if ((h->flags & XCOFF_CALLED) != 0)
2836
0
  return false;
2837
2838
0
      return true;
2839
2840
0
    case R_POS:
2841
0
    case R_NEG:
2842
0
    case R_RL:
2843
0
    case R_RLA:
2844
      /* Absolute relocations against absolute symbols can be
2845
   resolved statically.  */
2846
0
      if (h != NULL
2847
0
    && (h->root.type == bfd_link_hash_defined
2848
0
        || h->root.type == bfd_link_hash_defweak)
2849
0
    && !h->root.rel_from_abs)
2850
0
  {
2851
0
    asection *sec = h->root.u.def.section;
2852
0
    if (bfd_is_abs_section (sec)
2853
0
        || (sec != NULL
2854
0
      && bfd_is_abs_section (sec->output_section)))
2855
0
      return false;
2856
0
  }
2857
2858
      /* Absolute relocations from read-only sections are forbidden
2859
   by AIX loader. However, they can appear in their section's
2860
         relocations.  */
2861
0
      if (ssec != NULL
2862
0
    && (ssec->output_section->flags & SEC_READONLY) != 0)
2863
0
  return false;
2864
2865
0
      return true;
2866
2867
0
    case R_TLS:
2868
0
    case R_TLS_LE:
2869
0
    case R_TLS_IE:
2870
0
    case R_TLS_LD:
2871
0
    case R_TLSM:
2872
0
    case R_TLSML:
2873
0
      return true;
2874
0
    }
2875
0
}
2876

2877
/* Mark a symbol as not being garbage, including the section in which
2878
   it is defined.  */
2879
2880
static inline bool
2881
xcoff_mark_symbol (struct bfd_link_info *info, struct xcoff_link_hash_entry *h)
2882
0
{
2883
0
  if ((h->flags & XCOFF_MARK) != 0)
2884
0
    return true;
2885
2886
0
  h->flags |= XCOFF_MARK;
2887
2888
  /* If we're marking an undefined symbol, try find some way of
2889
     defining it.  */
2890
0
  if (!bfd_link_relocatable (info)
2891
0
      && (h->flags & XCOFF_IMPORT) == 0
2892
0
      && (h->flags & XCOFF_DEF_REGULAR) == 0
2893
0
      && (h->root.type == bfd_link_hash_undefined
2894
0
    || h->root.type == bfd_link_hash_undefweak))
2895
0
    {
2896
      /* First check whether this symbol can be interpreted as an
2897
   undefined function descriptor for a defined function symbol.  */
2898
0
      if (!xcoff_find_function (info, h))
2899
0
  return false;
2900
2901
0
      if ((h->flags & XCOFF_DESCRIPTOR) != 0
2902
0
    && (h->descriptor->root.type == bfd_link_hash_defined
2903
0
        || h->descriptor->root.type == bfd_link_hash_defweak))
2904
0
  {
2905
    /* This is a descriptor for a defined symbol, but the input
2906
       objects have not defined the descriptor itself.  Fill in
2907
       the definition automatically.
2908
2909
       Note that we do this even if we found a dynamic definition
2910
       of H.  The local function definition logically overrides
2911
       the dynamic one.  */
2912
0
    asection *sec;
2913
2914
0
    sec = xcoff_hash_table (info)->descriptor_section;
2915
0
    h->root.type = bfd_link_hash_defined;
2916
0
    h->root.u.def.section = sec;
2917
0
    h->root.u.def.value = sec->size;
2918
0
    h->smclas = XMC_DS;
2919
0
    h->flags |= XCOFF_DEF_REGULAR;
2920
2921
    /* The size of the function descriptor depends on whether this
2922
       is xcoff32 (12) or xcoff64 (24).  */
2923
0
    sec->size += bfd_xcoff_function_descriptor_size (sec->owner);
2924
2925
    /* A function descriptor uses two relocs: one for the
2926
       associated code, and one for the TOC address.  */
2927
0
    xcoff_hash_table (info)->ldinfo.ldrel_count += 2;
2928
0
    sec->reloc_count += 2;
2929
2930
    /* Mark the function itself.  */
2931
0
    if (!xcoff_mark_symbol (info, h->descriptor))
2932
0
      return false;
2933
2934
    /* Mark the TOC section, so that we get an anchor
2935
       to relocate against.  */
2936
0
    if (!xcoff_mark (info, xcoff_hash_table (info)->toc_section))
2937
0
      return false;
2938
2939
    /* We handle writing out the contents of the descriptor in
2940
       xcoff_write_global_symbol.  */
2941
0
  }
2942
0
      else if (info->static_link)
2943
  /* We can't get a symbol value dynamically, so just assume
2944
     that it's undefined.  */
2945
0
  h->flags |= XCOFF_WAS_UNDEFINED;
2946
0
      else if ((h->flags & XCOFF_CALLED) != 0)
2947
0
  {
2948
    /* This is a function symbol for which we need to create
2949
       linkage code.  */
2950
0
    asection *sec;
2951
0
    struct xcoff_link_hash_entry *hds;
2952
2953
    /* Mark the descriptor (and its TOC section).  */
2954
0
    hds = h->descriptor;
2955
0
    BFD_ASSERT ((hds->root.type == bfd_link_hash_undefined
2956
0
           || hds->root.type == bfd_link_hash_undefweak)
2957
0
          && (hds->flags & XCOFF_DEF_REGULAR) == 0);
2958
0
    if (!xcoff_mark_symbol (info, hds))
2959
0
      return false;
2960
2961
    /* Treat this symbol as undefined if the descriptor was.  */
2962
0
    if ((hds->flags & XCOFF_WAS_UNDEFINED) != 0)
2963
0
      h->flags |= XCOFF_WAS_UNDEFINED;
2964
2965
    /* Allocate room for the global linkage code itself.  */
2966
0
    sec = xcoff_hash_table (info)->linkage_section;
2967
0
    h->root.type = bfd_link_hash_defined;
2968
0
    h->root.u.def.section = sec;
2969
0
    h->root.u.def.value = sec->size;
2970
0
    h->smclas = XMC_GL;
2971
0
    h->flags |= XCOFF_DEF_REGULAR;
2972
0
    sec->size += bfd_xcoff_glink_code_size (info->output_bfd);
2973
2974
    /* The global linkage code requires a TOC entry for the
2975
       descriptor.  */
2976
0
    if (hds->toc_section == NULL)
2977
0
      {
2978
0
        int byte_size;
2979
2980
        /* 32 vs 64
2981
     xcoff32 uses 4 bytes in the toc.
2982
     xcoff64 uses 8 bytes in the toc.  */
2983
0
        if (bfd_xcoff_is_xcoff64 (info->output_bfd))
2984
0
    byte_size = 8;
2985
0
        else if (bfd_xcoff_is_xcoff32 (info->output_bfd))
2986
0
    byte_size = 4;
2987
0
        else
2988
0
    return false;
2989
2990
        /* Allocate room in the fallback TOC section.  */
2991
0
        hds->toc_section = xcoff_hash_table (info)->toc_section;
2992
0
        hds->u.toc_offset = hds->toc_section->size;
2993
0
        hds->toc_section->size += byte_size;
2994
0
        if (!xcoff_mark (info, hds->toc_section))
2995
0
    return false;
2996
2997
        /* Allocate room for a static and dynamic R_TOC
2998
     relocation.  */
2999
0
        ++xcoff_hash_table (info)->ldinfo.ldrel_count;
3000
0
        ++hds->toc_section->reloc_count;
3001
3002
        /* Set the index to -2 to force this symbol to
3003
     get written out.  */
3004
0
        hds->indx = -2;
3005
0
        hds->flags |= XCOFF_SET_TOC | XCOFF_LDREL;
3006
0
      }
3007
0
  }
3008
0
      else if ((h->flags & XCOFF_DEF_DYNAMIC) == 0)
3009
0
  {
3010
    /* Record that the symbol was undefined, then import it.
3011
       -brtl links use a special fake import file.  */
3012
0
    h->flags |= XCOFF_WAS_UNDEFINED | XCOFF_IMPORT;
3013
0
    if (xcoff_hash_table (info)->rtld)
3014
0
      {
3015
0
        if (!xcoff_set_import_path (info, h, "", "..", ""))
3016
0
    return false;
3017
0
      }
3018
0
    else
3019
0
      {
3020
0
        if (!xcoff_set_import_path (info, h, NULL, NULL, NULL))
3021
0
    return false;
3022
0
      }
3023
0
  }
3024
0
    }
3025
3026
0
  if (h->root.type == bfd_link_hash_defined
3027
0
      || h->root.type == bfd_link_hash_defweak)
3028
0
    {
3029
0
      asection *hsec;
3030
3031
0
      hsec = h->root.u.def.section;
3032
0
      if (! bfd_is_abs_section (hsec)
3033
0
    && hsec->gc_mark == 0)
3034
0
  {
3035
0
    if (! xcoff_mark (info, hsec))
3036
0
      return false;
3037
0
  }
3038
0
    }
3039
3040
0
  if (h->toc_section != NULL
3041
0
      && h->toc_section->gc_mark == 0)
3042
0
    {
3043
0
      if (! xcoff_mark (info, h->toc_section))
3044
0
  return false;
3045
0
    }
3046
3047
0
  return true;
3048
0
}
3049
3050
/* Look for a symbol called NAME.  If the symbol is defined, mark it.
3051
   If the symbol exists, set FLAGS.  */
3052
3053
static bool
3054
xcoff_mark_symbol_by_name (struct bfd_link_info *info,
3055
         const char *name, unsigned int flags)
3056
0
{
3057
0
  struct xcoff_link_hash_entry *h;
3058
3059
0
  h = xcoff_link_hash_lookup (xcoff_hash_table (info), name,
3060
0
            false, false, true);
3061
0
  if (h != NULL)
3062
0
    {
3063
0
      h->flags |= flags;
3064
0
      if (h->root.type == bfd_link_hash_defined
3065
0
    || h->root.type == bfd_link_hash_defweak)
3066
0
  {
3067
0
    if (!xcoff_mark (info, h->root.u.def.section))
3068
0
      return false;
3069
0
  }
3070
0
    }
3071
0
  return true;
3072
0
}
3073
3074
/* The mark phase of garbage collection.  For a given section, mark
3075
   it, and all the sections which define symbols to which it refers.
3076
   Because this function needs to look at the relocs, we also count
3077
   the number of relocs which need to be copied into the .loader
3078
   section.  */
3079
3080
static bool
3081
xcoff_mark (struct bfd_link_info *info, asection *sec)
3082
0
{
3083
0
  if (bfd_is_const_section (sec)
3084
0
      || sec->gc_mark != 0)
3085
0
    return true;
3086
3087
0
  sec->gc_mark = 1;
3088
3089
0
  if (sec->owner->xvec != info->output_bfd->xvec)
3090
0
    return true;
3091
3092
0
  if (coff_section_data (sec->owner, sec) == NULL)
3093
0
    return true;
3094
3095
3096
0
  if (xcoff_section_data (sec->owner, sec) != NULL)
3097
0
    {
3098
0
      struct xcoff_link_hash_entry **syms;
3099
0
      asection **csects;
3100
0
      unsigned long i, first, last;
3101
3102
      /* Mark all the symbols in this section.  */
3103
0
      syms = obj_xcoff_sym_hashes (sec->owner);
3104
0
      csects = xcoff_data (sec->owner)->csects;
3105
0
      first = xcoff_section_data (sec->owner, sec)->first_symndx;
3106
0
      last = xcoff_section_data (sec->owner, sec)->last_symndx;
3107
0
      for (i = first; i <= last; i++)
3108
0
  if (csects[i] == sec
3109
0
      && syms[i] != NULL
3110
0
      && (syms[i]->flags & XCOFF_MARK) == 0)
3111
0
    {
3112
0
      if (!xcoff_mark_symbol (info, syms[i]))
3113
0
        return false;
3114
0
    }
3115
0
    }
3116
3117
  /* Look through the section relocs.  */
3118
0
  if ((sec->flags & SEC_RELOC) != 0
3119
0
      && sec->reloc_count > 0)
3120
0
    {
3121
0
      struct internal_reloc *rel, *relend;
3122
3123
0
      rel = xcoff_read_internal_relocs (sec->owner, sec, true,
3124
0
          NULL, false, NULL);
3125
0
      if (rel == NULL)
3126
0
  return false;
3127
0
      relend = rel + sec->reloc_count;
3128
0
      for (; rel < relend; rel++)
3129
0
  {
3130
0
    struct xcoff_link_hash_entry *h;
3131
3132
0
    if ((unsigned int) rel->r_symndx
3133
0
        > obj_raw_syment_count (sec->owner))
3134
0
      continue;
3135
3136
0
    h = obj_xcoff_sym_hashes (sec->owner)[rel->r_symndx];
3137
0
    if (h != NULL)
3138
0
      {
3139
0
        if ((h->flags & XCOFF_MARK) == 0)
3140
0
    {
3141
0
      if (!xcoff_mark_symbol (info, h))
3142
0
        return false;
3143
0
    }
3144
0
      }
3145
0
    else
3146
0
      {
3147
0
        asection *rsec;
3148
3149
0
        rsec = xcoff_data (sec->owner)->csects[rel->r_symndx];
3150
0
        if (rsec != NULL
3151
0
      && rsec->gc_mark == 0)
3152
0
    {
3153
0
      if (!xcoff_mark (info, rsec))
3154
0
        return false;
3155
0
    }
3156
0
      }
3157
3158
    /* See if this reloc needs to be copied into the .loader
3159
       section.  */
3160
0
    if ((sec->flags & SEC_DEBUGGING) == 0
3161
0
        && xcoff_need_ldrel_p (info, rel, h, sec))
3162
0
      {
3163
0
        ++xcoff_hash_table (info)->ldinfo.ldrel_count;
3164
0
        if (h != NULL)
3165
0
    h->flags |= XCOFF_LDREL;
3166
0
      }
3167
0
  }
3168
3169
0
      if (! info->keep_memory
3170
0
    && coff_section_data (sec->owner, sec) != NULL)
3171
0
  {
3172
0
    free (coff_section_data (sec->owner, sec)->relocs);
3173
0
    coff_section_data (sec->owner, sec)->relocs = NULL;
3174
0
  }
3175
0
    }
3176
3177
0
  return true;
3178
0
}
3179
3180
/* Routines that are called after all the input files have been
3181
   handled, but before the sections are laid out in memory.  */
3182
3183
/* The sweep phase of garbage collection.  Remove all garbage
3184
   sections.  */
3185
3186
static void
3187
xcoff_sweep (struct bfd_link_info *info)
3188
0
{
3189
0
  bfd *sub;
3190
3191
0
  for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
3192
0
    {
3193
0
      asection *o;
3194
0
      bool some_kept = false;
3195
3196
      /* As says below keep all sections from non-XCOFF
3197
         input files.  */
3198
0
      if (sub->xvec != info->output_bfd->xvec)
3199
0
  some_kept = true;
3200
0
      else
3201
0
  {
3202
    /* See whether any section is already marked.  */
3203
0
    for (o = sub->sections; o != NULL; o = o->next)
3204
0
      if (o->gc_mark)
3205
0
        some_kept = true;
3206
0
  }
3207
3208
      /* If no section in this file will be kept, then we can
3209
   toss out debug sections.  */
3210
0
      if (!some_kept)
3211
0
  {
3212
0
    for (o = sub->sections; o != NULL; o = o->next)
3213
0
      {
3214
0
        o->size = 0;
3215
0
        o->reloc_count = 0;
3216
0
      }
3217
0
    continue;
3218
0
  }
3219
3220
      /* Keep all sections from non-XCOFF input files.  Keep
3221
   special sections.  Keep .debug sections for the
3222
   moment.  */
3223
0
      for (o = sub->sections; o != NULL; o = o->next)
3224
0
  {
3225
0
    if (o->gc_mark == 1)
3226
0
      continue;
3227
3228
0
    if (sub->xvec != info->output_bfd->xvec
3229
0
        || o == xcoff_hash_table (info)->debug_section
3230
0
        || o == xcoff_hash_table (info)->loader_section
3231
0
        || o == xcoff_hash_table (info)->linkage_section
3232
0
        || o == xcoff_hash_table (info)->descriptor_section
3233
0
        || (bfd_section_flags (o) & SEC_DEBUGGING)
3234
0
        || strcmp (o->name, ".debug") == 0)
3235
0
      xcoff_mark (info, o);
3236
0
    else
3237
0
      {
3238
0
        o->size = 0;
3239
0
        o->reloc_count = 0;
3240
0
      }
3241
0
  }
3242
0
    }
3243
0
}
3244
3245
/* Initialize the back-end with linker infos.  */
3246
3247
bool
3248
bfd_xcoff_link_init (struct bfd_link_info *info,
3249
         struct bfd_xcoff_link_params *params)
3250
0
{
3251
0
  xcoff_hash_table (info)->params = params;
3252
3253
0
  return true;
3254
0
}
3255
3256
/* Record the number of elements in a set.  This is used to output the
3257
   correct csect length.  */
3258
3259
bool
3260
bfd_xcoff_link_record_set (bfd *output_bfd,
3261
         struct bfd_link_info *info,
3262
         struct bfd_link_hash_entry *harg,
3263
         bfd_size_type size)
3264
0
{
3265
0
  struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) harg;
3266
0
  struct xcoff_link_size_list *n;
3267
0
  size_t amt;
3268
3269
0
  if (bfd_get_flavour (output_bfd) != bfd_target_xcoff_flavour)
3270
0
    return true;
3271
3272
  /* This will hardly ever be called.  I don't want to burn four bytes
3273
     per global symbol, so instead the size is kept on a linked list
3274
     attached to the hash table.  */
3275
0
  amt = sizeof (* n);
3276
0
  n = bfd_alloc (output_bfd, amt);
3277
0
  if (n == NULL)
3278
0
    return false;
3279
0
  n->next = xcoff_hash_table (info)->size_list;
3280
0
  n->h = h;
3281
0
  n->size = size;
3282
0
  xcoff_hash_table (info)->size_list = n;
3283
3284
0
  h->flags |= XCOFF_HAS_SIZE;
3285
3286
0
  return true;
3287
0
}
3288
3289
/* Import a symbol.  */
3290
3291
bool
3292
bfd_xcoff_import_symbol (bfd *output_bfd,
3293
       struct bfd_link_info *info,
3294
       struct bfd_link_hash_entry *harg,
3295
       bfd_vma val,
3296
       const char *imppath,
3297
       const char *impfile,
3298
       const char *impmember,
3299
       unsigned int syscall_flag)
3300
0
{
3301
0
  struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) harg;
3302
3303
0
  if (bfd_get_flavour (output_bfd) != bfd_target_xcoff_flavour)
3304
0
    return true;
3305
3306
  /* A symbol name which starts with a period is the code for a
3307
     function.  If the symbol is undefined, then add an undefined
3308
     symbol for the function descriptor, and import that instead.  */
3309
0
  if (h->root.root.string[0] == '.'
3310
0
      && h->root.type == bfd_link_hash_undefined
3311
0
      && val == (bfd_vma) -1)
3312
0
    {
3313
0
      struct xcoff_link_hash_entry *hds;
3314
3315
0
      hds = h->descriptor;
3316
0
      if (hds == NULL)
3317
0
  {
3318
0
    hds = xcoff_link_hash_lookup (xcoff_hash_table (info),
3319
0
          h->root.root.string + 1,
3320
0
          true, false, true);
3321
0
    if (hds == NULL)
3322
0
      return false;
3323
0
    if (hds->root.type == bfd_link_hash_new)
3324
0
      {
3325
0
        hds->root.type = bfd_link_hash_undefined;
3326
0
        hds->root.u.undef.abfd = h->root.u.undef.abfd;
3327
0
      }
3328
0
    hds->flags |= XCOFF_DESCRIPTOR;
3329
0
    BFD_ASSERT ((h->flags & XCOFF_DESCRIPTOR) == 0);
3330
0
    hds->descriptor = h;
3331
0
    h->descriptor = hds;
3332
0
  }
3333
3334
      /* Now, if the descriptor is undefined, import the descriptor
3335
   rather than the symbol we were told to import.  FIXME: Is
3336
   this correct in all cases?  */
3337
0
      if (hds->root.type == bfd_link_hash_undefined)
3338
0
  h = hds;
3339
0
    }
3340
3341
0
  h->flags |= (XCOFF_IMPORT | syscall_flag);
3342
3343
0
  if (val != (bfd_vma) -1)
3344
0
    {
3345
0
      if (h->root.type == bfd_link_hash_defined)
3346
0
  (*info->callbacks->multiple_definition) (info, &h->root, output_bfd,
3347
0
             bfd_abs_section_ptr, val);
3348
3349
0
      h->root.type = bfd_link_hash_defined;
3350
0
      h->root.u.def.section = bfd_abs_section_ptr;
3351
0
      h->root.u.def.value = val;
3352
0
      h->smclas = XMC_XO;
3353
0
    }
3354
3355
0
  if (!xcoff_set_import_path (info, h, imppath, impfile, impmember))
3356
0
    return false;
3357
3358
0
  return true;
3359
0
}
3360
3361
/* Export a symbol.  */
3362
3363
bool
3364
bfd_xcoff_export_symbol (bfd *output_bfd,
3365
       struct bfd_link_info *info,
3366
       struct bfd_link_hash_entry *harg)
3367
0
{
3368
0
  struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) harg;
3369
3370
0
  if (bfd_get_flavour (output_bfd) != bfd_target_xcoff_flavour)
3371
0
    return true;
3372
3373
  /* As AIX linker, symbols exported with hidden visibility are
3374
     silently ignored.  */
3375
0
  if (h->visibility == SYM_V_HIDDEN)
3376
0
    return true;
3377
3378
0
  if (h->visibility == SYM_V_INTERNAL)
3379
0
    {
3380
0
      _bfd_error_handler (_("%pB: cannot export internal symbol `%s`."),
3381
0
        output_bfd, h->root.root.string);
3382
0
      bfd_set_error (bfd_error_bad_value);
3383
0
      return false;
3384
0
    }
3385
3386
0
  h->flags |= XCOFF_EXPORT;
3387
3388
  /* FIXME: I'm not at all sure what syscall is supposed to mean, so
3389
     I'm just going to ignore it until somebody explains it.  */
3390
3391
  /* Make sure we don't garbage collect this symbol.  */
3392
0
  if (! xcoff_mark_symbol (info, h))
3393
0
    return false;
3394
3395
  /* If this is a function descriptor, make sure we don't garbage
3396
     collect the associated function code.  We normally don't have to
3397
     worry about this, because the descriptor will be attached to a
3398
     section with relocs, but if we are creating the descriptor
3399
     ourselves those relocs will not be visible to the mark code.  */
3400
0
  if ((h->flags & XCOFF_DESCRIPTOR) != 0)
3401
0
    {
3402
0
      if (! xcoff_mark_symbol (info, h->descriptor))
3403
0
  return false;
3404
0
    }
3405
3406
0
  return true;
3407
0
}
3408
3409
/* Count a reloc against a symbol.  This is called for relocs
3410
   generated by the linker script, typically for global constructors
3411
   and destructors.  */
3412
3413
bool
3414
bfd_xcoff_link_count_reloc (bfd *output_bfd,
3415
          struct bfd_link_info *info,
3416
          const char *name)
3417
0
{
3418
0
  struct xcoff_link_hash_entry *h;
3419
3420
0
  if (bfd_get_flavour (output_bfd) != bfd_target_xcoff_flavour)
3421
0
    return true;
3422
3423
0
  h = ((struct xcoff_link_hash_entry *)
3424
0
       bfd_wrapped_link_hash_lookup (output_bfd, info, name, false, false,
3425
0
             false));
3426
0
  if (h == NULL)
3427
0
    {
3428
0
      _bfd_error_handler (_("%s: no such symbol"), name);
3429
0
      bfd_set_error (bfd_error_no_symbols);
3430
0
      return false;
3431
0
    }
3432
3433
0
  h->flags |= XCOFF_REF_REGULAR;
3434
0
  if (xcoff_hash_table (info)->loader_section)
3435
0
    {
3436
0
      h->flags |= XCOFF_LDREL;
3437
0
      ++xcoff_hash_table (info)->ldinfo.ldrel_count;
3438
0
    }
3439
3440
  /* Mark the symbol to avoid garbage collection.  */
3441
0
  if (! xcoff_mark_symbol (info, h))
3442
0
    return false;
3443
3444
0
  return true;
3445
0
}
3446
3447
/* This function is called for each symbol to which the linker script
3448
   assigns a value.
3449
   FIXME: In cases like the linker test ld-scripts/defined5 where a
3450
   symbol is defined both by an input object file and the script,
3451
   the script definition doesn't override the object file definition
3452
   as is usual for other targets.  At least not when the symbol is
3453
   output.  Other uses of the symbol value by the linker do use the
3454
   script value.  */
3455
3456
bool
3457
bfd_xcoff_record_link_assignment (bfd *output_bfd,
3458
          struct bfd_link_info *info,
3459
          const char *name)
3460
0
{
3461
0
  struct xcoff_link_hash_entry *h;
3462
3463
0
  if (bfd_get_flavour (output_bfd) != bfd_target_xcoff_flavour)
3464
0
    return true;
3465
3466
0
  h = xcoff_link_hash_lookup (xcoff_hash_table (info), name, true, true,
3467
0
            false);
3468
0
  if (h == NULL)
3469
0
    return false;
3470
3471
0
  h->flags |= XCOFF_DEF_REGULAR;
3472
3473
0
  return true;
3474
0
}
3475
3476
/* An xcoff_link_hash_traverse callback for which DATA points to an
3477
   xcoff_loader_info.  Mark all symbols that should be automatically
3478
   exported.  */
3479
3480
static bool
3481
xcoff_mark_auto_exports (struct xcoff_link_hash_entry *h, void *data)
3482
0
{
3483
0
  struct xcoff_loader_info *ldinfo;
3484
3485
0
  ldinfo = (struct xcoff_loader_info *) data;
3486
0
  if (xcoff_auto_export_p (ldinfo->info, h, ldinfo->auto_export_flags))
3487
0
    {
3488
0
      if (!xcoff_mark_symbol (ldinfo->info, h))
3489
0
  ldinfo->failed = true;
3490
0
    }
3491
0
  return true;
3492
0
}
3493
3494
/* INPUT_BFD has an external symbol associated with hash table entry H
3495
   and csect CSECT.   Return true if INPUT_BFD defines H.  */
3496
3497
static bool
3498
xcoff_final_definition_p (bfd *input_bfd, struct xcoff_link_hash_entry *h,
3499
        asection *csect)
3500
0
{
3501
0
  switch (h->root.type)
3502
0
    {
3503
0
    case bfd_link_hash_defined:
3504
0
    case bfd_link_hash_defweak:
3505
      /* No input bfd owns absolute symbols.  They are written by
3506
   xcoff_write_global_symbol instead.  */
3507
0
      return (!bfd_is_abs_section (csect)
3508
0
        && h->root.u.def.section == csect);
3509
3510
0
    case bfd_link_hash_common:
3511
0
      return h->root.u.c.p->section->owner == input_bfd;
3512
3513
0
    case bfd_link_hash_undefined:
3514
0
    case bfd_link_hash_undefweak:
3515
      /* We can't treat undef.abfd as the owner because that bfd
3516
   might be a dynamic object.  Allow any bfd to claim it.  */
3517
0
      return true;
3518
3519
0
    default:
3520
0
      abort ();
3521
0
    }
3522
0
}
3523
3524
/* See if H should have a loader symbol associated with it.  */
3525
3526
static bool
3527
xcoff_build_ldsym (struct xcoff_loader_info *ldinfo,
3528
       struct xcoff_link_hash_entry *h)
3529
0
{
3530
0
  size_t amt;
3531
3532
  /* Warn if this symbol is exported but not defined.  */
3533
0
  if ((h->flags & XCOFF_EXPORT) != 0
3534
0
      && (h->flags & XCOFF_WAS_UNDEFINED) != 0)
3535
0
    {
3536
0
      _bfd_error_handler
3537
0
  (_("warning: attempt to export undefined symbol `%s'"),
3538
0
   h->root.root.string);
3539
0
      return true;
3540
0
    }
3541
3542
  /* We need to add a symbol to the .loader section if it is mentioned
3543
     in a reloc which we are copying to the .loader section and it was
3544
     not defined or common, or if it is the entry point, or if it is
3545
     being exported.  */
3546
0
  if (((h->flags & XCOFF_LDREL) == 0
3547
0
       || h->root.type == bfd_link_hash_defined
3548
0
       || h->root.type == bfd_link_hash_defweak
3549
0
       || h->root.type == bfd_link_hash_common)
3550
0
      && (h->flags & XCOFF_ENTRY) == 0
3551
0
      && (h->flags & XCOFF_EXPORT) == 0)
3552
0
    return true;
3553
3554
  /* We need to add this symbol to the .loader symbols.  */
3555
3556
0
  BFD_ASSERT (h->ldsym == NULL);
3557
0
  amt = sizeof (struct internal_ldsym);
3558
0
  h->ldsym = bfd_zalloc (ldinfo->output_bfd, amt);
3559
0
  if (h->ldsym == NULL)
3560
0
    {
3561
0
      ldinfo->failed = true;
3562
0
      return false;
3563
0
    }
3564
3565
0
  if ((h->flags & XCOFF_IMPORT) != 0)
3566
0
    {
3567
      /* Give imported descriptors class XMC_DS rather than XMC_UA.  */
3568
0
      if ((h->flags & XCOFF_DESCRIPTOR) != 0)
3569
0
  h->smclas = XMC_DS;
3570
0
      h->ldsym->l_ifile = h->ldindx;
3571
0
    }
3572
3573
  /* The first 3 symbol table indices are reserved to indicate the
3574
     data, text and bss sections.  */
3575
0
  h->ldindx = ldinfo->ldsym_count + 3;
3576
3577
0
  ++ldinfo->ldsym_count;
3578
3579
0
  if (! bfd_xcoff_put_ldsymbol_name (ldinfo->output_bfd, ldinfo,
3580
0
             h->ldsym, h->root.root.string))
3581
0
    return false;
3582
3583
0
  h->flags |= XCOFF_BUILT_LDSYM;
3584
0
  return true;
3585
0
}
3586
3587
/* An xcoff_htab_traverse callback that is called for each symbol
3588
   once garbage collection is complete.  */
3589
3590
static bool
3591
xcoff_post_gc_symbol (struct xcoff_link_hash_entry *h, void * p)
3592
0
{
3593
0
  struct xcoff_loader_info *ldinfo = (struct xcoff_loader_info *) p;
3594
3595
  /* __rtinit, this symbol has special handling. */
3596
0
  if (h->flags & XCOFF_RTINIT)
3597
0
    return true;
3598
3599
  /* We don't want to garbage collect symbols which are not defined in
3600
     XCOFF files.  This is a convenient place to mark them.  */
3601
0
  if (xcoff_hash_table (ldinfo->info)->gc
3602
0
      && (h->flags & XCOFF_MARK) == 0
3603
0
      && (h->root.type == bfd_link_hash_defined
3604
0
    || h->root.type == bfd_link_hash_defweak)
3605
0
      && (h->root.u.def.section->owner == NULL
3606
0
    || (h->root.u.def.section->owner->xvec
3607
0
        != ldinfo->info->output_bfd->xvec)))
3608
0
    h->flags |= XCOFF_MARK;
3609
3610
  /* Skip discarded symbols.  */
3611
0
  if (xcoff_hash_table (ldinfo->info)->gc
3612
0
      && (h->flags & XCOFF_MARK) == 0)
3613
0
    return true;
3614
3615
  /* If this is still a common symbol, and it wasn't garbage
3616
     collected, we need to actually allocate space for it in the .bss
3617
     section.  */
3618
0
  if (h->root.type == bfd_link_hash_common
3619
0
      && h->root.u.c.p->section->size == 0)
3620
0
    {
3621
0
      BFD_ASSERT (bfd_is_com_section (h->root.u.c.p->section));
3622
0
      h->root.u.c.p->section->size = h->root.u.c.size;
3623
0
    }
3624
3625
0
  if (xcoff_hash_table (ldinfo->info)->loader_section)
3626
0
    {
3627
0
      if (xcoff_auto_export_p (ldinfo->info, h, ldinfo->auto_export_flags))
3628
0
  h->flags |= XCOFF_EXPORT;
3629
3630
0
      if (!xcoff_build_ldsym (ldinfo, h))
3631
0
  return false;
3632
0
    }
3633
3634
0
  return true;
3635
0
}
3636
3637
/* INPUT_BFD includes XCOFF symbol ISYM, which is associated with linker
3638
   hash table entry H and csect CSECT.  AUX contains ISYM's auxiliary
3639
   csect information, if any.  NAME is the function's name if the name
3640
   is stored in the .debug section, otherwise it is null.
3641
3642
   Return 1 if we should include an appropriately-adjusted ISYM
3643
   in the output file, 0 if we should discard ISYM, or -1 if an
3644
   error occured.  */
3645
3646
static int
3647
xcoff_keep_symbol_p (struct bfd_link_info *info, bfd *input_bfd,
3648
         struct internal_syment *isym,
3649
         union internal_auxent *aux,
3650
         struct xcoff_link_hash_entry *h,
3651
         asection *csect, const char *name)
3652
0
{
3653
0
  int smtyp;
3654
3655
  /* If we are skipping this csect, we want to strip the symbol too.  */
3656
0
  if (csect == NULL)
3657
0
    return 0;
3658
3659
  /* Likewise if we garbage-collected the csect.  */
3660
0
  if (xcoff_hash_table (info)->gc
3661
0
      && !bfd_is_abs_section (csect)
3662
0
      && !bfd_is_und_section (csect)
3663
0
      && csect->gc_mark == 0)
3664
0
    return 0;
3665
3666
  /* An XCOFF linker always removes C_STAT symbols.  */
3667
0
  if (isym->n_sclass == C_STAT)
3668
0
    return 0;
3669
3670
  /* We generate the TOC anchor separately.  */
3671
0
  if (isym->n_sclass == C_HIDEXT
3672
0
      && aux->x_csect.x_smclas == XMC_TC0)
3673
0
    return 0;
3674
3675
  /* If we are stripping all symbols, we want to discard this one.  */
3676
0
  if (info->strip == strip_all)
3677
0
    return 0;
3678
3679
  /* Discard symbols that are defined elsewhere.  */
3680
0
  if (EXTERN_SYM_P (isym->n_sclass))
3681
0
    {
3682
0
      if ((h->flags & XCOFF_ALLOCATED) != 0)
3683
0
  return 0;
3684
0
      if (!xcoff_final_definition_p (input_bfd, h, csect))
3685
0
  return 0;
3686
0
    }
3687
3688
  /* If we're discarding local symbols, check whether ISYM is local.  */
3689
0
  smtyp = SMTYP_SMTYP (aux->x_csect.x_smtyp);
3690
0
  if (info->discard == discard_all
3691
0
      && !EXTERN_SYM_P (isym->n_sclass)
3692
0
      && (isym->n_sclass != C_HIDEXT || smtyp != XTY_SD))
3693
0
    return 0;
3694
3695
  /* If we're stripping debugging symbols, check whether ISYM is one.  */
3696
0
  if (info->strip == strip_debugger
3697
0
      && isym->n_scnum == N_DEBUG)
3698
0
    return 0;
3699
3700
  /* If we are stripping symbols based on name, check how ISYM's
3701
     name should be handled.  */
3702
0
  if (info->strip == strip_some
3703
0
      || info->discard == discard_l)
3704
0
    {
3705
0
      char buf[SYMNMLEN + 1];
3706
3707
0
      if (name == NULL)
3708
0
  {
3709
0
    name = _bfd_coff_internal_syment_name (input_bfd, isym, buf);
3710
0
    if (name == NULL)
3711
0
      return -1;
3712
0
  }
3713
3714
0
      if (info->strip == strip_some
3715
0
    && bfd_hash_lookup (info->keep_hash, name, false, false) == NULL)
3716
0
  return 0;
3717
3718
0
      if (info->discard == discard_l
3719
0
    && !EXTERN_SYM_P (isym->n_sclass)
3720
0
    && (isym->n_sclass != C_HIDEXT || smtyp != XTY_SD)
3721
0
    && bfd_is_local_label_name (input_bfd, name))
3722
0
  return 0;
3723
0
    }
3724
3725
0
  return 1;
3726
0
}
3727
3728
/* Compute the current size of the .loader section. Start filling
3729
   its header but it will be finalized in xcoff_build_loader_section.   */
3730
3731
static bool
3732
xcoff_size_loader_section (struct xcoff_loader_info *ldinfo)
3733
0
{
3734
0
  bfd *output_bfd;
3735
0
  struct xcoff_link_hash_table *htab;
3736
0
  struct internal_ldhdr *ldhdr;
3737
0
  struct xcoff_import_file *fl;
3738
0
  bfd_size_type stoff;
3739
0
  size_t impsize, impcount;
3740
0
  asection *lsec;
3741
3742
0
  output_bfd = ldinfo->output_bfd;
3743
0
  htab = xcoff_hash_table (ldinfo->info);
3744
0
  ldhdr = &htab->ldhdr;
3745
3746
  /* If this function has already been called (ie l_version is set)
3747
     and the number of symbols or relocations haven't changed since
3748
     last call, the size is already known.  */
3749
0
  if (ldhdr->l_version != 0
3750
0
      && ldhdr->l_nsyms == ldinfo->ldsym_count
3751
0
      && ldhdr->l_nreloc == ldinfo->ldrel_count)
3752
0
    return true;
3753
3754
  /* Work out the size of the import file names.  Each import file ID
3755
     consists of three null terminated strings: the path, the file
3756
     name, and the archive member name.  The first entry in the list
3757
     of names is the path to use to find objects, which the linker has
3758
     passed in as the libpath argument.  For some reason, the path
3759
     entry in the other import file names appears to always be empty.  */
3760
0
  if (ldhdr->l_nimpid == 0)
3761
0
    {
3762
0
      impsize = strlen (ldinfo->libpath) + 3;
3763
0
      impcount = 1;
3764
0
      for (fl = htab->imports; fl != NULL; fl = fl->next)
3765
0
  {
3766
0
    ++impcount;
3767
0
    impsize += (strlen (fl->path)
3768
0
          + strlen (fl->file)
3769
0
          + strlen (fl->member)
3770
0
          + 3);
3771
0
  }
3772
0
      ldhdr->l_istlen = impsize;
3773
0
      ldhdr->l_nimpid = impcount;
3774
0
    }
3775
3776
  /* Set up the .loader section header.  */
3777
0
  ldhdr->l_version = bfd_xcoff_ldhdr_version(output_bfd);
3778
0
  ldhdr->l_nsyms = ldinfo->ldsym_count;
3779
0
  ldhdr->l_nreloc = ldinfo->ldrel_count;
3780
0
  ldhdr->l_impoff = (bfd_xcoff_ldhdrsz (output_bfd)
3781
0
         + ldhdr->l_nsyms * bfd_xcoff_ldsymsz (output_bfd)
3782
0
         + ldhdr->l_nreloc * bfd_xcoff_ldrelsz (output_bfd));
3783
0
  ldhdr->l_stlen = ldinfo->string_size;
3784
0
  stoff = ldhdr->l_impoff + ldhdr->l_istlen;
3785
0
  if (ldinfo->string_size == 0)
3786
0
    ldhdr->l_stoff = 0;
3787
0
  else
3788
0
    ldhdr->l_stoff = stoff;
3789
3790
  /* 64 bit elements to ldhdr
3791
     The swap out routine for 32 bit will ignore them.
3792
     Nothing fancy, symbols come after the header and relocs come
3793
     after symbols.  */
3794
0
  ldhdr->l_symoff = bfd_xcoff_ldhdrsz (output_bfd);
3795
0
  ldhdr->l_rldoff = (bfd_xcoff_ldhdrsz (output_bfd)
3796
0
         + ldhdr->l_nsyms * bfd_xcoff_ldsymsz (output_bfd));
3797
3798
  /* Save the size of the .loader section.  */
3799
0
  lsec = htab->loader_section;
3800
0
  lsec->size = stoff + ldhdr->l_stlen;
3801
3802
0
  return true;
3803
0
}
3804
3805
/* Prepare the .loader section.  This is called by the XCOFF linker
3806
   emulation before_allocation routine.  We must set the size of the
3807
   .loader section before the linker lays out the output file.  However,
3808
   some symbols or relocations might be append to the .loader section
3809
   when processing the addresses, thus it's not layout right now and
3810
   its size might change.
3811
   LIBPATH is the library path to search for shared objects; this is
3812
   normally built from the -L arguments passed to the linker.  ENTRY
3813
   is the name of the entry point symbol (the -e linker option).
3814
   FILE_ALIGN is the alignment to use for sections within the file
3815
   (the -H linker option).  MAXSTACK is the maximum stack size (the
3816
   -bmaxstack linker option).  MAXDATA is the maximum data size (the
3817
   -bmaxdata linker option).  GC is whether to do garbage collection
3818
   (the -bgc linker option).  MODTYPE is the module type (the
3819
   -bmodtype linker option).  TEXTRO is whether the text section must
3820
   be read only (the -btextro linker option).  AUTO_EXPORT_FLAGS
3821
   is a mask of XCOFF_EXPALL and XCOFF_EXPFULL.  SPECIAL_SECTIONS
3822
   is set by this routine to csects with magic names like _end.  */
3823
3824
bool
3825
bfd_xcoff_size_dynamic_sections (bfd *output_bfd,
3826
         struct bfd_link_info *info,
3827
         const char *libpath,
3828
         const char *entry,
3829
         unsigned long file_align,
3830
         unsigned long maxstack,
3831
         unsigned long maxdata,
3832
         bool gc,
3833
         int modtype,
3834
         bool textro,
3835
         unsigned int auto_export_flags,
3836
         asection **special_sections,
3837
         bool rtld)
3838
0
{
3839
0
  struct xcoff_loader_info *ldinfo;
3840
0
  int i;
3841
0
  asection *sec;
3842
0
  bfd *sub;
3843
0
  size_t amt;
3844
3845
0
  if (bfd_get_flavour (output_bfd) != bfd_target_xcoff_flavour)
3846
0
    {
3847
0
      for (i = 0; i < XCOFF_NUMBER_OF_SPECIAL_SECTIONS; i++)
3848
0
  special_sections[i] = NULL;
3849
0
      return true;
3850
0
    }
3851
3852
  /* Setup ldinfo.  */
3853
0
  ldinfo = &(xcoff_hash_table (info)->ldinfo);
3854
3855
0
  ldinfo->failed = false;
3856
0
  ldinfo->output_bfd = output_bfd;
3857
0
  ldinfo->info = info;
3858
0
  ldinfo->auto_export_flags = auto_export_flags;
3859
0
  ldinfo->ldsym_count = 0;
3860
0
  ldinfo->string_size = 0;
3861
0
  ldinfo->strings = NULL;
3862
0
  ldinfo->string_alc = 0;
3863
0
  ldinfo->libpath = libpath;
3864
3865
0
  xcoff_data (output_bfd)->maxstack = maxstack;
3866
0
  xcoff_data (output_bfd)->maxdata = maxdata;
3867
0
  xcoff_data (output_bfd)->modtype = modtype;
3868
3869
0
  xcoff_hash_table (info)->file_align = file_align;
3870
0
  xcoff_hash_table (info)->textro = textro;
3871
0
  xcoff_hash_table (info)->rtld = rtld;
3872
3873
  /* __rtinit */
3874
0
  if (xcoff_hash_table (info)->loader_section
3875
0
      && (info->init_function || info->fini_function || rtld))
3876
0
    {
3877
0
      struct xcoff_link_hash_entry *hsym;
3878
0
      struct internal_ldsym *ldsym;
3879
3880
0
      hsym = xcoff_link_hash_lookup (xcoff_hash_table (info),
3881
0
             "__rtinit", false, false, true);
3882
0
      if (hsym == NULL)
3883
0
  {
3884
0
    _bfd_error_handler
3885
0
      (_("error: undefined symbol __rtinit"));
3886
0
    return false;
3887
0
  }
3888
3889
0
      xcoff_mark_symbol (info, hsym);
3890
0
      hsym->flags |= (XCOFF_DEF_REGULAR | XCOFF_RTINIT);
3891
3892
      /* __rtinit initialized.  */
3893
0
      amt = sizeof (* ldsym);
3894
0
      ldsym = bfd_malloc (amt);
3895
3896
0
      ldsym->l_value = 0;   /* Will be filled in later.  */
3897
0
      ldsym->l_scnum = 2;   /* Data section.  */
3898
0
      ldsym->l_smtype = XTY_SD;   /* Csect section definition.  */
3899
0
      ldsym->l_smclas = 5;    /* .rw.  */
3900
0
      ldsym->l_ifile = 0;   /* Special system loader symbol.  */
3901
0
      ldsym->l_parm = 0;    /* NA.  */
3902
3903
      /* Force __rtinit to be the first symbol in the loader symbol table
3904
   See xcoff_build_ldsyms
3905
3906
   The first 3 symbol table indices are reserved to indicate the data,
3907
   text and bss sections.  */
3908
0
      BFD_ASSERT (0 == ldinfo->ldsym_count);
3909
3910
0
      hsym->ldindx = 3;
3911
0
      ldinfo->ldsym_count = 1;
3912
0
      hsym->ldsym = ldsym;
3913
3914
0
      if (! bfd_xcoff_put_ldsymbol_name (ldinfo->output_bfd, ldinfo,
3915
0
           hsym->ldsym, hsym->root.root.string))
3916
0
  return false;
3917
3918
      /* This symbol is written out by xcoff_write_global_symbol
3919
   Set stuff up so xcoff_write_global_symbol logic works.  */
3920
0
      hsym->flags |= XCOFF_DEF_REGULAR | XCOFF_MARK;
3921
0
      hsym->root.type = bfd_link_hash_defined;
3922
0
      hsym->root.u.def.value = 0;
3923
0
    }
3924
3925
  /* Garbage collect unused sections.  */
3926
0
  if (bfd_link_relocatable (info) || !gc)
3927
0
    {
3928
0
      gc = false;
3929
0
      xcoff_hash_table (info)->gc = false;
3930
3931
      /* We still need to call xcoff_mark, in order to set ldrel_count
3932
   correctly.  */
3933
0
      for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
3934
0
  {
3935
0
    asection *o;
3936
3937
0
    for (o = sub->sections; o != NULL; o = o->next)
3938
0
      {
3939
        /* We shouldn't unconditionaly mark the TOC section.
3940
     The output file should only have a TOC if either
3941
     (a) one of the input files did or (b) we end up
3942
     creating TOC references as part of the link process.  */
3943
0
        if (o != xcoff_hash_table (info)->toc_section
3944
0
      && o->gc_mark == 0)
3945
0
    {
3946
0
      if (! xcoff_mark (info, o))
3947
0
        goto error_return;
3948
0
    }
3949
0
      }
3950
0
  }
3951
0
    }
3952
0
  else
3953
0
    {
3954
0
      if (entry != NULL
3955
0
    && !xcoff_mark_symbol_by_name (info, entry, XCOFF_ENTRY))
3956
0
  goto error_return;
3957
0
      if (info->init_function != NULL
3958
0
    && !xcoff_mark_symbol_by_name (info, info->init_function, 0))
3959
0
  goto error_return;
3960
0
      if (info->fini_function != NULL
3961
0
    && !xcoff_mark_symbol_by_name (info, info->fini_function, 0))
3962
0
  goto error_return;
3963
0
      if (auto_export_flags != 0)
3964
0
  {
3965
0
    xcoff_link_hash_traverse (xcoff_hash_table (info),
3966
0
            xcoff_mark_auto_exports, ldinfo);
3967
0
    if (ldinfo->failed)
3968
0
      goto error_return;
3969
0
  }
3970
0
      xcoff_sweep (info);
3971
0
      xcoff_hash_table (info)->gc = true;
3972
0
    }
3973
3974
  /* Return special sections to the caller.  */
3975
0
  for (i = 0; i < XCOFF_NUMBER_OF_SPECIAL_SECTIONS; i++)
3976
0
    {
3977
0
      sec = xcoff_hash_table (info)->special_sections[i];
3978
3979
0
      if (sec != NULL
3980
0
    && gc
3981
0
    && sec->gc_mark == 0)
3982
0
  sec = NULL;
3983
3984
0
      special_sections[i] = sec;
3985
0
    }
3986
3987
0
  if (info->input_bfds == NULL)
3988
    /* I'm not sure what to do in this bizarre case.  */
3989
0
    return true;
3990
3991
0
  xcoff_link_hash_traverse (xcoff_hash_table (info), xcoff_post_gc_symbol,
3992
0
          (void *) ldinfo);
3993
0
  if (ldinfo->failed)
3994
0
    goto error_return;
3995
3996
0
  if (xcoff_hash_table (info)->loader_section
3997
0
      && !xcoff_size_loader_section (ldinfo))
3998
0
    goto error_return;
3999
4000
0
  return true;
4001
4002
0
 error_return:
4003
0
  free (ldinfo->strings);
4004
0
  return false;
4005
0
}
4006
4007
/* Lay out the .loader section, finalizing its header and
4008
   filling the import paths  */
4009
static bool
4010
xcoff_build_loader_section (struct xcoff_loader_info *ldinfo)
4011
0
{
4012
0
  bfd *output_bfd;
4013
0
  asection *lsec;
4014
0
  struct xcoff_link_hash_table *htab;
4015
0
  struct internal_ldhdr *ldhdr;
4016
0
  struct xcoff_import_file *fl;
4017
0
  char *out;
4018
4019
0
  output_bfd = ldinfo->output_bfd;
4020
0
  htab = xcoff_hash_table (ldinfo->info);
4021
0
  lsec = htab->loader_section;
4022
0
  ldhdr = &htab->ldhdr;
4023
4024
  /* We could have called xcoff_size_loader_section one more time.
4025
     However, this function is called once all the addresses have
4026
     been layout thus the .loader section shouldn't be changed
4027
     anymore.  */
4028
0
  BFD_ASSERT (ldhdr->l_nsyms == ldinfo->ldsym_count);
4029
0
  BFD_ASSERT (ldhdr->l_nreloc == ldinfo->ldrel_count);
4030
4031
  /* We now know the final size of the .loader section.  Allocate
4032
     space for it.  */
4033
0
  lsec->contents = bfd_zalloc (output_bfd, lsec->size);
4034
0
  if (lsec->contents == NULL)
4035
0
    return false;
4036
0
  lsec->alloced = 1;
4037
4038
  /* Set up the header.  */
4039
0
  bfd_xcoff_swap_ldhdr_out (output_bfd, ldhdr, lsec->contents);
4040
4041
  /* Set up the import file names.  */
4042
0
  out = (char *) lsec->contents + ldhdr->l_impoff;
4043
0
  strcpy (out, ldinfo->libpath);
4044
0
  out += strlen (ldinfo->libpath) + 1;
4045
0
  *out++ = '\0';
4046
0
  *out++ = '\0';
4047
0
  for (fl = htab->imports; fl != NULL; fl = fl->next)
4048
0
    {
4049
0
      const char *s;
4050
4051
0
      s = fl->path;
4052
0
      while ((*out++ = *s++) != '\0')
4053
0
  ;
4054
0
      s = fl->file;
4055
0
      while ((*out++ = *s++) != '\0')
4056
0
  ;
4057
0
      s = fl->member;
4058
0
      while ((*out++ = *s++) != '\0')
4059
0
  ;
4060
0
    }
4061
4062
0
  BFD_ASSERT ((bfd_size_type) ((bfd_byte *) out - lsec->contents) == ldhdr->l_impoff + ldhdr->l_istlen);
4063
4064
  /* Set up the symbol string table.  */
4065
0
  if (ldinfo->string_size > 0)
4066
0
    {
4067
0
      memcpy (out, ldinfo->strings, ldinfo->string_size);
4068
0
      free (ldinfo->strings);
4069
0
      ldinfo->strings = NULL;
4070
0
    }
4071
4072
  /* We can't set up the symbol table or the relocs yet, because we
4073
     don't yet know the final position of the various sections.  The
4074
     .loader symbols are written out when the corresponding normal
4075
     symbols are written out in xcoff_link_input_bfd or
4076
     xcoff_write_global_symbol.  The .loader relocs are written out
4077
     when the corresponding normal relocs are handled in
4078
     xcoff_link_input_bfd.  */
4079
4080
0
  return true;
4081
0
}
4082
4083
4084
/* Lay out the .loader section and allocate the space for
4085
   the other dynamic sections of XCOFF.  */
4086
bool
4087
bfd_xcoff_build_dynamic_sections (bfd *output_bfd,
4088
          struct bfd_link_info *info)
4089
0
{
4090
0
  struct xcoff_loader_info *ldinfo;
4091
0
  struct bfd_strtab_hash *debug_strtab;
4092
0
  bfd_byte *debug_contents = NULL;
4093
0
  bfd *sub;
4094
0
  asection *sec;
4095
4096
0
  ldinfo = &(xcoff_hash_table (info)->ldinfo);
4097
4098
0
  if (xcoff_hash_table (info)->loader_section
4099
0
      && !xcoff_build_loader_section (ldinfo))
4100
0
    return false;
4101
4102
  /* Allocate space for the magic sections.  */
4103
0
  sec = xcoff_hash_table (info)->linkage_section;
4104
0
  if (sec->size > 0)
4105
0
    {
4106
0
      sec->contents = bfd_zalloc (output_bfd, sec->size);
4107
0
      if (sec->contents == NULL)
4108
0
  return false;
4109
0
      sec->alloced = 1;
4110
0
    }
4111
0
  sec = xcoff_hash_table (info)->toc_section;
4112
0
  if (sec->size > 0)
4113
0
    {
4114
0
      sec->contents = bfd_zalloc (output_bfd, sec->size);
4115
0
      if (sec->contents == NULL)
4116
0
  return false;
4117
0
      sec->alloced = 1;
4118
0
    }
4119
0
  sec = xcoff_hash_table (info)->descriptor_section;
4120
0
  if (sec->size > 0)
4121
0
    {
4122
0
      sec->contents = bfd_zalloc (output_bfd, sec->size);
4123
0
      if (sec->contents == NULL)
4124
0
  return false;
4125
0
      sec->alloced = 1;
4126
0
    }
4127
4128
  /* Now that we've done garbage collection, decide which symbols to keep,
4129
     and figure out the contents of the .debug section.  */
4130
0
  debug_strtab = xcoff_hash_table (info)->debug_strtab;
4131
4132
0
  for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
4133
0
    {
4134
0
      asection *subdeb;
4135
0
      bfd_size_type symcount;
4136
0
      long *debug_index;
4137
0
      asection **csectpp;
4138
0
      unsigned int *lineno_counts;
4139
0
      struct xcoff_link_hash_entry **sym_hash;
4140
0
      bfd_byte *esym, *esymend;
4141
0
      bfd_size_type symesz;
4142
4143
0
      if (sub->xvec != info->output_bfd->xvec)
4144
0
  continue;
4145
4146
0
      if ((sub->flags & DYNAMIC) != 0
4147
0
    && !info->static_link)
4148
0
  continue;
4149
4150
0
      if (! _bfd_coff_get_external_symbols (sub))
4151
0
  goto error_return;
4152
4153
0
      symcount = obj_raw_syment_count (sub);
4154
0
      debug_index = bfd_zalloc (sub, symcount * sizeof (long));
4155
0
      if (debug_index == NULL)
4156
0
  goto error_return;
4157
0
      xcoff_data (sub)->debug_indices = debug_index;
4158
4159
0
      if (info->strip == strip_all
4160
0
    || info->strip == strip_debugger
4161
0
    || info->discard == discard_all)
4162
  /* We're stripping all debugging information, so there's no need
4163
     to read SUB's .debug section.  */
4164
0
  subdeb = NULL;
4165
0
      else
4166
0
  {
4167
    /* Grab the contents of SUB's .debug section, if any.  */
4168
0
    subdeb = bfd_get_section_by_name (sub, ".debug");
4169
0
    if (subdeb != NULL
4170
0
        && subdeb->size != 0
4171
0
        && (subdeb->flags & SEC_HAS_CONTENTS) != 0)
4172
0
      {
4173
        /* We use malloc and copy the names into the debug
4174
     stringtab, rather than bfd_alloc, because I expect
4175
     that, when linking many files together, many of the
4176
     strings will be the same.  Storing the strings in the
4177
     hash table should save space in this case.  */
4178
0
        if (!bfd_malloc_and_get_section (sub, subdeb, &debug_contents))
4179
0
    goto error_return;
4180
0
      }
4181
0
  }
4182
4183
0
      csectpp = xcoff_data (sub)->csects;
4184
0
      lineno_counts = xcoff_data (sub)->lineno_counts;
4185
0
      sym_hash = obj_xcoff_sym_hashes (sub);
4186
0
      symesz = bfd_coff_symesz (sub);
4187
0
      esym = (bfd_byte *) obj_coff_external_syms (sub);
4188
0
      esymend = esym + symcount * symesz;
4189
4190
0
      while (esym < esymend)
4191
0
  {
4192
0
    struct internal_syment sym;
4193
0
    union internal_auxent aux;
4194
0
    asection *csect;
4195
0
    const char *name;
4196
0
    int keep_p;
4197
4198
0
    bfd_coff_swap_sym_in (sub, esym, &sym);
4199
4200
    /* Read in the csect information, if any.  */
4201
0
    if (CSECT_SYM_P (sym.n_sclass))
4202
0
      {
4203
0
        BFD_ASSERT (sym.n_numaux > 0);
4204
0
        bfd_coff_swap_aux_in (sub, esym + symesz * sym.n_numaux,
4205
0
            sym.n_type, sym.n_sclass,
4206
0
            sym.n_numaux - 1, sym.n_numaux, &aux);
4207
0
      }
4208
4209
    /* If this symbol's name is stored in the debug section,
4210
       get a pointer to it.  */
4211
0
    if (debug_contents != NULL
4212
0
        && sym._n._n_n._n_zeroes == 0
4213
0
        && bfd_coff_symname_in_debug (sub, &sym))
4214
0
      name = (const char *) debug_contents + sym._n._n_n._n_offset;
4215
0
    else
4216
0
      name = NULL;
4217
4218
    /* Decide whether to copy this symbol to the output file.  */
4219
0
    csect = *csectpp;
4220
0
    keep_p = xcoff_keep_symbol_p (info, sub, &sym, &aux,
4221
0
          *sym_hash, csect, name);
4222
0
    if (keep_p < 0)
4223
0
      goto error_return;
4224
4225
0
    if (!keep_p)
4226
      /* Use a debug_index of -2 to record that a symbol should
4227
         be stripped.  */
4228
0
      *debug_index = -2;
4229
0
    else
4230
0
      {
4231
        /* See whether we should store the symbol name in the
4232
     output .debug section.  */
4233
0
        if (name != NULL)
4234
0
    {
4235
0
      bfd_size_type indx;
4236
4237
0
      indx = _bfd_stringtab_add (debug_strtab, name, true, true);
4238
0
      if (indx == (bfd_size_type) -1)
4239
0
        goto error_return;
4240
0
      *debug_index = indx;
4241
0
    }
4242
0
        else
4243
0
    *debug_index = -1;
4244
0
        if (*sym_hash != 0)
4245
0
    (*sym_hash)->flags |= XCOFF_ALLOCATED;
4246
0
        if (*lineno_counts > 0)
4247
0
    csect->output_section->lineno_count += *lineno_counts;
4248
0
      }
4249
4250
0
    esym += (sym.n_numaux + 1) * symesz;
4251
0
    csectpp += sym.n_numaux + 1;
4252
0
    sym_hash += sym.n_numaux + 1;
4253
0
    lineno_counts += sym.n_numaux + 1;
4254
0
    debug_index += sym.n_numaux + 1;
4255
0
  }
4256
4257
0
      if (debug_contents)
4258
0
  {
4259
0
    free (debug_contents);
4260
0
    debug_contents = NULL;
4261
4262
    /* Clear the size of subdeb, so that it is not included directly
4263
       in the output file.  */
4264
0
    subdeb->size = 0;
4265
0
  }
4266
4267
0
      if (! info->keep_memory)
4268
0
  {
4269
0
    if (! _bfd_coff_free_symbols (sub))
4270
0
      goto error_return;
4271
0
  }
4272
0
    }
4273
4274
0
  if (info->strip != strip_all
4275
0
      && xcoff_hash_table (info)->debug_section != NULL)
4276
0
    xcoff_hash_table (info)->debug_section->size =
4277
0
      _bfd_stringtab_size (debug_strtab);
4278
4279
0
  return true;
4280
4281
0
 error_return:
4282
0
  free (debug_contents);
4283
0
  return false;
4284
0
}
4285
4286
bool
4287
bfd_xcoff_link_generate_rtinit (bfd *abfd,
4288
        const char *init,
4289
        const char *fini,
4290
        bool rtld)
4291
0
{
4292
0
  struct bfd_in_memory *bim;
4293
4294
0
  bim = bfd_malloc ((bfd_size_type) sizeof (* bim));
4295
0
  if (bim == NULL)
4296
0
    return false;
4297
4298
0
  bim->size = 0;
4299
0
  bim->buffer = 0;
4300
4301
0
  abfd->link.next = 0;
4302
0
  abfd->format = bfd_object;
4303
0
  abfd->iostream = (void *) bim;
4304
0
  abfd->flags = BFD_IN_MEMORY;
4305
0
  abfd->iovec = &_bfd_memory_iovec;
4306
0
  abfd->direction = write_direction;
4307
0
  abfd->origin = 0;
4308
0
  abfd->where = 0;
4309
4310
0
  if (! bfd_xcoff_generate_rtinit (abfd, init, fini, rtld))
4311
0
    return false;
4312
4313
  /* need to reset to unknown or it will not be read back in correctly */
4314
0
  abfd->format = bfd_unknown;
4315
0
  abfd->direction = read_direction;
4316
0
  abfd->where = 0;
4317
4318
0
  return true;
4319
0
}
4320

4321
4322
/* Linker stubs.
4323
   The stubs will be gathered in stub csects named "@FIX'number'".
4324
   A new csect will be created by xcoff_stub_get_csect_in_range,
4325
   everytime a relocation cannot reach its target and its section
4326
   is too far from the others stub csects.
4327
   The stubs will simply be code generated inside these stub
4328
   csects.  In order to simplify the symbol table, only the symbols
4329
   for the stub csects are written.
4330
4331
   As the code is dependent of the architecture, it's defined
4332
   in the backend.
4333
4334
   xcoff_stub_indirect_call:
4335
   Used when a 24 bit branch cannot reach its destination and that
4336
   this destination isn't a global linkage symbol.
4337
4338
   xcoff_stub_shared_call:
4339
   As above but when it's a global linkage symbol.
4340
   The main difference being that it doesn't branch to the global
4341
   linkage symbol which will then call the shared library.  It
4342
   directly call it saving the TOC.
4343
4344
   TODO: -bbigtoc option should be able to be implemented using
4345
   this stubs.  */
4346
4347
/* Get the name of a csect which will contain stubs.
4348
   It has the same pattern as AIX linker: @FIX"number".  */
4349
static char *
4350
xcoff_stub_csect_name (unsigned int n)
4351
0
{
4352
0
  char buf[8];
4353
0
  size_t len;
4354
0
  char *csect_name;
4355
4356
  /* For now, allow "only" 1000000 stub csects.  */
4357
0
  if (n >= 1000000)
4358
0
    {
4359
0
      BFD_FAIL();
4360
0
      return NULL;
4361
0
    }
4362
4363
0
  sprintf (buf, "%d", n);
4364
0
  len = 4 + strlen (buf) + 1;
4365
4366
0
  csect_name = bfd_malloc (len);
4367
0
  if (csect_name == NULL)
4368
0
    return NULL;
4369
0
  sprintf (csect_name, "@FIX%d", n);
4370
4371
0
  return csect_name;
4372
0
}
4373
4374
/* Return a stub section which can be reach with a single branch
4375
   from SECTION.  CREATE means that creating a csect is allowed.  */
4376
static struct xcoff_link_hash_entry *
4377
xcoff_stub_get_csect_in_range (asection *section,
4378
             struct bfd_link_info *info,
4379
             bool create)
4380
0
{
4381
0
  struct xcoff_link_hash_table *htab = xcoff_hash_table (info);
4382
0
  struct xcoff_link_hash_entry *csect_entry;
4383
0
  struct bfd_link_hash_entry *bh = NULL;
4384
0
  asection *csect;
4385
0
  unsigned int it;
4386
0
  char *csect_name;
4387
4388
  /* Search for a csect in range.  */
4389
0
  for (csect = htab->params->stub_bfd->sections, it = 0;
4390
0
       csect != NULL;
4391
0
       csect = csect->next, it++)
4392
0
    {
4393
      /* A csect is in range if everything instructions in SECTION
4394
   can branch to every stubs in the stub csect.  This can
4395
   be simplify by saying that the first entry of each sections
4396
   (ie the vma of this section) can reach the last entry of the
4397
   stub csect (ie the vma of the csect + its size).
4398
   However, as the stub csect might be growing its size isn't
4399
   fixed.  Thus, the last entry of SECTION might not be able
4400
   to reach the first entry of the stub csect anymore.
4401
   If this case happens, the following condition will be
4402
   false during the next pass of bfd_xcoff_size_stubs and
4403
   another csect will be used.
4404
   This means we might create more stubs than needed.  */
4405
0
      bfd_vma csect_vma, section_vma;
4406
0
      bfd_vma csect_last_vma, section_last_vma;
4407
4408
0
      csect_vma = (csect->output_section->vma
4409
0
       + csect->output_offset);
4410
0
      csect_last_vma = (csect->output_section->vma
4411
0
      + csect->output_offset
4412
0
      + csect->size);
4413
0
      section_vma = (section->output_section->vma
4414
0
         + section->output_offset);
4415
0
      section_last_vma = (section->output_section->vma
4416
0
        + section->output_offset
4417
0
        + section->size);
4418
4419
0
      if (csect_last_vma - section_vma + (1 << 25) < 2 * (1 << 25)
4420
0
    && section_last_vma - csect_vma + (1 << 25) < 2 * (1 << 25))
4421
0
  break;
4422
0
    }
4423
4424
0
  if (!create && csect == NULL)
4425
0
    return NULL;
4426
4427
0
  csect_name = xcoff_stub_csect_name (it);
4428
0
  if (!csect_name)
4429
0
    return NULL;
4430
4431
  /* A stub csect already exists, get its entry.  */
4432
0
  if (csect != NULL)
4433
0
    {
4434
0
      csect_entry = xcoff_link_hash_lookup (htab, csect_name, false, false, true);
4435
0
      free(csect_name);
4436
0
      return csect_entry;
4437
0
    }
4438
4439
  /* Create the csect and its symbol.  */
4440
0
  csect = (*htab->params->add_stub_section) (".pr", section);
4441
0
  if (!csect)
4442
0
    {
4443
0
      free(csect_name);
4444
0
      return NULL;
4445
0
    }
4446
4447
0
  csect->alignment_power = 2;
4448
0
  csect->gc_mark = 1;
4449
0
  csect->reloc_count = 0;
4450
4451
  /* We need to associate a VMA to this new csect.  Otherwise,
4452
     our "in range" algorithm won't find it for the next stub.
4453
     And as we will be adding this stub section just after the
4454
     SECTION, we know its address.  */
4455
0
  csect->output_offset = BFD_ALIGN (section->output_offset + section->size,
4456
0
            4);
4457
4458
0
  if (!_bfd_generic_link_add_one_symbol (info, htab->params->stub_bfd,
4459
0
           csect_name, BSF_GLOBAL, csect, 0,
4460
0
           NULL, true, true, &bh))
4461
0
    {
4462
0
      free(csect_name);
4463
0
      return NULL;
4464
0
    }
4465
4466
0
  csect_entry = (struct xcoff_link_hash_entry *)bh;
4467
0
  csect_entry->smclas = XMC_PR;
4468
0
  csect_entry->flags = XCOFF_MARK | XCOFF_DEF_REGULAR;
4469
4470
0
  free(csect_name);
4471
0
  return csect_entry;
4472
0
}
4473
4474
4475
/* Build a name for an entry in the stub hash table.  */
4476
static char *
4477
xcoff_stub_name (const struct xcoff_link_hash_entry *h,
4478
     const struct xcoff_link_hash_entry *hcsect)
4479
0
{
4480
0
  char *stub_name;
4481
0
  size_t len;
4482
4483
0
  if (h)
4484
0
    {
4485
      /* The name of a stub is based on its stub csect and the
4486
   symbol it wants to reach.  It looks like: ".@FIX0.tramp.f".
4487
   When the stub targets a function, the last dot of ".tramp."
4488
   is removed to avoid having two dot.  */
4489
0
      len = (1 + 6
4490
0
       + strlen (hcsect->root.root.string)
4491
0
       + strlen (h->root.root.string)
4492
0
       + 1);
4493
0
      if (h->root.root.string[0] != '.')
4494
0
  len++;
4495
4496
0
      stub_name = bfd_malloc (len);
4497
0
      if (stub_name == NULL)
4498
0
  return stub_name;
4499
4500
0
      if (h->root.root.string[0] == '.')
4501
0
  sprintf (stub_name, ".%s.tramp%s",
4502
0
     hcsect->root.root.string,
4503
0
     h->root.root.string);
4504
0
      else
4505
0
  sprintf (stub_name, ".%s.tramp.%s",
4506
0
     hcsect->root.root.string,
4507
0
     h->root.root.string);
4508
0
    }
4509
0
  else
4510
0
    {
4511
0
      BFD_FAIL();
4512
0
      return NULL;
4513
0
    }
4514
4515
0
  return stub_name;
4516
0
}
4517
4518
/* Look up an entry in the stub hash.  */
4519
struct xcoff_stub_hash_entry *
4520
bfd_xcoff_get_stub_entry (asection *section,
4521
        struct xcoff_link_hash_entry *h,
4522
        struct bfd_link_info *info)
4523
0
{
4524
0
  struct xcoff_link_hash_table *htab = xcoff_hash_table (info);
4525
0
  struct xcoff_link_hash_entry *hcsect;
4526
0
  struct xcoff_stub_hash_entry *hstub;
4527
0
  char *stub_name;
4528
4529
0
  hcsect = xcoff_stub_get_csect_in_range (section, info, false);
4530
0
  if (!hcsect)
4531
0
    return NULL;
4532
4533
0
  stub_name = xcoff_stub_name (h, hcsect);
4534
0
  if (stub_name == NULL)
4535
0
    return NULL;
4536
4537
0
  hstub = xcoff_stub_hash_lookup (&htab->stub_hash_table,
4538
0
          stub_name, false, false);
4539
4540
0
  free (stub_name);
4541
0
  return hstub;
4542
0
}
4543
4544
/* Check if the symbol targeted by IREL is reachable.
4545
   Return the type of stub needed otherwise.  */
4546
enum xcoff_stub_type
4547
bfd_xcoff_type_of_stub (asection *sec,
4548
      const struct internal_reloc *irel,
4549
      bfd_vma destination,
4550
      struct xcoff_link_hash_entry *h)
4551
0
{
4552
0
  bfd_vma location, offset, max_offset;
4553
4554
0
  switch (irel->r_type)
4555
0
    {
4556
0
    default:
4557
0
      return xcoff_stub_none;
4558
4559
0
    case R_BR:
4560
0
    case R_RBR:
4561
0
      location = (sec->output_section->vma
4562
0
      + sec->output_offset
4563
0
      + irel->r_vaddr
4564
0
      - sec->vma);
4565
4566
0
      max_offset = 1 << 25 ;
4567
4568
0
      offset = destination - location;
4569
4570
0
      if (offset + max_offset < 2 * max_offset)
4571
0
  return xcoff_stub_none;
4572
4573
      /* A stub is needed.  Now, check that we can make one.  */
4574
0
      if (h != NULL
4575
0
    && h->descriptor != NULL)
4576
0
  {
4577
    /* Not sure how to handle this case. For now, skip it. */
4578
0
    if (bfd_is_abs_section (h->root.u.def.section))
4579
0
      return xcoff_stub_none;
4580
4581
0
    if (h->smclas == XMC_GL)
4582
0
      return xcoff_stub_shared_call;
4583
0
    else
4584
0
      return xcoff_stub_indirect_call;
4585
0
  }
4586
0
      break;
4587
0
    }
4588
4589
0
  return xcoff_stub_none;
4590
0
}
4591
4592
/* Add a new stub entry to the stub hash.  Not all fields of the new
4593
   stub entry are initialised.  */
4594
static struct xcoff_stub_hash_entry *
4595
xcoff_add_stub (const char *stub_name,
4596
    struct xcoff_link_hash_entry *hstub_csect,
4597
    struct xcoff_link_hash_entry *htarget,
4598
    struct bfd_link_info *info,
4599
    enum xcoff_stub_type stub_type)
4600
0
{
4601
0
  struct xcoff_link_hash_table *htab = xcoff_hash_table (info);
4602
0
  struct xcoff_stub_hash_entry *hstub;
4603
0
  bfd_vma stub_offset;
4604
0
  asection *stub_csect;
4605
4606
0
  stub_csect = hstub_csect->root.u.def.section;
4607
0
  stub_offset = stub_csect->size;
4608
4609
  /* Update the relocation counter and the size of
4610
     the containing csect.  The size is needed for
4611
     the algorithm in xcoff_stub_get_csect_in_range.  */
4612
0
  switch (stub_type)
4613
0
    {
4614
0
    default:
4615
0
      BFD_FAIL ();
4616
0
      return NULL;
4617
4618
0
    case xcoff_stub_indirect_call:
4619
0
      stub_csect->reloc_count++;
4620
0
      stub_csect->size += bfd_xcoff_stub_indirect_call_size (info->output_bfd);
4621
0
  break;
4622
4623
0
    case xcoff_stub_shared_call:
4624
0
      stub_csect->reloc_count++;
4625
0
      stub_csect->size += bfd_xcoff_stub_shared_call_size (info->output_bfd);
4626
0
      break;
4627
0
    }
4628
4629
  /* Create the stub entry.  */
4630
0
  hstub = xcoff_stub_hash_lookup (&htab->stub_hash_table, stub_name,
4631
0
               true, true);
4632
0
  if (hstub == NULL)
4633
0
    return NULL;
4634
4635
0
  hstub->htarget = htarget;
4636
0
  hstub->stub_offset = stub_offset;
4637
4638
  /* For indirect call or shared call, the relocations are against
4639
     the target descriptor.  Its toc entry will be used.  */
4640
0
  if (stub_type == xcoff_stub_indirect_call
4641
0
      || stub_type == xcoff_stub_shared_call)
4642
0
    {
4643
0
      struct xcoff_link_hash_entry *hds = htarget->descriptor;
4644
0
      asection *hds_section = hds->root.u.def.section;
4645
4646
0
      hstub->htarget = hds;
4647
4648
      /* If the symbol haven't been marked, its section might have
4649
   its size and its relocation count been deleted by xcoff_sweep.
4650
   Restore it.  */
4651
0
      if ((hds->flags & XCOFF_MARK) == 0)
4652
0
  {
4653
0
    if (hds_section->size == 0
4654
0
        && hds_section->reloc_count == 0
4655
0
        && hds_section->rawsize != 0)
4656
0
      {
4657
0
        hds_section->size = hds_section->rawsize;
4658
        /* Always two relocations for a XMC_DS symbol.  */
4659
0
        hds_section->reloc_count = 2;
4660
0
      }
4661
4662
    /* Mark the section and the symbol.  */
4663
0
    if (!xcoff_mark (info, hds_section))
4664
0
      return NULL;
4665
0
  }
4666
4667
      /* Add a TOC entry for the descriptor if non exists.  */
4668
0
      if (hds->toc_section == NULL)
4669
0
  {
4670
0
    int byte_size;
4671
4672
0
    if (bfd_xcoff_is_xcoff64 (info->output_bfd))
4673
0
      byte_size = 8;
4674
0
    else if (bfd_xcoff_is_xcoff32 (info->output_bfd))
4675
0
      byte_size = 4;
4676
0
    else
4677
0
      return NULL;
4678
4679
    /* Allocate room in the fallback TOC section.  */
4680
0
    hds->toc_section = xcoff_hash_table (info)->toc_section;
4681
0
    hds->u.toc_offset = hds->toc_section->size;
4682
0
    hds->toc_section->size += byte_size;
4683
0
    if (!xcoff_mark (info, hds->toc_section))
4684
0
      return NULL;
4685
4686
    /* Update relocation counters for a static and dynamic
4687
       R_TOC relocation.  */
4688
0
    ++hds->toc_section->reloc_count;
4689
0
    ++htab->ldinfo.ldrel_count;
4690
4691
    /* Set the index to -2 to force this symbol to
4692
       get written out.  */
4693
0
    hds->indx = -2;
4694
0
    hds->flags |= XCOFF_SET_TOC;
4695
0
  }
4696
0
    }
4697
4698
0
  return hstub;
4699
0
}
4700
4701
static bool
4702
xcoff_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
4703
0
{
4704
0
  struct xcoff_stub_hash_entry *hstub
4705
0
    = (struct xcoff_stub_hash_entry *) gen_entry;
4706
4707
0
  bfd *stub_bfd;
4708
0
  bfd *output_bfd;
4709
0
  struct bfd_link_info *info;
4710
0
  bfd_byte *loc;
4711
0
  bfd_byte *p;
4712
0
  unsigned int i;
4713
4714
0
  info = (struct bfd_link_info *) in_arg;
4715
0
  stub_bfd = xcoff_hash_table (info)->params->stub_bfd;
4716
0
  output_bfd = info->output_bfd;
4717
4718
  /* Fail if the target section could not be assigned to an output
4719
     section.  The user should fix his linker script.  */
4720
0
  if (hstub->target_section != NULL
4721
0
      && hstub->target_section->output_section == NULL
4722
0
      && info->non_contiguous_regions)
4723
0
    info->callbacks->fatal (_("%P: Could not assign `%pA' to an output section. "
4724
0
            "Retry without --enable-non-contiguous-regions.\n"),
4725
0
          hstub->target_section);
4726
4727
0
  loc = (hstub->hcsect->root.u.def.section->contents
4728
0
   + hstub->stub_offset);
4729
0
  p = loc;
4730
4731
0
  switch (hstub->stub_type)
4732
0
    {
4733
0
    case xcoff_stub_indirect_call:
4734
0
      BFD_ASSERT (hstub->htarget->toc_section != NULL);
4735
      /* The first instruction in the stub code needs to be
4736
   cooked to hold the correct offset in the toc.  It will
4737
   be filled by xcoff_stub_create_relocations.  */
4738
0
      for (i = 0; i < bfd_xcoff_stub_indirect_call_size(output_bfd) / 4; i++)
4739
0
  bfd_put_32 (stub_bfd,
4740
0
        (bfd_vma) bfd_xcoff_stub_indirect_call_code(output_bfd, i),
4741
0
        &p[4 * i]);
4742
0
      break;
4743
4744
0
    case xcoff_stub_shared_call:
4745
0
      BFD_ASSERT (hstub->htarget->toc_section != NULL);
4746
      /* The first instruction in the glink code needs to be
4747
   cooked to hold the correct offset in the toc.  It will
4748
   be filled by xcoff_stub_create_relocations.  */
4749
0
      for (i = 0; i < bfd_xcoff_stub_shared_call_size(output_bfd) / 4; i++)
4750
0
  bfd_put_32 (stub_bfd,
4751
0
        (bfd_vma) bfd_xcoff_stub_shared_call_code(output_bfd, i),
4752
0
        &p[4 * i]);
4753
4754
0
      break;
4755
4756
0
    default:
4757
0
      BFD_FAIL ();
4758
0
      return false;
4759
0
    }
4760
0
  return true;
4761
0
}
4762
4763
/* Check relocations and adds stubs if needed.  */
4764
4765
bool
4766
bfd_xcoff_size_stubs (struct bfd_link_info *info)
4767
0
{
4768
0
  struct xcoff_link_hash_table *htab = xcoff_hash_table (info);
4769
0
  struct xcoff_loader_info *ldinfo = &(htab->ldinfo);
4770
4771
0
  while (1)
4772
0
    {
4773
0
      bfd *input_bfd;
4774
0
      bool stub_changed = false;
4775
4776
0
      for (input_bfd = info->input_bfds;
4777
0
     input_bfd != NULL;
4778
0
     input_bfd = input_bfd->link.next)
4779
0
  {
4780
0
    asection *section;
4781
0
    bfd_size_type symcount;
4782
0
    bfd_size_type symesz;
4783
0
    bfd_byte *esyms;
4784
4785
0
    if (bfd_get_flavour (input_bfd) != bfd_target_xcoff_flavour)
4786
0
      continue;
4787
4788
0
    symcount = obj_raw_syment_count (input_bfd);
4789
0
    if (!symcount)
4790
0
      continue;
4791
0
    symesz = bfd_coff_symesz (input_bfd);
4792
0
    esyms = (bfd_byte *) obj_coff_external_syms (input_bfd);
4793
4794
    /* Walk over each section attached to the input bfd.  */
4795
0
    for (section = input_bfd->sections;
4796
0
         section != NULL;
4797
0
         section = section->next)
4798
0
      {
4799
0
        struct internal_reloc *internal_relocs;
4800
0
        struct internal_reloc *irel, *irelend;
4801
4802
        /* If there aren't any relocs, then there's nothing more
4803
     to do.  */
4804
0
        if ((section->flags & SEC_RELOC) == 0
4805
0
      || section->reloc_count == 0)
4806
0
    continue;
4807
4808
        /* If this section is a link-once section that will be
4809
     discarded, then don't create any stubs.  */
4810
0
        if (section->output_section == NULL
4811
0
      || section->output_section->owner != info->output_bfd)
4812
0
    continue;
4813
4814
        /* This section have been garbage-collected.  */
4815
0
        if (section->gc_mark == 0)
4816
0
    continue;
4817
4818
        /* Read in the relocs.  */
4819
0
        internal_relocs = (xcoff_read_internal_relocs
4820
0
         (input_bfd, section, true, NULL,
4821
0
          false, NULL));
4822
0
        if (internal_relocs == NULL)
4823
0
    goto error_ret;
4824
4825
0
        irel = internal_relocs;
4826
0
        irelend = irel + section->reloc_count;
4827
0
        for (; irel < irelend; irel++)
4828
0
    {
4829
0
      enum xcoff_stub_type stub_type;
4830
0
      struct xcoff_link_hash_entry *hsym = NULL;
4831
0
      struct xcoff_link_hash_entry *hstub_csect = NULL;
4832
0
      struct xcoff_stub_hash_entry *hstub = NULL;
4833
0
      asection *sym_sec;
4834
0
      bfd_vma sym_value;
4835
0
      bfd_vma destination;
4836
0
      char *stub_name;
4837
4838
0
      if (irel->r_symndx == -1)
4839
0
        continue;
4840
4841
0
      switch (irel->r_type)
4842
0
        {
4843
0
        default:
4844
0
          continue;
4845
4846
0
        case R_BR:
4847
0
        case R_RBR:
4848
0
          break;
4849
0
        }
4850
4851
      /* Retrieve targeted symbol address */
4852
0
      hsym = obj_xcoff_sym_hashes (input_bfd)[irel->r_symndx];
4853
0
      if (hsym == NULL)
4854
0
        {
4855
0
          struct internal_syment sym;
4856
0
          if ((long unsigned int)irel->r_symndx > symcount)
4857
0
      {
4858
0
        BFD_FAIL();
4859
0
        goto error_ret;
4860
0
      }
4861
4862
0
          bfd_coff_swap_sym_in (input_bfd,
4863
0
              (void *) esyms + irel->r_symndx * symesz,
4864
0
              (void *) &sym);
4865
4866
0
          sym_sec = xcoff_data (input_bfd)->csects[irel->r_symndx];
4867
0
          sym_value = sym.n_value - sym_sec->vma;
4868
4869
0
          destination = (sym_value
4870
0
             + sym_sec->output_section->vma
4871
0
             + sym_sec->output_offset);
4872
0
        }
4873
0
      else if (hsym->root.type == bfd_link_hash_defined
4874
0
         || hsym->root.type == bfd_link_hash_defweak)
4875
0
        {
4876
0
          sym_sec = hsym->root.u.def.section;
4877
0
          sym_value = hsym->root.u.def.value;
4878
0
          destination = (sym_value
4879
0
             + sym_sec->output_section->vma
4880
0
             + sym_sec->output_offset);
4881
0
        }
4882
0
      else
4883
0
        {
4884
0
          bfd_set_error (bfd_error_bad_value);
4885
0
          goto error_ret;
4886
0
        }
4887
4888
      /* I'm not sure how to handle this case. Skip it for now.  */
4889
0
      if (bfd_is_abs_section (sym_sec))
4890
0
        continue;
4891
4892
0
      stub_type = bfd_xcoff_type_of_stub (section, irel, destination, hsym);
4893
4894
0
      if (stub_type == xcoff_stub_none)
4895
0
        continue;
4896
4897
      /* Get a stub csect in ranch.  */
4898
0
      hstub_csect = xcoff_stub_get_csect_in_range (section, info, true);
4899
0
      if (!hstub_csect)
4900
0
        {
4901
          /* xgettext:c-format */
4902
0
          _bfd_error_handler (_("%pB: Unable to find a stub csect in range"
4903
0
              "of relocation at %#" PRIx64 " targeting"
4904
0
              "'%s'"),
4905
0
            section->owner, (uint64_t) irel->r_vaddr,
4906
0
            hsym->root.root.string);
4907
0
          goto error_ret;
4908
0
        }
4909
4910
      /* Get the name of this stub.  */
4911
0
      stub_name = xcoff_stub_name (hsym, hstub_csect);
4912
0
      if (!stub_name)
4913
0
        goto error_ret;
4914
4915
0
      hstub = xcoff_stub_hash_lookup (&(xcoff_hash_table (info)->stub_hash_table),
4916
0
                   stub_name, false, false);
4917
4918
      /* A stub entry inside the in range csect already exists.  */
4919
0
      if (hstub != NULL)
4920
0
        {
4921
0
          free (stub_name);
4922
0
          continue;
4923
0
        }
4924
4925
0
      stub_changed = true;
4926
4927
0
      hstub = xcoff_add_stub (stub_name, hstub_csect, hsym, info, stub_type);
4928
0
      if (hstub == NULL)
4929
0
        {
4930
          /* xgettext:c-format */
4931
0
          _bfd_error_handler (_("%pB: Cannot create stub entry '%s'"),
4932
0
            section->owner, stub_name);
4933
0
          free (stub_name);
4934
0
          goto error_ret;
4935
0
        }
4936
4937
0
      hstub->stub_type = stub_type;
4938
0
      hstub->hcsect = hstub_csect;
4939
0
      hstub->target_section = sym_sec;
4940
0
      free (stub_name);
4941
0
    }
4942
0
      }
4943
0
  }
4944
4945
0
      if (!stub_changed)
4946
0
  break;
4947
4948
      /* Update the size of the loader.  */
4949
0
      if (xcoff_hash_table (info)->loader_section
4950
0
    && !xcoff_size_loader_section (ldinfo))
4951
0
  goto error_ret;
4952
4953
      /* Ask the linker to do its stuff.  */
4954
0
      (*htab->params->layout_sections_again) ();
4955
4956
0
    }
4957
0
  return true;
4958
4959
0
 error_ret:
4960
0
  bfd_set_error (bfd_error_bad_value);
4961
0
  return false;
4962
0
}
4963
4964
bool
4965
bfd_xcoff_build_stubs (struct bfd_link_info *info)
4966
0
{
4967
0
  struct xcoff_link_hash_table *htab = xcoff_hash_table (info);
4968
0
  asection *stub_sec;
4969
4970
0
  for (stub_sec = htab->params->stub_bfd->sections;
4971
0
       stub_sec != NULL;
4972
0
       stub_sec = stub_sec->next)
4973
0
    {
4974
0
      bfd_size_type size;
4975
4976
      /* Allocate memory to hold the linker stubs.  */
4977
0
      size = stub_sec->size;
4978
0
      stub_sec->contents = bfd_zalloc (htab->params->stub_bfd, size);
4979
0
      if (stub_sec->contents == NULL && size != 0)
4980
0
  return false;
4981
0
      stub_sec->alloced = 1;
4982
0
    }
4983
4984
  /* Build the stubs as directed by the stub hash table.  */
4985
0
  bfd_hash_traverse (&htab->stub_hash_table, xcoff_build_one_stub, info);
4986
0
  return true;
4987
0
}
4988
4989
/* Create and apply relocations made by a stub entry.  */
4990
static bool
4991
xcoff_stub_create_relocations (struct bfd_hash_entry *bh, void * inf)
4992
0
{
4993
0
  struct xcoff_stub_hash_entry *hstub
4994
0
    = (struct xcoff_stub_hash_entry *) bh;
4995
0
  struct xcoff_final_link_info *flinfo
4996
0
    = (struct xcoff_final_link_info *) inf;
4997
4998
0
  bfd *output_bfd;
4999
0
  struct internal_reloc *irel;
5000
0
  struct xcoff_link_hash_entry **rel_hash;
5001
0
  struct xcoff_link_hash_entry *htarget;
5002
0
  asection *sec, *osec;
5003
0
  bfd_vma off;
5004
0
  bfd_byte *p;
5005
5006
0
  htarget = hstub->htarget;
5007
0
  sec = hstub->hcsect->root.u.def.section;
5008
0
  osec = sec->output_section;
5009
5010
0
  irel = (flinfo->section_info[osec->target_index].relocs
5011
0
    + osec->reloc_count);
5012
0
  rel_hash = (flinfo->section_info[osec->target_index].rel_hashes
5013
0
        + osec->output_section->reloc_count);
5014
0
  *rel_hash = NULL;
5015
0
  output_bfd = flinfo->output_bfd;
5016
5017
0
  irel->r_symndx = htarget->indx;
5018
0
  irel->r_vaddr = (osec->vma
5019
0
       + sec->output_offset
5020
0
       + hstub->hcsect->root.u.def.value
5021
0
       + hstub->stub_offset);
5022
5023
0
  p = (sec->contents
5024
0
       + hstub->stub_offset);
5025
5026
0
  switch (hstub->stub_type)
5027
0
    {
5028
0
    default:
5029
0
      BFD_FAIL ();
5030
0
      return false;
5031
5032
      /* The first instruction of this stub code need
5033
   a R_TOC relocation.  */
5034
0
    case xcoff_stub_indirect_call:
5035
0
    case xcoff_stub_shared_call:
5036
0
      irel->r_size = 0xf;
5037
0
      irel->r_type = R_TOC;
5038
5039
      /* Retrieve the toc offset of the target which is
5040
   a function descriptor.  */
5041
0
      BFD_ASSERT (htarget->toc_section != NULL);
5042
0
      if ((htarget->flags & XCOFF_SET_TOC) != 0)
5043
0
  off = hstub->htarget->u.toc_offset;
5044
0
      else
5045
0
  off = (htarget->toc_section->output_section->vma
5046
0
         + htarget->toc_section->output_offset
5047
0
         - xcoff_data (flinfo->output_bfd)->toc);
5048
0
      if ((off & 0xffff) != off)
5049
0
  {
5050
0
    _bfd_error_handler
5051
0
      (_("TOC overflow during stub generation; try -mminimal-toc "
5052
0
         "when compiling"));
5053
0
    bfd_set_error (bfd_error_file_too_big);
5054
0
    return false;
5055
0
  }
5056
5057
0
      bfd_put_16 (output_bfd, off & 0xffff, p+2);
5058
0
      break;
5059
0
    }
5060
5061
0
  ++osec->reloc_count;
5062
0
  return true;
5063
0
}
5064
5065
5066
/* Return the section that defines H.  Return null if no section does.  */
5067
5068
static asection *
5069
xcoff_symbol_section (struct xcoff_link_hash_entry *h)
5070
0
{
5071
0
  switch (h->root.type)
5072
0
    {
5073
0
    case bfd_link_hash_defined:
5074
0
    case bfd_link_hash_defweak:
5075
0
      return h->root.u.def.section;
5076
5077
0
    case bfd_link_hash_common:
5078
0
      return h->root.u.c.p->section;
5079
5080
0
    default:
5081
0
      return NULL;
5082
0
    }
5083
0
}
5084
5085
/* Add a .loader relocation for input relocation IREL.  If the loader
5086
   relocation should be against an output section, HSEC points to the
5087
   input section that IREL is against, otherwise HSEC is null.  H is the
5088
   symbol that IREL is against, or null if it isn't against a global symbol.
5089
   REFERENCE_BFD is the bfd to use in error messages about the relocation.  */
5090
5091
static bool
5092
xcoff_create_ldrel (bfd *output_bfd, struct xcoff_final_link_info *flinfo,
5093
        asection *output_section, bfd *reference_bfd,
5094
        struct internal_reloc *irel, asection *hsec,
5095
        struct xcoff_link_hash_entry *h)
5096
0
{
5097
0
  struct internal_ldrel ldrel;
5098
5099
0
  ldrel.l_vaddr = irel->r_vaddr;
5100
0
  if (hsec != NULL)
5101
0
    {
5102
0
      const char *secname;
5103
5104
0
      secname = hsec->output_section->name;
5105
0
      if (strcmp (secname, ".text") == 0)
5106
0
  ldrel.l_symndx = 0;
5107
0
      else if (strcmp (secname, ".data") == 0)
5108
0
  ldrel.l_symndx = 1;
5109
0
      else if (strcmp (secname, ".bss") == 0)
5110
0
  ldrel.l_symndx = 2;
5111
0
      else if (strcmp (secname, ".tdata") == 0)
5112
0
  ldrel.l_symndx = -1;
5113
0
      else if (strcmp (secname, ".tbss") == 0)
5114
0
  ldrel.l_symndx = -2;
5115
0
      else
5116
0
  {
5117
0
    _bfd_error_handler
5118
      /* xgettext:c-format */
5119
0
      (_("%pB: loader reloc in unrecognized section `%s'"),
5120
0
       reference_bfd, secname);
5121
0
    bfd_set_error (bfd_error_nonrepresentable_section);
5122
0
    return false;
5123
0
  }
5124
0
    }
5125
0
  else if (h != NULL)
5126
0
    {
5127
0
      if (h->ldindx < 0)
5128
0
  {
5129
0
    _bfd_error_handler
5130
      /* xgettext:c-format */
5131
0
      (_("%pB: `%s' in loader reloc but not loader sym"),
5132
0
       reference_bfd, h->root.root.string);
5133
0
    bfd_set_error (bfd_error_bad_value);
5134
0
    return false;
5135
0
  }
5136
0
      ldrel.l_symndx = h->ldindx;
5137
0
    }
5138
0
  else
5139
0
    abort ();
5140
5141
0
  ldrel.l_rtype = (irel->r_size << 8) | irel->r_type;
5142
0
  ldrel.l_rsecnm = output_section->target_index;
5143
0
  if (xcoff_hash_table (flinfo->info)->textro
5144
0
      && strcmp (output_section->name, ".text") == 0)
5145
0
    {
5146
0
      _bfd_error_handler
5147
  /* xgettext:c-format */
5148
0
  (_("%pB: loader reloc in read-only section %pA"),
5149
0
   reference_bfd, output_section);
5150
0
      bfd_set_error (bfd_error_invalid_operation);
5151
0
      return false;
5152
0
    }
5153
0
  bfd_xcoff_swap_ldrel_out (output_bfd, &ldrel, flinfo->ldrel);
5154
0
  flinfo->ldrel += bfd_xcoff_ldrelsz (output_bfd);
5155
0
  return true;
5156
0
}
5157
5158
/* Link an input file into the linker output file.  This function
5159
   handles all the sections and relocations of the input file at once.  */
5160
5161
static bool
5162
xcoff_link_input_bfd (struct xcoff_final_link_info *flinfo,
5163
          bfd *input_bfd)
5164
0
{
5165
0
  bfd *output_bfd;
5166
0
  const char *strings;
5167
0
  bfd_size_type syment_base;
5168
0
  unsigned int n_tmask;
5169
0
  unsigned int n_btshft;
5170
0
  bool copy, hash;
5171
0
  bfd_size_type isymesz;
5172
0
  bfd_size_type osymesz;
5173
0
  bfd_size_type linesz;
5174
0
  bfd_byte *esym;
5175
0
  bfd_byte *esym_end;
5176
0
  struct xcoff_link_hash_entry **sym_hash;
5177
0
  struct internal_syment *isymp;
5178
0
  asection **csectpp;
5179
0
  unsigned int *lineno_counts;
5180
0
  long *debug_index;
5181
0
  long *indexp;
5182
0
  unsigned long output_index;
5183
0
  bfd_byte *outsym;
5184
0
  unsigned int incls;
5185
0
  asection *oline;
5186
0
  bool keep_syms;
5187
0
  asection *o;
5188
5189
  /* We can just skip DYNAMIC files, unless this is a static link.  */
5190
0
  if ((input_bfd->flags & DYNAMIC) != 0
5191
0
      && ! flinfo->info->static_link)
5192
0
    return true;
5193
5194
  /* Move all the symbols to the output file.  */
5195
0
  output_bfd = flinfo->output_bfd;
5196
0
  strings = NULL;
5197
0
  syment_base = obj_raw_syment_count (output_bfd);
5198
0
  isymesz = bfd_coff_symesz (input_bfd);
5199
0
  osymesz = bfd_coff_symesz (output_bfd);
5200
0
  linesz = bfd_coff_linesz (input_bfd);
5201
0
  BFD_ASSERT (linesz == bfd_coff_linesz (output_bfd));
5202
5203
0
  n_tmask = coff_data (input_bfd)->local_n_tmask;
5204
0
  n_btshft = coff_data (input_bfd)->local_n_btshft;
5205
5206
  /* Define macros so that ISFCN, et. al., macros work correctly.  */
5207
0
#define N_TMASK n_tmask
5208
0
#define N_BTSHFT n_btshft
5209
5210
0
  copy = false;
5211
0
  if (! flinfo->info->keep_memory)
5212
0
    copy = true;
5213
0
  hash = true;
5214
0
  if (flinfo->info->traditional_format)
5215
0
    hash = false;
5216
5217
0
  if (! _bfd_coff_get_external_symbols (input_bfd))
5218
0
    return false;
5219
5220
  /* Make one pass over the symbols and assign indices to symbols that
5221
     we have decided to keep.  Also use create .loader symbol information
5222
     and update information in hash table entries.  */
5223
0
  esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
5224
0
  esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
5225
0
  sym_hash = obj_xcoff_sym_hashes (input_bfd);
5226
0
  csectpp = xcoff_data (input_bfd)->csects;
5227
0
  debug_index = xcoff_data (input_bfd)->debug_indices;
5228
0
  isymp = flinfo->internal_syms;
5229
0
  indexp = flinfo->sym_indices;
5230
0
  output_index = syment_base;
5231
0
  while (esym < esym_end)
5232
0
    {
5233
0
      union internal_auxent aux;
5234
0
      int smtyp = 0;
5235
0
      int add;
5236
5237
0
      bfd_coff_swap_sym_in (input_bfd, (void *) esym, (void *) isymp);
5238
5239
      /* Read in the csect information, if any.  */
5240
0
      if (CSECT_SYM_P (isymp->n_sclass))
5241
0
  {
5242
0
    BFD_ASSERT (isymp->n_numaux > 0);
5243
0
    bfd_coff_swap_aux_in (input_bfd,
5244
0
        (void *) (esym + isymesz * isymp->n_numaux),
5245
0
        isymp->n_type, isymp->n_sclass,
5246
0
        isymp->n_numaux - 1, isymp->n_numaux,
5247
0
        (void *) &aux);
5248
5249
0
    smtyp = SMTYP_SMTYP (aux.x_csect.x_smtyp);
5250
0
  }
5251
5252
      /* If this symbol is in the .loader section, swap out the
5253
   .loader symbol information.  If this is an external symbol
5254
   reference to a defined symbol, though, then wait until we get
5255
   to the definition.  */
5256
0
      if (EXTERN_SYM_P (isymp->n_sclass)
5257
0
    && *sym_hash != NULL
5258
0
    && (*sym_hash)->ldsym != NULL
5259
0
    && xcoff_final_definition_p (input_bfd, *sym_hash, *csectpp))
5260
0
  {
5261
0
    struct xcoff_link_hash_entry *h;
5262
0
    struct internal_ldsym *ldsym;
5263
5264
0
    h = *sym_hash;
5265
0
    ldsym = h->ldsym;
5266
0
    if (isymp->n_scnum > 0)
5267
0
      {
5268
0
        ldsym->l_scnum = (*csectpp)->output_section->target_index;
5269
0
        ldsym->l_value = (isymp->n_value
5270
0
        + (*csectpp)->output_section->vma
5271
0
        + (*csectpp)->output_offset
5272
0
        - (*csectpp)->vma);
5273
0
      }
5274
0
    else
5275
0
      {
5276
0
        ldsym->l_scnum = isymp->n_scnum;
5277
0
        ldsym->l_value = isymp->n_value;
5278
0
      }
5279
5280
0
    ldsym->l_smtype = smtyp;
5281
0
    if (((h->flags & XCOFF_DEF_REGULAR) == 0
5282
0
         && (h->flags & XCOFF_DEF_DYNAMIC) != 0)
5283
0
        || (h->flags & XCOFF_IMPORT) != 0)
5284
0
      ldsym->l_smtype |= L_IMPORT;
5285
0
    if (((h->flags & XCOFF_DEF_REGULAR) != 0
5286
0
         && (h->flags & XCOFF_DEF_DYNAMIC) != 0)
5287
0
        || (h->flags & XCOFF_EXPORT) != 0)
5288
0
      ldsym->l_smtype |= L_EXPORT;
5289
0
    if ((h->flags & XCOFF_ENTRY) != 0)
5290
0
      ldsym->l_smtype |= L_ENTRY;
5291
0
    if (isymp->n_sclass == C_AIX_WEAKEXT)
5292
0
      ldsym->l_smtype |= L_WEAK;
5293
5294
0
    ldsym->l_smclas = aux.x_csect.x_smclas;
5295
5296
0
    if (ldsym->l_ifile == (bfd_size_type) -1)
5297
0
      ldsym->l_ifile = 0;
5298
0
    else if (ldsym->l_ifile == 0)
5299
0
      {
5300
0
        if ((ldsym->l_smtype & L_IMPORT) == 0)
5301
0
    ldsym->l_ifile = 0;
5302
0
        else
5303
0
    {
5304
0
      bfd *impbfd;
5305
5306
0
      if (h->root.type == bfd_link_hash_defined
5307
0
          || h->root.type == bfd_link_hash_defweak)
5308
0
        impbfd = h->root.u.def.section->owner;
5309
0
      else if (h->root.type == bfd_link_hash_undefined
5310
0
         || h->root.type == bfd_link_hash_undefweak)
5311
0
        impbfd = h->root.u.undef.abfd;
5312
0
      else
5313
0
        impbfd = NULL;
5314
5315
0
      if (impbfd == NULL)
5316
0
        ldsym->l_ifile = 0;
5317
0
      else
5318
0
        {
5319
0
          BFD_ASSERT (impbfd->xvec == flinfo->output_bfd->xvec);
5320
0
          ldsym->l_ifile = xcoff_data (impbfd)->import_file_id;
5321
0
        }
5322
0
    }
5323
0
      }
5324
5325
0
    ldsym->l_parm = 0;
5326
5327
0
    BFD_ASSERT (h->ldindx >= 0);
5328
0
    bfd_xcoff_swap_ldsym_out (flinfo->output_bfd, ldsym,
5329
0
            (flinfo->ldsym
5330
0
             + ((h->ldindx - 3)
5331
0
          * bfd_xcoff_ldsymsz (flinfo->output_bfd))));
5332
0
    h->ldsym = NULL;
5333
5334
    /* Fill in snentry now that we know the target_index.  */
5335
0
    if ((h->flags & XCOFF_ENTRY) != 0
5336
0
        && (h->root.type == bfd_link_hash_defined
5337
0
      || h->root.type == bfd_link_hash_defweak))
5338
0
      {
5339
0
        xcoff_data (output_bfd)->snentry =
5340
0
    h->root.u.def.section->output_section->target_index;
5341
0
      }
5342
0
  }
5343
5344
0
      add = 1 + isymp->n_numaux;
5345
5346
0
      if (*debug_index == -2)
5347
  /* We've decided to strip this symbol.  */
5348
0
  *indexp = -1;
5349
0
      else
5350
0
  {
5351
    /* Assign the next unused index to this symbol.  */
5352
0
    *indexp = output_index;
5353
5354
0
    if (EXTERN_SYM_P (isymp->n_sclass))
5355
0
      {
5356
0
        BFD_ASSERT (*sym_hash != NULL);
5357
0
        (*sym_hash)->indx = output_index;
5358
0
      }
5359
5360
    /* If this is a symbol in the TOC which we may have merged
5361
       (class XMC_TC), remember the symbol index of the TOC
5362
       symbol.  */
5363
0
    if (isymp->n_sclass == C_HIDEXT
5364
0
        && aux.x_csect.x_smclas == XMC_TC
5365
0
        && *sym_hash != NULL)
5366
0
      {
5367
0
        BFD_ASSERT (((*sym_hash)->flags & XCOFF_SET_TOC) == 0);
5368
0
        BFD_ASSERT ((*sym_hash)->toc_section != NULL);
5369
0
        (*sym_hash)->u.toc_indx = output_index;
5370
0
      }
5371
5372
0
    output_index += add;
5373
0
  }
5374
5375
0
      esym += add * isymesz;
5376
0
      isymp += add;
5377
0
      csectpp += add;
5378
0
      sym_hash += add;
5379
0
      debug_index += add;
5380
0
      ++indexp;
5381
0
      for (--add; add > 0; --add)
5382
0
  *indexp++ = -1;
5383
0
    }
5384
5385
  /* Now write out the symbols that we decided to keep.  */
5386
5387
0
  esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
5388
0
  esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
5389
0
  sym_hash = obj_xcoff_sym_hashes (input_bfd);
5390
0
  isymp = flinfo->internal_syms;
5391
0
  indexp = flinfo->sym_indices;
5392
0
  csectpp = xcoff_data (input_bfd)->csects;
5393
0
  lineno_counts = xcoff_data (input_bfd)->lineno_counts;
5394
0
  debug_index = xcoff_data (input_bfd)->debug_indices;
5395
0
  outsym = flinfo->outsyms;
5396
0
  incls = 0;
5397
0
  oline = NULL;
5398
0
  while (esym < esym_end)
5399
0
    {
5400
0
      int add;
5401
5402
0
      add = 1 + isymp->n_numaux;
5403
5404
0
      if (*indexp < 0)
5405
0
  esym += add * isymesz;
5406
0
      else
5407
0
  {
5408
0
    struct internal_syment isym;
5409
0
    int i;
5410
5411
    /* Adjust the symbol in order to output it.  */
5412
0
    isym = *isymp;
5413
0
    if (isym._n._n_n._n_zeroes == 0
5414
0
        && isym._n._n_n._n_offset != 0)
5415
0
      {
5416
        /* This symbol has a long name.  Enter it in the string
5417
     table we are building.  If *debug_index != -1, the
5418
     name has already been entered in the .debug section.  */
5419
0
        if (*debug_index >= 0)
5420
0
    isym._n._n_n._n_offset = *debug_index;
5421
0
        else
5422
0
    {
5423
0
      const char *name;
5424
0
      bfd_size_type indx;
5425
5426
0
      name = _bfd_coff_internal_syment_name (input_bfd, &isym, NULL);
5427
5428
0
      if (name == NULL)
5429
0
        return false;
5430
0
      indx = _bfd_stringtab_add (flinfo->strtab, name, hash, copy);
5431
0
      if (indx == (bfd_size_type) -1)
5432
0
        return false;
5433
0
      isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
5434
0
    }
5435
0
      }
5436
5437
    /* Make __rtinit C_HIDEXT rather than C_EXT.  This avoids
5438
       multiple definition problems when linking a shared object
5439
       statically.  (The native linker doesn't enter __rtinit into
5440
       the normal table at all, but having a local symbol can make
5441
       the objdump output easier to read.)  */
5442
0
    if (isym.n_sclass == C_EXT
5443
0
        && *sym_hash
5444
0
        && ((*sym_hash)->flags & XCOFF_RTINIT) != 0)
5445
0
      isym.n_sclass = C_HIDEXT;
5446
5447
    /* The value of a C_FILE symbol is the symbol index of the
5448
       next C_FILE symbol.  The value of the last C_FILE symbol
5449
       is -1.  We try to get this right, below, just before we
5450
       write the symbols out, but in the general case we may
5451
       have to write the symbol out twice.  */
5452
0
    if (isym.n_sclass == C_FILE)
5453
0
      {
5454
0
        if (flinfo->last_file_index != -1
5455
0
      && flinfo->last_file.n_value != (bfd_vma) *indexp)
5456
0
    {
5457
      /* We must correct the value of the last C_FILE entry.  */
5458
0
      flinfo->last_file.n_value = *indexp;
5459
0
      if ((bfd_size_type) flinfo->last_file_index >= syment_base)
5460
0
        {
5461
          /* The last C_FILE symbol is in this input file.  */
5462
0
          bfd_coff_swap_sym_out (output_bfd,
5463
0
               (void *) &flinfo->last_file,
5464
0
               (void *) (flinfo->outsyms
5465
0
                + ((flinfo->last_file_index
5466
0
              - syment_base)
5467
0
                   * osymesz)));
5468
0
        }
5469
0
      else
5470
0
        {
5471
          /* We have already written out the last C_FILE
5472
       symbol.  We need to write it out again.  We
5473
       borrow *outsym temporarily.  */
5474
0
          file_ptr pos;
5475
5476
0
          bfd_coff_swap_sym_out (output_bfd,
5477
0
               (void *) &flinfo->last_file,
5478
0
               (void *) outsym);
5479
5480
0
          pos = obj_sym_filepos (output_bfd);
5481
0
          pos += flinfo->last_file_index * osymesz;
5482
0
          if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
5483
0
        || (bfd_write (outsym, osymesz, output_bfd)
5484
0
            != osymesz))
5485
0
      return false;
5486
0
        }
5487
0
    }
5488
5489
0
        flinfo->last_file_index = *indexp;
5490
0
        flinfo->last_file = isym;
5491
0
      }
5492
5493
    /* The value of a C_BINCL or C_EINCL symbol is a file offset
5494
       into the line numbers.  We update the symbol values when
5495
       we handle the line numbers.  */
5496
0
    if (isym.n_sclass == C_BINCL
5497
0
        || isym.n_sclass == C_EINCL)
5498
0
      {
5499
0
        isym.n_value = flinfo->line_filepos;
5500
0
        ++incls;
5501
0
      }
5502
    /* The value of a C_BSTAT symbol is the symbol table
5503
       index of the containing csect.  */
5504
0
    else if (isym.n_sclass == C_BSTAT)
5505
0
      {
5506
0
        bfd_vma indx;
5507
5508
0
        indx = isym.n_value;
5509
0
        if (indx < obj_raw_syment_count (input_bfd))
5510
0
    {
5511
0
      long symindx;
5512
5513
0
      symindx = flinfo->sym_indices[indx];
5514
0
      if (symindx < 0)
5515
0
        isym.n_value = 0;
5516
0
      else
5517
0
        isym.n_value = symindx;
5518
0
    }
5519
0
      }
5520
0
    else if (isym.n_sclass != C_ESTAT
5521
0
       && isym.n_sclass != C_DECL
5522
0
       && isym.n_scnum > 0)
5523
0
      {
5524
0
        if (*sym_hash != NULL
5525
0
      && ((*sym_hash)->root.type == bfd_link_hash_defined
5526
0
          || (*sym_hash)->root.type == bfd_link_hash_defweak)
5527
0
      && (*sym_hash)->root.u.def.section == bfd_abs_section_ptr)
5528
0
    isym.n_scnum = N_ABS;
5529
0
        else
5530
0
    isym.n_scnum = (*csectpp)->output_section->target_index;
5531
0
        isym.n_value += ((*csectpp)->output_section->vma
5532
0
             + (*csectpp)->output_offset
5533
0
             - (*csectpp)->vma);
5534
0
      }
5535
5536
    /* Update visibility.  */
5537
0
    if (*sym_hash)
5538
0
      {
5539
0
        isym.n_type &= ~SYM_V_MASK;
5540
0
        isym.n_type |= (*sym_hash)->visibility;
5541
0
      }
5542
5543
    /* Output the symbol.  */
5544
0
    bfd_coff_swap_sym_out (output_bfd, (void *) &isym, (void *) outsym);
5545
5546
0
    esym += isymesz;
5547
0
    outsym += osymesz;
5548
5549
0
    for (i = 0; i < isymp->n_numaux && esym < esym_end; i++)
5550
0
      {
5551
0
        union internal_auxent aux;
5552
5553
0
        bfd_coff_swap_aux_in (input_bfd, (void *) esym, isymp->n_type,
5554
0
            isymp->n_sclass, i, isymp->n_numaux,
5555
0
            (void *) &aux);
5556
5557
0
        if (isymp->n_sclass == C_FILE)
5558
0
    {
5559
      /* This is the file name (or some comment put in by
5560
         the compiler).  If it is long, we must put it in
5561
         the string table.  */
5562
0
      if (aux.x_file.x_n.x_n.x_zeroes == 0
5563
0
          && aux.x_file.x_n.x_n.x_offset != 0)
5564
0
        {
5565
0
          const char *filename;
5566
0
          bfd_size_type indx;
5567
5568
0
          BFD_ASSERT (aux.x_file.x_n.x_n.x_offset
5569
0
          >= STRING_SIZE_SIZE);
5570
0
          if (strings == NULL)
5571
0
      {
5572
0
        strings = _bfd_coff_read_string_table (input_bfd);
5573
0
        if (strings == NULL)
5574
0
          return false;
5575
0
      }
5576
0
          if ((bfd_size_type) aux.x_file.x_n.x_n.x_offset >= obj_coff_strings_len (input_bfd))
5577
0
      filename = _("<corrupt>");
5578
0
          else
5579
0
      filename = strings + aux.x_file.x_n.x_n.x_offset;
5580
0
          indx = _bfd_stringtab_add (flinfo->strtab, filename,
5581
0
             hash, copy);
5582
0
          if (indx == (bfd_size_type) -1)
5583
0
      return false;
5584
0
          aux.x_file.x_n.x_n.x_offset = STRING_SIZE_SIZE + indx;
5585
0
        }
5586
0
    }
5587
0
        else if (CSECT_SYM_P (isymp->n_sclass)
5588
0
           && i + 1 == isymp->n_numaux)
5589
0
    {
5590
5591
      /* We don't support type checking.  I don't know if
5592
         anybody does.  */
5593
0
      aux.x_csect.x_parmhash = 0;
5594
      /* I don't think anybody uses these fields, but we'd
5595
         better clobber them just in case.  */
5596
0
      aux.x_csect.x_stab = 0;
5597
0
      aux.x_csect.x_snstab = 0;
5598
5599
0
      if (SMTYP_SMTYP (aux.x_csect.x_smtyp) == XTY_LD)
5600
0
        {
5601
0
          unsigned long indx;
5602
5603
0
          indx = aux.x_csect.x_scnlen.u64;
5604
0
          if (indx < obj_raw_syment_count (input_bfd))
5605
0
      {
5606
0
        long symindx;
5607
5608
0
        symindx = flinfo->sym_indices[indx];
5609
0
        if (symindx < 0)
5610
0
          {
5611
0
            aux.x_csect.x_scnlen.u64 = 0;
5612
0
          }
5613
0
        else
5614
0
          {
5615
0
            aux.x_csect.x_scnlen.u64 = symindx;
5616
0
          }
5617
0
      }
5618
0
        }
5619
0
    }
5620
0
        else if (isymp->n_sclass != C_STAT || isymp->n_type != T_NULL)
5621
0
    {
5622
0
      unsigned long indx;
5623
5624
0
      if (ISFCN (isymp->n_type)
5625
0
          || ISTAG (isymp->n_sclass)
5626
0
          || isymp->n_sclass == C_BLOCK
5627
0
          || isymp->n_sclass == C_FCN)
5628
0
        {
5629
0
          indx = aux.x_sym.x_fcnary.x_fcn.x_endndx.u32;
5630
0
          if (indx > 0
5631
0
        && indx < obj_raw_syment_count (input_bfd))
5632
0
      {
5633
        /* We look forward through the symbol for
5634
           the index of the next symbol we are going
5635
           to include.  I don't know if this is
5636
           entirely right.  */
5637
0
        while (flinfo->sym_indices[indx] < 0
5638
0
         && indx < obj_raw_syment_count (input_bfd))
5639
0
          ++indx;
5640
0
        if (indx >= obj_raw_syment_count (input_bfd))
5641
0
          indx = output_index;
5642
0
        else
5643
0
          indx = flinfo->sym_indices[indx];
5644
0
        aux.x_sym.x_fcnary.x_fcn.x_endndx.u32 = indx;
5645
5646
0
      }
5647
0
        }
5648
5649
0
      indx = aux.x_sym.x_tagndx.u32;
5650
0
      if (indx > 0 && indx < obj_raw_syment_count (input_bfd))
5651
0
        {
5652
0
          long symindx;
5653
5654
0
          symindx = flinfo->sym_indices[indx];
5655
0
          if (symindx < 0)
5656
0
      aux.x_sym.x_tagndx.u32 = 0;
5657
0
          else
5658
0
      aux.x_sym.x_tagndx.u32 = symindx;
5659
0
        }
5660
5661
0
    }
5662
5663
        /* Copy over the line numbers, unless we are stripping
5664
     them.  We do this on a symbol by symbol basis in
5665
     order to more easily handle garbage collection.  */
5666
0
        if (CSECT_SYM_P (isymp->n_sclass)
5667
0
      && i == 0
5668
0
      && isymp->n_numaux > 1
5669
0
      && ISFCN (isymp->n_type)
5670
0
      && aux.x_sym.x_fcnary.x_fcn.x_lnnoptr != 0)
5671
0
    {
5672
0
      if (*lineno_counts == 0)
5673
0
        aux.x_sym.x_fcnary.x_fcn.x_lnnoptr = 0;
5674
0
      else
5675
0
        {
5676
0
          asection *enclosing;
5677
0
          unsigned int enc_count;
5678
0
          bfd_signed_vma linoff;
5679
0
          struct internal_lineno lin;
5680
0
          bfd_byte *linp;
5681
0
          bfd_byte *linpend;
5682
0
          bfd_vma offset;
5683
0
          file_ptr pos;
5684
0
          bfd_size_type amt;
5685
5686
          /* Read in the enclosing section's line-number
5687
       information, if we haven't already.  */
5688
0
          o = *csectpp;
5689
0
          enclosing = xcoff_section_data (abfd, o)->enclosing;
5690
0
          enc_count = xcoff_section_data (abfd, o)->lineno_count;
5691
0
          if (oline != enclosing)
5692
0
      {
5693
0
        pos = enclosing->line_filepos;
5694
0
        amt = linesz * enc_count;
5695
0
        if (bfd_seek (input_bfd, pos, SEEK_SET) != 0
5696
0
            || (bfd_read (flinfo->linenos, amt, input_bfd)
5697
0
          != amt))
5698
0
          return false;
5699
0
        oline = enclosing;
5700
0
      }
5701
5702
          /* Copy across the first entry, adjusting its
5703
       symbol index.  */
5704
0
          linoff = (aux.x_sym.x_fcnary.x_fcn.x_lnnoptr
5705
0
        - enclosing->line_filepos);
5706
0
          linp = flinfo->linenos + linoff;
5707
0
          bfd_coff_swap_lineno_in (input_bfd, linp, &lin);
5708
0
          lin.l_addr.l_symndx = *indexp;
5709
0
          bfd_coff_swap_lineno_out (output_bfd, &lin, linp);
5710
5711
          /* Copy the other entries, adjusting their addresses.  */
5712
0
          linpend = linp + *lineno_counts * linesz;
5713
0
          offset = (o->output_section->vma
5714
0
        + o->output_offset
5715
0
        - o->vma);
5716
0
          for (linp += linesz; linp < linpend; linp += linesz)
5717
0
      {
5718
0
        bfd_coff_swap_lineno_in (input_bfd, linp, &lin);
5719
0
        lin.l_addr.l_paddr += offset;
5720
0
        bfd_coff_swap_lineno_out (output_bfd, &lin, linp);
5721
0
      }
5722
5723
          /* Write out the entries we've just processed.  */
5724
0
          pos = (o->output_section->line_filepos
5725
0
           + o->output_section->lineno_count * linesz);
5726
0
          amt = linesz * *lineno_counts;
5727
0
          if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
5728
0
        || bfd_write (flinfo->linenos + linoff, amt,
5729
0
          output_bfd) != amt)
5730
0
      return false;
5731
0
          o->output_section->lineno_count += *lineno_counts;
5732
5733
          /* Record the offset of the symbol's line numbers
5734
       in the output file.  */
5735
0
          aux.x_sym.x_fcnary.x_fcn.x_lnnoptr = pos;
5736
5737
0
          if (incls > 0)
5738
0
      {
5739
0
        struct internal_syment *iisp, *iispend;
5740
0
        long *iindp;
5741
0
        bfd_byte *oos;
5742
0
        bfd_vma range_start, range_end;
5743
0
        int iiadd;
5744
5745
        /* Update any C_BINCL or C_EINCL symbols
5746
           that refer to a line number in the
5747
           range we just output.  */
5748
0
        iisp = flinfo->internal_syms;
5749
0
        iispend = iisp + obj_raw_syment_count (input_bfd);
5750
0
        iindp = flinfo->sym_indices;
5751
0
        oos = flinfo->outsyms;
5752
0
        range_start = enclosing->line_filepos + linoff;
5753
0
        range_end = range_start + *lineno_counts * linesz;
5754
0
        while (iisp < iispend)
5755
0
          {
5756
0
            if (*iindp >= 0
5757
0
          && (iisp->n_sclass == C_BINCL
5758
0
              || iisp->n_sclass == C_EINCL)
5759
0
          && iisp->n_value >= range_start
5760
0
          && iisp->n_value < range_end)
5761
0
        {
5762
0
          struct internal_syment iis;
5763
5764
0
          bfd_coff_swap_sym_in (output_bfd, oos, &iis);
5765
0
          iis.n_value = (iisp->n_value
5766
0
             - range_start
5767
0
             + pos);
5768
0
          bfd_coff_swap_sym_out (output_bfd,
5769
0
               &iis, oos);
5770
0
          --incls;
5771
0
        }
5772
5773
0
            iiadd = 1 + iisp->n_numaux;
5774
0
            if (*iindp >= 0)
5775
0
        oos += iiadd * osymesz;
5776
0
            iisp += iiadd;
5777
0
            iindp += iiadd;
5778
0
          }
5779
0
      }
5780
0
        }
5781
0
    }
5782
5783
0
        bfd_coff_swap_aux_out (output_bfd, (void *) &aux, isymp->n_type,
5784
0
             isymp->n_sclass, i, isymp->n_numaux,
5785
0
             (void *) outsym);
5786
0
        outsym += osymesz;
5787
0
        esym += isymesz;
5788
0
      }
5789
0
  }
5790
5791
0
      sym_hash += add;
5792
0
      indexp += add;
5793
0
      isymp += add;
5794
0
      csectpp += add;
5795
0
      lineno_counts += add;
5796
0
      debug_index += add;
5797
0
    }
5798
5799
  /* If we swapped out a C_FILE symbol, guess that the next C_FILE
5800
     symbol will be the first symbol in the next input file.  In the
5801
     normal case, this will save us from writing out the C_FILE symbol
5802
     again.  */
5803
0
  if (flinfo->last_file_index != -1
5804
0
      && (bfd_size_type) flinfo->last_file_index >= syment_base)
5805
0
    {
5806
0
      flinfo->last_file.n_value = output_index;
5807
0
      bfd_coff_swap_sym_out (output_bfd, (void *) &flinfo->last_file,
5808
0
           (void *) (flinfo->outsyms
5809
0
            + ((flinfo->last_file_index - syment_base)
5810
0
               * osymesz)));
5811
0
    }
5812
5813
  /* Write the modified symbols to the output file.  */
5814
0
  if (outsym > flinfo->outsyms)
5815
0
    {
5816
0
      file_ptr pos = obj_sym_filepos (output_bfd) + syment_base * osymesz;
5817
0
      bfd_size_type amt = outsym - flinfo->outsyms;
5818
0
      if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
5819
0
    || bfd_write (flinfo->outsyms, amt, output_bfd) != amt)
5820
0
  return false;
5821
5822
0
      BFD_ASSERT ((obj_raw_syment_count (output_bfd)
5823
0
       + (outsym - flinfo->outsyms) / osymesz)
5824
0
      == output_index);
5825
5826
0
      obj_raw_syment_count (output_bfd) = output_index;
5827
0
    }
5828
5829
  /* Don't let the linker relocation routines discard the symbols.  */
5830
0
  keep_syms = obj_coff_keep_syms (input_bfd);
5831
0
  obj_coff_keep_syms (input_bfd) = true;
5832
5833
  /* Relocate the contents of each section.  */
5834
0
  for (o = input_bfd->sections; o != NULL; o = o->next)
5835
0
    {
5836
0
      bfd_byte *contents;
5837
5838
0
      if (! o->linker_mark)
5839
  /* This section was omitted from the link.  */
5840
0
  continue;
5841
5842
0
      if ((o->flags & SEC_HAS_CONTENTS) == 0
5843
0
    || o->size == 0
5844
0
    || (o->flags & SEC_IN_MEMORY) != 0)
5845
0
  continue;
5846
5847
      /* We have set filepos correctly for the sections we created to
5848
   represent csects, so bfd_get_section_contents should work.  */
5849
0
      if (coff_section_data (input_bfd, o) != NULL
5850
0
    && coff_section_data (input_bfd, o)->contents != NULL)
5851
0
  contents = coff_section_data (input_bfd, o)->contents;
5852
0
      else
5853
0
  {
5854
0
    bfd_size_type sz = o->rawsize ? o->rawsize : o->size;
5855
0
    if (!bfd_get_section_contents (input_bfd, o, flinfo->contents, 0, sz))
5856
0
      goto err_out;
5857
0
    contents = flinfo->contents;
5858
0
  }
5859
5860
0
      if ((o->flags & SEC_RELOC) != 0)
5861
0
  {
5862
0
    int target_index;
5863
0
    struct internal_reloc *internal_relocs;
5864
0
    struct internal_reloc *irel;
5865
0
    bfd_vma offset;
5866
0
    struct internal_reloc *irelend;
5867
0
    struct xcoff_link_hash_entry **rel_hash;
5868
0
    long r_symndx;
5869
5870
    /* Read in the relocs.  */
5871
0
    target_index = o->output_section->target_index;
5872
0
    internal_relocs = (xcoff_read_internal_relocs
5873
0
           (input_bfd, o, false, flinfo->external_relocs,
5874
0
            true,
5875
0
            (flinfo->section_info[target_index].relocs
5876
0
             + o->output_section->reloc_count)));
5877
0
    if (internal_relocs == NULL)
5878
0
      goto err_out;
5879
5880
    /* Call processor specific code to relocate the section
5881
       contents.  */
5882
0
    if (! bfd_coff_relocate_section (output_bfd, flinfo->info,
5883
0
             input_bfd, o,
5884
0
             contents,
5885
0
             internal_relocs,
5886
0
             flinfo->internal_syms,
5887
0
             xcoff_data (input_bfd)->csects))
5888
0
      goto err_out;
5889
5890
0
    offset = o->output_section->vma + o->output_offset - o->vma;
5891
0
    irel = internal_relocs;
5892
0
    irelend = irel + o->reloc_count;
5893
0
    rel_hash = (flinfo->section_info[target_index].rel_hashes
5894
0
          + o->output_section->reloc_count);
5895
0
    for (; irel < irelend; irel++, rel_hash++)
5896
0
      {
5897
0
        struct xcoff_link_hash_entry *h = NULL;
5898
5899
0
        *rel_hash = NULL;
5900
5901
        /* Adjust the reloc address and symbol index.  */
5902
5903
0
        r_symndx = irel->r_symndx;
5904
5905
0
        if (r_symndx == -1)
5906
0
    h = NULL;
5907
0
        else
5908
0
    h = obj_xcoff_sym_hashes (input_bfd)[r_symndx];
5909
5910
        /* In case of a R_BR or R_RBR, change the target if
5911
     a stub is being called.  */
5912
0
        if (h != NULL
5913
0
      && (irel->r_type == R_BR
5914
0
          || irel->r_type == R_RBR))
5915
0
    {
5916
0
      asection *sym_sec;
5917
0
      bfd_vma dest;
5918
0
      struct xcoff_stub_hash_entry *hstub = NULL;
5919
0
      enum xcoff_stub_type stub_type;
5920
5921
0
      if (h->root.type == bfd_link_hash_defined
5922
0
          || h->root.type == bfd_link_hash_defweak)
5923
0
        {
5924
0
          sym_sec = h->root.u.def.section;
5925
0
          dest = (h->root.u.def.value
5926
0
            + sym_sec->output_section->vma
5927
0
            + sym_sec->output_offset);
5928
0
        }
5929
0
      else
5930
0
        {
5931
0
          BFD_FAIL ();
5932
0
          goto err_out;
5933
0
        }
5934
5935
0
      stub_type = bfd_xcoff_type_of_stub (o, irel, dest, h);
5936
0
      if (stub_type != xcoff_stub_none)
5937
0
        {
5938
0
          hstub = bfd_xcoff_get_stub_entry (o, h, flinfo->info);
5939
0
          if (hstub == NULL)
5940
0
      goto err_out;
5941
5942
0
          h = hstub->hcsect;
5943
0
        }
5944
5945
0
    }
5946
5947
0
        irel->r_vaddr += offset;
5948
5949
0
        if (r_symndx != -1 && flinfo->info->strip != strip_all)
5950
0
    {
5951
5952
0
      if (h != NULL
5953
0
          && h->smclas != XMC_TD
5954
0
          && (irel->r_type == R_TOC
5955
0
        || irel->r_type == R_GL
5956
0
        || irel->r_type == R_TCL
5957
0
        || irel->r_type == R_TRL
5958
0
        || irel->r_type == R_TRLA))
5959
0
        {
5960
          /* This is a TOC relative reloc with a symbol
5961
       attached.  The symbol should be the one which
5962
       this reloc is for.  We want to make this
5963
       reloc against the TOC address of the symbol,
5964
       not the symbol itself.  */
5965
0
          BFD_ASSERT (h->toc_section != NULL);
5966
0
          BFD_ASSERT ((h->flags & XCOFF_SET_TOC) == 0);
5967
0
          if (h->u.toc_indx != -1)
5968
0
      irel->r_symndx = h->u.toc_indx;
5969
0
          else
5970
0
      {
5971
0
        struct xcoff_toc_rel_hash *n;
5972
0
        struct xcoff_link_section_info *si;
5973
0
        size_t amt;
5974
5975
0
        amt = sizeof (* n);
5976
0
        n = bfd_alloc (flinfo->output_bfd, amt);
5977
0
        if (n == NULL)
5978
0
          goto err_out;
5979
0
        si = flinfo->section_info + target_index;
5980
0
        n->next = si->toc_rel_hashes;
5981
0
        n->h = h;
5982
0
        n->rel = irel;
5983
0
        si->toc_rel_hashes = n;
5984
0
      }
5985
0
        }
5986
0
      else if (h != NULL)
5987
0
        {
5988
          /* This is a global symbol.  */
5989
0
          if (h->indx >= 0)
5990
0
      irel->r_symndx = h->indx;
5991
0
          else
5992
0
      {
5993
        /* This symbol is being written at the end
5994
           of the file, and we do not yet know the
5995
           symbol index.  We save the pointer to the
5996
           hash table entry in the rel_hash list.
5997
           We set the indx field to -2 to indicate
5998
           that this symbol must not be stripped.  */
5999
0
        *rel_hash = h;
6000
0
        h->indx = -2;
6001
0
      }
6002
0
        }
6003
0
      else
6004
0
        {
6005
0
          long indx;
6006
6007
0
          indx = flinfo->sym_indices[r_symndx];
6008
6009
0
          if (indx == -1)
6010
0
      {
6011
0
        struct internal_syment *is;
6012
6013
        /* Relocations against a TC0 TOC anchor are
6014
           automatically transformed to be against
6015
           the TOC anchor in the output file.  */
6016
0
        is = flinfo->internal_syms + r_symndx;
6017
0
        if (is->n_sclass == C_HIDEXT
6018
0
            && is->n_numaux > 0)
6019
0
          {
6020
0
            void * auxptr;
6021
0
            union internal_auxent aux;
6022
6023
0
            auxptr = ((void *)
6024
0
          (((bfd_byte *)
6025
0
            obj_coff_external_syms (input_bfd))
6026
0
           + ((r_symndx + is->n_numaux)
6027
0
              * isymesz)));
6028
0
            bfd_coff_swap_aux_in (input_bfd, auxptr,
6029
0
                is->n_type, is->n_sclass,
6030
0
                is->n_numaux - 1,
6031
0
                is->n_numaux,
6032
0
                (void *) &aux);
6033
0
            if (SMTYP_SMTYP (aux.x_csect.x_smtyp) == XTY_SD
6034
0
          && aux.x_csect.x_smclas == XMC_TC0)
6035
0
        indx = flinfo->toc_symindx;
6036
0
          }
6037
0
      }
6038
6039
0
          if (indx != -1)
6040
0
      irel->r_symndx = indx;
6041
0
          else
6042
0
      {
6043
6044
0
        struct internal_syment *is;
6045
6046
0
        const char *name;
6047
0
        char buf[SYMNMLEN + 1];
6048
6049
        /* This reloc is against a symbol we are
6050
           stripping.  It would be possible to handle
6051
           this case, but I don't think it's worth it.  */
6052
0
        is = flinfo->internal_syms + r_symndx;
6053
6054
0
        if (is->n_sclass != C_DWARF)
6055
0
          {
6056
0
            name = (_bfd_coff_internal_syment_name
6057
0
              (input_bfd, is, buf));
6058
6059
0
            if (name == NULL)
6060
0
        goto err_out;
6061
6062
0
            (*flinfo->info->callbacks->unattached_reloc)
6063
0
        (flinfo->info, name,
6064
0
         input_bfd, o, irel->r_vaddr);
6065
0
          }
6066
0
      }
6067
0
        }
6068
0
    }
6069
6070
0
        if ((o->flags & SEC_DEBUGGING) == 0
6071
0
      && xcoff_need_ldrel_p (flinfo->info, irel, h, o))
6072
0
    {
6073
0
      asection *sec;
6074
6075
0
      if (r_symndx == -1)
6076
0
        sec = NULL;
6077
0
      else if (h == NULL)
6078
0
        sec = xcoff_data (input_bfd)->csects[r_symndx];
6079
0
      else
6080
0
        sec = xcoff_symbol_section (h);
6081
0
      if (!xcoff_create_ldrel (output_bfd, flinfo,
6082
0
             o->output_section, input_bfd,
6083
0
             irel, sec, h))
6084
0
        goto err_out;
6085
0
    }
6086
0
      }
6087
6088
0
    o->output_section->reloc_count += o->reloc_count;
6089
0
  }
6090
6091
      /* Write out the modified section contents.  */
6092
0
      if (! bfd_set_section_contents (output_bfd, o->output_section,
6093
0
              contents, (file_ptr) o->output_offset,
6094
0
              o->size))
6095
0
  goto err_out;
6096
0
    }
6097
6098
0
  obj_coff_keep_syms (input_bfd) = keep_syms;
6099
6100
0
  if (! flinfo->info->keep_memory)
6101
0
    {
6102
0
      if (! _bfd_coff_free_symbols (input_bfd))
6103
0
  return false;
6104
0
    }
6105
6106
0
  return true;
6107
6108
0
 err_out:
6109
0
  obj_coff_keep_syms (input_bfd) = keep_syms;
6110
0
  return false;
6111
0
}
6112
6113
#undef N_TMASK
6114
#undef N_BTSHFT
6115
6116
/* Sort relocs by VMA.  This is called via qsort.  */
6117
6118
static int
6119
xcoff_sort_relocs (const void * p1, const void * p2)
6120
0
{
6121
0
  const struct internal_reloc *r1 = (const struct internal_reloc *) p1;
6122
0
  const struct internal_reloc *r2 = (const struct internal_reloc *) p2;
6123
6124
0
  if (r1->r_vaddr > r2->r_vaddr)
6125
0
    return 1;
6126
0
  else if (r1->r_vaddr < r2->r_vaddr)
6127
0
    return -1;
6128
0
  else
6129
0
    return 0;
6130
0
}
6131
6132
/* Return true if section SEC is a TOC section.  */
6133
6134
static inline bool
6135
xcoff_toc_section_p (asection *sec)
6136
0
{
6137
0
  const char *name;
6138
6139
0
  name = sec->name;
6140
0
  if (name[0] == '.' && name[1] == 't')
6141
0
    {
6142
0
      if (name[2] == 'c')
6143
0
  {
6144
0
    if (name[3] == '0' && name[4] == 0)
6145
0
      return true;
6146
0
    if (name[3] == 0)
6147
0
      return true;
6148
0
  }
6149
0
      if (name[2] == 'd' && name[3] == 0)
6150
0
  return true;
6151
0
    }
6152
0
  return false;
6153
0
}
6154
6155
/* See if the link requires a TOC (it usually does!).  If so, find a
6156
   good place to put the TOC anchor csect, and write out the associated
6157
   symbol.  */
6158
6159
static bool
6160
xcoff_find_tc0 (bfd *output_bfd, struct xcoff_final_link_info *flinfo)
6161
0
{
6162
0
  bfd_vma toc_start, toc_end, start, end, best_address;
6163
0
  asection *sec;
6164
0
  bfd *input_bfd;
6165
0
  int section_index;
6166
0
  struct internal_syment irsym;
6167
0
  union internal_auxent iraux;
6168
0
  file_ptr pos;
6169
0
  size_t size;
6170
6171
  /* Set [TOC_START, TOC_END) to the range of the TOC.  Record the
6172
     index of a csect at the beginning of the TOC.  */
6173
0
  toc_start = ~(bfd_vma) 0;
6174
0
  toc_end = 0;
6175
0
  section_index = -1;
6176
0
  for (input_bfd = flinfo->info->input_bfds;
6177
0
       input_bfd != NULL;
6178
0
       input_bfd = input_bfd->link.next)
6179
0
    for (sec = input_bfd->sections; sec != NULL; sec = sec->next)
6180
0
      if (sec->gc_mark != 0 && xcoff_toc_section_p (sec))
6181
0
  {
6182
0
    start = sec->output_section->vma + sec->output_offset;
6183
0
    if (toc_start > start)
6184
0
      {
6185
0
        toc_start = start;
6186
0
        section_index = sec->output_section->target_index;
6187
0
      }
6188
6189
0
    end = start + sec->size;
6190
0
    if (toc_end < end)
6191
0
      toc_end = end;
6192
0
  }
6193
6194
  /* There's no need for a TC0 symbol if we don't have a TOC.  */
6195
0
  if (toc_end < toc_start)
6196
0
    {
6197
0
      xcoff_data (output_bfd)->toc = toc_start;
6198
0
      return true;
6199
0
    }
6200
6201
0
  if (toc_end - toc_start < 0x8000)
6202
    /* Every TOC csect can be accessed from TOC_START.  */
6203
0
    best_address = toc_start;
6204
0
  else
6205
0
    {
6206
      /* Find the lowest TOC csect that is still within range of TOC_END.  */
6207
0
      best_address = toc_end;
6208
0
      for (input_bfd = flinfo->info->input_bfds;
6209
0
     input_bfd != NULL;
6210
0
     input_bfd = input_bfd->link.next)
6211
0
  for (sec = input_bfd->sections; sec != NULL; sec = sec->next)
6212
0
    if (sec->gc_mark != 0 && xcoff_toc_section_p (sec))
6213
0
      {
6214
0
        start = sec->output_section->vma + sec->output_offset;
6215
0
        if (start < best_address
6216
0
      && start + 0x8000 >= toc_end)
6217
0
    {
6218
0
      best_address = start;
6219
0
      section_index = sec->output_section->target_index;
6220
0
    }
6221
0
      }
6222
6223
      /* Make sure that the start of the TOC is also within range.  */
6224
0
      if (best_address > toc_start + 0x8000)
6225
0
  {
6226
0
    _bfd_error_handler
6227
0
      (_("TOC overflow: %#" PRIx64 " > 0x10000; try -mminimal-toc "
6228
0
         "when compiling"),
6229
0
       (uint64_t) (toc_end - toc_start));
6230
0
    bfd_set_error (bfd_error_file_too_big);
6231
0
    return false;
6232
0
  }
6233
0
    }
6234
6235
  /* Record the chosen TOC value.  */
6236
0
  flinfo->toc_symindx = obj_raw_syment_count (output_bfd);
6237
0
  xcoff_data (output_bfd)->toc = best_address;
6238
0
  xcoff_data (output_bfd)->sntoc = section_index;
6239
6240
  /* Fill out the TC0 symbol.  */
6241
0
  if (!bfd_xcoff_put_symbol_name (output_bfd, flinfo->info, flinfo->strtab,
6242
0
          &irsym, "TOC"))
6243
0
    return false;
6244
0
  irsym.n_value = best_address;
6245
0
  irsym.n_scnum = section_index;
6246
0
  irsym.n_sclass = C_HIDEXT;
6247
0
  irsym.n_type = T_NULL;
6248
0
  irsym.n_numaux = 1;
6249
0
  bfd_coff_swap_sym_out (output_bfd, &irsym, flinfo->outsyms);
6250
6251
  /* Fill out the auxiliary csect information.  */
6252
0
  memset (&iraux, 0, sizeof iraux);
6253
0
  iraux.x_csect.x_smtyp = XTY_SD;
6254
0
  iraux.x_csect.x_smclas = XMC_TC0;
6255
0
  iraux.x_csect.x_scnlen.u64 = 0;
6256
0
  bfd_coff_swap_aux_out (output_bfd, &iraux, T_NULL, C_HIDEXT, 0, 1,
6257
0
       flinfo->outsyms + bfd_coff_symesz (output_bfd));
6258
6259
  /* Write the contents to the file.  */
6260
0
  pos = obj_sym_filepos (output_bfd);
6261
0
  pos += obj_raw_syment_count (output_bfd) * bfd_coff_symesz (output_bfd);
6262
0
  size = 2 * bfd_coff_symesz (output_bfd);
6263
0
  if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
6264
0
      || bfd_write (flinfo->outsyms, size, output_bfd) != size)
6265
0
    return false;
6266
0
  obj_raw_syment_count (output_bfd) += 2;
6267
6268
0
  return true;
6269
0
}
6270
6271
/* Write out a non-XCOFF global symbol.  */
6272
6273
static bool
6274
xcoff_write_global_symbol (struct bfd_hash_entry *bh, void * inf)
6275
0
{
6276
0
  struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) bh;
6277
0
  struct xcoff_final_link_info *flinfo = (struct xcoff_final_link_info *) inf;
6278
0
  bfd *output_bfd;
6279
0
  bfd_byte *outsym;
6280
0
  struct internal_syment isym;
6281
0
  union internal_auxent aux;
6282
0
  bool result;
6283
0
  file_ptr pos;
6284
0
  bfd_size_type amt;
6285
6286
0
  output_bfd = flinfo->output_bfd;
6287
0
  outsym = flinfo->outsyms;
6288
6289
0
  if (h->root.type == bfd_link_hash_warning)
6290
0
    {
6291
0
      h = (struct xcoff_link_hash_entry *) h->root.u.i.link;
6292
0
      if (h->root.type == bfd_link_hash_new)
6293
0
  return true;
6294
0
    }
6295
6296
  /* If this symbol was garbage collected, just skip it.  */
6297
0
  if (xcoff_hash_table (flinfo->info)->gc
6298
0
      && (h->flags & XCOFF_MARK) == 0)
6299
0
    return true;
6300
6301
  /* If we need a .loader section entry, write it out.  */
6302
0
  if (h->ldsym != NULL)
6303
0
    {
6304
0
      struct internal_ldsym *ldsym;
6305
0
      bfd *impbfd;
6306
6307
0
      ldsym = h->ldsym;
6308
6309
0
      if (h->root.type == bfd_link_hash_undefined
6310
0
    || h->root.type == bfd_link_hash_undefweak)
6311
0
  {
6312
6313
0
    ldsym->l_value = 0;
6314
0
    ldsym->l_scnum = N_UNDEF;
6315
0
    ldsym->l_smtype = XTY_ER;
6316
0
    impbfd = h->root.u.undef.abfd;
6317
6318
0
  }
6319
0
      else if (h->root.type == bfd_link_hash_defined
6320
0
         || h->root.type == bfd_link_hash_defweak)
6321
0
  {
6322
0
    asection *sec;
6323
6324
0
    sec = h->root.u.def.section;
6325
0
    ldsym->l_value = (sec->output_section->vma
6326
0
          + sec->output_offset
6327
0
          + h->root.u.def.value);
6328
0
    ldsym->l_scnum = sec->output_section->target_index;
6329
0
    ldsym->l_smtype = XTY_SD;
6330
0
    impbfd = sec->owner;
6331
6332
0
  }
6333
0
      else
6334
0
  abort ();
6335
6336
0
      if (((h->flags & XCOFF_DEF_REGULAR) == 0
6337
0
     && (h->flags & XCOFF_DEF_DYNAMIC) != 0)
6338
0
    || (h->flags & XCOFF_IMPORT) != 0)
6339
  /* Clear l_smtype
6340
     Import symbols are defined so the check above will make
6341
     the l_smtype XTY_SD.  But this is not correct, it should
6342
     be cleared.  */
6343
0
  ldsym->l_smtype |= L_IMPORT;
6344
6345
0
      if (((h->flags & XCOFF_DEF_REGULAR) != 0
6346
0
     && (h->flags & XCOFF_DEF_DYNAMIC) != 0)
6347
0
    || (h->flags & XCOFF_EXPORT) != 0)
6348
0
  ldsym->l_smtype |= L_EXPORT;
6349
6350
0
      if ((h->flags & XCOFF_ENTRY) != 0)
6351
0
  ldsym->l_smtype |= L_ENTRY;
6352
6353
0
      if ((h->flags & XCOFF_RTINIT) != 0)
6354
0
  ldsym->l_smtype = XTY_SD;
6355
6356
0
      ldsym->l_smclas = h->smclas;
6357
6358
0
      if (ldsym->l_smtype & L_IMPORT)
6359
0
  {
6360
0
    if ((h->root.type == bfd_link_hash_defined
6361
0
         || h->root.type == bfd_link_hash_defweak)
6362
0
        && (h->root.u.def.value != 0))
6363
0
      ldsym->l_smclas = XMC_XO;
6364
6365
0
    else if ((h->flags & (XCOFF_SYSCALL32 | XCOFF_SYSCALL64)) ==
6366
0
       (XCOFF_SYSCALL32 | XCOFF_SYSCALL64))
6367
0
      ldsym->l_smclas = XMC_SV3264;
6368
6369
0
    else if (h->flags & XCOFF_SYSCALL32)
6370
0
      ldsym->l_smclas = XMC_SV;
6371
6372
0
    else if (h->flags & XCOFF_SYSCALL64)
6373
0
      ldsym->l_smclas = XMC_SV64;
6374
0
  }
6375
6376
0
      if (ldsym->l_ifile == -(bfd_size_type) 1)
6377
0
  {
6378
0
    ldsym->l_ifile = 0;
6379
0
  }
6380
0
      else if (ldsym->l_ifile == 0)
6381
0
  {
6382
0
    if ((ldsym->l_smtype & L_IMPORT) == 0)
6383
0
      ldsym->l_ifile = 0;
6384
0
    else if (impbfd == NULL)
6385
0
      ldsym->l_ifile = 0;
6386
0
    else
6387
0
      {
6388
0
        BFD_ASSERT (impbfd->xvec == output_bfd->xvec);
6389
0
        ldsym->l_ifile = xcoff_data (impbfd)->import_file_id;
6390
0
      }
6391
0
  }
6392
6393
0
      ldsym->l_parm = 0;
6394
6395
0
      BFD_ASSERT (h->ldindx >= 0);
6396
6397
0
      bfd_xcoff_swap_ldsym_out (output_bfd, ldsym,
6398
0
        (flinfo->ldsym +
6399
0
         (h->ldindx - 3)
6400
0
         * bfd_xcoff_ldsymsz(flinfo->output_bfd)));
6401
0
      h->ldsym = NULL;
6402
0
    }
6403
6404
  /* If this symbol needs global linkage code, write it out.  */
6405
0
  if (h->root.type == bfd_link_hash_defined
6406
0
      && (h->root.u.def.section
6407
0
    == xcoff_hash_table (flinfo->info)->linkage_section))
6408
0
    {
6409
0
      bfd_byte *p;
6410
0
      bfd_vma tocoff;
6411
0
      unsigned int i;
6412
6413
0
      p = h->root.u.def.section->contents + h->root.u.def.value;
6414
6415
      /* The first instruction in the global linkage code loads a
6416
   specific TOC element.  */
6417
0
      tocoff = (h->descriptor->toc_section->output_section->vma
6418
0
    + h->descriptor->toc_section->output_offset
6419
0
    - xcoff_data (output_bfd)->toc);
6420
6421
0
      if ((h->descriptor->flags & XCOFF_SET_TOC) != 0)
6422
0
  tocoff += h->descriptor->u.toc_offset;
6423
6424
      /* The first instruction in the glink code needs to be
6425
   cooked to hold the correct offset in the toc.  The
6426
   rest are just output raw.  */
6427
0
      bfd_put_32 (output_bfd,
6428
0
      bfd_xcoff_glink_code(output_bfd, 0) | (tocoff & 0xffff), p);
6429
6430
      /* Start with i == 1 to get past the first instruction done above
6431
   The /4 is because the glink code is in bytes and we are going
6432
   4 at a pop.  */
6433
0
      for (i = 1; i < bfd_xcoff_glink_code_size(output_bfd) / 4; i++)
6434
0
  bfd_put_32 (output_bfd,
6435
0
        (bfd_vma) bfd_xcoff_glink_code(output_bfd, i),
6436
0
        &p[4 * i]);
6437
0
    }
6438
6439
  /* If we created a TOC entry for this symbol, write out the required
6440
     relocs.  */
6441
0
  if ((h->flags & XCOFF_SET_TOC) != 0)
6442
0
    {
6443
0
      asection *tocsec;
6444
0
      asection *osec;
6445
0
      int oindx;
6446
0
      struct internal_reloc *irel;
6447
0
      struct internal_syment irsym;
6448
0
      union internal_auxent iraux;
6449
6450
0
      tocsec = h->toc_section;
6451
0
      osec = tocsec->output_section;
6452
0
      oindx = osec->target_index;
6453
0
      irel = flinfo->section_info[oindx].relocs + osec->reloc_count;
6454
0
      irel->r_vaddr = (osec->vma
6455
0
           + tocsec->output_offset
6456
0
           + h->u.toc_offset);
6457
6458
0
      if (h->indx >= 0)
6459
0
  irel->r_symndx = h->indx;
6460
0
      else
6461
0
  {
6462
0
    h->indx = -2;
6463
0
    irel->r_symndx = obj_raw_syment_count (output_bfd);
6464
0
  }
6465
6466
      /* Initialize the aux union here instead of closer to when it is
6467
   written out below because the length of the csect depends on
6468
   whether the output is 32 or 64 bit.  */
6469
0
      memset (&iraux, 0, sizeof iraux);
6470
0
      iraux.x_csect.x_smtyp = XTY_SD;
6471
      /* iraux.x_csect.x_scnlen.u64 = 4 or 8, see below.  */
6472
0
      iraux.x_csect.x_smclas = XMC_TC;
6473
6474
      /* 32 bit uses a 32 bit R_POS to do the relocations
6475
   64 bit uses a 64 bit R_POS to do the relocations
6476
6477
   Also needs to change the csect size : 4 for 32 bit, 8 for 64 bit
6478
6479
   Which one is determined by the backend.  */
6480
0
      if (bfd_xcoff_is_xcoff64 (output_bfd))
6481
0
  {
6482
0
    irel->r_size = 63;
6483
0
    iraux.x_csect.x_scnlen.u64 = 8;
6484
0
  }
6485
0
      else if (bfd_xcoff_is_xcoff32 (output_bfd))
6486
0
  {
6487
0
    irel->r_size = 31;
6488
0
    iraux.x_csect.x_scnlen.u64 = 4;
6489
0
  }
6490
0
      else
6491
0
  return false;
6492
6493
0
      irel->r_type = R_POS;
6494
0
      flinfo->section_info[oindx].rel_hashes[osec->reloc_count] = NULL;
6495
0
      ++osec->reloc_count;
6496
6497
      /* There are two kind of linker-created TOC entry.
6498
   The ones importing their symbols from outside, made for the
6499
   global linkage.  These symbols have XCOFF_LDREL set and only
6500
   requires a loader relocation on their imported symbol.
6501
   On the other hand, symbols without XCOFF_LDREL are TOC entries
6502
   of internal symbols (like function descriptors made for stubs).
6503
   These symbols needs a loader relocation over .data and this
6504
   relocation must be applied.  */
6505
6506
0
      if ((h->flags & XCOFF_LDREL) != 0
6507
0
    && h->ldindx >= 0)
6508
0
  {
6509
0
    if (!xcoff_create_ldrel (output_bfd, flinfo, osec,
6510
0
           output_bfd, irel, NULL, h))
6511
0
      return false;
6512
0
  }
6513
0
      else
6514
0
  {
6515
0
    bfd_byte *p;
6516
0
    bfd_vma val;
6517
6518
0
    p = tocsec->contents + h->u.toc_offset;
6519
0
    val = (h->root.u.def.value
6520
0
     + h->root.u.def.section->output_section->vma
6521
0
     + h->root.u.def.section->output_offset);
6522
6523
0
    if (bfd_xcoff_is_xcoff64 (output_bfd))
6524
0
      bfd_put_64 (output_bfd, val, p);
6525
0
    else if (bfd_xcoff_is_xcoff32 (output_bfd))
6526
0
      bfd_put_32 (output_bfd, val, p);
6527
0
    else
6528
0
      return false;
6529
6530
0
    if (!xcoff_create_ldrel (output_bfd, flinfo, osec,
6531
0
           output_bfd, irel, h->root.u.def.section, h))
6532
0
      return false;
6533
0
  }
6534
6535
      /* We need to emit a symbol to define a csect which holds
6536
   the reloc.  */
6537
0
      if (flinfo->info->strip != strip_all)
6538
0
  {
6539
0
    result = bfd_xcoff_put_symbol_name (output_bfd, flinfo->info,
6540
0
                flinfo->strtab,
6541
0
                &irsym, h->root.root.string);
6542
0
    if (!result)
6543
0
      return false;
6544
6545
0
    irsym.n_value = irel->r_vaddr;
6546
0
    irsym.n_scnum = osec->target_index;
6547
0
    irsym.n_sclass = C_HIDEXT;
6548
0
    irsym.n_type = T_NULL;
6549
0
    irsym.n_numaux = 1;
6550
6551
0
    bfd_coff_swap_sym_out (output_bfd, (void *) &irsym, (void *) outsym);
6552
0
    outsym += bfd_coff_symesz (output_bfd);
6553
6554
    /* Note : iraux is initialized above.  */
6555
0
    bfd_coff_swap_aux_out (output_bfd, (void *) &iraux, T_NULL, C_HIDEXT,
6556
0
         0, 1, (void *) outsym);
6557
0
    outsym += bfd_coff_auxesz (output_bfd);
6558
6559
0
    if (h->indx >= 0)
6560
0
      {
6561
        /* We aren't going to write out the symbols below, so we
6562
     need to write them out now.  */
6563
0
        pos = obj_sym_filepos (output_bfd);
6564
0
        pos += (obj_raw_syment_count (output_bfd)
6565
0
          * bfd_coff_symesz (output_bfd));
6566
0
        amt = outsym - flinfo->outsyms;
6567
0
        if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
6568
0
      || bfd_write (flinfo->outsyms, amt, output_bfd) != amt)
6569
0
    return false;
6570
0
        obj_raw_syment_count (output_bfd) +=
6571
0
    (outsym - flinfo->outsyms) / bfd_coff_symesz (output_bfd);
6572
6573
0
        outsym = flinfo->outsyms;
6574
0
      }
6575
0
  }
6576
0
    }
6577
6578
  /* If this symbol is a specially defined function descriptor, write
6579
     it out.  The first word is the address of the function code
6580
     itself, the second word is the address of the TOC, and the third
6581
     word is zero.
6582
6583
     32 bit vs 64 bit
6584
     The addresses for the 32 bit will take 4 bytes and the addresses
6585
     for 64 bit will take 8 bytes.  Similar for the relocs.  This type
6586
     of logic was also done above to create a TOC entry in
6587
     xcoff_write_global_symbol.  */
6588
0
  if ((h->flags & XCOFF_DESCRIPTOR) != 0
6589
0
      && h->root.type == bfd_link_hash_defined
6590
0
      && (h->root.u.def.section
6591
0
    == xcoff_hash_table (flinfo->info)->descriptor_section))
6592
0
    {
6593
0
      asection *sec;
6594
0
      asection *osec;
6595
0
      int oindx;
6596
0
      bfd_byte *p;
6597
0
      struct xcoff_link_hash_entry *hentry;
6598
0
      asection *esec;
6599
0
      struct internal_reloc *irel;
6600
0
      asection *tsec;
6601
0
      unsigned int reloc_size, byte_size;
6602
6603
0
      if (bfd_xcoff_is_xcoff64 (output_bfd))
6604
0
  {
6605
0
    reloc_size = 63;
6606
0
    byte_size = 8;
6607
0
  }
6608
0
      else if (bfd_xcoff_is_xcoff32 (output_bfd))
6609
0
  {
6610
0
    reloc_size = 31;
6611
0
    byte_size = 4;
6612
0
  }
6613
0
      else
6614
0
  return false;
6615
6616
0
      sec = h->root.u.def.section;
6617
0
      osec = sec->output_section;
6618
0
      oindx = osec->target_index;
6619
0
      p = sec->contents + h->root.u.def.value;
6620
6621
0
      hentry = h->descriptor;
6622
0
      BFD_ASSERT (hentry != NULL
6623
0
      && (hentry->root.type == bfd_link_hash_defined
6624
0
          || hentry->root.type == bfd_link_hash_defweak));
6625
0
      esec = hentry->root.u.def.section;
6626
6627
0
      irel = flinfo->section_info[oindx].relocs + osec->reloc_count;
6628
0
      irel->r_vaddr = (osec->vma
6629
0
           + sec->output_offset
6630
0
           + h->root.u.def.value);
6631
0
      irel->r_symndx = esec->output_section->target_index;
6632
0
      irel->r_type = R_POS;
6633
0
      irel->r_size = reloc_size;
6634
0
      flinfo->section_info[oindx].rel_hashes[osec->reloc_count] = NULL;
6635
0
      ++osec->reloc_count;
6636
6637
0
      if (!xcoff_create_ldrel (output_bfd, flinfo, osec,
6638
0
             output_bfd, irel, esec, NULL))
6639
0
  return false;
6640
6641
      /* There are three items to write out,
6642
   the address of the code
6643
   the address of the toc anchor
6644
   the environment pointer.
6645
   We are ignoring the environment pointer.  So set it to zero.  */
6646
0
      if (bfd_xcoff_is_xcoff64 (output_bfd))
6647
0
  {
6648
0
    bfd_put_64 (output_bfd,
6649
0
          (esec->output_section->vma + esec->output_offset
6650
0
           + hentry->root.u.def.value),
6651
0
          p);
6652
0
    bfd_put_64 (output_bfd, xcoff_data (output_bfd)->toc, p + 8);
6653
0
    bfd_put_64 (output_bfd, (bfd_vma) 0, p + 16);
6654
0
  }
6655
0
      else
6656
0
  {
6657
    /* 32 bit backend
6658
       This logic was already called above so the error case where
6659
       the backend is neither has already been checked.  */
6660
0
    bfd_put_32 (output_bfd,
6661
0
          (esec->output_section->vma + esec->output_offset
6662
0
           + hentry->root.u.def.value),
6663
0
          p);
6664
0
    bfd_put_32 (output_bfd, xcoff_data (output_bfd)->toc, p + 4);
6665
0
    bfd_put_32 (output_bfd, (bfd_vma) 0, p + 8);
6666
0
  }
6667
6668
0
      tsec = coff_section_from_bfd_index (output_bfd,
6669
0
            xcoff_data (output_bfd)->sntoc);
6670
6671
0
      ++irel;
6672
0
      irel->r_vaddr = (osec->vma
6673
0
           + sec->output_offset
6674
0
           + h->root.u.def.value
6675
0
           + byte_size);
6676
0
      irel->r_symndx = tsec->output_section->target_index;
6677
0
      irel->r_type = R_POS;
6678
0
      irel->r_size = reloc_size;
6679
0
      flinfo->section_info[oindx].rel_hashes[osec->reloc_count] = NULL;
6680
0
      ++osec->reloc_count;
6681
6682
0
      if (!xcoff_create_ldrel (output_bfd, flinfo, osec,
6683
0
             output_bfd, irel, tsec, NULL))
6684
0
  return false;
6685
0
    }
6686
6687
0
  if (h->indx >= 0 || flinfo->info->strip == strip_all)
6688
0
    {
6689
0
      BFD_ASSERT (outsym == flinfo->outsyms);
6690
0
      return true;
6691
0
    }
6692
6693
0
  if (h->indx != -2
6694
0
      && (flinfo->info->strip == strip_all
6695
0
    || (flinfo->info->strip == strip_some
6696
0
        && bfd_hash_lookup (flinfo->info->keep_hash, h->root.root.string,
6697
0
          false, false) == NULL)))
6698
0
    {
6699
0
      BFD_ASSERT (outsym == flinfo->outsyms);
6700
0
      return true;
6701
0
    }
6702
6703
0
  if (h->indx != -2
6704
0
      && (h->flags & (XCOFF_REF_REGULAR | XCOFF_DEF_REGULAR)) == 0)
6705
0
    {
6706
0
      BFD_ASSERT (outsym == flinfo->outsyms);
6707
0
      return true;
6708
0
    }
6709
6710
0
  memset (&aux, 0, sizeof aux);
6711
6712
0
  h->indx = obj_raw_syment_count (output_bfd);
6713
6714
0
  result = bfd_xcoff_put_symbol_name (output_bfd, flinfo->info, flinfo->strtab,
6715
0
              &isym, h->root.root.string);
6716
0
  if (!result)
6717
0
    return false;
6718
6719
0
  if (h->root.type == bfd_link_hash_undefined
6720
0
      || h->root.type == bfd_link_hash_undefweak)
6721
0
    {
6722
0
      isym.n_value = 0;
6723
0
      isym.n_scnum = N_UNDEF;
6724
0
      if (h->root.type == bfd_link_hash_undefweak
6725
0
    && C_WEAKEXT == C_AIX_WEAKEXT)
6726
0
  isym.n_sclass = C_WEAKEXT;
6727
0
      else
6728
0
  isym.n_sclass = C_EXT;
6729
0
      aux.x_csect.x_smtyp = XTY_ER;
6730
0
    }
6731
0
  else if ((h->root.type == bfd_link_hash_defined
6732
0
      || h->root.type == bfd_link_hash_defweak)
6733
0
     && h->smclas == XMC_XO)
6734
0
    {
6735
0
      BFD_ASSERT (bfd_is_abs_symbol (&h->root));
6736
0
      isym.n_value = h->root.u.def.value;
6737
0
      isym.n_scnum = N_UNDEF;
6738
0
      if (h->root.type == bfd_link_hash_defweak
6739
0
    && C_WEAKEXT == C_AIX_WEAKEXT)
6740
0
  isym.n_sclass = C_WEAKEXT;
6741
0
      else
6742
0
  isym.n_sclass = C_EXT;
6743
0
      aux.x_csect.x_smtyp = XTY_ER;
6744
0
    }
6745
0
  else if (h->root.type == bfd_link_hash_defined
6746
0
     || h->root.type == bfd_link_hash_defweak)
6747
0
    {
6748
0
      struct xcoff_link_size_list *l;
6749
6750
0
      isym.n_value = (h->root.u.def.section->output_section->vma
6751
0
          + h->root.u.def.section->output_offset
6752
0
          + h->root.u.def.value);
6753
0
      if (bfd_is_abs_section (h->root.u.def.section->output_section))
6754
0
  isym.n_scnum = N_ABS;
6755
0
      else
6756
0
  isym.n_scnum = h->root.u.def.section->output_section->target_index;
6757
0
      isym.n_sclass = C_HIDEXT;
6758
0
      aux.x_csect.x_smtyp = XTY_SD;
6759
6760
      /* For stub symbols, the section already has its correct size.  */
6761
0
      if (h->root.u.def.section->owner == xcoff_hash_table (flinfo->info)->params->stub_bfd)
6762
0
  {
6763
0
    aux.x_csect.x_scnlen.u64 = h->root.u.def.section->size;
6764
0
  }
6765
0
      else if ((h->flags & XCOFF_HAS_SIZE) != 0)
6766
0
  {
6767
0
    for (l = xcoff_hash_table (flinfo->info)->size_list;
6768
0
         l != NULL;
6769
0
         l = l->next)
6770
0
      {
6771
0
        if (l->h == h)
6772
0
    {
6773
0
      aux.x_csect.x_scnlen.u64 = l->size;
6774
0
      break;
6775
0
    }
6776
0
      }
6777
0
  }
6778
0
    }
6779
0
  else if (h->root.type == bfd_link_hash_common)
6780
0
    {
6781
0
      isym.n_value = (h->root.u.c.p->section->output_section->vma
6782
0
          + h->root.u.c.p->section->output_offset);
6783
0
      isym.n_scnum = h->root.u.c.p->section->output_section->target_index;
6784
0
      isym.n_sclass = C_EXT;
6785
0
      aux.x_csect.x_smtyp = XTY_CM;
6786
0
      aux.x_csect.x_scnlen.u64 = h->root.u.c.size;
6787
0
    }
6788
0
  else
6789
0
    abort ();
6790
6791
0
  isym.n_type = T_NULL;
6792
0
  isym.n_numaux = 1;
6793
6794
0
  bfd_coff_swap_sym_out (output_bfd, (void *) &isym, (void *) outsym);
6795
0
  outsym += bfd_coff_symesz (output_bfd);
6796
6797
0
  aux.x_csect.x_smclas = h->smclas;
6798
0
  bfd_coff_swap_aux_out (output_bfd, (void *) &aux, T_NULL, isym.n_sclass, 0, 1,
6799
0
       (void *) outsym);
6800
0
  outsym += bfd_coff_auxesz (output_bfd);
6801
6802
0
  if ((h->root.type == bfd_link_hash_defined
6803
0
       || h->root.type == bfd_link_hash_defweak)
6804
0
      && h->smclas != XMC_XO)
6805
0
    {
6806
      /* We just output an SD symbol.  Now output an LD symbol.  */
6807
0
      h->indx += 2;
6808
6809
0
      if (h->root.type == bfd_link_hash_defweak
6810
0
    && C_WEAKEXT == C_AIX_WEAKEXT)
6811
0
  isym.n_sclass = C_WEAKEXT;
6812
0
      else
6813
0
  isym.n_sclass = C_EXT;
6814
0
      bfd_coff_swap_sym_out (output_bfd, (void *) &isym, (void *) outsym);
6815
0
      outsym += bfd_coff_symesz (output_bfd);
6816
6817
0
      aux.x_csect.x_smtyp = XTY_LD;
6818
0
      aux.x_csect.x_scnlen.u64 = obj_raw_syment_count (output_bfd);
6819
0
      bfd_coff_swap_aux_out (output_bfd, (void *) &aux, T_NULL, C_EXT, 0, 1,
6820
0
           (void *) outsym);
6821
0
      outsym += bfd_coff_auxesz (output_bfd);
6822
0
    }
6823
6824
0
  pos = obj_sym_filepos (output_bfd);
6825
0
  pos += obj_raw_syment_count (output_bfd) * bfd_coff_symesz (output_bfd);
6826
0
  amt = outsym - flinfo->outsyms;
6827
0
  if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
6828
0
      || bfd_write (flinfo->outsyms, amt, output_bfd) != amt)
6829
0
    return false;
6830
0
  obj_raw_syment_count (output_bfd) +=
6831
0
    (outsym - flinfo->outsyms) / bfd_coff_symesz (output_bfd);
6832
6833
0
  return true;
6834
0
}
6835
6836
/* Handle a link order which is supposed to generate a reloc.  */
6837
6838
static bool
6839
xcoff_reloc_link_order (bfd *output_bfd,
6840
      struct xcoff_final_link_info *flinfo,
6841
      asection *output_section,
6842
      struct bfd_link_order *link_order)
6843
0
{
6844
0
  reloc_howto_type *howto;
6845
0
  struct xcoff_link_hash_entry *h;
6846
0
  asection *hsec;
6847
0
  bfd_vma hval;
6848
0
  bfd_vma addend;
6849
0
  struct internal_reloc *irel;
6850
0
  struct xcoff_link_hash_entry **rel_hash_ptr;
6851
6852
0
  if (link_order->type == bfd_section_reloc_link_order)
6853
    /* We need to somehow locate a symbol in the right section.  The
6854
       symbol must either have a value of zero, or we must adjust
6855
       the addend by the value of the symbol.  FIXME: Write this
6856
       when we need it.  The old linker couldn't handle this anyhow.  */
6857
0
    abort ();
6858
6859
0
  howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
6860
0
  if (howto == NULL)
6861
0
    {
6862
0
      bfd_set_error (bfd_error_bad_value);
6863
0
      return false;
6864
0
    }
6865
6866
0
  h = ((struct xcoff_link_hash_entry *)
6867
0
       bfd_wrapped_link_hash_lookup (output_bfd, flinfo->info,
6868
0
             link_order->u.reloc.p->u.name,
6869
0
             false, false, true));
6870
0
  if (h == NULL)
6871
0
    {
6872
0
      (*flinfo->info->callbacks->unattached_reloc)
6873
0
  (flinfo->info, link_order->u.reloc.p->u.name, NULL, NULL, (bfd_vma) 0);
6874
0
      return true;
6875
0
    }
6876
6877
0
  hsec = xcoff_symbol_section (h);
6878
0
  if (h->root.type == bfd_link_hash_defined
6879
0
      || h->root.type == bfd_link_hash_defweak)
6880
0
    hval = h->root.u.def.value;
6881
0
  else
6882
0
    hval = 0;
6883
6884
0
  addend = link_order->u.reloc.p->addend;
6885
0
  if (hsec != NULL)
6886
0
    addend += (hsec->output_section->vma
6887
0
         + hsec->output_offset
6888
0
         + hval);
6889
6890
0
  if (addend != 0)
6891
0
    {
6892
0
      bfd_size_type size;
6893
0
      bfd_byte *buf;
6894
0
      bfd_reloc_status_type rstat;
6895
0
      bool ok;
6896
6897
0
      size = bfd_get_reloc_size (howto);
6898
0
      buf = bfd_zmalloc (size);
6899
0
      if (buf == NULL && size != 0)
6900
0
  return false;
6901
6902
0
      rstat = _bfd_relocate_contents (howto, output_bfd, addend, buf);
6903
0
      switch (rstat)
6904
0
  {
6905
0
  case bfd_reloc_ok:
6906
0
    break;
6907
0
  default:
6908
0
  case bfd_reloc_outofrange:
6909
0
    abort ();
6910
0
  case bfd_reloc_overflow:
6911
0
    (*flinfo->info->callbacks->reloc_overflow)
6912
0
      (flinfo->info, NULL, link_order->u.reloc.p->u.name,
6913
0
       howto->name, addend, NULL, NULL, (bfd_vma) 0);
6914
0
    break;
6915
0
  }
6916
0
      ok = bfd_set_section_contents (output_bfd, output_section, (void *) buf,
6917
0
             (file_ptr) link_order->offset, size);
6918
0
      free (buf);
6919
0
      if (! ok)
6920
0
  return false;
6921
0
    }
6922
6923
  /* Store the reloc information in the right place.  It will get
6924
     swapped and written out at the end of the final_link routine.  */
6925
0
  irel = (flinfo->section_info[output_section->target_index].relocs
6926
0
    + output_section->reloc_count);
6927
0
  rel_hash_ptr = (flinfo->section_info[output_section->target_index].rel_hashes
6928
0
      + output_section->reloc_count);
6929
6930
0
  memset (irel, 0, sizeof (struct internal_reloc));
6931
0
  *rel_hash_ptr = NULL;
6932
6933
0
  irel->r_vaddr = output_section->vma + link_order->offset;
6934
6935
0
  if (h->indx >= 0)
6936
0
    irel->r_symndx = h->indx;
6937
0
  else
6938
0
    {
6939
      /* Set the index to -2 to force this symbol to get written out.  */
6940
0
      h->indx = -2;
6941
0
      *rel_hash_ptr = h;
6942
0
      irel->r_symndx = 0;
6943
0
    }
6944
6945
0
  irel->r_type = howto->type;
6946
0
  irel->r_size = howto->bitsize - 1;
6947
0
  if (howto->complain_on_overflow == complain_overflow_signed)
6948
0
    irel->r_size |= 0x80;
6949
6950
0
  ++output_section->reloc_count;
6951
6952
  /* Now output the reloc to the .loader section.  */
6953
0
  if (xcoff_hash_table (flinfo->info)->loader_section)
6954
0
    {
6955
0
      if (!xcoff_create_ldrel (output_bfd, flinfo, output_section,
6956
0
             output_bfd, irel, hsec, h))
6957
0
  return false;
6958
0
    }
6959
6960
0
  return true;
6961
0
}
6962
6963
/* Do the final link step.  */
6964
6965
bool
6966
_bfd_xcoff_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
6967
0
{
6968
0
  bfd_size_type symesz;
6969
0
  struct xcoff_final_link_info flinfo;
6970
0
  asection *o;
6971
0
  struct bfd_link_order *p;
6972
0
  bfd_size_type max_contents_size;
6973
0
  bfd_size_type max_sym_count;
6974
0
  bfd_size_type max_lineno_count;
6975
0
  bfd_size_type max_reloc_count;
6976
0
  bfd_size_type max_output_reloc_count;
6977
0
  file_ptr rel_filepos;
6978
0
  unsigned int relsz;
6979
0
  file_ptr line_filepos;
6980
0
  unsigned int linesz;
6981
0
  bfd *sub;
6982
0
  bfd_byte *external_relocs = NULL;
6983
0
  char strbuf[STRING_SIZE_SIZE];
6984
0
  file_ptr pos;
6985
0
  bfd_size_type amt;
6986
6987
0
  if (bfd_link_pic (info))
6988
0
    abfd->flags |= DYNAMIC;
6989
6990
0
  symesz = bfd_coff_symesz (abfd);
6991
6992
0
  flinfo.info = info;
6993
0
  flinfo.output_bfd = abfd;
6994
0
  flinfo.strtab = NULL;
6995
0
  flinfo.section_info = NULL;
6996
0
  flinfo.last_file_index = -1;
6997
0
  flinfo.toc_symindx = -1;
6998
0
  flinfo.internal_syms = NULL;
6999
0
  flinfo.sym_indices = NULL;
7000
0
  flinfo.outsyms = NULL;
7001
0
  flinfo.linenos = NULL;
7002
0
  flinfo.contents = NULL;
7003
0
  flinfo.external_relocs = NULL;
7004
7005
0
  if (xcoff_hash_table (info)->loader_section)
7006
0
    {
7007
0
      flinfo.ldsym = (xcoff_hash_table (info)->loader_section->contents
7008
0
         + bfd_xcoff_ldhdrsz (abfd));
7009
0
      flinfo.ldrel = (xcoff_hash_table (info)->loader_section->contents
7010
0
         + bfd_xcoff_ldhdrsz (abfd)
7011
0
         + (xcoff_hash_table (info)->ldhdr.l_nsyms
7012
0
      * bfd_xcoff_ldsymsz (abfd)));
7013
0
    }
7014
0
  else
7015
0
    {
7016
0
      flinfo.ldsym = NULL;
7017
0
      flinfo.ldrel = NULL;
7018
0
    }
7019
7020
0
  xcoff_data (abfd)->coff.link_info = info;
7021
7022
0
  flinfo.strtab = _bfd_stringtab_init ();
7023
0
  if (flinfo.strtab == NULL)
7024
0
    goto error_return;
7025
7026
  /* Count the relocation entries required for the output file.
7027
     (We've already counted the line numbers.)  Determine a few
7028
     maximum sizes.  */
7029
0
  max_contents_size = 0;
7030
0
  max_lineno_count = 0;
7031
0
  max_reloc_count = 0;
7032
0
  for (o = abfd->sections; o != NULL; o = o->next)
7033
0
    {
7034
0
      o->reloc_count = 0;
7035
0
      for (p = o->map_head.link_order; p != NULL; p = p->next)
7036
0
  {
7037
0
    if (p->type == bfd_indirect_link_order)
7038
0
      {
7039
0
        asection *sec;
7040
7041
0
        sec = p->u.indirect.section;
7042
7043
        /* Mark all sections which are to be included in the
7044
     link.  This will normally be every section.  We need
7045
     to do this so that we can identify any sections which
7046
     the linker has decided to not include.  */
7047
0
        sec->linker_mark = true;
7048
7049
0
        o->reloc_count += sec->reloc_count;
7050
7051
0
        if ((sec->flags & SEC_IN_MEMORY) == 0)
7052
0
    {
7053
0
      if (sec->rawsize > max_contents_size)
7054
0
        max_contents_size = sec->rawsize;
7055
0
      if (sec->size > max_contents_size)
7056
0
        max_contents_size = sec->size;
7057
0
    }
7058
0
        if (coff_section_data (sec->owner, sec) != NULL
7059
0
      && xcoff_section_data (sec->owner, sec) != NULL
7060
0
      && (xcoff_section_data (sec->owner, sec)->lineno_count
7061
0
          > max_lineno_count))
7062
0
    max_lineno_count =
7063
0
      xcoff_section_data (sec->owner, sec)->lineno_count;
7064
0
        if (sec->reloc_count > max_reloc_count)
7065
0
    max_reloc_count = sec->reloc_count;
7066
0
      }
7067
0
    else if (p->type == bfd_section_reloc_link_order
7068
0
       || p->type == bfd_symbol_reloc_link_order)
7069
0
      ++o->reloc_count;
7070
0
  }
7071
0
    }
7072
7073
  /* Compute the file positions for all the sections.  */
7074
0
  if (abfd->output_has_begun)
7075
0
    {
7076
0
      if (xcoff_hash_table (info)->file_align != 0)
7077
0
  abort ();
7078
0
    }
7079
0
  else
7080
0
    {
7081
0
      bfd_vma file_align;
7082
7083
0
      file_align = xcoff_hash_table (info)->file_align;
7084
0
      if (file_align != 0)
7085
0
  {
7086
0
    bool saw_contents;
7087
0
    int indx;
7088
0
    file_ptr sofar;
7089
7090
    /* Insert .pad sections before every section which has
7091
       contents and is loaded, if it is preceded by some other
7092
       section which has contents and is loaded.  */
7093
0
    saw_contents = true;
7094
0
    for (o = abfd->sections; o != NULL; o = o->next)
7095
0
      {
7096
0
        if (strcmp (o->name, ".pad") == 0)
7097
0
    saw_contents = false;
7098
0
        else if ((o->flags & SEC_HAS_CONTENTS) != 0
7099
0
           && (o->flags & SEC_LOAD) != 0)
7100
0
    {
7101
0
      if (! saw_contents)
7102
0
        saw_contents = true;
7103
0
      else
7104
0
        {
7105
0
          asection *n;
7106
7107
          /* Create a pad section and place it before the section
7108
       that needs padding.  This requires unlinking and
7109
       relinking the bfd's section list.  */
7110
7111
0
          n = bfd_make_section_anyway_with_flags (abfd, ".pad",
7112
0
                    SEC_HAS_CONTENTS);
7113
0
          n->alignment_power = 0;
7114
7115
0
          bfd_section_list_remove (abfd, n);
7116
0
          bfd_section_list_insert_before (abfd, o, n);
7117
0
          saw_contents = false;
7118
0
        }
7119
0
    }
7120
0
      }
7121
7122
    /* Reset the section indices after inserting the new
7123
       sections.  */
7124
0
    if (xcoff_data (abfd)->coff.section_by_target_index)
7125
0
      htab_empty (xcoff_data (abfd)->coff.section_by_target_index);
7126
0
    indx = 0;
7127
0
    for (o = abfd->sections; o != NULL; o = o->next)
7128
0
      {
7129
0
        ++indx;
7130
0
        o->target_index = indx;
7131
0
      }
7132
0
    BFD_ASSERT ((unsigned int) indx == abfd->section_count);
7133
7134
    /* Work out appropriate sizes for the .pad sections to force
7135
       each section to land on a page boundary.  This bit of
7136
       code knows what compute_section_file_positions is going
7137
       to do.  */
7138
0
    sofar = bfd_coff_filhsz (abfd);
7139
0
    sofar += bfd_coff_aoutsz (abfd);
7140
0
    sofar += abfd->section_count * bfd_coff_scnhsz (abfd);
7141
0
    for (o = abfd->sections; o != NULL; o = o->next)
7142
0
      if ((bfd_xcoff_is_reloc_count_overflow
7143
0
     (abfd, (bfd_vma) o->reloc_count))
7144
0
    || (bfd_xcoff_is_lineno_count_overflow
7145
0
        (abfd, (bfd_vma) o->lineno_count)))
7146
        /* 64 does not overflow, need to check if 32 does */
7147
0
        sofar += bfd_coff_scnhsz (abfd);
7148
7149
0
    for (o = abfd->sections; o != NULL; o = o->next)
7150
0
      {
7151
0
        if (strcmp (o->name, ".pad") == 0)
7152
0
    {
7153
0
      bfd_vma pageoff;
7154
7155
0
      BFD_ASSERT (o->size == 0);
7156
0
      pageoff = sofar & (file_align - 1);
7157
0
      if (pageoff != 0)
7158
0
        {
7159
0
          o->size = file_align - pageoff;
7160
0
          sofar += file_align - pageoff;
7161
0
          o->flags |= SEC_HAS_CONTENTS;
7162
0
        }
7163
0
    }
7164
0
        else
7165
0
    {
7166
0
      if ((o->flags & SEC_HAS_CONTENTS) != 0)
7167
0
        sofar += BFD_ALIGN (o->size,
7168
0
          1 << o->alignment_power);
7169
0
    }
7170
0
      }
7171
0
  }
7172
7173
0
      if (! bfd_coff_compute_section_file_positions (abfd))
7174
0
  goto error_return;
7175
0
    }
7176
7177
  /* Allocate space for the pointers we need to keep for the relocs.  */
7178
0
  {
7179
0
    unsigned int i;
7180
7181
    /* We use section_count + 1, rather than section_count, because
7182
       the target_index fields are 1 based.  */
7183
0
    amt = abfd->section_count + 1;
7184
0
    amt *= sizeof (struct xcoff_link_section_info);
7185
0
    flinfo.section_info = bfd_malloc (amt);
7186
0
    if (flinfo.section_info == NULL)
7187
0
      goto error_return;
7188
0
    for (i = 0; i <= abfd->section_count; i++)
7189
0
      {
7190
0
  flinfo.section_info[i].relocs = NULL;
7191
0
  flinfo.section_info[i].rel_hashes = NULL;
7192
0
  flinfo.section_info[i].toc_rel_hashes = NULL;
7193
0
      }
7194
0
  }
7195
7196
  /* Set the file positions for the relocs.  */
7197
0
  rel_filepos = obj_relocbase (abfd);
7198
0
  relsz = bfd_coff_relsz (abfd);
7199
0
  max_output_reloc_count = 0;
7200
0
  for (o = abfd->sections; o != NULL; o = o->next)
7201
0
    {
7202
0
      if (o->reloc_count == 0)
7203
0
  o->rel_filepos = 0;
7204
0
      else
7205
0
  {
7206
    /* A stripped file has no relocs.  However, we still
7207
       allocate the buffers, so that later code doesn't have to
7208
       worry about whether we are stripping or not.  */
7209
0
    if (info->strip == strip_all)
7210
0
      o->rel_filepos = 0;
7211
0
    else
7212
0
      {
7213
0
        o->flags |= SEC_RELOC;
7214
0
        o->rel_filepos = rel_filepos;
7215
0
        rel_filepos += o->reloc_count * relsz;
7216
0
      }
7217
7218
    /* We don't know the indices of global symbols until we have
7219
       written out all the local symbols.  For each section in
7220
       the output file, we keep an array of pointers to hash
7221
       table entries.  Each entry in the array corresponds to a
7222
       reloc.  When we find a reloc against a global symbol, we
7223
       set the corresponding entry in this array so that we can
7224
       fix up the symbol index after we have written out all the
7225
       local symbols.
7226
7227
       Because of this problem, we also keep the relocs in
7228
       memory until the end of the link.  This wastes memory.
7229
       We could backpatch the file later, I suppose, although it
7230
       would be slow.  */
7231
0
    amt = o->reloc_count;
7232
0
    amt *= sizeof (struct internal_reloc);
7233
0
    flinfo.section_info[o->target_index].relocs = bfd_malloc (amt);
7234
7235
0
    amt = o->reloc_count;
7236
0
    amt *= sizeof (struct xcoff_link_hash_entry *);
7237
0
    flinfo.section_info[o->target_index].rel_hashes = bfd_malloc (amt);
7238
7239
0
    if (flinfo.section_info[o->target_index].relocs == NULL
7240
0
        || flinfo.section_info[o->target_index].rel_hashes == NULL)
7241
0
      goto error_return;
7242
7243
0
    if (o->reloc_count > max_output_reloc_count)
7244
0
      max_output_reloc_count = o->reloc_count;
7245
0
  }
7246
0
    }
7247
7248
  /* We now know the size of the relocs, so we can determine the file
7249
     positions of the line numbers.  */
7250
0
  line_filepos = rel_filepos;
7251
0
  flinfo.line_filepos = line_filepos;
7252
0
  linesz = bfd_coff_linesz (abfd);
7253
0
  for (o = abfd->sections; o != NULL; o = o->next)
7254
0
    {
7255
0
      if (o->lineno_count == 0)
7256
0
  o->line_filepos = 0;
7257
0
      else
7258
0
  {
7259
0
    o->line_filepos = line_filepos;
7260
0
    line_filepos += o->lineno_count * linesz;
7261
0
  }
7262
7263
      /* Reset the reloc and lineno counts, so that we can use them to
7264
   count the number of entries we have output so far.  */
7265
0
      o->reloc_count = 0;
7266
0
      o->lineno_count = 0;
7267
0
    }
7268
7269
0
  obj_sym_filepos (abfd) = line_filepos;
7270
7271
  /* Figure out the largest number of symbols in an input BFD.  Take
7272
     the opportunity to clear the output_has_begun fields of all the
7273
     input BFD's.  We want at least 6 symbols, since that is the
7274
     number which xcoff_write_global_symbol may need.  */
7275
0
  max_sym_count = 6;
7276
0
  for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
7277
0
    {
7278
0
      bfd_size_type sz;
7279
7280
0
      sub->output_has_begun = false;
7281
0
      sz = obj_raw_syment_count (sub);
7282
0
      if (sz > max_sym_count)
7283
0
  max_sym_count = sz;
7284
0
    }
7285
7286
  /* Allocate some buffers used while linking.  */
7287
0
  amt = max_sym_count * sizeof (struct internal_syment);
7288
0
  flinfo.internal_syms = bfd_malloc (amt);
7289
7290
0
  amt = max_sym_count * sizeof (long);
7291
0
  flinfo.sym_indices = bfd_malloc (amt);
7292
7293
0
  amt = (max_sym_count + 1) * symesz;
7294
0
  flinfo.outsyms = bfd_malloc (amt);
7295
7296
0
  amt = max_lineno_count * bfd_coff_linesz (abfd);
7297
0
  flinfo.linenos = bfd_malloc (amt);
7298
7299
0
  amt = max_contents_size;
7300
0
  flinfo.contents = bfd_malloc (amt);
7301
7302
0
  amt = max_reloc_count * relsz;
7303
0
  flinfo.external_relocs = bfd_malloc (amt);
7304
7305
0
  if ((flinfo.internal_syms == NULL && max_sym_count > 0)
7306
0
      || (flinfo.sym_indices == NULL && max_sym_count > 0)
7307
0
      || flinfo.outsyms == NULL
7308
0
      || (flinfo.linenos == NULL && max_lineno_count > 0)
7309
0
      || (flinfo.contents == NULL && max_contents_size > 0)
7310
0
      || (flinfo.external_relocs == NULL && max_reloc_count > 0))
7311
0
    goto error_return;
7312
7313
0
  obj_raw_syment_count (abfd) = 0;
7314
7315
  /* Find a TOC symbol, if we need one.  */
7316
0
  if (!xcoff_find_tc0 (abfd, &flinfo))
7317
0
    goto error_return;
7318
7319
  /* We now know the position of everything in the file, except that
7320
     we don't know the size of the symbol table and therefore we don't
7321
     know where the string table starts.  We just build the string
7322
     table in memory as we go along.  We process all the relocations
7323
     for a single input file at once.  */
7324
0
  for (o = abfd->sections; o != NULL; o = o->next)
7325
0
    {
7326
0
      for (p = o->map_head.link_order; p != NULL; p = p->next)
7327
0
  {
7328
0
    if (p->type == bfd_indirect_link_order
7329
0
        && p->u.indirect.section->owner->xvec == abfd->xvec)
7330
0
      {
7331
0
        sub = p->u.indirect.section->owner;
7332
0
        if (! sub->output_has_begun)
7333
0
    {
7334
0
      if (sub == xcoff_hash_table (info)->params->stub_bfd)
7335
0
        {
7336
0
          continue;
7337
0
        }
7338
0
      else
7339
0
        {
7340
0
          if (! xcoff_link_input_bfd (&flinfo, sub))
7341
0
      {
7342
0
        _bfd_error_handler
7343
0
          (_("Unable to link input file: %s"), sub->filename);
7344
0
        bfd_set_error (bfd_error_sorry);
7345
0
        goto error_return;
7346
0
      }
7347
0
        }
7348
0
      sub->output_has_begun = true;
7349
0
    }
7350
0
      }
7351
0
    else if (p->type == bfd_section_reloc_link_order
7352
0
       || p->type == bfd_symbol_reloc_link_order)
7353
0
      {
7354
0
        if (! xcoff_reloc_link_order (abfd, &flinfo, o, p))
7355
0
    goto error_return;
7356
0
      }
7357
0
    else
7358
0
      {
7359
0
        if (! _bfd_default_link_order (abfd, info, o, p))
7360
0
    goto error_return;
7361
0
      }
7362
0
  }
7363
0
    }
7364
7365
  /* Free up the buffers used by xcoff_link_input_bfd.  */
7366
0
  free (flinfo.internal_syms);
7367
0
  flinfo.internal_syms = NULL;
7368
0
  free (flinfo.sym_indices);
7369
0
  flinfo.sym_indices = NULL;
7370
0
  free (flinfo.linenos);
7371
0
  flinfo.linenos = NULL;
7372
0
  free (flinfo.contents);
7373
0
  flinfo.contents = NULL;
7374
0
  free (flinfo.external_relocs);
7375
0
  flinfo.external_relocs = NULL;
7376
7377
  /* The value of the last C_FILE symbol is supposed to be -1.  Write
7378
     it out again.  */
7379
0
  if (flinfo.last_file_index != -1)
7380
0
    {
7381
0
      flinfo.last_file.n_value = -(bfd_vma) 1;
7382
0
      bfd_coff_swap_sym_out (abfd, (void *) &flinfo.last_file,
7383
0
           (void *) flinfo.outsyms);
7384
0
      pos = obj_sym_filepos (abfd) + flinfo.last_file_index * symesz;
7385
0
      if (bfd_seek (abfd, pos, SEEK_SET) != 0
7386
0
    || bfd_write (flinfo.outsyms, symesz, abfd) != symesz)
7387
0
  goto error_return;
7388
0
    }
7389
7390
  /* Write out all the global symbols which do not come from XCOFF
7391
     input files.  */
7392
0
  bfd_hash_traverse (&info->hash->table, xcoff_write_global_symbol, &flinfo);
7393
7394
  /* Write out the relocations created by stub entries. The symbols
7395
     will have been already written by xcoff_write_global_symbol.  */
7396
0
  bfd_hash_traverse (&xcoff_hash_table(info)->stub_hash_table,
7397
0
         xcoff_stub_create_relocations,
7398
0
         &flinfo);
7399
7400
0
  free (flinfo.outsyms);
7401
0
  flinfo.outsyms = NULL;
7402
7403
  /* Now that we have written out all the global symbols, we know the
7404
     symbol indices to use for relocs against them, and we can finally
7405
     write out the relocs.  */
7406
0
  amt = max_output_reloc_count * relsz;
7407
0
  external_relocs = bfd_malloc (amt);
7408
0
  if (external_relocs == NULL && max_output_reloc_count != 0)
7409
0
    goto error_return;
7410
7411
0
  for (o = abfd->sections; o != NULL; o = o->next)
7412
0
    {
7413
0
      struct internal_reloc *irel;
7414
0
      struct internal_reloc *irelend;
7415
0
      struct xcoff_link_hash_entry **rel_hash;
7416
0
      struct xcoff_toc_rel_hash *toc_rel_hash;
7417
0
      bfd_byte *erel;
7418
0
      bfd_size_type rel_size;
7419
7420
      /* A stripped file has no relocs.  */
7421
0
      if (info->strip == strip_all)
7422
0
  {
7423
0
    o->reloc_count = 0;
7424
0
    continue;
7425
0
  }
7426
7427
0
      if (o->reloc_count == 0)
7428
0
  continue;
7429
7430
0
      irel = flinfo.section_info[o->target_index].relocs;
7431
0
      irelend = irel + o->reloc_count;
7432
0
      rel_hash = flinfo.section_info[o->target_index].rel_hashes;
7433
0
      for (; irel < irelend; irel++, rel_hash++)
7434
0
  {
7435
0
    if (*rel_hash != NULL)
7436
0
      {
7437
0
        if ((*rel_hash)->indx < 0)
7438
0
    {
7439
0
      (*info->callbacks->unattached_reloc)
7440
0
        (info, (*rel_hash)->root.root.string,
7441
0
         NULL, o, irel->r_vaddr);
7442
0
      (*rel_hash)->indx = 0;
7443
0
    }
7444
0
        irel->r_symndx = (*rel_hash)->indx;
7445
0
      }
7446
0
  }
7447
7448
0
      for (toc_rel_hash = flinfo.section_info[o->target_index].toc_rel_hashes;
7449
0
     toc_rel_hash != NULL;
7450
0
     toc_rel_hash = toc_rel_hash->next)
7451
0
  {
7452
0
    if (toc_rel_hash->h->u.toc_indx < 0)
7453
0
      {
7454
0
        (*info->callbacks->unattached_reloc)
7455
0
    (info, toc_rel_hash->h->root.root.string,
7456
0
     NULL, o, toc_rel_hash->rel->r_vaddr);
7457
0
        toc_rel_hash->h->u.toc_indx = 0;
7458
0
      }
7459
0
    toc_rel_hash->rel->r_symndx = toc_rel_hash->h->u.toc_indx;
7460
0
  }
7461
7462
      /* XCOFF requires that the relocs be sorted by address.  We tend
7463
   to produce them in the order in which their containing csects
7464
   appear in the symbol table, which is not necessarily by
7465
   address.  So we sort them here.  There may be a better way to
7466
   do this.  */
7467
0
      qsort ((void *) flinfo.section_info[o->target_index].relocs,
7468
0
       o->reloc_count, sizeof (struct internal_reloc),
7469
0
       xcoff_sort_relocs);
7470
7471
0
      irel = flinfo.section_info[o->target_index].relocs;
7472
0
      irelend = irel + o->reloc_count;
7473
0
      erel = external_relocs;
7474
0
      for (; irel < irelend; irel++, rel_hash++, erel += relsz)
7475
0
  bfd_coff_swap_reloc_out (abfd, (void *) irel, (void *) erel);
7476
7477
0
      rel_size = relsz * o->reloc_count;
7478
0
      if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0
7479
0
    || bfd_write (external_relocs, rel_size, abfd) != rel_size)
7480
0
  goto error_return;
7481
0
    }
7482
7483
0
  free (external_relocs);
7484
0
  external_relocs = NULL;
7485
7486
  /* Free up the section information.  */
7487
0
  if (flinfo.section_info != NULL)
7488
0
    {
7489
0
      unsigned int i;
7490
7491
0
      for (i = 0; i < abfd->section_count; i++)
7492
0
  {
7493
0
    free (flinfo.section_info[i].relocs);
7494
0
    free (flinfo.section_info[i].rel_hashes);
7495
0
  }
7496
0
      free (flinfo.section_info);
7497
0
      flinfo.section_info = NULL;
7498
0
    }
7499
7500
  /* Write out the stub sections.  */
7501
0
  for (o = xcoff_hash_table (info)->params->stub_bfd->sections;
7502
0
       o != NULL; o = o->next)
7503
0
    {
7504
0
      if ((o->flags & SEC_HAS_CONTENTS) == 0
7505
0
    || o->size == 0)
7506
0
  continue;
7507
7508
0
      if (!bfd_set_section_contents (abfd, o->output_section, o->contents,
7509
0
             (file_ptr) o->output_offset, o->size))
7510
0
  goto error_return;
7511
0
    }
7512
7513
  /* Write out the loader section contents.  */
7514
0
  o = xcoff_hash_table (info)->loader_section;
7515
0
  if (o != NULL
7516
0
      && o->size != 0
7517
0
      && o->output_section != bfd_abs_section_ptr)
7518
0
    {
7519
0
      BFD_ASSERT ((bfd_byte *) flinfo.ldrel
7520
0
      == (xcoff_hash_table (info)->loader_section->contents
7521
0
          + xcoff_hash_table (info)->ldhdr.l_impoff));
7522
0
      if (!bfd_set_section_contents (abfd, o->output_section, o->contents,
7523
0
             (file_ptr) o->output_offset, o->size))
7524
0
  goto error_return;
7525
0
    }
7526
7527
  /* Write out the magic sections.  */
7528
0
  o = xcoff_hash_table (info)->linkage_section;
7529
0
  if (o != NULL
7530
0
      && o->size != 0
7531
0
      && o->output_section != bfd_abs_section_ptr
7532
0
      && ! bfd_set_section_contents (abfd, o->output_section, o->contents,
7533
0
             (file_ptr) o->output_offset,
7534
0
             o->size))
7535
0
    goto error_return;
7536
0
  o = xcoff_hash_table (info)->toc_section;
7537
0
  if (o != NULL
7538
0
      && o->size != 0
7539
0
      && o->output_section != bfd_abs_section_ptr
7540
0
      && ! bfd_set_section_contents (abfd, o->output_section, o->contents,
7541
0
             (file_ptr) o->output_offset,
7542
0
             o->size))
7543
0
    goto error_return;
7544
0
  o = xcoff_hash_table (info)->descriptor_section;
7545
0
  if (o != NULL
7546
0
      && o->size != 0
7547
0
      && o->output_section != bfd_abs_section_ptr
7548
0
      && ! bfd_set_section_contents (abfd, o->output_section, o->contents,
7549
0
             (file_ptr) o->output_offset,
7550
0
             o->size))
7551
0
    goto error_return;
7552
7553
  /* Write out the string table.  */
7554
0
  pos = obj_sym_filepos (abfd) + obj_raw_syment_count (abfd) * symesz;
7555
0
  if (bfd_seek (abfd, pos, SEEK_SET) != 0)
7556
0
    goto error_return;
7557
0
  H_PUT_32 (abfd,
7558
0
      _bfd_stringtab_size (flinfo.strtab) + STRING_SIZE_SIZE,
7559
0
      strbuf);
7560
0
  amt = STRING_SIZE_SIZE;
7561
0
  if (bfd_write (strbuf, amt, abfd) != amt)
7562
0
    goto error_return;
7563
0
  if (! _bfd_stringtab_emit (abfd, flinfo.strtab))
7564
0
    goto error_return;
7565
7566
0
  _bfd_stringtab_free (flinfo.strtab);
7567
7568
  /* Write out the debugging string table.  */
7569
0
  o = xcoff_hash_table (info)->debug_section;
7570
0
  if (o != NULL
7571
0
      && o->size != 0
7572
0
      && o->output_section != bfd_abs_section_ptr)
7573
0
    {
7574
0
      struct bfd_strtab_hash *debug_strtab;
7575
7576
0
      debug_strtab = xcoff_hash_table (info)->debug_strtab;
7577
0
      BFD_ASSERT (o->output_section->size - o->output_offset
7578
0
      >= _bfd_stringtab_size (debug_strtab));
7579
0
      pos = o->output_section->filepos + o->output_offset;
7580
0
      if (bfd_seek (abfd, pos, SEEK_SET) != 0)
7581
0
  goto error_return;
7582
0
      if (! _bfd_stringtab_emit (abfd, debug_strtab))
7583
0
  goto error_return;
7584
0
    }
7585
7586
  /* Setting symcount to 0 will cause write_object_contents to
7587
     not try to write out the symbols.  */
7588
0
  abfd->symcount = 0;
7589
7590
0
  return true;
7591
7592
0
 error_return:
7593
0
  if (flinfo.strtab != NULL)
7594
0
    _bfd_stringtab_free (flinfo.strtab);
7595
7596
0
  if (flinfo.section_info != NULL)
7597
0
    {
7598
0
      unsigned int i;
7599
7600
0
      for (i = 0; i < abfd->section_count; i++)
7601
0
  {
7602
0
    free (flinfo.section_info[i].relocs);
7603
0
    free (flinfo.section_info[i].rel_hashes);
7604
0
  }
7605
0
      free (flinfo.section_info);
7606
0
    }
7607
7608
0
  free (flinfo.internal_syms);
7609
0
  free (flinfo.sym_indices);
7610
0
  free (flinfo.outsyms);
7611
0
  free (flinfo.linenos);
7612
0
  free (flinfo.contents);
7613
0
  free (flinfo.external_relocs);
7614
0
  free (external_relocs);
7615
0
  return false;
7616
0
}