]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elf.c
x86: reduce amount of various VCVT* templates
[thirdparty/binutils-gdb.git] / bfd / elf.c
CommitLineData
252b5132 1/* ELF executable support for BFD.
340b6d91 2
b3adc24a 3 Copyright (C) 1993-2020 Free Software Foundation, Inc.
252b5132 4
5e8d7549 5 This file is part of BFD, the Binary File Descriptor library.
252b5132 6
5e8d7549
NC
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
cd123cb7 9 the Free Software Foundation; either version 3 of the License, or
5e8d7549 10 (at your option) any later version.
252b5132 11
5e8d7549
NC
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.
252b5132 16
5e8d7549 17 You should have received a copy of the GNU General Public License
b34976b6 18 along with this program; if not, write to the Free Software
cd123cb7
NC
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
21
252b5132 22
1b74d094
BW
23/*
24SECTION
252b5132
RH
25 ELF backends
26
27 BFD support for ELF formats is being worked on.
28 Currently, the best supported back ends are for sparc and i386
29 (running svr4 or Solaris 2).
30
31 Documentation of the internals of the support code still needs
32 to be written. The code is changing quickly enough that we
661a3fd4 33 haven't bothered yet. */
252b5132 34
7ee38065
MS
35/* For sparc64-cross-sparc32. */
36#define _SYSCALL32
252b5132 37#include "sysdep.h"
3a551c7a 38#include <limits.h>
3db64b00 39#include "bfd.h"
252b5132
RH
40#include "bfdlink.h"
41#include "libbfd.h"
42#define ARCH_SIZE 0
43#include "elf-bfd.h"
e0e8c97f 44#include "libiberty.h"
ff59fc36 45#include "safe-ctype.h"
de64ce13 46#include "elf-linux-core.h"
252b5132 47
8bc7f138
L
48#ifdef CORE_HEADER
49#include CORE_HEADER
50#endif
51
217aa764 52static int elf_sort_sections (const void *, const void *);
c84fca4d 53static bfd_boolean assign_file_positions_except_relocs (bfd *, struct bfd_link_info *);
ef10c3ac 54static bfd_boolean swap_out_syms (bfd *, struct elf_strtab_hash **, int) ;
718175fa 55static bfd_boolean elf_parse_notes (bfd *abfd, char *buf, size_t size,
276da9b3 56 file_ptr offset, size_t align);
50b2bdb7 57
252b5132
RH
58/* Swap version information in and out. The version information is
59 currently size independent. If that ever changes, this code will
60 need to move into elfcode.h. */
61
62/* Swap in a Verdef structure. */
63
64void
217aa764
AM
65_bfd_elf_swap_verdef_in (bfd *abfd,
66 const Elf_External_Verdef *src,
67 Elf_Internal_Verdef *dst)
252b5132 68{
dc810e39
AM
69 dst->vd_version = H_GET_16 (abfd, src->vd_version);
70 dst->vd_flags = H_GET_16 (abfd, src->vd_flags);
71 dst->vd_ndx = H_GET_16 (abfd, src->vd_ndx);
72 dst->vd_cnt = H_GET_16 (abfd, src->vd_cnt);
73 dst->vd_hash = H_GET_32 (abfd, src->vd_hash);
74 dst->vd_aux = H_GET_32 (abfd, src->vd_aux);
75 dst->vd_next = H_GET_32 (abfd, src->vd_next);
252b5132
RH
76}
77
78/* Swap out a Verdef structure. */
79
80void
217aa764
AM
81_bfd_elf_swap_verdef_out (bfd *abfd,
82 const Elf_Internal_Verdef *src,
83 Elf_External_Verdef *dst)
252b5132 84{
dc810e39
AM
85 H_PUT_16 (abfd, src->vd_version, dst->vd_version);
86 H_PUT_16 (abfd, src->vd_flags, dst->vd_flags);
87 H_PUT_16 (abfd, src->vd_ndx, dst->vd_ndx);
88 H_PUT_16 (abfd, src->vd_cnt, dst->vd_cnt);
89 H_PUT_32 (abfd, src->vd_hash, dst->vd_hash);
90 H_PUT_32 (abfd, src->vd_aux, dst->vd_aux);
91 H_PUT_32 (abfd, src->vd_next, dst->vd_next);
252b5132
RH
92}
93
94/* Swap in a Verdaux structure. */
95
96void
217aa764
AM
97_bfd_elf_swap_verdaux_in (bfd *abfd,
98 const Elf_External_Verdaux *src,
99 Elf_Internal_Verdaux *dst)
252b5132 100{
dc810e39
AM
101 dst->vda_name = H_GET_32 (abfd, src->vda_name);
102 dst->vda_next = H_GET_32 (abfd, src->vda_next);
252b5132
RH
103}
104
105/* Swap out a Verdaux structure. */
106
107void
217aa764
AM
108_bfd_elf_swap_verdaux_out (bfd *abfd,
109 const Elf_Internal_Verdaux *src,
110 Elf_External_Verdaux *dst)
252b5132 111{
dc810e39
AM
112 H_PUT_32 (abfd, src->vda_name, dst->vda_name);
113 H_PUT_32 (abfd, src->vda_next, dst->vda_next);
252b5132
RH
114}
115
116/* Swap in a Verneed structure. */
117
118void
217aa764
AM
119_bfd_elf_swap_verneed_in (bfd *abfd,
120 const Elf_External_Verneed *src,
121 Elf_Internal_Verneed *dst)
252b5132 122{
dc810e39
AM
123 dst->vn_version = H_GET_16 (abfd, src->vn_version);
124 dst->vn_cnt = H_GET_16 (abfd, src->vn_cnt);
125 dst->vn_file = H_GET_32 (abfd, src->vn_file);
126 dst->vn_aux = H_GET_32 (abfd, src->vn_aux);
127 dst->vn_next = H_GET_32 (abfd, src->vn_next);
252b5132
RH
128}
129
130/* Swap out a Verneed structure. */
131
132void
217aa764
AM
133_bfd_elf_swap_verneed_out (bfd *abfd,
134 const Elf_Internal_Verneed *src,
135 Elf_External_Verneed *dst)
252b5132 136{
dc810e39
AM
137 H_PUT_16 (abfd, src->vn_version, dst->vn_version);
138 H_PUT_16 (abfd, src->vn_cnt, dst->vn_cnt);
139 H_PUT_32 (abfd, src->vn_file, dst->vn_file);
140 H_PUT_32 (abfd, src->vn_aux, dst->vn_aux);
141 H_PUT_32 (abfd, src->vn_next, dst->vn_next);
252b5132
RH
142}
143
144/* Swap in a Vernaux structure. */
145
146void
217aa764
AM
147_bfd_elf_swap_vernaux_in (bfd *abfd,
148 const Elf_External_Vernaux *src,
149 Elf_Internal_Vernaux *dst)
252b5132 150{
dc810e39
AM
151 dst->vna_hash = H_GET_32 (abfd, src->vna_hash);
152 dst->vna_flags = H_GET_16 (abfd, src->vna_flags);
153 dst->vna_other = H_GET_16 (abfd, src->vna_other);
154 dst->vna_name = H_GET_32 (abfd, src->vna_name);
155 dst->vna_next = H_GET_32 (abfd, src->vna_next);
252b5132
RH
156}
157
158/* Swap out a Vernaux structure. */
159
160void
217aa764
AM
161_bfd_elf_swap_vernaux_out (bfd *abfd,
162 const Elf_Internal_Vernaux *src,
163 Elf_External_Vernaux *dst)
252b5132 164{
dc810e39
AM
165 H_PUT_32 (abfd, src->vna_hash, dst->vna_hash);
166 H_PUT_16 (abfd, src->vna_flags, dst->vna_flags);
167 H_PUT_16 (abfd, src->vna_other, dst->vna_other);
168 H_PUT_32 (abfd, src->vna_name, dst->vna_name);
169 H_PUT_32 (abfd, src->vna_next, dst->vna_next);
252b5132
RH
170}
171
172/* Swap in a Versym structure. */
173
174void
217aa764
AM
175_bfd_elf_swap_versym_in (bfd *abfd,
176 const Elf_External_Versym *src,
177 Elf_Internal_Versym *dst)
252b5132 178{
dc810e39 179 dst->vs_vers = H_GET_16 (abfd, src->vs_vers);
252b5132
RH
180}
181
182/* Swap out a Versym structure. */
183
184void
217aa764
AM
185_bfd_elf_swap_versym_out (bfd *abfd,
186 const Elf_Internal_Versym *src,
187 Elf_External_Versym *dst)
252b5132 188{
dc810e39 189 H_PUT_16 (abfd, src->vs_vers, dst->vs_vers);
252b5132
RH
190}
191
192/* Standard ELF hash function. Do not change this function; you will
193 cause invalid hash tables to be generated. */
3a99b017 194
252b5132 195unsigned long
217aa764 196bfd_elf_hash (const char *namearg)
252b5132 197{
3a99b017 198 const unsigned char *name = (const unsigned char *) namearg;
252b5132
RH
199 unsigned long h = 0;
200 unsigned long g;
201 int ch;
202
203 while ((ch = *name++) != '\0')
204 {
205 h = (h << 4) + ch;
206 if ((g = (h & 0xf0000000)) != 0)
207 {
208 h ^= g >> 24;
209 /* The ELF ABI says `h &= ~g', but this is equivalent in
210 this case and on some machines one insn instead of two. */
211 h ^= g;
212 }
213 }
32dfa85d 214 return h & 0xffffffff;
252b5132
RH
215}
216
fdc90cb4
JJ
217/* DT_GNU_HASH hash function. Do not change this function; you will
218 cause invalid hash tables to be generated. */
219
220unsigned long
221bfd_elf_gnu_hash (const char *namearg)
222{
223 const unsigned char *name = (const unsigned char *) namearg;
224 unsigned long h = 5381;
225 unsigned char ch;
226
227 while ((ch = *name++) != '\0')
228 h = (h << 5) + h + ch;
229 return h & 0xffffffff;
230}
231
0c8d6e5c
AM
232/* Create a tdata field OBJECT_SIZE bytes in length, zeroed out and with
233 the object_id field of an elf_obj_tdata field set to OBJECT_ID. */
b34976b6 234bfd_boolean
0c8d6e5c 235bfd_elf_allocate_object (bfd *abfd,
0ffa91dd 236 size_t object_size,
4dfe6ac6 237 enum elf_target_id object_id)
252b5132 238{
0ffa91dd
NC
239 BFD_ASSERT (object_size >= sizeof (struct elf_obj_tdata));
240 abfd->tdata.any = bfd_zalloc (abfd, object_size);
241 if (abfd->tdata.any == NULL)
242 return FALSE;
252b5132 243
0ffa91dd 244 elf_object_id (abfd) = object_id;
c0355132
AM
245 if (abfd->direction != read_direction)
246 {
247 struct output_elf_obj_tdata *o = bfd_zalloc (abfd, sizeof *o);
248 if (o == NULL)
249 return FALSE;
250 elf_tdata (abfd)->o = o;
251 elf_program_header_size (abfd) = (bfd_size_type) -1;
252 }
b34976b6 253 return TRUE;
252b5132
RH
254}
255
0ffa91dd
NC
256
257bfd_boolean
ae95ffa6 258bfd_elf_make_object (bfd *abfd)
0ffa91dd 259{
ae95ffa6 260 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
0ffa91dd 261 return bfd_elf_allocate_object (abfd, sizeof (struct elf_obj_tdata),
ae95ffa6 262 bed->target_id);
0ffa91dd
NC
263}
264
b34976b6 265bfd_boolean
217aa764 266bfd_elf_mkcorefile (bfd *abfd)
252b5132 267{
c044fabd 268 /* I think this can be done just like an object file. */
228e534f
AM
269 if (!abfd->xvec->_bfd_set_format[(int) bfd_object] (abfd))
270 return FALSE;
271 elf_tdata (abfd)->core = bfd_zalloc (abfd, sizeof (*elf_tdata (abfd)->core));
272 return elf_tdata (abfd)->core != NULL;
252b5132
RH
273}
274
6d5944fc 275char *
217aa764 276bfd_elf_get_str_section (bfd *abfd, unsigned int shindex)
252b5132
RH
277{
278 Elf_Internal_Shdr **i_shdrp;
f075ee0c 279 bfd_byte *shstrtab = NULL;
dc810e39
AM
280 file_ptr offset;
281 bfd_size_type shstrtabsize;
252b5132
RH
282
283 i_shdrp = elf_elfsections (abfd);
74f2e02b
AM
284 if (i_shdrp == 0
285 || shindex >= elf_numsections (abfd)
286 || i_shdrp[shindex] == 0)
f075ee0c 287 return NULL;
252b5132 288
f075ee0c 289 shstrtab = i_shdrp[shindex]->contents;
252b5132
RH
290 if (shstrtab == NULL)
291 {
c044fabd 292 /* No cached one, attempt to read, and cache what we read. */
252b5132
RH
293 offset = i_shdrp[shindex]->sh_offset;
294 shstrtabsize = i_shdrp[shindex]->sh_size;
c6c60d09
JJ
295
296 /* Allocate and clear an extra byte at the end, to prevent crashes
297 in case the string table is not terminated. */
3471d59d 298 if (shstrtabsize + 1 <= 1
06614111 299 || bfd_seek (abfd, offset, SEEK_SET) != 0
2bb3687b
AM
300 || (shstrtab = _bfd_alloc_and_read (abfd, shstrtabsize + 1,
301 shstrtabsize)) == NULL)
302 {
3471d59d
CC
303 /* Once we've failed to read it, make sure we don't keep
304 trying. Otherwise, we'll keep allocating space for
305 the string table over and over. */
306 i_shdrp[shindex]->sh_size = 0;
c6c60d09
JJ
307 }
308 else
309 shstrtab[shstrtabsize] = '\0';
217aa764 310 i_shdrp[shindex]->contents = shstrtab;
252b5132 311 }
f075ee0c 312 return (char *) shstrtab;
252b5132
RH
313}
314
315char *
217aa764
AM
316bfd_elf_string_from_elf_section (bfd *abfd,
317 unsigned int shindex,
318 unsigned int strindex)
252b5132
RH
319{
320 Elf_Internal_Shdr *hdr;
321
322 if (strindex == 0)
323 return "";
324
74f2e02b
AM
325 if (elf_elfsections (abfd) == NULL || shindex >= elf_numsections (abfd))
326 return NULL;
327
252b5132
RH
328 hdr = elf_elfsections (abfd)[shindex];
329
06614111
NC
330 if (hdr->contents == NULL)
331 {
332 if (hdr->sh_type != SHT_STRTAB && hdr->sh_type < SHT_LOOS)
333 {
334 /* PR 17512: file: f057ec89. */
695344c0 335 /* xgettext:c-format */
871b3ab2 336 _bfd_error_handler (_("%pB: attempt to load strings from"
63a5468a 337 " a non-string section (number %d)"),
06614111
NC
338 abfd, shindex);
339 return NULL;
340 }
b1fa9dd6 341
06614111
NC
342 if (bfd_elf_get_str_section (abfd, shindex) == NULL)
343 return NULL;
344 }
eed5def8
NC
345 else
346 {
347 /* PR 24273: The string section's contents may have already
348 been loaded elsewhere, eg because a corrupt file has the
349 string section index in the ELF header pointing at a group
350 section. So be paranoid, and test that the last byte of
351 the section is zero. */
352 if (hdr->sh_size == 0 || hdr->contents[hdr->sh_size - 1] != 0)
353 return NULL;
354 }
252b5132
RH
355
356 if (strindex >= hdr->sh_size)
357 {
1b3a8575 358 unsigned int shstrndx = elf_elfheader(abfd)->e_shstrndx;
4eca0228 359 _bfd_error_handler
695344c0 360 /* xgettext:c-format */
2dcf00ce
AM
361 (_("%pB: invalid string offset %u >= %" PRIu64 " for section `%s'"),
362 abfd, strindex, (uint64_t) hdr->sh_size,
1b3a8575 363 (shindex == shstrndx && strindex == hdr->sh_name
252b5132 364 ? ".shstrtab"
1b3a8575 365 : bfd_elf_string_from_elf_section (abfd, shstrndx, hdr->sh_name)));
45b222d6 366 return NULL;
252b5132
RH
367 }
368
369 return ((char *) hdr->contents) + strindex;
370}
371
6cdc0ccc
AM
372/* Read and convert symbols to internal format.
373 SYMCOUNT specifies the number of symbols to read, starting from
374 symbol SYMOFFSET. If any of INTSYM_BUF, EXTSYM_BUF or EXTSHNDX_BUF
375 are non-NULL, they are used to store the internal symbols, external
b7c368d0
NC
376 symbols, and symbol section index extensions, respectively.
377 Returns a pointer to the internal symbol buffer (malloced if necessary)
378 or NULL if there were no symbols or some kind of problem. */
6cdc0ccc
AM
379
380Elf_Internal_Sym *
217aa764
AM
381bfd_elf_get_elf_syms (bfd *ibfd,
382 Elf_Internal_Shdr *symtab_hdr,
383 size_t symcount,
384 size_t symoffset,
385 Elf_Internal_Sym *intsym_buf,
386 void *extsym_buf,
387 Elf_External_Sym_Shndx *extshndx_buf)
6cdc0ccc
AM
388{
389 Elf_Internal_Shdr *shndx_hdr;
217aa764 390 void *alloc_ext;
df622259 391 const bfd_byte *esym;
6cdc0ccc
AM
392 Elf_External_Sym_Shndx *alloc_extshndx;
393 Elf_External_Sym_Shndx *shndx;
4dd07732 394 Elf_Internal_Sym *alloc_intsym;
6cdc0ccc
AM
395 Elf_Internal_Sym *isym;
396 Elf_Internal_Sym *isymend;
9c5bfbb7 397 const struct elf_backend_data *bed;
6cdc0ccc 398 size_t extsym_size;
1f4361a7 399 size_t amt;
6cdc0ccc
AM
400 file_ptr pos;
401
e44a2c9c
AM
402 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
403 abort ();
404
6cdc0ccc
AM
405 if (symcount == 0)
406 return intsym_buf;
407
408 /* Normal syms might have section extension entries. */
409 shndx_hdr = NULL;
6a40cf0c
NC
410 if (elf_symtab_shndx_list (ibfd) != NULL)
411 {
412 elf_section_list * entry;
413 Elf_Internal_Shdr **sections = elf_elfsections (ibfd);
414
415 /* Find an index section that is linked to this symtab section. */
416 for (entry = elf_symtab_shndx_list (ibfd); entry != NULL; entry = entry->next)
315350be
NC
417 {
418 /* PR 20063. */
419 if (entry->hdr.sh_link >= elf_numsections (ibfd))
420 continue;
421
422 if (sections[entry->hdr.sh_link] == symtab_hdr)
423 {
424 shndx_hdr = & entry->hdr;
425 break;
426 };
427 }
6a40cf0c
NC
428
429 if (shndx_hdr == NULL)
430 {
431 if (symtab_hdr == & elf_symtab_hdr (ibfd))
432 /* Not really accurate, but this was how the old code used to work. */
433 shndx_hdr = & elf_symtab_shndx_list (ibfd)->hdr;
434 /* Otherwise we do nothing. The assumption is that
435 the index table will not be needed. */
436 }
437 }
6cdc0ccc
AM
438
439 /* Read the symbols. */
440 alloc_ext = NULL;
441 alloc_extshndx = NULL;
4dd07732 442 alloc_intsym = NULL;
6cdc0ccc
AM
443 bed = get_elf_backend_data (ibfd);
444 extsym_size = bed->s->sizeof_sym;
1f4361a7
AM
445 if (_bfd_mul_overflow (symcount, extsym_size, &amt))
446 {
447 bfd_set_error (bfd_error_file_too_big);
448 intsym_buf = NULL;
449 goto out;
450 }
6cdc0ccc
AM
451 pos = symtab_hdr->sh_offset + symoffset * extsym_size;
452 if (extsym_buf == NULL)
453 {
1f4361a7 454 alloc_ext = bfd_malloc (amt);
6cdc0ccc
AM
455 extsym_buf = alloc_ext;
456 }
457 if (extsym_buf == NULL
458 || bfd_seek (ibfd, pos, SEEK_SET) != 0
459 || bfd_bread (extsym_buf, amt, ibfd) != amt)
460 {
461 intsym_buf = NULL;
462 goto out;
463 }
464
465 if (shndx_hdr == NULL || shndx_hdr->sh_size == 0)
466 extshndx_buf = NULL;
467 else
468 {
1f4361a7
AM
469 if (_bfd_mul_overflow (symcount, sizeof (Elf_External_Sym_Shndx), &amt))
470 {
471 bfd_set_error (bfd_error_file_too_big);
472 intsym_buf = NULL;
473 goto out;
474 }
6cdc0ccc
AM
475 pos = shndx_hdr->sh_offset + symoffset * sizeof (Elf_External_Sym_Shndx);
476 if (extshndx_buf == NULL)
477 {
1f4361a7 478 alloc_extshndx = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
6cdc0ccc
AM
479 extshndx_buf = alloc_extshndx;
480 }
481 if (extshndx_buf == NULL
482 || bfd_seek (ibfd, pos, SEEK_SET) != 0
483 || bfd_bread (extshndx_buf, amt, ibfd) != amt)
484 {
485 intsym_buf = NULL;
486 goto out;
487 }
488 }
489
490 if (intsym_buf == NULL)
491 {
1f4361a7
AM
492 if (_bfd_mul_overflow (symcount, sizeof (Elf_Internal_Sym), &amt))
493 {
494 bfd_set_error (bfd_error_file_too_big);
495 goto out;
496 }
497 alloc_intsym = (Elf_Internal_Sym *) bfd_malloc (amt);
4dd07732 498 intsym_buf = alloc_intsym;
6cdc0ccc
AM
499 if (intsym_buf == NULL)
500 goto out;
501 }
502
503 /* Convert the symbols to internal form. */
504 isymend = intsym_buf + symcount;
a50b1753 505 for (esym = (const bfd_byte *) extsym_buf, isym = intsym_buf,
07d6d2b8 506 shndx = extshndx_buf;
6cdc0ccc
AM
507 isym < isymend;
508 esym += extsym_size, isym++, shndx = shndx != NULL ? shndx + 1 : NULL)
8384fb8f
AM
509 if (!(*bed->s->swap_symbol_in) (ibfd, esym, shndx, isym))
510 {
511 symoffset += (esym - (bfd_byte *) extsym_buf) / extsym_size;
695344c0 512 /* xgettext:c-format */
871b3ab2 513 _bfd_error_handler (_("%pB symbol number %lu references"
63a5468a 514 " nonexistent SHT_SYMTAB_SHNDX section"),
4eca0228 515 ibfd, (unsigned long) symoffset);
4dd07732
AM
516 if (alloc_intsym != NULL)
517 free (alloc_intsym);
8384fb8f
AM
518 intsym_buf = NULL;
519 goto out;
520 }
6cdc0ccc
AM
521
522 out:
523 if (alloc_ext != NULL)
524 free (alloc_ext);
525 if (alloc_extshndx != NULL)
526 free (alloc_extshndx);
527
528 return intsym_buf;
529}
530
5cab59f6
AM
531/* Look up a symbol name. */
532const char *
be8dd2ca
AM
533bfd_elf_sym_name (bfd *abfd,
534 Elf_Internal_Shdr *symtab_hdr,
26c61ae5
L
535 Elf_Internal_Sym *isym,
536 asection *sym_sec)
5cab59f6 537{
26c61ae5 538 const char *name;
5cab59f6 539 unsigned int iname = isym->st_name;
be8dd2ca 540 unsigned int shindex = symtab_hdr->sh_link;
26c61ae5 541
138f35cc
JJ
542 if (iname == 0 && ELF_ST_TYPE (isym->st_info) == STT_SECTION
543 /* Check for a bogus st_shndx to avoid crashing. */
4fbb74a6 544 && isym->st_shndx < elf_numsections (abfd))
5cab59f6
AM
545 {
546 iname = elf_elfsections (abfd)[isym->st_shndx]->sh_name;
547 shindex = elf_elfheader (abfd)->e_shstrndx;
548 }
549
26c61ae5
L
550 name = bfd_elf_string_from_elf_section (abfd, shindex, iname);
551 if (name == NULL)
552 name = "(null)";
553 else if (sym_sec && *name == '\0')
fd361982 554 name = bfd_section_name (sym_sec);
26c61ae5
L
555
556 return name;
5cab59f6
AM
557}
558
dbb410c3
AM
559/* Elf_Internal_Shdr->contents is an array of these for SHT_GROUP
560 sections. The first element is the flags, the rest are section
561 pointers. */
562
563typedef union elf_internal_group {
564 Elf_Internal_Shdr *shdr;
565 unsigned int flags;
566} Elf_Internal_Group;
567
b885599b
AM
568/* Return the name of the group signature symbol. Why isn't the
569 signature just a string? */
570
571static const char *
217aa764 572group_signature (bfd *abfd, Elf_Internal_Shdr *ghdr)
b885599b 573{
9dce4196 574 Elf_Internal_Shdr *hdr;
9dce4196
AM
575 unsigned char esym[sizeof (Elf64_External_Sym)];
576 Elf_External_Sym_Shndx eshndx;
577 Elf_Internal_Sym isym;
b885599b 578
13792e9d
L
579 /* First we need to ensure the symbol table is available. Make sure
580 that it is a symbol table section. */
4fbb74a6
AM
581 if (ghdr->sh_link >= elf_numsections (abfd))
582 return NULL;
13792e9d
L
583 hdr = elf_elfsections (abfd) [ghdr->sh_link];
584 if (hdr->sh_type != SHT_SYMTAB
585 || ! bfd_section_from_shdr (abfd, ghdr->sh_link))
b885599b
AM
586 return NULL;
587
9dce4196
AM
588 /* Go read the symbol. */
589 hdr = &elf_tdata (abfd)->symtab_hdr;
6cdc0ccc
AM
590 if (bfd_elf_get_elf_syms (abfd, hdr, 1, ghdr->sh_info,
591 &isym, esym, &eshndx) == NULL)
b885599b 592 return NULL;
9dce4196 593
26c61ae5 594 return bfd_elf_sym_name (abfd, hdr, &isym, NULL);
b885599b
AM
595}
596
dbb410c3
AM
597/* Set next_in_group list pointer, and group name for NEWSECT. */
598
b34976b6 599static bfd_boolean
217aa764 600setup_group (bfd *abfd, Elf_Internal_Shdr *hdr, asection *newsect)
dbb410c3
AM
601{
602 unsigned int num_group = elf_tdata (abfd)->num_group;
603
604 /* If num_group is zero, read in all SHT_GROUP sections. The count
605 is set to -1 if there are no SHT_GROUP sections. */
606 if (num_group == 0)
607 {
608 unsigned int i, shnum;
609
610 /* First count the number of groups. If we have a SHT_GROUP
611 section with just a flag word (ie. sh_size is 4), ignore it. */
9ad5cbcf 612 shnum = elf_numsections (abfd);
dbb410c3 613 num_group = 0;
08a40648 614
44534af3 615#define IS_VALID_GROUP_SECTION_HEADER(shdr, minsize) \
1783205a 616 ( (shdr)->sh_type == SHT_GROUP \
44534af3 617 && (shdr)->sh_size >= minsize \
1783205a
NC
618 && (shdr)->sh_entsize == GRP_ENTRY_SIZE \
619 && ((shdr)->sh_size % GRP_ENTRY_SIZE) == 0)
08a40648 620
dbb410c3
AM
621 for (i = 0; i < shnum; i++)
622 {
623 Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[i];
1783205a 624
44534af3 625 if (IS_VALID_GROUP_SECTION_HEADER (shdr, 2 * GRP_ENTRY_SIZE))
dbb410c3
AM
626 num_group += 1;
627 }
628
629 if (num_group == 0)
20dbb49d
L
630 {
631 num_group = (unsigned) -1;
632 elf_tdata (abfd)->num_group = num_group;
ce497010 633 elf_tdata (abfd)->group_sect_ptr = NULL;
20dbb49d
L
634 }
635 else
dbb410c3
AM
636 {
637 /* We keep a list of elf section headers for group sections,
638 so we can find them quickly. */
1f4361a7 639 size_t amt;
d0fb9a8d 640
20dbb49d 641 elf_tdata (abfd)->num_group = num_group;
1f4361a7
AM
642 amt = num_group * sizeof (Elf_Internal_Shdr *);
643 elf_tdata (abfd)->group_sect_ptr
644 = (Elf_Internal_Shdr **) bfd_zalloc (abfd, amt);
dbb410c3 645 if (elf_tdata (abfd)->group_sect_ptr == NULL)
b34976b6 646 return FALSE;
dbb410c3 647 num_group = 0;
ce497010 648
dbb410c3
AM
649 for (i = 0; i < shnum; i++)
650 {
651 Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[i];
1783205a 652
44534af3 653 if (IS_VALID_GROUP_SECTION_HEADER (shdr, 2 * GRP_ENTRY_SIZE))
dbb410c3 654 {
973ffd63 655 unsigned char *src;
dbb410c3
AM
656 Elf_Internal_Group *dest;
657
07d6d2b8
AM
658 /* Make sure the group section has a BFD section
659 attached to it. */
660 if (!bfd_section_from_shdr (abfd, i))
661 return FALSE;
662
dbb410c3
AM
663 /* Add to list of sections. */
664 elf_tdata (abfd)->group_sect_ptr[num_group] = shdr;
665 num_group += 1;
666
667 /* Read the raw contents. */
1f4361a7
AM
668 BFD_ASSERT (sizeof (*dest) >= 4 && sizeof (*dest) % 4 == 0);
669 shdr->contents = NULL;
670 if (_bfd_mul_overflow (shdr->sh_size,
671 sizeof (*dest) / 4, &amt)
1f4361a7 672 || bfd_seek (abfd, shdr->sh_offset, SEEK_SET) != 0
2bb3687b
AM
673 || !(shdr->contents
674 = _bfd_alloc_and_read (abfd, amt, shdr->sh_size)))
493a3386
NC
675 {
676 _bfd_error_handler
695344c0 677 /* xgettext:c-format */
871b3ab2 678 (_("%pB: invalid size field in group section"
2dcf00ce
AM
679 " header: %#" PRIx64 ""),
680 abfd, (uint64_t) shdr->sh_size);
493a3386
NC
681 bfd_set_error (bfd_error_bad_value);
682 -- num_group;
493a3386
NC
683 continue;
684 }
708d7d0d 685
dbb410c3
AM
686 /* Translate raw contents, a flag word followed by an
687 array of elf section indices all in target byte order,
688 to the flag word followed by an array of elf section
689 pointers. */
690 src = shdr->contents + shdr->sh_size;
691 dest = (Elf_Internal_Group *) (shdr->contents + amt);
06614111 692
dbb410c3
AM
693 while (1)
694 {
695 unsigned int idx;
696
697 src -= 4;
698 --dest;
699 idx = H_GET_32 (abfd, src);
700 if (src == shdr->contents)
701 {
327301a4 702 dest->shdr = NULL;
dbb410c3 703 dest->flags = idx;
b885599b
AM
704 if (shdr->bfd_section != NULL && (idx & GRP_COMDAT))
705 shdr->bfd_section->flags
706 |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
dbb410c3
AM
707 break;
708 }
4bba0fb1 709 if (idx < shnum)
bae363f1
L
710 {
711 dest->shdr = elf_elfsections (abfd)[idx];
712 /* PR binutils/23199: All sections in a
713 section group should be marked with
714 SHF_GROUP. But some tools generate
715 broken objects without SHF_GROUP. Fix
716 them up here. */
717 dest->shdr->sh_flags |= SHF_GROUP;
718 }
4bba0fb1
AM
719 if (idx >= shnum
720 || dest->shdr->sh_type == SHT_GROUP)
dbb410c3 721 {
4eca0228 722 _bfd_error_handler
4bba0fb1
AM
723 (_("%pB: invalid entry in SHT_GROUP section [%u]"),
724 abfd, i);
725 dest->shdr = NULL;
dbb410c3 726 }
dbb410c3
AM
727 }
728 }
729 }
493a3386
NC
730
731 /* PR 17510: Corrupt binaries might contain invalid groups. */
732 if (num_group != (unsigned) elf_tdata (abfd)->num_group)
733 {
734 elf_tdata (abfd)->num_group = num_group;
735
736 /* If all groups are invalid then fail. */
737 if (num_group == 0)
738 {
739 elf_tdata (abfd)->group_sect_ptr = NULL;
740 elf_tdata (abfd)->num_group = num_group = -1;
4eca0228 741 _bfd_error_handler
871b3ab2 742 (_("%pB: no valid group sections found"), abfd);
493a3386
NC
743 bfd_set_error (bfd_error_bad_value);
744 }
745 }
dbb410c3
AM
746 }
747 }
748
749 if (num_group != (unsigned) -1)
750 {
564e11c9
JW
751 unsigned int search_offset = elf_tdata (abfd)->group_search_offset;
752 unsigned int j;
dbb410c3 753
564e11c9 754 for (j = 0; j < num_group; j++)
dbb410c3 755 {
564e11c9
JW
756 /* Begin search from previous found group. */
757 unsigned i = (j + search_offset) % num_group;
758
dbb410c3 759 Elf_Internal_Shdr *shdr = elf_tdata (abfd)->group_sect_ptr[i];
ce497010 760 Elf_Internal_Group *idx;
0c54f692 761 bfd_size_type n_elt;
ce497010
NC
762
763 if (shdr == NULL)
764 continue;
765
766 idx = (Elf_Internal_Group *) shdr->contents;
0c54f692
NC
767 if (idx == NULL || shdr->sh_size < 4)
768 {
769 /* See PR 21957 for a reproducer. */
770 /* xgettext:c-format */
871b3ab2 771 _bfd_error_handler (_("%pB: group section '%pA' has no contents"),
0c54f692
NC
772 abfd, shdr->bfd_section);
773 elf_tdata (abfd)->group_sect_ptr[i] = NULL;
774 bfd_set_error (bfd_error_bad_value);
775 return FALSE;
776 }
ce497010 777 n_elt = shdr->sh_size / 4;
dbb410c3
AM
778
779 /* Look through this group's sections to see if current
780 section is a member. */
781 while (--n_elt != 0)
782 if ((++idx)->shdr == hdr)
783 {
e0e8c97f 784 asection *s = NULL;
dbb410c3
AM
785
786 /* We are a member of this group. Go looking through
787 other members to see if any others are linked via
788 next_in_group. */
789 idx = (Elf_Internal_Group *) shdr->contents;
790 n_elt = shdr->sh_size / 4;
791 while (--n_elt != 0)
4bba0fb1
AM
792 if ((++idx)->shdr != NULL
793 && (s = idx->shdr->bfd_section) != NULL
945906ff 794 && elf_next_in_group (s) != NULL)
dbb410c3
AM
795 break;
796 if (n_elt != 0)
797 {
dbb410c3
AM
798 /* Snarf the group name from other member, and
799 insert current section in circular list. */
945906ff
AM
800 elf_group_name (newsect) = elf_group_name (s);
801 elf_next_in_group (newsect) = elf_next_in_group (s);
802 elf_next_in_group (s) = newsect;
dbb410c3
AM
803 }
804 else
805 {
dbb410c3
AM
806 const char *gname;
807
b885599b
AM
808 gname = group_signature (abfd, shdr);
809 if (gname == NULL)
b34976b6 810 return FALSE;
945906ff 811 elf_group_name (newsect) = gname;
dbb410c3
AM
812
813 /* Start a circular list with one element. */
945906ff 814 elf_next_in_group (newsect) = newsect;
dbb410c3 815 }
b885599b 816
9dce4196
AM
817 /* If the group section has been created, point to the
818 new member. */
dbb410c3 819 if (shdr->bfd_section != NULL)
945906ff 820 elf_next_in_group (shdr->bfd_section) = newsect;
b885599b 821
564e11c9
JW
822 elf_tdata (abfd)->group_search_offset = i;
823 j = num_group - 1;
dbb410c3
AM
824 break;
825 }
826 }
827 }
828
945906ff 829 if (elf_group_name (newsect) == NULL)
dbb410c3 830 {
695344c0 831 /* xgettext:c-format */
871b3ab2 832 _bfd_error_handler (_("%pB: no group info for section '%pA'"),
4eca0228 833 abfd, newsect);
493a3386 834 return FALSE;
dbb410c3 835 }
b34976b6 836 return TRUE;
dbb410c3
AM
837}
838
3d7f7666 839bfd_boolean
dd863624 840_bfd_elf_setup_sections (bfd *abfd)
3d7f7666
L
841{
842 unsigned int i;
843 unsigned int num_group = elf_tdata (abfd)->num_group;
844 bfd_boolean result = TRUE;
dd863624
L
845 asection *s;
846
847 /* Process SHF_LINK_ORDER. */
848 for (s = abfd->sections; s != NULL; s = s->next)
849 {
850 Elf_Internal_Shdr *this_hdr = &elf_section_data (s)->this_hdr;
851 if ((this_hdr->sh_flags & SHF_LINK_ORDER) != 0)
852 {
853 unsigned int elfsec = this_hdr->sh_link;
854 /* FIXME: The old Intel compiler and old strip/objcopy may
855 not set the sh_link or sh_info fields. Hence we could
856 get the situation where elfsec is 0. */
857 if (elfsec == 0)
858 {
4fbb74a6 859 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
dd863624
L
860 if (bed->link_order_error_handler)
861 bed->link_order_error_handler
695344c0 862 /* xgettext:c-format */
871b3ab2 863 (_("%pB: warning: sh_link not set for section `%pA'"),
dd863624
L
864 abfd, s);
865 }
866 else
867 {
91d6fa6a 868 asection *linksec = NULL;
25bbc984 869
4fbb74a6
AM
870 if (elfsec < elf_numsections (abfd))
871 {
872 this_hdr = elf_elfsections (abfd)[elfsec];
91d6fa6a 873 linksec = this_hdr->bfd_section;
4fbb74a6 874 }
25bbc984
L
875
876 /* PR 1991, 2008:
877 Some strip/objcopy may leave an incorrect value in
878 sh_link. We don't want to proceed. */
91d6fa6a 879 if (linksec == NULL)
25bbc984 880 {
4eca0228 881 _bfd_error_handler
695344c0 882 /* xgettext:c-format */
871b3ab2 883 (_("%pB: sh_link [%d] in section `%pA' is incorrect"),
c08bb8dd 884 s->owner, elfsec, s);
25bbc984
L
885 result = FALSE;
886 }
887
91d6fa6a 888 elf_linked_to_section (s) = linksec;
dd863624
L
889 }
890 }
53720c49
AM
891 else if (this_hdr->sh_type == SHT_GROUP
892 && elf_next_in_group (s) == NULL)
893 {
4eca0228 894 _bfd_error_handler
695344c0 895 /* xgettext:c-format */
871b3ab2 896 (_("%pB: SHT_GROUP section [index %d] has no SHF_GROUP sections"),
53720c49
AM
897 abfd, elf_section_data (s)->this_idx);
898 result = FALSE;
899 }
dd863624 900 }
3d7f7666 901
dd863624 902 /* Process section groups. */
3d7f7666
L
903 if (num_group == (unsigned) -1)
904 return result;
905
906 for (i = 0; i < num_group; i++)
907 {
908 Elf_Internal_Shdr *shdr = elf_tdata (abfd)->group_sect_ptr[i];
4b0e8a5f
NC
909 Elf_Internal_Group *idx;
910 unsigned int n_elt;
3d7f7666 911
4b0e8a5f
NC
912 /* PR binutils/18758: Beware of corrupt binaries with invalid group data. */
913 if (shdr == NULL || shdr->bfd_section == NULL || shdr->contents == NULL)
914 {
4eca0228 915 _bfd_error_handler
695344c0 916 /* xgettext:c-format */
871b3ab2 917 (_("%pB: section group entry number %u is corrupt"),
4b0e8a5f
NC
918 abfd, i);
919 result = FALSE;
920 continue;
921 }
922
923 idx = (Elf_Internal_Group *) shdr->contents;
924 n_elt = shdr->sh_size / 4;
1b786873 925
3d7f7666 926 while (--n_elt != 0)
24d3e51b
NC
927 {
928 ++ idx;
929
930 if (idx->shdr == NULL)
931 continue;
932 else if (idx->shdr->bfd_section)
933 elf_sec_group (idx->shdr->bfd_section) = shdr->bfd_section;
db4677b8
AM
934 else if (idx->shdr->sh_type != SHT_RELA
935 && idx->shdr->sh_type != SHT_REL)
24d3e51b
NC
936 {
937 /* There are some unknown sections in the group. */
938 _bfd_error_handler
939 /* xgettext:c-format */
871b3ab2 940 (_("%pB: unknown type [%#x] section `%s' in group [%pA]"),
24d3e51b
NC
941 abfd,
942 idx->shdr->sh_type,
943 bfd_elf_string_from_elf_section (abfd,
944 (elf_elfheader (abfd)
945 ->e_shstrndx),
946 idx->shdr->sh_name),
947 shdr->bfd_section);
948 result = FALSE;
949 }
950 }
3d7f7666 951 }
24d3e51b 952
3d7f7666
L
953 return result;
954}
955
72adc230
AM
956bfd_boolean
957bfd_elf_is_group_section (bfd *abfd ATTRIBUTE_UNUSED, const asection *sec)
958{
959 return elf_next_in_group (sec) != NULL;
960}
961
cb7f4b29
AM
962const char *
963bfd_elf_group_name (bfd *abfd ATTRIBUTE_UNUSED, const asection *sec)
964{
965 if (elf_sec_group (sec) != NULL)
966 return elf_group_name (sec);
967 return NULL;
968}
969
f6fe1ccd
L
970static char *
971convert_debug_to_zdebug (bfd *abfd, const char *name)
972{
973 unsigned int len = strlen (name);
974 char *new_name = bfd_alloc (abfd, len + 2);
975 if (new_name == NULL)
976 return NULL;
977 new_name[0] = '.';
978 new_name[1] = 'z';
979 memcpy (new_name + 2, name + 1, len);
980 return new_name;
981}
982
983static char *
984convert_zdebug_to_debug (bfd *abfd, const char *name)
985{
986 unsigned int len = strlen (name);
987 char *new_name = bfd_alloc (abfd, len);
988 if (new_name == NULL)
989 return NULL;
990 new_name[0] = '.';
991 memcpy (new_name + 1, name + 2, len - 1);
992 return new_name;
993}
994
cc5277b1
ML
995/* This a copy of lto_section defined in GCC (lto-streamer.h). */
996
997struct lto_section
998{
999 int16_t major_version;
1000 int16_t minor_version;
1001 unsigned char slim_object;
1002
1003 /* Flags is a private field that is not defined publicly. */
1004 uint16_t flags;
1005};
1006
252b5132
RH
1007/* Make a BFD section from an ELF section. We store a pointer to the
1008 BFD section in the bfd_section field of the header. */
1009
b34976b6 1010bfd_boolean
217aa764
AM
1011_bfd_elf_make_section_from_shdr (bfd *abfd,
1012 Elf_Internal_Shdr *hdr,
6dc132d9
L
1013 const char *name,
1014 int shindex)
252b5132
RH
1015{
1016 asection *newsect;
1017 flagword flags;
9c5bfbb7 1018 const struct elf_backend_data *bed;
252b5132
RH
1019
1020 if (hdr->bfd_section != NULL)
4e011fb5 1021 return TRUE;
252b5132
RH
1022
1023 newsect = bfd_make_section_anyway (abfd, name);
1024 if (newsect == NULL)
b34976b6 1025 return FALSE;
252b5132 1026
1829f4b2
AM
1027 hdr->bfd_section = newsect;
1028 elf_section_data (newsect)->this_hdr = *hdr;
6dc132d9 1029 elf_section_data (newsect)->this_idx = shindex;
1829f4b2 1030
2f89ff8d
L
1031 /* Always use the real type/flags. */
1032 elf_section_type (newsect) = hdr->sh_type;
1033 elf_section_flags (newsect) = hdr->sh_flags;
1034
252b5132
RH
1035 newsect->filepos = hdr->sh_offset;
1036
fd361982
AM
1037 if (!bfd_set_section_vma (newsect, hdr->sh_addr)
1038 || !bfd_set_section_size (newsect, hdr->sh_size)
1039 || !bfd_set_section_alignment (newsect, bfd_log2 (hdr->sh_addralign)))
b34976b6 1040 return FALSE;
252b5132
RH
1041
1042 flags = SEC_NO_FLAGS;
1043 if (hdr->sh_type != SHT_NOBITS)
1044 flags |= SEC_HAS_CONTENTS;
dbb410c3 1045 if (hdr->sh_type == SHT_GROUP)
7bdf4127 1046 flags |= SEC_GROUP;
252b5132
RH
1047 if ((hdr->sh_flags & SHF_ALLOC) != 0)
1048 {
1049 flags |= SEC_ALLOC;
1050 if (hdr->sh_type != SHT_NOBITS)
1051 flags |= SEC_LOAD;
1052 }
1053 if ((hdr->sh_flags & SHF_WRITE) == 0)
1054 flags |= SEC_READONLY;
1055 if ((hdr->sh_flags & SHF_EXECINSTR) != 0)
1056 flags |= SEC_CODE;
1057 else if ((flags & SEC_LOAD) != 0)
1058 flags |= SEC_DATA;
f5fa8ca2
JJ
1059 if ((hdr->sh_flags & SHF_MERGE) != 0)
1060 {
1061 flags |= SEC_MERGE;
1062 newsect->entsize = hdr->sh_entsize;
f5fa8ca2 1063 }
84865015
NC
1064 if ((hdr->sh_flags & SHF_STRINGS) != 0)
1065 flags |= SEC_STRINGS;
dbb410c3
AM
1066 if (hdr->sh_flags & SHF_GROUP)
1067 if (!setup_group (abfd, hdr, newsect))
b34976b6 1068 return FALSE;
13ae64f3
JJ
1069 if ((hdr->sh_flags & SHF_TLS) != 0)
1070 flags |= SEC_THREAD_LOCAL;
18ae9cc1
L
1071 if ((hdr->sh_flags & SHF_EXCLUDE) != 0)
1072 flags |= SEC_EXCLUDE;
252b5132 1073
df3a023b
AM
1074 switch (elf_elfheader (abfd)->e_ident[EI_OSABI])
1075 {
1076 /* FIXME: We should not recognize SHF_GNU_MBIND for ELFOSABI_NONE,
1077 but binutils as of 2019-07-23 did not set the EI_OSABI header
1078 byte. */
1079 case ELFOSABI_NONE:
1080 case ELFOSABI_GNU:
1081 case ELFOSABI_FREEBSD:
1082 if ((hdr->sh_flags & SHF_GNU_MBIND) != 0)
1083 elf_tdata (abfd)->has_gnu_osabi |= elf_gnu_osabi_mbind;
1084 break;
1085 }
1086
3d2b39cf 1087 if ((flags & SEC_ALLOC) == 0)
7a6cc5fb 1088 {
3d2b39cf
L
1089 /* The debugging sections appear to be recognized only by name,
1090 not any sort of flag. Their SEC_ALLOC bits are cleared. */
3d2b39cf
L
1091 if (name [0] == '.')
1092 {
bb294208
AM
1093 if (strncmp (name, ".debug", 6) == 0
1094 || strncmp (name, ".gnu.linkonce.wi.", 17) == 0
1095 || strncmp (name, ".zdebug", 7) == 0)
1096 flags |= SEC_DEBUGGING | SEC_ELF_OCTETS;
1097 else if (strncmp (name, GNU_BUILD_ATTRS_SECTION_NAME, 21) == 0
1098 || strncmp (name, ".note.gnu", 9) == 0)
1099 flags |= SEC_ELF_OCTETS;
1100 else if (strncmp (name, ".line", 5) == 0
1101 || strncmp (name, ".stab", 5) == 0
1102 || strcmp (name, ".gdb_index") == 0)
3d2b39cf
L
1103 flags |= SEC_DEBUGGING;
1104 }
1105 }
252b5132
RH
1106
1107 /* As a GNU extension, if the name begins with .gnu.linkonce, we
1108 only link a single copy of the section. This is used to support
1109 g++. g++ will emit each template expansion in its own section.
1110 The symbols will be defined as weak, so that multiple definitions
1111 are permitted. The GNU linker extension is to actually discard
1112 all but one of the sections. */
0112cd26 1113 if (CONST_STRNEQ (name, ".gnu.linkonce")
b885599b 1114 && elf_next_in_group (newsect) == NULL)
252b5132
RH
1115 flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
1116
8c803a2d
AM
1117 if (!bfd_set_section_flags (newsect, flags))
1118 return FALSE;
1119
fa152c49
JW
1120 bed = get_elf_backend_data (abfd);
1121 if (bed->elf_backend_section_flags)
8c803a2d 1122 if (!bed->elf_backend_section_flags (hdr))
b34976b6 1123 return FALSE;
fa152c49 1124
718175fa
JK
1125 /* We do not parse the PT_NOTE segments as we are interested even in the
1126 separate debug info files which may have the segments offsets corrupted.
1127 PT_NOTEs from the core files are currently not parsed using BFD. */
1128 if (hdr->sh_type == SHT_NOTE)
1129 {
baea7ef1 1130 bfd_byte *contents;
718175fa 1131
baea7ef1 1132 if (!bfd_malloc_and_get_section (abfd, newsect, &contents))
718175fa
JK
1133 return FALSE;
1134
276da9b3
L
1135 elf_parse_notes (abfd, (char *) contents, hdr->sh_size,
1136 hdr->sh_offset, hdr->sh_addralign);
718175fa
JK
1137 free (contents);
1138 }
1139
8c803a2d 1140 if ((newsect->flags & SEC_ALLOC) != 0)
252b5132
RH
1141 {
1142 Elf_Internal_Phdr *phdr;
6ffd7900
AM
1143 unsigned int i, nload;
1144
1145 /* Some ELF linkers produce binaries with all the program header
1146 p_paddr fields zero. If we have such a binary with more than
1147 one PT_LOAD header, then leave the section lma equal to vma
1148 so that we don't create sections with overlapping lma. */
1149 phdr = elf_tdata (abfd)->phdr;
1150 for (nload = 0, i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
1151 if (phdr->p_paddr != 0)
1152 break;
1153 else if (phdr->p_type == PT_LOAD && phdr->p_memsz != 0)
1154 ++nload;
1155 if (i >= elf_elfheader (abfd)->e_phnum && nload > 1)
1156 return TRUE;
252b5132 1157
252b5132
RH
1158 phdr = elf_tdata (abfd)->phdr;
1159 for (i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
1160 {
86b2281f
AM
1161 if (((phdr->p_type == PT_LOAD
1162 && (hdr->sh_flags & SHF_TLS) == 0)
1163 || phdr->p_type == PT_TLS)
9a83a553 1164 && ELF_SECTION_IN_SEGMENT (hdr, phdr))
252b5132 1165 {
8c803a2d 1166 if ((newsect->flags & SEC_LOAD) == 0)
88967714
AM
1167 newsect->lma = (phdr->p_paddr
1168 + hdr->sh_addr - phdr->p_vaddr);
1169 else
1170 /* We used to use the same adjustment for SEC_LOAD
1171 sections, but that doesn't work if the segment
1172 is packed with code from multiple VMAs.
1173 Instead we calculate the section LMA based on
1174 the segment LMA. It is assumed that the
1175 segment will contain sections with contiguous
1176 LMAs, even if the VMAs are not. */
1177 newsect->lma = (phdr->p_paddr
1178 + hdr->sh_offset - phdr->p_offset);
1179
1180 /* With contiguous segments, we can't tell from file
1181 offsets whether a section with zero size should
1182 be placed at the end of one segment or the
1183 beginning of the next. Decide based on vaddr. */
1184 if (hdr->sh_addr >= phdr->p_vaddr
1185 && (hdr->sh_addr + hdr->sh_size
1186 <= phdr->p_vaddr + phdr->p_memsz))
1187 break;
252b5132
RH
1188 }
1189 }
1190 }
1191
4a114e3e
L
1192 /* Compress/decompress DWARF debug sections with names: .debug_* and
1193 .zdebug_*, after the section flags is set. */
8c803a2d 1194 if ((newsect->flags & SEC_DEBUGGING)
4a114e3e
L
1195 && ((name[1] == 'd' && name[6] == '_')
1196 || (name[1] == 'z' && name[7] == '_')))
1197 {
1198 enum { nothing, compress, decompress } action = nothing;
151411f8 1199 int compression_header_size;
dab394de 1200 bfd_size_type uncompressed_size;
4207142d 1201 unsigned int uncompressed_align_power;
151411f8
L
1202 bfd_boolean compressed
1203 = bfd_is_section_compressed_with_header (abfd, newsect,
dab394de 1204 &compression_header_size,
4207142d
MW
1205 &uncompressed_size,
1206 &uncompressed_align_power);
151411f8 1207 if (compressed)
4a114e3e
L
1208 {
1209 /* Compressed section. Check if we should decompress. */
1210 if ((abfd->flags & BFD_DECOMPRESS))
1211 action = decompress;
1212 }
151411f8
L
1213
1214 /* Compress the uncompressed section or convert from/to .zdebug*
1215 section. Check if we should compress. */
1216 if (action == nothing)
4a114e3e 1217 {
151411f8
L
1218 if (newsect->size != 0
1219 && (abfd->flags & BFD_COMPRESS)
1220 && compression_header_size >= 0
dab394de 1221 && uncompressed_size > 0
151411f8
L
1222 && (!compressed
1223 || ((compression_header_size > 0)
1224 != ((abfd->flags & BFD_COMPRESS_GABI) != 0))))
4a114e3e 1225 action = compress;
151411f8
L
1226 else
1227 return TRUE;
4a114e3e
L
1228 }
1229
151411f8 1230 if (action == compress)
4a114e3e 1231 {
4a114e3e
L
1232 if (!bfd_init_section_compress_status (abfd, newsect))
1233 {
4eca0228 1234 _bfd_error_handler
695344c0 1235 /* xgettext:c-format */
871b3ab2 1236 (_("%pB: unable to initialize compress status for section %s"),
4a114e3e
L
1237 abfd, name);
1238 return FALSE;
1239 }
151411f8
L
1240 }
1241 else
1242 {
4a114e3e
L
1243 if (!bfd_init_section_decompress_status (abfd, newsect))
1244 {
4eca0228 1245 _bfd_error_handler
695344c0 1246 /* xgettext:c-format */
871b3ab2 1247 (_("%pB: unable to initialize decompress status for section %s"),
4a114e3e
L
1248 abfd, name);
1249 return FALSE;
1250 }
151411f8
L
1251 }
1252
f6fe1ccd 1253 if (abfd->is_linker_input)
151411f8 1254 {
f6fe1ccd
L
1255 if (name[1] == 'z'
1256 && (action == decompress
1257 || (action == compress
1258 && (abfd->flags & BFD_COMPRESS_GABI) != 0)))
4e011fb5 1259 {
f6fe1ccd
L
1260 /* Convert section name from .zdebug_* to .debug_* so
1261 that linker will consider this section as a debug
1262 section. */
1263 char *new_name = convert_zdebug_to_debug (abfd, name);
151411f8
L
1264 if (new_name == NULL)
1265 return FALSE;
fd361982 1266 bfd_rename_section (newsect, new_name);
151411f8 1267 }
4a114e3e 1268 }
f6fe1ccd
L
1269 else
1270 /* For objdump, don't rename the section. For objcopy, delay
1271 section rename to elf_fake_sections. */
1272 newsect->flags |= SEC_ELF_RENAME;
4a114e3e
L
1273 }
1274
cc5277b1
ML
1275 /* GCC uses .gnu.lto_.lto.<some_hash> as a LTO bytecode information
1276 section. */
1277 const char *lto_section_name = ".gnu.lto_.lto.";
1278 if (strncmp (name, lto_section_name, strlen (lto_section_name)) == 0)
1279 {
1280 struct lto_section lsection;
1281 if (bfd_get_section_contents (abfd, newsect, &lsection, 0,
1282 sizeof (struct lto_section)))
1283 abfd->lto_slim_object = lsection.slim_object;
1284 }
1285
b34976b6 1286 return TRUE;
252b5132
RH
1287}
1288
84865015
NC
1289const char *const bfd_elf_section_type_names[] =
1290{
252b5132
RH
1291 "SHT_NULL", "SHT_PROGBITS", "SHT_SYMTAB", "SHT_STRTAB",
1292 "SHT_RELA", "SHT_HASH", "SHT_DYNAMIC", "SHT_NOTE",
1293 "SHT_NOBITS", "SHT_REL", "SHT_SHLIB", "SHT_DYNSYM",
1294};
1295
1049f94e 1296/* ELF relocs are against symbols. If we are producing relocatable
252b5132
RH
1297 output, and the reloc is against an external symbol, and nothing
1298 has given us any additional addend, the resulting reloc will also
1299 be against the same symbol. In such a case, we don't want to
1300 change anything about the way the reloc is handled, since it will
1301 all be done at final link time. Rather than put special case code
1302 into bfd_perform_relocation, all the reloc types use this howto
1303 function. It just short circuits the reloc if producing
1049f94e 1304 relocatable output against an external symbol. */
252b5132 1305
252b5132 1306bfd_reloc_status_type
217aa764
AM
1307bfd_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED,
1308 arelent *reloc_entry,
1309 asymbol *symbol,
1310 void *data ATTRIBUTE_UNUSED,
1311 asection *input_section,
1312 bfd *output_bfd,
1313 char **error_message ATTRIBUTE_UNUSED)
1314{
1315 if (output_bfd != NULL
252b5132
RH
1316 && (symbol->flags & BSF_SECTION_SYM) == 0
1317 && (! reloc_entry->howto->partial_inplace
1318 || reloc_entry->addend == 0))
1319 {
1320 reloc_entry->address += input_section->output_offset;
1321 return bfd_reloc_ok;
1322 }
1323
1324 return bfd_reloc_continue;
1325}
1326\f
84865015
NC
1327/* Returns TRUE if section A matches section B.
1328 Names, addresses and links may be different, but everything else
1329 should be the same. */
1330
1331static bfd_boolean
5522f910
NC
1332section_match (const Elf_Internal_Shdr * a,
1333 const Elf_Internal_Shdr * b)
84865015 1334{
ac85e67c
AM
1335 if (a->sh_type != b->sh_type
1336 || ((a->sh_flags ^ b->sh_flags) & ~SHF_INFO_LINK) != 0
1337 || a->sh_addralign != b->sh_addralign
1338 || a->sh_entsize != b->sh_entsize)
1339 return FALSE;
1340 if (a->sh_type == SHT_SYMTAB
1341 || a->sh_type == SHT_STRTAB)
1342 return TRUE;
1343 return a->sh_size == b->sh_size;
84865015
NC
1344}
1345
1346/* Find a section in OBFD that has the same characteristics
1347 as IHEADER. Return the index of this section or SHN_UNDEF if
1348 none can be found. Check's section HINT first, as this is likely
1349 to be the correct section. */
1350
1351static unsigned int
5cc4ca83
ST
1352find_link (const bfd *obfd, const Elf_Internal_Shdr *iheader,
1353 const unsigned int hint)
84865015
NC
1354{
1355 Elf_Internal_Shdr ** oheaders = elf_elfsections (obfd);
1356 unsigned int i;
1357
a55c9876
NC
1358 BFD_ASSERT (iheader != NULL);
1359
1360 /* See PR 20922 for a reproducer of the NULL test. */
5cc4ca83
ST
1361 if (hint < elf_numsections (obfd)
1362 && oheaders[hint] != NULL
a55c9876 1363 && section_match (oheaders[hint], iheader))
84865015
NC
1364 return hint;
1365
1366 for (i = 1; i < elf_numsections (obfd); i++)
1367 {
1368 Elf_Internal_Shdr * oheader = oheaders[i];
1369
a55c9876
NC
1370 if (oheader == NULL)
1371 continue;
84865015
NC
1372 if (section_match (oheader, iheader))
1373 /* FIXME: Do we care if there is a potential for
1374 multiple matches ? */
1375 return i;
1376 }
1377
1378 return SHN_UNDEF;
1379}
1380
5522f910
NC
1381/* PR 19938: Attempt to set the ELF section header fields of an OS or
1382 Processor specific section, based upon a matching input section.
1383 Returns TRUE upon success, FALSE otherwise. */
07d6d2b8 1384
5522f910
NC
1385static bfd_boolean
1386copy_special_section_fields (const bfd *ibfd,
1387 bfd *obfd,
1388 const Elf_Internal_Shdr *iheader,
1389 Elf_Internal_Shdr *oheader,
1390 const unsigned int secnum)
1391{
1392 const struct elf_backend_data *bed = get_elf_backend_data (obfd);
1393 const Elf_Internal_Shdr **iheaders = (const Elf_Internal_Shdr **) elf_elfsections (ibfd);
1394 bfd_boolean changed = FALSE;
1395 unsigned int sh_link;
1396
1397 if (oheader->sh_type == SHT_NOBITS)
1398 {
1399 /* This is a feature for objcopy --only-keep-debug:
1400 When a section's type is changed to NOBITS, we preserve
1401 the sh_link and sh_info fields so that they can be
1402 matched up with the original.
1403
1404 Note: Strictly speaking these assignments are wrong.
1405 The sh_link and sh_info fields should point to the
1406 relevent sections in the output BFD, which may not be in
1407 the same location as they were in the input BFD. But
1408 the whole point of this action is to preserve the
1409 original values of the sh_link and sh_info fields, so
1410 that they can be matched up with the section headers in
1411 the original file. So strictly speaking we may be
1412 creating an invalid ELF file, but it is only for a file
1413 that just contains debug info and only for sections
1414 without any contents. */
1415 if (oheader->sh_link == 0)
1416 oheader->sh_link = iheader->sh_link;
1417 if (oheader->sh_info == 0)
1418 oheader->sh_info = iheader->sh_info;
1419 return TRUE;
1420 }
1421
1422 /* Allow the target a chance to decide how these fields should be set. */
1423 if (bed->elf_backend_copy_special_section_fields != NULL
1424 && bed->elf_backend_copy_special_section_fields
1425 (ibfd, obfd, iheader, oheader))
1426 return TRUE;
1427
1428 /* We have an iheader which might match oheader, and which has non-zero
1429 sh_info and/or sh_link fields. Attempt to follow those links and find
1430 the section in the output bfd which corresponds to the linked section
1431 in the input bfd. */
1432 if (iheader->sh_link != SHN_UNDEF)
1433 {
4f3ca05b
NC
1434 /* See PR 20931 for a reproducer. */
1435 if (iheader->sh_link >= elf_numsections (ibfd))
1436 {
76cfced5 1437 _bfd_error_handler
4f3ca05b 1438 /* xgettext:c-format */
9793eb77 1439 (_("%pB: invalid sh_link field (%d) in section number %d"),
4f3ca05b
NC
1440 ibfd, iheader->sh_link, secnum);
1441 return FALSE;
1442 }
1443
5522f910
NC
1444 sh_link = find_link (obfd, iheaders[iheader->sh_link], iheader->sh_link);
1445 if (sh_link != SHN_UNDEF)
1446 {
1447 oheader->sh_link = sh_link;
1448 changed = TRUE;
1449 }
1450 else
1451 /* FIXME: Should we install iheader->sh_link
1452 if we could not find a match ? */
76cfced5 1453 _bfd_error_handler
695344c0 1454 /* xgettext:c-format */
9793eb77 1455 (_("%pB: failed to find link section for section %d"), obfd, secnum);
5522f910
NC
1456 }
1457
1458 if (iheader->sh_info)
1459 {
1460 /* The sh_info field can hold arbitrary information, but if the
1461 SHF_LINK_INFO flag is set then it should be interpreted as a
1462 section index. */
1463 if (iheader->sh_flags & SHF_INFO_LINK)
1464 {
1465 sh_link = find_link (obfd, iheaders[iheader->sh_info],
1466 iheader->sh_info);
1467 if (sh_link != SHN_UNDEF)
1468 oheader->sh_flags |= SHF_INFO_LINK;
1469 }
1470 else
1471 /* No idea what it means - just copy it. */
1472 sh_link = iheader->sh_info;
1473
1474 if (sh_link != SHN_UNDEF)
1475 {
1476 oheader->sh_info = sh_link;
1477 changed = TRUE;
1478 }
1479 else
76cfced5 1480 _bfd_error_handler
695344c0 1481 /* xgettext:c-format */
9793eb77 1482 (_("%pB: failed to find info section for section %d"), obfd, secnum);
5522f910
NC
1483 }
1484
1485 return changed;
1486}
07d6d2b8 1487
0ac4564e
L
1488/* Copy the program header and other data from one object module to
1489 another. */
252b5132 1490
b34976b6 1491bfd_boolean
217aa764 1492_bfd_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
2d502050 1493{
5522f910
NC
1494 const Elf_Internal_Shdr **iheaders = (const Elf_Internal_Shdr **) elf_elfsections (ibfd);
1495 Elf_Internal_Shdr **oheaders = elf_elfsections (obfd);
1496 const struct elf_backend_data *bed;
84865015
NC
1497 unsigned int i;
1498
2d502050 1499 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
84865015 1500 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
b34976b6 1501 return TRUE;
2d502050 1502
57b828ef
L
1503 if (!elf_flags_init (obfd))
1504 {
1505 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
1506 elf_flags_init (obfd) = TRUE;
1507 }
2d502050 1508
0ac4564e 1509 elf_gp (obfd) = elf_gp (ibfd);
57b828ef
L
1510
1511 /* Also copy the EI_OSABI field. */
1512 elf_elfheader (obfd)->e_ident[EI_OSABI] =
1513 elf_elfheader (ibfd)->e_ident[EI_OSABI];
104d59d1 1514
5522f910
NC
1515 /* If set, copy the EI_ABIVERSION field. */
1516 if (elf_elfheader (ibfd)->e_ident[EI_ABIVERSION])
1517 elf_elfheader (obfd)->e_ident[EI_ABIVERSION]
1518 = elf_elfheader (ibfd)->e_ident[EI_ABIVERSION];
07d6d2b8 1519
104d59d1
JM
1520 /* Copy object attributes. */
1521 _bfd_elf_copy_obj_attributes (ibfd, obfd);
63b9bbb7 1522
84865015
NC
1523 if (iheaders == NULL || oheaders == NULL)
1524 return TRUE;
63b9bbb7 1525
5522f910
NC
1526 bed = get_elf_backend_data (obfd);
1527
1528 /* Possibly copy other fields in the section header. */
84865015 1529 for (i = 1; i < elf_numsections (obfd); i++)
63b9bbb7 1530 {
84865015
NC
1531 unsigned int j;
1532 Elf_Internal_Shdr * oheader = oheaders[i];
63b9bbb7 1533
5522f910
NC
1534 /* Ignore ordinary sections. SHT_NOBITS sections are considered however
1535 because of a special case need for generating separate debug info
1536 files. See below for more details. */
84865015
NC
1537 if (oheader == NULL
1538 || (oheader->sh_type != SHT_NOBITS
5522f910
NC
1539 && oheader->sh_type < SHT_LOOS))
1540 continue;
1541
1542 /* Ignore empty sections, and sections whose
1543 fields have already been initialised. */
1544 if (oheader->sh_size == 0
84865015
NC
1545 || (oheader->sh_info != 0 && oheader->sh_link != 0))
1546 continue;
63b9bbb7 1547
84865015 1548 /* Scan for the matching section in the input bfd.
5522f910
NC
1549 First we try for a direct mapping between the input and output sections. */
1550 for (j = 1; j < elf_numsections (ibfd); j++)
1551 {
1552 const Elf_Internal_Shdr * iheader = iheaders[j];
1553
1554 if (iheader == NULL)
1555 continue;
1556
1557 if (oheader->bfd_section != NULL
1558 && iheader->bfd_section != NULL
1559 && iheader->bfd_section->output_section != NULL
1560 && iheader->bfd_section->output_section == oheader->bfd_section)
1561 {
1562 /* We have found a connection from the input section to the
1563 output section. Attempt to copy the header fields. If
1564 this fails then do not try any further sections - there
1565 should only be a one-to-one mapping between input and output. */
1566 if (! copy_special_section_fields (ibfd, obfd, iheader, oheader, i))
1567 j = elf_numsections (ibfd);
1568 break;
1569 }
1570 }
1571
1572 if (j < elf_numsections (ibfd))
1573 continue;
1574
1575 /* That failed. So try to deduce the corresponding input section.
84865015
NC
1576 Unfortunately we cannot compare names as the output string table
1577 is empty, so instead we check size, address and type. */
1578 for (j = 1; j < elf_numsections (ibfd); j++)
1579 {
5522f910 1580 const Elf_Internal_Shdr * iheader = iheaders[j];
84865015 1581
5522f910
NC
1582 if (iheader == NULL)
1583 continue;
1584
1585 /* Try matching fields in the input section's header.
1586 Since --only-keep-debug turns all non-debug sections into
84865015
NC
1587 SHT_NOBITS sections, the output SHT_NOBITS type matches any
1588 input type. */
1589 if ((oheader->sh_type == SHT_NOBITS
1590 || iheader->sh_type == oheader->sh_type)
5522f910
NC
1591 && (iheader->sh_flags & ~ SHF_INFO_LINK)
1592 == (oheader->sh_flags & ~ SHF_INFO_LINK)
84865015
NC
1593 && iheader->sh_addralign == oheader->sh_addralign
1594 && iheader->sh_entsize == oheader->sh_entsize
1595 && iheader->sh_size == oheader->sh_size
1596 && iheader->sh_addr == oheader->sh_addr
1597 && (iheader->sh_info != oheader->sh_info
1598 || iheader->sh_link != oheader->sh_link))
63b9bbb7 1599 {
5522f910
NC
1600 if (copy_special_section_fields (ibfd, obfd, iheader, oheader, i))
1601 break;
63b9bbb7
NC
1602 }
1603 }
5522f910
NC
1604
1605 if (j == elf_numsections (ibfd) && oheader->sh_type >= SHT_LOOS)
1606 {
1607 /* Final attempt. Call the backend copy function
1608 with a NULL input section. */
1609 if (bed->elf_backend_copy_special_section_fields != NULL)
a8e14f4c 1610 (void) bed->elf_backend_copy_special_section_fields (ibfd, obfd, NULL, oheader);
5522f910 1611 }
63b9bbb7
NC
1612 }
1613
b34976b6 1614 return TRUE;
2d502050
L
1615}
1616
cedc298e
L
1617static const char *
1618get_segment_type (unsigned int p_type)
1619{
1620 const char *pt;
1621 switch (p_type)
1622 {
1623 case PT_NULL: pt = "NULL"; break;
1624 case PT_LOAD: pt = "LOAD"; break;
1625 case PT_DYNAMIC: pt = "DYNAMIC"; break;
1626 case PT_INTERP: pt = "INTERP"; break;
1627 case PT_NOTE: pt = "NOTE"; break;
1628 case PT_SHLIB: pt = "SHLIB"; break;
1629 case PT_PHDR: pt = "PHDR"; break;
1630 case PT_TLS: pt = "TLS"; break;
1631 case PT_GNU_EH_FRAME: pt = "EH_FRAME"; break;
2b05f1b7 1632 case PT_GNU_STACK: pt = "STACK"; break;
cedc298e
L
1633 case PT_GNU_RELRO: pt = "RELRO"; break;
1634 default: pt = NULL; break;
1635 }
1636 return pt;
1637}
1638
f0b79d91
L
1639/* Print out the program headers. */
1640
b34976b6 1641bfd_boolean
217aa764 1642_bfd_elf_print_private_bfd_data (bfd *abfd, void *farg)
252b5132 1643{
a50b1753 1644 FILE *f = (FILE *) farg;
252b5132
RH
1645 Elf_Internal_Phdr *p;
1646 asection *s;
1647 bfd_byte *dynbuf = NULL;
1648
1649 p = elf_tdata (abfd)->phdr;
1650 if (p != NULL)
1651 {
1652 unsigned int i, c;
1653
1654 fprintf (f, _("\nProgram Header:\n"));
1655 c = elf_elfheader (abfd)->e_phnum;
1656 for (i = 0; i < c; i++, p++)
1657 {
cedc298e 1658 const char *pt = get_segment_type (p->p_type);
252b5132
RH
1659 char buf[20];
1660
cedc298e 1661 if (pt == NULL)
252b5132 1662 {
cedc298e
L
1663 sprintf (buf, "0x%lx", p->p_type);
1664 pt = buf;
252b5132 1665 }
dc810e39 1666 fprintf (f, "%8s off 0x", pt);
60b89a18 1667 bfd_fprintf_vma (abfd, f, p->p_offset);
252b5132 1668 fprintf (f, " vaddr 0x");
60b89a18 1669 bfd_fprintf_vma (abfd, f, p->p_vaddr);
252b5132 1670 fprintf (f, " paddr 0x");
60b89a18 1671 bfd_fprintf_vma (abfd, f, p->p_paddr);
252b5132
RH
1672 fprintf (f, " align 2**%u\n", bfd_log2 (p->p_align));
1673 fprintf (f, " filesz 0x");
60b89a18 1674 bfd_fprintf_vma (abfd, f, p->p_filesz);
252b5132 1675 fprintf (f, " memsz 0x");
60b89a18 1676 bfd_fprintf_vma (abfd, f, p->p_memsz);
252b5132
RH
1677 fprintf (f, " flags %c%c%c",
1678 (p->p_flags & PF_R) != 0 ? 'r' : '-',
1679 (p->p_flags & PF_W) != 0 ? 'w' : '-',
1680 (p->p_flags & PF_X) != 0 ? 'x' : '-');
dc810e39
AM
1681 if ((p->p_flags &~ (unsigned) (PF_R | PF_W | PF_X)) != 0)
1682 fprintf (f, " %lx", p->p_flags &~ (unsigned) (PF_R | PF_W | PF_X));
252b5132
RH
1683 fprintf (f, "\n");
1684 }
1685 }
1686
1687 s = bfd_get_section_by_name (abfd, ".dynamic");
1688 if (s != NULL)
1689 {
cb33740c 1690 unsigned int elfsec;
dc810e39 1691 unsigned long shlink;
252b5132
RH
1692 bfd_byte *extdyn, *extdynend;
1693 size_t extdynsize;
217aa764 1694 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
252b5132
RH
1695
1696 fprintf (f, _("\nDynamic Section:\n"));
1697
eea6121a 1698 if (!bfd_malloc_and_get_section (abfd, s, &dynbuf))
252b5132
RH
1699 goto error_return;
1700
1701 elfsec = _bfd_elf_section_from_bfd_section (abfd, s);
cb33740c 1702 if (elfsec == SHN_BAD)
252b5132 1703 goto error_return;
dc810e39 1704 shlink = elf_elfsections (abfd)[elfsec]->sh_link;
252b5132
RH
1705
1706 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
1707 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
1708
1709 extdyn = dynbuf;
06614111
NC
1710 /* PR 17512: file: 6f427532. */
1711 if (s->size < extdynsize)
1712 goto error_return;
eea6121a 1713 extdynend = extdyn + s->size;
1036838a 1714 /* PR 17512: file: id:000006,sig:06,src:000000,op:flip4,pos:5664.
07d6d2b8 1715 Fix range check. */
1036838a 1716 for (; extdyn <= (extdynend - extdynsize); extdyn += extdynsize)
252b5132
RH
1717 {
1718 Elf_Internal_Dyn dyn;
ad9563d6 1719 const char *name = "";
252b5132 1720 char ab[20];
b34976b6 1721 bfd_boolean stringp;
ad9563d6 1722 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 1723
217aa764 1724 (*swap_dyn_in) (abfd, extdyn, &dyn);
252b5132
RH
1725
1726 if (dyn.d_tag == DT_NULL)
1727 break;
1728
b34976b6 1729 stringp = FALSE;
252b5132
RH
1730 switch (dyn.d_tag)
1731 {
1732 default:
ad9563d6
CM
1733 if (bed->elf_backend_get_target_dtag)
1734 name = (*bed->elf_backend_get_target_dtag) (dyn.d_tag);
1735
1736 if (!strcmp (name, ""))
1737 {
cd9af601 1738 sprintf (ab, "%#" BFD_VMA_FMT "x", dyn.d_tag);
ad9563d6
CM
1739 name = ab;
1740 }
252b5132
RH
1741 break;
1742
b34976b6 1743 case DT_NEEDED: name = "NEEDED"; stringp = TRUE; break;
252b5132
RH
1744 case DT_PLTRELSZ: name = "PLTRELSZ"; break;
1745 case DT_PLTGOT: name = "PLTGOT"; break;
1746 case DT_HASH: name = "HASH"; break;
1747 case DT_STRTAB: name = "STRTAB"; break;
1748 case DT_SYMTAB: name = "SYMTAB"; break;
1749 case DT_RELA: name = "RELA"; break;
1750 case DT_RELASZ: name = "RELASZ"; break;
1751 case DT_RELAENT: name = "RELAENT"; break;
1752 case DT_STRSZ: name = "STRSZ"; break;
1753 case DT_SYMENT: name = "SYMENT"; break;
1754 case DT_INIT: name = "INIT"; break;
1755 case DT_FINI: name = "FINI"; break;
b34976b6
AM
1756 case DT_SONAME: name = "SONAME"; stringp = TRUE; break;
1757 case DT_RPATH: name = "RPATH"; stringp = TRUE; break;
252b5132
RH
1758 case DT_SYMBOLIC: name = "SYMBOLIC"; break;
1759 case DT_REL: name = "REL"; break;
1760 case DT_RELSZ: name = "RELSZ"; break;
1761 case DT_RELENT: name = "RELENT"; break;
1762 case DT_PLTREL: name = "PLTREL"; break;
1763 case DT_DEBUG: name = "DEBUG"; break;
1764 case DT_TEXTREL: name = "TEXTREL"; break;
1765 case DT_JMPREL: name = "JMPREL"; break;
94558834
L
1766 case DT_BIND_NOW: name = "BIND_NOW"; break;
1767 case DT_INIT_ARRAY: name = "INIT_ARRAY"; break;
1768 case DT_FINI_ARRAY: name = "FINI_ARRAY"; break;
1769 case DT_INIT_ARRAYSZ: name = "INIT_ARRAYSZ"; break;
1770 case DT_FINI_ARRAYSZ: name = "FINI_ARRAYSZ"; break;
b34976b6 1771 case DT_RUNPATH: name = "RUNPATH"; stringp = TRUE; break;
94558834
L
1772 case DT_FLAGS: name = "FLAGS"; break;
1773 case DT_PREINIT_ARRAY: name = "PREINIT_ARRAY"; break;
1774 case DT_PREINIT_ARRAYSZ: name = "PREINIT_ARRAYSZ"; break;
d48188b9 1775 case DT_CHECKSUM: name = "CHECKSUM"; break;
94558834
L
1776 case DT_PLTPADSZ: name = "PLTPADSZ"; break;
1777 case DT_MOVEENT: name = "MOVEENT"; break;
1778 case DT_MOVESZ: name = "MOVESZ"; break;
1779 case DT_FEATURE: name = "FEATURE"; break;
1780 case DT_POSFLAG_1: name = "POSFLAG_1"; break;
1781 case DT_SYMINSZ: name = "SYMINSZ"; break;
1782 case DT_SYMINENT: name = "SYMINENT"; break;
b34976b6
AM
1783 case DT_CONFIG: name = "CONFIG"; stringp = TRUE; break;
1784 case DT_DEPAUDIT: name = "DEPAUDIT"; stringp = TRUE; break;
1785 case DT_AUDIT: name = "AUDIT"; stringp = TRUE; break;
94558834
L
1786 case DT_PLTPAD: name = "PLTPAD"; break;
1787 case DT_MOVETAB: name = "MOVETAB"; break;
1788 case DT_SYMINFO: name = "SYMINFO"; break;
1789 case DT_RELACOUNT: name = "RELACOUNT"; break;
1790 case DT_RELCOUNT: name = "RELCOUNT"; break;
1791 case DT_FLAGS_1: name = "FLAGS_1"; break;
252b5132
RH
1792 case DT_VERSYM: name = "VERSYM"; break;
1793 case DT_VERDEF: name = "VERDEF"; break;
1794 case DT_VERDEFNUM: name = "VERDEFNUM"; break;
1795 case DT_VERNEED: name = "VERNEED"; break;
1796 case DT_VERNEEDNUM: name = "VERNEEDNUM"; break;
b34976b6 1797 case DT_AUXILIARY: name = "AUXILIARY"; stringp = TRUE; break;
94558834 1798 case DT_USED: name = "USED"; break;
b34976b6 1799 case DT_FILTER: name = "FILTER"; stringp = TRUE; break;
fdc90cb4 1800 case DT_GNU_HASH: name = "GNU_HASH"; break;
252b5132
RH
1801 }
1802
ad9563d6 1803 fprintf (f, " %-20s ", name);
252b5132 1804 if (! stringp)
a1f3c56e
AN
1805 {
1806 fprintf (f, "0x");
1807 bfd_fprintf_vma (abfd, f, dyn.d_un.d_val);
1808 }
252b5132
RH
1809 else
1810 {
1811 const char *string;
dc810e39 1812 unsigned int tagv = dyn.d_un.d_val;
252b5132 1813
dc810e39 1814 string = bfd_elf_string_from_elf_section (abfd, shlink, tagv);
252b5132
RH
1815 if (string == NULL)
1816 goto error_return;
1817 fprintf (f, "%s", string);
1818 }
1819 fprintf (f, "\n");
1820 }
1821
1822 free (dynbuf);
1823 dynbuf = NULL;
1824 }
1825
1826 if ((elf_dynverdef (abfd) != 0 && elf_tdata (abfd)->verdef == NULL)
1827 || (elf_dynverref (abfd) != 0 && elf_tdata (abfd)->verref == NULL))
1828 {
fc0e6df6 1829 if (! _bfd_elf_slurp_version_tables (abfd, FALSE))
b34976b6 1830 return FALSE;
252b5132
RH
1831 }
1832
1833 if (elf_dynverdef (abfd) != 0)
1834 {
1835 Elf_Internal_Verdef *t;
1836
1837 fprintf (f, _("\nVersion definitions:\n"));
1838 for (t = elf_tdata (abfd)->verdef; t != NULL; t = t->vd_nextdef)
1839 {
1840 fprintf (f, "%d 0x%2.2x 0x%8.8lx %s\n", t->vd_ndx,
d0fb9a8d
JJ
1841 t->vd_flags, t->vd_hash,
1842 t->vd_nodename ? t->vd_nodename : "<corrupt>");
1843 if (t->vd_auxptr != NULL && t->vd_auxptr->vda_nextptr != NULL)
252b5132
RH
1844 {
1845 Elf_Internal_Verdaux *a;
1846
1847 fprintf (f, "\t");
1848 for (a = t->vd_auxptr->vda_nextptr;
1849 a != NULL;
1850 a = a->vda_nextptr)
d0fb9a8d
JJ
1851 fprintf (f, "%s ",
1852 a->vda_nodename ? a->vda_nodename : "<corrupt>");
252b5132
RH
1853 fprintf (f, "\n");
1854 }
1855 }
1856 }
1857
1858 if (elf_dynverref (abfd) != 0)
1859 {
1860 Elf_Internal_Verneed *t;
1861
1862 fprintf (f, _("\nVersion References:\n"));
1863 for (t = elf_tdata (abfd)->verref; t != NULL; t = t->vn_nextref)
1864 {
1865 Elf_Internal_Vernaux *a;
1866
d0fb9a8d
JJ
1867 fprintf (f, _(" required from %s:\n"),
1868 t->vn_filename ? t->vn_filename : "<corrupt>");
252b5132
RH
1869 for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr)
1870 fprintf (f, " 0x%8.8lx 0x%2.2x %2.2d %s\n", a->vna_hash,
d0fb9a8d
JJ
1871 a->vna_flags, a->vna_other,
1872 a->vna_nodename ? a->vna_nodename : "<corrupt>");
252b5132
RH
1873 }
1874 }
1875
b34976b6 1876 return TRUE;
252b5132
RH
1877
1878 error_return:
1879 if (dynbuf != NULL)
1880 free (dynbuf);
b34976b6 1881 return FALSE;
252b5132
RH
1882}
1883
bb4d2ac2
L
1884/* Get version string. */
1885
1886const char *
60bb06bc
L
1887_bfd_elf_get_symbol_version_string (bfd *abfd, asymbol *symbol,
1888 bfd_boolean *hidden)
bb4d2ac2
L
1889{
1890 const char *version_string = NULL;
1891 if (elf_dynversym (abfd) != 0
1892 && (elf_dynverdef (abfd) != 0 || elf_dynverref (abfd) != 0))
1893 {
1894 unsigned int vernum = ((elf_symbol_type *) symbol)->version;
1895
1896 *hidden = (vernum & VERSYM_HIDDEN) != 0;
1897 vernum &= VERSYM_VERSION;
1898
1899 if (vernum == 0)
1900 version_string = "";
1f6f5dba
L
1901 else if (vernum == 1
1902 && (vernum > elf_tdata (abfd)->cverdefs
1903 || (elf_tdata (abfd)->verdef[0].vd_flags
1904 == VER_FLG_BASE)))
bb4d2ac2
L
1905 version_string = "Base";
1906 else if (vernum <= elf_tdata (abfd)->cverdefs)
1907 version_string =
1908 elf_tdata (abfd)->verdef[vernum - 1].vd_nodename;
1909 else
1910 {
1911 Elf_Internal_Verneed *t;
1912
7a815dd5 1913 version_string = _("<corrupt>");
bb4d2ac2
L
1914 for (t = elf_tdata (abfd)->verref;
1915 t != NULL;
1916 t = t->vn_nextref)
1917 {
1918 Elf_Internal_Vernaux *a;
1919
1920 for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr)
1921 {
1922 if (a->vna_other == vernum)
1923 {
1924 version_string = a->vna_nodename;
1925 break;
1926 }
1927 }
1928 }
1929 }
1930 }
1931 return version_string;
1932}
1933
252b5132
RH
1934/* Display ELF-specific fields of a symbol. */
1935
1936void
217aa764
AM
1937bfd_elf_print_symbol (bfd *abfd,
1938 void *filep,
1939 asymbol *symbol,
1940 bfd_print_symbol_type how)
252b5132 1941{
a50b1753 1942 FILE *file = (FILE *) filep;
252b5132
RH
1943 switch (how)
1944 {
1945 case bfd_print_symbol_name:
1946 fprintf (file, "%s", symbol->name);
1947 break;
1948 case bfd_print_symbol_more:
1949 fprintf (file, "elf ");
60b89a18 1950 bfd_fprintf_vma (abfd, file, symbol->value);
cd9af601 1951 fprintf (file, " %x", symbol->flags);
252b5132
RH
1952 break;
1953 case bfd_print_symbol_all:
1954 {
4e8a9624
AM
1955 const char *section_name;
1956 const char *name = NULL;
9c5bfbb7 1957 const struct elf_backend_data *bed;
7a13edea 1958 unsigned char st_other;
dbb410c3 1959 bfd_vma val;
bb4d2ac2
L
1960 const char *version_string;
1961 bfd_boolean hidden;
c044fabd 1962
252b5132 1963 section_name = symbol->section ? symbol->section->name : "(*none*)";
587ff49e
RH
1964
1965 bed = get_elf_backend_data (abfd);
1966 if (bed->elf_backend_print_symbol_all)
c044fabd 1967 name = (*bed->elf_backend_print_symbol_all) (abfd, filep, symbol);
587ff49e
RH
1968
1969 if (name == NULL)
1970 {
7ee38065 1971 name = symbol->name;
217aa764 1972 bfd_print_symbol_vandf (abfd, file, symbol);
587ff49e
RH
1973 }
1974
252b5132
RH
1975 fprintf (file, " %s\t", section_name);
1976 /* Print the "other" value for a symbol. For common symbols,
1977 we've already printed the size; now print the alignment.
1978 For other symbols, we have no specified alignment, and
1979 we've printed the address; now print the size. */
dcf6c779 1980 if (symbol->section && bfd_is_com_section (symbol->section))
dbb410c3
AM
1981 val = ((elf_symbol_type *) symbol)->internal_elf_sym.st_value;
1982 else
1983 val = ((elf_symbol_type *) symbol)->internal_elf_sym.st_size;
1984 bfd_fprintf_vma (abfd, file, val);
252b5132
RH
1985
1986 /* If we have version information, print it. */
60bb06bc
L
1987 version_string = _bfd_elf_get_symbol_version_string (abfd,
1988 symbol,
1989 &hidden);
bb4d2ac2 1990 if (version_string)
252b5132 1991 {
bb4d2ac2 1992 if (!hidden)
252b5132
RH
1993 fprintf (file, " %-11s", version_string);
1994 else
1995 {
1996 int i;
1997
1998 fprintf (file, " (%s)", version_string);
1999 for (i = 10 - strlen (version_string); i > 0; --i)
2000 putc (' ', file);
2001 }
2002 }
2003
2004 /* If the st_other field is not zero, print it. */
7a13edea 2005 st_other = ((elf_symbol_type *) symbol)->internal_elf_sym.st_other;
c044fabd 2006
7a13edea
NC
2007 switch (st_other)
2008 {
2009 case 0: break;
2010 case STV_INTERNAL: fprintf (file, " .internal"); break;
2011 case STV_HIDDEN: fprintf (file, " .hidden"); break;
2012 case STV_PROTECTED: fprintf (file, " .protected"); break;
2013 default:
2014 /* Some other non-defined flags are also present, so print
2015 everything hex. */
2016 fprintf (file, " 0x%02x", (unsigned int) st_other);
2017 }
252b5132 2018
587ff49e 2019 fprintf (file, " %s", name);
252b5132
RH
2020 }
2021 break;
2022 }
2023}
252b5132
RH
2024\f
2025/* ELF .o/exec file reading */
2026
c044fabd 2027/* Create a new bfd section from an ELF section header. */
252b5132 2028
b34976b6 2029bfd_boolean
217aa764 2030bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
252b5132 2031{
4fbb74a6
AM
2032 Elf_Internal_Shdr *hdr;
2033 Elf_Internal_Ehdr *ehdr;
2034 const struct elf_backend_data *bed;
90937f86 2035 const char *name;
bf67003b
NC
2036 bfd_boolean ret = TRUE;
2037 static bfd_boolean * sections_being_created = NULL;
5a4b0ccc 2038 static bfd * sections_being_created_abfd = NULL;
bf67003b 2039 static unsigned int nesting = 0;
252b5132 2040
4fbb74a6
AM
2041 if (shindex >= elf_numsections (abfd))
2042 return FALSE;
2043
bf67003b
NC
2044 if (++ nesting > 3)
2045 {
2046 /* PR17512: A corrupt ELF binary might contain a recursive group of
67ce483b 2047 sections, with each the string indices pointing to the next in the
bf67003b
NC
2048 loop. Detect this here, by refusing to load a section that we are
2049 already in the process of loading. We only trigger this test if
2050 we have nested at least three sections deep as normal ELF binaries
5a4b0ccc
NC
2051 can expect to recurse at least once.
2052
2053 FIXME: It would be better if this array was attached to the bfd,
2054 rather than being held in a static pointer. */
2055
2056 if (sections_being_created_abfd != abfd)
2057 sections_being_created = NULL;
bf67003b
NC
2058 if (sections_being_created == NULL)
2059 {
446f7ed5
AM
2060 size_t amt = elf_numsections (abfd) * sizeof (bfd_boolean);
2061 sections_being_created = (bfd_boolean *) bfd_zalloc (abfd, amt);
96d3b80f
AM
2062 if (sections_being_created == NULL)
2063 return FALSE;
5a4b0ccc 2064 sections_being_created_abfd = abfd;
bf67003b
NC
2065 }
2066 if (sections_being_created [shindex])
2067 {
4eca0228 2068 _bfd_error_handler
871b3ab2 2069 (_("%pB: warning: loop in section dependencies detected"), abfd);
bf67003b
NC
2070 return FALSE;
2071 }
2072 sections_being_created [shindex] = TRUE;
2073 }
2074
4fbb74a6
AM
2075 hdr = elf_elfsections (abfd)[shindex];
2076 ehdr = elf_elfheader (abfd);
2077 name = bfd_elf_string_from_elf_section (abfd, ehdr->e_shstrndx,
1b3a8575 2078 hdr->sh_name);
933d961a 2079 if (name == NULL)
bf67003b 2080 goto fail;
252b5132 2081
4fbb74a6 2082 bed = get_elf_backend_data (abfd);
252b5132
RH
2083 switch (hdr->sh_type)
2084 {
2085 case SHT_NULL:
2086 /* Inactive section. Throw it away. */
bf67003b 2087 goto success;
252b5132 2088
bf67003b
NC
2089 case SHT_PROGBITS: /* Normal section with contents. */
2090 case SHT_NOBITS: /* .bss section. */
2091 case SHT_HASH: /* .hash section. */
2092 case SHT_NOTE: /* .note section. */
25e27870
L
2093 case SHT_INIT_ARRAY: /* .init_array section. */
2094 case SHT_FINI_ARRAY: /* .fini_array section. */
2095 case SHT_PREINIT_ARRAY: /* .preinit_array section. */
7f1204bb 2096 case SHT_GNU_LIBLIST: /* .gnu.liblist section. */
fdc90cb4 2097 case SHT_GNU_HASH: /* .gnu.hash section. */
bf67003b
NC
2098 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2099 goto success;
252b5132 2100
797fc050 2101 case SHT_DYNAMIC: /* Dynamic linking information. */
6dc132d9 2102 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
bf67003b
NC
2103 goto fail;
2104
cfcac11d
NC
2105 if (hdr->sh_link > elf_numsections (abfd))
2106 {
caa83f8b 2107 /* PR 10478: Accept Solaris binaries with a sh_link
cfcac11d
NC
2108 field set to SHN_BEFORE or SHN_AFTER. */
2109 switch (bfd_get_arch (abfd))
2110 {
caa83f8b 2111 case bfd_arch_i386:
cfcac11d
NC
2112 case bfd_arch_sparc:
2113 if (hdr->sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
2114 || hdr->sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
2115 break;
2116 /* Otherwise fall through. */
2117 default:
bf67003b 2118 goto fail;
cfcac11d
NC
2119 }
2120 }
2121 else if (elf_elfsections (abfd)[hdr->sh_link] == NULL)
bf67003b 2122 goto fail;
cfcac11d 2123 else if (elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_STRTAB)
797fc050
AM
2124 {
2125 Elf_Internal_Shdr *dynsymhdr;
2126
2127 /* The shared libraries distributed with hpux11 have a bogus
2128 sh_link field for the ".dynamic" section. Find the
2129 string table for the ".dynsym" section instead. */
2130 if (elf_dynsymtab (abfd) != 0)
2131 {
2132 dynsymhdr = elf_elfsections (abfd)[elf_dynsymtab (abfd)];
2133 hdr->sh_link = dynsymhdr->sh_link;
2134 }
2135 else
2136 {
2137 unsigned int i, num_sec;
2138
2139 num_sec = elf_numsections (abfd);
2140 for (i = 1; i < num_sec; i++)
2141 {
2142 dynsymhdr = elf_elfsections (abfd)[i];
2143 if (dynsymhdr->sh_type == SHT_DYNSYM)
2144 {
2145 hdr->sh_link = dynsymhdr->sh_link;
2146 break;
2147 }
2148 }
2149 }
2150 }
bf67003b 2151 goto success;
797fc050 2152
bf67003b 2153 case SHT_SYMTAB: /* A symbol table. */
252b5132 2154 if (elf_onesymtab (abfd) == shindex)
bf67003b 2155 goto success;
252b5132 2156
a50b2160 2157 if (hdr->sh_entsize != bed->s->sizeof_sym)
bf67003b
NC
2158 goto fail;
2159
3337c1e5 2160 if (hdr->sh_info * hdr->sh_entsize > hdr->sh_size)
eee3b786
AM
2161 {
2162 if (hdr->sh_size != 0)
bf67003b 2163 goto fail;
eee3b786
AM
2164 /* Some assemblers erroneously set sh_info to one with a
2165 zero sh_size. ld sees this as a global symbol count
2166 of (unsigned) -1. Fix it here. */
2167 hdr->sh_info = 0;
bf67003b 2168 goto success;
eee3b786 2169 }
bf67003b 2170
16ad13ec
NC
2171 /* PR 18854: A binary might contain more than one symbol table.
2172 Unusual, but possible. Warn, but continue. */
2173 if (elf_onesymtab (abfd) != 0)
2174 {
4eca0228 2175 _bfd_error_handler
695344c0 2176 /* xgettext:c-format */
871b3ab2 2177 (_("%pB: warning: multiple symbol tables detected"
63a5468a 2178 " - ignoring the table in section %u"),
16ad13ec
NC
2179 abfd, shindex);
2180 goto success;
2181 }
252b5132 2182 elf_onesymtab (abfd) = shindex;
6a40cf0c
NC
2183 elf_symtab_hdr (abfd) = *hdr;
2184 elf_elfsections (abfd)[shindex] = hdr = & elf_symtab_hdr (abfd);
252b5132
RH
2185 abfd->flags |= HAS_SYMS;
2186
2187 /* Sometimes a shared object will map in the symbol table. If
08a40648
AM
2188 SHF_ALLOC is set, and this is a shared object, then we also
2189 treat this section as a BFD section. We can not base the
2190 decision purely on SHF_ALLOC, because that flag is sometimes
2191 set in a relocatable object file, which would confuse the
2192 linker. */
252b5132
RH
2193 if ((hdr->sh_flags & SHF_ALLOC) != 0
2194 && (abfd->flags & DYNAMIC) != 0
6dc132d9
L
2195 && ! _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2196 shindex))
bf67003b 2197 goto fail;
252b5132 2198
1b3a8575
AM
2199 /* Go looking for SHT_SYMTAB_SHNDX too, since if there is one we
2200 can't read symbols without that section loaded as well. It
2201 is most likely specified by the next section header. */
6a40cf0c
NC
2202 {
2203 elf_section_list * entry;
2204 unsigned int i, num_sec;
1b3a8575 2205
6a40cf0c
NC
2206 for (entry = elf_symtab_shndx_list (abfd); entry != NULL; entry = entry->next)
2207 if (entry->hdr.sh_link == shindex)
2208 goto success;
2209
2210 num_sec = elf_numsections (abfd);
2211 for (i = shindex + 1; i < num_sec; i++)
2212 {
2213 Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
2214
2215 if (hdr2->sh_type == SHT_SYMTAB_SHNDX
2216 && hdr2->sh_link == shindex)
2217 break;
2218 }
2219
2220 if (i == num_sec)
2221 for (i = 1; i < shindex; i++)
1b3a8575
AM
2222 {
2223 Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
6a40cf0c 2224
1b3a8575
AM
2225 if (hdr2->sh_type == SHT_SYMTAB_SHNDX
2226 && hdr2->sh_link == shindex)
2227 break;
2228 }
6a40cf0c
NC
2229
2230 if (i != shindex)
2231 ret = bfd_section_from_shdr (abfd, i);
2232 /* else FIXME: we have failed to find the symbol table - should we issue an error ? */
2233 goto success;
2234 }
252b5132 2235
bf67003b 2236 case SHT_DYNSYM: /* A dynamic symbol table. */
252b5132 2237 if (elf_dynsymtab (abfd) == shindex)
bf67003b 2238 goto success;
252b5132 2239
a50b2160 2240 if (hdr->sh_entsize != bed->s->sizeof_sym)
bf67003b
NC
2241 goto fail;
2242
eee3b786
AM
2243 if (hdr->sh_info * hdr->sh_entsize > hdr->sh_size)
2244 {
2245 if (hdr->sh_size != 0)
bf67003b
NC
2246 goto fail;
2247
eee3b786
AM
2248 /* Some linkers erroneously set sh_info to one with a
2249 zero sh_size. ld sees this as a global symbol count
2250 of (unsigned) -1. Fix it here. */
2251 hdr->sh_info = 0;
bf67003b 2252 goto success;
eee3b786 2253 }
bf67003b 2254
16ad13ec
NC
2255 /* PR 18854: A binary might contain more than one dynamic symbol table.
2256 Unusual, but possible. Warn, but continue. */
2257 if (elf_dynsymtab (abfd) != 0)
2258 {
4eca0228 2259 _bfd_error_handler
695344c0 2260 /* xgettext:c-format */
871b3ab2 2261 (_("%pB: warning: multiple dynamic symbol tables detected"
63a5468a 2262 " - ignoring the table in section %u"),
16ad13ec
NC
2263 abfd, shindex);
2264 goto success;
2265 }
252b5132
RH
2266 elf_dynsymtab (abfd) = shindex;
2267 elf_tdata (abfd)->dynsymtab_hdr = *hdr;
2268 elf_elfsections (abfd)[shindex] = hdr = &elf_tdata (abfd)->dynsymtab_hdr;
2269 abfd->flags |= HAS_SYMS;
2270
2271 /* Besides being a symbol table, we also treat this as a regular
2272 section, so that objcopy can handle it. */
bf67003b
NC
2273 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2274 goto success;
252b5132 2275
bf67003b 2276 case SHT_SYMTAB_SHNDX: /* Symbol section indices when >64k sections. */
6a40cf0c
NC
2277 {
2278 elf_section_list * entry;
9ad5cbcf 2279
6a40cf0c
NC
2280 for (entry = elf_symtab_shndx_list (abfd); entry != NULL; entry = entry->next)
2281 if (entry->ndx == shindex)
2282 goto success;
07d6d2b8 2283
7a6e0d89 2284 entry = bfd_alloc (abfd, sizeof (*entry));
6a40cf0c
NC
2285 if (entry == NULL)
2286 goto fail;
2287 entry->ndx = shindex;
2288 entry->hdr = * hdr;
2289 entry->next = elf_symtab_shndx_list (abfd);
2290 elf_symtab_shndx_list (abfd) = entry;
2291 elf_elfsections (abfd)[shindex] = & entry->hdr;
2292 goto success;
2293 }
9ad5cbcf 2294
bf67003b 2295 case SHT_STRTAB: /* A string table. */
252b5132 2296 if (hdr->bfd_section != NULL)
bf67003b
NC
2297 goto success;
2298
252b5132
RH
2299 if (ehdr->e_shstrndx == shindex)
2300 {
2301 elf_tdata (abfd)->shstrtab_hdr = *hdr;
2302 elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->shstrtab_hdr;
bf67003b 2303 goto success;
252b5132 2304 }
bf67003b 2305
1b3a8575
AM
2306 if (elf_elfsections (abfd)[elf_onesymtab (abfd)]->sh_link == shindex)
2307 {
2308 symtab_strtab:
2309 elf_tdata (abfd)->strtab_hdr = *hdr;
2310 elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->strtab_hdr;
bf67003b 2311 goto success;
1b3a8575 2312 }
bf67003b 2313
1b3a8575
AM
2314 if (elf_elfsections (abfd)[elf_dynsymtab (abfd)]->sh_link == shindex)
2315 {
2316 dynsymtab_strtab:
2317 elf_tdata (abfd)->dynstrtab_hdr = *hdr;
2318 hdr = &elf_tdata (abfd)->dynstrtab_hdr;
2319 elf_elfsections (abfd)[shindex] = hdr;
2320 /* We also treat this as a regular section, so that objcopy
2321 can handle it. */
bf67003b
NC
2322 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2323 shindex);
2324 goto success;
1b3a8575 2325 }
252b5132 2326
1b3a8575
AM
2327 /* If the string table isn't one of the above, then treat it as a
2328 regular section. We need to scan all the headers to be sure,
2329 just in case this strtab section appeared before the above. */
2330 if (elf_onesymtab (abfd) == 0 || elf_dynsymtab (abfd) == 0)
2331 {
2332 unsigned int i, num_sec;
252b5132 2333
1b3a8575
AM
2334 num_sec = elf_numsections (abfd);
2335 for (i = 1; i < num_sec; i++)
2336 {
2337 Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
2338 if (hdr2->sh_link == shindex)
2339 {
933d961a
JJ
2340 /* Prevent endless recursion on broken objects. */
2341 if (i == shindex)
bf67003b 2342 goto fail;
1b3a8575 2343 if (! bfd_section_from_shdr (abfd, i))
bf67003b 2344 goto fail;
1b3a8575
AM
2345 if (elf_onesymtab (abfd) == i)
2346 goto symtab_strtab;
2347 if (elf_dynsymtab (abfd) == i)
2348 goto dynsymtab_strtab;
2349 }
2350 }
2351 }
bf67003b
NC
2352 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2353 goto success;
252b5132
RH
2354
2355 case SHT_REL:
2356 case SHT_RELA:
2357 /* *These* do a lot of work -- but build no sections! */
2358 {
2359 asection *target_sect;
d4730f92 2360 Elf_Internal_Shdr *hdr2, **p_hdr;
9ad5cbcf 2361 unsigned int num_sec = elf_numsections (abfd);
d4730f92 2362 struct bfd_elf_section_data *esdt;
252b5132 2363
aa2ca951
JJ
2364 if (hdr->sh_entsize
2365 != (bfd_size_type) (hdr->sh_type == SHT_REL
a50b2160 2366 ? bed->s->sizeof_rel : bed->s->sizeof_rela))
bf67003b 2367 goto fail;
a50b2160 2368
03ae5f59 2369 /* Check for a bogus link to avoid crashing. */
4fbb74a6 2370 if (hdr->sh_link >= num_sec)
03ae5f59 2371 {
4eca0228 2372 _bfd_error_handler
695344c0 2373 /* xgettext:c-format */
871b3ab2 2374 (_("%pB: invalid link %u for reloc section %s (index %u)"),
4eca0228 2375 abfd, hdr->sh_link, name, shindex);
bf67003b
NC
2376 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2377 shindex);
2378 goto success;
03ae5f59
ILT
2379 }
2380
252b5132
RH
2381 /* For some incomprehensible reason Oracle distributes
2382 libraries for Solaris in which some of the objects have
2383 bogus sh_link fields. It would be nice if we could just
2384 reject them, but, unfortunately, some people need to use
2385 them. We scan through the section headers; if we find only
2386 one suitable symbol table, we clobber the sh_link to point
83b89087
L
2387 to it. I hope this doesn't break anything.
2388
2389 Don't do it on executable nor shared library. */
2390 if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0
2391 && elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_SYMTAB
252b5132
RH
2392 && elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_DYNSYM)
2393 {
9ad5cbcf 2394 unsigned int scan;
252b5132
RH
2395 int found;
2396
2397 found = 0;
9ad5cbcf 2398 for (scan = 1; scan < num_sec; scan++)
252b5132
RH
2399 {
2400 if (elf_elfsections (abfd)[scan]->sh_type == SHT_SYMTAB
2401 || elf_elfsections (abfd)[scan]->sh_type == SHT_DYNSYM)
2402 {
2403 if (found != 0)
2404 {
2405 found = 0;
2406 break;
2407 }
2408 found = scan;
2409 }
2410 }
2411 if (found != 0)
2412 hdr->sh_link = found;
2413 }
2414
2415 /* Get the symbol table. */
1b3a8575
AM
2416 if ((elf_elfsections (abfd)[hdr->sh_link]->sh_type == SHT_SYMTAB
2417 || elf_elfsections (abfd)[hdr->sh_link]->sh_type == SHT_DYNSYM)
252b5132 2418 && ! bfd_section_from_shdr (abfd, hdr->sh_link))
bf67003b 2419 goto fail;
252b5132 2420
a4bcd733
AM
2421 /* If this is an alloc section in an executable or shared
2422 library, or the reloc section does not use the main symbol
2423 table we don't treat it as a reloc section. BFD can't
2424 adequately represent such a section, so at least for now,
2425 we don't try. We just present it as a normal section. We
2426 also can't use it as a reloc section if it points to the
2427 null section, an invalid section, another reloc section, or
2428 its sh_link points to the null section. */
2429 if (((abfd->flags & (DYNAMIC | EXEC_P)) != 0
2430 && (hdr->sh_flags & SHF_ALLOC) != 0)
83b89087 2431 || hdr->sh_link == SHN_UNDEF
a4bcd733 2432 || hdr->sh_link != elf_onesymtab (abfd)
185ef66d 2433 || hdr->sh_info == SHN_UNDEF
185ef66d
AM
2434 || hdr->sh_info >= num_sec
2435 || elf_elfsections (abfd)[hdr->sh_info]->sh_type == SHT_REL
2436 || elf_elfsections (abfd)[hdr->sh_info]->sh_type == SHT_RELA)
bf67003b
NC
2437 {
2438 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2439 shindex);
2440 goto success;
2441 }
252b5132
RH
2442
2443 if (! bfd_section_from_shdr (abfd, hdr->sh_info))
bf67003b
NC
2444 goto fail;
2445
252b5132
RH
2446 target_sect = bfd_section_from_elf_index (abfd, hdr->sh_info);
2447 if (target_sect == NULL)
bf67003b 2448 goto fail;
252b5132 2449
d4730f92
BS
2450 esdt = elf_section_data (target_sect);
2451 if (hdr->sh_type == SHT_RELA)
2452 p_hdr = &esdt->rela.hdr;
252b5132 2453 else
d4730f92
BS
2454 p_hdr = &esdt->rel.hdr;
2455
a7ba3896
NC
2456 /* PR 17512: file: 0b4f81b7.
2457 Also see PR 24456, for a file which deliberately has two reloc
2458 sections. */
06614111 2459 if (*p_hdr != NULL)
a7ba3896 2460 {
a8e14f4c
NC
2461 if (bed->init_secondary_reloc_section == NULL
2462 || ! bed->init_secondary_reloc_section (abfd, hdr, name, shindex))
2463 {
2464 _bfd_error_handler
2465 /* xgettext:c-format */
2466 (_("%pB: warning: secondary relocation section '%s' for section %pA found - ignoring"),
2467 abfd, name, target_sect);
2468 }
a7ba3896
NC
2469 goto success;
2470 }
a8e14f4c 2471
ef53be89 2472 hdr2 = (Elf_Internal_Shdr *) bfd_alloc (abfd, sizeof (*hdr2));
d4730f92 2473 if (hdr2 == NULL)
bf67003b 2474 goto fail;
252b5132 2475 *hdr2 = *hdr;
d4730f92 2476 *p_hdr = hdr2;
252b5132 2477 elf_elfsections (abfd)[shindex] = hdr2;
056bafd4
MR
2478 target_sect->reloc_count += (NUM_SHDR_ENTRIES (hdr)
2479 * bed->s->int_rels_per_ext_rel);
252b5132
RH
2480 target_sect->flags |= SEC_RELOC;
2481 target_sect->relocation = NULL;
2482 target_sect->rel_filepos = hdr->sh_offset;
bf572ba0
MM
2483 /* In the section to which the relocations apply, mark whether
2484 its relocations are of the REL or RELA variety. */
72730e0c 2485 if (hdr->sh_size != 0)
d4730f92
BS
2486 {
2487 if (hdr->sh_type == SHT_RELA)
2488 target_sect->use_rela_p = 1;
2489 }
252b5132 2490 abfd->flags |= HAS_RELOC;
bf67003b 2491 goto success;
252b5132 2492 }
252b5132
RH
2493
2494 case SHT_GNU_verdef:
2495 elf_dynverdef (abfd) = shindex;
2496 elf_tdata (abfd)->dynverdef_hdr = *hdr;
bf67003b
NC
2497 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2498 goto success;
252b5132
RH
2499
2500 case SHT_GNU_versym:
a50b2160 2501 if (hdr->sh_entsize != sizeof (Elf_External_Versym))
bf67003b
NC
2502 goto fail;
2503
252b5132
RH
2504 elf_dynversym (abfd) = shindex;
2505 elf_tdata (abfd)->dynversym_hdr = *hdr;
bf67003b
NC
2506 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2507 goto success;
252b5132
RH
2508
2509 case SHT_GNU_verneed:
2510 elf_dynverref (abfd) = shindex;
2511 elf_tdata (abfd)->dynverref_hdr = *hdr;
bf67003b
NC
2512 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2513 goto success;
252b5132
RH
2514
2515 case SHT_SHLIB:
bf67003b 2516 goto success;
252b5132 2517
dbb410c3 2518 case SHT_GROUP:
44534af3 2519 if (! IS_VALID_GROUP_SECTION_HEADER (hdr, GRP_ENTRY_SIZE))
bf67003b
NC
2520 goto fail;
2521
6dc132d9 2522 if (!_bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
bf67003b
NC
2523 goto fail;
2524
bf67003b 2525 goto success;
dbb410c3 2526
252b5132 2527 default:
104d59d1
JM
2528 /* Possibly an attributes section. */
2529 if (hdr->sh_type == SHT_GNU_ATTRIBUTES
2530 || hdr->sh_type == bed->obj_attrs_section_type)
2531 {
2532 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
bf67003b 2533 goto fail;
104d59d1 2534 _bfd_elf_parse_attributes (abfd, hdr);
bf67003b 2535 goto success;
104d59d1
JM
2536 }
2537
252b5132 2538 /* Check for any processor-specific section types. */
3eb70a79 2539 if (bed->elf_backend_section_from_shdr (abfd, hdr, name, shindex))
bf67003b 2540 goto success;
3eb70a79
L
2541
2542 if (hdr->sh_type >= SHT_LOUSER && hdr->sh_type <= SHT_HIUSER)
2543 {
2544 if ((hdr->sh_flags & SHF_ALLOC) != 0)
2545 /* FIXME: How to properly handle allocated section reserved
2546 for applications? */
4eca0228 2547 _bfd_error_handler
695344c0 2548 /* xgettext:c-format */
871b3ab2 2549 (_("%pB: unknown type [%#x] section `%s'"),
76cfced5 2550 abfd, hdr->sh_type, name);
3eb70a79 2551 else
bf67003b
NC
2552 {
2553 /* Allow sections reserved for applications. */
2554 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2555 shindex);
2556 goto success;
2557 }
3eb70a79
L
2558 }
2559 else if (hdr->sh_type >= SHT_LOPROC
2560 && hdr->sh_type <= SHT_HIPROC)
2561 /* FIXME: We should handle this section. */
4eca0228 2562 _bfd_error_handler
695344c0 2563 /* xgettext:c-format */
871b3ab2 2564 (_("%pB: unknown type [%#x] section `%s'"),
76cfced5 2565 abfd, hdr->sh_type, name);
3eb70a79 2566 else if (hdr->sh_type >= SHT_LOOS && hdr->sh_type <= SHT_HIOS)
ff15b240
NC
2567 {
2568 /* Unrecognised OS-specific sections. */
2569 if ((hdr->sh_flags & SHF_OS_NONCONFORMING) != 0)
2570 /* SHF_OS_NONCONFORMING indicates that special knowledge is
08a40648 2571 required to correctly process the section and the file should
ff15b240 2572 be rejected with an error message. */
4eca0228 2573 _bfd_error_handler
695344c0 2574 /* xgettext:c-format */
871b3ab2 2575 (_("%pB: unknown type [%#x] section `%s'"),
76cfced5 2576 abfd, hdr->sh_type, name);
ff15b240 2577 else
bf67003b
NC
2578 {
2579 /* Otherwise it should be processed. */
2580 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2581 goto success;
2582 }
ff15b240 2583 }
3eb70a79
L
2584 else
2585 /* FIXME: We should handle this section. */
4eca0228 2586 _bfd_error_handler
695344c0 2587 /* xgettext:c-format */
871b3ab2 2588 (_("%pB: unknown type [%#x] section `%s'"),
76cfced5 2589 abfd, hdr->sh_type, name);
3eb70a79 2590
bf67003b 2591 goto fail;
252b5132
RH
2592 }
2593
bf67003b
NC
2594 fail:
2595 ret = FALSE;
2596 success:
e5b470e2 2597 if (sections_being_created && sections_being_created_abfd == abfd)
bf67003b
NC
2598 sections_being_created [shindex] = FALSE;
2599 if (-- nesting == 0)
5a4b0ccc
NC
2600 {
2601 sections_being_created = NULL;
2602 sections_being_created_abfd = abfd;
2603 }
bf67003b 2604 return ret;
252b5132
RH
2605}
2606
87d72d41 2607/* Return the local symbol specified by ABFD, R_SYMNDX. */
ec338859 2608
87d72d41
AM
2609Elf_Internal_Sym *
2610bfd_sym_from_r_symndx (struct sym_cache *cache,
2611 bfd *abfd,
2612 unsigned long r_symndx)
ec338859 2613{
ec338859
AM
2614 unsigned int ent = r_symndx % LOCAL_SYM_CACHE_SIZE;
2615
a5d1b3b5
AM
2616 if (cache->abfd != abfd || cache->indx[ent] != r_symndx)
2617 {
2618 Elf_Internal_Shdr *symtab_hdr;
2619 unsigned char esym[sizeof (Elf64_External_Sym)];
2620 Elf_External_Sym_Shndx eshndx;
ec338859 2621
a5d1b3b5
AM
2622 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2623 if (bfd_elf_get_elf_syms (abfd, symtab_hdr, 1, r_symndx,
87d72d41 2624 &cache->sym[ent], esym, &eshndx) == NULL)
a5d1b3b5 2625 return NULL;
9ad5cbcf 2626
a5d1b3b5
AM
2627 if (cache->abfd != abfd)
2628 {
2629 memset (cache->indx, -1, sizeof (cache->indx));
2630 cache->abfd = abfd;
2631 }
2632 cache->indx[ent] = r_symndx;
ec338859 2633 }
a5d1b3b5 2634
87d72d41 2635 return &cache->sym[ent];
ec338859
AM
2636}
2637
252b5132
RH
2638/* Given an ELF section number, retrieve the corresponding BFD
2639 section. */
2640
2641asection *
91d6fa6a 2642bfd_section_from_elf_index (bfd *abfd, unsigned int sec_index)
252b5132 2643{
91d6fa6a 2644 if (sec_index >= elf_numsections (abfd))
252b5132 2645 return NULL;
91d6fa6a 2646 return elf_elfsections (abfd)[sec_index]->bfd_section;
252b5132
RH
2647}
2648
b35d266b 2649static const struct bfd_elf_special_section special_sections_b[] =
2f89ff8d 2650{
0112cd26 2651 { STRING_COMMA_LEN (".bss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
07d6d2b8 2652 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2653};
2654
b35d266b 2655static const struct bfd_elf_special_section special_sections_c[] =
7f4d3958 2656{
0112cd26 2657 { STRING_COMMA_LEN (".comment"), 0, SHT_PROGBITS, 0 },
1ff6de03 2658 { STRING_COMMA_LEN (".ctf"), 0, SHT_PROGBITS, 0 },
07d6d2b8 2659 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2660};
2661
b35d266b 2662static const struct bfd_elf_special_section special_sections_d[] =
7f4d3958 2663{
07d6d2b8
AM
2664 { STRING_COMMA_LEN (".data"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2665 { STRING_COMMA_LEN (".data1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
a9a72a65
DE
2666 /* There are more DWARF sections than these, but they needn't be added here
2667 unless you have to cope with broken compilers that don't emit section
2668 attributes or you want to help the user writing assembler. */
07d6d2b8
AM
2669 { STRING_COMMA_LEN (".debug"), 0, SHT_PROGBITS, 0 },
2670 { STRING_COMMA_LEN (".debug_line"), 0, SHT_PROGBITS, 0 },
2671 { STRING_COMMA_LEN (".debug_info"), 0, SHT_PROGBITS, 0 },
2672 { STRING_COMMA_LEN (".debug_abbrev"), 0, SHT_PROGBITS, 0 },
0112cd26 2673 { STRING_COMMA_LEN (".debug_aranges"), 0, SHT_PROGBITS, 0 },
07d6d2b8
AM
2674 { STRING_COMMA_LEN (".dynamic"), 0, SHT_DYNAMIC, SHF_ALLOC },
2675 { STRING_COMMA_LEN (".dynstr"), 0, SHT_STRTAB, SHF_ALLOC },
2676 { STRING_COMMA_LEN (".dynsym"), 0, SHT_DYNSYM, SHF_ALLOC },
2677 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2678};
2679
b35d266b 2680static const struct bfd_elf_special_section special_sections_f[] =
7f4d3958 2681{
07d6d2b8 2682 { STRING_COMMA_LEN (".fini"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
6f9dbcd4 2683 { STRING_COMMA_LEN (".fini_array"), -2, SHT_FINI_ARRAY, SHF_ALLOC + SHF_WRITE },
07d6d2b8 2684 { NULL, 0 , 0, 0, 0 }
7f4d3958
L
2685};
2686
b35d266b 2687static const struct bfd_elf_special_section special_sections_g[] =
7f4d3958 2688{
0112cd26 2689 { STRING_COMMA_LEN (".gnu.linkonce.b"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
07d6d2b8
AM
2690 { STRING_COMMA_LEN (".gnu.lto_"), -1, SHT_PROGBITS, SHF_EXCLUDE },
2691 { STRING_COMMA_LEN (".got"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2692 { STRING_COMMA_LEN (".gnu.version"), 0, SHT_GNU_versym, 0 },
0112cd26
NC
2693 { STRING_COMMA_LEN (".gnu.version_d"), 0, SHT_GNU_verdef, 0 },
2694 { STRING_COMMA_LEN (".gnu.version_r"), 0, SHT_GNU_verneed, 0 },
07d6d2b8
AM
2695 { STRING_COMMA_LEN (".gnu.liblist"), 0, SHT_GNU_LIBLIST, SHF_ALLOC },
2696 { STRING_COMMA_LEN (".gnu.conflict"), 0, SHT_RELA, SHF_ALLOC },
2697 { STRING_COMMA_LEN (".gnu.hash"), 0, SHT_GNU_HASH, SHF_ALLOC },
2698 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2699};
2700
b35d266b 2701static const struct bfd_elf_special_section special_sections_h[] =
7f4d3958 2702{
07d6d2b8
AM
2703 { STRING_COMMA_LEN (".hash"), 0, SHT_HASH, SHF_ALLOC },
2704 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2705};
2706
b35d266b 2707static const struct bfd_elf_special_section special_sections_i[] =
7f4d3958 2708{
07d6d2b8 2709 { STRING_COMMA_LEN (".init"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
6f9dbcd4 2710 { STRING_COMMA_LEN (".init_array"), -2, SHT_INIT_ARRAY, SHF_ALLOC + SHF_WRITE },
07d6d2b8
AM
2711 { STRING_COMMA_LEN (".interp"), 0, SHT_PROGBITS, 0 },
2712 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2713};
2714
b35d266b 2715static const struct bfd_elf_special_section special_sections_l[] =
7f4d3958 2716{
0112cd26 2717 { STRING_COMMA_LEN (".line"), 0, SHT_PROGBITS, 0 },
07d6d2b8 2718 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2719};
2720
b35d266b 2721static const struct bfd_elf_special_section special_sections_n[] =
7f4d3958 2722{
0112cd26 2723 { STRING_COMMA_LEN (".note.GNU-stack"), 0, SHT_PROGBITS, 0 },
07d6d2b8
AM
2724 { STRING_COMMA_LEN (".note"), -1, SHT_NOTE, 0 },
2725 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2726};
2727
b35d266b 2728static const struct bfd_elf_special_section special_sections_p[] =
7f4d3958 2729{
6f9dbcd4 2730 { STRING_COMMA_LEN (".preinit_array"), -2, SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_WRITE },
07d6d2b8
AM
2731 { STRING_COMMA_LEN (".plt"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2732 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2733};
2734
b35d266b 2735static const struct bfd_elf_special_section special_sections_r[] =
7f4d3958 2736{
0112cd26
NC
2737 { STRING_COMMA_LEN (".rodata"), -2, SHT_PROGBITS, SHF_ALLOC },
2738 { STRING_COMMA_LEN (".rodata1"), 0, SHT_PROGBITS, SHF_ALLOC },
07d6d2b8
AM
2739 { STRING_COMMA_LEN (".rela"), -1, SHT_RELA, 0 },
2740 { STRING_COMMA_LEN (".rel"), -1, SHT_REL, 0 },
2741 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2742};
2743
b35d266b 2744static const struct bfd_elf_special_section special_sections_s[] =
7f4d3958 2745{
0112cd26
NC
2746 { STRING_COMMA_LEN (".shstrtab"), 0, SHT_STRTAB, 0 },
2747 { STRING_COMMA_LEN (".strtab"), 0, SHT_STRTAB, 0 },
2748 { STRING_COMMA_LEN (".symtab"), 0, SHT_SYMTAB, 0 },
60ff4dc4
HPN
2749 /* See struct bfd_elf_special_section declaration for the semantics of
2750 this special case where .prefix_length != strlen (.prefix). */
2751 { ".stabstr", 5, 3, SHT_STRTAB, 0 },
07d6d2b8 2752 { NULL, 0, 0, 0, 0 }
2f89ff8d
L
2753};
2754
b35d266b 2755static const struct bfd_elf_special_section special_sections_t[] =
7f4d3958 2756{
07d6d2b8
AM
2757 { STRING_COMMA_LEN (".text"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2758 { STRING_COMMA_LEN (".tbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
0112cd26 2759 { STRING_COMMA_LEN (".tdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
07d6d2b8 2760 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2761};
2762
1b315056
CS
2763static const struct bfd_elf_special_section special_sections_z[] =
2764{
07d6d2b8
AM
2765 { STRING_COMMA_LEN (".zdebug_line"), 0, SHT_PROGBITS, 0 },
2766 { STRING_COMMA_LEN (".zdebug_info"), 0, SHT_PROGBITS, 0 },
1b315056
CS
2767 { STRING_COMMA_LEN (".zdebug_abbrev"), 0, SHT_PROGBITS, 0 },
2768 { STRING_COMMA_LEN (".zdebug_aranges"), 0, SHT_PROGBITS, 0 },
07d6d2b8 2769 { NULL, 0, 0, 0, 0 }
1b315056
CS
2770};
2771
e4c93b56 2772static const struct bfd_elf_special_section * const special_sections[] =
7f4d3958 2773{
7f4d3958 2774 special_sections_b, /* 'b' */
98ece1b3 2775 special_sections_c, /* 'c' */
7f4d3958
L
2776 special_sections_d, /* 'd' */
2777 NULL, /* 'e' */
2778 special_sections_f, /* 'f' */
2779 special_sections_g, /* 'g' */
2780 special_sections_h, /* 'h' */
2781 special_sections_i, /* 'i' */
2782 NULL, /* 'j' */
2783 NULL, /* 'k' */
2784 special_sections_l, /* 'l' */
2785 NULL, /* 'm' */
2786 special_sections_n, /* 'n' */
2787 NULL, /* 'o' */
2788 special_sections_p, /* 'p' */
2789 NULL, /* 'q' */
2790 special_sections_r, /* 'r' */
2791 special_sections_s, /* 's' */
2792 special_sections_t, /* 't' */
1b315056
CS
2793 NULL, /* 'u' */
2794 NULL, /* 'v' */
2795 NULL, /* 'w' */
2796 NULL, /* 'x' */
2797 NULL, /* 'y' */
2798 special_sections_z /* 'z' */
7f4d3958
L
2799};
2800
551b43fd
AM
2801const struct bfd_elf_special_section *
2802_bfd_elf_get_special_section (const char *name,
2803 const struct bfd_elf_special_section *spec,
2804 unsigned int rela)
2f89ff8d
L
2805{
2806 int i;
7f4d3958 2807 int len;
7f4d3958 2808
551b43fd 2809 len = strlen (name);
7f4d3958 2810
551b43fd 2811 for (i = 0; spec[i].prefix != NULL; i++)
7dcb9820
AM
2812 {
2813 int suffix_len;
551b43fd 2814 int prefix_len = spec[i].prefix_length;
7dcb9820
AM
2815
2816 if (len < prefix_len)
2817 continue;
551b43fd 2818 if (memcmp (name, spec[i].prefix, prefix_len) != 0)
7dcb9820
AM
2819 continue;
2820
551b43fd 2821 suffix_len = spec[i].suffix_length;
7dcb9820
AM
2822 if (suffix_len <= 0)
2823 {
2824 if (name[prefix_len] != 0)
2825 {
2826 if (suffix_len == 0)
2827 continue;
2828 if (name[prefix_len] != '.'
2829 && (suffix_len == -2
551b43fd 2830 || (rela && spec[i].type == SHT_REL)))
7dcb9820
AM
2831 continue;
2832 }
2833 }
2834 else
2835 {
2836 if (len < prefix_len + suffix_len)
2837 continue;
2838 if (memcmp (name + len - suffix_len,
551b43fd 2839 spec[i].prefix + prefix_len,
7dcb9820
AM
2840 suffix_len) != 0)
2841 continue;
2842 }
551b43fd 2843 return &spec[i];
7dcb9820 2844 }
2f89ff8d
L
2845
2846 return NULL;
2847}
2848
7dcb9820 2849const struct bfd_elf_special_section *
29ef7005 2850_bfd_elf_get_sec_type_attr (bfd *abfd, asection *sec)
2f89ff8d 2851{
551b43fd
AM
2852 int i;
2853 const struct bfd_elf_special_section *spec;
29ef7005 2854 const struct elf_backend_data *bed;
2f89ff8d
L
2855
2856 /* See if this is one of the special sections. */
551b43fd
AM
2857 if (sec->name == NULL)
2858 return NULL;
2f89ff8d 2859
29ef7005
L
2860 bed = get_elf_backend_data (abfd);
2861 spec = bed->special_sections;
2862 if (spec)
2863 {
2864 spec = _bfd_elf_get_special_section (sec->name,
2865 bed->special_sections,
2866 sec->use_rela_p);
2867 if (spec != NULL)
2868 return spec;
2869 }
2870
551b43fd
AM
2871 if (sec->name[0] != '.')
2872 return NULL;
2f89ff8d 2873
551b43fd 2874 i = sec->name[1] - 'b';
1b315056 2875 if (i < 0 || i > 'z' - 'b')
551b43fd
AM
2876 return NULL;
2877
2878 spec = special_sections[i];
2f89ff8d 2879
551b43fd
AM
2880 if (spec == NULL)
2881 return NULL;
2882
2883 return _bfd_elf_get_special_section (sec->name, spec, sec->use_rela_p);
2f89ff8d
L
2884}
2885
b34976b6 2886bfd_boolean
217aa764 2887_bfd_elf_new_section_hook (bfd *abfd, asection *sec)
252b5132
RH
2888{
2889 struct bfd_elf_section_data *sdata;
551b43fd 2890 const struct elf_backend_data *bed;
7dcb9820 2891 const struct bfd_elf_special_section *ssect;
252b5132 2892
f0abc2a1
AM
2893 sdata = (struct bfd_elf_section_data *) sec->used_by_bfd;
2894 if (sdata == NULL)
2895 {
a50b1753 2896 sdata = (struct bfd_elf_section_data *) bfd_zalloc (abfd,
07d6d2b8 2897 sizeof (*sdata));
f0abc2a1
AM
2898 if (sdata == NULL)
2899 return FALSE;
217aa764 2900 sec->used_by_bfd = sdata;
f0abc2a1 2901 }
bf572ba0 2902
551b43fd
AM
2903 /* Indicate whether or not this section should use RELA relocations. */
2904 bed = get_elf_backend_data (abfd);
2905 sec->use_rela_p = bed->default_use_rela_p;
2906
8c803a2d
AM
2907 /* Set up ELF section type and flags for newly created sections, if
2908 there is an ABI mandated section. */
2909 ssect = (*bed->get_sec_type_attr) (abfd, sec);
2910 if (ssect != NULL)
2f89ff8d 2911 {
8c803a2d
AM
2912 elf_section_type (sec) = ssect->type;
2913 elf_section_flags (sec) = ssect->attr;
2f89ff8d
L
2914 }
2915
f592407e 2916 return _bfd_generic_new_section_hook (abfd, sec);
252b5132
RH
2917}
2918
2919/* Create a new bfd section from an ELF program header.
2920
2921 Since program segments have no names, we generate a synthetic name
2922 of the form segment<NUM>, where NUM is generally the index in the
2923 program header table. For segments that are split (see below) we
2924 generate the names segment<NUM>a and segment<NUM>b.
2925
2926 Note that some program segments may have a file size that is different than
2927 (less than) the memory size. All this means is that at execution the
2928 system must allocate the amount of memory specified by the memory size,
2929 but only initialize it with the first "file size" bytes read from the
2930 file. This would occur for example, with program segments consisting
2931 of combined data+bss.
2932
2933 To handle the above situation, this routine generates TWO bfd sections
2934 for the single program segment. The first has the length specified by
2935 the file size of the segment, and the second has the length specified
2936 by the difference between the two sizes. In effect, the segment is split
d5191d0c 2937 into its initialized and uninitialized parts.
252b5132
RH
2938
2939 */
2940
b34976b6 2941bfd_boolean
217aa764
AM
2942_bfd_elf_make_section_from_phdr (bfd *abfd,
2943 Elf_Internal_Phdr *hdr,
91d6fa6a 2944 int hdr_index,
a50b1753 2945 const char *type_name)
252b5132
RH
2946{
2947 asection *newsect;
2948 char *name;
2949 char namebuf[64];
d4c88bbb 2950 size_t len;
252b5132
RH
2951 int split;
2952
2953 split = ((hdr->p_memsz > 0)
2954 && (hdr->p_filesz > 0)
2955 && (hdr->p_memsz > hdr->p_filesz));
d5191d0c
AM
2956
2957 if (hdr->p_filesz > 0)
252b5132 2958 {
91d6fa6a 2959 sprintf (namebuf, "%s%d%s", type_name, hdr_index, split ? "a" : "");
d5191d0c 2960 len = strlen (namebuf) + 1;
a50b1753 2961 name = (char *) bfd_alloc (abfd, len);
d5191d0c
AM
2962 if (!name)
2963 return FALSE;
2964 memcpy (name, namebuf, len);
2965 newsect = bfd_make_section (abfd, name);
2966 if (newsect == NULL)
2967 return FALSE;
2968 newsect->vma = hdr->p_vaddr;
2969 newsect->lma = hdr->p_paddr;
2970 newsect->size = hdr->p_filesz;
2971 newsect->filepos = hdr->p_offset;
2972 newsect->flags |= SEC_HAS_CONTENTS;
2973 newsect->alignment_power = bfd_log2 (hdr->p_align);
2974 if (hdr->p_type == PT_LOAD)
252b5132 2975 {
d5191d0c
AM
2976 newsect->flags |= SEC_ALLOC;
2977 newsect->flags |= SEC_LOAD;
2978 if (hdr->p_flags & PF_X)
2979 {
2980 /* FIXME: all we known is that it has execute PERMISSION,
2981 may be data. */
2982 newsect->flags |= SEC_CODE;
2983 }
2984 }
2985 if (!(hdr->p_flags & PF_W))
2986 {
2987 newsect->flags |= SEC_READONLY;
252b5132 2988 }
252b5132
RH
2989 }
2990
d5191d0c 2991 if (hdr->p_memsz > hdr->p_filesz)
252b5132 2992 {
d5191d0c
AM
2993 bfd_vma align;
2994
91d6fa6a 2995 sprintf (namebuf, "%s%d%s", type_name, hdr_index, split ? "b" : "");
d4c88bbb 2996 len = strlen (namebuf) + 1;
a50b1753 2997 name = (char *) bfd_alloc (abfd, len);
252b5132 2998 if (!name)
b34976b6 2999 return FALSE;
d4c88bbb 3000 memcpy (name, namebuf, len);
252b5132
RH
3001 newsect = bfd_make_section (abfd, name);
3002 if (newsect == NULL)
b34976b6 3003 return FALSE;
252b5132
RH
3004 newsect->vma = hdr->p_vaddr + hdr->p_filesz;
3005 newsect->lma = hdr->p_paddr + hdr->p_filesz;
eea6121a 3006 newsect->size = hdr->p_memsz - hdr->p_filesz;
d5191d0c
AM
3007 newsect->filepos = hdr->p_offset + hdr->p_filesz;
3008 align = newsect->vma & -newsect->vma;
3009 if (align == 0 || align > hdr->p_align)
3010 align = hdr->p_align;
3011 newsect->alignment_power = bfd_log2 (align);
252b5132
RH
3012 if (hdr->p_type == PT_LOAD)
3013 {
d5191d0c
AM
3014 /* Hack for gdb. Segments that have not been modified do
3015 not have their contents written to a core file, on the
3016 assumption that a debugger can find the contents in the
3017 executable. We flag this case by setting the fake
3018 section size to zero. Note that "real" bss sections will
3019 always have their contents dumped to the core file. */
3020 if (bfd_get_format (abfd) == bfd_core)
3021 newsect->size = 0;
252b5132
RH
3022 newsect->flags |= SEC_ALLOC;
3023 if (hdr->p_flags & PF_X)
3024 newsect->flags |= SEC_CODE;
3025 }
3026 if (!(hdr->p_flags & PF_W))
3027 newsect->flags |= SEC_READONLY;
3028 }
3029
b34976b6 3030 return TRUE;
252b5132
RH
3031}
3032
864619bb
KS
3033static bfd_boolean
3034_bfd_elf_core_find_build_id (bfd *templ, bfd_vma offset)
3035{
3036 /* The return value is ignored. Build-ids are considered optional. */
3037 if (templ->xvec->flavour == bfd_target_elf_flavour)
3038 return (*get_elf_backend_data (templ)->elf_backend_core_find_build_id)
3039 (templ, offset);
3040 return FALSE;
3041}
3042
b34976b6 3043bfd_boolean
91d6fa6a 3044bfd_section_from_phdr (bfd *abfd, Elf_Internal_Phdr *hdr, int hdr_index)
20cfcaae 3045{
9c5bfbb7 3046 const struct elf_backend_data *bed;
20cfcaae
NC
3047
3048 switch (hdr->p_type)
3049 {
3050 case PT_NULL:
91d6fa6a 3051 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "null");
20cfcaae
NC
3052
3053 case PT_LOAD:
864619bb
KS
3054 if (! _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "load"))
3055 return FALSE;
3056 if (bfd_get_format (abfd) == bfd_core && abfd->build_id == NULL)
3057 _bfd_elf_core_find_build_id (abfd, hdr->p_offset);
3058 return TRUE;
20cfcaae
NC
3059
3060 case PT_DYNAMIC:
91d6fa6a 3061 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "dynamic");
20cfcaae
NC
3062
3063 case PT_INTERP:
91d6fa6a 3064 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "interp");
20cfcaae
NC
3065
3066 case PT_NOTE:
91d6fa6a 3067 if (! _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "note"))
b34976b6 3068 return FALSE;
276da9b3
L
3069 if (! elf_read_notes (abfd, hdr->p_offset, hdr->p_filesz,
3070 hdr->p_align))
b34976b6
AM
3071 return FALSE;
3072 return TRUE;
20cfcaae
NC
3073
3074 case PT_SHLIB:
91d6fa6a 3075 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "shlib");
20cfcaae
NC
3076
3077 case PT_PHDR:
91d6fa6a 3078 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "phdr");
20cfcaae 3079
811072d8 3080 case PT_GNU_EH_FRAME:
91d6fa6a 3081 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index,
811072d8
RM
3082 "eh_frame_hdr");
3083
2b05f1b7 3084 case PT_GNU_STACK:
91d6fa6a 3085 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "stack");
9ee5e499 3086
8c37241b 3087 case PT_GNU_RELRO:
91d6fa6a 3088 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "relro");
8c37241b 3089
20cfcaae 3090 default:
8c1acd09 3091 /* Check for any processor-specific program segment types. */
20cfcaae 3092 bed = get_elf_backend_data (abfd);
91d6fa6a 3093 return bed->elf_backend_section_from_phdr (abfd, hdr, hdr_index, "proc");
20cfcaae
NC
3094 }
3095}
3096
d4730f92
BS
3097/* Return the REL_HDR for SEC, assuming there is only a single one, either
3098 REL or RELA. */
3099
3100Elf_Internal_Shdr *
3101_bfd_elf_single_rel_hdr (asection *sec)
3102{
3103 if (elf_section_data (sec)->rel.hdr)
3104 {
3105 BFD_ASSERT (elf_section_data (sec)->rela.hdr == NULL);
3106 return elf_section_data (sec)->rel.hdr;
3107 }
3108 else
3109 return elf_section_data (sec)->rela.hdr;
3110}
3111
3e19fb8f
L
3112static bfd_boolean
3113_bfd_elf_set_reloc_sh_name (bfd *abfd,
3114 Elf_Internal_Shdr *rel_hdr,
3115 const char *sec_name,
3116 bfd_boolean use_rela_p)
3117{
3118 char *name = (char *) bfd_alloc (abfd,
3119 sizeof ".rela" + strlen (sec_name));
3120 if (name == NULL)
3121 return FALSE;
3122
3123 sprintf (name, "%s%s", use_rela_p ? ".rela" : ".rel", sec_name);
3124 rel_hdr->sh_name =
3125 (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd), name,
3126 FALSE);
3127 if (rel_hdr->sh_name == (unsigned int) -1)
3128 return FALSE;
3129
3130 return TRUE;
3131}
3132
d4730f92
BS
3133/* Allocate and initialize a section-header for a new reloc section,
3134 containing relocations against ASECT. It is stored in RELDATA. If
3135 USE_RELA_P is TRUE, we use RELA relocations; otherwise, we use REL
3136 relocations. */
23bc299b 3137
5d13b3b3 3138static bfd_boolean
217aa764 3139_bfd_elf_init_reloc_shdr (bfd *abfd,
d4730f92 3140 struct bfd_elf_section_reloc_data *reldata,
f6fe1ccd 3141 const char *sec_name,
3e19fb8f
L
3142 bfd_boolean use_rela_p,
3143 bfd_boolean delay_st_name_p)
23bc299b 3144{
d4730f92 3145 Elf_Internal_Shdr *rel_hdr;
9c5bfbb7 3146 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
d4730f92 3147
d4730f92 3148 BFD_ASSERT (reldata->hdr == NULL);
ef53be89 3149 rel_hdr = bfd_zalloc (abfd, sizeof (*rel_hdr));
d4730f92 3150 reldata->hdr = rel_hdr;
23bc299b 3151
3e19fb8f
L
3152 if (delay_st_name_p)
3153 rel_hdr->sh_name = (unsigned int) -1;
3154 else if (!_bfd_elf_set_reloc_sh_name (abfd, rel_hdr, sec_name,
3155 use_rela_p))
b34976b6 3156 return FALSE;
23bc299b
MM
3157 rel_hdr->sh_type = use_rela_p ? SHT_RELA : SHT_REL;
3158 rel_hdr->sh_entsize = (use_rela_p
3159 ? bed->s->sizeof_rela
3160 : bed->s->sizeof_rel);
72de5009 3161 rel_hdr->sh_addralign = (bfd_vma) 1 << bed->s->log_file_align;
28e07a05 3162 rel_hdr->sh_flags = 0;
23bc299b
MM
3163 rel_hdr->sh_addr = 0;
3164 rel_hdr->sh_size = 0;
3165 rel_hdr->sh_offset = 0;
3166
b34976b6 3167 return TRUE;
23bc299b
MM
3168}
3169
94be91de
JB
3170/* Return the default section type based on the passed in section flags. */
3171
3172int
3173bfd_elf_get_default_section_type (flagword flags)
3174{
0e41bebb 3175 if ((flags & (SEC_ALLOC | SEC_IS_COMMON)) != 0
2e76e85a 3176 && (flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
94be91de
JB
3177 return SHT_NOBITS;
3178 return SHT_PROGBITS;
3179}
3180
d4730f92
BS
3181struct fake_section_arg
3182{
3183 struct bfd_link_info *link_info;
3184 bfd_boolean failed;
3185};
3186
252b5132
RH
3187/* Set up an ELF internal section header for a section. */
3188
252b5132 3189static void
d4730f92 3190elf_fake_sections (bfd *abfd, asection *asect, void *fsarg)
252b5132 3191{
d4730f92 3192 struct fake_section_arg *arg = (struct fake_section_arg *)fsarg;
9c5bfbb7 3193 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
d4730f92 3194 struct bfd_elf_section_data *esd = elf_section_data (asect);
252b5132 3195 Elf_Internal_Shdr *this_hdr;
0414f35b 3196 unsigned int sh_type;
0ce398f1 3197 const char *name = asect->name;
3e19fb8f 3198 bfd_boolean delay_st_name_p = FALSE;
233bf4f8 3199 bfd_vma mask;
252b5132 3200
d4730f92 3201 if (arg->failed)
252b5132
RH
3202 {
3203 /* We already failed; just get out of the bfd_map_over_sections
08a40648 3204 loop. */
252b5132
RH
3205 return;
3206 }
3207
d4730f92 3208 this_hdr = &esd->this_hdr;
252b5132 3209
f6fe1ccd 3210 if (arg->link_info)
0ce398f1 3211 {
f6fe1ccd
L
3212 /* ld: compress DWARF debug sections with names: .debug_*. */
3213 if ((arg->link_info->compress_debug & COMPRESS_DEBUG)
3214 && (asect->flags & SEC_DEBUGGING)
3215 && name[1] == 'd'
3216 && name[6] == '_')
3217 {
3218 /* Set SEC_ELF_COMPRESS to indicate this section should be
3219 compressed. */
3220 asect->flags |= SEC_ELF_COMPRESS;
0ce398f1 3221
dd905818 3222 /* If this section will be compressed, delay adding section
3e19fb8f
L
3223 name to section name section after it is compressed in
3224 _bfd_elf_assign_file_positions_for_non_load. */
3225 delay_st_name_p = TRUE;
f6fe1ccd
L
3226 }
3227 }
3228 else if ((asect->flags & SEC_ELF_RENAME))
3229 {
3230 /* objcopy: rename output DWARF debug section. */
3231 if ((abfd->flags & (BFD_DECOMPRESS | BFD_COMPRESS_GABI)))
3232 {
3233 /* When we decompress or compress with SHF_COMPRESSED,
3234 convert section name from .zdebug_* to .debug_* if
3235 needed. */
3236 if (name[1] == 'z')
3237 {
3238 char *new_name = convert_zdebug_to_debug (abfd, name);
3239 if (new_name == NULL)
3240 {
3241 arg->failed = TRUE;
3242 return;
3243 }
3244 name = new_name;
3245 }
3246 }
3247 else if (asect->compress_status == COMPRESS_SECTION_DONE)
0ce398f1 3248 {
f6fe1ccd
L
3249 /* PR binutils/18087: Compression does not always make a
3250 section smaller. So only rename the section when
3251 compression has actually taken place. If input section
3252 name is .zdebug_*, we should never compress it again. */
3253 char *new_name = convert_debug_to_zdebug (abfd, name);
0ce398f1
L
3254 if (new_name == NULL)
3255 {
3256 arg->failed = TRUE;
3257 return;
3258 }
f6fe1ccd
L
3259 BFD_ASSERT (name[1] != 'z');
3260 name = new_name;
0ce398f1
L
3261 }
3262 }
3263
3e19fb8f
L
3264 if (delay_st_name_p)
3265 this_hdr->sh_name = (unsigned int) -1;
3266 else
252b5132 3267 {
3e19fb8f
L
3268 this_hdr->sh_name
3269 = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
3270 name, FALSE);
3271 if (this_hdr->sh_name == (unsigned int) -1)
3272 {
3273 arg->failed = TRUE;
3274 return;
3275 }
252b5132
RH
3276 }
3277
a4d8e49b 3278 /* Don't clear sh_flags. Assembler may set additional bits. */
252b5132
RH
3279
3280 if ((asect->flags & SEC_ALLOC) != 0
3281 || asect->user_set_vma)
3282 this_hdr->sh_addr = asect->vma;
3283 else
3284 this_hdr->sh_addr = 0;
3285
3286 this_hdr->sh_offset = 0;
eea6121a 3287 this_hdr->sh_size = asect->size;
252b5132 3288 this_hdr->sh_link = 0;
c86934ce
NC
3289 /* PR 17512: file: 0eb809fe, 8b0535ee. */
3290 if (asect->alignment_power >= (sizeof (bfd_vma) * 8) - 1)
3291 {
4eca0228 3292 _bfd_error_handler
695344c0 3293 /* xgettext:c-format */
9793eb77 3294 (_("%pB: error: alignment power %d of section `%pA' is too big"),
c08bb8dd 3295 abfd, asect->alignment_power, asect);
c86934ce
NC
3296 arg->failed = TRUE;
3297 return;
3298 }
233bf4f8
AM
3299 /* Set sh_addralign to the highest power of two given by alignment
3300 consistent with the section VMA. Linker scripts can force VMA. */
3301 mask = ((bfd_vma) 1 << asect->alignment_power) | this_hdr->sh_addr;
3302 this_hdr->sh_addralign = mask & -mask;
252b5132
RH
3303 /* The sh_entsize and sh_info fields may have been set already by
3304 copy_private_section_data. */
3305
3306 this_hdr->bfd_section = asect;
3307 this_hdr->contents = NULL;
3308
3cddba1e
L
3309 /* If the section type is unspecified, we set it based on
3310 asect->flags. */
98ece1b3
AM
3311 if ((asect->flags & SEC_GROUP) != 0)
3312 sh_type = SHT_GROUP;
98ece1b3 3313 else
94be91de 3314 sh_type = bfd_elf_get_default_section_type (asect->flags);
98ece1b3 3315
3cddba1e 3316 if (this_hdr->sh_type == SHT_NULL)
98ece1b3
AM
3317 this_hdr->sh_type = sh_type;
3318 else if (this_hdr->sh_type == SHT_NOBITS
3319 && sh_type == SHT_PROGBITS
3320 && (asect->flags & SEC_ALLOC) != 0)
3cddba1e 3321 {
98ece1b3
AM
3322 /* Warn if we are changing a NOBITS section to PROGBITS, but
3323 allow the link to proceed. This can happen when users link
3324 non-bss input sections to bss output sections, or emit data
3325 to a bss output section via a linker script. */
4eca0228 3326 _bfd_error_handler
871b3ab2 3327 (_("warning: section `%pA' type changed to PROGBITS"), asect);
98ece1b3 3328 this_hdr->sh_type = sh_type;
3cddba1e
L
3329 }
3330
2f89ff8d 3331 switch (this_hdr->sh_type)
252b5132 3332 {
2f89ff8d 3333 default:
2f89ff8d
L
3334 break;
3335
3336 case SHT_STRTAB:
2f89ff8d
L
3337 case SHT_NOTE:
3338 case SHT_NOBITS:
3339 case SHT_PROGBITS:
3340 break;
606851fb
AM
3341
3342 case SHT_INIT_ARRAY:
3343 case SHT_FINI_ARRAY:
3344 case SHT_PREINIT_ARRAY:
3345 this_hdr->sh_entsize = bed->s->arch_size / 8;
3346 break;
2f89ff8d
L
3347
3348 case SHT_HASH:
c7ac6ff8 3349 this_hdr->sh_entsize = bed->s->sizeof_hash_entry;
2f89ff8d 3350 break;
5de3bf90 3351
2f89ff8d 3352 case SHT_DYNSYM:
252b5132 3353 this_hdr->sh_entsize = bed->s->sizeof_sym;
2f89ff8d
L
3354 break;
3355
3356 case SHT_DYNAMIC:
252b5132 3357 this_hdr->sh_entsize = bed->s->sizeof_dyn;
2f89ff8d
L
3358 break;
3359
3360 case SHT_RELA:
3361 if (get_elf_backend_data (abfd)->may_use_rela_p)
3362 this_hdr->sh_entsize = bed->s->sizeof_rela;
3363 break;
3364
3365 case SHT_REL:
3366 if (get_elf_backend_data (abfd)->may_use_rel_p)
3367 this_hdr->sh_entsize = bed->s->sizeof_rel;
3368 break;
3369
3370 case SHT_GNU_versym:
252b5132 3371 this_hdr->sh_entsize = sizeof (Elf_External_Versym);
2f89ff8d
L
3372 break;
3373
3374 case SHT_GNU_verdef:
252b5132
RH
3375 this_hdr->sh_entsize = 0;
3376 /* objcopy or strip will copy over sh_info, but may not set
08a40648
AM
3377 cverdefs. The linker will set cverdefs, but sh_info will be
3378 zero. */
252b5132
RH
3379 if (this_hdr->sh_info == 0)
3380 this_hdr->sh_info = elf_tdata (abfd)->cverdefs;
3381 else
3382 BFD_ASSERT (elf_tdata (abfd)->cverdefs == 0
3383 || this_hdr->sh_info == elf_tdata (abfd)->cverdefs);
2f89ff8d
L
3384 break;
3385
3386 case SHT_GNU_verneed:
252b5132
RH
3387 this_hdr->sh_entsize = 0;
3388 /* objcopy or strip will copy over sh_info, but may not set
08a40648
AM
3389 cverrefs. The linker will set cverrefs, but sh_info will be
3390 zero. */
252b5132
RH
3391 if (this_hdr->sh_info == 0)
3392 this_hdr->sh_info = elf_tdata (abfd)->cverrefs;
3393 else
3394 BFD_ASSERT (elf_tdata (abfd)->cverrefs == 0
3395 || this_hdr->sh_info == elf_tdata (abfd)->cverrefs);
2f89ff8d
L
3396 break;
3397
3398 case SHT_GROUP:
1783205a 3399 this_hdr->sh_entsize = GRP_ENTRY_SIZE;
2f89ff8d 3400 break;
fdc90cb4
JJ
3401
3402 case SHT_GNU_HASH:
3403 this_hdr->sh_entsize = bed->s->arch_size == 64 ? 0 : 4;
3404 break;
dbb410c3 3405 }
252b5132
RH
3406
3407 if ((asect->flags & SEC_ALLOC) != 0)
3408 this_hdr->sh_flags |= SHF_ALLOC;
3409 if ((asect->flags & SEC_READONLY) == 0)
3410 this_hdr->sh_flags |= SHF_WRITE;
3411 if ((asect->flags & SEC_CODE) != 0)
3412 this_hdr->sh_flags |= SHF_EXECINSTR;
f5fa8ca2
JJ
3413 if ((asect->flags & SEC_MERGE) != 0)
3414 {
3415 this_hdr->sh_flags |= SHF_MERGE;
3416 this_hdr->sh_entsize = asect->entsize;
f5fa8ca2 3417 }
84865015
NC
3418 if ((asect->flags & SEC_STRINGS) != 0)
3419 this_hdr->sh_flags |= SHF_STRINGS;
1126897b 3420 if ((asect->flags & SEC_GROUP) == 0 && elf_group_name (asect) != NULL)
dbb410c3 3421 this_hdr->sh_flags |= SHF_GROUP;
13ae64f3 3422 if ((asect->flags & SEC_THREAD_LOCAL) != 0)
704afa60
JJ
3423 {
3424 this_hdr->sh_flags |= SHF_TLS;
3a800eb9
AM
3425 if (asect->size == 0
3426 && (asect->flags & SEC_HAS_CONTENTS) == 0)
704afa60 3427 {
3a800eb9 3428 struct bfd_link_order *o = asect->map_tail.link_order;
b34976b6 3429
704afa60 3430 this_hdr->sh_size = 0;
3a800eb9
AM
3431 if (o != NULL)
3432 {
704afa60 3433 this_hdr->sh_size = o->offset + o->size;
3a800eb9
AM
3434 if (this_hdr->sh_size != 0)
3435 this_hdr->sh_type = SHT_NOBITS;
3436 }
704afa60
JJ
3437 }
3438 }
18ae9cc1
L
3439 if ((asect->flags & (SEC_GROUP | SEC_EXCLUDE)) == SEC_EXCLUDE)
3440 this_hdr->sh_flags |= SHF_EXCLUDE;
252b5132 3441
d4730f92
BS
3442 /* If the section has relocs, set up a section header for the
3443 SHT_REL[A] section. If two relocation sections are required for
3444 this section, it is up to the processor-specific back-end to
3445 create the other. */
3446 if ((asect->flags & SEC_RELOC) != 0)
3447 {
3448 /* When doing a relocatable link, create both REL and RELA sections if
3449 needed. */
3450 if (arg->link_info
3451 /* Do the normal setup if we wouldn't create any sections here. */
3452 && esd->rel.count + esd->rela.count > 0
0e1862bb
L
3453 && (bfd_link_relocatable (arg->link_info)
3454 || arg->link_info->emitrelocations))
d4730f92
BS
3455 {
3456 if (esd->rel.count && esd->rel.hdr == NULL
28e07a05 3457 && !_bfd_elf_init_reloc_shdr (abfd, &esd->rel, name,
db4677b8 3458 FALSE, delay_st_name_p))
d4730f92
BS
3459 {
3460 arg->failed = TRUE;
3461 return;
3462 }
3463 if (esd->rela.count && esd->rela.hdr == NULL
28e07a05 3464 && !_bfd_elf_init_reloc_shdr (abfd, &esd->rela, name,
db4677b8 3465 TRUE, delay_st_name_p))
d4730f92
BS
3466 {
3467 arg->failed = TRUE;
3468 return;
3469 }
3470 }
3471 else if (!_bfd_elf_init_reloc_shdr (abfd,
3472 (asect->use_rela_p
3473 ? &esd->rela : &esd->rel),
f6fe1ccd 3474 name,
3e19fb8f
L
3475 asect->use_rela_p,
3476 delay_st_name_p))
db4677b8 3477 {
d4730f92 3478 arg->failed = TRUE;
db4677b8
AM
3479 return;
3480 }
d4730f92
BS
3481 }
3482
252b5132 3483 /* Check for processor-specific section types. */
0414f35b 3484 sh_type = this_hdr->sh_type;
e1fddb6b
AO
3485 if (bed->elf_backend_fake_sections
3486 && !(*bed->elf_backend_fake_sections) (abfd, this_hdr, asect))
db4677b8
AM
3487 {
3488 arg->failed = TRUE;
3489 return;
3490 }
252b5132 3491
42bb2e33 3492 if (sh_type == SHT_NOBITS && asect->size != 0)
0414f35b
AM
3493 {
3494 /* Don't change the header type from NOBITS if we are being
42bb2e33 3495 called for objcopy --only-keep-debug. */
0414f35b
AM
3496 this_hdr->sh_type = sh_type;
3497 }
252b5132
RH
3498}
3499
bcacc0f5
AM
3500/* Fill in the contents of a SHT_GROUP section. Called from
3501 _bfd_elf_compute_section_file_positions for gas, objcopy, and
3502 when ELF targets use the generic linker, ld. Called for ld -r
3503 from bfd_elf_final_link. */
dbb410c3 3504
1126897b 3505void
217aa764 3506bfd_elf_set_group_contents (bfd *abfd, asection *sec, void *failedptrarg)
dbb410c3 3507{
a50b1753 3508 bfd_boolean *failedptr = (bfd_boolean *) failedptrarg;
9dce4196 3509 asection *elt, *first;
dbb410c3 3510 unsigned char *loc;
b34976b6 3511 bfd_boolean gas;
dbb410c3 3512
7e4111ad
L
3513 /* Ignore linker created group section. See elfNN_ia64_object_p in
3514 elfxx-ia64.c. */
ce5aecf8
AM
3515 if ((sec->flags & (SEC_GROUP | SEC_LINKER_CREATED)) != SEC_GROUP
3516 || sec->size == 0
dbb410c3
AM
3517 || *failedptr)
3518 return;
3519
bcacc0f5
AM
3520 if (elf_section_data (sec)->this_hdr.sh_info == 0)
3521 {
3522 unsigned long symindx = 0;
3523
3524 /* elf_group_id will have been set up by objcopy and the
3525 generic linker. */
3526 if (elf_group_id (sec) != NULL)
3527 symindx = elf_group_id (sec)->udata.i;
1126897b 3528
bcacc0f5
AM
3529 if (symindx == 0)
3530 {
3531 /* If called from the assembler, swap_out_syms will have set up
3532 elf_section_syms. */
3533 BFD_ASSERT (elf_section_syms (abfd) != NULL);
3534 symindx = elf_section_syms (abfd)[sec->index]->udata.i;
3535 }
3536 elf_section_data (sec)->this_hdr.sh_info = symindx;
3537 }
3538 else if (elf_section_data (sec)->this_hdr.sh_info == (unsigned int) -2)
1126897b 3539 {
bcacc0f5
AM
3540 /* The ELF backend linker sets sh_info to -2 when the group
3541 signature symbol is global, and thus the index can't be
3542 set until all local symbols are output. */
53720c49
AM
3543 asection *igroup;
3544 struct bfd_elf_section_data *sec_data;
3545 unsigned long symndx;
3546 unsigned long extsymoff;
bcacc0f5
AM
3547 struct elf_link_hash_entry *h;
3548
53720c49
AM
3549 /* The point of this little dance to the first SHF_GROUP section
3550 then back to the SHT_GROUP section is that this gets us to
3551 the SHT_GROUP in the input object. */
3552 igroup = elf_sec_group (elf_next_in_group (sec));
3553 sec_data = elf_section_data (igroup);
3554 symndx = sec_data->this_hdr.sh_info;
3555 extsymoff = 0;
bcacc0f5
AM
3556 if (!elf_bad_symtab (igroup->owner))
3557 {
3558 Elf_Internal_Shdr *symtab_hdr;
3559
3560 symtab_hdr = &elf_tdata (igroup->owner)->symtab_hdr;
3561 extsymoff = symtab_hdr->sh_info;
3562 }
3563 h = elf_sym_hashes (igroup->owner)[symndx - extsymoff];
3564 while (h->root.type == bfd_link_hash_indirect
3565 || h->root.type == bfd_link_hash_warning)
3566 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3567
3568 elf_section_data (sec)->this_hdr.sh_info = h->indx;
1126897b 3569 }
dbb410c3 3570
1126897b 3571 /* The contents won't be allocated for "ld -r" or objcopy. */
b34976b6 3572 gas = TRUE;
dbb410c3
AM
3573 if (sec->contents == NULL)
3574 {
b34976b6 3575 gas = FALSE;
a50b1753 3576 sec->contents = (unsigned char *) bfd_alloc (abfd, sec->size);
9dce4196
AM
3577
3578 /* Arrange for the section to be written out. */
3579 elf_section_data (sec)->this_hdr.contents = sec->contents;
dbb410c3
AM
3580 if (sec->contents == NULL)
3581 {
b34976b6 3582 *failedptr = TRUE;
dbb410c3
AM
3583 return;
3584 }
3585 }
3586
eea6121a 3587 loc = sec->contents + sec->size;
dbb410c3 3588
9dce4196
AM
3589 /* Get the pointer to the first section in the group that gas
3590 squirreled away here. objcopy arranges for this to be set to the
3591 start of the input section group. */
3592 first = elt = elf_next_in_group (sec);
dbb410c3
AM
3593
3594 /* First element is a flag word. Rest of section is elf section
3595 indices for all the sections of the group. Write them backwards
3596 just to keep the group in the same order as given in .section
3597 directives, not that it matters. */
3598 while (elt != NULL)
3599 {
9dce4196 3600 asection *s;
9dce4196 3601
9dce4196 3602 s = elt;
415f38a6
AM
3603 if (!gas)
3604 s = s->output_section;
3605 if (s != NULL
3606 && !bfd_is_abs_section (s))
01e1a5bc 3607 {
db4677b8 3608 struct bfd_elf_section_data *elf_sec = elf_section_data (s);
28e07a05
AM
3609 struct bfd_elf_section_data *input_elf_sec = elf_section_data (elt);
3610
3611 if (elf_sec->rel.hdr != NULL
3612 && (gas
3613 || (input_elf_sec->rel.hdr != NULL
3614 && input_elf_sec->rel.hdr->sh_flags & SHF_GROUP) != 0))
db4677b8 3615 {
28e07a05 3616 elf_sec->rel.hdr->sh_flags |= SHF_GROUP;
db4677b8
AM
3617 loc -= 4;
3618 H_PUT_32 (abfd, elf_sec->rel.idx, loc);
3619 }
28e07a05
AM
3620 if (elf_sec->rela.hdr != NULL
3621 && (gas
3622 || (input_elf_sec->rela.hdr != NULL
3623 && input_elf_sec->rela.hdr->sh_flags & SHF_GROUP) != 0))
db4677b8 3624 {
28e07a05 3625 elf_sec->rela.hdr->sh_flags |= SHF_GROUP;
db4677b8
AM
3626 loc -= 4;
3627 H_PUT_32 (abfd, elf_sec->rela.idx, loc);
3628 }
01e1a5bc 3629 loc -= 4;
db4677b8 3630 H_PUT_32 (abfd, elf_sec->this_idx, loc);
01e1a5bc 3631 }
945906ff 3632 elt = elf_next_in_group (elt);
9dce4196
AM
3633 if (elt == first)
3634 break;
dbb410c3
AM
3635 }
3636
7bdf4127
AB
3637 loc -= 4;
3638 BFD_ASSERT (loc == sec->contents);
dbb410c3 3639
9dce4196 3640 H_PUT_32 (abfd, sec->flags & SEC_LINK_ONCE ? GRP_COMDAT : 0, loc);
dbb410c3
AM
3641}
3642
bce964aa
AM
3643/* Given NAME, the name of a relocation section stripped of its
3644 .rel/.rela prefix, return the section in ABFD to which the
3645 relocations apply. */
bd53a53a
L
3646
3647asection *
bce964aa
AM
3648_bfd_elf_plt_get_reloc_section (bfd *abfd, const char *name)
3649{
3650 /* If a target needs .got.plt section, relocations in rela.plt/rel.plt
3651 section likely apply to .got.plt or .got section. */
3652 if (get_elf_backend_data (abfd)->want_got_plt
3653 && strcmp (name, ".plt") == 0)
3654 {
3655 asection *sec;
3656
3657 name = ".got.plt";
3658 sec = bfd_get_section_by_name (abfd, name);
3659 if (sec != NULL)
3660 return sec;
3661 name = ".got";
3662 }
3663
3664 return bfd_get_section_by_name (abfd, name);
3665}
3666
3667/* Return the section to which RELOC_SEC applies. */
3668
3669static asection *
3670elf_get_reloc_section (asection *reloc_sec)
bd53a53a
L
3671{
3672 const char *name;
3673 unsigned int type;
3674 bfd *abfd;
bce964aa 3675 const struct elf_backend_data *bed;
bd53a53a
L
3676
3677 type = elf_section_data (reloc_sec)->this_hdr.sh_type;
3678 if (type != SHT_REL && type != SHT_RELA)
3679 return NULL;
3680
3681 /* We look up the section the relocs apply to by name. */
3682 name = reloc_sec->name;
bce964aa
AM
3683 if (strncmp (name, ".rel", 4) != 0)
3684 return NULL;
3685 name += 4;
3686 if (type == SHT_RELA && *name++ != 'a')
3687 return NULL;
bd53a53a 3688
bd53a53a 3689 abfd = reloc_sec->owner;
bce964aa
AM
3690 bed = get_elf_backend_data (abfd);
3691 return bed->get_reloc_section (abfd, name);
bd53a53a
L
3692}
3693
252b5132
RH
3694/* Assign all ELF section numbers. The dummy first section is handled here
3695 too. The link/info pointers for the standard section types are filled
3696 in here too, while we're at it. */
3697
b34976b6 3698static bfd_boolean
da9f89d4 3699assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
252b5132
RH
3700{
3701 struct elf_obj_tdata *t = elf_tdata (abfd);
3702 asection *sec;
3e19fb8f 3703 unsigned int section_number;
252b5132 3704 Elf_Internal_Shdr **i_shdrp;
47cc2cf5 3705 struct bfd_elf_section_data *d;
3516e984 3706 bfd_boolean need_symtab;
446f7ed5 3707 size_t amt;
252b5132
RH
3708
3709 section_number = 1;
3710
2b0f7ef9
JJ
3711 _bfd_elf_strtab_clear_all_refs (elf_shstrtab (abfd));
3712
da9f89d4 3713 /* SHT_GROUP sections are in relocatable files only. */
7bdf4127 3714 if (link_info == NULL || !link_info->resolve_section_groups)
252b5132 3715 {
ef53be89 3716 size_t reloc_count = 0;
14f2c699 3717
da9f89d4 3718 /* Put SHT_GROUP sections first. */
04dd1667 3719 for (sec = abfd->sections; sec != NULL; sec = sec->next)
47cc2cf5 3720 {
5daa8fe7 3721 d = elf_section_data (sec);
da9f89d4
L
3722
3723 if (d->this_hdr.sh_type == SHT_GROUP)
08a40648 3724 {
5daa8fe7 3725 if (sec->flags & SEC_LINKER_CREATED)
da9f89d4
L
3726 {
3727 /* Remove the linker created SHT_GROUP sections. */
5daa8fe7 3728 bfd_section_list_remove (abfd, sec);
da9f89d4 3729 abfd->section_count--;
da9f89d4 3730 }
08a40648 3731 else
4fbb74a6 3732 d->this_idx = section_number++;
da9f89d4 3733 }
14f2c699
L
3734
3735 /* Count relocations. */
3736 reloc_count += sec->reloc_count;
47cc2cf5 3737 }
14f2c699
L
3738
3739 /* Clear HAS_RELOC if there are no relocations. */
3740 if (reloc_count == 0)
3741 abfd->flags &= ~HAS_RELOC;
47cc2cf5
PB
3742 }
3743
3744 for (sec = abfd->sections; sec; sec = sec->next)
3745 {
3746 d = elf_section_data (sec);
3747
3748 if (d->this_hdr.sh_type != SHT_GROUP)
4fbb74a6 3749 d->this_idx = section_number++;
3e19fb8f
L
3750 if (d->this_hdr.sh_name != (unsigned int) -1)
3751 _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->this_hdr.sh_name);
d4730f92 3752 if (d->rel.hdr)
2b0f7ef9 3753 {
d4730f92 3754 d->rel.idx = section_number++;
3e19fb8f
L
3755 if (d->rel.hdr->sh_name != (unsigned int) -1)
3756 _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->rel.hdr->sh_name);
2b0f7ef9 3757 }
d4730f92
BS
3758 else
3759 d->rel.idx = 0;
23bc299b 3760
d4730f92 3761 if (d->rela.hdr)
2b0f7ef9 3762 {
d4730f92 3763 d->rela.idx = section_number++;
3e19fb8f
L
3764 if (d->rela.hdr->sh_name != (unsigned int) -1)
3765 _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->rela.hdr->sh_name);
2b0f7ef9 3766 }
23bc299b 3767 else
d4730f92 3768 d->rela.idx = 0;
252b5132
RH
3769 }
3770
3516e984
L
3771 need_symtab = (bfd_get_symcount (abfd) > 0
3772 || (link_info == NULL
3773 && ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC))
3774 == HAS_RELOC)));
3775 if (need_symtab)
252b5132 3776 {
12bd6957 3777 elf_onesymtab (abfd) = section_number++;
2b0f7ef9 3778 _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->symtab_hdr.sh_name);
4fbb74a6 3779 if (section_number > ((SHN_LORESERVE - 2) & 0xFFFF))
9ad5cbcf 3780 {
7a6e0d89 3781 elf_section_list *entry;
6a40cf0c
NC
3782
3783 BFD_ASSERT (elf_symtab_shndx_list (abfd) == NULL);
3784
7a6e0d89 3785 entry = bfd_zalloc (abfd, sizeof (*entry));
6a40cf0c
NC
3786 entry->ndx = section_number++;
3787 elf_symtab_shndx_list (abfd) = entry;
3788 entry->hdr.sh_name
9ad5cbcf 3789 = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
b34976b6 3790 ".symtab_shndx", FALSE);
6a40cf0c 3791 if (entry->hdr.sh_name == (unsigned int) -1)
b34976b6 3792 return FALSE;
9ad5cbcf 3793 }
12bd6957 3794 elf_strtab_sec (abfd) = section_number++;
2b0f7ef9 3795 _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->strtab_hdr.sh_name);
252b5132
RH
3796 }
3797
dd905818
NC
3798 elf_shstrtab_sec (abfd) = section_number++;
3799 _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->shstrtab_hdr.sh_name);
3800 elf_elfheader (abfd)->e_shstrndx = elf_shstrtab_sec (abfd);
3801
1c52a645
L
3802 if (section_number >= SHN_LORESERVE)
3803 {
695344c0 3804 /* xgettext:c-format */
871b3ab2 3805 _bfd_error_handler (_("%pB: too many sections: %u"),
1c52a645
L
3806 abfd, section_number);
3807 return FALSE;
3808 }
3809
9ad5cbcf 3810 elf_numsections (abfd) = section_number;
252b5132
RH
3811 elf_elfheader (abfd)->e_shnum = section_number;
3812
3813 /* Set up the list of section header pointers, in agreement with the
3814 indices. */
446f7ed5
AM
3815 amt = section_number * sizeof (Elf_Internal_Shdr *);
3816 i_shdrp = (Elf_Internal_Shdr **) bfd_zalloc (abfd, amt);
252b5132 3817 if (i_shdrp == NULL)
b34976b6 3818 return FALSE;
252b5132 3819
a50b1753 3820 i_shdrp[0] = (Elf_Internal_Shdr *) bfd_zalloc (abfd,
07d6d2b8 3821 sizeof (Elf_Internal_Shdr));
252b5132
RH
3822 if (i_shdrp[0] == NULL)
3823 {
3824 bfd_release (abfd, i_shdrp);
b34976b6 3825 return FALSE;
252b5132 3826 }
252b5132
RH
3827
3828 elf_elfsections (abfd) = i_shdrp;
3829
12bd6957 3830 i_shdrp[elf_shstrtab_sec (abfd)] = &t->shstrtab_hdr;
3516e984 3831 if (need_symtab)
252b5132 3832 {
12bd6957 3833 i_shdrp[elf_onesymtab (abfd)] = &t->symtab_hdr;
4fbb74a6 3834 if (elf_numsections (abfd) > (SHN_LORESERVE & 0xFFFF))
9ad5cbcf 3835 {
6a40cf0c
NC
3836 elf_section_list * entry = elf_symtab_shndx_list (abfd);
3837 BFD_ASSERT (entry != NULL);
3838 i_shdrp[entry->ndx] = & entry->hdr;
3839 entry->hdr.sh_link = elf_onesymtab (abfd);
9ad5cbcf 3840 }
12bd6957
AM
3841 i_shdrp[elf_strtab_sec (abfd)] = &t->strtab_hdr;
3842 t->symtab_hdr.sh_link = elf_strtab_sec (abfd);
252b5132 3843 }
38ce5b11 3844
252b5132
RH
3845 for (sec = abfd->sections; sec; sec = sec->next)
3846 {
252b5132 3847 asection *s;
252b5132 3848
91d6fa6a
NC
3849 d = elf_section_data (sec);
3850
252b5132 3851 i_shdrp[d->this_idx] = &d->this_hdr;
d4730f92
BS
3852 if (d->rel.idx != 0)
3853 i_shdrp[d->rel.idx] = d->rel.hdr;
3854 if (d->rela.idx != 0)
3855 i_shdrp[d->rela.idx] = d->rela.hdr;
252b5132
RH
3856
3857 /* Fill in the sh_link and sh_info fields while we're at it. */
3858
3859 /* sh_link of a reloc section is the section index of the symbol
3860 table. sh_info is the section index of the section to which
3861 the relocation entries apply. */
d4730f92 3862 if (d->rel.idx != 0)
252b5132 3863 {
12bd6957 3864 d->rel.hdr->sh_link = elf_onesymtab (abfd);
d4730f92 3865 d->rel.hdr->sh_info = d->this_idx;
9ef5d938 3866 d->rel.hdr->sh_flags |= SHF_INFO_LINK;
252b5132 3867 }
d4730f92 3868 if (d->rela.idx != 0)
23bc299b 3869 {
12bd6957 3870 d->rela.hdr->sh_link = elf_onesymtab (abfd);
d4730f92 3871 d->rela.hdr->sh_info = d->this_idx;
9ef5d938 3872 d->rela.hdr->sh_flags |= SHF_INFO_LINK;
23bc299b 3873 }
252b5132 3874
38ce5b11
L
3875 /* We need to set up sh_link for SHF_LINK_ORDER. */
3876 if ((d->this_hdr.sh_flags & SHF_LINK_ORDER) != 0)
3877 {
3878 s = elf_linked_to_section (sec);
3879 if (s)
38ce5b11 3880 {
f2876037 3881 /* elf_linked_to_section points to the input section. */
ccd2ec6a 3882 if (link_info != NULL)
38ce5b11 3883 {
f2876037 3884 /* Check discarded linkonce section. */
dbaa2011 3885 if (discarded_section (s))
38ce5b11 3886 {
ccd2ec6a 3887 asection *kept;
4eca0228 3888 _bfd_error_handler
695344c0 3889 /* xgettext:c-format */
871b3ab2
AM
3890 (_("%pB: sh_link of section `%pA' points to"
3891 " discarded section `%pA' of `%pB'"),
ccd2ec6a
L
3892 abfd, d->this_hdr.bfd_section,
3893 s, s->owner);
3894 /* Point to the kept section if it has the same
3895 size as the discarded one. */
c0f00686 3896 kept = _bfd_elf_check_kept_section (s, link_info);
ccd2ec6a 3897 if (kept == NULL)
185d09ad 3898 {
ccd2ec6a
L
3899 bfd_set_error (bfd_error_bad_value);
3900 return FALSE;
185d09ad 3901 }
ccd2ec6a 3902 s = kept;
38ce5b11 3903 }
e424ecc8 3904
ccd2ec6a
L
3905 s = s->output_section;
3906 BFD_ASSERT (s != NULL);
38ce5b11 3907 }
f2876037
L
3908 else
3909 {
3910 /* Handle objcopy. */
3911 if (s->output_section == NULL)
3912 {
4eca0228 3913 _bfd_error_handler
695344c0 3914 /* xgettext:c-format */
871b3ab2
AM
3915 (_("%pB: sh_link of section `%pA' points to"
3916 " removed section `%pA' of `%pB'"),
f2876037
L
3917 abfd, d->this_hdr.bfd_section, s, s->owner);
3918 bfd_set_error (bfd_error_bad_value);
3919 return FALSE;
3920 }
3921 s = s->output_section;
3922 }
ccd2ec6a
L
3923 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3924 }
3925 else
3926 {
3927 /* PR 290:
3928 The Intel C compiler generates SHT_IA_64_UNWIND with
3929 SHF_LINK_ORDER. But it doesn't set the sh_link or
3930 sh_info fields. Hence we could get the situation
08a40648 3931 where s is NULL. */
ccd2ec6a
L
3932 const struct elf_backend_data *bed
3933 = get_elf_backend_data (abfd);
3934 if (bed->link_order_error_handler)
3935 bed->link_order_error_handler
695344c0 3936 /* xgettext:c-format */
871b3ab2 3937 (_("%pB: warning: sh_link not set for section `%pA'"),
ccd2ec6a 3938 abfd, sec);
38ce5b11
L
3939 }
3940 }
3941
252b5132
RH
3942 switch (d->this_hdr.sh_type)
3943 {
3944 case SHT_REL:
3945 case SHT_RELA:
3946 /* A reloc section which we are treating as a normal BFD
3947 section. sh_link is the section index of the symbol
3948 table. sh_info is the section index of the section to
3949 which the relocation entries apply. We assume that an
3950 allocated reloc section uses the dynamic symbol table.
3951 FIXME: How can we be sure? */
3952 s = bfd_get_section_by_name (abfd, ".dynsym");
3953 if (s != NULL)
3954 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3955
bce964aa 3956 s = elf_get_reloc_section (sec);
252b5132 3957 if (s != NULL)
9ef5d938
L
3958 {
3959 d->this_hdr.sh_info = elf_section_data (s)->this_idx;
3960 d->this_hdr.sh_flags |= SHF_INFO_LINK;
3961 }
252b5132
RH
3962 break;
3963
3964 case SHT_STRTAB:
3965 /* We assume that a section named .stab*str is a stabs
3966 string section. We look for a section with the same name
3967 but without the trailing ``str'', and set its sh_link
3968 field to point to this section. */
0112cd26 3969 if (CONST_STRNEQ (sec->name, ".stab")
252b5132
RH
3970 && strcmp (sec->name + strlen (sec->name) - 3, "str") == 0)
3971 {
3972 size_t len;
3973 char *alc;
3974
3975 len = strlen (sec->name);
a50b1753 3976 alc = (char *) bfd_malloc (len - 2);
252b5132 3977 if (alc == NULL)
b34976b6 3978 return FALSE;
d4c88bbb 3979 memcpy (alc, sec->name, len - 3);
252b5132
RH
3980 alc[len - 3] = '\0';
3981 s = bfd_get_section_by_name (abfd, alc);
3982 free (alc);
3983 if (s != NULL)
3984 {
3985 elf_section_data (s)->this_hdr.sh_link = d->this_idx;
3986
3987 /* This is a .stab section. */
0594c12d
AM
3988 if (elf_section_data (s)->this_hdr.sh_entsize == 0)
3989 elf_section_data (s)->this_hdr.sh_entsize
3990 = 4 + 2 * bfd_get_arch_size (abfd) / 8;
252b5132
RH
3991 }
3992 }
3993 break;
3994
3995 case SHT_DYNAMIC:
3996 case SHT_DYNSYM:
3997 case SHT_GNU_verneed:
3998 case SHT_GNU_verdef:
3999 /* sh_link is the section header index of the string table
4000 used for the dynamic entries, or the symbol table, or the
4001 version strings. */
4002 s = bfd_get_section_by_name (abfd, ".dynstr");
4003 if (s != NULL)
4004 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
4005 break;
4006
7f1204bb
JJ
4007 case SHT_GNU_LIBLIST:
4008 /* sh_link is the section header index of the prelink library
08a40648
AM
4009 list used for the dynamic entries, or the symbol table, or
4010 the version strings. */
7f1204bb
JJ
4011 s = bfd_get_section_by_name (abfd, (sec->flags & SEC_ALLOC)
4012 ? ".dynstr" : ".gnu.libstr");
4013 if (s != NULL)
4014 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
4015 break;
4016
252b5132 4017 case SHT_HASH:
fdc90cb4 4018 case SHT_GNU_HASH:
252b5132
RH
4019 case SHT_GNU_versym:
4020 /* sh_link is the section header index of the symbol table
4021 this hash table or version table is for. */
4022 s = bfd_get_section_by_name (abfd, ".dynsym");
4023 if (s != NULL)
4024 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
4025 break;
dbb410c3
AM
4026
4027 case SHT_GROUP:
12bd6957 4028 d->this_hdr.sh_link = elf_onesymtab (abfd);
252b5132
RH
4029 }
4030 }
4031
3e19fb8f
L
4032 /* Delay setting sh_name to _bfd_elf_write_object_contents so that
4033 _bfd_elf_assign_file_positions_for_non_load can convert DWARF
4034 debug section name from .debug_* to .zdebug_* if needed. */
4035
b34976b6 4036 return TRUE;
252b5132
RH
4037}
4038
5372391b 4039static bfd_boolean
217aa764 4040sym_is_global (bfd *abfd, asymbol *sym)
252b5132
RH
4041{
4042 /* If the backend has a special mapping, use it. */
9c5bfbb7 4043 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
217aa764
AM
4044 if (bed->elf_backend_sym_is_global)
4045 return (*bed->elf_backend_sym_is_global) (abfd, sym);
252b5132 4046
e47bf690 4047 return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
e6f7f6d1
AM
4048 || bfd_is_und_section (bfd_asymbol_section (sym))
4049 || bfd_is_com_section (bfd_asymbol_section (sym)));
252b5132
RH
4050}
4051
76359541
TP
4052/* Filter global symbols of ABFD to include in the import library. All
4053 SYMCOUNT symbols of ABFD can be examined from their pointers in
4054 SYMS. Pointers of symbols to keep should be stored contiguously at
4055 the beginning of that array.
4056
4057 Returns the number of symbols to keep. */
4058
4059unsigned int
4060_bfd_elf_filter_global_symbols (bfd *abfd, struct bfd_link_info *info,
4061 asymbol **syms, long symcount)
4062{
4063 long src_count, dst_count = 0;
4064
4065 for (src_count = 0; src_count < symcount; src_count++)
4066 {
4067 asymbol *sym = syms[src_count];
4068 char *name = (char *) bfd_asymbol_name (sym);
4069 struct bfd_link_hash_entry *h;
4070
4071 if (!sym_is_global (abfd, sym))
4072 continue;
4073
4074 h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, FALSE);
5df1bc57
AM
4075 if (h == NULL)
4076 continue;
76359541
TP
4077 if (h->type != bfd_link_hash_defined && h->type != bfd_link_hash_defweak)
4078 continue;
76359541
TP
4079 if (h->linker_def || h->ldscript_def)
4080 continue;
4081
4082 syms[dst_count++] = sym;
4083 }
4084
4085 syms[dst_count] = NULL;
4086
4087 return dst_count;
4088}
4089
5372391b 4090/* Don't output section symbols for sections that are not going to be
c6d8cab4 4091 output, that are duplicates or there is no BFD section. */
5372391b
AM
4092
4093static bfd_boolean
4094ignore_section_sym (bfd *abfd, asymbol *sym)
4095{
c6d8cab4
L
4096 elf_symbol_type *type_ptr;
4097
db0c309f
NC
4098 if (sym == NULL)
4099 return FALSE;
4100
c6d8cab4
L
4101 if ((sym->flags & BSF_SECTION_SYM) == 0)
4102 return FALSE;
4103
db0c309f
NC
4104 if (sym->section == NULL)
4105 return TRUE;
4106
c6d8cab4
L
4107 type_ptr = elf_symbol_from (abfd, sym);
4108 return ((type_ptr != NULL
4109 && type_ptr->internal_elf_sym.st_shndx != 0
4110 && bfd_is_abs_section (sym->section))
4111 || !(sym->section->owner == abfd
db0c309f
NC
4112 || (sym->section->output_section != NULL
4113 && sym->section->output_section->owner == abfd
2633a79c
AM
4114 && sym->section->output_offset == 0)
4115 || bfd_is_abs_section (sym->section)));
5372391b
AM
4116}
4117
2633a79c
AM
4118/* Map symbol from it's internal number to the external number, moving
4119 all local symbols to be at the head of the list. */
4120
b34976b6 4121static bfd_boolean
12bd6957 4122elf_map_symbols (bfd *abfd, unsigned int *pnum_locals)
252b5132 4123{
dc810e39 4124 unsigned int symcount = bfd_get_symcount (abfd);
252b5132
RH
4125 asymbol **syms = bfd_get_outsymbols (abfd);
4126 asymbol **sect_syms;
dc810e39
AM
4127 unsigned int num_locals = 0;
4128 unsigned int num_globals = 0;
4129 unsigned int num_locals2 = 0;
4130 unsigned int num_globals2 = 0;
7292b3ac 4131 unsigned int max_index = 0;
dc810e39 4132 unsigned int idx;
252b5132
RH
4133 asection *asect;
4134 asymbol **new_syms;
446f7ed5 4135 size_t amt;
252b5132
RH
4136
4137#ifdef DEBUG
4138 fprintf (stderr, "elf_map_symbols\n");
4139 fflush (stderr);
4140#endif
4141
252b5132
RH
4142 for (asect = abfd->sections; asect; asect = asect->next)
4143 {
4144 if (max_index < asect->index)
4145 max_index = asect->index;
4146 }
4147
4148 max_index++;
446f7ed5
AM
4149 amt = max_index * sizeof (asymbol *);
4150 sect_syms = (asymbol **) bfd_zalloc (abfd, amt);
252b5132 4151 if (sect_syms == NULL)
b34976b6 4152 return FALSE;
252b5132 4153 elf_section_syms (abfd) = sect_syms;
4e89ac30 4154 elf_num_section_syms (abfd) = max_index;
252b5132 4155
079e9a2f
AM
4156 /* Init sect_syms entries for any section symbols we have already
4157 decided to output. */
252b5132
RH
4158 for (idx = 0; idx < symcount; idx++)
4159 {
dc810e39 4160 asymbol *sym = syms[idx];
c044fabd 4161
252b5132 4162 if ((sym->flags & BSF_SECTION_SYM) != 0
0f0a5e58 4163 && sym->value == 0
2633a79c
AM
4164 && !ignore_section_sym (abfd, sym)
4165 && !bfd_is_abs_section (sym->section))
252b5132 4166 {
5372391b 4167 asection *sec = sym->section;
252b5132 4168
5372391b
AM
4169 if (sec->owner != abfd)
4170 sec = sec->output_section;
252b5132 4171
5372391b 4172 sect_syms[sec->index] = syms[idx];
252b5132
RH
4173 }
4174 }
4175
252b5132
RH
4176 /* Classify all of the symbols. */
4177 for (idx = 0; idx < symcount; idx++)
4178 {
2633a79c 4179 if (sym_is_global (abfd, syms[idx]))
252b5132 4180 num_globals++;
2633a79c
AM
4181 else if (!ignore_section_sym (abfd, syms[idx]))
4182 num_locals++;
252b5132 4183 }
079e9a2f 4184
5372391b 4185 /* We will be adding a section symbol for each normal BFD section. Most
079e9a2f
AM
4186 sections will already have a section symbol in outsymbols, but
4187 eg. SHT_GROUP sections will not, and we need the section symbol mapped
4188 at least in that case. */
252b5132
RH
4189 for (asect = abfd->sections; asect; asect = asect->next)
4190 {
079e9a2f 4191 if (sect_syms[asect->index] == NULL)
252b5132 4192 {
079e9a2f 4193 if (!sym_is_global (abfd, asect->symbol))
252b5132
RH
4194 num_locals++;
4195 else
4196 num_globals++;
252b5132
RH
4197 }
4198 }
4199
4200 /* Now sort the symbols so the local symbols are first. */
446f7ed5
AM
4201 amt = (num_locals + num_globals) * sizeof (asymbol *);
4202 new_syms = (asymbol **) bfd_alloc (abfd, amt);
252b5132 4203 if (new_syms == NULL)
b34976b6 4204 return FALSE;
252b5132
RH
4205
4206 for (idx = 0; idx < symcount; idx++)
4207 {
4208 asymbol *sym = syms[idx];
dc810e39 4209 unsigned int i;
252b5132 4210
2633a79c
AM
4211 if (sym_is_global (abfd, sym))
4212 i = num_locals + num_globals2++;
4213 else if (!ignore_section_sym (abfd, sym))
252b5132
RH
4214 i = num_locals2++;
4215 else
2633a79c 4216 continue;
252b5132
RH
4217 new_syms[i] = sym;
4218 sym->udata.i = i + 1;
4219 }
4220 for (asect = abfd->sections; asect; asect = asect->next)
4221 {
079e9a2f 4222 if (sect_syms[asect->index] == NULL)
252b5132 4223 {
079e9a2f 4224 asymbol *sym = asect->symbol;
dc810e39 4225 unsigned int i;
252b5132 4226
079e9a2f 4227 sect_syms[asect->index] = sym;
252b5132
RH
4228 if (!sym_is_global (abfd, sym))
4229 i = num_locals2++;
4230 else
4231 i = num_locals + num_globals2++;
4232 new_syms[i] = sym;
4233 sym->udata.i = i + 1;
4234 }
4235 }
4236
4237 bfd_set_symtab (abfd, new_syms, num_locals + num_globals);
4238
12bd6957 4239 *pnum_locals = num_locals;
b34976b6 4240 return TRUE;
252b5132
RH
4241}
4242
4243/* Align to the maximum file alignment that could be required for any
4244 ELF data structure. */
4245
268b6b39 4246static inline file_ptr
217aa764 4247align_file_position (file_ptr off, int align)
252b5132
RH
4248{
4249 return (off + align - 1) & ~(align - 1);
4250}
4251
4252/* Assign a file position to a section, optionally aligning to the
4253 required section alignment. */
4254
217aa764
AM
4255file_ptr
4256_bfd_elf_assign_file_position_for_section (Elf_Internal_Shdr *i_shdrp,
4257 file_ptr offset,
4258 bfd_boolean align)
252b5132 4259{
72de5009
AM
4260 if (align && i_shdrp->sh_addralign > 1)
4261 offset = BFD_ALIGN (offset, i_shdrp->sh_addralign);
252b5132
RH
4262 i_shdrp->sh_offset = offset;
4263 if (i_shdrp->bfd_section != NULL)
4264 i_shdrp->bfd_section->filepos = offset;
4265 if (i_shdrp->sh_type != SHT_NOBITS)
4266 offset += i_shdrp->sh_size;
4267 return offset;
4268}
4269
4270/* Compute the file positions we are going to put the sections at, and
4271 otherwise prepare to begin writing out the ELF file. If LINK_INFO
4272 is not NULL, this is being called by the ELF backend linker. */
4273
b34976b6 4274bfd_boolean
217aa764
AM
4275_bfd_elf_compute_section_file_positions (bfd *abfd,
4276 struct bfd_link_info *link_info)
252b5132 4277{
9c5bfbb7 4278 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
d4730f92 4279 struct fake_section_arg fsargs;
b34976b6 4280 bfd_boolean failed;
ef10c3ac 4281 struct elf_strtab_hash *strtab = NULL;
252b5132 4282 Elf_Internal_Shdr *shstrtab_hdr;
3516e984 4283 bfd_boolean need_symtab;
252b5132
RH
4284
4285 if (abfd->output_has_begun)
b34976b6 4286 return TRUE;
252b5132
RH
4287
4288 /* Do any elf backend specific processing first. */
4289 if (bed->elf_backend_begin_write_processing)
4290 (*bed->elf_backend_begin_write_processing) (abfd, link_info);
4291
ed7e9d0b 4292 if (!(*bed->elf_backend_init_file_header) (abfd, link_info))
b34976b6 4293 return FALSE;
252b5132 4294
d4730f92
BS
4295 fsargs.failed = FALSE;
4296 fsargs.link_info = link_info;
4297 bfd_map_over_sections (abfd, elf_fake_sections, &fsargs);
4298 if (fsargs.failed)
b34976b6 4299 return FALSE;
252b5132 4300
da9f89d4 4301 if (!assign_section_numbers (abfd, link_info))
b34976b6 4302 return FALSE;
252b5132
RH
4303
4304 /* The backend linker builds symbol table information itself. */
3516e984
L
4305 need_symtab = (link_info == NULL
4306 && (bfd_get_symcount (abfd) > 0
4307 || ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC))
4308 == HAS_RELOC)));
4309 if (need_symtab)
252b5132
RH
4310 {
4311 /* Non-zero if doing a relocatable link. */
4312 int relocatable_p = ! (abfd->flags & (EXEC_P | DYNAMIC));
4313
4314 if (! swap_out_syms (abfd, &strtab, relocatable_p))
b34976b6 4315 return FALSE;
252b5132
RH
4316 }
4317
d4730f92 4318 failed = FALSE;
1126897b 4319 if (link_info == NULL)
dbb410c3 4320 {
1126897b 4321 bfd_map_over_sections (abfd, bfd_elf_set_group_contents, &failed);
dbb410c3 4322 if (failed)
b34976b6 4323 return FALSE;
dbb410c3
AM
4324 }
4325
252b5132 4326 shstrtab_hdr = &elf_tdata (abfd)->shstrtab_hdr;
ed7e9d0b 4327 /* sh_name was set in init_file_header. */
252b5132 4328 shstrtab_hdr->sh_type = SHT_STRTAB;
84865015 4329 shstrtab_hdr->sh_flags = bed->elf_strtab_flags;
252b5132 4330 shstrtab_hdr->sh_addr = 0;
946748d5 4331 /* sh_size is set in _bfd_elf_assign_file_positions_for_non_load. */
252b5132
RH
4332 shstrtab_hdr->sh_entsize = 0;
4333 shstrtab_hdr->sh_link = 0;
4334 shstrtab_hdr->sh_info = 0;
3e19fb8f 4335 /* sh_offset is set in _bfd_elf_assign_file_positions_for_non_load. */
252b5132
RH
4336 shstrtab_hdr->sh_addralign = 1;
4337
c84fca4d 4338 if (!assign_file_positions_except_relocs (abfd, link_info))
b34976b6 4339 return FALSE;
252b5132 4340
3516e984 4341 if (need_symtab)
252b5132
RH
4342 {
4343 file_ptr off;
4344 Elf_Internal_Shdr *hdr;
4345
12bd6957 4346 off = elf_next_file_pos (abfd);
252b5132 4347
6a40cf0c 4348 hdr = & elf_symtab_hdr (abfd);
b34976b6 4349 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
252b5132 4350
6a40cf0c
NC
4351 if (elf_symtab_shndx_list (abfd) != NULL)
4352 {
4353 hdr = & elf_symtab_shndx_list (abfd)->hdr;
4354 if (hdr->sh_size != 0)
4355 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
4356 /* FIXME: What about other symtab_shndx sections in the list ? */
4357 }
9ad5cbcf 4358
252b5132 4359 hdr = &elf_tdata (abfd)->strtab_hdr;
b34976b6 4360 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
252b5132 4361
12bd6957 4362 elf_next_file_pos (abfd) = off;
252b5132
RH
4363
4364 /* Now that we know where the .strtab section goes, write it
08a40648 4365 out. */
252b5132 4366 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
ef10c3ac 4367 || ! _bfd_elf_strtab_emit (abfd, strtab))
b34976b6 4368 return FALSE;
ef10c3ac 4369 _bfd_elf_strtab_free (strtab);
252b5132
RH
4370 }
4371
b34976b6 4372 abfd->output_has_begun = TRUE;
252b5132 4373
b34976b6 4374 return TRUE;
252b5132
RH
4375}
4376
8ded5a0f
AM
4377/* Make an initial estimate of the size of the program header. If we
4378 get the number wrong here, we'll redo section placement. */
4379
4380static bfd_size_type
4381get_program_header_size (bfd *abfd, struct bfd_link_info *info)
4382{
4383 size_t segs;
4384 asection *s;
2b05f1b7 4385 const struct elf_backend_data *bed;
8ded5a0f
AM
4386
4387 /* Assume we will need exactly two PT_LOAD segments: one for text
4388 and one for data. */
4389 segs = 2;
4390
4391 s = bfd_get_section_by_name (abfd, ".interp");
1b9e270b 4392 if (s != NULL && (s->flags & SEC_LOAD) != 0 && s->size != 0)
8ded5a0f
AM
4393 {
4394 /* If we have a loadable interpreter section, we need a
4395 PT_INTERP segment. In this case, assume we also need a
4396 PT_PHDR segment, although that may not be true for all
4397 targets. */
e9a38e0f 4398 segs += 2;
8ded5a0f
AM
4399 }
4400
4401 if (bfd_get_section_by_name (abfd, ".dynamic") != NULL)
4402 {
4403 /* We need a PT_DYNAMIC segment. */
4404 ++segs;
f210dcff 4405 }
08a40648 4406
ceae84aa 4407 if (info != NULL && info->relro)
f210dcff
L
4408 {
4409 /* We need a PT_GNU_RELRO segment. */
4410 ++segs;
8ded5a0f
AM
4411 }
4412
12bd6957 4413 if (elf_eh_frame_hdr (abfd))
8ded5a0f
AM
4414 {
4415 /* We need a PT_GNU_EH_FRAME segment. */
4416 ++segs;
4417 }
4418
12bd6957 4419 if (elf_stack_flags (abfd))
8ded5a0f 4420 {
2b05f1b7
L
4421 /* We need a PT_GNU_STACK segment. */
4422 ++segs;
4423 }
94b11780 4424
0a59decb
L
4425 s = bfd_get_section_by_name (abfd,
4426 NOTE_GNU_PROPERTY_SECTION_NAME);
4427 if (s != NULL && s->size != 0)
4428 {
4429 /* We need a PT_GNU_PROPERTY segment. */
4430 ++segs;
4431 }
4432
2b05f1b7
L
4433 for (s = abfd->sections; s != NULL; s = s->next)
4434 {
8ded5a0f 4435 if ((s->flags & SEC_LOAD) != 0
23e463ed 4436 && elf_section_type (s) == SHT_NOTE)
8ded5a0f 4437 {
23e463ed 4438 unsigned int alignment_power;
8ded5a0f
AM
4439 /* We need a PT_NOTE segment. */
4440 ++segs;
23e463ed
L
4441 /* Try to create just one PT_NOTE segment for all adjacent
4442 loadable SHT_NOTE sections. gABI requires that within a
4443 PT_NOTE segment (and also inside of each SHT_NOTE section)
4444 each note should have the same alignment. So we check
4445 whether the sections are correctly aligned. */
4446 alignment_power = s->alignment_power;
4447 while (s->next != NULL
4448 && s->next->alignment_power == alignment_power
4449 && (s->next->flags & SEC_LOAD) != 0
4450 && elf_section_type (s->next) == SHT_NOTE)
4451 s = s->next;
8ded5a0f
AM
4452 }
4453 }
4454
4455 for (s = abfd->sections; s != NULL; s = s->next)
4456 {
4457 if (s->flags & SEC_THREAD_LOCAL)
4458 {
4459 /* We need a PT_TLS segment. */
4460 ++segs;
4461 break;
4462 }
4463 }
4464
2b05f1b7 4465 bed = get_elf_backend_data (abfd);
a91e1603 4466
df3a023b
AM
4467 if ((abfd->flags & D_PAGED) != 0
4468 && (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_mbind) != 0)
4469 {
4470 /* Add a PT_GNU_MBIND segment for each mbind section. */
4471 unsigned int page_align_power = bfd_log2 (bed->commonpagesize);
4472 for (s = abfd->sections; s != NULL; s = s->next)
4473 if (elf_section_flags (s) & SHF_GNU_MBIND)
4474 {
4475 if (elf_section_data (s)->this_hdr.sh_info > PT_GNU_MBIND_NUM)
4476 {
4477 _bfd_error_handler
4478 /* xgettext:c-format */
4479 (_("%pB: GNU_MBIND section `%pA' has invalid "
4480 "sh_info field: %d"),
4481 abfd, s, elf_section_data (s)->this_hdr.sh_info);
4482 continue;
4483 }
4484 /* Align mbind section to page size. */
4485 if (s->alignment_power < page_align_power)
4486 s->alignment_power = page_align_power;
4487 segs ++;
4488 }
4489 }
4490
4491 /* Let the backend count up any program headers it might need. */
4492 if (bed->elf_backend_additional_program_headers)
8ded5a0f
AM
4493 {
4494 int a;
4495
4496 a = (*bed->elf_backend_additional_program_headers) (abfd, info);
4497 if (a == -1)
4498 abort ();
4499 segs += a;
4500 }
4501
4502 return segs * bed->s->sizeof_phdr;
4503}
4504
2ea37f1c
NC
4505/* Find the segment that contains the output_section of section. */
4506
4507Elf_Internal_Phdr *
4508_bfd_elf_find_segment_containing_section (bfd * abfd, asection * section)
4509{
4510 struct elf_segment_map *m;
4511 Elf_Internal_Phdr *p;
4512
12bd6957 4513 for (m = elf_seg_map (abfd), p = elf_tdata (abfd)->phdr;
2ea37f1c
NC
4514 m != NULL;
4515 m = m->next, p++)
4516 {
4517 int i;
4518
4519 for (i = m->count - 1; i >= 0; i--)
4520 if (m->sections[i] == section)
4521 return p;
4522 }
4523
4524 return NULL;
4525}
4526
252b5132
RH
4527/* Create a mapping from a set of sections to a program segment. */
4528
217aa764
AM
4529static struct elf_segment_map *
4530make_mapping (bfd *abfd,
4531 asection **sections,
4532 unsigned int from,
4533 unsigned int to,
4534 bfd_boolean phdr)
252b5132
RH
4535{
4536 struct elf_segment_map *m;
4537 unsigned int i;
4538 asection **hdrpp;
986f0783 4539 size_t amt;
252b5132 4540
00bee008
AM
4541 amt = sizeof (struct elf_segment_map) - sizeof (asection *);
4542 amt += (to - from) * sizeof (asection *);
a50b1753 4543 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
252b5132
RH
4544 if (m == NULL)
4545 return NULL;
4546 m->next = NULL;
4547 m->p_type = PT_LOAD;
4548 for (i = from, hdrpp = sections + from; i < to; i++, hdrpp++)
4549 m->sections[i - from] = *hdrpp;
4550 m->count = to - from;
4551
4552 if (from == 0 && phdr)
4553 {
4554 /* Include the headers in the first PT_LOAD segment. */
4555 m->includes_filehdr = 1;
4556 m->includes_phdrs = 1;
4557 }
4558
4559 return m;
4560}
4561
229fcec5
MM
4562/* Create the PT_DYNAMIC segment, which includes DYNSEC. Returns NULL
4563 on failure. */
4564
4565struct elf_segment_map *
4566_bfd_elf_make_dynamic_segment (bfd *abfd, asection *dynsec)
4567{
4568 struct elf_segment_map *m;
4569
a50b1753 4570 m = (struct elf_segment_map *) bfd_zalloc (abfd,
07d6d2b8 4571 sizeof (struct elf_segment_map));
229fcec5
MM
4572 if (m == NULL)
4573 return NULL;
4574 m->next = NULL;
4575 m->p_type = PT_DYNAMIC;
4576 m->count = 1;
4577 m->sections[0] = dynsec;
08a40648 4578
229fcec5
MM
4579 return m;
4580}
4581
8ded5a0f 4582/* Possibly add or remove segments from the segment map. */
252b5132 4583
b34976b6 4584static bfd_boolean
3dea8fca
AM
4585elf_modify_segment_map (bfd *abfd,
4586 struct bfd_link_info *info,
4587 bfd_boolean remove_empty_load)
252b5132 4588{
252e386e 4589 struct elf_segment_map **m;
8ded5a0f 4590 const struct elf_backend_data *bed;
252b5132 4591
8ded5a0f
AM
4592 /* The placement algorithm assumes that non allocated sections are
4593 not in PT_LOAD segments. We ensure this here by removing such
4594 sections from the segment map. We also remove excluded
252e386e
AM
4595 sections. Finally, any PT_LOAD segment without sections is
4596 removed. */
12bd6957 4597 m = &elf_seg_map (abfd);
252e386e 4598 while (*m)
8ded5a0f
AM
4599 {
4600 unsigned int i, new_count;
252b5132 4601
252e386e 4602 for (new_count = 0, i = 0; i < (*m)->count; i++)
8ded5a0f 4603 {
252e386e
AM
4604 if (((*m)->sections[i]->flags & SEC_EXCLUDE) == 0
4605 && (((*m)->sections[i]->flags & SEC_ALLOC) != 0
4606 || (*m)->p_type != PT_LOAD))
8ded5a0f 4607 {
252e386e
AM
4608 (*m)->sections[new_count] = (*m)->sections[i];
4609 new_count++;
8ded5a0f
AM
4610 }
4611 }
252e386e 4612 (*m)->count = new_count;
252b5132 4613
1a9ccd70
NC
4614 if (remove_empty_load
4615 && (*m)->p_type == PT_LOAD
4616 && (*m)->count == 0
4617 && !(*m)->includes_phdrs)
252e386e
AM
4618 *m = (*m)->next;
4619 else
4620 m = &(*m)->next;
8ded5a0f 4621 }
252b5132 4622
8ded5a0f
AM
4623 bed = get_elf_backend_data (abfd);
4624 if (bed->elf_backend_modify_segment_map != NULL)
252b5132 4625 {
252e386e 4626 if (!(*bed->elf_backend_modify_segment_map) (abfd, info))
8ded5a0f 4627 return FALSE;
252b5132 4628 }
252b5132 4629
8ded5a0f
AM
4630 return TRUE;
4631}
252b5132 4632
dbc88fc1
AM
4633#define IS_TBSS(s) \
4634 ((s->flags & (SEC_THREAD_LOCAL | SEC_LOAD)) == SEC_THREAD_LOCAL)
4635
8ded5a0f 4636/* Set up a mapping from BFD sections to program segments. */
252b5132 4637
8ded5a0f
AM
4638bfd_boolean
4639_bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
4640{
4641 unsigned int count;
4642 struct elf_segment_map *m;
4643 asection **sections = NULL;
4644 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3dea8fca 4645 bfd_boolean no_user_phdrs;
252b5132 4646
12bd6957 4647 no_user_phdrs = elf_seg_map (abfd) == NULL;
d324f6d6
RM
4648
4649 if (info != NULL)
4650 info->user_phdrs = !no_user_phdrs;
4651
3dea8fca 4652 if (no_user_phdrs && bfd_count_sections (abfd) != 0)
252b5132 4653 {
8ded5a0f
AM
4654 asection *s;
4655 unsigned int i;
4656 struct elf_segment_map *mfirst;
4657 struct elf_segment_map **pm;
4658 asection *last_hdr;
4659 bfd_vma last_size;
00bee008 4660 unsigned int hdr_index;
8ded5a0f
AM
4661 bfd_vma maxpagesize;
4662 asection **hdrpp;
64029e93 4663 bfd_boolean phdr_in_segment;
8ded5a0f 4664 bfd_boolean writable;
2888249f 4665 bfd_boolean executable;
446f7ed5 4666 unsigned int tls_count = 0;
8ded5a0f 4667 asection *first_tls = NULL;
a91e1603 4668 asection *first_mbind = NULL;
8ded5a0f 4669 asection *dynsec, *eh_frame_hdr;
446f7ed5 4670 size_t amt;
8d06853e 4671 bfd_vma addr_mask, wrap_to = 0;
64029e93 4672 bfd_size_type phdr_size;
252b5132 4673
8ded5a0f 4674 /* Select the allocated sections, and sort them. */
252b5132 4675
446f7ed5
AM
4676 amt = bfd_count_sections (abfd) * sizeof (asection *);
4677 sections = (asection **) bfd_malloc (amt);
8ded5a0f 4678 if (sections == NULL)
252b5132 4679 goto error_return;
252b5132 4680
8d06853e
AM
4681 /* Calculate top address, avoiding undefined behaviour of shift
4682 left operator when shift count is equal to size of type
4683 being shifted. */
4684 addr_mask = ((bfd_vma) 1 << (bfd_arch_bits_per_address (abfd) - 1)) - 1;
4685 addr_mask = (addr_mask << 1) + 1;
4686
8ded5a0f
AM
4687 i = 0;
4688 for (s = abfd->sections; s != NULL; s = s->next)
4689 {
4690 if ((s->flags & SEC_ALLOC) != 0)
4691 {
48db3297
AM
4692 /* target_index is unused until bfd_elf_final_link
4693 starts output of section symbols. Use it to make
4694 qsort stable. */
4695 s->target_index = i;
8ded5a0f
AM
4696 sections[i] = s;
4697 ++i;
8d06853e
AM
4698 /* A wrapping section potentially clashes with header. */
4699 if (((s->lma + s->size) & addr_mask) < (s->lma & addr_mask))
4700 wrap_to = (s->lma + s->size) & addr_mask;
8ded5a0f
AM
4701 }
4702 }
4703 BFD_ASSERT (i <= bfd_count_sections (abfd));
4704 count = i;
252b5132 4705
8ded5a0f 4706 qsort (sections, (size_t) count, sizeof (asection *), elf_sort_sections);
252b5132 4707
64029e93
AM
4708 phdr_size = elf_program_header_size (abfd);
4709 if (phdr_size == (bfd_size_type) -1)
4710 phdr_size = get_program_header_size (abfd, info);
4711 phdr_size += bed->s->sizeof_ehdr;
4712 maxpagesize = bed->maxpagesize;
4713 if (maxpagesize == 0)
4714 maxpagesize = 1;
4715 phdr_in_segment = info != NULL && info->load_phdrs;
4716 if (count != 0
4717 && (((sections[0]->lma & addr_mask) & (maxpagesize - 1))
4718 >= (phdr_size & (maxpagesize - 1))))
4719 /* For compatibility with old scripts that may not be using
4720 SIZEOF_HEADERS, add headers when it looks like space has
4721 been left for them. */
4722 phdr_in_segment = TRUE;
252b5132 4723
64029e93 4724 /* Build the mapping. */
8ded5a0f
AM
4725 mfirst = NULL;
4726 pm = &mfirst;
252b5132 4727
8ded5a0f
AM
4728 /* If we have a .interp section, then create a PT_PHDR segment for
4729 the program headers and a PT_INTERP segment for the .interp
4730 section. */
4731 s = bfd_get_section_by_name (abfd, ".interp");
1b9e270b 4732 if (s != NULL && (s->flags & SEC_LOAD) != 0 && s->size != 0)
8ded5a0f
AM
4733 {
4734 amt = sizeof (struct elf_segment_map);
a50b1753 4735 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
4736 if (m == NULL)
4737 goto error_return;
4738 m->next = NULL;
4739 m->p_type = PT_PHDR;
f882209d 4740 m->p_flags = PF_R;
8ded5a0f
AM
4741 m->p_flags_valid = 1;
4742 m->includes_phdrs = 1;
64029e93 4743 phdr_in_segment = TRUE;
8ded5a0f
AM
4744 *pm = m;
4745 pm = &m->next;
252b5132 4746
8ded5a0f 4747 amt = sizeof (struct elf_segment_map);
a50b1753 4748 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
4749 if (m == NULL)
4750 goto error_return;
4751 m->next = NULL;
4752 m->p_type = PT_INTERP;
4753 m->count = 1;
4754 m->sections[0] = s;
4755
4756 *pm = m;
4757 pm = &m->next;
252b5132 4758 }
8ded5a0f
AM
4759
4760 /* Look through the sections. We put sections in the same program
4761 segment when the start of the second section can be placed within
4762 a few bytes of the end of the first section. */
4763 last_hdr = NULL;
4764 last_size = 0;
00bee008 4765 hdr_index = 0;
8ded5a0f 4766 writable = FALSE;
2888249f 4767 executable = FALSE;
8ded5a0f
AM
4768 dynsec = bfd_get_section_by_name (abfd, ".dynamic");
4769 if (dynsec != NULL
4770 && (dynsec->flags & SEC_LOAD) == 0)
4771 dynsec = NULL;
4772
64029e93
AM
4773 if ((abfd->flags & D_PAGED) == 0)
4774 phdr_in_segment = FALSE;
4775
8ded5a0f
AM
4776 /* Deal with -Ttext or something similar such that the first section
4777 is not adjacent to the program headers. This is an
4778 approximation, since at this point we don't know exactly how many
4779 program headers we will need. */
64029e93 4780 if (phdr_in_segment && count > 0)
252b5132 4781 {
64029e93
AM
4782 bfd_vma phdr_lma;
4783 bfd_boolean separate_phdr = FALSE;
4784
4785 phdr_lma = (sections[0]->lma - phdr_size) & addr_mask & -maxpagesize;
4786 if (info != NULL
4787 && info->separate_code
4788 && (sections[0]->flags & SEC_CODE) != 0)
1a9ccd70 4789 {
64029e93
AM
4790 /* If data sections should be separate from code and
4791 thus not executable, and the first section is
4792 executable then put the file and program headers in
4793 their own PT_LOAD. */
4794 separate_phdr = TRUE;
4795 if ((((phdr_lma + phdr_size - 1) & addr_mask & -maxpagesize)
4796 == (sections[0]->lma & addr_mask & -maxpagesize)))
4797 {
4798 /* The file and program headers are currently on the
4799 same page as the first section. Put them on the
4800 previous page if we can. */
4801 if (phdr_lma >= maxpagesize)
4802 phdr_lma -= maxpagesize;
4803 else
4804 separate_phdr = FALSE;
4805 }
4806 }
4807 if ((sections[0]->lma & addr_mask) < phdr_lma
4808 || (sections[0]->lma & addr_mask) < phdr_size)
4809 /* If file and program headers would be placed at the end
4810 of memory then it's probably better to omit them. */
4811 phdr_in_segment = FALSE;
4812 else if (phdr_lma < wrap_to)
4813 /* If a section wraps around to where we'll be placing
4814 file and program headers, then the headers will be
4815 overwritten. */
4816 phdr_in_segment = FALSE;
4817 else if (separate_phdr)
4818 {
4819 m = make_mapping (abfd, sections, 0, 0, phdr_in_segment);
4820 if (m == NULL)
4821 goto error_return;
4822 m->p_paddr = phdr_lma;
4823 m->p_vaddr_offset
4824 = (sections[0]->vma - phdr_size) & addr_mask & -maxpagesize;
4825 m->p_paddr_valid = 1;
4826 *pm = m;
4827 pm = &m->next;
4828 phdr_in_segment = FALSE;
1a9ccd70 4829 }
252b5132
RH
4830 }
4831
8ded5a0f 4832 for (i = 0, hdrpp = sections; i < count; i++, hdrpp++)
252b5132 4833 {
8ded5a0f
AM
4834 asection *hdr;
4835 bfd_boolean new_segment;
4836
4837 hdr = *hdrpp;
4838
4839 /* See if this section and the last one will fit in the same
4840 segment. */
4841
4842 if (last_hdr == NULL)
4843 {
4844 /* If we don't have a segment yet, then we don't need a new
4845 one (we build the last one after this loop). */
4846 new_segment = FALSE;
4847 }
4848 else if (last_hdr->lma - last_hdr->vma != hdr->lma - hdr->vma)
4849 {
4850 /* If this section has a different relation between the
4851 virtual address and the load address, then we need a new
4852 segment. */
4853 new_segment = TRUE;
4854 }
b5599592
AM
4855 else if (hdr->lma < last_hdr->lma + last_size
4856 || last_hdr->lma + last_size < last_hdr->lma)
4857 {
4858 /* If this section has a load address that makes it overlap
4859 the previous section, then we need a new segment. */
4860 new_segment = TRUE;
4861 }
76cb3a89
AM
4862 else if ((abfd->flags & D_PAGED) != 0
4863 && (((last_hdr->lma + last_size - 1) & -maxpagesize)
4864 == (hdr->lma & -maxpagesize)))
4865 {
4866 /* If we are demand paged then we can't map two disk
4867 pages onto the same memory page. */
4868 new_segment = FALSE;
4869 }
39948a60
NC
4870 /* In the next test we have to be careful when last_hdr->lma is close
4871 to the end of the address space. If the aligned address wraps
4872 around to the start of the address space, then there are no more
4873 pages left in memory and it is OK to assume that the current
4874 section can be included in the current segment. */
76cb3a89
AM
4875 else if ((BFD_ALIGN (last_hdr->lma + last_size, maxpagesize)
4876 + maxpagesize > last_hdr->lma)
4877 && (BFD_ALIGN (last_hdr->lma + last_size, maxpagesize)
4878 + maxpagesize <= hdr->lma))
8ded5a0f
AM
4879 {
4880 /* If putting this section in this segment would force us to
4881 skip a page in the segment, then we need a new segment. */
4882 new_segment = TRUE;
4883 }
4884 else if ((last_hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0
76cb3a89 4885 && (hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) != 0)
8ded5a0f 4886 {
e5654c0f
AM
4887 /* We don't want to put a loaded section after a
4888 nonloaded (ie. bss style) section in the same segment
4889 as that will force the non-loaded section to be loaded.
76cb3a89 4890 Consider .tbss sections as loaded for this purpose. */
8ded5a0f
AM
4891 new_segment = TRUE;
4892 }
4893 else if ((abfd->flags & D_PAGED) == 0)
4894 {
4895 /* If the file is not demand paged, which means that we
4896 don't require the sections to be correctly aligned in the
4897 file, then there is no other reason for a new segment. */
4898 new_segment = FALSE;
4899 }
2888249f
L
4900 else if (info != NULL
4901 && info->separate_code
4902 && executable != ((hdr->flags & SEC_CODE) != 0))
4903 {
4904 new_segment = TRUE;
4905 }
8ded5a0f 4906 else if (! writable
76cb3a89 4907 && (hdr->flags & SEC_READONLY) == 0)
8ded5a0f
AM
4908 {
4909 /* We don't want to put a writable section in a read only
76cb3a89 4910 segment. */
8ded5a0f
AM
4911 new_segment = TRUE;
4912 }
4913 else
4914 {
4915 /* Otherwise, we can use the same segment. */
4916 new_segment = FALSE;
4917 }
4918
2889e75b 4919 /* Allow interested parties a chance to override our decision. */
ceae84aa
AM
4920 if (last_hdr != NULL
4921 && info != NULL
4922 && info->callbacks->override_segment_assignment != NULL)
4923 new_segment
4924 = info->callbacks->override_segment_assignment (info, abfd, hdr,
4925 last_hdr,
4926 new_segment);
2889e75b 4927
8ded5a0f
AM
4928 if (! new_segment)
4929 {
4930 if ((hdr->flags & SEC_READONLY) == 0)
4931 writable = TRUE;
2888249f
L
4932 if ((hdr->flags & SEC_CODE) != 0)
4933 executable = TRUE;
8ded5a0f
AM
4934 last_hdr = hdr;
4935 /* .tbss sections effectively have zero size. */
dbc88fc1 4936 last_size = !IS_TBSS (hdr) ? hdr->size : 0;
8ded5a0f
AM
4937 continue;
4938 }
4939
4940 /* We need a new program segment. We must create a new program
00bee008 4941 header holding all the sections from hdr_index until hdr. */
8ded5a0f 4942
00bee008 4943 m = make_mapping (abfd, sections, hdr_index, i, phdr_in_segment);
8ded5a0f
AM
4944 if (m == NULL)
4945 goto error_return;
4946
4947 *pm = m;
4948 pm = &m->next;
4949
252b5132 4950 if ((hdr->flags & SEC_READONLY) == 0)
b34976b6 4951 writable = TRUE;
8ded5a0f
AM
4952 else
4953 writable = FALSE;
4954
2888249f
L
4955 if ((hdr->flags & SEC_CODE) == 0)
4956 executable = FALSE;
4957 else
4958 executable = TRUE;
4959
baaff79e
JJ
4960 last_hdr = hdr;
4961 /* .tbss sections effectively have zero size. */
dbc88fc1 4962 last_size = !IS_TBSS (hdr) ? hdr->size : 0;
00bee008 4963 hdr_index = i;
8ded5a0f 4964 phdr_in_segment = FALSE;
252b5132
RH
4965 }
4966
86b2281f
AM
4967 /* Create a final PT_LOAD program segment, but not if it's just
4968 for .tbss. */
4969 if (last_hdr != NULL
00bee008 4970 && (i - hdr_index != 1
dbc88fc1 4971 || !IS_TBSS (last_hdr)))
8ded5a0f 4972 {
00bee008 4973 m = make_mapping (abfd, sections, hdr_index, i, phdr_in_segment);
8ded5a0f
AM
4974 if (m == NULL)
4975 goto error_return;
252b5132 4976
8ded5a0f
AM
4977 *pm = m;
4978 pm = &m->next;
4979 }
252b5132 4980
8ded5a0f
AM
4981 /* If there is a .dynamic section, throw in a PT_DYNAMIC segment. */
4982 if (dynsec != NULL)
4983 {
4984 m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
4985 if (m == NULL)
4986 goto error_return;
4987 *pm = m;
4988 pm = &m->next;
4989 }
252b5132 4990
23e463ed 4991 /* For each batch of consecutive loadable SHT_NOTE sections,
1c5265b5
JJ
4992 add a PT_NOTE segment. We don't use bfd_get_section_by_name,
4993 because if we link together nonloadable .note sections and
4994 loadable .note sections, we will generate two .note sections
23e463ed 4995 in the output file. */
8ded5a0f
AM
4996 for (s = abfd->sections; s != NULL; s = s->next)
4997 {
4998 if ((s->flags & SEC_LOAD) != 0
23e463ed 4999 && elf_section_type (s) == SHT_NOTE)
8ded5a0f 5000 {
1c5265b5 5001 asection *s2;
23e463ed 5002 unsigned int alignment_power = s->alignment_power;
91d6fa6a
NC
5003
5004 count = 1;
23e463ed
L
5005 for (s2 = s; s2->next != NULL; s2 = s2->next)
5006 {
5007 if (s2->next->alignment_power == alignment_power
5008 && (s2->next->flags & SEC_LOAD) != 0
5009 && elf_section_type (s2->next) == SHT_NOTE
5010 && align_power (s2->lma + s2->size,
5011 alignment_power)
5012 == s2->next->lma)
5013 count++;
5014 else
5015 break;
5016 }
00bee008
AM
5017 amt = sizeof (struct elf_segment_map) - sizeof (asection *);
5018 amt += count * sizeof (asection *);
a50b1753 5019 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
5020 if (m == NULL)
5021 goto error_return;
5022 m->next = NULL;
5023 m->p_type = PT_NOTE;
1c5265b5
JJ
5024 m->count = count;
5025 while (count > 1)
5026 {
5027 m->sections[m->count - count--] = s;
5028 BFD_ASSERT ((s->flags & SEC_THREAD_LOCAL) == 0);
5029 s = s->next;
5030 }
5031 m->sections[m->count - 1] = s;
5032 BFD_ASSERT ((s->flags & SEC_THREAD_LOCAL) == 0);
8ded5a0f
AM
5033 *pm = m;
5034 pm = &m->next;
5035 }
5036 if (s->flags & SEC_THREAD_LOCAL)
5037 {
5038 if (! tls_count)
5039 first_tls = s;
5040 tls_count++;
5041 }
a91e1603
L
5042 if (first_mbind == NULL
5043 && (elf_section_flags (s) & SHF_GNU_MBIND) != 0)
5044 first_mbind = s;
8ded5a0f 5045 }
252b5132 5046
8ded5a0f
AM
5047 /* If there are any SHF_TLS output sections, add PT_TLS segment. */
5048 if (tls_count > 0)
5049 {
00bee008
AM
5050 amt = sizeof (struct elf_segment_map) - sizeof (asection *);
5051 amt += tls_count * sizeof (asection *);
a50b1753 5052 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
5053 if (m == NULL)
5054 goto error_return;
5055 m->next = NULL;
5056 m->p_type = PT_TLS;
5057 m->count = tls_count;
5058 /* Mandated PF_R. */
5059 m->p_flags = PF_R;
5060 m->p_flags_valid = 1;
d923cae0 5061 s = first_tls;
446f7ed5 5062 for (i = 0; i < tls_count; ++i)
8ded5a0f 5063 {
d923cae0
L
5064 if ((s->flags & SEC_THREAD_LOCAL) == 0)
5065 {
5066 _bfd_error_handler
871b3ab2 5067 (_("%pB: TLS sections are not adjacent:"), abfd);
d923cae0
L
5068 s = first_tls;
5069 i = 0;
446f7ed5 5070 while (i < tls_count)
d923cae0
L
5071 {
5072 if ((s->flags & SEC_THREAD_LOCAL) != 0)
5073 {
871b3ab2 5074 _bfd_error_handler (_(" TLS: %pA"), s);
d923cae0
L
5075 i++;
5076 }
5077 else
871b3ab2 5078 _bfd_error_handler (_(" non-TLS: %pA"), s);
d923cae0
L
5079 s = s->next;
5080 }
5081 bfd_set_error (bfd_error_bad_value);
5082 goto error_return;
5083 }
5084 m->sections[i] = s;
5085 s = s->next;
8ded5a0f 5086 }
252b5132 5087
8ded5a0f
AM
5088 *pm = m;
5089 pm = &m->next;
5090 }
252b5132 5091
df3a023b
AM
5092 if (first_mbind
5093 && (abfd->flags & D_PAGED) != 0
5094 && (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_mbind) != 0)
a91e1603
L
5095 for (s = first_mbind; s != NULL; s = s->next)
5096 if ((elf_section_flags (s) & SHF_GNU_MBIND) != 0
df3a023b 5097 && elf_section_data (s)->this_hdr.sh_info <= PT_GNU_MBIND_NUM)
a91e1603
L
5098 {
5099 /* Mandated PF_R. */
5100 unsigned long p_flags = PF_R;
5101 if ((s->flags & SEC_READONLY) == 0)
5102 p_flags |= PF_W;
5103 if ((s->flags & SEC_CODE) != 0)
5104 p_flags |= PF_X;
5105
5106 amt = sizeof (struct elf_segment_map) + sizeof (asection *);
5107 m = bfd_zalloc (abfd, amt);
5108 if (m == NULL)
5109 goto error_return;
5110 m->next = NULL;
5111 m->p_type = (PT_GNU_MBIND_LO
5112 + elf_section_data (s)->this_hdr.sh_info);
5113 m->count = 1;
5114 m->p_flags_valid = 1;
5115 m->sections[0] = s;
5116 m->p_flags = p_flags;
5117
5118 *pm = m;
5119 pm = &m->next;
5120 }
5121
0a59decb
L
5122 s = bfd_get_section_by_name (abfd,
5123 NOTE_GNU_PROPERTY_SECTION_NAME);
5124 if (s != NULL && s->size != 0)
5125 {
5126 amt = sizeof (struct elf_segment_map) + sizeof (asection *);
5127 m = bfd_zalloc (abfd, amt);
5128 if (m == NULL)
5129 goto error_return;
5130 m->next = NULL;
5131 m->p_type = PT_GNU_PROPERTY;
5132 m->count = 1;
5133 m->p_flags_valid = 1;
5134 m->sections[0] = s;
5135 m->p_flags = PF_R;
5136 *pm = m;
5137 pm = &m->next;
5138 }
5139
8ded5a0f
AM
5140 /* If there is a .eh_frame_hdr section, throw in a PT_GNU_EH_FRAME
5141 segment. */
12bd6957 5142 eh_frame_hdr = elf_eh_frame_hdr (abfd);
8ded5a0f
AM
5143 if (eh_frame_hdr != NULL
5144 && (eh_frame_hdr->output_section->flags & SEC_LOAD) != 0)
252b5132 5145 {
dc810e39 5146 amt = sizeof (struct elf_segment_map);
a50b1753 5147 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
252b5132
RH
5148 if (m == NULL)
5149 goto error_return;
5150 m->next = NULL;
8ded5a0f 5151 m->p_type = PT_GNU_EH_FRAME;
252b5132 5152 m->count = 1;
8ded5a0f 5153 m->sections[0] = eh_frame_hdr->output_section;
252b5132
RH
5154
5155 *pm = m;
5156 pm = &m->next;
5157 }
13ae64f3 5158
12bd6957 5159 if (elf_stack_flags (abfd))
13ae64f3 5160 {
8ded5a0f 5161 amt = sizeof (struct elf_segment_map);
a50b1753 5162 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
5163 if (m == NULL)
5164 goto error_return;
5165 m->next = NULL;
2b05f1b7 5166 m->p_type = PT_GNU_STACK;
12bd6957 5167 m->p_flags = elf_stack_flags (abfd);
04c3a755 5168 m->p_align = bed->stack_align;
8ded5a0f 5169 m->p_flags_valid = 1;
04c3a755
NS
5170 m->p_align_valid = m->p_align != 0;
5171 if (info->stacksize > 0)
5172 {
5173 m->p_size = info->stacksize;
5174 m->p_size_valid = 1;
5175 }
252b5132 5176
8ded5a0f
AM
5177 *pm = m;
5178 pm = &m->next;
5179 }
65765700 5180
ceae84aa 5181 if (info != NULL && info->relro)
8ded5a0f 5182 {
f210dcff
L
5183 for (m = mfirst; m != NULL; m = m->next)
5184 {
3832a4d8
AM
5185 if (m->p_type == PT_LOAD
5186 && m->count != 0
5187 && m->sections[0]->vma >= info->relro_start
5188 && m->sections[0]->vma < info->relro_end)
f210dcff 5189 {
3832a4d8
AM
5190 i = m->count;
5191 while (--i != (unsigned) -1)
5192 if ((m->sections[i]->flags & (SEC_LOAD | SEC_HAS_CONTENTS))
5193 == (SEC_LOAD | SEC_HAS_CONTENTS))
5194 break;
5195
43a8475c 5196 if (i != (unsigned) -1)
f210dcff
L
5197 break;
5198 }
be01b344 5199 }
f210dcff
L
5200
5201 /* Make a PT_GNU_RELRO segment only when it isn't empty. */
5202 if (m != NULL)
5203 {
5204 amt = sizeof (struct elf_segment_map);
a50b1753 5205 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
f210dcff
L
5206 if (m == NULL)
5207 goto error_return;
5208 m->next = NULL;
5209 m->p_type = PT_GNU_RELRO;
f210dcff
L
5210 *pm = m;
5211 pm = &m->next;
5212 }
8ded5a0f 5213 }
9ee5e499 5214
8ded5a0f 5215 free (sections);
12bd6957 5216 elf_seg_map (abfd) = mfirst;
9ee5e499
JJ
5217 }
5218
3dea8fca 5219 if (!elf_modify_segment_map (abfd, info, no_user_phdrs))
8ded5a0f 5220 return FALSE;
8c37241b 5221
12bd6957 5222 for (count = 0, m = elf_seg_map (abfd); m != NULL; m = m->next)
8ded5a0f 5223 ++count;
12bd6957 5224 elf_program_header_size (abfd) = count * bed->s->sizeof_phdr;
252b5132 5225
b34976b6 5226 return TRUE;
252b5132
RH
5227
5228 error_return:
5229 if (sections != NULL)
5230 free (sections);
b34976b6 5231 return FALSE;
252b5132
RH
5232}
5233
5234/* Sort sections by address. */
5235
5236static int
217aa764 5237elf_sort_sections (const void *arg1, const void *arg2)
252b5132
RH
5238{
5239 const asection *sec1 = *(const asection **) arg1;
5240 const asection *sec2 = *(const asection **) arg2;
eecdbe52 5241 bfd_size_type size1, size2;
252b5132
RH
5242
5243 /* Sort by LMA first, since this is the address used to
5244 place the section into a segment. */
5245 if (sec1->lma < sec2->lma)
5246 return -1;
5247 else if (sec1->lma > sec2->lma)
5248 return 1;
5249
5250 /* Then sort by VMA. Normally the LMA and the VMA will be
5251 the same, and this will do nothing. */
5252 if (sec1->vma < sec2->vma)
5253 return -1;
5254 else if (sec1->vma > sec2->vma)
5255 return 1;
5256
5257 /* Put !SEC_LOAD sections after SEC_LOAD ones. */
5258
07c6e936 5259#define TOEND(x) (((x)->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0)
252b5132
RH
5260
5261 if (TOEND (sec1))
5262 {
48db3297 5263 if (!TOEND (sec2))
252b5132
RH
5264 return 1;
5265 }
00a7cdc5 5266 else if (TOEND (sec2))
252b5132
RH
5267 return -1;
5268
5269#undef TOEND
5270
00a7cdc5
NC
5271 /* Sort by size, to put zero sized sections
5272 before others at the same address. */
252b5132 5273
eea6121a
AM
5274 size1 = (sec1->flags & SEC_LOAD) ? sec1->size : 0;
5275 size2 = (sec2->flags & SEC_LOAD) ? sec2->size : 0;
eecdbe52
JJ
5276
5277 if (size1 < size2)
252b5132 5278 return -1;
eecdbe52 5279 if (size1 > size2)
252b5132
RH
5280 return 1;
5281
5282 return sec1->target_index - sec2->target_index;
5283}
5284
30fe1832
AM
5285/* This qsort comparison functions sorts PT_LOAD segments first and
5286 by p_paddr, for assign_file_positions_for_load_sections. */
5287
5288static int
5289elf_sort_segments (const void *arg1, const void *arg2)
5290{
5291 const struct elf_segment_map *m1 = *(const struct elf_segment_map **) arg1;
5292 const struct elf_segment_map *m2 = *(const struct elf_segment_map **) arg2;
5293
5294 if (m1->p_type != m2->p_type)
5295 {
5296 if (m1->p_type == PT_NULL)
5297 return 1;
5298 if (m2->p_type == PT_NULL)
5299 return -1;
5300 return m1->p_type < m2->p_type ? -1 : 1;
5301 }
5302 if (m1->includes_filehdr != m2->includes_filehdr)
5303 return m1->includes_filehdr ? -1 : 1;
5304 if (m1->no_sort_lma != m2->no_sort_lma)
5305 return m1->no_sort_lma ? -1 : 1;
5306 if (m1->p_type == PT_LOAD && !m1->no_sort_lma)
5307 {
5308 bfd_vma lma1, lma2;
5309 lma1 = 0;
5310 if (m1->p_paddr_valid)
5311 lma1 = m1->p_paddr;
5312 else if (m1->count != 0)
5313 lma1 = m1->sections[0]->lma + m1->p_vaddr_offset;
5314 lma2 = 0;
5315 if (m2->p_paddr_valid)
5316 lma2 = m2->p_paddr;
5317 else if (m2->count != 0)
5318 lma2 = m2->sections[0]->lma + m2->p_vaddr_offset;
5319 if (lma1 != lma2)
5320 return lma1 < lma2 ? -1 : 1;
5321 }
5322 if (m1->idx != m2->idx)
5323 return m1->idx < m2->idx ? -1 : 1;
5324 return 0;
5325}
5326
340b6d91
AC
5327/* Ian Lance Taylor writes:
5328
5329 We shouldn't be using % with a negative signed number. That's just
5330 not good. We have to make sure either that the number is not
5331 negative, or that the number has an unsigned type. When the types
5332 are all the same size they wind up as unsigned. When file_ptr is a
5333 larger signed type, the arithmetic winds up as signed long long,
5334 which is wrong.
5335
5336 What we're trying to say here is something like ``increase OFF by
5337 the least amount that will cause it to be equal to the VMA modulo
5338 the page size.'' */
5339/* In other words, something like:
5340
5341 vma_offset = m->sections[0]->vma % bed->maxpagesize;
5342 off_offset = off % bed->maxpagesize;
5343 if (vma_offset < off_offset)
5344 adjustment = vma_offset + bed->maxpagesize - off_offset;
5345 else
5346 adjustment = vma_offset - off_offset;
08a40648 5347
de194d85 5348 which can be collapsed into the expression below. */
340b6d91
AC
5349
5350static file_ptr
5351vma_page_aligned_bias (bfd_vma vma, ufile_ptr off, bfd_vma maxpagesize)
5352{
dc9155b2
NC
5353 /* PR binutils/16199: Handle an alignment of zero. */
5354 if (maxpagesize == 0)
5355 maxpagesize = 1;
340b6d91
AC
5356 return ((vma - off) % maxpagesize);
5357}
5358
6d33f217
L
5359static void
5360print_segment_map (const struct elf_segment_map *m)
5361{
5362 unsigned int j;
5363 const char *pt = get_segment_type (m->p_type);
5364 char buf[32];
5365
5366 if (pt == NULL)
5367 {
5368 if (m->p_type >= PT_LOPROC && m->p_type <= PT_HIPROC)
5369 sprintf (buf, "LOPROC+%7.7x",
5370 (unsigned int) (m->p_type - PT_LOPROC));
5371 else if (m->p_type >= PT_LOOS && m->p_type <= PT_HIOS)
5372 sprintf (buf, "LOOS+%7.7x",
5373 (unsigned int) (m->p_type - PT_LOOS));
5374 else
5375 snprintf (buf, sizeof (buf), "%8.8x",
5376 (unsigned int) m->p_type);
5377 pt = buf;
5378 }
4a97a0e5 5379 fflush (stdout);
6d33f217
L
5380 fprintf (stderr, "%s:", pt);
5381 for (j = 0; j < m->count; j++)
5382 fprintf (stderr, " %s", m->sections [j]->name);
5383 putc ('\n',stderr);
4a97a0e5 5384 fflush (stderr);
6d33f217
L
5385}
5386
32812159
AM
5387static bfd_boolean
5388write_zeros (bfd *abfd, file_ptr pos, bfd_size_type len)
5389{
5390 void *buf;
5391 bfd_boolean ret;
5392
5393 if (bfd_seek (abfd, pos, SEEK_SET) != 0)
5394 return FALSE;
5395 buf = bfd_zmalloc (len);
5396 if (buf == NULL)
5397 return FALSE;
5398 ret = bfd_bwrite (buf, len, abfd) == len;
5399 free (buf);
5400 return ret;
5401}
5402
252b5132
RH
5403/* Assign file positions to the sections based on the mapping from
5404 sections to segments. This function also sets up some fields in
f3520d2f 5405 the file header. */
252b5132 5406
b34976b6 5407static bfd_boolean
f3520d2f
AM
5408assign_file_positions_for_load_sections (bfd *abfd,
5409 struct bfd_link_info *link_info)
252b5132
RH
5410{
5411 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 5412 struct elf_segment_map *m;
30fe1832 5413 struct elf_segment_map *phdr_load_seg;
252b5132 5414 Elf_Internal_Phdr *phdrs;
252b5132 5415 Elf_Internal_Phdr *p;
02bf8d82 5416 file_ptr off;
3f570048 5417 bfd_size_type maxpagesize;
30fe1832 5418 unsigned int alloc, actual;
0920dee7 5419 unsigned int i, j;
30fe1832 5420 struct elf_segment_map **sorted_seg_map;
252b5132 5421
e36284ab 5422 if (link_info == NULL
ceae84aa 5423 && !_bfd_elf_map_sections_to_segments (abfd, link_info))
8ded5a0f 5424 return FALSE;
252b5132 5425
8ded5a0f 5426 alloc = 0;
12bd6957 5427 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
30fe1832 5428 m->idx = alloc++;
252b5132 5429
82f2dbf7
NC
5430 if (alloc)
5431 {
5432 elf_elfheader (abfd)->e_phoff = bed->s->sizeof_ehdr;
5433 elf_elfheader (abfd)->e_phentsize = bed->s->sizeof_phdr;
5434 }
5435 else
5436 {
5437 /* PR binutils/12467. */
5438 elf_elfheader (abfd)->e_phoff = 0;
5439 elf_elfheader (abfd)->e_phentsize = 0;
5440 }
d324f6d6 5441
8ded5a0f 5442 elf_elfheader (abfd)->e_phnum = alloc;
252b5132 5443
12bd6957 5444 if (elf_program_header_size (abfd) == (bfd_size_type) -1)
30fe1832
AM
5445 {
5446 actual = alloc;
5447 elf_program_header_size (abfd) = alloc * bed->s->sizeof_phdr;
5448 }
8ded5a0f 5449 else
30fe1832
AM
5450 {
5451 actual = elf_program_header_size (abfd) / bed->s->sizeof_phdr;
5452 BFD_ASSERT (elf_program_header_size (abfd)
5453 == actual * bed->s->sizeof_phdr);
5454 BFD_ASSERT (actual >= alloc);
5455 }
252b5132
RH
5456
5457 if (alloc == 0)
f3520d2f 5458 {
12bd6957 5459 elf_next_file_pos (abfd) = bed->s->sizeof_ehdr;
8ded5a0f 5460 return TRUE;
f3520d2f 5461 }
252b5132 5462
12bd6957 5463 /* We're writing the size in elf_program_header_size (abfd),
57268894
HPN
5464 see assign_file_positions_except_relocs, so make sure we have
5465 that amount allocated, with trailing space cleared.
12bd6957
AM
5466 The variable alloc contains the computed need, while
5467 elf_program_header_size (abfd) contains the size used for the
57268894
HPN
5468 layout.
5469 See ld/emultempl/elf-generic.em:gld${EMULATION_NAME}_map_segments
5470 where the layout is forced to according to a larger size in the
5471 last iterations for the testcase ld-elf/header. */
30fe1832
AM
5472 phdrs = bfd_zalloc (abfd, (actual * sizeof (*phdrs)
5473 + alloc * sizeof (*sorted_seg_map)));
5474 sorted_seg_map = (struct elf_segment_map **) (phdrs + actual);
f3520d2f 5475 elf_tdata (abfd)->phdr = phdrs;
252b5132 5476 if (phdrs == NULL)
b34976b6 5477 return FALSE;
252b5132 5478
30fe1832 5479 for (m = elf_seg_map (abfd), j = 0; m != NULL; m = m->next, j++)
252b5132 5480 {
30fe1832 5481 sorted_seg_map[j] = m;
252b5132 5482 /* If elf_segment_map is not from map_sections_to_segments, the
08a40648 5483 sections may not be correctly ordered. NOTE: sorting should
52e9b619
MS
5484 not be done to the PT_NOTE section of a corefile, which may
5485 contain several pseudo-sections artificially created by bfd.
5486 Sorting these pseudo-sections breaks things badly. */
47d9a591
AM
5487 if (m->count > 1
5488 && !(elf_elfheader (abfd)->e_type == ET_CORE
52e9b619 5489 && m->p_type == PT_NOTE))
48db3297
AM
5490 {
5491 for (i = 0; i < m->count; i++)
5492 m->sections[i]->target_index = i;
5493 qsort (m->sections, (size_t) m->count, sizeof (asection *),
5494 elf_sort_sections);
5495 }
30fe1832
AM
5496 }
5497 if (alloc > 1)
5498 qsort (sorted_seg_map, alloc, sizeof (*sorted_seg_map),
5499 elf_sort_segments);
5500
5501 maxpagesize = 1;
5502 if ((abfd->flags & D_PAGED) != 0)
5503 maxpagesize = bed->maxpagesize;
5504
5505 /* Sections must map to file offsets past the ELF file header. */
5506 off = bed->s->sizeof_ehdr;
5507 /* And if one of the PT_LOAD headers doesn't include the program
5508 headers then we'll be mapping program headers in the usual
5509 position after the ELF file header. */
5510 phdr_load_seg = NULL;
5511 for (j = 0; j < alloc; j++)
5512 {
5513 m = sorted_seg_map[j];
5514 if (m->p_type != PT_LOAD)
5515 break;
5516 if (m->includes_phdrs)
5517 {
5518 phdr_load_seg = m;
5519 break;
5520 }
5521 }
5522 if (phdr_load_seg == NULL)
5523 off += actual * bed->s->sizeof_phdr;
5524
5525 for (j = 0; j < alloc; j++)
5526 {
5527 asection **secpp;
5528 bfd_vma off_adjust;
5529 bfd_boolean no_contents;
252b5132 5530
b301b248
AM
5531 /* An ELF segment (described by Elf_Internal_Phdr) may contain a
5532 number of sections with contents contributing to both p_filesz
5533 and p_memsz, followed by a number of sections with no contents
5534 that just contribute to p_memsz. In this loop, OFF tracks next
02bf8d82 5535 available file offset for PT_LOAD and PT_NOTE segments. */
30fe1832
AM
5536 m = sorted_seg_map[j];
5537 p = phdrs + m->idx;
252b5132 5538 p->p_type = m->p_type;
28a7f3e7 5539 p->p_flags = m->p_flags;
252b5132 5540
3f570048 5541 if (m->count == 0)
5d695627 5542 p->p_vaddr = m->p_vaddr_offset;
3f570048 5543 else
5d695627 5544 p->p_vaddr = m->sections[0]->vma + m->p_vaddr_offset;
3f570048
AM
5545
5546 if (m->p_paddr_valid)
5547 p->p_paddr = m->p_paddr;
5548 else if (m->count == 0)
5549 p->p_paddr = 0;
5550 else
5d695627 5551 p->p_paddr = m->sections[0]->lma + m->p_vaddr_offset;
3f570048
AM
5552
5553 if (p->p_type == PT_LOAD
5554 && (abfd->flags & D_PAGED) != 0)
5555 {
5556 /* p_align in demand paged PT_LOAD segments effectively stores
5557 the maximum page size. When copying an executable with
5558 objcopy, we set m->p_align from the input file. Use this
5559 value for maxpagesize rather than bed->maxpagesize, which
5560 may be different. Note that we use maxpagesize for PT_TLS
5561 segment alignment later in this function, so we are relying
5562 on at least one PT_LOAD segment appearing before a PT_TLS
5563 segment. */
5564 if (m->p_align_valid)
5565 maxpagesize = m->p_align;
5566
5567 p->p_align = maxpagesize;
5568 }
3271a814
NS
5569 else if (m->p_align_valid)
5570 p->p_align = m->p_align;
e970b90a
DJ
5571 else if (m->count == 0)
5572 p->p_align = 1 << bed->s->log_file_align;
30fe1832
AM
5573
5574 if (m == phdr_load_seg)
5575 {
5576 if (!m->includes_filehdr)
5577 p->p_offset = off;
5578 off += actual * bed->s->sizeof_phdr;
5579 }
3f570048 5580
bf988460
AM
5581 no_contents = FALSE;
5582 off_adjust = 0;
252b5132 5583 if (p->p_type == PT_LOAD
b301b248 5584 && m->count > 0)
252b5132 5585 {
b301b248 5586 bfd_size_type align;
a49e53ed 5587 unsigned int align_power = 0;
b301b248 5588
3271a814
NS
5589 if (m->p_align_valid)
5590 align = p->p_align;
5591 else
252b5132 5592 {
3271a814
NS
5593 for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
5594 {
5595 unsigned int secalign;
08a40648 5596
fd361982 5597 secalign = bfd_section_alignment (*secpp);
3271a814
NS
5598 if (secalign > align_power)
5599 align_power = secalign;
5600 }
5601 align = (bfd_size_type) 1 << align_power;
5602 if (align < maxpagesize)
5603 align = maxpagesize;
b301b248 5604 }
252b5132 5605
02bf8d82
AM
5606 for (i = 0; i < m->count; i++)
5607 if ((m->sections[i]->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
5608 /* If we aren't making room for this section, then
5609 it must be SHT_NOBITS regardless of what we've
5610 set via struct bfd_elf_special_section. */
5611 elf_section_type (m->sections[i]) = SHT_NOBITS;
5612
bf988460 5613 /* Find out whether this segment contains any loadable
aea274d3
AM
5614 sections. */
5615 no_contents = TRUE;
5616 for (i = 0; i < m->count; i++)
5617 if (elf_section_type (m->sections[i]) != SHT_NOBITS)
5618 {
5619 no_contents = FALSE;
5620 break;
5621 }
bf988460 5622
85cfcbfb 5623 off_adjust = vma_page_aligned_bias (p->p_vaddr, off, align);
a8c75b76
AM
5624
5625 /* Broken hardware and/or kernel require that files do not
5626 map the same page with different permissions on some hppa
5627 processors. */
30fe1832
AM
5628 if (j != 0
5629 && (abfd->flags & D_PAGED) != 0
a8c75b76
AM
5630 && bed->no_page_alias
5631 && (off & (maxpagesize - 1)) != 0
5632 && (off & -maxpagesize) == ((off + off_adjust) & -maxpagesize))
5633 off_adjust += maxpagesize;
bf988460
AM
5634 off += off_adjust;
5635 if (no_contents)
5636 {
5637 /* We shouldn't need to align the segment on disk since
5638 the segment doesn't need file space, but the gABI
5639 arguably requires the alignment and glibc ld.so
5640 checks it. So to comply with the alignment
5641 requirement but not waste file space, we adjust
5642 p_offset for just this segment. (OFF_ADJUST is
5643 subtracted from OFF later.) This may put p_offset
5644 past the end of file, but that shouldn't matter. */
5645 }
5646 else
5647 off_adjust = 0;
252b5132 5648 }
b1a6d0b1
NC
5649 /* Make sure the .dynamic section is the first section in the
5650 PT_DYNAMIC segment. */
5651 else if (p->p_type == PT_DYNAMIC
5652 && m->count > 1
5653 && strcmp (m->sections[0]->name, ".dynamic") != 0)
5654 {
5655 _bfd_error_handler
871b3ab2 5656 (_("%pB: The first section in the PT_DYNAMIC segment"
63a5468a 5657 " is not the .dynamic section"),
b301b248 5658 abfd);
b1a6d0b1
NC
5659 bfd_set_error (bfd_error_bad_value);
5660 return FALSE;
5661 }
3f001e84
JK
5662 /* Set the note section type to SHT_NOTE. */
5663 else if (p->p_type == PT_NOTE)
5664 for (i = 0; i < m->count; i++)
5665 elf_section_type (m->sections[i]) = SHT_NOTE;
252b5132 5666
252b5132
RH
5667 if (m->includes_filehdr)
5668 {
bf988460 5669 if (!m->p_flags_valid)
252b5132 5670 p->p_flags |= PF_R;
252b5132
RH
5671 p->p_filesz = bed->s->sizeof_ehdr;
5672 p->p_memsz = bed->s->sizeof_ehdr;
30fe1832 5673 if (p->p_type == PT_LOAD)
252b5132 5674 {
30fe1832 5675 if (m->count > 0)
252b5132 5676 {
30fe1832
AM
5677 if (p->p_vaddr < (bfd_vma) off
5678 || (!m->p_paddr_valid
5679 && p->p_paddr < (bfd_vma) off))
5680 {
5681 _bfd_error_handler
5682 (_("%pB: not enough room for program headers,"
5683 " try linking with -N"),
5684 abfd);
5685 bfd_set_error (bfd_error_bad_value);
5686 return FALSE;
5687 }
5688 p->p_vaddr -= off;
5689 if (!m->p_paddr_valid)
5690 p->p_paddr -= off;
252b5132 5691 }
30fe1832
AM
5692 }
5693 else if (sorted_seg_map[0]->includes_filehdr)
5694 {
5695 Elf_Internal_Phdr *filehdr = phdrs + sorted_seg_map[0]->idx;
5696 p->p_vaddr = filehdr->p_vaddr;
bf988460 5697 if (!m->p_paddr_valid)
30fe1832 5698 p->p_paddr = filehdr->p_paddr;
252b5132 5699 }
252b5132
RH
5700 }
5701
5702 if (m->includes_phdrs)
5703 {
bf988460 5704 if (!m->p_flags_valid)
252b5132 5705 p->p_flags |= PF_R;
30fe1832
AM
5706 p->p_filesz += actual * bed->s->sizeof_phdr;
5707 p->p_memsz += actual * bed->s->sizeof_phdr;
f3520d2f 5708 if (!m->includes_filehdr)
252b5132 5709 {
30fe1832 5710 if (p->p_type == PT_LOAD)
252b5132 5711 {
30fe1832
AM
5712 elf_elfheader (abfd)->e_phoff = p->p_offset;
5713 if (m->count > 0)
5714 {
5715 p->p_vaddr -= off - p->p_offset;
5716 if (!m->p_paddr_valid)
5717 p->p_paddr -= off - p->p_offset;
5718 }
5719 }
5720 else if (phdr_load_seg != NULL)
5721 {
5722 Elf_Internal_Phdr *phdr = phdrs + phdr_load_seg->idx;
5723 bfd_vma phdr_off = 0;
5724 if (phdr_load_seg->includes_filehdr)
5725 phdr_off = bed->s->sizeof_ehdr;
5726 p->p_vaddr = phdr->p_vaddr + phdr_off;
bf988460 5727 if (!m->p_paddr_valid)
30fe1832
AM
5728 p->p_paddr = phdr->p_paddr + phdr_off;
5729 p->p_offset = phdr->p_offset + phdr_off;
252b5132 5730 }
30fe1832
AM
5731 else
5732 p->p_offset = bed->s->sizeof_ehdr;
2b0bc088 5733 }
252b5132
RH
5734 }
5735
5736 if (p->p_type == PT_LOAD
5737 || (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core))
5738 {
bf988460 5739 if (!m->includes_filehdr && !m->includes_phdrs)
0bc3450e
AM
5740 {
5741 p->p_offset = off;
5742 if (no_contents)
67641dd3
AM
5743 {
5744 /* Put meaningless p_offset for PT_LOAD segments
5745 without file contents somewhere within the first
5746 page, in an attempt to not point past EOF. */
5747 bfd_size_type align = maxpagesize;
5748 if (align < p->p_align)
5749 align = p->p_align;
5750 if (align < 1)
5751 align = 1;
5752 p->p_offset = off % align;
5753 }
0bc3450e 5754 }
252b5132
RH
5755 else
5756 {
5757 file_ptr adjust;
5758
5759 adjust = off - (p->p_offset + p->p_filesz);
bf988460
AM
5760 if (!no_contents)
5761 p->p_filesz += adjust;
252b5132
RH
5762 p->p_memsz += adjust;
5763 }
5764 }
5765
1ea63fd2
AM
5766 /* Set up p_filesz, p_memsz, p_align and p_flags from the section
5767 maps. Set filepos for sections in PT_LOAD segments, and in
5768 core files, for sections in PT_NOTE segments.
5769 assign_file_positions_for_non_load_sections will set filepos
5770 for other sections and update p_filesz for other segments. */
252b5132
RH
5771 for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
5772 {
5773 asection *sec;
252b5132 5774 bfd_size_type align;
627b32bc 5775 Elf_Internal_Shdr *this_hdr;
252b5132
RH
5776
5777 sec = *secpp;
02bf8d82 5778 this_hdr = &elf_section_data (sec)->this_hdr;
fd361982 5779 align = (bfd_size_type) 1 << bfd_section_alignment (sec);
252b5132 5780
88967714
AM
5781 if ((p->p_type == PT_LOAD
5782 || p->p_type == PT_TLS)
5783 && (this_hdr->sh_type != SHT_NOBITS
5784 || ((this_hdr->sh_flags & SHF_ALLOC) != 0
5785 && ((this_hdr->sh_flags & SHF_TLS) == 0
5786 || p->p_type == PT_TLS))))
252b5132 5787 {
b5599592
AM
5788 bfd_vma p_start = p->p_paddr;
5789 bfd_vma p_end = p_start + p->p_memsz;
5790 bfd_vma s_start = sec->lma;
5791 bfd_vma adjust = s_start - p_end;
252b5132 5792
a2d1e028
L
5793 if (adjust != 0
5794 && (s_start < p_end
5795 || p_end < p_start))
252b5132 5796 {
4eca0228 5797 _bfd_error_handler
695344c0 5798 /* xgettext:c-format */
2dcf00ce
AM
5799 (_("%pB: section %pA lma %#" PRIx64 " adjusted to %#" PRIx64),
5800 abfd, sec, (uint64_t) s_start, (uint64_t) p_end);
88967714 5801 adjust = 0;
b5599592 5802 sec->lma = p_end;
1cfb7d1e 5803 }
3ac9b6c9 5804 p->p_memsz += adjust;
1cfb7d1e 5805
88967714
AM
5806 if (this_hdr->sh_type != SHT_NOBITS)
5807 {
30fe1832 5808 if (p->p_type == PT_LOAD)
32812159 5809 {
30fe1832
AM
5810 if (p->p_filesz + adjust < p->p_memsz)
5811 {
5812 /* We have a PROGBITS section following NOBITS ones.
5813 Allocate file space for the NOBITS section(s) and
5814 zero it. */
5815 adjust = p->p_memsz - p->p_filesz;
5816 if (!write_zeros (abfd, off, adjust))
5817 return FALSE;
5818 }
5819 off += adjust;
32812159 5820 }
88967714 5821 p->p_filesz += adjust;
252b5132 5822 }
252b5132
RH
5823 }
5824
5825 if (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core)
5826 {
b301b248
AM
5827 /* The section at i == 0 is the one that actually contains
5828 everything. */
4a938328
MS
5829 if (i == 0)
5830 {
627b32bc 5831 this_hdr->sh_offset = sec->filepos = off;
6a3cd2b4
AM
5832 off += this_hdr->sh_size;
5833 p->p_filesz = this_hdr->sh_size;
b301b248
AM
5834 p->p_memsz = 0;
5835 p->p_align = 1;
252b5132 5836 }
4a938328 5837 else
252b5132 5838 {
b301b248 5839 /* The rest are fake sections that shouldn't be written. */
252b5132 5840 sec->filepos = 0;
eea6121a 5841 sec->size = 0;
b301b248
AM
5842 sec->flags = 0;
5843 continue;
252b5132 5844 }
252b5132
RH
5845 }
5846 else
5847 {
1e951488 5848 if (p->p_type == PT_LOAD)
b301b248 5849 {
1e951488
AM
5850 this_hdr->sh_offset = sec->filepos = off;
5851 if (this_hdr->sh_type != SHT_NOBITS)
5852 off += this_hdr->sh_size;
5853 }
5854 else if (this_hdr->sh_type == SHT_NOBITS
5855 && (this_hdr->sh_flags & SHF_TLS) != 0
5856 && this_hdr->sh_offset == 0)
5857 {
5858 /* This is a .tbss section that didn't get a PT_LOAD.
5859 (See _bfd_elf_map_sections_to_segments "Create a
5860 final PT_LOAD".) Set sh_offset to the value it
5861 would have if we had created a zero p_filesz and
5862 p_memsz PT_LOAD header for the section. This
5863 also makes the PT_TLS header have the same
5864 p_offset value. */
5865 bfd_vma adjust = vma_page_aligned_bias (this_hdr->sh_addr,
5866 off, align);
5867 this_hdr->sh_offset = sec->filepos = off + adjust;
b301b248 5868 }
252b5132 5869
02bf8d82 5870 if (this_hdr->sh_type != SHT_NOBITS)
b301b248 5871 {
6a3cd2b4 5872 p->p_filesz += this_hdr->sh_size;
02bf8d82
AM
5873 /* A load section without SHF_ALLOC is something like
5874 a note section in a PT_NOTE segment. These take
5875 file space but are not loaded into memory. */
5876 if ((this_hdr->sh_flags & SHF_ALLOC) != 0)
6a3cd2b4 5877 p->p_memsz += this_hdr->sh_size;
b301b248 5878 }
6a3cd2b4 5879 else if ((this_hdr->sh_flags & SHF_ALLOC) != 0)
13ae64f3 5880 {
6a3cd2b4
AM
5881 if (p->p_type == PT_TLS)
5882 p->p_memsz += this_hdr->sh_size;
5883
5884 /* .tbss is special. It doesn't contribute to p_memsz of
5885 normal segments. */
5886 else if ((this_hdr->sh_flags & SHF_TLS) == 0)
5887 p->p_memsz += this_hdr->sh_size;
13ae64f3
JJ
5888 }
5889
b10a8ae0
L
5890 if (align > p->p_align
5891 && !m->p_align_valid
5892 && (p->p_type != PT_LOAD
5893 || (abfd->flags & D_PAGED) == 0))
252b5132
RH
5894 p->p_align = align;
5895 }
5896
bf988460 5897 if (!m->p_flags_valid)
252b5132
RH
5898 {
5899 p->p_flags |= PF_R;
02bf8d82 5900 if ((this_hdr->sh_flags & SHF_EXECINSTR) != 0)
252b5132 5901 p->p_flags |= PF_X;
02bf8d82 5902 if ((this_hdr->sh_flags & SHF_WRITE) != 0)
252b5132
RH
5903 p->p_flags |= PF_W;
5904 }
5905 }
43a8475c 5906
bf988460 5907 off -= off_adjust;
0920dee7 5908
30fe1832
AM
5909 /* PR ld/20815 - Check that the program header segment, if
5910 present, will be loaded into memory. */
5911 if (p->p_type == PT_PHDR
5912 && phdr_load_seg == NULL
5913 && !(bed->elf_backend_allow_non_load_phdr != NULL
5914 && bed->elf_backend_allow_non_load_phdr (abfd, phdrs, alloc)))
5915 {
5916 /* The fix for this error is usually to edit the linker script being
5917 used and set up the program headers manually. Either that or
5918 leave room for the headers at the start of the SECTIONS. */
5919 _bfd_error_handler (_("%pB: error: PHDR segment not covered"
5920 " by LOAD segment"),
5921 abfd);
7b3c2715
AM
5922 if (link_info == NULL)
5923 return FALSE;
5924 /* Arrange for the linker to exit with an error, deleting
5925 the output file unless --noinhibit-exec is given. */
5926 link_info->callbacks->info ("%X");
30fe1832
AM
5927 }
5928
7c928300
AM
5929 /* Check that all sections are in a PT_LOAD segment.
5930 Don't check funky gdb generated core files. */
5931 if (p->p_type == PT_LOAD && bfd_get_format (abfd) != bfd_core)
9a83a553
AM
5932 {
5933 bfd_boolean check_vma = TRUE;
5934
5935 for (i = 1; i < m->count; i++)
5936 if (m->sections[i]->vma == m->sections[i - 1]->vma
5937 && ELF_SECTION_SIZE (&(elf_section_data (m->sections[i])
5938 ->this_hdr), p) != 0
5939 && ELF_SECTION_SIZE (&(elf_section_data (m->sections[i - 1])
5940 ->this_hdr), p) != 0)
0920dee7 5941 {
9a83a553
AM
5942 /* Looks like we have overlays packed into the segment. */
5943 check_vma = FALSE;
5944 break;
0920dee7 5945 }
9a83a553
AM
5946
5947 for (i = 0; i < m->count; i++)
5948 {
5949 Elf_Internal_Shdr *this_hdr;
5950 asection *sec;
5951
5952 sec = m->sections[i];
5953 this_hdr = &(elf_section_data(sec)->this_hdr);
86b2281f
AM
5954 if (!ELF_SECTION_IN_SEGMENT_1 (this_hdr, p, check_vma, 0)
5955 && !ELF_TBSS_SPECIAL (this_hdr, p))
9a83a553 5956 {
4eca0228 5957 _bfd_error_handler
695344c0 5958 /* xgettext:c-format */
871b3ab2 5959 (_("%pB: section `%pA' can't be allocated in segment %d"),
9a83a553
AM
5960 abfd, sec, j);
5961 print_segment_map (m);
5962 }
5963 }
5964 }
252b5132
RH
5965 }
5966
12bd6957 5967 elf_next_file_pos (abfd) = off;
30fe1832
AM
5968
5969 if (link_info != NULL
5970 && phdr_load_seg != NULL
5971 && phdr_load_seg->includes_filehdr)
5972 {
5973 /* There is a segment that contains both the file headers and the
5974 program headers, so provide a symbol __ehdr_start pointing there.
5975 A program can use this to examine itself robustly. */
5976
5977 struct elf_link_hash_entry *hash
5978 = elf_link_hash_lookup (elf_hash_table (link_info), "__ehdr_start",
5979 FALSE, FALSE, TRUE);
5980 /* If the symbol was referenced and not defined, define it. */
5981 if (hash != NULL
5982 && (hash->root.type == bfd_link_hash_new
5983 || hash->root.type == bfd_link_hash_undefined
5984 || hash->root.type == bfd_link_hash_undefweak
5985 || hash->root.type == bfd_link_hash_common))
5986 {
5987 asection *s = NULL;
5988 bfd_vma filehdr_vaddr = phdrs[phdr_load_seg->idx].p_vaddr;
5989
5990 if (phdr_load_seg->count != 0)
5991 /* The segment contains sections, so use the first one. */
5992 s = phdr_load_seg->sections[0];
5993 else
5994 /* Use the first (i.e. lowest-addressed) section in any segment. */
5995 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
5996 if (m->p_type == PT_LOAD && m->count != 0)
5997 {
5998 s = m->sections[0];
5999 break;
6000 }
6001
6002 if (s != NULL)
6003 {
6004 hash->root.u.def.value = filehdr_vaddr - s->vma;
6005 hash->root.u.def.section = s;
6006 }
6007 else
6008 {
6009 hash->root.u.def.value = filehdr_vaddr;
6010 hash->root.u.def.section = bfd_abs_section_ptr;
6011 }
6012
6013 hash->root.type = bfd_link_hash_defined;
6014 hash->def_regular = 1;
6015 hash->non_elf = 0;
6016 }
6017 }
6018
f3520d2f
AM
6019 return TRUE;
6020}
6021
1faa385f
NC
6022/* Determine if a bfd is a debuginfo file. Unfortunately there
6023 is no defined method for detecting such files, so we have to
6024 use heuristics instead. */
6025
6026bfd_boolean
6027is_debuginfo_file (bfd *abfd)
6028{
6029 if (abfd == NULL || bfd_get_flavour (abfd) != bfd_target_elf_flavour)
6030 return FALSE;
6031
6032 Elf_Internal_Shdr **start_headers = elf_elfsections (abfd);
6033 Elf_Internal_Shdr **end_headers = start_headers + elf_numsections (abfd);
6034 Elf_Internal_Shdr **headerp;
6035
6036 for (headerp = start_headers; headerp < end_headers; headerp ++)
6037 {
6038 Elf_Internal_Shdr *header = * headerp;
6039
6040 /* Debuginfo files do not have any allocated SHT_PROGBITS sections.
6041 The only allocated sections are SHT_NOBITS or SHT_NOTES. */
6042 if ((header->sh_flags & SHF_ALLOC) == SHF_ALLOC
6043 && header->sh_type != SHT_NOBITS
6044 && header->sh_type != SHT_NOTE)
6045 return FALSE;
6046 }
6047
6048 return TRUE;
6049}
6050
1ff6de03
NA
6051/* Assign file positions for the other sections, except for compressed debugging
6052 and other sections assigned in _bfd_elf_assign_file_positions_for_non_load(). */
f3520d2f
AM
6053
6054static bfd_boolean
6055assign_file_positions_for_non_load_sections (bfd *abfd,
6056 struct bfd_link_info *link_info)
6057{
6058 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
6059 Elf_Internal_Shdr **i_shdrpp;
e06efbf1 6060 Elf_Internal_Shdr **hdrpp, **end_hdrpp;
f3520d2f
AM
6061 Elf_Internal_Phdr *phdrs;
6062 Elf_Internal_Phdr *p;
6063 struct elf_segment_map *m;
f3520d2f 6064 file_ptr off;
f3520d2f 6065
5c182d5f 6066 i_shdrpp = elf_elfsections (abfd);
e06efbf1 6067 end_hdrpp = i_shdrpp + elf_numsections (abfd);
12bd6957 6068 off = elf_next_file_pos (abfd);
e06efbf1 6069 for (hdrpp = i_shdrpp + 1; hdrpp < end_hdrpp; hdrpp++)
5c182d5f 6070 {
5c182d5f
AM
6071 Elf_Internal_Shdr *hdr;
6072
6073 hdr = *hdrpp;
6074 if (hdr->bfd_section != NULL
252e386e
AM
6075 && (hdr->bfd_section->filepos != 0
6076 || (hdr->sh_type == SHT_NOBITS
6077 && hdr->contents == NULL)))
627b32bc 6078 BFD_ASSERT (hdr->sh_offset == hdr->bfd_section->filepos);
5c182d5f
AM
6079 else if ((hdr->sh_flags & SHF_ALLOC) != 0)
6080 {
1faa385f
NC
6081 if (hdr->sh_size != 0
6082 /* PR 24717 - debuginfo files are known to be not strictly
6083 compliant with the ELF standard. In particular they often
6084 have .note.gnu.property sections that are outside of any
6085 loadable segment. This is not a problem for such files,
6086 so do not warn about them. */
6087 && ! is_debuginfo_file (abfd))
4eca0228 6088 _bfd_error_handler
695344c0 6089 /* xgettext:c-format */
871b3ab2 6090 (_("%pB: warning: allocated section `%s' not in segment"),
e8d2ba53
AM
6091 abfd,
6092 (hdr->bfd_section == NULL
6093 ? "*unknown*"
6094 : hdr->bfd_section->name));
3ba71138
L
6095 /* We don't need to page align empty sections. */
6096 if ((abfd->flags & D_PAGED) != 0 && hdr->sh_size != 0)
5c182d5f
AM
6097 off += vma_page_aligned_bias (hdr->sh_addr, off,
6098 bed->maxpagesize);
6099 else
6100 off += vma_page_aligned_bias (hdr->sh_addr, off,
6101 hdr->sh_addralign);
6102 off = _bfd_elf_assign_file_position_for_section (hdr, off,
6103 FALSE);
6104 }
6105 else if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
6106 && hdr->bfd_section == NULL)
1ff6de03
NA
6107 /* We don't know the offset of these sections yet: their size has
6108 not been decided. */
0ce398f1 6109 || (hdr->bfd_section != NULL
1ff6de03
NA
6110 && (hdr->bfd_section->flags & SEC_ELF_COMPRESS
6111 || (bfd_section_is_ctf (hdr->bfd_section)
6112 && abfd->is_linker_output)))
12bd6957 6113 || hdr == i_shdrpp[elf_onesymtab (abfd)]
6a40cf0c
NC
6114 || (elf_symtab_shndx_list (abfd) != NULL
6115 && hdr == i_shdrpp[elf_symtab_shndx_list (abfd)->ndx])
3e19fb8f
L
6116 || hdr == i_shdrpp[elf_strtab_sec (abfd)]
6117 || hdr == i_shdrpp[elf_shstrtab_sec (abfd)])
5c182d5f
AM
6118 hdr->sh_offset = -1;
6119 else
6120 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
5c182d5f 6121 }
30fe1832 6122 elf_next_file_pos (abfd) = off;
5c182d5f 6123
252b5132
RH
6124 /* Now that we have set the section file positions, we can set up
6125 the file positions for the non PT_LOAD segments. */
f3520d2f 6126 phdrs = elf_tdata (abfd)->phdr;
12bd6957 6127 for (m = elf_seg_map (abfd), p = phdrs; m != NULL; m = m->next, p++)
252b5132 6128 {
129af99f 6129 if (p->p_type == PT_GNU_RELRO)
252b5132 6130 {
f2731e0c 6131 bfd_vma start, end;
01f7e10c 6132 bfd_boolean ok;
1ea63fd2 6133
129af99f 6134 if (link_info != NULL)
8c37241b 6135 {
129af99f 6136 /* During linking the range of the RELRO segment is passed
f2731e0c
AM
6137 in link_info. Note that there may be padding between
6138 relro_start and the first RELRO section. */
6139 start = link_info->relro_start;
6140 end = link_info->relro_end;
6141 }
6142 else if (m->count != 0)
6143 {
6144 if (!m->p_size_valid)
6145 abort ();
6146 start = m->sections[0]->vma;
6147 end = start + m->p_size;
6148 }
6149 else
6150 {
6151 start = 0;
6152 end = 0;
6153 }
6154
01f7e10c 6155 ok = FALSE;
f2731e0c
AM
6156 if (start < end)
6157 {
6158 struct elf_segment_map *lm;
6159 const Elf_Internal_Phdr *lp;
6160 unsigned int i;
6161
6162 /* Find a LOAD segment containing a section in the RELRO
6163 segment. */
12bd6957 6164 for (lm = elf_seg_map (abfd), lp = phdrs;
3146fac4
AM
6165 lm != NULL;
6166 lm = lm->next, lp++)
8c37241b
JJ
6167 {
6168 if (lp->p_type == PT_LOAD
3146fac4 6169 && lm->count != 0
dbc88fc1
AM
6170 && (lm->sections[lm->count - 1]->vma
6171 + (!IS_TBSS (lm->sections[lm->count - 1])
6172 ? lm->sections[lm->count - 1]->size
6173 : 0)) > start
f2731e0c 6174 && lm->sections[0]->vma < end)
8c37241b
JJ
6175 break;
6176 }
f2731e0c 6177
01f7e10c 6178 if (lm != NULL)
129af99f 6179 {
01f7e10c
AM
6180 /* Find the section starting the RELRO segment. */
6181 for (i = 0; i < lm->count; i++)
6182 {
6183 asection *s = lm->sections[i];
6184 if (s->vma >= start
6185 && s->vma < end
6186 && s->size != 0)
6187 break;
6188 }
6189
6190 if (i < lm->count)
6191 {
6192 p->p_vaddr = lm->sections[i]->vma;
6193 p->p_paddr = lm->sections[i]->lma;
6194 p->p_offset = lm->sections[i]->filepos;
6195 p->p_memsz = end - p->p_vaddr;
6196 p->p_filesz = p->p_memsz;
6197
6198 /* The RELRO segment typically ends a few bytes
6199 into .got.plt but other layouts are possible.
6200 In cases where the end does not match any
6201 loaded section (for instance is in file
6202 padding), trim p_filesz back to correspond to
6203 the end of loaded section contents. */
6204 if (p->p_filesz > lp->p_vaddr + lp->p_filesz - p->p_vaddr)
6205 p->p_filesz = lp->p_vaddr + lp->p_filesz - p->p_vaddr;
6206
6207 /* Preserve the alignment and flags if they are
6208 valid. The gold linker generates RW/4 for
6209 the PT_GNU_RELRO section. It is better for
6210 objcopy/strip to honor these attributes
6211 otherwise gdb will choke when using separate
6212 debug files. */
6213 if (!m->p_align_valid)
6214 p->p_align = 1;
6215 if (!m->p_flags_valid)
6216 p->p_flags = PF_R;
6217 ok = TRUE;
6218 }
129af99f 6219 }
b84a33b5 6220 }
01f7e10c
AM
6221 if (link_info != NULL)
6222 BFD_ASSERT (ok);
6223 if (!ok)
6224 memset (p, 0, sizeof *p);
129af99f 6225 }
04c3a755
NS
6226 else if (p->p_type == PT_GNU_STACK)
6227 {
6228 if (m->p_size_valid)
6229 p->p_memsz = m->p_size;
6230 }
129af99f
AS
6231 else if (m->count != 0)
6232 {
e06efbf1 6233 unsigned int i;
1a9ccd70 6234
129af99f
AS
6235 if (p->p_type != PT_LOAD
6236 && (p->p_type != PT_NOTE
6237 || bfd_get_format (abfd) != bfd_core))
6238 {
1a9ccd70
NC
6239 /* A user specified segment layout may include a PHDR
6240 segment that overlaps with a LOAD segment... */
6241 if (p->p_type == PT_PHDR)
6242 {
6243 m->count = 0;
6244 continue;
6245 }
6246
c86934ce
NC
6247 if (m->includes_filehdr || m->includes_phdrs)
6248 {
b1fa9dd6 6249 /* PR 17512: file: 2195325e. */
4eca0228 6250 _bfd_error_handler
871b3ab2 6251 (_("%pB: error: non-load segment %d includes file header "
76cfced5
AM
6252 "and/or program header"),
6253 abfd, (int) (p - phdrs));
c86934ce
NC
6254 return FALSE;
6255 }
129af99f 6256
86b2281f 6257 p->p_filesz = 0;
129af99f 6258 p->p_offset = m->sections[0]->filepos;
86b2281f
AM
6259 for (i = m->count; i-- != 0;)
6260 {
6261 asection *sect = m->sections[i];
6262 Elf_Internal_Shdr *hdr = &elf_section_data (sect)->this_hdr;
6263 if (hdr->sh_type != SHT_NOBITS)
6264 {
6265 p->p_filesz = (sect->filepos - m->sections[0]->filepos
6266 + hdr->sh_size);
6267 break;
6268 }
6269 }
129af99f
AS
6270 }
6271 }
252b5132
RH
6272 }
6273
b34976b6 6274 return TRUE;
252b5132
RH
6275}
6276
6a40cf0c
NC
6277static elf_section_list *
6278find_section_in_list (unsigned int i, elf_section_list * list)
6279{
6280 for (;list != NULL; list = list->next)
6281 if (list->ndx == i)
6282 break;
6283 return list;
6284}
6285
252b5132
RH
6286/* Work out the file positions of all the sections. This is called by
6287 _bfd_elf_compute_section_file_positions. All the section sizes and
6288 VMAs must be known before this is called.
6289
e0638f70 6290 Reloc sections come in two flavours: Those processed specially as
1ff6de03
NA
6291 "side-channel" data attached to a section to which they apply, and those that
6292 bfd doesn't process as relocations. The latter sort are stored in a normal
6293 bfd section by bfd_section_from_shdr. We don't consider the former sort
6294 here, unless they form part of the loadable image. Reloc sections not
6295 assigned here (and compressed debugging sections and CTF sections which
6296 nothing else in the file can rely upon) will be handled later by
e0638f70 6297 assign_file_positions_for_relocs.
252b5132
RH
6298
6299 We also don't set the positions of the .symtab and .strtab here. */
6300
b34976b6 6301static bfd_boolean
c84fca4d
AO
6302assign_file_positions_except_relocs (bfd *abfd,
6303 struct bfd_link_info *link_info)
252b5132 6304{
5c182d5f
AM
6305 struct elf_obj_tdata *tdata = elf_tdata (abfd);
6306 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
9c5bfbb7 6307 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
6d6c25c8 6308 unsigned int alloc;
252b5132
RH
6309
6310 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0
6311 && bfd_get_format (abfd) != bfd_core)
6312 {
5c182d5f
AM
6313 Elf_Internal_Shdr ** const i_shdrpp = elf_elfsections (abfd);
6314 unsigned int num_sec = elf_numsections (abfd);
252b5132
RH
6315 Elf_Internal_Shdr **hdrpp;
6316 unsigned int i;
a485e98e 6317 file_ptr off;
252b5132
RH
6318
6319 /* Start after the ELF header. */
6320 off = i_ehdrp->e_ehsize;
6321
6322 /* We are not creating an executable, which means that we are
6323 not creating a program header, and that the actual order of
6324 the sections in the file is unimportant. */
9ad5cbcf 6325 for (i = 1, hdrpp = i_shdrpp + 1; i < num_sec; i++, hdrpp++)
252b5132
RH
6326 {
6327 Elf_Internal_Shdr *hdr;
6328
6329 hdr = *hdrpp;
e0638f70
AM
6330 if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
6331 && hdr->bfd_section == NULL)
1ff6de03
NA
6332 /* Do not assign offsets for these sections yet: we don't know
6333 their sizes. */
0ce398f1 6334 || (hdr->bfd_section != NULL
1ff6de03
NA
6335 && (hdr->bfd_section->flags & SEC_ELF_COMPRESS
6336 || (bfd_section_is_ctf (hdr->bfd_section)
6337 && abfd->is_linker_output)))
12bd6957 6338 || i == elf_onesymtab (abfd)
6a40cf0c
NC
6339 || (elf_symtab_shndx_list (abfd) != NULL
6340 && hdr == i_shdrpp[elf_symtab_shndx_list (abfd)->ndx])
3e19fb8f
L
6341 || i == elf_strtab_sec (abfd)
6342 || i == elf_shstrtab_sec (abfd))
252b5132
RH
6343 {
6344 hdr->sh_offset = -1;
252b5132 6345 }
9ad5cbcf 6346 else
b34976b6 6347 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
252b5132 6348 }
a485e98e
AM
6349
6350 elf_next_file_pos (abfd) = off;
6d6c25c8 6351 elf_program_header_size (abfd) = 0;
252b5132
RH
6352 }
6353 else
6354 {
252b5132 6355 /* Assign file positions for the loaded sections based on the
08a40648 6356 assignment of sections to segments. */
f3520d2f
AM
6357 if (!assign_file_positions_for_load_sections (abfd, link_info))
6358 return FALSE;
6359
6360 /* And for non-load sections. */
6361 if (!assign_file_positions_for_non_load_sections (abfd, link_info))
6362 return FALSE;
6d6c25c8 6363 }
f3520d2f 6364
6d6c25c8
AM
6365 if (!(*bed->elf_backend_modify_headers) (abfd, link_info))
6366 return FALSE;
1a9ccd70 6367
6d6c25c8
AM
6368 /* Write out the program headers. */
6369 alloc = i_ehdrp->e_phnum;
6370 if (alloc != 0)
6371 {
30fe1832 6372 if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0
cd584857
NC
6373 || bed->s->write_out_phdrs (abfd, tdata->phdr, alloc) != 0)
6374 return FALSE;
252b5132
RH
6375 }
6376
b34976b6 6377 return TRUE;
252b5132
RH
6378}
6379
ed7e9d0b
AM
6380bfd_boolean
6381_bfd_elf_init_file_header (bfd *abfd,
6382 struct bfd_link_info *info ATTRIBUTE_UNUSED)
252b5132 6383{
3d540e93 6384 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form. */
2b0f7ef9 6385 struct elf_strtab_hash *shstrtab;
9c5bfbb7 6386 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132
RH
6387
6388 i_ehdrp = elf_elfheader (abfd);
252b5132 6389
2b0f7ef9 6390 shstrtab = _bfd_elf_strtab_init ();
252b5132 6391 if (shstrtab == NULL)
b34976b6 6392 return FALSE;
252b5132
RH
6393
6394 elf_shstrtab (abfd) = shstrtab;
6395
6396 i_ehdrp->e_ident[EI_MAG0] = ELFMAG0;
6397 i_ehdrp->e_ident[EI_MAG1] = ELFMAG1;
6398 i_ehdrp->e_ident[EI_MAG2] = ELFMAG2;
6399 i_ehdrp->e_ident[EI_MAG3] = ELFMAG3;
6400
6401 i_ehdrp->e_ident[EI_CLASS] = bed->s->elfclass;
6402 i_ehdrp->e_ident[EI_DATA] =
6403 bfd_big_endian (abfd) ? ELFDATA2MSB : ELFDATA2LSB;
6404 i_ehdrp->e_ident[EI_VERSION] = bed->s->ev_current;
6405
252b5132
RH
6406 if ((abfd->flags & DYNAMIC) != 0)
6407 i_ehdrp->e_type = ET_DYN;
6408 else if ((abfd->flags & EXEC_P) != 0)
6409 i_ehdrp->e_type = ET_EXEC;
6410 else if (bfd_get_format (abfd) == bfd_core)
6411 i_ehdrp->e_type = ET_CORE;
6412 else
6413 i_ehdrp->e_type = ET_REL;
6414
6415 switch (bfd_get_arch (abfd))
6416 {
6417 case bfd_arch_unknown:
6418 i_ehdrp->e_machine = EM_NONE;
6419 break;
aa4f99bb
AO
6420
6421 /* There used to be a long list of cases here, each one setting
6422 e_machine to the same EM_* macro #defined as ELF_MACHINE_CODE
6423 in the corresponding bfd definition. To avoid duplication,
6424 the switch was removed. Machines that need special handling
6425 can generally do it in elf_backend_final_write_processing(),
6426 unless they need the information earlier than the final write.
6427 Such need can generally be supplied by replacing the tests for
6428 e_machine with the conditions used to determine it. */
252b5132 6429 default:
9c5bfbb7
AM
6430 i_ehdrp->e_machine = bed->elf_machine_code;
6431 }
aa4f99bb 6432
252b5132
RH
6433 i_ehdrp->e_version = bed->s->ev_current;
6434 i_ehdrp->e_ehsize = bed->s->sizeof_ehdr;
6435
c044fabd 6436 /* No program header, for now. */
252b5132
RH
6437 i_ehdrp->e_phoff = 0;
6438 i_ehdrp->e_phentsize = 0;
6439 i_ehdrp->e_phnum = 0;
6440
c044fabd 6441 /* Each bfd section is section header entry. */
252b5132
RH
6442 i_ehdrp->e_entry = bfd_get_start_address (abfd);
6443 i_ehdrp->e_shentsize = bed->s->sizeof_shdr;
6444
252b5132 6445 elf_tdata (abfd)->symtab_hdr.sh_name =
b34976b6 6446 (unsigned int) _bfd_elf_strtab_add (shstrtab, ".symtab", FALSE);
252b5132 6447 elf_tdata (abfd)->strtab_hdr.sh_name =
b34976b6 6448 (unsigned int) _bfd_elf_strtab_add (shstrtab, ".strtab", FALSE);
252b5132 6449 elf_tdata (abfd)->shstrtab_hdr.sh_name =
b34976b6 6450 (unsigned int) _bfd_elf_strtab_add (shstrtab, ".shstrtab", FALSE);
252b5132 6451 if (elf_tdata (abfd)->symtab_hdr.sh_name == (unsigned int) -1
17ca87fc 6452 || elf_tdata (abfd)->strtab_hdr.sh_name == (unsigned int) -1
252b5132 6453 || elf_tdata (abfd)->shstrtab_hdr.sh_name == (unsigned int) -1)
b34976b6 6454 return FALSE;
252b5132 6455
b34976b6 6456 return TRUE;
252b5132
RH
6457}
6458
6d6c25c8
AM
6459/* Set e_type in ELF header to ET_EXEC for -pie -Ttext-segment=.
6460
6461 FIXME: We used to have code here to sort the PT_LOAD segments into
6462 ascending order, as per the ELF spec. But this breaks some programs,
6463 including the Linux kernel. But really either the spec should be
6464 changed or the programs updated. */
6465
6466bfd_boolean
6467_bfd_elf_modify_headers (bfd *obfd, struct bfd_link_info *link_info)
6468{
6469 if (link_info != NULL && bfd_link_pie (link_info))
6470 {
6471 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (obfd);
6472 unsigned int num_segments = i_ehdrp->e_phnum;
6473 struct elf_obj_tdata *tdata = elf_tdata (obfd);
6474 Elf_Internal_Phdr *segment = tdata->phdr;
6475 Elf_Internal_Phdr *end_segment = &segment[num_segments];
6476
6477 /* Find the lowest p_vaddr in PT_LOAD segments. */
6478 bfd_vma p_vaddr = (bfd_vma) -1;
6479 for (; segment < end_segment; segment++)
6480 if (segment->p_type == PT_LOAD && p_vaddr > segment->p_vaddr)
6481 p_vaddr = segment->p_vaddr;
6482
6483 /* Set e_type to ET_EXEC if the lowest p_vaddr in PT_LOAD
6484 segments is non-zero. */
6485 if (p_vaddr)
6486 i_ehdrp->e_type = ET_EXEC;
6487 }
6488 return TRUE;
6489}
6490
252b5132 6491/* Assign file positions for all the reloc sections which are not part
a485e98e 6492 of the loadable file image, and the file position of section headers. */
252b5132 6493
0ce398f1
L
6494static bfd_boolean
6495_bfd_elf_assign_file_positions_for_non_load (bfd *abfd)
252b5132
RH
6496{
6497 file_ptr off;
e06efbf1 6498 Elf_Internal_Shdr **shdrpp, **end_shdrpp;
3e19fb8f 6499 Elf_Internal_Shdr *shdrp;
a485e98e
AM
6500 Elf_Internal_Ehdr *i_ehdrp;
6501 const struct elf_backend_data *bed;
252b5132 6502
12bd6957 6503 off = elf_next_file_pos (abfd);
252b5132 6504
e06efbf1
L
6505 shdrpp = elf_elfsections (abfd);
6506 end_shdrpp = shdrpp + elf_numsections (abfd);
6507 for (shdrpp++; shdrpp < end_shdrpp; shdrpp++)
252b5132 6508 {
252b5132 6509 shdrp = *shdrpp;
0ce398f1
L
6510 if (shdrp->sh_offset == -1)
6511 {
3e19fb8f 6512 asection *sec = shdrp->bfd_section;
0ce398f1
L
6513 bfd_boolean is_rel = (shdrp->sh_type == SHT_REL
6514 || shdrp->sh_type == SHT_RELA);
1ff6de03 6515 bfd_boolean is_ctf = sec && bfd_section_is_ctf (sec);
0ce398f1 6516 if (is_rel
1ff6de03 6517 || is_ctf
3e19fb8f 6518 || (sec != NULL && (sec->flags & SEC_ELF_COMPRESS)))
0ce398f1 6519 {
1ff6de03 6520 if (!is_rel && !is_ctf)
0ce398f1 6521 {
3e19fb8f
L
6522 const char *name = sec->name;
6523 struct bfd_elf_section_data *d;
6524
0ce398f1 6525 /* Compress DWARF debug sections. */
3e19fb8f 6526 if (!bfd_compress_section (abfd, sec,
0ce398f1
L
6527 shdrp->contents))
6528 return FALSE;
3e19fb8f
L
6529
6530 if (sec->compress_status == COMPRESS_SECTION_DONE
6531 && (abfd->flags & BFD_COMPRESS_GABI) == 0)
6532 {
6533 /* If section is compressed with zlib-gnu, convert
6534 section name from .debug_* to .zdebug_*. */
6535 char *new_name
6536 = convert_debug_to_zdebug (abfd, name);
6537 if (new_name == NULL)
6538 return FALSE;
6539 name = new_name;
6540 }
dd905818 6541 /* Add section name to section name section. */
3e19fb8f
L
6542 if (shdrp->sh_name != (unsigned int) -1)
6543 abort ();
6544 shdrp->sh_name
6545 = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
6546 name, FALSE);
6547 d = elf_section_data (sec);
6548
dd905818 6549 /* Add reloc section name to section name section. */
3e19fb8f
L
6550 if (d->rel.hdr
6551 && !_bfd_elf_set_reloc_sh_name (abfd,
6552 d->rel.hdr,
6553 name, FALSE))
6554 return FALSE;
6555 if (d->rela.hdr
6556 && !_bfd_elf_set_reloc_sh_name (abfd,
6557 d->rela.hdr,
91cb26da 6558 name, TRUE))
3e19fb8f
L
6559 return FALSE;
6560
0ce398f1 6561 /* Update section size and contents. */
3e19fb8f
L
6562 shdrp->sh_size = sec->size;
6563 shdrp->contents = sec->contents;
0ce398f1
L
6564 shdrp->bfd_section->contents = NULL;
6565 }
1ff6de03
NA
6566 else if (is_ctf)
6567 {
6568 /* Update section size and contents. */
6569 shdrp->sh_size = sec->size;
6570 shdrp->contents = sec->contents;
6571 }
6572
0ce398f1
L
6573 off = _bfd_elf_assign_file_position_for_section (shdrp,
6574 off,
6575 TRUE);
6576 }
6577 }
252b5132
RH
6578 }
6579
3e19fb8f
L
6580 /* Place section name section after DWARF debug sections have been
6581 compressed. */
6582 _bfd_elf_strtab_finalize (elf_shstrtab (abfd));
6583 shdrp = &elf_tdata (abfd)->shstrtab_hdr;
6584 shdrp->sh_size = _bfd_elf_strtab_size (elf_shstrtab (abfd));
6585 off = _bfd_elf_assign_file_position_for_section (shdrp, off, TRUE);
6586
6587 /* Place the section headers. */
a485e98e
AM
6588 i_ehdrp = elf_elfheader (abfd);
6589 bed = get_elf_backend_data (abfd);
6590 off = align_file_position (off, 1 << bed->s->log_file_align);
6591 i_ehdrp->e_shoff = off;
6592 off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize;
12bd6957 6593 elf_next_file_pos (abfd) = off;
0ce398f1
L
6594
6595 return TRUE;
252b5132
RH
6596}
6597
b34976b6 6598bfd_boolean
217aa764 6599_bfd_elf_write_object_contents (bfd *abfd)
252b5132 6600{
9c5bfbb7 6601 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 6602 Elf_Internal_Shdr **i_shdrp;
b34976b6 6603 bfd_boolean failed;
9ad5cbcf 6604 unsigned int count, num_sec;
30e8ee25 6605 struct elf_obj_tdata *t;
252b5132
RH
6606
6607 if (! abfd->output_has_begun
217aa764 6608 && ! _bfd_elf_compute_section_file_positions (abfd, NULL))
b34976b6 6609 return FALSE;
db727370
JL
6610 /* Do not rewrite ELF data when the BFD has been opened for update.
6611 abfd->output_has_begun was set to TRUE on opening, so creation of new
6612 sections, and modification of existing section sizes was restricted.
6613 This means the ELF header, program headers and section headers can't have
6614 changed.
6615 If the contents of any sections has been modified, then those changes have
6616 already been written to the BFD. */
6617 else if (abfd->direction == both_direction)
6618 {
6619 BFD_ASSERT (abfd->output_has_begun);
6620 return TRUE;
6621 }
252b5132
RH
6622
6623 i_shdrp = elf_elfsections (abfd);
252b5132 6624
b34976b6 6625 failed = FALSE;
252b5132
RH
6626 bfd_map_over_sections (abfd, bed->s->write_relocs, &failed);
6627 if (failed)
b34976b6 6628 return FALSE;
252b5132 6629
0ce398f1
L
6630 if (!_bfd_elf_assign_file_positions_for_non_load (abfd))
6631 return FALSE;
252b5132 6632
c044fabd 6633 /* After writing the headers, we need to write the sections too... */
9ad5cbcf
AM
6634 num_sec = elf_numsections (abfd);
6635 for (count = 1; count < num_sec; count++)
252b5132 6636 {
3e19fb8f
L
6637 i_shdrp[count]->sh_name
6638 = _bfd_elf_strtab_offset (elf_shstrtab (abfd),
6639 i_shdrp[count]->sh_name);
252b5132 6640 if (bed->elf_backend_section_processing)
75506100
MR
6641 if (!(*bed->elf_backend_section_processing) (abfd, i_shdrp[count]))
6642 return FALSE;
252b5132
RH
6643 if (i_shdrp[count]->contents)
6644 {
dc810e39
AM
6645 bfd_size_type amt = i_shdrp[count]->sh_size;
6646
252b5132 6647 if (bfd_seek (abfd, i_shdrp[count]->sh_offset, SEEK_SET) != 0
dc810e39 6648 || bfd_bwrite (i_shdrp[count]->contents, amt, abfd) != amt)
b34976b6 6649 return FALSE;
252b5132
RH
6650 }
6651 }
6652
6653 /* Write out the section header names. */
30e8ee25 6654 t = elf_tdata (abfd);
26ae6d5e 6655 if (elf_shstrtab (abfd) != NULL
30e8ee25 6656 && (bfd_seek (abfd, t->shstrtab_hdr.sh_offset, SEEK_SET) != 0
08a40648 6657 || !_bfd_elf_strtab_emit (abfd, elf_shstrtab (abfd))))
b34976b6 6658 return FALSE;
252b5132 6659
cc364be6
AM
6660 if (!(*bed->elf_backend_final_write_processing) (abfd))
6661 return FALSE;
252b5132 6662
ff59fc36
RM
6663 if (!bed->s->write_shdrs_and_ehdr (abfd))
6664 return FALSE;
6665
6666 /* This is last since write_shdrs_and_ehdr can touch i_shdrp[0]. */
c0355132
AM
6667 if (t->o->build_id.after_write_object_contents != NULL)
6668 return (*t->o->build_id.after_write_object_contents) (abfd);
ff59fc36
RM
6669
6670 return TRUE;
252b5132
RH
6671}
6672
b34976b6 6673bfd_boolean
217aa764 6674_bfd_elf_write_corefile_contents (bfd *abfd)
252b5132 6675{
c044fabd 6676 /* Hopefully this can be done just like an object file. */
252b5132
RH
6677 return _bfd_elf_write_object_contents (abfd);
6678}
c044fabd
KH
6679
6680/* Given a section, search the header to find them. */
6681
cb33740c 6682unsigned int
198beae2 6683_bfd_elf_section_from_bfd_section (bfd *abfd, struct bfd_section *asect)
252b5132 6684{
9c5bfbb7 6685 const struct elf_backend_data *bed;
91d6fa6a 6686 unsigned int sec_index;
252b5132 6687
9ad5cbcf
AM
6688 if (elf_section_data (asect) != NULL
6689 && elf_section_data (asect)->this_idx != 0)
6690 return elf_section_data (asect)->this_idx;
6691
6692 if (bfd_is_abs_section (asect))
91d6fa6a 6693 sec_index = SHN_ABS;
af746e92 6694 else if (bfd_is_com_section (asect))
91d6fa6a 6695 sec_index = SHN_COMMON;
af746e92 6696 else if (bfd_is_und_section (asect))
91d6fa6a 6697 sec_index = SHN_UNDEF;
af746e92 6698 else
91d6fa6a 6699 sec_index = SHN_BAD;
252b5132 6700
af746e92 6701 bed = get_elf_backend_data (abfd);
252b5132
RH
6702 if (bed->elf_backend_section_from_bfd_section)
6703 {
91d6fa6a 6704 int retval = sec_index;
9ad5cbcf 6705
af746e92
AM
6706 if ((*bed->elf_backend_section_from_bfd_section) (abfd, asect, &retval))
6707 return retval;
252b5132
RH
6708 }
6709
91d6fa6a 6710 if (sec_index == SHN_BAD)
af746e92 6711 bfd_set_error (bfd_error_nonrepresentable_section);
252b5132 6712
91d6fa6a 6713 return sec_index;
252b5132
RH
6714}
6715
6716/* Given a BFD symbol, return the index in the ELF symbol table, or -1
6717 on error. */
6718
6719int
217aa764 6720_bfd_elf_symbol_from_bfd_symbol (bfd *abfd, asymbol **asym_ptr_ptr)
252b5132
RH
6721{
6722 asymbol *asym_ptr = *asym_ptr_ptr;
6723 int idx;
6724 flagword flags = asym_ptr->flags;
6725
6726 /* When gas creates relocations against local labels, it creates its
6727 own symbol for the section, but does put the symbol into the
6728 symbol chain, so udata is 0. When the linker is generating
6729 relocatable output, this section symbol may be for one of the
6730 input sections rather than the output section. */
6731 if (asym_ptr->udata.i == 0
6732 && (flags & BSF_SECTION_SYM)
6733 && asym_ptr->section)
6734 {
5372391b 6735 asection *sec;
252b5132
RH
6736 int indx;
6737
5372391b
AM
6738 sec = asym_ptr->section;
6739 if (sec->owner != abfd && sec->output_section != NULL)
6740 sec = sec->output_section;
6741 if (sec->owner == abfd
6742 && (indx = sec->index) < elf_num_section_syms (abfd)
4e89ac30 6743 && elf_section_syms (abfd)[indx] != NULL)
252b5132
RH
6744 asym_ptr->udata.i = elf_section_syms (abfd)[indx]->udata.i;
6745 }
6746
6747 idx = asym_ptr->udata.i;
6748
6749 if (idx == 0)
6750 {
6751 /* This case can occur when using --strip-symbol on a symbol
08a40648 6752 which is used in a relocation entry. */
4eca0228 6753 _bfd_error_handler
695344c0 6754 /* xgettext:c-format */
871b3ab2 6755 (_("%pB: symbol `%s' required but not present"),
d003868e 6756 abfd, bfd_asymbol_name (asym_ptr));
252b5132
RH
6757 bfd_set_error (bfd_error_no_symbols);
6758 return -1;
6759 }
6760
6761#if DEBUG & 4
6762 {
6763 fprintf (stderr,
cd9af601
AM
6764 "elf_symbol_from_bfd_symbol 0x%.8lx, name = %s, sym num = %d, flags = 0x%.8x\n",
6765 (long) asym_ptr, asym_ptr->name, idx, flags);
252b5132
RH
6766 fflush (stderr);
6767 }
6768#endif
6769
6770 return idx;
6771}
6772
84d1d650 6773/* Rewrite program header information. */
252b5132 6774
b34976b6 6775static bfd_boolean
84d1d650 6776rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
252b5132 6777{
b34976b6
AM
6778 Elf_Internal_Ehdr *iehdr;
6779 struct elf_segment_map *map;
6780 struct elf_segment_map *map_first;
6781 struct elf_segment_map **pointer_to_map;
6782 Elf_Internal_Phdr *segment;
6783 asection *section;
6784 unsigned int i;
6785 unsigned int num_segments;
6786 bfd_boolean phdr_included = FALSE;
5c44b38e 6787 bfd_boolean p_paddr_valid;
b34976b6
AM
6788 bfd_vma maxpagesize;
6789 struct elf_segment_map *phdr_adjust_seg = NULL;
6790 unsigned int phdr_adjust_num = 0;
9c5bfbb7 6791 const struct elf_backend_data *bed;
bc67d8a6 6792
caf47ea6 6793 bed = get_elf_backend_data (ibfd);
252b5132
RH
6794 iehdr = elf_elfheader (ibfd);
6795
bc67d8a6 6796 map_first = NULL;
c044fabd 6797 pointer_to_map = &map_first;
252b5132
RH
6798
6799 num_segments = elf_elfheader (ibfd)->e_phnum;
bc67d8a6
NC
6800 maxpagesize = get_elf_backend_data (obfd)->maxpagesize;
6801
6802 /* Returns the end address of the segment + 1. */
aecc8f8a
AM
6803#define SEGMENT_END(segment, start) \
6804 (start + (segment->p_memsz > segment->p_filesz \
6805 ? segment->p_memsz : segment->p_filesz))
bc67d8a6 6806
eecdbe52
JJ
6807#define SECTION_SIZE(section, segment) \
6808 (((section->flags & (SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) \
6809 != SEC_THREAD_LOCAL || segment->p_type == PT_TLS) \
eea6121a 6810 ? section->size : 0)
eecdbe52 6811
b34976b6 6812 /* Returns TRUE if the given section is contained within
bc67d8a6 6813 the given segment. VMA addresses are compared. */
aecc8f8a
AM
6814#define IS_CONTAINED_BY_VMA(section, segment) \
6815 (section->vma >= segment->p_vaddr \
eecdbe52 6816 && (section->vma + SECTION_SIZE (section, segment) \
aecc8f8a 6817 <= (SEGMENT_END (segment, segment->p_vaddr))))
c044fabd 6818
b34976b6 6819 /* Returns TRUE if the given section is contained within
bc67d8a6 6820 the given segment. LMA addresses are compared. */
aecc8f8a
AM
6821#define IS_CONTAINED_BY_LMA(section, segment, base) \
6822 (section->lma >= base \
beab4532 6823 && (section->lma + SECTION_SIZE (section, segment) >= section->lma) \
eecdbe52 6824 && (section->lma + SECTION_SIZE (section, segment) \
aecc8f8a 6825 <= SEGMENT_END (segment, base)))
252b5132 6826
0efc80c8
L
6827 /* Handle PT_NOTE segment. */
6828#define IS_NOTE(p, s) \
aecc8f8a 6829 (p->p_type == PT_NOTE \
0efc80c8 6830 && elf_section_type (s) == SHT_NOTE \
aecc8f8a 6831 && (bfd_vma) s->filepos >= p->p_offset \
cb3ff1e5 6832 && ((bfd_vma) s->filepos + s->size \
aecc8f8a 6833 <= p->p_offset + p->p_filesz))
252b5132 6834
0efc80c8
L
6835 /* Special case: corefile "NOTE" section containing regs, prpsinfo
6836 etc. */
6837#define IS_COREFILE_NOTE(p, s) \
6838 (IS_NOTE (p, s) \
6839 && bfd_get_format (ibfd) == bfd_core \
6840 && s->vma == 0 \
6841 && s->lma == 0)
6842
252b5132
RH
6843 /* The complicated case when p_vaddr is 0 is to handle the Solaris
6844 linker, which generates a PT_INTERP section with p_vaddr and
6845 p_memsz set to 0. */
aecc8f8a
AM
6846#define IS_SOLARIS_PT_INTERP(p, s) \
6847 (p->p_vaddr == 0 \
6848 && p->p_paddr == 0 \
6849 && p->p_memsz == 0 \
6850 && p->p_filesz > 0 \
6851 && (s->flags & SEC_HAS_CONTENTS) != 0 \
eea6121a 6852 && s->size > 0 \
aecc8f8a 6853 && (bfd_vma) s->filepos >= p->p_offset \
cb3ff1e5 6854 && ((bfd_vma) s->filepos + s->size \
aecc8f8a 6855 <= p->p_offset + p->p_filesz))
5c440b1e 6856
bc67d8a6
NC
6857 /* Decide if the given section should be included in the given segment.
6858 A section will be included if:
f5ffc919 6859 1. It is within the address space of the segment -- we use the LMA
08a40648 6860 if that is set for the segment and the VMA otherwise,
0efc80c8 6861 2. It is an allocated section or a NOTE section in a PT_NOTE
d324f6d6 6862 segment.
bc67d8a6 6863 3. There is an output section associated with it,
eecdbe52 6864 4. The section has not already been allocated to a previous segment.
2b05f1b7 6865 5. PT_GNU_STACK segments do not include any sections.
03394ac9 6866 6. PT_TLS segment includes only SHF_TLS sections.
6f79b219
JJ
6867 7. SHF_TLS sections are only in PT_TLS or PT_LOAD segments.
6868 8. PT_DYNAMIC should not contain empty sections at the beginning
08a40648 6869 (with the possible exception of .dynamic). */
9f17e2a6 6870#define IS_SECTION_IN_INPUT_SEGMENT(section, segment, bed) \
2b05f1b7
L
6871 ((((segment->p_paddr \
6872 ? IS_CONTAINED_BY_LMA (section, segment, segment->p_paddr) \
6873 : IS_CONTAINED_BY_VMA (section, segment)) \
6874 && (section->flags & SEC_ALLOC) != 0) \
0efc80c8 6875 || IS_NOTE (segment, section)) \
2b05f1b7
L
6876 && segment->p_type != PT_GNU_STACK \
6877 && (segment->p_type != PT_TLS \
6878 || (section->flags & SEC_THREAD_LOCAL)) \
6879 && (segment->p_type == PT_LOAD \
6880 || segment->p_type == PT_TLS \
6881 || (section->flags & SEC_THREAD_LOCAL) == 0) \
6882 && (segment->p_type != PT_DYNAMIC \
6883 || SECTION_SIZE (section, segment) > 0 \
6884 || (segment->p_paddr \
6885 ? segment->p_paddr != section->lma \
6886 : segment->p_vaddr != section->vma) \
fd361982 6887 || (strcmp (bfd_section_name (section), ".dynamic") == 0)) \
9933dc52 6888 && (segment->p_type != PT_LOAD || !section->segment_mark))
bc67d8a6 6889
9f17e2a6
L
6890/* If the output section of a section in the input segment is NULL,
6891 it is removed from the corresponding output segment. */
6892#define INCLUDE_SECTION_IN_SEGMENT(section, segment, bed) \
6893 (IS_SECTION_IN_INPUT_SEGMENT (section, segment, bed) \
6894 && section->output_section != NULL)
6895
b34976b6 6896 /* Returns TRUE iff seg1 starts after the end of seg2. */
b5f852ea
NC
6897#define SEGMENT_AFTER_SEGMENT(seg1, seg2, field) \
6898 (seg1->field >= SEGMENT_END (seg2, seg2->field))
6899
6900 /* Returns TRUE iff seg1 and seg2 overlap. Segments overlap iff both
6901 their VMA address ranges and their LMA address ranges overlap.
6902 It is possible to have overlapping VMA ranges without overlapping LMA
6903 ranges. RedBoot images for example can have both .data and .bss mapped
6904 to the same VMA range, but with the .data section mapped to a different
6905 LMA. */
aecc8f8a 6906#define SEGMENT_OVERLAPS(seg1, seg2) \
b5f852ea 6907 ( !(SEGMENT_AFTER_SEGMENT (seg1, seg2, p_vaddr) \
08a40648 6908 || SEGMENT_AFTER_SEGMENT (seg2, seg1, p_vaddr)) \
b5f852ea 6909 && !(SEGMENT_AFTER_SEGMENT (seg1, seg2, p_paddr) \
08a40648 6910 || SEGMENT_AFTER_SEGMENT (seg2, seg1, p_paddr)))
bc67d8a6
NC
6911
6912 /* Initialise the segment mark field. */
6913 for (section = ibfd->sections; section != NULL; section = section->next)
b34976b6 6914 section->segment_mark = FALSE;
bc67d8a6 6915
5c44b38e
AM
6916 /* The Solaris linker creates program headers in which all the
6917 p_paddr fields are zero. When we try to objcopy or strip such a
6918 file, we get confused. Check for this case, and if we find it
6919 don't set the p_paddr_valid fields. */
6920 p_paddr_valid = FALSE;
6921 for (i = 0, segment = elf_tdata (ibfd)->phdr;
6922 i < num_segments;
6923 i++, segment++)
6924 if (segment->p_paddr != 0)
6925 {
6926 p_paddr_valid = TRUE;
6927 break;
6928 }
6929
252b5132 6930 /* Scan through the segments specified in the program header
bc67d8a6 6931 of the input BFD. For this first scan we look for overlaps
9ad5cbcf 6932 in the loadable segments. These can be created by weird
aecc8f8a 6933 parameters to objcopy. Also, fix some solaris weirdness. */
bc67d8a6
NC
6934 for (i = 0, segment = elf_tdata (ibfd)->phdr;
6935 i < num_segments;
c044fabd 6936 i++, segment++)
252b5132 6937 {
252b5132 6938 unsigned int j;
c044fabd 6939 Elf_Internal_Phdr *segment2;
252b5132 6940
aecc8f8a
AM
6941 if (segment->p_type == PT_INTERP)
6942 for (section = ibfd->sections; section; section = section->next)
6943 if (IS_SOLARIS_PT_INTERP (segment, section))
6944 {
6945 /* Mininal change so that the normal section to segment
4cc11e76 6946 assignment code will work. */
aecc8f8a
AM
6947 segment->p_vaddr = section->vma;
6948 break;
6949 }
6950
bc67d8a6 6951 if (segment->p_type != PT_LOAD)
b10a8ae0
L
6952 {
6953 /* Remove PT_GNU_RELRO segment. */
6954 if (segment->p_type == PT_GNU_RELRO)
6955 segment->p_type = PT_NULL;
6956 continue;
6957 }
c044fabd 6958
bc67d8a6 6959 /* Determine if this segment overlaps any previous segments. */
0067a569 6960 for (j = 0, segment2 = elf_tdata (ibfd)->phdr; j < i; j++, segment2++)
bc67d8a6
NC
6961 {
6962 bfd_signed_vma extra_length;
c044fabd 6963
bc67d8a6 6964 if (segment2->p_type != PT_LOAD
0067a569 6965 || !SEGMENT_OVERLAPS (segment, segment2))
bc67d8a6 6966 continue;
c044fabd 6967
bc67d8a6
NC
6968 /* Merge the two segments together. */
6969 if (segment2->p_vaddr < segment->p_vaddr)
6970 {
c044fabd 6971 /* Extend SEGMENT2 to include SEGMENT and then delete
08a40648 6972 SEGMENT. */
0067a569
AM
6973 extra_length = (SEGMENT_END (segment, segment->p_vaddr)
6974 - SEGMENT_END (segment2, segment2->p_vaddr));
c044fabd 6975
bc67d8a6
NC
6976 if (extra_length > 0)
6977 {
0067a569 6978 segment2->p_memsz += extra_length;
bc67d8a6
NC
6979 segment2->p_filesz += extra_length;
6980 }
c044fabd 6981
bc67d8a6 6982 segment->p_type = PT_NULL;
c044fabd 6983
bc67d8a6
NC
6984 /* Since we have deleted P we must restart the outer loop. */
6985 i = 0;
6986 segment = elf_tdata (ibfd)->phdr;
6987 break;
6988 }
6989 else
6990 {
c044fabd 6991 /* Extend SEGMENT to include SEGMENT2 and then delete
08a40648 6992 SEGMENT2. */
0067a569
AM
6993 extra_length = (SEGMENT_END (segment2, segment2->p_vaddr)
6994 - SEGMENT_END (segment, segment->p_vaddr));
c044fabd 6995
bc67d8a6
NC
6996 if (extra_length > 0)
6997 {
0067a569 6998 segment->p_memsz += extra_length;
bc67d8a6
NC
6999 segment->p_filesz += extra_length;
7000 }
c044fabd 7001
bc67d8a6
NC
7002 segment2->p_type = PT_NULL;
7003 }
7004 }
7005 }
c044fabd 7006
bc67d8a6
NC
7007 /* The second scan attempts to assign sections to segments. */
7008 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7009 i < num_segments;
0067a569 7010 i++, segment++)
bc67d8a6 7011 {
0067a569
AM
7012 unsigned int section_count;
7013 asection **sections;
7014 asection *output_section;
7015 unsigned int isec;
9933dc52
AM
7016 asection *matching_lma;
7017 asection *suggested_lma;
0067a569 7018 unsigned int j;
446f7ed5 7019 size_t amt;
0067a569 7020 asection *first_section;
bc67d8a6
NC
7021
7022 if (segment->p_type == PT_NULL)
7023 continue;
c044fabd 7024
9f17e2a6 7025 first_section = NULL;
bc67d8a6 7026 /* Compute how many sections might be placed into this segment. */
b5f852ea
NC
7027 for (section = ibfd->sections, section_count = 0;
7028 section != NULL;
7029 section = section->next)
9f17e2a6
L
7030 {
7031 /* Find the first section in the input segment, which may be
7032 removed from the corresponding output segment. */
7033 if (IS_SECTION_IN_INPUT_SEGMENT (section, segment, bed))
7034 {
7035 if (first_section == NULL)
7036 first_section = section;
7037 if (section->output_section != NULL)
7038 ++section_count;
7039 }
7040 }
811072d8 7041
b5f852ea
NC
7042 /* Allocate a segment map big enough to contain
7043 all of the sections we have selected. */
00bee008 7044 amt = sizeof (struct elf_segment_map) - sizeof (asection *);
446f7ed5 7045 amt += section_count * sizeof (asection *);
a50b1753 7046 map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
bc67d8a6 7047 if (map == NULL)
b34976b6 7048 return FALSE;
252b5132
RH
7049
7050 /* Initialise the fields of the segment map. Default to
7051 using the physical address of the segment in the input BFD. */
0067a569
AM
7052 map->next = NULL;
7053 map->p_type = segment->p_type;
7054 map->p_flags = segment->p_flags;
bc67d8a6 7055 map->p_flags_valid = 1;
55d55ac7 7056
9f17e2a6
L
7057 /* If the first section in the input segment is removed, there is
7058 no need to preserve segment physical address in the corresponding
7059 output segment. */
945c025a 7060 if (!first_section || first_section->output_section != NULL)
9f17e2a6
L
7061 {
7062 map->p_paddr = segment->p_paddr;
5c44b38e 7063 map->p_paddr_valid = p_paddr_valid;
9f17e2a6 7064 }
252b5132
RH
7065
7066 /* Determine if this segment contains the ELF file header
7067 and if it contains the program headers themselves. */
bc67d8a6
NC
7068 map->includes_filehdr = (segment->p_offset == 0
7069 && segment->p_filesz >= iehdr->e_ehsize);
bc67d8a6 7070 map->includes_phdrs = 0;
252b5132 7071
0067a569 7072 if (!phdr_included || segment->p_type != PT_LOAD)
252b5132 7073 {
bc67d8a6
NC
7074 map->includes_phdrs =
7075 (segment->p_offset <= (bfd_vma) iehdr->e_phoff
7076 && (segment->p_offset + segment->p_filesz
252b5132
RH
7077 >= ((bfd_vma) iehdr->e_phoff
7078 + iehdr->e_phnum * iehdr->e_phentsize)));
c044fabd 7079
bc67d8a6 7080 if (segment->p_type == PT_LOAD && map->includes_phdrs)
b34976b6 7081 phdr_included = TRUE;
252b5132
RH
7082 }
7083
bc67d8a6 7084 if (section_count == 0)
252b5132
RH
7085 {
7086 /* Special segments, such as the PT_PHDR segment, may contain
7087 no sections, but ordinary, loadable segments should contain
1ed89aa9 7088 something. They are allowed by the ELF spec however, so only
07d6d2b8 7089 a warning is produced.
f98450c6
NC
7090 There is however the valid use case of embedded systems which
7091 have segments with p_filesz of 0 and a p_memsz > 0 to initialize
7092 flash memory with zeros. No warning is shown for that case. */
7093 if (segment->p_type == PT_LOAD
7094 && (segment->p_filesz > 0 || segment->p_memsz == 0))
7095 /* xgettext:c-format */
9793eb77
AM
7096 _bfd_error_handler
7097 (_("%pB: warning: empty loadable segment detected"
7098 " at vaddr=%#" PRIx64 ", is this intentional?"),
7099 ibfd, (uint64_t) segment->p_vaddr);
252b5132 7100
5d695627 7101 map->p_vaddr_offset = segment->p_vaddr;
bc67d8a6 7102 map->count = 0;
c044fabd
KH
7103 *pointer_to_map = map;
7104 pointer_to_map = &map->next;
252b5132
RH
7105
7106 continue;
7107 }
7108
7109 /* Now scan the sections in the input BFD again and attempt
7110 to add their corresponding output sections to the segment map.
7111 The problem here is how to handle an output section which has
7112 been moved (ie had its LMA changed). There are four possibilities:
7113
7114 1. None of the sections have been moved.
7115 In this case we can continue to use the segment LMA from the
7116 input BFD.
7117
7118 2. All of the sections have been moved by the same amount.
7119 In this case we can change the segment's LMA to match the LMA
7120 of the first section.
7121
7122 3. Some of the sections have been moved, others have not.
7123 In this case those sections which have not been moved can be
7124 placed in the current segment which will have to have its size,
7125 and possibly its LMA changed, and a new segment or segments will
7126 have to be created to contain the other sections.
7127
b5f852ea 7128 4. The sections have been moved, but not by the same amount.
252b5132
RH
7129 In this case we can change the segment's LMA to match the LMA
7130 of the first section and we will have to create a new segment
7131 or segments to contain the other sections.
7132
7133 In order to save time, we allocate an array to hold the section
7134 pointers that we are interested in. As these sections get assigned
7135 to a segment, they are removed from this array. */
7136
446f7ed5
AM
7137 amt = section_count * sizeof (asection *);
7138 sections = (asection **) bfd_malloc (amt);
252b5132 7139 if (sections == NULL)
b34976b6 7140 return FALSE;
252b5132
RH
7141
7142 /* Step One: Scan for segment vs section LMA conflicts.
7143 Also add the sections to the section array allocated above.
7144 Also add the sections to the current segment. In the common
7145 case, where the sections have not been moved, this means that
7146 we have completely filled the segment, and there is nothing
7147 more to do. */
252b5132 7148 isec = 0;
9933dc52
AM
7149 matching_lma = NULL;
7150 suggested_lma = NULL;
252b5132 7151
461c4b2e 7152 for (section = first_section, j = 0;
bc67d8a6
NC
7153 section != NULL;
7154 section = section->next)
252b5132 7155 {
caf47ea6 7156 if (INCLUDE_SECTION_IN_SEGMENT (section, segment, bed))
c0f7859b 7157 {
bc67d8a6
NC
7158 output_section = section->output_section;
7159
0067a569 7160 sections[j++] = section;
252b5132
RH
7161
7162 /* The Solaris native linker always sets p_paddr to 0.
7163 We try to catch that case here, and set it to the
5e8d7549
NC
7164 correct value. Note - some backends require that
7165 p_paddr be left as zero. */
5c44b38e 7166 if (!p_paddr_valid
4455705d 7167 && segment->p_vaddr != 0
0067a569 7168 && !bed->want_p_paddr_set_to_zero
252b5132 7169 && isec == 0
bc67d8a6 7170 && output_section->lma != 0
9933dc52
AM
7171 && (align_power (segment->p_vaddr
7172 + (map->includes_filehdr
7173 ? iehdr->e_ehsize : 0)
7174 + (map->includes_phdrs
7175 ? iehdr->e_phnum * iehdr->e_phentsize
7176 : 0),
7177 output_section->alignment_power)
7178 == output_section->vma))
bc67d8a6 7179 map->p_paddr = segment->p_vaddr;
252b5132
RH
7180
7181 /* Match up the physical address of the segment with the
7182 LMA address of the output section. */
bc67d8a6 7183 if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr)
5e8d7549 7184 || IS_COREFILE_NOTE (segment, section)
0067a569
AM
7185 || (bed->want_p_paddr_set_to_zero
7186 && IS_CONTAINED_BY_VMA (output_section, segment)))
252b5132 7187 {
9933dc52
AM
7188 if (matching_lma == NULL
7189 || output_section->lma < matching_lma->lma)
7190 matching_lma = output_section;
252b5132
RH
7191
7192 /* We assume that if the section fits within the segment
bc67d8a6 7193 then it does not overlap any other section within that
252b5132 7194 segment. */
0067a569
AM
7195 map->sections[isec++] = output_section;
7196 }
9933dc52
AM
7197 else if (suggested_lma == NULL)
7198 suggested_lma = output_section;
147d51c2
L
7199
7200 if (j == section_count)
7201 break;
252b5132
RH
7202 }
7203 }
7204
bc67d8a6 7205 BFD_ASSERT (j == section_count);
252b5132
RH
7206
7207 /* Step Two: Adjust the physical address of the current segment,
7208 if necessary. */
bc67d8a6 7209 if (isec == section_count)
252b5132
RH
7210 {
7211 /* All of the sections fitted within the segment as currently
7212 specified. This is the default case. Add the segment to
7213 the list of built segments and carry on to process the next
7214 program header in the input BFD. */
bc67d8a6 7215 map->count = section_count;
c044fabd
KH
7216 *pointer_to_map = map;
7217 pointer_to_map = &map->next;
08a40648 7218
5c44b38e 7219 if (p_paddr_valid
30fe1832
AM
7220 && !bed->want_p_paddr_set_to_zero)
7221 {
7222 bfd_vma hdr_size = 0;
7223 if (map->includes_filehdr)
7224 hdr_size = iehdr->e_ehsize;
7225 if (map->includes_phdrs)
7226 hdr_size += iehdr->e_phnum * iehdr->e_phentsize;
7227
7228 /* Account for padding before the first section in the
7229 segment. */
7230 map->p_vaddr_offset = map->p_paddr + hdr_size - matching_lma->lma;
7231 }
08a40648 7232
252b5132
RH
7233 free (sections);
7234 continue;
7235 }
252b5132
RH
7236 else
7237 {
9933dc52
AM
7238 /* Change the current segment's physical address to match
7239 the LMA of the first section that fitted, or if no
7240 section fitted, the first section. */
7241 if (matching_lma == NULL)
7242 matching_lma = suggested_lma;
7243
7244 map->p_paddr = matching_lma->lma;
72730e0c 7245
bc67d8a6
NC
7246 /* Offset the segment physical address from the lma
7247 to allow for space taken up by elf headers. */
9933dc52 7248 if (map->includes_phdrs)
010c8431 7249 {
9933dc52
AM
7250 map->p_paddr -= iehdr->e_phnum * iehdr->e_phentsize;
7251
7252 /* iehdr->e_phnum is just an estimate of the number
7253 of program headers that we will need. Make a note
7254 here of the number we used and the segment we chose
7255 to hold these headers, so that we can adjust the
7256 offset when we know the correct value. */
7257 phdr_adjust_num = iehdr->e_phnum;
7258 phdr_adjust_seg = map;
010c8431 7259 }
252b5132 7260
9933dc52 7261 if (map->includes_filehdr)
bc67d8a6 7262 {
9933dc52
AM
7263 bfd_vma align = (bfd_vma) 1 << matching_lma->alignment_power;
7264 map->p_paddr -= iehdr->e_ehsize;
7265 /* We've subtracted off the size of headers from the
7266 first section lma, but there may have been some
7267 alignment padding before that section too. Try to
7268 account for that by adjusting the segment lma down to
7269 the same alignment. */
7270 if (segment->p_align != 0 && segment->p_align < align)
7271 align = segment->p_align;
7272 map->p_paddr &= -align;
bc67d8a6 7273 }
252b5132
RH
7274 }
7275
7276 /* Step Three: Loop over the sections again, this time assigning
caf47ea6 7277 those that fit to the current segment and removing them from the
252b5132
RH
7278 sections array; but making sure not to leave large gaps. Once all
7279 possible sections have been assigned to the current segment it is
7280 added to the list of built segments and if sections still remain
7281 to be assigned, a new segment is constructed before repeating
7282 the loop. */
7283 isec = 0;
7284 do
7285 {
bc67d8a6 7286 map->count = 0;
9933dc52 7287 suggested_lma = NULL;
252b5132
RH
7288
7289 /* Fill the current segment with sections that fit. */
bc67d8a6 7290 for (j = 0; j < section_count; j++)
252b5132 7291 {
bc67d8a6 7292 section = sections[j];
252b5132 7293
bc67d8a6 7294 if (section == NULL)
252b5132
RH
7295 continue;
7296
bc67d8a6 7297 output_section = section->output_section;
252b5132 7298
bc67d8a6 7299 BFD_ASSERT (output_section != NULL);
c044fabd 7300
bc67d8a6
NC
7301 if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr)
7302 || IS_COREFILE_NOTE (segment, section))
252b5132 7303 {
bc67d8a6 7304 if (map->count == 0)
252b5132
RH
7305 {
7306 /* If the first section in a segment does not start at
bc67d8a6
NC
7307 the beginning of the segment, then something is
7308 wrong. */
9933dc52
AM
7309 if (align_power (map->p_paddr
7310 + (map->includes_filehdr
7311 ? iehdr->e_ehsize : 0)
7312 + (map->includes_phdrs
7313 ? iehdr->e_phnum * iehdr->e_phentsize
7314 : 0),
7315 output_section->alignment_power)
7316 != output_section->lma)
9aea1e31 7317 goto sorry;
252b5132
RH
7318 }
7319 else
7320 {
0067a569 7321 asection *prev_sec;
252b5132 7322
bc67d8a6 7323 prev_sec = map->sections[map->count - 1];
252b5132
RH
7324
7325 /* If the gap between the end of the previous section
bc67d8a6
NC
7326 and the start of this section is more than
7327 maxpagesize then we need to start a new segment. */
eea6121a 7328 if ((BFD_ALIGN (prev_sec->lma + prev_sec->size,
079e9a2f 7329 maxpagesize)
caf47ea6 7330 < BFD_ALIGN (output_section->lma, maxpagesize))
0067a569 7331 || (prev_sec->lma + prev_sec->size
079e9a2f 7332 > output_section->lma))
252b5132 7333 {
9933dc52
AM
7334 if (suggested_lma == NULL)
7335 suggested_lma = output_section;
252b5132
RH
7336
7337 continue;
7338 }
7339 }
7340
bc67d8a6 7341 map->sections[map->count++] = output_section;
252b5132
RH
7342 ++isec;
7343 sections[j] = NULL;
9933dc52
AM
7344 if (segment->p_type == PT_LOAD)
7345 section->segment_mark = TRUE;
0067a569 7346 }
9933dc52
AM
7347 else if (suggested_lma == NULL)
7348 suggested_lma = output_section;
252b5132
RH
7349 }
7350
beab4532
NC
7351 /* PR 23932. A corrupt input file may contain sections that cannot
7352 be assigned to any segment - because for example they have a
9984857c
NC
7353 negative size - or segments that do not contain any sections.
7354 But there are also valid reasons why a segment can be empty.
7355 So allow a count of zero. */
252b5132
RH
7356
7357 /* Add the current segment to the list of built segments. */
c044fabd
KH
7358 *pointer_to_map = map;
7359 pointer_to_map = &map->next;
252b5132 7360
bc67d8a6 7361 if (isec < section_count)
252b5132
RH
7362 {
7363 /* We still have not allocated all of the sections to
7364 segments. Create a new segment here, initialise it
7365 and carry on looping. */
00bee008 7366 amt = sizeof (struct elf_segment_map) - sizeof (asection *);
446f7ed5 7367 amt += section_count * sizeof (asection *);
5964fc3a 7368 map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
bc67d8a6 7369 if (map == NULL)
5ed6aba4
NC
7370 {
7371 free (sections);
7372 return FALSE;
7373 }
252b5132
RH
7374
7375 /* Initialise the fields of the segment map. Set the physical
7376 physical address to the LMA of the first section that has
7377 not yet been assigned. */
0067a569
AM
7378 map->next = NULL;
7379 map->p_type = segment->p_type;
7380 map->p_flags = segment->p_flags;
7381 map->p_flags_valid = 1;
9933dc52 7382 map->p_paddr = suggested_lma->lma;
5c44b38e 7383 map->p_paddr_valid = p_paddr_valid;
bc67d8a6 7384 map->includes_filehdr = 0;
0067a569 7385 map->includes_phdrs = 0;
252b5132 7386 }
9984857c
NC
7387
7388 continue;
7389 sorry:
7390 bfd_set_error (bfd_error_sorry);
7391 free (sections);
7392 return FALSE;
252b5132 7393 }
bc67d8a6 7394 while (isec < section_count);
252b5132
RH
7395
7396 free (sections);
7397 }
7398
12bd6957 7399 elf_seg_map (obfd) = map_first;
bc67d8a6
NC
7400
7401 /* If we had to estimate the number of program headers that were
9ad5cbcf 7402 going to be needed, then check our estimate now and adjust
bc67d8a6
NC
7403 the offset if necessary. */
7404 if (phdr_adjust_seg != NULL)
7405 {
7406 unsigned int count;
c044fabd 7407
bc67d8a6 7408 for (count = 0, map = map_first; map != NULL; map = map->next)
c044fabd 7409 count++;
252b5132 7410
bc67d8a6
NC
7411 if (count > phdr_adjust_num)
7412 phdr_adjust_seg->p_paddr
7413 -= (count - phdr_adjust_num) * iehdr->e_phentsize;
9933dc52
AM
7414
7415 for (map = map_first; map != NULL; map = map->next)
7416 if (map->p_type == PT_PHDR)
7417 {
7418 bfd_vma adjust
7419 = phdr_adjust_seg->includes_filehdr ? iehdr->e_ehsize : 0;
7420 map->p_paddr = phdr_adjust_seg->p_paddr + adjust;
7421 break;
7422 }
bc67d8a6 7423 }
c044fabd 7424
bc67d8a6 7425#undef SEGMENT_END
eecdbe52 7426#undef SECTION_SIZE
bc67d8a6
NC
7427#undef IS_CONTAINED_BY_VMA
7428#undef IS_CONTAINED_BY_LMA
0efc80c8 7429#undef IS_NOTE
252b5132 7430#undef IS_COREFILE_NOTE
bc67d8a6 7431#undef IS_SOLARIS_PT_INTERP
9f17e2a6 7432#undef IS_SECTION_IN_INPUT_SEGMENT
bc67d8a6
NC
7433#undef INCLUDE_SECTION_IN_SEGMENT
7434#undef SEGMENT_AFTER_SEGMENT
7435#undef SEGMENT_OVERLAPS
b34976b6 7436 return TRUE;
252b5132
RH
7437}
7438
84d1d650
L
7439/* Copy ELF program header information. */
7440
7441static bfd_boolean
7442copy_elf_program_header (bfd *ibfd, bfd *obfd)
7443{
7444 Elf_Internal_Ehdr *iehdr;
7445 struct elf_segment_map *map;
7446 struct elf_segment_map *map_first;
7447 struct elf_segment_map **pointer_to_map;
7448 Elf_Internal_Phdr *segment;
7449 unsigned int i;
7450 unsigned int num_segments;
7451 bfd_boolean phdr_included = FALSE;
88967714 7452 bfd_boolean p_paddr_valid;
84d1d650
L
7453
7454 iehdr = elf_elfheader (ibfd);
7455
7456 map_first = NULL;
7457 pointer_to_map = &map_first;
7458
88967714
AM
7459 /* If all the segment p_paddr fields are zero, don't set
7460 map->p_paddr_valid. */
7461 p_paddr_valid = FALSE;
84d1d650 7462 num_segments = elf_elfheader (ibfd)->e_phnum;
88967714
AM
7463 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7464 i < num_segments;
7465 i++, segment++)
7466 if (segment->p_paddr != 0)
7467 {
7468 p_paddr_valid = TRUE;
7469 break;
7470 }
7471
84d1d650
L
7472 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7473 i < num_segments;
7474 i++, segment++)
7475 {
7476 asection *section;
7477 unsigned int section_count;
986f0783 7478 size_t amt;
84d1d650 7479 Elf_Internal_Shdr *this_hdr;
53020534 7480 asection *first_section = NULL;
a76e6f2f 7481 asection *lowest_section;
84d1d650 7482
84d1d650
L
7483 /* Compute how many sections are in this segment. */
7484 for (section = ibfd->sections, section_count = 0;
7485 section != NULL;
7486 section = section->next)
7487 {
7488 this_hdr = &(elf_section_data(section)->this_hdr);
f4638467 7489 if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
3271a814 7490 {
a76e6f2f
AM
7491 if (first_section == NULL)
7492 first_section = section;
3271a814
NS
7493 section_count++;
7494 }
84d1d650
L
7495 }
7496
7497 /* Allocate a segment map big enough to contain
7498 all of the sections we have selected. */
00bee008 7499 amt = sizeof (struct elf_segment_map) - sizeof (asection *);
986f0783 7500 amt += section_count * sizeof (asection *);
a50b1753 7501 map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
84d1d650
L
7502 if (map == NULL)
7503 return FALSE;
7504
7505 /* Initialize the fields of the output segment map with the
7506 input segment. */
7507 map->next = NULL;
7508 map->p_type = segment->p_type;
7509 map->p_flags = segment->p_flags;
7510 map->p_flags_valid = 1;
7511 map->p_paddr = segment->p_paddr;
88967714 7512 map->p_paddr_valid = p_paddr_valid;
3f570048
AM
7513 map->p_align = segment->p_align;
7514 map->p_align_valid = 1;
3271a814 7515 map->p_vaddr_offset = 0;
84d1d650 7516
04c3a755
NS
7517 if (map->p_type == PT_GNU_RELRO
7518 || map->p_type == PT_GNU_STACK)
b10a8ae0
L
7519 {
7520 /* The PT_GNU_RELRO segment may contain the first a few
7521 bytes in the .got.plt section even if the whole .got.plt
7522 section isn't in the PT_GNU_RELRO segment. We won't
04c3a755
NS
7523 change the size of the PT_GNU_RELRO segment.
7524 Similarly, PT_GNU_STACK size is significant on uclinux
7525 systems. */
9433b9b1 7526 map->p_size = segment->p_memsz;
b10a8ae0
L
7527 map->p_size_valid = 1;
7528 }
7529
84d1d650
L
7530 /* Determine if this segment contains the ELF file header
7531 and if it contains the program headers themselves. */
7532 map->includes_filehdr = (segment->p_offset == 0
7533 && segment->p_filesz >= iehdr->e_ehsize);
7534
7535 map->includes_phdrs = 0;
7536 if (! phdr_included || segment->p_type != PT_LOAD)
7537 {
7538 map->includes_phdrs =
7539 (segment->p_offset <= (bfd_vma) iehdr->e_phoff
7540 && (segment->p_offset + segment->p_filesz
7541 >= ((bfd_vma) iehdr->e_phoff
7542 + iehdr->e_phnum * iehdr->e_phentsize)));
7543
7544 if (segment->p_type == PT_LOAD && map->includes_phdrs)
7545 phdr_included = TRUE;
7546 }
7547
bbefd0a9 7548 lowest_section = NULL;
84d1d650
L
7549 if (section_count != 0)
7550 {
7551 unsigned int isec = 0;
7552
53020534 7553 for (section = first_section;
84d1d650
L
7554 section != NULL;
7555 section = section->next)
7556 {
7557 this_hdr = &(elf_section_data(section)->this_hdr);
f4638467 7558 if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
53020534
L
7559 {
7560 map->sections[isec++] = section->output_section;
a76e6f2f
AM
7561 if ((section->flags & SEC_ALLOC) != 0)
7562 {
7563 bfd_vma seg_off;
7564
bbefd0a9
AM
7565 if (lowest_section == NULL
7566 || section->lma < lowest_section->lma)
fb8a5684
AM
7567 lowest_section = section;
7568
a76e6f2f
AM
7569 /* Section lmas are set up from PT_LOAD header
7570 p_paddr in _bfd_elf_make_section_from_shdr.
7571 If this header has a p_paddr that disagrees
7572 with the section lma, flag the p_paddr as
7573 invalid. */
7574 if ((section->flags & SEC_LOAD) != 0)
7575 seg_off = this_hdr->sh_offset - segment->p_offset;
7576 else
7577 seg_off = this_hdr->sh_addr - segment->p_vaddr;
7578 if (section->lma - segment->p_paddr != seg_off)
7579 map->p_paddr_valid = FALSE;
7580 }
53020534
L
7581 if (isec == section_count)
7582 break;
7583 }
84d1d650
L
7584 }
7585 }
7586
5d695627
AM
7587 if (section_count == 0)
7588 map->p_vaddr_offset = segment->p_vaddr;
30fe1832
AM
7589 else if (map->p_paddr_valid)
7590 {
7591 /* Account for padding before the first section in the segment. */
7592 bfd_vma hdr_size = 0;
7593 if (map->includes_filehdr)
7594 hdr_size = iehdr->e_ehsize;
7595 if (map->includes_phdrs)
7596 hdr_size += iehdr->e_phnum * iehdr->e_phentsize;
7597
7598 map->p_vaddr_offset = (map->p_paddr + hdr_size
7599 - (lowest_section ? lowest_section->lma : 0));
7600 }
a76e6f2f 7601
84d1d650
L
7602 map->count = section_count;
7603 *pointer_to_map = map;
7604 pointer_to_map = &map->next;
7605 }
7606
12bd6957 7607 elf_seg_map (obfd) = map_first;
84d1d650
L
7608 return TRUE;
7609}
7610
7611/* Copy private BFD data. This copies or rewrites ELF program header
7612 information. */
7613
7614static bfd_boolean
7615copy_private_bfd_data (bfd *ibfd, bfd *obfd)
7616{
84d1d650
L
7617 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
7618 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
7619 return TRUE;
7620
7621 if (elf_tdata (ibfd)->phdr == NULL)
7622 return TRUE;
7623
7624 if (ibfd->xvec == obfd->xvec)
7625 {
cb3ff1e5
NC
7626 /* Check to see if any sections in the input BFD
7627 covered by ELF program header have changed. */
d55ce4e2 7628 Elf_Internal_Phdr *segment;
84d1d650
L
7629 asection *section, *osec;
7630 unsigned int i, num_segments;
7631 Elf_Internal_Shdr *this_hdr;
147d51c2
L
7632 const struct elf_backend_data *bed;
7633
7634 bed = get_elf_backend_data (ibfd);
7635
7636 /* Regenerate the segment map if p_paddr is set to 0. */
7637 if (bed->want_p_paddr_set_to_zero)
7638 goto rewrite;
84d1d650
L
7639
7640 /* Initialize the segment mark field. */
7641 for (section = obfd->sections; section != NULL;
7642 section = section->next)
7643 section->segment_mark = FALSE;
7644
7645 num_segments = elf_elfheader (ibfd)->e_phnum;
7646 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7647 i < num_segments;
7648 i++, segment++)
7649 {
5f6999aa
NC
7650 /* PR binutils/3535. The Solaris linker always sets the p_paddr
7651 and p_memsz fields of special segments (DYNAMIC, INTERP) to 0
7652 which severly confuses things, so always regenerate the segment
7653 map in this case. */
7654 if (segment->p_paddr == 0
7655 && segment->p_memsz == 0
7656 && (segment->p_type == PT_INTERP || segment->p_type == PT_DYNAMIC))
cb3ff1e5 7657 goto rewrite;
5f6999aa 7658
84d1d650
L
7659 for (section = ibfd->sections;
7660 section != NULL; section = section->next)
7661 {
7662 /* We mark the output section so that we know it comes
7663 from the input BFD. */
7664 osec = section->output_section;
7665 if (osec)
7666 osec->segment_mark = TRUE;
7667
7668 /* Check if this section is covered by the segment. */
7669 this_hdr = &(elf_section_data(section)->this_hdr);
f4638467 7670 if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
84d1d650
L
7671 {
7672 /* FIXME: Check if its output section is changed or
7673 removed. What else do we need to check? */
7674 if (osec == NULL
7675 || section->flags != osec->flags
7676 || section->lma != osec->lma
7677 || section->vma != osec->vma
7678 || section->size != osec->size
7679 || section->rawsize != osec->rawsize
7680 || section->alignment_power != osec->alignment_power)
7681 goto rewrite;
7682 }
7683 }
7684 }
7685
cb3ff1e5 7686 /* Check to see if any output section do not come from the
84d1d650
L
7687 input BFD. */
7688 for (section = obfd->sections; section != NULL;
7689 section = section->next)
7690 {
535b785f 7691 if (!section->segment_mark)
84d1d650
L
7692 goto rewrite;
7693 else
7694 section->segment_mark = FALSE;
7695 }
7696
7697 return copy_elf_program_header (ibfd, obfd);
7698 }
7699
dc1e8a47 7700 rewrite:
f1d85785
L
7701 if (ibfd->xvec == obfd->xvec)
7702 {
7703 /* When rewriting program header, set the output maxpagesize to
7704 the maximum alignment of input PT_LOAD segments. */
7705 Elf_Internal_Phdr *segment;
7706 unsigned int i;
7707 unsigned int num_segments = elf_elfheader (ibfd)->e_phnum;
7708 bfd_vma maxpagesize = 0;
7709
7710 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7711 i < num_segments;
7712 i++, segment++)
7713 if (segment->p_type == PT_LOAD
7714 && maxpagesize < segment->p_align)
c86934ce
NC
7715 {
7716 /* PR 17512: file: f17299af. */
7717 if (segment->p_align > (bfd_vma) 1 << ((sizeof (bfd_vma) * 8) - 2))
695344c0 7718 /* xgettext:c-format */
2dcf00ce
AM
7719 _bfd_error_handler (_("%pB: warning: segment alignment of %#"
7720 PRIx64 " is too large"),
7721 ibfd, (uint64_t) segment->p_align);
c86934ce
NC
7722 else
7723 maxpagesize = segment->p_align;
7724 }
f1d85785
L
7725
7726 if (maxpagesize != get_elf_backend_data (obfd)->maxpagesize)
7727 bfd_emul_set_maxpagesize (bfd_get_target (obfd), maxpagesize);
7728 }
7729
84d1d650
L
7730 return rewrite_elf_program_header (ibfd, obfd);
7731}
7732
ccd2ec6a
L
7733/* Initialize private output section information from input section. */
7734
7735bfd_boolean
7736_bfd_elf_init_private_section_data (bfd *ibfd,
7737 asection *isec,
7738 bfd *obfd,
7739 asection *osec,
7740 struct bfd_link_info *link_info)
7741
7742{
7743 Elf_Internal_Shdr *ihdr, *ohdr;
0e1862bb
L
7744 bfd_boolean final_link = (link_info != NULL
7745 && !bfd_link_relocatable (link_info));
ccd2ec6a
L
7746
7747 if (ibfd->xvec->flavour != bfd_target_elf_flavour
7748 || obfd->xvec->flavour != bfd_target_elf_flavour)
7749 return TRUE;
7750
ba85c43e
NC
7751 BFD_ASSERT (elf_section_data (osec) != NULL);
7752
8c803a2d
AM
7753 /* If this is a known ABI section, ELF section type and flags may
7754 have been set up when OSEC was created. For normal sections we
7755 allow the user to override the type and flags other than
7756 SHF_MASKOS and SHF_MASKPROC. */
7757 if (elf_section_type (osec) == SHT_PROGBITS
7758 || elf_section_type (osec) == SHT_NOTE
7759 || elf_section_type (osec) == SHT_NOBITS)
7760 elf_section_type (osec) = SHT_NULL;
7761 /* For objcopy and relocatable link, copy the ELF section type from
7762 the input file if the BFD section flags are the same. (If they
7763 are different the user may be doing something like
7764 "objcopy --set-section-flags .text=alloc,data".) For a final
7765 link allow some flags that the linker clears to differ. */
42bb2e33 7766 if (elf_section_type (osec) == SHT_NULL
dfa7b0b8
AM
7767 && (osec->flags == isec->flags
7768 || (final_link
7769 && ((osec->flags ^ isec->flags)
0814be7d 7770 & ~(SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_RELOC)) == 0)))
42bb2e33 7771 elf_section_type (osec) = elf_section_type (isec);
d270463e
L
7772
7773 /* FIXME: Is this correct for all OS/PROC specific flags? */
8c803a2d
AM
7774 elf_section_flags (osec) = (elf_section_flags (isec)
7775 & (SHF_MASKOS | SHF_MASKPROC));
ccd2ec6a 7776
a91e1603 7777 /* Copy sh_info from input for mbind section. */
df3a023b
AM
7778 if ((elf_tdata (ibfd)->has_gnu_osabi & elf_gnu_osabi_mbind) != 0
7779 && elf_section_flags (isec) & SHF_GNU_MBIND)
a91e1603
L
7780 elf_section_data (osec)->this_hdr.sh_info
7781 = elf_section_data (isec)->this_hdr.sh_info;
7782
ccd2ec6a
L
7783 /* Set things up for objcopy and relocatable link. The output
7784 SHT_GROUP section will have its elf_next_in_group pointing back
7785 to the input group members. Ignore linker created group section.
7786 See elfNN_ia64_object_p in elfxx-ia64.c. */
7bdf4127
AB
7787 if ((link_info == NULL
7788 || !link_info->resolve_section_groups)
7789 && (elf_sec_group (isec) == NULL
7790 || (elf_sec_group (isec)->flags & SEC_LINKER_CREATED) == 0))
ccd2ec6a 7791 {
7bdf4127
AB
7792 if (elf_section_flags (isec) & SHF_GROUP)
7793 elf_section_flags (osec) |= SHF_GROUP;
7794 elf_next_in_group (osec) = elf_next_in_group (isec);
7795 elf_section_data (osec)->group = elf_section_data (isec)->group;
ccd2ec6a
L
7796 }
7797
7bdf4127
AB
7798 /* If not decompress, preserve SHF_COMPRESSED. */
7799 if (!final_link && (ibfd->flags & BFD_DECOMPRESS) == 0)
7800 elf_section_flags (osec) |= (elf_section_flags (isec)
7801 & SHF_COMPRESSED);
7802
ccd2ec6a
L
7803 ihdr = &elf_section_data (isec)->this_hdr;
7804
7805 /* We need to handle elf_linked_to_section for SHF_LINK_ORDER. We
7806 don't use the output section of the linked-to section since it
7807 may be NULL at this point. */
7808 if ((ihdr->sh_flags & SHF_LINK_ORDER) != 0)
7809 {
7810 ohdr = &elf_section_data (osec)->this_hdr;
7811 ohdr->sh_flags |= SHF_LINK_ORDER;
7812 elf_linked_to_section (osec) = elf_linked_to_section (isec);
7813 }
7814
7815 osec->use_rela_p = isec->use_rela_p;
7816
7817 return TRUE;
7818}
7819
252b5132
RH
7820/* Copy private section information. This copies over the entsize
7821 field, and sometimes the info field. */
7822
b34976b6 7823bfd_boolean
217aa764
AM
7824_bfd_elf_copy_private_section_data (bfd *ibfd,
7825 asection *isec,
7826 bfd *obfd,
7827 asection *osec)
252b5132
RH
7828{
7829 Elf_Internal_Shdr *ihdr, *ohdr;
7830
7831 if (ibfd->xvec->flavour != bfd_target_elf_flavour
7832 || obfd->xvec->flavour != bfd_target_elf_flavour)
b34976b6 7833 return TRUE;
252b5132 7834
252b5132
RH
7835 ihdr = &elf_section_data (isec)->this_hdr;
7836 ohdr = &elf_section_data (osec)->this_hdr;
7837
7838 ohdr->sh_entsize = ihdr->sh_entsize;
7839
7840 if (ihdr->sh_type == SHT_SYMTAB
7841 || ihdr->sh_type == SHT_DYNSYM
7842 || ihdr->sh_type == SHT_GNU_verneed
7843 || ihdr->sh_type == SHT_GNU_verdef)
7844 ohdr->sh_info = ihdr->sh_info;
7845
ccd2ec6a
L
7846 return _bfd_elf_init_private_section_data (ibfd, isec, obfd, osec,
7847 NULL);
252b5132
RH
7848}
7849
d0bf826b
AM
7850/* Look at all the SHT_GROUP sections in IBFD, making any adjustments
7851 necessary if we are removing either the SHT_GROUP section or any of
7852 the group member sections. DISCARDED is the value that a section's
7853 output_section has if the section will be discarded, NULL when this
7854 function is called from objcopy, bfd_abs_section_ptr when called
7855 from the linker. */
80fccad2
BW
7856
7857bfd_boolean
d0bf826b 7858_bfd_elf_fixup_group_sections (bfd *ibfd, asection *discarded)
80fccad2 7859{
30288845
AM
7860 asection *isec;
7861
30288845 7862 for (isec = ibfd->sections; isec != NULL; isec = isec->next)
415f38a6 7863 if (elf_section_type (isec) == SHT_GROUP)
30288845
AM
7864 {
7865 asection *first = elf_next_in_group (isec);
7866 asection *s = first;
d0bf826b
AM
7867 bfd_size_type removed = 0;
7868
30288845
AM
7869 while (s != NULL)
7870 {
415f38a6
AM
7871 /* If this member section is being output but the
7872 SHT_GROUP section is not, then clear the group info
7873 set up by _bfd_elf_copy_private_section_data. */
d0bf826b
AM
7874 if (s->output_section != discarded
7875 && isec->output_section == discarded)
30288845
AM
7876 {
7877 elf_section_flags (s->output_section) &= ~SHF_GROUP;
7878 elf_group_name (s->output_section) = NULL;
7879 }
415f38a6
AM
7880 /* Conversely, if the member section is not being output
7881 but the SHT_GROUP section is, then adjust its size. */
d0bf826b
AM
7882 else if (s->output_section == discarded
7883 && isec->output_section != discarded)
6e5e9d58
AM
7884 {
7885 struct bfd_elf_section_data *elf_sec = elf_section_data (s);
7886 removed += 4;
7887 if (elf_sec->rel.hdr != NULL
7888 && (elf_sec->rel.hdr->sh_flags & SHF_GROUP) != 0)
7889 removed += 4;
7890 if (elf_sec->rela.hdr != NULL
7891 && (elf_sec->rela.hdr->sh_flags & SHF_GROUP) != 0)
7892 removed += 4;
7893 }
30288845
AM
7894 s = elf_next_in_group (s);
7895 if (s == first)
7896 break;
7897 }
d0bf826b
AM
7898 if (removed != 0)
7899 {
7900 if (discarded != NULL)
7901 {
7902 /* If we've been called for ld -r, then we need to
6e5e9d58 7903 adjust the input section size. */
d0bf826b
AM
7904 if (isec->rawsize == 0)
7905 isec->rawsize = isec->size;
7906 isec->size = isec->rawsize - removed;
6e5e9d58
AM
7907 if (isec->size <= 4)
7908 {
7909 isec->size = 0;
7910 isec->flags |= SEC_EXCLUDE;
7911 }
d0bf826b
AM
7912 }
7913 else
7914 {
7915 /* Adjust the output section size when called from
7916 objcopy. */
7917 isec->output_section->size -= removed;
6e5e9d58
AM
7918 if (isec->output_section->size <= 4)
7919 {
7920 isec->output_section->size = 0;
7921 isec->output_section->flags |= SEC_EXCLUDE;
7922 }
d0bf826b
AM
7923 }
7924 }
30288845
AM
7925 }
7926
80fccad2
BW
7927 return TRUE;
7928}
7929
d0bf826b
AM
7930/* Copy private header information. */
7931
7932bfd_boolean
7933_bfd_elf_copy_private_header_data (bfd *ibfd, bfd *obfd)
7934{
7935 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
7936 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
7937 return TRUE;
7938
7939 /* Copy over private BFD data if it has not already been copied.
7940 This must be done here, rather than in the copy_private_bfd_data
7941 entry point, because the latter is called after the section
7942 contents have been set, which means that the program headers have
7943 already been worked out. */
12bd6957 7944 if (elf_seg_map (obfd) == NULL && elf_tdata (ibfd)->phdr != NULL)
d0bf826b
AM
7945 {
7946 if (! copy_private_bfd_data (ibfd, obfd))
7947 return FALSE;
7948 }
7949
7950 return _bfd_elf_fixup_group_sections (ibfd, NULL);
7951}
7952
252b5132
RH
7953/* Copy private symbol information. If this symbol is in a section
7954 which we did not map into a BFD section, try to map the section
7955 index correctly. We use special macro definitions for the mapped
7956 section indices; these definitions are interpreted by the
7957 swap_out_syms function. */
7958
9ad5cbcf
AM
7959#define MAP_ONESYMTAB (SHN_HIOS + 1)
7960#define MAP_DYNSYMTAB (SHN_HIOS + 2)
7961#define MAP_STRTAB (SHN_HIOS + 3)
7962#define MAP_SHSTRTAB (SHN_HIOS + 4)
7963#define MAP_SYM_SHNDX (SHN_HIOS + 5)
252b5132 7964
b34976b6 7965bfd_boolean
217aa764
AM
7966_bfd_elf_copy_private_symbol_data (bfd *ibfd,
7967 asymbol *isymarg,
7968 bfd *obfd,
7969 asymbol *osymarg)
252b5132
RH
7970{
7971 elf_symbol_type *isym, *osym;
7972
7973 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
7974 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
b34976b6 7975 return TRUE;
252b5132
RH
7976
7977 isym = elf_symbol_from (ibfd, isymarg);
7978 osym = elf_symbol_from (obfd, osymarg);
7979
7980 if (isym != NULL
8424d8f5 7981 && isym->internal_elf_sym.st_shndx != 0
252b5132
RH
7982 && osym != NULL
7983 && bfd_is_abs_section (isym->symbol.section))
7984 {
7985 unsigned int shndx;
7986
7987 shndx = isym->internal_elf_sym.st_shndx;
7988 if (shndx == elf_onesymtab (ibfd))
7989 shndx = MAP_ONESYMTAB;
7990 else if (shndx == elf_dynsymtab (ibfd))
7991 shndx = MAP_DYNSYMTAB;
12bd6957 7992 else if (shndx == elf_strtab_sec (ibfd))
252b5132 7993 shndx = MAP_STRTAB;
12bd6957 7994 else if (shndx == elf_shstrtab_sec (ibfd))
252b5132 7995 shndx = MAP_SHSTRTAB;
6a40cf0c 7996 else if (find_section_in_list (shndx, elf_symtab_shndx_list (ibfd)))
9ad5cbcf 7997 shndx = MAP_SYM_SHNDX;
252b5132
RH
7998 osym->internal_elf_sym.st_shndx = shndx;
7999 }
8000
b34976b6 8001 return TRUE;
252b5132
RH
8002}
8003
8004/* Swap out the symbols. */
8005
b34976b6 8006static bfd_boolean
217aa764 8007swap_out_syms (bfd *abfd,
ef10c3ac 8008 struct elf_strtab_hash **sttp,
217aa764 8009 int relocatable_p)
252b5132 8010{
9c5bfbb7 8011 const struct elf_backend_data *bed;
1f4361a7 8012 unsigned int symcount;
079e9a2f 8013 asymbol **syms;
ef10c3ac 8014 struct elf_strtab_hash *stt;
079e9a2f 8015 Elf_Internal_Shdr *symtab_hdr;
9ad5cbcf 8016 Elf_Internal_Shdr *symtab_shndx_hdr;
079e9a2f 8017 Elf_Internal_Shdr *symstrtab_hdr;
ef10c3ac 8018 struct elf_sym_strtab *symstrtab;
f075ee0c
AM
8019 bfd_byte *outbound_syms;
8020 bfd_byte *outbound_shndx;
ef10c3ac
L
8021 unsigned long outbound_syms_index;
8022 unsigned long outbound_shndx_index;
1f4361a7 8023 unsigned int idx;
12bd6957 8024 unsigned int num_locals;
1f4361a7 8025 size_t amt;
174fd7f9 8026 bfd_boolean name_local_sections;
252b5132 8027
12bd6957 8028 if (!elf_map_symbols (abfd, &num_locals))
b34976b6 8029 return FALSE;
252b5132 8030
c044fabd 8031 /* Dump out the symtabs. */
ef10c3ac 8032 stt = _bfd_elf_strtab_init ();
079e9a2f 8033 if (stt == NULL)
b34976b6 8034 return FALSE;
252b5132 8035
079e9a2f
AM
8036 bed = get_elf_backend_data (abfd);
8037 symcount = bfd_get_symcount (abfd);
8038 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8039 symtab_hdr->sh_type = SHT_SYMTAB;
8040 symtab_hdr->sh_entsize = bed->s->sizeof_sym;
8041 symtab_hdr->sh_size = symtab_hdr->sh_entsize * (symcount + 1);
12bd6957 8042 symtab_hdr->sh_info = num_locals + 1;
72de5009 8043 symtab_hdr->sh_addralign = (bfd_vma) 1 << bed->s->log_file_align;
079e9a2f
AM
8044
8045 symstrtab_hdr = &elf_tdata (abfd)->strtab_hdr;
8046 symstrtab_hdr->sh_type = SHT_STRTAB;
8047
ef10c3ac 8048 /* Allocate buffer to swap out the .strtab section. */
1f4361a7
AM
8049 if (_bfd_mul_overflow (symcount + 1, sizeof (*symstrtab), &amt)
8050 || (symstrtab = (struct elf_sym_strtab *) bfd_malloc (amt)) == NULL)
ef10c3ac 8051 {
1f4361a7 8052 bfd_set_error (bfd_error_no_memory);
ef10c3ac
L
8053 _bfd_elf_strtab_free (stt);
8054 return FALSE;
8055 }
8056
1f4361a7
AM
8057 if (_bfd_mul_overflow (symcount + 1, bed->s->sizeof_sym, &amt)
8058 || (outbound_syms = (bfd_byte *) bfd_alloc (abfd, amt)) == NULL)
5ed6aba4 8059 {
1f4361a7
AM
8060 error_no_mem:
8061 bfd_set_error (bfd_error_no_memory);
8062 error_return:
ef10c3ac 8063 free (symstrtab);
1f4361a7 8064 _bfd_elf_strtab_free (stt);
5ed6aba4
NC
8065 return FALSE;
8066 }
217aa764 8067 symtab_hdr->contents = outbound_syms;
ef10c3ac 8068 outbound_syms_index = 0;
252b5132 8069
9ad5cbcf 8070 outbound_shndx = NULL;
ef10c3ac 8071 outbound_shndx_index = 0;
6a40cf0c
NC
8072
8073 if (elf_symtab_shndx_list (abfd))
9ad5cbcf 8074 {
6a40cf0c
NC
8075 symtab_shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
8076 if (symtab_shndx_hdr->sh_name != 0)
8077 {
1f4361a7
AM
8078 if (_bfd_mul_overflow (symcount + 1,
8079 sizeof (Elf_External_Sym_Shndx), &amt))
8080 goto error_no_mem;
8081 outbound_shndx = (bfd_byte *) bfd_zalloc (abfd, amt);
6a40cf0c
NC
8082 if (outbound_shndx == NULL)
8083 goto error_return;
5ed6aba4 8084
6a40cf0c
NC
8085 symtab_shndx_hdr->contents = outbound_shndx;
8086 symtab_shndx_hdr->sh_type = SHT_SYMTAB_SHNDX;
8087 symtab_shndx_hdr->sh_size = amt;
8088 symtab_shndx_hdr->sh_addralign = sizeof (Elf_External_Sym_Shndx);
8089 symtab_shndx_hdr->sh_entsize = sizeof (Elf_External_Sym_Shndx);
8090 }
8091 /* FIXME: What about any other headers in the list ? */
9ad5cbcf
AM
8092 }
8093
589e6347 8094 /* Now generate the data (for "contents"). */
079e9a2f
AM
8095 {
8096 /* Fill in zeroth symbol and swap it out. */
8097 Elf_Internal_Sym sym;
8098 sym.st_name = 0;
8099 sym.st_value = 0;
8100 sym.st_size = 0;
8101 sym.st_info = 0;
8102 sym.st_other = 0;
8103 sym.st_shndx = SHN_UNDEF;
35fc36a8 8104 sym.st_target_internal = 0;
ef10c3ac
L
8105 symstrtab[0].sym = sym;
8106 symstrtab[0].dest_index = outbound_syms_index;
8107 symstrtab[0].destshndx_index = outbound_shndx_index;
8108 outbound_syms_index++;
9ad5cbcf 8109 if (outbound_shndx != NULL)
ef10c3ac 8110 outbound_shndx_index++;
079e9a2f 8111 }
252b5132 8112
174fd7f9
RS
8113 name_local_sections
8114 = (bed->elf_backend_name_local_section_symbols
8115 && bed->elf_backend_name_local_section_symbols (abfd));
8116
079e9a2f 8117 syms = bfd_get_outsymbols (abfd);
ef10c3ac 8118 for (idx = 0; idx < symcount;)
252b5132 8119 {
252b5132 8120 Elf_Internal_Sym sym;
079e9a2f
AM
8121 bfd_vma value = syms[idx]->value;
8122 elf_symbol_type *type_ptr;
8123 flagword flags = syms[idx]->flags;
8124 int type;
252b5132 8125
174fd7f9
RS
8126 if (!name_local_sections
8127 && (flags & (BSF_SECTION_SYM | BSF_GLOBAL)) == BSF_SECTION_SYM)
079e9a2f
AM
8128 {
8129 /* Local section symbols have no name. */
ef10c3ac 8130 sym.st_name = (unsigned long) -1;
079e9a2f
AM
8131 }
8132 else
8133 {
ef10c3ac
L
8134 /* Call _bfd_elf_strtab_offset after _bfd_elf_strtab_finalize
8135 to get the final offset for st_name. */
8136 sym.st_name
8137 = (unsigned long) _bfd_elf_strtab_add (stt, syms[idx]->name,
8138 FALSE);
079e9a2f 8139 if (sym.st_name == (unsigned long) -1)
ef10c3ac 8140 goto error_return;
079e9a2f 8141 }
252b5132 8142
079e9a2f 8143 type_ptr = elf_symbol_from (abfd, syms[idx]);
252b5132 8144
079e9a2f
AM
8145 if ((flags & BSF_SECTION_SYM) == 0
8146 && bfd_is_com_section (syms[idx]->section))
8147 {
8148 /* ELF common symbols put the alignment into the `value' field,
8149 and the size into the `size' field. This is backwards from
8150 how BFD handles it, so reverse it here. */
8151 sym.st_size = value;
8152 if (type_ptr == NULL
8153 || type_ptr->internal_elf_sym.st_value == 0)
8154 sym.st_value = value >= 16 ? 16 : (1 << bfd_log2 (value));
8155 else
8156 sym.st_value = type_ptr->internal_elf_sym.st_value;
8157 sym.st_shndx = _bfd_elf_section_from_bfd_section
8158 (abfd, syms[idx]->section);
8159 }
8160 else
8161 {
8162 asection *sec = syms[idx]->section;
cb33740c 8163 unsigned int shndx;
252b5132 8164
079e9a2f
AM
8165 if (sec->output_section)
8166 {
8167 value += sec->output_offset;
8168 sec = sec->output_section;
8169 }
589e6347 8170
079e9a2f
AM
8171 /* Don't add in the section vma for relocatable output. */
8172 if (! relocatable_p)
8173 value += sec->vma;
8174 sym.st_value = value;
8175 sym.st_size = type_ptr ? type_ptr->internal_elf_sym.st_size : 0;
8176
8177 if (bfd_is_abs_section (sec)
8178 && type_ptr != NULL
8179 && type_ptr->internal_elf_sym.st_shndx != 0)
8180 {
8181 /* This symbol is in a real ELF section which we did
8182 not create as a BFD section. Undo the mapping done
8183 by copy_private_symbol_data. */
8184 shndx = type_ptr->internal_elf_sym.st_shndx;
8185 switch (shndx)
8186 {
8187 case MAP_ONESYMTAB:
8188 shndx = elf_onesymtab (abfd);
8189 break;
8190 case MAP_DYNSYMTAB:
8191 shndx = elf_dynsymtab (abfd);
8192 break;
8193 case MAP_STRTAB:
12bd6957 8194 shndx = elf_strtab_sec (abfd);
079e9a2f
AM
8195 break;
8196 case MAP_SHSTRTAB:
12bd6957 8197 shndx = elf_shstrtab_sec (abfd);
079e9a2f 8198 break;
9ad5cbcf 8199 case MAP_SYM_SHNDX:
6a40cf0c
NC
8200 if (elf_symtab_shndx_list (abfd))
8201 shndx = elf_symtab_shndx_list (abfd)->ndx;
9ad5cbcf 8202 break;
00e49dff
NC
8203 case SHN_COMMON:
8204 case SHN_ABS:
15bc576a 8205 shndx = SHN_ABS;
079e9a2f 8206 break;
00e49dff
NC
8207 default:
8208 if (shndx >= SHN_LOPROC && shndx <= SHN_HIOS)
8209 {
8210 if (bed->symbol_section_index)
8211 shndx = bed->symbol_section_index (abfd, type_ptr);
8212 /* Otherwise just leave the index alone. */
8213 }
8214 else
8215 {
8216 if (shndx > SHN_HIOS && shndx < SHN_HIRESERVE)
8217 _bfd_error_handler (_("%pB: \
8218Unable to handle section index %x in ELF symbol. Using ABS instead."),
8219 abfd, shndx);
8220 shndx = SHN_ABS;
8221 }
8222 break;
079e9a2f
AM
8223 }
8224 }
8225 else
8226 {
8227 shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
252b5132 8228
cb33740c 8229 if (shndx == SHN_BAD)
079e9a2f
AM
8230 {
8231 asection *sec2;
8232
8233 /* Writing this would be a hell of a lot easier if
8234 we had some decent documentation on bfd, and
8235 knew what to expect of the library, and what to
8236 demand of applications. For example, it
8237 appears that `objcopy' might not set the
8238 section of a symbol to be a section that is
8239 actually in the output file. */
8240 sec2 = bfd_get_section_by_name (abfd, sec->name);
5df1bc57
AM
8241 if (sec2 != NULL)
8242 shndx = _bfd_elf_section_from_bfd_section (abfd, sec2);
8243 if (shndx == SHN_BAD)
589e6347 8244 {
695344c0 8245 /* xgettext:c-format */
9793eb77
AM
8246 _bfd_error_handler
8247 (_("unable to find equivalent output section"
8248 " for symbol '%s' from section '%s'"),
8249 syms[idx]->name ? syms[idx]->name : "<Local sym>",
8250 sec->name);
811072d8 8251 bfd_set_error (bfd_error_invalid_operation);
ef10c3ac 8252 goto error_return;
589e6347 8253 }
079e9a2f
AM
8254 }
8255 }
252b5132 8256
079e9a2f
AM
8257 sym.st_shndx = shndx;
8258 }
252b5132 8259
13ae64f3
JJ
8260 if ((flags & BSF_THREAD_LOCAL) != 0)
8261 type = STT_TLS;
d8045f23
NC
8262 else if ((flags & BSF_GNU_INDIRECT_FUNCTION) != 0)
8263 type = STT_GNU_IFUNC;
13ae64f3 8264 else if ((flags & BSF_FUNCTION) != 0)
079e9a2f
AM
8265 type = STT_FUNC;
8266 else if ((flags & BSF_OBJECT) != 0)
8267 type = STT_OBJECT;
d9352518
DB
8268 else if ((flags & BSF_RELC) != 0)
8269 type = STT_RELC;
8270 else if ((flags & BSF_SRELC) != 0)
8271 type = STT_SRELC;
079e9a2f
AM
8272 else
8273 type = STT_NOTYPE;
252b5132 8274
13ae64f3
JJ
8275 if (syms[idx]->section->flags & SEC_THREAD_LOCAL)
8276 type = STT_TLS;
8277
589e6347 8278 /* Processor-specific types. */
079e9a2f
AM
8279 if (type_ptr != NULL
8280 && bed->elf_backend_get_symbol_type)
8281 type = ((*bed->elf_backend_get_symbol_type)
8282 (&type_ptr->internal_elf_sym, type));
252b5132 8283
079e9a2f
AM
8284 if (flags & BSF_SECTION_SYM)
8285 {
8286 if (flags & BSF_GLOBAL)
8287 sym.st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8288 else
8289 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION);
8290 }
8291 else if (bfd_is_com_section (syms[idx]->section))
0a40daed 8292 {
b8871f35
L
8293 if (type != STT_TLS)
8294 {
8295 if ((abfd->flags & BFD_CONVERT_ELF_COMMON))
8296 type = ((abfd->flags & BFD_USE_ELF_STT_COMMON)
8297 ? STT_COMMON : STT_OBJECT);
8298 else
8299 type = ((flags & BSF_ELF_COMMON) != 0
8300 ? STT_COMMON : STT_OBJECT);
8301 }
8302 sym.st_info = ELF_ST_INFO (STB_GLOBAL, type);
0a40daed 8303 }
079e9a2f
AM
8304 else if (bfd_is_und_section (syms[idx]->section))
8305 sym.st_info = ELF_ST_INFO (((flags & BSF_WEAK)
8306 ? STB_WEAK
8307 : STB_GLOBAL),
8308 type);
8309 else if (flags & BSF_FILE)
8310 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FILE);
8311 else
8312 {
8313 int bind = STB_LOCAL;
252b5132 8314
079e9a2f
AM
8315 if (flags & BSF_LOCAL)
8316 bind = STB_LOCAL;
3e7a7d11
NC
8317 else if (flags & BSF_GNU_UNIQUE)
8318 bind = STB_GNU_UNIQUE;
079e9a2f
AM
8319 else if (flags & BSF_WEAK)
8320 bind = STB_WEAK;
8321 else if (flags & BSF_GLOBAL)
8322 bind = STB_GLOBAL;
252b5132 8323
079e9a2f
AM
8324 sym.st_info = ELF_ST_INFO (bind, type);
8325 }
252b5132 8326
079e9a2f 8327 if (type_ptr != NULL)
35fc36a8
RS
8328 {
8329 sym.st_other = type_ptr->internal_elf_sym.st_other;
8330 sym.st_target_internal
8331 = type_ptr->internal_elf_sym.st_target_internal;
8332 }
079e9a2f 8333 else
35fc36a8
RS
8334 {
8335 sym.st_other = 0;
8336 sym.st_target_internal = 0;
8337 }
252b5132 8338
ef10c3ac
L
8339 idx++;
8340 symstrtab[idx].sym = sym;
8341 symstrtab[idx].dest_index = outbound_syms_index;
8342 symstrtab[idx].destshndx_index = outbound_shndx_index;
8343
8344 outbound_syms_index++;
9ad5cbcf 8345 if (outbound_shndx != NULL)
ef10c3ac
L
8346 outbound_shndx_index++;
8347 }
8348
8349 /* Finalize the .strtab section. */
8350 _bfd_elf_strtab_finalize (stt);
8351
8352 /* Swap out the .strtab section. */
8353 for (idx = 0; idx <= symcount; idx++)
8354 {
8355 struct elf_sym_strtab *elfsym = &symstrtab[idx];
8356 if (elfsym->sym.st_name == (unsigned long) -1)
8357 elfsym->sym.st_name = 0;
8358 else
8359 elfsym->sym.st_name = _bfd_elf_strtab_offset (stt,
8360 elfsym->sym.st_name);
8361 bed->s->swap_symbol_out (abfd, &elfsym->sym,
8362 (outbound_syms
8363 + (elfsym->dest_index
8364 * bed->s->sizeof_sym)),
8365 (outbound_shndx
8366 + (elfsym->destshndx_index
8367 * sizeof (Elf_External_Sym_Shndx))));
079e9a2f 8368 }
ef10c3ac 8369 free (symstrtab);
252b5132 8370
079e9a2f 8371 *sttp = stt;
ef10c3ac 8372 symstrtab_hdr->sh_size = _bfd_elf_strtab_size (stt);
079e9a2f 8373 symstrtab_hdr->sh_type = SHT_STRTAB;
84865015 8374 symstrtab_hdr->sh_flags = bed->elf_strtab_flags;
079e9a2f
AM
8375 symstrtab_hdr->sh_addr = 0;
8376 symstrtab_hdr->sh_entsize = 0;
8377 symstrtab_hdr->sh_link = 0;
8378 symstrtab_hdr->sh_info = 0;
8379 symstrtab_hdr->sh_addralign = 1;
252b5132 8380
b34976b6 8381 return TRUE;
252b5132
RH
8382}
8383
8384/* Return the number of bytes required to hold the symtab vector.
8385
8386 Note that we base it on the count plus 1, since we will null terminate
8387 the vector allocated based on this size. However, the ELF symbol table
8388 always has a dummy entry as symbol #0, so it ends up even. */
8389
8390long
217aa764 8391_bfd_elf_get_symtab_upper_bound (bfd *abfd)
252b5132 8392{
3a551c7a 8393 bfd_size_type symcount;
252b5132
RH
8394 long symtab_size;
8395 Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->symtab_hdr;
8396
8397 symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
3a551c7a
AM
8398 if (symcount >= LONG_MAX / sizeof (asymbol *))
8399 {
8400 bfd_set_error (bfd_error_file_too_big);
8401 return -1;
8402 }
b99d1833
AM
8403 symtab_size = (symcount + 1) * (sizeof (asymbol *));
8404 if (symcount > 0)
8405 symtab_size -= sizeof (asymbol *);
252b5132
RH
8406
8407 return symtab_size;
8408}
8409
8410long
217aa764 8411_bfd_elf_get_dynamic_symtab_upper_bound (bfd *abfd)
252b5132 8412{
3a551c7a 8413 bfd_size_type symcount;
252b5132
RH
8414 long symtab_size;
8415 Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->dynsymtab_hdr;
8416
8417 if (elf_dynsymtab (abfd) == 0)
8418 {
8419 bfd_set_error (bfd_error_invalid_operation);
8420 return -1;
8421 }
8422
8423 symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
3a551c7a
AM
8424 if (symcount >= LONG_MAX / sizeof (asymbol *))
8425 {
8426 bfd_set_error (bfd_error_file_too_big);
8427 return -1;
8428 }
b99d1833
AM
8429 symtab_size = (symcount + 1) * (sizeof (asymbol *));
8430 if (symcount > 0)
8431 symtab_size -= sizeof (asymbol *);
252b5132
RH
8432
8433 return symtab_size;
8434}
8435
8436long
217aa764
AM
8437_bfd_elf_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
8438 sec_ptr asect)
252b5132 8439{
242a1159 8440#if SIZEOF_LONG == SIZEOF_INT
7a6e0d89
AM
8441 if (asect->reloc_count >= LONG_MAX / sizeof (arelent *))
8442 {
8443 bfd_set_error (bfd_error_file_too_big);
8444 return -1;
8445 }
242a1159 8446#endif
252b5132
RH
8447 return (asect->reloc_count + 1) * sizeof (arelent *);
8448}
8449
8450/* Canonicalize the relocs. */
8451
8452long
217aa764
AM
8453_bfd_elf_canonicalize_reloc (bfd *abfd,
8454 sec_ptr section,
8455 arelent **relptr,
8456 asymbol **symbols)
252b5132
RH
8457{
8458 arelent *tblptr;
8459 unsigned int i;
9c5bfbb7 8460 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 8461
b34976b6 8462 if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
252b5132
RH
8463 return -1;
8464
8465 tblptr = section->relocation;
8466 for (i = 0; i < section->reloc_count; i++)
8467 *relptr++ = tblptr++;
8468
8469 *relptr = NULL;
8470
8471 return section->reloc_count;
8472}
8473
8474long
6cee3f79 8475_bfd_elf_canonicalize_symtab (bfd *abfd, asymbol **allocation)
252b5132 8476{
9c5bfbb7 8477 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
217aa764 8478 long symcount = bed->s->slurp_symbol_table (abfd, allocation, FALSE);
252b5132
RH
8479
8480 if (symcount >= 0)
ed48ec2e 8481 abfd->symcount = symcount;
252b5132
RH
8482 return symcount;
8483}
8484
8485long
217aa764
AM
8486_bfd_elf_canonicalize_dynamic_symtab (bfd *abfd,
8487 asymbol **allocation)
252b5132 8488{
9c5bfbb7 8489 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
217aa764 8490 long symcount = bed->s->slurp_symbol_table (abfd, allocation, TRUE);
1f70368c
DJ
8491
8492 if (symcount >= 0)
ed48ec2e 8493 abfd->dynsymcount = symcount;
1f70368c 8494 return symcount;
252b5132
RH
8495}
8496
8615f3f2
AM
8497/* Return the size required for the dynamic reloc entries. Any loadable
8498 section that was actually installed in the BFD, and has type SHT_REL
8499 or SHT_RELA, and uses the dynamic symbol table, is considered to be a
8500 dynamic reloc section. */
252b5132
RH
8501
8502long
217aa764 8503_bfd_elf_get_dynamic_reloc_upper_bound (bfd *abfd)
252b5132 8504{
3a551c7a 8505 bfd_size_type count;
252b5132
RH
8506 asection *s;
8507
8508 if (elf_dynsymtab (abfd) == 0)
8509 {
8510 bfd_set_error (bfd_error_invalid_operation);
8511 return -1;
8512 }
8513
3a551c7a 8514 count = 1;
252b5132 8515 for (s = abfd->sections; s != NULL; s = s->next)
266b05cf 8516 if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
252b5132
RH
8517 && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
8518 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
3a551c7a
AM
8519 {
8520 count += s->size / elf_section_data (s)->this_hdr.sh_entsize;
8521 if (count > LONG_MAX / sizeof (arelent *))
8522 {
8523 bfd_set_error (bfd_error_file_too_big);
8524 return -1;
8525 }
8526 }
8527 return count * sizeof (arelent *);
252b5132
RH
8528}
8529
8615f3f2
AM
8530/* Canonicalize the dynamic relocation entries. Note that we return the
8531 dynamic relocations as a single block, although they are actually
8532 associated with particular sections; the interface, which was
8533 designed for SunOS style shared libraries, expects that there is only
8534 one set of dynamic relocs. Any loadable section that was actually
8535 installed in the BFD, and has type SHT_REL or SHT_RELA, and uses the
8536 dynamic symbol table, is considered to be a dynamic reloc section. */
252b5132
RH
8537
8538long
217aa764
AM
8539_bfd_elf_canonicalize_dynamic_reloc (bfd *abfd,
8540 arelent **storage,
8541 asymbol **syms)
252b5132 8542{
217aa764 8543 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
252b5132
RH
8544 asection *s;
8545 long ret;
8546
8547 if (elf_dynsymtab (abfd) == 0)
8548 {
8549 bfd_set_error (bfd_error_invalid_operation);
8550 return -1;
8551 }
8552
8553 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
8554 ret = 0;
8555 for (s = abfd->sections; s != NULL; s = s->next)
8556 {
266b05cf 8557 if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
252b5132
RH
8558 && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
8559 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
8560 {
8561 arelent *p;
8562 long count, i;
8563
b34976b6 8564 if (! (*slurp_relocs) (abfd, s, syms, TRUE))
252b5132 8565 return -1;
eea6121a 8566 count = s->size / elf_section_data (s)->this_hdr.sh_entsize;
252b5132
RH
8567 p = s->relocation;
8568 for (i = 0; i < count; i++)
8569 *storage++ = p++;
8570 ret += count;
8571 }
8572 }
8573
8574 *storage = NULL;
8575
8576 return ret;
8577}
8578\f
8579/* Read in the version information. */
8580
b34976b6 8581bfd_boolean
fc0e6df6 8582_bfd_elf_slurp_version_tables (bfd *abfd, bfd_boolean default_imported_symver)
252b5132
RH
8583{
8584 bfd_byte *contents = NULL;
fc0e6df6 8585 unsigned int freeidx = 0;
1f4361a7 8586 size_t amt;
fc0e6df6
PB
8587
8588 if (elf_dynverref (abfd) != 0)
8589 {
8590 Elf_Internal_Shdr *hdr;
8591 Elf_External_Verneed *everneed;
8592 Elf_Internal_Verneed *iverneed;
8593 unsigned int i;
d0fb9a8d 8594 bfd_byte *contents_end;
fc0e6df6
PB
8595
8596 hdr = &elf_tdata (abfd)->dynverref_hdr;
8597
bd61e135
AM
8598 if (hdr->sh_info == 0
8599 || hdr->sh_info > hdr->sh_size / sizeof (Elf_External_Verneed))
d0fb9a8d 8600 {
dc1e8a47 8601 error_return_bad_verref:
4eca0228 8602 _bfd_error_handler
871b3ab2 8603 (_("%pB: .gnu.version_r invalid entry"), abfd);
601a03ba 8604 bfd_set_error (bfd_error_bad_value);
dc1e8a47 8605 error_return_verref:
d0fb9a8d
JJ
8606 elf_tdata (abfd)->verref = NULL;
8607 elf_tdata (abfd)->cverrefs = 0;
8608 goto error_return;
8609 }
601a03ba 8610
2bb3687b
AM
8611 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0)
8612 goto error_return_verref;
8613 contents = _bfd_malloc_and_read (abfd, hdr->sh_size, hdr->sh_size);
8614 if (contents == NULL)
d0fb9a8d 8615 goto error_return_verref;
fc0e6df6 8616
1f4361a7
AM
8617 if (_bfd_mul_overflow (hdr->sh_info, sizeof (Elf_Internal_Verneed), &amt))
8618 {
8619 bfd_set_error (bfd_error_file_too_big);
8620 goto error_return_verref;
8621 }
8622 elf_tdata (abfd)->verref = (Elf_Internal_Verneed *) bfd_alloc (abfd, amt);
601a03ba 8623 if (elf_tdata (abfd)->verref == NULL)
d0fb9a8d
JJ
8624 goto error_return_verref;
8625
8626 BFD_ASSERT (sizeof (Elf_External_Verneed)
8627 == sizeof (Elf_External_Vernaux));
8628 contents_end = contents + hdr->sh_size - sizeof (Elf_External_Verneed);
fc0e6df6
PB
8629 everneed = (Elf_External_Verneed *) contents;
8630 iverneed = elf_tdata (abfd)->verref;
8631 for (i = 0; i < hdr->sh_info; i++, iverneed++)
8632 {
8633 Elf_External_Vernaux *evernaux;
8634 Elf_Internal_Vernaux *ivernaux;
8635 unsigned int j;
8636
8637 _bfd_elf_swap_verneed_in (abfd, everneed, iverneed);
8638
8639 iverneed->vn_bfd = abfd;
8640
8641 iverneed->vn_filename =
8642 bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
8643 iverneed->vn_file);
8644 if (iverneed->vn_filename == NULL)
601a03ba 8645 goto error_return_bad_verref;
fc0e6df6 8646
d0fb9a8d
JJ
8647 if (iverneed->vn_cnt == 0)
8648 iverneed->vn_auxptr = NULL;
8649 else
8650 {
1f4361a7
AM
8651 if (_bfd_mul_overflow (iverneed->vn_cnt,
8652 sizeof (Elf_Internal_Vernaux), &amt))
8653 {
8654 bfd_set_error (bfd_error_file_too_big);
8655 goto error_return_verref;
8656 }
a50b1753 8657 iverneed->vn_auxptr = (struct elf_internal_vernaux *)
1f4361a7 8658 bfd_alloc (abfd, amt);
d0fb9a8d
JJ
8659 if (iverneed->vn_auxptr == NULL)
8660 goto error_return_verref;
8661 }
8662
8663 if (iverneed->vn_aux
8664 > (size_t) (contents_end - (bfd_byte *) everneed))
601a03ba 8665 goto error_return_bad_verref;
fc0e6df6
PB
8666
8667 evernaux = ((Elf_External_Vernaux *)
8668 ((bfd_byte *) everneed + iverneed->vn_aux));
8669 ivernaux = iverneed->vn_auxptr;
8670 for (j = 0; j < iverneed->vn_cnt; j++, ivernaux++)
8671 {
8672 _bfd_elf_swap_vernaux_in (abfd, evernaux, ivernaux);
8673
8674 ivernaux->vna_nodename =
8675 bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
8676 ivernaux->vna_name);
8677 if (ivernaux->vna_nodename == NULL)
601a03ba 8678 goto error_return_bad_verref;
fc0e6df6 8679
25ff461f
AM
8680 if (ivernaux->vna_other > freeidx)
8681 freeidx = ivernaux->vna_other;
8682
8683 ivernaux->vna_nextptr = NULL;
8684 if (ivernaux->vna_next == 0)
8685 {
8686 iverneed->vn_cnt = j + 1;
8687 break;
8688 }
fc0e6df6
PB
8689 if (j + 1 < iverneed->vn_cnt)
8690 ivernaux->vna_nextptr = ivernaux + 1;
fc0e6df6 8691
d0fb9a8d
JJ
8692 if (ivernaux->vna_next
8693 > (size_t) (contents_end - (bfd_byte *) evernaux))
601a03ba 8694 goto error_return_bad_verref;
d0fb9a8d 8695
fc0e6df6
PB
8696 evernaux = ((Elf_External_Vernaux *)
8697 ((bfd_byte *) evernaux + ivernaux->vna_next));
fc0e6df6
PB
8698 }
8699
25ff461f
AM
8700 iverneed->vn_nextref = NULL;
8701 if (iverneed->vn_next == 0)
8702 break;
fc0e6df6
PB
8703 if (i + 1 < hdr->sh_info)
8704 iverneed->vn_nextref = iverneed + 1;
fc0e6df6 8705
d0fb9a8d
JJ
8706 if (iverneed->vn_next
8707 > (size_t) (contents_end - (bfd_byte *) everneed))
601a03ba 8708 goto error_return_bad_verref;
d0fb9a8d 8709
fc0e6df6
PB
8710 everneed = ((Elf_External_Verneed *)
8711 ((bfd_byte *) everneed + iverneed->vn_next));
8712 }
25ff461f 8713 elf_tdata (abfd)->cverrefs = i;
fc0e6df6
PB
8714
8715 free (contents);
8716 contents = NULL;
8717 }
252b5132
RH
8718
8719 if (elf_dynverdef (abfd) != 0)
8720 {
8721 Elf_Internal_Shdr *hdr;
8722 Elf_External_Verdef *everdef;
8723 Elf_Internal_Verdef *iverdef;
f631889e
UD
8724 Elf_Internal_Verdef *iverdefarr;
8725 Elf_Internal_Verdef iverdefmem;
252b5132 8726 unsigned int i;
062e2358 8727 unsigned int maxidx;
d0fb9a8d 8728 bfd_byte *contents_end_def, *contents_end_aux;
252b5132
RH
8729
8730 hdr = &elf_tdata (abfd)->dynverdef_hdr;
8731
601a03ba
AM
8732 if (hdr->sh_info == 0 || hdr->sh_size < sizeof (Elf_External_Verdef))
8733 {
8734 error_return_bad_verdef:
4eca0228 8735 _bfd_error_handler
871b3ab2 8736 (_("%pB: .gnu.version_d invalid entry"), abfd);
601a03ba
AM
8737 bfd_set_error (bfd_error_bad_value);
8738 error_return_verdef:
8739 elf_tdata (abfd)->verdef = NULL;
8740 elf_tdata (abfd)->cverdefs = 0;
8741 goto error_return;
8742 }
8743
2bb3687b 8744 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0)
601a03ba 8745 goto error_return_verdef;
2bb3687b
AM
8746 contents = _bfd_malloc_and_read (abfd, hdr->sh_size, hdr->sh_size);
8747 if (contents == NULL)
601a03ba 8748 goto error_return_verdef;
d0fb9a8d
JJ
8749
8750 BFD_ASSERT (sizeof (Elf_External_Verdef)
8751 >= sizeof (Elf_External_Verdaux));
8752 contents_end_def = contents + hdr->sh_size
8753 - sizeof (Elf_External_Verdef);
8754 contents_end_aux = contents + hdr->sh_size
8755 - sizeof (Elf_External_Verdaux);
8756
f631889e
UD
8757 /* We know the number of entries in the section but not the maximum
8758 index. Therefore we have to run through all entries and find
8759 the maximum. */
252b5132 8760 everdef = (Elf_External_Verdef *) contents;
f631889e
UD
8761 maxidx = 0;
8762 for (i = 0; i < hdr->sh_info; ++i)
8763 {
8764 _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
8765
601a03ba
AM
8766 if ((iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION)) == 0)
8767 goto error_return_bad_verdef;
062e2358
AM
8768 if ((iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION)) > maxidx)
8769 maxidx = iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION);
f631889e 8770
25ff461f
AM
8771 if (iverdefmem.vd_next == 0)
8772 break;
8773
d0fb9a8d
JJ
8774 if (iverdefmem.vd_next
8775 > (size_t) (contents_end_def - (bfd_byte *) everdef))
601a03ba 8776 goto error_return_bad_verdef;
d0fb9a8d 8777
f631889e
UD
8778 everdef = ((Elf_External_Verdef *)
8779 ((bfd_byte *) everdef + iverdefmem.vd_next));
8780 }
8781
fc0e6df6
PB
8782 if (default_imported_symver)
8783 {
8784 if (freeidx > maxidx)
8785 maxidx = ++freeidx;
8786 else
8787 freeidx = ++maxidx;
8788 }
1f4361a7
AM
8789 if (_bfd_mul_overflow (maxidx, sizeof (Elf_Internal_Verdef), &amt))
8790 {
8791 bfd_set_error (bfd_error_file_too_big);
8792 goto error_return_verdef;
8793 }
8794 elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *) bfd_zalloc (abfd, amt);
f631889e 8795 if (elf_tdata (abfd)->verdef == NULL)
601a03ba 8796 goto error_return_verdef;
f631889e
UD
8797
8798 elf_tdata (abfd)->cverdefs = maxidx;
8799
8800 everdef = (Elf_External_Verdef *) contents;
8801 iverdefarr = elf_tdata (abfd)->verdef;
8802 for (i = 0; i < hdr->sh_info; i++)
252b5132
RH
8803 {
8804 Elf_External_Verdaux *everdaux;
8805 Elf_Internal_Verdaux *iverdaux;
8806 unsigned int j;
8807
f631889e
UD
8808 _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
8809
d0fb9a8d 8810 if ((iverdefmem.vd_ndx & VERSYM_VERSION) == 0)
601a03ba 8811 goto error_return_bad_verdef;
d0fb9a8d 8812
f631889e 8813 iverdef = &iverdefarr[(iverdefmem.vd_ndx & VERSYM_VERSION) - 1];
595bce75 8814 memcpy (iverdef, &iverdefmem, offsetof (Elf_Internal_Verdef, vd_bfd));
252b5132
RH
8815
8816 iverdef->vd_bfd = abfd;
8817
d0fb9a8d
JJ
8818 if (iverdef->vd_cnt == 0)
8819 iverdef->vd_auxptr = NULL;
8820 else
8821 {
1f4361a7
AM
8822 if (_bfd_mul_overflow (iverdef->vd_cnt,
8823 sizeof (Elf_Internal_Verdaux), &amt))
8824 {
8825 bfd_set_error (bfd_error_file_too_big);
8826 goto error_return_verdef;
8827 }
a50b1753 8828 iverdef->vd_auxptr = (struct elf_internal_verdaux *)
1f4361a7 8829 bfd_alloc (abfd, amt);
d0fb9a8d
JJ
8830 if (iverdef->vd_auxptr == NULL)
8831 goto error_return_verdef;
8832 }
8833
8834 if (iverdef->vd_aux
8835 > (size_t) (contents_end_aux - (bfd_byte *) everdef))
601a03ba 8836 goto error_return_bad_verdef;
252b5132
RH
8837
8838 everdaux = ((Elf_External_Verdaux *)
8839 ((bfd_byte *) everdef + iverdef->vd_aux));
8840 iverdaux = iverdef->vd_auxptr;
8841 for (j = 0; j < iverdef->vd_cnt; j++, iverdaux++)
8842 {
8843 _bfd_elf_swap_verdaux_in (abfd, everdaux, iverdaux);
8844
8845 iverdaux->vda_nodename =
8846 bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
8847 iverdaux->vda_name);
8848 if (iverdaux->vda_nodename == NULL)
601a03ba 8849 goto error_return_bad_verdef;
252b5132 8850
25ff461f
AM
8851 iverdaux->vda_nextptr = NULL;
8852 if (iverdaux->vda_next == 0)
8853 {
8854 iverdef->vd_cnt = j + 1;
8855 break;
8856 }
252b5132
RH
8857 if (j + 1 < iverdef->vd_cnt)
8858 iverdaux->vda_nextptr = iverdaux + 1;
252b5132 8859
d0fb9a8d
JJ
8860 if (iverdaux->vda_next
8861 > (size_t) (contents_end_aux - (bfd_byte *) everdaux))
601a03ba 8862 goto error_return_bad_verdef;
d0fb9a8d 8863
252b5132
RH
8864 everdaux = ((Elf_External_Verdaux *)
8865 ((bfd_byte *) everdaux + iverdaux->vda_next));
8866 }
8867
595bce75 8868 iverdef->vd_nodename = NULL;
d0fb9a8d
JJ
8869 if (iverdef->vd_cnt)
8870 iverdef->vd_nodename = iverdef->vd_auxptr->vda_nodename;
252b5132 8871
25ff461f
AM
8872 iverdef->vd_nextdef = NULL;
8873 if (iverdef->vd_next == 0)
8874 break;
d0fb9a8d 8875 if ((size_t) (iverdef - iverdefarr) + 1 < maxidx)
252b5132 8876 iverdef->vd_nextdef = iverdef + 1;
252b5132
RH
8877
8878 everdef = ((Elf_External_Verdef *)
8879 ((bfd_byte *) everdef + iverdef->vd_next));
8880 }
8881
8882 free (contents);
8883 contents = NULL;
8884 }
fc0e6df6 8885 else if (default_imported_symver)
252b5132 8886 {
fc0e6df6
PB
8887 if (freeidx < 3)
8888 freeidx = 3;
8889 else
8890 freeidx++;
252b5132 8891
1f4361a7
AM
8892 if (_bfd_mul_overflow (freeidx, sizeof (Elf_Internal_Verdef), &amt))
8893 {
8894 bfd_set_error (bfd_error_file_too_big);
8895 goto error_return;
8896 }
8897 elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *) bfd_zalloc (abfd, amt);
fc0e6df6 8898 if (elf_tdata (abfd)->verdef == NULL)
252b5132
RH
8899 goto error_return;
8900
fc0e6df6
PB
8901 elf_tdata (abfd)->cverdefs = freeidx;
8902 }
252b5132 8903
fc0e6df6
PB
8904 /* Create a default version based on the soname. */
8905 if (default_imported_symver)
8906 {
8907 Elf_Internal_Verdef *iverdef;
8908 Elf_Internal_Verdaux *iverdaux;
252b5132 8909
5bb3703f 8910 iverdef = &elf_tdata (abfd)->verdef[freeidx - 1];
252b5132 8911
fc0e6df6
PB
8912 iverdef->vd_version = VER_DEF_CURRENT;
8913 iverdef->vd_flags = 0;
8914 iverdef->vd_ndx = freeidx;
8915 iverdef->vd_cnt = 1;
252b5132 8916
fc0e6df6 8917 iverdef->vd_bfd = abfd;
252b5132 8918
fc0e6df6
PB
8919 iverdef->vd_nodename = bfd_elf_get_dt_soname (abfd);
8920 if (iverdef->vd_nodename == NULL)
d0fb9a8d 8921 goto error_return_verdef;
fc0e6df6 8922 iverdef->vd_nextdef = NULL;
601a03ba
AM
8923 iverdef->vd_auxptr = ((struct elf_internal_verdaux *)
8924 bfd_zalloc (abfd, sizeof (Elf_Internal_Verdaux)));
d0fb9a8d
JJ
8925 if (iverdef->vd_auxptr == NULL)
8926 goto error_return_verdef;
252b5132 8927
fc0e6df6
PB
8928 iverdaux = iverdef->vd_auxptr;
8929 iverdaux->vda_nodename = iverdef->vd_nodename;
252b5132
RH
8930 }
8931
b34976b6 8932 return TRUE;
252b5132
RH
8933
8934 error_return:
5ed6aba4 8935 if (contents != NULL)
252b5132 8936 free (contents);
b34976b6 8937 return FALSE;
252b5132
RH
8938}
8939\f
8940asymbol *
217aa764 8941_bfd_elf_make_empty_symbol (bfd *abfd)
252b5132
RH
8942{
8943 elf_symbol_type *newsym;
8944
7a6e0d89 8945 newsym = (elf_symbol_type *) bfd_zalloc (abfd, sizeof (*newsym));
252b5132
RH
8946 if (!newsym)
8947 return NULL;
201159ec
NC
8948 newsym->symbol.the_bfd = abfd;
8949 return &newsym->symbol;
252b5132
RH
8950}
8951
8952void
217aa764
AM
8953_bfd_elf_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
8954 asymbol *symbol,
8955 symbol_info *ret)
252b5132
RH
8956{
8957 bfd_symbol_info (symbol, ret);
8958}
8959
8960/* Return whether a symbol name implies a local symbol. Most targets
8961 use this function for the is_local_label_name entry point, but some
8962 override it. */
8963
b34976b6 8964bfd_boolean
217aa764
AM
8965_bfd_elf_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
8966 const char *name)
252b5132
RH
8967{
8968 /* Normal local symbols start with ``.L''. */
8969 if (name[0] == '.' && name[1] == 'L')
b34976b6 8970 return TRUE;
252b5132
RH
8971
8972 /* At least some SVR4 compilers (e.g., UnixWare 2.1 cc) generate
8973 DWARF debugging symbols starting with ``..''. */
8974 if (name[0] == '.' && name[1] == '.')
b34976b6 8975 return TRUE;
252b5132
RH
8976
8977 /* gcc will sometimes generate symbols beginning with ``_.L_'' when
8978 emitting DWARF debugging output. I suspect this is actually a
8979 small bug in gcc (it calls ASM_OUTPUT_LABEL when it should call
8980 ASM_GENERATE_INTERNAL_LABEL, and this causes the leading
8981 underscore to be emitted on some ELF targets). For ease of use,
8982 we treat such symbols as local. */
8983 if (name[0] == '_' && name[1] == '.' && name[2] == 'L' && name[3] == '_')
b34976b6 8984 return TRUE;
252b5132 8985
b1fa9dd6
NC
8986 /* Treat assembler generated fake symbols, dollar local labels and
8987 forward-backward labels (aka local labels) as locals.
8988 These labels have the form:
8989
07d6d2b8 8990 L0^A.* (fake symbols)
b1fa9dd6
NC
8991
8992 [.]?L[0123456789]+{^A|^B}[0123456789]* (local labels)
8993
8994 Versions which start with .L will have already been matched above,
8995 so we only need to match the rest. */
8996 if (name[0] == 'L' && ISDIGIT (name[1]))
8997 {
8998 bfd_boolean ret = FALSE;
8999 const char * p;
9000 char c;
9001
9002 for (p = name + 2; (c = *p); p++)
9003 {
9004 if (c == 1 || c == 2)
9005 {
9006 if (c == 1 && p == name + 2)
9007 /* A fake symbol. */
9008 return TRUE;
9009
9010 /* FIXME: We are being paranoid here and treating symbols like
9011 L0^Bfoo as if there were non-local, on the grounds that the
9012 assembler will never generate them. But can any symbol
9013 containing an ASCII value in the range 1-31 ever be anything
9014 other than some kind of local ? */
9015 ret = TRUE;
9016 }
9017
9018 if (! ISDIGIT (c))
9019 {
9020 ret = FALSE;
9021 break;
9022 }
9023 }
9024 return ret;
9025 }
ffa54770 9026
b34976b6 9027 return FALSE;
252b5132
RH
9028}
9029
9030alent *
217aa764
AM
9031_bfd_elf_get_lineno (bfd *abfd ATTRIBUTE_UNUSED,
9032 asymbol *symbol ATTRIBUTE_UNUSED)
252b5132
RH
9033{
9034 abort ();
9035 return NULL;
9036}
9037
b34976b6 9038bfd_boolean
217aa764
AM
9039_bfd_elf_set_arch_mach (bfd *abfd,
9040 enum bfd_architecture arch,
9041 unsigned long machine)
252b5132
RH
9042{
9043 /* If this isn't the right architecture for this backend, and this
9044 isn't the generic backend, fail. */
9045 if (arch != get_elf_backend_data (abfd)->arch
9046 && arch != bfd_arch_unknown
9047 && get_elf_backend_data (abfd)->arch != bfd_arch_unknown)
b34976b6 9048 return FALSE;
252b5132
RH
9049
9050 return bfd_default_set_arch_mach (abfd, arch, machine);
9051}
9052
d1fad7c6
NC
9053/* Find the nearest line to a particular section and offset,
9054 for error reporting. */
9055
b34976b6 9056bfd_boolean
217aa764 9057_bfd_elf_find_nearest_line (bfd *abfd,
217aa764 9058 asymbol **symbols,
fb167eb2 9059 asection *section,
217aa764
AM
9060 bfd_vma offset,
9061 const char **filename_ptr,
9062 const char **functionname_ptr,
fb167eb2
AM
9063 unsigned int *line_ptr,
9064 unsigned int *discriminator_ptr)
d1fad7c6 9065{
b34976b6 9066 bfd_boolean found;
d1fad7c6 9067
fb167eb2 9068 if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
4e8a9624 9069 filename_ptr, functionname_ptr,
fb167eb2 9070 line_ptr, discriminator_ptr,
9defd221 9071 dwarf_debug_sections,
e7679060
AM
9072 &elf_tdata (abfd)->dwarf2_find_line_info))
9073 return TRUE;
9074
9075 if (_bfd_dwarf1_find_nearest_line (abfd, symbols, section, offset,
9076 filename_ptr, functionname_ptr, line_ptr))
d1fad7c6
NC
9077 {
9078 if (!*functionname_ptr)
e00e8198
AM
9079 _bfd_elf_find_function (abfd, symbols, section, offset,
9080 *filename_ptr ? NULL : filename_ptr,
9081 functionname_ptr);
b34976b6 9082 return TRUE;
d1fad7c6
NC
9083 }
9084
9085 if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
4e8a9624
AM
9086 &found, filename_ptr,
9087 functionname_ptr, line_ptr,
9088 &elf_tdata (abfd)->line_info))
b34976b6 9089 return FALSE;
dc43ada5 9090 if (found && (*functionname_ptr || *line_ptr))
b34976b6 9091 return TRUE;
d1fad7c6
NC
9092
9093 if (symbols == NULL)
b34976b6 9094 return FALSE;
d1fad7c6 9095
e00e8198
AM
9096 if (! _bfd_elf_find_function (abfd, symbols, section, offset,
9097 filename_ptr, functionname_ptr))
b34976b6 9098 return FALSE;
d1fad7c6 9099
252b5132 9100 *line_ptr = 0;
b34976b6 9101 return TRUE;
252b5132
RH
9102}
9103
5420f73d
L
9104/* Find the line for a symbol. */
9105
9106bfd_boolean
9107_bfd_elf_find_line (bfd *abfd, asymbol **symbols, asymbol *symbol,
9108 const char **filename_ptr, unsigned int *line_ptr)
9b8d1a36 9109{
fb167eb2
AM
9110 return _bfd_dwarf2_find_nearest_line (abfd, symbols, symbol, NULL, 0,
9111 filename_ptr, NULL, line_ptr, NULL,
9defd221 9112 dwarf_debug_sections,
fb167eb2 9113 &elf_tdata (abfd)->dwarf2_find_line_info);
5420f73d
L
9114}
9115
4ab527b0
FF
9116/* After a call to bfd_find_nearest_line, successive calls to
9117 bfd_find_inliner_info can be used to get source information about
9118 each level of function inlining that terminated at the address
9119 passed to bfd_find_nearest_line. Currently this is only supported
9120 for DWARF2 with appropriate DWARF3 extensions. */
9121
9122bfd_boolean
9123_bfd_elf_find_inliner_info (bfd *abfd,
9124 const char **filename_ptr,
9125 const char **functionname_ptr,
9126 unsigned int *line_ptr)
9127{
9128 bfd_boolean found;
9129 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
9130 functionname_ptr, line_ptr,
9131 & elf_tdata (abfd)->dwarf2_find_line_info);
9132 return found;
9133}
9134
252b5132 9135int
a6b96beb 9136_bfd_elf_sizeof_headers (bfd *abfd, struct bfd_link_info *info)
252b5132 9137{
8ded5a0f
AM
9138 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
9139 int ret = bed->s->sizeof_ehdr;
252b5132 9140
0e1862bb 9141 if (!bfd_link_relocatable (info))
8ded5a0f 9142 {
12bd6957 9143 bfd_size_type phdr_size = elf_program_header_size (abfd);
8ded5a0f 9144
62d7a5f6
AM
9145 if (phdr_size == (bfd_size_type) -1)
9146 {
9147 struct elf_segment_map *m;
9148
9149 phdr_size = 0;
12bd6957 9150 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
62d7a5f6 9151 phdr_size += bed->s->sizeof_phdr;
8ded5a0f 9152
62d7a5f6
AM
9153 if (phdr_size == 0)
9154 phdr_size = get_program_header_size (abfd, info);
9155 }
8ded5a0f 9156
12bd6957 9157 elf_program_header_size (abfd) = phdr_size;
8ded5a0f
AM
9158 ret += phdr_size;
9159 }
9160
252b5132
RH
9161 return ret;
9162}
9163
b34976b6 9164bfd_boolean
217aa764
AM
9165_bfd_elf_set_section_contents (bfd *abfd,
9166 sec_ptr section,
0f867abe 9167 const void *location,
217aa764
AM
9168 file_ptr offset,
9169 bfd_size_type count)
252b5132
RH
9170{
9171 Elf_Internal_Shdr *hdr;
1b6aeedb 9172 file_ptr pos;
252b5132
RH
9173
9174 if (! abfd->output_has_begun
217aa764 9175 && ! _bfd_elf_compute_section_file_positions (abfd, NULL))
b34976b6 9176 return FALSE;
252b5132 9177
0ce398f1
L
9178 if (!count)
9179 return TRUE;
9180
252b5132 9181 hdr = &elf_section_data (section)->this_hdr;
0ce398f1
L
9182 if (hdr->sh_offset == (file_ptr) -1)
9183 {
1ff6de03
NA
9184 if (bfd_section_is_ctf (section))
9185 /* Nothing to do with this section: the contents are generated
9186 later. */
9187 return TRUE;
9188
0ce398f1
L
9189 /* We must compress this section. Write output to the buffer. */
9190 unsigned char *contents = hdr->contents;
9191 if ((offset + count) > hdr->sh_size
9192 || (section->flags & SEC_ELF_COMPRESS) == 0
9193 || contents == NULL)
9194 abort ();
9195 memcpy (contents + offset, location, count);
9196 return TRUE;
9197 }
dc810e39
AM
9198 pos = hdr->sh_offset + offset;
9199 if (bfd_seek (abfd, pos, SEEK_SET) != 0
9200 || bfd_bwrite (location, count, abfd) != count)
b34976b6 9201 return FALSE;
252b5132 9202
b34976b6 9203 return TRUE;
252b5132
RH
9204}
9205
f3185997 9206bfd_boolean
217aa764
AM
9207_bfd_elf_no_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
9208 arelent *cache_ptr ATTRIBUTE_UNUSED,
9209 Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
252b5132
RH
9210{
9211 abort ();
f3185997 9212 return FALSE;
252b5132
RH
9213}
9214
252b5132
RH
9215/* Try to convert a non-ELF reloc into an ELF one. */
9216
b34976b6 9217bfd_boolean
217aa764 9218_bfd_elf_validate_reloc (bfd *abfd, arelent *areloc)
252b5132 9219{
c044fabd 9220 /* Check whether we really have an ELF howto. */
252b5132
RH
9221
9222 if ((*areloc->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec)
9223 {
9224 bfd_reloc_code_real_type code;
9225 reloc_howto_type *howto;
9226
9227 /* Alien reloc: Try to determine its type to replace it with an
c044fabd 9228 equivalent ELF reloc. */
252b5132
RH
9229
9230 if (areloc->howto->pc_relative)
9231 {
9232 switch (areloc->howto->bitsize)
9233 {
9234 case 8:
9235 code = BFD_RELOC_8_PCREL;
9236 break;
9237 case 12:
9238 code = BFD_RELOC_12_PCREL;
9239 break;
9240 case 16:
9241 code = BFD_RELOC_16_PCREL;
9242 break;
9243 case 24:
9244 code = BFD_RELOC_24_PCREL;
9245 break;
9246 case 32:
9247 code = BFD_RELOC_32_PCREL;
9248 break;
9249 case 64:
9250 code = BFD_RELOC_64_PCREL;
9251 break;
9252 default:
9253 goto fail;
9254 }
9255
9256 howto = bfd_reloc_type_lookup (abfd, code);
9257
94698d01 9258 if (howto && areloc->howto->pcrel_offset != howto->pcrel_offset)
252b5132
RH
9259 {
9260 if (howto->pcrel_offset)
9261 areloc->addend += areloc->address;
9262 else
9263 areloc->addend -= areloc->address; /* addend is unsigned!! */
9264 }
9265 }
9266 else
9267 {
9268 switch (areloc->howto->bitsize)
9269 {
9270 case 8:
9271 code = BFD_RELOC_8;
9272 break;
9273 case 14:
9274 code = BFD_RELOC_14;
9275 break;
9276 case 16:
9277 code = BFD_RELOC_16;
9278 break;
9279 case 26:
9280 code = BFD_RELOC_26;
9281 break;
9282 case 32:
9283 code = BFD_RELOC_32;
9284 break;
9285 case 64:
9286 code = BFD_RELOC_64;
9287 break;
9288 default:
9289 goto fail;
9290 }
9291
9292 howto = bfd_reloc_type_lookup (abfd, code);
9293 }
9294
9295 if (howto)
9296 areloc->howto = howto;
9297 else
9298 goto fail;
9299 }
9300
b34976b6 9301 return TRUE;
252b5132
RH
9302
9303 fail:
0aa13fee
AM
9304 /* xgettext:c-format */
9305 _bfd_error_handler (_("%pB: %s unsupported"),
9306 abfd, areloc->howto->name);
9aea1e31 9307 bfd_set_error (bfd_error_sorry);
b34976b6 9308 return FALSE;
252b5132
RH
9309}
9310
b34976b6 9311bfd_boolean
217aa764 9312_bfd_elf_close_and_cleanup (bfd *abfd)
252b5132 9313{
d9071b0c
TG
9314 struct elf_obj_tdata *tdata = elf_tdata (abfd);
9315 if (bfd_get_format (abfd) == bfd_object && tdata != NULL)
252b5132 9316 {
c0355132 9317 if (elf_tdata (abfd)->o != NULL && elf_shstrtab (abfd) != NULL)
2b0f7ef9 9318 _bfd_elf_strtab_free (elf_shstrtab (abfd));
d9071b0c 9319 _bfd_dwarf2_cleanup_debug_info (abfd, &tdata->dwarf2_find_line_info);
252b5132
RH
9320 }
9321
9322 return _bfd_generic_close_and_cleanup (abfd);
9323}
9324
9325/* For Rel targets, we encode meaningful data for BFD_RELOC_VTABLE_ENTRY
9326 in the relocation's offset. Thus we cannot allow any sort of sanity
9327 range-checking to interfere. There is nothing else to do in processing
9328 this reloc. */
9329
9330bfd_reloc_status_type
217aa764
AM
9331_bfd_elf_rel_vtable_reloc_fn
9332 (bfd *abfd ATTRIBUTE_UNUSED, arelent *re ATTRIBUTE_UNUSED,
fc0a2244 9333 struct bfd_symbol *symbol ATTRIBUTE_UNUSED,
217aa764
AM
9334 void *data ATTRIBUTE_UNUSED, asection *is ATTRIBUTE_UNUSED,
9335 bfd *obfd ATTRIBUTE_UNUSED, char **errmsg ATTRIBUTE_UNUSED)
252b5132
RH
9336{
9337 return bfd_reloc_ok;
9338}
252b5132
RH
9339\f
9340/* Elf core file support. Much of this only works on native
9341 toolchains, since we rely on knowing the
9342 machine-dependent procfs structure in order to pick
c044fabd 9343 out details about the corefile. */
252b5132
RH
9344
9345#ifdef HAVE_SYS_PROCFS_H
16231b7b
DG
9346/* Needed for new procfs interface on sparc-solaris. */
9347# define _STRUCTURED_PROC 1
252b5132
RH
9348# include <sys/procfs.h>
9349#endif
9350
261b8d08
PA
9351/* Return a PID that identifies a "thread" for threaded cores, or the
9352 PID of the main process for non-threaded cores. */
252b5132
RH
9353
9354static int
217aa764 9355elfcore_make_pid (bfd *abfd)
252b5132 9356{
261b8d08
PA
9357 int pid;
9358
228e534f 9359 pid = elf_tdata (abfd)->core->lwpid;
261b8d08 9360 if (pid == 0)
228e534f 9361 pid = elf_tdata (abfd)->core->pid;
261b8d08
PA
9362
9363 return pid;
252b5132
RH
9364}
9365
252b5132
RH
9366/* If there isn't a section called NAME, make one, using
9367 data from SECT. Note, this function will generate a
9368 reference to NAME, so you shouldn't deallocate or
c044fabd 9369 overwrite it. */
252b5132 9370
b34976b6 9371static bfd_boolean
217aa764 9372elfcore_maybe_make_sect (bfd *abfd, char *name, asection *sect)
252b5132 9373{
c044fabd 9374 asection *sect2;
252b5132
RH
9375
9376 if (bfd_get_section_by_name (abfd, name) != NULL)
b34976b6 9377 return TRUE;
252b5132 9378
117ed4f8 9379 sect2 = bfd_make_section_with_flags (abfd, name, sect->flags);
252b5132 9380 if (sect2 == NULL)
b34976b6 9381 return FALSE;
252b5132 9382
eea6121a 9383 sect2->size = sect->size;
252b5132 9384 sect2->filepos = sect->filepos;
252b5132 9385 sect2->alignment_power = sect->alignment_power;
b34976b6 9386 return TRUE;
252b5132
RH
9387}
9388
bb0082d6
AM
9389/* Create a pseudosection containing SIZE bytes at FILEPOS. This
9390 actually creates up to two pseudosections:
9391 - For the single-threaded case, a section named NAME, unless
9392 such a section already exists.
9393 - For the multi-threaded case, a section named "NAME/PID", where
9394 PID is elfcore_make_pid (abfd).
24d3e51b 9395 Both pseudosections have identical contents. */
b34976b6 9396bfd_boolean
217aa764
AM
9397_bfd_elfcore_make_pseudosection (bfd *abfd,
9398 char *name,
9399 size_t size,
9400 ufile_ptr filepos)
bb0082d6
AM
9401{
9402 char buf[100];
9403 char *threaded_name;
d4c88bbb 9404 size_t len;
bb0082d6
AM
9405 asection *sect;
9406
9407 /* Build the section name. */
9408
9409 sprintf (buf, "%s/%d", name, elfcore_make_pid (abfd));
d4c88bbb 9410 len = strlen (buf) + 1;
a50b1753 9411 threaded_name = (char *) bfd_alloc (abfd, len);
bb0082d6 9412 if (threaded_name == NULL)
b34976b6 9413 return FALSE;
d4c88bbb 9414 memcpy (threaded_name, buf, len);
bb0082d6 9415
117ed4f8
AM
9416 sect = bfd_make_section_anyway_with_flags (abfd, threaded_name,
9417 SEC_HAS_CONTENTS);
bb0082d6 9418 if (sect == NULL)
b34976b6 9419 return FALSE;
eea6121a 9420 sect->size = size;
bb0082d6 9421 sect->filepos = filepos;
bb0082d6
AM
9422 sect->alignment_power = 2;
9423
936e320b 9424 return elfcore_maybe_make_sect (abfd, name, sect);
bb0082d6
AM
9425}
9426
58e07198
CZ
9427static bfd_boolean
9428elfcore_make_auxv_note_section (bfd *abfd, Elf_Internal_Note *note,
9429 size_t offs)
9430{
9431 asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
9432 SEC_HAS_CONTENTS);
9433
9434 if (sect == NULL)
9435 return FALSE;
9436
9437 sect->size = note->descsz - offs;
9438 sect->filepos = note->descpos + offs;
9439 sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
9440
9441 return TRUE;
9442}
9443
252b5132 9444/* prstatus_t exists on:
4a938328 9445 solaris 2.5+
252b5132
RH
9446 linux 2.[01] + glibc
9447 unixware 4.2
9448*/
9449
9450#if defined (HAVE_PRSTATUS_T)
a7b97311 9451
b34976b6 9452static bfd_boolean
217aa764 9453elfcore_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132 9454{
eea6121a 9455 size_t size;
7ee38065 9456 int offset;
252b5132 9457
4a938328
MS
9458 if (note->descsz == sizeof (prstatus_t))
9459 {
9460 prstatus_t prstat;
252b5132 9461
eea6121a 9462 size = sizeof (prstat.pr_reg);
7ee38065 9463 offset = offsetof (prstatus_t, pr_reg);
4a938328 9464 memcpy (&prstat, note->descdata, sizeof (prstat));
252b5132 9465
fa49d224
NC
9466 /* Do not overwrite the core signal if it
9467 has already been set by another thread. */
228e534f
AM
9468 if (elf_tdata (abfd)->core->signal == 0)
9469 elf_tdata (abfd)->core->signal = prstat.pr_cursig;
9470 if (elf_tdata (abfd)->core->pid == 0)
9471 elf_tdata (abfd)->core->pid = prstat.pr_pid;
252b5132 9472
4a938328
MS
9473 /* pr_who exists on:
9474 solaris 2.5+
9475 unixware 4.2
9476 pr_who doesn't exist on:
9477 linux 2.[01]
9478 */
252b5132 9479#if defined (HAVE_PRSTATUS_T_PR_WHO)
228e534f 9480 elf_tdata (abfd)->core->lwpid = prstat.pr_who;
261b8d08 9481#else
228e534f 9482 elf_tdata (abfd)->core->lwpid = prstat.pr_pid;
252b5132 9483#endif
4a938328 9484 }
7ee38065 9485#if defined (HAVE_PRSTATUS32_T)
4a938328
MS
9486 else if (note->descsz == sizeof (prstatus32_t))
9487 {
9488 /* 64-bit host, 32-bit corefile */
9489 prstatus32_t prstat;
9490
eea6121a 9491 size = sizeof (prstat.pr_reg);
7ee38065 9492 offset = offsetof (prstatus32_t, pr_reg);
4a938328
MS
9493 memcpy (&prstat, note->descdata, sizeof (prstat));
9494
fa49d224
NC
9495 /* Do not overwrite the core signal if it
9496 has already been set by another thread. */
228e534f
AM
9497 if (elf_tdata (abfd)->core->signal == 0)
9498 elf_tdata (abfd)->core->signal = prstat.pr_cursig;
9499 if (elf_tdata (abfd)->core->pid == 0)
9500 elf_tdata (abfd)->core->pid = prstat.pr_pid;
4a938328
MS
9501
9502 /* pr_who exists on:
9503 solaris 2.5+
9504 unixware 4.2
9505 pr_who doesn't exist on:
9506 linux 2.[01]
9507 */
7ee38065 9508#if defined (HAVE_PRSTATUS32_T_PR_WHO)
228e534f 9509 elf_tdata (abfd)->core->lwpid = prstat.pr_who;
261b8d08 9510#else
228e534f 9511 elf_tdata (abfd)->core->lwpid = prstat.pr_pid;
4a938328
MS
9512#endif
9513 }
7ee38065 9514#endif /* HAVE_PRSTATUS32_T */
4a938328
MS
9515 else
9516 {
9517 /* Fail - we don't know how to handle any other
9518 note size (ie. data object type). */
b34976b6 9519 return TRUE;
4a938328 9520 }
252b5132 9521
bb0082d6 9522 /* Make a ".reg/999" section and a ".reg" section. */
936e320b 9523 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 9524 size, note->descpos + offset);
252b5132
RH
9525}
9526#endif /* defined (HAVE_PRSTATUS_T) */
9527
bb0082d6 9528/* Create a pseudosection containing the exact contents of NOTE. */
b34976b6 9529static bfd_boolean
217aa764
AM
9530elfcore_make_note_pseudosection (bfd *abfd,
9531 char *name,
9532 Elf_Internal_Note *note)
252b5132 9533{
936e320b
AM
9534 return _bfd_elfcore_make_pseudosection (abfd, name,
9535 note->descsz, note->descpos);
252b5132
RH
9536}
9537
ff08c6bb
JB
9538/* There isn't a consistent prfpregset_t across platforms,
9539 but it doesn't matter, because we don't have to pick this
c044fabd
KH
9540 data structure apart. */
9541
b34976b6 9542static bfd_boolean
217aa764 9543elfcore_grok_prfpreg (bfd *abfd, Elf_Internal_Note *note)
ff08c6bb
JB
9544{
9545 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
9546}
9547
ff08c6bb 9548/* Linux dumps the Intel SSE regs in a note named "LINUX" with a note
971d4640 9549 type of NT_PRXFPREG. Just include the whole note's contents
ff08c6bb 9550 literally. */
c044fabd 9551
b34976b6 9552static bfd_boolean
217aa764 9553elfcore_grok_prxfpreg (bfd *abfd, Elf_Internal_Note *note)
ff08c6bb
JB
9554{
9555 return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
9556}
9557
4339cae0
L
9558/* Linux dumps the Intel XSAVE extended state in a note named "LINUX"
9559 with a note type of NT_X86_XSTATE. Just include the whole note's
9560 contents literally. */
9561
9562static bfd_boolean
9563elfcore_grok_xstatereg (bfd *abfd, Elf_Internal_Note *note)
9564{
9565 return elfcore_make_note_pseudosection (abfd, ".reg-xstate", note);
9566}
9567
97753bd5
AM
9568static bfd_boolean
9569elfcore_grok_ppc_vmx (bfd *abfd, Elf_Internal_Note *note)
9570{
9571 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-vmx", note);
9572}
9573
89eeb0bc
LM
9574static bfd_boolean
9575elfcore_grok_ppc_vsx (bfd *abfd, Elf_Internal_Note *note)
9576{
9577 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-vsx", note);
9578}
97753bd5 9579
cb2366c1
EBM
9580static bfd_boolean
9581elfcore_grok_ppc_tar (bfd *abfd, Elf_Internal_Note *note)
9582{
9583 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tar", note);
9584}
9585
9586static bfd_boolean
9587elfcore_grok_ppc_ppr (bfd *abfd, Elf_Internal_Note *note)
9588{
9589 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-ppr", note);
9590}
9591
9592static bfd_boolean
9593elfcore_grok_ppc_dscr (bfd *abfd, Elf_Internal_Note *note)
9594{
9595 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-dscr", note);
9596}
9597
9598static bfd_boolean
9599elfcore_grok_ppc_ebb (bfd *abfd, Elf_Internal_Note *note)
9600{
9601 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-ebb", note);
9602}
9603
9604static bfd_boolean
9605elfcore_grok_ppc_pmu (bfd *abfd, Elf_Internal_Note *note)
9606{
9607 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-pmu", note);
9608}
9609
9610static bfd_boolean
9611elfcore_grok_ppc_tm_cgpr (bfd *abfd, Elf_Internal_Note *note)
9612{
9613 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cgpr", note);
9614}
9615
9616static bfd_boolean
9617elfcore_grok_ppc_tm_cfpr (bfd *abfd, Elf_Internal_Note *note)
9618{
9619 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cfpr", note);
9620}
9621
9622static bfd_boolean
9623elfcore_grok_ppc_tm_cvmx (bfd *abfd, Elf_Internal_Note *note)
9624{
9625 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cvmx", note);
9626}
9627
9628static bfd_boolean
9629elfcore_grok_ppc_tm_cvsx (bfd *abfd, Elf_Internal_Note *note)
9630{
9631 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cvsx", note);
9632}
9633
9634static bfd_boolean
9635elfcore_grok_ppc_tm_spr (bfd *abfd, Elf_Internal_Note *note)
9636{
9637 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-spr", note);
9638}
9639
9640static bfd_boolean
9641elfcore_grok_ppc_tm_ctar (bfd *abfd, Elf_Internal_Note *note)
9642{
9643 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-ctar", note);
9644}
9645
9646static bfd_boolean
9647elfcore_grok_ppc_tm_cppr (bfd *abfd, Elf_Internal_Note *note)
9648{
9649 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cppr", note);
9650}
9651
9652static bfd_boolean
9653elfcore_grok_ppc_tm_cdscr (bfd *abfd, Elf_Internal_Note *note)
9654{
9655 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cdscr", note);
9656}
9657
0675e188
UW
9658static bfd_boolean
9659elfcore_grok_s390_high_gprs (bfd *abfd, Elf_Internal_Note *note)
9660{
9661 return elfcore_make_note_pseudosection (abfd, ".reg-s390-high-gprs", note);
9662}
9663
d7eeb400
MS
9664static bfd_boolean
9665elfcore_grok_s390_timer (bfd *abfd, Elf_Internal_Note *note)
9666{
9667 return elfcore_make_note_pseudosection (abfd, ".reg-s390-timer", note);
9668}
9669
9670static bfd_boolean
9671elfcore_grok_s390_todcmp (bfd *abfd, Elf_Internal_Note *note)
9672{
9673 return elfcore_make_note_pseudosection (abfd, ".reg-s390-todcmp", note);
9674}
9675
9676static bfd_boolean
9677elfcore_grok_s390_todpreg (bfd *abfd, Elf_Internal_Note *note)
9678{
9679 return elfcore_make_note_pseudosection (abfd, ".reg-s390-todpreg", note);
9680}
9681
9682static bfd_boolean
9683elfcore_grok_s390_ctrs (bfd *abfd, Elf_Internal_Note *note)
9684{
9685 return elfcore_make_note_pseudosection (abfd, ".reg-s390-ctrs", note);
9686}
9687
9688static bfd_boolean
9689elfcore_grok_s390_prefix (bfd *abfd, Elf_Internal_Note *note)
9690{
9691 return elfcore_make_note_pseudosection (abfd, ".reg-s390-prefix", note);
9692}
9693
355b81d9
UW
9694static bfd_boolean
9695elfcore_grok_s390_last_break (bfd *abfd, Elf_Internal_Note *note)
9696{
9697 return elfcore_make_note_pseudosection (abfd, ".reg-s390-last-break", note);
9698}
9699
9700static bfd_boolean
9701elfcore_grok_s390_system_call (bfd *abfd, Elf_Internal_Note *note)
9702{
9703 return elfcore_make_note_pseudosection (abfd, ".reg-s390-system-call", note);
9704}
9705
abb3f6cc
NC
9706static bfd_boolean
9707elfcore_grok_s390_tdb (bfd *abfd, Elf_Internal_Note *note)
9708{
9709 return elfcore_make_note_pseudosection (abfd, ".reg-s390-tdb", note);
9710}
9711
4ef9f41a
AA
9712static bfd_boolean
9713elfcore_grok_s390_vxrs_low (bfd *abfd, Elf_Internal_Note *note)
9714{
9715 return elfcore_make_note_pseudosection (abfd, ".reg-s390-vxrs-low", note);
9716}
9717
9718static bfd_boolean
9719elfcore_grok_s390_vxrs_high (bfd *abfd, Elf_Internal_Note *note)
9720{
9721 return elfcore_make_note_pseudosection (abfd, ".reg-s390-vxrs-high", note);
9722}
9723
88ab90e8
AA
9724static bfd_boolean
9725elfcore_grok_s390_gs_cb (bfd *abfd, Elf_Internal_Note *note)
9726{
9727 return elfcore_make_note_pseudosection (abfd, ".reg-s390-gs-cb", note);
9728}
9729
9730static bfd_boolean
9731elfcore_grok_s390_gs_bc (bfd *abfd, Elf_Internal_Note *note)
9732{
9733 return elfcore_make_note_pseudosection (abfd, ".reg-s390-gs-bc", note);
9734}
9735
faa9a424
UW
9736static bfd_boolean
9737elfcore_grok_arm_vfp (bfd *abfd, Elf_Internal_Note *note)
9738{
9739 return elfcore_make_note_pseudosection (abfd, ".reg-arm-vfp", note);
9740}
9741
652451f8
YZ
9742static bfd_boolean
9743elfcore_grok_aarch_tls (bfd *abfd, Elf_Internal_Note *note)
9744{
9745 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-tls", note);
9746}
9747
9748static bfd_boolean
9749elfcore_grok_aarch_hw_break (bfd *abfd, Elf_Internal_Note *note)
9750{
9751 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-hw-break", note);
9752}
9753
9754static bfd_boolean
9755elfcore_grok_aarch_hw_watch (bfd *abfd, Elf_Internal_Note *note)
9756{
9757 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-hw-watch", note);
9758}
9759
ad1cc4e4
AH
9760static bfd_boolean
9761elfcore_grok_aarch_sve (bfd *abfd, Elf_Internal_Note *note)
9762{
9763 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-sve", note);
9764}
9765
e6c3b5bf
AH
9766static bfd_boolean
9767elfcore_grok_aarch_pauth (bfd *abfd, Elf_Internal_Note *note)
9768{
9769 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-pauth", note);
9770}
9771
252b5132 9772#if defined (HAVE_PRPSINFO_T)
4a938328 9773typedef prpsinfo_t elfcore_psinfo_t;
7ee38065 9774#if defined (HAVE_PRPSINFO32_T) /* Sparc64 cross Sparc32 */
4a938328
MS
9775typedef prpsinfo32_t elfcore_psinfo32_t;
9776#endif
252b5132
RH
9777#endif
9778
9779#if defined (HAVE_PSINFO_T)
4a938328 9780typedef psinfo_t elfcore_psinfo_t;
7ee38065 9781#if defined (HAVE_PSINFO32_T) /* Sparc64 cross Sparc32 */
4a938328
MS
9782typedef psinfo32_t elfcore_psinfo32_t;
9783#endif
252b5132
RH
9784#endif
9785
252b5132
RH
9786/* return a malloc'ed copy of a string at START which is at
9787 most MAX bytes long, possibly without a terminating '\0'.
c044fabd 9788 the copy will always have a terminating '\0'. */
252b5132 9789
936e320b 9790char *
217aa764 9791_bfd_elfcore_strndup (bfd *abfd, char *start, size_t max)
252b5132 9792{
dc810e39 9793 char *dups;
a50b1753 9794 char *end = (char *) memchr (start, '\0', max);
dc810e39 9795 size_t len;
252b5132
RH
9796
9797 if (end == NULL)
9798 len = max;
9799 else
9800 len = end - start;
9801
a50b1753 9802 dups = (char *) bfd_alloc (abfd, len + 1);
dc810e39 9803 if (dups == NULL)
252b5132
RH
9804 return NULL;
9805
dc810e39
AM
9806 memcpy (dups, start, len);
9807 dups[len] = '\0';
252b5132 9808
dc810e39 9809 return dups;
252b5132
RH
9810}
9811
bb0082d6 9812#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
b34976b6 9813static bfd_boolean
217aa764 9814elfcore_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
252b5132 9815{
4a938328
MS
9816 if (note->descsz == sizeof (elfcore_psinfo_t))
9817 {
9818 elfcore_psinfo_t psinfo;
252b5132 9819
7ee38065 9820 memcpy (&psinfo, note->descdata, sizeof (psinfo));
252b5132 9821
335e41d4 9822#if defined (HAVE_PSINFO_T_PR_PID) || defined (HAVE_PRPSINFO_T_PR_PID)
228e534f 9823 elf_tdata (abfd)->core->pid = psinfo.pr_pid;
335e41d4 9824#endif
228e534f 9825 elf_tdata (abfd)->core->program
936e320b
AM
9826 = _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
9827 sizeof (psinfo.pr_fname));
252b5132 9828
228e534f 9829 elf_tdata (abfd)->core->command
936e320b
AM
9830 = _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
9831 sizeof (psinfo.pr_psargs));
4a938328 9832 }
7ee38065 9833#if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
4a938328
MS
9834 else if (note->descsz == sizeof (elfcore_psinfo32_t))
9835 {
9836 /* 64-bit host, 32-bit corefile */
9837 elfcore_psinfo32_t psinfo;
9838
7ee38065 9839 memcpy (&psinfo, note->descdata, sizeof (psinfo));
252b5132 9840
335e41d4 9841#if defined (HAVE_PSINFO32_T_PR_PID) || defined (HAVE_PRPSINFO32_T_PR_PID)
228e534f 9842 elf_tdata (abfd)->core->pid = psinfo.pr_pid;
335e41d4 9843#endif
228e534f 9844 elf_tdata (abfd)->core->program
936e320b
AM
9845 = _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
9846 sizeof (psinfo.pr_fname));
4a938328 9847
228e534f 9848 elf_tdata (abfd)->core->command
936e320b
AM
9849 = _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
9850 sizeof (psinfo.pr_psargs));
4a938328
MS
9851 }
9852#endif
9853
9854 else
9855 {
9856 /* Fail - we don't know how to handle any other
9857 note size (ie. data object type). */
b34976b6 9858 return TRUE;
4a938328 9859 }
252b5132
RH
9860
9861 /* Note that for some reason, a spurious space is tacked
9862 onto the end of the args in some (at least one anyway)
c044fabd 9863 implementations, so strip it off if it exists. */
252b5132
RH
9864
9865 {
228e534f 9866 char *command = elf_tdata (abfd)->core->command;
252b5132
RH
9867 int n = strlen (command);
9868
9869 if (0 < n && command[n - 1] == ' ')
9870 command[n - 1] = '\0';
9871 }
9872
b34976b6 9873 return TRUE;
252b5132
RH
9874}
9875#endif /* defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T) */
9876
252b5132 9877#if defined (HAVE_PSTATUS_T)
b34976b6 9878static bfd_boolean
217aa764 9879elfcore_grok_pstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132 9880{
f572a39d
AM
9881 if (note->descsz == sizeof (pstatus_t)
9882#if defined (HAVE_PXSTATUS_T)
9883 || note->descsz == sizeof (pxstatus_t)
9884#endif
9885 )
4a938328
MS
9886 {
9887 pstatus_t pstat;
252b5132 9888
4a938328 9889 memcpy (&pstat, note->descdata, sizeof (pstat));
252b5132 9890
228e534f 9891 elf_tdata (abfd)->core->pid = pstat.pr_pid;
4a938328 9892 }
7ee38065 9893#if defined (HAVE_PSTATUS32_T)
4a938328
MS
9894 else if (note->descsz == sizeof (pstatus32_t))
9895 {
9896 /* 64-bit host, 32-bit corefile */
9897 pstatus32_t pstat;
252b5132 9898
4a938328 9899 memcpy (&pstat, note->descdata, sizeof (pstat));
252b5132 9900
228e534f 9901 elf_tdata (abfd)->core->pid = pstat.pr_pid;
4a938328
MS
9902 }
9903#endif
252b5132
RH
9904 /* Could grab some more details from the "representative"
9905 lwpstatus_t in pstat.pr_lwp, but we'll catch it all in an
c044fabd 9906 NT_LWPSTATUS note, presumably. */
252b5132 9907
b34976b6 9908 return TRUE;
252b5132
RH
9909}
9910#endif /* defined (HAVE_PSTATUS_T) */
9911
252b5132 9912#if defined (HAVE_LWPSTATUS_T)
b34976b6 9913static bfd_boolean
217aa764 9914elfcore_grok_lwpstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132
RH
9915{
9916 lwpstatus_t lwpstat;
9917 char buf[100];
c044fabd 9918 char *name;
d4c88bbb 9919 size_t len;
c044fabd 9920 asection *sect;
252b5132 9921
f572a39d
AM
9922 if (note->descsz != sizeof (lwpstat)
9923#if defined (HAVE_LWPXSTATUS_T)
9924 && note->descsz != sizeof (lwpxstatus_t)
9925#endif
9926 )
b34976b6 9927 return TRUE;
252b5132
RH
9928
9929 memcpy (&lwpstat, note->descdata, sizeof (lwpstat));
9930
228e534f 9931 elf_tdata (abfd)->core->lwpid = lwpstat.pr_lwpid;
a1504221
JB
9932 /* Do not overwrite the core signal if it has already been set by
9933 another thread. */
228e534f
AM
9934 if (elf_tdata (abfd)->core->signal == 0)
9935 elf_tdata (abfd)->core->signal = lwpstat.pr_cursig;
252b5132 9936
c044fabd 9937 /* Make a ".reg/999" section. */
252b5132
RH
9938
9939 sprintf (buf, ".reg/%d", elfcore_make_pid (abfd));
d4c88bbb 9940 len = strlen (buf) + 1;
217aa764 9941 name = bfd_alloc (abfd, len);
252b5132 9942 if (name == NULL)
b34976b6 9943 return FALSE;
d4c88bbb 9944 memcpy (name, buf, len);
252b5132 9945
117ed4f8 9946 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
252b5132 9947 if (sect == NULL)
b34976b6 9948 return FALSE;
252b5132
RH
9949
9950#if defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
eea6121a 9951 sect->size = sizeof (lwpstat.pr_context.uc_mcontext.gregs);
252b5132
RH
9952 sect->filepos = note->descpos
9953 + offsetof (lwpstatus_t, pr_context.uc_mcontext.gregs);
9954#endif
9955
9956#if defined (HAVE_LWPSTATUS_T_PR_REG)
eea6121a 9957 sect->size = sizeof (lwpstat.pr_reg);
252b5132
RH
9958 sect->filepos = note->descpos + offsetof (lwpstatus_t, pr_reg);
9959#endif
9960
252b5132
RH
9961 sect->alignment_power = 2;
9962
9963 if (!elfcore_maybe_make_sect (abfd, ".reg", sect))
b34976b6 9964 return FALSE;
252b5132
RH
9965
9966 /* Make a ".reg2/999" section */
9967
9968 sprintf (buf, ".reg2/%d", elfcore_make_pid (abfd));
d4c88bbb 9969 len = strlen (buf) + 1;
217aa764 9970 name = bfd_alloc (abfd, len);
252b5132 9971 if (name == NULL)
b34976b6 9972 return FALSE;
d4c88bbb 9973 memcpy (name, buf, len);
252b5132 9974
117ed4f8 9975 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
252b5132 9976 if (sect == NULL)
b34976b6 9977 return FALSE;
252b5132
RH
9978
9979#if defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
eea6121a 9980 sect->size = sizeof (lwpstat.pr_context.uc_mcontext.fpregs);
252b5132
RH
9981 sect->filepos = note->descpos
9982 + offsetof (lwpstatus_t, pr_context.uc_mcontext.fpregs);
9983#endif
9984
9985#if defined (HAVE_LWPSTATUS_T_PR_FPREG)
eea6121a 9986 sect->size = sizeof (lwpstat.pr_fpreg);
252b5132
RH
9987 sect->filepos = note->descpos + offsetof (lwpstatus_t, pr_fpreg);
9988#endif
9989
252b5132
RH
9990 sect->alignment_power = 2;
9991
936e320b 9992 return elfcore_maybe_make_sect (abfd, ".reg2", sect);
252b5132
RH
9993}
9994#endif /* defined (HAVE_LWPSTATUS_T) */
9995
b34976b6 9996static bfd_boolean
217aa764 9997elfcore_grok_win32pstatus (bfd *abfd, Elf_Internal_Note *note)
16e9c715
NC
9998{
9999 char buf[30];
c044fabd 10000 char *name;
d4c88bbb 10001 size_t len;
c044fabd 10002 asection *sect;
4a6636fb
PA
10003 int type;
10004 int is_active_thread;
10005 bfd_vma base_addr;
16e9c715 10006
4a6636fb 10007 if (note->descsz < 728)
b34976b6 10008 return TRUE;
16e9c715 10009
4a6636fb
PA
10010 if (! CONST_STRNEQ (note->namedata, "win32"))
10011 return TRUE;
10012
10013 type = bfd_get_32 (abfd, note->descdata);
c044fabd 10014
4a6636fb 10015 switch (type)
16e9c715 10016 {
4a6636fb 10017 case 1 /* NOTE_INFO_PROCESS */:
228e534f 10018 /* FIXME: need to add ->core->command. */
4a6636fb 10019 /* process_info.pid */
228e534f 10020 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 8);
4a6636fb 10021 /* process_info.signal */
228e534f 10022 elf_tdata (abfd)->core->signal = bfd_get_32 (abfd, note->descdata + 12);
c044fabd 10023 break;
16e9c715 10024
4a6636fb 10025 case 2 /* NOTE_INFO_THREAD */:
16e9c715 10026 /* Make a ".reg/999" section. */
4a6636fb
PA
10027 /* thread_info.tid */
10028 sprintf (buf, ".reg/%ld", (long) bfd_get_32 (abfd, note->descdata + 8));
c044fabd 10029
d4c88bbb 10030 len = strlen (buf) + 1;
a50b1753 10031 name = (char *) bfd_alloc (abfd, len);
16e9c715 10032 if (name == NULL)
b34976b6 10033 return FALSE;
c044fabd 10034
d4c88bbb 10035 memcpy (name, buf, len);
16e9c715 10036
117ed4f8 10037 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
16e9c715 10038 if (sect == NULL)
b34976b6 10039 return FALSE;
c044fabd 10040
4a6636fb
PA
10041 /* sizeof (thread_info.thread_context) */
10042 sect->size = 716;
10043 /* offsetof (thread_info.thread_context) */
10044 sect->filepos = note->descpos + 12;
16e9c715
NC
10045 sect->alignment_power = 2;
10046
4a6636fb
PA
10047 /* thread_info.is_active_thread */
10048 is_active_thread = bfd_get_32 (abfd, note->descdata + 8);
10049
10050 if (is_active_thread)
16e9c715 10051 if (! elfcore_maybe_make_sect (abfd, ".reg", sect))
b34976b6 10052 return FALSE;
16e9c715
NC
10053 break;
10054
4a6636fb 10055 case 3 /* NOTE_INFO_MODULE */:
16e9c715 10056 /* Make a ".module/xxxxxxxx" section. */
4a6636fb
PA
10057 /* module_info.base_address */
10058 base_addr = bfd_get_32 (abfd, note->descdata + 4);
0af1713e 10059 sprintf (buf, ".module/%08lx", (unsigned long) base_addr);
c044fabd 10060
d4c88bbb 10061 len = strlen (buf) + 1;
a50b1753 10062 name = (char *) bfd_alloc (abfd, len);
16e9c715 10063 if (name == NULL)
b34976b6 10064 return FALSE;
c044fabd 10065
d4c88bbb 10066 memcpy (name, buf, len);
252b5132 10067
117ed4f8 10068 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
c044fabd 10069
16e9c715 10070 if (sect == NULL)
b34976b6 10071 return FALSE;
c044fabd 10072
eea6121a 10073 sect->size = note->descsz;
16e9c715 10074 sect->filepos = note->descpos;
16e9c715
NC
10075 sect->alignment_power = 2;
10076 break;
10077
10078 default:
b34976b6 10079 return TRUE;
16e9c715
NC
10080 }
10081
b34976b6 10082 return TRUE;
16e9c715 10083}
252b5132 10084
b34976b6 10085static bfd_boolean
217aa764 10086elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
252b5132 10087{
9c5bfbb7 10088 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
bb0082d6 10089
252b5132
RH
10090 switch (note->type)
10091 {
10092 default:
b34976b6 10093 return TRUE;
252b5132 10094
252b5132 10095 case NT_PRSTATUS:
bb0082d6
AM
10096 if (bed->elf_backend_grok_prstatus)
10097 if ((*bed->elf_backend_grok_prstatus) (abfd, note))
b34976b6 10098 return TRUE;
bb0082d6 10099#if defined (HAVE_PRSTATUS_T)
252b5132 10100 return elfcore_grok_prstatus (abfd, note);
bb0082d6 10101#else
b34976b6 10102 return TRUE;
252b5132
RH
10103#endif
10104
10105#if defined (HAVE_PSTATUS_T)
10106 case NT_PSTATUS:
10107 return elfcore_grok_pstatus (abfd, note);
10108#endif
10109
10110#if defined (HAVE_LWPSTATUS_T)
10111 case NT_LWPSTATUS:
10112 return elfcore_grok_lwpstatus (abfd, note);
10113#endif
10114
10115 case NT_FPREGSET: /* FIXME: rename to NT_PRFPREG */
10116 return elfcore_grok_prfpreg (abfd, note);
10117
c044fabd 10118 case NT_WIN32PSTATUS:
16e9c715 10119 return elfcore_grok_win32pstatus (abfd, note);
16e9c715 10120
c044fabd 10121 case NT_PRXFPREG: /* Linux SSE extension */
e377ab71
MK
10122 if (note->namesz == 6
10123 && strcmp (note->namedata, "LINUX") == 0)
ff08c6bb
JB
10124 return elfcore_grok_prxfpreg (abfd, note);
10125 else
b34976b6 10126 return TRUE;
ff08c6bb 10127
4339cae0
L
10128 case NT_X86_XSTATE: /* Linux XSAVE extension */
10129 if (note->namesz == 6
10130 && strcmp (note->namedata, "LINUX") == 0)
10131 return elfcore_grok_xstatereg (abfd, note);
10132 else
10133 return TRUE;
10134
97753bd5
AM
10135 case NT_PPC_VMX:
10136 if (note->namesz == 6
10137 && strcmp (note->namedata, "LINUX") == 0)
10138 return elfcore_grok_ppc_vmx (abfd, note);
10139 else
10140 return TRUE;
10141
89eeb0bc
LM
10142 case NT_PPC_VSX:
10143 if (note->namesz == 6
07d6d2b8
AM
10144 && strcmp (note->namedata, "LINUX") == 0)
10145 return elfcore_grok_ppc_vsx (abfd, note);
89eeb0bc 10146 else
07d6d2b8 10147 return TRUE;
89eeb0bc 10148
cb2366c1
EBM
10149 case NT_PPC_TAR:
10150 if (note->namesz == 6
4b24dd1a
AM
10151 && strcmp (note->namedata, "LINUX") == 0)
10152 return elfcore_grok_ppc_tar (abfd, note);
cb2366c1 10153 else
4b24dd1a 10154 return TRUE;
cb2366c1
EBM
10155
10156 case NT_PPC_PPR:
10157 if (note->namesz == 6
4b24dd1a
AM
10158 && strcmp (note->namedata, "LINUX") == 0)
10159 return elfcore_grok_ppc_ppr (abfd, note);
cb2366c1 10160 else
4b24dd1a 10161 return TRUE;
cb2366c1
EBM
10162
10163 case NT_PPC_DSCR:
10164 if (note->namesz == 6
4b24dd1a
AM
10165 && strcmp (note->namedata, "LINUX") == 0)
10166 return elfcore_grok_ppc_dscr (abfd, note);
cb2366c1 10167 else
4b24dd1a 10168 return TRUE;
cb2366c1
EBM
10169
10170 case NT_PPC_EBB:
10171 if (note->namesz == 6
4b24dd1a
AM
10172 && strcmp (note->namedata, "LINUX") == 0)
10173 return elfcore_grok_ppc_ebb (abfd, note);
cb2366c1 10174 else
4b24dd1a 10175 return TRUE;
cb2366c1
EBM
10176
10177 case NT_PPC_PMU:
10178 if (note->namesz == 6
4b24dd1a
AM
10179 && strcmp (note->namedata, "LINUX") == 0)
10180 return elfcore_grok_ppc_pmu (abfd, note);
cb2366c1 10181 else
4b24dd1a 10182 return TRUE;
cb2366c1
EBM
10183
10184 case NT_PPC_TM_CGPR:
10185 if (note->namesz == 6
4b24dd1a
AM
10186 && strcmp (note->namedata, "LINUX") == 0)
10187 return elfcore_grok_ppc_tm_cgpr (abfd, note);
cb2366c1 10188 else
4b24dd1a 10189 return TRUE;
cb2366c1
EBM
10190
10191 case NT_PPC_TM_CFPR:
10192 if (note->namesz == 6
4b24dd1a
AM
10193 && strcmp (note->namedata, "LINUX") == 0)
10194 return elfcore_grok_ppc_tm_cfpr (abfd, note);
cb2366c1 10195 else
4b24dd1a 10196 return TRUE;
cb2366c1
EBM
10197
10198 case NT_PPC_TM_CVMX:
10199 if (note->namesz == 6
4b24dd1a
AM
10200 && strcmp (note->namedata, "LINUX") == 0)
10201 return elfcore_grok_ppc_tm_cvmx (abfd, note);
cb2366c1 10202 else
4b24dd1a 10203 return TRUE;
cb2366c1
EBM
10204
10205 case NT_PPC_TM_CVSX:
10206 if (note->namesz == 6
4b24dd1a
AM
10207 && strcmp (note->namedata, "LINUX") == 0)
10208 return elfcore_grok_ppc_tm_cvsx (abfd, note);
cb2366c1 10209 else
4b24dd1a 10210 return TRUE;
cb2366c1
EBM
10211
10212 case NT_PPC_TM_SPR:
10213 if (note->namesz == 6
4b24dd1a
AM
10214 && strcmp (note->namedata, "LINUX") == 0)
10215 return elfcore_grok_ppc_tm_spr (abfd, note);
cb2366c1 10216 else
4b24dd1a 10217 return TRUE;
cb2366c1
EBM
10218
10219 case NT_PPC_TM_CTAR:
10220 if (note->namesz == 6
4b24dd1a
AM
10221 && strcmp (note->namedata, "LINUX") == 0)
10222 return elfcore_grok_ppc_tm_ctar (abfd, note);
cb2366c1 10223 else
4b24dd1a 10224 return TRUE;
cb2366c1
EBM
10225
10226 case NT_PPC_TM_CPPR:
10227 if (note->namesz == 6
4b24dd1a
AM
10228 && strcmp (note->namedata, "LINUX") == 0)
10229 return elfcore_grok_ppc_tm_cppr (abfd, note);
cb2366c1 10230 else
4b24dd1a 10231 return TRUE;
cb2366c1
EBM
10232
10233 case NT_PPC_TM_CDSCR:
10234 if (note->namesz == 6
4b24dd1a
AM
10235 && strcmp (note->namedata, "LINUX") == 0)
10236 return elfcore_grok_ppc_tm_cdscr (abfd, note);
cb2366c1 10237 else
4b24dd1a 10238 return TRUE;
cb2366c1 10239
0675e188
UW
10240 case NT_S390_HIGH_GPRS:
10241 if (note->namesz == 6
07d6d2b8
AM
10242 && strcmp (note->namedata, "LINUX") == 0)
10243 return elfcore_grok_s390_high_gprs (abfd, note);
0675e188 10244 else
07d6d2b8 10245 return TRUE;
0675e188 10246
d7eeb400
MS
10247 case NT_S390_TIMER:
10248 if (note->namesz == 6
07d6d2b8
AM
10249 && strcmp (note->namedata, "LINUX") == 0)
10250 return elfcore_grok_s390_timer (abfd, note);
d7eeb400 10251 else
07d6d2b8 10252 return TRUE;
d7eeb400
MS
10253
10254 case NT_S390_TODCMP:
10255 if (note->namesz == 6
07d6d2b8
AM
10256 && strcmp (note->namedata, "LINUX") == 0)
10257 return elfcore_grok_s390_todcmp (abfd, note);
d7eeb400 10258 else
07d6d2b8 10259 return TRUE;
d7eeb400
MS
10260
10261 case NT_S390_TODPREG:
10262 if (note->namesz == 6
07d6d2b8
AM
10263 && strcmp (note->namedata, "LINUX") == 0)
10264 return elfcore_grok_s390_todpreg (abfd, note);
d7eeb400 10265 else
07d6d2b8 10266 return TRUE;
d7eeb400
MS
10267
10268 case NT_S390_CTRS:
10269 if (note->namesz == 6
07d6d2b8
AM
10270 && strcmp (note->namedata, "LINUX") == 0)
10271 return elfcore_grok_s390_ctrs (abfd, note);
d7eeb400 10272 else
07d6d2b8 10273 return TRUE;
d7eeb400
MS
10274
10275 case NT_S390_PREFIX:
10276 if (note->namesz == 6
07d6d2b8
AM
10277 && strcmp (note->namedata, "LINUX") == 0)
10278 return elfcore_grok_s390_prefix (abfd, note);
d7eeb400 10279 else
07d6d2b8 10280 return TRUE;
d7eeb400 10281
355b81d9
UW
10282 case NT_S390_LAST_BREAK:
10283 if (note->namesz == 6
07d6d2b8
AM
10284 && strcmp (note->namedata, "LINUX") == 0)
10285 return elfcore_grok_s390_last_break (abfd, note);
355b81d9 10286 else
07d6d2b8 10287 return TRUE;
355b81d9
UW
10288
10289 case NT_S390_SYSTEM_CALL:
10290 if (note->namesz == 6
07d6d2b8
AM
10291 && strcmp (note->namedata, "LINUX") == 0)
10292 return elfcore_grok_s390_system_call (abfd, note);
355b81d9 10293 else
07d6d2b8 10294 return TRUE;
355b81d9 10295
abb3f6cc
NC
10296 case NT_S390_TDB:
10297 if (note->namesz == 6
07d6d2b8
AM
10298 && strcmp (note->namedata, "LINUX") == 0)
10299 return elfcore_grok_s390_tdb (abfd, note);
abb3f6cc 10300 else
07d6d2b8 10301 return TRUE;
abb3f6cc 10302
4ef9f41a
AA
10303 case NT_S390_VXRS_LOW:
10304 if (note->namesz == 6
10305 && strcmp (note->namedata, "LINUX") == 0)
10306 return elfcore_grok_s390_vxrs_low (abfd, note);
10307 else
10308 return TRUE;
10309
10310 case NT_S390_VXRS_HIGH:
10311 if (note->namesz == 6
10312 && strcmp (note->namedata, "LINUX") == 0)
10313 return elfcore_grok_s390_vxrs_high (abfd, note);
10314 else
10315 return TRUE;
10316
88ab90e8
AA
10317 case NT_S390_GS_CB:
10318 if (note->namesz == 6
10319 && strcmp (note->namedata, "LINUX") == 0)
8fe09d74 10320 return elfcore_grok_s390_gs_cb (abfd, note);
88ab90e8
AA
10321 else
10322 return TRUE;
10323
10324 case NT_S390_GS_BC:
10325 if (note->namesz == 6
10326 && strcmp (note->namedata, "LINUX") == 0)
8fe09d74 10327 return elfcore_grok_s390_gs_bc (abfd, note);
88ab90e8
AA
10328 else
10329 return TRUE;
10330
faa9a424
UW
10331 case NT_ARM_VFP:
10332 if (note->namesz == 6
10333 && strcmp (note->namedata, "LINUX") == 0)
10334 return elfcore_grok_arm_vfp (abfd, note);
10335 else
10336 return TRUE;
10337
652451f8
YZ
10338 case NT_ARM_TLS:
10339 if (note->namesz == 6
10340 && strcmp (note->namedata, "LINUX") == 0)
10341 return elfcore_grok_aarch_tls (abfd, note);
10342 else
10343 return TRUE;
10344
10345 case NT_ARM_HW_BREAK:
10346 if (note->namesz == 6
10347 && strcmp (note->namedata, "LINUX") == 0)
10348 return elfcore_grok_aarch_hw_break (abfd, note);
10349 else
10350 return TRUE;
10351
10352 case NT_ARM_HW_WATCH:
10353 if (note->namesz == 6
10354 && strcmp (note->namedata, "LINUX") == 0)
10355 return elfcore_grok_aarch_hw_watch (abfd, note);
10356 else
10357 return TRUE;
10358
ad1cc4e4
AH
10359 case NT_ARM_SVE:
10360 if (note->namesz == 6
10361 && strcmp (note->namedata, "LINUX") == 0)
10362 return elfcore_grok_aarch_sve (abfd, note);
10363 else
10364 return TRUE;
10365
e6c3b5bf
AH
10366 case NT_ARM_PAC_MASK:
10367 if (note->namesz == 6
10368 && strcmp (note->namedata, "LINUX") == 0)
10369 return elfcore_grok_aarch_pauth (abfd, note);
10370 else
10371 return TRUE;
10372
252b5132
RH
10373 case NT_PRPSINFO:
10374 case NT_PSINFO:
bb0082d6
AM
10375 if (bed->elf_backend_grok_psinfo)
10376 if ((*bed->elf_backend_grok_psinfo) (abfd, note))
b34976b6 10377 return TRUE;
bb0082d6 10378#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
252b5132 10379 return elfcore_grok_psinfo (abfd, note);
bb0082d6 10380#else
b34976b6 10381 return TRUE;
252b5132 10382#endif
3333a7c3
RM
10383
10384 case NT_AUXV:
58e07198 10385 return elfcore_make_auxv_note_section (abfd, note, 0);
9015683b 10386
451b7c33
TT
10387 case NT_FILE:
10388 return elfcore_make_note_pseudosection (abfd, ".note.linuxcore.file",
10389 note);
10390
9015683b
TT
10391 case NT_SIGINFO:
10392 return elfcore_make_note_pseudosection (abfd, ".note.linuxcore.siginfo",
10393 note);
5b2c414d 10394
252b5132
RH
10395 }
10396}
10397
718175fa
JK
10398static bfd_boolean
10399elfobj_grok_gnu_build_id (bfd *abfd, Elf_Internal_Note *note)
10400{
c74f7d1c 10401 struct bfd_build_id* build_id;
30e8ee25
AM
10402
10403 if (note->descsz == 0)
10404 return FALSE;
10405
c74f7d1c
JT
10406 build_id = bfd_alloc (abfd, sizeof (struct bfd_build_id) - 1 + note->descsz);
10407 if (build_id == NULL)
718175fa
JK
10408 return FALSE;
10409
c74f7d1c
JT
10410 build_id->size = note->descsz;
10411 memcpy (build_id->data, note->descdata, note->descsz);
10412 abfd->build_id = build_id;
718175fa
JK
10413
10414 return TRUE;
10415}
10416
10417static bfd_boolean
10418elfobj_grok_gnu_note (bfd *abfd, Elf_Internal_Note *note)
10419{
10420 switch (note->type)
10421 {
10422 default:
10423 return TRUE;
10424
46bed679
L
10425 case NT_GNU_PROPERTY_TYPE_0:
10426 return _bfd_elf_parse_gnu_properties (abfd, note);
10427
718175fa
JK
10428 case NT_GNU_BUILD_ID:
10429 return elfobj_grok_gnu_build_id (abfd, note);
10430 }
10431}
10432
e21e5835
NC
10433static bfd_boolean
10434elfobj_grok_stapsdt_note_1 (bfd *abfd, Elf_Internal_Note *note)
10435{
10436 struct sdt_note *cur =
7a6e0d89
AM
10437 (struct sdt_note *) bfd_alloc (abfd,
10438 sizeof (struct sdt_note) + note->descsz);
e21e5835
NC
10439
10440 cur->next = (struct sdt_note *) (elf_tdata (abfd))->sdt_note_head;
10441 cur->size = (bfd_size_type) note->descsz;
10442 memcpy (cur->data, note->descdata, note->descsz);
10443
10444 elf_tdata (abfd)->sdt_note_head = cur;
10445
10446 return TRUE;
10447}
10448
10449static bfd_boolean
10450elfobj_grok_stapsdt_note (bfd *abfd, Elf_Internal_Note *note)
10451{
10452 switch (note->type)
10453 {
10454 case NT_STAPSDT:
10455 return elfobj_grok_stapsdt_note_1 (abfd, note);
10456
10457 default:
10458 return TRUE;
10459 }
10460}
10461
aa1ed4a9
JB
10462static bfd_boolean
10463elfcore_grok_freebsd_psinfo (bfd *abfd, Elf_Internal_Note *note)
10464{
10465 size_t offset;
10466
b5430a3c 10467 switch (elf_elfheader (abfd)->e_ident[EI_CLASS])
aa1ed4a9 10468 {
b5430a3c 10469 case ELFCLASS32:
0064d223
JB
10470 if (note->descsz < 108)
10471 return FALSE;
aa1ed4a9
JB
10472 break;
10473
b5430a3c 10474 case ELFCLASS64:
0064d223
JB
10475 if (note->descsz < 120)
10476 return FALSE;
aa1ed4a9
JB
10477 break;
10478
10479 default:
10480 return FALSE;
10481 }
10482
0064d223
JB
10483 /* Check for version 1 in pr_version. */
10484 if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
10485 return FALSE;
80a04378 10486
0064d223
JB
10487 offset = 4;
10488
10489 /* Skip over pr_psinfosz. */
b5430a3c 10490 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS32)
0064d223
JB
10491 offset += 4;
10492 else
10493 {
10494 offset += 4; /* Padding before pr_psinfosz. */
10495 offset += 8;
10496 }
10497
aa1ed4a9
JB
10498 /* pr_fname is PRFNAMESZ (16) + 1 bytes in size. */
10499 elf_tdata (abfd)->core->program
10500 = _bfd_elfcore_strndup (abfd, note->descdata + offset, 17);
10501 offset += 17;
10502
10503 /* pr_psargs is PRARGSZ (80) + 1 bytes in size. */
10504 elf_tdata (abfd)->core->command
10505 = _bfd_elfcore_strndup (abfd, note->descdata + offset, 81);
0064d223
JB
10506 offset += 81;
10507
10508 /* Padding before pr_pid. */
10509 offset += 2;
10510
10511 /* The pr_pid field was added in version "1a". */
10512 if (note->descsz < offset + 4)
10513 return TRUE;
10514
10515 elf_tdata (abfd)->core->pid
10516 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
aa1ed4a9
JB
10517
10518 return TRUE;
10519}
10520
10521static bfd_boolean
10522elfcore_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note)
10523{
10524 size_t offset;
10525 size_t size;
24d3e51b 10526 size_t min_size;
aa1ed4a9 10527
24d3e51b
NC
10528 /* Compute offset of pr_getregsz, skipping over pr_statussz.
10529 Also compute minimum size of this note. */
b5430a3c 10530 switch (elf_elfheader (abfd)->e_ident[EI_CLASS])
aa1ed4a9 10531 {
b5430a3c 10532 case ELFCLASS32:
24d3e51b
NC
10533 offset = 4 + 4;
10534 min_size = offset + (4 * 2) + 4 + 4 + 4;
aa1ed4a9
JB
10535 break;
10536
b5430a3c 10537 case ELFCLASS64:
24d3e51b
NC
10538 offset = 4 + 4 + 8; /* Includes padding before pr_statussz. */
10539 min_size = offset + (8 * 2) + 4 + 4 + 4 + 4;
aa1ed4a9
JB
10540 break;
10541
10542 default:
10543 return FALSE;
10544 }
10545
24d3e51b
NC
10546 if (note->descsz < min_size)
10547 return FALSE;
10548
10549 /* Check for version 1 in pr_version. */
10550 if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
10551 return FALSE;
aa1ed4a9 10552
24d3e51b
NC
10553 /* Extract size of pr_reg from pr_gregsetsz. */
10554 /* Skip over pr_gregsetsz and pr_fpregsetsz. */
b5430a3c 10555 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS32)
24d3e51b
NC
10556 {
10557 size = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
10558 offset += 4 * 2;
10559 }
b5430a3c 10560 else
24d3e51b
NC
10561 {
10562 size = bfd_h_get_64 (abfd, (bfd_byte *) note->descdata + offset);
10563 offset += 8 * 2;
10564 }
aa1ed4a9 10565
24d3e51b 10566 /* Skip over pr_osreldate. */
aa1ed4a9
JB
10567 offset += 4;
10568
24d3e51b 10569 /* Read signal from pr_cursig. */
aa1ed4a9
JB
10570 if (elf_tdata (abfd)->core->signal == 0)
10571 elf_tdata (abfd)->core->signal
10572 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
10573 offset += 4;
10574
24d3e51b 10575 /* Read TID from pr_pid. */
aa1ed4a9
JB
10576 elf_tdata (abfd)->core->lwpid
10577 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
10578 offset += 4;
10579
24d3e51b 10580 /* Padding before pr_reg. */
b5430a3c 10581 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64)
aa1ed4a9
JB
10582 offset += 4;
10583
24d3e51b
NC
10584 /* Make sure that there is enough data remaining in the note. */
10585 if ((note->descsz - offset) < size)
10586 return FALSE;
10587
aa1ed4a9
JB
10588 /* Make a ".reg/999" section and a ".reg" section. */
10589 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
10590 size, note->descpos + offset);
10591}
10592
10593static bfd_boolean
10594elfcore_grok_freebsd_note (bfd *abfd, Elf_Internal_Note *note)
10595{
544c67cd
JB
10596 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
10597
aa1ed4a9
JB
10598 switch (note->type)
10599 {
10600 case NT_PRSTATUS:
544c67cd
JB
10601 if (bed->elf_backend_grok_freebsd_prstatus)
10602 if ((*bed->elf_backend_grok_freebsd_prstatus) (abfd, note))
10603 return TRUE;
aa1ed4a9
JB
10604 return elfcore_grok_freebsd_prstatus (abfd, note);
10605
10606 case NT_FPREGSET:
10607 return elfcore_grok_prfpreg (abfd, note);
10608
10609 case NT_PRPSINFO:
10610 return elfcore_grok_freebsd_psinfo (abfd, note);
10611
10612 case NT_FREEBSD_THRMISC:
10613 if (note->namesz == 8)
10614 return elfcore_make_note_pseudosection (abfd, ".thrmisc", note);
10615 else
10616 return TRUE;
10617
ddb2bbcf
JB
10618 case NT_FREEBSD_PROCSTAT_PROC:
10619 return elfcore_make_note_pseudosection (abfd, ".note.freebsdcore.proc",
10620 note);
10621
10622 case NT_FREEBSD_PROCSTAT_FILES:
10623 return elfcore_make_note_pseudosection (abfd, ".note.freebsdcore.files",
10624 note);
10625
10626 case NT_FREEBSD_PROCSTAT_VMMAP:
10627 return elfcore_make_note_pseudosection (abfd, ".note.freebsdcore.vmmap",
10628 note);
10629
3350c5f5 10630 case NT_FREEBSD_PROCSTAT_AUXV:
58e07198 10631 return elfcore_make_auxv_note_section (abfd, note, 4);
3350c5f5 10632
aa1ed4a9
JB
10633 case NT_X86_XSTATE:
10634 if (note->namesz == 8)
10635 return elfcore_grok_xstatereg (abfd, note);
10636 else
10637 return TRUE;
10638
e6f3b9c3
JB
10639 case NT_FREEBSD_PTLWPINFO:
10640 return elfcore_make_note_pseudosection (abfd, ".note.freebsdcore.lwpinfo",
10641 note);
10642
6d5be5d6
JB
10643 case NT_ARM_VFP:
10644 return elfcore_grok_arm_vfp (abfd, note);
10645
aa1ed4a9
JB
10646 default:
10647 return TRUE;
10648 }
10649}
10650
b34976b6 10651static bfd_boolean
217aa764 10652elfcore_netbsd_get_lwpid (Elf_Internal_Note *note, int *lwpidp)
50b2bdb7
AM
10653{
10654 char *cp;
10655
10656 cp = strchr (note->namedata, '@');
10657 if (cp != NULL)
10658 {
d2b64500 10659 *lwpidp = atoi(cp + 1);
b34976b6 10660 return TRUE;
50b2bdb7 10661 }
b34976b6 10662 return FALSE;
50b2bdb7
AM
10663}
10664
b34976b6 10665static bfd_boolean
217aa764 10666elfcore_grok_netbsd_procinfo (bfd *abfd, Elf_Internal_Note *note)
50b2bdb7 10667{
80a04378
NC
10668 if (note->descsz <= 0x7c + 31)
10669 return FALSE;
10670
50b2bdb7 10671 /* Signal number at offset 0x08. */
228e534f 10672 elf_tdata (abfd)->core->signal
50b2bdb7
AM
10673 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x08);
10674
10675 /* Process ID at offset 0x50. */
228e534f 10676 elf_tdata (abfd)->core->pid
50b2bdb7
AM
10677 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x50);
10678
10679 /* Command name at 0x7c (max 32 bytes, including nul). */
228e534f 10680 elf_tdata (abfd)->core->command
50b2bdb7
AM
10681 = _bfd_elfcore_strndup (abfd, note->descdata + 0x7c, 31);
10682
7720ba9f
MK
10683 return elfcore_make_note_pseudosection (abfd, ".note.netbsdcore.procinfo",
10684 note);
50b2bdb7
AM
10685}
10686
b34976b6 10687static bfd_boolean
217aa764 10688elfcore_grok_netbsd_note (bfd *abfd, Elf_Internal_Note *note)
50b2bdb7
AM
10689{
10690 int lwp;
10691
10692 if (elfcore_netbsd_get_lwpid (note, &lwp))
228e534f 10693 elf_tdata (abfd)->core->lwpid = lwp;
50b2bdb7 10694
58e07198 10695 switch (note->type)
50b2bdb7 10696 {
58e07198 10697 case NT_NETBSDCORE_PROCINFO:
50b2bdb7 10698 /* NetBSD-specific core "procinfo". Note that we expect to
08a40648
AM
10699 find this note before any of the others, which is fine,
10700 since the kernel writes this note out first when it
10701 creates a core file. */
50b2bdb7 10702 return elfcore_grok_netbsd_procinfo (abfd, note);
58e07198
CZ
10703#ifdef NT_NETBSDCORE_AUXV
10704 case NT_NETBSDCORE_AUXV:
10705 /* NetBSD-specific Elf Auxiliary Vector data. */
10706 return elfcore_make_auxv_note_section (abfd, note, 4);
10707#endif
10708 default:
10709 break;
50b2bdb7
AM
10710 }
10711
58e07198 10712 /* As of March 2017 there are no other machine-independent notes
b4db1224
JT
10713 defined for NetBSD core files. If the note type is less
10714 than the start of the machine-dependent note types, we don't
10715 understand it. */
47d9a591 10716
b4db1224 10717 if (note->type < NT_NETBSDCORE_FIRSTMACH)
b34976b6 10718 return TRUE;
50b2bdb7
AM
10719
10720
10721 switch (bfd_get_arch (abfd))
10722 {
08a40648
AM
10723 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0 and
10724 PT_GETFPREGS == mach+2. */
50b2bdb7
AM
10725
10726 case bfd_arch_alpha:
10727 case bfd_arch_sparc:
10728 switch (note->type)
08a40648
AM
10729 {
10730 case NT_NETBSDCORE_FIRSTMACH+0:
10731 return elfcore_make_note_pseudosection (abfd, ".reg", note);
50b2bdb7 10732
08a40648
AM
10733 case NT_NETBSDCORE_FIRSTMACH+2:
10734 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
50b2bdb7 10735
08a40648
AM
10736 default:
10737 return TRUE;
10738 }
50b2bdb7 10739
58e07198
CZ
10740 /* On SuperH, PT_GETREGS == mach+3 and PT_GETFPREGS == mach+5.
10741 There's also old PT___GETREGS40 == mach + 1 for old reg
10742 structure which lacks GBR. */
10743
10744 case bfd_arch_sh:
10745 switch (note->type)
10746 {
10747 case NT_NETBSDCORE_FIRSTMACH+3:
10748 return elfcore_make_note_pseudosection (abfd, ".reg", note);
10749
10750 case NT_NETBSDCORE_FIRSTMACH+5:
10751 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
10752
10753 default:
10754 return TRUE;
10755 }
10756
08a40648
AM
10757 /* On all other arch's, PT_GETREGS == mach+1 and
10758 PT_GETFPREGS == mach+3. */
50b2bdb7
AM
10759
10760 default:
10761 switch (note->type)
08a40648
AM
10762 {
10763 case NT_NETBSDCORE_FIRSTMACH+1:
10764 return elfcore_make_note_pseudosection (abfd, ".reg", note);
50b2bdb7 10765
08a40648
AM
10766 case NT_NETBSDCORE_FIRSTMACH+3:
10767 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
50b2bdb7 10768
08a40648
AM
10769 default:
10770 return TRUE;
10771 }
50b2bdb7
AM
10772 }
10773 /* NOTREACHED */
10774}
10775
67cc5033
MK
10776static bfd_boolean
10777elfcore_grok_openbsd_procinfo (bfd *abfd, Elf_Internal_Note *note)
10778{
80a04378
NC
10779 if (note->descsz <= 0x48 + 31)
10780 return FALSE;
10781
67cc5033 10782 /* Signal number at offset 0x08. */
228e534f 10783 elf_tdata (abfd)->core->signal
67cc5033
MK
10784 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x08);
10785
10786 /* Process ID at offset 0x20. */
228e534f 10787 elf_tdata (abfd)->core->pid
67cc5033
MK
10788 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x20);
10789
10790 /* Command name at 0x48 (max 32 bytes, including nul). */
228e534f 10791 elf_tdata (abfd)->core->command
67cc5033
MK
10792 = _bfd_elfcore_strndup (abfd, note->descdata + 0x48, 31);
10793
10794 return TRUE;
10795}
10796
10797static bfd_boolean
10798elfcore_grok_openbsd_note (bfd *abfd, Elf_Internal_Note *note)
10799{
10800 if (note->type == NT_OPENBSD_PROCINFO)
10801 return elfcore_grok_openbsd_procinfo (abfd, note);
10802
10803 if (note->type == NT_OPENBSD_REGS)
10804 return elfcore_make_note_pseudosection (abfd, ".reg", note);
10805
10806 if (note->type == NT_OPENBSD_FPREGS)
10807 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
10808
10809 if (note->type == NT_OPENBSD_XFPREGS)
10810 return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
10811
10812 if (note->type == NT_OPENBSD_AUXV)
58e07198 10813 return elfcore_make_auxv_note_section (abfd, note, 0);
67cc5033
MK
10814
10815 if (note->type == NT_OPENBSD_WCOOKIE)
10816 {
10817 asection *sect = bfd_make_section_anyway_with_flags (abfd, ".wcookie",
10818 SEC_HAS_CONTENTS);
10819
10820 if (sect == NULL)
10821 return FALSE;
10822 sect->size = note->descsz;
10823 sect->filepos = note->descpos;
10824 sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
10825
10826 return TRUE;
10827 }
10828
10829 return TRUE;
10830}
10831
07c6e936 10832static bfd_boolean
d3fd4074 10833elfcore_grok_nto_status (bfd *abfd, Elf_Internal_Note *note, long *tid)
07c6e936
NC
10834{
10835 void *ddata = note->descdata;
10836 char buf[100];
10837 char *name;
10838 asection *sect;
f8843e87
AM
10839 short sig;
10840 unsigned flags;
07c6e936 10841
80a04378
NC
10842 if (note->descsz < 16)
10843 return FALSE;
10844
07c6e936 10845 /* nto_procfs_status 'pid' field is at offset 0. */
228e534f 10846 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, (bfd_byte *) ddata);
07c6e936 10847
f8843e87
AM
10848 /* nto_procfs_status 'tid' field is at offset 4. Pass it back. */
10849 *tid = bfd_get_32 (abfd, (bfd_byte *) ddata + 4);
10850
10851 /* nto_procfs_status 'flags' field is at offset 8. */
10852 flags = bfd_get_32 (abfd, (bfd_byte *) ddata + 8);
07c6e936
NC
10853
10854 /* nto_procfs_status 'what' field is at offset 14. */
f8843e87
AM
10855 if ((sig = bfd_get_16 (abfd, (bfd_byte *) ddata + 14)) > 0)
10856 {
228e534f
AM
10857 elf_tdata (abfd)->core->signal = sig;
10858 elf_tdata (abfd)->core->lwpid = *tid;
f8843e87 10859 }
07c6e936 10860
f8843e87
AM
10861 /* _DEBUG_FLAG_CURTID (current thread) is 0x80. Some cores
10862 do not come from signals so we make sure we set the current
10863 thread just in case. */
10864 if (flags & 0x00000080)
228e534f 10865 elf_tdata (abfd)->core->lwpid = *tid;
07c6e936
NC
10866
10867 /* Make a ".qnx_core_status/%d" section. */
d3fd4074 10868 sprintf (buf, ".qnx_core_status/%ld", *tid);
07c6e936 10869
a50b1753 10870 name = (char *) bfd_alloc (abfd, strlen (buf) + 1);
07c6e936
NC
10871 if (name == NULL)
10872 return FALSE;
10873 strcpy (name, buf);
10874
117ed4f8 10875 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
07c6e936
NC
10876 if (sect == NULL)
10877 return FALSE;
10878
07d6d2b8
AM
10879 sect->size = note->descsz;
10880 sect->filepos = note->descpos;
07c6e936
NC
10881 sect->alignment_power = 2;
10882
10883 return (elfcore_maybe_make_sect (abfd, ".qnx_core_status", sect));
10884}
10885
10886static bfd_boolean
d69f560c
KW
10887elfcore_grok_nto_regs (bfd *abfd,
10888 Elf_Internal_Note *note,
d3fd4074 10889 long tid,
d69f560c 10890 char *base)
07c6e936
NC
10891{
10892 char buf[100];
10893 char *name;
10894 asection *sect;
10895
d69f560c 10896 /* Make a "(base)/%d" section. */
d3fd4074 10897 sprintf (buf, "%s/%ld", base, tid);
07c6e936 10898
a50b1753 10899 name = (char *) bfd_alloc (abfd, strlen (buf) + 1);
07c6e936
NC
10900 if (name == NULL)
10901 return FALSE;
10902 strcpy (name, buf);
10903
117ed4f8 10904 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
07c6e936
NC
10905 if (sect == NULL)
10906 return FALSE;
10907
07d6d2b8
AM
10908 sect->size = note->descsz;
10909 sect->filepos = note->descpos;
07c6e936
NC
10910 sect->alignment_power = 2;
10911
f8843e87 10912 /* This is the current thread. */
228e534f 10913 if (elf_tdata (abfd)->core->lwpid == tid)
d69f560c 10914 return elfcore_maybe_make_sect (abfd, base, sect);
f8843e87
AM
10915
10916 return TRUE;
07c6e936
NC
10917}
10918
10919#define BFD_QNT_CORE_INFO 7
10920#define BFD_QNT_CORE_STATUS 8
10921#define BFD_QNT_CORE_GREG 9
10922#define BFD_QNT_CORE_FPREG 10
10923
10924static bfd_boolean
217aa764 10925elfcore_grok_nto_note (bfd *abfd, Elf_Internal_Note *note)
07c6e936
NC
10926{
10927 /* Every GREG section has a STATUS section before it. Store the
811072d8 10928 tid from the previous call to pass down to the next gregs
07c6e936 10929 function. */
d3fd4074 10930 static long tid = 1;
07c6e936
NC
10931
10932 switch (note->type)
10933 {
d69f560c
KW
10934 case BFD_QNT_CORE_INFO:
10935 return elfcore_make_note_pseudosection (abfd, ".qnx_core_info", note);
10936 case BFD_QNT_CORE_STATUS:
10937 return elfcore_grok_nto_status (abfd, note, &tid);
10938 case BFD_QNT_CORE_GREG:
10939 return elfcore_grok_nto_regs (abfd, note, tid, ".reg");
10940 case BFD_QNT_CORE_FPREG:
10941 return elfcore_grok_nto_regs (abfd, note, tid, ".reg2");
10942 default:
10943 return TRUE;
07c6e936
NC
10944 }
10945}
10946
b15fa79e
AM
10947static bfd_boolean
10948elfcore_grok_spu_note (bfd *abfd, Elf_Internal_Note *note)
10949{
10950 char *name;
10951 asection *sect;
10952 size_t len;
10953
10954 /* Use note name as section name. */
10955 len = note->namesz;
a50b1753 10956 name = (char *) bfd_alloc (abfd, len);
b15fa79e
AM
10957 if (name == NULL)
10958 return FALSE;
10959 memcpy (name, note->namedata, len);
10960 name[len - 1] = '\0';
10961
10962 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
10963 if (sect == NULL)
10964 return FALSE;
10965
07d6d2b8
AM
10966 sect->size = note->descsz;
10967 sect->filepos = note->descpos;
b15fa79e
AM
10968 sect->alignment_power = 1;
10969
10970 return TRUE;
10971}
10972
7c76fa91
MS
10973/* Function: elfcore_write_note
10974
47d9a591 10975 Inputs:
a39f3346 10976 buffer to hold note, and current size of buffer
7c76fa91
MS
10977 name of note
10978 type of note
10979 data for note
10980 size of data for note
10981
a39f3346
AM
10982 Writes note to end of buffer. ELF64 notes are written exactly as
10983 for ELF32, despite the current (as of 2006) ELF gabi specifying
10984 that they ought to have 8-byte namesz and descsz field, and have
10985 8-byte alignment. Other writers, eg. Linux kernel, do the same.
10986
7c76fa91 10987 Return:
a39f3346 10988 Pointer to realloc'd buffer, *BUFSIZ updated. */
7c76fa91
MS
10989
10990char *
a39f3346 10991elfcore_write_note (bfd *abfd,
217aa764 10992 char *buf,
a39f3346 10993 int *bufsiz,
217aa764 10994 const char *name,
a39f3346 10995 int type,
217aa764 10996 const void *input,
a39f3346 10997 int size)
7c76fa91
MS
10998{
10999 Elf_External_Note *xnp;
d4c88bbb 11000 size_t namesz;
d4c88bbb 11001 size_t newspace;
a39f3346 11002 char *dest;
7c76fa91 11003
d4c88bbb 11004 namesz = 0;
d4c88bbb 11005 if (name != NULL)
a39f3346 11006 namesz = strlen (name) + 1;
d4c88bbb 11007
a39f3346 11008 newspace = 12 + ((namesz + 3) & -4) + ((size + 3) & -4);
d4c88bbb 11009
a50b1753 11010 buf = (char *) realloc (buf, *bufsiz + newspace);
14b1c01e
AM
11011 if (buf == NULL)
11012 return buf;
a39f3346 11013 dest = buf + *bufsiz;
7c76fa91
MS
11014 *bufsiz += newspace;
11015 xnp = (Elf_External_Note *) dest;
11016 H_PUT_32 (abfd, namesz, xnp->namesz);
11017 H_PUT_32 (abfd, size, xnp->descsz);
11018 H_PUT_32 (abfd, type, xnp->type);
d4c88bbb
AM
11019 dest = xnp->name;
11020 if (name != NULL)
11021 {
11022 memcpy (dest, name, namesz);
11023 dest += namesz;
a39f3346 11024 while (namesz & 3)
d4c88bbb
AM
11025 {
11026 *dest++ = '\0';
a39f3346 11027 ++namesz;
d4c88bbb
AM
11028 }
11029 }
11030 memcpy (dest, input, size);
a39f3346
AM
11031 dest += size;
11032 while (size & 3)
11033 {
11034 *dest++ = '\0';
11035 ++size;
11036 }
11037 return buf;
7c76fa91
MS
11038}
11039
602f1657
AM
11040/* gcc-8 warns (*) on all the strncpy calls in this function about
11041 possible string truncation. The "truncation" is not a bug. We
11042 have an external representation of structs with fields that are not
11043 necessarily NULL terminated and corresponding internal
11044 representation fields that are one larger so that they can always
11045 be NULL terminated.
11046 gcc versions between 4.2 and 4.6 do not allow pragma control of
11047 diagnostics inside functions, giving a hard error if you try to use
11048 the finer control available with later versions.
11049 gcc prior to 4.2 warns about diagnostic push and pop.
11050 gcc-5, gcc-6 and gcc-7 warn that -Wstringop-truncation is unknown,
11051 unless you also add #pragma GCC diagnostic ignored "-Wpragma".
11052 (*) Depending on your system header files! */
d99b4b92 11053#if GCC_VERSION >= 8000
602f1657
AM
11054# pragma GCC diagnostic push
11055# pragma GCC diagnostic ignored "-Wstringop-truncation"
d99b4b92 11056#endif
7c76fa91 11057char *
217aa764
AM
11058elfcore_write_prpsinfo (bfd *abfd,
11059 char *buf,
11060 int *bufsiz,
11061 const char *fname,
11062 const char *psargs)
7c76fa91 11063{
183e98be
AM
11064 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
11065
11066 if (bed->elf_backend_write_core_note != NULL)
11067 {
11068 char *ret;
11069 ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
11070 NT_PRPSINFO, fname, psargs);
11071 if (ret != NULL)
11072 return ret;
11073 }
7c76fa91 11074
1f20dca5 11075#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
602f1657 11076# if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
183e98be
AM
11077 if (bed->s->elfclass == ELFCLASS32)
11078 {
602f1657 11079# if defined (HAVE_PSINFO32_T)
183e98be
AM
11080 psinfo32_t data;
11081 int note_type = NT_PSINFO;
602f1657 11082# else
183e98be
AM
11083 prpsinfo32_t data;
11084 int note_type = NT_PRPSINFO;
602f1657 11085# endif
183e98be
AM
11086
11087 memset (&data, 0, sizeof (data));
11088 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
11089 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
11090 return elfcore_write_note (abfd, buf, bufsiz,
1f20dca5 11091 "CORE", note_type, &data, sizeof (data));
183e98be
AM
11092 }
11093 else
602f1657 11094# endif
183e98be 11095 {
602f1657 11096# if defined (HAVE_PSINFO_T)
183e98be
AM
11097 psinfo_t data;
11098 int note_type = NT_PSINFO;
602f1657 11099# else
183e98be
AM
11100 prpsinfo_t data;
11101 int note_type = NT_PRPSINFO;
602f1657 11102# endif
7c76fa91 11103
183e98be
AM
11104 memset (&data, 0, sizeof (data));
11105 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
11106 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
11107 return elfcore_write_note (abfd, buf, bufsiz,
1f20dca5 11108 "CORE", note_type, &data, sizeof (data));
183e98be 11109 }
7c76fa91
MS
11110#endif /* PSINFO_T or PRPSINFO_T */
11111
1f20dca5
UW
11112 free (buf);
11113 return NULL;
11114}
d99b4b92 11115#if GCC_VERSION >= 8000
602f1657 11116# pragma GCC diagnostic pop
d99b4b92 11117#endif
1f20dca5 11118
70a38d42
SDJ
11119char *
11120elfcore_write_linux_prpsinfo32
11121 (bfd *abfd, char *buf, int *bufsiz,
11122 const struct elf_internal_linux_prpsinfo *prpsinfo)
11123{
a2f63b2e
MR
11124 if (get_elf_backend_data (abfd)->linux_prpsinfo32_ugid16)
11125 {
11126 struct elf_external_linux_prpsinfo32_ugid16 data;
11127
11128 swap_linux_prpsinfo32_ugid16_out (abfd, prpsinfo, &data);
11129 return elfcore_write_note (abfd, buf, bufsiz, "CORE", NT_PRPSINFO,
11130 &data, sizeof (data));
11131 }
11132 else
11133 {
11134 struct elf_external_linux_prpsinfo32_ugid32 data;
70a38d42 11135
a2f63b2e
MR
11136 swap_linux_prpsinfo32_ugid32_out (abfd, prpsinfo, &data);
11137 return elfcore_write_note (abfd, buf, bufsiz, "CORE", NT_PRPSINFO,
11138 &data, sizeof (data));
11139 }
70a38d42
SDJ
11140}
11141
11142char *
11143elfcore_write_linux_prpsinfo64
11144 (bfd *abfd, char *buf, int *bufsiz,
11145 const struct elf_internal_linux_prpsinfo *prpsinfo)
11146{
3c9a7b0d
MR
11147 if (get_elf_backend_data (abfd)->linux_prpsinfo64_ugid16)
11148 {
11149 struct elf_external_linux_prpsinfo64_ugid16 data;
11150
11151 swap_linux_prpsinfo64_ugid16_out (abfd, prpsinfo, &data);
11152 return elfcore_write_note (abfd, buf, bufsiz,
11153 "CORE", NT_PRPSINFO, &data, sizeof (data));
11154 }
11155 else
11156 {
11157 struct elf_external_linux_prpsinfo64_ugid32 data;
70a38d42 11158
3c9a7b0d
MR
11159 swap_linux_prpsinfo64_ugid32_out (abfd, prpsinfo, &data);
11160 return elfcore_write_note (abfd, buf, bufsiz,
11161 "CORE", NT_PRPSINFO, &data, sizeof (data));
11162 }
70a38d42
SDJ
11163}
11164
7c76fa91 11165char *
217aa764
AM
11166elfcore_write_prstatus (bfd *abfd,
11167 char *buf,
11168 int *bufsiz,
11169 long pid,
11170 int cursig,
11171 const void *gregs)
7c76fa91 11172{
183e98be 11173 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7c76fa91 11174
183e98be
AM
11175 if (bed->elf_backend_write_core_note != NULL)
11176 {
11177 char *ret;
11178 ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
11179 NT_PRSTATUS,
11180 pid, cursig, gregs);
11181 if (ret != NULL)
11182 return ret;
11183 }
11184
1f20dca5 11185#if defined (HAVE_PRSTATUS_T)
183e98be
AM
11186#if defined (HAVE_PRSTATUS32_T)
11187 if (bed->s->elfclass == ELFCLASS32)
11188 {
11189 prstatus32_t prstat;
11190
11191 memset (&prstat, 0, sizeof (prstat));
11192 prstat.pr_pid = pid;
11193 prstat.pr_cursig = cursig;
11194 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
1f20dca5 11195 return elfcore_write_note (abfd, buf, bufsiz, "CORE",
183e98be
AM
11196 NT_PRSTATUS, &prstat, sizeof (prstat));
11197 }
11198 else
11199#endif
11200 {
11201 prstatus_t prstat;
11202
11203 memset (&prstat, 0, sizeof (prstat));
11204 prstat.pr_pid = pid;
11205 prstat.pr_cursig = cursig;
11206 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
1f20dca5 11207 return elfcore_write_note (abfd, buf, bufsiz, "CORE",
183e98be
AM
11208 NT_PRSTATUS, &prstat, sizeof (prstat));
11209 }
7c76fa91
MS
11210#endif /* HAVE_PRSTATUS_T */
11211
1f20dca5
UW
11212 free (buf);
11213 return NULL;
11214}
11215
51316059
MS
11216#if defined (HAVE_LWPSTATUS_T)
11217char *
217aa764
AM
11218elfcore_write_lwpstatus (bfd *abfd,
11219 char *buf,
11220 int *bufsiz,
11221 long pid,
11222 int cursig,
11223 const void *gregs)
51316059
MS
11224{
11225 lwpstatus_t lwpstat;
183e98be 11226 const char *note_name = "CORE";
51316059
MS
11227
11228 memset (&lwpstat, 0, sizeof (lwpstat));
11229 lwpstat.pr_lwpid = pid >> 16;
11230 lwpstat.pr_cursig = cursig;
11231#if defined (HAVE_LWPSTATUS_T_PR_REG)
d1e8523e 11232 memcpy (&lwpstat.pr_reg, gregs, sizeof (lwpstat.pr_reg));
51316059
MS
11233#elif defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
11234#if !defined(gregs)
11235 memcpy (lwpstat.pr_context.uc_mcontext.gregs,
11236 gregs, sizeof (lwpstat.pr_context.uc_mcontext.gregs));
11237#else
11238 memcpy (lwpstat.pr_context.uc_mcontext.__gregs,
11239 gregs, sizeof (lwpstat.pr_context.uc_mcontext.__gregs));
11240#endif
11241#endif
47d9a591 11242 return elfcore_write_note (abfd, buf, bufsiz, note_name,
51316059
MS
11243 NT_LWPSTATUS, &lwpstat, sizeof (lwpstat));
11244}
11245#endif /* HAVE_LWPSTATUS_T */
11246
7c76fa91
MS
11247#if defined (HAVE_PSTATUS_T)
11248char *
217aa764
AM
11249elfcore_write_pstatus (bfd *abfd,
11250 char *buf,
11251 int *bufsiz,
11252 long pid,
6c10990d
NC
11253 int cursig ATTRIBUTE_UNUSED,
11254 const void *gregs ATTRIBUTE_UNUSED)
7c76fa91 11255{
183e98be
AM
11256 const char *note_name = "CORE";
11257#if defined (HAVE_PSTATUS32_T)
11258 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7c76fa91 11259
183e98be
AM
11260 if (bed->s->elfclass == ELFCLASS32)
11261 {
11262 pstatus32_t pstat;
11263
11264 memset (&pstat, 0, sizeof (pstat));
11265 pstat.pr_pid = pid & 0xffff;
11266 buf = elfcore_write_note (abfd, buf, bufsiz, note_name,
11267 NT_PSTATUS, &pstat, sizeof (pstat));
11268 return buf;
11269 }
11270 else
11271#endif
11272 {
11273 pstatus_t pstat;
11274
11275 memset (&pstat, 0, sizeof (pstat));
11276 pstat.pr_pid = pid & 0xffff;
11277 buf = elfcore_write_note (abfd, buf, bufsiz, note_name,
11278 NT_PSTATUS, &pstat, sizeof (pstat));
11279 return buf;
11280 }
7c76fa91
MS
11281}
11282#endif /* HAVE_PSTATUS_T */
11283
11284char *
217aa764
AM
11285elfcore_write_prfpreg (bfd *abfd,
11286 char *buf,
11287 int *bufsiz,
11288 const void *fpregs,
11289 int size)
7c76fa91 11290{
183e98be 11291 const char *note_name = "CORE";
47d9a591 11292 return elfcore_write_note (abfd, buf, bufsiz,
7c76fa91
MS
11293 note_name, NT_FPREGSET, fpregs, size);
11294}
11295
11296char *
217aa764
AM
11297elfcore_write_prxfpreg (bfd *abfd,
11298 char *buf,
11299 int *bufsiz,
11300 const void *xfpregs,
11301 int size)
7c76fa91
MS
11302{
11303 char *note_name = "LINUX";
47d9a591 11304 return elfcore_write_note (abfd, buf, bufsiz,
7c76fa91
MS
11305 note_name, NT_PRXFPREG, xfpregs, size);
11306}
11307
4339cae0
L
11308char *
11309elfcore_write_xstatereg (bfd *abfd, char *buf, int *bufsiz,
11310 const void *xfpregs, int size)
11311{
97de3545
JB
11312 char *note_name;
11313 if (get_elf_backend_data (abfd)->elf_osabi == ELFOSABI_FREEBSD)
11314 note_name = "FreeBSD";
11315 else
11316 note_name = "LINUX";
4339cae0
L
11317 return elfcore_write_note (abfd, buf, bufsiz,
11318 note_name, NT_X86_XSTATE, xfpregs, size);
11319}
11320
97753bd5
AM
11321char *
11322elfcore_write_ppc_vmx (bfd *abfd,
11323 char *buf,
11324 int *bufsiz,
11325 const void *ppc_vmx,
11326 int size)
11327{
11328 char *note_name = "LINUX";
11329 return elfcore_write_note (abfd, buf, bufsiz,
11330 note_name, NT_PPC_VMX, ppc_vmx, size);
11331}
11332
89eeb0bc
LM
11333char *
11334elfcore_write_ppc_vsx (bfd *abfd,
07d6d2b8
AM
11335 char *buf,
11336 int *bufsiz,
11337 const void *ppc_vsx,
11338 int size)
89eeb0bc
LM
11339{
11340 char *note_name = "LINUX";
11341 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11342 note_name, NT_PPC_VSX, ppc_vsx, size);
89eeb0bc
LM
11343}
11344
cb2366c1
EBM
11345char *
11346elfcore_write_ppc_tar (bfd *abfd,
4b24dd1a
AM
11347 char *buf,
11348 int *bufsiz,
11349 const void *ppc_tar,
11350 int size)
cb2366c1
EBM
11351{
11352 char *note_name = "LINUX";
11353 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11354 note_name, NT_PPC_TAR, ppc_tar, size);
cb2366c1
EBM
11355}
11356
11357char *
11358elfcore_write_ppc_ppr (bfd *abfd,
4b24dd1a
AM
11359 char *buf,
11360 int *bufsiz,
11361 const void *ppc_ppr,
11362 int size)
cb2366c1
EBM
11363{
11364 char *note_name = "LINUX";
11365 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11366 note_name, NT_PPC_PPR, ppc_ppr, size);
cb2366c1
EBM
11367}
11368
11369char *
11370elfcore_write_ppc_dscr (bfd *abfd,
4b24dd1a
AM
11371 char *buf,
11372 int *bufsiz,
11373 const void *ppc_dscr,
11374 int size)
cb2366c1
EBM
11375{
11376 char *note_name = "LINUX";
11377 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11378 note_name, NT_PPC_DSCR, ppc_dscr, size);
cb2366c1
EBM
11379}
11380
11381char *
11382elfcore_write_ppc_ebb (bfd *abfd,
4b24dd1a
AM
11383 char *buf,
11384 int *bufsiz,
11385 const void *ppc_ebb,
11386 int size)
cb2366c1
EBM
11387{
11388 char *note_name = "LINUX";
11389 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11390 note_name, NT_PPC_EBB, ppc_ebb, size);
cb2366c1
EBM
11391}
11392
11393char *
11394elfcore_write_ppc_pmu (bfd *abfd,
4b24dd1a
AM
11395 char *buf,
11396 int *bufsiz,
11397 const void *ppc_pmu,
11398 int size)
cb2366c1
EBM
11399{
11400 char *note_name = "LINUX";
11401 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11402 note_name, NT_PPC_PMU, ppc_pmu, size);
cb2366c1
EBM
11403}
11404
11405char *
11406elfcore_write_ppc_tm_cgpr (bfd *abfd,
4b24dd1a
AM
11407 char *buf,
11408 int *bufsiz,
11409 const void *ppc_tm_cgpr,
11410 int size)
cb2366c1
EBM
11411{
11412 char *note_name = "LINUX";
11413 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11414 note_name, NT_PPC_TM_CGPR, ppc_tm_cgpr, size);
cb2366c1
EBM
11415}
11416
11417char *
11418elfcore_write_ppc_tm_cfpr (bfd *abfd,
4b24dd1a
AM
11419 char *buf,
11420 int *bufsiz,
11421 const void *ppc_tm_cfpr,
11422 int size)
cb2366c1
EBM
11423{
11424 char *note_name = "LINUX";
11425 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11426 note_name, NT_PPC_TM_CFPR, ppc_tm_cfpr, size);
cb2366c1
EBM
11427}
11428
11429char *
11430elfcore_write_ppc_tm_cvmx (bfd *abfd,
4b24dd1a
AM
11431 char *buf,
11432 int *bufsiz,
11433 const void *ppc_tm_cvmx,
11434 int size)
cb2366c1
EBM
11435{
11436 char *note_name = "LINUX";
11437 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11438 note_name, NT_PPC_TM_CVMX, ppc_tm_cvmx, size);
cb2366c1
EBM
11439}
11440
11441char *
11442elfcore_write_ppc_tm_cvsx (bfd *abfd,
4b24dd1a
AM
11443 char *buf,
11444 int *bufsiz,
11445 const void *ppc_tm_cvsx,
11446 int size)
cb2366c1
EBM
11447{
11448 char *note_name = "LINUX";
11449 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11450 note_name, NT_PPC_TM_CVSX, ppc_tm_cvsx, size);
cb2366c1
EBM
11451}
11452
11453char *
11454elfcore_write_ppc_tm_spr (bfd *abfd,
4b24dd1a
AM
11455 char *buf,
11456 int *bufsiz,
11457 const void *ppc_tm_spr,
11458 int size)
cb2366c1
EBM
11459{
11460 char *note_name = "LINUX";
11461 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11462 note_name, NT_PPC_TM_SPR, ppc_tm_spr, size);
cb2366c1
EBM
11463}
11464
11465char *
11466elfcore_write_ppc_tm_ctar (bfd *abfd,
4b24dd1a
AM
11467 char *buf,
11468 int *bufsiz,
11469 const void *ppc_tm_ctar,
11470 int size)
cb2366c1
EBM
11471{
11472 char *note_name = "LINUX";
11473 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11474 note_name, NT_PPC_TM_CTAR, ppc_tm_ctar, size);
cb2366c1
EBM
11475}
11476
11477char *
11478elfcore_write_ppc_tm_cppr (bfd *abfd,
4b24dd1a
AM
11479 char *buf,
11480 int *bufsiz,
11481 const void *ppc_tm_cppr,
11482 int size)
cb2366c1
EBM
11483{
11484 char *note_name = "LINUX";
11485 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11486 note_name, NT_PPC_TM_CPPR, ppc_tm_cppr, size);
cb2366c1
EBM
11487}
11488
11489char *
11490elfcore_write_ppc_tm_cdscr (bfd *abfd,
4b24dd1a
AM
11491 char *buf,
11492 int *bufsiz,
11493 const void *ppc_tm_cdscr,
11494 int size)
cb2366c1
EBM
11495{
11496 char *note_name = "LINUX";
11497 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11498 note_name, NT_PPC_TM_CDSCR, ppc_tm_cdscr, size);
cb2366c1
EBM
11499}
11500
0675e188
UW
11501static char *
11502elfcore_write_s390_high_gprs (bfd *abfd,
11503 char *buf,
11504 int *bufsiz,
11505 const void *s390_high_gprs,
11506 int size)
11507{
11508 char *note_name = "LINUX";
11509 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11510 note_name, NT_S390_HIGH_GPRS,
0675e188
UW
11511 s390_high_gprs, size);
11512}
11513
d7eeb400
MS
11514char *
11515elfcore_write_s390_timer (bfd *abfd,
07d6d2b8
AM
11516 char *buf,
11517 int *bufsiz,
11518 const void *s390_timer,
11519 int size)
d7eeb400
MS
11520{
11521 char *note_name = "LINUX";
11522 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11523 note_name, NT_S390_TIMER, s390_timer, size);
d7eeb400
MS
11524}
11525
11526char *
11527elfcore_write_s390_todcmp (bfd *abfd,
07d6d2b8
AM
11528 char *buf,
11529 int *bufsiz,
11530 const void *s390_todcmp,
11531 int size)
d7eeb400
MS
11532{
11533 char *note_name = "LINUX";
11534 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11535 note_name, NT_S390_TODCMP, s390_todcmp, size);
d7eeb400
MS
11536}
11537
11538char *
11539elfcore_write_s390_todpreg (bfd *abfd,
07d6d2b8
AM
11540 char *buf,
11541 int *bufsiz,
11542 const void *s390_todpreg,
11543 int size)
d7eeb400
MS
11544{
11545 char *note_name = "LINUX";
11546 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11547 note_name, NT_S390_TODPREG, s390_todpreg, size);
d7eeb400
MS
11548}
11549
11550char *
11551elfcore_write_s390_ctrs (bfd *abfd,
07d6d2b8
AM
11552 char *buf,
11553 int *bufsiz,
11554 const void *s390_ctrs,
11555 int size)
d7eeb400
MS
11556{
11557 char *note_name = "LINUX";
11558 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11559 note_name, NT_S390_CTRS, s390_ctrs, size);
d7eeb400
MS
11560}
11561
11562char *
11563elfcore_write_s390_prefix (bfd *abfd,
07d6d2b8
AM
11564 char *buf,
11565 int *bufsiz,
11566 const void *s390_prefix,
11567 int size)
d7eeb400
MS
11568{
11569 char *note_name = "LINUX";
11570 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11571 note_name, NT_S390_PREFIX, s390_prefix, size);
d7eeb400
MS
11572}
11573
355b81d9
UW
11574char *
11575elfcore_write_s390_last_break (bfd *abfd,
11576 char *buf,
11577 int *bufsiz,
11578 const void *s390_last_break,
11579 int size)
11580{
11581 char *note_name = "LINUX";
11582 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11583 note_name, NT_S390_LAST_BREAK,
355b81d9
UW
11584 s390_last_break, size);
11585}
11586
11587char *
11588elfcore_write_s390_system_call (bfd *abfd,
11589 char *buf,
11590 int *bufsiz,
11591 const void *s390_system_call,
11592 int size)
11593{
11594 char *note_name = "LINUX";
11595 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11596 note_name, NT_S390_SYSTEM_CALL,
355b81d9
UW
11597 s390_system_call, size);
11598}
11599
abb3f6cc
NC
11600char *
11601elfcore_write_s390_tdb (bfd *abfd,
11602 char *buf,
11603 int *bufsiz,
11604 const void *s390_tdb,
11605 int size)
11606{
11607 char *note_name = "LINUX";
11608 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11609 note_name, NT_S390_TDB, s390_tdb, size);
abb3f6cc
NC
11610}
11611
4ef9f41a
AA
11612char *
11613elfcore_write_s390_vxrs_low (bfd *abfd,
11614 char *buf,
11615 int *bufsiz,
11616 const void *s390_vxrs_low,
11617 int size)
11618{
11619 char *note_name = "LINUX";
11620 return elfcore_write_note (abfd, buf, bufsiz,
11621 note_name, NT_S390_VXRS_LOW, s390_vxrs_low, size);
11622}
11623
11624char *
11625elfcore_write_s390_vxrs_high (bfd *abfd,
11626 char *buf,
11627 int *bufsiz,
11628 const void *s390_vxrs_high,
11629 int size)
11630{
11631 char *note_name = "LINUX";
11632 return elfcore_write_note (abfd, buf, bufsiz,
11633 note_name, NT_S390_VXRS_HIGH,
11634 s390_vxrs_high, size);
11635}
11636
88ab90e8
AA
11637char *
11638elfcore_write_s390_gs_cb (bfd *abfd,
11639 char *buf,
11640 int *bufsiz,
11641 const void *s390_gs_cb,
11642 int size)
11643{
11644 char *note_name = "LINUX";
11645 return elfcore_write_note (abfd, buf, bufsiz,
11646 note_name, NT_S390_GS_CB,
11647 s390_gs_cb, size);
11648}
11649
11650char *
11651elfcore_write_s390_gs_bc (bfd *abfd,
11652 char *buf,
11653 int *bufsiz,
11654 const void *s390_gs_bc,
11655 int size)
11656{
11657 char *note_name = "LINUX";
11658 return elfcore_write_note (abfd, buf, bufsiz,
11659 note_name, NT_S390_GS_BC,
11660 s390_gs_bc, size);
11661}
11662
faa9a424
UW
11663char *
11664elfcore_write_arm_vfp (bfd *abfd,
11665 char *buf,
11666 int *bufsiz,
11667 const void *arm_vfp,
11668 int size)
11669{
11670 char *note_name = "LINUX";
11671 return elfcore_write_note (abfd, buf, bufsiz,
11672 note_name, NT_ARM_VFP, arm_vfp, size);
11673}
11674
652451f8
YZ
11675char *
11676elfcore_write_aarch_tls (bfd *abfd,
11677 char *buf,
11678 int *bufsiz,
11679 const void *aarch_tls,
11680 int size)
11681{
11682 char *note_name = "LINUX";
11683 return elfcore_write_note (abfd, buf, bufsiz,
11684 note_name, NT_ARM_TLS, aarch_tls, size);
11685}
11686
11687char *
11688elfcore_write_aarch_hw_break (bfd *abfd,
11689 char *buf,
11690 int *bufsiz,
11691 const void *aarch_hw_break,
11692 int size)
11693{
11694 char *note_name = "LINUX";
11695 return elfcore_write_note (abfd, buf, bufsiz,
11696 note_name, NT_ARM_HW_BREAK, aarch_hw_break, size);
11697}
11698
11699char *
11700elfcore_write_aarch_hw_watch (bfd *abfd,
11701 char *buf,
11702 int *bufsiz,
11703 const void *aarch_hw_watch,
11704 int size)
11705{
11706 char *note_name = "LINUX";
11707 return elfcore_write_note (abfd, buf, bufsiz,
11708 note_name, NT_ARM_HW_WATCH, aarch_hw_watch, size);
11709}
11710
ad1cc4e4
AH
11711char *
11712elfcore_write_aarch_sve (bfd *abfd,
11713 char *buf,
11714 int *bufsiz,
11715 const void *aarch_sve,
11716 int size)
11717{
11718 char *note_name = "LINUX";
11719 return elfcore_write_note (abfd, buf, bufsiz,
11720 note_name, NT_ARM_SVE, aarch_sve, size);
11721}
11722
e6c3b5bf
AH
11723char *
11724elfcore_write_aarch_pauth (bfd *abfd,
11725 char *buf,
11726 int *bufsiz,
11727 const void *aarch_pauth,
11728 int size)
11729{
11730 char *note_name = "LINUX";
11731 return elfcore_write_note (abfd, buf, bufsiz,
11732 note_name, NT_ARM_PAC_MASK, aarch_pauth, size);
11733}
11734
bb864ac1
CES
11735char *
11736elfcore_write_register_note (bfd *abfd,
11737 char *buf,
11738 int *bufsiz,
11739 const char *section,
11740 const void *data,
11741 int size)
11742{
11743 if (strcmp (section, ".reg2") == 0)
11744 return elfcore_write_prfpreg (abfd, buf, bufsiz, data, size);
11745 if (strcmp (section, ".reg-xfp") == 0)
11746 return elfcore_write_prxfpreg (abfd, buf, bufsiz, data, size);
4339cae0
L
11747 if (strcmp (section, ".reg-xstate") == 0)
11748 return elfcore_write_xstatereg (abfd, buf, bufsiz, data, size);
bb864ac1
CES
11749 if (strcmp (section, ".reg-ppc-vmx") == 0)
11750 return elfcore_write_ppc_vmx (abfd, buf, bufsiz, data, size);
89eeb0bc
LM
11751 if (strcmp (section, ".reg-ppc-vsx") == 0)
11752 return elfcore_write_ppc_vsx (abfd, buf, bufsiz, data, size);
cb2366c1
EBM
11753 if (strcmp (section, ".reg-ppc-tar") == 0)
11754 return elfcore_write_ppc_tar (abfd, buf, bufsiz, data, size);
11755 if (strcmp (section, ".reg-ppc-ppr") == 0)
11756 return elfcore_write_ppc_ppr (abfd, buf, bufsiz, data, size);
11757 if (strcmp (section, ".reg-ppc-dscr") == 0)
11758 return elfcore_write_ppc_dscr (abfd, buf, bufsiz, data, size);
11759 if (strcmp (section, ".reg-ppc-ebb") == 0)
11760 return elfcore_write_ppc_ebb (abfd, buf, bufsiz, data, size);
11761 if (strcmp (section, ".reg-ppc-pmu") == 0)
11762 return elfcore_write_ppc_pmu (abfd, buf, bufsiz, data, size);
11763 if (strcmp (section, ".reg-ppc-tm-cgpr") == 0)
11764 return elfcore_write_ppc_tm_cgpr (abfd, buf, bufsiz, data, size);
11765 if (strcmp (section, ".reg-ppc-tm-cfpr") == 0)
11766 return elfcore_write_ppc_tm_cfpr (abfd, buf, bufsiz, data, size);
11767 if (strcmp (section, ".reg-ppc-tm-cvmx") == 0)
11768 return elfcore_write_ppc_tm_cvmx (abfd, buf, bufsiz, data, size);
11769 if (strcmp (section, ".reg-ppc-tm-cvsx") == 0)
11770 return elfcore_write_ppc_tm_cvsx (abfd, buf, bufsiz, data, size);
11771 if (strcmp (section, ".reg-ppc-tm-spr") == 0)
11772 return elfcore_write_ppc_tm_spr (abfd, buf, bufsiz, data, size);
11773 if (strcmp (section, ".reg-ppc-tm-ctar") == 0)
11774 return elfcore_write_ppc_tm_ctar (abfd, buf, bufsiz, data, size);
11775 if (strcmp (section, ".reg-ppc-tm-cppr") == 0)
11776 return elfcore_write_ppc_tm_cppr (abfd, buf, bufsiz, data, size);
11777 if (strcmp (section, ".reg-ppc-tm-cdscr") == 0)
11778 return elfcore_write_ppc_tm_cdscr (abfd, buf, bufsiz, data, size);
0675e188
UW
11779 if (strcmp (section, ".reg-s390-high-gprs") == 0)
11780 return elfcore_write_s390_high_gprs (abfd, buf, bufsiz, data, size);
d7eeb400
MS
11781 if (strcmp (section, ".reg-s390-timer") == 0)
11782 return elfcore_write_s390_timer (abfd, buf, bufsiz, data, size);
11783 if (strcmp (section, ".reg-s390-todcmp") == 0)
11784 return elfcore_write_s390_todcmp (abfd, buf, bufsiz, data, size);
11785 if (strcmp (section, ".reg-s390-todpreg") == 0)
11786 return elfcore_write_s390_todpreg (abfd, buf, bufsiz, data, size);
11787 if (strcmp (section, ".reg-s390-ctrs") == 0)
11788 return elfcore_write_s390_ctrs (abfd, buf, bufsiz, data, size);
11789 if (strcmp (section, ".reg-s390-prefix") == 0)
11790 return elfcore_write_s390_prefix (abfd, buf, bufsiz, data, size);
355b81d9
UW
11791 if (strcmp (section, ".reg-s390-last-break") == 0)
11792 return elfcore_write_s390_last_break (abfd, buf, bufsiz, data, size);
11793 if (strcmp (section, ".reg-s390-system-call") == 0)
11794 return elfcore_write_s390_system_call (abfd, buf, bufsiz, data, size);
abb3f6cc
NC
11795 if (strcmp (section, ".reg-s390-tdb") == 0)
11796 return elfcore_write_s390_tdb (abfd, buf, bufsiz, data, size);
4ef9f41a
AA
11797 if (strcmp (section, ".reg-s390-vxrs-low") == 0)
11798 return elfcore_write_s390_vxrs_low (abfd, buf, bufsiz, data, size);
11799 if (strcmp (section, ".reg-s390-vxrs-high") == 0)
11800 return elfcore_write_s390_vxrs_high (abfd, buf, bufsiz, data, size);
88ab90e8
AA
11801 if (strcmp (section, ".reg-s390-gs-cb") == 0)
11802 return elfcore_write_s390_gs_cb (abfd, buf, bufsiz, data, size);
11803 if (strcmp (section, ".reg-s390-gs-bc") == 0)
11804 return elfcore_write_s390_gs_bc (abfd, buf, bufsiz, data, size);
faa9a424
UW
11805 if (strcmp (section, ".reg-arm-vfp") == 0)
11806 return elfcore_write_arm_vfp (abfd, buf, bufsiz, data, size);
652451f8
YZ
11807 if (strcmp (section, ".reg-aarch-tls") == 0)
11808 return elfcore_write_aarch_tls (abfd, buf, bufsiz, data, size);
11809 if (strcmp (section, ".reg-aarch-hw-break") == 0)
11810 return elfcore_write_aarch_hw_break (abfd, buf, bufsiz, data, size);
11811 if (strcmp (section, ".reg-aarch-hw-watch") == 0)
11812 return elfcore_write_aarch_hw_watch (abfd, buf, bufsiz, data, size);
ad1cc4e4
AH
11813 if (strcmp (section, ".reg-aarch-sve") == 0)
11814 return elfcore_write_aarch_sve (abfd, buf, bufsiz, data, size);
e6c3b5bf
AH
11815 if (strcmp (section, ".reg-aarch-pauth") == 0)
11816 return elfcore_write_aarch_pauth (abfd, buf, bufsiz, data, size);
bb864ac1
CES
11817 return NULL;
11818}
11819
b34976b6 11820static bfd_boolean
276da9b3
L
11821elf_parse_notes (bfd *abfd, char *buf, size_t size, file_ptr offset,
11822 size_t align)
252b5132 11823{
c044fabd 11824 char *p;
252b5132 11825
276da9b3
L
11826 /* NB: CORE PT_NOTE segments may have p_align values of 0 or 1.
11827 gABI specifies that PT_NOTE alignment should be aligned to 4
11828 bytes for 32-bit objects and to 8 bytes for 64-bit objects. If
11829 align is less than 4, we use 4 byte alignment. */
11830 if (align < 4)
11831 align = 4;
ef135d43
NC
11832 if (align != 4 && align != 8)
11833 return FALSE;
276da9b3 11834
252b5132
RH
11835 p = buf;
11836 while (p < buf + size)
11837 {
c044fabd 11838 Elf_External_Note *xnp = (Elf_External_Note *) p;
252b5132
RH
11839 Elf_Internal_Note in;
11840
baea7ef1
AM
11841 if (offsetof (Elf_External_Note, name) > buf - p + size)
11842 return FALSE;
11843
dc810e39 11844 in.type = H_GET_32 (abfd, xnp->type);
252b5132 11845
dc810e39 11846 in.namesz = H_GET_32 (abfd, xnp->namesz);
252b5132 11847 in.namedata = xnp->name;
baea7ef1
AM
11848 if (in.namesz > buf - in.namedata + size)
11849 return FALSE;
252b5132 11850
dc810e39 11851 in.descsz = H_GET_32 (abfd, xnp->descsz);
276da9b3 11852 in.descdata = p + ELF_NOTE_DESC_OFFSET (in.namesz, align);
252b5132 11853 in.descpos = offset + (in.descdata - buf);
baea7ef1
AM
11854 if (in.descsz != 0
11855 && (in.descdata >= buf + size
11856 || in.descsz > buf - in.descdata + size))
11857 return FALSE;
252b5132 11858
718175fa 11859 switch (bfd_get_format (abfd))
07d6d2b8 11860 {
718175fa
JK
11861 default:
11862 return TRUE;
11863
11864 case bfd_core:
f64e188b 11865 {
8acbedd6 11866#define GROKER_ELEMENT(S,F) {S, sizeof (S) - 1, F}
f64e188b 11867 struct
718175fa 11868 {
f64e188b 11869 const char * string;
8acbedd6 11870 size_t len;
f64e188b 11871 bfd_boolean (* func)(bfd *, Elf_Internal_Note *);
718175fa 11872 }
f64e188b 11873 grokers[] =
b15fa79e 11874 {
8acbedd6 11875 GROKER_ELEMENT ("", elfcore_grok_note),
aa1ed4a9 11876 GROKER_ELEMENT ("FreeBSD", elfcore_grok_freebsd_note),
8acbedd6
KS
11877 GROKER_ELEMENT ("NetBSD-CORE", elfcore_grok_netbsd_note),
11878 GROKER_ELEMENT ( "OpenBSD", elfcore_grok_openbsd_note),
11879 GROKER_ELEMENT ("QNX", elfcore_grok_nto_note),
864619bb
KS
11880 GROKER_ELEMENT ("SPU/", elfcore_grok_spu_note),
11881 GROKER_ELEMENT ("GNU", elfobj_grok_gnu_note)
f64e188b 11882 };
8acbedd6 11883#undef GROKER_ELEMENT
f64e188b
NC
11884 int i;
11885
11886 for (i = ARRAY_SIZE (grokers); i--;)
8acbedd6
KS
11887 {
11888 if (in.namesz >= grokers[i].len
11889 && strncmp (in.namedata, grokers[i].string,
11890 grokers[i].len) == 0)
11891 {
11892 if (! grokers[i].func (abfd, & in))
11893 return FALSE;
11894 break;
11895 }
11896 }
f64e188b
NC
11897 break;
11898 }
718175fa
JK
11899
11900 case bfd_object:
11901 if (in.namesz == sizeof "GNU" && strcmp (in.namedata, "GNU") == 0)
11902 {
11903 if (! elfobj_grok_gnu_note (abfd, &in))
11904 return FALSE;
11905 }
e21e5835
NC
11906 else if (in.namesz == sizeof "stapsdt"
11907 && strcmp (in.namedata, "stapsdt") == 0)
11908 {
11909 if (! elfobj_grok_stapsdt_note (abfd, &in))
11910 return FALSE;
11911 }
718175fa 11912 break;
08a40648 11913 }
252b5132 11914
276da9b3 11915 p += ELF_NOTE_NEXT_OFFSET (in.namesz, in.descsz, align);
252b5132
RH
11916 }
11917
718175fa
JK
11918 return TRUE;
11919}
11920
864619bb 11921bfd_boolean
276da9b3
L
11922elf_read_notes (bfd *abfd, file_ptr offset, bfd_size_type size,
11923 size_t align)
718175fa
JK
11924{
11925 char *buf;
11926
957e1fc1 11927 if (size == 0 || (size + 1) == 0)
718175fa
JK
11928 return TRUE;
11929
11930 if (bfd_seek (abfd, offset, SEEK_SET) != 0)
11931 return FALSE;
11932
2bb3687b 11933 buf = (char *) _bfd_malloc_and_read (abfd, size + 1, size);
718175fa
JK
11934 if (buf == NULL)
11935 return FALSE;
11936
f64e188b
NC
11937 /* PR 17512: file: ec08f814
11938 0-termintate the buffer so that string searches will not overflow. */
11939 buf[size] = 0;
11940
2bb3687b 11941 if (!elf_parse_notes (abfd, buf, size, offset, align))
718175fa
JK
11942 {
11943 free (buf);
11944 return FALSE;
11945 }
11946
252b5132 11947 free (buf);
b34976b6 11948 return TRUE;
252b5132 11949}
98d8431c
JB
11950\f
11951/* Providing external access to the ELF program header table. */
11952
11953/* Return an upper bound on the number of bytes required to store a
11954 copy of ABFD's program header table entries. Return -1 if an error
11955 occurs; bfd_get_error will return an appropriate code. */
c044fabd 11956
98d8431c 11957long
217aa764 11958bfd_get_elf_phdr_upper_bound (bfd *abfd)
98d8431c
JB
11959{
11960 if (abfd->xvec->flavour != bfd_target_elf_flavour)
11961 {
11962 bfd_set_error (bfd_error_wrong_format);
11963 return -1;
11964 }
11965
936e320b 11966 return elf_elfheader (abfd)->e_phnum * sizeof (Elf_Internal_Phdr);
98d8431c
JB
11967}
11968
98d8431c
JB
11969/* Copy ABFD's program header table entries to *PHDRS. The entries
11970 will be stored as an array of Elf_Internal_Phdr structures, as
11971 defined in include/elf/internal.h. To find out how large the
11972 buffer needs to be, call bfd_get_elf_phdr_upper_bound.
11973
11974 Return the number of program header table entries read, or -1 if an
11975 error occurs; bfd_get_error will return an appropriate code. */
c044fabd 11976
98d8431c 11977int
217aa764 11978bfd_get_elf_phdrs (bfd *abfd, void *phdrs)
98d8431c
JB
11979{
11980 int num_phdrs;
11981
11982 if (abfd->xvec->flavour != bfd_target_elf_flavour)
11983 {
11984 bfd_set_error (bfd_error_wrong_format);
11985 return -1;
11986 }
11987
11988 num_phdrs = elf_elfheader (abfd)->e_phnum;
01bcaf63
TT
11989 if (num_phdrs != 0)
11990 memcpy (phdrs, elf_tdata (abfd)->phdr,
11991 num_phdrs * sizeof (Elf_Internal_Phdr));
98d8431c
JB
11992
11993 return num_phdrs;
11994}
ae4221d7 11995
db6751f2 11996enum elf_reloc_type_class
7e612e98
AM
11997_bfd_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
11998 const asection *rel_sec ATTRIBUTE_UNUSED,
11999 const Elf_Internal_Rela *rela ATTRIBUTE_UNUSED)
db6751f2
JJ
12000{
12001 return reloc_class_normal;
12002}
f8df10f4 12003
47d9a591 12004/* For RELA architectures, return the relocation value for a
f8df10f4
JJ
12005 relocation against a local symbol. */
12006
12007bfd_vma
217aa764
AM
12008_bfd_elf_rela_local_sym (bfd *abfd,
12009 Elf_Internal_Sym *sym,
8517fae7 12010 asection **psec,
217aa764 12011 Elf_Internal_Rela *rel)
f8df10f4 12012{
8517fae7 12013 asection *sec = *psec;
f8df10f4
JJ
12014 bfd_vma relocation;
12015
6835821b
AM
12016 relocation = (sec->output_section->vma
12017 + sec->output_offset
12018 + sym->st_value);
f8df10f4 12019 if ((sec->flags & SEC_MERGE)
c629eae0 12020 && ELF_ST_TYPE (sym->st_info) == STT_SECTION
dbaa2011 12021 && sec->sec_info_type == SEC_INFO_TYPE_MERGE)
f8df10f4 12022 {
f8df10f4 12023 rel->r_addend =
8517fae7 12024 _bfd_merged_section_offset (abfd, psec,
65765700 12025 elf_section_data (sec)->sec_info,
753731ee
AM
12026 sym->st_value + rel->r_addend);
12027 if (sec != *psec)
12028 {
12029 /* If we have changed the section, and our original section is
12030 marked with SEC_EXCLUDE, it means that the original
12031 SEC_MERGE section has been completely subsumed in some
12032 other SEC_MERGE section. In this case, we need to leave
12033 some info around for --emit-relocs. */
12034 if ((sec->flags & SEC_EXCLUDE) != 0)
12035 sec->kept_section = *psec;
12036 sec = *psec;
12037 }
8517fae7
AM
12038 rel->r_addend -= relocation;
12039 rel->r_addend += sec->output_section->vma + sec->output_offset;
f8df10f4
JJ
12040 }
12041 return relocation;
12042}
c629eae0
JJ
12043
12044bfd_vma
217aa764
AM
12045_bfd_elf_rel_local_sym (bfd *abfd,
12046 Elf_Internal_Sym *sym,
12047 asection **psec,
12048 bfd_vma addend)
47d9a591 12049{
c629eae0
JJ
12050 asection *sec = *psec;
12051
6835821b 12052 if (sec->sec_info_type != SEC_INFO_TYPE_MERGE)
c629eae0
JJ
12053 return sym->st_value + addend;
12054
12055 return _bfd_merged_section_offset (abfd, psec,
65765700 12056 elf_section_data (sec)->sec_info,
753731ee 12057 sym->st_value + addend);
c629eae0
JJ
12058}
12059
37b01f6a
DG
12060/* Adjust an address within a section. Given OFFSET within SEC, return
12061 the new offset within the section, based upon changes made to the
12062 section. Returns -1 if the offset is now invalid.
12063 The offset (in abnd out) is in target sized bytes, however big a
12064 byte may be. */
12065
c629eae0 12066bfd_vma
217aa764 12067_bfd_elf_section_offset (bfd *abfd,
92e4ec35 12068 struct bfd_link_info *info,
217aa764
AM
12069 asection *sec,
12070 bfd_vma offset)
c629eae0 12071{
68bfbfcc 12072 switch (sec->sec_info_type)
65765700 12073 {
dbaa2011 12074 case SEC_INFO_TYPE_STABS:
eea6121a
AM
12075 return _bfd_stab_section_offset (sec, elf_section_data (sec)->sec_info,
12076 offset);
dbaa2011 12077 case SEC_INFO_TYPE_EH_FRAME:
92e4ec35 12078 return _bfd_elf_eh_frame_section_offset (abfd, info, sec, offset);
37b01f6a 12079
65765700 12080 default:
310fd250
L
12081 if ((sec->flags & SEC_ELF_REVERSE_COPY) != 0)
12082 {
37b01f6a 12083 /* Reverse the offset. */
310fd250
L
12084 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
12085 bfd_size_type address_size = bed->s->arch_size / 8;
37b01f6a
DG
12086
12087 /* address_size and sec->size are in octets. Convert
12088 to bytes before subtracting the original offset. */
61826503 12089 offset = ((sec->size - address_size)
bb294208 12090 / bfd_octets_per_byte (abfd, sec) - offset);
310fd250 12091 }
65765700
JJ
12092 return offset;
12093 }
c629eae0 12094}
3333a7c3
RM
12095\f
12096/* Create a new BFD as if by bfd_openr. Rather than opening a file,
12097 reconstruct an ELF file by reading the segments out of remote memory
12098 based on the ELF file header at EHDR_VMA and the ELF program headers it
12099 points to. If not null, *LOADBASEP is filled in with the difference
12100 between the VMAs from which the segments were read, and the VMAs the
12101 file headers (and hence BFD's idea of each section's VMA) put them at.
12102
12103 The function TARGET_READ_MEMORY is called to copy LEN bytes from the
12104 remote memory at target address VMA into the local buffer at MYADDR; it
12105 should return zero on success or an `errno' code on failure. TEMPL must
12106 be a BFD for an ELF target with the word size and byte order found in
12107 the remote memory. */
12108
12109bfd *
217aa764
AM
12110bfd_elf_bfd_from_remote_memory
12111 (bfd *templ,
12112 bfd_vma ehdr_vma,
f0a5d95a 12113 bfd_size_type size,
217aa764 12114 bfd_vma *loadbasep,
fe78531d 12115 int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
3333a7c3
RM
12116{
12117 return (*get_elf_backend_data (templ)->elf_backend_bfd_from_remote_memory)
5979d6b6 12118 (templ, ehdr_vma, size, loadbasep, target_read_memory);
3333a7c3 12119}
4c45e5c9
JJ
12120\f
12121long
c9727e01
AM
12122_bfd_elf_get_synthetic_symtab (bfd *abfd,
12123 long symcount ATTRIBUTE_UNUSED,
12124 asymbol **syms ATTRIBUTE_UNUSED,
8615f3f2 12125 long dynsymcount,
c9727e01
AM
12126 asymbol **dynsyms,
12127 asymbol **ret)
4c45e5c9
JJ
12128{
12129 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
12130 asection *relplt;
12131 asymbol *s;
12132 const char *relplt_name;
12133 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
12134 arelent *p;
12135 long count, i, n;
12136 size_t size;
12137 Elf_Internal_Shdr *hdr;
12138 char *names;
12139 asection *plt;
12140
8615f3f2
AM
12141 *ret = NULL;
12142
90e3cdf2
JJ
12143 if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
12144 return 0;
12145
8615f3f2
AM
12146 if (dynsymcount <= 0)
12147 return 0;
12148
4c45e5c9
JJ
12149 if (!bed->plt_sym_val)
12150 return 0;
12151
12152 relplt_name = bed->relplt_name;
12153 if (relplt_name == NULL)
d35fd659 12154 relplt_name = bed->rela_plts_and_copies_p ? ".rela.plt" : ".rel.plt";
4c45e5c9
JJ
12155 relplt = bfd_get_section_by_name (abfd, relplt_name);
12156 if (relplt == NULL)
12157 return 0;
12158
12159 hdr = &elf_section_data (relplt)->this_hdr;
12160 if (hdr->sh_link != elf_dynsymtab (abfd)
12161 || (hdr->sh_type != SHT_REL && hdr->sh_type != SHT_RELA))
12162 return 0;
12163
12164 plt = bfd_get_section_by_name (abfd, ".plt");
12165 if (plt == NULL)
12166 return 0;
12167
12168 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
c9727e01 12169 if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
4c45e5c9
JJ
12170 return -1;
12171
eea6121a 12172 count = relplt->size / hdr->sh_entsize;
4c45e5c9
JJ
12173 size = count * sizeof (asymbol);
12174 p = relplt->relocation;
cb53bf42 12175 for (i = 0; i < count; i++, p += bed->s->int_rels_per_ext_rel)
041de40d
AM
12176 {
12177 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
12178 if (p->addend != 0)
12179 {
12180#ifdef BFD64
12181 size += sizeof ("+0x") - 1 + 8 + 8 * (bed->s->elfclass == ELFCLASS64);
12182#else
12183 size += sizeof ("+0x") - 1 + 8;
12184#endif
12185 }
12186 }
4c45e5c9 12187
a50b1753 12188 s = *ret = (asymbol *) bfd_malloc (size);
4c45e5c9
JJ
12189 if (s == NULL)
12190 return -1;
12191
12192 names = (char *) (s + count);
12193 p = relplt->relocation;
12194 n = 0;
cb53bf42 12195 for (i = 0; i < count; i++, p += bed->s->int_rels_per_ext_rel)
4c45e5c9
JJ
12196 {
12197 size_t len;
12198 bfd_vma addr;
12199
12200 addr = bed->plt_sym_val (i, plt, p);
12201 if (addr == (bfd_vma) -1)
12202 continue;
12203
12204 *s = **p->sym_ptr_ptr;
65a7a66f
AM
12205 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
12206 we are defining a symbol, ensure one of them is set. */
12207 if ((s->flags & BSF_LOCAL) == 0)
12208 s->flags |= BSF_GLOBAL;
6ba2a415 12209 s->flags |= BSF_SYNTHETIC;
4c45e5c9
JJ
12210 s->section = plt;
12211 s->value = addr - plt->vma;
12212 s->name = names;
8f39ba8e 12213 s->udata.p = NULL;
4c45e5c9
JJ
12214 len = strlen ((*p->sym_ptr_ptr)->name);
12215 memcpy (names, (*p->sym_ptr_ptr)->name, len);
12216 names += len;
041de40d
AM
12217 if (p->addend != 0)
12218 {
1d770845 12219 char buf[30], *a;
d324f6d6 12220
041de40d
AM
12221 memcpy (names, "+0x", sizeof ("+0x") - 1);
12222 names += sizeof ("+0x") - 1;
1d770845
L
12223 bfd_sprintf_vma (abfd, buf, p->addend);
12224 for (a = buf; *a == '0'; ++a)
12225 ;
12226 len = strlen (a);
12227 memcpy (names, a, len);
12228 names += len;
041de40d 12229 }
4c45e5c9
JJ
12230 memcpy (names, "@plt", sizeof ("@plt"));
12231 names += sizeof ("@plt");
8f39ba8e 12232 ++s, ++n;
4c45e5c9
JJ
12233 }
12234
12235 return n;
12236}
3d7f7666 12237
821e6ff6
AM
12238/* It is only used by x86-64 so far.
12239 ??? This repeats *COM* id of zero. sec->id is supposed to be unique,
7eacd66b
AM
12240 but current usage would allow all of _bfd_std_section to be zero. */
12241static const asymbol lcomm_sym
12242 = GLOBAL_SYM_INIT ("LARGE_COMMON", &_bfd_elf_large_com_section);
3b22753a 12243asection _bfd_elf_large_com_section
7eacd66b 12244 = BFD_FAKE_SECTION (_bfd_elf_large_com_section, &lcomm_sym,
821e6ff6 12245 "LARGE_COMMON", 0, SEC_IS_COMMON);
ecca9871 12246
cc364be6
AM
12247bfd_boolean
12248_bfd_elf_final_write_processing (bfd *abfd)
06f44071
AM
12249{
12250 Elf_Internal_Ehdr *i_ehdrp; /* ELF file header, internal form. */
d1036acb
L
12251
12252 i_ehdrp = elf_elfheader (abfd);
12253
06f44071
AM
12254 if (i_ehdrp->e_ident[EI_OSABI] == ELFOSABI_NONE)
12255 i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
d8045f23 12256
df3a023b
AM
12257 /* Set the osabi field to ELFOSABI_GNU if the binary contains
12258 SHF_GNU_MBIND sections or symbols of STT_GNU_IFUNC type or
12259 STB_GNU_UNIQUE binding. */
cc364be6
AM
12260 if (elf_tdata (abfd)->has_gnu_osabi != 0)
12261 {
12262 if (i_ehdrp->e_ident[EI_OSABI] == ELFOSABI_NONE)
12263 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_GNU;
12264 else if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_GNU
12265 && i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_FREEBSD)
12266 {
12267 if (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_mbind)
12268 _bfd_error_handler (_("GNU_MBIND section is unsupported"));
12269 if (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_ifunc)
12270 _bfd_error_handler (_("symbol type STT_GNU_IFUNC is unsupported"));
12271 if (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_unique)
12272 _bfd_error_handler (_("symbol binding STB_GNU_UNIQUE is unsupported"));
9aea1e31 12273 bfd_set_error (bfd_error_sorry);
cc364be6
AM
12274 return FALSE;
12275 }
12276 }
12277 return TRUE;
d1036acb 12278}
fcb93ecf
PB
12279
12280
12281/* Return TRUE for ELF symbol types that represent functions.
12282 This is the default version of this function, which is sufficient for
d8045f23 12283 most targets. It returns true if TYPE is STT_FUNC or STT_GNU_IFUNC. */
fcb93ecf
PB
12284
12285bfd_boolean
12286_bfd_elf_is_function_type (unsigned int type)
12287{
d8045f23
NC
12288 return (type == STT_FUNC
12289 || type == STT_GNU_IFUNC);
fcb93ecf 12290}
9f296da3 12291
aef36ac1
AM
12292/* If the ELF symbol SYM might be a function in SEC, return the
12293 function size and set *CODE_OFF to the function's entry point,
12294 otherwise return zero. */
9f296da3 12295
aef36ac1
AM
12296bfd_size_type
12297_bfd_elf_maybe_function_sym (const asymbol *sym, asection *sec,
12298 bfd_vma *code_off)
9f296da3 12299{
aef36ac1
AM
12300 bfd_size_type size;
12301
ff9e0f5b 12302 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
aef36ac1
AM
12303 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0
12304 || sym->section != sec)
12305 return 0;
ff9e0f5b 12306
ff9e0f5b 12307 *code_off = sym->value;
aef36ac1
AM
12308 size = 0;
12309 if (!(sym->flags & BSF_SYNTHETIC))
12310 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
12311 if (size == 0)
12312 size = 1;
12313 return size;
9f296da3 12314}
a8e14f4c
NC
12315
12316/* Set to non-zero to enable some debug messages. */
12317#define DEBUG_SECONDARY_RELOCS 0
12318
12319/* An internal-to-the-bfd-library only section type
12320 used to indicate a cached secondary reloc section. */
12321#define SHT_SECONDARY_RELOC (SHT_LOOS + SHT_RELA)
12322
12323/* Create a BFD section to hold a secondary reloc section. */
12324
12325bfd_boolean
12326_bfd_elf_init_secondary_reloc_section (bfd * abfd,
12327 Elf_Internal_Shdr *hdr,
12328 const char * name,
12329 unsigned int shindex)
12330{
12331 /* We only support RELA secondary relocs. */
12332 if (hdr->sh_type != SHT_RELA)
12333 return FALSE;
12334
12335#if DEBUG_SECONDARY_RELOCS
12336 fprintf (stderr, "secondary reloc section %s encountered\n", name);
12337#endif
12338 hdr->sh_type = SHT_SECONDARY_RELOC;
12339 return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
12340}
12341
12342/* Read in any secondary relocs associated with SEC. */
12343
12344bfd_boolean
12345_bfd_elf_slurp_secondary_reloc_section (bfd * abfd,
12346 asection * sec,
12347 asymbol ** symbols)
12348{
12349 const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
12350 asection * relsec;
12351 bfd_boolean result = TRUE;
12352 bfd_vma (*r_sym) (bfd_vma);
12353
12354#if BFD_DEFAULT_TARGET_SIZE > 32
12355 if (bfd_arch_bits_per_address (abfd) != 32)
12356 r_sym = elf64_r_sym;
12357 else
12358#endif
12359 r_sym = elf32_r_sym;
12360
12361 /* Discover if there are any secondary reloc sections
12362 associated with SEC. */
12363 for (relsec = abfd->sections; relsec != NULL; relsec = relsec->next)
12364 {
12365 Elf_Internal_Shdr * hdr = & elf_section_data (relsec)->this_hdr;
12366
12367 if (hdr->sh_type == SHT_SECONDARY_RELOC
12368 && hdr->sh_info == (unsigned) elf_section_data (sec)->this_idx)
12369 {
12370 bfd_byte * native_relocs;
12371 bfd_byte * native_reloc;
12372 arelent * internal_relocs;
12373 arelent * internal_reloc;
12374 unsigned int i;
12375 unsigned int entsize;
12376 unsigned int symcount;
12377 unsigned int reloc_count;
12378 size_t amt;
12379
12380 if (ebd->elf_info_to_howto == NULL)
12381 return FALSE;
12382
12383#if DEBUG_SECONDARY_RELOCS
12384 fprintf (stderr, "read secondary relocs for %s from %s\n",
12385 sec->name, relsec->name);
12386#endif
12387 entsize = hdr->sh_entsize;
12388
12389 native_relocs = bfd_malloc (hdr->sh_size);
12390 if (native_relocs == NULL)
12391 {
12392 result = FALSE;
12393 continue;
12394 }
12395
12396 reloc_count = NUM_SHDR_ENTRIES (hdr);
12397 if (_bfd_mul_overflow (reloc_count, sizeof (arelent), & amt))
12398 {
12399 bfd_set_error (bfd_error_file_too_big);
12400 result = FALSE;
12401 continue;
12402 }
12403
12404 internal_relocs = (arelent *) bfd_alloc (abfd, amt);
12405 if (internal_relocs == NULL)
12406 {
12407 free (native_relocs);
12408 result = FALSE;
12409 continue;
12410 }
12411
12412 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
12413 || (bfd_bread (native_relocs, hdr->sh_size, abfd)
12414 != hdr->sh_size))
12415 {
12416 free (native_relocs);
12417 free (internal_relocs);
12418 result = FALSE;
12419 continue;
12420 }
12421
12422 symcount = bfd_get_symcount (abfd);
12423
12424 for (i = 0, internal_reloc = internal_relocs,
12425 native_reloc = native_relocs;
12426 i < reloc_count;
12427 i++, internal_reloc++, native_reloc += entsize)
12428 {
12429 bfd_boolean res;
12430 Elf_Internal_Rela rela;
12431
12432 ebd->s->swap_reloca_in (abfd, native_reloc, & rela);
12433
12434 /* The address of an ELF reloc is section relative for an object
12435 file, and absolute for an executable file or shared library.
12436 The address of a normal BFD reloc is always section relative,
12437 and the address of a dynamic reloc is absolute.. */
12438 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
12439 internal_reloc->address = rela.r_offset;
12440 else
12441 internal_reloc->address = rela.r_offset - sec->vma;
12442
12443 if (r_sym (rela.r_info) == STN_UNDEF)
12444 {
12445 /* FIXME: This and the error case below mean that we
12446 have a symbol on relocs that is not elf_symbol_type. */
12447 internal_reloc->sym_ptr_ptr =
12448 bfd_abs_section_ptr->symbol_ptr_ptr;
12449 }
12450 else if (r_sym (rela.r_info) > symcount)
12451 {
12452 _bfd_error_handler
12453 /* xgettext:c-format */
12454 (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
12455 abfd, sec, i, (long) r_sym (rela.r_info));
12456 bfd_set_error (bfd_error_bad_value);
12457 internal_reloc->sym_ptr_ptr =
12458 bfd_abs_section_ptr->symbol_ptr_ptr;
12459 result = FALSE;
12460 }
12461 else
12462 {
12463 asymbol **ps;
12464
12465 ps = symbols + r_sym (rela.r_info) - 1;
12466
12467 internal_reloc->sym_ptr_ptr = ps;
12468 /* Make sure that this symbol is not removed by strip. */
12469 (*ps)->flags |= BSF_KEEP;
12470 }
12471
12472 internal_reloc->addend = rela.r_addend;
12473
12474 res = ebd->elf_info_to_howto (abfd, internal_reloc, & rela);
12475 if (! res || internal_reloc->howto == NULL)
12476 {
12477#if DEBUG_SECONDARY_RELOCS
12478 fprintf (stderr, "there is no howto associated with reloc %lx\n",
12479 rela.r_info);
12480#endif
12481 result = FALSE;
12482 }
12483 }
12484
12485 free (native_relocs);
12486 /* Store the internal relocs. */
12487 elf_section_data (relsec)->sec_info = internal_relocs;
12488 }
12489 }
12490
12491 return result;
12492}
12493
12494/* Set the ELF section header fields of an output secondary reloc section. */
12495
12496bfd_boolean
12497_bfd_elf_copy_special_section_fields (const bfd * ibfd ATTRIBUTE_UNUSED,
12498 bfd * obfd ATTRIBUTE_UNUSED,
12499 const Elf_Internal_Shdr * isection,
12500 Elf_Internal_Shdr * osection)
12501{
12502 asection * isec;
12503 asection * osec;
12504
12505 if (isection == NULL)
12506 return FALSE;
12507
12508 if (isection->sh_type != SHT_SECONDARY_RELOC)
12509 return TRUE;
12510
12511 isec = isection->bfd_section;
12512 if (isec == NULL)
12513 return FALSE;
12514
12515 osec = osection->bfd_section;
12516 if (osec == NULL)
12517 return FALSE;
12518
12519 BFD_ASSERT (elf_section_data (osec)->sec_info == NULL);
12520 elf_section_data (osec)->sec_info = elf_section_data (isec)->sec_info;
12521 osection->sh_type = SHT_RELA;
12522 osection->sh_link = elf_onesymtab (obfd);
12523 if (osection->sh_link == 0)
12524 {
12525 /* There is no symbol table - we are hosed... */
12526 _bfd_error_handler
12527 /* xgettext:c-format */
12528 (_("%pB(%pA): link section cannot be set because the output file does not have a symbol table"),
12529 obfd, osec);
12530 bfd_set_error (bfd_error_bad_value);
12531 return FALSE;
12532 }
12533
12534 /* Find the output section that corresponds to the isection's sh_info link. */
12535 BFD_ASSERT (isection->sh_info > 0
12536 && isection->sh_info < elf_numsections (ibfd));
12537 isection = elf_elfsections (ibfd)[isection->sh_info];
12538
12539 BFD_ASSERT (isection != NULL);
12540 BFD_ASSERT (isection->bfd_section != NULL);
12541 BFD_ASSERT (isection->bfd_section->output_section != NULL);
12542 osection->sh_info =
12543 elf_section_data (isection->bfd_section->output_section)->this_idx;
12544
12545#if DEBUG_SECONDARY_RELOCS
12546 fprintf (stderr, "update header of %s, sh_link = %u, sh_info = %u\n",
12547 osec->name, osection->sh_link, osection->sh_info);
12548#endif
12549
12550 return TRUE;
12551}
12552
12553/* Write out a secondary reloc section. */
12554
12555bfd_boolean
12556_bfd_elf_write_secondary_reloc_section (bfd *abfd, asection *sec)
12557{
12558 const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
12559 bfd_vma addr_offset;
12560 asection * relsec;
12561 bfd_vma (*r_info) (bfd_vma, bfd_vma);
12562
12563#if BFD_DEFAULT_TARGET_SIZE > 32
12564 if (bfd_arch_bits_per_address (abfd) != 32)
12565 r_info = elf64_r_info;
12566 else
12567#endif
12568 r_info = elf32_r_info;
12569
12570 if (sec == NULL)
12571 return FALSE;
12572
12573 /* The address of an ELF reloc is section relative for an object
12574 file, and absolute for an executable file or shared library.
12575 The address of a BFD reloc is always section relative. */
12576 addr_offset = 0;
12577 if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
12578 addr_offset = sec->vma;
12579
12580 /* Discover if there are any secondary reloc sections
12581 associated with SEC. */
12582 for (relsec = abfd->sections; relsec != NULL; relsec = relsec->next)
12583 {
12584 const struct bfd_elf_section_data * const esd = elf_section_data (relsec);
12585 Elf_Internal_Shdr * const hdr = (Elf_Internal_Shdr *) & esd->this_hdr;
12586
12587 if (hdr->sh_type == SHT_RELA
12588 && hdr->sh_info == (unsigned) elf_section_data (sec)->this_idx)
12589 {
12590 asymbol * last_sym;
12591 int last_sym_idx;
12592 unsigned int reloc_count;
12593 unsigned int idx;
12594 arelent * src_irel;
12595 bfd_byte * dst_rela;
12596
12597 BFD_ASSERT (hdr->contents == NULL);
12598
12599 reloc_count = hdr->sh_size / hdr->sh_entsize;
12600 BFD_ASSERT (reloc_count > 0);
12601
12602 hdr->contents = bfd_alloc (abfd, hdr->sh_size);
12603 if (hdr->contents == NULL)
12604 continue;
12605
12606#if DEBUG_SECONDARY_RELOCS
12607 fprintf (stderr, "write %u secondary relocs for %s from %s\n",
12608 reloc_count, sec->name, relsec->name);
12609#endif
12610 last_sym = NULL;
12611 last_sym_idx = 0;
12612 dst_rela = hdr->contents;
12613 src_irel = (arelent *) esd->sec_info;
12614 BFD_ASSERT (src_irel != NULL);
12615
12616 for (idx = 0; idx < reloc_count; idx++, dst_rela += hdr->sh_entsize)
12617 {
12618 Elf_Internal_Rela src_rela;
12619 arelent *ptr;
12620 asymbol *sym;
12621 int n;
12622
12623 ptr = src_irel + idx;
12624 sym = *ptr->sym_ptr_ptr;
12625
12626 if (sym == last_sym)
12627 n = last_sym_idx;
12628 else
12629 {
12630 last_sym = sym;
12631 n = _bfd_elf_symbol_from_bfd_symbol (abfd, & sym);
12632 if (n < 0)
12633 {
12634#if DEBUG_SECONDARY_RELOCS
12635 fprintf (stderr, "failed to find symbol %s whilst rewriting relocs\n",
12636 sym->name);
12637#endif
12638 /* FIXME: Signal failure somehow. */
12639 n = 0;
12640 }
12641 last_sym_idx = n;
12642 }
12643
12644 if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
12645 && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
12646 && ! _bfd_elf_validate_reloc (abfd, ptr))
12647 {
12648#if DEBUG_SECONDARY_RELOCS
12649 fprintf (stderr, "symbol %s is not in the output bfd\n",
12650 sym->name);
12651#endif
12652 /* FIXME: Signal failure somehow. */
12653 n = 0;
12654 }
12655
12656 if (ptr->howto == NULL)
12657 {
12658#if DEBUG_SECONDARY_RELOCS
12659 fprintf (stderr, "reloc for symbol %s does not have a howto associated with it\n",
12660 sym->name);
12661#endif
12662 /* FIXME: Signal failure somehow. */
12663 n = 0;
12664 }
12665
12666 src_rela.r_offset = ptr->address + addr_offset;
12667 src_rela.r_info = r_info (n, ptr->howto->type);
12668 src_rela.r_addend = ptr->addend;
12669 ebd->s->swap_reloca_out (abfd, &src_rela, dst_rela);
12670 }
12671 }
12672 }
12673
12674 return TRUE;
12675}