]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elf.c
Update the config.guess and config.sub files from the master repository and regenerat...
[thirdparty/binutils-gdb.git] / bfd / elf.c
CommitLineData
252b5132 1/* ELF executable support for BFD.
340b6d91 2
a2c58332 3 Copyright (C) 1993-2022 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 *);
0a1b45a2
AM
53static bool assign_file_positions_except_relocs (bfd *, struct bfd_link_info *);
54static bool swap_out_syms (bfd *, struct elf_strtab_hash **, int,
55 struct bfd_link_info *);
56static bool elf_parse_notes (bfd *abfd, char *buf, size_t size,
57 file_ptr offset, size_t align);
50b2bdb7 58
252b5132
RH
59/* Swap version information in and out. The version information is
60 currently size independent. If that ever changes, this code will
61 need to move into elfcode.h. */
62
63/* Swap in a Verdef structure. */
64
65void
217aa764
AM
66_bfd_elf_swap_verdef_in (bfd *abfd,
67 const Elf_External_Verdef *src,
68 Elf_Internal_Verdef *dst)
252b5132 69{
dc810e39
AM
70 dst->vd_version = H_GET_16 (abfd, src->vd_version);
71 dst->vd_flags = H_GET_16 (abfd, src->vd_flags);
72 dst->vd_ndx = H_GET_16 (abfd, src->vd_ndx);
73 dst->vd_cnt = H_GET_16 (abfd, src->vd_cnt);
74 dst->vd_hash = H_GET_32 (abfd, src->vd_hash);
75 dst->vd_aux = H_GET_32 (abfd, src->vd_aux);
76 dst->vd_next = H_GET_32 (abfd, src->vd_next);
252b5132
RH
77}
78
79/* Swap out a Verdef structure. */
80
81void
217aa764
AM
82_bfd_elf_swap_verdef_out (bfd *abfd,
83 const Elf_Internal_Verdef *src,
84 Elf_External_Verdef *dst)
252b5132 85{
dc810e39
AM
86 H_PUT_16 (abfd, src->vd_version, dst->vd_version);
87 H_PUT_16 (abfd, src->vd_flags, dst->vd_flags);
88 H_PUT_16 (abfd, src->vd_ndx, dst->vd_ndx);
89 H_PUT_16 (abfd, src->vd_cnt, dst->vd_cnt);
90 H_PUT_32 (abfd, src->vd_hash, dst->vd_hash);
91 H_PUT_32 (abfd, src->vd_aux, dst->vd_aux);
92 H_PUT_32 (abfd, src->vd_next, dst->vd_next);
252b5132
RH
93}
94
95/* Swap in a Verdaux structure. */
96
97void
217aa764
AM
98_bfd_elf_swap_verdaux_in (bfd *abfd,
99 const Elf_External_Verdaux *src,
100 Elf_Internal_Verdaux *dst)
252b5132 101{
dc810e39
AM
102 dst->vda_name = H_GET_32 (abfd, src->vda_name);
103 dst->vda_next = H_GET_32 (abfd, src->vda_next);
252b5132
RH
104}
105
106/* Swap out a Verdaux structure. */
107
108void
217aa764
AM
109_bfd_elf_swap_verdaux_out (bfd *abfd,
110 const Elf_Internal_Verdaux *src,
111 Elf_External_Verdaux *dst)
252b5132 112{
dc810e39
AM
113 H_PUT_32 (abfd, src->vda_name, dst->vda_name);
114 H_PUT_32 (abfd, src->vda_next, dst->vda_next);
252b5132
RH
115}
116
117/* Swap in a Verneed structure. */
118
119void
217aa764
AM
120_bfd_elf_swap_verneed_in (bfd *abfd,
121 const Elf_External_Verneed *src,
122 Elf_Internal_Verneed *dst)
252b5132 123{
dc810e39
AM
124 dst->vn_version = H_GET_16 (abfd, src->vn_version);
125 dst->vn_cnt = H_GET_16 (abfd, src->vn_cnt);
126 dst->vn_file = H_GET_32 (abfd, src->vn_file);
127 dst->vn_aux = H_GET_32 (abfd, src->vn_aux);
128 dst->vn_next = H_GET_32 (abfd, src->vn_next);
252b5132
RH
129}
130
131/* Swap out a Verneed structure. */
132
133void
217aa764
AM
134_bfd_elf_swap_verneed_out (bfd *abfd,
135 const Elf_Internal_Verneed *src,
136 Elf_External_Verneed *dst)
252b5132 137{
dc810e39
AM
138 H_PUT_16 (abfd, src->vn_version, dst->vn_version);
139 H_PUT_16 (abfd, src->vn_cnt, dst->vn_cnt);
140 H_PUT_32 (abfd, src->vn_file, dst->vn_file);
141 H_PUT_32 (abfd, src->vn_aux, dst->vn_aux);
142 H_PUT_32 (abfd, src->vn_next, dst->vn_next);
252b5132
RH
143}
144
145/* Swap in a Vernaux structure. */
146
147void
217aa764
AM
148_bfd_elf_swap_vernaux_in (bfd *abfd,
149 const Elf_External_Vernaux *src,
150 Elf_Internal_Vernaux *dst)
252b5132 151{
dc810e39
AM
152 dst->vna_hash = H_GET_32 (abfd, src->vna_hash);
153 dst->vna_flags = H_GET_16 (abfd, src->vna_flags);
154 dst->vna_other = H_GET_16 (abfd, src->vna_other);
155 dst->vna_name = H_GET_32 (abfd, src->vna_name);
156 dst->vna_next = H_GET_32 (abfd, src->vna_next);
252b5132
RH
157}
158
159/* Swap out a Vernaux structure. */
160
161void
217aa764
AM
162_bfd_elf_swap_vernaux_out (bfd *abfd,
163 const Elf_Internal_Vernaux *src,
164 Elf_External_Vernaux *dst)
252b5132 165{
dc810e39
AM
166 H_PUT_32 (abfd, src->vna_hash, dst->vna_hash);
167 H_PUT_16 (abfd, src->vna_flags, dst->vna_flags);
168 H_PUT_16 (abfd, src->vna_other, dst->vna_other);
169 H_PUT_32 (abfd, src->vna_name, dst->vna_name);
170 H_PUT_32 (abfd, src->vna_next, dst->vna_next);
252b5132
RH
171}
172
173/* Swap in a Versym structure. */
174
175void
217aa764
AM
176_bfd_elf_swap_versym_in (bfd *abfd,
177 const Elf_External_Versym *src,
178 Elf_Internal_Versym *dst)
252b5132 179{
dc810e39 180 dst->vs_vers = H_GET_16 (abfd, src->vs_vers);
252b5132
RH
181}
182
183/* Swap out a Versym structure. */
184
185void
217aa764
AM
186_bfd_elf_swap_versym_out (bfd *abfd,
187 const Elf_Internal_Versym *src,
188 Elf_External_Versym *dst)
252b5132 189{
dc810e39 190 H_PUT_16 (abfd, src->vs_vers, dst->vs_vers);
252b5132
RH
191}
192
193/* Standard ELF hash function. Do not change this function; you will
194 cause invalid hash tables to be generated. */
3a99b017 195
252b5132 196unsigned long
217aa764 197bfd_elf_hash (const char *namearg)
252b5132 198{
3a99b017 199 const unsigned char *name = (const unsigned char *) namearg;
252b5132
RH
200 unsigned long h = 0;
201 unsigned long g;
202 int ch;
203
204 while ((ch = *name++) != '\0')
205 {
206 h = (h << 4) + ch;
207 if ((g = (h & 0xf0000000)) != 0)
208 {
209 h ^= g >> 24;
210 /* The ELF ABI says `h &= ~g', but this is equivalent in
211 this case and on some machines one insn instead of two. */
212 h ^= g;
213 }
214 }
32dfa85d 215 return h & 0xffffffff;
252b5132
RH
216}
217
fdc90cb4
JJ
218/* DT_GNU_HASH hash function. Do not change this function; you will
219 cause invalid hash tables to be generated. */
220
221unsigned long
222bfd_elf_gnu_hash (const char *namearg)
223{
224 const unsigned char *name = (const unsigned char *) namearg;
225 unsigned long h = 5381;
226 unsigned char ch;
227
228 while ((ch = *name++) != '\0')
229 h = (h << 5) + h + ch;
230 return h & 0xffffffff;
231}
232
0c8d6e5c
AM
233/* Create a tdata field OBJECT_SIZE bytes in length, zeroed out and with
234 the object_id field of an elf_obj_tdata field set to OBJECT_ID. */
0a1b45a2 235bool
0c8d6e5c 236bfd_elf_allocate_object (bfd *abfd,
0ffa91dd 237 size_t object_size,
4dfe6ac6 238 enum elf_target_id object_id)
252b5132 239{
0ffa91dd
NC
240 BFD_ASSERT (object_size >= sizeof (struct elf_obj_tdata));
241 abfd->tdata.any = bfd_zalloc (abfd, object_size);
242 if (abfd->tdata.any == NULL)
0a1b45a2 243 return false;
252b5132 244
0ffa91dd 245 elf_object_id (abfd) = object_id;
c0355132
AM
246 if (abfd->direction != read_direction)
247 {
248 struct output_elf_obj_tdata *o = bfd_zalloc (abfd, sizeof *o);
249 if (o == NULL)
0a1b45a2 250 return false;
c0355132
AM
251 elf_tdata (abfd)->o = o;
252 elf_program_header_size (abfd) = (bfd_size_type) -1;
253 }
0a1b45a2 254 return true;
252b5132
RH
255}
256
0ffa91dd 257
0a1b45a2 258bool
ae95ffa6 259bfd_elf_make_object (bfd *abfd)
0ffa91dd 260{
ae95ffa6 261 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
0ffa91dd 262 return bfd_elf_allocate_object (abfd, sizeof (struct elf_obj_tdata),
ae95ffa6 263 bed->target_id);
0ffa91dd
NC
264}
265
0a1b45a2 266bool
217aa764 267bfd_elf_mkcorefile (bfd *abfd)
252b5132 268{
c044fabd 269 /* I think this can be done just like an object file. */
228e534f 270 if (!abfd->xvec->_bfd_set_format[(int) bfd_object] (abfd))
0a1b45a2 271 return false;
228e534f
AM
272 elf_tdata (abfd)->core = bfd_zalloc (abfd, sizeof (*elf_tdata (abfd)->core));
273 return elf_tdata (abfd)->core != NULL;
252b5132
RH
274}
275
6d5944fc 276char *
217aa764 277bfd_elf_get_str_section (bfd *abfd, unsigned int shindex)
252b5132
RH
278{
279 Elf_Internal_Shdr **i_shdrp;
f075ee0c 280 bfd_byte *shstrtab = NULL;
dc810e39
AM
281 file_ptr offset;
282 bfd_size_type shstrtabsize;
252b5132
RH
283
284 i_shdrp = elf_elfsections (abfd);
74f2e02b
AM
285 if (i_shdrp == 0
286 || shindex >= elf_numsections (abfd)
287 || i_shdrp[shindex] == 0)
f075ee0c 288 return NULL;
252b5132 289
f075ee0c 290 shstrtab = i_shdrp[shindex]->contents;
252b5132
RH
291 if (shstrtab == NULL)
292 {
c044fabd 293 /* No cached one, attempt to read, and cache what we read. */
252b5132
RH
294 offset = i_shdrp[shindex]->sh_offset;
295 shstrtabsize = i_shdrp[shindex]->sh_size;
c6c60d09
JJ
296
297 /* Allocate and clear an extra byte at the end, to prevent crashes
298 in case the string table is not terminated. */
3471d59d 299 if (shstrtabsize + 1 <= 1
06614111 300 || bfd_seek (abfd, offset, SEEK_SET) != 0
2bb3687b
AM
301 || (shstrtab = _bfd_alloc_and_read (abfd, shstrtabsize + 1,
302 shstrtabsize)) == NULL)
303 {
3471d59d
CC
304 /* Once we've failed to read it, make sure we don't keep
305 trying. Otherwise, we'll keep allocating space for
306 the string table over and over. */
307 i_shdrp[shindex]->sh_size = 0;
c6c60d09
JJ
308 }
309 else
310 shstrtab[shstrtabsize] = '\0';
217aa764 311 i_shdrp[shindex]->contents = shstrtab;
252b5132 312 }
f075ee0c 313 return (char *) shstrtab;
252b5132
RH
314}
315
316char *
217aa764
AM
317bfd_elf_string_from_elf_section (bfd *abfd,
318 unsigned int shindex,
319 unsigned int strindex)
252b5132
RH
320{
321 Elf_Internal_Shdr *hdr;
322
323 if (strindex == 0)
324 return "";
325
74f2e02b
AM
326 if (elf_elfsections (abfd) == NULL || shindex >= elf_numsections (abfd))
327 return NULL;
328
252b5132
RH
329 hdr = elf_elfsections (abfd)[shindex];
330
06614111
NC
331 if (hdr->contents == NULL)
332 {
333 if (hdr->sh_type != SHT_STRTAB && hdr->sh_type < SHT_LOOS)
334 {
335 /* PR 17512: file: f057ec89. */
695344c0 336 /* xgettext:c-format */
871b3ab2 337 _bfd_error_handler (_("%pB: attempt to load strings from"
63a5468a 338 " a non-string section (number %d)"),
06614111
NC
339 abfd, shindex);
340 return NULL;
341 }
b1fa9dd6 342
06614111
NC
343 if (bfd_elf_get_str_section (abfd, shindex) == NULL)
344 return NULL;
345 }
eed5def8
NC
346 else
347 {
348 /* PR 24273: The string section's contents may have already
349 been loaded elsewhere, eg because a corrupt file has the
350 string section index in the ELF header pointing at a group
351 section. So be paranoid, and test that the last byte of
352 the section is zero. */
353 if (hdr->sh_size == 0 || hdr->contents[hdr->sh_size - 1] != 0)
354 return NULL;
355 }
252b5132
RH
356
357 if (strindex >= hdr->sh_size)
358 {
1b3a8575 359 unsigned int shstrndx = elf_elfheader(abfd)->e_shstrndx;
4eca0228 360 _bfd_error_handler
695344c0 361 /* xgettext:c-format */
2dcf00ce
AM
362 (_("%pB: invalid string offset %u >= %" PRIu64 " for section `%s'"),
363 abfd, strindex, (uint64_t) hdr->sh_size,
1b3a8575 364 (shindex == shstrndx && strindex == hdr->sh_name
252b5132 365 ? ".shstrtab"
1b3a8575 366 : bfd_elf_string_from_elf_section (abfd, shstrndx, hdr->sh_name)));
45b222d6 367 return NULL;
252b5132
RH
368 }
369
370 return ((char *) hdr->contents) + strindex;
371}
372
6cdc0ccc
AM
373/* Read and convert symbols to internal format.
374 SYMCOUNT specifies the number of symbols to read, starting from
375 symbol SYMOFFSET. If any of INTSYM_BUF, EXTSYM_BUF or EXTSHNDX_BUF
376 are non-NULL, they are used to store the internal symbols, external
b7c368d0
NC
377 symbols, and symbol section index extensions, respectively.
378 Returns a pointer to the internal symbol buffer (malloced if necessary)
379 or NULL if there were no symbols or some kind of problem. */
6cdc0ccc
AM
380
381Elf_Internal_Sym *
217aa764
AM
382bfd_elf_get_elf_syms (bfd *ibfd,
383 Elf_Internal_Shdr *symtab_hdr,
384 size_t symcount,
385 size_t symoffset,
386 Elf_Internal_Sym *intsym_buf,
387 void *extsym_buf,
388 Elf_External_Sym_Shndx *extshndx_buf)
6cdc0ccc
AM
389{
390 Elf_Internal_Shdr *shndx_hdr;
217aa764 391 void *alloc_ext;
df622259 392 const bfd_byte *esym;
6cdc0ccc
AM
393 Elf_External_Sym_Shndx *alloc_extshndx;
394 Elf_External_Sym_Shndx *shndx;
4dd07732 395 Elf_Internal_Sym *alloc_intsym;
6cdc0ccc
AM
396 Elf_Internal_Sym *isym;
397 Elf_Internal_Sym *isymend;
9c5bfbb7 398 const struct elf_backend_data *bed;
6cdc0ccc 399 size_t extsym_size;
1f4361a7 400 size_t amt;
6cdc0ccc
AM
401 file_ptr pos;
402
e44a2c9c
AM
403 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
404 abort ();
405
6cdc0ccc
AM
406 if (symcount == 0)
407 return intsym_buf;
408
409 /* Normal syms might have section extension entries. */
410 shndx_hdr = NULL;
6a40cf0c
NC
411 if (elf_symtab_shndx_list (ibfd) != NULL)
412 {
413 elf_section_list * entry;
414 Elf_Internal_Shdr **sections = elf_elfsections (ibfd);
415
416 /* Find an index section that is linked to this symtab section. */
417 for (entry = elf_symtab_shndx_list (ibfd); entry != NULL; entry = entry->next)
315350be
NC
418 {
419 /* PR 20063. */
420 if (entry->hdr.sh_link >= elf_numsections (ibfd))
421 continue;
422
423 if (sections[entry->hdr.sh_link] == symtab_hdr)
424 {
425 shndx_hdr = & entry->hdr;
426 break;
427 };
428 }
6a40cf0c
NC
429
430 if (shndx_hdr == NULL)
431 {
432 if (symtab_hdr == & elf_symtab_hdr (ibfd))
433 /* Not really accurate, but this was how the old code used to work. */
434 shndx_hdr = & elf_symtab_shndx_list (ibfd)->hdr;
435 /* Otherwise we do nothing. The assumption is that
436 the index table will not be needed. */
437 }
438 }
6cdc0ccc
AM
439
440 /* Read the symbols. */
441 alloc_ext = NULL;
442 alloc_extshndx = NULL;
4dd07732 443 alloc_intsym = NULL;
6cdc0ccc
AM
444 bed = get_elf_backend_data (ibfd);
445 extsym_size = bed->s->sizeof_sym;
1f4361a7
AM
446 if (_bfd_mul_overflow (symcount, extsym_size, &amt))
447 {
448 bfd_set_error (bfd_error_file_too_big);
449 intsym_buf = NULL;
450 goto out;
451 }
6cdc0ccc
AM
452 pos = symtab_hdr->sh_offset + symoffset * extsym_size;
453 if (extsym_buf == NULL)
454 {
1f4361a7 455 alloc_ext = bfd_malloc (amt);
6cdc0ccc
AM
456 extsym_buf = alloc_ext;
457 }
458 if (extsym_buf == NULL
459 || bfd_seek (ibfd, pos, SEEK_SET) != 0
460 || bfd_bread (extsym_buf, amt, ibfd) != amt)
461 {
462 intsym_buf = NULL;
463 goto out;
464 }
465
466 if (shndx_hdr == NULL || shndx_hdr->sh_size == 0)
467 extshndx_buf = NULL;
468 else
469 {
1f4361a7
AM
470 if (_bfd_mul_overflow (symcount, sizeof (Elf_External_Sym_Shndx), &amt))
471 {
472 bfd_set_error (bfd_error_file_too_big);
473 intsym_buf = NULL;
474 goto out;
475 }
6cdc0ccc
AM
476 pos = shndx_hdr->sh_offset + symoffset * sizeof (Elf_External_Sym_Shndx);
477 if (extshndx_buf == NULL)
478 {
1f4361a7 479 alloc_extshndx = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
6cdc0ccc
AM
480 extshndx_buf = alloc_extshndx;
481 }
482 if (extshndx_buf == NULL
483 || bfd_seek (ibfd, pos, SEEK_SET) != 0
484 || bfd_bread (extshndx_buf, amt, ibfd) != amt)
485 {
486 intsym_buf = NULL;
487 goto out;
488 }
489 }
490
491 if (intsym_buf == NULL)
492 {
1f4361a7
AM
493 if (_bfd_mul_overflow (symcount, sizeof (Elf_Internal_Sym), &amt))
494 {
495 bfd_set_error (bfd_error_file_too_big);
496 goto out;
497 }
498 alloc_intsym = (Elf_Internal_Sym *) bfd_malloc (amt);
4dd07732 499 intsym_buf = alloc_intsym;
6cdc0ccc
AM
500 if (intsym_buf == NULL)
501 goto out;
502 }
503
504 /* Convert the symbols to internal form. */
505 isymend = intsym_buf + symcount;
a50b1753 506 for (esym = (const bfd_byte *) extsym_buf, isym = intsym_buf,
07d6d2b8 507 shndx = extshndx_buf;
6cdc0ccc
AM
508 isym < isymend;
509 esym += extsym_size, isym++, shndx = shndx != NULL ? shndx + 1 : NULL)
8384fb8f
AM
510 if (!(*bed->s->swap_symbol_in) (ibfd, esym, shndx, isym))
511 {
512 symoffset += (esym - (bfd_byte *) extsym_buf) / extsym_size;
695344c0 513 /* xgettext:c-format */
871b3ab2 514 _bfd_error_handler (_("%pB symbol number %lu references"
63a5468a 515 " nonexistent SHT_SYMTAB_SHNDX section"),
4eca0228 516 ibfd, (unsigned long) symoffset);
c9594989 517 free (alloc_intsym);
8384fb8f
AM
518 intsym_buf = NULL;
519 goto out;
520 }
6cdc0ccc
AM
521
522 out:
c9594989
AM
523 free (alloc_ext);
524 free (alloc_extshndx);
6cdc0ccc
AM
525
526 return intsym_buf;
527}
528
5cab59f6
AM
529/* Look up a symbol name. */
530const char *
be8dd2ca
AM
531bfd_elf_sym_name (bfd *abfd,
532 Elf_Internal_Shdr *symtab_hdr,
26c61ae5
L
533 Elf_Internal_Sym *isym,
534 asection *sym_sec)
5cab59f6 535{
26c61ae5 536 const char *name;
5cab59f6 537 unsigned int iname = isym->st_name;
be8dd2ca 538 unsigned int shindex = symtab_hdr->sh_link;
26c61ae5 539
138f35cc
JJ
540 if (iname == 0 && ELF_ST_TYPE (isym->st_info) == STT_SECTION
541 /* Check for a bogus st_shndx to avoid crashing. */
4fbb74a6 542 && isym->st_shndx < elf_numsections (abfd))
5cab59f6
AM
543 {
544 iname = elf_elfsections (abfd)[isym->st_shndx]->sh_name;
545 shindex = elf_elfheader (abfd)->e_shstrndx;
546 }
547
26c61ae5
L
548 name = bfd_elf_string_from_elf_section (abfd, shindex, iname);
549 if (name == NULL)
550 name = "(null)";
551 else if (sym_sec && *name == '\0')
fd361982 552 name = bfd_section_name (sym_sec);
26c61ae5
L
553
554 return name;
5cab59f6
AM
555}
556
dbb410c3
AM
557/* Elf_Internal_Shdr->contents is an array of these for SHT_GROUP
558 sections. The first element is the flags, the rest are section
559 pointers. */
560
561typedef union elf_internal_group {
562 Elf_Internal_Shdr *shdr;
563 unsigned int flags;
564} Elf_Internal_Group;
565
b885599b
AM
566/* Return the name of the group signature symbol. Why isn't the
567 signature just a string? */
568
569static const char *
217aa764 570group_signature (bfd *abfd, Elf_Internal_Shdr *ghdr)
b885599b 571{
9dce4196 572 Elf_Internal_Shdr *hdr;
9dce4196
AM
573 unsigned char esym[sizeof (Elf64_External_Sym)];
574 Elf_External_Sym_Shndx eshndx;
575 Elf_Internal_Sym isym;
b885599b 576
13792e9d
L
577 /* First we need to ensure the symbol table is available. Make sure
578 that it is a symbol table section. */
4fbb74a6
AM
579 if (ghdr->sh_link >= elf_numsections (abfd))
580 return NULL;
13792e9d
L
581 hdr = elf_elfsections (abfd) [ghdr->sh_link];
582 if (hdr->sh_type != SHT_SYMTAB
583 || ! bfd_section_from_shdr (abfd, ghdr->sh_link))
b885599b
AM
584 return NULL;
585
9dce4196
AM
586 /* Go read the symbol. */
587 hdr = &elf_tdata (abfd)->symtab_hdr;
6cdc0ccc
AM
588 if (bfd_elf_get_elf_syms (abfd, hdr, 1, ghdr->sh_info,
589 &isym, esym, &eshndx) == NULL)
b885599b 590 return NULL;
9dce4196 591
26c61ae5 592 return bfd_elf_sym_name (abfd, hdr, &isym, NULL);
b885599b
AM
593}
594
dbb410c3
AM
595/* Set next_in_group list pointer, and group name for NEWSECT. */
596
0a1b45a2 597static bool
217aa764 598setup_group (bfd *abfd, Elf_Internal_Shdr *hdr, asection *newsect)
dbb410c3
AM
599{
600 unsigned int num_group = elf_tdata (abfd)->num_group;
601
602 /* If num_group is zero, read in all SHT_GROUP sections. The count
603 is set to -1 if there are no SHT_GROUP sections. */
604 if (num_group == 0)
605 {
606 unsigned int i, shnum;
607
608 /* First count the number of groups. If we have a SHT_GROUP
609 section with just a flag word (ie. sh_size is 4), ignore it. */
9ad5cbcf 610 shnum = elf_numsections (abfd);
dbb410c3 611 num_group = 0;
08a40648 612
44534af3 613#define IS_VALID_GROUP_SECTION_HEADER(shdr, minsize) \
1783205a 614 ( (shdr)->sh_type == SHT_GROUP \
44534af3 615 && (shdr)->sh_size >= minsize \
1783205a
NC
616 && (shdr)->sh_entsize == GRP_ENTRY_SIZE \
617 && ((shdr)->sh_size % GRP_ENTRY_SIZE) == 0)
08a40648 618
dbb410c3
AM
619 for (i = 0; i < shnum; i++)
620 {
621 Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[i];
1783205a 622
44534af3 623 if (IS_VALID_GROUP_SECTION_HEADER (shdr, 2 * GRP_ENTRY_SIZE))
dbb410c3
AM
624 num_group += 1;
625 }
626
627 if (num_group == 0)
20dbb49d
L
628 {
629 num_group = (unsigned) -1;
630 elf_tdata (abfd)->num_group = num_group;
ce497010 631 elf_tdata (abfd)->group_sect_ptr = NULL;
20dbb49d
L
632 }
633 else
dbb410c3
AM
634 {
635 /* We keep a list of elf section headers for group sections,
636 so we can find them quickly. */
1f4361a7 637 size_t amt;
d0fb9a8d 638
20dbb49d 639 elf_tdata (abfd)->num_group = num_group;
1f4361a7
AM
640 amt = num_group * sizeof (Elf_Internal_Shdr *);
641 elf_tdata (abfd)->group_sect_ptr
642 = (Elf_Internal_Shdr **) bfd_zalloc (abfd, amt);
dbb410c3 643 if (elf_tdata (abfd)->group_sect_ptr == NULL)
0a1b45a2 644 return false;
dbb410c3 645 num_group = 0;
ce497010 646
dbb410c3
AM
647 for (i = 0; i < shnum; i++)
648 {
649 Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[i];
1783205a 650
44534af3 651 if (IS_VALID_GROUP_SECTION_HEADER (shdr, 2 * GRP_ENTRY_SIZE))
dbb410c3 652 {
973ffd63 653 unsigned char *src;
dbb410c3
AM
654 Elf_Internal_Group *dest;
655
07d6d2b8
AM
656 /* Make sure the group section has a BFD section
657 attached to it. */
658 if (!bfd_section_from_shdr (abfd, i))
0a1b45a2 659 return false;
07d6d2b8 660
dbb410c3
AM
661 /* Add to list of sections. */
662 elf_tdata (abfd)->group_sect_ptr[num_group] = shdr;
663 num_group += 1;
664
665 /* Read the raw contents. */
1f4361a7
AM
666 BFD_ASSERT (sizeof (*dest) >= 4 && sizeof (*dest) % 4 == 0);
667 shdr->contents = NULL;
668 if (_bfd_mul_overflow (shdr->sh_size,
669 sizeof (*dest) / 4, &amt)
1f4361a7 670 || bfd_seek (abfd, shdr->sh_offset, SEEK_SET) != 0
2bb3687b
AM
671 || !(shdr->contents
672 = _bfd_alloc_and_read (abfd, amt, shdr->sh_size)))
493a3386
NC
673 {
674 _bfd_error_handler
695344c0 675 /* xgettext:c-format */
871b3ab2 676 (_("%pB: invalid size field in group section"
2dcf00ce
AM
677 " header: %#" PRIx64 ""),
678 abfd, (uint64_t) shdr->sh_size);
493a3386
NC
679 bfd_set_error (bfd_error_bad_value);
680 -- num_group;
493a3386
NC
681 continue;
682 }
708d7d0d 683
dbb410c3
AM
684 /* Translate raw contents, a flag word followed by an
685 array of elf section indices all in target byte order,
686 to the flag word followed by an array of elf section
687 pointers. */
688 src = shdr->contents + shdr->sh_size;
689 dest = (Elf_Internal_Group *) (shdr->contents + amt);
06614111 690
dbb410c3
AM
691 while (1)
692 {
693 unsigned int idx;
694
695 src -= 4;
696 --dest;
697 idx = H_GET_32 (abfd, src);
698 if (src == shdr->contents)
699 {
327301a4 700 dest->shdr = NULL;
dbb410c3 701 dest->flags = idx;
b885599b
AM
702 if (shdr->bfd_section != NULL && (idx & GRP_COMDAT))
703 shdr->bfd_section->flags
704 |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
dbb410c3
AM
705 break;
706 }
4bba0fb1 707 if (idx < shnum)
bae363f1
L
708 {
709 dest->shdr = elf_elfsections (abfd)[idx];
710 /* PR binutils/23199: All sections in a
711 section group should be marked with
712 SHF_GROUP. But some tools generate
713 broken objects without SHF_GROUP. Fix
714 them up here. */
715 dest->shdr->sh_flags |= SHF_GROUP;
716 }
4bba0fb1
AM
717 if (idx >= shnum
718 || dest->shdr->sh_type == SHT_GROUP)
dbb410c3 719 {
4eca0228 720 _bfd_error_handler
4bba0fb1
AM
721 (_("%pB: invalid entry in SHT_GROUP section [%u]"),
722 abfd, i);
723 dest->shdr = NULL;
dbb410c3 724 }
dbb410c3
AM
725 }
726 }
727 }
493a3386
NC
728
729 /* PR 17510: Corrupt binaries might contain invalid groups. */
730 if (num_group != (unsigned) elf_tdata (abfd)->num_group)
731 {
732 elf_tdata (abfd)->num_group = num_group;
733
734 /* If all groups are invalid then fail. */
735 if (num_group == 0)
736 {
737 elf_tdata (abfd)->group_sect_ptr = NULL;
738 elf_tdata (abfd)->num_group = num_group = -1;
4eca0228 739 _bfd_error_handler
871b3ab2 740 (_("%pB: no valid group sections found"), abfd);
493a3386
NC
741 bfd_set_error (bfd_error_bad_value);
742 }
743 }
dbb410c3
AM
744 }
745 }
746
747 if (num_group != (unsigned) -1)
748 {
564e11c9
JW
749 unsigned int search_offset = elf_tdata (abfd)->group_search_offset;
750 unsigned int j;
dbb410c3 751
564e11c9 752 for (j = 0; j < num_group; j++)
dbb410c3 753 {
564e11c9
JW
754 /* Begin search from previous found group. */
755 unsigned i = (j + search_offset) % num_group;
756
dbb410c3 757 Elf_Internal_Shdr *shdr = elf_tdata (abfd)->group_sect_ptr[i];
ce497010 758 Elf_Internal_Group *idx;
0c54f692 759 bfd_size_type n_elt;
ce497010
NC
760
761 if (shdr == NULL)
762 continue;
763
764 idx = (Elf_Internal_Group *) shdr->contents;
0c54f692
NC
765 if (idx == NULL || shdr->sh_size < 4)
766 {
767 /* See PR 21957 for a reproducer. */
768 /* xgettext:c-format */
871b3ab2 769 _bfd_error_handler (_("%pB: group section '%pA' has no contents"),
0c54f692
NC
770 abfd, shdr->bfd_section);
771 elf_tdata (abfd)->group_sect_ptr[i] = NULL;
772 bfd_set_error (bfd_error_bad_value);
0a1b45a2 773 return false;
0c54f692 774 }
ce497010 775 n_elt = shdr->sh_size / 4;
dbb410c3
AM
776
777 /* Look through this group's sections to see if current
778 section is a member. */
779 while (--n_elt != 0)
780 if ((++idx)->shdr == hdr)
781 {
e0e8c97f 782 asection *s = NULL;
dbb410c3
AM
783
784 /* We are a member of this group. Go looking through
785 other members to see if any others are linked via
786 next_in_group. */
787 idx = (Elf_Internal_Group *) shdr->contents;
788 n_elt = shdr->sh_size / 4;
789 while (--n_elt != 0)
4bba0fb1
AM
790 if ((++idx)->shdr != NULL
791 && (s = idx->shdr->bfd_section) != NULL
945906ff 792 && elf_next_in_group (s) != NULL)
dbb410c3
AM
793 break;
794 if (n_elt != 0)
795 {
dbb410c3
AM
796 /* Snarf the group name from other member, and
797 insert current section in circular list. */
945906ff
AM
798 elf_group_name (newsect) = elf_group_name (s);
799 elf_next_in_group (newsect) = elf_next_in_group (s);
800 elf_next_in_group (s) = newsect;
dbb410c3
AM
801 }
802 else
803 {
dbb410c3
AM
804 const char *gname;
805
b885599b
AM
806 gname = group_signature (abfd, shdr);
807 if (gname == NULL)
0a1b45a2 808 return false;
945906ff 809 elf_group_name (newsect) = gname;
dbb410c3
AM
810
811 /* Start a circular list with one element. */
945906ff 812 elf_next_in_group (newsect) = newsect;
dbb410c3 813 }
b885599b 814
9dce4196
AM
815 /* If the group section has been created, point to the
816 new member. */
dbb410c3 817 if (shdr->bfd_section != NULL)
945906ff 818 elf_next_in_group (shdr->bfd_section) = newsect;
b885599b 819
564e11c9
JW
820 elf_tdata (abfd)->group_search_offset = i;
821 j = num_group - 1;
dbb410c3
AM
822 break;
823 }
824 }
825 }
826
945906ff 827 if (elf_group_name (newsect) == NULL)
dbb410c3 828 {
695344c0 829 /* xgettext:c-format */
871b3ab2 830 _bfd_error_handler (_("%pB: no group info for section '%pA'"),
4eca0228 831 abfd, newsect);
0a1b45a2 832 return false;
dbb410c3 833 }
0a1b45a2 834 return true;
dbb410c3
AM
835}
836
0a1b45a2 837bool
dd863624 838_bfd_elf_setup_sections (bfd *abfd)
3d7f7666
L
839{
840 unsigned int i;
841 unsigned int num_group = elf_tdata (abfd)->num_group;
0a1b45a2 842 bool result = true;
dd863624
L
843 asection *s;
844
845 /* Process SHF_LINK_ORDER. */
846 for (s = abfd->sections; s != NULL; s = s->next)
847 {
848 Elf_Internal_Shdr *this_hdr = &elf_section_data (s)->this_hdr;
849 if ((this_hdr->sh_flags & SHF_LINK_ORDER) != 0)
850 {
851 unsigned int elfsec = this_hdr->sh_link;
b71702f1
NC
852 /* An sh_link value of 0 is now allowed. It indicates that linked
853 to section has already been discarded, but that the current
854 section has been retained for some other reason. This linking
855 section is still a candidate for later garbage collection
856 however. */
dd863624
L
857 if (elfsec == 0)
858 {
b71702f1 859 elf_linked_to_section (s) = NULL;
dd863624
L
860 }
861 else
862 {
91d6fa6a 863 asection *linksec = NULL;
25bbc984 864
4fbb74a6
AM
865 if (elfsec < elf_numsections (abfd))
866 {
867 this_hdr = elf_elfsections (abfd)[elfsec];
91d6fa6a 868 linksec = this_hdr->bfd_section;
4fbb74a6 869 }
25bbc984
L
870
871 /* PR 1991, 2008:
872 Some strip/objcopy may leave an incorrect value in
873 sh_link. We don't want to proceed. */
91d6fa6a 874 if (linksec == NULL)
25bbc984 875 {
4eca0228 876 _bfd_error_handler
695344c0 877 /* xgettext:c-format */
871b3ab2 878 (_("%pB: sh_link [%d] in section `%pA' is incorrect"),
c08bb8dd 879 s->owner, elfsec, s);
0a1b45a2 880 result = false;
25bbc984
L
881 }
882
91d6fa6a 883 elf_linked_to_section (s) = linksec;
dd863624
L
884 }
885 }
53720c49
AM
886 else if (this_hdr->sh_type == SHT_GROUP
887 && elf_next_in_group (s) == NULL)
888 {
4eca0228 889 _bfd_error_handler
695344c0 890 /* xgettext:c-format */
871b3ab2 891 (_("%pB: SHT_GROUP section [index %d] has no SHF_GROUP sections"),
53720c49 892 abfd, elf_section_data (s)->this_idx);
0a1b45a2 893 result = false;
53720c49 894 }
dd863624 895 }
3d7f7666 896
dd863624 897 /* Process section groups. */
3d7f7666
L
898 if (num_group == (unsigned) -1)
899 return result;
900
901 for (i = 0; i < num_group; i++)
902 {
903 Elf_Internal_Shdr *shdr = elf_tdata (abfd)->group_sect_ptr[i];
4b0e8a5f
NC
904 Elf_Internal_Group *idx;
905 unsigned int n_elt;
3d7f7666 906
4b0e8a5f
NC
907 /* PR binutils/18758: Beware of corrupt binaries with invalid group data. */
908 if (shdr == NULL || shdr->bfd_section == NULL || shdr->contents == NULL)
909 {
4eca0228 910 _bfd_error_handler
695344c0 911 /* xgettext:c-format */
871b3ab2 912 (_("%pB: section group entry number %u is corrupt"),
4b0e8a5f 913 abfd, i);
0a1b45a2 914 result = false;
4b0e8a5f
NC
915 continue;
916 }
917
918 idx = (Elf_Internal_Group *) shdr->contents;
919 n_elt = shdr->sh_size / 4;
1b786873 920
3d7f7666 921 while (--n_elt != 0)
24d3e51b
NC
922 {
923 ++ idx;
924
925 if (idx->shdr == NULL)
926 continue;
927 else if (idx->shdr->bfd_section)
928 elf_sec_group (idx->shdr->bfd_section) = shdr->bfd_section;
db4677b8
AM
929 else if (idx->shdr->sh_type != SHT_RELA
930 && idx->shdr->sh_type != SHT_REL)
24d3e51b
NC
931 {
932 /* There are some unknown sections in the group. */
933 _bfd_error_handler
934 /* xgettext:c-format */
871b3ab2 935 (_("%pB: unknown type [%#x] section `%s' in group [%pA]"),
24d3e51b
NC
936 abfd,
937 idx->shdr->sh_type,
938 bfd_elf_string_from_elf_section (abfd,
939 (elf_elfheader (abfd)
940 ->e_shstrndx),
941 idx->shdr->sh_name),
942 shdr->bfd_section);
0a1b45a2 943 result = false;
24d3e51b
NC
944 }
945 }
3d7f7666 946 }
24d3e51b 947
3d7f7666
L
948 return result;
949}
950
0a1b45a2 951bool
72adc230
AM
952bfd_elf_is_group_section (bfd *abfd ATTRIBUTE_UNUSED, const asection *sec)
953{
954 return elf_next_in_group (sec) != NULL;
955}
956
cb7f4b29
AM
957const char *
958bfd_elf_group_name (bfd *abfd ATTRIBUTE_UNUSED, const asection *sec)
959{
960 if (elf_sec_group (sec) != NULL)
961 return elf_group_name (sec);
962 return NULL;
963}
964
f6fe1ccd
L
965static char *
966convert_debug_to_zdebug (bfd *abfd, const char *name)
967{
968 unsigned int len = strlen (name);
969 char *new_name = bfd_alloc (abfd, len + 2);
970 if (new_name == NULL)
971 return NULL;
972 new_name[0] = '.';
973 new_name[1] = 'z';
974 memcpy (new_name + 2, name + 1, len);
975 return new_name;
976}
977
978static char *
979convert_zdebug_to_debug (bfd *abfd, const char *name)
980{
981 unsigned int len = strlen (name);
982 char *new_name = bfd_alloc (abfd, len);
983 if (new_name == NULL)
984 return NULL;
985 new_name[0] = '.';
986 memcpy (new_name + 1, name + 2, len - 1);
987 return new_name;
988}
989
cc5277b1
ML
990/* This a copy of lto_section defined in GCC (lto-streamer.h). */
991
992struct lto_section
993{
994 int16_t major_version;
995 int16_t minor_version;
996 unsigned char slim_object;
997
998 /* Flags is a private field that is not defined publicly. */
999 uint16_t flags;
1000};
1001
252b5132
RH
1002/* Make a BFD section from an ELF section. We store a pointer to the
1003 BFD section in the bfd_section field of the header. */
1004
0a1b45a2 1005bool
217aa764
AM
1006_bfd_elf_make_section_from_shdr (bfd *abfd,
1007 Elf_Internal_Shdr *hdr,
6dc132d9
L
1008 const char *name,
1009 int shindex)
252b5132
RH
1010{
1011 asection *newsect;
1012 flagword flags;
9c5bfbb7 1013 const struct elf_backend_data *bed;
502794d4 1014 unsigned int opb = bfd_octets_per_byte (abfd, NULL);
252b5132
RH
1015
1016 if (hdr->bfd_section != NULL)
0a1b45a2 1017 return true;
252b5132
RH
1018
1019 newsect = bfd_make_section_anyway (abfd, name);
1020 if (newsect == NULL)
0a1b45a2 1021 return false;
252b5132 1022
1829f4b2
AM
1023 hdr->bfd_section = newsect;
1024 elf_section_data (newsect)->this_hdr = *hdr;
6dc132d9 1025 elf_section_data (newsect)->this_idx = shindex;
1829f4b2 1026
2f89ff8d
L
1027 /* Always use the real type/flags. */
1028 elf_section_type (newsect) = hdr->sh_type;
1029 elf_section_flags (newsect) = hdr->sh_flags;
1030
252b5132
RH
1031 newsect->filepos = hdr->sh_offset;
1032
252b5132
RH
1033 flags = SEC_NO_FLAGS;
1034 if (hdr->sh_type != SHT_NOBITS)
1035 flags |= SEC_HAS_CONTENTS;
dbb410c3 1036 if (hdr->sh_type == SHT_GROUP)
7bdf4127 1037 flags |= SEC_GROUP;
252b5132
RH
1038 if ((hdr->sh_flags & SHF_ALLOC) != 0)
1039 {
1040 flags |= SEC_ALLOC;
1041 if (hdr->sh_type != SHT_NOBITS)
1042 flags |= SEC_LOAD;
1043 }
1044 if ((hdr->sh_flags & SHF_WRITE) == 0)
1045 flags |= SEC_READONLY;
1046 if ((hdr->sh_flags & SHF_EXECINSTR) != 0)
1047 flags |= SEC_CODE;
1048 else if ((flags & SEC_LOAD) != 0)
1049 flags |= SEC_DATA;
f5fa8ca2
JJ
1050 if ((hdr->sh_flags & SHF_MERGE) != 0)
1051 {
1052 flags |= SEC_MERGE;
1053 newsect->entsize = hdr->sh_entsize;
f5fa8ca2 1054 }
84865015
NC
1055 if ((hdr->sh_flags & SHF_STRINGS) != 0)
1056 flags |= SEC_STRINGS;
dbb410c3
AM
1057 if (hdr->sh_flags & SHF_GROUP)
1058 if (!setup_group (abfd, hdr, newsect))
0a1b45a2 1059 return false;
13ae64f3
JJ
1060 if ((hdr->sh_flags & SHF_TLS) != 0)
1061 flags |= SEC_THREAD_LOCAL;
18ae9cc1
L
1062 if ((hdr->sh_flags & SHF_EXCLUDE) != 0)
1063 flags |= SEC_EXCLUDE;
252b5132 1064
df3a023b
AM
1065 switch (elf_elfheader (abfd)->e_ident[EI_OSABI])
1066 {
1067 /* FIXME: We should not recognize SHF_GNU_MBIND for ELFOSABI_NONE,
1068 but binutils as of 2019-07-23 did not set the EI_OSABI header
1069 byte. */
df3a023b
AM
1070 case ELFOSABI_GNU:
1071 case ELFOSABI_FREEBSD:
99fabbc9
JL
1072 if ((hdr->sh_flags & SHF_GNU_RETAIN) != 0)
1073 elf_tdata (abfd)->has_gnu_osabi |= elf_gnu_osabi_retain;
1074 /* Fall through */
1075 case ELFOSABI_NONE:
df3a023b
AM
1076 if ((hdr->sh_flags & SHF_GNU_MBIND) != 0)
1077 elf_tdata (abfd)->has_gnu_osabi |= elf_gnu_osabi_mbind;
1078 break;
1079 }
1080
3d2b39cf 1081 if ((flags & SEC_ALLOC) == 0)
7a6cc5fb 1082 {
3d2b39cf
L
1083 /* The debugging sections appear to be recognized only by name,
1084 not any sort of flag. Their SEC_ALLOC bits are cleared. */
3d2b39cf
L
1085 if (name [0] == '.')
1086 {
3f3328b8
ML
1087 if (startswith (name, ".debug")
1088 || startswith (name, ".gnu.debuglto_.debug_")
1089 || startswith (name, ".gnu.linkonce.wi.")
1090 || startswith (name, ".zdebug"))
bb294208 1091 flags |= SEC_DEBUGGING | SEC_ELF_OCTETS;
3f3328b8
ML
1092 else if (startswith (name, GNU_BUILD_ATTRS_SECTION_NAME)
1093 || startswith (name, ".note.gnu"))
502794d4
CE
1094 {
1095 flags |= SEC_ELF_OCTETS;
1096 opb = 1;
1097 }
3f3328b8
ML
1098 else if (startswith (name, ".line")
1099 || startswith (name, ".stab")
bb294208 1100 || strcmp (name, ".gdb_index") == 0)
3d2b39cf
L
1101 flags |= SEC_DEBUGGING;
1102 }
1103 }
252b5132 1104
502794d4
CE
1105 if (!bfd_set_section_vma (newsect, hdr->sh_addr / opb)
1106 || !bfd_set_section_size (newsect, hdr->sh_size)
1107 || !bfd_set_section_alignment (newsect, bfd_log2 (hdr->sh_addralign)))
0a1b45a2 1108 return false;
502794d4 1109
252b5132
RH
1110 /* As a GNU extension, if the name begins with .gnu.linkonce, we
1111 only link a single copy of the section. This is used to support
1112 g++. g++ will emit each template expansion in its own section.
1113 The symbols will be defined as weak, so that multiple definitions
1114 are permitted. The GNU linker extension is to actually discard
1115 all but one of the sections. */
08dedd66 1116 if (startswith (name, ".gnu.linkonce")
b885599b 1117 && elf_next_in_group (newsect) == NULL)
252b5132
RH
1118 flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
1119
8c803a2d 1120 if (!bfd_set_section_flags (newsect, flags))
0a1b45a2 1121 return false;
8c803a2d 1122
fa152c49
JW
1123 bed = get_elf_backend_data (abfd);
1124 if (bed->elf_backend_section_flags)
8c803a2d 1125 if (!bed->elf_backend_section_flags (hdr))
0a1b45a2 1126 return false;
fa152c49 1127
718175fa
JK
1128 /* We do not parse the PT_NOTE segments as we are interested even in the
1129 separate debug info files which may have the segments offsets corrupted.
1130 PT_NOTEs from the core files are currently not parsed using BFD. */
1131 if (hdr->sh_type == SHT_NOTE)
1132 {
baea7ef1 1133 bfd_byte *contents;
718175fa 1134
baea7ef1 1135 if (!bfd_malloc_and_get_section (abfd, newsect, &contents))
0a1b45a2 1136 return false;
718175fa 1137
276da9b3
L
1138 elf_parse_notes (abfd, (char *) contents, hdr->sh_size,
1139 hdr->sh_offset, hdr->sh_addralign);
718175fa
JK
1140 free (contents);
1141 }
1142
8c803a2d 1143 if ((newsect->flags & SEC_ALLOC) != 0)
252b5132
RH
1144 {
1145 Elf_Internal_Phdr *phdr;
6ffd7900
AM
1146 unsigned int i, nload;
1147
1148 /* Some ELF linkers produce binaries with all the program header
1149 p_paddr fields zero. If we have such a binary with more than
1150 one PT_LOAD header, then leave the section lma equal to vma
1151 so that we don't create sections with overlapping lma. */
1152 phdr = elf_tdata (abfd)->phdr;
1153 for (nload = 0, i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
1154 if (phdr->p_paddr != 0)
1155 break;
1156 else if (phdr->p_type == PT_LOAD && phdr->p_memsz != 0)
1157 ++nload;
1158 if (i >= elf_elfheader (abfd)->e_phnum && nload > 1)
0a1b45a2 1159 return true;
252b5132 1160
252b5132
RH
1161 phdr = elf_tdata (abfd)->phdr;
1162 for (i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
1163 {
86b2281f
AM
1164 if (((phdr->p_type == PT_LOAD
1165 && (hdr->sh_flags & SHF_TLS) == 0)
1166 || phdr->p_type == PT_TLS)
9a83a553 1167 && ELF_SECTION_IN_SEGMENT (hdr, phdr))
252b5132 1168 {
8c803a2d 1169 if ((newsect->flags & SEC_LOAD) == 0)
88967714 1170 newsect->lma = (phdr->p_paddr
502794d4 1171 + hdr->sh_addr - phdr->p_vaddr) / opb;
88967714
AM
1172 else
1173 /* We used to use the same adjustment for SEC_LOAD
1174 sections, but that doesn't work if the segment
1175 is packed with code from multiple VMAs.
1176 Instead we calculate the section LMA based on
1177 the segment LMA. It is assumed that the
1178 segment will contain sections with contiguous
1179 LMAs, even if the VMAs are not. */
1180 newsect->lma = (phdr->p_paddr
502794d4 1181 + hdr->sh_offset - phdr->p_offset) / opb;
88967714
AM
1182
1183 /* With contiguous segments, we can't tell from file
1184 offsets whether a section with zero size should
1185 be placed at the end of one segment or the
1186 beginning of the next. Decide based on vaddr. */
1187 if (hdr->sh_addr >= phdr->p_vaddr
1188 && (hdr->sh_addr + hdr->sh_size
1189 <= phdr->p_vaddr + phdr->p_memsz))
1190 break;
252b5132
RH
1191 }
1192 }
1193 }
1194
4a114e3e
L
1195 /* Compress/decompress DWARF debug sections with names: .debug_* and
1196 .zdebug_*, after the section flags is set. */
8c803a2d 1197 if ((newsect->flags & SEC_DEBUGGING)
4a114e3e
L
1198 && ((name[1] == 'd' && name[6] == '_')
1199 || (name[1] == 'z' && name[7] == '_')))
1200 {
1201 enum { nothing, compress, decompress } action = nothing;
151411f8 1202 int compression_header_size;
dab394de 1203 bfd_size_type uncompressed_size;
4207142d 1204 unsigned int uncompressed_align_power;
0a1b45a2 1205 bool compressed
151411f8 1206 = bfd_is_section_compressed_with_header (abfd, newsect,
dab394de 1207 &compression_header_size,
4207142d
MW
1208 &uncompressed_size,
1209 &uncompressed_align_power);
151411f8 1210 if (compressed)
4a114e3e
L
1211 {
1212 /* Compressed section. Check if we should decompress. */
1213 if ((abfd->flags & BFD_DECOMPRESS))
1214 action = decompress;
1215 }
151411f8
L
1216
1217 /* Compress the uncompressed section or convert from/to .zdebug*
1218 section. Check if we should compress. */
1219 if (action == nothing)
4a114e3e 1220 {
151411f8
L
1221 if (newsect->size != 0
1222 && (abfd->flags & BFD_COMPRESS)
1223 && compression_header_size >= 0
dab394de 1224 && uncompressed_size > 0
151411f8
L
1225 && (!compressed
1226 || ((compression_header_size > 0)
1227 != ((abfd->flags & BFD_COMPRESS_GABI) != 0))))
4a114e3e 1228 action = compress;
151411f8 1229 else
0a1b45a2 1230 return true;
4a114e3e
L
1231 }
1232
151411f8 1233 if (action == compress)
4a114e3e 1234 {
4a114e3e
L
1235 if (!bfd_init_section_compress_status (abfd, newsect))
1236 {
4eca0228 1237 _bfd_error_handler
695344c0 1238 /* xgettext:c-format */
871b3ab2 1239 (_("%pB: unable to initialize compress status for section %s"),
4a114e3e 1240 abfd, name);
0a1b45a2 1241 return false;
4a114e3e 1242 }
151411f8
L
1243 }
1244 else
1245 {
4a114e3e
L
1246 if (!bfd_init_section_decompress_status (abfd, newsect))
1247 {
4eca0228 1248 _bfd_error_handler
695344c0 1249 /* xgettext:c-format */
871b3ab2 1250 (_("%pB: unable to initialize decompress status for section %s"),
4a114e3e 1251 abfd, name);
0a1b45a2 1252 return false;
4a114e3e 1253 }
151411f8
L
1254 }
1255
f6fe1ccd 1256 if (abfd->is_linker_input)
151411f8 1257 {
f6fe1ccd
L
1258 if (name[1] == 'z'
1259 && (action == decompress
1260 || (action == compress
1261 && (abfd->flags & BFD_COMPRESS_GABI) != 0)))
4e011fb5 1262 {
f6fe1ccd
L
1263 /* Convert section name from .zdebug_* to .debug_* so
1264 that linker will consider this section as a debug
1265 section. */
1266 char *new_name = convert_zdebug_to_debug (abfd, name);
151411f8 1267 if (new_name == NULL)
0a1b45a2 1268 return false;
fd361982 1269 bfd_rename_section (newsect, new_name);
151411f8 1270 }
4a114e3e 1271 }
f6fe1ccd
L
1272 else
1273 /* For objdump, don't rename the section. For objcopy, delay
1274 section rename to elf_fake_sections. */
1275 newsect->flags |= SEC_ELF_RENAME;
4a114e3e
L
1276 }
1277
cc5277b1
ML
1278 /* GCC uses .gnu.lto_.lto.<some_hash> as a LTO bytecode information
1279 section. */
3f3328b8 1280 if (startswith (name, ".gnu.lto_.lto."))
cc5277b1
ML
1281 {
1282 struct lto_section lsection;
1283 if (bfd_get_section_contents (abfd, newsect, &lsection, 0,
1284 sizeof (struct lto_section)))
1285 abfd->lto_slim_object = lsection.slim_object;
1286 }
1287
0a1b45a2 1288 return true;
252b5132
RH
1289}
1290
84865015
NC
1291const char *const bfd_elf_section_type_names[] =
1292{
252b5132
RH
1293 "SHT_NULL", "SHT_PROGBITS", "SHT_SYMTAB", "SHT_STRTAB",
1294 "SHT_RELA", "SHT_HASH", "SHT_DYNAMIC", "SHT_NOTE",
1295 "SHT_NOBITS", "SHT_REL", "SHT_SHLIB", "SHT_DYNSYM",
1296};
1297
1049f94e 1298/* ELF relocs are against symbols. If we are producing relocatable
252b5132
RH
1299 output, and the reloc is against an external symbol, and nothing
1300 has given us any additional addend, the resulting reloc will also
1301 be against the same symbol. In such a case, we don't want to
1302 change anything about the way the reloc is handled, since it will
1303 all be done at final link time. Rather than put special case code
1304 into bfd_perform_relocation, all the reloc types use this howto
2dfa8341 1305 function, or should call this function for relocatable output. */
252b5132 1306
252b5132 1307bfd_reloc_status_type
217aa764
AM
1308bfd_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED,
1309 arelent *reloc_entry,
1310 asymbol *symbol,
1311 void *data ATTRIBUTE_UNUSED,
1312 asection *input_section,
1313 bfd *output_bfd,
1314 char **error_message ATTRIBUTE_UNUSED)
1315{
1316 if (output_bfd != NULL
252b5132
RH
1317 && (symbol->flags & BSF_SECTION_SYM) == 0
1318 && (! reloc_entry->howto->partial_inplace
1319 || reloc_entry->addend == 0))
1320 {
1321 reloc_entry->address += input_section->output_offset;
1322 return bfd_reloc_ok;
1323 }
1324
2dfa8341
AM
1325 /* In some cases the relocation should be treated as output section
1326 relative, as when linking ELF DWARF into PE COFF. Many ELF
1327 targets lack section relative relocations and instead use
1328 ordinary absolute relocations for references between DWARF
1329 sections. That is arguably a bug in those targets but it happens
1330 to work for the usual case of linking to non-loaded ELF debug
1331 sections with VMAs forced to zero. PE COFF on the other hand
1332 doesn't allow a section VMA of zero. */
1333 if (output_bfd == NULL
1334 && !reloc_entry->howto->pc_relative
1335 && (symbol->section->flags & SEC_DEBUGGING) != 0
1336 && (input_section->flags & SEC_DEBUGGING) != 0)
1337 reloc_entry->addend -= symbol->section->output_section->vma;
1338
252b5132
RH
1339 return bfd_reloc_continue;
1340}
1341\f
84865015
NC
1342/* Returns TRUE if section A matches section B.
1343 Names, addresses and links may be different, but everything else
1344 should be the same. */
1345
0a1b45a2 1346static bool
5522f910
NC
1347section_match (const Elf_Internal_Shdr * a,
1348 const Elf_Internal_Shdr * b)
84865015 1349{
ac85e67c
AM
1350 if (a->sh_type != b->sh_type
1351 || ((a->sh_flags ^ b->sh_flags) & ~SHF_INFO_LINK) != 0
1352 || a->sh_addralign != b->sh_addralign
1353 || a->sh_entsize != b->sh_entsize)
0a1b45a2 1354 return false;
ac85e67c
AM
1355 if (a->sh_type == SHT_SYMTAB
1356 || a->sh_type == SHT_STRTAB)
0a1b45a2 1357 return true;
ac85e67c 1358 return a->sh_size == b->sh_size;
84865015
NC
1359}
1360
1361/* Find a section in OBFD that has the same characteristics
1362 as IHEADER. Return the index of this section or SHN_UNDEF if
1363 none can be found. Check's section HINT first, as this is likely
1364 to be the correct section. */
1365
1366static unsigned int
5cc4ca83
ST
1367find_link (const bfd *obfd, const Elf_Internal_Shdr *iheader,
1368 const unsigned int hint)
84865015
NC
1369{
1370 Elf_Internal_Shdr ** oheaders = elf_elfsections (obfd);
1371 unsigned int i;
1372
a55c9876
NC
1373 BFD_ASSERT (iheader != NULL);
1374
1375 /* See PR 20922 for a reproducer of the NULL test. */
5cc4ca83
ST
1376 if (hint < elf_numsections (obfd)
1377 && oheaders[hint] != NULL
a55c9876 1378 && section_match (oheaders[hint], iheader))
84865015
NC
1379 return hint;
1380
1381 for (i = 1; i < elf_numsections (obfd); i++)
1382 {
1383 Elf_Internal_Shdr * oheader = oheaders[i];
1384
a55c9876
NC
1385 if (oheader == NULL)
1386 continue;
84865015
NC
1387 if (section_match (oheader, iheader))
1388 /* FIXME: Do we care if there is a potential for
1389 multiple matches ? */
1390 return i;
1391 }
1392
1393 return SHN_UNDEF;
1394}
1395
5522f910
NC
1396/* PR 19938: Attempt to set the ELF section header fields of an OS or
1397 Processor specific section, based upon a matching input section.
1398 Returns TRUE upon success, FALSE otherwise. */
07d6d2b8 1399
0a1b45a2 1400static bool
5522f910
NC
1401copy_special_section_fields (const bfd *ibfd,
1402 bfd *obfd,
1403 const Elf_Internal_Shdr *iheader,
1404 Elf_Internal_Shdr *oheader,
1405 const unsigned int secnum)
1406{
1407 const struct elf_backend_data *bed = get_elf_backend_data (obfd);
1408 const Elf_Internal_Shdr **iheaders = (const Elf_Internal_Shdr **) elf_elfsections (ibfd);
0a1b45a2 1409 bool changed = false;
5522f910
NC
1410 unsigned int sh_link;
1411
1412 if (oheader->sh_type == SHT_NOBITS)
1413 {
1414 /* This is a feature for objcopy --only-keep-debug:
1415 When a section's type is changed to NOBITS, we preserve
1416 the sh_link and sh_info fields so that they can be
1417 matched up with the original.
1418
1419 Note: Strictly speaking these assignments are wrong.
1420 The sh_link and sh_info fields should point to the
1421 relevent sections in the output BFD, which may not be in
1422 the same location as they were in the input BFD. But
1423 the whole point of this action is to preserve the
1424 original values of the sh_link and sh_info fields, so
1425 that they can be matched up with the section headers in
1426 the original file. So strictly speaking we may be
1427 creating an invalid ELF file, but it is only for a file
1428 that just contains debug info and only for sections
1429 without any contents. */
1430 if (oheader->sh_link == 0)
1431 oheader->sh_link = iheader->sh_link;
1432 if (oheader->sh_info == 0)
1433 oheader->sh_info = iheader->sh_info;
0a1b45a2 1434 return true;
5522f910
NC
1435 }
1436
1437 /* Allow the target a chance to decide how these fields should be set. */
a859124d
AM
1438 if (bed->elf_backend_copy_special_section_fields (ibfd, obfd,
1439 iheader, oheader))
0a1b45a2 1440 return true;
5522f910
NC
1441
1442 /* We have an iheader which might match oheader, and which has non-zero
1443 sh_info and/or sh_link fields. Attempt to follow those links and find
1444 the section in the output bfd which corresponds to the linked section
1445 in the input bfd. */
1446 if (iheader->sh_link != SHN_UNDEF)
1447 {
4f3ca05b
NC
1448 /* See PR 20931 for a reproducer. */
1449 if (iheader->sh_link >= elf_numsections (ibfd))
1450 {
76cfced5 1451 _bfd_error_handler
4f3ca05b 1452 /* xgettext:c-format */
9793eb77 1453 (_("%pB: invalid sh_link field (%d) in section number %d"),
4f3ca05b 1454 ibfd, iheader->sh_link, secnum);
0a1b45a2 1455 return false;
4f3ca05b
NC
1456 }
1457
5522f910
NC
1458 sh_link = find_link (obfd, iheaders[iheader->sh_link], iheader->sh_link);
1459 if (sh_link != SHN_UNDEF)
1460 {
1461 oheader->sh_link = sh_link;
0a1b45a2 1462 changed = true;
5522f910
NC
1463 }
1464 else
1465 /* FIXME: Should we install iheader->sh_link
1466 if we could not find a match ? */
76cfced5 1467 _bfd_error_handler
695344c0 1468 /* xgettext:c-format */
9793eb77 1469 (_("%pB: failed to find link section for section %d"), obfd, secnum);
5522f910
NC
1470 }
1471
1472 if (iheader->sh_info)
1473 {
1474 /* The sh_info field can hold arbitrary information, but if the
1475 SHF_LINK_INFO flag is set then it should be interpreted as a
1476 section index. */
1477 if (iheader->sh_flags & SHF_INFO_LINK)
1478 {
1479 sh_link = find_link (obfd, iheaders[iheader->sh_info],
1480 iheader->sh_info);
1481 if (sh_link != SHN_UNDEF)
1482 oheader->sh_flags |= SHF_INFO_LINK;
1483 }
1484 else
1485 /* No idea what it means - just copy it. */
1486 sh_link = iheader->sh_info;
1487
1488 if (sh_link != SHN_UNDEF)
1489 {
1490 oheader->sh_info = sh_link;
0a1b45a2 1491 changed = true;
5522f910
NC
1492 }
1493 else
76cfced5 1494 _bfd_error_handler
695344c0 1495 /* xgettext:c-format */
9793eb77 1496 (_("%pB: failed to find info section for section %d"), obfd, secnum);
5522f910
NC
1497 }
1498
1499 return changed;
1500}
07d6d2b8 1501
0ac4564e
L
1502/* Copy the program header and other data from one object module to
1503 another. */
252b5132 1504
0a1b45a2 1505bool
217aa764 1506_bfd_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
2d502050 1507{
5522f910
NC
1508 const Elf_Internal_Shdr **iheaders = (const Elf_Internal_Shdr **) elf_elfsections (ibfd);
1509 Elf_Internal_Shdr **oheaders = elf_elfsections (obfd);
1510 const struct elf_backend_data *bed;
84865015
NC
1511 unsigned int i;
1512
2d502050 1513 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
84865015 1514 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
0a1b45a2 1515 return true;
2d502050 1516
57b828ef
L
1517 if (!elf_flags_init (obfd))
1518 {
1519 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
0a1b45a2 1520 elf_flags_init (obfd) = true;
57b828ef 1521 }
2d502050 1522
0ac4564e 1523 elf_gp (obfd) = elf_gp (ibfd);
57b828ef
L
1524
1525 /* Also copy the EI_OSABI field. */
1526 elf_elfheader (obfd)->e_ident[EI_OSABI] =
1527 elf_elfheader (ibfd)->e_ident[EI_OSABI];
104d59d1 1528
5522f910
NC
1529 /* If set, copy the EI_ABIVERSION field. */
1530 if (elf_elfheader (ibfd)->e_ident[EI_ABIVERSION])
1531 elf_elfheader (obfd)->e_ident[EI_ABIVERSION]
1532 = elf_elfheader (ibfd)->e_ident[EI_ABIVERSION];
07d6d2b8 1533
104d59d1
JM
1534 /* Copy object attributes. */
1535 _bfd_elf_copy_obj_attributes (ibfd, obfd);
63b9bbb7 1536
84865015 1537 if (iheaders == NULL || oheaders == NULL)
0a1b45a2 1538 return true;
63b9bbb7 1539
5522f910
NC
1540 bed = get_elf_backend_data (obfd);
1541
1542 /* Possibly copy other fields in the section header. */
84865015 1543 for (i = 1; i < elf_numsections (obfd); i++)
63b9bbb7 1544 {
84865015
NC
1545 unsigned int j;
1546 Elf_Internal_Shdr * oheader = oheaders[i];
63b9bbb7 1547
5522f910
NC
1548 /* Ignore ordinary sections. SHT_NOBITS sections are considered however
1549 because of a special case need for generating separate debug info
1550 files. See below for more details. */
84865015
NC
1551 if (oheader == NULL
1552 || (oheader->sh_type != SHT_NOBITS
5522f910
NC
1553 && oheader->sh_type < SHT_LOOS))
1554 continue;
1555
1556 /* Ignore empty sections, and sections whose
1557 fields have already been initialised. */
1558 if (oheader->sh_size == 0
84865015
NC
1559 || (oheader->sh_info != 0 && oheader->sh_link != 0))
1560 continue;
63b9bbb7 1561
84865015 1562 /* Scan for the matching section in the input bfd.
5522f910
NC
1563 First we try for a direct mapping between the input and output sections. */
1564 for (j = 1; j < elf_numsections (ibfd); j++)
1565 {
1566 const Elf_Internal_Shdr * iheader = iheaders[j];
1567
1568 if (iheader == NULL)
1569 continue;
1570
1571 if (oheader->bfd_section != NULL
1572 && iheader->bfd_section != NULL
1573 && iheader->bfd_section->output_section != NULL
1574 && iheader->bfd_section->output_section == oheader->bfd_section)
1575 {
1576 /* We have found a connection from the input section to the
1577 output section. Attempt to copy the header fields. If
1578 this fails then do not try any further sections - there
1579 should only be a one-to-one mapping between input and output. */
1580 if (! copy_special_section_fields (ibfd, obfd, iheader, oheader, i))
1581 j = elf_numsections (ibfd);
1582 break;
1583 }
1584 }
1585
1586 if (j < elf_numsections (ibfd))
1587 continue;
1588
1589 /* That failed. So try to deduce the corresponding input section.
84865015
NC
1590 Unfortunately we cannot compare names as the output string table
1591 is empty, so instead we check size, address and type. */
1592 for (j = 1; j < elf_numsections (ibfd); j++)
1593 {
5522f910 1594 const Elf_Internal_Shdr * iheader = iheaders[j];
84865015 1595
5522f910
NC
1596 if (iheader == NULL)
1597 continue;
1598
1599 /* Try matching fields in the input section's header.
1600 Since --only-keep-debug turns all non-debug sections into
84865015
NC
1601 SHT_NOBITS sections, the output SHT_NOBITS type matches any
1602 input type. */
1603 if ((oheader->sh_type == SHT_NOBITS
1604 || iheader->sh_type == oheader->sh_type)
5522f910
NC
1605 && (iheader->sh_flags & ~ SHF_INFO_LINK)
1606 == (oheader->sh_flags & ~ SHF_INFO_LINK)
84865015
NC
1607 && iheader->sh_addralign == oheader->sh_addralign
1608 && iheader->sh_entsize == oheader->sh_entsize
1609 && iheader->sh_size == oheader->sh_size
1610 && iheader->sh_addr == oheader->sh_addr
1611 && (iheader->sh_info != oheader->sh_info
1612 || iheader->sh_link != oheader->sh_link))
63b9bbb7 1613 {
5522f910
NC
1614 if (copy_special_section_fields (ibfd, obfd, iheader, oheader, i))
1615 break;
63b9bbb7
NC
1616 }
1617 }
5522f910
NC
1618
1619 if (j == elf_numsections (ibfd) && oheader->sh_type >= SHT_LOOS)
1620 {
1621 /* Final attempt. Call the backend copy function
1622 with a NULL input section. */
a859124d
AM
1623 (void) bed->elf_backend_copy_special_section_fields (ibfd, obfd,
1624 NULL, oheader);
5522f910 1625 }
63b9bbb7
NC
1626 }
1627
0a1b45a2 1628 return true;
2d502050
L
1629}
1630
cedc298e
L
1631static const char *
1632get_segment_type (unsigned int p_type)
1633{
1634 const char *pt;
1635 switch (p_type)
1636 {
1637 case PT_NULL: pt = "NULL"; break;
1638 case PT_LOAD: pt = "LOAD"; break;
1639 case PT_DYNAMIC: pt = "DYNAMIC"; break;
1640 case PT_INTERP: pt = "INTERP"; break;
1641 case PT_NOTE: pt = "NOTE"; break;
1642 case PT_SHLIB: pt = "SHLIB"; break;
1643 case PT_PHDR: pt = "PHDR"; break;
1644 case PT_TLS: pt = "TLS"; break;
1645 case PT_GNU_EH_FRAME: pt = "EH_FRAME"; break;
2b05f1b7 1646 case PT_GNU_STACK: pt = "STACK"; break;
cedc298e
L
1647 case PT_GNU_RELRO: pt = "RELRO"; break;
1648 default: pt = NULL; break;
1649 }
1650 return pt;
1651}
1652
f0b79d91
L
1653/* Print out the program headers. */
1654
0a1b45a2 1655bool
217aa764 1656_bfd_elf_print_private_bfd_data (bfd *abfd, void *farg)
252b5132 1657{
a50b1753 1658 FILE *f = (FILE *) farg;
252b5132
RH
1659 Elf_Internal_Phdr *p;
1660 asection *s;
1661 bfd_byte *dynbuf = NULL;
1662
1663 p = elf_tdata (abfd)->phdr;
1664 if (p != NULL)
1665 {
1666 unsigned int i, c;
1667
1668 fprintf (f, _("\nProgram Header:\n"));
1669 c = elf_elfheader (abfd)->e_phnum;
1670 for (i = 0; i < c; i++, p++)
1671 {
cedc298e 1672 const char *pt = get_segment_type (p->p_type);
252b5132
RH
1673 char buf[20];
1674
cedc298e 1675 if (pt == NULL)
252b5132 1676 {
cedc298e
L
1677 sprintf (buf, "0x%lx", p->p_type);
1678 pt = buf;
252b5132 1679 }
dc810e39 1680 fprintf (f, "%8s off 0x", pt);
60b89a18 1681 bfd_fprintf_vma (abfd, f, p->p_offset);
252b5132 1682 fprintf (f, " vaddr 0x");
60b89a18 1683 bfd_fprintf_vma (abfd, f, p->p_vaddr);
252b5132 1684 fprintf (f, " paddr 0x");
60b89a18 1685 bfd_fprintf_vma (abfd, f, p->p_paddr);
252b5132
RH
1686 fprintf (f, " align 2**%u\n", bfd_log2 (p->p_align));
1687 fprintf (f, " filesz 0x");
60b89a18 1688 bfd_fprintf_vma (abfd, f, p->p_filesz);
252b5132 1689 fprintf (f, " memsz 0x");
60b89a18 1690 bfd_fprintf_vma (abfd, f, p->p_memsz);
252b5132
RH
1691 fprintf (f, " flags %c%c%c",
1692 (p->p_flags & PF_R) != 0 ? 'r' : '-',
1693 (p->p_flags & PF_W) != 0 ? 'w' : '-',
1694 (p->p_flags & PF_X) != 0 ? 'x' : '-');
dc810e39
AM
1695 if ((p->p_flags &~ (unsigned) (PF_R | PF_W | PF_X)) != 0)
1696 fprintf (f, " %lx", p->p_flags &~ (unsigned) (PF_R | PF_W | PF_X));
252b5132
RH
1697 fprintf (f, "\n");
1698 }
1699 }
1700
1701 s = bfd_get_section_by_name (abfd, ".dynamic");
1702 if (s != NULL)
1703 {
cb33740c 1704 unsigned int elfsec;
dc810e39 1705 unsigned long shlink;
252b5132
RH
1706 bfd_byte *extdyn, *extdynend;
1707 size_t extdynsize;
217aa764 1708 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
252b5132
RH
1709
1710 fprintf (f, _("\nDynamic Section:\n"));
1711
eea6121a 1712 if (!bfd_malloc_and_get_section (abfd, s, &dynbuf))
252b5132
RH
1713 goto error_return;
1714
1715 elfsec = _bfd_elf_section_from_bfd_section (abfd, s);
cb33740c 1716 if (elfsec == SHN_BAD)
252b5132 1717 goto error_return;
dc810e39 1718 shlink = elf_elfsections (abfd)[elfsec]->sh_link;
252b5132
RH
1719
1720 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
1721 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
1722
1723 extdyn = dynbuf;
06614111
NC
1724 /* PR 17512: file: 6f427532. */
1725 if (s->size < extdynsize)
1726 goto error_return;
eea6121a 1727 extdynend = extdyn + s->size;
1036838a 1728 /* PR 17512: file: id:000006,sig:06,src:000000,op:flip4,pos:5664.
07d6d2b8 1729 Fix range check. */
1036838a 1730 for (; extdyn <= (extdynend - extdynsize); extdyn += extdynsize)
252b5132
RH
1731 {
1732 Elf_Internal_Dyn dyn;
ad9563d6 1733 const char *name = "";
252b5132 1734 char ab[20];
0a1b45a2 1735 bool stringp;
ad9563d6 1736 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 1737
217aa764 1738 (*swap_dyn_in) (abfd, extdyn, &dyn);
252b5132
RH
1739
1740 if (dyn.d_tag == DT_NULL)
1741 break;
1742
0a1b45a2 1743 stringp = false;
252b5132
RH
1744 switch (dyn.d_tag)
1745 {
1746 default:
ad9563d6
CM
1747 if (bed->elf_backend_get_target_dtag)
1748 name = (*bed->elf_backend_get_target_dtag) (dyn.d_tag);
1749
1750 if (!strcmp (name, ""))
1751 {
cd9af601 1752 sprintf (ab, "%#" BFD_VMA_FMT "x", dyn.d_tag);
ad9563d6
CM
1753 name = ab;
1754 }
252b5132
RH
1755 break;
1756
0a1b45a2 1757 case DT_NEEDED: name = "NEEDED"; stringp = true; break;
252b5132
RH
1758 case DT_PLTRELSZ: name = "PLTRELSZ"; break;
1759 case DT_PLTGOT: name = "PLTGOT"; break;
1760 case DT_HASH: name = "HASH"; break;
1761 case DT_STRTAB: name = "STRTAB"; break;
1762 case DT_SYMTAB: name = "SYMTAB"; break;
1763 case DT_RELA: name = "RELA"; break;
1764 case DT_RELASZ: name = "RELASZ"; break;
1765 case DT_RELAENT: name = "RELAENT"; break;
1766 case DT_STRSZ: name = "STRSZ"; break;
1767 case DT_SYMENT: name = "SYMENT"; break;
1768 case DT_INIT: name = "INIT"; break;
1769 case DT_FINI: name = "FINI"; break;
0a1b45a2
AM
1770 case DT_SONAME: name = "SONAME"; stringp = true; break;
1771 case DT_RPATH: name = "RPATH"; stringp = true; break;
252b5132
RH
1772 case DT_SYMBOLIC: name = "SYMBOLIC"; break;
1773 case DT_REL: name = "REL"; break;
1774 case DT_RELSZ: name = "RELSZ"; break;
1775 case DT_RELENT: name = "RELENT"; break;
dd207c13
FS
1776 case DT_RELR: name = "RELR"; break;
1777 case DT_RELRSZ: name = "RELRSZ"; break;
1778 case DT_RELRENT: name = "RELRENT"; break;
252b5132
RH
1779 case DT_PLTREL: name = "PLTREL"; break;
1780 case DT_DEBUG: name = "DEBUG"; break;
1781 case DT_TEXTREL: name = "TEXTREL"; break;
1782 case DT_JMPREL: name = "JMPREL"; break;
94558834
L
1783 case DT_BIND_NOW: name = "BIND_NOW"; break;
1784 case DT_INIT_ARRAY: name = "INIT_ARRAY"; break;
1785 case DT_FINI_ARRAY: name = "FINI_ARRAY"; break;
1786 case DT_INIT_ARRAYSZ: name = "INIT_ARRAYSZ"; break;
1787 case DT_FINI_ARRAYSZ: name = "FINI_ARRAYSZ"; break;
0a1b45a2 1788 case DT_RUNPATH: name = "RUNPATH"; stringp = true; break;
94558834
L
1789 case DT_FLAGS: name = "FLAGS"; break;
1790 case DT_PREINIT_ARRAY: name = "PREINIT_ARRAY"; break;
1791 case DT_PREINIT_ARRAYSZ: name = "PREINIT_ARRAYSZ"; break;
d48188b9 1792 case DT_CHECKSUM: name = "CHECKSUM"; break;
94558834
L
1793 case DT_PLTPADSZ: name = "PLTPADSZ"; break;
1794 case DT_MOVEENT: name = "MOVEENT"; break;
1795 case DT_MOVESZ: name = "MOVESZ"; break;
1796 case DT_FEATURE: name = "FEATURE"; break;
1797 case DT_POSFLAG_1: name = "POSFLAG_1"; break;
1798 case DT_SYMINSZ: name = "SYMINSZ"; break;
1799 case DT_SYMINENT: name = "SYMINENT"; break;
0a1b45a2
AM
1800 case DT_CONFIG: name = "CONFIG"; stringp = true; break;
1801 case DT_DEPAUDIT: name = "DEPAUDIT"; stringp = true; break;
1802 case DT_AUDIT: name = "AUDIT"; stringp = true; break;
94558834
L
1803 case DT_PLTPAD: name = "PLTPAD"; break;
1804 case DT_MOVETAB: name = "MOVETAB"; break;
1805 case DT_SYMINFO: name = "SYMINFO"; break;
1806 case DT_RELACOUNT: name = "RELACOUNT"; break;
1807 case DT_RELCOUNT: name = "RELCOUNT"; break;
1808 case DT_FLAGS_1: name = "FLAGS_1"; break;
252b5132
RH
1809 case DT_VERSYM: name = "VERSYM"; break;
1810 case DT_VERDEF: name = "VERDEF"; break;
1811 case DT_VERDEFNUM: name = "VERDEFNUM"; break;
1812 case DT_VERNEED: name = "VERNEED"; break;
1813 case DT_VERNEEDNUM: name = "VERNEEDNUM"; break;
0a1b45a2 1814 case DT_AUXILIARY: name = "AUXILIARY"; stringp = true; break;
94558834 1815 case DT_USED: name = "USED"; break;
0a1b45a2 1816 case DT_FILTER: name = "FILTER"; stringp = true; break;
fdc90cb4 1817 case DT_GNU_HASH: name = "GNU_HASH"; break;
252b5132
RH
1818 }
1819
ad9563d6 1820 fprintf (f, " %-20s ", name);
252b5132 1821 if (! stringp)
a1f3c56e
AN
1822 {
1823 fprintf (f, "0x");
1824 bfd_fprintf_vma (abfd, f, dyn.d_un.d_val);
1825 }
252b5132
RH
1826 else
1827 {
1828 const char *string;
dc810e39 1829 unsigned int tagv = dyn.d_un.d_val;
252b5132 1830
dc810e39 1831 string = bfd_elf_string_from_elf_section (abfd, shlink, tagv);
252b5132
RH
1832 if (string == NULL)
1833 goto error_return;
1834 fprintf (f, "%s", string);
1835 }
1836 fprintf (f, "\n");
1837 }
1838
1839 free (dynbuf);
1840 dynbuf = NULL;
1841 }
1842
1843 if ((elf_dynverdef (abfd) != 0 && elf_tdata (abfd)->verdef == NULL)
1844 || (elf_dynverref (abfd) != 0 && elf_tdata (abfd)->verref == NULL))
1845 {
0a1b45a2
AM
1846 if (! _bfd_elf_slurp_version_tables (abfd, false))
1847 return false;
252b5132
RH
1848 }
1849
1850 if (elf_dynverdef (abfd) != 0)
1851 {
1852 Elf_Internal_Verdef *t;
1853
1854 fprintf (f, _("\nVersion definitions:\n"));
1855 for (t = elf_tdata (abfd)->verdef; t != NULL; t = t->vd_nextdef)
1856 {
1857 fprintf (f, "%d 0x%2.2x 0x%8.8lx %s\n", t->vd_ndx,
d0fb9a8d
JJ
1858 t->vd_flags, t->vd_hash,
1859 t->vd_nodename ? t->vd_nodename : "<corrupt>");
1860 if (t->vd_auxptr != NULL && t->vd_auxptr->vda_nextptr != NULL)
252b5132
RH
1861 {
1862 Elf_Internal_Verdaux *a;
1863
1864 fprintf (f, "\t");
1865 for (a = t->vd_auxptr->vda_nextptr;
1866 a != NULL;
1867 a = a->vda_nextptr)
d0fb9a8d
JJ
1868 fprintf (f, "%s ",
1869 a->vda_nodename ? a->vda_nodename : "<corrupt>");
252b5132
RH
1870 fprintf (f, "\n");
1871 }
1872 }
1873 }
1874
1875 if (elf_dynverref (abfd) != 0)
1876 {
1877 Elf_Internal_Verneed *t;
1878
1879 fprintf (f, _("\nVersion References:\n"));
1880 for (t = elf_tdata (abfd)->verref; t != NULL; t = t->vn_nextref)
1881 {
1882 Elf_Internal_Vernaux *a;
1883
d0fb9a8d
JJ
1884 fprintf (f, _(" required from %s:\n"),
1885 t->vn_filename ? t->vn_filename : "<corrupt>");
252b5132
RH
1886 for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr)
1887 fprintf (f, " 0x%8.8lx 0x%2.2x %2.2d %s\n", a->vna_hash,
d0fb9a8d
JJ
1888 a->vna_flags, a->vna_other,
1889 a->vna_nodename ? a->vna_nodename : "<corrupt>");
252b5132
RH
1890 }
1891 }
1892
0a1b45a2 1893 return true;
252b5132
RH
1894
1895 error_return:
c9594989 1896 free (dynbuf);
0a1b45a2 1897 return false;
252b5132
RH
1898}
1899
7e6e972f
L
1900/* Get version name. If BASE_P is TRUE, return "Base" for VER_FLG_BASE
1901 and return symbol version for symbol version itself. */
bb4d2ac2
L
1902
1903const char *
1081065c 1904_bfd_elf_get_symbol_version_string (bfd *abfd, asymbol *symbol,
0a1b45a2
AM
1905 bool base_p,
1906 bool *hidden)
bb4d2ac2
L
1907{
1908 const char *version_string = NULL;
1909 if (elf_dynversym (abfd) != 0
1910 && (elf_dynverdef (abfd) != 0 || elf_dynverref (abfd) != 0))
1911 {
1912 unsigned int vernum = ((elf_symbol_type *) symbol)->version;
1913
1914 *hidden = (vernum & VERSYM_HIDDEN) != 0;
1915 vernum &= VERSYM_VERSION;
1916
1917 if (vernum == 0)
1918 version_string = "";
1f6f5dba
L
1919 else if (vernum == 1
1920 && (vernum > elf_tdata (abfd)->cverdefs
1921 || (elf_tdata (abfd)->verdef[0].vd_flags
1922 == VER_FLG_BASE)))
7e6e972f 1923 version_string = base_p ? "Base" : "";
bb4d2ac2 1924 else if (vernum <= elf_tdata (abfd)->cverdefs)
7e6e972f
L
1925 {
1926 const char *nodename
1927 = elf_tdata (abfd)->verdef[vernum - 1].vd_nodename;
8d55d10a
AM
1928 version_string = "";
1929 if (base_p
1930 || nodename == NULL
1931 || symbol->name == NULL
1932 || strcmp (symbol->name, nodename) != 0)
1933 version_string = nodename;
7e6e972f 1934 }
bb4d2ac2
L
1935 else
1936 {
1937 Elf_Internal_Verneed *t;
1938
7a815dd5 1939 version_string = _("<corrupt>");
bb4d2ac2
L
1940 for (t = elf_tdata (abfd)->verref;
1941 t != NULL;
1942 t = t->vn_nextref)
1943 {
1944 Elf_Internal_Vernaux *a;
1945
1946 for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr)
1947 {
1948 if (a->vna_other == vernum)
1949 {
f897689c 1950 *hidden = true;
bb4d2ac2
L
1951 version_string = a->vna_nodename;
1952 break;
1953 }
1954 }
1955 }
1956 }
1957 }
1958 return version_string;
1959}
1960
252b5132
RH
1961/* Display ELF-specific fields of a symbol. */
1962
1963void
217aa764
AM
1964bfd_elf_print_symbol (bfd *abfd,
1965 void *filep,
1966 asymbol *symbol,
1967 bfd_print_symbol_type how)
252b5132 1968{
a50b1753 1969 FILE *file = (FILE *) filep;
252b5132
RH
1970 switch (how)
1971 {
1972 case bfd_print_symbol_name:
1973 fprintf (file, "%s", symbol->name);
1974 break;
1975 case bfd_print_symbol_more:
1976 fprintf (file, "elf ");
60b89a18 1977 bfd_fprintf_vma (abfd, file, symbol->value);
cd9af601 1978 fprintf (file, " %x", symbol->flags);
252b5132
RH
1979 break;
1980 case bfd_print_symbol_all:
1981 {
4e8a9624
AM
1982 const char *section_name;
1983 const char *name = NULL;
9c5bfbb7 1984 const struct elf_backend_data *bed;
7a13edea 1985 unsigned char st_other;
dbb410c3 1986 bfd_vma val;
bb4d2ac2 1987 const char *version_string;
0a1b45a2 1988 bool hidden;
c044fabd 1989
252b5132 1990 section_name = symbol->section ? symbol->section->name : "(*none*)";
587ff49e
RH
1991
1992 bed = get_elf_backend_data (abfd);
1993 if (bed->elf_backend_print_symbol_all)
c044fabd 1994 name = (*bed->elf_backend_print_symbol_all) (abfd, filep, symbol);
587ff49e
RH
1995
1996 if (name == NULL)
1997 {
7ee38065 1998 name = symbol->name;
217aa764 1999 bfd_print_symbol_vandf (abfd, file, symbol);
587ff49e
RH
2000 }
2001
252b5132
RH
2002 fprintf (file, " %s\t", section_name);
2003 /* Print the "other" value for a symbol. For common symbols,
2004 we've already printed the size; now print the alignment.
2005 For other symbols, we have no specified alignment, and
2006 we've printed the address; now print the size. */
dcf6c779 2007 if (symbol->section && bfd_is_com_section (symbol->section))
dbb410c3
AM
2008 val = ((elf_symbol_type *) symbol)->internal_elf_sym.st_value;
2009 else
2010 val = ((elf_symbol_type *) symbol)->internal_elf_sym.st_size;
2011 bfd_fprintf_vma (abfd, file, val);
252b5132
RH
2012
2013 /* If we have version information, print it. */
60bb06bc
L
2014 version_string = _bfd_elf_get_symbol_version_string (abfd,
2015 symbol,
0a1b45a2 2016 true,
60bb06bc 2017 &hidden);
bb4d2ac2 2018 if (version_string)
252b5132 2019 {
bb4d2ac2 2020 if (!hidden)
252b5132
RH
2021 fprintf (file, " %-11s", version_string);
2022 else
2023 {
2024 int i;
2025
2026 fprintf (file, " (%s)", version_string);
2027 for (i = 10 - strlen (version_string); i > 0; --i)
2028 putc (' ', file);
2029 }
2030 }
2031
2032 /* If the st_other field is not zero, print it. */
7a13edea 2033 st_other = ((elf_symbol_type *) symbol)->internal_elf_sym.st_other;
c044fabd 2034
7a13edea
NC
2035 switch (st_other)
2036 {
2037 case 0: break;
2038 case STV_INTERNAL: fprintf (file, " .internal"); break;
2039 case STV_HIDDEN: fprintf (file, " .hidden"); break;
2040 case STV_PROTECTED: fprintf (file, " .protected"); break;
2041 default:
2042 /* Some other non-defined flags are also present, so print
2043 everything hex. */
2044 fprintf (file, " 0x%02x", (unsigned int) st_other);
2045 }
252b5132 2046
587ff49e 2047 fprintf (file, " %s", name);
252b5132
RH
2048 }
2049 break;
2050 }
2051}
252b5132
RH
2052\f
2053/* ELF .o/exec file reading */
2054
c044fabd 2055/* Create a new bfd section from an ELF section header. */
252b5132 2056
0a1b45a2 2057bool
217aa764 2058bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
252b5132 2059{
4fbb74a6
AM
2060 Elf_Internal_Shdr *hdr;
2061 Elf_Internal_Ehdr *ehdr;
2062 const struct elf_backend_data *bed;
90937f86 2063 const char *name;
0a1b45a2 2064 bool ret = true;
252b5132 2065
4fbb74a6 2066 if (shindex >= elf_numsections (abfd))
0a1b45a2 2067 return false;
4fbb74a6 2068
a86c6c19
AM
2069 /* PR17512: A corrupt ELF binary might contain a loop of sections via
2070 sh_link or sh_info. Detect this here, by refusing to load a
2071 section that we are already in the process of loading. */
2072 if (elf_tdata (abfd)->being_created[shindex])
bf67003b 2073 {
a86c6c19
AM
2074 _bfd_error_handler
2075 (_("%pB: warning: loop in section dependencies detected"), abfd);
0a1b45a2 2076 return false;
bf67003b 2077 }
0a1b45a2 2078 elf_tdata (abfd)->being_created[shindex] = true;
bf67003b 2079
4fbb74a6
AM
2080 hdr = elf_elfsections (abfd)[shindex];
2081 ehdr = elf_elfheader (abfd);
2082 name = bfd_elf_string_from_elf_section (abfd, ehdr->e_shstrndx,
1b3a8575 2083 hdr->sh_name);
933d961a 2084 if (name == NULL)
bf67003b 2085 goto fail;
252b5132 2086
4fbb74a6 2087 bed = get_elf_backend_data (abfd);
252b5132
RH
2088 switch (hdr->sh_type)
2089 {
2090 case SHT_NULL:
2091 /* Inactive section. Throw it away. */
bf67003b 2092 goto success;
252b5132 2093
bf67003b
NC
2094 case SHT_PROGBITS: /* Normal section with contents. */
2095 case SHT_NOBITS: /* .bss section. */
2096 case SHT_HASH: /* .hash section. */
2097 case SHT_NOTE: /* .note section. */
25e27870
L
2098 case SHT_INIT_ARRAY: /* .init_array section. */
2099 case SHT_FINI_ARRAY: /* .fini_array section. */
2100 case SHT_PREINIT_ARRAY: /* .preinit_array section. */
7f1204bb 2101 case SHT_GNU_LIBLIST: /* .gnu.liblist section. */
fdc90cb4 2102 case SHT_GNU_HASH: /* .gnu.hash section. */
bf67003b
NC
2103 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2104 goto success;
252b5132 2105
797fc050 2106 case SHT_DYNAMIC: /* Dynamic linking information. */
6dc132d9 2107 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
bf67003b
NC
2108 goto fail;
2109
cfcac11d
NC
2110 if (hdr->sh_link > elf_numsections (abfd))
2111 {
caa83f8b 2112 /* PR 10478: Accept Solaris binaries with a sh_link
cfcac11d
NC
2113 field set to SHN_BEFORE or SHN_AFTER. */
2114 switch (bfd_get_arch (abfd))
2115 {
caa83f8b 2116 case bfd_arch_i386:
cfcac11d
NC
2117 case bfd_arch_sparc:
2118 if (hdr->sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
2119 || hdr->sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
2120 break;
2121 /* Otherwise fall through. */
2122 default:
bf67003b 2123 goto fail;
cfcac11d
NC
2124 }
2125 }
2126 else if (elf_elfsections (abfd)[hdr->sh_link] == NULL)
bf67003b 2127 goto fail;
cfcac11d 2128 else if (elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_STRTAB)
797fc050
AM
2129 {
2130 Elf_Internal_Shdr *dynsymhdr;
2131
2132 /* The shared libraries distributed with hpux11 have a bogus
2133 sh_link field for the ".dynamic" section. Find the
2134 string table for the ".dynsym" section instead. */
2135 if (elf_dynsymtab (abfd) != 0)
2136 {
2137 dynsymhdr = elf_elfsections (abfd)[elf_dynsymtab (abfd)];
2138 hdr->sh_link = dynsymhdr->sh_link;
2139 }
2140 else
2141 {
2142 unsigned int i, num_sec;
2143
2144 num_sec = elf_numsections (abfd);
2145 for (i = 1; i < num_sec; i++)
2146 {
2147 dynsymhdr = elf_elfsections (abfd)[i];
2148 if (dynsymhdr->sh_type == SHT_DYNSYM)
2149 {
2150 hdr->sh_link = dynsymhdr->sh_link;
2151 break;
2152 }
2153 }
2154 }
2155 }
bf67003b 2156 goto success;
797fc050 2157
bf67003b 2158 case SHT_SYMTAB: /* A symbol table. */
252b5132 2159 if (elf_onesymtab (abfd) == shindex)
bf67003b 2160 goto success;
252b5132 2161
a50b2160 2162 if (hdr->sh_entsize != bed->s->sizeof_sym)
bf67003b
NC
2163 goto fail;
2164
3337c1e5 2165 if (hdr->sh_info * hdr->sh_entsize > hdr->sh_size)
eee3b786
AM
2166 {
2167 if (hdr->sh_size != 0)
bf67003b 2168 goto fail;
eee3b786
AM
2169 /* Some assemblers erroneously set sh_info to one with a
2170 zero sh_size. ld sees this as a global symbol count
2171 of (unsigned) -1. Fix it here. */
2172 hdr->sh_info = 0;
bf67003b 2173 goto success;
eee3b786 2174 }
bf67003b 2175
16ad13ec
NC
2176 /* PR 18854: A binary might contain more than one symbol table.
2177 Unusual, but possible. Warn, but continue. */
2178 if (elf_onesymtab (abfd) != 0)
2179 {
4eca0228 2180 _bfd_error_handler
695344c0 2181 /* xgettext:c-format */
871b3ab2 2182 (_("%pB: warning: multiple symbol tables detected"
63a5468a 2183 " - ignoring the table in section %u"),
16ad13ec
NC
2184 abfd, shindex);
2185 goto success;
2186 }
252b5132 2187 elf_onesymtab (abfd) = shindex;
6a40cf0c
NC
2188 elf_symtab_hdr (abfd) = *hdr;
2189 elf_elfsections (abfd)[shindex] = hdr = & elf_symtab_hdr (abfd);
252b5132
RH
2190 abfd->flags |= HAS_SYMS;
2191
2192 /* Sometimes a shared object will map in the symbol table. If
08a40648
AM
2193 SHF_ALLOC is set, and this is a shared object, then we also
2194 treat this section as a BFD section. We can not base the
2195 decision purely on SHF_ALLOC, because that flag is sometimes
2196 set in a relocatable object file, which would confuse the
2197 linker. */
252b5132
RH
2198 if ((hdr->sh_flags & SHF_ALLOC) != 0
2199 && (abfd->flags & DYNAMIC) != 0
6dc132d9
L
2200 && ! _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2201 shindex))
bf67003b 2202 goto fail;
252b5132 2203
1b3a8575
AM
2204 /* Go looking for SHT_SYMTAB_SHNDX too, since if there is one we
2205 can't read symbols without that section loaded as well. It
2206 is most likely specified by the next section header. */
6a40cf0c
NC
2207 {
2208 elf_section_list * entry;
2209 unsigned int i, num_sec;
1b3a8575 2210
6a40cf0c
NC
2211 for (entry = elf_symtab_shndx_list (abfd); entry != NULL; entry = entry->next)
2212 if (entry->hdr.sh_link == shindex)
2213 goto success;
2214
2215 num_sec = elf_numsections (abfd);
2216 for (i = shindex + 1; i < num_sec; i++)
2217 {
2218 Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
2219
2220 if (hdr2->sh_type == SHT_SYMTAB_SHNDX
2221 && hdr2->sh_link == shindex)
2222 break;
2223 }
2224
2225 if (i == num_sec)
2226 for (i = 1; i < shindex; i++)
1b3a8575
AM
2227 {
2228 Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
6a40cf0c 2229
1b3a8575
AM
2230 if (hdr2->sh_type == SHT_SYMTAB_SHNDX
2231 && hdr2->sh_link == shindex)
2232 break;
2233 }
6a40cf0c
NC
2234
2235 if (i != shindex)
2236 ret = bfd_section_from_shdr (abfd, i);
2237 /* else FIXME: we have failed to find the symbol table - should we issue an error ? */
2238 goto success;
2239 }
252b5132 2240
bf67003b 2241 case SHT_DYNSYM: /* A dynamic symbol table. */
252b5132 2242 if (elf_dynsymtab (abfd) == shindex)
bf67003b 2243 goto success;
252b5132 2244
a50b2160 2245 if (hdr->sh_entsize != bed->s->sizeof_sym)
bf67003b
NC
2246 goto fail;
2247
eee3b786
AM
2248 if (hdr->sh_info * hdr->sh_entsize > hdr->sh_size)
2249 {
2250 if (hdr->sh_size != 0)
bf67003b
NC
2251 goto fail;
2252
eee3b786
AM
2253 /* Some linkers erroneously set sh_info to one with a
2254 zero sh_size. ld sees this as a global symbol count
2255 of (unsigned) -1. Fix it here. */
2256 hdr->sh_info = 0;
bf67003b 2257 goto success;
eee3b786 2258 }
bf67003b 2259
16ad13ec
NC
2260 /* PR 18854: A binary might contain more than one dynamic symbol table.
2261 Unusual, but possible. Warn, but continue. */
2262 if (elf_dynsymtab (abfd) != 0)
2263 {
4eca0228 2264 _bfd_error_handler
695344c0 2265 /* xgettext:c-format */
871b3ab2 2266 (_("%pB: warning: multiple dynamic symbol tables detected"
63a5468a 2267 " - ignoring the table in section %u"),
16ad13ec
NC
2268 abfd, shindex);
2269 goto success;
2270 }
252b5132
RH
2271 elf_dynsymtab (abfd) = shindex;
2272 elf_tdata (abfd)->dynsymtab_hdr = *hdr;
2273 elf_elfsections (abfd)[shindex] = hdr = &elf_tdata (abfd)->dynsymtab_hdr;
2274 abfd->flags |= HAS_SYMS;
2275
2276 /* Besides being a symbol table, we also treat this as a regular
2277 section, so that objcopy can handle it. */
bf67003b
NC
2278 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2279 goto success;
252b5132 2280
bf67003b 2281 case SHT_SYMTAB_SHNDX: /* Symbol section indices when >64k sections. */
6a40cf0c
NC
2282 {
2283 elf_section_list * entry;
9ad5cbcf 2284
6a40cf0c
NC
2285 for (entry = elf_symtab_shndx_list (abfd); entry != NULL; entry = entry->next)
2286 if (entry->ndx == shindex)
2287 goto success;
07d6d2b8 2288
7a6e0d89 2289 entry = bfd_alloc (abfd, sizeof (*entry));
6a40cf0c
NC
2290 if (entry == NULL)
2291 goto fail;
2292 entry->ndx = shindex;
2293 entry->hdr = * hdr;
2294 entry->next = elf_symtab_shndx_list (abfd);
2295 elf_symtab_shndx_list (abfd) = entry;
2296 elf_elfsections (abfd)[shindex] = & entry->hdr;
2297 goto success;
2298 }
9ad5cbcf 2299
bf67003b 2300 case SHT_STRTAB: /* A string table. */
252b5132 2301 if (hdr->bfd_section != NULL)
bf67003b
NC
2302 goto success;
2303
252b5132
RH
2304 if (ehdr->e_shstrndx == shindex)
2305 {
2306 elf_tdata (abfd)->shstrtab_hdr = *hdr;
2307 elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->shstrtab_hdr;
bf67003b 2308 goto success;
252b5132 2309 }
bf67003b 2310
1b3a8575
AM
2311 if (elf_elfsections (abfd)[elf_onesymtab (abfd)]->sh_link == shindex)
2312 {
2313 symtab_strtab:
2314 elf_tdata (abfd)->strtab_hdr = *hdr;
2315 elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->strtab_hdr;
bf67003b 2316 goto success;
1b3a8575 2317 }
bf67003b 2318
1b3a8575
AM
2319 if (elf_elfsections (abfd)[elf_dynsymtab (abfd)]->sh_link == shindex)
2320 {
2321 dynsymtab_strtab:
2322 elf_tdata (abfd)->dynstrtab_hdr = *hdr;
2323 hdr = &elf_tdata (abfd)->dynstrtab_hdr;
2324 elf_elfsections (abfd)[shindex] = hdr;
2325 /* We also treat this as a regular section, so that objcopy
2326 can handle it. */
bf67003b
NC
2327 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2328 shindex);
2329 goto success;
1b3a8575 2330 }
252b5132 2331
1b3a8575
AM
2332 /* If the string table isn't one of the above, then treat it as a
2333 regular section. We need to scan all the headers to be sure,
2334 just in case this strtab section appeared before the above. */
2335 if (elf_onesymtab (abfd) == 0 || elf_dynsymtab (abfd) == 0)
2336 {
2337 unsigned int i, num_sec;
252b5132 2338
1b3a8575
AM
2339 num_sec = elf_numsections (abfd);
2340 for (i = 1; i < num_sec; i++)
2341 {
2342 Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
2343 if (hdr2->sh_link == shindex)
2344 {
933d961a
JJ
2345 /* Prevent endless recursion on broken objects. */
2346 if (i == shindex)
bf67003b 2347 goto fail;
1b3a8575 2348 if (! bfd_section_from_shdr (abfd, i))
bf67003b 2349 goto fail;
1b3a8575
AM
2350 if (elf_onesymtab (abfd) == i)
2351 goto symtab_strtab;
2352 if (elf_dynsymtab (abfd) == i)
2353 goto dynsymtab_strtab;
2354 }
2355 }
2356 }
bf67003b
NC
2357 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2358 goto success;
252b5132
RH
2359
2360 case SHT_REL:
2361 case SHT_RELA:
a619b587 2362 case SHT_RELR:
252b5132
RH
2363 /* *These* do a lot of work -- but build no sections! */
2364 {
2365 asection *target_sect;
d4730f92 2366 Elf_Internal_Shdr *hdr2, **p_hdr;
9ad5cbcf 2367 unsigned int num_sec = elf_numsections (abfd);
d4730f92 2368 struct bfd_elf_section_data *esdt;
a619b587 2369 bfd_size_type size;
252b5132 2370
a619b587
FS
2371 if (hdr->sh_type == SHT_REL)
2372 size = bed->s->sizeof_rel;
2373 else if (hdr->sh_type == SHT_RELA)
2374 size = bed->s->sizeof_rela;
2375 else
2376 size = bed->s->arch_size / 8;
2377 if (hdr->sh_entsize != size)
bf67003b 2378 goto fail;
a50b2160 2379
03ae5f59 2380 /* Check for a bogus link to avoid crashing. */
4fbb74a6 2381 if (hdr->sh_link >= num_sec)
03ae5f59 2382 {
4eca0228 2383 _bfd_error_handler
695344c0 2384 /* xgettext:c-format */
871b3ab2 2385 (_("%pB: invalid link %u for reloc section %s (index %u)"),
4eca0228 2386 abfd, hdr->sh_link, name, shindex);
bf67003b
NC
2387 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2388 shindex);
2389 goto success;
03ae5f59
ILT
2390 }
2391
252b5132 2392 /* Get the symbol table. */
1b3a8575
AM
2393 if ((elf_elfsections (abfd)[hdr->sh_link]->sh_type == SHT_SYMTAB
2394 || elf_elfsections (abfd)[hdr->sh_link]->sh_type == SHT_DYNSYM)
252b5132 2395 && ! bfd_section_from_shdr (abfd, hdr->sh_link))
bf67003b 2396 goto fail;
252b5132 2397
a4bcd733
AM
2398 /* If this is an alloc section in an executable or shared
2399 library, or the reloc section does not use the main symbol
2400 table we don't treat it as a reloc section. BFD can't
2401 adequately represent such a section, so at least for now,
2402 we don't try. We just present it as a normal section. We
2403 also can't use it as a reloc section if it points to the
2404 null section, an invalid section, another reloc section, or
2405 its sh_link points to the null section. */
2406 if (((abfd->flags & (DYNAMIC | EXEC_P)) != 0
2407 && (hdr->sh_flags & SHF_ALLOC) != 0)
83b89087 2408 || hdr->sh_link == SHN_UNDEF
a4bcd733 2409 || hdr->sh_link != elf_onesymtab (abfd)
185ef66d 2410 || hdr->sh_info == SHN_UNDEF
185ef66d
AM
2411 || hdr->sh_info >= num_sec
2412 || elf_elfsections (abfd)[hdr->sh_info]->sh_type == SHT_REL
2413 || elf_elfsections (abfd)[hdr->sh_info]->sh_type == SHT_RELA)
bf67003b
NC
2414 {
2415 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2416 shindex);
2417 goto success;
2418 }
252b5132
RH
2419
2420 if (! bfd_section_from_shdr (abfd, hdr->sh_info))
bf67003b
NC
2421 goto fail;
2422
252b5132
RH
2423 target_sect = bfd_section_from_elf_index (abfd, hdr->sh_info);
2424 if (target_sect == NULL)
bf67003b 2425 goto fail;
252b5132 2426
d4730f92
BS
2427 esdt = elf_section_data (target_sect);
2428 if (hdr->sh_type == SHT_RELA)
2429 p_hdr = &esdt->rela.hdr;
252b5132 2430 else
d4730f92
BS
2431 p_hdr = &esdt->rel.hdr;
2432
a7ba3896
NC
2433 /* PR 17512: file: 0b4f81b7.
2434 Also see PR 24456, for a file which deliberately has two reloc
2435 sections. */
06614111 2436 if (*p_hdr != NULL)
a7ba3896 2437 {
a859124d 2438 if (!bed->init_secondary_reloc_section (abfd, hdr, name, shindex))
a8e14f4c
NC
2439 {
2440 _bfd_error_handler
2441 /* xgettext:c-format */
a859124d
AM
2442 (_("%pB: warning: secondary relocation section '%s' "
2443 "for section %pA found - ignoring"),
a8e14f4c
NC
2444 abfd, name, target_sect);
2445 }
956ea65c
MM
2446 else
2447 esdt->has_secondary_relocs = true;
a7ba3896
NC
2448 goto success;
2449 }
a8e14f4c 2450
ef53be89 2451 hdr2 = (Elf_Internal_Shdr *) bfd_alloc (abfd, sizeof (*hdr2));
d4730f92 2452 if (hdr2 == NULL)
bf67003b 2453 goto fail;
252b5132 2454 *hdr2 = *hdr;
d4730f92 2455 *p_hdr = hdr2;
252b5132 2456 elf_elfsections (abfd)[shindex] = hdr2;
056bafd4
MR
2457 target_sect->reloc_count += (NUM_SHDR_ENTRIES (hdr)
2458 * bed->s->int_rels_per_ext_rel);
252b5132
RH
2459 target_sect->flags |= SEC_RELOC;
2460 target_sect->relocation = NULL;
2461 target_sect->rel_filepos = hdr->sh_offset;
bf572ba0
MM
2462 /* In the section to which the relocations apply, mark whether
2463 its relocations are of the REL or RELA variety. */
72730e0c 2464 if (hdr->sh_size != 0)
d4730f92
BS
2465 {
2466 if (hdr->sh_type == SHT_RELA)
2467 target_sect->use_rela_p = 1;
2468 }
252b5132 2469 abfd->flags |= HAS_RELOC;
bf67003b 2470 goto success;
252b5132 2471 }
252b5132
RH
2472
2473 case SHT_GNU_verdef:
2474 elf_dynverdef (abfd) = shindex;
2475 elf_tdata (abfd)->dynverdef_hdr = *hdr;
bf67003b
NC
2476 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2477 goto success;
252b5132
RH
2478
2479 case SHT_GNU_versym:
a50b2160 2480 if (hdr->sh_entsize != sizeof (Elf_External_Versym))
bf67003b
NC
2481 goto fail;
2482
252b5132
RH
2483 elf_dynversym (abfd) = shindex;
2484 elf_tdata (abfd)->dynversym_hdr = *hdr;
bf67003b
NC
2485 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2486 goto success;
252b5132
RH
2487
2488 case SHT_GNU_verneed:
2489 elf_dynverref (abfd) = shindex;
2490 elf_tdata (abfd)->dynverref_hdr = *hdr;
bf67003b
NC
2491 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2492 goto success;
252b5132
RH
2493
2494 case SHT_SHLIB:
bf67003b 2495 goto success;
252b5132 2496
dbb410c3 2497 case SHT_GROUP:
44534af3 2498 if (! IS_VALID_GROUP_SECTION_HEADER (hdr, GRP_ENTRY_SIZE))
bf67003b
NC
2499 goto fail;
2500
6dc132d9 2501 if (!_bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
bf67003b
NC
2502 goto fail;
2503
bf67003b 2504 goto success;
dbb410c3 2505
252b5132 2506 default:
104d59d1
JM
2507 /* Possibly an attributes section. */
2508 if (hdr->sh_type == SHT_GNU_ATTRIBUTES
2509 || hdr->sh_type == bed->obj_attrs_section_type)
2510 {
2511 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
bf67003b 2512 goto fail;
104d59d1 2513 _bfd_elf_parse_attributes (abfd, hdr);
bf67003b 2514 goto success;
104d59d1
JM
2515 }
2516
252b5132 2517 /* Check for any processor-specific section types. */
3eb70a79 2518 if (bed->elf_backend_section_from_shdr (abfd, hdr, name, shindex))
bf67003b 2519 goto success;
3eb70a79
L
2520
2521 if (hdr->sh_type >= SHT_LOUSER && hdr->sh_type <= SHT_HIUSER)
2522 {
2523 if ((hdr->sh_flags & SHF_ALLOC) != 0)
2524 /* FIXME: How to properly handle allocated section reserved
2525 for applications? */
4eca0228 2526 _bfd_error_handler
695344c0 2527 /* xgettext:c-format */
871b3ab2 2528 (_("%pB: unknown type [%#x] section `%s'"),
76cfced5 2529 abfd, hdr->sh_type, name);
3eb70a79 2530 else
bf67003b
NC
2531 {
2532 /* Allow sections reserved for applications. */
2533 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2534 shindex);
2535 goto success;
2536 }
3eb70a79
L
2537 }
2538 else if (hdr->sh_type >= SHT_LOPROC
2539 && hdr->sh_type <= SHT_HIPROC)
2540 /* FIXME: We should handle this section. */
4eca0228 2541 _bfd_error_handler
695344c0 2542 /* xgettext:c-format */
871b3ab2 2543 (_("%pB: unknown type [%#x] section `%s'"),
76cfced5 2544 abfd, hdr->sh_type, name);
3eb70a79 2545 else if (hdr->sh_type >= SHT_LOOS && hdr->sh_type <= SHT_HIOS)
ff15b240
NC
2546 {
2547 /* Unrecognised OS-specific sections. */
2548 if ((hdr->sh_flags & SHF_OS_NONCONFORMING) != 0)
2549 /* SHF_OS_NONCONFORMING indicates that special knowledge is
08a40648 2550 required to correctly process the section and the file should
ff15b240 2551 be rejected with an error message. */
4eca0228 2552 _bfd_error_handler
695344c0 2553 /* xgettext:c-format */
871b3ab2 2554 (_("%pB: unknown type [%#x] section `%s'"),
76cfced5 2555 abfd, hdr->sh_type, name);
ff15b240 2556 else
bf67003b
NC
2557 {
2558 /* Otherwise it should be processed. */
2559 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2560 goto success;
2561 }
ff15b240 2562 }
3eb70a79
L
2563 else
2564 /* FIXME: We should handle this section. */
4eca0228 2565 _bfd_error_handler
695344c0 2566 /* xgettext:c-format */
871b3ab2 2567 (_("%pB: unknown type [%#x] section `%s'"),
76cfced5 2568 abfd, hdr->sh_type, name);
3eb70a79 2569
bf67003b 2570 goto fail;
252b5132
RH
2571 }
2572
bf67003b 2573 fail:
0a1b45a2 2574 ret = false;
bf67003b 2575 success:
0a1b45a2 2576 elf_tdata (abfd)->being_created[shindex] = false;
bf67003b 2577 return ret;
252b5132
RH
2578}
2579
87d72d41 2580/* Return the local symbol specified by ABFD, R_SYMNDX. */
ec338859 2581
87d72d41
AM
2582Elf_Internal_Sym *
2583bfd_sym_from_r_symndx (struct sym_cache *cache,
2584 bfd *abfd,
2585 unsigned long r_symndx)
ec338859 2586{
ec338859
AM
2587 unsigned int ent = r_symndx % LOCAL_SYM_CACHE_SIZE;
2588
a5d1b3b5
AM
2589 if (cache->abfd != abfd || cache->indx[ent] != r_symndx)
2590 {
2591 Elf_Internal_Shdr *symtab_hdr;
2592 unsigned char esym[sizeof (Elf64_External_Sym)];
2593 Elf_External_Sym_Shndx eshndx;
ec338859 2594
a5d1b3b5
AM
2595 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2596 if (bfd_elf_get_elf_syms (abfd, symtab_hdr, 1, r_symndx,
87d72d41 2597 &cache->sym[ent], esym, &eshndx) == NULL)
a5d1b3b5 2598 return NULL;
9ad5cbcf 2599
a5d1b3b5
AM
2600 if (cache->abfd != abfd)
2601 {
2602 memset (cache->indx, -1, sizeof (cache->indx));
2603 cache->abfd = abfd;
2604 }
2605 cache->indx[ent] = r_symndx;
ec338859 2606 }
a5d1b3b5 2607
87d72d41 2608 return &cache->sym[ent];
ec338859
AM
2609}
2610
252b5132
RH
2611/* Given an ELF section number, retrieve the corresponding BFD
2612 section. */
2613
2614asection *
91d6fa6a 2615bfd_section_from_elf_index (bfd *abfd, unsigned int sec_index)
252b5132 2616{
91d6fa6a 2617 if (sec_index >= elf_numsections (abfd))
252b5132 2618 return NULL;
91d6fa6a 2619 return elf_elfsections (abfd)[sec_index]->bfd_section;
252b5132
RH
2620}
2621
b35d266b 2622static const struct bfd_elf_special_section special_sections_b[] =
2f89ff8d 2623{
0112cd26 2624 { STRING_COMMA_LEN (".bss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
07d6d2b8 2625 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2626};
2627
b35d266b 2628static const struct bfd_elf_special_section special_sections_c[] =
7f4d3958 2629{
0112cd26 2630 { STRING_COMMA_LEN (".comment"), 0, SHT_PROGBITS, 0 },
1ff6de03 2631 { STRING_COMMA_LEN (".ctf"), 0, SHT_PROGBITS, 0 },
07d6d2b8 2632 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2633};
2634
b35d266b 2635static const struct bfd_elf_special_section special_sections_d[] =
7f4d3958 2636{
07d6d2b8
AM
2637 { STRING_COMMA_LEN (".data"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2638 { STRING_COMMA_LEN (".data1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
a9a72a65
DE
2639 /* There are more DWARF sections than these, but they needn't be added here
2640 unless you have to cope with broken compilers that don't emit section
2641 attributes or you want to help the user writing assembler. */
07d6d2b8
AM
2642 { STRING_COMMA_LEN (".debug"), 0, SHT_PROGBITS, 0 },
2643 { STRING_COMMA_LEN (".debug_line"), 0, SHT_PROGBITS, 0 },
2644 { STRING_COMMA_LEN (".debug_info"), 0, SHT_PROGBITS, 0 },
2645 { STRING_COMMA_LEN (".debug_abbrev"), 0, SHT_PROGBITS, 0 },
0112cd26 2646 { STRING_COMMA_LEN (".debug_aranges"), 0, SHT_PROGBITS, 0 },
07d6d2b8
AM
2647 { STRING_COMMA_LEN (".dynamic"), 0, SHT_DYNAMIC, SHF_ALLOC },
2648 { STRING_COMMA_LEN (".dynstr"), 0, SHT_STRTAB, SHF_ALLOC },
2649 { STRING_COMMA_LEN (".dynsym"), 0, SHT_DYNSYM, SHF_ALLOC },
2650 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2651};
2652
b35d266b 2653static const struct bfd_elf_special_section special_sections_f[] =
7f4d3958 2654{
07d6d2b8 2655 { STRING_COMMA_LEN (".fini"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
6f9dbcd4 2656 { STRING_COMMA_LEN (".fini_array"), -2, SHT_FINI_ARRAY, SHF_ALLOC + SHF_WRITE },
07d6d2b8 2657 { NULL, 0 , 0, 0, 0 }
7f4d3958
L
2658};
2659
b35d266b 2660static const struct bfd_elf_special_section special_sections_g[] =
7f4d3958 2661{
0112cd26 2662 { STRING_COMMA_LEN (".gnu.linkonce.b"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2c6f3e56
JL
2663 { STRING_COMMA_LEN (".gnu.linkonce.n"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2664 { STRING_COMMA_LEN (".gnu.linkonce.p"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
07d6d2b8
AM
2665 { STRING_COMMA_LEN (".gnu.lto_"), -1, SHT_PROGBITS, SHF_EXCLUDE },
2666 { STRING_COMMA_LEN (".got"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2667 { STRING_COMMA_LEN (".gnu.version"), 0, SHT_GNU_versym, 0 },
0112cd26
NC
2668 { STRING_COMMA_LEN (".gnu.version_d"), 0, SHT_GNU_verdef, 0 },
2669 { STRING_COMMA_LEN (".gnu.version_r"), 0, SHT_GNU_verneed, 0 },
07d6d2b8
AM
2670 { STRING_COMMA_LEN (".gnu.liblist"), 0, SHT_GNU_LIBLIST, SHF_ALLOC },
2671 { STRING_COMMA_LEN (".gnu.conflict"), 0, SHT_RELA, SHF_ALLOC },
2672 { STRING_COMMA_LEN (".gnu.hash"), 0, SHT_GNU_HASH, SHF_ALLOC },
2673 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2674};
2675
b35d266b 2676static const struct bfd_elf_special_section special_sections_h[] =
7f4d3958 2677{
07d6d2b8
AM
2678 { STRING_COMMA_LEN (".hash"), 0, SHT_HASH, SHF_ALLOC },
2679 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2680};
2681
b35d266b 2682static const struct bfd_elf_special_section special_sections_i[] =
7f4d3958 2683{
07d6d2b8 2684 { STRING_COMMA_LEN (".init"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
6f9dbcd4 2685 { STRING_COMMA_LEN (".init_array"), -2, SHT_INIT_ARRAY, SHF_ALLOC + SHF_WRITE },
07d6d2b8
AM
2686 { STRING_COMMA_LEN (".interp"), 0, SHT_PROGBITS, 0 },
2687 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2688};
2689
b35d266b 2690static const struct bfd_elf_special_section special_sections_l[] =
7f4d3958 2691{
0112cd26 2692 { STRING_COMMA_LEN (".line"), 0, SHT_PROGBITS, 0 },
07d6d2b8 2693 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2694};
2695
b35d266b 2696static const struct bfd_elf_special_section special_sections_n[] =
7f4d3958 2697{
2c6f3e56 2698 { STRING_COMMA_LEN (".noinit"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
0112cd26 2699 { STRING_COMMA_LEN (".note.GNU-stack"), 0, SHT_PROGBITS, 0 },
07d6d2b8
AM
2700 { STRING_COMMA_LEN (".note"), -1, SHT_NOTE, 0 },
2701 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2702};
2703
b35d266b 2704static const struct bfd_elf_special_section special_sections_p[] =
7f4d3958 2705{
f5e98b7d 2706 { STRING_COMMA_LEN (".persistent.bss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2c6f3e56 2707 { STRING_COMMA_LEN (".persistent"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
6f9dbcd4 2708 { STRING_COMMA_LEN (".preinit_array"), -2, SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_WRITE },
07d6d2b8
AM
2709 { STRING_COMMA_LEN (".plt"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2710 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2711};
2712
b35d266b 2713static const struct bfd_elf_special_section special_sections_r[] =
7f4d3958 2714{
0112cd26
NC
2715 { STRING_COMMA_LEN (".rodata"), -2, SHT_PROGBITS, SHF_ALLOC },
2716 { STRING_COMMA_LEN (".rodata1"), 0, SHT_PROGBITS, SHF_ALLOC },
fc07cf22 2717 { STRING_COMMA_LEN (".relr.dyn"), 0, SHT_RELR, SHF_ALLOC },
07d6d2b8
AM
2718 { STRING_COMMA_LEN (".rela"), -1, SHT_RELA, 0 },
2719 { STRING_COMMA_LEN (".rel"), -1, SHT_REL, 0 },
2720 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2721};
2722
b35d266b 2723static const struct bfd_elf_special_section special_sections_s[] =
7f4d3958 2724{
0112cd26
NC
2725 { STRING_COMMA_LEN (".shstrtab"), 0, SHT_STRTAB, 0 },
2726 { STRING_COMMA_LEN (".strtab"), 0, SHT_STRTAB, 0 },
2727 { STRING_COMMA_LEN (".symtab"), 0, SHT_SYMTAB, 0 },
60ff4dc4
HPN
2728 /* See struct bfd_elf_special_section declaration for the semantics of
2729 this special case where .prefix_length != strlen (.prefix). */
2730 { ".stabstr", 5, 3, SHT_STRTAB, 0 },
07d6d2b8 2731 { NULL, 0, 0, 0, 0 }
2f89ff8d
L
2732};
2733
b35d266b 2734static const struct bfd_elf_special_section special_sections_t[] =
7f4d3958 2735{
07d6d2b8
AM
2736 { STRING_COMMA_LEN (".text"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2737 { STRING_COMMA_LEN (".tbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
0112cd26 2738 { STRING_COMMA_LEN (".tdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
07d6d2b8 2739 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2740};
2741
1b315056
CS
2742static const struct bfd_elf_special_section special_sections_z[] =
2743{
07d6d2b8
AM
2744 { STRING_COMMA_LEN (".zdebug_line"), 0, SHT_PROGBITS, 0 },
2745 { STRING_COMMA_LEN (".zdebug_info"), 0, SHT_PROGBITS, 0 },
1b315056
CS
2746 { STRING_COMMA_LEN (".zdebug_abbrev"), 0, SHT_PROGBITS, 0 },
2747 { STRING_COMMA_LEN (".zdebug_aranges"), 0, SHT_PROGBITS, 0 },
07d6d2b8 2748 { NULL, 0, 0, 0, 0 }
1b315056
CS
2749};
2750
e4c93b56 2751static const struct bfd_elf_special_section * const special_sections[] =
7f4d3958 2752{
7f4d3958 2753 special_sections_b, /* 'b' */
98ece1b3 2754 special_sections_c, /* 'c' */
7f4d3958
L
2755 special_sections_d, /* 'd' */
2756 NULL, /* 'e' */
2757 special_sections_f, /* 'f' */
2758 special_sections_g, /* 'g' */
2759 special_sections_h, /* 'h' */
2760 special_sections_i, /* 'i' */
2761 NULL, /* 'j' */
2762 NULL, /* 'k' */
2763 special_sections_l, /* 'l' */
2764 NULL, /* 'm' */
2765 special_sections_n, /* 'n' */
2766 NULL, /* 'o' */
2767 special_sections_p, /* 'p' */
2768 NULL, /* 'q' */
2769 special_sections_r, /* 'r' */
2770 special_sections_s, /* 's' */
2771 special_sections_t, /* 't' */
1b315056
CS
2772 NULL, /* 'u' */
2773 NULL, /* 'v' */
2774 NULL, /* 'w' */
2775 NULL, /* 'x' */
2776 NULL, /* 'y' */
2777 special_sections_z /* 'z' */
7f4d3958
L
2778};
2779
551b43fd
AM
2780const struct bfd_elf_special_section *
2781_bfd_elf_get_special_section (const char *name,
2782 const struct bfd_elf_special_section *spec,
2783 unsigned int rela)
2f89ff8d
L
2784{
2785 int i;
7f4d3958 2786 int len;
7f4d3958 2787
551b43fd 2788 len = strlen (name);
7f4d3958 2789
551b43fd 2790 for (i = 0; spec[i].prefix != NULL; i++)
7dcb9820
AM
2791 {
2792 int suffix_len;
551b43fd 2793 int prefix_len = spec[i].prefix_length;
7dcb9820
AM
2794
2795 if (len < prefix_len)
2796 continue;
551b43fd 2797 if (memcmp (name, spec[i].prefix, prefix_len) != 0)
7dcb9820
AM
2798 continue;
2799
551b43fd 2800 suffix_len = spec[i].suffix_length;
7dcb9820
AM
2801 if (suffix_len <= 0)
2802 {
2803 if (name[prefix_len] != 0)
2804 {
2805 if (suffix_len == 0)
2806 continue;
2807 if (name[prefix_len] != '.'
2808 && (suffix_len == -2
551b43fd 2809 || (rela && spec[i].type == SHT_REL)))
7dcb9820
AM
2810 continue;
2811 }
2812 }
2813 else
2814 {
2815 if (len < prefix_len + suffix_len)
2816 continue;
2817 if (memcmp (name + len - suffix_len,
551b43fd 2818 spec[i].prefix + prefix_len,
7dcb9820
AM
2819 suffix_len) != 0)
2820 continue;
2821 }
551b43fd 2822 return &spec[i];
7dcb9820 2823 }
2f89ff8d
L
2824
2825 return NULL;
2826}
2827
7dcb9820 2828const struct bfd_elf_special_section *
29ef7005 2829_bfd_elf_get_sec_type_attr (bfd *abfd, asection *sec)
2f89ff8d 2830{
551b43fd
AM
2831 int i;
2832 const struct bfd_elf_special_section *spec;
29ef7005 2833 const struct elf_backend_data *bed;
2f89ff8d
L
2834
2835 /* See if this is one of the special sections. */
551b43fd
AM
2836 if (sec->name == NULL)
2837 return NULL;
2f89ff8d 2838
29ef7005
L
2839 bed = get_elf_backend_data (abfd);
2840 spec = bed->special_sections;
2841 if (spec)
2842 {
2843 spec = _bfd_elf_get_special_section (sec->name,
2844 bed->special_sections,
2845 sec->use_rela_p);
2846 if (spec != NULL)
2847 return spec;
2848 }
2849
551b43fd
AM
2850 if (sec->name[0] != '.')
2851 return NULL;
2f89ff8d 2852
551b43fd 2853 i = sec->name[1] - 'b';
1b315056 2854 if (i < 0 || i > 'z' - 'b')
551b43fd
AM
2855 return NULL;
2856
2857 spec = special_sections[i];
2f89ff8d 2858
551b43fd
AM
2859 if (spec == NULL)
2860 return NULL;
2861
2862 return _bfd_elf_get_special_section (sec->name, spec, sec->use_rela_p);
2f89ff8d
L
2863}
2864
0a1b45a2 2865bool
217aa764 2866_bfd_elf_new_section_hook (bfd *abfd, asection *sec)
252b5132
RH
2867{
2868 struct bfd_elf_section_data *sdata;
551b43fd 2869 const struct elf_backend_data *bed;
7dcb9820 2870 const struct bfd_elf_special_section *ssect;
252b5132 2871
f0abc2a1
AM
2872 sdata = (struct bfd_elf_section_data *) sec->used_by_bfd;
2873 if (sdata == NULL)
2874 {
a50b1753 2875 sdata = (struct bfd_elf_section_data *) bfd_zalloc (abfd,
07d6d2b8 2876 sizeof (*sdata));
f0abc2a1 2877 if (sdata == NULL)
0a1b45a2 2878 return false;
217aa764 2879 sec->used_by_bfd = sdata;
f0abc2a1 2880 }
bf572ba0 2881
551b43fd
AM
2882 /* Indicate whether or not this section should use RELA relocations. */
2883 bed = get_elf_backend_data (abfd);
2884 sec->use_rela_p = bed->default_use_rela_p;
2885
8c803a2d
AM
2886 /* Set up ELF section type and flags for newly created sections, if
2887 there is an ABI mandated section. */
2888 ssect = (*bed->get_sec_type_attr) (abfd, sec);
2889 if (ssect != NULL)
2f89ff8d 2890 {
8c803a2d
AM
2891 elf_section_type (sec) = ssect->type;
2892 elf_section_flags (sec) = ssect->attr;
2f89ff8d
L
2893 }
2894
f592407e 2895 return _bfd_generic_new_section_hook (abfd, sec);
252b5132
RH
2896}
2897
2898/* Create a new bfd section from an ELF program header.
2899
2900 Since program segments have no names, we generate a synthetic name
2901 of the form segment<NUM>, where NUM is generally the index in the
2902 program header table. For segments that are split (see below) we
2903 generate the names segment<NUM>a and segment<NUM>b.
2904
2905 Note that some program segments may have a file size that is different than
2906 (less than) the memory size. All this means is that at execution the
2907 system must allocate the amount of memory specified by the memory size,
2908 but only initialize it with the first "file size" bytes read from the
2909 file. This would occur for example, with program segments consisting
2910 of combined data+bss.
2911
2912 To handle the above situation, this routine generates TWO bfd sections
2913 for the single program segment. The first has the length specified by
2914 the file size of the segment, and the second has the length specified
2915 by the difference between the two sizes. In effect, the segment is split
d5191d0c 2916 into its initialized and uninitialized parts.
252b5132
RH
2917
2918 */
2919
0a1b45a2 2920bool
217aa764
AM
2921_bfd_elf_make_section_from_phdr (bfd *abfd,
2922 Elf_Internal_Phdr *hdr,
91d6fa6a 2923 int hdr_index,
a50b1753 2924 const char *type_name)
252b5132
RH
2925{
2926 asection *newsect;
2927 char *name;
2928 char namebuf[64];
d4c88bbb 2929 size_t len;
252b5132 2930 int split;
502794d4 2931 unsigned int opb = bfd_octets_per_byte (abfd, NULL);
252b5132
RH
2932
2933 split = ((hdr->p_memsz > 0)
2934 && (hdr->p_filesz > 0)
2935 && (hdr->p_memsz > hdr->p_filesz));
d5191d0c
AM
2936
2937 if (hdr->p_filesz > 0)
252b5132 2938 {
91d6fa6a 2939 sprintf (namebuf, "%s%d%s", type_name, hdr_index, split ? "a" : "");
d5191d0c 2940 len = strlen (namebuf) + 1;
a50b1753 2941 name = (char *) bfd_alloc (abfd, len);
d5191d0c 2942 if (!name)
0a1b45a2 2943 return false;
d5191d0c
AM
2944 memcpy (name, namebuf, len);
2945 newsect = bfd_make_section (abfd, name);
2946 if (newsect == NULL)
0a1b45a2 2947 return false;
502794d4
CE
2948 newsect->vma = hdr->p_vaddr / opb;
2949 newsect->lma = hdr->p_paddr / opb;
d5191d0c
AM
2950 newsect->size = hdr->p_filesz;
2951 newsect->filepos = hdr->p_offset;
2952 newsect->flags |= SEC_HAS_CONTENTS;
2953 newsect->alignment_power = bfd_log2 (hdr->p_align);
2954 if (hdr->p_type == PT_LOAD)
252b5132 2955 {
d5191d0c
AM
2956 newsect->flags |= SEC_ALLOC;
2957 newsect->flags |= SEC_LOAD;
2958 if (hdr->p_flags & PF_X)
2959 {
2960 /* FIXME: all we known is that it has execute PERMISSION,
2961 may be data. */
2962 newsect->flags |= SEC_CODE;
2963 }
2964 }
2965 if (!(hdr->p_flags & PF_W))
2966 {
2967 newsect->flags |= SEC_READONLY;
252b5132 2968 }
252b5132
RH
2969 }
2970
d5191d0c 2971 if (hdr->p_memsz > hdr->p_filesz)
252b5132 2972 {
d5191d0c
AM
2973 bfd_vma align;
2974
91d6fa6a 2975 sprintf (namebuf, "%s%d%s", type_name, hdr_index, split ? "b" : "");
d4c88bbb 2976 len = strlen (namebuf) + 1;
a50b1753 2977 name = (char *) bfd_alloc (abfd, len);
252b5132 2978 if (!name)
0a1b45a2 2979 return false;
d4c88bbb 2980 memcpy (name, namebuf, len);
252b5132
RH
2981 newsect = bfd_make_section (abfd, name);
2982 if (newsect == NULL)
0a1b45a2 2983 return false;
502794d4
CE
2984 newsect->vma = (hdr->p_vaddr + hdr->p_filesz) / opb;
2985 newsect->lma = (hdr->p_paddr + hdr->p_filesz) / opb;
eea6121a 2986 newsect->size = hdr->p_memsz - hdr->p_filesz;
d5191d0c
AM
2987 newsect->filepos = hdr->p_offset + hdr->p_filesz;
2988 align = newsect->vma & -newsect->vma;
2989 if (align == 0 || align > hdr->p_align)
2990 align = hdr->p_align;
2991 newsect->alignment_power = bfd_log2 (align);
252b5132
RH
2992 if (hdr->p_type == PT_LOAD)
2993 {
2994 newsect->flags |= SEC_ALLOC;
2995 if (hdr->p_flags & PF_X)
2996 newsect->flags |= SEC_CODE;
2997 }
2998 if (!(hdr->p_flags & PF_W))
2999 newsect->flags |= SEC_READONLY;
3000 }
3001
0a1b45a2 3002 return true;
252b5132
RH
3003}
3004
0a1b45a2 3005static bool
864619bb
KS
3006_bfd_elf_core_find_build_id (bfd *templ, bfd_vma offset)
3007{
3008 /* The return value is ignored. Build-ids are considered optional. */
3009 if (templ->xvec->flavour == bfd_target_elf_flavour)
3010 return (*get_elf_backend_data (templ)->elf_backend_core_find_build_id)
3011 (templ, offset);
0a1b45a2 3012 return false;
864619bb
KS
3013}
3014
0a1b45a2 3015bool
91d6fa6a 3016bfd_section_from_phdr (bfd *abfd, Elf_Internal_Phdr *hdr, int hdr_index)
20cfcaae 3017{
9c5bfbb7 3018 const struct elf_backend_data *bed;
20cfcaae
NC
3019
3020 switch (hdr->p_type)
3021 {
3022 case PT_NULL:
91d6fa6a 3023 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "null");
20cfcaae
NC
3024
3025 case PT_LOAD:
864619bb 3026 if (! _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "load"))
0a1b45a2 3027 return false;
864619bb
KS
3028 if (bfd_get_format (abfd) == bfd_core && abfd->build_id == NULL)
3029 _bfd_elf_core_find_build_id (abfd, hdr->p_offset);
0a1b45a2 3030 return true;
20cfcaae
NC
3031
3032 case PT_DYNAMIC:
91d6fa6a 3033 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "dynamic");
20cfcaae
NC
3034
3035 case PT_INTERP:
91d6fa6a 3036 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "interp");
20cfcaae
NC
3037
3038 case PT_NOTE:
91d6fa6a 3039 if (! _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "note"))
0a1b45a2 3040 return false;
276da9b3
L
3041 if (! elf_read_notes (abfd, hdr->p_offset, hdr->p_filesz,
3042 hdr->p_align))
0a1b45a2
AM
3043 return false;
3044 return true;
20cfcaae
NC
3045
3046 case PT_SHLIB:
91d6fa6a 3047 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "shlib");
20cfcaae
NC
3048
3049 case PT_PHDR:
91d6fa6a 3050 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "phdr");
20cfcaae 3051
811072d8 3052 case PT_GNU_EH_FRAME:
91d6fa6a 3053 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index,
811072d8
RM
3054 "eh_frame_hdr");
3055
2b05f1b7 3056 case PT_GNU_STACK:
91d6fa6a 3057 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "stack");
9ee5e499 3058
8c37241b 3059 case PT_GNU_RELRO:
91d6fa6a 3060 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "relro");
8c37241b 3061
20cfcaae 3062 default:
8c1acd09 3063 /* Check for any processor-specific program segment types. */
20cfcaae 3064 bed = get_elf_backend_data (abfd);
91d6fa6a 3065 return bed->elf_backend_section_from_phdr (abfd, hdr, hdr_index, "proc");
20cfcaae
NC
3066 }
3067}
3068
d4730f92
BS
3069/* Return the REL_HDR for SEC, assuming there is only a single one, either
3070 REL or RELA. */
3071
3072Elf_Internal_Shdr *
3073_bfd_elf_single_rel_hdr (asection *sec)
3074{
3075 if (elf_section_data (sec)->rel.hdr)
3076 {
3077 BFD_ASSERT (elf_section_data (sec)->rela.hdr == NULL);
3078 return elf_section_data (sec)->rel.hdr;
3079 }
3080 else
3081 return elf_section_data (sec)->rela.hdr;
3082}
3083
0a1b45a2 3084static bool
3e19fb8f
L
3085_bfd_elf_set_reloc_sh_name (bfd *abfd,
3086 Elf_Internal_Shdr *rel_hdr,
3087 const char *sec_name,
0a1b45a2 3088 bool use_rela_p)
3e19fb8f
L
3089{
3090 char *name = (char *) bfd_alloc (abfd,
3091 sizeof ".rela" + strlen (sec_name));
3092 if (name == NULL)
0a1b45a2 3093 return false;
3e19fb8f
L
3094
3095 sprintf (name, "%s%s", use_rela_p ? ".rela" : ".rel", sec_name);
3096 rel_hdr->sh_name =
3097 (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd), name,
0a1b45a2 3098 false);
3e19fb8f 3099 if (rel_hdr->sh_name == (unsigned int) -1)
0a1b45a2 3100 return false;
3e19fb8f 3101
0a1b45a2 3102 return true;
3e19fb8f
L
3103}
3104
d4730f92
BS
3105/* Allocate and initialize a section-header for a new reloc section,
3106 containing relocations against ASECT. It is stored in RELDATA. If
3107 USE_RELA_P is TRUE, we use RELA relocations; otherwise, we use REL
3108 relocations. */
23bc299b 3109
0a1b45a2 3110static bool
217aa764 3111_bfd_elf_init_reloc_shdr (bfd *abfd,
d4730f92 3112 struct bfd_elf_section_reloc_data *reldata,
f6fe1ccd 3113 const char *sec_name,
0a1b45a2
AM
3114 bool use_rela_p,
3115 bool delay_st_name_p)
23bc299b 3116{
d4730f92 3117 Elf_Internal_Shdr *rel_hdr;
9c5bfbb7 3118 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
d4730f92 3119
d4730f92 3120 BFD_ASSERT (reldata->hdr == NULL);
ef53be89 3121 rel_hdr = bfd_zalloc (abfd, sizeof (*rel_hdr));
d4730f92 3122 reldata->hdr = rel_hdr;
23bc299b 3123
3e19fb8f
L
3124 if (delay_st_name_p)
3125 rel_hdr->sh_name = (unsigned int) -1;
3126 else if (!_bfd_elf_set_reloc_sh_name (abfd, rel_hdr, sec_name,
3127 use_rela_p))
0a1b45a2 3128 return false;
23bc299b
MM
3129 rel_hdr->sh_type = use_rela_p ? SHT_RELA : SHT_REL;
3130 rel_hdr->sh_entsize = (use_rela_p
3131 ? bed->s->sizeof_rela
3132 : bed->s->sizeof_rel);
72de5009 3133 rel_hdr->sh_addralign = (bfd_vma) 1 << bed->s->log_file_align;
28e07a05 3134 rel_hdr->sh_flags = 0;
23bc299b
MM
3135 rel_hdr->sh_addr = 0;
3136 rel_hdr->sh_size = 0;
3137 rel_hdr->sh_offset = 0;
3138
0a1b45a2 3139 return true;
23bc299b
MM
3140}
3141
94be91de
JB
3142/* Return the default section type based on the passed in section flags. */
3143
3144int
3145bfd_elf_get_default_section_type (flagword flags)
3146{
0e41bebb 3147 if ((flags & (SEC_ALLOC | SEC_IS_COMMON)) != 0
2e76e85a 3148 && (flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
94be91de
JB
3149 return SHT_NOBITS;
3150 return SHT_PROGBITS;
3151}
3152
d4730f92
BS
3153struct fake_section_arg
3154{
3155 struct bfd_link_info *link_info;
0a1b45a2 3156 bool failed;
d4730f92
BS
3157};
3158
252b5132
RH
3159/* Set up an ELF internal section header for a section. */
3160
252b5132 3161static void
d4730f92 3162elf_fake_sections (bfd *abfd, asection *asect, void *fsarg)
252b5132 3163{
d4730f92 3164 struct fake_section_arg *arg = (struct fake_section_arg *)fsarg;
9c5bfbb7 3165 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
d4730f92 3166 struct bfd_elf_section_data *esd = elf_section_data (asect);
252b5132 3167 Elf_Internal_Shdr *this_hdr;
0414f35b 3168 unsigned int sh_type;
0ce398f1 3169 const char *name = asect->name;
0a1b45a2 3170 bool delay_st_name_p = false;
233bf4f8 3171 bfd_vma mask;
252b5132 3172
d4730f92 3173 if (arg->failed)
252b5132
RH
3174 {
3175 /* We already failed; just get out of the bfd_map_over_sections
08a40648 3176 loop. */
252b5132
RH
3177 return;
3178 }
3179
d4730f92 3180 this_hdr = &esd->this_hdr;
252b5132 3181
f6fe1ccd 3182 if (arg->link_info)
0ce398f1 3183 {
f6fe1ccd
L
3184 /* ld: compress DWARF debug sections with names: .debug_*. */
3185 if ((arg->link_info->compress_debug & COMPRESS_DEBUG)
3186 && (asect->flags & SEC_DEBUGGING)
3187 && name[1] == 'd'
3188 && name[6] == '_')
3189 {
3190 /* Set SEC_ELF_COMPRESS to indicate this section should be
3191 compressed. */
3192 asect->flags |= SEC_ELF_COMPRESS;
dd905818 3193 /* If this section will be compressed, delay adding section
3e19fb8f
L
3194 name to section name section after it is compressed in
3195 _bfd_elf_assign_file_positions_for_non_load. */
0a1b45a2 3196 delay_st_name_p = true;
f6fe1ccd
L
3197 }
3198 }
3199 else if ((asect->flags & SEC_ELF_RENAME))
3200 {
3201 /* objcopy: rename output DWARF debug section. */
3202 if ((abfd->flags & (BFD_DECOMPRESS | BFD_COMPRESS_GABI)))
3203 {
3204 /* When we decompress or compress with SHF_COMPRESSED,
3205 convert section name from .zdebug_* to .debug_* if
3206 needed. */
3207 if (name[1] == 'z')
3208 {
3209 char *new_name = convert_zdebug_to_debug (abfd, name);
3210 if (new_name == NULL)
3211 {
0a1b45a2 3212 arg->failed = true;
f6fe1ccd
L
3213 return;
3214 }
3215 name = new_name;
3216 }
3217 }
3218 else if (asect->compress_status == COMPRESS_SECTION_DONE)
0ce398f1 3219 {
f6fe1ccd
L
3220 /* PR binutils/18087: Compression does not always make a
3221 section smaller. So only rename the section when
3222 compression has actually taken place. If input section
3223 name is .zdebug_*, we should never compress it again. */
3224 char *new_name = convert_debug_to_zdebug (abfd, name);
0ce398f1
L
3225 if (new_name == NULL)
3226 {
0a1b45a2 3227 arg->failed = true;
0ce398f1
L
3228 return;
3229 }
f6fe1ccd
L
3230 BFD_ASSERT (name[1] != 'z');
3231 name = new_name;
0ce398f1
L
3232 }
3233 }
3234
3e19fb8f
L
3235 if (delay_st_name_p)
3236 this_hdr->sh_name = (unsigned int) -1;
3237 else
252b5132 3238 {
3e19fb8f
L
3239 this_hdr->sh_name
3240 = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
0a1b45a2 3241 name, false);
3e19fb8f
L
3242 if (this_hdr->sh_name == (unsigned int) -1)
3243 {
0a1b45a2 3244 arg->failed = true;
3e19fb8f
L
3245 return;
3246 }
252b5132
RH
3247 }
3248
a4d8e49b 3249 /* Don't clear sh_flags. Assembler may set additional bits. */
252b5132
RH
3250
3251 if ((asect->flags & SEC_ALLOC) != 0
3252 || asect->user_set_vma)
502794d4 3253 this_hdr->sh_addr = asect->vma * bfd_octets_per_byte (abfd, asect);
252b5132
RH
3254 else
3255 this_hdr->sh_addr = 0;
3256
3257 this_hdr->sh_offset = 0;
eea6121a 3258 this_hdr->sh_size = asect->size;
252b5132 3259 this_hdr->sh_link = 0;
c86934ce
NC
3260 /* PR 17512: file: 0eb809fe, 8b0535ee. */
3261 if (asect->alignment_power >= (sizeof (bfd_vma) * 8) - 1)
3262 {
4eca0228 3263 _bfd_error_handler
695344c0 3264 /* xgettext:c-format */
9793eb77 3265 (_("%pB: error: alignment power %d of section `%pA' is too big"),
c08bb8dd 3266 abfd, asect->alignment_power, asect);
0a1b45a2 3267 arg->failed = true;
c86934ce
NC
3268 return;
3269 }
233bf4f8
AM
3270 /* Set sh_addralign to the highest power of two given by alignment
3271 consistent with the section VMA. Linker scripts can force VMA. */
3272 mask = ((bfd_vma) 1 << asect->alignment_power) | this_hdr->sh_addr;
3273 this_hdr->sh_addralign = mask & -mask;
252b5132
RH
3274 /* The sh_entsize and sh_info fields may have been set already by
3275 copy_private_section_data. */
3276
3277 this_hdr->bfd_section = asect;
3278 this_hdr->contents = NULL;
3279
3cddba1e
L
3280 /* If the section type is unspecified, we set it based on
3281 asect->flags. */
98ece1b3
AM
3282 if ((asect->flags & SEC_GROUP) != 0)
3283 sh_type = SHT_GROUP;
98ece1b3 3284 else
94be91de 3285 sh_type = bfd_elf_get_default_section_type (asect->flags);
98ece1b3 3286
3cddba1e 3287 if (this_hdr->sh_type == SHT_NULL)
98ece1b3
AM
3288 this_hdr->sh_type = sh_type;
3289 else if (this_hdr->sh_type == SHT_NOBITS
3290 && sh_type == SHT_PROGBITS
3291 && (asect->flags & SEC_ALLOC) != 0)
3cddba1e 3292 {
98ece1b3
AM
3293 /* Warn if we are changing a NOBITS section to PROGBITS, but
3294 allow the link to proceed. This can happen when users link
3295 non-bss input sections to bss output sections, or emit data
3296 to a bss output section via a linker script. */
4eca0228 3297 _bfd_error_handler
871b3ab2 3298 (_("warning: section `%pA' type changed to PROGBITS"), asect);
98ece1b3 3299 this_hdr->sh_type = sh_type;
3cddba1e
L
3300 }
3301
2f89ff8d 3302 switch (this_hdr->sh_type)
252b5132 3303 {
2f89ff8d 3304 default:
2f89ff8d
L
3305 break;
3306
3307 case SHT_STRTAB:
2f89ff8d
L
3308 case SHT_NOTE:
3309 case SHT_NOBITS:
3310 case SHT_PROGBITS:
3311 break;
606851fb
AM
3312
3313 case SHT_INIT_ARRAY:
3314 case SHT_FINI_ARRAY:
3315 case SHT_PREINIT_ARRAY:
3316 this_hdr->sh_entsize = bed->s->arch_size / 8;
3317 break;
2f89ff8d
L
3318
3319 case SHT_HASH:
c7ac6ff8 3320 this_hdr->sh_entsize = bed->s->sizeof_hash_entry;
2f89ff8d 3321 break;
5de3bf90 3322
2f89ff8d 3323 case SHT_DYNSYM:
252b5132 3324 this_hdr->sh_entsize = bed->s->sizeof_sym;
2f89ff8d
L
3325 break;
3326
3327 case SHT_DYNAMIC:
252b5132 3328 this_hdr->sh_entsize = bed->s->sizeof_dyn;
2f89ff8d
L
3329 break;
3330
3331 case SHT_RELA:
3332 if (get_elf_backend_data (abfd)->may_use_rela_p)
3333 this_hdr->sh_entsize = bed->s->sizeof_rela;
3334 break;
3335
3336 case SHT_REL:
3337 if (get_elf_backend_data (abfd)->may_use_rel_p)
3338 this_hdr->sh_entsize = bed->s->sizeof_rel;
3339 break;
3340
3341 case SHT_GNU_versym:
252b5132 3342 this_hdr->sh_entsize = sizeof (Elf_External_Versym);
2f89ff8d
L
3343 break;
3344
3345 case SHT_GNU_verdef:
252b5132
RH
3346 this_hdr->sh_entsize = 0;
3347 /* objcopy or strip will copy over sh_info, but may not set
08a40648
AM
3348 cverdefs. The linker will set cverdefs, but sh_info will be
3349 zero. */
252b5132
RH
3350 if (this_hdr->sh_info == 0)
3351 this_hdr->sh_info = elf_tdata (abfd)->cverdefs;
3352 else
3353 BFD_ASSERT (elf_tdata (abfd)->cverdefs == 0
3354 || this_hdr->sh_info == elf_tdata (abfd)->cverdefs);
2f89ff8d
L
3355 break;
3356
3357 case SHT_GNU_verneed:
252b5132
RH
3358 this_hdr->sh_entsize = 0;
3359 /* objcopy or strip will copy over sh_info, but may not set
08a40648
AM
3360 cverrefs. The linker will set cverrefs, but sh_info will be
3361 zero. */
252b5132
RH
3362 if (this_hdr->sh_info == 0)
3363 this_hdr->sh_info = elf_tdata (abfd)->cverrefs;
3364 else
3365 BFD_ASSERT (elf_tdata (abfd)->cverrefs == 0
3366 || this_hdr->sh_info == elf_tdata (abfd)->cverrefs);
2f89ff8d
L
3367 break;
3368
3369 case SHT_GROUP:
1783205a 3370 this_hdr->sh_entsize = GRP_ENTRY_SIZE;
2f89ff8d 3371 break;
fdc90cb4
JJ
3372
3373 case SHT_GNU_HASH:
3374 this_hdr->sh_entsize = bed->s->arch_size == 64 ? 0 : 4;
3375 break;
dbb410c3 3376 }
252b5132
RH
3377
3378 if ((asect->flags & SEC_ALLOC) != 0)
3379 this_hdr->sh_flags |= SHF_ALLOC;
3380 if ((asect->flags & SEC_READONLY) == 0)
3381 this_hdr->sh_flags |= SHF_WRITE;
3382 if ((asect->flags & SEC_CODE) != 0)
3383 this_hdr->sh_flags |= SHF_EXECINSTR;
f5fa8ca2
JJ
3384 if ((asect->flags & SEC_MERGE) != 0)
3385 {
3386 this_hdr->sh_flags |= SHF_MERGE;
3387 this_hdr->sh_entsize = asect->entsize;
f5fa8ca2 3388 }
84865015
NC
3389 if ((asect->flags & SEC_STRINGS) != 0)
3390 this_hdr->sh_flags |= SHF_STRINGS;
1126897b 3391 if ((asect->flags & SEC_GROUP) == 0 && elf_group_name (asect) != NULL)
dbb410c3 3392 this_hdr->sh_flags |= SHF_GROUP;
13ae64f3 3393 if ((asect->flags & SEC_THREAD_LOCAL) != 0)
704afa60
JJ
3394 {
3395 this_hdr->sh_flags |= SHF_TLS;
3a800eb9
AM
3396 if (asect->size == 0
3397 && (asect->flags & SEC_HAS_CONTENTS) == 0)
704afa60 3398 {
3a800eb9 3399 struct bfd_link_order *o = asect->map_tail.link_order;
b34976b6 3400
704afa60 3401 this_hdr->sh_size = 0;
3a800eb9
AM
3402 if (o != NULL)
3403 {
704afa60 3404 this_hdr->sh_size = o->offset + o->size;
3a800eb9
AM
3405 if (this_hdr->sh_size != 0)
3406 this_hdr->sh_type = SHT_NOBITS;
3407 }
704afa60
JJ
3408 }
3409 }
18ae9cc1
L
3410 if ((asect->flags & (SEC_GROUP | SEC_EXCLUDE)) == SEC_EXCLUDE)
3411 this_hdr->sh_flags |= SHF_EXCLUDE;
252b5132 3412
d4730f92
BS
3413 /* If the section has relocs, set up a section header for the
3414 SHT_REL[A] section. If two relocation sections are required for
3415 this section, it is up to the processor-specific back-end to
3416 create the other. */
3417 if ((asect->flags & SEC_RELOC) != 0)
3418 {
3419 /* When doing a relocatable link, create both REL and RELA sections if
3420 needed. */
3421 if (arg->link_info
3422 /* Do the normal setup if we wouldn't create any sections here. */
3423 && esd->rel.count + esd->rela.count > 0
0e1862bb
L
3424 && (bfd_link_relocatable (arg->link_info)
3425 || arg->link_info->emitrelocations))
d4730f92
BS
3426 {
3427 if (esd->rel.count && esd->rel.hdr == NULL
28e07a05 3428 && !_bfd_elf_init_reloc_shdr (abfd, &esd->rel, name,
0a1b45a2 3429 false, delay_st_name_p))
d4730f92 3430 {
0a1b45a2 3431 arg->failed = true;
d4730f92
BS
3432 return;
3433 }
3434 if (esd->rela.count && esd->rela.hdr == NULL
28e07a05 3435 && !_bfd_elf_init_reloc_shdr (abfd, &esd->rela, name,
0a1b45a2 3436 true, delay_st_name_p))
d4730f92 3437 {
0a1b45a2 3438 arg->failed = true;
d4730f92
BS
3439 return;
3440 }
3441 }
3442 else if (!_bfd_elf_init_reloc_shdr (abfd,
3443 (asect->use_rela_p
3444 ? &esd->rela : &esd->rel),
f6fe1ccd 3445 name,
3e19fb8f
L
3446 asect->use_rela_p,
3447 delay_st_name_p))
db4677b8 3448 {
0a1b45a2 3449 arg->failed = true;
db4677b8
AM
3450 return;
3451 }
d4730f92
BS
3452 }
3453
252b5132 3454 /* Check for processor-specific section types. */
0414f35b 3455 sh_type = this_hdr->sh_type;
e1fddb6b
AO
3456 if (bed->elf_backend_fake_sections
3457 && !(*bed->elf_backend_fake_sections) (abfd, this_hdr, asect))
db4677b8 3458 {
0a1b45a2 3459 arg->failed = true;
db4677b8
AM
3460 return;
3461 }
252b5132 3462
42bb2e33 3463 if (sh_type == SHT_NOBITS && asect->size != 0)
0414f35b
AM
3464 {
3465 /* Don't change the header type from NOBITS if we are being
42bb2e33 3466 called for objcopy --only-keep-debug. */
0414f35b
AM
3467 this_hdr->sh_type = sh_type;
3468 }
252b5132
RH
3469}
3470
bcacc0f5
AM
3471/* Fill in the contents of a SHT_GROUP section. Called from
3472 _bfd_elf_compute_section_file_positions for gas, objcopy, and
3473 when ELF targets use the generic linker, ld. Called for ld -r
3474 from bfd_elf_final_link. */
dbb410c3 3475
1126897b 3476void
217aa764 3477bfd_elf_set_group_contents (bfd *abfd, asection *sec, void *failedptrarg)
dbb410c3 3478{
0a1b45a2 3479 bool *failedptr = (bool *) failedptrarg;
9dce4196 3480 asection *elt, *first;
dbb410c3 3481 unsigned char *loc;
0a1b45a2 3482 bool gas;
dbb410c3 3483
7e4111ad
L
3484 /* Ignore linker created group section. See elfNN_ia64_object_p in
3485 elfxx-ia64.c. */
ce5aecf8
AM
3486 if ((sec->flags & (SEC_GROUP | SEC_LINKER_CREATED)) != SEC_GROUP
3487 || sec->size == 0
dbb410c3
AM
3488 || *failedptr)
3489 return;
3490
bcacc0f5
AM
3491 if (elf_section_data (sec)->this_hdr.sh_info == 0)
3492 {
3493 unsigned long symindx = 0;
3494
3495 /* elf_group_id will have been set up by objcopy and the
3496 generic linker. */
3497 if (elf_group_id (sec) != NULL)
3498 symindx = elf_group_id (sec)->udata.i;
1126897b 3499
bcacc0f5
AM
3500 if (symindx == 0)
3501 {
3502 /* If called from the assembler, swap_out_syms will have set up
6a541707
NC
3503 elf_section_syms.
3504 PR 25699: A corrupt input file could contain bogus group info. */
27e3da31
AM
3505 if (sec->index >= elf_num_section_syms (abfd)
3506 || elf_section_syms (abfd)[sec->index] == NULL)
6a541707 3507 {
0a1b45a2 3508 *failedptr = true;
6a541707
NC
3509 return;
3510 }
bcacc0f5
AM
3511 symindx = elf_section_syms (abfd)[sec->index]->udata.i;
3512 }
3513 elf_section_data (sec)->this_hdr.sh_info = symindx;
3514 }
3515 else if (elf_section_data (sec)->this_hdr.sh_info == (unsigned int) -2)
1126897b 3516 {
bcacc0f5
AM
3517 /* The ELF backend linker sets sh_info to -2 when the group
3518 signature symbol is global, and thus the index can't be
3519 set until all local symbols are output. */
53720c49
AM
3520 asection *igroup;
3521 struct bfd_elf_section_data *sec_data;
3522 unsigned long symndx;
3523 unsigned long extsymoff;
bcacc0f5
AM
3524 struct elf_link_hash_entry *h;
3525
53720c49
AM
3526 /* The point of this little dance to the first SHF_GROUP section
3527 then back to the SHT_GROUP section is that this gets us to
3528 the SHT_GROUP in the input object. */
3529 igroup = elf_sec_group (elf_next_in_group (sec));
3530 sec_data = elf_section_data (igroup);
3531 symndx = sec_data->this_hdr.sh_info;
3532 extsymoff = 0;
bcacc0f5
AM
3533 if (!elf_bad_symtab (igroup->owner))
3534 {
3535 Elf_Internal_Shdr *symtab_hdr;
3536
3537 symtab_hdr = &elf_tdata (igroup->owner)->symtab_hdr;
3538 extsymoff = symtab_hdr->sh_info;
3539 }
3540 h = elf_sym_hashes (igroup->owner)[symndx - extsymoff];
3541 while (h->root.type == bfd_link_hash_indirect
3542 || h->root.type == bfd_link_hash_warning)
3543 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3544
3545 elf_section_data (sec)->this_hdr.sh_info = h->indx;
1126897b 3546 }
dbb410c3 3547
1126897b 3548 /* The contents won't be allocated for "ld -r" or objcopy. */
0a1b45a2 3549 gas = true;
dbb410c3
AM
3550 if (sec->contents == NULL)
3551 {
0a1b45a2 3552 gas = false;
a50b1753 3553 sec->contents = (unsigned char *) bfd_alloc (abfd, sec->size);
9dce4196
AM
3554
3555 /* Arrange for the section to be written out. */
3556 elf_section_data (sec)->this_hdr.contents = sec->contents;
dbb410c3
AM
3557 if (sec->contents == NULL)
3558 {
0a1b45a2 3559 *failedptr = true;
dbb410c3
AM
3560 return;
3561 }
3562 }
3563
eea6121a 3564 loc = sec->contents + sec->size;
dbb410c3 3565
9dce4196
AM
3566 /* Get the pointer to the first section in the group that gas
3567 squirreled away here. objcopy arranges for this to be set to the
3568 start of the input section group. */
3569 first = elt = elf_next_in_group (sec);
dbb410c3
AM
3570
3571 /* First element is a flag word. Rest of section is elf section
3572 indices for all the sections of the group. Write them backwards
3573 just to keep the group in the same order as given in .section
3574 directives, not that it matters. */
3575 while (elt != NULL)
3576 {
9dce4196 3577 asection *s;
9dce4196 3578
9dce4196 3579 s = elt;
415f38a6
AM
3580 if (!gas)
3581 s = s->output_section;
3582 if (s != NULL
3583 && !bfd_is_abs_section (s))
01e1a5bc 3584 {
db4677b8 3585 struct bfd_elf_section_data *elf_sec = elf_section_data (s);
28e07a05
AM
3586 struct bfd_elf_section_data *input_elf_sec = elf_section_data (elt);
3587
3588 if (elf_sec->rel.hdr != NULL
3589 && (gas
3590 || (input_elf_sec->rel.hdr != NULL
3591 && input_elf_sec->rel.hdr->sh_flags & SHF_GROUP) != 0))
db4677b8 3592 {
28e07a05 3593 elf_sec->rel.hdr->sh_flags |= SHF_GROUP;
db4677b8
AM
3594 loc -= 4;
3595 H_PUT_32 (abfd, elf_sec->rel.idx, loc);
3596 }
28e07a05
AM
3597 if (elf_sec->rela.hdr != NULL
3598 && (gas
3599 || (input_elf_sec->rela.hdr != NULL
3600 && input_elf_sec->rela.hdr->sh_flags & SHF_GROUP) != 0))
db4677b8 3601 {
28e07a05 3602 elf_sec->rela.hdr->sh_flags |= SHF_GROUP;
db4677b8
AM
3603 loc -= 4;
3604 H_PUT_32 (abfd, elf_sec->rela.idx, loc);
3605 }
01e1a5bc 3606 loc -= 4;
db4677b8 3607 H_PUT_32 (abfd, elf_sec->this_idx, loc);
01e1a5bc 3608 }
945906ff 3609 elt = elf_next_in_group (elt);
9dce4196
AM
3610 if (elt == first)
3611 break;
dbb410c3
AM
3612 }
3613
7bdf4127
AB
3614 loc -= 4;
3615 BFD_ASSERT (loc == sec->contents);
dbb410c3 3616
9dce4196 3617 H_PUT_32 (abfd, sec->flags & SEC_LINK_ONCE ? GRP_COMDAT : 0, loc);
dbb410c3
AM
3618}
3619
bce964aa
AM
3620/* Given NAME, the name of a relocation section stripped of its
3621 .rel/.rela prefix, return the section in ABFD to which the
3622 relocations apply. */
bd53a53a
L
3623
3624asection *
bce964aa
AM
3625_bfd_elf_plt_get_reloc_section (bfd *abfd, const char *name)
3626{
3627 /* If a target needs .got.plt section, relocations in rela.plt/rel.plt
3628 section likely apply to .got.plt or .got section. */
3629 if (get_elf_backend_data (abfd)->want_got_plt
3630 && strcmp (name, ".plt") == 0)
3631 {
3632 asection *sec;
3633
3634 name = ".got.plt";
3635 sec = bfd_get_section_by_name (abfd, name);
3636 if (sec != NULL)
3637 return sec;
3638 name = ".got";
3639 }
3640
3641 return bfd_get_section_by_name (abfd, name);
3642}
3643
3644/* Return the section to which RELOC_SEC applies. */
3645
3646static asection *
3647elf_get_reloc_section (asection *reloc_sec)
bd53a53a
L
3648{
3649 const char *name;
3650 unsigned int type;
3651 bfd *abfd;
bce964aa 3652 const struct elf_backend_data *bed;
bd53a53a
L
3653
3654 type = elf_section_data (reloc_sec)->this_hdr.sh_type;
3655 if (type != SHT_REL && type != SHT_RELA)
3656 return NULL;
3657
3658 /* We look up the section the relocs apply to by name. */
3659 name = reloc_sec->name;
3f3328b8 3660 if (!startswith (name, ".rel"))
bce964aa
AM
3661 return NULL;
3662 name += 4;
3663 if (type == SHT_RELA && *name++ != 'a')
3664 return NULL;
bd53a53a 3665
bd53a53a 3666 abfd = reloc_sec->owner;
bce964aa
AM
3667 bed = get_elf_backend_data (abfd);
3668 return bed->get_reloc_section (abfd, name);
bd53a53a
L
3669}
3670
252b5132
RH
3671/* Assign all ELF section numbers. The dummy first section is handled here
3672 too. The link/info pointers for the standard section types are filled
67411cbf
AM
3673 in here too, while we're at it. LINK_INFO will be 0 when arriving
3674 here for objcopy, and when using the generic ELF linker. */
252b5132 3675
0a1b45a2 3676static bool
da9f89d4 3677assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
252b5132
RH
3678{
3679 struct elf_obj_tdata *t = elf_tdata (abfd);
3680 asection *sec;
3e19fb8f 3681 unsigned int section_number;
252b5132 3682 Elf_Internal_Shdr **i_shdrp;
47cc2cf5 3683 struct bfd_elf_section_data *d;
0a1b45a2 3684 bool need_symtab;
446f7ed5 3685 size_t amt;
252b5132
RH
3686
3687 section_number = 1;
3688
2b0f7ef9
JJ
3689 _bfd_elf_strtab_clear_all_refs (elf_shstrtab (abfd));
3690
da9f89d4 3691 /* SHT_GROUP sections are in relocatable files only. */
7bdf4127 3692 if (link_info == NULL || !link_info->resolve_section_groups)
252b5132 3693 {
ef53be89 3694 size_t reloc_count = 0;
14f2c699 3695
da9f89d4 3696 /* Put SHT_GROUP sections first. */
04dd1667 3697 for (sec = abfd->sections; sec != NULL; sec = sec->next)
47cc2cf5 3698 {
5daa8fe7 3699 d = elf_section_data (sec);
da9f89d4
L
3700
3701 if (d->this_hdr.sh_type == SHT_GROUP)
08a40648 3702 {
5daa8fe7 3703 if (sec->flags & SEC_LINKER_CREATED)
da9f89d4
L
3704 {
3705 /* Remove the linker created SHT_GROUP sections. */
5daa8fe7 3706 bfd_section_list_remove (abfd, sec);
da9f89d4 3707 abfd->section_count--;
da9f89d4 3708 }
08a40648 3709 else
4fbb74a6 3710 d->this_idx = section_number++;
da9f89d4 3711 }
14f2c699
L
3712
3713 /* Count relocations. */
3714 reloc_count += sec->reloc_count;
47cc2cf5 3715 }
14f2c699
L
3716
3717 /* Clear HAS_RELOC if there are no relocations. */
3718 if (reloc_count == 0)
3719 abfd->flags &= ~HAS_RELOC;
47cc2cf5
PB
3720 }
3721
3722 for (sec = abfd->sections; sec; sec = sec->next)
3723 {
3724 d = elf_section_data (sec);
3725
3726 if (d->this_hdr.sh_type != SHT_GROUP)
4fbb74a6 3727 d->this_idx = section_number++;
3e19fb8f
L
3728 if (d->this_hdr.sh_name != (unsigned int) -1)
3729 _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->this_hdr.sh_name);
d4730f92 3730 if (d->rel.hdr)
2b0f7ef9 3731 {
d4730f92 3732 d->rel.idx = section_number++;
3e19fb8f
L
3733 if (d->rel.hdr->sh_name != (unsigned int) -1)
3734 _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->rel.hdr->sh_name);
2b0f7ef9 3735 }
d4730f92
BS
3736 else
3737 d->rel.idx = 0;
23bc299b 3738
d4730f92 3739 if (d->rela.hdr)
2b0f7ef9 3740 {
d4730f92 3741 d->rela.idx = section_number++;
3e19fb8f
L
3742 if (d->rela.hdr->sh_name != (unsigned int) -1)
3743 _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->rela.hdr->sh_name);
2b0f7ef9 3744 }
23bc299b 3745 else
d4730f92 3746 d->rela.idx = 0;
252b5132
RH
3747 }
3748
3516e984 3749 need_symtab = (bfd_get_symcount (abfd) > 0
b6d1f70c
AM
3750 || (link_info == NULL
3751 && ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC))
3752 == HAS_RELOC)));
3516e984 3753 if (need_symtab)
252b5132 3754 {
12bd6957 3755 elf_onesymtab (abfd) = section_number++;
2b0f7ef9 3756 _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->symtab_hdr.sh_name);
4fbb74a6 3757 if (section_number > ((SHN_LORESERVE - 2) & 0xFFFF))
9ad5cbcf 3758 {
7a6e0d89 3759 elf_section_list *entry;
6a40cf0c
NC
3760
3761 BFD_ASSERT (elf_symtab_shndx_list (abfd) == NULL);
3762
7a6e0d89 3763 entry = bfd_zalloc (abfd, sizeof (*entry));
6a40cf0c
NC
3764 entry->ndx = section_number++;
3765 elf_symtab_shndx_list (abfd) = entry;
3766 entry->hdr.sh_name
9ad5cbcf 3767 = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
0a1b45a2 3768 ".symtab_shndx", false);
6a40cf0c 3769 if (entry->hdr.sh_name == (unsigned int) -1)
0a1b45a2 3770 return false;
9ad5cbcf 3771 }
12bd6957 3772 elf_strtab_sec (abfd) = section_number++;
2b0f7ef9 3773 _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->strtab_hdr.sh_name);
252b5132
RH
3774 }
3775
dd905818
NC
3776 elf_shstrtab_sec (abfd) = section_number++;
3777 _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->shstrtab_hdr.sh_name);
3778 elf_elfheader (abfd)->e_shstrndx = elf_shstrtab_sec (abfd);
3779
1c52a645
L
3780 if (section_number >= SHN_LORESERVE)
3781 {
695344c0 3782 /* xgettext:c-format */
871b3ab2 3783 _bfd_error_handler (_("%pB: too many sections: %u"),
1c52a645 3784 abfd, section_number);
0a1b45a2 3785 return false;
1c52a645
L
3786 }
3787
9ad5cbcf 3788 elf_numsections (abfd) = section_number;
252b5132
RH
3789 elf_elfheader (abfd)->e_shnum = section_number;
3790
3791 /* Set up the list of section header pointers, in agreement with the
3792 indices. */
446f7ed5
AM
3793 amt = section_number * sizeof (Elf_Internal_Shdr *);
3794 i_shdrp = (Elf_Internal_Shdr **) bfd_zalloc (abfd, amt);
252b5132 3795 if (i_shdrp == NULL)
0a1b45a2 3796 return false;
252b5132 3797
a50b1753 3798 i_shdrp[0] = (Elf_Internal_Shdr *) bfd_zalloc (abfd,
07d6d2b8 3799 sizeof (Elf_Internal_Shdr));
252b5132
RH
3800 if (i_shdrp[0] == NULL)
3801 {
3802 bfd_release (abfd, i_shdrp);
0a1b45a2 3803 return false;
252b5132 3804 }
252b5132
RH
3805
3806 elf_elfsections (abfd) = i_shdrp;
3807
12bd6957 3808 i_shdrp[elf_shstrtab_sec (abfd)] = &t->shstrtab_hdr;
3516e984 3809 if (need_symtab)
252b5132 3810 {
12bd6957 3811 i_shdrp[elf_onesymtab (abfd)] = &t->symtab_hdr;
4fbb74a6 3812 if (elf_numsections (abfd) > (SHN_LORESERVE & 0xFFFF))
9ad5cbcf 3813 {
6a40cf0c
NC
3814 elf_section_list * entry = elf_symtab_shndx_list (abfd);
3815 BFD_ASSERT (entry != NULL);
3816 i_shdrp[entry->ndx] = & entry->hdr;
3817 entry->hdr.sh_link = elf_onesymtab (abfd);
9ad5cbcf 3818 }
12bd6957
AM
3819 i_shdrp[elf_strtab_sec (abfd)] = &t->strtab_hdr;
3820 t->symtab_hdr.sh_link = elf_strtab_sec (abfd);
252b5132 3821 }
38ce5b11 3822
252b5132
RH
3823 for (sec = abfd->sections; sec; sec = sec->next)
3824 {
252b5132 3825 asection *s;
252b5132 3826
91d6fa6a
NC
3827 d = elf_section_data (sec);
3828
252b5132 3829 i_shdrp[d->this_idx] = &d->this_hdr;
d4730f92
BS
3830 if (d->rel.idx != 0)
3831 i_shdrp[d->rel.idx] = d->rel.hdr;
3832 if (d->rela.idx != 0)
3833 i_shdrp[d->rela.idx] = d->rela.hdr;
252b5132
RH
3834
3835 /* Fill in the sh_link and sh_info fields while we're at it. */
3836
3837 /* sh_link of a reloc section is the section index of the symbol
3838 table. sh_info is the section index of the section to which
3839 the relocation entries apply. */
d4730f92 3840 if (d->rel.idx != 0)
252b5132 3841 {
12bd6957 3842 d->rel.hdr->sh_link = elf_onesymtab (abfd);
d4730f92 3843 d->rel.hdr->sh_info = d->this_idx;
9ef5d938 3844 d->rel.hdr->sh_flags |= SHF_INFO_LINK;
252b5132 3845 }
d4730f92 3846 if (d->rela.idx != 0)
23bc299b 3847 {
12bd6957 3848 d->rela.hdr->sh_link = elf_onesymtab (abfd);
d4730f92 3849 d->rela.hdr->sh_info = d->this_idx;
9ef5d938 3850 d->rela.hdr->sh_flags |= SHF_INFO_LINK;
23bc299b 3851 }
252b5132 3852
38ce5b11
L
3853 /* We need to set up sh_link for SHF_LINK_ORDER. */
3854 if ((d->this_hdr.sh_flags & SHF_LINK_ORDER) != 0)
3855 {
3856 s = elf_linked_to_section (sec);
b71702f1
NC
3857 /* We can now have a NULL linked section pointer.
3858 This happens when the sh_link field is 0, which is done
3859 when a linked to section is discarded but the linking
3860 section has been retained for some reason. */
38ce5b11 3861 if (s)
38ce5b11 3862 {
67411cbf
AM
3863 /* Check discarded linkonce section. */
3864 if (discarded_section (s))
38ce5b11 3865 {
67411cbf
AM
3866 asection *kept;
3867 _bfd_error_handler
3868 /* xgettext:c-format */
3869 (_("%pB: sh_link of section `%pA' points to"
3870 " discarded section `%pA' of `%pB'"),
3871 abfd, d->this_hdr.bfd_section, s, s->owner);
3872 /* Point to the kept section if it has the same
3873 size as the discarded one. */
3874 kept = _bfd_elf_check_kept_section (s, link_info);
3875 if (kept == NULL)
f2876037 3876 {
f2876037 3877 bfd_set_error (bfd_error_bad_value);
0a1b45a2 3878 return false;
f2876037 3879 }
67411cbf
AM
3880 s = kept;
3881 }
3882 /* Handle objcopy. */
3883 else if (s->output_section == NULL)
3884 {
3885 _bfd_error_handler
3886 /* xgettext:c-format */
3887 (_("%pB: sh_link of section `%pA' points to"
3888 " removed section `%pA' of `%pB'"),
3889 abfd, d->this_hdr.bfd_section, s, s->owner);
3890 bfd_set_error (bfd_error_bad_value);
0a1b45a2 3891 return false;
f2876037 3892 }
67411cbf 3893 s = s->output_section;
ccd2ec6a
L
3894 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3895 }
38ce5b11
L
3896 }
3897
252b5132
RH
3898 switch (d->this_hdr.sh_type)
3899 {
3900 case SHT_REL:
3901 case SHT_RELA:
3902 /* A reloc section which we are treating as a normal BFD
3903 section. sh_link is the section index of the symbol
3904 table. sh_info is the section index of the section to
3905 which the relocation entries apply. We assume that an
b6d1f70c
AM
3906 allocated reloc section uses the dynamic symbol table
3907 if there is one. Otherwise we guess the normal symbol
3908 table. FIXME: How can we be sure? */
3909 if (d->this_hdr.sh_link == 0 && (sec->flags & SEC_ALLOC) != 0)
3910 {
3911 s = bfd_get_section_by_name (abfd, ".dynsym");
3912 if (s != NULL)
3913 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3914 }
3915 if (d->this_hdr.sh_link == 0)
3916 d->this_hdr.sh_link = elf_onesymtab (abfd);
252b5132 3917
bce964aa 3918 s = elf_get_reloc_section (sec);
252b5132 3919 if (s != NULL)
9ef5d938
L
3920 {
3921 d->this_hdr.sh_info = elf_section_data (s)->this_idx;
3922 d->this_hdr.sh_flags |= SHF_INFO_LINK;
3923 }
252b5132
RH
3924 break;
3925
3926 case SHT_STRTAB:
3927 /* We assume that a section named .stab*str is a stabs
3928 string section. We look for a section with the same name
3929 but without the trailing ``str'', and set its sh_link
3930 field to point to this section. */
08dedd66 3931 if (startswith (sec->name, ".stab")
252b5132
RH
3932 && strcmp (sec->name + strlen (sec->name) - 3, "str") == 0)
3933 {
3934 size_t len;
3935 char *alc;
3936
3937 len = strlen (sec->name);
a50b1753 3938 alc = (char *) bfd_malloc (len - 2);
252b5132 3939 if (alc == NULL)
0a1b45a2 3940 return false;
d4c88bbb 3941 memcpy (alc, sec->name, len - 3);
252b5132
RH
3942 alc[len - 3] = '\0';
3943 s = bfd_get_section_by_name (abfd, alc);
3944 free (alc);
3945 if (s != NULL)
3946 {
3947 elf_section_data (s)->this_hdr.sh_link = d->this_idx;
3948
3949 /* This is a .stab section. */
34ca5531 3950 elf_section_data (s)->this_hdr.sh_entsize = 12;
252b5132
RH
3951 }
3952 }
3953 break;
3954
3955 case SHT_DYNAMIC:
3956 case SHT_DYNSYM:
3957 case SHT_GNU_verneed:
3958 case SHT_GNU_verdef:
3959 /* sh_link is the section header index of the string table
3960 used for the dynamic entries, or the symbol table, or the
3961 version strings. */
3962 s = bfd_get_section_by_name (abfd, ".dynstr");
3963 if (s != NULL)
3964 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3965 break;
3966
7f1204bb
JJ
3967 case SHT_GNU_LIBLIST:
3968 /* sh_link is the section header index of the prelink library
08a40648
AM
3969 list used for the dynamic entries, or the symbol table, or
3970 the version strings. */
b6d1f70c
AM
3971 s = bfd_get_section_by_name (abfd, ((sec->flags & SEC_ALLOC)
3972 ? ".dynstr" : ".gnu.libstr"));
7f1204bb
JJ
3973 if (s != NULL)
3974 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3975 break;
3976
252b5132 3977 case SHT_HASH:
fdc90cb4 3978 case SHT_GNU_HASH:
252b5132
RH
3979 case SHT_GNU_versym:
3980 /* sh_link is the section header index of the symbol table
3981 this hash table or version table is for. */
3982 s = bfd_get_section_by_name (abfd, ".dynsym");
3983 if (s != NULL)
3984 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3985 break;
dbb410c3
AM
3986
3987 case SHT_GROUP:
12bd6957 3988 d->this_hdr.sh_link = elf_onesymtab (abfd);
252b5132
RH
3989 }
3990 }
3991
3e19fb8f
L
3992 /* Delay setting sh_name to _bfd_elf_write_object_contents so that
3993 _bfd_elf_assign_file_positions_for_non_load can convert DWARF
3994 debug section name from .debug_* to .zdebug_* if needed. */
3995
0a1b45a2 3996 return true;
252b5132
RH
3997}
3998
0a1b45a2 3999static bool
217aa764 4000sym_is_global (bfd *abfd, asymbol *sym)
252b5132
RH
4001{
4002 /* If the backend has a special mapping, use it. */
9c5bfbb7 4003 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
217aa764
AM
4004 if (bed->elf_backend_sym_is_global)
4005 return (*bed->elf_backend_sym_is_global) (abfd, sym);
252b5132 4006
e47bf690 4007 return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
e6f7f6d1
AM
4008 || bfd_is_und_section (bfd_asymbol_section (sym))
4009 || bfd_is_com_section (bfd_asymbol_section (sym)));
252b5132
RH
4010}
4011
76359541
TP
4012/* Filter global symbols of ABFD to include in the import library. All
4013 SYMCOUNT symbols of ABFD can be examined from their pointers in
4014 SYMS. Pointers of symbols to keep should be stored contiguously at
4015 the beginning of that array.
4016
4017 Returns the number of symbols to keep. */
4018
4019unsigned int
4020_bfd_elf_filter_global_symbols (bfd *abfd, struct bfd_link_info *info,
4021 asymbol **syms, long symcount)
4022{
4023 long src_count, dst_count = 0;
4024
4025 for (src_count = 0; src_count < symcount; src_count++)
4026 {
4027 asymbol *sym = syms[src_count];
4028 char *name = (char *) bfd_asymbol_name (sym);
4029 struct bfd_link_hash_entry *h;
4030
4031 if (!sym_is_global (abfd, sym))
4032 continue;
4033
0a1b45a2 4034 h = bfd_link_hash_lookup (info->hash, name, false, false, false);
5df1bc57
AM
4035 if (h == NULL)
4036 continue;
76359541
TP
4037 if (h->type != bfd_link_hash_defined && h->type != bfd_link_hash_defweak)
4038 continue;
76359541
TP
4039 if (h->linker_def || h->ldscript_def)
4040 continue;
4041
4042 syms[dst_count++] = sym;
4043 }
4044
4045 syms[dst_count] = NULL;
4046
4047 return dst_count;
4048}
4049
5372391b 4050/* Don't output section symbols for sections that are not going to be
c6d8cab4 4051 output, that are duplicates or there is no BFD section. */
5372391b 4052
0a1b45a2 4053static bool
5372391b
AM
4054ignore_section_sym (bfd *abfd, asymbol *sym)
4055{
c6d8cab4
L
4056 elf_symbol_type *type_ptr;
4057
db0c309f 4058 if (sym == NULL)
0a1b45a2 4059 return false;
db0c309f 4060
c6d8cab4 4061 if ((sym->flags & BSF_SECTION_SYM) == 0)
0a1b45a2 4062 return false;
c6d8cab4 4063
d1bcae83
L
4064 /* Ignore the section symbol if it isn't used. */
4065 if ((sym->flags & BSF_SECTION_SYM_USED) == 0)
0a1b45a2 4066 return true;
d1bcae83 4067
db0c309f 4068 if (sym->section == NULL)
0a1b45a2 4069 return true;
db0c309f 4070
c1229f84 4071 type_ptr = elf_symbol_from (sym);
c6d8cab4
L
4072 return ((type_ptr != NULL
4073 && type_ptr->internal_elf_sym.st_shndx != 0
4074 && bfd_is_abs_section (sym->section))
4075 || !(sym->section->owner == abfd
db0c309f
NC
4076 || (sym->section->output_section != NULL
4077 && sym->section->output_section->owner == abfd
2633a79c
AM
4078 && sym->section->output_offset == 0)
4079 || bfd_is_abs_section (sym->section)));
5372391b
AM
4080}
4081
2633a79c
AM
4082/* Map symbol from it's internal number to the external number, moving
4083 all local symbols to be at the head of the list. */
4084
0a1b45a2 4085static bool
12bd6957 4086elf_map_symbols (bfd *abfd, unsigned int *pnum_locals)
252b5132 4087{
dc810e39 4088 unsigned int symcount = bfd_get_symcount (abfd);
252b5132
RH
4089 asymbol **syms = bfd_get_outsymbols (abfd);
4090 asymbol **sect_syms;
dc810e39
AM
4091 unsigned int num_locals = 0;
4092 unsigned int num_globals = 0;
4093 unsigned int num_locals2 = 0;
4094 unsigned int num_globals2 = 0;
7292b3ac 4095 unsigned int max_index = 0;
dc810e39 4096 unsigned int idx;
252b5132
RH
4097 asection *asect;
4098 asymbol **new_syms;
446f7ed5 4099 size_t amt;
252b5132
RH
4100
4101#ifdef DEBUG
4102 fprintf (stderr, "elf_map_symbols\n");
4103 fflush (stderr);
4104#endif
4105
252b5132
RH
4106 for (asect = abfd->sections; asect; asect = asect->next)
4107 {
4108 if (max_index < asect->index)
4109 max_index = asect->index;
4110 }
4111
4112 max_index++;
446f7ed5
AM
4113 amt = max_index * sizeof (asymbol *);
4114 sect_syms = (asymbol **) bfd_zalloc (abfd, amt);
252b5132 4115 if (sect_syms == NULL)
0a1b45a2 4116 return false;
252b5132 4117 elf_section_syms (abfd) = sect_syms;
4e89ac30 4118 elf_num_section_syms (abfd) = max_index;
252b5132 4119
079e9a2f
AM
4120 /* Init sect_syms entries for any section symbols we have already
4121 decided to output. */
252b5132
RH
4122 for (idx = 0; idx < symcount; idx++)
4123 {
dc810e39 4124 asymbol *sym = syms[idx];
c044fabd 4125
252b5132 4126 if ((sym->flags & BSF_SECTION_SYM) != 0
0f0a5e58 4127 && sym->value == 0
2633a79c
AM
4128 && !ignore_section_sym (abfd, sym)
4129 && !bfd_is_abs_section (sym->section))
252b5132 4130 {
5372391b 4131 asection *sec = sym->section;
252b5132 4132
5372391b
AM
4133 if (sec->owner != abfd)
4134 sec = sec->output_section;
252b5132 4135
5372391b 4136 sect_syms[sec->index] = syms[idx];
252b5132
RH
4137 }
4138 }
4139
252b5132
RH
4140 /* Classify all of the symbols. */
4141 for (idx = 0; idx < symcount; idx++)
4142 {
2633a79c 4143 if (sym_is_global (abfd, syms[idx]))
252b5132 4144 num_globals++;
2633a79c
AM
4145 else if (!ignore_section_sym (abfd, syms[idx]))
4146 num_locals++;
252b5132 4147 }
079e9a2f 4148
5372391b 4149 /* We will be adding a section symbol for each normal BFD section. Most
079e9a2f
AM
4150 sections will already have a section symbol in outsymbols, but
4151 eg. SHT_GROUP sections will not, and we need the section symbol mapped
4152 at least in that case. */
252b5132
RH
4153 for (asect = abfd->sections; asect; asect = asect->next)
4154 {
d1bcae83
L
4155 asymbol *sym = asect->symbol;
4156 /* Don't include ignored section symbols. */
4157 if (!ignore_section_sym (abfd, sym)
4158 && sect_syms[asect->index] == NULL)
252b5132 4159 {
079e9a2f 4160 if (!sym_is_global (abfd, asect->symbol))
252b5132
RH
4161 num_locals++;
4162 else
4163 num_globals++;
252b5132
RH
4164 }
4165 }
4166
4167 /* Now sort the symbols so the local symbols are first. */
446f7ed5
AM
4168 amt = (num_locals + num_globals) * sizeof (asymbol *);
4169 new_syms = (asymbol **) bfd_alloc (abfd, amt);
252b5132 4170 if (new_syms == NULL)
0a1b45a2 4171 return false;
252b5132
RH
4172
4173 for (idx = 0; idx < symcount; idx++)
4174 {
4175 asymbol *sym = syms[idx];
dc810e39 4176 unsigned int i;
252b5132 4177
2633a79c
AM
4178 if (sym_is_global (abfd, sym))
4179 i = num_locals + num_globals2++;
d1bcae83 4180 /* Don't include ignored section symbols. */
2633a79c 4181 else if (!ignore_section_sym (abfd, sym))
252b5132
RH
4182 i = num_locals2++;
4183 else
2633a79c 4184 continue;
252b5132
RH
4185 new_syms[i] = sym;
4186 sym->udata.i = i + 1;
4187 }
4188 for (asect = abfd->sections; asect; asect = asect->next)
4189 {
d1bcae83
L
4190 asymbol *sym = asect->symbol;
4191 if (!ignore_section_sym (abfd, sym)
4192 && sect_syms[asect->index] == NULL)
252b5132 4193 {
dc810e39 4194 unsigned int i;
252b5132 4195
079e9a2f 4196 sect_syms[asect->index] = sym;
252b5132
RH
4197 if (!sym_is_global (abfd, sym))
4198 i = num_locals2++;
4199 else
4200 i = num_locals + num_globals2++;
4201 new_syms[i] = sym;
4202 sym->udata.i = i + 1;
4203 }
4204 }
4205
4206 bfd_set_symtab (abfd, new_syms, num_locals + num_globals);
4207
12bd6957 4208 *pnum_locals = num_locals;
0a1b45a2 4209 return true;
252b5132
RH
4210}
4211
4212/* Align to the maximum file alignment that could be required for any
4213 ELF data structure. */
4214
268b6b39 4215static inline file_ptr
217aa764 4216align_file_position (file_ptr off, int align)
252b5132
RH
4217{
4218 return (off + align - 1) & ~(align - 1);
4219}
4220
4221/* Assign a file position to a section, optionally aligning to the
4222 required section alignment. */
4223
217aa764
AM
4224file_ptr
4225_bfd_elf_assign_file_position_for_section (Elf_Internal_Shdr *i_shdrp,
4226 file_ptr offset,
0a1b45a2 4227 bool align)
252b5132 4228{
72de5009
AM
4229 if (align && i_shdrp->sh_addralign > 1)
4230 offset = BFD_ALIGN (offset, i_shdrp->sh_addralign);
252b5132
RH
4231 i_shdrp->sh_offset = offset;
4232 if (i_shdrp->bfd_section != NULL)
4233 i_shdrp->bfd_section->filepos = offset;
4234 if (i_shdrp->sh_type != SHT_NOBITS)
4235 offset += i_shdrp->sh_size;
4236 return offset;
4237}
4238
4239/* Compute the file positions we are going to put the sections at, and
4240 otherwise prepare to begin writing out the ELF file. If LINK_INFO
4241 is not NULL, this is being called by the ELF backend linker. */
4242
0a1b45a2 4243bool
217aa764
AM
4244_bfd_elf_compute_section_file_positions (bfd *abfd,
4245 struct bfd_link_info *link_info)
252b5132 4246{
9c5bfbb7 4247 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
d4730f92 4248 struct fake_section_arg fsargs;
0a1b45a2 4249 bool failed;
ef10c3ac 4250 struct elf_strtab_hash *strtab = NULL;
252b5132 4251 Elf_Internal_Shdr *shstrtab_hdr;
0a1b45a2 4252 bool need_symtab;
252b5132
RH
4253
4254 if (abfd->output_has_begun)
0a1b45a2 4255 return true;
252b5132
RH
4256
4257 /* Do any elf backend specific processing first. */
4258 if (bed->elf_backend_begin_write_processing)
4259 (*bed->elf_backend_begin_write_processing) (abfd, link_info);
4260
ed7e9d0b 4261 if (!(*bed->elf_backend_init_file_header) (abfd, link_info))
0a1b45a2 4262 return false;
252b5132 4263
0a1b45a2 4264 fsargs.failed = false;
d4730f92
BS
4265 fsargs.link_info = link_info;
4266 bfd_map_over_sections (abfd, elf_fake_sections, &fsargs);
4267 if (fsargs.failed)
0a1b45a2 4268 return false;
252b5132 4269
da9f89d4 4270 if (!assign_section_numbers (abfd, link_info))
0a1b45a2 4271 return false;
252b5132
RH
4272
4273 /* The backend linker builds symbol table information itself. */
3516e984
L
4274 need_symtab = (link_info == NULL
4275 && (bfd_get_symcount (abfd) > 0
4276 || ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC))
4277 == HAS_RELOC)));
4278 if (need_symtab)
252b5132
RH
4279 {
4280 /* Non-zero if doing a relocatable link. */
4281 int relocatable_p = ! (abfd->flags & (EXEC_P | DYNAMIC));
4282
3d16b64e 4283 if (! swap_out_syms (abfd, &strtab, relocatable_p, link_info))
0a1b45a2 4284 return false;
252b5132
RH
4285 }
4286
0a1b45a2 4287 failed = false;
1126897b 4288 if (link_info == NULL)
dbb410c3 4289 {
1126897b 4290 bfd_map_over_sections (abfd, bfd_elf_set_group_contents, &failed);
dbb410c3 4291 if (failed)
0a1b45a2 4292 return false;
dbb410c3
AM
4293 }
4294
252b5132 4295 shstrtab_hdr = &elf_tdata (abfd)->shstrtab_hdr;
ed7e9d0b 4296 /* sh_name was set in init_file_header. */
252b5132 4297 shstrtab_hdr->sh_type = SHT_STRTAB;
84865015 4298 shstrtab_hdr->sh_flags = bed->elf_strtab_flags;
252b5132 4299 shstrtab_hdr->sh_addr = 0;
946748d5 4300 /* sh_size is set in _bfd_elf_assign_file_positions_for_non_load. */
252b5132
RH
4301 shstrtab_hdr->sh_entsize = 0;
4302 shstrtab_hdr->sh_link = 0;
4303 shstrtab_hdr->sh_info = 0;
3e19fb8f 4304 /* sh_offset is set in _bfd_elf_assign_file_positions_for_non_load. */
252b5132
RH
4305 shstrtab_hdr->sh_addralign = 1;
4306
c84fca4d 4307 if (!assign_file_positions_except_relocs (abfd, link_info))
0a1b45a2 4308 return false;
252b5132 4309
3516e984 4310 if (need_symtab)
252b5132
RH
4311 {
4312 file_ptr off;
4313 Elf_Internal_Shdr *hdr;
4314
12bd6957 4315 off = elf_next_file_pos (abfd);
252b5132 4316
6a40cf0c 4317 hdr = & elf_symtab_hdr (abfd);
0a1b45a2 4318 off = _bfd_elf_assign_file_position_for_section (hdr, off, true);
252b5132 4319
6a40cf0c
NC
4320 if (elf_symtab_shndx_list (abfd) != NULL)
4321 {
4322 hdr = & elf_symtab_shndx_list (abfd)->hdr;
4323 if (hdr->sh_size != 0)
0a1b45a2 4324 off = _bfd_elf_assign_file_position_for_section (hdr, off, true);
6a40cf0c
NC
4325 /* FIXME: What about other symtab_shndx sections in the list ? */
4326 }
9ad5cbcf 4327
252b5132 4328 hdr = &elf_tdata (abfd)->strtab_hdr;
0a1b45a2 4329 off = _bfd_elf_assign_file_position_for_section (hdr, off, true);
252b5132 4330
12bd6957 4331 elf_next_file_pos (abfd) = off;
252b5132
RH
4332
4333 /* Now that we know where the .strtab section goes, write it
08a40648 4334 out. */
252b5132 4335 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
ef10c3ac 4336 || ! _bfd_elf_strtab_emit (abfd, strtab))
0a1b45a2 4337 return false;
ef10c3ac 4338 _bfd_elf_strtab_free (strtab);
252b5132
RH
4339 }
4340
0a1b45a2 4341 abfd->output_has_begun = true;
252b5132 4342
0a1b45a2 4343 return true;
252b5132
RH
4344}
4345
8ded5a0f
AM
4346/* Make an initial estimate of the size of the program header. If we
4347 get the number wrong here, we'll redo section placement. */
4348
4349static bfd_size_type
4350get_program_header_size (bfd *abfd, struct bfd_link_info *info)
4351{
4352 size_t segs;
4353 asection *s;
2b05f1b7 4354 const struct elf_backend_data *bed;
8ded5a0f
AM
4355
4356 /* Assume we will need exactly two PT_LOAD segments: one for text
4357 and one for data. */
4358 segs = 2;
4359
4360 s = bfd_get_section_by_name (abfd, ".interp");
1b9e270b 4361 if (s != NULL && (s->flags & SEC_LOAD) != 0 && s->size != 0)
8ded5a0f
AM
4362 {
4363 /* If we have a loadable interpreter section, we need a
4364 PT_INTERP segment. In this case, assume we also need a
4365 PT_PHDR segment, although that may not be true for all
4366 targets. */
e9a38e0f 4367 segs += 2;
8ded5a0f
AM
4368 }
4369
4370 if (bfd_get_section_by_name (abfd, ".dynamic") != NULL)
4371 {
4372 /* We need a PT_DYNAMIC segment. */
4373 ++segs;
f210dcff 4374 }
08a40648 4375
ceae84aa 4376 if (info != NULL && info->relro)
f210dcff
L
4377 {
4378 /* We need a PT_GNU_RELRO segment. */
4379 ++segs;
8ded5a0f
AM
4380 }
4381
12bd6957 4382 if (elf_eh_frame_hdr (abfd))
8ded5a0f
AM
4383 {
4384 /* We need a PT_GNU_EH_FRAME segment. */
4385 ++segs;
4386 }
4387
12bd6957 4388 if (elf_stack_flags (abfd))
8ded5a0f 4389 {
2b05f1b7
L
4390 /* We need a PT_GNU_STACK segment. */
4391 ++segs;
4392 }
94b11780 4393
0a59decb
L
4394 s = bfd_get_section_by_name (abfd,
4395 NOTE_GNU_PROPERTY_SECTION_NAME);
4396 if (s != NULL && s->size != 0)
4397 {
4398 /* We need a PT_GNU_PROPERTY segment. */
4399 ++segs;
4400 }
4401
2b05f1b7
L
4402 for (s = abfd->sections; s != NULL; s = s->next)
4403 {
8ded5a0f 4404 if ((s->flags & SEC_LOAD) != 0
23e463ed 4405 && elf_section_type (s) == SHT_NOTE)
8ded5a0f 4406 {
23e463ed 4407 unsigned int alignment_power;
8ded5a0f
AM
4408 /* We need a PT_NOTE segment. */
4409 ++segs;
23e463ed
L
4410 /* Try to create just one PT_NOTE segment for all adjacent
4411 loadable SHT_NOTE sections. gABI requires that within a
4412 PT_NOTE segment (and also inside of each SHT_NOTE section)
4413 each note should have the same alignment. So we check
4414 whether the sections are correctly aligned. */
4415 alignment_power = s->alignment_power;
4416 while (s->next != NULL
4417 && s->next->alignment_power == alignment_power
4418 && (s->next->flags & SEC_LOAD) != 0
4419 && elf_section_type (s->next) == SHT_NOTE)
4420 s = s->next;
8ded5a0f
AM
4421 }
4422 }
4423
4424 for (s = abfd->sections; s != NULL; s = s->next)
4425 {
4426 if (s->flags & SEC_THREAD_LOCAL)
4427 {
4428 /* We need a PT_TLS segment. */
4429 ++segs;
4430 break;
4431 }
4432 }
4433
2b05f1b7 4434 bed = get_elf_backend_data (abfd);
a91e1603 4435
df3a023b
AM
4436 if ((abfd->flags & D_PAGED) != 0
4437 && (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_mbind) != 0)
4438 {
4439 /* Add a PT_GNU_MBIND segment for each mbind section. */
c410035d
AM
4440 bfd_vma commonpagesize;
4441 unsigned int page_align_power;
4442
4443 if (info != NULL)
4444 commonpagesize = info->commonpagesize;
4445 else
4446 commonpagesize = bed->commonpagesize;
4447 page_align_power = bfd_log2 (commonpagesize);
df3a023b
AM
4448 for (s = abfd->sections; s != NULL; s = s->next)
4449 if (elf_section_flags (s) & SHF_GNU_MBIND)
4450 {
4451 if (elf_section_data (s)->this_hdr.sh_info > PT_GNU_MBIND_NUM)
4452 {
4453 _bfd_error_handler
4454 /* xgettext:c-format */
4455 (_("%pB: GNU_MBIND section `%pA' has invalid "
4456 "sh_info field: %d"),
4457 abfd, s, elf_section_data (s)->this_hdr.sh_info);
4458 continue;
4459 }
4460 /* Align mbind section to page size. */
4461 if (s->alignment_power < page_align_power)
4462 s->alignment_power = page_align_power;
4463 segs ++;
4464 }
4465 }
4466
4467 /* Let the backend count up any program headers it might need. */
4468 if (bed->elf_backend_additional_program_headers)
8ded5a0f
AM
4469 {
4470 int a;
4471
4472 a = (*bed->elf_backend_additional_program_headers) (abfd, info);
4473 if (a == -1)
4474 abort ();
4475 segs += a;
4476 }
4477
4478 return segs * bed->s->sizeof_phdr;
4479}
4480
2ea37f1c
NC
4481/* Find the segment that contains the output_section of section. */
4482
4483Elf_Internal_Phdr *
4484_bfd_elf_find_segment_containing_section (bfd * abfd, asection * section)
4485{
4486 struct elf_segment_map *m;
4487 Elf_Internal_Phdr *p;
4488
12bd6957 4489 for (m = elf_seg_map (abfd), p = elf_tdata (abfd)->phdr;
2ea37f1c
NC
4490 m != NULL;
4491 m = m->next, p++)
4492 {
4493 int i;
4494
4495 for (i = m->count - 1; i >= 0; i--)
4496 if (m->sections[i] == section)
4497 return p;
4498 }
4499
4500 return NULL;
4501}
4502
252b5132
RH
4503/* Create a mapping from a set of sections to a program segment. */
4504
217aa764
AM
4505static struct elf_segment_map *
4506make_mapping (bfd *abfd,
4507 asection **sections,
4508 unsigned int from,
4509 unsigned int to,
0a1b45a2 4510 bool phdr)
252b5132
RH
4511{
4512 struct elf_segment_map *m;
4513 unsigned int i;
4514 asection **hdrpp;
986f0783 4515 size_t amt;
252b5132 4516
00bee008
AM
4517 amt = sizeof (struct elf_segment_map) - sizeof (asection *);
4518 amt += (to - from) * sizeof (asection *);
a50b1753 4519 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
252b5132
RH
4520 if (m == NULL)
4521 return NULL;
4522 m->next = NULL;
4523 m->p_type = PT_LOAD;
4524 for (i = from, hdrpp = sections + from; i < to; i++, hdrpp++)
4525 m->sections[i - from] = *hdrpp;
4526 m->count = to - from;
4527
4528 if (from == 0 && phdr)
4529 {
4530 /* Include the headers in the first PT_LOAD segment. */
4531 m->includes_filehdr = 1;
4532 m->includes_phdrs = 1;
4533 }
4534
4535 return m;
4536}
4537
229fcec5
MM
4538/* Create the PT_DYNAMIC segment, which includes DYNSEC. Returns NULL
4539 on failure. */
4540
4541struct elf_segment_map *
4542_bfd_elf_make_dynamic_segment (bfd *abfd, asection *dynsec)
4543{
4544 struct elf_segment_map *m;
4545
a50b1753 4546 m = (struct elf_segment_map *) bfd_zalloc (abfd,
07d6d2b8 4547 sizeof (struct elf_segment_map));
229fcec5
MM
4548 if (m == NULL)
4549 return NULL;
4550 m->next = NULL;
4551 m->p_type = PT_DYNAMIC;
4552 m->count = 1;
4553 m->sections[0] = dynsec;
08a40648 4554
229fcec5
MM
4555 return m;
4556}
4557
8ded5a0f 4558/* Possibly add or remove segments from the segment map. */
252b5132 4559
0a1b45a2 4560static bool
3dea8fca
AM
4561elf_modify_segment_map (bfd *abfd,
4562 struct bfd_link_info *info,
0a1b45a2 4563 bool remove_empty_load)
252b5132 4564{
252e386e 4565 struct elf_segment_map **m;
8ded5a0f 4566 const struct elf_backend_data *bed;
252b5132 4567
8ded5a0f
AM
4568 /* The placement algorithm assumes that non allocated sections are
4569 not in PT_LOAD segments. We ensure this here by removing such
4570 sections from the segment map. We also remove excluded
252e386e
AM
4571 sections. Finally, any PT_LOAD segment without sections is
4572 removed. */
12bd6957 4573 m = &elf_seg_map (abfd);
252e386e 4574 while (*m)
8ded5a0f
AM
4575 {
4576 unsigned int i, new_count;
252b5132 4577
252e386e 4578 for (new_count = 0, i = 0; i < (*m)->count; i++)
8ded5a0f 4579 {
252e386e
AM
4580 if (((*m)->sections[i]->flags & SEC_EXCLUDE) == 0
4581 && (((*m)->sections[i]->flags & SEC_ALLOC) != 0
4582 || (*m)->p_type != PT_LOAD))
8ded5a0f 4583 {
252e386e
AM
4584 (*m)->sections[new_count] = (*m)->sections[i];
4585 new_count++;
8ded5a0f
AM
4586 }
4587 }
252e386e 4588 (*m)->count = new_count;
252b5132 4589
1a9ccd70
NC
4590 if (remove_empty_load
4591 && (*m)->p_type == PT_LOAD
4592 && (*m)->count == 0
4593 && !(*m)->includes_phdrs)
252e386e
AM
4594 *m = (*m)->next;
4595 else
4596 m = &(*m)->next;
8ded5a0f 4597 }
252b5132 4598
8ded5a0f
AM
4599 bed = get_elf_backend_data (abfd);
4600 if (bed->elf_backend_modify_segment_map != NULL)
252b5132 4601 {
252e386e 4602 if (!(*bed->elf_backend_modify_segment_map) (abfd, info))
0a1b45a2 4603 return false;
252b5132 4604 }
252b5132 4605
0a1b45a2 4606 return true;
8ded5a0f 4607}
252b5132 4608
dbc88fc1
AM
4609#define IS_TBSS(s) \
4610 ((s->flags & (SEC_THREAD_LOCAL | SEC_LOAD)) == SEC_THREAD_LOCAL)
4611
e2cbf4df
L
4612/* Set up a mapping from BFD sections to program segments. Update
4613 NEED_LAYOUT if the section layout is changed. */
252b5132 4614
0a1b45a2 4615bool
e2cbf4df
L
4616_bfd_elf_map_sections_to_segments (bfd *abfd,
4617 struct bfd_link_info *info,
23cc1de5 4618 bool *need_layout)
8ded5a0f
AM
4619{
4620 unsigned int count;
4621 struct elf_segment_map *m;
4622 asection **sections = NULL;
4623 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
0a1b45a2 4624 bool no_user_phdrs;
252b5132 4625
12bd6957 4626 no_user_phdrs = elf_seg_map (abfd) == NULL;
d324f6d6
RM
4627
4628 if (info != NULL)
23cc1de5
L
4629 {
4630 info->user_phdrs = !no_user_phdrs;
4631
4632 /* Size the relative relocations if DT_RELR is enabled. */
4633 if (info->enable_dt_relr
4634 && need_layout != NULL
4635 && bed->size_relative_relocs
4636 && !bed->size_relative_relocs (info, need_layout))
4637 info->callbacks->einfo
4638 (_("%F%P: failed to size relative relocations\n"));
4639 }
d324f6d6 4640
3dea8fca 4641 if (no_user_phdrs && bfd_count_sections (abfd) != 0)
252b5132 4642 {
8ded5a0f
AM
4643 asection *s;
4644 unsigned int i;
4645 struct elf_segment_map *mfirst;
4646 struct elf_segment_map **pm;
4647 asection *last_hdr;
4648 bfd_vma last_size;
00bee008 4649 unsigned int hdr_index;
8ded5a0f
AM
4650 bfd_vma maxpagesize;
4651 asection **hdrpp;
0a1b45a2
AM
4652 bool phdr_in_segment;
4653 bool writable;
4654 bool executable;
446f7ed5 4655 unsigned int tls_count = 0;
8ded5a0f 4656 asection *first_tls = NULL;
a91e1603 4657 asection *first_mbind = NULL;
8ded5a0f 4658 asection *dynsec, *eh_frame_hdr;
446f7ed5 4659 size_t amt;
66631823
CE
4660 bfd_vma addr_mask, wrap_to = 0; /* Bytes. */
4661 bfd_size_type phdr_size; /* Octets/bytes. */
502794d4 4662 unsigned int opb = bfd_octets_per_byte (abfd, NULL);
252b5132 4663
8ded5a0f 4664 /* Select the allocated sections, and sort them. */
252b5132 4665
446f7ed5
AM
4666 amt = bfd_count_sections (abfd) * sizeof (asection *);
4667 sections = (asection **) bfd_malloc (amt);
8ded5a0f 4668 if (sections == NULL)
252b5132 4669 goto error_return;
252b5132 4670
8d06853e
AM
4671 /* Calculate top address, avoiding undefined behaviour of shift
4672 left operator when shift count is equal to size of type
4673 being shifted. */
4674 addr_mask = ((bfd_vma) 1 << (bfd_arch_bits_per_address (abfd) - 1)) - 1;
4675 addr_mask = (addr_mask << 1) + 1;
4676
8ded5a0f
AM
4677 i = 0;
4678 for (s = abfd->sections; s != NULL; s = s->next)
4679 {
4680 if ((s->flags & SEC_ALLOC) != 0)
4681 {
48db3297
AM
4682 /* target_index is unused until bfd_elf_final_link
4683 starts output of section symbols. Use it to make
4684 qsort stable. */
4685 s->target_index = i;
8ded5a0f
AM
4686 sections[i] = s;
4687 ++i;
8d06853e 4688 /* A wrapping section potentially clashes with header. */
66631823
CE
4689 if (((s->lma + s->size / opb) & addr_mask) < (s->lma & addr_mask))
4690 wrap_to = (s->lma + s->size / opb) & addr_mask;
8ded5a0f
AM
4691 }
4692 }
4693 BFD_ASSERT (i <= bfd_count_sections (abfd));
4694 count = i;
252b5132 4695
8ded5a0f 4696 qsort (sections, (size_t) count, sizeof (asection *), elf_sort_sections);
252b5132 4697
64029e93
AM
4698 phdr_size = elf_program_header_size (abfd);
4699 if (phdr_size == (bfd_size_type) -1)
4700 phdr_size = get_program_header_size (abfd, info);
4701 phdr_size += bed->s->sizeof_ehdr;
502794d4
CE
4702 /* phdr_size is compared to LMA values which are in bytes. */
4703 phdr_size /= opb;
c410035d
AM
4704 if (info != NULL)
4705 maxpagesize = info->maxpagesize;
4706 else
4707 maxpagesize = bed->maxpagesize;
64029e93
AM
4708 if (maxpagesize == 0)
4709 maxpagesize = 1;
4710 phdr_in_segment = info != NULL && info->load_phdrs;
4711 if (count != 0
4712 && (((sections[0]->lma & addr_mask) & (maxpagesize - 1))
4713 >= (phdr_size & (maxpagesize - 1))))
4714 /* For compatibility with old scripts that may not be using
4715 SIZEOF_HEADERS, add headers when it looks like space has
4716 been left for them. */
0a1b45a2 4717 phdr_in_segment = true;
252b5132 4718
64029e93 4719 /* Build the mapping. */
8ded5a0f
AM
4720 mfirst = NULL;
4721 pm = &mfirst;
252b5132 4722
8ded5a0f
AM
4723 /* If we have a .interp section, then create a PT_PHDR segment for
4724 the program headers and a PT_INTERP segment for the .interp
4725 section. */
4726 s = bfd_get_section_by_name (abfd, ".interp");
1b9e270b 4727 if (s != NULL && (s->flags & SEC_LOAD) != 0 && s->size != 0)
8ded5a0f
AM
4728 {
4729 amt = sizeof (struct elf_segment_map);
a50b1753 4730 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
4731 if (m == NULL)
4732 goto error_return;
4733 m->next = NULL;
4734 m->p_type = PT_PHDR;
f882209d 4735 m->p_flags = PF_R;
8ded5a0f
AM
4736 m->p_flags_valid = 1;
4737 m->includes_phdrs = 1;
0a1b45a2 4738 phdr_in_segment = true;
8ded5a0f
AM
4739 *pm = m;
4740 pm = &m->next;
252b5132 4741
8ded5a0f 4742 amt = sizeof (struct elf_segment_map);
a50b1753 4743 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
4744 if (m == NULL)
4745 goto error_return;
4746 m->next = NULL;
4747 m->p_type = PT_INTERP;
4748 m->count = 1;
4749 m->sections[0] = s;
4750
4751 *pm = m;
4752 pm = &m->next;
252b5132 4753 }
8ded5a0f
AM
4754
4755 /* Look through the sections. We put sections in the same program
4756 segment when the start of the second section can be placed within
4757 a few bytes of the end of the first section. */
4758 last_hdr = NULL;
4759 last_size = 0;
00bee008 4760 hdr_index = 0;
0a1b45a2
AM
4761 writable = false;
4762 executable = false;
8ded5a0f
AM
4763 dynsec = bfd_get_section_by_name (abfd, ".dynamic");
4764 if (dynsec != NULL
4765 && (dynsec->flags & SEC_LOAD) == 0)
4766 dynsec = NULL;
4767
64029e93 4768 if ((abfd->flags & D_PAGED) == 0)
0a1b45a2 4769 phdr_in_segment = false;
64029e93 4770
8ded5a0f
AM
4771 /* Deal with -Ttext or something similar such that the first section
4772 is not adjacent to the program headers. This is an
4773 approximation, since at this point we don't know exactly how many
4774 program headers we will need. */
64029e93 4775 if (phdr_in_segment && count > 0)
252b5132 4776 {
66631823 4777 bfd_vma phdr_lma; /* Bytes. */
0a1b45a2 4778 bool separate_phdr = false;
64029e93
AM
4779
4780 phdr_lma = (sections[0]->lma - phdr_size) & addr_mask & -maxpagesize;
4781 if (info != NULL
4782 && info->separate_code
4783 && (sections[0]->flags & SEC_CODE) != 0)
1a9ccd70 4784 {
64029e93
AM
4785 /* If data sections should be separate from code and
4786 thus not executable, and the first section is
4787 executable then put the file and program headers in
4788 their own PT_LOAD. */
0a1b45a2 4789 separate_phdr = true;
64029e93
AM
4790 if ((((phdr_lma + phdr_size - 1) & addr_mask & -maxpagesize)
4791 == (sections[0]->lma & addr_mask & -maxpagesize)))
4792 {
4793 /* The file and program headers are currently on the
4794 same page as the first section. Put them on the
4795 previous page if we can. */
4796 if (phdr_lma >= maxpagesize)
4797 phdr_lma -= maxpagesize;
4798 else
0a1b45a2 4799 separate_phdr = false;
64029e93
AM
4800 }
4801 }
4802 if ((sections[0]->lma & addr_mask) < phdr_lma
4803 || (sections[0]->lma & addr_mask) < phdr_size)
4804 /* If file and program headers would be placed at the end
4805 of memory then it's probably better to omit them. */
0a1b45a2 4806 phdr_in_segment = false;
64029e93
AM
4807 else if (phdr_lma < wrap_to)
4808 /* If a section wraps around to where we'll be placing
4809 file and program headers, then the headers will be
4810 overwritten. */
0a1b45a2 4811 phdr_in_segment = false;
64029e93
AM
4812 else if (separate_phdr)
4813 {
4814 m = make_mapping (abfd, sections, 0, 0, phdr_in_segment);
4815 if (m == NULL)
4816 goto error_return;
66631823 4817 m->p_paddr = phdr_lma * opb;
64029e93
AM
4818 m->p_vaddr_offset
4819 = (sections[0]->vma - phdr_size) & addr_mask & -maxpagesize;
4820 m->p_paddr_valid = 1;
4821 *pm = m;
4822 pm = &m->next;
0a1b45a2 4823 phdr_in_segment = false;
1a9ccd70 4824 }
252b5132
RH
4825 }
4826
8ded5a0f 4827 for (i = 0, hdrpp = sections; i < count; i++, hdrpp++)
252b5132 4828 {
8ded5a0f 4829 asection *hdr;
0a1b45a2 4830 bool new_segment;
8ded5a0f
AM
4831
4832 hdr = *hdrpp;
4833
4834 /* See if this section and the last one will fit in the same
4835 segment. */
4836
4837 if (last_hdr == NULL)
4838 {
4839 /* If we don't have a segment yet, then we don't need a new
4840 one (we build the last one after this loop). */
0a1b45a2 4841 new_segment = false;
8ded5a0f
AM
4842 }
4843 else if (last_hdr->lma - last_hdr->vma != hdr->lma - hdr->vma)
4844 {
4845 /* If this section has a different relation between the
4846 virtual address and the load address, then we need a new
4847 segment. */
0a1b45a2 4848 new_segment = true;
8ded5a0f 4849 }
b5599592
AM
4850 else if (hdr->lma < last_hdr->lma + last_size
4851 || last_hdr->lma + last_size < last_hdr->lma)
4852 {
4853 /* If this section has a load address that makes it overlap
4854 the previous section, then we need a new segment. */
0a1b45a2 4855 new_segment = true;
b5599592 4856 }
76cb3a89
AM
4857 else if ((abfd->flags & D_PAGED) != 0
4858 && (((last_hdr->lma + last_size - 1) & -maxpagesize)
4859 == (hdr->lma & -maxpagesize)))
4860 {
4861 /* If we are demand paged then we can't map two disk
4862 pages onto the same memory page. */
0a1b45a2 4863 new_segment = false;
76cb3a89 4864 }
39948a60
NC
4865 /* In the next test we have to be careful when last_hdr->lma is close
4866 to the end of the address space. If the aligned address wraps
4867 around to the start of the address space, then there are no more
4868 pages left in memory and it is OK to assume that the current
4869 section can be included in the current segment. */
76cb3a89
AM
4870 else if ((BFD_ALIGN (last_hdr->lma + last_size, maxpagesize)
4871 + maxpagesize > last_hdr->lma)
4872 && (BFD_ALIGN (last_hdr->lma + last_size, maxpagesize)
4873 + maxpagesize <= hdr->lma))
8ded5a0f
AM
4874 {
4875 /* If putting this section in this segment would force us to
4876 skip a page in the segment, then we need a new segment. */
0a1b45a2 4877 new_segment = true;
8ded5a0f
AM
4878 }
4879 else if ((last_hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0
76cb3a89 4880 && (hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) != 0)
8ded5a0f 4881 {
e5654c0f
AM
4882 /* We don't want to put a loaded section after a
4883 nonloaded (ie. bss style) section in the same segment
4884 as that will force the non-loaded section to be loaded.
76cb3a89 4885 Consider .tbss sections as loaded for this purpose. */
0a1b45a2 4886 new_segment = true;
8ded5a0f
AM
4887 }
4888 else if ((abfd->flags & D_PAGED) == 0)
4889 {
4890 /* If the file is not demand paged, which means that we
4891 don't require the sections to be correctly aligned in the
4892 file, then there is no other reason for a new segment. */
0a1b45a2 4893 new_segment = false;
8ded5a0f 4894 }
2888249f
L
4895 else if (info != NULL
4896 && info->separate_code
4897 && executable != ((hdr->flags & SEC_CODE) != 0))
4898 {
0a1b45a2 4899 new_segment = true;
2888249f 4900 }
8ded5a0f 4901 else if (! writable
76cb3a89 4902 && (hdr->flags & SEC_READONLY) == 0)
8ded5a0f
AM
4903 {
4904 /* We don't want to put a writable section in a read only
76cb3a89 4905 segment. */
0a1b45a2 4906 new_segment = true;
8ded5a0f
AM
4907 }
4908 else
4909 {
4910 /* Otherwise, we can use the same segment. */
0a1b45a2 4911 new_segment = false;
8ded5a0f
AM
4912 }
4913
2889e75b 4914 /* Allow interested parties a chance to override our decision. */
ceae84aa
AM
4915 if (last_hdr != NULL
4916 && info != NULL
4917 && info->callbacks->override_segment_assignment != NULL)
4918 new_segment
4919 = info->callbacks->override_segment_assignment (info, abfd, hdr,
4920 last_hdr,
4921 new_segment);
2889e75b 4922
8ded5a0f
AM
4923 if (! new_segment)
4924 {
4925 if ((hdr->flags & SEC_READONLY) == 0)
0a1b45a2 4926 writable = true;
2888249f 4927 if ((hdr->flags & SEC_CODE) != 0)
0a1b45a2 4928 executable = true;
8ded5a0f
AM
4929 last_hdr = hdr;
4930 /* .tbss sections effectively have zero size. */
502794d4 4931 last_size = (!IS_TBSS (hdr) ? hdr->size : 0) / opb;
8ded5a0f
AM
4932 continue;
4933 }
4934
4935 /* We need a new program segment. We must create a new program
00bee008 4936 header holding all the sections from hdr_index until hdr. */
8ded5a0f 4937
00bee008 4938 m = make_mapping (abfd, sections, hdr_index, i, phdr_in_segment);
8ded5a0f
AM
4939 if (m == NULL)
4940 goto error_return;
4941
4942 *pm = m;
4943 pm = &m->next;
4944
252b5132 4945 if ((hdr->flags & SEC_READONLY) == 0)
0a1b45a2 4946 writable = true;
8ded5a0f 4947 else
0a1b45a2 4948 writable = false;
8ded5a0f 4949
2888249f 4950 if ((hdr->flags & SEC_CODE) == 0)
0a1b45a2 4951 executable = false;
2888249f 4952 else
0a1b45a2 4953 executable = true;
2888249f 4954
baaff79e
JJ
4955 last_hdr = hdr;
4956 /* .tbss sections effectively have zero size. */
502794d4 4957 last_size = (!IS_TBSS (hdr) ? hdr->size : 0) / opb;
00bee008 4958 hdr_index = i;
0a1b45a2 4959 phdr_in_segment = false;
252b5132
RH
4960 }
4961
86b2281f
AM
4962 /* Create a final PT_LOAD program segment, but not if it's just
4963 for .tbss. */
4964 if (last_hdr != NULL
00bee008 4965 && (i - hdr_index != 1
dbc88fc1 4966 || !IS_TBSS (last_hdr)))
8ded5a0f 4967 {
00bee008 4968 m = make_mapping (abfd, sections, hdr_index, i, phdr_in_segment);
8ded5a0f
AM
4969 if (m == NULL)
4970 goto error_return;
252b5132 4971
8ded5a0f
AM
4972 *pm = m;
4973 pm = &m->next;
4974 }
252b5132 4975
8ded5a0f
AM
4976 /* If there is a .dynamic section, throw in a PT_DYNAMIC segment. */
4977 if (dynsec != NULL)
4978 {
4979 m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
4980 if (m == NULL)
4981 goto error_return;
4982 *pm = m;
4983 pm = &m->next;
4984 }
252b5132 4985
23e463ed 4986 /* For each batch of consecutive loadable SHT_NOTE sections,
1c5265b5
JJ
4987 add a PT_NOTE segment. We don't use bfd_get_section_by_name,
4988 because if we link together nonloadable .note sections and
4989 loadable .note sections, we will generate two .note sections
23e463ed 4990 in the output file. */
8ded5a0f
AM
4991 for (s = abfd->sections; s != NULL; s = s->next)
4992 {
4993 if ((s->flags & SEC_LOAD) != 0
23e463ed 4994 && elf_section_type (s) == SHT_NOTE)
8ded5a0f 4995 {
1c5265b5 4996 asection *s2;
23e463ed 4997 unsigned int alignment_power = s->alignment_power;
91d6fa6a
NC
4998
4999 count = 1;
23e463ed
L
5000 for (s2 = s; s2->next != NULL; s2 = s2->next)
5001 {
5002 if (s2->next->alignment_power == alignment_power
5003 && (s2->next->flags & SEC_LOAD) != 0
5004 && elf_section_type (s2->next) == SHT_NOTE
66631823 5005 && align_power (s2->lma + s2->size / opb,
23e463ed
L
5006 alignment_power)
5007 == s2->next->lma)
5008 count++;
5009 else
5010 break;
5011 }
00bee008
AM
5012 amt = sizeof (struct elf_segment_map) - sizeof (asection *);
5013 amt += count * sizeof (asection *);
a50b1753 5014 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
5015 if (m == NULL)
5016 goto error_return;
5017 m->next = NULL;
5018 m->p_type = PT_NOTE;
1c5265b5
JJ
5019 m->count = count;
5020 while (count > 1)
5021 {
5022 m->sections[m->count - count--] = s;
5023 BFD_ASSERT ((s->flags & SEC_THREAD_LOCAL) == 0);
5024 s = s->next;
5025 }
5026 m->sections[m->count - 1] = s;
5027 BFD_ASSERT ((s->flags & SEC_THREAD_LOCAL) == 0);
8ded5a0f
AM
5028 *pm = m;
5029 pm = &m->next;
5030 }
5031 if (s->flags & SEC_THREAD_LOCAL)
5032 {
5033 if (! tls_count)
5034 first_tls = s;
5035 tls_count++;
5036 }
a91e1603
L
5037 if (first_mbind == NULL
5038 && (elf_section_flags (s) & SHF_GNU_MBIND) != 0)
5039 first_mbind = s;
8ded5a0f 5040 }
252b5132 5041
8ded5a0f
AM
5042 /* If there are any SHF_TLS output sections, add PT_TLS segment. */
5043 if (tls_count > 0)
5044 {
00bee008
AM
5045 amt = sizeof (struct elf_segment_map) - sizeof (asection *);
5046 amt += tls_count * sizeof (asection *);
a50b1753 5047 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
5048 if (m == NULL)
5049 goto error_return;
5050 m->next = NULL;
5051 m->p_type = PT_TLS;
5052 m->count = tls_count;
5053 /* Mandated PF_R. */
5054 m->p_flags = PF_R;
5055 m->p_flags_valid = 1;
d923cae0 5056 s = first_tls;
446f7ed5 5057 for (i = 0; i < tls_count; ++i)
8ded5a0f 5058 {
d923cae0
L
5059 if ((s->flags & SEC_THREAD_LOCAL) == 0)
5060 {
5061 _bfd_error_handler
871b3ab2 5062 (_("%pB: TLS sections are not adjacent:"), abfd);
d923cae0
L
5063 s = first_tls;
5064 i = 0;
446f7ed5 5065 while (i < tls_count)
d923cae0
L
5066 {
5067 if ((s->flags & SEC_THREAD_LOCAL) != 0)
5068 {
871b3ab2 5069 _bfd_error_handler (_(" TLS: %pA"), s);
d923cae0
L
5070 i++;
5071 }
5072 else
871b3ab2 5073 _bfd_error_handler (_(" non-TLS: %pA"), s);
d923cae0
L
5074 s = s->next;
5075 }
5076 bfd_set_error (bfd_error_bad_value);
5077 goto error_return;
5078 }
5079 m->sections[i] = s;
5080 s = s->next;
8ded5a0f 5081 }
252b5132 5082
8ded5a0f
AM
5083 *pm = m;
5084 pm = &m->next;
5085 }
252b5132 5086
df3a023b
AM
5087 if (first_mbind
5088 && (abfd->flags & D_PAGED) != 0
5089 && (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_mbind) != 0)
a91e1603
L
5090 for (s = first_mbind; s != NULL; s = s->next)
5091 if ((elf_section_flags (s) & SHF_GNU_MBIND) != 0
df3a023b 5092 && elf_section_data (s)->this_hdr.sh_info <= PT_GNU_MBIND_NUM)
a91e1603
L
5093 {
5094 /* Mandated PF_R. */
5095 unsigned long p_flags = PF_R;
5096 if ((s->flags & SEC_READONLY) == 0)
5097 p_flags |= PF_W;
5098 if ((s->flags & SEC_CODE) != 0)
5099 p_flags |= PF_X;
5100
5101 amt = sizeof (struct elf_segment_map) + sizeof (asection *);
5102 m = bfd_zalloc (abfd, amt);
5103 if (m == NULL)
5104 goto error_return;
5105 m->next = NULL;
5106 m->p_type = (PT_GNU_MBIND_LO
5107 + elf_section_data (s)->this_hdr.sh_info);
5108 m->count = 1;
5109 m->p_flags_valid = 1;
5110 m->sections[0] = s;
5111 m->p_flags = p_flags;
5112
5113 *pm = m;
5114 pm = &m->next;
5115 }
5116
0a59decb
L
5117 s = bfd_get_section_by_name (abfd,
5118 NOTE_GNU_PROPERTY_SECTION_NAME);
5119 if (s != NULL && s->size != 0)
5120 {
5121 amt = sizeof (struct elf_segment_map) + sizeof (asection *);
5122 m = bfd_zalloc (abfd, amt);
5123 if (m == NULL)
5124 goto error_return;
5125 m->next = NULL;
5126 m->p_type = PT_GNU_PROPERTY;
5127 m->count = 1;
5128 m->p_flags_valid = 1;
5129 m->sections[0] = s;
5130 m->p_flags = PF_R;
5131 *pm = m;
5132 pm = &m->next;
5133 }
5134
8ded5a0f
AM
5135 /* If there is a .eh_frame_hdr section, throw in a PT_GNU_EH_FRAME
5136 segment. */
12bd6957 5137 eh_frame_hdr = elf_eh_frame_hdr (abfd);
8ded5a0f
AM
5138 if (eh_frame_hdr != NULL
5139 && (eh_frame_hdr->output_section->flags & SEC_LOAD) != 0)
252b5132 5140 {
dc810e39 5141 amt = sizeof (struct elf_segment_map);
a50b1753 5142 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
252b5132
RH
5143 if (m == NULL)
5144 goto error_return;
5145 m->next = NULL;
8ded5a0f 5146 m->p_type = PT_GNU_EH_FRAME;
252b5132 5147 m->count = 1;
8ded5a0f 5148 m->sections[0] = eh_frame_hdr->output_section;
252b5132
RH
5149
5150 *pm = m;
5151 pm = &m->next;
5152 }
13ae64f3 5153
12bd6957 5154 if (elf_stack_flags (abfd))
13ae64f3 5155 {
8ded5a0f 5156 amt = sizeof (struct elf_segment_map);
a50b1753 5157 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
5158 if (m == NULL)
5159 goto error_return;
5160 m->next = NULL;
2b05f1b7 5161 m->p_type = PT_GNU_STACK;
12bd6957 5162 m->p_flags = elf_stack_flags (abfd);
04c3a755 5163 m->p_align = bed->stack_align;
8ded5a0f 5164 m->p_flags_valid = 1;
04c3a755
NS
5165 m->p_align_valid = m->p_align != 0;
5166 if (info->stacksize > 0)
5167 {
5168 m->p_size = info->stacksize;
5169 m->p_size_valid = 1;
5170 }
252b5132 5171
8ded5a0f
AM
5172 *pm = m;
5173 pm = &m->next;
5174 }
65765700 5175
ceae84aa 5176 if (info != NULL && info->relro)
8ded5a0f 5177 {
f210dcff
L
5178 for (m = mfirst; m != NULL; m = m->next)
5179 {
3832a4d8
AM
5180 if (m->p_type == PT_LOAD
5181 && m->count != 0
5182 && m->sections[0]->vma >= info->relro_start
5183 && m->sections[0]->vma < info->relro_end)
f210dcff 5184 {
3832a4d8
AM
5185 i = m->count;
5186 while (--i != (unsigned) -1)
ec2e748a
NC
5187 {
5188 if (m->sections[i]->size > 0
5189 && (m->sections[i]->flags & (SEC_LOAD | SEC_HAS_CONTENTS))
5190 == (SEC_LOAD | SEC_HAS_CONTENTS))
5191 break;
5192 }
3832a4d8 5193
43a8475c 5194 if (i != (unsigned) -1)
f210dcff
L
5195 break;
5196 }
be01b344 5197 }
f210dcff
L
5198
5199 /* Make a PT_GNU_RELRO segment only when it isn't empty. */
5200 if (m != NULL)
5201 {
5202 amt = sizeof (struct elf_segment_map);
a50b1753 5203 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
f210dcff
L
5204 if (m == NULL)
5205 goto error_return;
5206 m->next = NULL;
5207 m->p_type = PT_GNU_RELRO;
f210dcff
L
5208 *pm = m;
5209 pm = &m->next;
5210 }
8ded5a0f 5211 }
9ee5e499 5212
8ded5a0f 5213 free (sections);
12bd6957 5214 elf_seg_map (abfd) = mfirst;
9ee5e499
JJ
5215 }
5216
3dea8fca 5217 if (!elf_modify_segment_map (abfd, info, no_user_phdrs))
0a1b45a2 5218 return false;
8c37241b 5219
12bd6957 5220 for (count = 0, m = elf_seg_map (abfd); m != NULL; m = m->next)
8ded5a0f 5221 ++count;
12bd6957 5222 elf_program_header_size (abfd) = count * bed->s->sizeof_phdr;
252b5132 5223
0a1b45a2 5224 return true;
252b5132
RH
5225
5226 error_return:
c9594989 5227 free (sections);
0a1b45a2 5228 return false;
252b5132
RH
5229}
5230
5231/* Sort sections by address. */
5232
5233static int
217aa764 5234elf_sort_sections (const void *arg1, const void *arg2)
252b5132
RH
5235{
5236 const asection *sec1 = *(const asection **) arg1;
5237 const asection *sec2 = *(const asection **) arg2;
eecdbe52 5238 bfd_size_type size1, size2;
252b5132
RH
5239
5240 /* Sort by LMA first, since this is the address used to
5241 place the section into a segment. */
5242 if (sec1->lma < sec2->lma)
5243 return -1;
5244 else if (sec1->lma > sec2->lma)
5245 return 1;
5246
5247 /* Then sort by VMA. Normally the LMA and the VMA will be
5248 the same, and this will do nothing. */
5249 if (sec1->vma < sec2->vma)
5250 return -1;
5251 else if (sec1->vma > sec2->vma)
5252 return 1;
5253
5254 /* Put !SEC_LOAD sections after SEC_LOAD ones. */
5255
8d748d1d
AM
5256#define TOEND(x) (((x)->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0 \
5257 && (x)->size != 0)
252b5132
RH
5258
5259 if (TOEND (sec1))
5260 {
48db3297 5261 if (!TOEND (sec2))
252b5132
RH
5262 return 1;
5263 }
00a7cdc5 5264 else if (TOEND (sec2))
252b5132
RH
5265 return -1;
5266
5267#undef TOEND
5268
00a7cdc5
NC
5269 /* Sort by size, to put zero sized sections
5270 before others at the same address. */
252b5132 5271
eea6121a
AM
5272 size1 = (sec1->flags & SEC_LOAD) ? sec1->size : 0;
5273 size2 = (sec2->flags & SEC_LOAD) ? sec2->size : 0;
eecdbe52
JJ
5274
5275 if (size1 < size2)
252b5132 5276 return -1;
eecdbe52 5277 if (size1 > size2)
252b5132
RH
5278 return 1;
5279
5280 return sec1->target_index - sec2->target_index;
5281}
5282
30fe1832
AM
5283/* This qsort comparison functions sorts PT_LOAD segments first and
5284 by p_paddr, for assign_file_positions_for_load_sections. */
5285
5286static int
5287elf_sort_segments (const void *arg1, const void *arg2)
5288{
5289 const struct elf_segment_map *m1 = *(const struct elf_segment_map **) arg1;
5290 const struct elf_segment_map *m2 = *(const struct elf_segment_map **) arg2;
5291
5292 if (m1->p_type != m2->p_type)
5293 {
5294 if (m1->p_type == PT_NULL)
5295 return 1;
5296 if (m2->p_type == PT_NULL)
5297 return -1;
5298 return m1->p_type < m2->p_type ? -1 : 1;
5299 }
5300 if (m1->includes_filehdr != m2->includes_filehdr)
5301 return m1->includes_filehdr ? -1 : 1;
5302 if (m1->no_sort_lma != m2->no_sort_lma)
5303 return m1->no_sort_lma ? -1 : 1;
5304 if (m1->p_type == PT_LOAD && !m1->no_sort_lma)
5305 {
4b3ecb3b 5306 bfd_vma lma1, lma2; /* Octets. */
30fe1832
AM
5307 lma1 = 0;
5308 if (m1->p_paddr_valid)
4b3ecb3b 5309 lma1 = m1->p_paddr;
30fe1832 5310 else if (m1->count != 0)
4b3ecb3b
AM
5311 {
5312 unsigned int opb = bfd_octets_per_byte (m1->sections[0]->owner,
5313 m1->sections[0]);
5314 lma1 = (m1->sections[0]->lma + m1->p_vaddr_offset) * opb;
5315 }
30fe1832
AM
5316 lma2 = 0;
5317 if (m2->p_paddr_valid)
4b3ecb3b 5318 lma2 = m2->p_paddr;
30fe1832 5319 else if (m2->count != 0)
4b3ecb3b
AM
5320 {
5321 unsigned int opb = bfd_octets_per_byte (m2->sections[0]->owner,
5322 m2->sections[0]);
5323 lma2 = (m2->sections[0]->lma + m2->p_vaddr_offset) * opb;
5324 }
30fe1832
AM
5325 if (lma1 != lma2)
5326 return lma1 < lma2 ? -1 : 1;
5327 }
5328 if (m1->idx != m2->idx)
5329 return m1->idx < m2->idx ? -1 : 1;
5330 return 0;
5331}
5332
340b6d91
AC
5333/* Ian Lance Taylor writes:
5334
5335 We shouldn't be using % with a negative signed number. That's just
5336 not good. We have to make sure either that the number is not
5337 negative, or that the number has an unsigned type. When the types
5338 are all the same size they wind up as unsigned. When file_ptr is a
5339 larger signed type, the arithmetic winds up as signed long long,
5340 which is wrong.
5341
5342 What we're trying to say here is something like ``increase OFF by
5343 the least amount that will cause it to be equal to the VMA modulo
5344 the page size.'' */
5345/* In other words, something like:
5346
5347 vma_offset = m->sections[0]->vma % bed->maxpagesize;
5348 off_offset = off % bed->maxpagesize;
5349 if (vma_offset < off_offset)
5350 adjustment = vma_offset + bed->maxpagesize - off_offset;
5351 else
5352 adjustment = vma_offset - off_offset;
08a40648 5353
de194d85 5354 which can be collapsed into the expression below. */
340b6d91
AC
5355
5356static file_ptr
5357vma_page_aligned_bias (bfd_vma vma, ufile_ptr off, bfd_vma maxpagesize)
5358{
dc9155b2
NC
5359 /* PR binutils/16199: Handle an alignment of zero. */
5360 if (maxpagesize == 0)
5361 maxpagesize = 1;
340b6d91
AC
5362 return ((vma - off) % maxpagesize);
5363}
5364
6d33f217
L
5365static void
5366print_segment_map (const struct elf_segment_map *m)
5367{
5368 unsigned int j;
5369 const char *pt = get_segment_type (m->p_type);
5370 char buf[32];
5371
5372 if (pt == NULL)
5373 {
5374 if (m->p_type >= PT_LOPROC && m->p_type <= PT_HIPROC)
5375 sprintf (buf, "LOPROC+%7.7x",
5376 (unsigned int) (m->p_type - PT_LOPROC));
5377 else if (m->p_type >= PT_LOOS && m->p_type <= PT_HIOS)
5378 sprintf (buf, "LOOS+%7.7x",
5379 (unsigned int) (m->p_type - PT_LOOS));
5380 else
5381 snprintf (buf, sizeof (buf), "%8.8x",
5382 (unsigned int) m->p_type);
5383 pt = buf;
5384 }
4a97a0e5 5385 fflush (stdout);
6d33f217
L
5386 fprintf (stderr, "%s:", pt);
5387 for (j = 0; j < m->count; j++)
5388 fprintf (stderr, " %s", m->sections [j]->name);
5389 putc ('\n',stderr);
4a97a0e5 5390 fflush (stderr);
6d33f217
L
5391}
5392
0a1b45a2 5393static bool
32812159
AM
5394write_zeros (bfd *abfd, file_ptr pos, bfd_size_type len)
5395{
5396 void *buf;
0a1b45a2 5397 bool ret;
32812159
AM
5398
5399 if (bfd_seek (abfd, pos, SEEK_SET) != 0)
0a1b45a2 5400 return false;
32812159
AM
5401 buf = bfd_zmalloc (len);
5402 if (buf == NULL)
0a1b45a2 5403 return false;
32812159
AM
5404 ret = bfd_bwrite (buf, len, abfd) == len;
5405 free (buf);
5406 return ret;
5407}
5408
252b5132
RH
5409/* Assign file positions to the sections based on the mapping from
5410 sections to segments. This function also sets up some fields in
f3520d2f 5411 the file header. */
252b5132 5412
0a1b45a2 5413static bool
f3520d2f
AM
5414assign_file_positions_for_load_sections (bfd *abfd,
5415 struct bfd_link_info *link_info)
252b5132
RH
5416{
5417 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 5418 struct elf_segment_map *m;
30fe1832 5419 struct elf_segment_map *phdr_load_seg;
252b5132 5420 Elf_Internal_Phdr *phdrs;
252b5132 5421 Elf_Internal_Phdr *p;
502794d4 5422 file_ptr off; /* Octets. */
3f570048 5423 bfd_size_type maxpagesize;
74e315db
L
5424 bfd_size_type p_align;
5425 bool p_align_p = false;
30fe1832 5426 unsigned int alloc, actual;
0920dee7 5427 unsigned int i, j;
30fe1832 5428 struct elf_segment_map **sorted_seg_map;
502794d4 5429 unsigned int opb = bfd_octets_per_byte (abfd, NULL);
252b5132 5430
e36284ab 5431 if (link_info == NULL
e2cbf4df 5432 && !_bfd_elf_map_sections_to_segments (abfd, link_info, NULL))
0a1b45a2 5433 return false;
252b5132 5434
8ded5a0f 5435 alloc = 0;
12bd6957 5436 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
30fe1832 5437 m->idx = alloc++;
252b5132 5438
82f2dbf7
NC
5439 if (alloc)
5440 {
5441 elf_elfheader (abfd)->e_phoff = bed->s->sizeof_ehdr;
5442 elf_elfheader (abfd)->e_phentsize = bed->s->sizeof_phdr;
5443 }
5444 else
5445 {
5446 /* PR binutils/12467. */
5447 elf_elfheader (abfd)->e_phoff = 0;
5448 elf_elfheader (abfd)->e_phentsize = 0;
5449 }
d324f6d6 5450
8ded5a0f 5451 elf_elfheader (abfd)->e_phnum = alloc;
252b5132 5452
12bd6957 5453 if (elf_program_header_size (abfd) == (bfd_size_type) -1)
30fe1832
AM
5454 {
5455 actual = alloc;
5456 elf_program_header_size (abfd) = alloc * bed->s->sizeof_phdr;
5457 }
8ded5a0f 5458 else
30fe1832
AM
5459 {
5460 actual = elf_program_header_size (abfd) / bed->s->sizeof_phdr;
5461 BFD_ASSERT (elf_program_header_size (abfd)
5462 == actual * bed->s->sizeof_phdr);
5463 BFD_ASSERT (actual >= alloc);
5464 }
252b5132
RH
5465
5466 if (alloc == 0)
f3520d2f 5467 {
12bd6957 5468 elf_next_file_pos (abfd) = bed->s->sizeof_ehdr;
0a1b45a2 5469 return true;
f3520d2f 5470 }
252b5132 5471
12bd6957 5472 /* We're writing the size in elf_program_header_size (abfd),
57268894
HPN
5473 see assign_file_positions_except_relocs, so make sure we have
5474 that amount allocated, with trailing space cleared.
12bd6957
AM
5475 The variable alloc contains the computed need, while
5476 elf_program_header_size (abfd) contains the size used for the
57268894
HPN
5477 layout.
5478 See ld/emultempl/elf-generic.em:gld${EMULATION_NAME}_map_segments
5479 where the layout is forced to according to a larger size in the
5480 last iterations for the testcase ld-elf/header. */
30fe1832
AM
5481 phdrs = bfd_zalloc (abfd, (actual * sizeof (*phdrs)
5482 + alloc * sizeof (*sorted_seg_map)));
5483 sorted_seg_map = (struct elf_segment_map **) (phdrs + actual);
f3520d2f 5484 elf_tdata (abfd)->phdr = phdrs;
252b5132 5485 if (phdrs == NULL)
0a1b45a2 5486 return false;
252b5132 5487
30fe1832 5488 for (m = elf_seg_map (abfd), j = 0; m != NULL; m = m->next, j++)
252b5132 5489 {
30fe1832 5490 sorted_seg_map[j] = m;
252b5132 5491 /* If elf_segment_map is not from map_sections_to_segments, the
08a40648 5492 sections may not be correctly ordered. NOTE: sorting should
52e9b619
MS
5493 not be done to the PT_NOTE section of a corefile, which may
5494 contain several pseudo-sections artificially created by bfd.
5495 Sorting these pseudo-sections breaks things badly. */
47d9a591
AM
5496 if (m->count > 1
5497 && !(elf_elfheader (abfd)->e_type == ET_CORE
52e9b619 5498 && m->p_type == PT_NOTE))
48db3297
AM
5499 {
5500 for (i = 0; i < m->count; i++)
5501 m->sections[i]->target_index = i;
5502 qsort (m->sections, (size_t) m->count, sizeof (asection *),
5503 elf_sort_sections);
5504 }
30fe1832
AM
5505 }
5506 if (alloc > 1)
5507 qsort (sorted_seg_map, alloc, sizeof (*sorted_seg_map),
5508 elf_sort_segments);
5509
74e315db 5510 p_align = bed->p_align;
30fe1832
AM
5511 maxpagesize = 1;
5512 if ((abfd->flags & D_PAGED) != 0)
c410035d
AM
5513 {
5514 if (link_info != NULL)
5515 maxpagesize = link_info->maxpagesize;
5516 else
5517 maxpagesize = bed->maxpagesize;
5518 }
30fe1832
AM
5519
5520 /* Sections must map to file offsets past the ELF file header. */
5521 off = bed->s->sizeof_ehdr;
5522 /* And if one of the PT_LOAD headers doesn't include the program
5523 headers then we'll be mapping program headers in the usual
5524 position after the ELF file header. */
5525 phdr_load_seg = NULL;
5526 for (j = 0; j < alloc; j++)
5527 {
5528 m = sorted_seg_map[j];
5529 if (m->p_type != PT_LOAD)
5530 break;
5531 if (m->includes_phdrs)
5532 {
5533 phdr_load_seg = m;
5534 break;
5535 }
5536 }
5537 if (phdr_load_seg == NULL)
5538 off += actual * bed->s->sizeof_phdr;
5539
5540 for (j = 0; j < alloc; j++)
5541 {
5542 asection **secpp;
502794d4 5543 bfd_vma off_adjust; /* Octets. */
0a1b45a2 5544 bool no_contents;
252b5132 5545
b301b248
AM
5546 /* An ELF segment (described by Elf_Internal_Phdr) may contain a
5547 number of sections with contents contributing to both p_filesz
5548 and p_memsz, followed by a number of sections with no contents
5549 that just contribute to p_memsz. In this loop, OFF tracks next
02bf8d82 5550 available file offset for PT_LOAD and PT_NOTE segments. */
30fe1832
AM
5551 m = sorted_seg_map[j];
5552 p = phdrs + m->idx;
252b5132 5553 p->p_type = m->p_type;
28a7f3e7 5554 p->p_flags = m->p_flags;
252b5132 5555
3f570048 5556 if (m->count == 0)
502794d4 5557 p->p_vaddr = m->p_vaddr_offset * opb;
3f570048 5558 else
502794d4 5559 p->p_vaddr = (m->sections[0]->vma + m->p_vaddr_offset) * opb;
3f570048
AM
5560
5561 if (m->p_paddr_valid)
5562 p->p_paddr = m->p_paddr;
5563 else if (m->count == 0)
5564 p->p_paddr = 0;
5565 else
502794d4 5566 p->p_paddr = (m->sections[0]->lma + m->p_vaddr_offset) * opb;
3f570048
AM
5567
5568 if (p->p_type == PT_LOAD
5569 && (abfd->flags & D_PAGED) != 0)
5570 {
5571 /* p_align in demand paged PT_LOAD segments effectively stores
5572 the maximum page size. When copying an executable with
5573 objcopy, we set m->p_align from the input file. Use this
5574 value for maxpagesize rather than bed->maxpagesize, which
5575 may be different. Note that we use maxpagesize for PT_TLS
5576 segment alignment later in this function, so we are relying
5577 on at least one PT_LOAD segment appearing before a PT_TLS
5578 segment. */
5579 if (m->p_align_valid)
5580 maxpagesize = m->p_align;
74e315db
L
5581 else if (p_align != 0
5582 && (link_info == NULL
5583 || !link_info->maxpagesize_is_set))
5584 /* Set p_align to the default p_align value while laying
5585 out segments aligning to the maximum page size or the
5586 largest section alignment. The run-time loader can
5587 align segments to the default p_align value or the
5588 maximum page size, depending on system page size. */
5589 p_align_p = true;
3f570048
AM
5590
5591 p->p_align = maxpagesize;
5592 }
3271a814
NS
5593 else if (m->p_align_valid)
5594 p->p_align = m->p_align;
e970b90a
DJ
5595 else if (m->count == 0)
5596 p->p_align = 1 << bed->s->log_file_align;
30fe1832
AM
5597
5598 if (m == phdr_load_seg)
5599 {
5600 if (!m->includes_filehdr)
5601 p->p_offset = off;
5602 off += actual * bed->s->sizeof_phdr;
5603 }
3f570048 5604
0a1b45a2 5605 no_contents = false;
bf988460 5606 off_adjust = 0;
252b5132 5607 if (p->p_type == PT_LOAD
b301b248 5608 && m->count > 0)
252b5132 5609 {
66631823 5610 bfd_size_type align; /* Bytes. */
a49e53ed 5611 unsigned int align_power = 0;
b301b248 5612
3271a814
NS
5613 if (m->p_align_valid)
5614 align = p->p_align;
5615 else
252b5132 5616 {
3271a814
NS
5617 for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
5618 {
5619 unsigned int secalign;
08a40648 5620
fd361982 5621 secalign = bfd_section_alignment (*secpp);
3271a814
NS
5622 if (secalign > align_power)
5623 align_power = secalign;
5624 }
5625 align = (bfd_size_type) 1 << align_power;
5626 if (align < maxpagesize)
74e315db
L
5627 {
5628 /* If a section requires alignment higher than the
5629 default p_align value, don't set p_align to the
5630 default p_align value. */
5631 if (align > p_align)
5632 p_align_p = false;
5633 align = maxpagesize;
5634 }
5635 else
5636 {
5637 /* If a section requires alignment higher than the
5638 maximum page size, set p_align to the section
5639 alignment. */
5640 p_align_p = true;
5641 p_align = align;
5642 }
b301b248 5643 }
252b5132 5644
02bf8d82
AM
5645 for (i = 0; i < m->count; i++)
5646 if ((m->sections[i]->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
5647 /* If we aren't making room for this section, then
5648 it must be SHT_NOBITS regardless of what we've
5649 set via struct bfd_elf_special_section. */
5650 elf_section_type (m->sections[i]) = SHT_NOBITS;
5651
bf988460 5652 /* Find out whether this segment contains any loadable
aea274d3 5653 sections. */
0a1b45a2 5654 no_contents = true;
aea274d3
AM
5655 for (i = 0; i < m->count; i++)
5656 if (elf_section_type (m->sections[i]) != SHT_NOBITS)
5657 {
0a1b45a2 5658 no_contents = false;
aea274d3
AM
5659 break;
5660 }
bf988460 5661
66631823 5662 off_adjust = vma_page_aligned_bias (p->p_vaddr, off, align * opb);
a8c75b76
AM
5663
5664 /* Broken hardware and/or kernel require that files do not
5665 map the same page with different permissions on some hppa
5666 processors. */
30fe1832
AM
5667 if (j != 0
5668 && (abfd->flags & D_PAGED) != 0
a8c75b76
AM
5669 && bed->no_page_alias
5670 && (off & (maxpagesize - 1)) != 0
502794d4
CE
5671 && ((off & -maxpagesize)
5672 == ((off + off_adjust) & -maxpagesize)))
a8c75b76 5673 off_adjust += maxpagesize;
bf988460
AM
5674 off += off_adjust;
5675 if (no_contents)
5676 {
5677 /* We shouldn't need to align the segment on disk since
5678 the segment doesn't need file space, but the gABI
5679 arguably requires the alignment and glibc ld.so
5680 checks it. So to comply with the alignment
5681 requirement but not waste file space, we adjust
5682 p_offset for just this segment. (OFF_ADJUST is
5683 subtracted from OFF later.) This may put p_offset
5684 past the end of file, but that shouldn't matter. */
5685 }
5686 else
5687 off_adjust = 0;
252b5132 5688 }
b1a6d0b1
NC
5689 /* Make sure the .dynamic section is the first section in the
5690 PT_DYNAMIC segment. */
5691 else if (p->p_type == PT_DYNAMIC
5692 && m->count > 1
5693 && strcmp (m->sections[0]->name, ".dynamic") != 0)
5694 {
5695 _bfd_error_handler
871b3ab2 5696 (_("%pB: The first section in the PT_DYNAMIC segment"
63a5468a 5697 " is not the .dynamic section"),
b301b248 5698 abfd);
b1a6d0b1 5699 bfd_set_error (bfd_error_bad_value);
0a1b45a2 5700 return false;
b1a6d0b1 5701 }
3f001e84
JK
5702 /* Set the note section type to SHT_NOTE. */
5703 else if (p->p_type == PT_NOTE)
5704 for (i = 0; i < m->count; i++)
5705 elf_section_type (m->sections[i]) = SHT_NOTE;
252b5132 5706
252b5132
RH
5707 if (m->includes_filehdr)
5708 {
bf988460 5709 if (!m->p_flags_valid)
252b5132 5710 p->p_flags |= PF_R;
252b5132
RH
5711 p->p_filesz = bed->s->sizeof_ehdr;
5712 p->p_memsz = bed->s->sizeof_ehdr;
30fe1832 5713 if (p->p_type == PT_LOAD)
252b5132 5714 {
30fe1832 5715 if (m->count > 0)
252b5132 5716 {
30fe1832
AM
5717 if (p->p_vaddr < (bfd_vma) off
5718 || (!m->p_paddr_valid
5719 && p->p_paddr < (bfd_vma) off))
5720 {
5721 _bfd_error_handler
5722 (_("%pB: not enough room for program headers,"
5723 " try linking with -N"),
5724 abfd);
5725 bfd_set_error (bfd_error_bad_value);
0a1b45a2 5726 return false;
30fe1832
AM
5727 }
5728 p->p_vaddr -= off;
5729 if (!m->p_paddr_valid)
5730 p->p_paddr -= off;
252b5132 5731 }
30fe1832
AM
5732 }
5733 else if (sorted_seg_map[0]->includes_filehdr)
5734 {
5735 Elf_Internal_Phdr *filehdr = phdrs + sorted_seg_map[0]->idx;
5736 p->p_vaddr = filehdr->p_vaddr;
bf988460 5737 if (!m->p_paddr_valid)
30fe1832 5738 p->p_paddr = filehdr->p_paddr;
252b5132 5739 }
252b5132
RH
5740 }
5741
5742 if (m->includes_phdrs)
5743 {
bf988460 5744 if (!m->p_flags_valid)
252b5132 5745 p->p_flags |= PF_R;
30fe1832
AM
5746 p->p_filesz += actual * bed->s->sizeof_phdr;
5747 p->p_memsz += actual * bed->s->sizeof_phdr;
f3520d2f 5748 if (!m->includes_filehdr)
252b5132 5749 {
30fe1832 5750 if (p->p_type == PT_LOAD)
252b5132 5751 {
30fe1832
AM
5752 elf_elfheader (abfd)->e_phoff = p->p_offset;
5753 if (m->count > 0)
5754 {
5755 p->p_vaddr -= off - p->p_offset;
5756 if (!m->p_paddr_valid)
5757 p->p_paddr -= off - p->p_offset;
5758 }
5759 }
5760 else if (phdr_load_seg != NULL)
5761 {
5762 Elf_Internal_Phdr *phdr = phdrs + phdr_load_seg->idx;
502794d4 5763 bfd_vma phdr_off = 0; /* Octets. */
30fe1832
AM
5764 if (phdr_load_seg->includes_filehdr)
5765 phdr_off = bed->s->sizeof_ehdr;
5766 p->p_vaddr = phdr->p_vaddr + phdr_off;
bf988460 5767 if (!m->p_paddr_valid)
30fe1832
AM
5768 p->p_paddr = phdr->p_paddr + phdr_off;
5769 p->p_offset = phdr->p_offset + phdr_off;
252b5132 5770 }
30fe1832
AM
5771 else
5772 p->p_offset = bed->s->sizeof_ehdr;
2b0bc088 5773 }
252b5132
RH
5774 }
5775
5776 if (p->p_type == PT_LOAD
5777 || (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core))
5778 {
bf988460 5779 if (!m->includes_filehdr && !m->includes_phdrs)
0bc3450e
AM
5780 {
5781 p->p_offset = off;
5782 if (no_contents)
67641dd3
AM
5783 {
5784 /* Put meaningless p_offset for PT_LOAD segments
5785 without file contents somewhere within the first
5786 page, in an attempt to not point past EOF. */
5787 bfd_size_type align = maxpagesize;
5788 if (align < p->p_align)
5789 align = p->p_align;
5790 if (align < 1)
5791 align = 1;
5792 p->p_offset = off % align;
5793 }
0bc3450e 5794 }
252b5132
RH
5795 else
5796 {
502794d4 5797 file_ptr adjust; /* Octets. */
252b5132
RH
5798
5799 adjust = off - (p->p_offset + p->p_filesz);
bf988460
AM
5800 if (!no_contents)
5801 p->p_filesz += adjust;
252b5132
RH
5802 p->p_memsz += adjust;
5803 }
5804 }
5805
1ea63fd2
AM
5806 /* Set up p_filesz, p_memsz, p_align and p_flags from the section
5807 maps. Set filepos for sections in PT_LOAD segments, and in
5808 core files, for sections in PT_NOTE segments.
5809 assign_file_positions_for_non_load_sections will set filepos
5810 for other sections and update p_filesz for other segments. */
252b5132
RH
5811 for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
5812 {
5813 asection *sec;
252b5132 5814 bfd_size_type align;
627b32bc 5815 Elf_Internal_Shdr *this_hdr;
252b5132
RH
5816
5817 sec = *secpp;
02bf8d82 5818 this_hdr = &elf_section_data (sec)->this_hdr;
fd361982 5819 align = (bfd_size_type) 1 << bfd_section_alignment (sec);
252b5132 5820
88967714
AM
5821 if ((p->p_type == PT_LOAD
5822 || p->p_type == PT_TLS)
5823 && (this_hdr->sh_type != SHT_NOBITS
5824 || ((this_hdr->sh_flags & SHF_ALLOC) != 0
5825 && ((this_hdr->sh_flags & SHF_TLS) == 0
5826 || p->p_type == PT_TLS))))
252b5132 5827 {
502794d4
CE
5828 bfd_vma p_start = p->p_paddr; /* Octets. */
5829 bfd_vma p_end = p_start + p->p_memsz; /* Octets. */
5830 bfd_vma s_start = sec->lma * opb; /* Octets. */
5831 bfd_vma adjust = s_start - p_end; /* Octets. */
252b5132 5832
a2d1e028
L
5833 if (adjust != 0
5834 && (s_start < p_end
5835 || p_end < p_start))
252b5132 5836 {
4eca0228 5837 _bfd_error_handler
695344c0 5838 /* xgettext:c-format */
2dcf00ce 5839 (_("%pB: section %pA lma %#" PRIx64 " adjusted to %#" PRIx64),
502794d4
CE
5840 abfd, sec, (uint64_t) s_start / opb,
5841 (uint64_t) p_end / opb);
88967714 5842 adjust = 0;
502794d4 5843 sec->lma = p_end / opb;
1cfb7d1e 5844 }
3ac9b6c9 5845 p->p_memsz += adjust;
1cfb7d1e 5846
d16e3d2e 5847 if (p->p_type == PT_LOAD)
88967714 5848 {
d16e3d2e 5849 if (this_hdr->sh_type != SHT_NOBITS)
32812159 5850 {
d16e3d2e 5851 off_adjust = 0;
30fe1832
AM
5852 if (p->p_filesz + adjust < p->p_memsz)
5853 {
5854 /* We have a PROGBITS section following NOBITS ones.
5855 Allocate file space for the NOBITS section(s) and
5856 zero it. */
5857 adjust = p->p_memsz - p->p_filesz;
5858 if (!write_zeros (abfd, off, adjust))
0a1b45a2 5859 return false;
30fe1832 5860 }
d16e3d2e
AM
5861 }
5862 /* We only adjust sh_offset in SHT_NOBITS sections
5863 as would seem proper for their address when the
5864 section is first in the segment. sh_offset
5865 doesn't really have any significance for
5866 SHT_NOBITS anyway, apart from a notional position
5867 relative to other sections. Historically we
5868 didn't bother with adjusting sh_offset and some
5869 programs depend on it not being adjusted. See
5870 pr12921 and pr25662. */
5871 if (this_hdr->sh_type != SHT_NOBITS || i == 0)
5872 {
30fe1832 5873 off += adjust;
d16e3d2e
AM
5874 if (this_hdr->sh_type == SHT_NOBITS)
5875 off_adjust += adjust;
32812159 5876 }
252b5132 5877 }
d16e3d2e
AM
5878 if (this_hdr->sh_type != SHT_NOBITS)
5879 p->p_filesz += adjust;
252b5132
RH
5880 }
5881
5882 if (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core)
5883 {
b301b248
AM
5884 /* The section at i == 0 is the one that actually contains
5885 everything. */
4a938328
MS
5886 if (i == 0)
5887 {
627b32bc 5888 this_hdr->sh_offset = sec->filepos = off;
6a3cd2b4
AM
5889 off += this_hdr->sh_size;
5890 p->p_filesz = this_hdr->sh_size;
b301b248
AM
5891 p->p_memsz = 0;
5892 p->p_align = 1;
252b5132 5893 }
4a938328 5894 else
252b5132 5895 {
b301b248 5896 /* The rest are fake sections that shouldn't be written. */
252b5132 5897 sec->filepos = 0;
eea6121a 5898 sec->size = 0;
b301b248
AM
5899 sec->flags = 0;
5900 continue;
252b5132 5901 }
252b5132
RH
5902 }
5903 else
5904 {
1e951488 5905 if (p->p_type == PT_LOAD)
b301b248 5906 {
1e951488
AM
5907 this_hdr->sh_offset = sec->filepos = off;
5908 if (this_hdr->sh_type != SHT_NOBITS)
5909 off += this_hdr->sh_size;
5910 }
5911 else if (this_hdr->sh_type == SHT_NOBITS
5912 && (this_hdr->sh_flags & SHF_TLS) != 0
5913 && this_hdr->sh_offset == 0)
5914 {
5915 /* This is a .tbss section that didn't get a PT_LOAD.
5916 (See _bfd_elf_map_sections_to_segments "Create a
5917 final PT_LOAD".) Set sh_offset to the value it
5918 would have if we had created a zero p_filesz and
5919 p_memsz PT_LOAD header for the section. This
5920 also makes the PT_TLS header have the same
5921 p_offset value. */
5922 bfd_vma adjust = vma_page_aligned_bias (this_hdr->sh_addr,
5923 off, align);
5924 this_hdr->sh_offset = sec->filepos = off + adjust;
b301b248 5925 }
252b5132 5926
02bf8d82 5927 if (this_hdr->sh_type != SHT_NOBITS)
b301b248 5928 {
6a3cd2b4 5929 p->p_filesz += this_hdr->sh_size;
02bf8d82
AM
5930 /* A load section without SHF_ALLOC is something like
5931 a note section in a PT_NOTE segment. These take
5932 file space but are not loaded into memory. */
5933 if ((this_hdr->sh_flags & SHF_ALLOC) != 0)
6a3cd2b4 5934 p->p_memsz += this_hdr->sh_size;
b301b248 5935 }
6a3cd2b4 5936 else if ((this_hdr->sh_flags & SHF_ALLOC) != 0)
13ae64f3 5937 {
6a3cd2b4
AM
5938 if (p->p_type == PT_TLS)
5939 p->p_memsz += this_hdr->sh_size;
5940
5941 /* .tbss is special. It doesn't contribute to p_memsz of
5942 normal segments. */
5943 else if ((this_hdr->sh_flags & SHF_TLS) == 0)
5944 p->p_memsz += this_hdr->sh_size;
13ae64f3
JJ
5945 }
5946
b10a8ae0
L
5947 if (align > p->p_align
5948 && !m->p_align_valid
5949 && (p->p_type != PT_LOAD
5950 || (abfd->flags & D_PAGED) == 0))
252b5132
RH
5951 p->p_align = align;
5952 }
5953
bf988460 5954 if (!m->p_flags_valid)
252b5132
RH
5955 {
5956 p->p_flags |= PF_R;
02bf8d82 5957 if ((this_hdr->sh_flags & SHF_EXECINSTR) != 0)
252b5132 5958 p->p_flags |= PF_X;
02bf8d82 5959 if ((this_hdr->sh_flags & SHF_WRITE) != 0)
252b5132
RH
5960 p->p_flags |= PF_W;
5961 }
5962 }
43a8475c 5963
bf988460 5964 off -= off_adjust;
0920dee7 5965
30fe1832
AM
5966 /* PR ld/20815 - Check that the program header segment, if
5967 present, will be loaded into memory. */
5968 if (p->p_type == PT_PHDR
5969 && phdr_load_seg == NULL
5970 && !(bed->elf_backend_allow_non_load_phdr != NULL
5971 && bed->elf_backend_allow_non_load_phdr (abfd, phdrs, alloc)))
5972 {
5973 /* The fix for this error is usually to edit the linker script being
5974 used and set up the program headers manually. Either that or
5975 leave room for the headers at the start of the SECTIONS. */
5976 _bfd_error_handler (_("%pB: error: PHDR segment not covered"
5977 " by LOAD segment"),
5978 abfd);
7b3c2715 5979 if (link_info == NULL)
0a1b45a2 5980 return false;
7b3c2715
AM
5981 /* Arrange for the linker to exit with an error, deleting
5982 the output file unless --noinhibit-exec is given. */
5983 link_info->callbacks->info ("%X");
30fe1832
AM
5984 }
5985
7c928300
AM
5986 /* Check that all sections are in a PT_LOAD segment.
5987 Don't check funky gdb generated core files. */
5988 if (p->p_type == PT_LOAD && bfd_get_format (abfd) != bfd_core)
9a83a553 5989 {
0a1b45a2 5990 bool check_vma = true;
9a83a553
AM
5991
5992 for (i = 1; i < m->count; i++)
5993 if (m->sections[i]->vma == m->sections[i - 1]->vma
5994 && ELF_SECTION_SIZE (&(elf_section_data (m->sections[i])
5995 ->this_hdr), p) != 0
5996 && ELF_SECTION_SIZE (&(elf_section_data (m->sections[i - 1])
5997 ->this_hdr), p) != 0)
0920dee7 5998 {
9a83a553 5999 /* Looks like we have overlays packed into the segment. */
0a1b45a2 6000 check_vma = false;
9a83a553 6001 break;
0920dee7 6002 }
9a83a553
AM
6003
6004 for (i = 0; i < m->count; i++)
6005 {
6006 Elf_Internal_Shdr *this_hdr;
6007 asection *sec;
6008
6009 sec = m->sections[i];
6010 this_hdr = &(elf_section_data(sec)->this_hdr);
86b2281f
AM
6011 if (!ELF_SECTION_IN_SEGMENT_1 (this_hdr, p, check_vma, 0)
6012 && !ELF_TBSS_SPECIAL (this_hdr, p))
9a83a553 6013 {
4eca0228 6014 _bfd_error_handler
695344c0 6015 /* xgettext:c-format */
871b3ab2 6016 (_("%pB: section `%pA' can't be allocated in segment %d"),
9a83a553
AM
6017 abfd, sec, j);
6018 print_segment_map (m);
6019 }
6020 }
74e315db
L
6021
6022 if (p_align_p)
6023 p->p_align = p_align;
9a83a553 6024 }
252b5132
RH
6025 }
6026
12bd6957 6027 elf_next_file_pos (abfd) = off;
30fe1832
AM
6028
6029 if (link_info != NULL
6030 && phdr_load_seg != NULL
6031 && phdr_load_seg->includes_filehdr)
6032 {
6033 /* There is a segment that contains both the file headers and the
6034 program headers, so provide a symbol __ehdr_start pointing there.
6035 A program can use this to examine itself robustly. */
6036
6037 struct elf_link_hash_entry *hash
6038 = elf_link_hash_lookup (elf_hash_table (link_info), "__ehdr_start",
0a1b45a2 6039 false, false, true);
30fe1832
AM
6040 /* If the symbol was referenced and not defined, define it. */
6041 if (hash != NULL
6042 && (hash->root.type == bfd_link_hash_new
6043 || hash->root.type == bfd_link_hash_undefined
6044 || hash->root.type == bfd_link_hash_undefweak
6045 || hash->root.type == bfd_link_hash_common))
6046 {
6047 asection *s = NULL;
66631823 6048 bfd_vma filehdr_vaddr = phdrs[phdr_load_seg->idx].p_vaddr / opb;
30fe1832
AM
6049
6050 if (phdr_load_seg->count != 0)
6051 /* The segment contains sections, so use the first one. */
6052 s = phdr_load_seg->sections[0];
6053 else
6054 /* Use the first (i.e. lowest-addressed) section in any segment. */
6055 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
6056 if (m->p_type == PT_LOAD && m->count != 0)
6057 {
6058 s = m->sections[0];
6059 break;
6060 }
6061
6062 if (s != NULL)
6063 {
6064 hash->root.u.def.value = filehdr_vaddr - s->vma;
6065 hash->root.u.def.section = s;
6066 }
6067 else
6068 {
6069 hash->root.u.def.value = filehdr_vaddr;
6070 hash->root.u.def.section = bfd_abs_section_ptr;
6071 }
6072
6073 hash->root.type = bfd_link_hash_defined;
6074 hash->def_regular = 1;
6075 hash->non_elf = 0;
6076 }
6077 }
6078
0a1b45a2 6079 return true;
f3520d2f
AM
6080}
6081
1faa385f
NC
6082/* Determine if a bfd is a debuginfo file. Unfortunately there
6083 is no defined method for detecting such files, so we have to
6084 use heuristics instead. */
6085
0a1b45a2 6086bool
1faa385f
NC
6087is_debuginfo_file (bfd *abfd)
6088{
6089 if (abfd == NULL || bfd_get_flavour (abfd) != bfd_target_elf_flavour)
0a1b45a2 6090 return false;
1faa385f
NC
6091
6092 Elf_Internal_Shdr **start_headers = elf_elfsections (abfd);
6093 Elf_Internal_Shdr **end_headers = start_headers + elf_numsections (abfd);
6094 Elf_Internal_Shdr **headerp;
6095
6096 for (headerp = start_headers; headerp < end_headers; headerp ++)
6097 {
6098 Elf_Internal_Shdr *header = * headerp;
6099
6100 /* Debuginfo files do not have any allocated SHT_PROGBITS sections.
6101 The only allocated sections are SHT_NOBITS or SHT_NOTES. */
6102 if ((header->sh_flags & SHF_ALLOC) == SHF_ALLOC
6103 && header->sh_type != SHT_NOBITS
6104 && header->sh_type != SHT_NOTE)
0a1b45a2 6105 return false;
1faa385f
NC
6106 }
6107
0a1b45a2 6108 return true;
1faa385f
NC
6109}
6110
1ff6de03
NA
6111/* Assign file positions for the other sections, except for compressed debugging
6112 and other sections assigned in _bfd_elf_assign_file_positions_for_non_load(). */
f3520d2f 6113
0a1b45a2 6114static bool
f3520d2f
AM
6115assign_file_positions_for_non_load_sections (bfd *abfd,
6116 struct bfd_link_info *link_info)
6117{
6118 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
6119 Elf_Internal_Shdr **i_shdrpp;
e06efbf1 6120 Elf_Internal_Shdr **hdrpp, **end_hdrpp;
f3520d2f
AM
6121 Elf_Internal_Phdr *phdrs;
6122 Elf_Internal_Phdr *p;
6123 struct elf_segment_map *m;
f3520d2f 6124 file_ptr off;
66631823 6125 unsigned int opb = bfd_octets_per_byte (abfd, NULL);
c410035d 6126 bfd_vma maxpagesize;
f3520d2f 6127
c410035d
AM
6128 if (link_info != NULL)
6129 maxpagesize = link_info->maxpagesize;
6130 else
6131 maxpagesize = bed->maxpagesize;
5c182d5f 6132 i_shdrpp = elf_elfsections (abfd);
e06efbf1 6133 end_hdrpp = i_shdrpp + elf_numsections (abfd);
12bd6957 6134 off = elf_next_file_pos (abfd);
e06efbf1 6135 for (hdrpp = i_shdrpp + 1; hdrpp < end_hdrpp; hdrpp++)
5c182d5f 6136 {
5c182d5f
AM
6137 Elf_Internal_Shdr *hdr;
6138
6139 hdr = *hdrpp;
6140 if (hdr->bfd_section != NULL
252e386e
AM
6141 && (hdr->bfd_section->filepos != 0
6142 || (hdr->sh_type == SHT_NOBITS
6143 && hdr->contents == NULL)))
627b32bc 6144 BFD_ASSERT (hdr->sh_offset == hdr->bfd_section->filepos);
5c182d5f
AM
6145 else if ((hdr->sh_flags & SHF_ALLOC) != 0)
6146 {
1faa385f
NC
6147 if (hdr->sh_size != 0
6148 /* PR 24717 - debuginfo files are known to be not strictly
6149 compliant with the ELF standard. In particular they often
6150 have .note.gnu.property sections that are outside of any
6151 loadable segment. This is not a problem for such files,
6152 so do not warn about them. */
6153 && ! is_debuginfo_file (abfd))
4eca0228 6154 _bfd_error_handler
695344c0 6155 /* xgettext:c-format */
871b3ab2 6156 (_("%pB: warning: allocated section `%s' not in segment"),
e8d2ba53
AM
6157 abfd,
6158 (hdr->bfd_section == NULL
6159 ? "*unknown*"
6160 : hdr->bfd_section->name));
3ba71138
L
6161 /* We don't need to page align empty sections. */
6162 if ((abfd->flags & D_PAGED) != 0 && hdr->sh_size != 0)
5c182d5f 6163 off += vma_page_aligned_bias (hdr->sh_addr, off,
c410035d 6164 maxpagesize);
5c182d5f
AM
6165 else
6166 off += vma_page_aligned_bias (hdr->sh_addr, off,
6167 hdr->sh_addralign);
6168 off = _bfd_elf_assign_file_position_for_section (hdr, off,
0a1b45a2 6169 false);
5c182d5f
AM
6170 }
6171 else if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
6172 && hdr->bfd_section == NULL)
1ff6de03
NA
6173 /* We don't know the offset of these sections yet: their size has
6174 not been decided. */
0ce398f1 6175 || (hdr->bfd_section != NULL
1ff6de03
NA
6176 && (hdr->bfd_section->flags & SEC_ELF_COMPRESS
6177 || (bfd_section_is_ctf (hdr->bfd_section)
6178 && abfd->is_linker_output)))
12bd6957 6179 || hdr == i_shdrpp[elf_onesymtab (abfd)]
6a40cf0c
NC
6180 || (elf_symtab_shndx_list (abfd) != NULL
6181 && hdr == i_shdrpp[elf_symtab_shndx_list (abfd)->ndx])
3e19fb8f
L
6182 || hdr == i_shdrpp[elf_strtab_sec (abfd)]
6183 || hdr == i_shdrpp[elf_shstrtab_sec (abfd)])
5c182d5f
AM
6184 hdr->sh_offset = -1;
6185 else
0a1b45a2 6186 off = _bfd_elf_assign_file_position_for_section (hdr, off, true);
5c182d5f 6187 }
30fe1832 6188 elf_next_file_pos (abfd) = off;
5c182d5f 6189
252b5132
RH
6190 /* Now that we have set the section file positions, we can set up
6191 the file positions for the non PT_LOAD segments. */
f3520d2f 6192 phdrs = elf_tdata (abfd)->phdr;
12bd6957 6193 for (m = elf_seg_map (abfd), p = phdrs; m != NULL; m = m->next, p++)
252b5132 6194 {
129af99f 6195 if (p->p_type == PT_GNU_RELRO)
252b5132 6196 {
66631823 6197 bfd_vma start, end; /* Bytes. */
0a1b45a2 6198 bool ok;
1ea63fd2 6199
129af99f 6200 if (link_info != NULL)
8c37241b 6201 {
129af99f 6202 /* During linking the range of the RELRO segment is passed
f2731e0c
AM
6203 in link_info. Note that there may be padding between
6204 relro_start and the first RELRO section. */
6205 start = link_info->relro_start;
6206 end = link_info->relro_end;
6207 }
6208 else if (m->count != 0)
6209 {
6210 if (!m->p_size_valid)
6211 abort ();
6212 start = m->sections[0]->vma;
66631823 6213 end = start + m->p_size / opb;
f2731e0c
AM
6214 }
6215 else
6216 {
6217 start = 0;
6218 end = 0;
6219 }
6220
0a1b45a2 6221 ok = false;
f2731e0c
AM
6222 if (start < end)
6223 {
6224 struct elf_segment_map *lm;
6225 const Elf_Internal_Phdr *lp;
6226 unsigned int i;
6227
6228 /* Find a LOAD segment containing a section in the RELRO
6229 segment. */
12bd6957 6230 for (lm = elf_seg_map (abfd), lp = phdrs;
3146fac4
AM
6231 lm != NULL;
6232 lm = lm->next, lp++)
8c37241b
JJ
6233 {
6234 if (lp->p_type == PT_LOAD
3146fac4 6235 && lm->count != 0
dbc88fc1
AM
6236 && (lm->sections[lm->count - 1]->vma
6237 + (!IS_TBSS (lm->sections[lm->count - 1])
66631823 6238 ? lm->sections[lm->count - 1]->size / opb
dbc88fc1 6239 : 0)) > start
f2731e0c 6240 && lm->sections[0]->vma < end)
8c37241b
JJ
6241 break;
6242 }
f2731e0c 6243
01f7e10c 6244 if (lm != NULL)
129af99f 6245 {
01f7e10c
AM
6246 /* Find the section starting the RELRO segment. */
6247 for (i = 0; i < lm->count; i++)
6248 {
6249 asection *s = lm->sections[i];
6250 if (s->vma >= start
6251 && s->vma < end
6252 && s->size != 0)
6253 break;
6254 }
6255
6256 if (i < lm->count)
6257 {
502794d4
CE
6258 p->p_vaddr = lm->sections[i]->vma * opb;
6259 p->p_paddr = lm->sections[i]->lma * opb;
01f7e10c 6260 p->p_offset = lm->sections[i]->filepos;
66631823 6261 p->p_memsz = end * opb - p->p_vaddr;
01f7e10c
AM
6262 p->p_filesz = p->p_memsz;
6263
6264 /* The RELRO segment typically ends a few bytes
6265 into .got.plt but other layouts are possible.
6266 In cases where the end does not match any
6267 loaded section (for instance is in file
6268 padding), trim p_filesz back to correspond to
6269 the end of loaded section contents. */
6270 if (p->p_filesz > lp->p_vaddr + lp->p_filesz - p->p_vaddr)
6271 p->p_filesz = lp->p_vaddr + lp->p_filesz - p->p_vaddr;
6272
6273 /* Preserve the alignment and flags if they are
6274 valid. The gold linker generates RW/4 for
6275 the PT_GNU_RELRO section. It is better for
6276 objcopy/strip to honor these attributes
6277 otherwise gdb will choke when using separate
6278 debug files. */
6279 if (!m->p_align_valid)
6280 p->p_align = 1;
6281 if (!m->p_flags_valid)
6282 p->p_flags = PF_R;
0a1b45a2 6283 ok = true;
01f7e10c 6284 }
129af99f 6285 }
b84a33b5 6286 }
ee9e412f 6287
01f7e10c 6288 if (!ok)
ee9e412f
NC
6289 {
6290 if (link_info != NULL)
6291 _bfd_error_handler
6292 (_("%pB: warning: unable to allocate any sections to PT_GNU_RELRO segment"),
6293 abfd);
6294 memset (p, 0, sizeof *p);
6295 }
129af99f 6296 }
04c3a755
NS
6297 else if (p->p_type == PT_GNU_STACK)
6298 {
6299 if (m->p_size_valid)
6300 p->p_memsz = m->p_size;
6301 }
129af99f
AS
6302 else if (m->count != 0)
6303 {
e06efbf1 6304 unsigned int i;
1a9ccd70 6305
129af99f
AS
6306 if (p->p_type != PT_LOAD
6307 && (p->p_type != PT_NOTE
6308 || bfd_get_format (abfd) != bfd_core))
6309 {
1a9ccd70
NC
6310 /* A user specified segment layout may include a PHDR
6311 segment that overlaps with a LOAD segment... */
6312 if (p->p_type == PT_PHDR)
6313 {
6314 m->count = 0;
6315 continue;
6316 }
6317
c86934ce
NC
6318 if (m->includes_filehdr || m->includes_phdrs)
6319 {
b1fa9dd6 6320 /* PR 17512: file: 2195325e. */
4eca0228 6321 _bfd_error_handler
871b3ab2 6322 (_("%pB: error: non-load segment %d includes file header "
76cfced5
AM
6323 "and/or program header"),
6324 abfd, (int) (p - phdrs));
0a1b45a2 6325 return false;
c86934ce 6326 }
129af99f 6327
86b2281f 6328 p->p_filesz = 0;
129af99f 6329 p->p_offset = m->sections[0]->filepos;
86b2281f
AM
6330 for (i = m->count; i-- != 0;)
6331 {
6332 asection *sect = m->sections[i];
6333 Elf_Internal_Shdr *hdr = &elf_section_data (sect)->this_hdr;
6334 if (hdr->sh_type != SHT_NOBITS)
6335 {
aebb3d54 6336 p->p_filesz = sect->filepos - p->p_offset + hdr->sh_size;
9917b559
L
6337 /* NB: p_memsz of the loadable PT_NOTE segment
6338 should be the same as p_filesz. */
6339 if (p->p_type == PT_NOTE
6340 && (hdr->sh_flags & SHF_ALLOC) != 0)
6341 p->p_memsz = p->p_filesz;
86b2281f
AM
6342 break;
6343 }
6344 }
129af99f
AS
6345 }
6346 }
252b5132
RH
6347 }
6348
0a1b45a2 6349 return true;
252b5132
RH
6350}
6351
6a40cf0c
NC
6352static elf_section_list *
6353find_section_in_list (unsigned int i, elf_section_list * list)
6354{
6355 for (;list != NULL; list = list->next)
6356 if (list->ndx == i)
6357 break;
6358 return list;
6359}
6360
252b5132
RH
6361/* Work out the file positions of all the sections. This is called by
6362 _bfd_elf_compute_section_file_positions. All the section sizes and
6363 VMAs must be known before this is called.
6364
e0638f70 6365 Reloc sections come in two flavours: Those processed specially as
1ff6de03
NA
6366 "side-channel" data attached to a section to which they apply, and those that
6367 bfd doesn't process as relocations. The latter sort are stored in a normal
6368 bfd section by bfd_section_from_shdr. We don't consider the former sort
6369 here, unless they form part of the loadable image. Reloc sections not
6370 assigned here (and compressed debugging sections and CTF sections which
6371 nothing else in the file can rely upon) will be handled later by
e0638f70 6372 assign_file_positions_for_relocs.
252b5132
RH
6373
6374 We also don't set the positions of the .symtab and .strtab here. */
6375
0a1b45a2 6376static bool
c84fca4d
AO
6377assign_file_positions_except_relocs (bfd *abfd,
6378 struct bfd_link_info *link_info)
252b5132 6379{
5c182d5f
AM
6380 struct elf_obj_tdata *tdata = elf_tdata (abfd);
6381 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
9c5bfbb7 6382 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
6d6c25c8 6383 unsigned int alloc;
252b5132
RH
6384
6385 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0
6386 && bfd_get_format (abfd) != bfd_core)
6387 {
5c182d5f
AM
6388 Elf_Internal_Shdr ** const i_shdrpp = elf_elfsections (abfd);
6389 unsigned int num_sec = elf_numsections (abfd);
252b5132
RH
6390 Elf_Internal_Shdr **hdrpp;
6391 unsigned int i;
a485e98e 6392 file_ptr off;
252b5132
RH
6393
6394 /* Start after the ELF header. */
6395 off = i_ehdrp->e_ehsize;
6396
6397 /* We are not creating an executable, which means that we are
6398 not creating a program header, and that the actual order of
6399 the sections in the file is unimportant. */
9ad5cbcf 6400 for (i = 1, hdrpp = i_shdrpp + 1; i < num_sec; i++, hdrpp++)
252b5132
RH
6401 {
6402 Elf_Internal_Shdr *hdr;
6403
6404 hdr = *hdrpp;
e0638f70
AM
6405 if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
6406 && hdr->bfd_section == NULL)
1ff6de03
NA
6407 /* Do not assign offsets for these sections yet: we don't know
6408 their sizes. */
0ce398f1 6409 || (hdr->bfd_section != NULL
1ff6de03
NA
6410 && (hdr->bfd_section->flags & SEC_ELF_COMPRESS
6411 || (bfd_section_is_ctf (hdr->bfd_section)
6412 && abfd->is_linker_output)))
12bd6957 6413 || i == elf_onesymtab (abfd)
6a40cf0c
NC
6414 || (elf_symtab_shndx_list (abfd) != NULL
6415 && hdr == i_shdrpp[elf_symtab_shndx_list (abfd)->ndx])
3e19fb8f
L
6416 || i == elf_strtab_sec (abfd)
6417 || i == elf_shstrtab_sec (abfd))
252b5132
RH
6418 {
6419 hdr->sh_offset = -1;
252b5132 6420 }
9ad5cbcf 6421 else
0a1b45a2 6422 off = _bfd_elf_assign_file_position_for_section (hdr, off, true);
252b5132 6423 }
a485e98e
AM
6424
6425 elf_next_file_pos (abfd) = off;
6d6c25c8 6426 elf_program_header_size (abfd) = 0;
252b5132
RH
6427 }
6428 else
6429 {
252b5132 6430 /* Assign file positions for the loaded sections based on the
08a40648 6431 assignment of sections to segments. */
f3520d2f 6432 if (!assign_file_positions_for_load_sections (abfd, link_info))
0a1b45a2 6433 return false;
f3520d2f
AM
6434
6435 /* And for non-load sections. */
6436 if (!assign_file_positions_for_non_load_sections (abfd, link_info))
0a1b45a2 6437 return false;
6d6c25c8 6438 }
f3520d2f 6439
6d6c25c8 6440 if (!(*bed->elf_backend_modify_headers) (abfd, link_info))
0a1b45a2 6441 return false;
1a9ccd70 6442
6d6c25c8
AM
6443 /* Write out the program headers. */
6444 alloc = i_ehdrp->e_phnum;
6445 if (alloc != 0)
6446 {
30fe1832 6447 if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0
cd584857 6448 || bed->s->write_out_phdrs (abfd, tdata->phdr, alloc) != 0)
0a1b45a2 6449 return false;
252b5132
RH
6450 }
6451
0a1b45a2 6452 return true;
252b5132
RH
6453}
6454
0a1b45a2 6455bool
ed7e9d0b
AM
6456_bfd_elf_init_file_header (bfd *abfd,
6457 struct bfd_link_info *info ATTRIBUTE_UNUSED)
252b5132 6458{
3d540e93 6459 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form. */
2b0f7ef9 6460 struct elf_strtab_hash *shstrtab;
9c5bfbb7 6461 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132
RH
6462
6463 i_ehdrp = elf_elfheader (abfd);
252b5132 6464
2b0f7ef9 6465 shstrtab = _bfd_elf_strtab_init ();
252b5132 6466 if (shstrtab == NULL)
0a1b45a2 6467 return false;
252b5132
RH
6468
6469 elf_shstrtab (abfd) = shstrtab;
6470
6471 i_ehdrp->e_ident[EI_MAG0] = ELFMAG0;
6472 i_ehdrp->e_ident[EI_MAG1] = ELFMAG1;
6473 i_ehdrp->e_ident[EI_MAG2] = ELFMAG2;
6474 i_ehdrp->e_ident[EI_MAG3] = ELFMAG3;
6475
6476 i_ehdrp->e_ident[EI_CLASS] = bed->s->elfclass;
6477 i_ehdrp->e_ident[EI_DATA] =
6478 bfd_big_endian (abfd) ? ELFDATA2MSB : ELFDATA2LSB;
6479 i_ehdrp->e_ident[EI_VERSION] = bed->s->ev_current;
6480
252b5132
RH
6481 if ((abfd->flags & DYNAMIC) != 0)
6482 i_ehdrp->e_type = ET_DYN;
6483 else if ((abfd->flags & EXEC_P) != 0)
6484 i_ehdrp->e_type = ET_EXEC;
6485 else if (bfd_get_format (abfd) == bfd_core)
6486 i_ehdrp->e_type = ET_CORE;
6487 else
6488 i_ehdrp->e_type = ET_REL;
6489
6490 switch (bfd_get_arch (abfd))
6491 {
6492 case bfd_arch_unknown:
6493 i_ehdrp->e_machine = EM_NONE;
6494 break;
aa4f99bb
AO
6495
6496 /* There used to be a long list of cases here, each one setting
6497 e_machine to the same EM_* macro #defined as ELF_MACHINE_CODE
6498 in the corresponding bfd definition. To avoid duplication,
6499 the switch was removed. Machines that need special handling
6500 can generally do it in elf_backend_final_write_processing(),
6501 unless they need the information earlier than the final write.
6502 Such need can generally be supplied by replacing the tests for
6503 e_machine with the conditions used to determine it. */
252b5132 6504 default:
9c5bfbb7
AM
6505 i_ehdrp->e_machine = bed->elf_machine_code;
6506 }
aa4f99bb 6507
252b5132
RH
6508 i_ehdrp->e_version = bed->s->ev_current;
6509 i_ehdrp->e_ehsize = bed->s->sizeof_ehdr;
6510
c044fabd 6511 /* No program header, for now. */
252b5132
RH
6512 i_ehdrp->e_phoff = 0;
6513 i_ehdrp->e_phentsize = 0;
6514 i_ehdrp->e_phnum = 0;
6515
c044fabd 6516 /* Each bfd section is section header entry. */
252b5132
RH
6517 i_ehdrp->e_entry = bfd_get_start_address (abfd);
6518 i_ehdrp->e_shentsize = bed->s->sizeof_shdr;
6519
252b5132 6520 elf_tdata (abfd)->symtab_hdr.sh_name =
0a1b45a2 6521 (unsigned int) _bfd_elf_strtab_add (shstrtab, ".symtab", false);
252b5132 6522 elf_tdata (abfd)->strtab_hdr.sh_name =
0a1b45a2 6523 (unsigned int) _bfd_elf_strtab_add (shstrtab, ".strtab", false);
252b5132 6524 elf_tdata (abfd)->shstrtab_hdr.sh_name =
0a1b45a2 6525 (unsigned int) _bfd_elf_strtab_add (shstrtab, ".shstrtab", false);
252b5132 6526 if (elf_tdata (abfd)->symtab_hdr.sh_name == (unsigned int) -1
17ca87fc 6527 || elf_tdata (abfd)->strtab_hdr.sh_name == (unsigned int) -1
252b5132 6528 || elf_tdata (abfd)->shstrtab_hdr.sh_name == (unsigned int) -1)
0a1b45a2 6529 return false;
252b5132 6530
0a1b45a2 6531 return true;
252b5132
RH
6532}
6533
6d6c25c8
AM
6534/* Set e_type in ELF header to ET_EXEC for -pie -Ttext-segment=.
6535
6536 FIXME: We used to have code here to sort the PT_LOAD segments into
6537 ascending order, as per the ELF spec. But this breaks some programs,
6538 including the Linux kernel. But really either the spec should be
6539 changed or the programs updated. */
6540
0a1b45a2 6541bool
6d6c25c8
AM
6542_bfd_elf_modify_headers (bfd *obfd, struct bfd_link_info *link_info)
6543{
6544 if (link_info != NULL && bfd_link_pie (link_info))
6545 {
6546 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (obfd);
6547 unsigned int num_segments = i_ehdrp->e_phnum;
6548 struct elf_obj_tdata *tdata = elf_tdata (obfd);
6549 Elf_Internal_Phdr *segment = tdata->phdr;
6550 Elf_Internal_Phdr *end_segment = &segment[num_segments];
6551
6552 /* Find the lowest p_vaddr in PT_LOAD segments. */
6553 bfd_vma p_vaddr = (bfd_vma) -1;
6554 for (; segment < end_segment; segment++)
6555 if (segment->p_type == PT_LOAD && p_vaddr > segment->p_vaddr)
6556 p_vaddr = segment->p_vaddr;
6557
6558 /* Set e_type to ET_EXEC if the lowest p_vaddr in PT_LOAD
6559 segments is non-zero. */
6560 if (p_vaddr)
6561 i_ehdrp->e_type = ET_EXEC;
6562 }
0a1b45a2 6563 return true;
6d6c25c8
AM
6564}
6565
252b5132 6566/* Assign file positions for all the reloc sections which are not part
a485e98e 6567 of the loadable file image, and the file position of section headers. */
252b5132 6568
0a1b45a2 6569static bool
0ce398f1 6570_bfd_elf_assign_file_positions_for_non_load (bfd *abfd)
252b5132
RH
6571{
6572 file_ptr off;
e06efbf1 6573 Elf_Internal_Shdr **shdrpp, **end_shdrpp;
3e19fb8f 6574 Elf_Internal_Shdr *shdrp;
a485e98e
AM
6575 Elf_Internal_Ehdr *i_ehdrp;
6576 const struct elf_backend_data *bed;
252b5132 6577
12bd6957 6578 off = elf_next_file_pos (abfd);
252b5132 6579
e06efbf1
L
6580 shdrpp = elf_elfsections (abfd);
6581 end_shdrpp = shdrpp + elf_numsections (abfd);
6582 for (shdrpp++; shdrpp < end_shdrpp; shdrpp++)
252b5132 6583 {
252b5132 6584 shdrp = *shdrpp;
0ce398f1
L
6585 if (shdrp->sh_offset == -1)
6586 {
3e19fb8f 6587 asection *sec = shdrp->bfd_section;
0a1b45a2
AM
6588 bool is_rel = (shdrp->sh_type == SHT_REL
6589 || shdrp->sh_type == SHT_RELA);
6590 bool is_ctf = sec && bfd_section_is_ctf (sec);
0ce398f1 6591 if (is_rel
1ff6de03 6592 || is_ctf
3e19fb8f 6593 || (sec != NULL && (sec->flags & SEC_ELF_COMPRESS)))
0ce398f1 6594 {
1ff6de03 6595 if (!is_rel && !is_ctf)
0ce398f1 6596 {
3e19fb8f
L
6597 const char *name = sec->name;
6598 struct bfd_elf_section_data *d;
6599
0ce398f1 6600 /* Compress DWARF debug sections. */
3e19fb8f 6601 if (!bfd_compress_section (abfd, sec,
0ce398f1 6602 shdrp->contents))
0a1b45a2 6603 return false;
3e19fb8f
L
6604
6605 if (sec->compress_status == COMPRESS_SECTION_DONE
6606 && (abfd->flags & BFD_COMPRESS_GABI) == 0)
6607 {
6608 /* If section is compressed with zlib-gnu, convert
6609 section name from .debug_* to .zdebug_*. */
6610 char *new_name
6611 = convert_debug_to_zdebug (abfd, name);
6612 if (new_name == NULL)
0a1b45a2 6613 return false;
3e19fb8f
L
6614 name = new_name;
6615 }
dd905818 6616 /* Add section name to section name section. */
3e19fb8f
L
6617 if (shdrp->sh_name != (unsigned int) -1)
6618 abort ();
6619 shdrp->sh_name
6620 = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
0a1b45a2 6621 name, false);
3e19fb8f
L
6622 d = elf_section_data (sec);
6623
dd905818 6624 /* Add reloc section name to section name section. */
3e19fb8f
L
6625 if (d->rel.hdr
6626 && !_bfd_elf_set_reloc_sh_name (abfd,
6627 d->rel.hdr,
0a1b45a2
AM
6628 name, false))
6629 return false;
3e19fb8f
L
6630 if (d->rela.hdr
6631 && !_bfd_elf_set_reloc_sh_name (abfd,
6632 d->rela.hdr,
0a1b45a2
AM
6633 name, true))
6634 return false;
3e19fb8f 6635
0ce398f1 6636 /* Update section size and contents. */
3e19fb8f
L
6637 shdrp->sh_size = sec->size;
6638 shdrp->contents = sec->contents;
0ce398f1
L
6639 shdrp->bfd_section->contents = NULL;
6640 }
1ff6de03
NA
6641 else if (is_ctf)
6642 {
6643 /* Update section size and contents. */
6644 shdrp->sh_size = sec->size;
6645 shdrp->contents = sec->contents;
6646 }
6647
0ce398f1
L
6648 off = _bfd_elf_assign_file_position_for_section (shdrp,
6649 off,
0a1b45a2 6650 true);
0ce398f1
L
6651 }
6652 }
252b5132
RH
6653 }
6654
3e19fb8f
L
6655 /* Place section name section after DWARF debug sections have been
6656 compressed. */
6657 _bfd_elf_strtab_finalize (elf_shstrtab (abfd));
6658 shdrp = &elf_tdata (abfd)->shstrtab_hdr;
6659 shdrp->sh_size = _bfd_elf_strtab_size (elf_shstrtab (abfd));
0a1b45a2 6660 off = _bfd_elf_assign_file_position_for_section (shdrp, off, true);
3e19fb8f
L
6661
6662 /* Place the section headers. */
a485e98e
AM
6663 i_ehdrp = elf_elfheader (abfd);
6664 bed = get_elf_backend_data (abfd);
6665 off = align_file_position (off, 1 << bed->s->log_file_align);
6666 i_ehdrp->e_shoff = off;
6667 off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize;
12bd6957 6668 elf_next_file_pos (abfd) = off;
0ce398f1 6669
0a1b45a2 6670 return true;
252b5132
RH
6671}
6672
0a1b45a2 6673bool
217aa764 6674_bfd_elf_write_object_contents (bfd *abfd)
252b5132 6675{
9c5bfbb7 6676 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 6677 Elf_Internal_Shdr **i_shdrp;
0a1b45a2 6678 bool failed;
9ad5cbcf 6679 unsigned int count, num_sec;
30e8ee25 6680 struct elf_obj_tdata *t;
252b5132
RH
6681
6682 if (! abfd->output_has_begun
217aa764 6683 && ! _bfd_elf_compute_section_file_positions (abfd, NULL))
0a1b45a2 6684 return false;
db727370
JL
6685 /* Do not rewrite ELF data when the BFD has been opened for update.
6686 abfd->output_has_begun was set to TRUE on opening, so creation of new
6687 sections, and modification of existing section sizes was restricted.
6688 This means the ELF header, program headers and section headers can't have
6689 changed.
6690 If the contents of any sections has been modified, then those changes have
6691 already been written to the BFD. */
6692 else if (abfd->direction == both_direction)
6693 {
6694 BFD_ASSERT (abfd->output_has_begun);
0a1b45a2 6695 return true;
db727370 6696 }
252b5132
RH
6697
6698 i_shdrp = elf_elfsections (abfd);
252b5132 6699
0a1b45a2 6700 failed = false;
252b5132
RH
6701 bfd_map_over_sections (abfd, bed->s->write_relocs, &failed);
6702 if (failed)
0a1b45a2 6703 return false;
252b5132 6704
0ce398f1 6705 if (!_bfd_elf_assign_file_positions_for_non_load (abfd))
0a1b45a2 6706 return false;
252b5132 6707
c044fabd 6708 /* After writing the headers, we need to write the sections too... */
9ad5cbcf
AM
6709 num_sec = elf_numsections (abfd);
6710 for (count = 1; count < num_sec; count++)
252b5132 6711 {
3e19fb8f
L
6712 i_shdrp[count]->sh_name
6713 = _bfd_elf_strtab_offset (elf_shstrtab (abfd),
6714 i_shdrp[count]->sh_name);
252b5132 6715 if (bed->elf_backend_section_processing)
75506100 6716 if (!(*bed->elf_backend_section_processing) (abfd, i_shdrp[count]))
0a1b45a2 6717 return false;
252b5132
RH
6718 if (i_shdrp[count]->contents)
6719 {
dc810e39
AM
6720 bfd_size_type amt = i_shdrp[count]->sh_size;
6721
252b5132 6722 if (bfd_seek (abfd, i_shdrp[count]->sh_offset, SEEK_SET) != 0
dc810e39 6723 || bfd_bwrite (i_shdrp[count]->contents, amt, abfd) != amt)
0a1b45a2 6724 return false;
252b5132
RH
6725 }
6726 }
6727
6728 /* Write out the section header names. */
30e8ee25 6729 t = elf_tdata (abfd);
26ae6d5e 6730 if (elf_shstrtab (abfd) != NULL
30e8ee25 6731 && (bfd_seek (abfd, t->shstrtab_hdr.sh_offset, SEEK_SET) != 0
08a40648 6732 || !_bfd_elf_strtab_emit (abfd, elf_shstrtab (abfd))))
0a1b45a2 6733 return false;
252b5132 6734
cc364be6 6735 if (!(*bed->elf_backend_final_write_processing) (abfd))
0a1b45a2 6736 return false;
252b5132 6737
ff59fc36 6738 if (!bed->s->write_shdrs_and_ehdr (abfd))
0a1b45a2 6739 return false;
ff59fc36
RM
6740
6741 /* This is last since write_shdrs_and_ehdr can touch i_shdrp[0]. */
c0355132
AM
6742 if (t->o->build_id.after_write_object_contents != NULL)
6743 return (*t->o->build_id.after_write_object_contents) (abfd);
ff59fc36 6744
0a1b45a2 6745 return true;
252b5132
RH
6746}
6747
0a1b45a2 6748bool
217aa764 6749_bfd_elf_write_corefile_contents (bfd *abfd)
252b5132 6750{
c044fabd 6751 /* Hopefully this can be done just like an object file. */
252b5132
RH
6752 return _bfd_elf_write_object_contents (abfd);
6753}
c044fabd
KH
6754
6755/* Given a section, search the header to find them. */
6756
cb33740c 6757unsigned int
198beae2 6758_bfd_elf_section_from_bfd_section (bfd *abfd, struct bfd_section *asect)
252b5132 6759{
9c5bfbb7 6760 const struct elf_backend_data *bed;
91d6fa6a 6761 unsigned int sec_index;
252b5132 6762
9ad5cbcf
AM
6763 if (elf_section_data (asect) != NULL
6764 && elf_section_data (asect)->this_idx != 0)
6765 return elf_section_data (asect)->this_idx;
6766
6767 if (bfd_is_abs_section (asect))
91d6fa6a 6768 sec_index = SHN_ABS;
af746e92 6769 else if (bfd_is_com_section (asect))
91d6fa6a 6770 sec_index = SHN_COMMON;
af746e92 6771 else if (bfd_is_und_section (asect))
91d6fa6a 6772 sec_index = SHN_UNDEF;
af746e92 6773 else
91d6fa6a 6774 sec_index = SHN_BAD;
252b5132 6775
af746e92 6776 bed = get_elf_backend_data (abfd);
252b5132
RH
6777 if (bed->elf_backend_section_from_bfd_section)
6778 {
91d6fa6a 6779 int retval = sec_index;
9ad5cbcf 6780
af746e92
AM
6781 if ((*bed->elf_backend_section_from_bfd_section) (abfd, asect, &retval))
6782 return retval;
252b5132
RH
6783 }
6784
91d6fa6a 6785 if (sec_index == SHN_BAD)
af746e92 6786 bfd_set_error (bfd_error_nonrepresentable_section);
252b5132 6787
91d6fa6a 6788 return sec_index;
252b5132
RH
6789}
6790
6791/* Given a BFD symbol, return the index in the ELF symbol table, or -1
6792 on error. */
6793
6794int
217aa764 6795_bfd_elf_symbol_from_bfd_symbol (bfd *abfd, asymbol **asym_ptr_ptr)
252b5132
RH
6796{
6797 asymbol *asym_ptr = *asym_ptr_ptr;
6798 int idx;
6799 flagword flags = asym_ptr->flags;
6800
6801 /* When gas creates relocations against local labels, it creates its
6802 own symbol for the section, but does put the symbol into the
6803 symbol chain, so udata is 0. When the linker is generating
6804 relocatable output, this section symbol may be for one of the
6805 input sections rather than the output section. */
6806 if (asym_ptr->udata.i == 0
6807 && (flags & BSF_SECTION_SYM)
6808 && asym_ptr->section)
6809 {
5372391b 6810 asection *sec;
252b5132 6811
5372391b
AM
6812 sec = asym_ptr->section;
6813 if (sec->owner != abfd && sec->output_section != NULL)
6814 sec = sec->output_section;
6815 if (sec->owner == abfd
27e3da31
AM
6816 && sec->index < elf_num_section_syms (abfd)
6817 && elf_section_syms (abfd)[sec->index] != NULL)
6818 asym_ptr->udata.i = elf_section_syms (abfd)[sec->index]->udata.i;
252b5132
RH
6819 }
6820
6821 idx = asym_ptr->udata.i;
6822
6823 if (idx == 0)
6824 {
6825 /* This case can occur when using --strip-symbol on a symbol
08a40648 6826 which is used in a relocation entry. */
4eca0228 6827 _bfd_error_handler
695344c0 6828 /* xgettext:c-format */
871b3ab2 6829 (_("%pB: symbol `%s' required but not present"),
d003868e 6830 abfd, bfd_asymbol_name (asym_ptr));
252b5132
RH
6831 bfd_set_error (bfd_error_no_symbols);
6832 return -1;
6833 }
6834
6835#if DEBUG & 4
6836 {
6837 fprintf (stderr,
cd9af601
AM
6838 "elf_symbol_from_bfd_symbol 0x%.8lx, name = %s, sym num = %d, flags = 0x%.8x\n",
6839 (long) asym_ptr, asym_ptr->name, idx, flags);
252b5132
RH
6840 fflush (stderr);
6841 }
6842#endif
6843
6844 return idx;
6845}
6846
84d1d650 6847/* Rewrite program header information. */
252b5132 6848
0a1b45a2 6849static bool
c410035d 6850rewrite_elf_program_header (bfd *ibfd, bfd *obfd, bfd_vma maxpagesize)
252b5132 6851{
b34976b6
AM
6852 Elf_Internal_Ehdr *iehdr;
6853 struct elf_segment_map *map;
6854 struct elf_segment_map *map_first;
6855 struct elf_segment_map **pointer_to_map;
6856 Elf_Internal_Phdr *segment;
6857 asection *section;
6858 unsigned int i;
6859 unsigned int num_segments;
0a1b45a2
AM
6860 bool phdr_included = false;
6861 bool p_paddr_valid;
b34976b6
AM
6862 struct elf_segment_map *phdr_adjust_seg = NULL;
6863 unsigned int phdr_adjust_num = 0;
9c5bfbb7 6864 const struct elf_backend_data *bed;
502794d4 6865 unsigned int opb = bfd_octets_per_byte (ibfd, NULL);
bc67d8a6 6866
caf47ea6 6867 bed = get_elf_backend_data (ibfd);
252b5132
RH
6868 iehdr = elf_elfheader (ibfd);
6869
bc67d8a6 6870 map_first = NULL;
c044fabd 6871 pointer_to_map = &map_first;
252b5132
RH
6872
6873 num_segments = elf_elfheader (ibfd)->e_phnum;
bc67d8a6
NC
6874
6875 /* Returns the end address of the segment + 1. */
aecc8f8a
AM
6876#define SEGMENT_END(segment, start) \
6877 (start + (segment->p_memsz > segment->p_filesz \
6878 ? segment->p_memsz : segment->p_filesz))
bc67d8a6 6879
eecdbe52
JJ
6880#define SECTION_SIZE(section, segment) \
6881 (((section->flags & (SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) \
6882 != SEC_THREAD_LOCAL || segment->p_type == PT_TLS) \
eea6121a 6883 ? section->size : 0)
eecdbe52 6884
b34976b6 6885 /* Returns TRUE if the given section is contained within
bc67d8a6 6886 the given segment. VMA addresses are compared. */
502794d4
CE
6887#define IS_CONTAINED_BY_VMA(section, segment, opb) \
6888 (section->vma * (opb) >= segment->p_vaddr \
6889 && (section->vma * (opb) + SECTION_SIZE (section, segment) \
aecc8f8a 6890 <= (SEGMENT_END (segment, segment->p_vaddr))))
c044fabd 6891
b34976b6 6892 /* Returns TRUE if the given section is contained within
bc67d8a6 6893 the given segment. LMA addresses are compared. */
502794d4
CE
6894#define IS_CONTAINED_BY_LMA(section, segment, base, opb) \
6895 (section->lma * (opb) >= base \
6896 && (section->lma + SECTION_SIZE (section, segment) / (opb) >= section->lma) \
6897 && (section->lma * (opb) + SECTION_SIZE (section, segment) \
aecc8f8a 6898 <= SEGMENT_END (segment, base)))
252b5132 6899
0efc80c8
L
6900 /* Handle PT_NOTE segment. */
6901#define IS_NOTE(p, s) \
aecc8f8a 6902 (p->p_type == PT_NOTE \
0efc80c8 6903 && elf_section_type (s) == SHT_NOTE \
aecc8f8a 6904 && (bfd_vma) s->filepos >= p->p_offset \
cb3ff1e5 6905 && ((bfd_vma) s->filepos + s->size \
aecc8f8a 6906 <= p->p_offset + p->p_filesz))
252b5132 6907
0efc80c8
L
6908 /* Special case: corefile "NOTE" section containing regs, prpsinfo
6909 etc. */
6910#define IS_COREFILE_NOTE(p, s) \
6911 (IS_NOTE (p, s) \
6912 && bfd_get_format (ibfd) == bfd_core \
6913 && s->vma == 0 \
6914 && s->lma == 0)
6915
252b5132
RH
6916 /* The complicated case when p_vaddr is 0 is to handle the Solaris
6917 linker, which generates a PT_INTERP section with p_vaddr and
6918 p_memsz set to 0. */
aecc8f8a
AM
6919#define IS_SOLARIS_PT_INTERP(p, s) \
6920 (p->p_vaddr == 0 \
6921 && p->p_paddr == 0 \
6922 && p->p_memsz == 0 \
6923 && p->p_filesz > 0 \
6924 && (s->flags & SEC_HAS_CONTENTS) != 0 \
eea6121a 6925 && s->size > 0 \
aecc8f8a 6926 && (bfd_vma) s->filepos >= p->p_offset \
cb3ff1e5 6927 && ((bfd_vma) s->filepos + s->size \
aecc8f8a 6928 <= p->p_offset + p->p_filesz))
5c440b1e 6929
bc67d8a6
NC
6930 /* Decide if the given section should be included in the given segment.
6931 A section will be included if:
f5ffc919 6932 1. It is within the address space of the segment -- we use the LMA
08a40648 6933 if that is set for the segment and the VMA otherwise,
0efc80c8 6934 2. It is an allocated section or a NOTE section in a PT_NOTE
d324f6d6 6935 segment.
bc67d8a6 6936 3. There is an output section associated with it,
eecdbe52 6937 4. The section has not already been allocated to a previous segment.
2b05f1b7 6938 5. PT_GNU_STACK segments do not include any sections.
03394ac9 6939 6. PT_TLS segment includes only SHF_TLS sections.
6f79b219
JJ
6940 7. SHF_TLS sections are only in PT_TLS or PT_LOAD segments.
6941 8. PT_DYNAMIC should not contain empty sections at the beginning
08a40648 6942 (with the possible exception of .dynamic). */
502794d4 6943#define IS_SECTION_IN_INPUT_SEGMENT(section, segment, bed, opb) \
2b05f1b7 6944 ((((segment->p_paddr \
502794d4
CE
6945 ? IS_CONTAINED_BY_LMA (section, segment, segment->p_paddr, opb) \
6946 : IS_CONTAINED_BY_VMA (section, segment, opb)) \
2b05f1b7 6947 && (section->flags & SEC_ALLOC) != 0) \
0efc80c8 6948 || IS_NOTE (segment, section)) \
2b05f1b7
L
6949 && segment->p_type != PT_GNU_STACK \
6950 && (segment->p_type != PT_TLS \
6951 || (section->flags & SEC_THREAD_LOCAL)) \
6952 && (segment->p_type == PT_LOAD \
6953 || segment->p_type == PT_TLS \
6954 || (section->flags & SEC_THREAD_LOCAL) == 0) \
6955 && (segment->p_type != PT_DYNAMIC \
6956 || SECTION_SIZE (section, segment) > 0 \
6957 || (segment->p_paddr \
502794d4
CE
6958 ? segment->p_paddr != section->lma * (opb) \
6959 : segment->p_vaddr != section->vma * (opb)) \
fd361982 6960 || (strcmp (bfd_section_name (section), ".dynamic") == 0)) \
9933dc52 6961 && (segment->p_type != PT_LOAD || !section->segment_mark))
bc67d8a6 6962
9f17e2a6
L
6963/* If the output section of a section in the input segment is NULL,
6964 it is removed from the corresponding output segment. */
502794d4
CE
6965#define INCLUDE_SECTION_IN_SEGMENT(section, segment, bed, opb) \
6966 (IS_SECTION_IN_INPUT_SEGMENT (section, segment, bed, opb) \
9f17e2a6
L
6967 && section->output_section != NULL)
6968
b34976b6 6969 /* Returns TRUE iff seg1 starts after the end of seg2. */
b5f852ea
NC
6970#define SEGMENT_AFTER_SEGMENT(seg1, seg2, field) \
6971 (seg1->field >= SEGMENT_END (seg2, seg2->field))
6972
6973 /* Returns TRUE iff seg1 and seg2 overlap. Segments overlap iff both
6974 their VMA address ranges and their LMA address ranges overlap.
6975 It is possible to have overlapping VMA ranges without overlapping LMA
6976 ranges. RedBoot images for example can have both .data and .bss mapped
6977 to the same VMA range, but with the .data section mapped to a different
6978 LMA. */
aecc8f8a 6979#define SEGMENT_OVERLAPS(seg1, seg2) \
b5f852ea 6980 ( !(SEGMENT_AFTER_SEGMENT (seg1, seg2, p_vaddr) \
08a40648 6981 || SEGMENT_AFTER_SEGMENT (seg2, seg1, p_vaddr)) \
b5f852ea 6982 && !(SEGMENT_AFTER_SEGMENT (seg1, seg2, p_paddr) \
08a40648 6983 || SEGMENT_AFTER_SEGMENT (seg2, seg1, p_paddr)))
bc67d8a6 6984
c82ebeb7 6985 /* Initialise the segment mark field, and discard stupid alignment. */
bc67d8a6 6986 for (section = ibfd->sections; section != NULL; section = section->next)
c82ebeb7
AM
6987 {
6988 asection *o = section->output_section;
6989 if (o != NULL && o->alignment_power >= (sizeof (bfd_vma) * 8) - 1)
6990 o->alignment_power = 0;
6991 section->segment_mark = false;
6992 }
bc67d8a6 6993
5c44b38e
AM
6994 /* The Solaris linker creates program headers in which all the
6995 p_paddr fields are zero. When we try to objcopy or strip such a
6996 file, we get confused. Check for this case, and if we find it
6997 don't set the p_paddr_valid fields. */
0a1b45a2 6998 p_paddr_valid = false;
5c44b38e
AM
6999 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7000 i < num_segments;
7001 i++, segment++)
7002 if (segment->p_paddr != 0)
7003 {
0a1b45a2 7004 p_paddr_valid = true;
5c44b38e
AM
7005 break;
7006 }
7007
252b5132 7008 /* Scan through the segments specified in the program header
bc67d8a6 7009 of the input BFD. For this first scan we look for overlaps
9ad5cbcf 7010 in the loadable segments. These can be created by weird
aecc8f8a 7011 parameters to objcopy. Also, fix some solaris weirdness. */
bc67d8a6
NC
7012 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7013 i < num_segments;
c044fabd 7014 i++, segment++)
252b5132 7015 {
252b5132 7016 unsigned int j;
c044fabd 7017 Elf_Internal_Phdr *segment2;
252b5132 7018
aecc8f8a
AM
7019 if (segment->p_type == PT_INTERP)
7020 for (section = ibfd->sections; section; section = section->next)
7021 if (IS_SOLARIS_PT_INTERP (segment, section))
7022 {
7023 /* Mininal change so that the normal section to segment
4cc11e76 7024 assignment code will work. */
502794d4 7025 segment->p_vaddr = section->vma * opb;
aecc8f8a
AM
7026 break;
7027 }
7028
bc67d8a6 7029 if (segment->p_type != PT_LOAD)
b10a8ae0
L
7030 {
7031 /* Remove PT_GNU_RELRO segment. */
7032 if (segment->p_type == PT_GNU_RELRO)
7033 segment->p_type = PT_NULL;
7034 continue;
7035 }
c044fabd 7036
bc67d8a6 7037 /* Determine if this segment overlaps any previous segments. */
0067a569 7038 for (j = 0, segment2 = elf_tdata (ibfd)->phdr; j < i; j++, segment2++)
bc67d8a6
NC
7039 {
7040 bfd_signed_vma extra_length;
c044fabd 7041
bc67d8a6 7042 if (segment2->p_type != PT_LOAD
0067a569 7043 || !SEGMENT_OVERLAPS (segment, segment2))
bc67d8a6 7044 continue;
c044fabd 7045
bc67d8a6
NC
7046 /* Merge the two segments together. */
7047 if (segment2->p_vaddr < segment->p_vaddr)
7048 {
c044fabd 7049 /* Extend SEGMENT2 to include SEGMENT and then delete
08a40648 7050 SEGMENT. */
0067a569
AM
7051 extra_length = (SEGMENT_END (segment, segment->p_vaddr)
7052 - SEGMENT_END (segment2, segment2->p_vaddr));
c044fabd 7053
bc67d8a6
NC
7054 if (extra_length > 0)
7055 {
0067a569 7056 segment2->p_memsz += extra_length;
bc67d8a6
NC
7057 segment2->p_filesz += extra_length;
7058 }
c044fabd 7059
bc67d8a6 7060 segment->p_type = PT_NULL;
c044fabd 7061
bc67d8a6
NC
7062 /* Since we have deleted P we must restart the outer loop. */
7063 i = 0;
7064 segment = elf_tdata (ibfd)->phdr;
7065 break;
7066 }
7067 else
7068 {
c044fabd 7069 /* Extend SEGMENT to include SEGMENT2 and then delete
08a40648 7070 SEGMENT2. */
0067a569
AM
7071 extra_length = (SEGMENT_END (segment2, segment2->p_vaddr)
7072 - SEGMENT_END (segment, segment->p_vaddr));
c044fabd 7073
bc67d8a6
NC
7074 if (extra_length > 0)
7075 {
0067a569 7076 segment->p_memsz += extra_length;
bc67d8a6
NC
7077 segment->p_filesz += extra_length;
7078 }
c044fabd 7079
bc67d8a6
NC
7080 segment2->p_type = PT_NULL;
7081 }
7082 }
7083 }
c044fabd 7084
bc67d8a6
NC
7085 /* The second scan attempts to assign sections to segments. */
7086 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7087 i < num_segments;
0067a569 7088 i++, segment++)
bc67d8a6 7089 {
0067a569
AM
7090 unsigned int section_count;
7091 asection **sections;
7092 asection *output_section;
7093 unsigned int isec;
9933dc52
AM
7094 asection *matching_lma;
7095 asection *suggested_lma;
0067a569 7096 unsigned int j;
446f7ed5 7097 size_t amt;
0067a569 7098 asection *first_section;
bc67d8a6
NC
7099
7100 if (segment->p_type == PT_NULL)
7101 continue;
c044fabd 7102
9f17e2a6 7103 first_section = NULL;
bc67d8a6 7104 /* Compute how many sections might be placed into this segment. */
b5f852ea
NC
7105 for (section = ibfd->sections, section_count = 0;
7106 section != NULL;
7107 section = section->next)
9f17e2a6
L
7108 {
7109 /* Find the first section in the input segment, which may be
7110 removed from the corresponding output segment. */
502794d4 7111 if (IS_SECTION_IN_INPUT_SEGMENT (section, segment, bed, opb))
9f17e2a6
L
7112 {
7113 if (first_section == NULL)
7114 first_section = section;
7115 if (section->output_section != NULL)
7116 ++section_count;
7117 }
7118 }
811072d8 7119
b5f852ea
NC
7120 /* Allocate a segment map big enough to contain
7121 all of the sections we have selected. */
00bee008 7122 amt = sizeof (struct elf_segment_map) - sizeof (asection *);
446f7ed5 7123 amt += section_count * sizeof (asection *);
a50b1753 7124 map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
bc67d8a6 7125 if (map == NULL)
0a1b45a2 7126 return false;
252b5132
RH
7127
7128 /* Initialise the fields of the segment map. Default to
7129 using the physical address of the segment in the input BFD. */
0067a569
AM
7130 map->next = NULL;
7131 map->p_type = segment->p_type;
7132 map->p_flags = segment->p_flags;
bc67d8a6 7133 map->p_flags_valid = 1;
55d55ac7 7134
c410035d
AM
7135 if (map->p_type == PT_LOAD
7136 && (ibfd->flags & D_PAGED) != 0
7137 && maxpagesize > 1
7138 && segment->p_align > 1)
7139 {
7140 map->p_align = segment->p_align;
7141 if (segment->p_align > maxpagesize)
7142 map->p_align = maxpagesize;
7143 map->p_align_valid = 1;
7144 }
7145
9f17e2a6
L
7146 /* If the first section in the input segment is removed, there is
7147 no need to preserve segment physical address in the corresponding
7148 output segment. */
945c025a 7149 if (!first_section || first_section->output_section != NULL)
9f17e2a6
L
7150 {
7151 map->p_paddr = segment->p_paddr;
5c44b38e 7152 map->p_paddr_valid = p_paddr_valid;
9f17e2a6 7153 }
252b5132
RH
7154
7155 /* Determine if this segment contains the ELF file header
7156 and if it contains the program headers themselves. */
bc67d8a6
NC
7157 map->includes_filehdr = (segment->p_offset == 0
7158 && segment->p_filesz >= iehdr->e_ehsize);
bc67d8a6 7159 map->includes_phdrs = 0;
252b5132 7160
0067a569 7161 if (!phdr_included || segment->p_type != PT_LOAD)
252b5132 7162 {
bc67d8a6
NC
7163 map->includes_phdrs =
7164 (segment->p_offset <= (bfd_vma) iehdr->e_phoff
7165 && (segment->p_offset + segment->p_filesz
252b5132
RH
7166 >= ((bfd_vma) iehdr->e_phoff
7167 + iehdr->e_phnum * iehdr->e_phentsize)));
c044fabd 7168
bc67d8a6 7169 if (segment->p_type == PT_LOAD && map->includes_phdrs)
0a1b45a2 7170 phdr_included = true;
252b5132
RH
7171 }
7172
bc67d8a6 7173 if (section_count == 0)
252b5132
RH
7174 {
7175 /* Special segments, such as the PT_PHDR segment, may contain
7176 no sections, but ordinary, loadable segments should contain
1ed89aa9 7177 something. They are allowed by the ELF spec however, so only
07d6d2b8 7178 a warning is produced.
f98450c6
NC
7179 There is however the valid use case of embedded systems which
7180 have segments with p_filesz of 0 and a p_memsz > 0 to initialize
7181 flash memory with zeros. No warning is shown for that case. */
7182 if (segment->p_type == PT_LOAD
7183 && (segment->p_filesz > 0 || segment->p_memsz == 0))
7184 /* xgettext:c-format */
9793eb77
AM
7185 _bfd_error_handler
7186 (_("%pB: warning: empty loadable segment detected"
7187 " at vaddr=%#" PRIx64 ", is this intentional?"),
7188 ibfd, (uint64_t) segment->p_vaddr);
252b5132 7189
502794d4 7190 map->p_vaddr_offset = segment->p_vaddr / opb;
bc67d8a6 7191 map->count = 0;
c044fabd
KH
7192 *pointer_to_map = map;
7193 pointer_to_map = &map->next;
252b5132
RH
7194
7195 continue;
7196 }
7197
7198 /* Now scan the sections in the input BFD again and attempt
7199 to add their corresponding output sections to the segment map.
7200 The problem here is how to handle an output section which has
7201 been moved (ie had its LMA changed). There are four possibilities:
7202
7203 1. None of the sections have been moved.
7204 In this case we can continue to use the segment LMA from the
7205 input BFD.
7206
7207 2. All of the sections have been moved by the same amount.
7208 In this case we can change the segment's LMA to match the LMA
7209 of the first section.
7210
7211 3. Some of the sections have been moved, others have not.
7212 In this case those sections which have not been moved can be
7213 placed in the current segment which will have to have its size,
7214 and possibly its LMA changed, and a new segment or segments will
7215 have to be created to contain the other sections.
7216
b5f852ea 7217 4. The sections have been moved, but not by the same amount.
252b5132
RH
7218 In this case we can change the segment's LMA to match the LMA
7219 of the first section and we will have to create a new segment
7220 or segments to contain the other sections.
7221
7222 In order to save time, we allocate an array to hold the section
7223 pointers that we are interested in. As these sections get assigned
7224 to a segment, they are removed from this array. */
7225
446f7ed5
AM
7226 amt = section_count * sizeof (asection *);
7227 sections = (asection **) bfd_malloc (amt);
252b5132 7228 if (sections == NULL)
0a1b45a2 7229 return false;
252b5132
RH
7230
7231 /* Step One: Scan for segment vs section LMA conflicts.
7232 Also add the sections to the section array allocated above.
7233 Also add the sections to the current segment. In the common
7234 case, where the sections have not been moved, this means that
7235 we have completely filled the segment, and there is nothing
7236 more to do. */
252b5132 7237 isec = 0;
9933dc52
AM
7238 matching_lma = NULL;
7239 suggested_lma = NULL;
252b5132 7240
461c4b2e 7241 for (section = first_section, j = 0;
bc67d8a6
NC
7242 section != NULL;
7243 section = section->next)
252b5132 7244 {
502794d4 7245 if (INCLUDE_SECTION_IN_SEGMENT (section, segment, bed, opb))
c0f7859b 7246 {
bc67d8a6
NC
7247 output_section = section->output_section;
7248
0067a569 7249 sections[j++] = section;
252b5132
RH
7250
7251 /* The Solaris native linker always sets p_paddr to 0.
7252 We try to catch that case here, and set it to the
5e8d7549
NC
7253 correct value. Note - some backends require that
7254 p_paddr be left as zero. */
5c44b38e 7255 if (!p_paddr_valid
4455705d 7256 && segment->p_vaddr != 0
0067a569 7257 && !bed->want_p_paddr_set_to_zero
252b5132 7258 && isec == 0
bc67d8a6 7259 && output_section->lma != 0
9933dc52
AM
7260 && (align_power (segment->p_vaddr
7261 + (map->includes_filehdr
7262 ? iehdr->e_ehsize : 0)
7263 + (map->includes_phdrs
7264 ? iehdr->e_phnum * iehdr->e_phentsize
7265 : 0),
66631823
CE
7266 output_section->alignment_power * opb)
7267 == (output_section->vma * opb)))
bc67d8a6 7268 map->p_paddr = segment->p_vaddr;
252b5132
RH
7269
7270 /* Match up the physical address of the segment with the
7271 LMA address of the output section. */
502794d4
CE
7272 if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr,
7273 opb)
5e8d7549 7274 || IS_COREFILE_NOTE (segment, section)
0067a569 7275 || (bed->want_p_paddr_set_to_zero
502794d4 7276 && IS_CONTAINED_BY_VMA (output_section, segment, opb)))
252b5132 7277 {
9933dc52
AM
7278 if (matching_lma == NULL
7279 || output_section->lma < matching_lma->lma)
7280 matching_lma = output_section;
252b5132
RH
7281
7282 /* We assume that if the section fits within the segment
bc67d8a6 7283 then it does not overlap any other section within that
252b5132 7284 segment. */
0067a569
AM
7285 map->sections[isec++] = output_section;
7286 }
9933dc52
AM
7287 else if (suggested_lma == NULL)
7288 suggested_lma = output_section;
147d51c2
L
7289
7290 if (j == section_count)
7291 break;
252b5132
RH
7292 }
7293 }
7294
bc67d8a6 7295 BFD_ASSERT (j == section_count);
252b5132
RH
7296
7297 /* Step Two: Adjust the physical address of the current segment,
7298 if necessary. */
bc67d8a6 7299 if (isec == section_count)
252b5132
RH
7300 {
7301 /* All of the sections fitted within the segment as currently
7302 specified. This is the default case. Add the segment to
7303 the list of built segments and carry on to process the next
7304 program header in the input BFD. */
bc67d8a6 7305 map->count = section_count;
c044fabd
KH
7306 *pointer_to_map = map;
7307 pointer_to_map = &map->next;
08a40648 7308
5c44b38e 7309 if (p_paddr_valid
30fe1832
AM
7310 && !bed->want_p_paddr_set_to_zero)
7311 {
7312 bfd_vma hdr_size = 0;
7313 if (map->includes_filehdr)
7314 hdr_size = iehdr->e_ehsize;
7315 if (map->includes_phdrs)
7316 hdr_size += iehdr->e_phnum * iehdr->e_phentsize;
7317
7318 /* Account for padding before the first section in the
7319 segment. */
502794d4
CE
7320 map->p_vaddr_offset = ((map->p_paddr + hdr_size) / opb
7321 - matching_lma->lma);
30fe1832 7322 }
08a40648 7323
252b5132
RH
7324 free (sections);
7325 continue;
7326 }
252b5132
RH
7327 else
7328 {
9933dc52
AM
7329 /* Change the current segment's physical address to match
7330 the LMA of the first section that fitted, or if no
7331 section fitted, the first section. */
7332 if (matching_lma == NULL)
7333 matching_lma = suggested_lma;
7334
66631823 7335 map->p_paddr = matching_lma->lma * opb;
72730e0c 7336
bc67d8a6
NC
7337 /* Offset the segment physical address from the lma
7338 to allow for space taken up by elf headers. */
9933dc52 7339 if (map->includes_phdrs)
010c8431 7340 {
9933dc52
AM
7341 map->p_paddr -= iehdr->e_phnum * iehdr->e_phentsize;
7342
7343 /* iehdr->e_phnum is just an estimate of the number
7344 of program headers that we will need. Make a note
7345 here of the number we used and the segment we chose
7346 to hold these headers, so that we can adjust the
7347 offset when we know the correct value. */
7348 phdr_adjust_num = iehdr->e_phnum;
7349 phdr_adjust_seg = map;
010c8431 7350 }
252b5132 7351
9933dc52 7352 if (map->includes_filehdr)
bc67d8a6 7353 {
9933dc52
AM
7354 bfd_vma align = (bfd_vma) 1 << matching_lma->alignment_power;
7355 map->p_paddr -= iehdr->e_ehsize;
7356 /* We've subtracted off the size of headers from the
7357 first section lma, but there may have been some
7358 alignment padding before that section too. Try to
7359 account for that by adjusting the segment lma down to
7360 the same alignment. */
7361 if (segment->p_align != 0 && segment->p_align < align)
7362 align = segment->p_align;
66631823 7363 map->p_paddr &= -(align * opb);
bc67d8a6 7364 }
252b5132
RH
7365 }
7366
7367 /* Step Three: Loop over the sections again, this time assigning
caf47ea6 7368 those that fit to the current segment and removing them from the
252b5132
RH
7369 sections array; but making sure not to leave large gaps. Once all
7370 possible sections have been assigned to the current segment it is
7371 added to the list of built segments and if sections still remain
7372 to be assigned, a new segment is constructed before repeating
7373 the loop. */
7374 isec = 0;
7375 do
7376 {
bc67d8a6 7377 map->count = 0;
9933dc52 7378 suggested_lma = NULL;
252b5132
RH
7379
7380 /* Fill the current segment with sections that fit. */
bc67d8a6 7381 for (j = 0; j < section_count; j++)
252b5132 7382 {
bc67d8a6 7383 section = sections[j];
252b5132 7384
bc67d8a6 7385 if (section == NULL)
252b5132
RH
7386 continue;
7387
bc67d8a6 7388 output_section = section->output_section;
252b5132 7389
bc67d8a6 7390 BFD_ASSERT (output_section != NULL);
c044fabd 7391
502794d4
CE
7392 if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr,
7393 opb)
bc67d8a6 7394 || IS_COREFILE_NOTE (segment, section))
252b5132 7395 {
bc67d8a6 7396 if (map->count == 0)
252b5132
RH
7397 {
7398 /* If the first section in a segment does not start at
bc67d8a6
NC
7399 the beginning of the segment, then something is
7400 wrong. */
9933dc52
AM
7401 if (align_power (map->p_paddr
7402 + (map->includes_filehdr
7403 ? iehdr->e_ehsize : 0)
7404 + (map->includes_phdrs
7405 ? iehdr->e_phnum * iehdr->e_phentsize
7406 : 0),
66631823
CE
7407 output_section->alignment_power * opb)
7408 != output_section->lma * opb)
9aea1e31 7409 goto sorry;
252b5132
RH
7410 }
7411 else
7412 {
0067a569 7413 asection *prev_sec;
252b5132 7414
bc67d8a6 7415 prev_sec = map->sections[map->count - 1];
252b5132
RH
7416
7417 /* If the gap between the end of the previous section
bc67d8a6
NC
7418 and the start of this section is more than
7419 maxpagesize then we need to start a new segment. */
eea6121a 7420 if ((BFD_ALIGN (prev_sec->lma + prev_sec->size,
079e9a2f 7421 maxpagesize)
caf47ea6 7422 < BFD_ALIGN (output_section->lma, maxpagesize))
0067a569 7423 || (prev_sec->lma + prev_sec->size
079e9a2f 7424 > output_section->lma))
252b5132 7425 {
9933dc52
AM
7426 if (suggested_lma == NULL)
7427 suggested_lma = output_section;
252b5132
RH
7428
7429 continue;
7430 }
7431 }
7432
bc67d8a6 7433 map->sections[map->count++] = output_section;
252b5132
RH
7434 ++isec;
7435 sections[j] = NULL;
9933dc52 7436 if (segment->p_type == PT_LOAD)
0a1b45a2 7437 section->segment_mark = true;
0067a569 7438 }
9933dc52
AM
7439 else if (suggested_lma == NULL)
7440 suggested_lma = output_section;
252b5132
RH
7441 }
7442
beab4532
NC
7443 /* PR 23932. A corrupt input file may contain sections that cannot
7444 be assigned to any segment - because for example they have a
9984857c
NC
7445 negative size - or segments that do not contain any sections.
7446 But there are also valid reasons why a segment can be empty.
7447 So allow a count of zero. */
252b5132
RH
7448
7449 /* Add the current segment to the list of built segments. */
c044fabd
KH
7450 *pointer_to_map = map;
7451 pointer_to_map = &map->next;
252b5132 7452
bc67d8a6 7453 if (isec < section_count)
252b5132
RH
7454 {
7455 /* We still have not allocated all of the sections to
7456 segments. Create a new segment here, initialise it
7457 and carry on looping. */
00bee008 7458 amt = sizeof (struct elf_segment_map) - sizeof (asection *);
446f7ed5 7459 amt += section_count * sizeof (asection *);
5964fc3a 7460 map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
bc67d8a6 7461 if (map == NULL)
5ed6aba4
NC
7462 {
7463 free (sections);
0a1b45a2 7464 return false;
5ed6aba4 7465 }
252b5132
RH
7466
7467 /* Initialise the fields of the segment map. Set the physical
7468 physical address to the LMA of the first section that has
7469 not yet been assigned. */
0067a569
AM
7470 map->next = NULL;
7471 map->p_type = segment->p_type;
7472 map->p_flags = segment->p_flags;
7473 map->p_flags_valid = 1;
66631823 7474 map->p_paddr = suggested_lma->lma * opb;
5c44b38e 7475 map->p_paddr_valid = p_paddr_valid;
bc67d8a6 7476 map->includes_filehdr = 0;
0067a569 7477 map->includes_phdrs = 0;
252b5132 7478 }
9984857c
NC
7479
7480 continue;
7481 sorry:
7482 bfd_set_error (bfd_error_sorry);
7483 free (sections);
0a1b45a2 7484 return false;
252b5132 7485 }
bc67d8a6 7486 while (isec < section_count);
252b5132
RH
7487
7488 free (sections);
7489 }
7490
12bd6957 7491 elf_seg_map (obfd) = map_first;
bc67d8a6
NC
7492
7493 /* If we had to estimate the number of program headers that were
9ad5cbcf 7494 going to be needed, then check our estimate now and adjust
bc67d8a6
NC
7495 the offset if necessary. */
7496 if (phdr_adjust_seg != NULL)
7497 {
7498 unsigned int count;
c044fabd 7499
bc67d8a6 7500 for (count = 0, map = map_first; map != NULL; map = map->next)
c044fabd 7501 count++;
252b5132 7502
bc67d8a6
NC
7503 if (count > phdr_adjust_num)
7504 phdr_adjust_seg->p_paddr
7505 -= (count - phdr_adjust_num) * iehdr->e_phentsize;
9933dc52
AM
7506
7507 for (map = map_first; map != NULL; map = map->next)
7508 if (map->p_type == PT_PHDR)
7509 {
7510 bfd_vma adjust
7511 = phdr_adjust_seg->includes_filehdr ? iehdr->e_ehsize : 0;
7512 map->p_paddr = phdr_adjust_seg->p_paddr + adjust;
7513 break;
7514 }
bc67d8a6 7515 }
c044fabd 7516
bc67d8a6 7517#undef SEGMENT_END
eecdbe52 7518#undef SECTION_SIZE
bc67d8a6
NC
7519#undef IS_CONTAINED_BY_VMA
7520#undef IS_CONTAINED_BY_LMA
0efc80c8 7521#undef IS_NOTE
252b5132 7522#undef IS_COREFILE_NOTE
bc67d8a6 7523#undef IS_SOLARIS_PT_INTERP
9f17e2a6 7524#undef IS_SECTION_IN_INPUT_SEGMENT
bc67d8a6
NC
7525#undef INCLUDE_SECTION_IN_SEGMENT
7526#undef SEGMENT_AFTER_SEGMENT
7527#undef SEGMENT_OVERLAPS
0a1b45a2 7528 return true;
252b5132
RH
7529}
7530
74e315db
L
7531/* Return true if p_align in the ELF program header in ABFD is valid. */
7532
7533static bool
7534elf_is_p_align_valid (bfd *abfd)
7535{
7536 unsigned int i;
7537 Elf_Internal_Phdr *segment;
7538 unsigned int num_segments;
7539 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7540 bfd_size_type maxpagesize = bed->maxpagesize;
7541 bfd_size_type p_align = bed->p_align;
7542
7543 /* Return true if the default p_align value isn't set or the maximum
7544 page size is the same as the minimum page size. */
7545 if (p_align == 0 || maxpagesize == bed->minpagesize)
7546 return true;
7547
7548 /* When the default p_align value is set, p_align may be set to the
7549 default p_align value while segments are aligned to the maximum
7550 page size. In this case, the input p_align will be ignored and
7551 the maximum page size will be used to align the output segments. */
7552 segment = elf_tdata (abfd)->phdr;
7553 num_segments = elf_elfheader (abfd)->e_phnum;
7554 for (i = 0; i < num_segments; i++, segment++)
7555 if (segment->p_type == PT_LOAD
7556 && (segment->p_align != p_align
7557 || vma_page_aligned_bias (segment->p_vaddr,
7558 segment->p_offset,
7559 maxpagesize) != 0))
7560 return true;
7561
7562 return false;
7563}
7564
84d1d650
L
7565/* Copy ELF program header information. */
7566
0a1b45a2 7567static bool
84d1d650
L
7568copy_elf_program_header (bfd *ibfd, bfd *obfd)
7569{
7570 Elf_Internal_Ehdr *iehdr;
7571 struct elf_segment_map *map;
7572 struct elf_segment_map *map_first;
7573 struct elf_segment_map **pointer_to_map;
7574 Elf_Internal_Phdr *segment;
7575 unsigned int i;
7576 unsigned int num_segments;
0a1b45a2
AM
7577 bool phdr_included = false;
7578 bool p_paddr_valid;
74e315db 7579 bool p_palign_valid;
502794d4 7580 unsigned int opb = bfd_octets_per_byte (ibfd, NULL);
84d1d650
L
7581
7582 iehdr = elf_elfheader (ibfd);
7583
7584 map_first = NULL;
7585 pointer_to_map = &map_first;
7586
88967714
AM
7587 /* If all the segment p_paddr fields are zero, don't set
7588 map->p_paddr_valid. */
0a1b45a2 7589 p_paddr_valid = false;
84d1d650 7590 num_segments = elf_elfheader (ibfd)->e_phnum;
88967714
AM
7591 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7592 i < num_segments;
7593 i++, segment++)
7594 if (segment->p_paddr != 0)
7595 {
0a1b45a2 7596 p_paddr_valid = true;
88967714
AM
7597 break;
7598 }
7599
74e315db
L
7600 p_palign_valid = elf_is_p_align_valid (ibfd);
7601
84d1d650
L
7602 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7603 i < num_segments;
7604 i++, segment++)
7605 {
7606 asection *section;
7607 unsigned int section_count;
986f0783 7608 size_t amt;
84d1d650 7609 Elf_Internal_Shdr *this_hdr;
53020534 7610 asection *first_section = NULL;
a76e6f2f 7611 asection *lowest_section;
84d1d650 7612
84d1d650
L
7613 /* Compute how many sections are in this segment. */
7614 for (section = ibfd->sections, section_count = 0;
7615 section != NULL;
7616 section = section->next)
7617 {
7618 this_hdr = &(elf_section_data(section)->this_hdr);
f4638467 7619 if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
3271a814 7620 {
a76e6f2f
AM
7621 if (first_section == NULL)
7622 first_section = section;
3271a814
NS
7623 section_count++;
7624 }
84d1d650
L
7625 }
7626
7627 /* Allocate a segment map big enough to contain
7628 all of the sections we have selected. */
00bee008 7629 amt = sizeof (struct elf_segment_map) - sizeof (asection *);
986f0783 7630 amt += section_count * sizeof (asection *);
a50b1753 7631 map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
84d1d650 7632 if (map == NULL)
0a1b45a2 7633 return false;
84d1d650
L
7634
7635 /* Initialize the fields of the output segment map with the
7636 input segment. */
7637 map->next = NULL;
7638 map->p_type = segment->p_type;
7639 map->p_flags = segment->p_flags;
7640 map->p_flags_valid = 1;
7641 map->p_paddr = segment->p_paddr;
88967714 7642 map->p_paddr_valid = p_paddr_valid;
3f570048 7643 map->p_align = segment->p_align;
74e315db 7644 map->p_align_valid = p_palign_valid;
3271a814 7645 map->p_vaddr_offset = 0;
84d1d650 7646
04c3a755
NS
7647 if (map->p_type == PT_GNU_RELRO
7648 || map->p_type == PT_GNU_STACK)
b10a8ae0
L
7649 {
7650 /* The PT_GNU_RELRO segment may contain the first a few
7651 bytes in the .got.plt section even if the whole .got.plt
7652 section isn't in the PT_GNU_RELRO segment. We won't
04c3a755
NS
7653 change the size of the PT_GNU_RELRO segment.
7654 Similarly, PT_GNU_STACK size is significant on uclinux
7655 systems. */
9433b9b1 7656 map->p_size = segment->p_memsz;
b10a8ae0
L
7657 map->p_size_valid = 1;
7658 }
7659
84d1d650
L
7660 /* Determine if this segment contains the ELF file header
7661 and if it contains the program headers themselves. */
7662 map->includes_filehdr = (segment->p_offset == 0
7663 && segment->p_filesz >= iehdr->e_ehsize);
7664
7665 map->includes_phdrs = 0;
7666 if (! phdr_included || segment->p_type != PT_LOAD)
7667 {
7668 map->includes_phdrs =
7669 (segment->p_offset <= (bfd_vma) iehdr->e_phoff
7670 && (segment->p_offset + segment->p_filesz
7671 >= ((bfd_vma) iehdr->e_phoff
7672 + iehdr->e_phnum * iehdr->e_phentsize)));
7673
7674 if (segment->p_type == PT_LOAD && map->includes_phdrs)
0a1b45a2 7675 phdr_included = true;
84d1d650
L
7676 }
7677
bbefd0a9 7678 lowest_section = NULL;
84d1d650
L
7679 if (section_count != 0)
7680 {
7681 unsigned int isec = 0;
7682
53020534 7683 for (section = first_section;
84d1d650
L
7684 section != NULL;
7685 section = section->next)
7686 {
7687 this_hdr = &(elf_section_data(section)->this_hdr);
f4638467 7688 if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
53020534
L
7689 {
7690 map->sections[isec++] = section->output_section;
a76e6f2f
AM
7691 if ((section->flags & SEC_ALLOC) != 0)
7692 {
7693 bfd_vma seg_off;
7694
bbefd0a9
AM
7695 if (lowest_section == NULL
7696 || section->lma < lowest_section->lma)
fb8a5684
AM
7697 lowest_section = section;
7698
a76e6f2f
AM
7699 /* Section lmas are set up from PT_LOAD header
7700 p_paddr in _bfd_elf_make_section_from_shdr.
7701 If this header has a p_paddr that disagrees
7702 with the section lma, flag the p_paddr as
7703 invalid. */
7704 if ((section->flags & SEC_LOAD) != 0)
7705 seg_off = this_hdr->sh_offset - segment->p_offset;
7706 else
7707 seg_off = this_hdr->sh_addr - segment->p_vaddr;
502794d4 7708 if (section->lma * opb - segment->p_paddr != seg_off)
0a1b45a2 7709 map->p_paddr_valid = false;
a76e6f2f 7710 }
53020534
L
7711 if (isec == section_count)
7712 break;
7713 }
84d1d650
L
7714 }
7715 }
7716
5d695627 7717 if (section_count == 0)
502794d4 7718 map->p_vaddr_offset = segment->p_vaddr / opb;
30fe1832
AM
7719 else if (map->p_paddr_valid)
7720 {
7721 /* Account for padding before the first section in the segment. */
7722 bfd_vma hdr_size = 0;
7723 if (map->includes_filehdr)
7724 hdr_size = iehdr->e_ehsize;
7725 if (map->includes_phdrs)
7726 hdr_size += iehdr->e_phnum * iehdr->e_phentsize;
7727
502794d4 7728 map->p_vaddr_offset = ((map->p_paddr + hdr_size) / opb
30fe1832
AM
7729 - (lowest_section ? lowest_section->lma : 0));
7730 }
a76e6f2f 7731
84d1d650
L
7732 map->count = section_count;
7733 *pointer_to_map = map;
7734 pointer_to_map = &map->next;
7735 }
7736
12bd6957 7737 elf_seg_map (obfd) = map_first;
0a1b45a2 7738 return true;
84d1d650
L
7739}
7740
7741/* Copy private BFD data. This copies or rewrites ELF program header
7742 information. */
7743
0a1b45a2 7744static bool
84d1d650
L
7745copy_private_bfd_data (bfd *ibfd, bfd *obfd)
7746{
c410035d
AM
7747 bfd_vma maxpagesize;
7748
84d1d650
L
7749 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
7750 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
0a1b45a2 7751 return true;
84d1d650
L
7752
7753 if (elf_tdata (ibfd)->phdr == NULL)
0a1b45a2 7754 return true;
84d1d650
L
7755
7756 if (ibfd->xvec == obfd->xvec)
7757 {
cb3ff1e5
NC
7758 /* Check to see if any sections in the input BFD
7759 covered by ELF program header have changed. */
d55ce4e2 7760 Elf_Internal_Phdr *segment;
84d1d650
L
7761 asection *section, *osec;
7762 unsigned int i, num_segments;
7763 Elf_Internal_Shdr *this_hdr;
147d51c2
L
7764 const struct elf_backend_data *bed;
7765
7766 bed = get_elf_backend_data (ibfd);
7767
7768 /* Regenerate the segment map if p_paddr is set to 0. */
7769 if (bed->want_p_paddr_set_to_zero)
7770 goto rewrite;
84d1d650
L
7771
7772 /* Initialize the segment mark field. */
7773 for (section = obfd->sections; section != NULL;
7774 section = section->next)
0a1b45a2 7775 section->segment_mark = false;
84d1d650
L
7776
7777 num_segments = elf_elfheader (ibfd)->e_phnum;
7778 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7779 i < num_segments;
7780 i++, segment++)
7781 {
5f6999aa
NC
7782 /* PR binutils/3535. The Solaris linker always sets the p_paddr
7783 and p_memsz fields of special segments (DYNAMIC, INTERP) to 0
7784 which severly confuses things, so always regenerate the segment
7785 map in this case. */
7786 if (segment->p_paddr == 0
7787 && segment->p_memsz == 0
7788 && (segment->p_type == PT_INTERP || segment->p_type == PT_DYNAMIC))
cb3ff1e5 7789 goto rewrite;
5f6999aa 7790
84d1d650
L
7791 for (section = ibfd->sections;
7792 section != NULL; section = section->next)
7793 {
7794 /* We mark the output section so that we know it comes
7795 from the input BFD. */
7796 osec = section->output_section;
7797 if (osec)
0a1b45a2 7798 osec->segment_mark = true;
84d1d650
L
7799
7800 /* Check if this section is covered by the segment. */
7801 this_hdr = &(elf_section_data(section)->this_hdr);
f4638467 7802 if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
84d1d650
L
7803 {
7804 /* FIXME: Check if its output section is changed or
7805 removed. What else do we need to check? */
7806 if (osec == NULL
7807 || section->flags != osec->flags
7808 || section->lma != osec->lma
7809 || section->vma != osec->vma
7810 || section->size != osec->size
7811 || section->rawsize != osec->rawsize
7812 || section->alignment_power != osec->alignment_power)
7813 goto rewrite;
7814 }
7815 }
7816 }
7817
cb3ff1e5 7818 /* Check to see if any output section do not come from the
84d1d650
L
7819 input BFD. */
7820 for (section = obfd->sections; section != NULL;
7821 section = section->next)
7822 {
535b785f 7823 if (!section->segment_mark)
84d1d650
L
7824 goto rewrite;
7825 else
0a1b45a2 7826 section->segment_mark = false;
84d1d650
L
7827 }
7828
7829 return copy_elf_program_header (ibfd, obfd);
7830 }
7831
dc1e8a47 7832 rewrite:
c410035d 7833 maxpagesize = 0;
f1d85785
L
7834 if (ibfd->xvec == obfd->xvec)
7835 {
7836 /* When rewriting program header, set the output maxpagesize to
7837 the maximum alignment of input PT_LOAD segments. */
7838 Elf_Internal_Phdr *segment;
7839 unsigned int i;
7840 unsigned int num_segments = elf_elfheader (ibfd)->e_phnum;
f1d85785
L
7841
7842 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7843 i < num_segments;
7844 i++, segment++)
7845 if (segment->p_type == PT_LOAD
7846 && maxpagesize < segment->p_align)
c86934ce
NC
7847 {
7848 /* PR 17512: file: f17299af. */
7849 if (segment->p_align > (bfd_vma) 1 << ((sizeof (bfd_vma) * 8) - 2))
695344c0 7850 /* xgettext:c-format */
2dcf00ce
AM
7851 _bfd_error_handler (_("%pB: warning: segment alignment of %#"
7852 PRIx64 " is too large"),
7853 ibfd, (uint64_t) segment->p_align);
c86934ce
NC
7854 else
7855 maxpagesize = segment->p_align;
7856 }
f1d85785 7857 }
c410035d
AM
7858 if (maxpagesize == 0)
7859 maxpagesize = get_elf_backend_data (obfd)->maxpagesize;
f1d85785 7860
c410035d 7861 return rewrite_elf_program_header (ibfd, obfd, maxpagesize);
84d1d650
L
7862}
7863
ccd2ec6a
L
7864/* Initialize private output section information from input section. */
7865
0a1b45a2 7866bool
ccd2ec6a
L
7867_bfd_elf_init_private_section_data (bfd *ibfd,
7868 asection *isec,
7869 bfd *obfd,
7870 asection *osec,
7871 struct bfd_link_info *link_info)
7872
7873{
7874 Elf_Internal_Shdr *ihdr, *ohdr;
0a1b45a2
AM
7875 bool final_link = (link_info != NULL
7876 && !bfd_link_relocatable (link_info));
ccd2ec6a
L
7877
7878 if (ibfd->xvec->flavour != bfd_target_elf_flavour
7879 || obfd->xvec->flavour != bfd_target_elf_flavour)
0a1b45a2 7880 return true;
ccd2ec6a 7881
ba85c43e
NC
7882 BFD_ASSERT (elf_section_data (osec) != NULL);
7883
8c803a2d
AM
7884 /* If this is a known ABI section, ELF section type and flags may
7885 have been set up when OSEC was created. For normal sections we
7886 allow the user to override the type and flags other than
7887 SHF_MASKOS and SHF_MASKPROC. */
7888 if (elf_section_type (osec) == SHT_PROGBITS
7889 || elf_section_type (osec) == SHT_NOTE
7890 || elf_section_type (osec) == SHT_NOBITS)
7891 elf_section_type (osec) = SHT_NULL;
7892 /* For objcopy and relocatable link, copy the ELF section type from
7893 the input file if the BFD section flags are the same. (If they
7894 are different the user may be doing something like
7895 "objcopy --set-section-flags .text=alloc,data".) For a final
7896 link allow some flags that the linker clears to differ. */
42bb2e33 7897 if (elf_section_type (osec) == SHT_NULL
dfa7b0b8
AM
7898 && (osec->flags == isec->flags
7899 || (final_link
7900 && ((osec->flags ^ isec->flags)
0814be7d 7901 & ~(SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_RELOC)) == 0)))
42bb2e33 7902 elf_section_type (osec) = elf_section_type (isec);
d270463e
L
7903
7904 /* FIXME: Is this correct for all OS/PROC specific flags? */
8c803a2d
AM
7905 elf_section_flags (osec) = (elf_section_flags (isec)
7906 & (SHF_MASKOS | SHF_MASKPROC));
ccd2ec6a 7907
a91e1603 7908 /* Copy sh_info from input for mbind section. */
df3a023b
AM
7909 if ((elf_tdata (ibfd)->has_gnu_osabi & elf_gnu_osabi_mbind) != 0
7910 && elf_section_flags (isec) & SHF_GNU_MBIND)
a91e1603
L
7911 elf_section_data (osec)->this_hdr.sh_info
7912 = elf_section_data (isec)->this_hdr.sh_info;
7913
ccd2ec6a
L
7914 /* Set things up for objcopy and relocatable link. The output
7915 SHT_GROUP section will have its elf_next_in_group pointing back
7916 to the input group members. Ignore linker created group section.
7917 See elfNN_ia64_object_p in elfxx-ia64.c. */
7bdf4127
AB
7918 if ((link_info == NULL
7919 || !link_info->resolve_section_groups)
7920 && (elf_sec_group (isec) == NULL
7921 || (elf_sec_group (isec)->flags & SEC_LINKER_CREATED) == 0))
ccd2ec6a 7922 {
7bdf4127
AB
7923 if (elf_section_flags (isec) & SHF_GROUP)
7924 elf_section_flags (osec) |= SHF_GROUP;
7925 elf_next_in_group (osec) = elf_next_in_group (isec);
7926 elf_section_data (osec)->group = elf_section_data (isec)->group;
ccd2ec6a
L
7927 }
7928
7bdf4127
AB
7929 /* If not decompress, preserve SHF_COMPRESSED. */
7930 if (!final_link && (ibfd->flags & BFD_DECOMPRESS) == 0)
7931 elf_section_flags (osec) |= (elf_section_flags (isec)
7932 & SHF_COMPRESSED);
7933
ccd2ec6a
L
7934 ihdr = &elf_section_data (isec)->this_hdr;
7935
7936 /* We need to handle elf_linked_to_section for SHF_LINK_ORDER. We
7937 don't use the output section of the linked-to section since it
7938 may be NULL at this point. */
7939 if ((ihdr->sh_flags & SHF_LINK_ORDER) != 0)
7940 {
7941 ohdr = &elf_section_data (osec)->this_hdr;
7942 ohdr->sh_flags |= SHF_LINK_ORDER;
7943 elf_linked_to_section (osec) = elf_linked_to_section (isec);
7944 }
7945
7946 osec->use_rela_p = isec->use_rela_p;
7947
0a1b45a2 7948 return true;
ccd2ec6a
L
7949}
7950
252b5132
RH
7951/* Copy private section information. This copies over the entsize
7952 field, and sometimes the info field. */
7953
0a1b45a2 7954bool
217aa764
AM
7955_bfd_elf_copy_private_section_data (bfd *ibfd,
7956 asection *isec,
7957 bfd *obfd,
7958 asection *osec)
252b5132
RH
7959{
7960 Elf_Internal_Shdr *ihdr, *ohdr;
7961
7962 if (ibfd->xvec->flavour != bfd_target_elf_flavour
7963 || obfd->xvec->flavour != bfd_target_elf_flavour)
0a1b45a2 7964 return true;
252b5132 7965
252b5132
RH
7966 ihdr = &elf_section_data (isec)->this_hdr;
7967 ohdr = &elf_section_data (osec)->this_hdr;
7968
7969 ohdr->sh_entsize = ihdr->sh_entsize;
7970
7971 if (ihdr->sh_type == SHT_SYMTAB
7972 || ihdr->sh_type == SHT_DYNSYM
7973 || ihdr->sh_type == SHT_GNU_verneed
7974 || ihdr->sh_type == SHT_GNU_verdef)
7975 ohdr->sh_info = ihdr->sh_info;
7976
ccd2ec6a
L
7977 return _bfd_elf_init_private_section_data (ibfd, isec, obfd, osec,
7978 NULL);
252b5132
RH
7979}
7980
d0bf826b
AM
7981/* Look at all the SHT_GROUP sections in IBFD, making any adjustments
7982 necessary if we are removing either the SHT_GROUP section or any of
7983 the group member sections. DISCARDED is the value that a section's
7984 output_section has if the section will be discarded, NULL when this
7985 function is called from objcopy, bfd_abs_section_ptr when called
7986 from the linker. */
80fccad2 7987
0a1b45a2 7988bool
d0bf826b 7989_bfd_elf_fixup_group_sections (bfd *ibfd, asection *discarded)
80fccad2 7990{
30288845
AM
7991 asection *isec;
7992
30288845 7993 for (isec = ibfd->sections; isec != NULL; isec = isec->next)
415f38a6 7994 if (elf_section_type (isec) == SHT_GROUP)
30288845
AM
7995 {
7996 asection *first = elf_next_in_group (isec);
7997 asection *s = first;
d0bf826b
AM
7998 bfd_size_type removed = 0;
7999
30288845
AM
8000 while (s != NULL)
8001 {
415f38a6
AM
8002 /* If this member section is being output but the
8003 SHT_GROUP section is not, then clear the group info
8004 set up by _bfd_elf_copy_private_section_data. */
d0bf826b
AM
8005 if (s->output_section != discarded
8006 && isec->output_section == discarded)
30288845
AM
8007 {
8008 elf_section_flags (s->output_section) &= ~SHF_GROUP;
8009 elf_group_name (s->output_section) = NULL;
8010 }
3349112e 8011 else
6e5e9d58
AM
8012 {
8013 struct bfd_elf_section_data *elf_sec = elf_section_data (s);
3349112e
L
8014 if (s->output_section == discarded
8015 && isec->output_section != discarded)
8016 {
8017 /* Conversely, if the member section is not being
8018 output but the SHT_GROUP section is, then adjust
8019 its size. */
8020 removed += 4;
8021 if (elf_sec->rel.hdr != NULL
8022 && (elf_sec->rel.hdr->sh_flags & SHF_GROUP) != 0)
8023 removed += 4;
8024 if (elf_sec->rela.hdr != NULL
8025 && (elf_sec->rela.hdr->sh_flags & SHF_GROUP) != 0)
8026 removed += 4;
8027 }
8028 else
8029 {
8030 /* Also adjust for zero-sized relocation member
8031 section. */
8032 if (elf_sec->rel.hdr != NULL
8033 && elf_sec->rel.hdr->sh_size == 0)
8034 removed += 4;
8035 if (elf_sec->rela.hdr != NULL
8036 && elf_sec->rela.hdr->sh_size == 0)
8037 removed += 4;
8038 }
6e5e9d58 8039 }
30288845
AM
8040 s = elf_next_in_group (s);
8041 if (s == first)
8042 break;
8043 }
d0bf826b
AM
8044 if (removed != 0)
8045 {
8046 if (discarded != NULL)
8047 {
8048 /* If we've been called for ld -r, then we need to
6e5e9d58 8049 adjust the input section size. */
d0bf826b
AM
8050 if (isec->rawsize == 0)
8051 isec->rawsize = isec->size;
8052 isec->size = isec->rawsize - removed;
6e5e9d58
AM
8053 if (isec->size <= 4)
8054 {
8055 isec->size = 0;
8056 isec->flags |= SEC_EXCLUDE;
8057 }
d0bf826b 8058 }
182ad375 8059 else if (isec->output_section != NULL)
d0bf826b
AM
8060 {
8061 /* Adjust the output section size when called from
8062 objcopy. */
8063 isec->output_section->size -= removed;
6e5e9d58
AM
8064 if (isec->output_section->size <= 4)
8065 {
8066 isec->output_section->size = 0;
8067 isec->output_section->flags |= SEC_EXCLUDE;
8068 }
d0bf826b
AM
8069 }
8070 }
30288845
AM
8071 }
8072
0a1b45a2 8073 return true;
80fccad2
BW
8074}
8075
d0bf826b
AM
8076/* Copy private header information. */
8077
0a1b45a2 8078bool
d0bf826b
AM
8079_bfd_elf_copy_private_header_data (bfd *ibfd, bfd *obfd)
8080{
8081 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
8082 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
0a1b45a2 8083 return true;
d0bf826b
AM
8084
8085 /* Copy over private BFD data if it has not already been copied.
8086 This must be done here, rather than in the copy_private_bfd_data
8087 entry point, because the latter is called after the section
8088 contents have been set, which means that the program headers have
8089 already been worked out. */
12bd6957 8090 if (elf_seg_map (obfd) == NULL && elf_tdata (ibfd)->phdr != NULL)
d0bf826b
AM
8091 {
8092 if (! copy_private_bfd_data (ibfd, obfd))
0a1b45a2 8093 return false;
d0bf826b
AM
8094 }
8095
8096 return _bfd_elf_fixup_group_sections (ibfd, NULL);
8097}
8098
252b5132
RH
8099/* Copy private symbol information. If this symbol is in a section
8100 which we did not map into a BFD section, try to map the section
8101 index correctly. We use special macro definitions for the mapped
8102 section indices; these definitions are interpreted by the
8103 swap_out_syms function. */
8104
9ad5cbcf
AM
8105#define MAP_ONESYMTAB (SHN_HIOS + 1)
8106#define MAP_DYNSYMTAB (SHN_HIOS + 2)
8107#define MAP_STRTAB (SHN_HIOS + 3)
8108#define MAP_SHSTRTAB (SHN_HIOS + 4)
8109#define MAP_SYM_SHNDX (SHN_HIOS + 5)
252b5132 8110
0a1b45a2 8111bool
217aa764
AM
8112_bfd_elf_copy_private_symbol_data (bfd *ibfd,
8113 asymbol *isymarg,
8114 bfd *obfd,
8115 asymbol *osymarg)
252b5132
RH
8116{
8117 elf_symbol_type *isym, *osym;
8118
8119 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
8120 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
0a1b45a2 8121 return true;
252b5132 8122
c1229f84
AM
8123 isym = elf_symbol_from (isymarg);
8124 osym = elf_symbol_from (osymarg);
252b5132
RH
8125
8126 if (isym != NULL
8424d8f5 8127 && isym->internal_elf_sym.st_shndx != 0
252b5132
RH
8128 && osym != NULL
8129 && bfd_is_abs_section (isym->symbol.section))
8130 {
8131 unsigned int shndx;
8132
8133 shndx = isym->internal_elf_sym.st_shndx;
8134 if (shndx == elf_onesymtab (ibfd))
8135 shndx = MAP_ONESYMTAB;
8136 else if (shndx == elf_dynsymtab (ibfd))
8137 shndx = MAP_DYNSYMTAB;
12bd6957 8138 else if (shndx == elf_strtab_sec (ibfd))
252b5132 8139 shndx = MAP_STRTAB;
12bd6957 8140 else if (shndx == elf_shstrtab_sec (ibfd))
252b5132 8141 shndx = MAP_SHSTRTAB;
6a40cf0c 8142 else if (find_section_in_list (shndx, elf_symtab_shndx_list (ibfd)))
9ad5cbcf 8143 shndx = MAP_SYM_SHNDX;
252b5132
RH
8144 osym->internal_elf_sym.st_shndx = shndx;
8145 }
8146
0a1b45a2 8147 return true;
252b5132
RH
8148}
8149
8150/* Swap out the symbols. */
8151
0a1b45a2 8152static bool
217aa764 8153swap_out_syms (bfd *abfd,
ef10c3ac 8154 struct elf_strtab_hash **sttp,
3d16b64e
NA
8155 int relocatable_p,
8156 struct bfd_link_info *info)
252b5132 8157{
9c5bfbb7 8158 const struct elf_backend_data *bed;
1f4361a7 8159 unsigned int symcount;
079e9a2f 8160 asymbol **syms;
ef10c3ac 8161 struct elf_strtab_hash *stt;
079e9a2f 8162 Elf_Internal_Shdr *symtab_hdr;
9ad5cbcf 8163 Elf_Internal_Shdr *symtab_shndx_hdr;
079e9a2f 8164 Elf_Internal_Shdr *symstrtab_hdr;
ef10c3ac 8165 struct elf_sym_strtab *symstrtab;
f075ee0c
AM
8166 bfd_byte *outbound_syms;
8167 bfd_byte *outbound_shndx;
ef10c3ac 8168 unsigned long outbound_syms_index;
1f4361a7 8169 unsigned int idx;
12bd6957 8170 unsigned int num_locals;
1f4361a7 8171 size_t amt;
0a1b45a2 8172 bool name_local_sections;
252b5132 8173
12bd6957 8174 if (!elf_map_symbols (abfd, &num_locals))
0a1b45a2 8175 return false;
252b5132 8176
c044fabd 8177 /* Dump out the symtabs. */
ef10c3ac 8178 stt = _bfd_elf_strtab_init ();
079e9a2f 8179 if (stt == NULL)
0a1b45a2 8180 return false;
252b5132 8181
079e9a2f
AM
8182 bed = get_elf_backend_data (abfd);
8183 symcount = bfd_get_symcount (abfd);
8184 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8185 symtab_hdr->sh_type = SHT_SYMTAB;
8186 symtab_hdr->sh_entsize = bed->s->sizeof_sym;
8187 symtab_hdr->sh_size = symtab_hdr->sh_entsize * (symcount + 1);
12bd6957 8188 symtab_hdr->sh_info = num_locals + 1;
72de5009 8189 symtab_hdr->sh_addralign = (bfd_vma) 1 << bed->s->log_file_align;
079e9a2f
AM
8190
8191 symstrtab_hdr = &elf_tdata (abfd)->strtab_hdr;
8192 symstrtab_hdr->sh_type = SHT_STRTAB;
8193
ef10c3ac 8194 /* Allocate buffer to swap out the .strtab section. */
1f4361a7
AM
8195 if (_bfd_mul_overflow (symcount + 1, sizeof (*symstrtab), &amt)
8196 || (symstrtab = (struct elf_sym_strtab *) bfd_malloc (amt)) == NULL)
ef10c3ac 8197 {
1f4361a7 8198 bfd_set_error (bfd_error_no_memory);
ef10c3ac 8199 _bfd_elf_strtab_free (stt);
0a1b45a2 8200 return false;
ef10c3ac
L
8201 }
8202
1f4361a7
AM
8203 if (_bfd_mul_overflow (symcount + 1, bed->s->sizeof_sym, &amt)
8204 || (outbound_syms = (bfd_byte *) bfd_alloc (abfd, amt)) == NULL)
5ed6aba4 8205 {
1f4361a7
AM
8206 error_no_mem:
8207 bfd_set_error (bfd_error_no_memory);
8208 error_return:
ef10c3ac 8209 free (symstrtab);
1f4361a7 8210 _bfd_elf_strtab_free (stt);
0a1b45a2 8211 return false;
5ed6aba4 8212 }
217aa764 8213 symtab_hdr->contents = outbound_syms;
ef10c3ac 8214 outbound_syms_index = 0;
252b5132 8215
9ad5cbcf 8216 outbound_shndx = NULL;
6a40cf0c
NC
8217
8218 if (elf_symtab_shndx_list (abfd))
9ad5cbcf 8219 {
6a40cf0c
NC
8220 symtab_shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
8221 if (symtab_shndx_hdr->sh_name != 0)
8222 {
1f4361a7
AM
8223 if (_bfd_mul_overflow (symcount + 1,
8224 sizeof (Elf_External_Sym_Shndx), &amt))
8225 goto error_no_mem;
8226 outbound_shndx = (bfd_byte *) bfd_zalloc (abfd, amt);
6a40cf0c
NC
8227 if (outbound_shndx == NULL)
8228 goto error_return;
5ed6aba4 8229
6a40cf0c
NC
8230 symtab_shndx_hdr->contents = outbound_shndx;
8231 symtab_shndx_hdr->sh_type = SHT_SYMTAB_SHNDX;
8232 symtab_shndx_hdr->sh_size = amt;
8233 symtab_shndx_hdr->sh_addralign = sizeof (Elf_External_Sym_Shndx);
8234 symtab_shndx_hdr->sh_entsize = sizeof (Elf_External_Sym_Shndx);
8235 }
8236 /* FIXME: What about any other headers in the list ? */
9ad5cbcf
AM
8237 }
8238
589e6347 8239 /* Now generate the data (for "contents"). */
079e9a2f
AM
8240 {
8241 /* Fill in zeroth symbol and swap it out. */
8242 Elf_Internal_Sym sym;
8243 sym.st_name = 0;
8244 sym.st_value = 0;
8245 sym.st_size = 0;
8246 sym.st_info = 0;
8247 sym.st_other = 0;
8248 sym.st_shndx = SHN_UNDEF;
35fc36a8 8249 sym.st_target_internal = 0;
ef10c3ac
L
8250 symstrtab[0].sym = sym;
8251 symstrtab[0].dest_index = outbound_syms_index;
ef10c3ac 8252 outbound_syms_index++;
079e9a2f 8253 }
252b5132 8254
174fd7f9
RS
8255 name_local_sections
8256 = (bed->elf_backend_name_local_section_symbols
8257 && bed->elf_backend_name_local_section_symbols (abfd));
8258
079e9a2f 8259 syms = bfd_get_outsymbols (abfd);
ef10c3ac 8260 for (idx = 0; idx < symcount;)
252b5132 8261 {
252b5132 8262 Elf_Internal_Sym sym;
079e9a2f
AM
8263 bfd_vma value = syms[idx]->value;
8264 elf_symbol_type *type_ptr;
8265 flagword flags = syms[idx]->flags;
8266 int type;
252b5132 8267
174fd7f9
RS
8268 if (!name_local_sections
8269 && (flags & (BSF_SECTION_SYM | BSF_GLOBAL)) == BSF_SECTION_SYM)
079e9a2f
AM
8270 {
8271 /* Local section symbols have no name. */
ef10c3ac 8272 sym.st_name = (unsigned long) -1;
079e9a2f
AM
8273 }
8274 else
8275 {
ef10c3ac
L
8276 /* Call _bfd_elf_strtab_offset after _bfd_elf_strtab_finalize
8277 to get the final offset for st_name. */
8278 sym.st_name
8279 = (unsigned long) _bfd_elf_strtab_add (stt, syms[idx]->name,
0a1b45a2 8280 false);
079e9a2f 8281 if (sym.st_name == (unsigned long) -1)
ef10c3ac 8282 goto error_return;
079e9a2f 8283 }
252b5132 8284
c1229f84 8285 type_ptr = elf_symbol_from (syms[idx]);
252b5132 8286
079e9a2f
AM
8287 if ((flags & BSF_SECTION_SYM) == 0
8288 && bfd_is_com_section (syms[idx]->section))
8289 {
8290 /* ELF common symbols put the alignment into the `value' field,
8291 and the size into the `size' field. This is backwards from
8292 how BFD handles it, so reverse it here. */
8293 sym.st_size = value;
8294 if (type_ptr == NULL
8295 || type_ptr->internal_elf_sym.st_value == 0)
8296 sym.st_value = value >= 16 ? 16 : (1 << bfd_log2 (value));
8297 else
8298 sym.st_value = type_ptr->internal_elf_sym.st_value;
8299 sym.st_shndx = _bfd_elf_section_from_bfd_section
8300 (abfd, syms[idx]->section);
8301 }
8302 else
8303 {
8304 asection *sec = syms[idx]->section;
cb33740c 8305 unsigned int shndx;
252b5132 8306
079e9a2f
AM
8307 if (sec->output_section)
8308 {
8309 value += sec->output_offset;
8310 sec = sec->output_section;
8311 }
589e6347 8312
079e9a2f
AM
8313 /* Don't add in the section vma for relocatable output. */
8314 if (! relocatable_p)
8315 value += sec->vma;
8316 sym.st_value = value;
8317 sym.st_size = type_ptr ? type_ptr->internal_elf_sym.st_size : 0;
8318
8319 if (bfd_is_abs_section (sec)
8320 && type_ptr != NULL
8321 && type_ptr->internal_elf_sym.st_shndx != 0)
8322 {
8323 /* This symbol is in a real ELF section which we did
8324 not create as a BFD section. Undo the mapping done
8325 by copy_private_symbol_data. */
8326 shndx = type_ptr->internal_elf_sym.st_shndx;
8327 switch (shndx)
8328 {
8329 case MAP_ONESYMTAB:
8330 shndx = elf_onesymtab (abfd);
8331 break;
8332 case MAP_DYNSYMTAB:
8333 shndx = elf_dynsymtab (abfd);
8334 break;
8335 case MAP_STRTAB:
12bd6957 8336 shndx = elf_strtab_sec (abfd);
079e9a2f
AM
8337 break;
8338 case MAP_SHSTRTAB:
12bd6957 8339 shndx = elf_shstrtab_sec (abfd);
079e9a2f 8340 break;
9ad5cbcf 8341 case MAP_SYM_SHNDX:
6a40cf0c
NC
8342 if (elf_symtab_shndx_list (abfd))
8343 shndx = elf_symtab_shndx_list (abfd)->ndx;
9ad5cbcf 8344 break;
00e49dff
NC
8345 case SHN_COMMON:
8346 case SHN_ABS:
15bc576a 8347 shndx = SHN_ABS;
079e9a2f 8348 break;
00e49dff
NC
8349 default:
8350 if (shndx >= SHN_LOPROC && shndx <= SHN_HIOS)
8351 {
8352 if (bed->symbol_section_index)
8353 shndx = bed->symbol_section_index (abfd, type_ptr);
8354 /* Otherwise just leave the index alone. */
8355 }
8356 else
8357 {
8358 if (shndx > SHN_HIOS && shndx < SHN_HIRESERVE)
8359 _bfd_error_handler (_("%pB: \
8360Unable to handle section index %x in ELF symbol. Using ABS instead."),
8361 abfd, shndx);
8362 shndx = SHN_ABS;
8363 }
8364 break;
079e9a2f
AM
8365 }
8366 }
8367 else
8368 {
8369 shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
252b5132 8370
cb33740c 8371 if (shndx == SHN_BAD)
079e9a2f
AM
8372 {
8373 asection *sec2;
8374
8375 /* Writing this would be a hell of a lot easier if
8376 we had some decent documentation on bfd, and
8377 knew what to expect of the library, and what to
8378 demand of applications. For example, it
8379 appears that `objcopy' might not set the
8380 section of a symbol to be a section that is
8381 actually in the output file. */
8382 sec2 = bfd_get_section_by_name (abfd, sec->name);
5df1bc57
AM
8383 if (sec2 != NULL)
8384 shndx = _bfd_elf_section_from_bfd_section (abfd, sec2);
8385 if (shndx == SHN_BAD)
589e6347 8386 {
695344c0 8387 /* xgettext:c-format */
9793eb77
AM
8388 _bfd_error_handler
8389 (_("unable to find equivalent output section"
8390 " for symbol '%s' from section '%s'"),
8391 syms[idx]->name ? syms[idx]->name : "<Local sym>",
8392 sec->name);
811072d8 8393 bfd_set_error (bfd_error_invalid_operation);
ef10c3ac 8394 goto error_return;
589e6347 8395 }
079e9a2f
AM
8396 }
8397 }
252b5132 8398
079e9a2f
AM
8399 sym.st_shndx = shndx;
8400 }
252b5132 8401
13ae64f3
JJ
8402 if ((flags & BSF_THREAD_LOCAL) != 0)
8403 type = STT_TLS;
d8045f23
NC
8404 else if ((flags & BSF_GNU_INDIRECT_FUNCTION) != 0)
8405 type = STT_GNU_IFUNC;
13ae64f3 8406 else if ((flags & BSF_FUNCTION) != 0)
079e9a2f
AM
8407 type = STT_FUNC;
8408 else if ((flags & BSF_OBJECT) != 0)
8409 type = STT_OBJECT;
d9352518
DB
8410 else if ((flags & BSF_RELC) != 0)
8411 type = STT_RELC;
8412 else if ((flags & BSF_SRELC) != 0)
8413 type = STT_SRELC;
079e9a2f
AM
8414 else
8415 type = STT_NOTYPE;
252b5132 8416
13ae64f3
JJ
8417 if (syms[idx]->section->flags & SEC_THREAD_LOCAL)
8418 type = STT_TLS;
8419
589e6347 8420 /* Processor-specific types. */
079e9a2f
AM
8421 if (type_ptr != NULL
8422 && bed->elf_backend_get_symbol_type)
8423 type = ((*bed->elf_backend_get_symbol_type)
8424 (&type_ptr->internal_elf_sym, type));
252b5132 8425
079e9a2f
AM
8426 if (flags & BSF_SECTION_SYM)
8427 {
8428 if (flags & BSF_GLOBAL)
8429 sym.st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8430 else
8431 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION);
8432 }
8433 else if (bfd_is_com_section (syms[idx]->section))
0a40daed 8434 {
b8871f35
L
8435 if (type != STT_TLS)
8436 {
8437 if ((abfd->flags & BFD_CONVERT_ELF_COMMON))
8438 type = ((abfd->flags & BFD_USE_ELF_STT_COMMON)
8439 ? STT_COMMON : STT_OBJECT);
8440 else
8441 type = ((flags & BSF_ELF_COMMON) != 0
8442 ? STT_COMMON : STT_OBJECT);
8443 }
8444 sym.st_info = ELF_ST_INFO (STB_GLOBAL, type);
0a40daed 8445 }
079e9a2f
AM
8446 else if (bfd_is_und_section (syms[idx]->section))
8447 sym.st_info = ELF_ST_INFO (((flags & BSF_WEAK)
8448 ? STB_WEAK
8449 : STB_GLOBAL),
8450 type);
8451 else if (flags & BSF_FILE)
8452 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FILE);
8453 else
8454 {
8455 int bind = STB_LOCAL;
252b5132 8456
079e9a2f
AM
8457 if (flags & BSF_LOCAL)
8458 bind = STB_LOCAL;
3e7a7d11
NC
8459 else if (flags & BSF_GNU_UNIQUE)
8460 bind = STB_GNU_UNIQUE;
079e9a2f
AM
8461 else if (flags & BSF_WEAK)
8462 bind = STB_WEAK;
8463 else if (flags & BSF_GLOBAL)
8464 bind = STB_GLOBAL;
252b5132 8465
079e9a2f
AM
8466 sym.st_info = ELF_ST_INFO (bind, type);
8467 }
252b5132 8468
079e9a2f 8469 if (type_ptr != NULL)
35fc36a8
RS
8470 {
8471 sym.st_other = type_ptr->internal_elf_sym.st_other;
8472 sym.st_target_internal
8473 = type_ptr->internal_elf_sym.st_target_internal;
8474 }
079e9a2f 8475 else
35fc36a8
RS
8476 {
8477 sym.st_other = 0;
8478 sym.st_target_internal = 0;
8479 }
252b5132 8480
ef10c3ac
L
8481 idx++;
8482 symstrtab[idx].sym = sym;
8483 symstrtab[idx].dest_index = outbound_syms_index;
ef10c3ac
L
8484
8485 outbound_syms_index++;
ef10c3ac
L
8486 }
8487
8488 /* Finalize the .strtab section. */
8489 _bfd_elf_strtab_finalize (stt);
8490
8491 /* Swap out the .strtab section. */
8492 for (idx = 0; idx <= symcount; idx++)
8493 {
8494 struct elf_sym_strtab *elfsym = &symstrtab[idx];
8495 if (elfsym->sym.st_name == (unsigned long) -1)
8496 elfsym->sym.st_name = 0;
8497 else
8498 elfsym->sym.st_name = _bfd_elf_strtab_offset (stt,
8499 elfsym->sym.st_name);
3d16b64e
NA
8500 if (info && info->callbacks->ctf_new_symbol)
8501 info->callbacks->ctf_new_symbol (elfsym->dest_index,
8502 &elfsym->sym);
8503
8504 /* Inform the linker of the addition of this symbol. */
8505
ef10c3ac
L
8506 bed->s->swap_symbol_out (abfd, &elfsym->sym,
8507 (outbound_syms
8508 + (elfsym->dest_index
8509 * bed->s->sizeof_sym)),
b03b65e2
AM
8510 NPTR_ADD (outbound_shndx,
8511 (elfsym->dest_index
8512 * sizeof (Elf_External_Sym_Shndx))));
079e9a2f 8513 }
ef10c3ac 8514 free (symstrtab);
252b5132 8515
079e9a2f 8516 *sttp = stt;
ef10c3ac 8517 symstrtab_hdr->sh_size = _bfd_elf_strtab_size (stt);
079e9a2f 8518 symstrtab_hdr->sh_type = SHT_STRTAB;
84865015 8519 symstrtab_hdr->sh_flags = bed->elf_strtab_flags;
079e9a2f
AM
8520 symstrtab_hdr->sh_addr = 0;
8521 symstrtab_hdr->sh_entsize = 0;
8522 symstrtab_hdr->sh_link = 0;
8523 symstrtab_hdr->sh_info = 0;
8524 symstrtab_hdr->sh_addralign = 1;
252b5132 8525
0a1b45a2 8526 return true;
252b5132
RH
8527}
8528
8529/* Return the number of bytes required to hold the symtab vector.
8530
8531 Note that we base it on the count plus 1, since we will null terminate
8532 the vector allocated based on this size. However, the ELF symbol table
8533 always has a dummy entry as symbol #0, so it ends up even. */
8534
8535long
217aa764 8536_bfd_elf_get_symtab_upper_bound (bfd *abfd)
252b5132 8537{
3a551c7a 8538 bfd_size_type symcount;
252b5132
RH
8539 long symtab_size;
8540 Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->symtab_hdr;
8541
8542 symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
b5f386d5 8543 if (symcount > LONG_MAX / sizeof (asymbol *))
3a551c7a
AM
8544 {
8545 bfd_set_error (bfd_error_file_too_big);
8546 return -1;
8547 }
b5f386d5
AM
8548 symtab_size = symcount * (sizeof (asymbol *));
8549 if (symcount == 0)
8550 symtab_size = sizeof (asymbol *);
8551 else if (!bfd_write_p (abfd))
8552 {
8553 ufile_ptr filesize = bfd_get_file_size (abfd);
8554
8555 if (filesize != 0 && (unsigned long) symtab_size > filesize)
8556 {
8557 bfd_set_error (bfd_error_file_truncated);
8558 return -1;
8559 }
8560 }
252b5132
RH
8561
8562 return symtab_size;
8563}
8564
8565long
217aa764 8566_bfd_elf_get_dynamic_symtab_upper_bound (bfd *abfd)
252b5132 8567{
3a551c7a 8568 bfd_size_type symcount;
252b5132
RH
8569 long symtab_size;
8570 Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->dynsymtab_hdr;
8571
8572 if (elf_dynsymtab (abfd) == 0)
8573 {
8574 bfd_set_error (bfd_error_invalid_operation);
8575 return -1;
8576 }
8577
8578 symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
b5f386d5 8579 if (symcount > LONG_MAX / sizeof (asymbol *))
3a551c7a
AM
8580 {
8581 bfd_set_error (bfd_error_file_too_big);
8582 return -1;
8583 }
b5f386d5
AM
8584 symtab_size = symcount * (sizeof (asymbol *));
8585 if (symcount == 0)
8586 symtab_size = sizeof (asymbol *);
8587 else if (!bfd_write_p (abfd))
8588 {
8589 ufile_ptr filesize = bfd_get_file_size (abfd);
8590
8591 if (filesize != 0 && (unsigned long) symtab_size > filesize)
8592 {
8593 bfd_set_error (bfd_error_file_truncated);
8594 return -1;
8595 }
8596 }
252b5132
RH
8597
8598 return symtab_size;
8599}
8600
8601long
3c568b8a 8602_bfd_elf_get_reloc_upper_bound (bfd *abfd, sec_ptr asect)
252b5132 8603{
b5f386d5 8604 if (asect->reloc_count != 0 && !bfd_write_p (abfd))
3c568b8a
AM
8605 {
8606 /* Sanity check reloc section size. */
8607 struct bfd_elf_section_data *d = elf_section_data (asect);
8608 Elf_Internal_Shdr *rel_hdr = &d->this_hdr;
8609 bfd_size_type ext_rel_size = rel_hdr->sh_size;
8610 ufile_ptr filesize = bfd_get_file_size (abfd);
8611
8612 if (filesize != 0 && ext_rel_size > filesize)
8613 {
8614 bfd_set_error (bfd_error_file_truncated);
8615 return -1;
8616 }
8617 }
8618
242a1159 8619#if SIZEOF_LONG == SIZEOF_INT
7a6e0d89
AM
8620 if (asect->reloc_count >= LONG_MAX / sizeof (arelent *))
8621 {
8622 bfd_set_error (bfd_error_file_too_big);
8623 return -1;
8624 }
242a1159 8625#endif
5cfe19e5 8626 return (asect->reloc_count + 1L) * sizeof (arelent *);
252b5132
RH
8627}
8628
8629/* Canonicalize the relocs. */
8630
8631long
217aa764
AM
8632_bfd_elf_canonicalize_reloc (bfd *abfd,
8633 sec_ptr section,
8634 arelent **relptr,
8635 asymbol **symbols)
252b5132
RH
8636{
8637 arelent *tblptr;
8638 unsigned int i;
9c5bfbb7 8639 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 8640
0a1b45a2 8641 if (! bed->s->slurp_reloc_table (abfd, section, symbols, false))
252b5132
RH
8642 return -1;
8643
8644 tblptr = section->relocation;
8645 for (i = 0; i < section->reloc_count; i++)
8646 *relptr++ = tblptr++;
8647
8648 *relptr = NULL;
8649
8650 return section->reloc_count;
8651}
8652
8653long
6cee3f79 8654_bfd_elf_canonicalize_symtab (bfd *abfd, asymbol **allocation)
252b5132 8655{
9c5bfbb7 8656 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
0a1b45a2 8657 long symcount = bed->s->slurp_symbol_table (abfd, allocation, false);
252b5132
RH
8658
8659 if (symcount >= 0)
ed48ec2e 8660 abfd->symcount = symcount;
252b5132
RH
8661 return symcount;
8662}
8663
8664long
217aa764
AM
8665_bfd_elf_canonicalize_dynamic_symtab (bfd *abfd,
8666 asymbol **allocation)
252b5132 8667{
9c5bfbb7 8668 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
0a1b45a2 8669 long symcount = bed->s->slurp_symbol_table (abfd, allocation, true);
1f70368c
DJ
8670
8671 if (symcount >= 0)
ed48ec2e 8672 abfd->dynsymcount = symcount;
1f70368c 8673 return symcount;
252b5132
RH
8674}
8675
8615f3f2
AM
8676/* Return the size required for the dynamic reloc entries. Any loadable
8677 section that was actually installed in the BFD, and has type SHT_REL
8678 or SHT_RELA, and uses the dynamic symbol table, is considered to be a
8679 dynamic reloc section. */
252b5132
RH
8680
8681long
217aa764 8682_bfd_elf_get_dynamic_reloc_upper_bound (bfd *abfd)
252b5132 8683{
3c568b8a 8684 bfd_size_type count, ext_rel_size;
252b5132
RH
8685 asection *s;
8686
8687 if (elf_dynsymtab (abfd) == 0)
8688 {
8689 bfd_set_error (bfd_error_invalid_operation);
8690 return -1;
8691 }
8692
3a551c7a 8693 count = 1;
3c568b8a 8694 ext_rel_size = 0;
252b5132 8695 for (s = abfd->sections; s != NULL; s = s->next)
266b05cf 8696 if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
252b5132
RH
8697 && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
8698 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
3a551c7a 8699 {
3c568b8a
AM
8700 ext_rel_size += s->size;
8701 if (ext_rel_size < s->size)
8702 {
8703 bfd_set_error (bfd_error_file_truncated);
8704 return -1;
8705 }
3a551c7a
AM
8706 count += s->size / elf_section_data (s)->this_hdr.sh_entsize;
8707 if (count > LONG_MAX / sizeof (arelent *))
8708 {
8709 bfd_set_error (bfd_error_file_too_big);
8710 return -1;
8711 }
8712 }
b5f386d5 8713 if (count > 1 && !bfd_write_p (abfd))
3c568b8a
AM
8714 {
8715 /* Sanity check reloc section sizes. */
8716 ufile_ptr filesize = bfd_get_file_size (abfd);
8717 if (filesize != 0 && ext_rel_size > filesize)
8718 {
8719 bfd_set_error (bfd_error_file_truncated);
8720 return -1;
8721 }
8722 }
3a551c7a 8723 return count * sizeof (arelent *);
252b5132
RH
8724}
8725
8615f3f2
AM
8726/* Canonicalize the dynamic relocation entries. Note that we return the
8727 dynamic relocations as a single block, although they are actually
8728 associated with particular sections; the interface, which was
8729 designed for SunOS style shared libraries, expects that there is only
8730 one set of dynamic relocs. Any loadable section that was actually
8731 installed in the BFD, and has type SHT_REL or SHT_RELA, and uses the
8732 dynamic symbol table, is considered to be a dynamic reloc section. */
252b5132
RH
8733
8734long
217aa764
AM
8735_bfd_elf_canonicalize_dynamic_reloc (bfd *abfd,
8736 arelent **storage,
8737 asymbol **syms)
252b5132 8738{
0a1b45a2 8739 bool (*slurp_relocs) (bfd *, asection *, asymbol **, bool);
252b5132
RH
8740 asection *s;
8741 long ret;
8742
8743 if (elf_dynsymtab (abfd) == 0)
8744 {
8745 bfd_set_error (bfd_error_invalid_operation);
8746 return -1;
8747 }
8748
8749 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
8750 ret = 0;
8751 for (s = abfd->sections; s != NULL; s = s->next)
8752 {
266b05cf 8753 if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
252b5132
RH
8754 && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
8755 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
8756 {
8757 arelent *p;
8758 long count, i;
8759
0a1b45a2 8760 if (! (*slurp_relocs) (abfd, s, syms, true))
252b5132 8761 return -1;
eea6121a 8762 count = s->size / elf_section_data (s)->this_hdr.sh_entsize;
252b5132
RH
8763 p = s->relocation;
8764 for (i = 0; i < count; i++)
8765 *storage++ = p++;
8766 ret += count;
8767 }
8768 }
8769
8770 *storage = NULL;
8771
8772 return ret;
8773}
8774\f
8775/* Read in the version information. */
8776
0a1b45a2
AM
8777bool
8778_bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver)
252b5132
RH
8779{
8780 bfd_byte *contents = NULL;
fc0e6df6 8781 unsigned int freeidx = 0;
1f4361a7 8782 size_t amt;
fc0e6df6
PB
8783
8784 if (elf_dynverref (abfd) != 0)
8785 {
8786 Elf_Internal_Shdr *hdr;
8787 Elf_External_Verneed *everneed;
8788 Elf_Internal_Verneed *iverneed;
8789 unsigned int i;
d0fb9a8d 8790 bfd_byte *contents_end;
fc0e6df6
PB
8791
8792 hdr = &elf_tdata (abfd)->dynverref_hdr;
8793
bd61e135
AM
8794 if (hdr->sh_info == 0
8795 || hdr->sh_info > hdr->sh_size / sizeof (Elf_External_Verneed))
d0fb9a8d 8796 {
dc1e8a47 8797 error_return_bad_verref:
4eca0228 8798 _bfd_error_handler
871b3ab2 8799 (_("%pB: .gnu.version_r invalid entry"), abfd);
601a03ba 8800 bfd_set_error (bfd_error_bad_value);
dc1e8a47 8801 error_return_verref:
d0fb9a8d
JJ
8802 elf_tdata (abfd)->verref = NULL;
8803 elf_tdata (abfd)->cverrefs = 0;
8804 goto error_return;
8805 }
601a03ba 8806
2bb3687b
AM
8807 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0)
8808 goto error_return_verref;
8809 contents = _bfd_malloc_and_read (abfd, hdr->sh_size, hdr->sh_size);
8810 if (contents == NULL)
d0fb9a8d 8811 goto error_return_verref;
fc0e6df6 8812
1f4361a7
AM
8813 if (_bfd_mul_overflow (hdr->sh_info, sizeof (Elf_Internal_Verneed), &amt))
8814 {
8815 bfd_set_error (bfd_error_file_too_big);
8816 goto error_return_verref;
8817 }
8818 elf_tdata (abfd)->verref = (Elf_Internal_Verneed *) bfd_alloc (abfd, amt);
601a03ba 8819 if (elf_tdata (abfd)->verref == NULL)
d0fb9a8d
JJ
8820 goto error_return_verref;
8821
8822 BFD_ASSERT (sizeof (Elf_External_Verneed)
8823 == sizeof (Elf_External_Vernaux));
8824 contents_end = contents + hdr->sh_size - sizeof (Elf_External_Verneed);
fc0e6df6
PB
8825 everneed = (Elf_External_Verneed *) contents;
8826 iverneed = elf_tdata (abfd)->verref;
8827 for (i = 0; i < hdr->sh_info; i++, iverneed++)
8828 {
8829 Elf_External_Vernaux *evernaux;
8830 Elf_Internal_Vernaux *ivernaux;
8831 unsigned int j;
8832
8833 _bfd_elf_swap_verneed_in (abfd, everneed, iverneed);
8834
8835 iverneed->vn_bfd = abfd;
8836
8837 iverneed->vn_filename =
8838 bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
8839 iverneed->vn_file);
8840 if (iverneed->vn_filename == NULL)
601a03ba 8841 goto error_return_bad_verref;
fc0e6df6 8842
d0fb9a8d
JJ
8843 if (iverneed->vn_cnt == 0)
8844 iverneed->vn_auxptr = NULL;
8845 else
8846 {
1f4361a7
AM
8847 if (_bfd_mul_overflow (iverneed->vn_cnt,
8848 sizeof (Elf_Internal_Vernaux), &amt))
8849 {
8850 bfd_set_error (bfd_error_file_too_big);
8851 goto error_return_verref;
8852 }
a50b1753 8853 iverneed->vn_auxptr = (struct elf_internal_vernaux *)
1f4361a7 8854 bfd_alloc (abfd, amt);
d0fb9a8d
JJ
8855 if (iverneed->vn_auxptr == NULL)
8856 goto error_return_verref;
8857 }
8858
8859 if (iverneed->vn_aux
8860 > (size_t) (contents_end - (bfd_byte *) everneed))
601a03ba 8861 goto error_return_bad_verref;
fc0e6df6
PB
8862
8863 evernaux = ((Elf_External_Vernaux *)
8864 ((bfd_byte *) everneed + iverneed->vn_aux));
8865 ivernaux = iverneed->vn_auxptr;
8866 for (j = 0; j < iverneed->vn_cnt; j++, ivernaux++)
8867 {
8868 _bfd_elf_swap_vernaux_in (abfd, evernaux, ivernaux);
8869
8870 ivernaux->vna_nodename =
8871 bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
8872 ivernaux->vna_name);
8873 if (ivernaux->vna_nodename == NULL)
601a03ba 8874 goto error_return_bad_verref;
fc0e6df6 8875
25ff461f
AM
8876 if (ivernaux->vna_other > freeidx)
8877 freeidx = ivernaux->vna_other;
8878
8879 ivernaux->vna_nextptr = NULL;
8880 if (ivernaux->vna_next == 0)
8881 {
8882 iverneed->vn_cnt = j + 1;
8883 break;
8884 }
fc0e6df6
PB
8885 if (j + 1 < iverneed->vn_cnt)
8886 ivernaux->vna_nextptr = ivernaux + 1;
fc0e6df6 8887
d0fb9a8d
JJ
8888 if (ivernaux->vna_next
8889 > (size_t) (contents_end - (bfd_byte *) evernaux))
601a03ba 8890 goto error_return_bad_verref;
d0fb9a8d 8891
fc0e6df6
PB
8892 evernaux = ((Elf_External_Vernaux *)
8893 ((bfd_byte *) evernaux + ivernaux->vna_next));
fc0e6df6
PB
8894 }
8895
25ff461f
AM
8896 iverneed->vn_nextref = NULL;
8897 if (iverneed->vn_next == 0)
8898 break;
fc0e6df6
PB
8899 if (i + 1 < hdr->sh_info)
8900 iverneed->vn_nextref = iverneed + 1;
fc0e6df6 8901
d0fb9a8d
JJ
8902 if (iverneed->vn_next
8903 > (size_t) (contents_end - (bfd_byte *) everneed))
601a03ba 8904 goto error_return_bad_verref;
d0fb9a8d 8905
fc0e6df6
PB
8906 everneed = ((Elf_External_Verneed *)
8907 ((bfd_byte *) everneed + iverneed->vn_next));
8908 }
25ff461f 8909 elf_tdata (abfd)->cverrefs = i;
fc0e6df6
PB
8910
8911 free (contents);
8912 contents = NULL;
8913 }
252b5132
RH
8914
8915 if (elf_dynverdef (abfd) != 0)
8916 {
8917 Elf_Internal_Shdr *hdr;
8918 Elf_External_Verdef *everdef;
8919 Elf_Internal_Verdef *iverdef;
f631889e
UD
8920 Elf_Internal_Verdef *iverdefarr;
8921 Elf_Internal_Verdef iverdefmem;
252b5132 8922 unsigned int i;
062e2358 8923 unsigned int maxidx;
d0fb9a8d 8924 bfd_byte *contents_end_def, *contents_end_aux;
252b5132
RH
8925
8926 hdr = &elf_tdata (abfd)->dynverdef_hdr;
8927
601a03ba
AM
8928 if (hdr->sh_info == 0 || hdr->sh_size < sizeof (Elf_External_Verdef))
8929 {
8930 error_return_bad_verdef:
4eca0228 8931 _bfd_error_handler
871b3ab2 8932 (_("%pB: .gnu.version_d invalid entry"), abfd);
601a03ba
AM
8933 bfd_set_error (bfd_error_bad_value);
8934 error_return_verdef:
8935 elf_tdata (abfd)->verdef = NULL;
8936 elf_tdata (abfd)->cverdefs = 0;
8937 goto error_return;
8938 }
8939
2bb3687b 8940 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0)
601a03ba 8941 goto error_return_verdef;
2bb3687b
AM
8942 contents = _bfd_malloc_and_read (abfd, hdr->sh_size, hdr->sh_size);
8943 if (contents == NULL)
601a03ba 8944 goto error_return_verdef;
d0fb9a8d
JJ
8945
8946 BFD_ASSERT (sizeof (Elf_External_Verdef)
8947 >= sizeof (Elf_External_Verdaux));
8948 contents_end_def = contents + hdr->sh_size
8949 - sizeof (Elf_External_Verdef);
8950 contents_end_aux = contents + hdr->sh_size
8951 - sizeof (Elf_External_Verdaux);
8952
f631889e
UD
8953 /* We know the number of entries in the section but not the maximum
8954 index. Therefore we have to run through all entries and find
8955 the maximum. */
252b5132 8956 everdef = (Elf_External_Verdef *) contents;
f631889e
UD
8957 maxidx = 0;
8958 for (i = 0; i < hdr->sh_info; ++i)
8959 {
8960 _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
8961
601a03ba
AM
8962 if ((iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION)) == 0)
8963 goto error_return_bad_verdef;
062e2358
AM
8964 if ((iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION)) > maxidx)
8965 maxidx = iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION);
f631889e 8966
25ff461f
AM
8967 if (iverdefmem.vd_next == 0)
8968 break;
8969
d0fb9a8d
JJ
8970 if (iverdefmem.vd_next
8971 > (size_t) (contents_end_def - (bfd_byte *) everdef))
601a03ba 8972 goto error_return_bad_verdef;
d0fb9a8d 8973
f631889e
UD
8974 everdef = ((Elf_External_Verdef *)
8975 ((bfd_byte *) everdef + iverdefmem.vd_next));
8976 }
8977
fc0e6df6
PB
8978 if (default_imported_symver)
8979 {
8980 if (freeidx > maxidx)
8981 maxidx = ++freeidx;
8982 else
8983 freeidx = ++maxidx;
8984 }
1f4361a7
AM
8985 if (_bfd_mul_overflow (maxidx, sizeof (Elf_Internal_Verdef), &amt))
8986 {
8987 bfd_set_error (bfd_error_file_too_big);
8988 goto error_return_verdef;
8989 }
8990 elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *) bfd_zalloc (abfd, amt);
f631889e 8991 if (elf_tdata (abfd)->verdef == NULL)
601a03ba 8992 goto error_return_verdef;
f631889e
UD
8993
8994 elf_tdata (abfd)->cverdefs = maxidx;
8995
8996 everdef = (Elf_External_Verdef *) contents;
8997 iverdefarr = elf_tdata (abfd)->verdef;
8998 for (i = 0; i < hdr->sh_info; i++)
252b5132
RH
8999 {
9000 Elf_External_Verdaux *everdaux;
9001 Elf_Internal_Verdaux *iverdaux;
9002 unsigned int j;
9003
f631889e
UD
9004 _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
9005
d0fb9a8d 9006 if ((iverdefmem.vd_ndx & VERSYM_VERSION) == 0)
601a03ba 9007 goto error_return_bad_verdef;
d0fb9a8d 9008
f631889e 9009 iverdef = &iverdefarr[(iverdefmem.vd_ndx & VERSYM_VERSION) - 1];
595bce75 9010 memcpy (iverdef, &iverdefmem, offsetof (Elf_Internal_Verdef, vd_bfd));
252b5132
RH
9011
9012 iverdef->vd_bfd = abfd;
9013
d0fb9a8d
JJ
9014 if (iverdef->vd_cnt == 0)
9015 iverdef->vd_auxptr = NULL;
9016 else
9017 {
1f4361a7
AM
9018 if (_bfd_mul_overflow (iverdef->vd_cnt,
9019 sizeof (Elf_Internal_Verdaux), &amt))
9020 {
9021 bfd_set_error (bfd_error_file_too_big);
9022 goto error_return_verdef;
9023 }
a50b1753 9024 iverdef->vd_auxptr = (struct elf_internal_verdaux *)
1f4361a7 9025 bfd_alloc (abfd, amt);
d0fb9a8d
JJ
9026 if (iverdef->vd_auxptr == NULL)
9027 goto error_return_verdef;
9028 }
9029
9030 if (iverdef->vd_aux
9031 > (size_t) (contents_end_aux - (bfd_byte *) everdef))
601a03ba 9032 goto error_return_bad_verdef;
252b5132
RH
9033
9034 everdaux = ((Elf_External_Verdaux *)
9035 ((bfd_byte *) everdef + iverdef->vd_aux));
9036 iverdaux = iverdef->vd_auxptr;
9037 for (j = 0; j < iverdef->vd_cnt; j++, iverdaux++)
9038 {
9039 _bfd_elf_swap_verdaux_in (abfd, everdaux, iverdaux);
9040
9041 iverdaux->vda_nodename =
9042 bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
9043 iverdaux->vda_name);
9044 if (iverdaux->vda_nodename == NULL)
601a03ba 9045 goto error_return_bad_verdef;
252b5132 9046
25ff461f
AM
9047 iverdaux->vda_nextptr = NULL;
9048 if (iverdaux->vda_next == 0)
9049 {
9050 iverdef->vd_cnt = j + 1;
9051 break;
9052 }
252b5132
RH
9053 if (j + 1 < iverdef->vd_cnt)
9054 iverdaux->vda_nextptr = iverdaux + 1;
252b5132 9055
d0fb9a8d
JJ
9056 if (iverdaux->vda_next
9057 > (size_t) (contents_end_aux - (bfd_byte *) everdaux))
601a03ba 9058 goto error_return_bad_verdef;
d0fb9a8d 9059
252b5132
RH
9060 everdaux = ((Elf_External_Verdaux *)
9061 ((bfd_byte *) everdaux + iverdaux->vda_next));
9062 }
9063
595bce75 9064 iverdef->vd_nodename = NULL;
d0fb9a8d
JJ
9065 if (iverdef->vd_cnt)
9066 iverdef->vd_nodename = iverdef->vd_auxptr->vda_nodename;
252b5132 9067
25ff461f
AM
9068 iverdef->vd_nextdef = NULL;
9069 if (iverdef->vd_next == 0)
9070 break;
d0fb9a8d 9071 if ((size_t) (iverdef - iverdefarr) + 1 < maxidx)
252b5132 9072 iverdef->vd_nextdef = iverdef + 1;
252b5132
RH
9073
9074 everdef = ((Elf_External_Verdef *)
9075 ((bfd_byte *) everdef + iverdef->vd_next));
9076 }
9077
9078 free (contents);
9079 contents = NULL;
9080 }
fc0e6df6 9081 else if (default_imported_symver)
252b5132 9082 {
fc0e6df6
PB
9083 if (freeidx < 3)
9084 freeidx = 3;
9085 else
9086 freeidx++;
252b5132 9087
1f4361a7
AM
9088 if (_bfd_mul_overflow (freeidx, sizeof (Elf_Internal_Verdef), &amt))
9089 {
9090 bfd_set_error (bfd_error_file_too_big);
9091 goto error_return;
9092 }
9093 elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *) bfd_zalloc (abfd, amt);
fc0e6df6 9094 if (elf_tdata (abfd)->verdef == NULL)
252b5132
RH
9095 goto error_return;
9096
fc0e6df6
PB
9097 elf_tdata (abfd)->cverdefs = freeidx;
9098 }
252b5132 9099
fc0e6df6
PB
9100 /* Create a default version based on the soname. */
9101 if (default_imported_symver)
9102 {
9103 Elf_Internal_Verdef *iverdef;
9104 Elf_Internal_Verdaux *iverdaux;
252b5132 9105
5bb3703f 9106 iverdef = &elf_tdata (abfd)->verdef[freeidx - 1];
252b5132 9107
fc0e6df6
PB
9108 iverdef->vd_version = VER_DEF_CURRENT;
9109 iverdef->vd_flags = 0;
9110 iverdef->vd_ndx = freeidx;
9111 iverdef->vd_cnt = 1;
252b5132 9112
fc0e6df6 9113 iverdef->vd_bfd = abfd;
252b5132 9114
fc0e6df6
PB
9115 iverdef->vd_nodename = bfd_elf_get_dt_soname (abfd);
9116 if (iverdef->vd_nodename == NULL)
d0fb9a8d 9117 goto error_return_verdef;
fc0e6df6 9118 iverdef->vd_nextdef = NULL;
601a03ba
AM
9119 iverdef->vd_auxptr = ((struct elf_internal_verdaux *)
9120 bfd_zalloc (abfd, sizeof (Elf_Internal_Verdaux)));
d0fb9a8d
JJ
9121 if (iverdef->vd_auxptr == NULL)
9122 goto error_return_verdef;
252b5132 9123
fc0e6df6
PB
9124 iverdaux = iverdef->vd_auxptr;
9125 iverdaux->vda_nodename = iverdef->vd_nodename;
252b5132
RH
9126 }
9127
0a1b45a2 9128 return true;
252b5132
RH
9129
9130 error_return:
c9594989 9131 free (contents);
0a1b45a2 9132 return false;
252b5132
RH
9133}
9134\f
9135asymbol *
217aa764 9136_bfd_elf_make_empty_symbol (bfd *abfd)
252b5132
RH
9137{
9138 elf_symbol_type *newsym;
9139
7a6e0d89 9140 newsym = (elf_symbol_type *) bfd_zalloc (abfd, sizeof (*newsym));
252b5132
RH
9141 if (!newsym)
9142 return NULL;
201159ec
NC
9143 newsym->symbol.the_bfd = abfd;
9144 return &newsym->symbol;
252b5132
RH
9145}
9146
9147void
217aa764
AM
9148_bfd_elf_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
9149 asymbol *symbol,
9150 symbol_info *ret)
252b5132
RH
9151{
9152 bfd_symbol_info (symbol, ret);
9153}
9154
9155/* Return whether a symbol name implies a local symbol. Most targets
9156 use this function for the is_local_label_name entry point, but some
9157 override it. */
9158
0a1b45a2 9159bool
217aa764
AM
9160_bfd_elf_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
9161 const char *name)
252b5132
RH
9162{
9163 /* Normal local symbols start with ``.L''. */
9164 if (name[0] == '.' && name[1] == 'L')
0a1b45a2 9165 return true;
252b5132
RH
9166
9167 /* At least some SVR4 compilers (e.g., UnixWare 2.1 cc) generate
9168 DWARF debugging symbols starting with ``..''. */
9169 if (name[0] == '.' && name[1] == '.')
0a1b45a2 9170 return true;
252b5132
RH
9171
9172 /* gcc will sometimes generate symbols beginning with ``_.L_'' when
9173 emitting DWARF debugging output. I suspect this is actually a
9174 small bug in gcc (it calls ASM_OUTPUT_LABEL when it should call
9175 ASM_GENERATE_INTERNAL_LABEL, and this causes the leading
9176 underscore to be emitted on some ELF targets). For ease of use,
9177 we treat such symbols as local. */
9178 if (name[0] == '_' && name[1] == '.' && name[2] == 'L' && name[3] == '_')
0a1b45a2 9179 return true;
252b5132 9180
b1fa9dd6
NC
9181 /* Treat assembler generated fake symbols, dollar local labels and
9182 forward-backward labels (aka local labels) as locals.
9183 These labels have the form:
9184
07d6d2b8 9185 L0^A.* (fake symbols)
b1fa9dd6
NC
9186
9187 [.]?L[0123456789]+{^A|^B}[0123456789]* (local labels)
9188
9189 Versions which start with .L will have already been matched above,
9190 so we only need to match the rest. */
9191 if (name[0] == 'L' && ISDIGIT (name[1]))
9192 {
0a1b45a2 9193 bool ret = false;
b1fa9dd6
NC
9194 const char * p;
9195 char c;
9196
9197 for (p = name + 2; (c = *p); p++)
9198 {
9199 if (c == 1 || c == 2)
9200 {
9201 if (c == 1 && p == name + 2)
9202 /* A fake symbol. */
0a1b45a2 9203 return true;
b1fa9dd6
NC
9204
9205 /* FIXME: We are being paranoid here and treating symbols like
9206 L0^Bfoo as if there were non-local, on the grounds that the
9207 assembler will never generate them. But can any symbol
9208 containing an ASCII value in the range 1-31 ever be anything
9209 other than some kind of local ? */
0a1b45a2 9210 ret = true;
b1fa9dd6
NC
9211 }
9212
9213 if (! ISDIGIT (c))
9214 {
0a1b45a2 9215 ret = false;
b1fa9dd6
NC
9216 break;
9217 }
9218 }
9219 return ret;
9220 }
ffa54770 9221
0a1b45a2 9222 return false;
252b5132
RH
9223}
9224
9225alent *
217aa764
AM
9226_bfd_elf_get_lineno (bfd *abfd ATTRIBUTE_UNUSED,
9227 asymbol *symbol ATTRIBUTE_UNUSED)
252b5132
RH
9228{
9229 abort ();
9230 return NULL;
9231}
9232
0a1b45a2 9233bool
217aa764
AM
9234_bfd_elf_set_arch_mach (bfd *abfd,
9235 enum bfd_architecture arch,
9236 unsigned long machine)
252b5132
RH
9237{
9238 /* If this isn't the right architecture for this backend, and this
9239 isn't the generic backend, fail. */
9240 if (arch != get_elf_backend_data (abfd)->arch
9241 && arch != bfd_arch_unknown
9242 && get_elf_backend_data (abfd)->arch != bfd_arch_unknown)
0a1b45a2 9243 return false;
252b5132
RH
9244
9245 return bfd_default_set_arch_mach (abfd, arch, machine);
9246}
9247
d1fad7c6
NC
9248/* Find the nearest line to a particular section and offset,
9249 for error reporting. */
9250
0a1b45a2 9251bool
217aa764 9252_bfd_elf_find_nearest_line (bfd *abfd,
217aa764 9253 asymbol **symbols,
fb167eb2 9254 asection *section,
217aa764
AM
9255 bfd_vma offset,
9256 const char **filename_ptr,
9257 const char **functionname_ptr,
fb167eb2
AM
9258 unsigned int *line_ptr,
9259 unsigned int *discriminator_ptr)
d1fad7c6 9260{
0a1b45a2 9261 bool found;
d1fad7c6 9262
fb167eb2 9263 if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
4e8a9624 9264 filename_ptr, functionname_ptr,
fb167eb2 9265 line_ptr, discriminator_ptr,
9defd221 9266 dwarf_debug_sections,
e7679060 9267 &elf_tdata (abfd)->dwarf2_find_line_info))
0a1b45a2 9268 return true;
e7679060
AM
9269
9270 if (_bfd_dwarf1_find_nearest_line (abfd, symbols, section, offset,
9271 filename_ptr, functionname_ptr, line_ptr))
d1fad7c6
NC
9272 {
9273 if (!*functionname_ptr)
e00e8198
AM
9274 _bfd_elf_find_function (abfd, symbols, section, offset,
9275 *filename_ptr ? NULL : filename_ptr,
9276 functionname_ptr);
0a1b45a2 9277 return true;
d1fad7c6
NC
9278 }
9279
9280 if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
4e8a9624
AM
9281 &found, filename_ptr,
9282 functionname_ptr, line_ptr,
9283 &elf_tdata (abfd)->line_info))
0a1b45a2 9284 return false;
dc43ada5 9285 if (found && (*functionname_ptr || *line_ptr))
0a1b45a2 9286 return true;
d1fad7c6
NC
9287
9288 if (symbols == NULL)
0a1b45a2 9289 return false;
d1fad7c6 9290
e00e8198
AM
9291 if (! _bfd_elf_find_function (abfd, symbols, section, offset,
9292 filename_ptr, functionname_ptr))
0a1b45a2 9293 return false;
d1fad7c6 9294
252b5132 9295 *line_ptr = 0;
0a1b45a2 9296 return true;
252b5132
RH
9297}
9298
5420f73d
L
9299/* Find the line for a symbol. */
9300
0a1b45a2 9301bool
5420f73d
L
9302_bfd_elf_find_line (bfd *abfd, asymbol **symbols, asymbol *symbol,
9303 const char **filename_ptr, unsigned int *line_ptr)
9b8d1a36 9304{
fb167eb2
AM
9305 return _bfd_dwarf2_find_nearest_line (abfd, symbols, symbol, NULL, 0,
9306 filename_ptr, NULL, line_ptr, NULL,
9defd221 9307 dwarf_debug_sections,
fb167eb2 9308 &elf_tdata (abfd)->dwarf2_find_line_info);
5420f73d
L
9309}
9310
4ab527b0
FF
9311/* After a call to bfd_find_nearest_line, successive calls to
9312 bfd_find_inliner_info can be used to get source information about
9313 each level of function inlining that terminated at the address
9314 passed to bfd_find_nearest_line. Currently this is only supported
9315 for DWARF2 with appropriate DWARF3 extensions. */
9316
0a1b45a2 9317bool
4ab527b0
FF
9318_bfd_elf_find_inliner_info (bfd *abfd,
9319 const char **filename_ptr,
9320 const char **functionname_ptr,
9321 unsigned int *line_ptr)
9322{
0a1b45a2 9323 bool found;
4ab527b0
FF
9324 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
9325 functionname_ptr, line_ptr,
9326 & elf_tdata (abfd)->dwarf2_find_line_info);
9327 return found;
9328}
9329
252b5132 9330int
a6b96beb 9331_bfd_elf_sizeof_headers (bfd *abfd, struct bfd_link_info *info)
252b5132 9332{
8ded5a0f
AM
9333 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
9334 int ret = bed->s->sizeof_ehdr;
252b5132 9335
0e1862bb 9336 if (!bfd_link_relocatable (info))
8ded5a0f 9337 {
12bd6957 9338 bfd_size_type phdr_size = elf_program_header_size (abfd);
8ded5a0f 9339
62d7a5f6
AM
9340 if (phdr_size == (bfd_size_type) -1)
9341 {
9342 struct elf_segment_map *m;
9343
9344 phdr_size = 0;
12bd6957 9345 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
62d7a5f6 9346 phdr_size += bed->s->sizeof_phdr;
8ded5a0f 9347
62d7a5f6
AM
9348 if (phdr_size == 0)
9349 phdr_size = get_program_header_size (abfd, info);
9350 }
8ded5a0f 9351
12bd6957 9352 elf_program_header_size (abfd) = phdr_size;
8ded5a0f
AM
9353 ret += phdr_size;
9354 }
9355
252b5132
RH
9356 return ret;
9357}
9358
0a1b45a2 9359bool
217aa764
AM
9360_bfd_elf_set_section_contents (bfd *abfd,
9361 sec_ptr section,
0f867abe 9362 const void *location,
217aa764
AM
9363 file_ptr offset,
9364 bfd_size_type count)
252b5132
RH
9365{
9366 Elf_Internal_Shdr *hdr;
1b6aeedb 9367 file_ptr pos;
252b5132
RH
9368
9369 if (! abfd->output_has_begun
217aa764 9370 && ! _bfd_elf_compute_section_file_positions (abfd, NULL))
0a1b45a2 9371 return false;
252b5132 9372
0ce398f1 9373 if (!count)
0a1b45a2 9374 return true;
0ce398f1 9375
252b5132 9376 hdr = &elf_section_data (section)->this_hdr;
0ce398f1
L
9377 if (hdr->sh_offset == (file_ptr) -1)
9378 {
a0dcf297
NC
9379 unsigned char *contents;
9380
1ff6de03
NA
9381 if (bfd_section_is_ctf (section))
9382 /* Nothing to do with this section: the contents are generated
9383 later. */
0a1b45a2 9384 return true;
1ff6de03 9385
a0dcf297
NC
9386 if ((section->flags & SEC_ELF_COMPRESS) == 0)
9387 {
9388 _bfd_error_handler
9389 (_("%pB:%pA: error: attempting to write into an unallocated compressed section"),
9390 abfd, section);
9391 bfd_set_error (bfd_error_invalid_operation);
0a1b45a2 9392 return false;
a0dcf297
NC
9393 }
9394
9395 if ((offset + count) > hdr->sh_size)
9396 {
9397 _bfd_error_handler
9398 (_("%pB:%pA: error: attempting to write over the end of the section"),
9399 abfd, section);
9400
9401 bfd_set_error (bfd_error_invalid_operation);
0a1b45a2 9402 return false;
a0dcf297
NC
9403 }
9404
9405 contents = hdr->contents;
9406 if (contents == NULL)
9407 {
9408 _bfd_error_handler
9409 (_("%pB:%pA: error: attempting to write section into an empty buffer"),
9410 abfd, section);
9411
9412 bfd_set_error (bfd_error_invalid_operation);
0a1b45a2 9413 return false;
a0dcf297
NC
9414 }
9415
0ce398f1 9416 memcpy (contents + offset, location, count);
0a1b45a2 9417 return true;
0ce398f1 9418 }
a0dcf297 9419
dc810e39
AM
9420 pos = hdr->sh_offset + offset;
9421 if (bfd_seek (abfd, pos, SEEK_SET) != 0
9422 || bfd_bwrite (location, count, abfd) != count)
0a1b45a2 9423 return false;
252b5132 9424
0a1b45a2 9425 return true;
252b5132
RH
9426}
9427
0a1b45a2 9428bool
217aa764
AM
9429_bfd_elf_no_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
9430 arelent *cache_ptr ATTRIBUTE_UNUSED,
9431 Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
252b5132
RH
9432{
9433 abort ();
0a1b45a2 9434 return false;
252b5132
RH
9435}
9436
252b5132
RH
9437/* Try to convert a non-ELF reloc into an ELF one. */
9438
0a1b45a2 9439bool
217aa764 9440_bfd_elf_validate_reloc (bfd *abfd, arelent *areloc)
252b5132 9441{
c044fabd 9442 /* Check whether we really have an ELF howto. */
252b5132
RH
9443
9444 if ((*areloc->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec)
9445 {
9446 bfd_reloc_code_real_type code;
9447 reloc_howto_type *howto;
9448
9449 /* Alien reloc: Try to determine its type to replace it with an
c044fabd 9450 equivalent ELF reloc. */
252b5132
RH
9451
9452 if (areloc->howto->pc_relative)
9453 {
9454 switch (areloc->howto->bitsize)
9455 {
9456 case 8:
9457 code = BFD_RELOC_8_PCREL;
9458 break;
9459 case 12:
9460 code = BFD_RELOC_12_PCREL;
9461 break;
9462 case 16:
9463 code = BFD_RELOC_16_PCREL;
9464 break;
9465 case 24:
9466 code = BFD_RELOC_24_PCREL;
9467 break;
9468 case 32:
9469 code = BFD_RELOC_32_PCREL;
9470 break;
9471 case 64:
9472 code = BFD_RELOC_64_PCREL;
9473 break;
9474 default:
9475 goto fail;
9476 }
9477
9478 howto = bfd_reloc_type_lookup (abfd, code);
9479
94698d01 9480 if (howto && areloc->howto->pcrel_offset != howto->pcrel_offset)
252b5132
RH
9481 {
9482 if (howto->pcrel_offset)
9483 areloc->addend += areloc->address;
9484 else
9485 areloc->addend -= areloc->address; /* addend is unsigned!! */
9486 }
9487 }
9488 else
9489 {
9490 switch (areloc->howto->bitsize)
9491 {
9492 case 8:
9493 code = BFD_RELOC_8;
9494 break;
9495 case 14:
9496 code = BFD_RELOC_14;
9497 break;
9498 case 16:
9499 code = BFD_RELOC_16;
9500 break;
9501 case 26:
9502 code = BFD_RELOC_26;
9503 break;
9504 case 32:
9505 code = BFD_RELOC_32;
9506 break;
9507 case 64:
9508 code = BFD_RELOC_64;
9509 break;
9510 default:
9511 goto fail;
9512 }
9513
9514 howto = bfd_reloc_type_lookup (abfd, code);
9515 }
9516
9517 if (howto)
9518 areloc->howto = howto;
9519 else
9520 goto fail;
9521 }
9522
0a1b45a2 9523 return true;
252b5132
RH
9524
9525 fail:
0aa13fee
AM
9526 /* xgettext:c-format */
9527 _bfd_error_handler (_("%pB: %s unsupported"),
9528 abfd, areloc->howto->name);
9aea1e31 9529 bfd_set_error (bfd_error_sorry);
0a1b45a2 9530 return false;
252b5132
RH
9531}
9532
0a1b45a2 9533bool
217aa764 9534_bfd_elf_close_and_cleanup (bfd *abfd)
252b5132 9535{
d9071b0c 9536 struct elf_obj_tdata *tdata = elf_tdata (abfd);
0ed18fa1
AM
9537 if (tdata != NULL
9538 && (bfd_get_format (abfd) == bfd_object
9539 || bfd_get_format (abfd) == bfd_core))
252b5132 9540 {
c0355132 9541 if (elf_tdata (abfd)->o != NULL && elf_shstrtab (abfd) != NULL)
2b0f7ef9 9542 _bfd_elf_strtab_free (elf_shstrtab (abfd));
d9071b0c 9543 _bfd_dwarf2_cleanup_debug_info (abfd, &tdata->dwarf2_find_line_info);
252b5132
RH
9544 }
9545
9546 return _bfd_generic_close_and_cleanup (abfd);
9547}
9548
9549/* For Rel targets, we encode meaningful data for BFD_RELOC_VTABLE_ENTRY
9550 in the relocation's offset. Thus we cannot allow any sort of sanity
9551 range-checking to interfere. There is nothing else to do in processing
9552 this reloc. */
9553
9554bfd_reloc_status_type
217aa764
AM
9555_bfd_elf_rel_vtable_reloc_fn
9556 (bfd *abfd ATTRIBUTE_UNUSED, arelent *re ATTRIBUTE_UNUSED,
fc0a2244 9557 struct bfd_symbol *symbol ATTRIBUTE_UNUSED,
217aa764
AM
9558 void *data ATTRIBUTE_UNUSED, asection *is ATTRIBUTE_UNUSED,
9559 bfd *obfd ATTRIBUTE_UNUSED, char **errmsg ATTRIBUTE_UNUSED)
252b5132
RH
9560{
9561 return bfd_reloc_ok;
9562}
252b5132
RH
9563\f
9564/* Elf core file support. Much of this only works on native
9565 toolchains, since we rely on knowing the
9566 machine-dependent procfs structure in order to pick
c044fabd 9567 out details about the corefile. */
252b5132
RH
9568
9569#ifdef HAVE_SYS_PROCFS_H
9570# include <sys/procfs.h>
9571#endif
9572
261b8d08
PA
9573/* Return a PID that identifies a "thread" for threaded cores, or the
9574 PID of the main process for non-threaded cores. */
252b5132
RH
9575
9576static int
217aa764 9577elfcore_make_pid (bfd *abfd)
252b5132 9578{
261b8d08
PA
9579 int pid;
9580
228e534f 9581 pid = elf_tdata (abfd)->core->lwpid;
261b8d08 9582 if (pid == 0)
228e534f 9583 pid = elf_tdata (abfd)->core->pid;
261b8d08
PA
9584
9585 return pid;
252b5132
RH
9586}
9587
252b5132
RH
9588/* If there isn't a section called NAME, make one, using
9589 data from SECT. Note, this function will generate a
9590 reference to NAME, so you shouldn't deallocate or
c044fabd 9591 overwrite it. */
252b5132 9592
0a1b45a2 9593static bool
217aa764 9594elfcore_maybe_make_sect (bfd *abfd, char *name, asection *sect)
252b5132 9595{
c044fabd 9596 asection *sect2;
252b5132
RH
9597
9598 if (bfd_get_section_by_name (abfd, name) != NULL)
0a1b45a2 9599 return true;
252b5132 9600
117ed4f8 9601 sect2 = bfd_make_section_with_flags (abfd, name, sect->flags);
252b5132 9602 if (sect2 == NULL)
0a1b45a2 9603 return false;
252b5132 9604
eea6121a 9605 sect2->size = sect->size;
252b5132 9606 sect2->filepos = sect->filepos;
252b5132 9607 sect2->alignment_power = sect->alignment_power;
0a1b45a2 9608 return true;
252b5132
RH
9609}
9610
bb0082d6
AM
9611/* Create a pseudosection containing SIZE bytes at FILEPOS. This
9612 actually creates up to two pseudosections:
9613 - For the single-threaded case, a section named NAME, unless
9614 such a section already exists.
9615 - For the multi-threaded case, a section named "NAME/PID", where
9616 PID is elfcore_make_pid (abfd).
24d3e51b 9617 Both pseudosections have identical contents. */
0a1b45a2 9618bool
217aa764
AM
9619_bfd_elfcore_make_pseudosection (bfd *abfd,
9620 char *name,
9621 size_t size,
9622 ufile_ptr filepos)
bb0082d6
AM
9623{
9624 char buf[100];
9625 char *threaded_name;
d4c88bbb 9626 size_t len;
bb0082d6
AM
9627 asection *sect;
9628
9629 /* Build the section name. */
9630
9631 sprintf (buf, "%s/%d", name, elfcore_make_pid (abfd));
d4c88bbb 9632 len = strlen (buf) + 1;
a50b1753 9633 threaded_name = (char *) bfd_alloc (abfd, len);
bb0082d6 9634 if (threaded_name == NULL)
0a1b45a2 9635 return false;
d4c88bbb 9636 memcpy (threaded_name, buf, len);
bb0082d6 9637
117ed4f8
AM
9638 sect = bfd_make_section_anyway_with_flags (abfd, threaded_name,
9639 SEC_HAS_CONTENTS);
bb0082d6 9640 if (sect == NULL)
0a1b45a2 9641 return false;
eea6121a 9642 sect->size = size;
bb0082d6 9643 sect->filepos = filepos;
bb0082d6
AM
9644 sect->alignment_power = 2;
9645
936e320b 9646 return elfcore_maybe_make_sect (abfd, name, sect);
bb0082d6
AM
9647}
9648
0a1b45a2 9649static bool
58e07198
CZ
9650elfcore_make_auxv_note_section (bfd *abfd, Elf_Internal_Note *note,
9651 size_t offs)
9652{
9653 asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
9654 SEC_HAS_CONTENTS);
9655
9656 if (sect == NULL)
0a1b45a2 9657 return false;
58e07198
CZ
9658
9659 sect->size = note->descsz - offs;
9660 sect->filepos = note->descpos + offs;
9661 sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
9662
0a1b45a2 9663 return true;
58e07198
CZ
9664}
9665
252b5132 9666/* prstatus_t exists on:
4a938328 9667 solaris 2.5+
252b5132
RH
9668 linux 2.[01] + glibc
9669 unixware 4.2
9670*/
9671
9672#if defined (HAVE_PRSTATUS_T)
a7b97311 9673
0a1b45a2 9674static bool
217aa764 9675elfcore_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132 9676{
eea6121a 9677 size_t size;
7ee38065 9678 int offset;
252b5132 9679
4a938328
MS
9680 if (note->descsz == sizeof (prstatus_t))
9681 {
9682 prstatus_t prstat;
252b5132 9683
eea6121a 9684 size = sizeof (prstat.pr_reg);
7ee38065 9685 offset = offsetof (prstatus_t, pr_reg);
4a938328 9686 memcpy (&prstat, note->descdata, sizeof (prstat));
252b5132 9687
fa49d224
NC
9688 /* Do not overwrite the core signal if it
9689 has already been set by another thread. */
228e534f
AM
9690 if (elf_tdata (abfd)->core->signal == 0)
9691 elf_tdata (abfd)->core->signal = prstat.pr_cursig;
9692 if (elf_tdata (abfd)->core->pid == 0)
9693 elf_tdata (abfd)->core->pid = prstat.pr_pid;
252b5132 9694
4a938328
MS
9695 /* pr_who exists on:
9696 solaris 2.5+
9697 unixware 4.2
9698 pr_who doesn't exist on:
9699 linux 2.[01]
9700 */
252b5132 9701#if defined (HAVE_PRSTATUS_T_PR_WHO)
228e534f 9702 elf_tdata (abfd)->core->lwpid = prstat.pr_who;
261b8d08 9703#else
228e534f 9704 elf_tdata (abfd)->core->lwpid = prstat.pr_pid;
252b5132 9705#endif
4a938328 9706 }
7ee38065 9707#if defined (HAVE_PRSTATUS32_T)
4a938328
MS
9708 else if (note->descsz == sizeof (prstatus32_t))
9709 {
9710 /* 64-bit host, 32-bit corefile */
9711 prstatus32_t prstat;
9712
eea6121a 9713 size = sizeof (prstat.pr_reg);
7ee38065 9714 offset = offsetof (prstatus32_t, pr_reg);
4a938328
MS
9715 memcpy (&prstat, note->descdata, sizeof (prstat));
9716
fa49d224
NC
9717 /* Do not overwrite the core signal if it
9718 has already been set by another thread. */
228e534f
AM
9719 if (elf_tdata (abfd)->core->signal == 0)
9720 elf_tdata (abfd)->core->signal = prstat.pr_cursig;
9721 if (elf_tdata (abfd)->core->pid == 0)
9722 elf_tdata (abfd)->core->pid = prstat.pr_pid;
4a938328
MS
9723
9724 /* pr_who exists on:
9725 solaris 2.5+
9726 unixware 4.2
9727 pr_who doesn't exist on:
9728 linux 2.[01]
9729 */
7ee38065 9730#if defined (HAVE_PRSTATUS32_T_PR_WHO)
228e534f 9731 elf_tdata (abfd)->core->lwpid = prstat.pr_who;
261b8d08 9732#else
228e534f 9733 elf_tdata (abfd)->core->lwpid = prstat.pr_pid;
4a938328
MS
9734#endif
9735 }
7ee38065 9736#endif /* HAVE_PRSTATUS32_T */
4a938328
MS
9737 else
9738 {
9739 /* Fail - we don't know how to handle any other
9740 note size (ie. data object type). */
0a1b45a2 9741 return true;
4a938328 9742 }
252b5132 9743
bb0082d6 9744 /* Make a ".reg/999" section and a ".reg" section. */
936e320b 9745 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 9746 size, note->descpos + offset);
252b5132
RH
9747}
9748#endif /* defined (HAVE_PRSTATUS_T) */
9749
bb0082d6 9750/* Create a pseudosection containing the exact contents of NOTE. */
0a1b45a2 9751static bool
217aa764
AM
9752elfcore_make_note_pseudosection (bfd *abfd,
9753 char *name,
9754 Elf_Internal_Note *note)
252b5132 9755{
936e320b
AM
9756 return _bfd_elfcore_make_pseudosection (abfd, name,
9757 note->descsz, note->descpos);
252b5132
RH
9758}
9759
ff08c6bb
JB
9760/* There isn't a consistent prfpregset_t across platforms,
9761 but it doesn't matter, because we don't have to pick this
c044fabd
KH
9762 data structure apart. */
9763
0a1b45a2 9764static bool
217aa764 9765elfcore_grok_prfpreg (bfd *abfd, Elf_Internal_Note *note)
ff08c6bb
JB
9766{
9767 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
9768}
9769
ff08c6bb 9770/* Linux dumps the Intel SSE regs in a note named "LINUX" with a note
971d4640 9771 type of NT_PRXFPREG. Just include the whole note's contents
ff08c6bb 9772 literally. */
c044fabd 9773
0a1b45a2 9774static bool
217aa764 9775elfcore_grok_prxfpreg (bfd *abfd, Elf_Internal_Note *note)
ff08c6bb
JB
9776{
9777 return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
9778}
9779
4339cae0
L
9780/* Linux dumps the Intel XSAVE extended state in a note named "LINUX"
9781 with a note type of NT_X86_XSTATE. Just include the whole note's
9782 contents literally. */
9783
0a1b45a2 9784static bool
4339cae0
L
9785elfcore_grok_xstatereg (bfd *abfd, Elf_Internal_Note *note)
9786{
9787 return elfcore_make_note_pseudosection (abfd, ".reg-xstate", note);
9788}
9789
0a1b45a2 9790static bool
97753bd5
AM
9791elfcore_grok_ppc_vmx (bfd *abfd, Elf_Internal_Note *note)
9792{
9793 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-vmx", note);
9794}
9795
0a1b45a2 9796static bool
89eeb0bc
LM
9797elfcore_grok_ppc_vsx (bfd *abfd, Elf_Internal_Note *note)
9798{
9799 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-vsx", note);
9800}
97753bd5 9801
0a1b45a2 9802static bool
cb2366c1
EBM
9803elfcore_grok_ppc_tar (bfd *abfd, Elf_Internal_Note *note)
9804{
9805 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tar", note);
9806}
9807
0a1b45a2 9808static bool
cb2366c1
EBM
9809elfcore_grok_ppc_ppr (bfd *abfd, Elf_Internal_Note *note)
9810{
9811 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-ppr", note);
9812}
9813
0a1b45a2 9814static bool
cb2366c1
EBM
9815elfcore_grok_ppc_dscr (bfd *abfd, Elf_Internal_Note *note)
9816{
9817 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-dscr", note);
9818}
9819
0a1b45a2 9820static bool
cb2366c1
EBM
9821elfcore_grok_ppc_ebb (bfd *abfd, Elf_Internal_Note *note)
9822{
9823 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-ebb", note);
9824}
9825
0a1b45a2 9826static bool
cb2366c1
EBM
9827elfcore_grok_ppc_pmu (bfd *abfd, Elf_Internal_Note *note)
9828{
9829 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-pmu", note);
9830}
9831
0a1b45a2 9832static bool
cb2366c1
EBM
9833elfcore_grok_ppc_tm_cgpr (bfd *abfd, Elf_Internal_Note *note)
9834{
9835 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cgpr", note);
9836}
9837
0a1b45a2 9838static bool
cb2366c1
EBM
9839elfcore_grok_ppc_tm_cfpr (bfd *abfd, Elf_Internal_Note *note)
9840{
9841 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cfpr", note);
9842}
9843
0a1b45a2 9844static bool
cb2366c1
EBM
9845elfcore_grok_ppc_tm_cvmx (bfd *abfd, Elf_Internal_Note *note)
9846{
9847 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cvmx", note);
9848}
9849
0a1b45a2 9850static bool
cb2366c1
EBM
9851elfcore_grok_ppc_tm_cvsx (bfd *abfd, Elf_Internal_Note *note)
9852{
9853 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cvsx", note);
9854}
9855
0a1b45a2 9856static bool
cb2366c1
EBM
9857elfcore_grok_ppc_tm_spr (bfd *abfd, Elf_Internal_Note *note)
9858{
9859 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-spr", note);
9860}
9861
0a1b45a2 9862static bool
cb2366c1
EBM
9863elfcore_grok_ppc_tm_ctar (bfd *abfd, Elf_Internal_Note *note)
9864{
9865 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-ctar", note);
9866}
9867
0a1b45a2 9868static bool
cb2366c1
EBM
9869elfcore_grok_ppc_tm_cppr (bfd *abfd, Elf_Internal_Note *note)
9870{
9871 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cppr", note);
9872}
9873
0a1b45a2 9874static bool
cb2366c1
EBM
9875elfcore_grok_ppc_tm_cdscr (bfd *abfd, Elf_Internal_Note *note)
9876{
9877 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cdscr", note);
9878}
9879
0a1b45a2 9880static bool
0675e188
UW
9881elfcore_grok_s390_high_gprs (bfd *abfd, Elf_Internal_Note *note)
9882{
9883 return elfcore_make_note_pseudosection (abfd, ".reg-s390-high-gprs", note);
9884}
9885
0a1b45a2 9886static bool
d7eeb400
MS
9887elfcore_grok_s390_timer (bfd *abfd, Elf_Internal_Note *note)
9888{
9889 return elfcore_make_note_pseudosection (abfd, ".reg-s390-timer", note);
9890}
9891
0a1b45a2 9892static bool
d7eeb400
MS
9893elfcore_grok_s390_todcmp (bfd *abfd, Elf_Internal_Note *note)
9894{
9895 return elfcore_make_note_pseudosection (abfd, ".reg-s390-todcmp", note);
9896}
9897
0a1b45a2 9898static bool
d7eeb400
MS
9899elfcore_grok_s390_todpreg (bfd *abfd, Elf_Internal_Note *note)
9900{
9901 return elfcore_make_note_pseudosection (abfd, ".reg-s390-todpreg", note);
9902}
9903
0a1b45a2 9904static bool
d7eeb400
MS
9905elfcore_grok_s390_ctrs (bfd *abfd, Elf_Internal_Note *note)
9906{
9907 return elfcore_make_note_pseudosection (abfd, ".reg-s390-ctrs", note);
9908}
9909
0a1b45a2 9910static bool
d7eeb400
MS
9911elfcore_grok_s390_prefix (bfd *abfd, Elf_Internal_Note *note)
9912{
9913 return elfcore_make_note_pseudosection (abfd, ".reg-s390-prefix", note);
9914}
9915
0a1b45a2 9916static bool
355b81d9
UW
9917elfcore_grok_s390_last_break (bfd *abfd, Elf_Internal_Note *note)
9918{
9919 return elfcore_make_note_pseudosection (abfd, ".reg-s390-last-break", note);
9920}
9921
0a1b45a2 9922static bool
355b81d9
UW
9923elfcore_grok_s390_system_call (bfd *abfd, Elf_Internal_Note *note)
9924{
9925 return elfcore_make_note_pseudosection (abfd, ".reg-s390-system-call", note);
9926}
9927
0a1b45a2 9928static bool
abb3f6cc
NC
9929elfcore_grok_s390_tdb (bfd *abfd, Elf_Internal_Note *note)
9930{
9931 return elfcore_make_note_pseudosection (abfd, ".reg-s390-tdb", note);
9932}
9933
0a1b45a2 9934static bool
4ef9f41a
AA
9935elfcore_grok_s390_vxrs_low (bfd *abfd, Elf_Internal_Note *note)
9936{
9937 return elfcore_make_note_pseudosection (abfd, ".reg-s390-vxrs-low", note);
9938}
9939
0a1b45a2 9940static bool
4ef9f41a
AA
9941elfcore_grok_s390_vxrs_high (bfd *abfd, Elf_Internal_Note *note)
9942{
9943 return elfcore_make_note_pseudosection (abfd, ".reg-s390-vxrs-high", note);
9944}
9945
0a1b45a2 9946static bool
88ab90e8
AA
9947elfcore_grok_s390_gs_cb (bfd *abfd, Elf_Internal_Note *note)
9948{
9949 return elfcore_make_note_pseudosection (abfd, ".reg-s390-gs-cb", note);
9950}
9951
0a1b45a2 9952static bool
88ab90e8
AA
9953elfcore_grok_s390_gs_bc (bfd *abfd, Elf_Internal_Note *note)
9954{
9955 return elfcore_make_note_pseudosection (abfd, ".reg-s390-gs-bc", note);
9956}
9957
0a1b45a2 9958static bool
faa9a424
UW
9959elfcore_grok_arm_vfp (bfd *abfd, Elf_Internal_Note *note)
9960{
9961 return elfcore_make_note_pseudosection (abfd, ".reg-arm-vfp", note);
9962}
9963
0a1b45a2 9964static bool
652451f8
YZ
9965elfcore_grok_aarch_tls (bfd *abfd, Elf_Internal_Note *note)
9966{
9967 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-tls", note);
9968}
9969
0a1b45a2 9970static bool
652451f8
YZ
9971elfcore_grok_aarch_hw_break (bfd *abfd, Elf_Internal_Note *note)
9972{
9973 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-hw-break", note);
9974}
9975
0a1b45a2 9976static bool
652451f8
YZ
9977elfcore_grok_aarch_hw_watch (bfd *abfd, Elf_Internal_Note *note)
9978{
9979 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-hw-watch", note);
9980}
9981
0a1b45a2 9982static bool
ad1cc4e4
AH
9983elfcore_grok_aarch_sve (bfd *abfd, Elf_Internal_Note *note)
9984{
9985 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-sve", note);
9986}
9987
0a1b45a2 9988static bool
e6c3b5bf
AH
9989elfcore_grok_aarch_pauth (bfd *abfd, Elf_Internal_Note *note)
9990{
9991 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-pauth", note);
9992}
9993
f0bbe8ba
LM
9994static bool
9995elfcore_grok_aarch_mte (bfd *abfd, Elf_Internal_Note *note)
9996{
9997 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-mte",
9998 note);
9999}
10000
0a1b45a2 10001static bool
27456742
AK
10002elfcore_grok_arc_v2 (bfd *abfd, Elf_Internal_Note *note)
10003{
10004 return elfcore_make_note_pseudosection (abfd, ".reg-arc-v2", note);
10005}
10006
db6092f3
AB
10007/* Convert NOTE into a bfd_section called ".reg-riscv-csr". Return TRUE if
10008 successful otherwise, return FALSE. */
10009
0a1b45a2 10010static bool
db6092f3
AB
10011elfcore_grok_riscv_csr (bfd *abfd, Elf_Internal_Note *note)
10012{
10013 return elfcore_make_note_pseudosection (abfd, ".reg-riscv-csr", note);
10014}
10015
b63a5e38
AB
10016/* Convert NOTE into a bfd_section called ".gdb-tdesc". Return TRUE if
10017 successful otherwise, return FALSE. */
10018
0a1b45a2 10019static bool
b63a5e38
AB
10020elfcore_grok_gdb_tdesc (bfd *abfd, Elf_Internal_Note *note)
10021{
10022 return elfcore_make_note_pseudosection (abfd, ".gdb-tdesc", note);
10023}
10024
e214f8db 10025static bool
10026elfcore_grok_loongarch_cpucfg (bfd *abfd, Elf_Internal_Note *note)
10027{
10028 return elfcore_make_note_pseudosection (abfd, ".reg-loongarch-cpucfg", note);
10029}
10030
10031static bool
10032elfcore_grok_loongarch_lbt (bfd *abfd, Elf_Internal_Note *note)
10033{
10034 return elfcore_make_note_pseudosection (abfd, ".reg-loongarch-lbt", note);
10035}
10036
10037static bool
10038elfcore_grok_loongarch_lsx (bfd *abfd, Elf_Internal_Note *note)
10039{
10040 return elfcore_make_note_pseudosection (abfd, ".reg-loongarch-lsx", note);
10041}
10042
10043static bool
10044elfcore_grok_loongarch_lasx (bfd *abfd, Elf_Internal_Note *note)
10045{
10046 return elfcore_make_note_pseudosection (abfd, ".reg-loongarch-lasx", note);
10047}
10048
252b5132 10049#if defined (HAVE_PRPSINFO_T)
4a938328 10050typedef prpsinfo_t elfcore_psinfo_t;
7ee38065 10051#if defined (HAVE_PRPSINFO32_T) /* Sparc64 cross Sparc32 */
4a938328
MS
10052typedef prpsinfo32_t elfcore_psinfo32_t;
10053#endif
252b5132
RH
10054#endif
10055
10056#if defined (HAVE_PSINFO_T)
4a938328 10057typedef psinfo_t elfcore_psinfo_t;
7ee38065 10058#if defined (HAVE_PSINFO32_T) /* Sparc64 cross Sparc32 */
4a938328
MS
10059typedef psinfo32_t elfcore_psinfo32_t;
10060#endif
252b5132
RH
10061#endif
10062
252b5132
RH
10063/* return a malloc'ed copy of a string at START which is at
10064 most MAX bytes long, possibly without a terminating '\0'.
c044fabd 10065 the copy will always have a terminating '\0'. */
252b5132 10066
936e320b 10067char *
217aa764 10068_bfd_elfcore_strndup (bfd *abfd, char *start, size_t max)
252b5132 10069{
dc810e39 10070 char *dups;
a50b1753 10071 char *end = (char *) memchr (start, '\0', max);
dc810e39 10072 size_t len;
252b5132
RH
10073
10074 if (end == NULL)
10075 len = max;
10076 else
10077 len = end - start;
10078
a50b1753 10079 dups = (char *) bfd_alloc (abfd, len + 1);
dc810e39 10080 if (dups == NULL)
252b5132
RH
10081 return NULL;
10082
dc810e39
AM
10083 memcpy (dups, start, len);
10084 dups[len] = '\0';
252b5132 10085
dc810e39 10086 return dups;
252b5132
RH
10087}
10088
bb0082d6 10089#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
0a1b45a2 10090static bool
217aa764 10091elfcore_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
252b5132 10092{
4a938328
MS
10093 if (note->descsz == sizeof (elfcore_psinfo_t))
10094 {
10095 elfcore_psinfo_t psinfo;
252b5132 10096
7ee38065 10097 memcpy (&psinfo, note->descdata, sizeof (psinfo));
252b5132 10098
335e41d4 10099#if defined (HAVE_PSINFO_T_PR_PID) || defined (HAVE_PRPSINFO_T_PR_PID)
228e534f 10100 elf_tdata (abfd)->core->pid = psinfo.pr_pid;
335e41d4 10101#endif
228e534f 10102 elf_tdata (abfd)->core->program
936e320b
AM
10103 = _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
10104 sizeof (psinfo.pr_fname));
252b5132 10105
228e534f 10106 elf_tdata (abfd)->core->command
936e320b
AM
10107 = _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
10108 sizeof (psinfo.pr_psargs));
4a938328 10109 }
7ee38065 10110#if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
4a938328
MS
10111 else if (note->descsz == sizeof (elfcore_psinfo32_t))
10112 {
10113 /* 64-bit host, 32-bit corefile */
10114 elfcore_psinfo32_t psinfo;
10115
7ee38065 10116 memcpy (&psinfo, note->descdata, sizeof (psinfo));
252b5132 10117
335e41d4 10118#if defined (HAVE_PSINFO32_T_PR_PID) || defined (HAVE_PRPSINFO32_T_PR_PID)
228e534f 10119 elf_tdata (abfd)->core->pid = psinfo.pr_pid;
335e41d4 10120#endif
228e534f 10121 elf_tdata (abfd)->core->program
936e320b
AM
10122 = _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
10123 sizeof (psinfo.pr_fname));
4a938328 10124
228e534f 10125 elf_tdata (abfd)->core->command
936e320b
AM
10126 = _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
10127 sizeof (psinfo.pr_psargs));
4a938328
MS
10128 }
10129#endif
10130
10131 else
10132 {
10133 /* Fail - we don't know how to handle any other
10134 note size (ie. data object type). */
0a1b45a2 10135 return true;
4a938328 10136 }
252b5132
RH
10137
10138 /* Note that for some reason, a spurious space is tacked
10139 onto the end of the args in some (at least one anyway)
c044fabd 10140 implementations, so strip it off if it exists. */
252b5132
RH
10141
10142 {
228e534f 10143 char *command = elf_tdata (abfd)->core->command;
252b5132
RH
10144 int n = strlen (command);
10145
10146 if (0 < n && command[n - 1] == ' ')
10147 command[n - 1] = '\0';
10148 }
10149
0a1b45a2 10150 return true;
252b5132
RH
10151}
10152#endif /* defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T) */
10153
252b5132 10154#if defined (HAVE_PSTATUS_T)
0a1b45a2 10155static bool
217aa764 10156elfcore_grok_pstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132 10157{
f572a39d
AM
10158 if (note->descsz == sizeof (pstatus_t)
10159#if defined (HAVE_PXSTATUS_T)
10160 || note->descsz == sizeof (pxstatus_t)
10161#endif
10162 )
4a938328
MS
10163 {
10164 pstatus_t pstat;
252b5132 10165
4a938328 10166 memcpy (&pstat, note->descdata, sizeof (pstat));
252b5132 10167
228e534f 10168 elf_tdata (abfd)->core->pid = pstat.pr_pid;
4a938328 10169 }
7ee38065 10170#if defined (HAVE_PSTATUS32_T)
4a938328
MS
10171 else if (note->descsz == sizeof (pstatus32_t))
10172 {
10173 /* 64-bit host, 32-bit corefile */
10174 pstatus32_t pstat;
252b5132 10175
4a938328 10176 memcpy (&pstat, note->descdata, sizeof (pstat));
252b5132 10177
228e534f 10178 elf_tdata (abfd)->core->pid = pstat.pr_pid;
4a938328
MS
10179 }
10180#endif
252b5132
RH
10181 /* Could grab some more details from the "representative"
10182 lwpstatus_t in pstat.pr_lwp, but we'll catch it all in an
c044fabd 10183 NT_LWPSTATUS note, presumably. */
252b5132 10184
0a1b45a2 10185 return true;
252b5132
RH
10186}
10187#endif /* defined (HAVE_PSTATUS_T) */
10188
252b5132 10189#if defined (HAVE_LWPSTATUS_T)
0a1b45a2 10190static bool
217aa764 10191elfcore_grok_lwpstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132
RH
10192{
10193 lwpstatus_t lwpstat;
10194 char buf[100];
c044fabd 10195 char *name;
d4c88bbb 10196 size_t len;
c044fabd 10197 asection *sect;
252b5132 10198
f572a39d
AM
10199 if (note->descsz != sizeof (lwpstat)
10200#if defined (HAVE_LWPXSTATUS_T)
10201 && note->descsz != sizeof (lwpxstatus_t)
10202#endif
10203 )
0a1b45a2 10204 return true;
252b5132
RH
10205
10206 memcpy (&lwpstat, note->descdata, sizeof (lwpstat));
10207
228e534f 10208 elf_tdata (abfd)->core->lwpid = lwpstat.pr_lwpid;
a1504221
JB
10209 /* Do not overwrite the core signal if it has already been set by
10210 another thread. */
228e534f
AM
10211 if (elf_tdata (abfd)->core->signal == 0)
10212 elf_tdata (abfd)->core->signal = lwpstat.pr_cursig;
252b5132 10213
c044fabd 10214 /* Make a ".reg/999" section. */
252b5132
RH
10215
10216 sprintf (buf, ".reg/%d", elfcore_make_pid (abfd));
d4c88bbb 10217 len = strlen (buf) + 1;
217aa764 10218 name = bfd_alloc (abfd, len);
252b5132 10219 if (name == NULL)
0a1b45a2 10220 return false;
d4c88bbb 10221 memcpy (name, buf, len);
252b5132 10222
117ed4f8 10223 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
252b5132 10224 if (sect == NULL)
0a1b45a2 10225 return false;
252b5132
RH
10226
10227#if defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
eea6121a 10228 sect->size = sizeof (lwpstat.pr_context.uc_mcontext.gregs);
252b5132
RH
10229 sect->filepos = note->descpos
10230 + offsetof (lwpstatus_t, pr_context.uc_mcontext.gregs);
10231#endif
10232
10233#if defined (HAVE_LWPSTATUS_T_PR_REG)
eea6121a 10234 sect->size = sizeof (lwpstat.pr_reg);
252b5132
RH
10235 sect->filepos = note->descpos + offsetof (lwpstatus_t, pr_reg);
10236#endif
10237
252b5132
RH
10238 sect->alignment_power = 2;
10239
10240 if (!elfcore_maybe_make_sect (abfd, ".reg", sect))
0a1b45a2 10241 return false;
252b5132
RH
10242
10243 /* Make a ".reg2/999" section */
10244
10245 sprintf (buf, ".reg2/%d", elfcore_make_pid (abfd));
d4c88bbb 10246 len = strlen (buf) + 1;
217aa764 10247 name = bfd_alloc (abfd, len);
252b5132 10248 if (name == NULL)
0a1b45a2 10249 return false;
d4c88bbb 10250 memcpy (name, buf, len);
252b5132 10251
117ed4f8 10252 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
252b5132 10253 if (sect == NULL)
0a1b45a2 10254 return false;
252b5132
RH
10255
10256#if defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
eea6121a 10257 sect->size = sizeof (lwpstat.pr_context.uc_mcontext.fpregs);
252b5132
RH
10258 sect->filepos = note->descpos
10259 + offsetof (lwpstatus_t, pr_context.uc_mcontext.fpregs);
10260#endif
10261
10262#if defined (HAVE_LWPSTATUS_T_PR_FPREG)
eea6121a 10263 sect->size = sizeof (lwpstat.pr_fpreg);
252b5132
RH
10264 sect->filepos = note->descpos + offsetof (lwpstatus_t, pr_fpreg);
10265#endif
10266
252b5132
RH
10267 sect->alignment_power = 2;
10268
936e320b 10269 return elfcore_maybe_make_sect (abfd, ".reg2", sect);
252b5132
RH
10270}
10271#endif /* defined (HAVE_LWPSTATUS_T) */
10272
8fbac78b
JT
10273/* These constants, and the structure offsets used below, are defined by
10274 Cygwin's core_dump.h */
10275#define NOTE_INFO_PROCESS 1
10276#define NOTE_INFO_THREAD 2
10277#define NOTE_INFO_MODULE 3
d61f3d03 10278#define NOTE_INFO_MODULE64 4
8fbac78b 10279
0a1b45a2 10280static bool
217aa764 10281elfcore_grok_win32pstatus (bfd *abfd, Elf_Internal_Note *note)
16e9c715
NC
10282{
10283 char buf[30];
c044fabd 10284 char *name;
d4c88bbb 10285 size_t len;
3cdad084 10286 unsigned int name_size;
c044fabd 10287 asection *sect;
2fef9373 10288 unsigned int type;
4a6636fb
PA
10289 int is_active_thread;
10290 bfd_vma base_addr;
16e9c715 10291
04ec0fa2 10292 if (note->descsz < 4)
0a1b45a2 10293 return true;
16e9c715 10294
08dedd66 10295 if (! startswith (note->namedata, "win32"))
0a1b45a2 10296 return true;
4a6636fb
PA
10297
10298 type = bfd_get_32 (abfd, note->descdata);
c044fabd 10299
7e0d77ef
NC
10300 struct
10301 {
404ec933
JT
10302 const char *type_name;
10303 unsigned long min_size;
10304 } size_check[] =
10305 {
10306 { "NOTE_INFO_PROCESS", 12 },
10307 { "NOTE_INFO_THREAD", 12 },
10308 { "NOTE_INFO_MODULE", 12 },
10309 { "NOTE_INFO_MODULE64", 16 },
10310 };
10311
7e0d77ef 10312 if (type == 0 || type > (sizeof(size_check)/sizeof(size_check[0])))
0a1b45a2 10313 return true;
404ec933
JT
10314
10315 if (note->descsz < size_check[type - 1].min_size)
10316 {
10317 _bfd_error_handler (_("%pB: warning: win32pstatus %s of size %lu bytes is too small"),
10318 abfd, size_check[type - 1].type_name, note->descsz);
0a1b45a2 10319 return true;
404ec933
JT
10320 }
10321
4a6636fb 10322 switch (type)
16e9c715 10323 {
8fbac78b 10324 case NOTE_INFO_PROCESS:
228e534f 10325 /* FIXME: need to add ->core->command. */
ff2084b9 10326 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 4);
ff2084b9 10327 elf_tdata (abfd)->core->signal = bfd_get_32 (abfd, note->descdata + 8);
c044fabd 10328 break;
16e9c715 10329
8fbac78b 10330 case NOTE_INFO_THREAD:
ff2084b9
JT
10331 /* Make a ".reg/<tid>" section containing the Win32 API thread CONTEXT
10332 structure. */
4a6636fb 10333 /* thread_info.tid */
ff2084b9 10334 sprintf (buf, ".reg/%ld", (long) bfd_get_32 (abfd, note->descdata + 4));
c044fabd 10335
d4c88bbb 10336 len = strlen (buf) + 1;
a50b1753 10337 name = (char *) bfd_alloc (abfd, len);
16e9c715 10338 if (name == NULL)
0a1b45a2 10339 return false;
c044fabd 10340
d4c88bbb 10341 memcpy (name, buf, len);
16e9c715 10342
117ed4f8 10343 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
16e9c715 10344 if (sect == NULL)
0a1b45a2 10345 return false;
c044fabd 10346
4a6636fb 10347 /* sizeof (thread_info.thread_context) */
03c29a6f 10348 sect->size = note->descsz - 12;
4a6636fb
PA
10349 /* offsetof (thread_info.thread_context) */
10350 sect->filepos = note->descpos + 12;
16e9c715
NC
10351 sect->alignment_power = 2;
10352
4a6636fb
PA
10353 /* thread_info.is_active_thread */
10354 is_active_thread = bfd_get_32 (abfd, note->descdata + 8);
10355
10356 if (is_active_thread)
16e9c715 10357 if (! elfcore_maybe_make_sect (abfd, ".reg", sect))
0a1b45a2 10358 return false;
16e9c715
NC
10359 break;
10360
8fbac78b 10361 case NOTE_INFO_MODULE:
d61f3d03 10362 case NOTE_INFO_MODULE64:
16e9c715 10363 /* Make a ".module/xxxxxxxx" section. */
d61f3d03
JT
10364 if (type == NOTE_INFO_MODULE)
10365 {
d61f3d03
JT
10366 /* module_info.base_address */
10367 base_addr = bfd_get_32 (abfd, note->descdata + 4);
10368 sprintf (buf, ".module/%08lx", (unsigned long) base_addr);
10369 /* module_info.module_name_size */
10370 name_size = bfd_get_32 (abfd, note->descdata + 8);
10371 }
10372 else /* NOTE_INFO_MODULE64 */
10373 {
d61f3d03
JT
10374 /* module_info.base_address */
10375 base_addr = bfd_get_64 (abfd, note->descdata + 4);
10376 sprintf (buf, ".module/%016lx", (unsigned long) base_addr);
10377 /* module_info.module_name_size */
10378 name_size = bfd_get_32 (abfd, note->descdata + 12);
10379 }
c044fabd 10380
d4c88bbb 10381 len = strlen (buf) + 1;
a50b1753 10382 name = (char *) bfd_alloc (abfd, len);
16e9c715 10383 if (name == NULL)
0a1b45a2 10384 return false;
c044fabd 10385
d4c88bbb 10386 memcpy (name, buf, len);
252b5132 10387
117ed4f8 10388 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
c044fabd 10389
16e9c715 10390 if (sect == NULL)
0a1b45a2 10391 return false;
c044fabd 10392
04ec0fa2 10393 if (note->descsz < 12 + name_size)
404ec933 10394 {
3cdad084 10395 _bfd_error_handler (_("%pB: win32pstatus NOTE_INFO_MODULE of size %lu is too small to contain a name of size %u"),
404ec933 10396 abfd, note->descsz, name_size);
0a1b45a2 10397 return true;
404ec933 10398 }
04ec0fa2 10399
eea6121a 10400 sect->size = note->descsz;
16e9c715 10401 sect->filepos = note->descpos;
16e9c715
NC
10402 sect->alignment_power = 2;
10403 break;
10404
10405 default:
0a1b45a2 10406 return true;
16e9c715
NC
10407 }
10408
0a1b45a2 10409 return true;
16e9c715 10410}
252b5132 10411
0a1b45a2 10412static bool
217aa764 10413elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
252b5132 10414{
9c5bfbb7 10415 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
bb0082d6 10416
252b5132
RH
10417 switch (note->type)
10418 {
10419 default:
0a1b45a2 10420 return true;
252b5132 10421
252b5132 10422 case NT_PRSTATUS:
bb0082d6
AM
10423 if (bed->elf_backend_grok_prstatus)
10424 if ((*bed->elf_backend_grok_prstatus) (abfd, note))
0a1b45a2 10425 return true;
bb0082d6 10426#if defined (HAVE_PRSTATUS_T)
252b5132 10427 return elfcore_grok_prstatus (abfd, note);
bb0082d6 10428#else
0a1b45a2 10429 return true;
252b5132
RH
10430#endif
10431
10432#if defined (HAVE_PSTATUS_T)
10433 case NT_PSTATUS:
10434 return elfcore_grok_pstatus (abfd, note);
10435#endif
10436
10437#if defined (HAVE_LWPSTATUS_T)
10438 case NT_LWPSTATUS:
10439 return elfcore_grok_lwpstatus (abfd, note);
10440#endif
10441
10442 case NT_FPREGSET: /* FIXME: rename to NT_PRFPREG */
10443 return elfcore_grok_prfpreg (abfd, note);
10444
c044fabd 10445 case NT_WIN32PSTATUS:
16e9c715 10446 return elfcore_grok_win32pstatus (abfd, note);
16e9c715 10447
c044fabd 10448 case NT_PRXFPREG: /* Linux SSE extension */
e377ab71
MK
10449 if (note->namesz == 6
10450 && strcmp (note->namedata, "LINUX") == 0)
ff08c6bb
JB
10451 return elfcore_grok_prxfpreg (abfd, note);
10452 else
0a1b45a2 10453 return true;
ff08c6bb 10454
4339cae0
L
10455 case NT_X86_XSTATE: /* Linux XSAVE extension */
10456 if (note->namesz == 6
10457 && strcmp (note->namedata, "LINUX") == 0)
10458 return elfcore_grok_xstatereg (abfd, note);
10459 else
0a1b45a2 10460 return true;
4339cae0 10461
97753bd5
AM
10462 case NT_PPC_VMX:
10463 if (note->namesz == 6
10464 && strcmp (note->namedata, "LINUX") == 0)
10465 return elfcore_grok_ppc_vmx (abfd, note);
10466 else
0a1b45a2 10467 return true;
97753bd5 10468
89eeb0bc
LM
10469 case NT_PPC_VSX:
10470 if (note->namesz == 6
07d6d2b8
AM
10471 && strcmp (note->namedata, "LINUX") == 0)
10472 return elfcore_grok_ppc_vsx (abfd, note);
89eeb0bc 10473 else
0a1b45a2 10474 return true;
89eeb0bc 10475
cb2366c1
EBM
10476 case NT_PPC_TAR:
10477 if (note->namesz == 6
4b24dd1a
AM
10478 && strcmp (note->namedata, "LINUX") == 0)
10479 return elfcore_grok_ppc_tar (abfd, note);
cb2366c1 10480 else
0a1b45a2 10481 return true;
cb2366c1
EBM
10482
10483 case NT_PPC_PPR:
10484 if (note->namesz == 6
4b24dd1a
AM
10485 && strcmp (note->namedata, "LINUX") == 0)
10486 return elfcore_grok_ppc_ppr (abfd, note);
cb2366c1 10487 else
0a1b45a2 10488 return true;
cb2366c1
EBM
10489
10490 case NT_PPC_DSCR:
10491 if (note->namesz == 6
4b24dd1a
AM
10492 && strcmp (note->namedata, "LINUX") == 0)
10493 return elfcore_grok_ppc_dscr (abfd, note);
cb2366c1 10494 else
0a1b45a2 10495 return true;
cb2366c1
EBM
10496
10497 case NT_PPC_EBB:
10498 if (note->namesz == 6
4b24dd1a
AM
10499 && strcmp (note->namedata, "LINUX") == 0)
10500 return elfcore_grok_ppc_ebb (abfd, note);
cb2366c1 10501 else
0a1b45a2 10502 return true;
cb2366c1
EBM
10503
10504 case NT_PPC_PMU:
10505 if (note->namesz == 6
4b24dd1a
AM
10506 && strcmp (note->namedata, "LINUX") == 0)
10507 return elfcore_grok_ppc_pmu (abfd, note);
cb2366c1 10508 else
0a1b45a2 10509 return true;
cb2366c1
EBM
10510
10511 case NT_PPC_TM_CGPR:
10512 if (note->namesz == 6
4b24dd1a
AM
10513 && strcmp (note->namedata, "LINUX") == 0)
10514 return elfcore_grok_ppc_tm_cgpr (abfd, note);
cb2366c1 10515 else
0a1b45a2 10516 return true;
cb2366c1
EBM
10517
10518 case NT_PPC_TM_CFPR:
10519 if (note->namesz == 6
4b24dd1a
AM
10520 && strcmp (note->namedata, "LINUX") == 0)
10521 return elfcore_grok_ppc_tm_cfpr (abfd, note);
cb2366c1 10522 else
0a1b45a2 10523 return true;
cb2366c1
EBM
10524
10525 case NT_PPC_TM_CVMX:
10526 if (note->namesz == 6
4b24dd1a
AM
10527 && strcmp (note->namedata, "LINUX") == 0)
10528 return elfcore_grok_ppc_tm_cvmx (abfd, note);
cb2366c1 10529 else
0a1b45a2 10530 return true;
cb2366c1
EBM
10531
10532 case NT_PPC_TM_CVSX:
10533 if (note->namesz == 6
4b24dd1a
AM
10534 && strcmp (note->namedata, "LINUX") == 0)
10535 return elfcore_grok_ppc_tm_cvsx (abfd, note);
cb2366c1 10536 else
0a1b45a2 10537 return true;
cb2366c1
EBM
10538
10539 case NT_PPC_TM_SPR:
10540 if (note->namesz == 6
4b24dd1a
AM
10541 && strcmp (note->namedata, "LINUX") == 0)
10542 return elfcore_grok_ppc_tm_spr (abfd, note);
cb2366c1 10543 else
0a1b45a2 10544 return true;
cb2366c1
EBM
10545
10546 case NT_PPC_TM_CTAR:
10547 if (note->namesz == 6
4b24dd1a
AM
10548 && strcmp (note->namedata, "LINUX") == 0)
10549 return elfcore_grok_ppc_tm_ctar (abfd, note);
cb2366c1 10550 else
0a1b45a2 10551 return true;
cb2366c1
EBM
10552
10553 case NT_PPC_TM_CPPR:
10554 if (note->namesz == 6
4b24dd1a
AM
10555 && strcmp (note->namedata, "LINUX") == 0)
10556 return elfcore_grok_ppc_tm_cppr (abfd, note);
cb2366c1 10557 else
0a1b45a2 10558 return true;
cb2366c1
EBM
10559
10560 case NT_PPC_TM_CDSCR:
10561 if (note->namesz == 6
4b24dd1a
AM
10562 && strcmp (note->namedata, "LINUX") == 0)
10563 return elfcore_grok_ppc_tm_cdscr (abfd, note);
cb2366c1 10564 else
0a1b45a2 10565 return true;
cb2366c1 10566
0675e188
UW
10567 case NT_S390_HIGH_GPRS:
10568 if (note->namesz == 6
07d6d2b8
AM
10569 && strcmp (note->namedata, "LINUX") == 0)
10570 return elfcore_grok_s390_high_gprs (abfd, note);
0675e188 10571 else
0a1b45a2 10572 return true;
0675e188 10573
d7eeb400
MS
10574 case NT_S390_TIMER:
10575 if (note->namesz == 6
07d6d2b8
AM
10576 && strcmp (note->namedata, "LINUX") == 0)
10577 return elfcore_grok_s390_timer (abfd, note);
d7eeb400 10578 else
0a1b45a2 10579 return true;
d7eeb400
MS
10580
10581 case NT_S390_TODCMP:
10582 if (note->namesz == 6
07d6d2b8
AM
10583 && strcmp (note->namedata, "LINUX") == 0)
10584 return elfcore_grok_s390_todcmp (abfd, note);
d7eeb400 10585 else
0a1b45a2 10586 return true;
d7eeb400
MS
10587
10588 case NT_S390_TODPREG:
10589 if (note->namesz == 6
07d6d2b8
AM
10590 && strcmp (note->namedata, "LINUX") == 0)
10591 return elfcore_grok_s390_todpreg (abfd, note);
d7eeb400 10592 else
0a1b45a2 10593 return true;
d7eeb400
MS
10594
10595 case NT_S390_CTRS:
10596 if (note->namesz == 6
07d6d2b8
AM
10597 && strcmp (note->namedata, "LINUX") == 0)
10598 return elfcore_grok_s390_ctrs (abfd, note);
d7eeb400 10599 else
0a1b45a2 10600 return true;
d7eeb400
MS
10601
10602 case NT_S390_PREFIX:
10603 if (note->namesz == 6
07d6d2b8
AM
10604 && strcmp (note->namedata, "LINUX") == 0)
10605 return elfcore_grok_s390_prefix (abfd, note);
d7eeb400 10606 else
0a1b45a2 10607 return true;
d7eeb400 10608
355b81d9
UW
10609 case NT_S390_LAST_BREAK:
10610 if (note->namesz == 6
07d6d2b8
AM
10611 && strcmp (note->namedata, "LINUX") == 0)
10612 return elfcore_grok_s390_last_break (abfd, note);
355b81d9 10613 else
0a1b45a2 10614 return true;
355b81d9
UW
10615
10616 case NT_S390_SYSTEM_CALL:
10617 if (note->namesz == 6
07d6d2b8
AM
10618 && strcmp (note->namedata, "LINUX") == 0)
10619 return elfcore_grok_s390_system_call (abfd, note);
355b81d9 10620 else
0a1b45a2 10621 return true;
355b81d9 10622
abb3f6cc
NC
10623 case NT_S390_TDB:
10624 if (note->namesz == 6
07d6d2b8
AM
10625 && strcmp (note->namedata, "LINUX") == 0)
10626 return elfcore_grok_s390_tdb (abfd, note);
abb3f6cc 10627 else
0a1b45a2 10628 return true;
abb3f6cc 10629
4ef9f41a
AA
10630 case NT_S390_VXRS_LOW:
10631 if (note->namesz == 6
10632 && strcmp (note->namedata, "LINUX") == 0)
10633 return elfcore_grok_s390_vxrs_low (abfd, note);
10634 else
0a1b45a2 10635 return true;
4ef9f41a
AA
10636
10637 case NT_S390_VXRS_HIGH:
10638 if (note->namesz == 6
10639 && strcmp (note->namedata, "LINUX") == 0)
10640 return elfcore_grok_s390_vxrs_high (abfd, note);
10641 else
0a1b45a2 10642 return true;
4ef9f41a 10643
88ab90e8
AA
10644 case NT_S390_GS_CB:
10645 if (note->namesz == 6
10646 && strcmp (note->namedata, "LINUX") == 0)
8fe09d74 10647 return elfcore_grok_s390_gs_cb (abfd, note);
88ab90e8 10648 else
0a1b45a2 10649 return true;
88ab90e8
AA
10650
10651 case NT_S390_GS_BC:
10652 if (note->namesz == 6
10653 && strcmp (note->namedata, "LINUX") == 0)
8fe09d74 10654 return elfcore_grok_s390_gs_bc (abfd, note);
88ab90e8 10655 else
0a1b45a2 10656 return true;
88ab90e8 10657
27456742
AK
10658 case NT_ARC_V2:
10659 if (note->namesz == 6
10660 && strcmp (note->namedata, "LINUX") == 0)
10661 return elfcore_grok_arc_v2 (abfd, note);
10662 else
0a1b45a2 10663 return true;
27456742 10664
faa9a424
UW
10665 case NT_ARM_VFP:
10666 if (note->namesz == 6
10667 && strcmp (note->namedata, "LINUX") == 0)
10668 return elfcore_grok_arm_vfp (abfd, note);
10669 else
0a1b45a2 10670 return true;
faa9a424 10671
652451f8
YZ
10672 case NT_ARM_TLS:
10673 if (note->namesz == 6
10674 && strcmp (note->namedata, "LINUX") == 0)
10675 return elfcore_grok_aarch_tls (abfd, note);
10676 else
0a1b45a2 10677 return true;
652451f8
YZ
10678
10679 case NT_ARM_HW_BREAK:
10680 if (note->namesz == 6
10681 && strcmp (note->namedata, "LINUX") == 0)
10682 return elfcore_grok_aarch_hw_break (abfd, note);
10683 else
0a1b45a2 10684 return true;
652451f8
YZ
10685
10686 case NT_ARM_HW_WATCH:
10687 if (note->namesz == 6
10688 && strcmp (note->namedata, "LINUX") == 0)
10689 return elfcore_grok_aarch_hw_watch (abfd, note);
10690 else
0a1b45a2 10691 return true;
652451f8 10692
ad1cc4e4
AH
10693 case NT_ARM_SVE:
10694 if (note->namesz == 6
10695 && strcmp (note->namedata, "LINUX") == 0)
10696 return elfcore_grok_aarch_sve (abfd, note);
10697 else
0a1b45a2 10698 return true;
ad1cc4e4 10699
e6c3b5bf
AH
10700 case NT_ARM_PAC_MASK:
10701 if (note->namesz == 6
10702 && strcmp (note->namedata, "LINUX") == 0)
10703 return elfcore_grok_aarch_pauth (abfd, note);
10704 else
0a1b45a2 10705 return true;
e6c3b5bf 10706
f0bbe8ba
LM
10707 case NT_ARM_TAGGED_ADDR_CTRL:
10708 if (note->namesz == 6
10709 && strcmp (note->namedata, "LINUX") == 0)
10710 return elfcore_grok_aarch_mte (abfd, note);
10711 else
10712 return true;
10713
b63a5e38
AB
10714 case NT_GDB_TDESC:
10715 if (note->namesz == 4
10716 && strcmp (note->namedata, "GDB") == 0)
10717 return elfcore_grok_gdb_tdesc (abfd, note);
10718 else
0a1b45a2 10719 return true;
b63a5e38 10720
db6092f3
AB
10721 case NT_RISCV_CSR:
10722 if (note->namesz == 4
10723 && strcmp (note->namedata, "GDB") == 0)
10724 return elfcore_grok_riscv_csr (abfd, note);
10725 else
0a1b45a2 10726 return true;
db6092f3 10727
e214f8db 10728 case NT_LARCH_CPUCFG:
10729 if (note->namesz == 6
10730 && strcmp (note->namedata, "LINUX") == 0)
10731 return elfcore_grok_loongarch_cpucfg (abfd, note);
10732 else
10733 return true;
10734
10735 case NT_LARCH_LBT:
10736 if (note->namesz == 6
10737 && strcmp (note->namedata, "LINUX") == 0)
10738 return elfcore_grok_loongarch_lbt (abfd, note);
10739 else
10740 return true;
10741
10742 case NT_LARCH_LSX:
10743 if (note->namesz == 6
10744 && strcmp (note->namedata, "LINUX") == 0)
10745 return elfcore_grok_loongarch_lsx (abfd, note);
10746 else
10747 return true;
10748
10749 case NT_LARCH_LASX:
10750 if (note->namesz == 6
10751 && strcmp (note->namedata, "LINUX") == 0)
10752 return elfcore_grok_loongarch_lasx (abfd, note);
10753 else
10754 return true;
10755
252b5132
RH
10756 case NT_PRPSINFO:
10757 case NT_PSINFO:
bb0082d6
AM
10758 if (bed->elf_backend_grok_psinfo)
10759 if ((*bed->elf_backend_grok_psinfo) (abfd, note))
0a1b45a2 10760 return true;
bb0082d6 10761#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
252b5132 10762 return elfcore_grok_psinfo (abfd, note);
bb0082d6 10763#else
0a1b45a2 10764 return true;
252b5132 10765#endif
3333a7c3
RM
10766
10767 case NT_AUXV:
58e07198 10768 return elfcore_make_auxv_note_section (abfd, note, 0);
9015683b 10769
451b7c33
TT
10770 case NT_FILE:
10771 return elfcore_make_note_pseudosection (abfd, ".note.linuxcore.file",
10772 note);
10773
9015683b
TT
10774 case NT_SIGINFO:
10775 return elfcore_make_note_pseudosection (abfd, ".note.linuxcore.siginfo",
10776 note);
5b2c414d 10777
252b5132
RH
10778 }
10779}
10780
0a1b45a2 10781static bool
718175fa
JK
10782elfobj_grok_gnu_build_id (bfd *abfd, Elf_Internal_Note *note)
10783{
c74f7d1c 10784 struct bfd_build_id* build_id;
30e8ee25
AM
10785
10786 if (note->descsz == 0)
0a1b45a2 10787 return false;
30e8ee25 10788
c74f7d1c
JT
10789 build_id = bfd_alloc (abfd, sizeof (struct bfd_build_id) - 1 + note->descsz);
10790 if (build_id == NULL)
0a1b45a2 10791 return false;
718175fa 10792
c74f7d1c
JT
10793 build_id->size = note->descsz;
10794 memcpy (build_id->data, note->descdata, note->descsz);
10795 abfd->build_id = build_id;
718175fa 10796
0a1b45a2 10797 return true;
718175fa
JK
10798}
10799
0a1b45a2 10800static bool
718175fa
JK
10801elfobj_grok_gnu_note (bfd *abfd, Elf_Internal_Note *note)
10802{
10803 switch (note->type)
10804 {
10805 default:
0a1b45a2 10806 return true;
718175fa 10807
46bed679
L
10808 case NT_GNU_PROPERTY_TYPE_0:
10809 return _bfd_elf_parse_gnu_properties (abfd, note);
10810
718175fa
JK
10811 case NT_GNU_BUILD_ID:
10812 return elfobj_grok_gnu_build_id (abfd, note);
10813 }
10814}
10815
0a1b45a2 10816static bool
e21e5835
NC
10817elfobj_grok_stapsdt_note_1 (bfd *abfd, Elf_Internal_Note *note)
10818{
10819 struct sdt_note *cur =
7a6e0d89
AM
10820 (struct sdt_note *) bfd_alloc (abfd,
10821 sizeof (struct sdt_note) + note->descsz);
e21e5835
NC
10822
10823 cur->next = (struct sdt_note *) (elf_tdata (abfd))->sdt_note_head;
10824 cur->size = (bfd_size_type) note->descsz;
10825 memcpy (cur->data, note->descdata, note->descsz);
10826
10827 elf_tdata (abfd)->sdt_note_head = cur;
10828
0a1b45a2 10829 return true;
e21e5835
NC
10830}
10831
0a1b45a2 10832static bool
e21e5835
NC
10833elfobj_grok_stapsdt_note (bfd *abfd, Elf_Internal_Note *note)
10834{
10835 switch (note->type)
10836 {
10837 case NT_STAPSDT:
10838 return elfobj_grok_stapsdt_note_1 (abfd, note);
10839
10840 default:
0a1b45a2 10841 return true;
e21e5835
NC
10842 }
10843}
10844
0a1b45a2 10845static bool
aa1ed4a9
JB
10846elfcore_grok_freebsd_psinfo (bfd *abfd, Elf_Internal_Note *note)
10847{
10848 size_t offset;
10849
b5430a3c 10850 switch (elf_elfheader (abfd)->e_ident[EI_CLASS])
aa1ed4a9 10851 {
b5430a3c 10852 case ELFCLASS32:
0064d223 10853 if (note->descsz < 108)
0a1b45a2 10854 return false;
aa1ed4a9
JB
10855 break;
10856
b5430a3c 10857 case ELFCLASS64:
0064d223 10858 if (note->descsz < 120)
0a1b45a2 10859 return false;
aa1ed4a9
JB
10860 break;
10861
10862 default:
0a1b45a2 10863 return false;
aa1ed4a9
JB
10864 }
10865
0064d223
JB
10866 /* Check for version 1 in pr_version. */
10867 if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
0a1b45a2 10868 return false;
80a04378 10869
0064d223
JB
10870 offset = 4;
10871
10872 /* Skip over pr_psinfosz. */
b5430a3c 10873 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS32)
0064d223
JB
10874 offset += 4;
10875 else
10876 {
10877 offset += 4; /* Padding before pr_psinfosz. */
10878 offset += 8;
10879 }
10880
aa1ed4a9
JB
10881 /* pr_fname is PRFNAMESZ (16) + 1 bytes in size. */
10882 elf_tdata (abfd)->core->program
10883 = _bfd_elfcore_strndup (abfd, note->descdata + offset, 17);
10884 offset += 17;
10885
10886 /* pr_psargs is PRARGSZ (80) + 1 bytes in size. */
10887 elf_tdata (abfd)->core->command
10888 = _bfd_elfcore_strndup (abfd, note->descdata + offset, 81);
0064d223
JB
10889 offset += 81;
10890
10891 /* Padding before pr_pid. */
10892 offset += 2;
10893
10894 /* The pr_pid field was added in version "1a". */
10895 if (note->descsz < offset + 4)
0a1b45a2 10896 return true;
0064d223
JB
10897
10898 elf_tdata (abfd)->core->pid
10899 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
aa1ed4a9 10900
0a1b45a2 10901 return true;
aa1ed4a9
JB
10902}
10903
0a1b45a2 10904static bool
aa1ed4a9
JB
10905elfcore_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note)
10906{
10907 size_t offset;
10908 size_t size;
24d3e51b 10909 size_t min_size;
aa1ed4a9 10910
24d3e51b
NC
10911 /* Compute offset of pr_getregsz, skipping over pr_statussz.
10912 Also compute minimum size of this note. */
b5430a3c 10913 switch (elf_elfheader (abfd)->e_ident[EI_CLASS])
aa1ed4a9 10914 {
b5430a3c 10915 case ELFCLASS32:
24d3e51b
NC
10916 offset = 4 + 4;
10917 min_size = offset + (4 * 2) + 4 + 4 + 4;
aa1ed4a9
JB
10918 break;
10919
b5430a3c 10920 case ELFCLASS64:
24d3e51b
NC
10921 offset = 4 + 4 + 8; /* Includes padding before pr_statussz. */
10922 min_size = offset + (8 * 2) + 4 + 4 + 4 + 4;
aa1ed4a9
JB
10923 break;
10924
10925 default:
0a1b45a2 10926 return false;
aa1ed4a9
JB
10927 }
10928
24d3e51b 10929 if (note->descsz < min_size)
0a1b45a2 10930 return false;
24d3e51b
NC
10931
10932 /* Check for version 1 in pr_version. */
10933 if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
0a1b45a2 10934 return false;
aa1ed4a9 10935
24d3e51b
NC
10936 /* Extract size of pr_reg from pr_gregsetsz. */
10937 /* Skip over pr_gregsetsz and pr_fpregsetsz. */
b5430a3c 10938 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS32)
24d3e51b
NC
10939 {
10940 size = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
10941 offset += 4 * 2;
10942 }
b5430a3c 10943 else
24d3e51b
NC
10944 {
10945 size = bfd_h_get_64 (abfd, (bfd_byte *) note->descdata + offset);
10946 offset += 8 * 2;
10947 }
aa1ed4a9 10948
24d3e51b 10949 /* Skip over pr_osreldate. */
aa1ed4a9
JB
10950 offset += 4;
10951
24d3e51b 10952 /* Read signal from pr_cursig. */
aa1ed4a9
JB
10953 if (elf_tdata (abfd)->core->signal == 0)
10954 elf_tdata (abfd)->core->signal
10955 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
10956 offset += 4;
10957
24d3e51b 10958 /* Read TID from pr_pid. */
aa1ed4a9
JB
10959 elf_tdata (abfd)->core->lwpid
10960 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
10961 offset += 4;
10962
24d3e51b 10963 /* Padding before pr_reg. */
b5430a3c 10964 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64)
aa1ed4a9
JB
10965 offset += 4;
10966
24d3e51b
NC
10967 /* Make sure that there is enough data remaining in the note. */
10968 if ((note->descsz - offset) < size)
0a1b45a2 10969 return false;
24d3e51b 10970
aa1ed4a9
JB
10971 /* Make a ".reg/999" section and a ".reg" section. */
10972 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
10973 size, note->descpos + offset);
10974}
10975
0a1b45a2 10976static bool
aa1ed4a9
JB
10977elfcore_grok_freebsd_note (bfd *abfd, Elf_Internal_Note *note)
10978{
544c67cd
JB
10979 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
10980
aa1ed4a9
JB
10981 switch (note->type)
10982 {
10983 case NT_PRSTATUS:
544c67cd
JB
10984 if (bed->elf_backend_grok_freebsd_prstatus)
10985 if ((*bed->elf_backend_grok_freebsd_prstatus) (abfd, note))
0a1b45a2 10986 return true;
aa1ed4a9
JB
10987 return elfcore_grok_freebsd_prstatus (abfd, note);
10988
10989 case NT_FPREGSET:
10990 return elfcore_grok_prfpreg (abfd, note);
10991
10992 case NT_PRPSINFO:
10993 return elfcore_grok_freebsd_psinfo (abfd, note);
10994
10995 case NT_FREEBSD_THRMISC:
10996 if (note->namesz == 8)
10997 return elfcore_make_note_pseudosection (abfd, ".thrmisc", note);
10998 else
0a1b45a2 10999 return true;
aa1ed4a9 11000
ddb2bbcf
JB
11001 case NT_FREEBSD_PROCSTAT_PROC:
11002 return elfcore_make_note_pseudosection (abfd, ".note.freebsdcore.proc",
11003 note);
11004
11005 case NT_FREEBSD_PROCSTAT_FILES:
11006 return elfcore_make_note_pseudosection (abfd, ".note.freebsdcore.files",
11007 note);
11008
11009 case NT_FREEBSD_PROCSTAT_VMMAP:
11010 return elfcore_make_note_pseudosection (abfd, ".note.freebsdcore.vmmap",
11011 note);
11012
3350c5f5 11013 case NT_FREEBSD_PROCSTAT_AUXV:
58e07198 11014 return elfcore_make_auxv_note_section (abfd, note, 4);
3350c5f5 11015
aa1ed4a9
JB
11016 case NT_X86_XSTATE:
11017 if (note->namesz == 8)
11018 return elfcore_grok_xstatereg (abfd, note);
11019 else
0a1b45a2 11020 return true;
aa1ed4a9 11021
e6f3b9c3
JB
11022 case NT_FREEBSD_PTLWPINFO:
11023 return elfcore_make_note_pseudosection (abfd, ".note.freebsdcore.lwpinfo",
11024 note);
11025
6d5be5d6
JB
11026 case NT_ARM_VFP:
11027 return elfcore_grok_arm_vfp (abfd, note);
11028
aa1ed4a9 11029 default:
0a1b45a2 11030 return true;
aa1ed4a9
JB
11031 }
11032}
11033
0a1b45a2 11034static bool
217aa764 11035elfcore_netbsd_get_lwpid (Elf_Internal_Note *note, int *lwpidp)
50b2bdb7
AM
11036{
11037 char *cp;
11038
11039 cp = strchr (note->namedata, '@');
11040 if (cp != NULL)
11041 {
d2b64500 11042 *lwpidp = atoi(cp + 1);
0a1b45a2 11043 return true;
50b2bdb7 11044 }
0a1b45a2 11045 return false;
50b2bdb7
AM
11046}
11047
0a1b45a2 11048static bool
217aa764 11049elfcore_grok_netbsd_procinfo (bfd *abfd, Elf_Internal_Note *note)
50b2bdb7 11050{
80a04378 11051 if (note->descsz <= 0x7c + 31)
0a1b45a2 11052 return false;
80a04378 11053
50b2bdb7 11054 /* Signal number at offset 0x08. */
228e534f 11055 elf_tdata (abfd)->core->signal
50b2bdb7
AM
11056 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x08);
11057
11058 /* Process ID at offset 0x50. */
228e534f 11059 elf_tdata (abfd)->core->pid
50b2bdb7
AM
11060 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x50);
11061
11062 /* Command name at 0x7c (max 32 bytes, including nul). */
228e534f 11063 elf_tdata (abfd)->core->command
50b2bdb7
AM
11064 = _bfd_elfcore_strndup (abfd, note->descdata + 0x7c, 31);
11065
7720ba9f
MK
11066 return elfcore_make_note_pseudosection (abfd, ".note.netbsdcore.procinfo",
11067 note);
50b2bdb7
AM
11068}
11069
0a1b45a2 11070static bool
217aa764 11071elfcore_grok_netbsd_note (bfd *abfd, Elf_Internal_Note *note)
50b2bdb7
AM
11072{
11073 int lwp;
11074
11075 if (elfcore_netbsd_get_lwpid (note, &lwp))
228e534f 11076 elf_tdata (abfd)->core->lwpid = lwp;
50b2bdb7 11077
58e07198 11078 switch (note->type)
50b2bdb7 11079 {
58e07198 11080 case NT_NETBSDCORE_PROCINFO:
50b2bdb7 11081 /* NetBSD-specific core "procinfo". Note that we expect to
08a40648
AM
11082 find this note before any of the others, which is fine,
11083 since the kernel writes this note out first when it
11084 creates a core file. */
50b2bdb7 11085 return elfcore_grok_netbsd_procinfo (abfd, note);
58e07198
CZ
11086 case NT_NETBSDCORE_AUXV:
11087 /* NetBSD-specific Elf Auxiliary Vector data. */
11088 return elfcore_make_auxv_note_section (abfd, note, 4);
06d949ec
KR
11089 case NT_NETBSDCORE_LWPSTATUS:
11090 return elfcore_make_note_pseudosection (abfd,
11091 ".note.netbsdcore.lwpstatus",
11092 note);
58e07198
CZ
11093 default:
11094 break;
50b2bdb7
AM
11095 }
11096
06d949ec 11097 /* As of March 2020 there are no other machine-independent notes
b4db1224
JT
11098 defined for NetBSD core files. If the note type is less
11099 than the start of the machine-dependent note types, we don't
11100 understand it. */
47d9a591 11101
b4db1224 11102 if (note->type < NT_NETBSDCORE_FIRSTMACH)
0a1b45a2 11103 return true;
50b2bdb7
AM
11104
11105
11106 switch (bfd_get_arch (abfd))
11107 {
08a40648
AM
11108 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0 and
11109 PT_GETFPREGS == mach+2. */
50b2bdb7 11110
015ec493 11111 case bfd_arch_aarch64:
50b2bdb7
AM
11112 case bfd_arch_alpha:
11113 case bfd_arch_sparc:
11114 switch (note->type)
08a40648
AM
11115 {
11116 case NT_NETBSDCORE_FIRSTMACH+0:
11117 return elfcore_make_note_pseudosection (abfd, ".reg", note);
50b2bdb7 11118
08a40648
AM
11119 case NT_NETBSDCORE_FIRSTMACH+2:
11120 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
50b2bdb7 11121
08a40648 11122 default:
0a1b45a2 11123 return true;
08a40648 11124 }
50b2bdb7 11125
58e07198
CZ
11126 /* On SuperH, PT_GETREGS == mach+3 and PT_GETFPREGS == mach+5.
11127 There's also old PT___GETREGS40 == mach + 1 for old reg
11128 structure which lacks GBR. */
11129
11130 case bfd_arch_sh:
11131 switch (note->type)
11132 {
11133 case NT_NETBSDCORE_FIRSTMACH+3:
11134 return elfcore_make_note_pseudosection (abfd, ".reg", note);
11135
11136 case NT_NETBSDCORE_FIRSTMACH+5:
11137 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
11138
11139 default:
0a1b45a2 11140 return true;
58e07198
CZ
11141 }
11142
08a40648
AM
11143 /* On all other arch's, PT_GETREGS == mach+1 and
11144 PT_GETFPREGS == mach+3. */
50b2bdb7
AM
11145
11146 default:
11147 switch (note->type)
08a40648
AM
11148 {
11149 case NT_NETBSDCORE_FIRSTMACH+1:
11150 return elfcore_make_note_pseudosection (abfd, ".reg", note);
50b2bdb7 11151
08a40648
AM
11152 case NT_NETBSDCORE_FIRSTMACH+3:
11153 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
50b2bdb7 11154
08a40648 11155 default:
0a1b45a2 11156 return true;
08a40648 11157 }
50b2bdb7
AM
11158 }
11159 /* NOTREACHED */
11160}
11161
0a1b45a2 11162static bool
67cc5033
MK
11163elfcore_grok_openbsd_procinfo (bfd *abfd, Elf_Internal_Note *note)
11164{
80a04378 11165 if (note->descsz <= 0x48 + 31)
0a1b45a2 11166 return false;
80a04378 11167
67cc5033 11168 /* Signal number at offset 0x08. */
228e534f 11169 elf_tdata (abfd)->core->signal
67cc5033
MK
11170 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x08);
11171
11172 /* Process ID at offset 0x20. */
228e534f 11173 elf_tdata (abfd)->core->pid
67cc5033
MK
11174 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x20);
11175
11176 /* Command name at 0x48 (max 32 bytes, including nul). */
228e534f 11177 elf_tdata (abfd)->core->command
67cc5033
MK
11178 = _bfd_elfcore_strndup (abfd, note->descdata + 0x48, 31);
11179
0a1b45a2 11180 return true;
67cc5033
MK
11181}
11182
6420dd27
LB
11183/* Processes Solaris's process status note.
11184 sig_off ~ offsetof(prstatus_t, pr_cursig)
11185 pid_off ~ offsetof(prstatus_t, pr_pid)
11186 lwpid_off ~ offsetof(prstatus_t, pr_who)
11187 gregset_size ~ sizeof(gregset_t)
11188 gregset_offset ~ offsetof(prstatus_t, pr_reg) */
11189
11190static bool
11191elfcore_grok_solaris_prstatus (bfd *abfd, Elf_Internal_Note* note, int sig_off,
11192 int pid_off, int lwpid_off, size_t gregset_size,
11193 size_t gregset_offset)
11194{
11195 asection *sect = NULL;
11196 elf_tdata (abfd)->core->signal
11197 = bfd_get_16 (abfd, note->descdata + sig_off);
11198 elf_tdata (abfd)->core->pid
11199 = bfd_get_32 (abfd, note->descdata + pid_off);
11200 elf_tdata (abfd)->core->lwpid
11201 = bfd_get_32 (abfd, note->descdata + lwpid_off);
11202
11203 sect = bfd_get_section_by_name (abfd, ".reg");
11204 if (sect != NULL)
11205 sect->size = gregset_size;
11206
11207 return _bfd_elfcore_make_pseudosection (abfd, ".reg", gregset_size,
11208 note->descpos + gregset_offset);
11209}
11210
11211/* Gets program and arguments from a core.
11212 prog_off ~ offsetof(prpsinfo | psinfo_t, pr_fname)
11213 comm_off ~ offsetof(prpsinfo | psinfo_t, pr_psargs) */
11214
11215static bool
11216elfcore_grok_solaris_info(bfd *abfd, Elf_Internal_Note* note,
11217 int prog_off, int comm_off)
11218{
11219 elf_tdata (abfd)->core->program
11220 = _bfd_elfcore_strndup (abfd, note->descdata + prog_off, 16);
11221 elf_tdata (abfd)->core->command
11222 = _bfd_elfcore_strndup (abfd, note->descdata + comm_off, 80);
11223
11224 return true;
11225}
11226
11227/* Processes Solaris's LWP status note.
11228 gregset_size ~ sizeof(gregset_t)
11229 gregset_off ~ offsetof(lwpstatus_t, pr_reg)
11230 fpregset_size ~ sizeof(fpregset_t)
11231 fpregset_off ~ offsetof(lwpstatus_t, pr_fpreg) */
11232
11233static bool
11234elfcore_grok_solaris_lwpstatus (bfd *abfd, Elf_Internal_Note* note,
11235 size_t gregset_size, int gregset_off,
11236 size_t fpregset_size, int fpregset_off)
11237{
11238 asection *sect = NULL;
11239 char reg2_section_name[16] = { 0 };
11240
11241 (void) snprintf (reg2_section_name, 16, "%s/%i", ".reg2",
11242 elf_tdata (abfd)->core->lwpid);
11243
11244 /* offsetof(lwpstatus_t, pr_lwpid) */
11245 elf_tdata (abfd)->core->lwpid
11246 = bfd_get_32 (abfd, note->descdata + 4);
11247 /* offsetof(lwpstatus_t, pr_cursig) */
11248 elf_tdata (abfd)->core->signal
11249 = bfd_get_16 (abfd, note->descdata + 12);
11250
11251 sect = bfd_get_section_by_name (abfd, ".reg");
11252 if (sect != NULL)
11253 sect->size = gregset_size;
11254 else if (!_bfd_elfcore_make_pseudosection (abfd, ".reg", gregset_size,
11255 note->descpos + gregset_off))
11256 return false;
11257
11258 sect = bfd_get_section_by_name (abfd, reg2_section_name);
11259 if (sect != NULL)
11260 {
11261 sect->size = fpregset_size;
11262 sect->filepos = note->descpos + fpregset_off;
11263 sect->alignment_power = 2;
11264 }
11265 else if (!_bfd_elfcore_make_pseudosection (abfd, ".reg2", fpregset_size,
11266 note->descpos + fpregset_off))
11267 return false;
11268
11269 return true;
11270}
11271
11272static bool
11273elfcore_grok_solaris_note_impl (bfd *abfd, Elf_Internal_Note *note)
11274{
11275 if (note == NULL)
11276 return false;
11277
11278 /* core files are identified as 32- or 64-bit, SPARC or x86,
11279 by the size of the descsz which matches the sizeof()
11280 the type appropriate for that note type (e.g., prstatus_t for
11281 SOLARIS_NT_PRSTATUS) for the corresponding architecture
11282 on Solaris. The core file bitness may differ from the bitness of
11283 gdb itself, so fixed values are used instead of sizeof().
11284 Appropriate fixed offsets are also used to obtain data from
11285 the note. */
11286
11287 switch ((int) note->type)
11288 {
11289 case SOLARIS_NT_PRSTATUS:
11290 switch (note->descsz)
11291 {
11292 case 508: /* sizeof(prstatus_t) SPARC 32-bit */
11293 return elfcore_grok_solaris_prstatus(abfd, note,
11294 136, 216, 308, 152, 356);
11295 case 904: /* sizeof(prstatus_t) SPARC 64-bit */
11296 return elfcore_grok_solaris_prstatus(abfd, note,
11297 264, 360, 520, 304, 600);
11298 case 432: /* sizeof(prstatus_t) Intel 32-bit */
11299 return elfcore_grok_solaris_prstatus(abfd, note,
11300 136, 216, 308, 76, 356);
11301 case 824: /* sizeof(prstatus_t) Intel 64-bit */
11302 return elfcore_grok_solaris_prstatus(abfd, note,
11303 264, 360, 520, 224, 600);
11304 default:
11305 return true;
11306 }
11307
11308 case SOLARIS_NT_PSINFO:
11309 case SOLARIS_NT_PRPSINFO:
11310 switch (note->descsz)
11311 {
11312 case 260: /* sizeof(prpsinfo_t) SPARC and Intel 32-bit */
11313 return elfcore_grok_solaris_info(abfd, note, 84, 100);
11314 case 328: /* sizeof(prpsinfo_t) SPARC and Intel 64-bit */
11315 return elfcore_grok_solaris_info(abfd, note, 120, 136);
11316 case 360: /* sizeof(psinfo_t) SPARC and Intel 32-bit */
11317 return elfcore_grok_solaris_info(abfd, note, 88, 104);
11318 case 440: /* sizeof(psinfo_t) SPARC and Intel 64-bit */
11319 return elfcore_grok_solaris_info(abfd, note, 136, 152);
11320 default:
11321 return true;
11322 }
11323
11324 case SOLARIS_NT_LWPSTATUS:
11325 switch (note->descsz)
11326 {
11327 case 896: /* sizeof(lwpstatus_t) SPARC 32-bit */
11328 return elfcore_grok_solaris_lwpstatus(abfd, note,
11329 152, 344, 400, 496);
11330 case 1392: /* sizeof(lwpstatus_t) SPARC 64-bit */
11331 return elfcore_grok_solaris_lwpstatus(abfd, note,
11332 304, 544, 544, 848);
11333 case 800: /* sizeof(lwpstatus_t) Intel 32-bit */
11334 return elfcore_grok_solaris_lwpstatus(abfd, note,
11335 76, 344, 380, 420);
11336 case 1296: /* sizeof(lwpstatus_t) Intel 64-bit */
11337 return elfcore_grok_solaris_lwpstatus(abfd, note,
11338 224, 544, 528, 768);
11339 default:
11340 return true;
11341 }
11342
11343 case SOLARIS_NT_LWPSINFO:
11344 /* sizeof(lwpsinfo_t) on 32- and 64-bit, respectively */
11345 if (note->descsz == 128 || note->descsz == 152)
11346 elf_tdata (abfd)->core->lwpid =
11347 bfd_get_32 (abfd, note->descdata + 4);
11348 break;
11349
11350 default:
11351 break;
11352 }
11353
11354 return true;
11355}
11356
11357/* For name starting with "CORE" this may be either a Solaris
11358 core file or a gdb-generated core file. Do Solaris-specific
11359 processing on selected note types first with
11360 elfcore_grok_solaris_note(), then process the note
11361 in elfcore_grok_note(). */
11362
11363static bool
11364elfcore_grok_solaris_note (bfd *abfd, Elf_Internal_Note *note)
11365{
11366 if (!elfcore_grok_solaris_note_impl (abfd, note))
11367 return false;
11368
11369 return elfcore_grok_note (abfd, note);
11370}
11371
0a1b45a2 11372static bool
67cc5033
MK
11373elfcore_grok_openbsd_note (bfd *abfd, Elf_Internal_Note *note)
11374{
11375 if (note->type == NT_OPENBSD_PROCINFO)
11376 return elfcore_grok_openbsd_procinfo (abfd, note);
11377
11378 if (note->type == NT_OPENBSD_REGS)
11379 return elfcore_make_note_pseudosection (abfd, ".reg", note);
11380
11381 if (note->type == NT_OPENBSD_FPREGS)
11382 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
11383
11384 if (note->type == NT_OPENBSD_XFPREGS)
11385 return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
11386
11387 if (note->type == NT_OPENBSD_AUXV)
58e07198 11388 return elfcore_make_auxv_note_section (abfd, note, 0);
67cc5033
MK
11389
11390 if (note->type == NT_OPENBSD_WCOOKIE)
11391 {
11392 asection *sect = bfd_make_section_anyway_with_flags (abfd, ".wcookie",
11393 SEC_HAS_CONTENTS);
11394
11395 if (sect == NULL)
0a1b45a2 11396 return false;
67cc5033
MK
11397 sect->size = note->descsz;
11398 sect->filepos = note->descpos;
11399 sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
11400
0a1b45a2 11401 return true;
67cc5033
MK
11402 }
11403
0a1b45a2 11404 return true;
67cc5033
MK
11405}
11406
0a1b45a2 11407static bool
d3fd4074 11408elfcore_grok_nto_status (bfd *abfd, Elf_Internal_Note *note, long *tid)
07c6e936
NC
11409{
11410 void *ddata = note->descdata;
11411 char buf[100];
11412 char *name;
11413 asection *sect;
f8843e87
AM
11414 short sig;
11415 unsigned flags;
07c6e936 11416
80a04378 11417 if (note->descsz < 16)
0a1b45a2 11418 return false;
80a04378 11419
07c6e936 11420 /* nto_procfs_status 'pid' field is at offset 0. */
228e534f 11421 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, (bfd_byte *) ddata);
07c6e936 11422
f8843e87
AM
11423 /* nto_procfs_status 'tid' field is at offset 4. Pass it back. */
11424 *tid = bfd_get_32 (abfd, (bfd_byte *) ddata + 4);
11425
11426 /* nto_procfs_status 'flags' field is at offset 8. */
11427 flags = bfd_get_32 (abfd, (bfd_byte *) ddata + 8);
07c6e936
NC
11428
11429 /* nto_procfs_status 'what' field is at offset 14. */
f8843e87
AM
11430 if ((sig = bfd_get_16 (abfd, (bfd_byte *) ddata + 14)) > 0)
11431 {
228e534f
AM
11432 elf_tdata (abfd)->core->signal = sig;
11433 elf_tdata (abfd)->core->lwpid = *tid;
f8843e87 11434 }
07c6e936 11435
f8843e87
AM
11436 /* _DEBUG_FLAG_CURTID (current thread) is 0x80. Some cores
11437 do not come from signals so we make sure we set the current
11438 thread just in case. */
11439 if (flags & 0x00000080)
228e534f 11440 elf_tdata (abfd)->core->lwpid = *tid;
07c6e936
NC
11441
11442 /* Make a ".qnx_core_status/%d" section. */
d3fd4074 11443 sprintf (buf, ".qnx_core_status/%ld", *tid);
07c6e936 11444
a50b1753 11445 name = (char *) bfd_alloc (abfd, strlen (buf) + 1);
07c6e936 11446 if (name == NULL)
0a1b45a2 11447 return false;
07c6e936
NC
11448 strcpy (name, buf);
11449
117ed4f8 11450 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
07c6e936 11451 if (sect == NULL)
0a1b45a2 11452 return false;
07c6e936 11453
07d6d2b8
AM
11454 sect->size = note->descsz;
11455 sect->filepos = note->descpos;
07c6e936
NC
11456 sect->alignment_power = 2;
11457
11458 return (elfcore_maybe_make_sect (abfd, ".qnx_core_status", sect));
11459}
11460
0a1b45a2 11461static bool
d69f560c
KW
11462elfcore_grok_nto_regs (bfd *abfd,
11463 Elf_Internal_Note *note,
d3fd4074 11464 long tid,
d69f560c 11465 char *base)
07c6e936
NC
11466{
11467 char buf[100];
11468 char *name;
11469 asection *sect;
11470
d69f560c 11471 /* Make a "(base)/%d" section. */
d3fd4074 11472 sprintf (buf, "%s/%ld", base, tid);
07c6e936 11473
a50b1753 11474 name = (char *) bfd_alloc (abfd, strlen (buf) + 1);
07c6e936 11475 if (name == NULL)
0a1b45a2 11476 return false;
07c6e936
NC
11477 strcpy (name, buf);
11478
117ed4f8 11479 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
07c6e936 11480 if (sect == NULL)
0a1b45a2 11481 return false;
07c6e936 11482
07d6d2b8
AM
11483 sect->size = note->descsz;
11484 sect->filepos = note->descpos;
07c6e936
NC
11485 sect->alignment_power = 2;
11486
f8843e87 11487 /* This is the current thread. */
228e534f 11488 if (elf_tdata (abfd)->core->lwpid == tid)
d69f560c 11489 return elfcore_maybe_make_sect (abfd, base, sect);
f8843e87 11490
0a1b45a2 11491 return true;
07c6e936
NC
11492}
11493
11494#define BFD_QNT_CORE_INFO 7
11495#define BFD_QNT_CORE_STATUS 8
11496#define BFD_QNT_CORE_GREG 9
11497#define BFD_QNT_CORE_FPREG 10
11498
0a1b45a2 11499static bool
217aa764 11500elfcore_grok_nto_note (bfd *abfd, Elf_Internal_Note *note)
07c6e936
NC
11501{
11502 /* Every GREG section has a STATUS section before it. Store the
811072d8 11503 tid from the previous call to pass down to the next gregs
07c6e936 11504 function. */
d3fd4074 11505 static long tid = 1;
07c6e936
NC
11506
11507 switch (note->type)
11508 {
d69f560c
KW
11509 case BFD_QNT_CORE_INFO:
11510 return elfcore_make_note_pseudosection (abfd, ".qnx_core_info", note);
11511 case BFD_QNT_CORE_STATUS:
11512 return elfcore_grok_nto_status (abfd, note, &tid);
11513 case BFD_QNT_CORE_GREG:
11514 return elfcore_grok_nto_regs (abfd, note, tid, ".reg");
11515 case BFD_QNT_CORE_FPREG:
11516 return elfcore_grok_nto_regs (abfd, note, tid, ".reg2");
11517 default:
0a1b45a2 11518 return true;
07c6e936
NC
11519 }
11520}
11521
0a1b45a2 11522static bool
b15fa79e
AM
11523elfcore_grok_spu_note (bfd *abfd, Elf_Internal_Note *note)
11524{
11525 char *name;
11526 asection *sect;
11527 size_t len;
11528
11529 /* Use note name as section name. */
11530 len = note->namesz;
a50b1753 11531 name = (char *) bfd_alloc (abfd, len);
b15fa79e 11532 if (name == NULL)
0a1b45a2 11533 return false;
b15fa79e
AM
11534 memcpy (name, note->namedata, len);
11535 name[len - 1] = '\0';
11536
11537 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
11538 if (sect == NULL)
0a1b45a2 11539 return false;
b15fa79e 11540
07d6d2b8
AM
11541 sect->size = note->descsz;
11542 sect->filepos = note->descpos;
b15fa79e
AM
11543 sect->alignment_power = 1;
11544
0a1b45a2 11545 return true;
b15fa79e
AM
11546}
11547
7c76fa91
MS
11548/* Function: elfcore_write_note
11549
47d9a591 11550 Inputs:
a39f3346 11551 buffer to hold note, and current size of buffer
7c76fa91
MS
11552 name of note
11553 type of note
11554 data for note
11555 size of data for note
11556
a39f3346
AM
11557 Writes note to end of buffer. ELF64 notes are written exactly as
11558 for ELF32, despite the current (as of 2006) ELF gabi specifying
11559 that they ought to have 8-byte namesz and descsz field, and have
11560 8-byte alignment. Other writers, eg. Linux kernel, do the same.
11561
7c76fa91 11562 Return:
a39f3346 11563 Pointer to realloc'd buffer, *BUFSIZ updated. */
7c76fa91
MS
11564
11565char *
a39f3346 11566elfcore_write_note (bfd *abfd,
217aa764 11567 char *buf,
a39f3346 11568 int *bufsiz,
217aa764 11569 const char *name,
a39f3346 11570 int type,
217aa764 11571 const void *input,
a39f3346 11572 int size)
7c76fa91
MS
11573{
11574 Elf_External_Note *xnp;
d4c88bbb 11575 size_t namesz;
d4c88bbb 11576 size_t newspace;
a39f3346 11577 char *dest;
7c76fa91 11578
d4c88bbb 11579 namesz = 0;
d4c88bbb 11580 if (name != NULL)
a39f3346 11581 namesz = strlen (name) + 1;
d4c88bbb 11582
a39f3346 11583 newspace = 12 + ((namesz + 3) & -4) + ((size + 3) & -4);
d4c88bbb 11584
a50b1753 11585 buf = (char *) realloc (buf, *bufsiz + newspace);
14b1c01e
AM
11586 if (buf == NULL)
11587 return buf;
a39f3346 11588 dest = buf + *bufsiz;
7c76fa91
MS
11589 *bufsiz += newspace;
11590 xnp = (Elf_External_Note *) dest;
11591 H_PUT_32 (abfd, namesz, xnp->namesz);
11592 H_PUT_32 (abfd, size, xnp->descsz);
11593 H_PUT_32 (abfd, type, xnp->type);
d4c88bbb
AM
11594 dest = xnp->name;
11595 if (name != NULL)
11596 {
11597 memcpy (dest, name, namesz);
11598 dest += namesz;
a39f3346 11599 while (namesz & 3)
d4c88bbb
AM
11600 {
11601 *dest++ = '\0';
a39f3346 11602 ++namesz;
d4c88bbb
AM
11603 }
11604 }
11605 memcpy (dest, input, size);
a39f3346
AM
11606 dest += size;
11607 while (size & 3)
11608 {
11609 *dest++ = '\0';
11610 ++size;
11611 }
11612 return buf;
7c76fa91
MS
11613}
11614
602f1657
AM
11615/* gcc-8 warns (*) on all the strncpy calls in this function about
11616 possible string truncation. The "truncation" is not a bug. We
11617 have an external representation of structs with fields that are not
11618 necessarily NULL terminated and corresponding internal
11619 representation fields that are one larger so that they can always
11620 be NULL terminated.
11621 gcc versions between 4.2 and 4.6 do not allow pragma control of
11622 diagnostics inside functions, giving a hard error if you try to use
11623 the finer control available with later versions.
11624 gcc prior to 4.2 warns about diagnostic push and pop.
11625 gcc-5, gcc-6 and gcc-7 warn that -Wstringop-truncation is unknown,
11626 unless you also add #pragma GCC diagnostic ignored "-Wpragma".
11627 (*) Depending on your system header files! */
d99b4b92 11628#if GCC_VERSION >= 8000
602f1657
AM
11629# pragma GCC diagnostic push
11630# pragma GCC diagnostic ignored "-Wstringop-truncation"
d99b4b92 11631#endif
7c76fa91 11632char *
217aa764
AM
11633elfcore_write_prpsinfo (bfd *abfd,
11634 char *buf,
11635 int *bufsiz,
11636 const char *fname,
11637 const char *psargs)
7c76fa91 11638{
183e98be
AM
11639 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
11640
11641 if (bed->elf_backend_write_core_note != NULL)
11642 {
11643 char *ret;
11644 ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
11645 NT_PRPSINFO, fname, psargs);
11646 if (ret != NULL)
11647 return ret;
11648 }
7c76fa91 11649
1f20dca5 11650#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
602f1657 11651# if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
183e98be
AM
11652 if (bed->s->elfclass == ELFCLASS32)
11653 {
602f1657 11654# if defined (HAVE_PSINFO32_T)
183e98be
AM
11655 psinfo32_t data;
11656 int note_type = NT_PSINFO;
602f1657 11657# else
183e98be
AM
11658 prpsinfo32_t data;
11659 int note_type = NT_PRPSINFO;
602f1657 11660# endif
183e98be
AM
11661
11662 memset (&data, 0, sizeof (data));
11663 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
11664 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
11665 return elfcore_write_note (abfd, buf, bufsiz,
1f20dca5 11666 "CORE", note_type, &data, sizeof (data));
183e98be
AM
11667 }
11668 else
602f1657 11669# endif
183e98be 11670 {
602f1657 11671# if defined (HAVE_PSINFO_T)
183e98be
AM
11672 psinfo_t data;
11673 int note_type = NT_PSINFO;
602f1657 11674# else
183e98be
AM
11675 prpsinfo_t data;
11676 int note_type = NT_PRPSINFO;
602f1657 11677# endif
7c76fa91 11678
183e98be
AM
11679 memset (&data, 0, sizeof (data));
11680 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
11681 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
11682 return elfcore_write_note (abfd, buf, bufsiz,
1f20dca5 11683 "CORE", note_type, &data, sizeof (data));
183e98be 11684 }
7c76fa91
MS
11685#endif /* PSINFO_T or PRPSINFO_T */
11686
1f20dca5
UW
11687 free (buf);
11688 return NULL;
11689}
d99b4b92 11690#if GCC_VERSION >= 8000
602f1657 11691# pragma GCC diagnostic pop
d99b4b92 11692#endif
1f20dca5 11693
70a38d42
SDJ
11694char *
11695elfcore_write_linux_prpsinfo32
11696 (bfd *abfd, char *buf, int *bufsiz,
11697 const struct elf_internal_linux_prpsinfo *prpsinfo)
11698{
a2f63b2e
MR
11699 if (get_elf_backend_data (abfd)->linux_prpsinfo32_ugid16)
11700 {
11701 struct elf_external_linux_prpsinfo32_ugid16 data;
11702
11703 swap_linux_prpsinfo32_ugid16_out (abfd, prpsinfo, &data);
11704 return elfcore_write_note (abfd, buf, bufsiz, "CORE", NT_PRPSINFO,
11705 &data, sizeof (data));
11706 }
11707 else
11708 {
11709 struct elf_external_linux_prpsinfo32_ugid32 data;
70a38d42 11710
a2f63b2e
MR
11711 swap_linux_prpsinfo32_ugid32_out (abfd, prpsinfo, &data);
11712 return elfcore_write_note (abfd, buf, bufsiz, "CORE", NT_PRPSINFO,
11713 &data, sizeof (data));
11714 }
70a38d42
SDJ
11715}
11716
11717char *
11718elfcore_write_linux_prpsinfo64
11719 (bfd *abfd, char *buf, int *bufsiz,
11720 const struct elf_internal_linux_prpsinfo *prpsinfo)
11721{
3c9a7b0d
MR
11722 if (get_elf_backend_data (abfd)->linux_prpsinfo64_ugid16)
11723 {
11724 struct elf_external_linux_prpsinfo64_ugid16 data;
11725
11726 swap_linux_prpsinfo64_ugid16_out (abfd, prpsinfo, &data);
11727 return elfcore_write_note (abfd, buf, bufsiz,
11728 "CORE", NT_PRPSINFO, &data, sizeof (data));
11729 }
11730 else
11731 {
11732 struct elf_external_linux_prpsinfo64_ugid32 data;
70a38d42 11733
3c9a7b0d
MR
11734 swap_linux_prpsinfo64_ugid32_out (abfd, prpsinfo, &data);
11735 return elfcore_write_note (abfd, buf, bufsiz,
11736 "CORE", NT_PRPSINFO, &data, sizeof (data));
11737 }
70a38d42
SDJ
11738}
11739
7c76fa91 11740char *
217aa764
AM
11741elfcore_write_prstatus (bfd *abfd,
11742 char *buf,
11743 int *bufsiz,
11744 long pid,
11745 int cursig,
11746 const void *gregs)
7c76fa91 11747{
183e98be 11748 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7c76fa91 11749
183e98be
AM
11750 if (bed->elf_backend_write_core_note != NULL)
11751 {
11752 char *ret;
11753 ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
11754 NT_PRSTATUS,
11755 pid, cursig, gregs);
11756 if (ret != NULL)
11757 return ret;
11758 }
11759
1f20dca5 11760#if defined (HAVE_PRSTATUS_T)
183e98be
AM
11761#if defined (HAVE_PRSTATUS32_T)
11762 if (bed->s->elfclass == ELFCLASS32)
11763 {
11764 prstatus32_t prstat;
11765
11766 memset (&prstat, 0, sizeof (prstat));
11767 prstat.pr_pid = pid;
11768 prstat.pr_cursig = cursig;
11769 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
1f20dca5 11770 return elfcore_write_note (abfd, buf, bufsiz, "CORE",
183e98be
AM
11771 NT_PRSTATUS, &prstat, sizeof (prstat));
11772 }
11773 else
11774#endif
11775 {
11776 prstatus_t prstat;
11777
11778 memset (&prstat, 0, sizeof (prstat));
11779 prstat.pr_pid = pid;
11780 prstat.pr_cursig = cursig;
11781 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
1f20dca5 11782 return elfcore_write_note (abfd, buf, bufsiz, "CORE",
183e98be
AM
11783 NT_PRSTATUS, &prstat, sizeof (prstat));
11784 }
7c76fa91
MS
11785#endif /* HAVE_PRSTATUS_T */
11786
1f20dca5
UW
11787 free (buf);
11788 return NULL;
11789}
11790
51316059
MS
11791#if defined (HAVE_LWPSTATUS_T)
11792char *
217aa764
AM
11793elfcore_write_lwpstatus (bfd *abfd,
11794 char *buf,
11795 int *bufsiz,
11796 long pid,
11797 int cursig,
11798 const void *gregs)
51316059
MS
11799{
11800 lwpstatus_t lwpstat;
183e98be 11801 const char *note_name = "CORE";
51316059
MS
11802
11803 memset (&lwpstat, 0, sizeof (lwpstat));
11804 lwpstat.pr_lwpid = pid >> 16;
11805 lwpstat.pr_cursig = cursig;
11806#if defined (HAVE_LWPSTATUS_T_PR_REG)
d1e8523e 11807 memcpy (&lwpstat.pr_reg, gregs, sizeof (lwpstat.pr_reg));
51316059
MS
11808#elif defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
11809#if !defined(gregs)
11810 memcpy (lwpstat.pr_context.uc_mcontext.gregs,
11811 gregs, sizeof (lwpstat.pr_context.uc_mcontext.gregs));
11812#else
11813 memcpy (lwpstat.pr_context.uc_mcontext.__gregs,
11814 gregs, sizeof (lwpstat.pr_context.uc_mcontext.__gregs));
11815#endif
11816#endif
47d9a591 11817 return elfcore_write_note (abfd, buf, bufsiz, note_name,
51316059
MS
11818 NT_LWPSTATUS, &lwpstat, sizeof (lwpstat));
11819}
11820#endif /* HAVE_LWPSTATUS_T */
11821
7c76fa91
MS
11822#if defined (HAVE_PSTATUS_T)
11823char *
217aa764
AM
11824elfcore_write_pstatus (bfd *abfd,
11825 char *buf,
11826 int *bufsiz,
11827 long pid,
6c10990d
NC
11828 int cursig ATTRIBUTE_UNUSED,
11829 const void *gregs ATTRIBUTE_UNUSED)
7c76fa91 11830{
183e98be
AM
11831 const char *note_name = "CORE";
11832#if defined (HAVE_PSTATUS32_T)
11833 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7c76fa91 11834
183e98be
AM
11835 if (bed->s->elfclass == ELFCLASS32)
11836 {
11837 pstatus32_t pstat;
11838
11839 memset (&pstat, 0, sizeof (pstat));
11840 pstat.pr_pid = pid & 0xffff;
11841 buf = elfcore_write_note (abfd, buf, bufsiz, note_name,
11842 NT_PSTATUS, &pstat, sizeof (pstat));
11843 return buf;
11844 }
11845 else
11846#endif
11847 {
11848 pstatus_t pstat;
11849
11850 memset (&pstat, 0, sizeof (pstat));
11851 pstat.pr_pid = pid & 0xffff;
11852 buf = elfcore_write_note (abfd, buf, bufsiz, note_name,
11853 NT_PSTATUS, &pstat, sizeof (pstat));
11854 return buf;
11855 }
7c76fa91
MS
11856}
11857#endif /* HAVE_PSTATUS_T */
11858
11859char *
217aa764
AM
11860elfcore_write_prfpreg (bfd *abfd,
11861 char *buf,
11862 int *bufsiz,
11863 const void *fpregs,
11864 int size)
7c76fa91 11865{
183e98be 11866 const char *note_name = "CORE";
47d9a591 11867 return elfcore_write_note (abfd, buf, bufsiz,
7c76fa91
MS
11868 note_name, NT_FPREGSET, fpregs, size);
11869}
11870
11871char *
217aa764
AM
11872elfcore_write_prxfpreg (bfd *abfd,
11873 char *buf,
11874 int *bufsiz,
11875 const void *xfpregs,
11876 int size)
7c76fa91
MS
11877{
11878 char *note_name = "LINUX";
47d9a591 11879 return elfcore_write_note (abfd, buf, bufsiz,
7c76fa91
MS
11880 note_name, NT_PRXFPREG, xfpregs, size);
11881}
11882
4339cae0
L
11883char *
11884elfcore_write_xstatereg (bfd *abfd, char *buf, int *bufsiz,
11885 const void *xfpregs, int size)
11886{
97de3545
JB
11887 char *note_name;
11888 if (get_elf_backend_data (abfd)->elf_osabi == ELFOSABI_FREEBSD)
11889 note_name = "FreeBSD";
11890 else
11891 note_name = "LINUX";
4339cae0
L
11892 return elfcore_write_note (abfd, buf, bufsiz,
11893 note_name, NT_X86_XSTATE, xfpregs, size);
11894}
11895
97753bd5
AM
11896char *
11897elfcore_write_ppc_vmx (bfd *abfd,
11898 char *buf,
11899 int *bufsiz,
11900 const void *ppc_vmx,
11901 int size)
11902{
11903 char *note_name = "LINUX";
11904 return elfcore_write_note (abfd, buf, bufsiz,
11905 note_name, NT_PPC_VMX, ppc_vmx, size);
11906}
11907
89eeb0bc
LM
11908char *
11909elfcore_write_ppc_vsx (bfd *abfd,
07d6d2b8
AM
11910 char *buf,
11911 int *bufsiz,
11912 const void *ppc_vsx,
11913 int size)
89eeb0bc
LM
11914{
11915 char *note_name = "LINUX";
11916 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11917 note_name, NT_PPC_VSX, ppc_vsx, size);
89eeb0bc
LM
11918}
11919
cb2366c1
EBM
11920char *
11921elfcore_write_ppc_tar (bfd *abfd,
4b24dd1a
AM
11922 char *buf,
11923 int *bufsiz,
11924 const void *ppc_tar,
11925 int size)
cb2366c1
EBM
11926{
11927 char *note_name = "LINUX";
11928 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11929 note_name, NT_PPC_TAR, ppc_tar, size);
cb2366c1
EBM
11930}
11931
11932char *
11933elfcore_write_ppc_ppr (bfd *abfd,
4b24dd1a
AM
11934 char *buf,
11935 int *bufsiz,
11936 const void *ppc_ppr,
11937 int size)
cb2366c1
EBM
11938{
11939 char *note_name = "LINUX";
11940 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11941 note_name, NT_PPC_PPR, ppc_ppr, size);
cb2366c1
EBM
11942}
11943
11944char *
11945elfcore_write_ppc_dscr (bfd *abfd,
4b24dd1a
AM
11946 char *buf,
11947 int *bufsiz,
11948 const void *ppc_dscr,
11949 int size)
cb2366c1
EBM
11950{
11951 char *note_name = "LINUX";
11952 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11953 note_name, NT_PPC_DSCR, ppc_dscr, size);
cb2366c1
EBM
11954}
11955
11956char *
11957elfcore_write_ppc_ebb (bfd *abfd,
4b24dd1a
AM
11958 char *buf,
11959 int *bufsiz,
11960 const void *ppc_ebb,
11961 int size)
cb2366c1
EBM
11962{
11963 char *note_name = "LINUX";
11964 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11965 note_name, NT_PPC_EBB, ppc_ebb, size);
cb2366c1
EBM
11966}
11967
11968char *
11969elfcore_write_ppc_pmu (bfd *abfd,
4b24dd1a
AM
11970 char *buf,
11971 int *bufsiz,
11972 const void *ppc_pmu,
11973 int size)
cb2366c1
EBM
11974{
11975 char *note_name = "LINUX";
11976 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11977 note_name, NT_PPC_PMU, ppc_pmu, size);
cb2366c1
EBM
11978}
11979
11980char *
11981elfcore_write_ppc_tm_cgpr (bfd *abfd,
4b24dd1a
AM
11982 char *buf,
11983 int *bufsiz,
11984 const void *ppc_tm_cgpr,
11985 int size)
cb2366c1
EBM
11986{
11987 char *note_name = "LINUX";
11988 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11989 note_name, NT_PPC_TM_CGPR, ppc_tm_cgpr, size);
cb2366c1
EBM
11990}
11991
11992char *
11993elfcore_write_ppc_tm_cfpr (bfd *abfd,
4b24dd1a
AM
11994 char *buf,
11995 int *bufsiz,
11996 const void *ppc_tm_cfpr,
11997 int size)
cb2366c1
EBM
11998{
11999 char *note_name = "LINUX";
12000 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 12001 note_name, NT_PPC_TM_CFPR, ppc_tm_cfpr, size);
cb2366c1
EBM
12002}
12003
12004char *
12005elfcore_write_ppc_tm_cvmx (bfd *abfd,
4b24dd1a
AM
12006 char *buf,
12007 int *bufsiz,
12008 const void *ppc_tm_cvmx,
12009 int size)
cb2366c1
EBM
12010{
12011 char *note_name = "LINUX";
12012 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 12013 note_name, NT_PPC_TM_CVMX, ppc_tm_cvmx, size);
cb2366c1
EBM
12014}
12015
12016char *
12017elfcore_write_ppc_tm_cvsx (bfd *abfd,
4b24dd1a
AM
12018 char *buf,
12019 int *bufsiz,
12020 const void *ppc_tm_cvsx,
12021 int size)
cb2366c1
EBM
12022{
12023 char *note_name = "LINUX";
12024 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 12025 note_name, NT_PPC_TM_CVSX, ppc_tm_cvsx, size);
cb2366c1
EBM
12026}
12027
12028char *
12029elfcore_write_ppc_tm_spr (bfd *abfd,
4b24dd1a
AM
12030 char *buf,
12031 int *bufsiz,
12032 const void *ppc_tm_spr,
12033 int size)
cb2366c1
EBM
12034{
12035 char *note_name = "LINUX";
12036 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 12037 note_name, NT_PPC_TM_SPR, ppc_tm_spr, size);
cb2366c1
EBM
12038}
12039
12040char *
12041elfcore_write_ppc_tm_ctar (bfd *abfd,
4b24dd1a
AM
12042 char *buf,
12043 int *bufsiz,
12044 const void *ppc_tm_ctar,
12045 int size)
cb2366c1
EBM
12046{
12047 char *note_name = "LINUX";
12048 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 12049 note_name, NT_PPC_TM_CTAR, ppc_tm_ctar, size);
cb2366c1
EBM
12050}
12051
12052char *
12053elfcore_write_ppc_tm_cppr (bfd *abfd,
4b24dd1a
AM
12054 char *buf,
12055 int *bufsiz,
12056 const void *ppc_tm_cppr,
12057 int size)
cb2366c1
EBM
12058{
12059 char *note_name = "LINUX";
12060 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 12061 note_name, NT_PPC_TM_CPPR, ppc_tm_cppr, size);
cb2366c1
EBM
12062}
12063
12064char *
12065elfcore_write_ppc_tm_cdscr (bfd *abfd,
4b24dd1a
AM
12066 char *buf,
12067 int *bufsiz,
12068 const void *ppc_tm_cdscr,
12069 int size)
cb2366c1
EBM
12070{
12071 char *note_name = "LINUX";
12072 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 12073 note_name, NT_PPC_TM_CDSCR, ppc_tm_cdscr, size);
cb2366c1
EBM
12074}
12075
0675e188
UW
12076static char *
12077elfcore_write_s390_high_gprs (bfd *abfd,
12078 char *buf,
12079 int *bufsiz,
12080 const void *s390_high_gprs,
12081 int size)
12082{
12083 char *note_name = "LINUX";
12084 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 12085 note_name, NT_S390_HIGH_GPRS,
0675e188
UW
12086 s390_high_gprs, size);
12087}
12088
d7eeb400
MS
12089char *
12090elfcore_write_s390_timer (bfd *abfd,
07d6d2b8
AM
12091 char *buf,
12092 int *bufsiz,
12093 const void *s390_timer,
12094 int size)
d7eeb400
MS
12095{
12096 char *note_name = "LINUX";
12097 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 12098 note_name, NT_S390_TIMER, s390_timer, size);
d7eeb400
MS
12099}
12100
12101char *
12102elfcore_write_s390_todcmp (bfd *abfd,
07d6d2b8
AM
12103 char *buf,
12104 int *bufsiz,
12105 const void *s390_todcmp,
12106 int size)
d7eeb400
MS
12107{
12108 char *note_name = "LINUX";
12109 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 12110 note_name, NT_S390_TODCMP, s390_todcmp, size);
d7eeb400
MS
12111}
12112
12113char *
12114elfcore_write_s390_todpreg (bfd *abfd,
07d6d2b8
AM
12115 char *buf,
12116 int *bufsiz,
12117 const void *s390_todpreg,
12118 int size)
d7eeb400
MS
12119{
12120 char *note_name = "LINUX";
12121 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 12122 note_name, NT_S390_TODPREG, s390_todpreg, size);
d7eeb400
MS
12123}
12124
12125char *
12126elfcore_write_s390_ctrs (bfd *abfd,
07d6d2b8
AM
12127 char *buf,
12128 int *bufsiz,
12129 const void *s390_ctrs,
12130 int size)
d7eeb400
MS
12131{
12132 char *note_name = "LINUX";
12133 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 12134 note_name, NT_S390_CTRS, s390_ctrs, size);
d7eeb400
MS
12135}
12136
12137char *
12138elfcore_write_s390_prefix (bfd *abfd,
07d6d2b8
AM
12139 char *buf,
12140 int *bufsiz,
12141 const void *s390_prefix,
12142 int size)
d7eeb400
MS
12143{
12144 char *note_name = "LINUX";
12145 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 12146 note_name, NT_S390_PREFIX, s390_prefix, size);
d7eeb400
MS
12147}
12148
355b81d9
UW
12149char *
12150elfcore_write_s390_last_break (bfd *abfd,
12151 char *buf,
12152 int *bufsiz,
12153 const void *s390_last_break,
12154 int size)
12155{
12156 char *note_name = "LINUX";
12157 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 12158 note_name, NT_S390_LAST_BREAK,
355b81d9
UW
12159 s390_last_break, size);
12160}
12161
12162char *
12163elfcore_write_s390_system_call (bfd *abfd,
12164 char *buf,
12165 int *bufsiz,
12166 const void *s390_system_call,
12167 int size)
12168{
12169 char *note_name = "LINUX";
12170 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 12171 note_name, NT_S390_SYSTEM_CALL,
355b81d9
UW
12172 s390_system_call, size);
12173}
12174
abb3f6cc
NC
12175char *
12176elfcore_write_s390_tdb (bfd *abfd,
12177 char *buf,
12178 int *bufsiz,
12179 const void *s390_tdb,
12180 int size)
12181{
12182 char *note_name = "LINUX";
12183 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 12184 note_name, NT_S390_TDB, s390_tdb, size);
abb3f6cc
NC
12185}
12186
4ef9f41a
AA
12187char *
12188elfcore_write_s390_vxrs_low (bfd *abfd,
12189 char *buf,
12190 int *bufsiz,
12191 const void *s390_vxrs_low,
12192 int size)
12193{
12194 char *note_name = "LINUX";
12195 return elfcore_write_note (abfd, buf, bufsiz,
12196 note_name, NT_S390_VXRS_LOW, s390_vxrs_low, size);
12197}
12198
12199char *
12200elfcore_write_s390_vxrs_high (bfd *abfd,
12201 char *buf,
12202 int *bufsiz,
12203 const void *s390_vxrs_high,
12204 int size)
12205{
12206 char *note_name = "LINUX";
12207 return elfcore_write_note (abfd, buf, bufsiz,
12208 note_name, NT_S390_VXRS_HIGH,
12209 s390_vxrs_high, size);
12210}
12211
88ab90e8
AA
12212char *
12213elfcore_write_s390_gs_cb (bfd *abfd,
12214 char *buf,
12215 int *bufsiz,
12216 const void *s390_gs_cb,
12217 int size)
12218{
12219 char *note_name = "LINUX";
12220 return elfcore_write_note (abfd, buf, bufsiz,
12221 note_name, NT_S390_GS_CB,
12222 s390_gs_cb, size);
12223}
12224
12225char *
12226elfcore_write_s390_gs_bc (bfd *abfd,
12227 char *buf,
12228 int *bufsiz,
12229 const void *s390_gs_bc,
12230 int size)
12231{
12232 char *note_name = "LINUX";
12233 return elfcore_write_note (abfd, buf, bufsiz,
12234 note_name, NT_S390_GS_BC,
12235 s390_gs_bc, size);
12236}
12237
faa9a424
UW
12238char *
12239elfcore_write_arm_vfp (bfd *abfd,
12240 char *buf,
12241 int *bufsiz,
12242 const void *arm_vfp,
12243 int size)
12244{
12245 char *note_name = "LINUX";
12246 return elfcore_write_note (abfd, buf, bufsiz,
12247 note_name, NT_ARM_VFP, arm_vfp, size);
12248}
12249
652451f8
YZ
12250char *
12251elfcore_write_aarch_tls (bfd *abfd,
12252 char *buf,
12253 int *bufsiz,
12254 const void *aarch_tls,
12255 int size)
12256{
12257 char *note_name = "LINUX";
12258 return elfcore_write_note (abfd, buf, bufsiz,
12259 note_name, NT_ARM_TLS, aarch_tls, size);
12260}
12261
12262char *
12263elfcore_write_aarch_hw_break (bfd *abfd,
12264 char *buf,
12265 int *bufsiz,
12266 const void *aarch_hw_break,
12267 int size)
12268{
12269 char *note_name = "LINUX";
12270 return elfcore_write_note (abfd, buf, bufsiz,
12271 note_name, NT_ARM_HW_BREAK, aarch_hw_break, size);
12272}
12273
12274char *
12275elfcore_write_aarch_hw_watch (bfd *abfd,
12276 char *buf,
12277 int *bufsiz,
12278 const void *aarch_hw_watch,
12279 int size)
12280{
12281 char *note_name = "LINUX";
12282 return elfcore_write_note (abfd, buf, bufsiz,
12283 note_name, NT_ARM_HW_WATCH, aarch_hw_watch, size);
12284}
12285
ad1cc4e4
AH
12286char *
12287elfcore_write_aarch_sve (bfd *abfd,
12288 char *buf,
12289 int *bufsiz,
12290 const void *aarch_sve,
12291 int size)
12292{
12293 char *note_name = "LINUX";
12294 return elfcore_write_note (abfd, buf, bufsiz,
12295 note_name, NT_ARM_SVE, aarch_sve, size);
12296}
12297
e6c3b5bf
AH
12298char *
12299elfcore_write_aarch_pauth (bfd *abfd,
12300 char *buf,
12301 int *bufsiz,
12302 const void *aarch_pauth,
12303 int size)
12304{
12305 char *note_name = "LINUX";
12306 return elfcore_write_note (abfd, buf, bufsiz,
12307 note_name, NT_ARM_PAC_MASK, aarch_pauth, size);
12308}
12309
f0bbe8ba
LM
12310char *
12311elfcore_write_aarch_mte (bfd *abfd,
12312 char *buf,
12313 int *bufsiz,
12314 const void *aarch_mte,
12315 int size)
12316{
12317 char *note_name = "LINUX";
12318 return elfcore_write_note (abfd, buf, bufsiz,
12319 note_name, NT_ARM_TAGGED_ADDR_CTRL,
12320 aarch_mte,
12321 size);
12322}
12323
27456742
AK
12324char *
12325elfcore_write_arc_v2 (bfd *abfd,
12326 char *buf,
12327 int *bufsiz,
12328 const void *arc_v2,
12329 int size)
12330{
12331 char *note_name = "LINUX";
12332 return elfcore_write_note (abfd, buf, bufsiz,
12333 note_name, NT_ARC_V2, arc_v2, size);
12334}
12335
e214f8db 12336char *
12337elfcore_write_loongarch_cpucfg (bfd *abfd,
12338 char *buf,
12339 int *bufsiz,
12340 const void *loongarch_cpucfg,
12341 int size)
12342{
12343 char *note_name = "LINUX";
12344 return elfcore_write_note (abfd, buf, bufsiz,
12345 note_name, NT_LARCH_CPUCFG,
12346 loongarch_cpucfg, size);
12347}
12348
12349char *
12350elfcore_write_loongarch_lbt (bfd *abfd,
12351 char *buf,
12352 int *bufsiz,
12353 const void *loongarch_lbt,
12354 int size)
12355{
12356 char *note_name = "LINUX";
12357 return elfcore_write_note (abfd, buf, bufsiz,
12358 note_name, NT_LARCH_LBT, loongarch_lbt, size);
12359}
12360
12361char *
12362elfcore_write_loongarch_lsx (bfd *abfd,
12363 char *buf,
12364 int *bufsiz,
12365 const void *loongarch_lsx,
12366 int size)
12367{
12368 char *note_name = "LINUX";
12369 return elfcore_write_note (abfd, buf, bufsiz,
12370 note_name, NT_LARCH_LSX, loongarch_lsx, size);
12371}
12372
12373char *
12374elfcore_write_loongarch_lasx (bfd *abfd,
12375 char *buf,
12376 int *bufsiz,
12377 const void *loongarch_lasx,
12378 int size)
12379{
12380 char *note_name = "LINUX";
12381 return elfcore_write_note (abfd, buf, bufsiz,
12382 note_name, NT_LARCH_LASX, loongarch_lasx, size);
12383}
12384
db6092f3
AB
12385/* Write the buffer of csr values in CSRS (length SIZE) into the note
12386 buffer BUF and update *BUFSIZ. ABFD is the bfd the note is being
12387 written into. Return a pointer to the new start of the note buffer, to
12388 replace BUF which may no longer be valid. */
12389
12390char *
12391elfcore_write_riscv_csr (bfd *abfd,
12392 char *buf,
12393 int *bufsiz,
12394 const void *csrs,
12395 int size)
12396{
12397 const char *note_name = "GDB";
12398 return elfcore_write_note (abfd, buf, bufsiz,
12399 note_name, NT_RISCV_CSR, csrs, size);
12400}
12401
b63a5e38
AB
12402/* Write the target description (a string) pointed to by TDESC, length
12403 SIZE, into the note buffer BUF, and update *BUFSIZ. ABFD is the bfd the
12404 note is being written into. Return a pointer to the new start of the
12405 note buffer, to replace BUF which may no longer be valid. */
12406
12407char *
12408elfcore_write_gdb_tdesc (bfd *abfd,
12409 char *buf,
12410 int *bufsiz,
12411 const void *tdesc,
12412 int size)
12413{
12414 const char *note_name = "GDB";
12415 return elfcore_write_note (abfd, buf, bufsiz,
12416 note_name, NT_GDB_TDESC, tdesc, size);
12417}
12418
bb864ac1
CES
12419char *
12420elfcore_write_register_note (bfd *abfd,
12421 char *buf,
12422 int *bufsiz,
12423 const char *section,
12424 const void *data,
12425 int size)
12426{
12427 if (strcmp (section, ".reg2") == 0)
12428 return elfcore_write_prfpreg (abfd, buf, bufsiz, data, size);
12429 if (strcmp (section, ".reg-xfp") == 0)
12430 return elfcore_write_prxfpreg (abfd, buf, bufsiz, data, size);
4339cae0
L
12431 if (strcmp (section, ".reg-xstate") == 0)
12432 return elfcore_write_xstatereg (abfd, buf, bufsiz, data, size);
bb864ac1
CES
12433 if (strcmp (section, ".reg-ppc-vmx") == 0)
12434 return elfcore_write_ppc_vmx (abfd, buf, bufsiz, data, size);
89eeb0bc
LM
12435 if (strcmp (section, ".reg-ppc-vsx") == 0)
12436 return elfcore_write_ppc_vsx (abfd, buf, bufsiz, data, size);
cb2366c1
EBM
12437 if (strcmp (section, ".reg-ppc-tar") == 0)
12438 return elfcore_write_ppc_tar (abfd, buf, bufsiz, data, size);
12439 if (strcmp (section, ".reg-ppc-ppr") == 0)
12440 return elfcore_write_ppc_ppr (abfd, buf, bufsiz, data, size);
12441 if (strcmp (section, ".reg-ppc-dscr") == 0)
12442 return elfcore_write_ppc_dscr (abfd, buf, bufsiz, data, size);
12443 if (strcmp (section, ".reg-ppc-ebb") == 0)
12444 return elfcore_write_ppc_ebb (abfd, buf, bufsiz, data, size);
12445 if (strcmp (section, ".reg-ppc-pmu") == 0)
12446 return elfcore_write_ppc_pmu (abfd, buf, bufsiz, data, size);
12447 if (strcmp (section, ".reg-ppc-tm-cgpr") == 0)
12448 return elfcore_write_ppc_tm_cgpr (abfd, buf, bufsiz, data, size);
12449 if (strcmp (section, ".reg-ppc-tm-cfpr") == 0)
12450 return elfcore_write_ppc_tm_cfpr (abfd, buf, bufsiz, data, size);
12451 if (strcmp (section, ".reg-ppc-tm-cvmx") == 0)
12452 return elfcore_write_ppc_tm_cvmx (abfd, buf, bufsiz, data, size);
12453 if (strcmp (section, ".reg-ppc-tm-cvsx") == 0)
12454 return elfcore_write_ppc_tm_cvsx (abfd, buf, bufsiz, data, size);
12455 if (strcmp (section, ".reg-ppc-tm-spr") == 0)
12456 return elfcore_write_ppc_tm_spr (abfd, buf, bufsiz, data, size);
12457 if (strcmp (section, ".reg-ppc-tm-ctar") == 0)
12458 return elfcore_write_ppc_tm_ctar (abfd, buf, bufsiz, data, size);
12459 if (strcmp (section, ".reg-ppc-tm-cppr") == 0)
12460 return elfcore_write_ppc_tm_cppr (abfd, buf, bufsiz, data, size);
12461 if (strcmp (section, ".reg-ppc-tm-cdscr") == 0)
12462 return elfcore_write_ppc_tm_cdscr (abfd, buf, bufsiz, data, size);
0675e188
UW
12463 if (strcmp (section, ".reg-s390-high-gprs") == 0)
12464 return elfcore_write_s390_high_gprs (abfd, buf, bufsiz, data, size);
d7eeb400
MS
12465 if (strcmp (section, ".reg-s390-timer") == 0)
12466 return elfcore_write_s390_timer (abfd, buf, bufsiz, data, size);
12467 if (strcmp (section, ".reg-s390-todcmp") == 0)
12468 return elfcore_write_s390_todcmp (abfd, buf, bufsiz, data, size);
12469 if (strcmp (section, ".reg-s390-todpreg") == 0)
12470 return elfcore_write_s390_todpreg (abfd, buf, bufsiz, data, size);
12471 if (strcmp (section, ".reg-s390-ctrs") == 0)
12472 return elfcore_write_s390_ctrs (abfd, buf, bufsiz, data, size);
12473 if (strcmp (section, ".reg-s390-prefix") == 0)
12474 return elfcore_write_s390_prefix (abfd, buf, bufsiz, data, size);
355b81d9
UW
12475 if (strcmp (section, ".reg-s390-last-break") == 0)
12476 return elfcore_write_s390_last_break (abfd, buf, bufsiz, data, size);
12477 if (strcmp (section, ".reg-s390-system-call") == 0)
12478 return elfcore_write_s390_system_call (abfd, buf, bufsiz, data, size);
abb3f6cc
NC
12479 if (strcmp (section, ".reg-s390-tdb") == 0)
12480 return elfcore_write_s390_tdb (abfd, buf, bufsiz, data, size);
4ef9f41a
AA
12481 if (strcmp (section, ".reg-s390-vxrs-low") == 0)
12482 return elfcore_write_s390_vxrs_low (abfd, buf, bufsiz, data, size);
12483 if (strcmp (section, ".reg-s390-vxrs-high") == 0)
12484 return elfcore_write_s390_vxrs_high (abfd, buf, bufsiz, data, size);
88ab90e8
AA
12485 if (strcmp (section, ".reg-s390-gs-cb") == 0)
12486 return elfcore_write_s390_gs_cb (abfd, buf, bufsiz, data, size);
12487 if (strcmp (section, ".reg-s390-gs-bc") == 0)
12488 return elfcore_write_s390_gs_bc (abfd, buf, bufsiz, data, size);
faa9a424
UW
12489 if (strcmp (section, ".reg-arm-vfp") == 0)
12490 return elfcore_write_arm_vfp (abfd, buf, bufsiz, data, size);
652451f8
YZ
12491 if (strcmp (section, ".reg-aarch-tls") == 0)
12492 return elfcore_write_aarch_tls (abfd, buf, bufsiz, data, size);
12493 if (strcmp (section, ".reg-aarch-hw-break") == 0)
12494 return elfcore_write_aarch_hw_break (abfd, buf, bufsiz, data, size);
12495 if (strcmp (section, ".reg-aarch-hw-watch") == 0)
12496 return elfcore_write_aarch_hw_watch (abfd, buf, bufsiz, data, size);
ad1cc4e4
AH
12497 if (strcmp (section, ".reg-aarch-sve") == 0)
12498 return elfcore_write_aarch_sve (abfd, buf, bufsiz, data, size);
e6c3b5bf
AH
12499 if (strcmp (section, ".reg-aarch-pauth") == 0)
12500 return elfcore_write_aarch_pauth (abfd, buf, bufsiz, data, size);
f0bbe8ba
LM
12501 if (strcmp (section, ".reg-aarch-mte") == 0)
12502 return elfcore_write_aarch_mte (abfd, buf, bufsiz, data, size);
27456742
AK
12503 if (strcmp (section, ".reg-arc-v2") == 0)
12504 return elfcore_write_arc_v2 (abfd, buf, bufsiz, data, size);
b63a5e38
AB
12505 if (strcmp (section, ".gdb-tdesc") == 0)
12506 return elfcore_write_gdb_tdesc (abfd, buf, bufsiz, data, size);
db6092f3
AB
12507 if (strcmp (section, ".reg-riscv-csr") == 0)
12508 return elfcore_write_riscv_csr (abfd, buf, bufsiz, data, size);
e214f8db 12509 if (strcmp (section, ".reg-loongarch-cpucfg") == 0)
12510 return elfcore_write_loongarch_cpucfg (abfd, buf, bufsiz, data, size);
12511 if (strcmp (section, ".reg-loongarch-lbt") == 0)
12512 return elfcore_write_loongarch_lbt (abfd, buf, bufsiz, data, size);
12513 if (strcmp (section, ".reg-loongarch-lsx") == 0)
12514 return elfcore_write_loongarch_lsx (abfd, buf, bufsiz, data, size);
12515 if (strcmp (section, ".reg-loongarch-lasx") == 0)
12516 return elfcore_write_loongarch_lasx (abfd, buf, bufsiz, data, size);
bb864ac1
CES
12517 return NULL;
12518}
12519
4cb1265b
MS
12520char *
12521elfcore_write_file_note (bfd *obfd, char *note_data, int *note_size,
12522 const void *buf, int bufsiz)
12523{
12524 return elfcore_write_note (obfd, note_data, note_size,
12525 "CORE", NT_FILE, buf, bufsiz);
12526}
12527
0a1b45a2 12528static bool
276da9b3
L
12529elf_parse_notes (bfd *abfd, char *buf, size_t size, file_ptr offset,
12530 size_t align)
252b5132 12531{
c044fabd 12532 char *p;
252b5132 12533
276da9b3
L
12534 /* NB: CORE PT_NOTE segments may have p_align values of 0 or 1.
12535 gABI specifies that PT_NOTE alignment should be aligned to 4
12536 bytes for 32-bit objects and to 8 bytes for 64-bit objects. If
12537 align is less than 4, we use 4 byte alignment. */
12538 if (align < 4)
12539 align = 4;
ef135d43 12540 if (align != 4 && align != 8)
0a1b45a2 12541 return false;
276da9b3 12542
252b5132
RH
12543 p = buf;
12544 while (p < buf + size)
12545 {
c044fabd 12546 Elf_External_Note *xnp = (Elf_External_Note *) p;
252b5132
RH
12547 Elf_Internal_Note in;
12548
baea7ef1 12549 if (offsetof (Elf_External_Note, name) > buf - p + size)
0a1b45a2 12550 return false;
baea7ef1 12551
dc810e39 12552 in.type = H_GET_32 (abfd, xnp->type);
252b5132 12553
dc810e39 12554 in.namesz = H_GET_32 (abfd, xnp->namesz);
252b5132 12555 in.namedata = xnp->name;
baea7ef1 12556 if (in.namesz > buf - in.namedata + size)
0a1b45a2 12557 return false;
252b5132 12558
dc810e39 12559 in.descsz = H_GET_32 (abfd, xnp->descsz);
276da9b3 12560 in.descdata = p + ELF_NOTE_DESC_OFFSET (in.namesz, align);
252b5132 12561 in.descpos = offset + (in.descdata - buf);
baea7ef1
AM
12562 if (in.descsz != 0
12563 && (in.descdata >= buf + size
12564 || in.descsz > buf - in.descdata + size))
0a1b45a2 12565 return false;
252b5132 12566
718175fa 12567 switch (bfd_get_format (abfd))
07d6d2b8 12568 {
718175fa 12569 default:
0a1b45a2 12570 return true;
718175fa
JK
12571
12572 case bfd_core:
f64e188b 12573 {
8acbedd6 12574#define GROKER_ELEMENT(S,F) {S, sizeof (S) - 1, F}
f64e188b 12575 struct
718175fa 12576 {
f64e188b 12577 const char * string;
8acbedd6 12578 size_t len;
0a1b45a2 12579 bool (*func) (bfd *, Elf_Internal_Note *);
718175fa 12580 }
f64e188b 12581 grokers[] =
b15fa79e 12582 {
8acbedd6 12583 GROKER_ELEMENT ("", elfcore_grok_note),
aa1ed4a9 12584 GROKER_ELEMENT ("FreeBSD", elfcore_grok_freebsd_note),
8acbedd6 12585 GROKER_ELEMENT ("NetBSD-CORE", elfcore_grok_netbsd_note),
6420dd27 12586 GROKER_ELEMENT ("OpenBSD", elfcore_grok_openbsd_note),
8acbedd6 12587 GROKER_ELEMENT ("QNX", elfcore_grok_nto_note),
864619bb 12588 GROKER_ELEMENT ("SPU/", elfcore_grok_spu_note),
6420dd27
LB
12589 GROKER_ELEMENT ("GNU", elfobj_grok_gnu_note),
12590 GROKER_ELEMENT ("CORE", elfcore_grok_solaris_note)
f64e188b 12591 };
8acbedd6 12592#undef GROKER_ELEMENT
f64e188b
NC
12593 int i;
12594
12595 for (i = ARRAY_SIZE (grokers); i--;)
8acbedd6
KS
12596 {
12597 if (in.namesz >= grokers[i].len
12598 && strncmp (in.namedata, grokers[i].string,
12599 grokers[i].len) == 0)
12600 {
12601 if (! grokers[i].func (abfd, & in))
0a1b45a2 12602 return false;
8acbedd6
KS
12603 break;
12604 }
12605 }
f64e188b
NC
12606 break;
12607 }
718175fa
JK
12608
12609 case bfd_object:
12610 if (in.namesz == sizeof "GNU" && strcmp (in.namedata, "GNU") == 0)
12611 {
12612 if (! elfobj_grok_gnu_note (abfd, &in))
0a1b45a2 12613 return false;
718175fa 12614 }
e21e5835
NC
12615 else if (in.namesz == sizeof "stapsdt"
12616 && strcmp (in.namedata, "stapsdt") == 0)
12617 {
12618 if (! elfobj_grok_stapsdt_note (abfd, &in))
0a1b45a2 12619 return false;
e21e5835 12620 }
718175fa 12621 break;
08a40648 12622 }
252b5132 12623
276da9b3 12624 p += ELF_NOTE_NEXT_OFFSET (in.namesz, in.descsz, align);
252b5132
RH
12625 }
12626
0a1b45a2 12627 return true;
718175fa
JK
12628}
12629
0a1b45a2 12630bool
276da9b3
L
12631elf_read_notes (bfd *abfd, file_ptr offset, bfd_size_type size,
12632 size_t align)
718175fa
JK
12633{
12634 char *buf;
12635
957e1fc1 12636 if (size == 0 || (size + 1) == 0)
0a1b45a2 12637 return true;
718175fa
JK
12638
12639 if (bfd_seek (abfd, offset, SEEK_SET) != 0)
0a1b45a2 12640 return false;
718175fa 12641
2bb3687b 12642 buf = (char *) _bfd_malloc_and_read (abfd, size + 1, size);
718175fa 12643 if (buf == NULL)
0a1b45a2 12644 return false;
718175fa 12645
f64e188b
NC
12646 /* PR 17512: file: ec08f814
12647 0-termintate the buffer so that string searches will not overflow. */
12648 buf[size] = 0;
12649
2bb3687b 12650 if (!elf_parse_notes (abfd, buf, size, offset, align))
718175fa
JK
12651 {
12652 free (buf);
0a1b45a2 12653 return false;
718175fa
JK
12654 }
12655
252b5132 12656 free (buf);
0a1b45a2 12657 return true;
252b5132 12658}
98d8431c
JB
12659\f
12660/* Providing external access to the ELF program header table. */
12661
12662/* Return an upper bound on the number of bytes required to store a
12663 copy of ABFD's program header table entries. Return -1 if an error
12664 occurs; bfd_get_error will return an appropriate code. */
c044fabd 12665
98d8431c 12666long
217aa764 12667bfd_get_elf_phdr_upper_bound (bfd *abfd)
98d8431c
JB
12668{
12669 if (abfd->xvec->flavour != bfd_target_elf_flavour)
12670 {
12671 bfd_set_error (bfd_error_wrong_format);
12672 return -1;
12673 }
12674
936e320b 12675 return elf_elfheader (abfd)->e_phnum * sizeof (Elf_Internal_Phdr);
98d8431c
JB
12676}
12677
98d8431c
JB
12678/* Copy ABFD's program header table entries to *PHDRS. The entries
12679 will be stored as an array of Elf_Internal_Phdr structures, as
12680 defined in include/elf/internal.h. To find out how large the
12681 buffer needs to be, call bfd_get_elf_phdr_upper_bound.
12682
12683 Return the number of program header table entries read, or -1 if an
12684 error occurs; bfd_get_error will return an appropriate code. */
c044fabd 12685
98d8431c 12686int
217aa764 12687bfd_get_elf_phdrs (bfd *abfd, void *phdrs)
98d8431c
JB
12688{
12689 int num_phdrs;
12690
12691 if (abfd->xvec->flavour != bfd_target_elf_flavour)
12692 {
12693 bfd_set_error (bfd_error_wrong_format);
12694 return -1;
12695 }
12696
12697 num_phdrs = elf_elfheader (abfd)->e_phnum;
01bcaf63
TT
12698 if (num_phdrs != 0)
12699 memcpy (phdrs, elf_tdata (abfd)->phdr,
12700 num_phdrs * sizeof (Elf_Internal_Phdr));
98d8431c
JB
12701
12702 return num_phdrs;
12703}
ae4221d7 12704
db6751f2 12705enum elf_reloc_type_class
7e612e98
AM
12706_bfd_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
12707 const asection *rel_sec ATTRIBUTE_UNUSED,
12708 const Elf_Internal_Rela *rela ATTRIBUTE_UNUSED)
db6751f2
JJ
12709{
12710 return reloc_class_normal;
12711}
f8df10f4 12712
47d9a591 12713/* For RELA architectures, return the relocation value for a
f8df10f4
JJ
12714 relocation against a local symbol. */
12715
12716bfd_vma
217aa764
AM
12717_bfd_elf_rela_local_sym (bfd *abfd,
12718 Elf_Internal_Sym *sym,
8517fae7 12719 asection **psec,
217aa764 12720 Elf_Internal_Rela *rel)
f8df10f4 12721{
8517fae7 12722 asection *sec = *psec;
f8df10f4
JJ
12723 bfd_vma relocation;
12724
6835821b
AM
12725 relocation = (sec->output_section->vma
12726 + sec->output_offset
12727 + sym->st_value);
f8df10f4 12728 if ((sec->flags & SEC_MERGE)
c629eae0 12729 && ELF_ST_TYPE (sym->st_info) == STT_SECTION
dbaa2011 12730 && sec->sec_info_type == SEC_INFO_TYPE_MERGE)
f8df10f4 12731 {
f8df10f4 12732 rel->r_addend =
8517fae7 12733 _bfd_merged_section_offset (abfd, psec,
65765700 12734 elf_section_data (sec)->sec_info,
753731ee
AM
12735 sym->st_value + rel->r_addend);
12736 if (sec != *psec)
12737 {
12738 /* If we have changed the section, and our original section is
12739 marked with SEC_EXCLUDE, it means that the original
12740 SEC_MERGE section has been completely subsumed in some
12741 other SEC_MERGE section. In this case, we need to leave
12742 some info around for --emit-relocs. */
12743 if ((sec->flags & SEC_EXCLUDE) != 0)
12744 sec->kept_section = *psec;
12745 sec = *psec;
12746 }
8517fae7
AM
12747 rel->r_addend -= relocation;
12748 rel->r_addend += sec->output_section->vma + sec->output_offset;
f8df10f4
JJ
12749 }
12750 return relocation;
12751}
c629eae0
JJ
12752
12753bfd_vma
217aa764
AM
12754_bfd_elf_rel_local_sym (bfd *abfd,
12755 Elf_Internal_Sym *sym,
12756 asection **psec,
12757 bfd_vma addend)
47d9a591 12758{
c629eae0
JJ
12759 asection *sec = *psec;
12760
6835821b 12761 if (sec->sec_info_type != SEC_INFO_TYPE_MERGE)
c629eae0
JJ
12762 return sym->st_value + addend;
12763
12764 return _bfd_merged_section_offset (abfd, psec,
65765700 12765 elf_section_data (sec)->sec_info,
753731ee 12766 sym->st_value + addend);
c629eae0
JJ
12767}
12768
37b01f6a
DG
12769/* Adjust an address within a section. Given OFFSET within SEC, return
12770 the new offset within the section, based upon changes made to the
12771 section. Returns -1 if the offset is now invalid.
12772 The offset (in abnd out) is in target sized bytes, however big a
12773 byte may be. */
12774
c629eae0 12775bfd_vma
217aa764 12776_bfd_elf_section_offset (bfd *abfd,
92e4ec35 12777 struct bfd_link_info *info,
217aa764
AM
12778 asection *sec,
12779 bfd_vma offset)
c629eae0 12780{
68bfbfcc 12781 switch (sec->sec_info_type)
65765700 12782 {
dbaa2011 12783 case SEC_INFO_TYPE_STABS:
eea6121a
AM
12784 return _bfd_stab_section_offset (sec, elf_section_data (sec)->sec_info,
12785 offset);
dbaa2011 12786 case SEC_INFO_TYPE_EH_FRAME:
92e4ec35 12787 return _bfd_elf_eh_frame_section_offset (abfd, info, sec, offset);
37b01f6a 12788
65765700 12789 default:
310fd250
L
12790 if ((sec->flags & SEC_ELF_REVERSE_COPY) != 0)
12791 {
37b01f6a 12792 /* Reverse the offset. */
310fd250
L
12793 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
12794 bfd_size_type address_size = bed->s->arch_size / 8;
37b01f6a
DG
12795
12796 /* address_size and sec->size are in octets. Convert
12797 to bytes before subtracting the original offset. */
61826503 12798 offset = ((sec->size - address_size)
bb294208 12799 / bfd_octets_per_byte (abfd, sec) - offset);
310fd250 12800 }
65765700
JJ
12801 return offset;
12802 }
c629eae0 12803}
3333a7c3
RM
12804\f
12805/* Create a new BFD as if by bfd_openr. Rather than opening a file,
12806 reconstruct an ELF file by reading the segments out of remote memory
12807 based on the ELF file header at EHDR_VMA and the ELF program headers it
12808 points to. If not null, *LOADBASEP is filled in with the difference
12809 between the VMAs from which the segments were read, and the VMAs the
12810 file headers (and hence BFD's idea of each section's VMA) put them at.
12811
12812 The function TARGET_READ_MEMORY is called to copy LEN bytes from the
12813 remote memory at target address VMA into the local buffer at MYADDR; it
12814 should return zero on success or an `errno' code on failure. TEMPL must
12815 be a BFD for an ELF target with the word size and byte order found in
12816 the remote memory. */
12817
12818bfd *
217aa764
AM
12819bfd_elf_bfd_from_remote_memory
12820 (bfd *templ,
12821 bfd_vma ehdr_vma,
f0a5d95a 12822 bfd_size_type size,
217aa764 12823 bfd_vma *loadbasep,
fe78531d 12824 int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
3333a7c3
RM
12825{
12826 return (*get_elf_backend_data (templ)->elf_backend_bfd_from_remote_memory)
5979d6b6 12827 (templ, ehdr_vma, size, loadbasep, target_read_memory);
3333a7c3 12828}
4c45e5c9
JJ
12829\f
12830long
c9727e01
AM
12831_bfd_elf_get_synthetic_symtab (bfd *abfd,
12832 long symcount ATTRIBUTE_UNUSED,
12833 asymbol **syms ATTRIBUTE_UNUSED,
8615f3f2 12834 long dynsymcount,
c9727e01
AM
12835 asymbol **dynsyms,
12836 asymbol **ret)
4c45e5c9
JJ
12837{
12838 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
12839 asection *relplt;
12840 asymbol *s;
12841 const char *relplt_name;
0a1b45a2 12842 bool (*slurp_relocs) (bfd *, asection *, asymbol **, bool);
4c45e5c9
JJ
12843 arelent *p;
12844 long count, i, n;
12845 size_t size;
12846 Elf_Internal_Shdr *hdr;
12847 char *names;
12848 asection *plt;
12849
8615f3f2
AM
12850 *ret = NULL;
12851
90e3cdf2
JJ
12852 if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
12853 return 0;
12854
8615f3f2
AM
12855 if (dynsymcount <= 0)
12856 return 0;
12857
4c45e5c9
JJ
12858 if (!bed->plt_sym_val)
12859 return 0;
12860
12861 relplt_name = bed->relplt_name;
12862 if (relplt_name == NULL)
d35fd659 12863 relplt_name = bed->rela_plts_and_copies_p ? ".rela.plt" : ".rel.plt";
4c45e5c9
JJ
12864 relplt = bfd_get_section_by_name (abfd, relplt_name);
12865 if (relplt == NULL)
12866 return 0;
12867
12868 hdr = &elf_section_data (relplt)->this_hdr;
12869 if (hdr->sh_link != elf_dynsymtab (abfd)
12870 || (hdr->sh_type != SHT_REL && hdr->sh_type != SHT_RELA))
12871 return 0;
12872
12873 plt = bfd_get_section_by_name (abfd, ".plt");
12874 if (plt == NULL)
12875 return 0;
12876
12877 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
0a1b45a2 12878 if (! (*slurp_relocs) (abfd, relplt, dynsyms, true))
4c45e5c9
JJ
12879 return -1;
12880
eea6121a 12881 count = relplt->size / hdr->sh_entsize;
4c45e5c9
JJ
12882 size = count * sizeof (asymbol);
12883 p = relplt->relocation;
cb53bf42 12884 for (i = 0; i < count; i++, p += bed->s->int_rels_per_ext_rel)
041de40d
AM
12885 {
12886 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
12887 if (p->addend != 0)
12888 {
12889#ifdef BFD64
12890 size += sizeof ("+0x") - 1 + 8 + 8 * (bed->s->elfclass == ELFCLASS64);
12891#else
12892 size += sizeof ("+0x") - 1 + 8;
12893#endif
12894 }
12895 }
4c45e5c9 12896
a50b1753 12897 s = *ret = (asymbol *) bfd_malloc (size);
4c45e5c9
JJ
12898 if (s == NULL)
12899 return -1;
12900
12901 names = (char *) (s + count);
12902 p = relplt->relocation;
12903 n = 0;
cb53bf42 12904 for (i = 0; i < count; i++, p += bed->s->int_rels_per_ext_rel)
4c45e5c9
JJ
12905 {
12906 size_t len;
12907 bfd_vma addr;
12908
12909 addr = bed->plt_sym_val (i, plt, p);
12910 if (addr == (bfd_vma) -1)
12911 continue;
12912
12913 *s = **p->sym_ptr_ptr;
65a7a66f
AM
12914 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
12915 we are defining a symbol, ensure one of them is set. */
12916 if ((s->flags & BSF_LOCAL) == 0)
12917 s->flags |= BSF_GLOBAL;
6ba2a415 12918 s->flags |= BSF_SYNTHETIC;
4c45e5c9
JJ
12919 s->section = plt;
12920 s->value = addr - plt->vma;
12921 s->name = names;
8f39ba8e 12922 s->udata.p = NULL;
4c45e5c9
JJ
12923 len = strlen ((*p->sym_ptr_ptr)->name);
12924 memcpy (names, (*p->sym_ptr_ptr)->name, len);
12925 names += len;
041de40d
AM
12926 if (p->addend != 0)
12927 {
1d770845 12928 char buf[30], *a;
d324f6d6 12929
041de40d
AM
12930 memcpy (names, "+0x", sizeof ("+0x") - 1);
12931 names += sizeof ("+0x") - 1;
1d770845
L
12932 bfd_sprintf_vma (abfd, buf, p->addend);
12933 for (a = buf; *a == '0'; ++a)
12934 ;
12935 len = strlen (a);
12936 memcpy (names, a, len);
12937 names += len;
041de40d 12938 }
4c45e5c9
JJ
12939 memcpy (names, "@plt", sizeof ("@plt"));
12940 names += sizeof ("@plt");
8f39ba8e 12941 ++s, ++n;
4c45e5c9
JJ
12942 }
12943
12944 return n;
12945}
3d7f7666 12946
821e6ff6
AM
12947/* It is only used by x86-64 so far.
12948 ??? This repeats *COM* id of zero. sec->id is supposed to be unique,
7eacd66b
AM
12949 but current usage would allow all of _bfd_std_section to be zero. */
12950static const asymbol lcomm_sym
12951 = GLOBAL_SYM_INIT ("LARGE_COMMON", &_bfd_elf_large_com_section);
3b22753a 12952asection _bfd_elf_large_com_section
7eacd66b 12953 = BFD_FAKE_SECTION (_bfd_elf_large_com_section, &lcomm_sym,
821e6ff6 12954 "LARGE_COMMON", 0, SEC_IS_COMMON);
ecca9871 12955
0a1b45a2 12956bool
cc364be6 12957_bfd_elf_final_write_processing (bfd *abfd)
06f44071
AM
12958{
12959 Elf_Internal_Ehdr *i_ehdrp; /* ELF file header, internal form. */
d1036acb
L
12960
12961 i_ehdrp = elf_elfheader (abfd);
12962
06f44071
AM
12963 if (i_ehdrp->e_ident[EI_OSABI] == ELFOSABI_NONE)
12964 i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
d8045f23 12965
df3a023b 12966 /* Set the osabi field to ELFOSABI_GNU if the binary contains
99fabbc9
JL
12967 SHF_GNU_MBIND or SHF_GNU_RETAIN sections or symbols of STT_GNU_IFUNC type
12968 or STB_GNU_UNIQUE binding. */
cc364be6
AM
12969 if (elf_tdata (abfd)->has_gnu_osabi != 0)
12970 {
12971 if (i_ehdrp->e_ident[EI_OSABI] == ELFOSABI_NONE)
12972 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_GNU;
12973 else if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_GNU
12974 && i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_FREEBSD)
12975 {
12976 if (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_mbind)
99fabbc9
JL
12977 _bfd_error_handler (_("GNU_MBIND section is supported only by GNU "
12978 "and FreeBSD targets"));
cc364be6 12979 if (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_ifunc)
99fabbc9
JL
12980 _bfd_error_handler (_("symbol type STT_GNU_IFUNC is supported "
12981 "only by GNU and FreeBSD targets"));
cc364be6 12982 if (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_unique)
99fabbc9
JL
12983 _bfd_error_handler (_("symbol binding STB_GNU_UNIQUE is supported "
12984 "only by GNU and FreeBSD targets"));
12985 if (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_retain)
12986 _bfd_error_handler (_("GNU_RETAIN section is supported "
12987 "only by GNU and FreeBSD targets"));
9aea1e31 12988 bfd_set_error (bfd_error_sorry);
0a1b45a2 12989 return false;
cc364be6
AM
12990 }
12991 }
0a1b45a2 12992 return true;
d1036acb 12993}
fcb93ecf
PB
12994
12995
12996/* Return TRUE for ELF symbol types that represent functions.
12997 This is the default version of this function, which is sufficient for
d8045f23 12998 most targets. It returns true if TYPE is STT_FUNC or STT_GNU_IFUNC. */
fcb93ecf 12999
0a1b45a2 13000bool
fcb93ecf
PB
13001_bfd_elf_is_function_type (unsigned int type)
13002{
d8045f23
NC
13003 return (type == STT_FUNC
13004 || type == STT_GNU_IFUNC);
fcb93ecf 13005}
9f296da3 13006
aef36ac1
AM
13007/* If the ELF symbol SYM might be a function in SEC, return the
13008 function size and set *CODE_OFF to the function's entry point,
13009 otherwise return zero. */
9f296da3 13010
aef36ac1
AM
13011bfd_size_type
13012_bfd_elf_maybe_function_sym (const asymbol *sym, asection *sec,
13013 bfd_vma *code_off)
9f296da3 13014{
aef36ac1 13015 bfd_size_type size;
24aebc79 13016 elf_symbol_type * elf_sym = (elf_symbol_type *) sym;
aef36ac1 13017
ff9e0f5b 13018 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
aef36ac1
AM
13019 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0
13020 || sym->section != sec)
13021 return 0;
ff9e0f5b 13022
24aebc79
NC
13023 size = (sym->flags & BSF_SYNTHETIC) ? 0 : elf_sym->internal_elf_sym.st_size;
13024
13025 /* In theory we should check that the symbol's type satisfies
13026 _bfd_elf_is_function_type(), but there are some function-like
13027 symbols which would fail this test. (eg _start). Instead
13028 we check for hidden, local, notype symbols with zero size.
13029 This type of symbol is generated by the annobin plugin for gcc
13030 and clang, and should not be considered to be a function symbol. */
13031 if (size == 0
13032 && ((sym->flags & (BSF_SYNTHETIC | BSF_LOCAL)) == BSF_LOCAL)
13033 && ELF_ST_TYPE (elf_sym->internal_elf_sym.st_info) == STT_NOTYPE
13034 && ELF_ST_VISIBILITY (elf_sym->internal_elf_sym.st_other) == STV_HIDDEN)
13035 return 0;
13036
ff9e0f5b 13037 *code_off = sym->value;
24aebc79
NC
13038 /* Do not return 0 for the function's size. */
13039 return size ? size : 1;
9f296da3 13040}
a8e14f4c
NC
13041
13042/* Set to non-zero to enable some debug messages. */
13043#define DEBUG_SECONDARY_RELOCS 0
13044
13045/* An internal-to-the-bfd-library only section type
13046 used to indicate a cached secondary reloc section. */
13047#define SHT_SECONDARY_RELOC (SHT_LOOS + SHT_RELA)
13048
13049/* Create a BFD section to hold a secondary reloc section. */
13050
0a1b45a2 13051bool
a8e14f4c
NC
13052_bfd_elf_init_secondary_reloc_section (bfd * abfd,
13053 Elf_Internal_Shdr *hdr,
13054 const char * name,
13055 unsigned int shindex)
13056{
13057 /* We only support RELA secondary relocs. */
13058 if (hdr->sh_type != SHT_RELA)
0a1b45a2 13059 return false;
a8e14f4c
NC
13060
13061#if DEBUG_SECONDARY_RELOCS
13062 fprintf (stderr, "secondary reloc section %s encountered\n", name);
13063#endif
13064 hdr->sh_type = SHT_SECONDARY_RELOC;
13065 return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
13066}
13067
13068/* Read in any secondary relocs associated with SEC. */
13069
0a1b45a2 13070bool
f60742b2
NC
13071_bfd_elf_slurp_secondary_reloc_section (bfd * abfd,
13072 asection * sec,
13073 asymbol ** symbols,
0a1b45a2 13074 bool dynamic)
a8e14f4c
NC
13075{
13076 const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
13077 asection * relsec;
0a1b45a2 13078 bool result = true;
a8e14f4c
NC
13079 bfd_vma (*r_sym) (bfd_vma);
13080
13081#if BFD_DEFAULT_TARGET_SIZE > 32
13082 if (bfd_arch_bits_per_address (abfd) != 32)
13083 r_sym = elf64_r_sym;
13084 else
13085#endif
13086 r_sym = elf32_r_sym;
13087
956ea65c
MM
13088 if (!elf_section_data (sec)->has_secondary_relocs)
13089 return true;
13090
a8e14f4c
NC
13091 /* Discover if there are any secondary reloc sections
13092 associated with SEC. */
13093 for (relsec = abfd->sections; relsec != NULL; relsec = relsec->next)
13094 {
13095 Elf_Internal_Shdr * hdr = & elf_section_data (relsec)->this_hdr;
13096
13097 if (hdr->sh_type == SHT_SECONDARY_RELOC
8642dafa
AM
13098 && hdr->sh_info == (unsigned) elf_section_data (sec)->this_idx
13099 && (hdr->sh_entsize == ebd->s->sizeof_rel
13100 || hdr->sh_entsize == ebd->s->sizeof_rela))
a8e14f4c
NC
13101 {
13102 bfd_byte * native_relocs;
13103 bfd_byte * native_reloc;
13104 arelent * internal_relocs;
13105 arelent * internal_reloc;
13106 unsigned int i;
13107 unsigned int entsize;
13108 unsigned int symcount;
13109 unsigned int reloc_count;
13110 size_t amt;
13111
13112 if (ebd->elf_info_to_howto == NULL)
0a1b45a2 13113 return false;
a8e14f4c
NC
13114
13115#if DEBUG_SECONDARY_RELOCS
13116 fprintf (stderr, "read secondary relocs for %s from %s\n",
13117 sec->name, relsec->name);
13118#endif
13119 entsize = hdr->sh_entsize;
13120
13121 native_relocs = bfd_malloc (hdr->sh_size);
13122 if (native_relocs == NULL)
13123 {
0a1b45a2 13124 result = false;
a8e14f4c
NC
13125 continue;
13126 }
13127
13128 reloc_count = NUM_SHDR_ENTRIES (hdr);
13129 if (_bfd_mul_overflow (reloc_count, sizeof (arelent), & amt))
13130 {
ecbbbdba 13131 free (native_relocs);
a8e14f4c 13132 bfd_set_error (bfd_error_file_too_big);
0a1b45a2 13133 result = false;
a8e14f4c
NC
13134 continue;
13135 }
13136
13137 internal_relocs = (arelent *) bfd_alloc (abfd, amt);
13138 if (internal_relocs == NULL)
13139 {
13140 free (native_relocs);
0a1b45a2 13141 result = false;
a8e14f4c
NC
13142 continue;
13143 }
13144
13145 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
13146 || (bfd_bread (native_relocs, hdr->sh_size, abfd)
13147 != hdr->sh_size))
13148 {
13149 free (native_relocs);
ecbbbdba
NC
13150 /* The internal_relocs will be freed when
13151 the memory for the bfd is released. */
0a1b45a2 13152 result = false;
a8e14f4c
NC
13153 continue;
13154 }
13155
f60742b2
NC
13156 if (dynamic)
13157 symcount = bfd_get_dynamic_symcount (abfd);
13158 else
13159 symcount = bfd_get_symcount (abfd);
a8e14f4c
NC
13160
13161 for (i = 0, internal_reloc = internal_relocs,
13162 native_reloc = native_relocs;
13163 i < reloc_count;
13164 i++, internal_reloc++, native_reloc += entsize)
13165 {
0a1b45a2 13166 bool res;
a8e14f4c
NC
13167 Elf_Internal_Rela rela;
13168
8ee54925
NC
13169 if (entsize == ebd->s->sizeof_rel)
13170 ebd->s->swap_reloc_in (abfd, native_reloc, & rela);
13171 else /* entsize == ebd->s->sizeof_rela */
13172 ebd->s->swap_reloca_in (abfd, native_reloc, & rela);
a8e14f4c
NC
13173
13174 /* The address of an ELF reloc is section relative for an object
13175 file, and absolute for an executable file or shared library.
13176 The address of a normal BFD reloc is always section relative,
13177 and the address of a dynamic reloc is absolute.. */
13178 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
13179 internal_reloc->address = rela.r_offset;
13180 else
13181 internal_reloc->address = rela.r_offset - sec->vma;
13182
13183 if (r_sym (rela.r_info) == STN_UNDEF)
13184 {
13185 /* FIXME: This and the error case below mean that we
13186 have a symbol on relocs that is not elf_symbol_type. */
13187 internal_reloc->sym_ptr_ptr =
13188 bfd_abs_section_ptr->symbol_ptr_ptr;
13189 }
13190 else if (r_sym (rela.r_info) > symcount)
13191 {
13192 _bfd_error_handler
13193 /* xgettext:c-format */
13194 (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
13195 abfd, sec, i, (long) r_sym (rela.r_info));
13196 bfd_set_error (bfd_error_bad_value);
13197 internal_reloc->sym_ptr_ptr =
13198 bfd_abs_section_ptr->symbol_ptr_ptr;
0a1b45a2 13199 result = false;
a8e14f4c
NC
13200 }
13201 else
13202 {
13203 asymbol **ps;
13204
13205 ps = symbols + r_sym (rela.r_info) - 1;
a8e14f4c
NC
13206 internal_reloc->sym_ptr_ptr = ps;
13207 /* Make sure that this symbol is not removed by strip. */
13208 (*ps)->flags |= BSF_KEEP;
13209 }
13210
13211 internal_reloc->addend = rela.r_addend;
13212
13213 res = ebd->elf_info_to_howto (abfd, internal_reloc, & rela);
13214 if (! res || internal_reloc->howto == NULL)
13215 {
13216#if DEBUG_SECONDARY_RELOCS
13217 fprintf (stderr, "there is no howto associated with reloc %lx\n",
13218 rela.r_info);
13219#endif
0a1b45a2 13220 result = false;
a8e14f4c
NC
13221 }
13222 }
13223
13224 free (native_relocs);
13225 /* Store the internal relocs. */
13226 elf_section_data (relsec)->sec_info = internal_relocs;
13227 }
13228 }
13229
13230 return result;
13231}
13232
13233/* Set the ELF section header fields of an output secondary reloc section. */
13234
0a1b45a2 13235bool
a8e14f4c
NC
13236_bfd_elf_copy_special_section_fields (const bfd * ibfd ATTRIBUTE_UNUSED,
13237 bfd * obfd ATTRIBUTE_UNUSED,
13238 const Elf_Internal_Shdr * isection,
13239 Elf_Internal_Shdr * osection)
13240{
13241 asection * isec;
13242 asection * osec;
44466e45 13243 struct bfd_elf_section_data * esd;
a8e14f4c
NC
13244
13245 if (isection == NULL)
0a1b45a2 13246 return false;
a8e14f4c
NC
13247
13248 if (isection->sh_type != SHT_SECONDARY_RELOC)
0a1b45a2 13249 return true;
a8e14f4c
NC
13250
13251 isec = isection->bfd_section;
13252 if (isec == NULL)
0a1b45a2 13253 return false;
a8e14f4c
NC
13254
13255 osec = osection->bfd_section;
13256 if (osec == NULL)
0a1b45a2 13257 return false;
a8e14f4c 13258
44466e45
NC
13259 esd = elf_section_data (osec);
13260 BFD_ASSERT (esd->sec_info == NULL);
13261 esd->sec_info = elf_section_data (isec)->sec_info;
a8e14f4c
NC
13262 osection->sh_type = SHT_RELA;
13263 osection->sh_link = elf_onesymtab (obfd);
13264 if (osection->sh_link == 0)
13265 {
13266 /* There is no symbol table - we are hosed... */
13267 _bfd_error_handler
13268 /* xgettext:c-format */
13269 (_("%pB(%pA): link section cannot be set because the output file does not have a symbol table"),
13270 obfd, osec);
13271 bfd_set_error (bfd_error_bad_value);
0a1b45a2 13272 return false;
a8e14f4c
NC
13273 }
13274
13275 /* Find the output section that corresponds to the isection's sh_info link. */
327ef784
NC
13276 if (isection->sh_info == 0
13277 || isection->sh_info >= elf_numsections (ibfd))
13278 {
13279 _bfd_error_handler
13280 /* xgettext:c-format */
13281 (_("%pB(%pA): info section index is invalid"),
13282 obfd, osec);
13283 bfd_set_error (bfd_error_bad_value);
0a1b45a2 13284 return false;
327ef784
NC
13285 }
13286
a8e14f4c
NC
13287 isection = elf_elfsections (ibfd)[isection->sh_info];
13288
327ef784
NC
13289 if (isection == NULL
13290 || isection->bfd_section == NULL
13291 || isection->bfd_section->output_section == NULL)
13292 {
13293 _bfd_error_handler
13294 /* xgettext:c-format */
13295 (_("%pB(%pA): info section index cannot be set because the section is not in the output"),
13296 obfd, osec);
13297 bfd_set_error (bfd_error_bad_value);
0a1b45a2 13298 return false;
327ef784
NC
13299 }
13300
44466e45
NC
13301 esd = elf_section_data (isection->bfd_section->output_section);
13302 BFD_ASSERT (esd != NULL);
13303 osection->sh_info = esd->this_idx;
0a1b45a2 13304 esd->has_secondary_relocs = true;
a8e14f4c
NC
13305#if DEBUG_SECONDARY_RELOCS
13306 fprintf (stderr, "update header of %s, sh_link = %u, sh_info = %u\n",
13307 osec->name, osection->sh_link, osection->sh_info);
44466e45
NC
13308 fprintf (stderr, "mark section %s as having secondary relocs\n",
13309 bfd_section_name (isection->bfd_section->output_section));
a8e14f4c
NC
13310#endif
13311
0a1b45a2 13312 return true;
a8e14f4c
NC
13313}
13314
44466e45
NC
13315/* Write out a secondary reloc section.
13316
13317 FIXME: Currently this function can result in a serious performance penalty
13318 for files with secondary relocs and lots of sections. The proper way to
13319 fix this is for _bfd_elf_copy_special_section_fields() to chain secondary
13320 relocs together and then to have this function just walk that chain. */
a8e14f4c 13321
0a1b45a2 13322bool
a8e14f4c
NC
13323_bfd_elf_write_secondary_reloc_section (bfd *abfd, asection *sec)
13324{
13325 const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
13326 bfd_vma addr_offset;
13327 asection * relsec;
13328 bfd_vma (*r_info) (bfd_vma, bfd_vma);
0a1b45a2 13329 bool result = true;
ac4bf06c
NC
13330
13331 if (sec == NULL)
0a1b45a2 13332 return false;
a8e14f4c
NC
13333
13334#if BFD_DEFAULT_TARGET_SIZE > 32
13335 if (bfd_arch_bits_per_address (abfd) != 32)
13336 r_info = elf64_r_info;
13337 else
13338#endif
13339 r_info = elf32_r_info;
13340
a8e14f4c
NC
13341 /* The address of an ELF reloc is section relative for an object
13342 file, and absolute for an executable file or shared library.
13343 The address of a BFD reloc is always section relative. */
13344 addr_offset = 0;
13345 if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
13346 addr_offset = sec->vma;
13347
13348 /* Discover if there are any secondary reloc sections
13349 associated with SEC. */
13350 for (relsec = abfd->sections; relsec != NULL; relsec = relsec->next)
13351 {
13352 const struct bfd_elf_section_data * const esd = elf_section_data (relsec);
13353 Elf_Internal_Shdr * const hdr = (Elf_Internal_Shdr *) & esd->this_hdr;
13354
13355 if (hdr->sh_type == SHT_RELA
13356 && hdr->sh_info == (unsigned) elf_section_data (sec)->this_idx)
13357 {
13358 asymbol * last_sym;
13359 int last_sym_idx;
13360 unsigned int reloc_count;
13361 unsigned int idx;
8ee54925 13362 unsigned int entsize;
a8e14f4c
NC
13363 arelent * src_irel;
13364 bfd_byte * dst_rela;
13365
ac4bf06c
NC
13366 if (hdr->contents != NULL)
13367 {
13368 _bfd_error_handler
13369 /* xgettext:c-format */
13370 (_("%pB(%pA): error: secondary reloc section processed twice"),
13371 abfd, relsec);
13372 bfd_set_error (bfd_error_bad_value);
0a1b45a2 13373 result = false;
ac4bf06c
NC
13374 continue;
13375 }
a8e14f4c 13376
8ee54925
NC
13377 entsize = hdr->sh_entsize;
13378 if (entsize == 0)
ac267c75
NC
13379 {
13380 _bfd_error_handler
13381 /* xgettext:c-format */
13382 (_("%pB(%pA): error: secondary reloc section has zero sized entries"),
13383 abfd, relsec);
13384 bfd_set_error (bfd_error_bad_value);
0a1b45a2 13385 result = false;
ac267c75
NC
13386 continue;
13387 }
8ee54925
NC
13388 else if (entsize != ebd->s->sizeof_rel
13389 && entsize != ebd->s->sizeof_rela)
13390 {
13391 _bfd_error_handler
13392 /* xgettext:c-format */
13393 (_("%pB(%pA): error: secondary reloc section has non-standard sized entries"),
13394 abfd, relsec);
13395 bfd_set_error (bfd_error_bad_value);
0a1b45a2 13396 result = false;
8ee54925
NC
13397 continue;
13398 }
ac267c75 13399
8ee54925 13400 reloc_count = hdr->sh_size / entsize;
ac4bf06c
NC
13401 if (reloc_count <= 0)
13402 {
13403 _bfd_error_handler
13404 /* xgettext:c-format */
13405 (_("%pB(%pA): error: secondary reloc section is empty!"),
13406 abfd, relsec);
13407 bfd_set_error (bfd_error_bad_value);
0a1b45a2 13408 result = false;
ac4bf06c
NC
13409 continue;
13410 }
a8e14f4c
NC
13411
13412 hdr->contents = bfd_alloc (abfd, hdr->sh_size);
13413 if (hdr->contents == NULL)
13414 continue;
13415
13416#if DEBUG_SECONDARY_RELOCS
13417 fprintf (stderr, "write %u secondary relocs for %s from %s\n",
13418 reloc_count, sec->name, relsec->name);
13419#endif
13420 last_sym = NULL;
13421 last_sym_idx = 0;
13422 dst_rela = hdr->contents;
13423 src_irel = (arelent *) esd->sec_info;
ac4bf06c
NC
13424 if (src_irel == NULL)
13425 {
13426 _bfd_error_handler
13427 /* xgettext:c-format */
13428 (_("%pB(%pA): error: internal relocs missing for secondary reloc section"),
13429 abfd, relsec);
13430 bfd_set_error (bfd_error_bad_value);
0a1b45a2 13431 result = false;
ac4bf06c
NC
13432 continue;
13433 }
a8e14f4c 13434
8ee54925 13435 for (idx = 0; idx < reloc_count; idx++, dst_rela += entsize)
a8e14f4c
NC
13436 {
13437 Elf_Internal_Rela src_rela;
13438 arelent *ptr;
13439 asymbol *sym;
13440 int n;
13441
13442 ptr = src_irel + idx;
ac4bf06c
NC
13443 if (ptr == NULL)
13444 {
13445 _bfd_error_handler
13446 /* xgettext:c-format */
13447 (_("%pB(%pA): error: reloc table entry %u is empty"),
13448 abfd, relsec, idx);
13449 bfd_set_error (bfd_error_bad_value);
0a1b45a2 13450 result = false;
ac4bf06c
NC
13451 break;
13452 }
a8e14f4c 13453
ac4bf06c
NC
13454 if (ptr->sym_ptr_ptr == NULL)
13455 {
13456 /* FIXME: Is this an error ? */
13457 n = 0;
13458 }
a8e14f4c
NC
13459 else
13460 {
ac4bf06c
NC
13461 sym = *ptr->sym_ptr_ptr;
13462
13463 if (sym == last_sym)
13464 n = last_sym_idx;
13465 else
a8e14f4c 13466 {
ac4bf06c
NC
13467 n = _bfd_elf_symbol_from_bfd_symbol (abfd, & sym);
13468 if (n < 0)
13469 {
13470 _bfd_error_handler
13471 /* xgettext:c-format */
13472 (_("%pB(%pA): error: secondary reloc %u references a missing symbol"),
13473 abfd, relsec, idx);
13474 bfd_set_error (bfd_error_bad_value);
0a1b45a2 13475 result = false;
ac4bf06c
NC
13476 n = 0;
13477 }
13478
13479 last_sym = sym;
13480 last_sym_idx = n;
a8e14f4c 13481 }
a8e14f4c 13482
ac4bf06c
NC
13483 if (sym->the_bfd != NULL
13484 && sym->the_bfd->xvec != abfd->xvec
13485 && ! _bfd_elf_validate_reloc (abfd, ptr))
13486 {
13487 _bfd_error_handler
13488 /* xgettext:c-format */
13489 (_("%pB(%pA): error: secondary reloc %u references a deleted symbol"),
13490 abfd, relsec, idx);
13491 bfd_set_error (bfd_error_bad_value);
0a1b45a2 13492 result = false;
ac4bf06c
NC
13493 n = 0;
13494 }
a8e14f4c
NC
13495 }
13496
ac4bf06c 13497 src_rela.r_offset = ptr->address + addr_offset;
a8e14f4c
NC
13498 if (ptr->howto == NULL)
13499 {
ac4bf06c
NC
13500 _bfd_error_handler
13501 /* xgettext:c-format */
13502 (_("%pB(%pA): error: secondary reloc %u is of an unknown type"),
13503 abfd, relsec, idx);
13504 bfd_set_error (bfd_error_bad_value);
0a1b45a2 13505 result = false;
ac4bf06c 13506 src_rela.r_info = r_info (0, 0);
a8e14f4c 13507 }
ac4bf06c
NC
13508 else
13509 src_rela.r_info = r_info (n, ptr->howto->type);
a8e14f4c 13510 src_rela.r_addend = ptr->addend;
8ee54925
NC
13511
13512 if (entsize == ebd->s->sizeof_rel)
13513 ebd->s->swap_reloc_out (abfd, &src_rela, dst_rela);
13514 else /* entsize == ebd->s->sizeof_rela */
13515 ebd->s->swap_reloca_out (abfd, &src_rela, dst_rela);
a8e14f4c
NC
13516 }
13517 }
13518 }
13519
ac4bf06c 13520 return result;
a8e14f4c 13521}