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