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