elf_backend_init_file_header
[deliverable/binutils-gdb.git] / bfd / elf.c
CommitLineData
252b5132 1/* ELF executable support for BFD.
340b6d91 2
82704155 3 Copyright (C) 1993-2019 Free Software Foundation, Inc.
252b5132 4
5e8d7549 5 This file is part of BFD, the Binary File Descriptor library.
252b5132 6
5e8d7549
NC
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
cd123cb7 9 the Free Software Foundation; either version 3 of the License, or
5e8d7549 10 (at your option) any later version.
252b5132 11
5e8d7549
NC
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
252b5132 16
5e8d7549 17 You should have received a copy of the GNU General Public License
b34976b6 18 along with this program; if not, write to the Free Software
cd123cb7
NC
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
21
252b5132 22
1b74d094
BW
23/*
24SECTION
252b5132
RH
25 ELF backends
26
27 BFD support for ELF formats is being worked on.
28 Currently, the best supported back ends are for sparc and i386
29 (running svr4 or Solaris 2).
30
31 Documentation of the internals of the support code still needs
32 to be written. The code is changing quickly enough that we
661a3fd4 33 haven't bothered yet. */
252b5132 34
7ee38065
MS
35/* For sparc64-cross-sparc32. */
36#define _SYSCALL32
252b5132 37#include "sysdep.h"
3a551c7a 38#include <limits.h>
3db64b00 39#include "bfd.h"
252b5132
RH
40#include "bfdlink.h"
41#include "libbfd.h"
42#define ARCH_SIZE 0
43#include "elf-bfd.h"
e0e8c97f 44#include "libiberty.h"
ff59fc36 45#include "safe-ctype.h"
de64ce13 46#include "elf-linux-core.h"
252b5132 47
8bc7f138
L
48#ifdef CORE_HEADER
49#include CORE_HEADER
50#endif
51
217aa764 52static int elf_sort_sections (const void *, const void *);
c84fca4d 53static bfd_boolean assign_file_positions_except_relocs (bfd *, struct bfd_link_info *);
ef10c3ac 54static bfd_boolean swap_out_syms (bfd *, struct elf_strtab_hash **, int) ;
718175fa 55static bfd_boolean elf_parse_notes (bfd *abfd, char *buf, size_t size,
276da9b3 56 file_ptr offset, size_t align);
50b2bdb7 57
252b5132
RH
58/* Swap version information in and out. The version information is
59 currently size independent. If that ever changes, this code will
60 need to move into elfcode.h. */
61
62/* Swap in a Verdef structure. */
63
64void
217aa764
AM
65_bfd_elf_swap_verdef_in (bfd *abfd,
66 const Elf_External_Verdef *src,
67 Elf_Internal_Verdef *dst)
252b5132 68{
dc810e39
AM
69 dst->vd_version = H_GET_16 (abfd, src->vd_version);
70 dst->vd_flags = H_GET_16 (abfd, src->vd_flags);
71 dst->vd_ndx = H_GET_16 (abfd, src->vd_ndx);
72 dst->vd_cnt = H_GET_16 (abfd, src->vd_cnt);
73 dst->vd_hash = H_GET_32 (abfd, src->vd_hash);
74 dst->vd_aux = H_GET_32 (abfd, src->vd_aux);
75 dst->vd_next = H_GET_32 (abfd, src->vd_next);
252b5132
RH
76}
77
78/* Swap out a Verdef structure. */
79
80void
217aa764
AM
81_bfd_elf_swap_verdef_out (bfd *abfd,
82 const Elf_Internal_Verdef *src,
83 Elf_External_Verdef *dst)
252b5132 84{
dc810e39
AM
85 H_PUT_16 (abfd, src->vd_version, dst->vd_version);
86 H_PUT_16 (abfd, src->vd_flags, dst->vd_flags);
87 H_PUT_16 (abfd, src->vd_ndx, dst->vd_ndx);
88 H_PUT_16 (abfd, src->vd_cnt, dst->vd_cnt);
89 H_PUT_32 (abfd, src->vd_hash, dst->vd_hash);
90 H_PUT_32 (abfd, src->vd_aux, dst->vd_aux);
91 H_PUT_32 (abfd, src->vd_next, dst->vd_next);
252b5132
RH
92}
93
94/* Swap in a Verdaux structure. */
95
96void
217aa764
AM
97_bfd_elf_swap_verdaux_in (bfd *abfd,
98 const Elf_External_Verdaux *src,
99 Elf_Internal_Verdaux *dst)
252b5132 100{
dc810e39
AM
101 dst->vda_name = H_GET_32 (abfd, src->vda_name);
102 dst->vda_next = H_GET_32 (abfd, src->vda_next);
252b5132
RH
103}
104
105/* Swap out a Verdaux structure. */
106
107void
217aa764
AM
108_bfd_elf_swap_verdaux_out (bfd *abfd,
109 const Elf_Internal_Verdaux *src,
110 Elf_External_Verdaux *dst)
252b5132 111{
dc810e39
AM
112 H_PUT_32 (abfd, src->vda_name, dst->vda_name);
113 H_PUT_32 (abfd, src->vda_next, dst->vda_next);
252b5132
RH
114}
115
116/* Swap in a Verneed structure. */
117
118void
217aa764
AM
119_bfd_elf_swap_verneed_in (bfd *abfd,
120 const Elf_External_Verneed *src,
121 Elf_Internal_Verneed *dst)
252b5132 122{
dc810e39
AM
123 dst->vn_version = H_GET_16 (abfd, src->vn_version);
124 dst->vn_cnt = H_GET_16 (abfd, src->vn_cnt);
125 dst->vn_file = H_GET_32 (abfd, src->vn_file);
126 dst->vn_aux = H_GET_32 (abfd, src->vn_aux);
127 dst->vn_next = H_GET_32 (abfd, src->vn_next);
252b5132
RH
128}
129
130/* Swap out a Verneed structure. */
131
132void
217aa764
AM
133_bfd_elf_swap_verneed_out (bfd *abfd,
134 const Elf_Internal_Verneed *src,
135 Elf_External_Verneed *dst)
252b5132 136{
dc810e39
AM
137 H_PUT_16 (abfd, src->vn_version, dst->vn_version);
138 H_PUT_16 (abfd, src->vn_cnt, dst->vn_cnt);
139 H_PUT_32 (abfd, src->vn_file, dst->vn_file);
140 H_PUT_32 (abfd, src->vn_aux, dst->vn_aux);
141 H_PUT_32 (abfd, src->vn_next, dst->vn_next);
252b5132
RH
142}
143
144/* Swap in a Vernaux structure. */
145
146void
217aa764
AM
147_bfd_elf_swap_vernaux_in (bfd *abfd,
148 const Elf_External_Vernaux *src,
149 Elf_Internal_Vernaux *dst)
252b5132 150{
dc810e39
AM
151 dst->vna_hash = H_GET_32 (abfd, src->vna_hash);
152 dst->vna_flags = H_GET_16 (abfd, src->vna_flags);
153 dst->vna_other = H_GET_16 (abfd, src->vna_other);
154 dst->vna_name = H_GET_32 (abfd, src->vna_name);
155 dst->vna_next = H_GET_32 (abfd, src->vna_next);
252b5132
RH
156}
157
158/* Swap out a Vernaux structure. */
159
160void
217aa764
AM
161_bfd_elf_swap_vernaux_out (bfd *abfd,
162 const Elf_Internal_Vernaux *src,
163 Elf_External_Vernaux *dst)
252b5132 164{
dc810e39
AM
165 H_PUT_32 (abfd, src->vna_hash, dst->vna_hash);
166 H_PUT_16 (abfd, src->vna_flags, dst->vna_flags);
167 H_PUT_16 (abfd, src->vna_other, dst->vna_other);
168 H_PUT_32 (abfd, src->vna_name, dst->vna_name);
169 H_PUT_32 (abfd, src->vna_next, dst->vna_next);
252b5132
RH
170}
171
172/* Swap in a Versym structure. */
173
174void
217aa764
AM
175_bfd_elf_swap_versym_in (bfd *abfd,
176 const Elf_External_Versym *src,
177 Elf_Internal_Versym *dst)
252b5132 178{
dc810e39 179 dst->vs_vers = H_GET_16 (abfd, src->vs_vers);
252b5132
RH
180}
181
182/* Swap out a Versym structure. */
183
184void
217aa764
AM
185_bfd_elf_swap_versym_out (bfd *abfd,
186 const Elf_Internal_Versym *src,
187 Elf_External_Versym *dst)
252b5132 188{
dc810e39 189 H_PUT_16 (abfd, src->vs_vers, dst->vs_vers);
252b5132
RH
190}
191
192/* Standard ELF hash function. Do not change this function; you will
193 cause invalid hash tables to be generated. */
3a99b017 194
252b5132 195unsigned long
217aa764 196bfd_elf_hash (const char *namearg)
252b5132 197{
3a99b017 198 const unsigned char *name = (const unsigned char *) namearg;
252b5132
RH
199 unsigned long h = 0;
200 unsigned long g;
201 int ch;
202
203 while ((ch = *name++) != '\0')
204 {
205 h = (h << 4) + ch;
206 if ((g = (h & 0xf0000000)) != 0)
207 {
208 h ^= g >> 24;
209 /* The ELF ABI says `h &= ~g', but this is equivalent in
210 this case and on some machines one insn instead of two. */
211 h ^= g;
212 }
213 }
32dfa85d 214 return h & 0xffffffff;
252b5132
RH
215}
216
fdc90cb4
JJ
217/* DT_GNU_HASH hash function. Do not change this function; you will
218 cause invalid hash tables to be generated. */
219
220unsigned long
221bfd_elf_gnu_hash (const char *namearg)
222{
223 const unsigned char *name = (const unsigned char *) namearg;
224 unsigned long h = 5381;
225 unsigned char ch;
226
227 while ((ch = *name++) != '\0')
228 h = (h << 5) + h + ch;
229 return h & 0xffffffff;
230}
231
0c8d6e5c
AM
232/* Create a tdata field OBJECT_SIZE bytes in length, zeroed out and with
233 the object_id field of an elf_obj_tdata field set to OBJECT_ID. */
b34976b6 234bfd_boolean
0c8d6e5c 235bfd_elf_allocate_object (bfd *abfd,
0ffa91dd 236 size_t object_size,
4dfe6ac6 237 enum elf_target_id object_id)
252b5132 238{
0ffa91dd
NC
239 BFD_ASSERT (object_size >= sizeof (struct elf_obj_tdata));
240 abfd->tdata.any = bfd_zalloc (abfd, object_size);
241 if (abfd->tdata.any == NULL)
242 return FALSE;
252b5132 243
0ffa91dd 244 elf_object_id (abfd) = object_id;
c0355132
AM
245 if (abfd->direction != read_direction)
246 {
247 struct output_elf_obj_tdata *o = bfd_zalloc (abfd, sizeof *o);
248 if (o == NULL)
249 return FALSE;
250 elf_tdata (abfd)->o = o;
251 elf_program_header_size (abfd) = (bfd_size_type) -1;
252 }
b34976b6 253 return TRUE;
252b5132
RH
254}
255
0ffa91dd
NC
256
257bfd_boolean
ae95ffa6 258bfd_elf_make_object (bfd *abfd)
0ffa91dd 259{
ae95ffa6 260 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
0ffa91dd 261 return bfd_elf_allocate_object (abfd, sizeof (struct elf_obj_tdata),
ae95ffa6 262 bed->target_id);
0ffa91dd
NC
263}
264
b34976b6 265bfd_boolean
217aa764 266bfd_elf_mkcorefile (bfd *abfd)
252b5132 267{
c044fabd 268 /* I think this can be done just like an object file. */
228e534f
AM
269 if (!abfd->xvec->_bfd_set_format[(int) bfd_object] (abfd))
270 return FALSE;
271 elf_tdata (abfd)->core = bfd_zalloc (abfd, sizeof (*elf_tdata (abfd)->core));
272 return elf_tdata (abfd)->core != NULL;
252b5132
RH
273}
274
6d5944fc 275char *
217aa764 276bfd_elf_get_str_section (bfd *abfd, unsigned int shindex)
252b5132
RH
277{
278 Elf_Internal_Shdr **i_shdrp;
f075ee0c 279 bfd_byte *shstrtab = NULL;
dc810e39
AM
280 file_ptr offset;
281 bfd_size_type shstrtabsize;
252b5132
RH
282
283 i_shdrp = elf_elfsections (abfd);
74f2e02b
AM
284 if (i_shdrp == 0
285 || shindex >= elf_numsections (abfd)
286 || i_shdrp[shindex] == 0)
f075ee0c 287 return NULL;
252b5132 288
f075ee0c 289 shstrtab = i_shdrp[shindex]->contents;
252b5132
RH
290 if (shstrtab == NULL)
291 {
c044fabd 292 /* No cached one, attempt to read, and cache what we read. */
252b5132
RH
293 offset = i_shdrp[shindex]->sh_offset;
294 shstrtabsize = i_shdrp[shindex]->sh_size;
c6c60d09
JJ
295
296 /* Allocate and clear an extra byte at the end, to prevent crashes
297 in case the string table is not terminated. */
3471d59d 298 if (shstrtabsize + 1 <= 1
95a6d235 299 || shstrtabsize > bfd_get_file_size (abfd)
06614111
NC
300 || bfd_seek (abfd, offset, SEEK_SET) != 0
301 || (shstrtab = (bfd_byte *) bfd_alloc (abfd, shstrtabsize + 1)) == NULL)
c6c60d09
JJ
302 shstrtab = NULL;
303 else if (bfd_bread (shstrtab, shstrtabsize, abfd) != shstrtabsize)
304 {
305 if (bfd_get_error () != bfd_error_system_call)
306 bfd_set_error (bfd_error_file_truncated);
06614111 307 bfd_release (abfd, shstrtab);
c6c60d09 308 shstrtab = NULL;
3471d59d
CC
309 /* Once we've failed to read it, make sure we don't keep
310 trying. Otherwise, we'll keep allocating space for
311 the string table over and over. */
312 i_shdrp[shindex]->sh_size = 0;
c6c60d09
JJ
313 }
314 else
315 shstrtab[shstrtabsize] = '\0';
217aa764 316 i_shdrp[shindex]->contents = shstrtab;
252b5132 317 }
f075ee0c 318 return (char *) shstrtab;
252b5132
RH
319}
320
321char *
217aa764
AM
322bfd_elf_string_from_elf_section (bfd *abfd,
323 unsigned int shindex,
324 unsigned int strindex)
252b5132
RH
325{
326 Elf_Internal_Shdr *hdr;
327
328 if (strindex == 0)
329 return "";
330
74f2e02b
AM
331 if (elf_elfsections (abfd) == NULL || shindex >= elf_numsections (abfd))
332 return NULL;
333
252b5132
RH
334 hdr = elf_elfsections (abfd)[shindex];
335
06614111
NC
336 if (hdr->contents == NULL)
337 {
338 if (hdr->sh_type != SHT_STRTAB && hdr->sh_type < SHT_LOOS)
339 {
340 /* PR 17512: file: f057ec89. */
695344c0 341 /* xgettext:c-format */
871b3ab2 342 _bfd_error_handler (_("%pB: attempt to load strings from"
63a5468a 343 " a non-string section (number %d)"),
06614111
NC
344 abfd, shindex);
345 return NULL;
346 }
b1fa9dd6 347
06614111
NC
348 if (bfd_elf_get_str_section (abfd, shindex) == NULL)
349 return NULL;
350 }
eed5def8
NC
351 else
352 {
353 /* PR 24273: The string section's contents may have already
354 been loaded elsewhere, eg because a corrupt file has the
355 string section index in the ELF header pointing at a group
356 section. So be paranoid, and test that the last byte of
357 the section is zero. */
358 if (hdr->sh_size == 0 || hdr->contents[hdr->sh_size - 1] != 0)
359 return NULL;
360 }
252b5132
RH
361
362 if (strindex >= hdr->sh_size)
363 {
1b3a8575 364 unsigned int shstrndx = elf_elfheader(abfd)->e_shstrndx;
4eca0228 365 _bfd_error_handler
695344c0 366 /* xgettext:c-format */
2dcf00ce
AM
367 (_("%pB: invalid string offset %u >= %" PRIu64 " for section `%s'"),
368 abfd, strindex, (uint64_t) hdr->sh_size,
1b3a8575 369 (shindex == shstrndx && strindex == hdr->sh_name
252b5132 370 ? ".shstrtab"
1b3a8575 371 : bfd_elf_string_from_elf_section (abfd, shstrndx, hdr->sh_name)));
45b222d6 372 return NULL;
252b5132
RH
373 }
374
375 return ((char *) hdr->contents) + strindex;
376}
377
6cdc0ccc
AM
378/* Read and convert symbols to internal format.
379 SYMCOUNT specifies the number of symbols to read, starting from
380 symbol SYMOFFSET. If any of INTSYM_BUF, EXTSYM_BUF or EXTSHNDX_BUF
381 are non-NULL, they are used to store the internal symbols, external
b7c368d0
NC
382 symbols, and symbol section index extensions, respectively.
383 Returns a pointer to the internal symbol buffer (malloced if necessary)
384 or NULL if there were no symbols or some kind of problem. */
6cdc0ccc
AM
385
386Elf_Internal_Sym *
217aa764
AM
387bfd_elf_get_elf_syms (bfd *ibfd,
388 Elf_Internal_Shdr *symtab_hdr,
389 size_t symcount,
390 size_t symoffset,
391 Elf_Internal_Sym *intsym_buf,
392 void *extsym_buf,
393 Elf_External_Sym_Shndx *extshndx_buf)
6cdc0ccc
AM
394{
395 Elf_Internal_Shdr *shndx_hdr;
217aa764 396 void *alloc_ext;
df622259 397 const bfd_byte *esym;
6cdc0ccc
AM
398 Elf_External_Sym_Shndx *alloc_extshndx;
399 Elf_External_Sym_Shndx *shndx;
4dd07732 400 Elf_Internal_Sym *alloc_intsym;
6cdc0ccc
AM
401 Elf_Internal_Sym *isym;
402 Elf_Internal_Sym *isymend;
9c5bfbb7 403 const struct elf_backend_data *bed;
6cdc0ccc
AM
404 size_t extsym_size;
405 bfd_size_type amt;
406 file_ptr pos;
407
e44a2c9c
AM
408 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
409 abort ();
410
6cdc0ccc
AM
411 if (symcount == 0)
412 return intsym_buf;
413
414 /* Normal syms might have section extension entries. */
415 shndx_hdr = NULL;
6a40cf0c
NC
416 if (elf_symtab_shndx_list (ibfd) != NULL)
417 {
418 elf_section_list * entry;
419 Elf_Internal_Shdr **sections = elf_elfsections (ibfd);
420
421 /* Find an index section that is linked to this symtab section. */
422 for (entry = elf_symtab_shndx_list (ibfd); entry != NULL; entry = entry->next)
315350be
NC
423 {
424 /* PR 20063. */
425 if (entry->hdr.sh_link >= elf_numsections (ibfd))
426 continue;
427
428 if (sections[entry->hdr.sh_link] == symtab_hdr)
429 {
430 shndx_hdr = & entry->hdr;
431 break;
432 };
433 }
6a40cf0c
NC
434
435 if (shndx_hdr == NULL)
436 {
437 if (symtab_hdr == & elf_symtab_hdr (ibfd))
438 /* Not really accurate, but this was how the old code used to work. */
439 shndx_hdr = & elf_symtab_shndx_list (ibfd)->hdr;
440 /* Otherwise we do nothing. The assumption is that
441 the index table will not be needed. */
442 }
443 }
6cdc0ccc
AM
444
445 /* Read the symbols. */
446 alloc_ext = NULL;
447 alloc_extshndx = NULL;
4dd07732 448 alloc_intsym = NULL;
6cdc0ccc
AM
449 bed = get_elf_backend_data (ibfd);
450 extsym_size = bed->s->sizeof_sym;
ef53be89 451 amt = (bfd_size_type) symcount * extsym_size;
6cdc0ccc
AM
452 pos = symtab_hdr->sh_offset + symoffset * extsym_size;
453 if (extsym_buf == NULL)
454 {
d0fb9a8d 455 alloc_ext = bfd_malloc2 (symcount, extsym_size);
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 {
ef53be89 470 amt = (bfd_size_type) symcount * sizeof (Elf_External_Sym_Shndx);
6cdc0ccc
AM
471 pos = shndx_hdr->sh_offset + symoffset * sizeof (Elf_External_Sym_Shndx);
472 if (extshndx_buf == NULL)
473 {
a50b1753 474 alloc_extshndx = (Elf_External_Sym_Shndx *)
07d6d2b8 475 bfd_malloc2 (symcount, sizeof (Elf_External_Sym_Shndx));
6cdc0ccc
AM
476 extshndx_buf = alloc_extshndx;
477 }
478 if (extshndx_buf == NULL
479 || bfd_seek (ibfd, pos, SEEK_SET) != 0
480 || bfd_bread (extshndx_buf, amt, ibfd) != amt)
481 {
482 intsym_buf = NULL;
483 goto out;
484 }
485 }
486
487 if (intsym_buf == NULL)
488 {
a50b1753 489 alloc_intsym = (Elf_Internal_Sym *)
07d6d2b8 490 bfd_malloc2 (symcount, sizeof (Elf_Internal_Sym));
4dd07732 491 intsym_buf = alloc_intsym;
6cdc0ccc
AM
492 if (intsym_buf == NULL)
493 goto out;
494 }
495
496 /* Convert the symbols to internal form. */
497 isymend = intsym_buf + symcount;
a50b1753 498 for (esym = (const bfd_byte *) extsym_buf, isym = intsym_buf,
07d6d2b8 499 shndx = extshndx_buf;
6cdc0ccc
AM
500 isym < isymend;
501 esym += extsym_size, isym++, shndx = shndx != NULL ? shndx + 1 : NULL)
8384fb8f
AM
502 if (!(*bed->s->swap_symbol_in) (ibfd, esym, shndx, isym))
503 {
504 symoffset += (esym - (bfd_byte *) extsym_buf) / extsym_size;
695344c0 505 /* xgettext:c-format */
871b3ab2 506 _bfd_error_handler (_("%pB symbol number %lu references"
63a5468a 507 " nonexistent SHT_SYMTAB_SHNDX section"),
4eca0228 508 ibfd, (unsigned long) symoffset);
4dd07732
AM
509 if (alloc_intsym != NULL)
510 free (alloc_intsym);
8384fb8f
AM
511 intsym_buf = NULL;
512 goto out;
513 }
6cdc0ccc
AM
514
515 out:
516 if (alloc_ext != NULL)
517 free (alloc_ext);
518 if (alloc_extshndx != NULL)
519 free (alloc_extshndx);
520
521 return intsym_buf;
522}
523
5cab59f6
AM
524/* Look up a symbol name. */
525const char *
be8dd2ca
AM
526bfd_elf_sym_name (bfd *abfd,
527 Elf_Internal_Shdr *symtab_hdr,
26c61ae5
L
528 Elf_Internal_Sym *isym,
529 asection *sym_sec)
5cab59f6 530{
26c61ae5 531 const char *name;
5cab59f6 532 unsigned int iname = isym->st_name;
be8dd2ca 533 unsigned int shindex = symtab_hdr->sh_link;
26c61ae5 534
138f35cc
JJ
535 if (iname == 0 && ELF_ST_TYPE (isym->st_info) == STT_SECTION
536 /* Check for a bogus st_shndx to avoid crashing. */
4fbb74a6 537 && isym->st_shndx < elf_numsections (abfd))
5cab59f6
AM
538 {
539 iname = elf_elfsections (abfd)[isym->st_shndx]->sh_name;
540 shindex = elf_elfheader (abfd)->e_shstrndx;
541 }
542
26c61ae5
L
543 name = bfd_elf_string_from_elf_section (abfd, shindex, iname);
544 if (name == NULL)
545 name = "(null)";
546 else if (sym_sec && *name == '\0')
fd361982 547 name = bfd_section_name (sym_sec);
26c61ae5
L
548
549 return name;
5cab59f6
AM
550}
551
dbb410c3
AM
552/* Elf_Internal_Shdr->contents is an array of these for SHT_GROUP
553 sections. The first element is the flags, the rest are section
554 pointers. */
555
556typedef union elf_internal_group {
557 Elf_Internal_Shdr *shdr;
558 unsigned int flags;
559} Elf_Internal_Group;
560
b885599b
AM
561/* Return the name of the group signature symbol. Why isn't the
562 signature just a string? */
563
564static const char *
217aa764 565group_signature (bfd *abfd, Elf_Internal_Shdr *ghdr)
b885599b 566{
9dce4196 567 Elf_Internal_Shdr *hdr;
9dce4196
AM
568 unsigned char esym[sizeof (Elf64_External_Sym)];
569 Elf_External_Sym_Shndx eshndx;
570 Elf_Internal_Sym isym;
b885599b 571
13792e9d
L
572 /* First we need to ensure the symbol table is available. Make sure
573 that it is a symbol table section. */
4fbb74a6
AM
574 if (ghdr->sh_link >= elf_numsections (abfd))
575 return NULL;
13792e9d
L
576 hdr = elf_elfsections (abfd) [ghdr->sh_link];
577 if (hdr->sh_type != SHT_SYMTAB
578 || ! bfd_section_from_shdr (abfd, ghdr->sh_link))
b885599b
AM
579 return NULL;
580
9dce4196
AM
581 /* Go read the symbol. */
582 hdr = &elf_tdata (abfd)->symtab_hdr;
6cdc0ccc
AM
583 if (bfd_elf_get_elf_syms (abfd, hdr, 1, ghdr->sh_info,
584 &isym, esym, &eshndx) == NULL)
b885599b 585 return NULL;
9dce4196 586
26c61ae5 587 return bfd_elf_sym_name (abfd, hdr, &isym, NULL);
b885599b
AM
588}
589
dbb410c3
AM
590/* Set next_in_group list pointer, and group name for NEWSECT. */
591
b34976b6 592static bfd_boolean
217aa764 593setup_group (bfd *abfd, Elf_Internal_Shdr *hdr, asection *newsect)
dbb410c3
AM
594{
595 unsigned int num_group = elf_tdata (abfd)->num_group;
596
597 /* If num_group is zero, read in all SHT_GROUP sections. The count
598 is set to -1 if there are no SHT_GROUP sections. */
599 if (num_group == 0)
600 {
601 unsigned int i, shnum;
602
603 /* First count the number of groups. If we have a SHT_GROUP
604 section with just a flag word (ie. sh_size is 4), ignore it. */
9ad5cbcf 605 shnum = elf_numsections (abfd);
dbb410c3 606 num_group = 0;
08a40648 607
44534af3 608#define IS_VALID_GROUP_SECTION_HEADER(shdr, minsize) \
1783205a 609 ( (shdr)->sh_type == SHT_GROUP \
44534af3 610 && (shdr)->sh_size >= minsize \
1783205a
NC
611 && (shdr)->sh_entsize == GRP_ENTRY_SIZE \
612 && ((shdr)->sh_size % GRP_ENTRY_SIZE) == 0)
08a40648 613
dbb410c3
AM
614 for (i = 0; i < shnum; i++)
615 {
616 Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[i];
1783205a 617
44534af3 618 if (IS_VALID_GROUP_SECTION_HEADER (shdr, 2 * GRP_ENTRY_SIZE))
dbb410c3
AM
619 num_group += 1;
620 }
621
622 if (num_group == 0)
20dbb49d
L
623 {
624 num_group = (unsigned) -1;
625 elf_tdata (abfd)->num_group = num_group;
ce497010 626 elf_tdata (abfd)->group_sect_ptr = NULL;
20dbb49d
L
627 }
628 else
dbb410c3
AM
629 {
630 /* We keep a list of elf section headers for group sections,
631 so we can find them quickly. */
20dbb49d 632 bfd_size_type amt;
d0fb9a8d 633
20dbb49d 634 elf_tdata (abfd)->num_group = num_group;
a50b1753 635 elf_tdata (abfd)->group_sect_ptr = (Elf_Internal_Shdr **)
07d6d2b8 636 bfd_alloc2 (abfd, num_group, sizeof (Elf_Internal_Shdr *));
dbb410c3 637 if (elf_tdata (abfd)->group_sect_ptr == NULL)
b34976b6 638 return FALSE;
4bba0fb1
AM
639 memset (elf_tdata (abfd)->group_sect_ptr, 0,
640 num_group * sizeof (Elf_Internal_Shdr *));
dbb410c3 641 num_group = 0;
ce497010 642
dbb410c3
AM
643 for (i = 0; i < shnum; i++)
644 {
645 Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[i];
1783205a 646
44534af3 647 if (IS_VALID_GROUP_SECTION_HEADER (shdr, 2 * GRP_ENTRY_SIZE))
dbb410c3 648 {
973ffd63 649 unsigned char *src;
dbb410c3
AM
650 Elf_Internal_Group *dest;
651
07d6d2b8
AM
652 /* Make sure the group section has a BFD section
653 attached to it. */
654 if (!bfd_section_from_shdr (abfd, i))
655 return FALSE;
656
dbb410c3
AM
657 /* Add to list of sections. */
658 elf_tdata (abfd)->group_sect_ptr[num_group] = shdr;
659 num_group += 1;
660
661 /* Read the raw contents. */
662 BFD_ASSERT (sizeof (*dest) >= 4);
663 amt = shdr->sh_size * sizeof (*dest) / 4;
a50b1753 664 shdr->contents = (unsigned char *)
eed5def8 665 bfd_alloc2 (abfd, shdr->sh_size, sizeof (*dest) / 4);
1783205a
NC
666 /* PR binutils/4110: Handle corrupt group headers. */
667 if (shdr->contents == NULL)
668 {
669 _bfd_error_handler
695344c0 670 /* xgettext:c-format */
871b3ab2 671 (_("%pB: corrupt size field in group section"
2dcf00ce
AM
672 " header: %#" PRIx64),
673 abfd, (uint64_t) shdr->sh_size);
1783205a 674 bfd_set_error (bfd_error_bad_value);
493a3386
NC
675 -- num_group;
676 continue;
1783205a
NC
677 }
678
679 memset (shdr->contents, 0, amt);
680
681 if (bfd_seek (abfd, shdr->sh_offset, SEEK_SET) != 0
dbb410c3
AM
682 || (bfd_bread (shdr->contents, shdr->sh_size, abfd)
683 != shdr->sh_size))
493a3386
NC
684 {
685 _bfd_error_handler
695344c0 686 /* xgettext:c-format */
871b3ab2 687 (_("%pB: invalid size field in group section"
2dcf00ce
AM
688 " header: %#" PRIx64 ""),
689 abfd, (uint64_t) shdr->sh_size);
493a3386
NC
690 bfd_set_error (bfd_error_bad_value);
691 -- num_group;
63a5468a
AM
692 /* PR 17510: If the group contents are even
693 partially corrupt, do not allow any of the
694 contents to be used. */
493a3386
NC
695 memset (shdr->contents, 0, amt);
696 continue;
697 }
708d7d0d 698
dbb410c3
AM
699 /* Translate raw contents, a flag word followed by an
700 array of elf section indices all in target byte order,
701 to the flag word followed by an array of elf section
702 pointers. */
703 src = shdr->contents + shdr->sh_size;
704 dest = (Elf_Internal_Group *) (shdr->contents + amt);
06614111 705
dbb410c3
AM
706 while (1)
707 {
708 unsigned int idx;
709
710 src -= 4;
711 --dest;
712 idx = H_GET_32 (abfd, src);
713 if (src == shdr->contents)
714 {
715 dest->flags = idx;
b885599b
AM
716 if (shdr->bfd_section != NULL && (idx & GRP_COMDAT))
717 shdr->bfd_section->flags
718 |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
dbb410c3
AM
719 break;
720 }
4bba0fb1 721 if (idx < shnum)
bae363f1
L
722 {
723 dest->shdr = elf_elfsections (abfd)[idx];
724 /* PR binutils/23199: All sections in a
725 section group should be marked with
726 SHF_GROUP. But some tools generate
727 broken objects without SHF_GROUP. Fix
728 them up here. */
729 dest->shdr->sh_flags |= SHF_GROUP;
730 }
4bba0fb1
AM
731 if (idx >= shnum
732 || dest->shdr->sh_type == SHT_GROUP)
dbb410c3 733 {
4eca0228 734 _bfd_error_handler
4bba0fb1
AM
735 (_("%pB: invalid entry in SHT_GROUP section [%u]"),
736 abfd, i);
737 dest->shdr = NULL;
dbb410c3 738 }
dbb410c3
AM
739 }
740 }
741 }
493a3386
NC
742
743 /* PR 17510: Corrupt binaries might contain invalid groups. */
744 if (num_group != (unsigned) elf_tdata (abfd)->num_group)
745 {
746 elf_tdata (abfd)->num_group = num_group;
747
748 /* If all groups are invalid then fail. */
749 if (num_group == 0)
750 {
751 elf_tdata (abfd)->group_sect_ptr = NULL;
752 elf_tdata (abfd)->num_group = num_group = -1;
4eca0228 753 _bfd_error_handler
871b3ab2 754 (_("%pB: no valid group sections found"), abfd);
493a3386
NC
755 bfd_set_error (bfd_error_bad_value);
756 }
757 }
dbb410c3
AM
758 }
759 }
760
761 if (num_group != (unsigned) -1)
762 {
564e11c9
JW
763 unsigned int search_offset = elf_tdata (abfd)->group_search_offset;
764 unsigned int j;
dbb410c3 765
564e11c9 766 for (j = 0; j < num_group; j++)
dbb410c3 767 {
564e11c9
JW
768 /* Begin search from previous found group. */
769 unsigned i = (j + search_offset) % num_group;
770
dbb410c3 771 Elf_Internal_Shdr *shdr = elf_tdata (abfd)->group_sect_ptr[i];
ce497010 772 Elf_Internal_Group *idx;
0c54f692 773 bfd_size_type n_elt;
ce497010
NC
774
775 if (shdr == NULL)
776 continue;
777
778 idx = (Elf_Internal_Group *) shdr->contents;
0c54f692
NC
779 if (idx == NULL || shdr->sh_size < 4)
780 {
781 /* See PR 21957 for a reproducer. */
782 /* xgettext:c-format */
871b3ab2 783 _bfd_error_handler (_("%pB: group section '%pA' has no contents"),
0c54f692
NC
784 abfd, shdr->bfd_section);
785 elf_tdata (abfd)->group_sect_ptr[i] = NULL;
786 bfd_set_error (bfd_error_bad_value);
787 return FALSE;
788 }
ce497010 789 n_elt = shdr->sh_size / 4;
dbb410c3
AM
790
791 /* Look through this group's sections to see if current
792 section is a member. */
793 while (--n_elt != 0)
794 if ((++idx)->shdr == hdr)
795 {
e0e8c97f 796 asection *s = NULL;
dbb410c3
AM
797
798 /* We are a member of this group. Go looking through
799 other members to see if any others are linked via
800 next_in_group. */
801 idx = (Elf_Internal_Group *) shdr->contents;
802 n_elt = shdr->sh_size / 4;
803 while (--n_elt != 0)
4bba0fb1
AM
804 if ((++idx)->shdr != NULL
805 && (s = idx->shdr->bfd_section) != NULL
945906ff 806 && elf_next_in_group (s) != NULL)
dbb410c3
AM
807 break;
808 if (n_elt != 0)
809 {
dbb410c3
AM
810 /* Snarf the group name from other member, and
811 insert current section in circular list. */
945906ff
AM
812 elf_group_name (newsect) = elf_group_name (s);
813 elf_next_in_group (newsect) = elf_next_in_group (s);
814 elf_next_in_group (s) = newsect;
dbb410c3
AM
815 }
816 else
817 {
dbb410c3
AM
818 const char *gname;
819
b885599b
AM
820 gname = group_signature (abfd, shdr);
821 if (gname == NULL)
b34976b6 822 return FALSE;
945906ff 823 elf_group_name (newsect) = gname;
dbb410c3
AM
824
825 /* Start a circular list with one element. */
945906ff 826 elf_next_in_group (newsect) = newsect;
dbb410c3 827 }
b885599b 828
9dce4196
AM
829 /* If the group section has been created, point to the
830 new member. */
dbb410c3 831 if (shdr->bfd_section != NULL)
945906ff 832 elf_next_in_group (shdr->bfd_section) = newsect;
b885599b 833
564e11c9
JW
834 elf_tdata (abfd)->group_search_offset = i;
835 j = num_group - 1;
dbb410c3
AM
836 break;
837 }
838 }
839 }
840
945906ff 841 if (elf_group_name (newsect) == NULL)
dbb410c3 842 {
695344c0 843 /* xgettext:c-format */
871b3ab2 844 _bfd_error_handler (_("%pB: no group info for section '%pA'"),
4eca0228 845 abfd, newsect);
493a3386 846 return FALSE;
dbb410c3 847 }
b34976b6 848 return TRUE;
dbb410c3
AM
849}
850
3d7f7666 851bfd_boolean
dd863624 852_bfd_elf_setup_sections (bfd *abfd)
3d7f7666
L
853{
854 unsigned int i;
855 unsigned int num_group = elf_tdata (abfd)->num_group;
856 bfd_boolean result = TRUE;
dd863624
L
857 asection *s;
858
859 /* Process SHF_LINK_ORDER. */
860 for (s = abfd->sections; s != NULL; s = s->next)
861 {
862 Elf_Internal_Shdr *this_hdr = &elf_section_data (s)->this_hdr;
863 if ((this_hdr->sh_flags & SHF_LINK_ORDER) != 0)
864 {
865 unsigned int elfsec = this_hdr->sh_link;
866 /* FIXME: The old Intel compiler and old strip/objcopy may
867 not set the sh_link or sh_info fields. Hence we could
868 get the situation where elfsec is 0. */
869 if (elfsec == 0)
870 {
4fbb74a6 871 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
dd863624
L
872 if (bed->link_order_error_handler)
873 bed->link_order_error_handler
695344c0 874 /* xgettext:c-format */
871b3ab2 875 (_("%pB: warning: sh_link not set for section `%pA'"),
dd863624
L
876 abfd, s);
877 }
878 else
879 {
91d6fa6a 880 asection *linksec = NULL;
25bbc984 881
4fbb74a6
AM
882 if (elfsec < elf_numsections (abfd))
883 {
884 this_hdr = elf_elfsections (abfd)[elfsec];
91d6fa6a 885 linksec = this_hdr->bfd_section;
4fbb74a6 886 }
25bbc984
L
887
888 /* PR 1991, 2008:
889 Some strip/objcopy may leave an incorrect value in
890 sh_link. We don't want to proceed. */
91d6fa6a 891 if (linksec == NULL)
25bbc984 892 {
4eca0228 893 _bfd_error_handler
695344c0 894 /* xgettext:c-format */
871b3ab2 895 (_("%pB: sh_link [%d] in section `%pA' is incorrect"),
c08bb8dd 896 s->owner, elfsec, s);
25bbc984
L
897 result = FALSE;
898 }
899
91d6fa6a 900 elf_linked_to_section (s) = linksec;
dd863624
L
901 }
902 }
53720c49
AM
903 else if (this_hdr->sh_type == SHT_GROUP
904 && elf_next_in_group (s) == NULL)
905 {
4eca0228 906 _bfd_error_handler
695344c0 907 /* xgettext:c-format */
871b3ab2 908 (_("%pB: SHT_GROUP section [index %d] has no SHF_GROUP sections"),
53720c49
AM
909 abfd, elf_section_data (s)->this_idx);
910 result = FALSE;
911 }
dd863624 912 }
3d7f7666 913
dd863624 914 /* Process section groups. */
3d7f7666
L
915 if (num_group == (unsigned) -1)
916 return result;
917
918 for (i = 0; i < num_group; i++)
919 {
920 Elf_Internal_Shdr *shdr = elf_tdata (abfd)->group_sect_ptr[i];
4b0e8a5f
NC
921 Elf_Internal_Group *idx;
922 unsigned int n_elt;
3d7f7666 923
4b0e8a5f
NC
924 /* PR binutils/18758: Beware of corrupt binaries with invalid group data. */
925 if (shdr == NULL || shdr->bfd_section == NULL || shdr->contents == NULL)
926 {
4eca0228 927 _bfd_error_handler
695344c0 928 /* xgettext:c-format */
871b3ab2 929 (_("%pB: section group entry number %u is corrupt"),
4b0e8a5f
NC
930 abfd, i);
931 result = FALSE;
932 continue;
933 }
934
935 idx = (Elf_Internal_Group *) shdr->contents;
936 n_elt = shdr->sh_size / 4;
1b786873 937
3d7f7666 938 while (--n_elt != 0)
24d3e51b
NC
939 {
940 ++ idx;
941
942 if (idx->shdr == NULL)
943 continue;
944 else if (idx->shdr->bfd_section)
945 elf_sec_group (idx->shdr->bfd_section) = shdr->bfd_section;
db4677b8
AM
946 else if (idx->shdr->sh_type != SHT_RELA
947 && idx->shdr->sh_type != SHT_REL)
24d3e51b
NC
948 {
949 /* There are some unknown sections in the group. */
950 _bfd_error_handler
951 /* xgettext:c-format */
871b3ab2 952 (_("%pB: unknown type [%#x] section `%s' in group [%pA]"),
24d3e51b
NC
953 abfd,
954 idx->shdr->sh_type,
955 bfd_elf_string_from_elf_section (abfd,
956 (elf_elfheader (abfd)
957 ->e_shstrndx),
958 idx->shdr->sh_name),
959 shdr->bfd_section);
960 result = FALSE;
961 }
962 }
3d7f7666 963 }
24d3e51b 964
3d7f7666
L
965 return result;
966}
967
72adc230
AM
968bfd_boolean
969bfd_elf_is_group_section (bfd *abfd ATTRIBUTE_UNUSED, const asection *sec)
970{
971 return elf_next_in_group (sec) != NULL;
972}
973
cb7f4b29
AM
974const char *
975bfd_elf_group_name (bfd *abfd ATTRIBUTE_UNUSED, const asection *sec)
976{
977 if (elf_sec_group (sec) != NULL)
978 return elf_group_name (sec);
979 return NULL;
980}
981
f6fe1ccd
L
982static char *
983convert_debug_to_zdebug (bfd *abfd, const char *name)
984{
985 unsigned int len = strlen (name);
986 char *new_name = bfd_alloc (abfd, len + 2);
987 if (new_name == NULL)
988 return NULL;
989 new_name[0] = '.';
990 new_name[1] = 'z';
991 memcpy (new_name + 2, name + 1, len);
992 return new_name;
993}
994
995static char *
996convert_zdebug_to_debug (bfd *abfd, const char *name)
997{
998 unsigned int len = strlen (name);
999 char *new_name = bfd_alloc (abfd, len);
1000 if (new_name == NULL)
1001 return NULL;
1002 new_name[0] = '.';
1003 memcpy (new_name + 1, name + 2, len - 1);
1004 return new_name;
1005}
1006
cc5277b1
ML
1007/* This a copy of lto_section defined in GCC (lto-streamer.h). */
1008
1009struct lto_section
1010{
1011 int16_t major_version;
1012 int16_t minor_version;
1013 unsigned char slim_object;
1014
1015 /* Flags is a private field that is not defined publicly. */
1016 uint16_t flags;
1017};
1018
252b5132
RH
1019/* Make a BFD section from an ELF section. We store a pointer to the
1020 BFD section in the bfd_section field of the header. */
1021
b34976b6 1022bfd_boolean
217aa764
AM
1023_bfd_elf_make_section_from_shdr (bfd *abfd,
1024 Elf_Internal_Shdr *hdr,
6dc132d9
L
1025 const char *name,
1026 int shindex)
252b5132
RH
1027{
1028 asection *newsect;
1029 flagword flags;
9c5bfbb7 1030 const struct elf_backend_data *bed;
252b5132
RH
1031
1032 if (hdr->bfd_section != NULL)
4e011fb5 1033 return TRUE;
252b5132
RH
1034
1035 newsect = bfd_make_section_anyway (abfd, name);
1036 if (newsect == NULL)
b34976b6 1037 return FALSE;
252b5132 1038
1829f4b2
AM
1039 hdr->bfd_section = newsect;
1040 elf_section_data (newsect)->this_hdr = *hdr;
6dc132d9 1041 elf_section_data (newsect)->this_idx = shindex;
1829f4b2 1042
2f89ff8d
L
1043 /* Always use the real type/flags. */
1044 elf_section_type (newsect) = hdr->sh_type;
1045 elf_section_flags (newsect) = hdr->sh_flags;
1046
252b5132
RH
1047 newsect->filepos = hdr->sh_offset;
1048
fd361982
AM
1049 if (!bfd_set_section_vma (newsect, hdr->sh_addr)
1050 || !bfd_set_section_size (newsect, hdr->sh_size)
1051 || !bfd_set_section_alignment (newsect, bfd_log2 (hdr->sh_addralign)))
b34976b6 1052 return FALSE;
252b5132
RH
1053
1054 flags = SEC_NO_FLAGS;
1055 if (hdr->sh_type != SHT_NOBITS)
1056 flags |= SEC_HAS_CONTENTS;
dbb410c3 1057 if (hdr->sh_type == SHT_GROUP)
7bdf4127 1058 flags |= SEC_GROUP;
252b5132
RH
1059 if ((hdr->sh_flags & SHF_ALLOC) != 0)
1060 {
1061 flags |= SEC_ALLOC;
1062 if (hdr->sh_type != SHT_NOBITS)
1063 flags |= SEC_LOAD;
1064 }
1065 if ((hdr->sh_flags & SHF_WRITE) == 0)
1066 flags |= SEC_READONLY;
1067 if ((hdr->sh_flags & SHF_EXECINSTR) != 0)
1068 flags |= SEC_CODE;
1069 else if ((flags & SEC_LOAD) != 0)
1070 flags |= SEC_DATA;
f5fa8ca2
JJ
1071 if ((hdr->sh_flags & SHF_MERGE) != 0)
1072 {
1073 flags |= SEC_MERGE;
1074 newsect->entsize = hdr->sh_entsize;
f5fa8ca2 1075 }
84865015
NC
1076 if ((hdr->sh_flags & SHF_STRINGS) != 0)
1077 flags |= SEC_STRINGS;
dbb410c3
AM
1078 if (hdr->sh_flags & SHF_GROUP)
1079 if (!setup_group (abfd, hdr, newsect))
b34976b6 1080 return FALSE;
13ae64f3
JJ
1081 if ((hdr->sh_flags & SHF_TLS) != 0)
1082 flags |= SEC_THREAD_LOCAL;
18ae9cc1
L
1083 if ((hdr->sh_flags & SHF_EXCLUDE) != 0)
1084 flags |= SEC_EXCLUDE;
252b5132 1085
df3a023b
AM
1086 switch (elf_elfheader (abfd)->e_ident[EI_OSABI])
1087 {
1088 /* FIXME: We should not recognize SHF_GNU_MBIND for ELFOSABI_NONE,
1089 but binutils as of 2019-07-23 did not set the EI_OSABI header
1090 byte. */
1091 case ELFOSABI_NONE:
1092 case ELFOSABI_GNU:
1093 case ELFOSABI_FREEBSD:
1094 if ((hdr->sh_flags & SHF_GNU_MBIND) != 0)
1095 elf_tdata (abfd)->has_gnu_osabi |= elf_gnu_osabi_mbind;
1096 break;
1097 }
1098
3d2b39cf 1099 if ((flags & SEC_ALLOC) == 0)
7a6cc5fb 1100 {
3d2b39cf
L
1101 /* The debugging sections appear to be recognized only by name,
1102 not any sort of flag. Their SEC_ALLOC bits are cleared. */
3d2b39cf
L
1103 if (name [0] == '.')
1104 {
f073ced3
AM
1105 const char *p;
1106 int n;
1107 if (name[1] == 'd')
1108 p = ".debug", n = 6;
1109 else if (name[1] == 'g' && name[2] == 'n')
1110 p = ".gnu.linkonce.wi.", n = 17;
1111 else if (name[1] == 'g' && name[2] == 'd')
1112 p = ".gdb_index", n = 11; /* yes we really do mean 11. */
1113 else if (name[1] == 'l')
1114 p = ".line", n = 5;
1115 else if (name[1] == 's')
1116 p = ".stab", n = 5;
1117 else if (name[1] == 'z')
1118 p = ".zdebug", n = 7;
1119 else
1120 p = NULL, n = 0;
1121 if (p != NULL && strncmp (name, p, n) == 0)
3d2b39cf
L
1122 flags |= SEC_DEBUGGING;
1123 }
1124 }
252b5132
RH
1125
1126 /* As a GNU extension, if the name begins with .gnu.linkonce, we
1127 only link a single copy of the section. This is used to support
1128 g++. g++ will emit each template expansion in its own section.
1129 The symbols will be defined as weak, so that multiple definitions
1130 are permitted. The GNU linker extension is to actually discard
1131 all but one of the sections. */
0112cd26 1132 if (CONST_STRNEQ (name, ".gnu.linkonce")
b885599b 1133 && elf_next_in_group (newsect) == NULL)
252b5132
RH
1134 flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
1135
fa152c49
JW
1136 bed = get_elf_backend_data (abfd);
1137 if (bed->elf_backend_section_flags)
1138 if (! bed->elf_backend_section_flags (&flags, hdr))
b34976b6 1139 return FALSE;
fa152c49 1140
fd361982 1141 if (!bfd_set_section_flags (newsect, flags))
b34976b6 1142 return FALSE;
252b5132 1143
718175fa
JK
1144 /* We do not parse the PT_NOTE segments as we are interested even in the
1145 separate debug info files which may have the segments offsets corrupted.
1146 PT_NOTEs from the core files are currently not parsed using BFD. */
1147 if (hdr->sh_type == SHT_NOTE)
1148 {
baea7ef1 1149 bfd_byte *contents;
718175fa 1150
baea7ef1 1151 if (!bfd_malloc_and_get_section (abfd, newsect, &contents))
718175fa
JK
1152 return FALSE;
1153
276da9b3
L
1154 elf_parse_notes (abfd, (char *) contents, hdr->sh_size,
1155 hdr->sh_offset, hdr->sh_addralign);
718175fa
JK
1156 free (contents);
1157 }
1158
252b5132
RH
1159 if ((flags & SEC_ALLOC) != 0)
1160 {
1161 Elf_Internal_Phdr *phdr;
6ffd7900
AM
1162 unsigned int i, nload;
1163
1164 /* Some ELF linkers produce binaries with all the program header
1165 p_paddr fields zero. If we have such a binary with more than
1166 one PT_LOAD header, then leave the section lma equal to vma
1167 so that we don't create sections with overlapping lma. */
1168 phdr = elf_tdata (abfd)->phdr;
1169 for (nload = 0, i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
1170 if (phdr->p_paddr != 0)
1171 break;
1172 else if (phdr->p_type == PT_LOAD && phdr->p_memsz != 0)
1173 ++nload;
1174 if (i >= elf_elfheader (abfd)->e_phnum && nload > 1)
1175 return TRUE;
252b5132 1176
252b5132
RH
1177 phdr = elf_tdata (abfd)->phdr;
1178 for (i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
1179 {
86b2281f
AM
1180 if (((phdr->p_type == PT_LOAD
1181 && (hdr->sh_flags & SHF_TLS) == 0)
1182 || phdr->p_type == PT_TLS)
9a83a553 1183 && ELF_SECTION_IN_SEGMENT (hdr, phdr))
252b5132 1184 {
88967714
AM
1185 if ((flags & SEC_LOAD) == 0)
1186 newsect->lma = (phdr->p_paddr
1187 + hdr->sh_addr - phdr->p_vaddr);
1188 else
1189 /* We used to use the same adjustment for SEC_LOAD
1190 sections, but that doesn't work if the segment
1191 is packed with code from multiple VMAs.
1192 Instead we calculate the section LMA based on
1193 the segment LMA. It is assumed that the
1194 segment will contain sections with contiguous
1195 LMAs, even if the VMAs are not. */
1196 newsect->lma = (phdr->p_paddr
1197 + hdr->sh_offset - phdr->p_offset);
1198
1199 /* With contiguous segments, we can't tell from file
1200 offsets whether a section with zero size should
1201 be placed at the end of one segment or the
1202 beginning of the next. Decide based on vaddr. */
1203 if (hdr->sh_addr >= phdr->p_vaddr
1204 && (hdr->sh_addr + hdr->sh_size
1205 <= phdr->p_vaddr + phdr->p_memsz))
1206 break;
252b5132
RH
1207 }
1208 }
1209 }
1210
4a114e3e
L
1211 /* Compress/decompress DWARF debug sections with names: .debug_* and
1212 .zdebug_*, after the section flags is set. */
1213 if ((flags & SEC_DEBUGGING)
1214 && ((name[1] == 'd' && name[6] == '_')
1215 || (name[1] == 'z' && name[7] == '_')))
1216 {
1217 enum { nothing, compress, decompress } action = nothing;
151411f8 1218 int compression_header_size;
dab394de 1219 bfd_size_type uncompressed_size;
4207142d 1220 unsigned int uncompressed_align_power;
151411f8
L
1221 bfd_boolean compressed
1222 = bfd_is_section_compressed_with_header (abfd, newsect,
dab394de 1223 &compression_header_size,
4207142d
MW
1224 &uncompressed_size,
1225 &uncompressed_align_power);
151411f8 1226 if (compressed)
4a114e3e
L
1227 {
1228 /* Compressed section. Check if we should decompress. */
1229 if ((abfd->flags & BFD_DECOMPRESS))
1230 action = decompress;
1231 }
151411f8
L
1232
1233 /* Compress the uncompressed section or convert from/to .zdebug*
1234 section. Check if we should compress. */
1235 if (action == nothing)
4a114e3e 1236 {
151411f8
L
1237 if (newsect->size != 0
1238 && (abfd->flags & BFD_COMPRESS)
1239 && compression_header_size >= 0
dab394de 1240 && uncompressed_size > 0
151411f8
L
1241 && (!compressed
1242 || ((compression_header_size > 0)
1243 != ((abfd->flags & BFD_COMPRESS_GABI) != 0))))
4a114e3e 1244 action = compress;
151411f8
L
1245 else
1246 return TRUE;
4a114e3e
L
1247 }
1248
151411f8 1249 if (action == compress)
4a114e3e 1250 {
4a114e3e
L
1251 if (!bfd_init_section_compress_status (abfd, newsect))
1252 {
4eca0228 1253 _bfd_error_handler
695344c0 1254 /* xgettext:c-format */
871b3ab2 1255 (_("%pB: unable to initialize compress status for section %s"),
4a114e3e
L
1256 abfd, name);
1257 return FALSE;
1258 }
151411f8
L
1259 }
1260 else
1261 {
4a114e3e
L
1262 if (!bfd_init_section_decompress_status (abfd, newsect))
1263 {
4eca0228 1264 _bfd_error_handler
695344c0 1265 /* xgettext:c-format */
871b3ab2 1266 (_("%pB: unable to initialize decompress status for section %s"),
4a114e3e
L
1267 abfd, name);
1268 return FALSE;
1269 }
151411f8
L
1270 }
1271
f6fe1ccd 1272 if (abfd->is_linker_input)
151411f8 1273 {
f6fe1ccd
L
1274 if (name[1] == 'z'
1275 && (action == decompress
1276 || (action == compress
1277 && (abfd->flags & BFD_COMPRESS_GABI) != 0)))
4e011fb5 1278 {
f6fe1ccd
L
1279 /* Convert section name from .zdebug_* to .debug_* so
1280 that linker will consider this section as a debug
1281 section. */
1282 char *new_name = convert_zdebug_to_debug (abfd, name);
151411f8
L
1283 if (new_name == NULL)
1284 return FALSE;
fd361982 1285 bfd_rename_section (newsect, new_name);
151411f8 1286 }
4a114e3e 1287 }
f6fe1ccd
L
1288 else
1289 /* For objdump, don't rename the section. For objcopy, delay
1290 section rename to elf_fake_sections. */
1291 newsect->flags |= SEC_ELF_RENAME;
4a114e3e
L
1292 }
1293
cc5277b1
ML
1294 /* GCC uses .gnu.lto_.lto.<some_hash> as a LTO bytecode information
1295 section. */
1296 const char *lto_section_name = ".gnu.lto_.lto.";
1297 if (strncmp (name, lto_section_name, strlen (lto_section_name)) == 0)
1298 {
1299 struct lto_section lsection;
1300 if (bfd_get_section_contents (abfd, newsect, &lsection, 0,
1301 sizeof (struct lto_section)))
1302 abfd->lto_slim_object = lsection.slim_object;
1303 }
1304
b34976b6 1305 return TRUE;
252b5132
RH
1306}
1307
84865015
NC
1308const char *const bfd_elf_section_type_names[] =
1309{
252b5132
RH
1310 "SHT_NULL", "SHT_PROGBITS", "SHT_SYMTAB", "SHT_STRTAB",
1311 "SHT_RELA", "SHT_HASH", "SHT_DYNAMIC", "SHT_NOTE",
1312 "SHT_NOBITS", "SHT_REL", "SHT_SHLIB", "SHT_DYNSYM",
1313};
1314
1049f94e 1315/* ELF relocs are against symbols. If we are producing relocatable
252b5132
RH
1316 output, and the reloc is against an external symbol, and nothing
1317 has given us any additional addend, the resulting reloc will also
1318 be against the same symbol. In such a case, we don't want to
1319 change anything about the way the reloc is handled, since it will
1320 all be done at final link time. Rather than put special case code
1321 into bfd_perform_relocation, all the reloc types use this howto
1322 function. It just short circuits the reloc if producing
1049f94e 1323 relocatable output against an external symbol. */
252b5132 1324
252b5132 1325bfd_reloc_status_type
217aa764
AM
1326bfd_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED,
1327 arelent *reloc_entry,
1328 asymbol *symbol,
1329 void *data ATTRIBUTE_UNUSED,
1330 asection *input_section,
1331 bfd *output_bfd,
1332 char **error_message ATTRIBUTE_UNUSED)
1333{
1334 if (output_bfd != NULL
252b5132
RH
1335 && (symbol->flags & BSF_SECTION_SYM) == 0
1336 && (! reloc_entry->howto->partial_inplace
1337 || reloc_entry->addend == 0))
1338 {
1339 reloc_entry->address += input_section->output_offset;
1340 return bfd_reloc_ok;
1341 }
1342
1343 return bfd_reloc_continue;
1344}
1345\f
84865015
NC
1346/* Returns TRUE if section A matches section B.
1347 Names, addresses and links may be different, but everything else
1348 should be the same. */
1349
1350static bfd_boolean
5522f910
NC
1351section_match (const Elf_Internal_Shdr * a,
1352 const Elf_Internal_Shdr * b)
84865015 1353{
ac85e67c
AM
1354 if (a->sh_type != b->sh_type
1355 || ((a->sh_flags ^ b->sh_flags) & ~SHF_INFO_LINK) != 0
1356 || a->sh_addralign != b->sh_addralign
1357 || a->sh_entsize != b->sh_entsize)
1358 return FALSE;
1359 if (a->sh_type == SHT_SYMTAB
1360 || a->sh_type == SHT_STRTAB)
1361 return TRUE;
1362 return a->sh_size == b->sh_size;
84865015
NC
1363}
1364
1365/* Find a section in OBFD that has the same characteristics
1366 as IHEADER. Return the index of this section or SHN_UNDEF if
1367 none can be found. Check's section HINT first, as this is likely
1368 to be the correct section. */
1369
1370static unsigned int
5cc4ca83
ST
1371find_link (const bfd *obfd, const Elf_Internal_Shdr *iheader,
1372 const unsigned int hint)
84865015
NC
1373{
1374 Elf_Internal_Shdr ** oheaders = elf_elfsections (obfd);
1375 unsigned int i;
1376
a55c9876
NC
1377 BFD_ASSERT (iheader != NULL);
1378
1379 /* See PR 20922 for a reproducer of the NULL test. */
5cc4ca83
ST
1380 if (hint < elf_numsections (obfd)
1381 && oheaders[hint] != NULL
a55c9876 1382 && section_match (oheaders[hint], iheader))
84865015
NC
1383 return hint;
1384
1385 for (i = 1; i < elf_numsections (obfd); i++)
1386 {
1387 Elf_Internal_Shdr * oheader = oheaders[i];
1388
a55c9876
NC
1389 if (oheader == NULL)
1390 continue;
84865015
NC
1391 if (section_match (oheader, iheader))
1392 /* FIXME: Do we care if there is a potential for
1393 multiple matches ? */
1394 return i;
1395 }
1396
1397 return SHN_UNDEF;
1398}
1399
5522f910
NC
1400/* PR 19938: Attempt to set the ELF section header fields of an OS or
1401 Processor specific section, based upon a matching input section.
1402 Returns TRUE upon success, FALSE otherwise. */
07d6d2b8 1403
5522f910
NC
1404static bfd_boolean
1405copy_special_section_fields (const bfd *ibfd,
1406 bfd *obfd,
1407 const Elf_Internal_Shdr *iheader,
1408 Elf_Internal_Shdr *oheader,
1409 const unsigned int secnum)
1410{
1411 const struct elf_backend_data *bed = get_elf_backend_data (obfd);
1412 const Elf_Internal_Shdr **iheaders = (const Elf_Internal_Shdr **) elf_elfsections (ibfd);
1413 bfd_boolean changed = FALSE;
1414 unsigned int sh_link;
1415
1416 if (oheader->sh_type == SHT_NOBITS)
1417 {
1418 /* This is a feature for objcopy --only-keep-debug:
1419 When a section's type is changed to NOBITS, we preserve
1420 the sh_link and sh_info fields so that they can be
1421 matched up with the original.
1422
1423 Note: Strictly speaking these assignments are wrong.
1424 The sh_link and sh_info fields should point to the
1425 relevent sections in the output BFD, which may not be in
1426 the same location as they were in the input BFD. But
1427 the whole point of this action is to preserve the
1428 original values of the sh_link and sh_info fields, so
1429 that they can be matched up with the section headers in
1430 the original file. So strictly speaking we may be
1431 creating an invalid ELF file, but it is only for a file
1432 that just contains debug info and only for sections
1433 without any contents. */
1434 if (oheader->sh_link == 0)
1435 oheader->sh_link = iheader->sh_link;
1436 if (oheader->sh_info == 0)
1437 oheader->sh_info = iheader->sh_info;
1438 return TRUE;
1439 }
1440
1441 /* Allow the target a chance to decide how these fields should be set. */
1442 if (bed->elf_backend_copy_special_section_fields != NULL
1443 && bed->elf_backend_copy_special_section_fields
1444 (ibfd, obfd, iheader, oheader))
1445 return TRUE;
1446
1447 /* We have an iheader which might match oheader, and which has non-zero
1448 sh_info and/or sh_link fields. Attempt to follow those links and find
1449 the section in the output bfd which corresponds to the linked section
1450 in the input bfd. */
1451 if (iheader->sh_link != SHN_UNDEF)
1452 {
4f3ca05b
NC
1453 /* See PR 20931 for a reproducer. */
1454 if (iheader->sh_link >= elf_numsections (ibfd))
1455 {
76cfced5 1456 _bfd_error_handler
4f3ca05b 1457 /* xgettext:c-format */
9793eb77 1458 (_("%pB: invalid sh_link field (%d) in section number %d"),
4f3ca05b
NC
1459 ibfd, iheader->sh_link, secnum);
1460 return FALSE;
1461 }
1462
5522f910
NC
1463 sh_link = find_link (obfd, iheaders[iheader->sh_link], iheader->sh_link);
1464 if (sh_link != SHN_UNDEF)
1465 {
1466 oheader->sh_link = sh_link;
1467 changed = TRUE;
1468 }
1469 else
1470 /* FIXME: Should we install iheader->sh_link
1471 if we could not find a match ? */
76cfced5 1472 _bfd_error_handler
695344c0 1473 /* xgettext:c-format */
9793eb77 1474 (_("%pB: failed to find link section for section %d"), obfd, secnum);
5522f910
NC
1475 }
1476
1477 if (iheader->sh_info)
1478 {
1479 /* The sh_info field can hold arbitrary information, but if the
1480 SHF_LINK_INFO flag is set then it should be interpreted as a
1481 section index. */
1482 if (iheader->sh_flags & SHF_INFO_LINK)
1483 {
1484 sh_link = find_link (obfd, iheaders[iheader->sh_info],
1485 iheader->sh_info);
1486 if (sh_link != SHN_UNDEF)
1487 oheader->sh_flags |= SHF_INFO_LINK;
1488 }
1489 else
1490 /* No idea what it means - just copy it. */
1491 sh_link = iheader->sh_info;
1492
1493 if (sh_link != SHN_UNDEF)
1494 {
1495 oheader->sh_info = sh_link;
1496 changed = TRUE;
1497 }
1498 else
76cfced5 1499 _bfd_error_handler
695344c0 1500 /* xgettext:c-format */
9793eb77 1501 (_("%pB: failed to find info section for section %d"), obfd, secnum);
5522f910
NC
1502 }
1503
1504 return changed;
1505}
07d6d2b8 1506
0ac4564e
L
1507/* Copy the program header and other data from one object module to
1508 another. */
252b5132 1509
b34976b6 1510bfd_boolean
217aa764 1511_bfd_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
2d502050 1512{
5522f910
NC
1513 const Elf_Internal_Shdr **iheaders = (const Elf_Internal_Shdr **) elf_elfsections (ibfd);
1514 Elf_Internal_Shdr **oheaders = elf_elfsections (obfd);
1515 const struct elf_backend_data *bed;
84865015
NC
1516 unsigned int i;
1517
2d502050 1518 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
84865015 1519 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
b34976b6 1520 return TRUE;
2d502050 1521
57b828ef
L
1522 if (!elf_flags_init (obfd))
1523 {
1524 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
1525 elf_flags_init (obfd) = TRUE;
1526 }
2d502050 1527
0ac4564e 1528 elf_gp (obfd) = elf_gp (ibfd);
57b828ef
L
1529
1530 /* Also copy the EI_OSABI field. */
1531 elf_elfheader (obfd)->e_ident[EI_OSABI] =
1532 elf_elfheader (ibfd)->e_ident[EI_OSABI];
104d59d1 1533
5522f910
NC
1534 /* If set, copy the EI_ABIVERSION field. */
1535 if (elf_elfheader (ibfd)->e_ident[EI_ABIVERSION])
1536 elf_elfheader (obfd)->e_ident[EI_ABIVERSION]
1537 = elf_elfheader (ibfd)->e_ident[EI_ABIVERSION];
07d6d2b8 1538
104d59d1
JM
1539 /* Copy object attributes. */
1540 _bfd_elf_copy_obj_attributes (ibfd, obfd);
63b9bbb7 1541
84865015
NC
1542 if (iheaders == NULL || oheaders == NULL)
1543 return TRUE;
63b9bbb7 1544
5522f910
NC
1545 bed = get_elf_backend_data (obfd);
1546
1547 /* Possibly copy other fields in the section header. */
84865015 1548 for (i = 1; i < elf_numsections (obfd); i++)
63b9bbb7 1549 {
84865015
NC
1550 unsigned int j;
1551 Elf_Internal_Shdr * oheader = oheaders[i];
63b9bbb7 1552
5522f910
NC
1553 /* Ignore ordinary sections. SHT_NOBITS sections are considered however
1554 because of a special case need for generating separate debug info
1555 files. See below for more details. */
84865015
NC
1556 if (oheader == NULL
1557 || (oheader->sh_type != SHT_NOBITS
5522f910
NC
1558 && oheader->sh_type < SHT_LOOS))
1559 continue;
1560
1561 /* Ignore empty sections, and sections whose
1562 fields have already been initialised. */
1563 if (oheader->sh_size == 0
84865015
NC
1564 || (oheader->sh_info != 0 && oheader->sh_link != 0))
1565 continue;
63b9bbb7 1566
84865015 1567 /* Scan for the matching section in the input bfd.
5522f910
NC
1568 First we try for a direct mapping between the input and output sections. */
1569 for (j = 1; j < elf_numsections (ibfd); j++)
1570 {
1571 const Elf_Internal_Shdr * iheader = iheaders[j];
1572
1573 if (iheader == NULL)
1574 continue;
1575
1576 if (oheader->bfd_section != NULL
1577 && iheader->bfd_section != NULL
1578 && iheader->bfd_section->output_section != NULL
1579 && iheader->bfd_section->output_section == oheader->bfd_section)
1580 {
1581 /* We have found a connection from the input section to the
1582 output section. Attempt to copy the header fields. If
1583 this fails then do not try any further sections - there
1584 should only be a one-to-one mapping between input and output. */
1585 if (! copy_special_section_fields (ibfd, obfd, iheader, oheader, i))
1586 j = elf_numsections (ibfd);
1587 break;
1588 }
1589 }
1590
1591 if (j < elf_numsections (ibfd))
1592 continue;
1593
1594 /* That failed. So try to deduce the corresponding input section.
84865015
NC
1595 Unfortunately we cannot compare names as the output string table
1596 is empty, so instead we check size, address and type. */
1597 for (j = 1; j < elf_numsections (ibfd); j++)
1598 {
5522f910 1599 const Elf_Internal_Shdr * iheader = iheaders[j];
84865015 1600
5522f910
NC
1601 if (iheader == NULL)
1602 continue;
1603
1604 /* Try matching fields in the input section's header.
1605 Since --only-keep-debug turns all non-debug sections into
84865015
NC
1606 SHT_NOBITS sections, the output SHT_NOBITS type matches any
1607 input type. */
1608 if ((oheader->sh_type == SHT_NOBITS
1609 || iheader->sh_type == oheader->sh_type)
5522f910
NC
1610 && (iheader->sh_flags & ~ SHF_INFO_LINK)
1611 == (oheader->sh_flags & ~ SHF_INFO_LINK)
84865015
NC
1612 && iheader->sh_addralign == oheader->sh_addralign
1613 && iheader->sh_entsize == oheader->sh_entsize
1614 && iheader->sh_size == oheader->sh_size
1615 && iheader->sh_addr == oheader->sh_addr
1616 && (iheader->sh_info != oheader->sh_info
1617 || iheader->sh_link != oheader->sh_link))
63b9bbb7 1618 {
5522f910
NC
1619 if (copy_special_section_fields (ibfd, obfd, iheader, oheader, i))
1620 break;
63b9bbb7
NC
1621 }
1622 }
5522f910
NC
1623
1624 if (j == elf_numsections (ibfd) && oheader->sh_type >= SHT_LOOS)
1625 {
1626 /* Final attempt. Call the backend copy function
1627 with a NULL input section. */
1628 if (bed->elf_backend_copy_special_section_fields != NULL)
1629 bed->elf_backend_copy_special_section_fields (ibfd, obfd, NULL, oheader);
1630 }
63b9bbb7
NC
1631 }
1632
b34976b6 1633 return TRUE;
2d502050
L
1634}
1635
cedc298e
L
1636static const char *
1637get_segment_type (unsigned int p_type)
1638{
1639 const char *pt;
1640 switch (p_type)
1641 {
1642 case PT_NULL: pt = "NULL"; break;
1643 case PT_LOAD: pt = "LOAD"; break;
1644 case PT_DYNAMIC: pt = "DYNAMIC"; break;
1645 case PT_INTERP: pt = "INTERP"; break;
1646 case PT_NOTE: pt = "NOTE"; break;
1647 case PT_SHLIB: pt = "SHLIB"; break;
1648 case PT_PHDR: pt = "PHDR"; break;
1649 case PT_TLS: pt = "TLS"; break;
1650 case PT_GNU_EH_FRAME: pt = "EH_FRAME"; break;
2b05f1b7 1651 case PT_GNU_STACK: pt = "STACK"; break;
cedc298e
L
1652 case PT_GNU_RELRO: pt = "RELRO"; break;
1653 default: pt = NULL; break;
1654 }
1655 return pt;
1656}
1657
f0b79d91
L
1658/* Print out the program headers. */
1659
b34976b6 1660bfd_boolean
217aa764 1661_bfd_elf_print_private_bfd_data (bfd *abfd, void *farg)
252b5132 1662{
a50b1753 1663 FILE *f = (FILE *) farg;
252b5132
RH
1664 Elf_Internal_Phdr *p;
1665 asection *s;
1666 bfd_byte *dynbuf = NULL;
1667
1668 p = elf_tdata (abfd)->phdr;
1669 if (p != NULL)
1670 {
1671 unsigned int i, c;
1672
1673 fprintf (f, _("\nProgram Header:\n"));
1674 c = elf_elfheader (abfd)->e_phnum;
1675 for (i = 0; i < c; i++, p++)
1676 {
cedc298e 1677 const char *pt = get_segment_type (p->p_type);
252b5132
RH
1678 char buf[20];
1679
cedc298e 1680 if (pt == NULL)
252b5132 1681 {
cedc298e
L
1682 sprintf (buf, "0x%lx", p->p_type);
1683 pt = buf;
252b5132 1684 }
dc810e39 1685 fprintf (f, "%8s off 0x", pt);
60b89a18 1686 bfd_fprintf_vma (abfd, f, p->p_offset);
252b5132 1687 fprintf (f, " vaddr 0x");
60b89a18 1688 bfd_fprintf_vma (abfd, f, p->p_vaddr);
252b5132 1689 fprintf (f, " paddr 0x");
60b89a18 1690 bfd_fprintf_vma (abfd, f, p->p_paddr);
252b5132
RH
1691 fprintf (f, " align 2**%u\n", bfd_log2 (p->p_align));
1692 fprintf (f, " filesz 0x");
60b89a18 1693 bfd_fprintf_vma (abfd, f, p->p_filesz);
252b5132 1694 fprintf (f, " memsz 0x");
60b89a18 1695 bfd_fprintf_vma (abfd, f, p->p_memsz);
252b5132
RH
1696 fprintf (f, " flags %c%c%c",
1697 (p->p_flags & PF_R) != 0 ? 'r' : '-',
1698 (p->p_flags & PF_W) != 0 ? 'w' : '-',
1699 (p->p_flags & PF_X) != 0 ? 'x' : '-');
dc810e39
AM
1700 if ((p->p_flags &~ (unsigned) (PF_R | PF_W | PF_X)) != 0)
1701 fprintf (f, " %lx", p->p_flags &~ (unsigned) (PF_R | PF_W | PF_X));
252b5132
RH
1702 fprintf (f, "\n");
1703 }
1704 }
1705
1706 s = bfd_get_section_by_name (abfd, ".dynamic");
1707 if (s != NULL)
1708 {
cb33740c 1709 unsigned int elfsec;
dc810e39 1710 unsigned long shlink;
252b5132
RH
1711 bfd_byte *extdyn, *extdynend;
1712 size_t extdynsize;
217aa764 1713 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
252b5132
RH
1714
1715 fprintf (f, _("\nDynamic Section:\n"));
1716
eea6121a 1717 if (!bfd_malloc_and_get_section (abfd, s, &dynbuf))
252b5132
RH
1718 goto error_return;
1719
1720 elfsec = _bfd_elf_section_from_bfd_section (abfd, s);
cb33740c 1721 if (elfsec == SHN_BAD)
252b5132 1722 goto error_return;
dc810e39 1723 shlink = elf_elfsections (abfd)[elfsec]->sh_link;
252b5132
RH
1724
1725 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
1726 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
1727
1728 extdyn = dynbuf;
06614111
NC
1729 /* PR 17512: file: 6f427532. */
1730 if (s->size < extdynsize)
1731 goto error_return;
eea6121a 1732 extdynend = extdyn + s->size;
1036838a 1733 /* PR 17512: file: id:000006,sig:06,src:000000,op:flip4,pos:5664.
07d6d2b8 1734 Fix range check. */
1036838a 1735 for (; extdyn <= (extdynend - extdynsize); extdyn += extdynsize)
252b5132
RH
1736 {
1737 Elf_Internal_Dyn dyn;
ad9563d6 1738 const char *name = "";
252b5132 1739 char ab[20];
b34976b6 1740 bfd_boolean stringp;
ad9563d6 1741 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 1742
217aa764 1743 (*swap_dyn_in) (abfd, extdyn, &dyn);
252b5132
RH
1744
1745 if (dyn.d_tag == DT_NULL)
1746 break;
1747
b34976b6 1748 stringp = FALSE;
252b5132
RH
1749 switch (dyn.d_tag)
1750 {
1751 default:
ad9563d6
CM
1752 if (bed->elf_backend_get_target_dtag)
1753 name = (*bed->elf_backend_get_target_dtag) (dyn.d_tag);
1754
1755 if (!strcmp (name, ""))
1756 {
cd9af601 1757 sprintf (ab, "%#" BFD_VMA_FMT "x", dyn.d_tag);
ad9563d6
CM
1758 name = ab;
1759 }
252b5132
RH
1760 break;
1761
b34976b6 1762 case DT_NEEDED: name = "NEEDED"; stringp = TRUE; break;
252b5132
RH
1763 case DT_PLTRELSZ: name = "PLTRELSZ"; break;
1764 case DT_PLTGOT: name = "PLTGOT"; break;
1765 case DT_HASH: name = "HASH"; break;
1766 case DT_STRTAB: name = "STRTAB"; break;
1767 case DT_SYMTAB: name = "SYMTAB"; break;
1768 case DT_RELA: name = "RELA"; break;
1769 case DT_RELASZ: name = "RELASZ"; break;
1770 case DT_RELAENT: name = "RELAENT"; break;
1771 case DT_STRSZ: name = "STRSZ"; break;
1772 case DT_SYMENT: name = "SYMENT"; break;
1773 case DT_INIT: name = "INIT"; break;
1774 case DT_FINI: name = "FINI"; break;
b34976b6
AM
1775 case DT_SONAME: name = "SONAME"; stringp = TRUE; break;
1776 case DT_RPATH: name = "RPATH"; stringp = TRUE; break;
252b5132
RH
1777 case DT_SYMBOLIC: name = "SYMBOLIC"; break;
1778 case DT_REL: name = "REL"; break;
1779 case DT_RELSZ: name = "RELSZ"; break;
1780 case DT_RELENT: name = "RELENT"; break;
1781 case DT_PLTREL: name = "PLTREL"; break;
1782 case DT_DEBUG: name = "DEBUG"; break;
1783 case DT_TEXTREL: name = "TEXTREL"; break;
1784 case DT_JMPREL: name = "JMPREL"; break;
94558834
L
1785 case DT_BIND_NOW: name = "BIND_NOW"; break;
1786 case DT_INIT_ARRAY: name = "INIT_ARRAY"; break;
1787 case DT_FINI_ARRAY: name = "FINI_ARRAY"; break;
1788 case DT_INIT_ARRAYSZ: name = "INIT_ARRAYSZ"; break;
1789 case DT_FINI_ARRAYSZ: name = "FINI_ARRAYSZ"; break;
b34976b6 1790 case DT_RUNPATH: name = "RUNPATH"; stringp = TRUE; break;
94558834
L
1791 case DT_FLAGS: name = "FLAGS"; break;
1792 case DT_PREINIT_ARRAY: name = "PREINIT_ARRAY"; break;
1793 case DT_PREINIT_ARRAYSZ: name = "PREINIT_ARRAYSZ"; break;
d48188b9 1794 case DT_CHECKSUM: name = "CHECKSUM"; break;
94558834
L
1795 case DT_PLTPADSZ: name = "PLTPADSZ"; break;
1796 case DT_MOVEENT: name = "MOVEENT"; break;
1797 case DT_MOVESZ: name = "MOVESZ"; break;
1798 case DT_FEATURE: name = "FEATURE"; break;
1799 case DT_POSFLAG_1: name = "POSFLAG_1"; break;
1800 case DT_SYMINSZ: name = "SYMINSZ"; break;
1801 case DT_SYMINENT: name = "SYMINENT"; break;
b34976b6
AM
1802 case DT_CONFIG: name = "CONFIG"; stringp = TRUE; break;
1803 case DT_DEPAUDIT: name = "DEPAUDIT"; stringp = TRUE; break;
1804 case DT_AUDIT: name = "AUDIT"; stringp = TRUE; break;
94558834
L
1805 case DT_PLTPAD: name = "PLTPAD"; break;
1806 case DT_MOVETAB: name = "MOVETAB"; break;
1807 case DT_SYMINFO: name = "SYMINFO"; break;
1808 case DT_RELACOUNT: name = "RELACOUNT"; break;
1809 case DT_RELCOUNT: name = "RELCOUNT"; break;
1810 case DT_FLAGS_1: name = "FLAGS_1"; break;
252b5132
RH
1811 case DT_VERSYM: name = "VERSYM"; break;
1812 case DT_VERDEF: name = "VERDEF"; break;
1813 case DT_VERDEFNUM: name = "VERDEFNUM"; break;
1814 case DT_VERNEED: name = "VERNEED"; break;
1815 case DT_VERNEEDNUM: name = "VERNEEDNUM"; break;
b34976b6 1816 case DT_AUXILIARY: name = "AUXILIARY"; stringp = TRUE; break;
94558834 1817 case DT_USED: name = "USED"; break;
b34976b6 1818 case DT_FILTER: name = "FILTER"; stringp = TRUE; break;
fdc90cb4 1819 case DT_GNU_HASH: name = "GNU_HASH"; break;
252b5132
RH
1820 }
1821
ad9563d6 1822 fprintf (f, " %-20s ", name);
252b5132 1823 if (! stringp)
a1f3c56e
AN
1824 {
1825 fprintf (f, "0x");
1826 bfd_fprintf_vma (abfd, f, dyn.d_un.d_val);
1827 }
252b5132
RH
1828 else
1829 {
1830 const char *string;
dc810e39 1831 unsigned int tagv = dyn.d_un.d_val;
252b5132 1832
dc810e39 1833 string = bfd_elf_string_from_elf_section (abfd, shlink, tagv);
252b5132
RH
1834 if (string == NULL)
1835 goto error_return;
1836 fprintf (f, "%s", string);
1837 }
1838 fprintf (f, "\n");
1839 }
1840
1841 free (dynbuf);
1842 dynbuf = NULL;
1843 }
1844
1845 if ((elf_dynverdef (abfd) != 0 && elf_tdata (abfd)->verdef == NULL)
1846 || (elf_dynverref (abfd) != 0 && elf_tdata (abfd)->verref == NULL))
1847 {
fc0e6df6 1848 if (! _bfd_elf_slurp_version_tables (abfd, FALSE))
b34976b6 1849 return FALSE;
252b5132
RH
1850 }
1851
1852 if (elf_dynverdef (abfd) != 0)
1853 {
1854 Elf_Internal_Verdef *t;
1855
1856 fprintf (f, _("\nVersion definitions:\n"));
1857 for (t = elf_tdata (abfd)->verdef; t != NULL; t = t->vd_nextdef)
1858 {
1859 fprintf (f, "%d 0x%2.2x 0x%8.8lx %s\n", t->vd_ndx,
d0fb9a8d
JJ
1860 t->vd_flags, t->vd_hash,
1861 t->vd_nodename ? t->vd_nodename : "<corrupt>");
1862 if (t->vd_auxptr != NULL && t->vd_auxptr->vda_nextptr != NULL)
252b5132
RH
1863 {
1864 Elf_Internal_Verdaux *a;
1865
1866 fprintf (f, "\t");
1867 for (a = t->vd_auxptr->vda_nextptr;
1868 a != NULL;
1869 a = a->vda_nextptr)
d0fb9a8d
JJ
1870 fprintf (f, "%s ",
1871 a->vda_nodename ? a->vda_nodename : "<corrupt>");
252b5132
RH
1872 fprintf (f, "\n");
1873 }
1874 }
1875 }
1876
1877 if (elf_dynverref (abfd) != 0)
1878 {
1879 Elf_Internal_Verneed *t;
1880
1881 fprintf (f, _("\nVersion References:\n"));
1882 for (t = elf_tdata (abfd)->verref; t != NULL; t = t->vn_nextref)
1883 {
1884 Elf_Internal_Vernaux *a;
1885
d0fb9a8d
JJ
1886 fprintf (f, _(" required from %s:\n"),
1887 t->vn_filename ? t->vn_filename : "<corrupt>");
252b5132
RH
1888 for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr)
1889 fprintf (f, " 0x%8.8lx 0x%2.2x %2.2d %s\n", a->vna_hash,
d0fb9a8d
JJ
1890 a->vna_flags, a->vna_other,
1891 a->vna_nodename ? a->vna_nodename : "<corrupt>");
252b5132
RH
1892 }
1893 }
1894
b34976b6 1895 return TRUE;
252b5132
RH
1896
1897 error_return:
1898 if (dynbuf != NULL)
1899 free (dynbuf);
b34976b6 1900 return FALSE;
252b5132
RH
1901}
1902
bb4d2ac2
L
1903/* Get version string. */
1904
1905const char *
60bb06bc
L
1906_bfd_elf_get_symbol_version_string (bfd *abfd, asymbol *symbol,
1907 bfd_boolean *hidden)
bb4d2ac2
L
1908{
1909 const char *version_string = NULL;
1910 if (elf_dynversym (abfd) != 0
1911 && (elf_dynverdef (abfd) != 0 || elf_dynverref (abfd) != 0))
1912 {
1913 unsigned int vernum = ((elf_symbol_type *) symbol)->version;
1914
1915 *hidden = (vernum & VERSYM_HIDDEN) != 0;
1916 vernum &= VERSYM_VERSION;
1917
1918 if (vernum == 0)
1919 version_string = "";
1f6f5dba
L
1920 else if (vernum == 1
1921 && (vernum > elf_tdata (abfd)->cverdefs
1922 || (elf_tdata (abfd)->verdef[0].vd_flags
1923 == VER_FLG_BASE)))
bb4d2ac2
L
1924 version_string = "Base";
1925 else if (vernum <= elf_tdata (abfd)->cverdefs)
1926 version_string =
1927 elf_tdata (abfd)->verdef[vernum - 1].vd_nodename;
1928 else
1929 {
1930 Elf_Internal_Verneed *t;
1931
7a815dd5 1932 version_string = _("<corrupt>");
bb4d2ac2
L
1933 for (t = elf_tdata (abfd)->verref;
1934 t != NULL;
1935 t = t->vn_nextref)
1936 {
1937 Elf_Internal_Vernaux *a;
1938
1939 for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr)
1940 {
1941 if (a->vna_other == vernum)
1942 {
1943 version_string = a->vna_nodename;
1944 break;
1945 }
1946 }
1947 }
1948 }
1949 }
1950 return version_string;
1951}
1952
252b5132
RH
1953/* Display ELF-specific fields of a symbol. */
1954
1955void
217aa764
AM
1956bfd_elf_print_symbol (bfd *abfd,
1957 void *filep,
1958 asymbol *symbol,
1959 bfd_print_symbol_type how)
252b5132 1960{
a50b1753 1961 FILE *file = (FILE *) filep;
252b5132
RH
1962 switch (how)
1963 {
1964 case bfd_print_symbol_name:
1965 fprintf (file, "%s", symbol->name);
1966 break;
1967 case bfd_print_symbol_more:
1968 fprintf (file, "elf ");
60b89a18 1969 bfd_fprintf_vma (abfd, file, symbol->value);
cd9af601 1970 fprintf (file, " %x", symbol->flags);
252b5132
RH
1971 break;
1972 case bfd_print_symbol_all:
1973 {
4e8a9624
AM
1974 const char *section_name;
1975 const char *name = NULL;
9c5bfbb7 1976 const struct elf_backend_data *bed;
7a13edea 1977 unsigned char st_other;
dbb410c3 1978 bfd_vma val;
bb4d2ac2
L
1979 const char *version_string;
1980 bfd_boolean hidden;
c044fabd 1981
252b5132 1982 section_name = symbol->section ? symbol->section->name : "(*none*)";
587ff49e
RH
1983
1984 bed = get_elf_backend_data (abfd);
1985 if (bed->elf_backend_print_symbol_all)
c044fabd 1986 name = (*bed->elf_backend_print_symbol_all) (abfd, filep, symbol);
587ff49e
RH
1987
1988 if (name == NULL)
1989 {
7ee38065 1990 name = symbol->name;
217aa764 1991 bfd_print_symbol_vandf (abfd, file, symbol);
587ff49e
RH
1992 }
1993
252b5132
RH
1994 fprintf (file, " %s\t", section_name);
1995 /* Print the "other" value for a symbol. For common symbols,
1996 we've already printed the size; now print the alignment.
1997 For other symbols, we have no specified alignment, and
1998 we've printed the address; now print the size. */
dcf6c779 1999 if (symbol->section && bfd_is_com_section (symbol->section))
dbb410c3
AM
2000 val = ((elf_symbol_type *) symbol)->internal_elf_sym.st_value;
2001 else
2002 val = ((elf_symbol_type *) symbol)->internal_elf_sym.st_size;
2003 bfd_fprintf_vma (abfd, file, val);
252b5132
RH
2004
2005 /* If we have version information, print it. */
60bb06bc
L
2006 version_string = _bfd_elf_get_symbol_version_string (abfd,
2007 symbol,
2008 &hidden);
bb4d2ac2 2009 if (version_string)
252b5132 2010 {
bb4d2ac2 2011 if (!hidden)
252b5132
RH
2012 fprintf (file, " %-11s", version_string);
2013 else
2014 {
2015 int i;
2016
2017 fprintf (file, " (%s)", version_string);
2018 for (i = 10 - strlen (version_string); i > 0; --i)
2019 putc (' ', file);
2020 }
2021 }
2022
2023 /* If the st_other field is not zero, print it. */
7a13edea 2024 st_other = ((elf_symbol_type *) symbol)->internal_elf_sym.st_other;
c044fabd 2025
7a13edea
NC
2026 switch (st_other)
2027 {
2028 case 0: break;
2029 case STV_INTERNAL: fprintf (file, " .internal"); break;
2030 case STV_HIDDEN: fprintf (file, " .hidden"); break;
2031 case STV_PROTECTED: fprintf (file, " .protected"); break;
2032 default:
2033 /* Some other non-defined flags are also present, so print
2034 everything hex. */
2035 fprintf (file, " 0x%02x", (unsigned int) st_other);
2036 }
252b5132 2037
587ff49e 2038 fprintf (file, " %s", name);
252b5132
RH
2039 }
2040 break;
2041 }
2042}
252b5132
RH
2043\f
2044/* ELF .o/exec file reading */
2045
c044fabd 2046/* Create a new bfd section from an ELF section header. */
252b5132 2047
b34976b6 2048bfd_boolean
217aa764 2049bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
252b5132 2050{
4fbb74a6
AM
2051 Elf_Internal_Shdr *hdr;
2052 Elf_Internal_Ehdr *ehdr;
2053 const struct elf_backend_data *bed;
90937f86 2054 const char *name;
bf67003b
NC
2055 bfd_boolean ret = TRUE;
2056 static bfd_boolean * sections_being_created = NULL;
5a4b0ccc 2057 static bfd * sections_being_created_abfd = NULL;
bf67003b 2058 static unsigned int nesting = 0;
252b5132 2059
4fbb74a6
AM
2060 if (shindex >= elf_numsections (abfd))
2061 return FALSE;
2062
bf67003b
NC
2063 if (++ nesting > 3)
2064 {
2065 /* PR17512: A corrupt ELF binary might contain a recursive group of
67ce483b 2066 sections, with each the string indices pointing to the next in the
bf67003b
NC
2067 loop. Detect this here, by refusing to load a section that we are
2068 already in the process of loading. We only trigger this test if
2069 we have nested at least three sections deep as normal ELF binaries
5a4b0ccc
NC
2070 can expect to recurse at least once.
2071
2072 FIXME: It would be better if this array was attached to the bfd,
2073 rather than being held in a static pointer. */
2074
2075 if (sections_being_created_abfd != abfd)
2076 sections_being_created = NULL;
bf67003b
NC
2077 if (sections_being_created == NULL)
2078 {
bf67003b 2079 sections_being_created = (bfd_boolean *)
7a6e0d89 2080 bfd_zalloc2 (abfd, elf_numsections (abfd), sizeof (bfd_boolean));
5a4b0ccc 2081 sections_being_created_abfd = abfd;
bf67003b
NC
2082 }
2083 if (sections_being_created [shindex])
2084 {
4eca0228 2085 _bfd_error_handler
871b3ab2 2086 (_("%pB: warning: loop in section dependencies detected"), abfd);
bf67003b
NC
2087 return FALSE;
2088 }
2089 sections_being_created [shindex] = TRUE;
2090 }
2091
4fbb74a6
AM
2092 hdr = elf_elfsections (abfd)[shindex];
2093 ehdr = elf_elfheader (abfd);
2094 name = bfd_elf_string_from_elf_section (abfd, ehdr->e_shstrndx,
1b3a8575 2095 hdr->sh_name);
933d961a 2096 if (name == NULL)
bf67003b 2097 goto fail;
252b5132 2098
4fbb74a6 2099 bed = get_elf_backend_data (abfd);
252b5132
RH
2100 switch (hdr->sh_type)
2101 {
2102 case SHT_NULL:
2103 /* Inactive section. Throw it away. */
bf67003b 2104 goto success;
252b5132 2105
bf67003b
NC
2106 case SHT_PROGBITS: /* Normal section with contents. */
2107 case SHT_NOBITS: /* .bss section. */
2108 case SHT_HASH: /* .hash section. */
2109 case SHT_NOTE: /* .note section. */
25e27870
L
2110 case SHT_INIT_ARRAY: /* .init_array section. */
2111 case SHT_FINI_ARRAY: /* .fini_array section. */
2112 case SHT_PREINIT_ARRAY: /* .preinit_array section. */
7f1204bb 2113 case SHT_GNU_LIBLIST: /* .gnu.liblist section. */
fdc90cb4 2114 case SHT_GNU_HASH: /* .gnu.hash section. */
bf67003b
NC
2115 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2116 goto success;
252b5132 2117
797fc050 2118 case SHT_DYNAMIC: /* Dynamic linking information. */
6dc132d9 2119 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
bf67003b
NC
2120 goto fail;
2121
cfcac11d
NC
2122 if (hdr->sh_link > elf_numsections (abfd))
2123 {
caa83f8b 2124 /* PR 10478: Accept Solaris binaries with a sh_link
cfcac11d
NC
2125 field set to SHN_BEFORE or SHN_AFTER. */
2126 switch (bfd_get_arch (abfd))
2127 {
caa83f8b 2128 case bfd_arch_i386:
cfcac11d
NC
2129 case bfd_arch_sparc:
2130 if (hdr->sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
2131 || hdr->sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
2132 break;
2133 /* Otherwise fall through. */
2134 default:
bf67003b 2135 goto fail;
cfcac11d
NC
2136 }
2137 }
2138 else if (elf_elfsections (abfd)[hdr->sh_link] == NULL)
bf67003b 2139 goto fail;
cfcac11d 2140 else if (elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_STRTAB)
797fc050
AM
2141 {
2142 Elf_Internal_Shdr *dynsymhdr;
2143
2144 /* The shared libraries distributed with hpux11 have a bogus
2145 sh_link field for the ".dynamic" section. Find the
2146 string table for the ".dynsym" section instead. */
2147 if (elf_dynsymtab (abfd) != 0)
2148 {
2149 dynsymhdr = elf_elfsections (abfd)[elf_dynsymtab (abfd)];
2150 hdr->sh_link = dynsymhdr->sh_link;
2151 }
2152 else
2153 {
2154 unsigned int i, num_sec;
2155
2156 num_sec = elf_numsections (abfd);
2157 for (i = 1; i < num_sec; i++)
2158 {
2159 dynsymhdr = elf_elfsections (abfd)[i];
2160 if (dynsymhdr->sh_type == SHT_DYNSYM)
2161 {
2162 hdr->sh_link = dynsymhdr->sh_link;
2163 break;
2164 }
2165 }
2166 }
2167 }
bf67003b 2168 goto success;
797fc050 2169
bf67003b 2170 case SHT_SYMTAB: /* A symbol table. */
252b5132 2171 if (elf_onesymtab (abfd) == shindex)
bf67003b 2172 goto success;
252b5132 2173
a50b2160 2174 if (hdr->sh_entsize != bed->s->sizeof_sym)
bf67003b
NC
2175 goto fail;
2176
3337c1e5 2177 if (hdr->sh_info * hdr->sh_entsize > hdr->sh_size)
eee3b786
AM
2178 {
2179 if (hdr->sh_size != 0)
bf67003b 2180 goto fail;
eee3b786
AM
2181 /* Some assemblers erroneously set sh_info to one with a
2182 zero sh_size. ld sees this as a global symbol count
2183 of (unsigned) -1. Fix it here. */
2184 hdr->sh_info = 0;
bf67003b 2185 goto success;
eee3b786 2186 }
bf67003b 2187
16ad13ec
NC
2188 /* PR 18854: A binary might contain more than one symbol table.
2189 Unusual, but possible. Warn, but continue. */
2190 if (elf_onesymtab (abfd) != 0)
2191 {
4eca0228 2192 _bfd_error_handler
695344c0 2193 /* xgettext:c-format */
871b3ab2 2194 (_("%pB: warning: multiple symbol tables detected"
63a5468a 2195 " - ignoring the table in section %u"),
16ad13ec
NC
2196 abfd, shindex);
2197 goto success;
2198 }
252b5132 2199 elf_onesymtab (abfd) = shindex;
6a40cf0c
NC
2200 elf_symtab_hdr (abfd) = *hdr;
2201 elf_elfsections (abfd)[shindex] = hdr = & elf_symtab_hdr (abfd);
252b5132
RH
2202 abfd->flags |= HAS_SYMS;
2203
2204 /* Sometimes a shared object will map in the symbol table. If
08a40648
AM
2205 SHF_ALLOC is set, and this is a shared object, then we also
2206 treat this section as a BFD section. We can not base the
2207 decision purely on SHF_ALLOC, because that flag is sometimes
2208 set in a relocatable object file, which would confuse the
2209 linker. */
252b5132
RH
2210 if ((hdr->sh_flags & SHF_ALLOC) != 0
2211 && (abfd->flags & DYNAMIC) != 0
6dc132d9
L
2212 && ! _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2213 shindex))
bf67003b 2214 goto fail;
252b5132 2215
1b3a8575
AM
2216 /* Go looking for SHT_SYMTAB_SHNDX too, since if there is one we
2217 can't read symbols without that section loaded as well. It
2218 is most likely specified by the next section header. */
6a40cf0c
NC
2219 {
2220 elf_section_list * entry;
2221 unsigned int i, num_sec;
1b3a8575 2222
6a40cf0c
NC
2223 for (entry = elf_symtab_shndx_list (abfd); entry != NULL; entry = entry->next)
2224 if (entry->hdr.sh_link == shindex)
2225 goto success;
2226
2227 num_sec = elf_numsections (abfd);
2228 for (i = shindex + 1; i < num_sec; i++)
2229 {
2230 Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
2231
2232 if (hdr2->sh_type == SHT_SYMTAB_SHNDX
2233 && hdr2->sh_link == shindex)
2234 break;
2235 }
2236
2237 if (i == num_sec)
2238 for (i = 1; i < shindex; i++)
1b3a8575
AM
2239 {
2240 Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
6a40cf0c 2241
1b3a8575
AM
2242 if (hdr2->sh_type == SHT_SYMTAB_SHNDX
2243 && hdr2->sh_link == shindex)
2244 break;
2245 }
6a40cf0c
NC
2246
2247 if (i != shindex)
2248 ret = bfd_section_from_shdr (abfd, i);
2249 /* else FIXME: we have failed to find the symbol table - should we issue an error ? */
2250 goto success;
2251 }
252b5132 2252
bf67003b 2253 case SHT_DYNSYM: /* A dynamic symbol table. */
252b5132 2254 if (elf_dynsymtab (abfd) == shindex)
bf67003b 2255 goto success;
252b5132 2256
a50b2160 2257 if (hdr->sh_entsize != bed->s->sizeof_sym)
bf67003b
NC
2258 goto fail;
2259
eee3b786
AM
2260 if (hdr->sh_info * hdr->sh_entsize > hdr->sh_size)
2261 {
2262 if (hdr->sh_size != 0)
bf67003b
NC
2263 goto fail;
2264
eee3b786
AM
2265 /* Some linkers erroneously set sh_info to one with a
2266 zero sh_size. ld sees this as a global symbol count
2267 of (unsigned) -1. Fix it here. */
2268 hdr->sh_info = 0;
bf67003b 2269 goto success;
eee3b786 2270 }
bf67003b 2271
16ad13ec
NC
2272 /* PR 18854: A binary might contain more than one dynamic symbol table.
2273 Unusual, but possible. Warn, but continue. */
2274 if (elf_dynsymtab (abfd) != 0)
2275 {
4eca0228 2276 _bfd_error_handler
695344c0 2277 /* xgettext:c-format */
871b3ab2 2278 (_("%pB: warning: multiple dynamic symbol tables detected"
63a5468a 2279 " - ignoring the table in section %u"),
16ad13ec
NC
2280 abfd, shindex);
2281 goto success;
2282 }
252b5132
RH
2283 elf_dynsymtab (abfd) = shindex;
2284 elf_tdata (abfd)->dynsymtab_hdr = *hdr;
2285 elf_elfsections (abfd)[shindex] = hdr = &elf_tdata (abfd)->dynsymtab_hdr;
2286 abfd->flags |= HAS_SYMS;
2287
2288 /* Besides being a symbol table, we also treat this as a regular
2289 section, so that objcopy can handle it. */
bf67003b
NC
2290 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2291 goto success;
252b5132 2292
bf67003b 2293 case SHT_SYMTAB_SHNDX: /* Symbol section indices when >64k sections. */
6a40cf0c
NC
2294 {
2295 elf_section_list * entry;
9ad5cbcf 2296
6a40cf0c
NC
2297 for (entry = elf_symtab_shndx_list (abfd); entry != NULL; entry = entry->next)
2298 if (entry->ndx == shindex)
2299 goto success;
07d6d2b8 2300
7a6e0d89 2301 entry = bfd_alloc (abfd, sizeof (*entry));
6a40cf0c
NC
2302 if (entry == NULL)
2303 goto fail;
2304 entry->ndx = shindex;
2305 entry->hdr = * hdr;
2306 entry->next = elf_symtab_shndx_list (abfd);
2307 elf_symtab_shndx_list (abfd) = entry;
2308 elf_elfsections (abfd)[shindex] = & entry->hdr;
2309 goto success;
2310 }
9ad5cbcf 2311
bf67003b 2312 case SHT_STRTAB: /* A string table. */
252b5132 2313 if (hdr->bfd_section != NULL)
bf67003b
NC
2314 goto success;
2315
252b5132
RH
2316 if (ehdr->e_shstrndx == shindex)
2317 {
2318 elf_tdata (abfd)->shstrtab_hdr = *hdr;
2319 elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->shstrtab_hdr;
bf67003b 2320 goto success;
252b5132 2321 }
bf67003b 2322
1b3a8575
AM
2323 if (elf_elfsections (abfd)[elf_onesymtab (abfd)]->sh_link == shindex)
2324 {
2325 symtab_strtab:
2326 elf_tdata (abfd)->strtab_hdr = *hdr;
2327 elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->strtab_hdr;
bf67003b 2328 goto success;
1b3a8575 2329 }
bf67003b 2330
1b3a8575
AM
2331 if (elf_elfsections (abfd)[elf_dynsymtab (abfd)]->sh_link == shindex)
2332 {
2333 dynsymtab_strtab:
2334 elf_tdata (abfd)->dynstrtab_hdr = *hdr;
2335 hdr = &elf_tdata (abfd)->dynstrtab_hdr;
2336 elf_elfsections (abfd)[shindex] = hdr;
2337 /* We also treat this as a regular section, so that objcopy
2338 can handle it. */
bf67003b
NC
2339 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2340 shindex);
2341 goto success;
1b3a8575 2342 }
252b5132 2343
1b3a8575
AM
2344 /* If the string table isn't one of the above, then treat it as a
2345 regular section. We need to scan all the headers to be sure,
2346 just in case this strtab section appeared before the above. */
2347 if (elf_onesymtab (abfd) == 0 || elf_dynsymtab (abfd) == 0)
2348 {
2349 unsigned int i, num_sec;
252b5132 2350
1b3a8575
AM
2351 num_sec = elf_numsections (abfd);
2352 for (i = 1; i < num_sec; i++)
2353 {
2354 Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
2355 if (hdr2->sh_link == shindex)
2356 {
933d961a
JJ
2357 /* Prevent endless recursion on broken objects. */
2358 if (i == shindex)
bf67003b 2359 goto fail;
1b3a8575 2360 if (! bfd_section_from_shdr (abfd, i))
bf67003b 2361 goto fail;
1b3a8575
AM
2362 if (elf_onesymtab (abfd) == i)
2363 goto symtab_strtab;
2364 if (elf_dynsymtab (abfd) == i)
2365 goto dynsymtab_strtab;
2366 }
2367 }
2368 }
bf67003b
NC
2369 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2370 goto success;
252b5132
RH
2371
2372 case SHT_REL:
2373 case SHT_RELA:
2374 /* *These* do a lot of work -- but build no sections! */
2375 {
2376 asection *target_sect;
d4730f92 2377 Elf_Internal_Shdr *hdr2, **p_hdr;
9ad5cbcf 2378 unsigned int num_sec = elf_numsections (abfd);
d4730f92 2379 struct bfd_elf_section_data *esdt;
252b5132 2380
aa2ca951
JJ
2381 if (hdr->sh_entsize
2382 != (bfd_size_type) (hdr->sh_type == SHT_REL
a50b2160 2383 ? bed->s->sizeof_rel : bed->s->sizeof_rela))
bf67003b 2384 goto fail;
a50b2160 2385
03ae5f59 2386 /* Check for a bogus link to avoid crashing. */
4fbb74a6 2387 if (hdr->sh_link >= num_sec)
03ae5f59 2388 {
4eca0228 2389 _bfd_error_handler
695344c0 2390 /* xgettext:c-format */
871b3ab2 2391 (_("%pB: invalid link %u for reloc section %s (index %u)"),
4eca0228 2392 abfd, hdr->sh_link, name, shindex);
bf67003b
NC
2393 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2394 shindex);
2395 goto success;
03ae5f59
ILT
2396 }
2397
252b5132
RH
2398 /* For some incomprehensible reason Oracle distributes
2399 libraries for Solaris in which some of the objects have
2400 bogus sh_link fields. It would be nice if we could just
2401 reject them, but, unfortunately, some people need to use
2402 them. We scan through the section headers; if we find only
2403 one suitable symbol table, we clobber the sh_link to point
83b89087
L
2404 to it. I hope this doesn't break anything.
2405
2406 Don't do it on executable nor shared library. */
2407 if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0
2408 && elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_SYMTAB
252b5132
RH
2409 && elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_DYNSYM)
2410 {
9ad5cbcf 2411 unsigned int scan;
252b5132
RH
2412 int found;
2413
2414 found = 0;
9ad5cbcf 2415 for (scan = 1; scan < num_sec; scan++)
252b5132
RH
2416 {
2417 if (elf_elfsections (abfd)[scan]->sh_type == SHT_SYMTAB
2418 || elf_elfsections (abfd)[scan]->sh_type == SHT_DYNSYM)
2419 {
2420 if (found != 0)
2421 {
2422 found = 0;
2423 break;
2424 }
2425 found = scan;
2426 }
2427 }
2428 if (found != 0)
2429 hdr->sh_link = found;
2430 }
2431
2432 /* Get the symbol table. */
1b3a8575
AM
2433 if ((elf_elfsections (abfd)[hdr->sh_link]->sh_type == SHT_SYMTAB
2434 || elf_elfsections (abfd)[hdr->sh_link]->sh_type == SHT_DYNSYM)
252b5132 2435 && ! bfd_section_from_shdr (abfd, hdr->sh_link))
bf67003b 2436 goto fail;
252b5132 2437
a4bcd733
AM
2438 /* If this is an alloc section in an executable or shared
2439 library, or the reloc section does not use the main symbol
2440 table we don't treat it as a reloc section. BFD can't
2441 adequately represent such a section, so at least for now,
2442 we don't try. We just present it as a normal section. We
2443 also can't use it as a reloc section if it points to the
2444 null section, an invalid section, another reloc section, or
2445 its sh_link points to the null section. */
2446 if (((abfd->flags & (DYNAMIC | EXEC_P)) != 0
2447 && (hdr->sh_flags & SHF_ALLOC) != 0)
83b89087 2448 || hdr->sh_link == SHN_UNDEF
a4bcd733 2449 || hdr->sh_link != elf_onesymtab (abfd)
185ef66d 2450 || hdr->sh_info == SHN_UNDEF
185ef66d
AM
2451 || hdr->sh_info >= num_sec
2452 || elf_elfsections (abfd)[hdr->sh_info]->sh_type == SHT_REL
2453 || elf_elfsections (abfd)[hdr->sh_info]->sh_type == SHT_RELA)
bf67003b
NC
2454 {
2455 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2456 shindex);
2457 goto success;
2458 }
252b5132
RH
2459
2460 if (! bfd_section_from_shdr (abfd, hdr->sh_info))
bf67003b
NC
2461 goto fail;
2462
252b5132
RH
2463 target_sect = bfd_section_from_elf_index (abfd, hdr->sh_info);
2464 if (target_sect == NULL)
bf67003b 2465 goto fail;
252b5132 2466
d4730f92
BS
2467 esdt = elf_section_data (target_sect);
2468 if (hdr->sh_type == SHT_RELA)
2469 p_hdr = &esdt->rela.hdr;
252b5132 2470 else
d4730f92
BS
2471 p_hdr = &esdt->rel.hdr;
2472
a7ba3896
NC
2473 /* PR 17512: file: 0b4f81b7.
2474 Also see PR 24456, for a file which deliberately has two reloc
2475 sections. */
06614111 2476 if (*p_hdr != NULL)
a7ba3896
NC
2477 {
2478 _bfd_error_handler
2479 /* xgettext:c-format */
2480 (_("%pB: warning: multiple relocation sections for section %pA \
2481found - ignoring all but the first"),
2482 abfd, target_sect);
2483 goto success;
2484 }
ef53be89 2485 hdr2 = (Elf_Internal_Shdr *) bfd_alloc (abfd, sizeof (*hdr2));
d4730f92 2486 if (hdr2 == NULL)
bf67003b 2487 goto fail;
252b5132 2488 *hdr2 = *hdr;
d4730f92 2489 *p_hdr = hdr2;
252b5132 2490 elf_elfsections (abfd)[shindex] = hdr2;
056bafd4
MR
2491 target_sect->reloc_count += (NUM_SHDR_ENTRIES (hdr)
2492 * bed->s->int_rels_per_ext_rel);
252b5132
RH
2493 target_sect->flags |= SEC_RELOC;
2494 target_sect->relocation = NULL;
2495 target_sect->rel_filepos = hdr->sh_offset;
bf572ba0
MM
2496 /* In the section to which the relocations apply, mark whether
2497 its relocations are of the REL or RELA variety. */
72730e0c 2498 if (hdr->sh_size != 0)
d4730f92
BS
2499 {
2500 if (hdr->sh_type == SHT_RELA)
2501 target_sect->use_rela_p = 1;
2502 }
252b5132 2503 abfd->flags |= HAS_RELOC;
bf67003b 2504 goto success;
252b5132 2505 }
252b5132
RH
2506
2507 case SHT_GNU_verdef:
2508 elf_dynverdef (abfd) = shindex;
2509 elf_tdata (abfd)->dynverdef_hdr = *hdr;
bf67003b
NC
2510 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2511 goto success;
252b5132
RH
2512
2513 case SHT_GNU_versym:
a50b2160 2514 if (hdr->sh_entsize != sizeof (Elf_External_Versym))
bf67003b
NC
2515 goto fail;
2516
252b5132
RH
2517 elf_dynversym (abfd) = shindex;
2518 elf_tdata (abfd)->dynversym_hdr = *hdr;
bf67003b
NC
2519 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2520 goto success;
252b5132
RH
2521
2522 case SHT_GNU_verneed:
2523 elf_dynverref (abfd) = shindex;
2524 elf_tdata (abfd)->dynverref_hdr = *hdr;
bf67003b
NC
2525 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2526 goto success;
252b5132
RH
2527
2528 case SHT_SHLIB:
bf67003b 2529 goto success;
252b5132 2530
dbb410c3 2531 case SHT_GROUP:
44534af3 2532 if (! IS_VALID_GROUP_SECTION_HEADER (hdr, GRP_ENTRY_SIZE))
bf67003b
NC
2533 goto fail;
2534
6dc132d9 2535 if (!_bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
bf67003b
NC
2536 goto fail;
2537
bf67003b 2538 goto success;
dbb410c3 2539
252b5132 2540 default:
104d59d1
JM
2541 /* Possibly an attributes section. */
2542 if (hdr->sh_type == SHT_GNU_ATTRIBUTES
2543 || hdr->sh_type == bed->obj_attrs_section_type)
2544 {
2545 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
bf67003b 2546 goto fail;
104d59d1 2547 _bfd_elf_parse_attributes (abfd, hdr);
bf67003b 2548 goto success;
104d59d1
JM
2549 }
2550
252b5132 2551 /* Check for any processor-specific section types. */
3eb70a79 2552 if (bed->elf_backend_section_from_shdr (abfd, hdr, name, shindex))
bf67003b 2553 goto success;
3eb70a79
L
2554
2555 if (hdr->sh_type >= SHT_LOUSER && hdr->sh_type <= SHT_HIUSER)
2556 {
2557 if ((hdr->sh_flags & SHF_ALLOC) != 0)
2558 /* FIXME: How to properly handle allocated section reserved
2559 for applications? */
4eca0228 2560 _bfd_error_handler
695344c0 2561 /* xgettext:c-format */
871b3ab2 2562 (_("%pB: unknown type [%#x] section `%s'"),
76cfced5 2563 abfd, hdr->sh_type, name);
3eb70a79 2564 else
bf67003b
NC
2565 {
2566 /* Allow sections reserved for applications. */
2567 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2568 shindex);
2569 goto success;
2570 }
3eb70a79
L
2571 }
2572 else if (hdr->sh_type >= SHT_LOPROC
2573 && hdr->sh_type <= SHT_HIPROC)
2574 /* FIXME: We should handle this section. */
4eca0228 2575 _bfd_error_handler
695344c0 2576 /* xgettext:c-format */
871b3ab2 2577 (_("%pB: unknown type [%#x] section `%s'"),
76cfced5 2578 abfd, hdr->sh_type, name);
3eb70a79 2579 else if (hdr->sh_type >= SHT_LOOS && hdr->sh_type <= SHT_HIOS)
ff15b240
NC
2580 {
2581 /* Unrecognised OS-specific sections. */
2582 if ((hdr->sh_flags & SHF_OS_NONCONFORMING) != 0)
2583 /* SHF_OS_NONCONFORMING indicates that special knowledge is
08a40648 2584 required to correctly process the section and the file should
ff15b240 2585 be rejected with an error message. */
4eca0228 2586 _bfd_error_handler
695344c0 2587 /* xgettext:c-format */
871b3ab2 2588 (_("%pB: unknown type [%#x] section `%s'"),
76cfced5 2589 abfd, hdr->sh_type, name);
ff15b240 2590 else
bf67003b
NC
2591 {
2592 /* Otherwise it should be processed. */
2593 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2594 goto success;
2595 }
ff15b240 2596 }
3eb70a79
L
2597 else
2598 /* FIXME: We should handle this section. */
4eca0228 2599 _bfd_error_handler
695344c0 2600 /* xgettext:c-format */
871b3ab2 2601 (_("%pB: unknown type [%#x] section `%s'"),
76cfced5 2602 abfd, hdr->sh_type, name);
3eb70a79 2603
bf67003b 2604 goto fail;
252b5132
RH
2605 }
2606
bf67003b
NC
2607 fail:
2608 ret = FALSE;
2609 success:
e5b470e2 2610 if (sections_being_created && sections_being_created_abfd == abfd)
bf67003b
NC
2611 sections_being_created [shindex] = FALSE;
2612 if (-- nesting == 0)
5a4b0ccc
NC
2613 {
2614 sections_being_created = NULL;
2615 sections_being_created_abfd = abfd;
2616 }
bf67003b 2617 return ret;
252b5132
RH
2618}
2619
87d72d41 2620/* Return the local symbol specified by ABFD, R_SYMNDX. */
ec338859 2621
87d72d41
AM
2622Elf_Internal_Sym *
2623bfd_sym_from_r_symndx (struct sym_cache *cache,
2624 bfd *abfd,
2625 unsigned long r_symndx)
ec338859 2626{
ec338859
AM
2627 unsigned int ent = r_symndx % LOCAL_SYM_CACHE_SIZE;
2628
a5d1b3b5
AM
2629 if (cache->abfd != abfd || cache->indx[ent] != r_symndx)
2630 {
2631 Elf_Internal_Shdr *symtab_hdr;
2632 unsigned char esym[sizeof (Elf64_External_Sym)];
2633 Elf_External_Sym_Shndx eshndx;
ec338859 2634
a5d1b3b5
AM
2635 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2636 if (bfd_elf_get_elf_syms (abfd, symtab_hdr, 1, r_symndx,
87d72d41 2637 &cache->sym[ent], esym, &eshndx) == NULL)
a5d1b3b5 2638 return NULL;
9ad5cbcf 2639
a5d1b3b5
AM
2640 if (cache->abfd != abfd)
2641 {
2642 memset (cache->indx, -1, sizeof (cache->indx));
2643 cache->abfd = abfd;
2644 }
2645 cache->indx[ent] = r_symndx;
ec338859 2646 }
a5d1b3b5 2647
87d72d41 2648 return &cache->sym[ent];
ec338859
AM
2649}
2650
252b5132
RH
2651/* Given an ELF section number, retrieve the corresponding BFD
2652 section. */
2653
2654asection *
91d6fa6a 2655bfd_section_from_elf_index (bfd *abfd, unsigned int sec_index)
252b5132 2656{
91d6fa6a 2657 if (sec_index >= elf_numsections (abfd))
252b5132 2658 return NULL;
91d6fa6a 2659 return elf_elfsections (abfd)[sec_index]->bfd_section;
252b5132
RH
2660}
2661
b35d266b 2662static const struct bfd_elf_special_section special_sections_b[] =
2f89ff8d 2663{
0112cd26 2664 { STRING_COMMA_LEN (".bss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
07d6d2b8 2665 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2666};
2667
b35d266b 2668static const struct bfd_elf_special_section special_sections_c[] =
7f4d3958 2669{
0112cd26 2670 { STRING_COMMA_LEN (".comment"), 0, SHT_PROGBITS, 0 },
1ff6de03 2671 { STRING_COMMA_LEN (".ctf"), 0, SHT_PROGBITS, 0 },
07d6d2b8 2672 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2673};
2674
b35d266b 2675static const struct bfd_elf_special_section special_sections_d[] =
7f4d3958 2676{
07d6d2b8
AM
2677 { STRING_COMMA_LEN (".data"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2678 { STRING_COMMA_LEN (".data1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
a9a72a65
DE
2679 /* There are more DWARF sections than these, but they needn't be added here
2680 unless you have to cope with broken compilers that don't emit section
2681 attributes or you want to help the user writing assembler. */
07d6d2b8
AM
2682 { STRING_COMMA_LEN (".debug"), 0, SHT_PROGBITS, 0 },
2683 { STRING_COMMA_LEN (".debug_line"), 0, SHT_PROGBITS, 0 },
2684 { STRING_COMMA_LEN (".debug_info"), 0, SHT_PROGBITS, 0 },
2685 { STRING_COMMA_LEN (".debug_abbrev"), 0, SHT_PROGBITS, 0 },
0112cd26 2686 { STRING_COMMA_LEN (".debug_aranges"), 0, SHT_PROGBITS, 0 },
07d6d2b8
AM
2687 { STRING_COMMA_LEN (".dynamic"), 0, SHT_DYNAMIC, SHF_ALLOC },
2688 { STRING_COMMA_LEN (".dynstr"), 0, SHT_STRTAB, SHF_ALLOC },
2689 { STRING_COMMA_LEN (".dynsym"), 0, SHT_DYNSYM, SHF_ALLOC },
2690 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2691};
2692
b35d266b 2693static const struct bfd_elf_special_section special_sections_f[] =
7f4d3958 2694{
07d6d2b8 2695 { STRING_COMMA_LEN (".fini"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
6f9dbcd4 2696 { STRING_COMMA_LEN (".fini_array"), -2, SHT_FINI_ARRAY, SHF_ALLOC + SHF_WRITE },
07d6d2b8 2697 { NULL, 0 , 0, 0, 0 }
7f4d3958
L
2698};
2699
b35d266b 2700static const struct bfd_elf_special_section special_sections_g[] =
7f4d3958 2701{
0112cd26 2702 { STRING_COMMA_LEN (".gnu.linkonce.b"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
07d6d2b8
AM
2703 { STRING_COMMA_LEN (".gnu.lto_"), -1, SHT_PROGBITS, SHF_EXCLUDE },
2704 { STRING_COMMA_LEN (".got"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2705 { STRING_COMMA_LEN (".gnu.version"), 0, SHT_GNU_versym, 0 },
0112cd26
NC
2706 { STRING_COMMA_LEN (".gnu.version_d"), 0, SHT_GNU_verdef, 0 },
2707 { STRING_COMMA_LEN (".gnu.version_r"), 0, SHT_GNU_verneed, 0 },
07d6d2b8
AM
2708 { STRING_COMMA_LEN (".gnu.liblist"), 0, SHT_GNU_LIBLIST, SHF_ALLOC },
2709 { STRING_COMMA_LEN (".gnu.conflict"), 0, SHT_RELA, SHF_ALLOC },
2710 { STRING_COMMA_LEN (".gnu.hash"), 0, SHT_GNU_HASH, SHF_ALLOC },
2711 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2712};
2713
b35d266b 2714static const struct bfd_elf_special_section special_sections_h[] =
7f4d3958 2715{
07d6d2b8
AM
2716 { STRING_COMMA_LEN (".hash"), 0, SHT_HASH, SHF_ALLOC },
2717 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2718};
2719
b35d266b 2720static const struct bfd_elf_special_section special_sections_i[] =
7f4d3958 2721{
07d6d2b8 2722 { STRING_COMMA_LEN (".init"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
6f9dbcd4 2723 { STRING_COMMA_LEN (".init_array"), -2, SHT_INIT_ARRAY, SHF_ALLOC + SHF_WRITE },
07d6d2b8
AM
2724 { STRING_COMMA_LEN (".interp"), 0, SHT_PROGBITS, 0 },
2725 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2726};
2727
b35d266b 2728static const struct bfd_elf_special_section special_sections_l[] =
7f4d3958 2729{
0112cd26 2730 { STRING_COMMA_LEN (".line"), 0, SHT_PROGBITS, 0 },
07d6d2b8 2731 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2732};
2733
b35d266b 2734static const struct bfd_elf_special_section special_sections_n[] =
7f4d3958 2735{
0112cd26 2736 { STRING_COMMA_LEN (".note.GNU-stack"), 0, SHT_PROGBITS, 0 },
07d6d2b8
AM
2737 { STRING_COMMA_LEN (".note"), -1, SHT_NOTE, 0 },
2738 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2739};
2740
b35d266b 2741static const struct bfd_elf_special_section special_sections_p[] =
7f4d3958 2742{
6f9dbcd4 2743 { STRING_COMMA_LEN (".preinit_array"), -2, SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_WRITE },
07d6d2b8
AM
2744 { STRING_COMMA_LEN (".plt"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2745 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2746};
2747
b35d266b 2748static const struct bfd_elf_special_section special_sections_r[] =
7f4d3958 2749{
0112cd26
NC
2750 { STRING_COMMA_LEN (".rodata"), -2, SHT_PROGBITS, SHF_ALLOC },
2751 { STRING_COMMA_LEN (".rodata1"), 0, SHT_PROGBITS, SHF_ALLOC },
07d6d2b8
AM
2752 { STRING_COMMA_LEN (".rela"), -1, SHT_RELA, 0 },
2753 { STRING_COMMA_LEN (".rel"), -1, SHT_REL, 0 },
2754 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2755};
2756
b35d266b 2757static const struct bfd_elf_special_section special_sections_s[] =
7f4d3958 2758{
0112cd26
NC
2759 { STRING_COMMA_LEN (".shstrtab"), 0, SHT_STRTAB, 0 },
2760 { STRING_COMMA_LEN (".strtab"), 0, SHT_STRTAB, 0 },
2761 { STRING_COMMA_LEN (".symtab"), 0, SHT_SYMTAB, 0 },
60ff4dc4
HPN
2762 /* See struct bfd_elf_special_section declaration for the semantics of
2763 this special case where .prefix_length != strlen (.prefix). */
2764 { ".stabstr", 5, 3, SHT_STRTAB, 0 },
07d6d2b8 2765 { NULL, 0, 0, 0, 0 }
2f89ff8d
L
2766};
2767
b35d266b 2768static const struct bfd_elf_special_section special_sections_t[] =
7f4d3958 2769{
07d6d2b8
AM
2770 { STRING_COMMA_LEN (".text"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2771 { STRING_COMMA_LEN (".tbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
0112cd26 2772 { STRING_COMMA_LEN (".tdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
07d6d2b8 2773 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2774};
2775
1b315056
CS
2776static const struct bfd_elf_special_section special_sections_z[] =
2777{
07d6d2b8
AM
2778 { STRING_COMMA_LEN (".zdebug_line"), 0, SHT_PROGBITS, 0 },
2779 { STRING_COMMA_LEN (".zdebug_info"), 0, SHT_PROGBITS, 0 },
1b315056
CS
2780 { STRING_COMMA_LEN (".zdebug_abbrev"), 0, SHT_PROGBITS, 0 },
2781 { STRING_COMMA_LEN (".zdebug_aranges"), 0, SHT_PROGBITS, 0 },
07d6d2b8 2782 { NULL, 0, 0, 0, 0 }
1b315056
CS
2783};
2784
e4c93b56 2785static const struct bfd_elf_special_section * const special_sections[] =
7f4d3958 2786{
7f4d3958 2787 special_sections_b, /* 'b' */
98ece1b3 2788 special_sections_c, /* 'c' */
7f4d3958
L
2789 special_sections_d, /* 'd' */
2790 NULL, /* 'e' */
2791 special_sections_f, /* 'f' */
2792 special_sections_g, /* 'g' */
2793 special_sections_h, /* 'h' */
2794 special_sections_i, /* 'i' */
2795 NULL, /* 'j' */
2796 NULL, /* 'k' */
2797 special_sections_l, /* 'l' */
2798 NULL, /* 'm' */
2799 special_sections_n, /* 'n' */
2800 NULL, /* 'o' */
2801 special_sections_p, /* 'p' */
2802 NULL, /* 'q' */
2803 special_sections_r, /* 'r' */
2804 special_sections_s, /* 's' */
2805 special_sections_t, /* 't' */
1b315056
CS
2806 NULL, /* 'u' */
2807 NULL, /* 'v' */
2808 NULL, /* 'w' */
2809 NULL, /* 'x' */
2810 NULL, /* 'y' */
2811 special_sections_z /* 'z' */
7f4d3958
L
2812};
2813
551b43fd
AM
2814const struct bfd_elf_special_section *
2815_bfd_elf_get_special_section (const char *name,
2816 const struct bfd_elf_special_section *spec,
2817 unsigned int rela)
2f89ff8d
L
2818{
2819 int i;
7f4d3958 2820 int len;
7f4d3958 2821
551b43fd 2822 len = strlen (name);
7f4d3958 2823
551b43fd 2824 for (i = 0; spec[i].prefix != NULL; i++)
7dcb9820
AM
2825 {
2826 int suffix_len;
551b43fd 2827 int prefix_len = spec[i].prefix_length;
7dcb9820
AM
2828
2829 if (len < prefix_len)
2830 continue;
551b43fd 2831 if (memcmp (name, spec[i].prefix, prefix_len) != 0)
7dcb9820
AM
2832 continue;
2833
551b43fd 2834 suffix_len = spec[i].suffix_length;
7dcb9820
AM
2835 if (suffix_len <= 0)
2836 {
2837 if (name[prefix_len] != 0)
2838 {
2839 if (suffix_len == 0)
2840 continue;
2841 if (name[prefix_len] != '.'
2842 && (suffix_len == -2
551b43fd 2843 || (rela && spec[i].type == SHT_REL)))
7dcb9820
AM
2844 continue;
2845 }
2846 }
2847 else
2848 {
2849 if (len < prefix_len + suffix_len)
2850 continue;
2851 if (memcmp (name + len - suffix_len,
551b43fd 2852 spec[i].prefix + prefix_len,
7dcb9820
AM
2853 suffix_len) != 0)
2854 continue;
2855 }
551b43fd 2856 return &spec[i];
7dcb9820 2857 }
2f89ff8d
L
2858
2859 return NULL;
2860}
2861
7dcb9820 2862const struct bfd_elf_special_section *
29ef7005 2863_bfd_elf_get_sec_type_attr (bfd *abfd, asection *sec)
2f89ff8d 2864{
551b43fd
AM
2865 int i;
2866 const struct bfd_elf_special_section *spec;
29ef7005 2867 const struct elf_backend_data *bed;
2f89ff8d
L
2868
2869 /* See if this is one of the special sections. */
551b43fd
AM
2870 if (sec->name == NULL)
2871 return NULL;
2f89ff8d 2872
29ef7005
L
2873 bed = get_elf_backend_data (abfd);
2874 spec = bed->special_sections;
2875 if (spec)
2876 {
2877 spec = _bfd_elf_get_special_section (sec->name,
2878 bed->special_sections,
2879 sec->use_rela_p);
2880 if (spec != NULL)
2881 return spec;
2882 }
2883
551b43fd
AM
2884 if (sec->name[0] != '.')
2885 return NULL;
2f89ff8d 2886
551b43fd 2887 i = sec->name[1] - 'b';
1b315056 2888 if (i < 0 || i > 'z' - 'b')
551b43fd
AM
2889 return NULL;
2890
2891 spec = special_sections[i];
2f89ff8d 2892
551b43fd
AM
2893 if (spec == NULL)
2894 return NULL;
2895
2896 return _bfd_elf_get_special_section (sec->name, spec, sec->use_rela_p);
2f89ff8d
L
2897}
2898
b34976b6 2899bfd_boolean
217aa764 2900_bfd_elf_new_section_hook (bfd *abfd, asection *sec)
252b5132
RH
2901{
2902 struct bfd_elf_section_data *sdata;
551b43fd 2903 const struct elf_backend_data *bed;
7dcb9820 2904 const struct bfd_elf_special_section *ssect;
252b5132 2905
f0abc2a1
AM
2906 sdata = (struct bfd_elf_section_data *) sec->used_by_bfd;
2907 if (sdata == NULL)
2908 {
a50b1753 2909 sdata = (struct bfd_elf_section_data *) bfd_zalloc (abfd,
07d6d2b8 2910 sizeof (*sdata));
f0abc2a1
AM
2911 if (sdata == NULL)
2912 return FALSE;
217aa764 2913 sec->used_by_bfd = sdata;
f0abc2a1 2914 }
bf572ba0 2915
551b43fd
AM
2916 /* Indicate whether or not this section should use RELA relocations. */
2917 bed = get_elf_backend_data (abfd);
2918 sec->use_rela_p = bed->default_use_rela_p;
2919
e843e0f8
L
2920 /* When we read a file, we don't need to set ELF section type and
2921 flags. They will be overridden in _bfd_elf_make_section_from_shdr
2922 anyway. We will set ELF section type and flags for all linker
2923 created sections. If user specifies BFD section flags, we will
2924 set ELF section type and flags based on BFD section flags in
02ecc8e9
L
2925 elf_fake_sections. Special handling for .init_array/.fini_array
2926 output sections since they may contain .ctors/.dtors input
2927 sections. We don't want _bfd_elf_init_private_section_data to
2928 copy ELF section type from .ctors/.dtors input sections. */
2929 if (abfd->direction != read_direction
3496cb2a 2930 || (sec->flags & SEC_LINKER_CREATED) != 0)
2f89ff8d 2931 {
551b43fd 2932 ssect = (*bed->get_sec_type_attr) (abfd, sec);
02ecc8e9
L
2933 if (ssect != NULL
2934 && (!sec->flags
2935 || (sec->flags & SEC_LINKER_CREATED) != 0
2936 || ssect->type == SHT_INIT_ARRAY
2937 || ssect->type == SHT_FINI_ARRAY))
a31501e9
L
2938 {
2939 elf_section_type (sec) = ssect->type;
2940 elf_section_flags (sec) = ssect->attr;
2941 }
2f89ff8d
L
2942 }
2943
f592407e 2944 return _bfd_generic_new_section_hook (abfd, sec);
252b5132
RH
2945}
2946
2947/* Create a new bfd section from an ELF program header.
2948
2949 Since program segments have no names, we generate a synthetic name
2950 of the form segment<NUM>, where NUM is generally the index in the
2951 program header table. For segments that are split (see below) we
2952 generate the names segment<NUM>a and segment<NUM>b.
2953
2954 Note that some program segments may have a file size that is different than
2955 (less than) the memory size. All this means is that at execution the
2956 system must allocate the amount of memory specified by the memory size,
2957 but only initialize it with the first "file size" bytes read from the
2958 file. This would occur for example, with program segments consisting
2959 of combined data+bss.
2960
2961 To handle the above situation, this routine generates TWO bfd sections
2962 for the single program segment. The first has the length specified by
2963 the file size of the segment, and the second has the length specified
2964 by the difference between the two sizes. In effect, the segment is split
d5191d0c 2965 into its initialized and uninitialized parts.
252b5132
RH
2966
2967 */
2968
b34976b6 2969bfd_boolean
217aa764
AM
2970_bfd_elf_make_section_from_phdr (bfd *abfd,
2971 Elf_Internal_Phdr *hdr,
91d6fa6a 2972 int hdr_index,
a50b1753 2973 const char *type_name)
252b5132
RH
2974{
2975 asection *newsect;
2976 char *name;
2977 char namebuf[64];
d4c88bbb 2978 size_t len;
252b5132
RH
2979 int split;
2980
2981 split = ((hdr->p_memsz > 0)
2982 && (hdr->p_filesz > 0)
2983 && (hdr->p_memsz > hdr->p_filesz));
d5191d0c
AM
2984
2985 if (hdr->p_filesz > 0)
252b5132 2986 {
91d6fa6a 2987 sprintf (namebuf, "%s%d%s", type_name, hdr_index, split ? "a" : "");
d5191d0c 2988 len = strlen (namebuf) + 1;
a50b1753 2989 name = (char *) bfd_alloc (abfd, len);
d5191d0c
AM
2990 if (!name)
2991 return FALSE;
2992 memcpy (name, namebuf, len);
2993 newsect = bfd_make_section (abfd, name);
2994 if (newsect == NULL)
2995 return FALSE;
2996 newsect->vma = hdr->p_vaddr;
2997 newsect->lma = hdr->p_paddr;
2998 newsect->size = hdr->p_filesz;
2999 newsect->filepos = hdr->p_offset;
3000 newsect->flags |= SEC_HAS_CONTENTS;
3001 newsect->alignment_power = bfd_log2 (hdr->p_align);
3002 if (hdr->p_type == PT_LOAD)
252b5132 3003 {
d5191d0c
AM
3004 newsect->flags |= SEC_ALLOC;
3005 newsect->flags |= SEC_LOAD;
3006 if (hdr->p_flags & PF_X)
3007 {
3008 /* FIXME: all we known is that it has execute PERMISSION,
3009 may be data. */
3010 newsect->flags |= SEC_CODE;
3011 }
3012 }
3013 if (!(hdr->p_flags & PF_W))
3014 {
3015 newsect->flags |= SEC_READONLY;
252b5132 3016 }
252b5132
RH
3017 }
3018
d5191d0c 3019 if (hdr->p_memsz > hdr->p_filesz)
252b5132 3020 {
d5191d0c
AM
3021 bfd_vma align;
3022
91d6fa6a 3023 sprintf (namebuf, "%s%d%s", type_name, hdr_index, split ? "b" : "");
d4c88bbb 3024 len = strlen (namebuf) + 1;
a50b1753 3025 name = (char *) bfd_alloc (abfd, len);
252b5132 3026 if (!name)
b34976b6 3027 return FALSE;
d4c88bbb 3028 memcpy (name, namebuf, len);
252b5132
RH
3029 newsect = bfd_make_section (abfd, name);
3030 if (newsect == NULL)
b34976b6 3031 return FALSE;
252b5132
RH
3032 newsect->vma = hdr->p_vaddr + hdr->p_filesz;
3033 newsect->lma = hdr->p_paddr + hdr->p_filesz;
eea6121a 3034 newsect->size = hdr->p_memsz - hdr->p_filesz;
d5191d0c
AM
3035 newsect->filepos = hdr->p_offset + hdr->p_filesz;
3036 align = newsect->vma & -newsect->vma;
3037 if (align == 0 || align > hdr->p_align)
3038 align = hdr->p_align;
3039 newsect->alignment_power = bfd_log2 (align);
252b5132
RH
3040 if (hdr->p_type == PT_LOAD)
3041 {
d5191d0c
AM
3042 /* Hack for gdb. Segments that have not been modified do
3043 not have their contents written to a core file, on the
3044 assumption that a debugger can find the contents in the
3045 executable. We flag this case by setting the fake
3046 section size to zero. Note that "real" bss sections will
3047 always have their contents dumped to the core file. */
3048 if (bfd_get_format (abfd) == bfd_core)
3049 newsect->size = 0;
252b5132
RH
3050 newsect->flags |= SEC_ALLOC;
3051 if (hdr->p_flags & PF_X)
3052 newsect->flags |= SEC_CODE;
3053 }
3054 if (!(hdr->p_flags & PF_W))
3055 newsect->flags |= SEC_READONLY;
3056 }
3057
b34976b6 3058 return TRUE;
252b5132
RH
3059}
3060
864619bb
KS
3061static bfd_boolean
3062_bfd_elf_core_find_build_id (bfd *templ, bfd_vma offset)
3063{
3064 /* The return value is ignored. Build-ids are considered optional. */
3065 if (templ->xvec->flavour == bfd_target_elf_flavour)
3066 return (*get_elf_backend_data (templ)->elf_backend_core_find_build_id)
3067 (templ, offset);
3068 return FALSE;
3069}
3070
b34976b6 3071bfd_boolean
91d6fa6a 3072bfd_section_from_phdr (bfd *abfd, Elf_Internal_Phdr *hdr, int hdr_index)
20cfcaae 3073{
9c5bfbb7 3074 const struct elf_backend_data *bed;
20cfcaae
NC
3075
3076 switch (hdr->p_type)
3077 {
3078 case PT_NULL:
91d6fa6a 3079 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "null");
20cfcaae
NC
3080
3081 case PT_LOAD:
864619bb
KS
3082 if (! _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "load"))
3083 return FALSE;
3084 if (bfd_get_format (abfd) == bfd_core && abfd->build_id == NULL)
3085 _bfd_elf_core_find_build_id (abfd, hdr->p_offset);
3086 return TRUE;
20cfcaae
NC
3087
3088 case PT_DYNAMIC:
91d6fa6a 3089 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "dynamic");
20cfcaae
NC
3090
3091 case PT_INTERP:
91d6fa6a 3092 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "interp");
20cfcaae
NC
3093
3094 case PT_NOTE:
91d6fa6a 3095 if (! _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "note"))
b34976b6 3096 return FALSE;
276da9b3
L
3097 if (! elf_read_notes (abfd, hdr->p_offset, hdr->p_filesz,
3098 hdr->p_align))
b34976b6
AM
3099 return FALSE;
3100 return TRUE;
20cfcaae
NC
3101
3102 case PT_SHLIB:
91d6fa6a 3103 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "shlib");
20cfcaae
NC
3104
3105 case PT_PHDR:
91d6fa6a 3106 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "phdr");
20cfcaae 3107
811072d8 3108 case PT_GNU_EH_FRAME:
91d6fa6a 3109 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index,
811072d8
RM
3110 "eh_frame_hdr");
3111
2b05f1b7 3112 case PT_GNU_STACK:
91d6fa6a 3113 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "stack");
9ee5e499 3114
8c37241b 3115 case PT_GNU_RELRO:
91d6fa6a 3116 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "relro");
8c37241b 3117
20cfcaae 3118 default:
8c1acd09 3119 /* Check for any processor-specific program segment types. */
20cfcaae 3120 bed = get_elf_backend_data (abfd);
91d6fa6a 3121 return bed->elf_backend_section_from_phdr (abfd, hdr, hdr_index, "proc");
20cfcaae
NC
3122 }
3123}
3124
d4730f92
BS
3125/* Return the REL_HDR for SEC, assuming there is only a single one, either
3126 REL or RELA. */
3127
3128Elf_Internal_Shdr *
3129_bfd_elf_single_rel_hdr (asection *sec)
3130{
3131 if (elf_section_data (sec)->rel.hdr)
3132 {
3133 BFD_ASSERT (elf_section_data (sec)->rela.hdr == NULL);
3134 return elf_section_data (sec)->rel.hdr;
3135 }
3136 else
3137 return elf_section_data (sec)->rela.hdr;
3138}
3139
3e19fb8f
L
3140static bfd_boolean
3141_bfd_elf_set_reloc_sh_name (bfd *abfd,
3142 Elf_Internal_Shdr *rel_hdr,
3143 const char *sec_name,
3144 bfd_boolean use_rela_p)
3145{
3146 char *name = (char *) bfd_alloc (abfd,
3147 sizeof ".rela" + strlen (sec_name));
3148 if (name == NULL)
3149 return FALSE;
3150
3151 sprintf (name, "%s%s", use_rela_p ? ".rela" : ".rel", sec_name);
3152 rel_hdr->sh_name =
3153 (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd), name,
3154 FALSE);
3155 if (rel_hdr->sh_name == (unsigned int) -1)
3156 return FALSE;
3157
3158 return TRUE;
3159}
3160
d4730f92
BS
3161/* Allocate and initialize a section-header for a new reloc section,
3162 containing relocations against ASECT. It is stored in RELDATA. If
3163 USE_RELA_P is TRUE, we use RELA relocations; otherwise, we use REL
3164 relocations. */
23bc299b 3165
5d13b3b3 3166static bfd_boolean
217aa764 3167_bfd_elf_init_reloc_shdr (bfd *abfd,
d4730f92 3168 struct bfd_elf_section_reloc_data *reldata,
f6fe1ccd 3169 const char *sec_name,
3e19fb8f
L
3170 bfd_boolean use_rela_p,
3171 bfd_boolean delay_st_name_p)
23bc299b 3172{
d4730f92 3173 Elf_Internal_Shdr *rel_hdr;
9c5bfbb7 3174 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
d4730f92 3175
d4730f92 3176 BFD_ASSERT (reldata->hdr == NULL);
ef53be89 3177 rel_hdr = bfd_zalloc (abfd, sizeof (*rel_hdr));
d4730f92 3178 reldata->hdr = rel_hdr;
23bc299b 3179
3e19fb8f
L
3180 if (delay_st_name_p)
3181 rel_hdr->sh_name = (unsigned int) -1;
3182 else if (!_bfd_elf_set_reloc_sh_name (abfd, rel_hdr, sec_name,
3183 use_rela_p))
b34976b6 3184 return FALSE;
23bc299b
MM
3185 rel_hdr->sh_type = use_rela_p ? SHT_RELA : SHT_REL;
3186 rel_hdr->sh_entsize = (use_rela_p
3187 ? bed->s->sizeof_rela
3188 : bed->s->sizeof_rel);
72de5009 3189 rel_hdr->sh_addralign = (bfd_vma) 1 << bed->s->log_file_align;
28e07a05 3190 rel_hdr->sh_flags = 0;
23bc299b
MM
3191 rel_hdr->sh_addr = 0;
3192 rel_hdr->sh_size = 0;
3193 rel_hdr->sh_offset = 0;
3194
b34976b6 3195 return TRUE;
23bc299b
MM
3196}
3197
94be91de
JB
3198/* Return the default section type based on the passed in section flags. */
3199
3200int
3201bfd_elf_get_default_section_type (flagword flags)
3202{
0e41bebb 3203 if ((flags & (SEC_ALLOC | SEC_IS_COMMON)) != 0
2e76e85a 3204 && (flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
94be91de
JB
3205 return SHT_NOBITS;
3206 return SHT_PROGBITS;
3207}
3208
d4730f92
BS
3209struct fake_section_arg
3210{
3211 struct bfd_link_info *link_info;
3212 bfd_boolean failed;
3213};
3214
252b5132
RH
3215/* Set up an ELF internal section header for a section. */
3216
252b5132 3217static void
d4730f92 3218elf_fake_sections (bfd *abfd, asection *asect, void *fsarg)
252b5132 3219{
d4730f92 3220 struct fake_section_arg *arg = (struct fake_section_arg *)fsarg;
9c5bfbb7 3221 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
d4730f92 3222 struct bfd_elf_section_data *esd = elf_section_data (asect);
252b5132 3223 Elf_Internal_Shdr *this_hdr;
0414f35b 3224 unsigned int sh_type;
0ce398f1 3225 const char *name = asect->name;
3e19fb8f 3226 bfd_boolean delay_st_name_p = FALSE;
252b5132 3227
d4730f92 3228 if (arg->failed)
252b5132
RH
3229 {
3230 /* We already failed; just get out of the bfd_map_over_sections
08a40648 3231 loop. */
252b5132
RH
3232 return;
3233 }
3234
d4730f92 3235 this_hdr = &esd->this_hdr;
252b5132 3236
f6fe1ccd 3237 if (arg->link_info)
0ce398f1 3238 {
f6fe1ccd
L
3239 /* ld: compress DWARF debug sections with names: .debug_*. */
3240 if ((arg->link_info->compress_debug & COMPRESS_DEBUG)
3241 && (asect->flags & SEC_DEBUGGING)
3242 && name[1] == 'd'
3243 && name[6] == '_')
3244 {
3245 /* Set SEC_ELF_COMPRESS to indicate this section should be
3246 compressed. */
3247 asect->flags |= SEC_ELF_COMPRESS;
0ce398f1 3248
dd905818 3249 /* If this section will be compressed, delay adding section
3e19fb8f
L
3250 name to section name section after it is compressed in
3251 _bfd_elf_assign_file_positions_for_non_load. */
3252 delay_st_name_p = TRUE;
f6fe1ccd
L
3253 }
3254 }
3255 else if ((asect->flags & SEC_ELF_RENAME))
3256 {
3257 /* objcopy: rename output DWARF debug section. */
3258 if ((abfd->flags & (BFD_DECOMPRESS | BFD_COMPRESS_GABI)))
3259 {
3260 /* When we decompress or compress with SHF_COMPRESSED,
3261 convert section name from .zdebug_* to .debug_* if
3262 needed. */
3263 if (name[1] == 'z')
3264 {
3265 char *new_name = convert_zdebug_to_debug (abfd, name);
3266 if (new_name == NULL)
3267 {
3268 arg->failed = TRUE;
3269 return;
3270 }
3271 name = new_name;
3272 }
3273 }
3274 else if (asect->compress_status == COMPRESS_SECTION_DONE)
0ce398f1 3275 {
f6fe1ccd
L
3276 /* PR binutils/18087: Compression does not always make a
3277 section smaller. So only rename the section when
3278 compression has actually taken place. If input section
3279 name is .zdebug_*, we should never compress it again. */
3280 char *new_name = convert_debug_to_zdebug (abfd, name);
0ce398f1
L
3281 if (new_name == NULL)
3282 {
3283 arg->failed = TRUE;
3284 return;
3285 }
f6fe1ccd
L
3286 BFD_ASSERT (name[1] != 'z');
3287 name = new_name;
0ce398f1
L
3288 }
3289 }
3290
3e19fb8f
L
3291 if (delay_st_name_p)
3292 this_hdr->sh_name = (unsigned int) -1;
3293 else
252b5132 3294 {
3e19fb8f
L
3295 this_hdr->sh_name
3296 = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
3297 name, FALSE);
3298 if (this_hdr->sh_name == (unsigned int) -1)
3299 {
3300 arg->failed = TRUE;
3301 return;
3302 }
252b5132
RH
3303 }
3304
a4d8e49b 3305 /* Don't clear sh_flags. Assembler may set additional bits. */
252b5132
RH
3306
3307 if ((asect->flags & SEC_ALLOC) != 0
3308 || asect->user_set_vma)
3309 this_hdr->sh_addr = asect->vma;
3310 else
3311 this_hdr->sh_addr = 0;
3312
3313 this_hdr->sh_offset = 0;
eea6121a 3314 this_hdr->sh_size = asect->size;
252b5132 3315 this_hdr->sh_link = 0;
c86934ce
NC
3316 /* PR 17512: file: 0eb809fe, 8b0535ee. */
3317 if (asect->alignment_power >= (sizeof (bfd_vma) * 8) - 1)
3318 {
4eca0228 3319 _bfd_error_handler
695344c0 3320 /* xgettext:c-format */
9793eb77 3321 (_("%pB: error: alignment power %d of section `%pA' is too big"),
c08bb8dd 3322 abfd, asect->alignment_power, asect);
c86934ce
NC
3323 arg->failed = TRUE;
3324 return;
3325 }
72de5009 3326 this_hdr->sh_addralign = (bfd_vma) 1 << asect->alignment_power;
252b5132
RH
3327 /* The sh_entsize and sh_info fields may have been set already by
3328 copy_private_section_data. */
3329
3330 this_hdr->bfd_section = asect;
3331 this_hdr->contents = NULL;
3332
3cddba1e
L
3333 /* If the section type is unspecified, we set it based on
3334 asect->flags. */
98ece1b3
AM
3335 if ((asect->flags & SEC_GROUP) != 0)
3336 sh_type = SHT_GROUP;
98ece1b3 3337 else
94be91de 3338 sh_type = bfd_elf_get_default_section_type (asect->flags);
98ece1b3 3339
3cddba1e 3340 if (this_hdr->sh_type == SHT_NULL)
98ece1b3
AM
3341 this_hdr->sh_type = sh_type;
3342 else if (this_hdr->sh_type == SHT_NOBITS
3343 && sh_type == SHT_PROGBITS
3344 && (asect->flags & SEC_ALLOC) != 0)
3cddba1e 3345 {
98ece1b3
AM
3346 /* Warn if we are changing a NOBITS section to PROGBITS, but
3347 allow the link to proceed. This can happen when users link
3348 non-bss input sections to bss output sections, or emit data
3349 to a bss output section via a linker script. */
4eca0228 3350 _bfd_error_handler
871b3ab2 3351 (_("warning: section `%pA' type changed to PROGBITS"), asect);
98ece1b3 3352 this_hdr->sh_type = sh_type;
3cddba1e
L
3353 }
3354
2f89ff8d 3355 switch (this_hdr->sh_type)
252b5132 3356 {
2f89ff8d 3357 default:
2f89ff8d
L
3358 break;
3359
3360 case SHT_STRTAB:
2f89ff8d
L
3361 case SHT_NOTE:
3362 case SHT_NOBITS:
3363 case SHT_PROGBITS:
3364 break;
606851fb
AM
3365
3366 case SHT_INIT_ARRAY:
3367 case SHT_FINI_ARRAY:
3368 case SHT_PREINIT_ARRAY:
3369 this_hdr->sh_entsize = bed->s->arch_size / 8;
3370 break;
2f89ff8d
L
3371
3372 case SHT_HASH:
c7ac6ff8 3373 this_hdr->sh_entsize = bed->s->sizeof_hash_entry;
2f89ff8d 3374 break;
5de3bf90 3375
2f89ff8d 3376 case SHT_DYNSYM:
252b5132 3377 this_hdr->sh_entsize = bed->s->sizeof_sym;
2f89ff8d
L
3378 break;
3379
3380 case SHT_DYNAMIC:
252b5132 3381 this_hdr->sh_entsize = bed->s->sizeof_dyn;
2f89ff8d
L
3382 break;
3383
3384 case SHT_RELA:
3385 if (get_elf_backend_data (abfd)->may_use_rela_p)
3386 this_hdr->sh_entsize = bed->s->sizeof_rela;
3387 break;
3388
3389 case SHT_REL:
3390 if (get_elf_backend_data (abfd)->may_use_rel_p)
3391 this_hdr->sh_entsize = bed->s->sizeof_rel;
3392 break;
3393
3394 case SHT_GNU_versym:
252b5132 3395 this_hdr->sh_entsize = sizeof (Elf_External_Versym);
2f89ff8d
L
3396 break;
3397
3398 case SHT_GNU_verdef:
252b5132
RH
3399 this_hdr->sh_entsize = 0;
3400 /* objcopy or strip will copy over sh_info, but may not set
08a40648
AM
3401 cverdefs. The linker will set cverdefs, but sh_info will be
3402 zero. */
252b5132
RH
3403 if (this_hdr->sh_info == 0)
3404 this_hdr->sh_info = elf_tdata (abfd)->cverdefs;
3405 else
3406 BFD_ASSERT (elf_tdata (abfd)->cverdefs == 0
3407 || this_hdr->sh_info == elf_tdata (abfd)->cverdefs);
2f89ff8d
L
3408 break;
3409
3410 case SHT_GNU_verneed:
252b5132
RH
3411 this_hdr->sh_entsize = 0;
3412 /* objcopy or strip will copy over sh_info, but may not set
08a40648
AM
3413 cverrefs. The linker will set cverrefs, but sh_info will be
3414 zero. */
252b5132
RH
3415 if (this_hdr->sh_info == 0)
3416 this_hdr->sh_info = elf_tdata (abfd)->cverrefs;
3417 else
3418 BFD_ASSERT (elf_tdata (abfd)->cverrefs == 0
3419 || this_hdr->sh_info == elf_tdata (abfd)->cverrefs);
2f89ff8d
L
3420 break;
3421
3422 case SHT_GROUP:
1783205a 3423 this_hdr->sh_entsize = GRP_ENTRY_SIZE;
2f89ff8d 3424 break;
fdc90cb4
JJ
3425
3426 case SHT_GNU_HASH:
3427 this_hdr->sh_entsize = bed->s->arch_size == 64 ? 0 : 4;
3428 break;
dbb410c3 3429 }
252b5132
RH
3430
3431 if ((asect->flags & SEC_ALLOC) != 0)
3432 this_hdr->sh_flags |= SHF_ALLOC;
3433 if ((asect->flags & SEC_READONLY) == 0)
3434 this_hdr->sh_flags |= SHF_WRITE;
3435 if ((asect->flags & SEC_CODE) != 0)
3436 this_hdr->sh_flags |= SHF_EXECINSTR;
f5fa8ca2
JJ
3437 if ((asect->flags & SEC_MERGE) != 0)
3438 {
3439 this_hdr->sh_flags |= SHF_MERGE;
3440 this_hdr->sh_entsize = asect->entsize;
f5fa8ca2 3441 }
84865015
NC
3442 if ((asect->flags & SEC_STRINGS) != 0)
3443 this_hdr->sh_flags |= SHF_STRINGS;
1126897b 3444 if ((asect->flags & SEC_GROUP) == 0 && elf_group_name (asect) != NULL)
dbb410c3 3445 this_hdr->sh_flags |= SHF_GROUP;
13ae64f3 3446 if ((asect->flags & SEC_THREAD_LOCAL) != 0)
704afa60
JJ
3447 {
3448 this_hdr->sh_flags |= SHF_TLS;
3a800eb9
AM
3449 if (asect->size == 0
3450 && (asect->flags & SEC_HAS_CONTENTS) == 0)
704afa60 3451 {
3a800eb9 3452 struct bfd_link_order *o = asect->map_tail.link_order;
b34976b6 3453
704afa60 3454 this_hdr->sh_size = 0;
3a800eb9
AM
3455 if (o != NULL)
3456 {
704afa60 3457 this_hdr->sh_size = o->offset + o->size;
3a800eb9
AM
3458 if (this_hdr->sh_size != 0)
3459 this_hdr->sh_type = SHT_NOBITS;
3460 }
704afa60
JJ
3461 }
3462 }
18ae9cc1
L
3463 if ((asect->flags & (SEC_GROUP | SEC_EXCLUDE)) == SEC_EXCLUDE)
3464 this_hdr->sh_flags |= SHF_EXCLUDE;
252b5132 3465
d4730f92
BS
3466 /* If the section has relocs, set up a section header for the
3467 SHT_REL[A] section. If two relocation sections are required for
3468 this section, it is up to the processor-specific back-end to
3469 create the other. */
3470 if ((asect->flags & SEC_RELOC) != 0)
3471 {
3472 /* When doing a relocatable link, create both REL and RELA sections if
3473 needed. */
3474 if (arg->link_info
3475 /* Do the normal setup if we wouldn't create any sections here. */
3476 && esd->rel.count + esd->rela.count > 0
0e1862bb
L
3477 && (bfd_link_relocatable (arg->link_info)
3478 || arg->link_info->emitrelocations))
d4730f92
BS
3479 {
3480 if (esd->rel.count && esd->rel.hdr == NULL
28e07a05 3481 && !_bfd_elf_init_reloc_shdr (abfd, &esd->rel, name,
db4677b8 3482 FALSE, delay_st_name_p))
d4730f92
BS
3483 {
3484 arg->failed = TRUE;
3485 return;
3486 }
3487 if (esd->rela.count && esd->rela.hdr == NULL
28e07a05 3488 && !_bfd_elf_init_reloc_shdr (abfd, &esd->rela, name,
db4677b8 3489 TRUE, delay_st_name_p))
d4730f92
BS
3490 {
3491 arg->failed = TRUE;
3492 return;
3493 }
3494 }
3495 else if (!_bfd_elf_init_reloc_shdr (abfd,
3496 (asect->use_rela_p
3497 ? &esd->rela : &esd->rel),
f6fe1ccd 3498 name,
3e19fb8f
L
3499 asect->use_rela_p,
3500 delay_st_name_p))
db4677b8 3501 {
d4730f92 3502 arg->failed = TRUE;
db4677b8
AM
3503 return;
3504 }
d4730f92
BS
3505 }
3506
252b5132 3507 /* Check for processor-specific section types. */
0414f35b 3508 sh_type = this_hdr->sh_type;
e1fddb6b
AO
3509 if (bed->elf_backend_fake_sections
3510 && !(*bed->elf_backend_fake_sections) (abfd, this_hdr, asect))
db4677b8
AM
3511 {
3512 arg->failed = TRUE;
3513 return;
3514 }
252b5132 3515
42bb2e33 3516 if (sh_type == SHT_NOBITS && asect->size != 0)
0414f35b
AM
3517 {
3518 /* Don't change the header type from NOBITS if we are being
42bb2e33 3519 called for objcopy --only-keep-debug. */
0414f35b
AM
3520 this_hdr->sh_type = sh_type;
3521 }
252b5132
RH
3522}
3523
bcacc0f5
AM
3524/* Fill in the contents of a SHT_GROUP section. Called from
3525 _bfd_elf_compute_section_file_positions for gas, objcopy, and
3526 when ELF targets use the generic linker, ld. Called for ld -r
3527 from bfd_elf_final_link. */
dbb410c3 3528
1126897b 3529void
217aa764 3530bfd_elf_set_group_contents (bfd *abfd, asection *sec, void *failedptrarg)
dbb410c3 3531{
a50b1753 3532 bfd_boolean *failedptr = (bfd_boolean *) failedptrarg;
9dce4196 3533 asection *elt, *first;
dbb410c3 3534 unsigned char *loc;
b34976b6 3535 bfd_boolean gas;
dbb410c3 3536
7e4111ad
L
3537 /* Ignore linker created group section. See elfNN_ia64_object_p in
3538 elfxx-ia64.c. */
ce5aecf8
AM
3539 if ((sec->flags & (SEC_GROUP | SEC_LINKER_CREATED)) != SEC_GROUP
3540 || sec->size == 0
dbb410c3
AM
3541 || *failedptr)
3542 return;
3543
bcacc0f5
AM
3544 if (elf_section_data (sec)->this_hdr.sh_info == 0)
3545 {
3546 unsigned long symindx = 0;
3547
3548 /* elf_group_id will have been set up by objcopy and the
3549 generic linker. */
3550 if (elf_group_id (sec) != NULL)
3551 symindx = elf_group_id (sec)->udata.i;
1126897b 3552
bcacc0f5
AM
3553 if (symindx == 0)
3554 {
3555 /* If called from the assembler, swap_out_syms will have set up
3556 elf_section_syms. */
3557 BFD_ASSERT (elf_section_syms (abfd) != NULL);
3558 symindx = elf_section_syms (abfd)[sec->index]->udata.i;
3559 }
3560 elf_section_data (sec)->this_hdr.sh_info = symindx;
3561 }
3562 else if (elf_section_data (sec)->this_hdr.sh_info == (unsigned int) -2)
1126897b 3563 {
bcacc0f5
AM
3564 /* The ELF backend linker sets sh_info to -2 when the group
3565 signature symbol is global, and thus the index can't be
3566 set until all local symbols are output. */
53720c49
AM
3567 asection *igroup;
3568 struct bfd_elf_section_data *sec_data;
3569 unsigned long symndx;
3570 unsigned long extsymoff;
bcacc0f5
AM
3571 struct elf_link_hash_entry *h;
3572
53720c49
AM
3573 /* The point of this little dance to the first SHF_GROUP section
3574 then back to the SHT_GROUP section is that this gets us to
3575 the SHT_GROUP in the input object. */
3576 igroup = elf_sec_group (elf_next_in_group (sec));
3577 sec_data = elf_section_data (igroup);
3578 symndx = sec_data->this_hdr.sh_info;
3579 extsymoff = 0;
bcacc0f5
AM
3580 if (!elf_bad_symtab (igroup->owner))
3581 {
3582 Elf_Internal_Shdr *symtab_hdr;
3583
3584 symtab_hdr = &elf_tdata (igroup->owner)->symtab_hdr;
3585 extsymoff = symtab_hdr->sh_info;
3586 }
3587 h = elf_sym_hashes (igroup->owner)[symndx - extsymoff];
3588 while (h->root.type == bfd_link_hash_indirect
3589 || h->root.type == bfd_link_hash_warning)
3590 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3591
3592 elf_section_data (sec)->this_hdr.sh_info = h->indx;
1126897b 3593 }
dbb410c3 3594
1126897b 3595 /* The contents won't be allocated for "ld -r" or objcopy. */
b34976b6 3596 gas = TRUE;
dbb410c3
AM
3597 if (sec->contents == NULL)
3598 {
b34976b6 3599 gas = FALSE;
a50b1753 3600 sec->contents = (unsigned char *) bfd_alloc (abfd, sec->size);
9dce4196
AM
3601
3602 /* Arrange for the section to be written out. */
3603 elf_section_data (sec)->this_hdr.contents = sec->contents;
dbb410c3
AM
3604 if (sec->contents == NULL)
3605 {
b34976b6 3606 *failedptr = TRUE;
dbb410c3
AM
3607 return;
3608 }
3609 }
3610
eea6121a 3611 loc = sec->contents + sec->size;
dbb410c3 3612
9dce4196
AM
3613 /* Get the pointer to the first section in the group that gas
3614 squirreled away here. objcopy arranges for this to be set to the
3615 start of the input section group. */
3616 first = elt = elf_next_in_group (sec);
dbb410c3
AM
3617
3618 /* First element is a flag word. Rest of section is elf section
3619 indices for all the sections of the group. Write them backwards
3620 just to keep the group in the same order as given in .section
3621 directives, not that it matters. */
3622 while (elt != NULL)
3623 {
9dce4196 3624 asection *s;
9dce4196 3625
9dce4196 3626 s = elt;
415f38a6
AM
3627 if (!gas)
3628 s = s->output_section;
3629 if (s != NULL
3630 && !bfd_is_abs_section (s))
01e1a5bc 3631 {
db4677b8 3632 struct bfd_elf_section_data *elf_sec = elf_section_data (s);
28e07a05
AM
3633 struct bfd_elf_section_data *input_elf_sec = elf_section_data (elt);
3634
3635 if (elf_sec->rel.hdr != NULL
3636 && (gas
3637 || (input_elf_sec->rel.hdr != NULL
3638 && input_elf_sec->rel.hdr->sh_flags & SHF_GROUP) != 0))
db4677b8 3639 {
28e07a05 3640 elf_sec->rel.hdr->sh_flags |= SHF_GROUP;
db4677b8
AM
3641 loc -= 4;
3642 H_PUT_32 (abfd, elf_sec->rel.idx, loc);
3643 }
28e07a05
AM
3644 if (elf_sec->rela.hdr != NULL
3645 && (gas
3646 || (input_elf_sec->rela.hdr != NULL
3647 && input_elf_sec->rela.hdr->sh_flags & SHF_GROUP) != 0))
db4677b8 3648 {
28e07a05 3649 elf_sec->rela.hdr->sh_flags |= SHF_GROUP;
db4677b8
AM
3650 loc -= 4;
3651 H_PUT_32 (abfd, elf_sec->rela.idx, loc);
3652 }
01e1a5bc 3653 loc -= 4;
db4677b8 3654 H_PUT_32 (abfd, elf_sec->this_idx, loc);
01e1a5bc 3655 }
945906ff 3656 elt = elf_next_in_group (elt);
9dce4196
AM
3657 if (elt == first)
3658 break;
dbb410c3
AM
3659 }
3660
7bdf4127
AB
3661 loc -= 4;
3662 BFD_ASSERT (loc == sec->contents);
dbb410c3 3663
9dce4196 3664 H_PUT_32 (abfd, sec->flags & SEC_LINK_ONCE ? GRP_COMDAT : 0, loc);
dbb410c3
AM
3665}
3666
bce964aa
AM
3667/* Given NAME, the name of a relocation section stripped of its
3668 .rel/.rela prefix, return the section in ABFD to which the
3669 relocations apply. */
bd53a53a
L
3670
3671asection *
bce964aa
AM
3672_bfd_elf_plt_get_reloc_section (bfd *abfd, const char *name)
3673{
3674 /* If a target needs .got.plt section, relocations in rela.plt/rel.plt
3675 section likely apply to .got.plt or .got section. */
3676 if (get_elf_backend_data (abfd)->want_got_plt
3677 && strcmp (name, ".plt") == 0)
3678 {
3679 asection *sec;
3680
3681 name = ".got.plt";
3682 sec = bfd_get_section_by_name (abfd, name);
3683 if (sec != NULL)
3684 return sec;
3685 name = ".got";
3686 }
3687
3688 return bfd_get_section_by_name (abfd, name);
3689}
3690
3691/* Return the section to which RELOC_SEC applies. */
3692
3693static asection *
3694elf_get_reloc_section (asection *reloc_sec)
bd53a53a
L
3695{
3696 const char *name;
3697 unsigned int type;
3698 bfd *abfd;
bce964aa 3699 const struct elf_backend_data *bed;
bd53a53a
L
3700
3701 type = elf_section_data (reloc_sec)->this_hdr.sh_type;
3702 if (type != SHT_REL && type != SHT_RELA)
3703 return NULL;
3704
3705 /* We look up the section the relocs apply to by name. */
3706 name = reloc_sec->name;
bce964aa
AM
3707 if (strncmp (name, ".rel", 4) != 0)
3708 return NULL;
3709 name += 4;
3710 if (type == SHT_RELA && *name++ != 'a')
3711 return NULL;
bd53a53a 3712
bd53a53a 3713 abfd = reloc_sec->owner;
bce964aa
AM
3714 bed = get_elf_backend_data (abfd);
3715 return bed->get_reloc_section (abfd, name);
bd53a53a
L
3716}
3717
252b5132
RH
3718/* Assign all ELF section numbers. The dummy first section is handled here
3719 too. The link/info pointers for the standard section types are filled
3720 in here too, while we're at it. */
3721
b34976b6 3722static bfd_boolean
da9f89d4 3723assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
252b5132
RH
3724{
3725 struct elf_obj_tdata *t = elf_tdata (abfd);
3726 asection *sec;
3e19fb8f 3727 unsigned int section_number;
252b5132 3728 Elf_Internal_Shdr **i_shdrp;
47cc2cf5 3729 struct bfd_elf_section_data *d;
3516e984 3730 bfd_boolean need_symtab;
252b5132
RH
3731
3732 section_number = 1;
3733
2b0f7ef9
JJ
3734 _bfd_elf_strtab_clear_all_refs (elf_shstrtab (abfd));
3735
da9f89d4 3736 /* SHT_GROUP sections are in relocatable files only. */
7bdf4127 3737 if (link_info == NULL || !link_info->resolve_section_groups)
252b5132 3738 {
ef53be89 3739 size_t reloc_count = 0;
14f2c699 3740
da9f89d4 3741 /* Put SHT_GROUP sections first. */
04dd1667 3742 for (sec = abfd->sections; sec != NULL; sec = sec->next)
47cc2cf5 3743 {
5daa8fe7 3744 d = elf_section_data (sec);
da9f89d4
L
3745
3746 if (d->this_hdr.sh_type == SHT_GROUP)
08a40648 3747 {
5daa8fe7 3748 if (sec->flags & SEC_LINKER_CREATED)
da9f89d4
L
3749 {
3750 /* Remove the linker created SHT_GROUP sections. */
5daa8fe7 3751 bfd_section_list_remove (abfd, sec);
da9f89d4 3752 abfd->section_count--;
da9f89d4 3753 }
08a40648 3754 else
4fbb74a6 3755 d->this_idx = section_number++;
da9f89d4 3756 }
14f2c699
L
3757
3758 /* Count relocations. */
3759 reloc_count += sec->reloc_count;
47cc2cf5 3760 }
14f2c699
L
3761
3762 /* Clear HAS_RELOC if there are no relocations. */
3763 if (reloc_count == 0)
3764 abfd->flags &= ~HAS_RELOC;
47cc2cf5
PB
3765 }
3766
3767 for (sec = abfd->sections; sec; sec = sec->next)
3768 {
3769 d = elf_section_data (sec);
3770
3771 if (d->this_hdr.sh_type != SHT_GROUP)
4fbb74a6 3772 d->this_idx = section_number++;
3e19fb8f
L
3773 if (d->this_hdr.sh_name != (unsigned int) -1)
3774 _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->this_hdr.sh_name);
d4730f92 3775 if (d->rel.hdr)
2b0f7ef9 3776 {
d4730f92 3777 d->rel.idx = section_number++;
3e19fb8f
L
3778 if (d->rel.hdr->sh_name != (unsigned int) -1)
3779 _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->rel.hdr->sh_name);
2b0f7ef9 3780 }
d4730f92
BS
3781 else
3782 d->rel.idx = 0;
23bc299b 3783
d4730f92 3784 if (d->rela.hdr)
2b0f7ef9 3785 {
d4730f92 3786 d->rela.idx = section_number++;
3e19fb8f
L
3787 if (d->rela.hdr->sh_name != (unsigned int) -1)
3788 _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->rela.hdr->sh_name);
2b0f7ef9 3789 }
23bc299b 3790 else
d4730f92 3791 d->rela.idx = 0;
252b5132
RH
3792 }
3793
3516e984
L
3794 need_symtab = (bfd_get_symcount (abfd) > 0
3795 || (link_info == NULL
3796 && ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC))
3797 == HAS_RELOC)));
3798 if (need_symtab)
252b5132 3799 {
12bd6957 3800 elf_onesymtab (abfd) = section_number++;
2b0f7ef9 3801 _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->symtab_hdr.sh_name);
4fbb74a6 3802 if (section_number > ((SHN_LORESERVE - 2) & 0xFFFF))
9ad5cbcf 3803 {
7a6e0d89 3804 elf_section_list *entry;
6a40cf0c
NC
3805
3806 BFD_ASSERT (elf_symtab_shndx_list (abfd) == NULL);
3807
7a6e0d89 3808 entry = bfd_zalloc (abfd, sizeof (*entry));
6a40cf0c
NC
3809 entry->ndx = section_number++;
3810 elf_symtab_shndx_list (abfd) = entry;
3811 entry->hdr.sh_name
9ad5cbcf 3812 = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
b34976b6 3813 ".symtab_shndx", FALSE);
6a40cf0c 3814 if (entry->hdr.sh_name == (unsigned int) -1)
b34976b6 3815 return FALSE;
9ad5cbcf 3816 }
12bd6957 3817 elf_strtab_sec (abfd) = section_number++;
2b0f7ef9 3818 _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->strtab_hdr.sh_name);
252b5132
RH
3819 }
3820
dd905818
NC
3821 elf_shstrtab_sec (abfd) = section_number++;
3822 _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->shstrtab_hdr.sh_name);
3823 elf_elfheader (abfd)->e_shstrndx = elf_shstrtab_sec (abfd);
3824
1c52a645
L
3825 if (section_number >= SHN_LORESERVE)
3826 {
695344c0 3827 /* xgettext:c-format */
871b3ab2 3828 _bfd_error_handler (_("%pB: too many sections: %u"),
1c52a645
L
3829 abfd, section_number);
3830 return FALSE;
3831 }
3832
9ad5cbcf 3833 elf_numsections (abfd) = section_number;
252b5132
RH
3834 elf_elfheader (abfd)->e_shnum = section_number;
3835
3836 /* Set up the list of section header pointers, in agreement with the
3837 indices. */
a50b1753 3838 i_shdrp = (Elf_Internal_Shdr **) bfd_zalloc2 (abfd, section_number,
07d6d2b8 3839 sizeof (Elf_Internal_Shdr *));
252b5132 3840 if (i_shdrp == NULL)
b34976b6 3841 return FALSE;
252b5132 3842
a50b1753 3843 i_shdrp[0] = (Elf_Internal_Shdr *) bfd_zalloc (abfd,
07d6d2b8 3844 sizeof (Elf_Internal_Shdr));
252b5132
RH
3845 if (i_shdrp[0] == NULL)
3846 {
3847 bfd_release (abfd, i_shdrp);
b34976b6 3848 return FALSE;
252b5132 3849 }
252b5132
RH
3850
3851 elf_elfsections (abfd) = i_shdrp;
3852
12bd6957 3853 i_shdrp[elf_shstrtab_sec (abfd)] = &t->shstrtab_hdr;
3516e984 3854 if (need_symtab)
252b5132 3855 {
12bd6957 3856 i_shdrp[elf_onesymtab (abfd)] = &t->symtab_hdr;
4fbb74a6 3857 if (elf_numsections (abfd) > (SHN_LORESERVE & 0xFFFF))
9ad5cbcf 3858 {
6a40cf0c
NC
3859 elf_section_list * entry = elf_symtab_shndx_list (abfd);
3860 BFD_ASSERT (entry != NULL);
3861 i_shdrp[entry->ndx] = & entry->hdr;
3862 entry->hdr.sh_link = elf_onesymtab (abfd);
9ad5cbcf 3863 }
12bd6957
AM
3864 i_shdrp[elf_strtab_sec (abfd)] = &t->strtab_hdr;
3865 t->symtab_hdr.sh_link = elf_strtab_sec (abfd);
252b5132 3866 }
38ce5b11 3867
252b5132
RH
3868 for (sec = abfd->sections; sec; sec = sec->next)
3869 {
252b5132 3870 asection *s;
252b5132 3871
91d6fa6a
NC
3872 d = elf_section_data (sec);
3873
252b5132 3874 i_shdrp[d->this_idx] = &d->this_hdr;
d4730f92
BS
3875 if (d->rel.idx != 0)
3876 i_shdrp[d->rel.idx] = d->rel.hdr;
3877 if (d->rela.idx != 0)
3878 i_shdrp[d->rela.idx] = d->rela.hdr;
252b5132
RH
3879
3880 /* Fill in the sh_link and sh_info fields while we're at it. */
3881
3882 /* sh_link of a reloc section is the section index of the symbol
3883 table. sh_info is the section index of the section to which
3884 the relocation entries apply. */
d4730f92 3885 if (d->rel.idx != 0)
252b5132 3886 {
12bd6957 3887 d->rel.hdr->sh_link = elf_onesymtab (abfd);
d4730f92 3888 d->rel.hdr->sh_info = d->this_idx;
9ef5d938 3889 d->rel.hdr->sh_flags |= SHF_INFO_LINK;
252b5132 3890 }
d4730f92 3891 if (d->rela.idx != 0)
23bc299b 3892 {
12bd6957 3893 d->rela.hdr->sh_link = elf_onesymtab (abfd);
d4730f92 3894 d->rela.hdr->sh_info = d->this_idx;
9ef5d938 3895 d->rela.hdr->sh_flags |= SHF_INFO_LINK;
23bc299b 3896 }
252b5132 3897
38ce5b11
L
3898 /* We need to set up sh_link for SHF_LINK_ORDER. */
3899 if ((d->this_hdr.sh_flags & SHF_LINK_ORDER) != 0)
3900 {
3901 s = elf_linked_to_section (sec);
3902 if (s)
38ce5b11 3903 {
f2876037 3904 /* elf_linked_to_section points to the input section. */
ccd2ec6a 3905 if (link_info != NULL)
38ce5b11 3906 {
f2876037 3907 /* Check discarded linkonce section. */
dbaa2011 3908 if (discarded_section (s))
38ce5b11 3909 {
ccd2ec6a 3910 asection *kept;
4eca0228 3911 _bfd_error_handler
695344c0 3912 /* xgettext:c-format */
871b3ab2
AM
3913 (_("%pB: sh_link of section `%pA' points to"
3914 " discarded section `%pA' of `%pB'"),
ccd2ec6a
L
3915 abfd, d->this_hdr.bfd_section,
3916 s, s->owner);
3917 /* Point to the kept section if it has the same
3918 size as the discarded one. */
c0f00686 3919 kept = _bfd_elf_check_kept_section (s, link_info);
ccd2ec6a 3920 if (kept == NULL)
185d09ad 3921 {
ccd2ec6a
L
3922 bfd_set_error (bfd_error_bad_value);
3923 return FALSE;
185d09ad 3924 }
ccd2ec6a 3925 s = kept;
38ce5b11 3926 }
e424ecc8 3927
ccd2ec6a
L
3928 s = s->output_section;
3929 BFD_ASSERT (s != NULL);
38ce5b11 3930 }
f2876037
L
3931 else
3932 {
3933 /* Handle objcopy. */
3934 if (s->output_section == NULL)
3935 {
4eca0228 3936 _bfd_error_handler
695344c0 3937 /* xgettext:c-format */
871b3ab2
AM
3938 (_("%pB: sh_link of section `%pA' points to"
3939 " removed section `%pA' of `%pB'"),
f2876037
L
3940 abfd, d->this_hdr.bfd_section, s, s->owner);
3941 bfd_set_error (bfd_error_bad_value);
3942 return FALSE;
3943 }
3944 s = s->output_section;
3945 }
ccd2ec6a
L
3946 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3947 }
3948 else
3949 {
3950 /* PR 290:
3951 The Intel C compiler generates SHT_IA_64_UNWIND with
3952 SHF_LINK_ORDER. But it doesn't set the sh_link or
3953 sh_info fields. Hence we could get the situation
08a40648 3954 where s is NULL. */
ccd2ec6a
L
3955 const struct elf_backend_data *bed
3956 = get_elf_backend_data (abfd);
3957 if (bed->link_order_error_handler)
3958 bed->link_order_error_handler
695344c0 3959 /* xgettext:c-format */
871b3ab2 3960 (_("%pB: warning: sh_link not set for section `%pA'"),
ccd2ec6a 3961 abfd, sec);
38ce5b11
L
3962 }
3963 }
3964
252b5132
RH
3965 switch (d->this_hdr.sh_type)
3966 {
3967 case SHT_REL:
3968 case SHT_RELA:
3969 /* A reloc section which we are treating as a normal BFD
3970 section. sh_link is the section index of the symbol
3971 table. sh_info is the section index of the section to
3972 which the relocation entries apply. We assume that an
3973 allocated reloc section uses the dynamic symbol table.
3974 FIXME: How can we be sure? */
3975 s = bfd_get_section_by_name (abfd, ".dynsym");
3976 if (s != NULL)
3977 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3978
bce964aa 3979 s = elf_get_reloc_section (sec);
252b5132 3980 if (s != NULL)
9ef5d938
L
3981 {
3982 d->this_hdr.sh_info = elf_section_data (s)->this_idx;
3983 d->this_hdr.sh_flags |= SHF_INFO_LINK;
3984 }
252b5132
RH
3985 break;
3986
3987 case SHT_STRTAB:
3988 /* We assume that a section named .stab*str is a stabs
3989 string section. We look for a section with the same name
3990 but without the trailing ``str'', and set its sh_link
3991 field to point to this section. */
0112cd26 3992 if (CONST_STRNEQ (sec->name, ".stab")
252b5132
RH
3993 && strcmp (sec->name + strlen (sec->name) - 3, "str") == 0)
3994 {
3995 size_t len;
3996 char *alc;
3997
3998 len = strlen (sec->name);
a50b1753 3999 alc = (char *) bfd_malloc (len - 2);
252b5132 4000 if (alc == NULL)
b34976b6 4001 return FALSE;
d4c88bbb 4002 memcpy (alc, sec->name, len - 3);
252b5132
RH
4003 alc[len - 3] = '\0';
4004 s = bfd_get_section_by_name (abfd, alc);
4005 free (alc);
4006 if (s != NULL)
4007 {
4008 elf_section_data (s)->this_hdr.sh_link = d->this_idx;
4009
4010 /* This is a .stab section. */
0594c12d
AM
4011 if (elf_section_data (s)->this_hdr.sh_entsize == 0)
4012 elf_section_data (s)->this_hdr.sh_entsize
4013 = 4 + 2 * bfd_get_arch_size (abfd) / 8;
252b5132
RH
4014 }
4015 }
4016 break;
4017
4018 case SHT_DYNAMIC:
4019 case SHT_DYNSYM:
4020 case SHT_GNU_verneed:
4021 case SHT_GNU_verdef:
4022 /* sh_link is the section header index of the string table
4023 used for the dynamic entries, or the symbol table, or the
4024 version strings. */
4025 s = bfd_get_section_by_name (abfd, ".dynstr");
4026 if (s != NULL)
4027 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
4028 break;
4029
7f1204bb
JJ
4030 case SHT_GNU_LIBLIST:
4031 /* sh_link is the section header index of the prelink library
08a40648
AM
4032 list used for the dynamic entries, or the symbol table, or
4033 the version strings. */
7f1204bb
JJ
4034 s = bfd_get_section_by_name (abfd, (sec->flags & SEC_ALLOC)
4035 ? ".dynstr" : ".gnu.libstr");
4036 if (s != NULL)
4037 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
4038 break;
4039
252b5132 4040 case SHT_HASH:
fdc90cb4 4041 case SHT_GNU_HASH:
252b5132
RH
4042 case SHT_GNU_versym:
4043 /* sh_link is the section header index of the symbol table
4044 this hash table or version table is for. */
4045 s = bfd_get_section_by_name (abfd, ".dynsym");
4046 if (s != NULL)
4047 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
4048 break;
dbb410c3
AM
4049
4050 case SHT_GROUP:
12bd6957 4051 d->this_hdr.sh_link = elf_onesymtab (abfd);
252b5132
RH
4052 }
4053 }
4054
3e19fb8f
L
4055 /* Delay setting sh_name to _bfd_elf_write_object_contents so that
4056 _bfd_elf_assign_file_positions_for_non_load can convert DWARF
4057 debug section name from .debug_* to .zdebug_* if needed. */
4058
b34976b6 4059 return TRUE;
252b5132
RH
4060}
4061
5372391b 4062static bfd_boolean
217aa764 4063sym_is_global (bfd *abfd, asymbol *sym)
252b5132
RH
4064{
4065 /* If the backend has a special mapping, use it. */
9c5bfbb7 4066 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
217aa764
AM
4067 if (bed->elf_backend_sym_is_global)
4068 return (*bed->elf_backend_sym_is_global) (abfd, sym);
252b5132 4069
e47bf690 4070 return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
e6f7f6d1
AM
4071 || bfd_is_und_section (bfd_asymbol_section (sym))
4072 || bfd_is_com_section (bfd_asymbol_section (sym)));
252b5132
RH
4073}
4074
76359541
TP
4075/* Filter global symbols of ABFD to include in the import library. All
4076 SYMCOUNT symbols of ABFD can be examined from their pointers in
4077 SYMS. Pointers of symbols to keep should be stored contiguously at
4078 the beginning of that array.
4079
4080 Returns the number of symbols to keep. */
4081
4082unsigned int
4083_bfd_elf_filter_global_symbols (bfd *abfd, struct bfd_link_info *info,
4084 asymbol **syms, long symcount)
4085{
4086 long src_count, dst_count = 0;
4087
4088 for (src_count = 0; src_count < symcount; src_count++)
4089 {
4090 asymbol *sym = syms[src_count];
4091 char *name = (char *) bfd_asymbol_name (sym);
4092 struct bfd_link_hash_entry *h;
4093
4094 if (!sym_is_global (abfd, sym))
4095 continue;
4096
4097 h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, FALSE);
5df1bc57
AM
4098 if (h == NULL)
4099 continue;
76359541
TP
4100 if (h->type != bfd_link_hash_defined && h->type != bfd_link_hash_defweak)
4101 continue;
76359541
TP
4102 if (h->linker_def || h->ldscript_def)
4103 continue;
4104
4105 syms[dst_count++] = sym;
4106 }
4107
4108 syms[dst_count] = NULL;
4109
4110 return dst_count;
4111}
4112
5372391b 4113/* Don't output section symbols for sections that are not going to be
c6d8cab4 4114 output, that are duplicates or there is no BFD section. */
5372391b
AM
4115
4116static bfd_boolean
4117ignore_section_sym (bfd *abfd, asymbol *sym)
4118{
c6d8cab4
L
4119 elf_symbol_type *type_ptr;
4120
db0c309f
NC
4121 if (sym == NULL)
4122 return FALSE;
4123
c6d8cab4
L
4124 if ((sym->flags & BSF_SECTION_SYM) == 0)
4125 return FALSE;
4126
db0c309f
NC
4127 if (sym->section == NULL)
4128 return TRUE;
4129
c6d8cab4
L
4130 type_ptr = elf_symbol_from (abfd, sym);
4131 return ((type_ptr != NULL
4132 && type_ptr->internal_elf_sym.st_shndx != 0
4133 && bfd_is_abs_section (sym->section))
4134 || !(sym->section->owner == abfd
db0c309f
NC
4135 || (sym->section->output_section != NULL
4136 && sym->section->output_section->owner == abfd
2633a79c
AM
4137 && sym->section->output_offset == 0)
4138 || bfd_is_abs_section (sym->section)));
5372391b
AM
4139}
4140
2633a79c
AM
4141/* Map symbol from it's internal number to the external number, moving
4142 all local symbols to be at the head of the list. */
4143
b34976b6 4144static bfd_boolean
12bd6957 4145elf_map_symbols (bfd *abfd, unsigned int *pnum_locals)
252b5132 4146{
dc810e39 4147 unsigned int symcount = bfd_get_symcount (abfd);
252b5132
RH
4148 asymbol **syms = bfd_get_outsymbols (abfd);
4149 asymbol **sect_syms;
dc810e39
AM
4150 unsigned int num_locals = 0;
4151 unsigned int num_globals = 0;
4152 unsigned int num_locals2 = 0;
4153 unsigned int num_globals2 = 0;
7292b3ac 4154 unsigned int max_index = 0;
dc810e39 4155 unsigned int idx;
252b5132
RH
4156 asection *asect;
4157 asymbol **new_syms;
252b5132
RH
4158
4159#ifdef DEBUG
4160 fprintf (stderr, "elf_map_symbols\n");
4161 fflush (stderr);
4162#endif
4163
252b5132
RH
4164 for (asect = abfd->sections; asect; asect = asect->next)
4165 {
4166 if (max_index < asect->index)
4167 max_index = asect->index;
4168 }
4169
4170 max_index++;
a50b1753 4171 sect_syms = (asymbol **) bfd_zalloc2 (abfd, max_index, sizeof (asymbol *));
252b5132 4172 if (sect_syms == NULL)
b34976b6 4173 return FALSE;
252b5132 4174 elf_section_syms (abfd) = sect_syms;
4e89ac30 4175 elf_num_section_syms (abfd) = max_index;
252b5132 4176
079e9a2f
AM
4177 /* Init sect_syms entries for any section symbols we have already
4178 decided to output. */
252b5132
RH
4179 for (idx = 0; idx < symcount; idx++)
4180 {
dc810e39 4181 asymbol *sym = syms[idx];
c044fabd 4182
252b5132 4183 if ((sym->flags & BSF_SECTION_SYM) != 0
0f0a5e58 4184 && sym->value == 0
2633a79c
AM
4185 && !ignore_section_sym (abfd, sym)
4186 && !bfd_is_abs_section (sym->section))
252b5132 4187 {
5372391b 4188 asection *sec = sym->section;
252b5132 4189
5372391b
AM
4190 if (sec->owner != abfd)
4191 sec = sec->output_section;
252b5132 4192
5372391b 4193 sect_syms[sec->index] = syms[idx];
252b5132
RH
4194 }
4195 }
4196
252b5132
RH
4197 /* Classify all of the symbols. */
4198 for (idx = 0; idx < symcount; idx++)
4199 {
2633a79c 4200 if (sym_is_global (abfd, syms[idx]))
252b5132 4201 num_globals++;
2633a79c
AM
4202 else if (!ignore_section_sym (abfd, syms[idx]))
4203 num_locals++;
252b5132 4204 }
079e9a2f 4205
5372391b 4206 /* We will be adding a section symbol for each normal BFD section. Most
079e9a2f
AM
4207 sections will already have a section symbol in outsymbols, but
4208 eg. SHT_GROUP sections will not, and we need the section symbol mapped
4209 at least in that case. */
252b5132
RH
4210 for (asect = abfd->sections; asect; asect = asect->next)
4211 {
079e9a2f 4212 if (sect_syms[asect->index] == NULL)
252b5132 4213 {
079e9a2f 4214 if (!sym_is_global (abfd, asect->symbol))
252b5132
RH
4215 num_locals++;
4216 else
4217 num_globals++;
252b5132
RH
4218 }
4219 }
4220
4221 /* Now sort the symbols so the local symbols are first. */
a50b1753 4222 new_syms = (asymbol **) bfd_alloc2 (abfd, num_locals + num_globals,
07d6d2b8 4223 sizeof (asymbol *));
dc810e39 4224
252b5132 4225 if (new_syms == NULL)
b34976b6 4226 return FALSE;
252b5132
RH
4227
4228 for (idx = 0; idx < symcount; idx++)
4229 {
4230 asymbol *sym = syms[idx];
dc810e39 4231 unsigned int i;
252b5132 4232
2633a79c
AM
4233 if (sym_is_global (abfd, sym))
4234 i = num_locals + num_globals2++;
4235 else if (!ignore_section_sym (abfd, sym))
252b5132
RH
4236 i = num_locals2++;
4237 else
2633a79c 4238 continue;
252b5132
RH
4239 new_syms[i] = sym;
4240 sym->udata.i = i + 1;
4241 }
4242 for (asect = abfd->sections; asect; asect = asect->next)
4243 {
079e9a2f 4244 if (sect_syms[asect->index] == NULL)
252b5132 4245 {
079e9a2f 4246 asymbol *sym = asect->symbol;
dc810e39 4247 unsigned int i;
252b5132 4248
079e9a2f 4249 sect_syms[asect->index] = sym;
252b5132
RH
4250 if (!sym_is_global (abfd, sym))
4251 i = num_locals2++;
4252 else
4253 i = num_locals + num_globals2++;
4254 new_syms[i] = sym;
4255 sym->udata.i = i + 1;
4256 }
4257 }
4258
4259 bfd_set_symtab (abfd, new_syms, num_locals + num_globals);
4260
12bd6957 4261 *pnum_locals = num_locals;
b34976b6 4262 return TRUE;
252b5132
RH
4263}
4264
4265/* Align to the maximum file alignment that could be required for any
4266 ELF data structure. */
4267
268b6b39 4268static inline file_ptr
217aa764 4269align_file_position (file_ptr off, int align)
252b5132
RH
4270{
4271 return (off + align - 1) & ~(align - 1);
4272}
4273
4274/* Assign a file position to a section, optionally aligning to the
4275 required section alignment. */
4276
217aa764
AM
4277file_ptr
4278_bfd_elf_assign_file_position_for_section (Elf_Internal_Shdr *i_shdrp,
4279 file_ptr offset,
4280 bfd_boolean align)
252b5132 4281{
72de5009
AM
4282 if (align && i_shdrp->sh_addralign > 1)
4283 offset = BFD_ALIGN (offset, i_shdrp->sh_addralign);
252b5132
RH
4284 i_shdrp->sh_offset = offset;
4285 if (i_shdrp->bfd_section != NULL)
4286 i_shdrp->bfd_section->filepos = offset;
4287 if (i_shdrp->sh_type != SHT_NOBITS)
4288 offset += i_shdrp->sh_size;
4289 return offset;
4290}
4291
4292/* Compute the file positions we are going to put the sections at, and
4293 otherwise prepare to begin writing out the ELF file. If LINK_INFO
4294 is not NULL, this is being called by the ELF backend linker. */
4295
b34976b6 4296bfd_boolean
217aa764
AM
4297_bfd_elf_compute_section_file_positions (bfd *abfd,
4298 struct bfd_link_info *link_info)
252b5132 4299{
9c5bfbb7 4300 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
d4730f92 4301 struct fake_section_arg fsargs;
b34976b6 4302 bfd_boolean failed;
ef10c3ac 4303 struct elf_strtab_hash *strtab = NULL;
252b5132 4304 Elf_Internal_Shdr *shstrtab_hdr;
3516e984 4305 bfd_boolean need_symtab;
252b5132
RH
4306
4307 if (abfd->output_has_begun)
b34976b6 4308 return TRUE;
252b5132
RH
4309
4310 /* Do any elf backend specific processing first. */
4311 if (bed->elf_backend_begin_write_processing)
4312 (*bed->elf_backend_begin_write_processing) (abfd, link_info);
4313
ed7e9d0b 4314 if (!(*bed->elf_backend_init_file_header) (abfd, link_info))
b34976b6 4315 return FALSE;
252b5132 4316
d4730f92
BS
4317 fsargs.failed = FALSE;
4318 fsargs.link_info = link_info;
4319 bfd_map_over_sections (abfd, elf_fake_sections, &fsargs);
4320 if (fsargs.failed)
b34976b6 4321 return FALSE;
252b5132 4322
da9f89d4 4323 if (!assign_section_numbers (abfd, link_info))
b34976b6 4324 return FALSE;
252b5132
RH
4325
4326 /* The backend linker builds symbol table information itself. */
3516e984
L
4327 need_symtab = (link_info == NULL
4328 && (bfd_get_symcount (abfd) > 0
4329 || ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC))
4330 == HAS_RELOC)));
4331 if (need_symtab)
252b5132
RH
4332 {
4333 /* Non-zero if doing a relocatable link. */
4334 int relocatable_p = ! (abfd->flags & (EXEC_P | DYNAMIC));
4335
4336 if (! swap_out_syms (abfd, &strtab, relocatable_p))
b34976b6 4337 return FALSE;
252b5132
RH
4338 }
4339
d4730f92 4340 failed = FALSE;
1126897b 4341 if (link_info == NULL)
dbb410c3 4342 {
1126897b 4343 bfd_map_over_sections (abfd, bfd_elf_set_group_contents, &failed);
dbb410c3 4344 if (failed)
b34976b6 4345 return FALSE;
dbb410c3
AM
4346 }
4347
252b5132 4348 shstrtab_hdr = &elf_tdata (abfd)->shstrtab_hdr;
ed7e9d0b 4349 /* sh_name was set in init_file_header. */
252b5132 4350 shstrtab_hdr->sh_type = SHT_STRTAB;
84865015 4351 shstrtab_hdr->sh_flags = bed->elf_strtab_flags;
252b5132 4352 shstrtab_hdr->sh_addr = 0;
946748d5 4353 /* sh_size is set in _bfd_elf_assign_file_positions_for_non_load. */
252b5132
RH
4354 shstrtab_hdr->sh_entsize = 0;
4355 shstrtab_hdr->sh_link = 0;
4356 shstrtab_hdr->sh_info = 0;
3e19fb8f 4357 /* sh_offset is set in _bfd_elf_assign_file_positions_for_non_load. */
252b5132
RH
4358 shstrtab_hdr->sh_addralign = 1;
4359
c84fca4d 4360 if (!assign_file_positions_except_relocs (abfd, link_info))
b34976b6 4361 return FALSE;
252b5132 4362
3516e984 4363 if (need_symtab)
252b5132
RH
4364 {
4365 file_ptr off;
4366 Elf_Internal_Shdr *hdr;
4367
12bd6957 4368 off = elf_next_file_pos (abfd);
252b5132 4369
6a40cf0c 4370 hdr = & elf_symtab_hdr (abfd);
b34976b6 4371 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
252b5132 4372
6a40cf0c
NC
4373 if (elf_symtab_shndx_list (abfd) != NULL)
4374 {
4375 hdr = & elf_symtab_shndx_list (abfd)->hdr;
4376 if (hdr->sh_size != 0)
4377 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
4378 /* FIXME: What about other symtab_shndx sections in the list ? */
4379 }
9ad5cbcf 4380
252b5132 4381 hdr = &elf_tdata (abfd)->strtab_hdr;
b34976b6 4382 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
252b5132 4383
12bd6957 4384 elf_next_file_pos (abfd) = off;
252b5132
RH
4385
4386 /* Now that we know where the .strtab section goes, write it
08a40648 4387 out. */
252b5132 4388 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
ef10c3ac 4389 || ! _bfd_elf_strtab_emit (abfd, strtab))
b34976b6 4390 return FALSE;
ef10c3ac 4391 _bfd_elf_strtab_free (strtab);
252b5132
RH
4392 }
4393
b34976b6 4394 abfd->output_has_begun = TRUE;
252b5132 4395
b34976b6 4396 return TRUE;
252b5132
RH
4397}
4398
8ded5a0f
AM
4399/* Make an initial estimate of the size of the program header. If we
4400 get the number wrong here, we'll redo section placement. */
4401
4402static bfd_size_type
4403get_program_header_size (bfd *abfd, struct bfd_link_info *info)
4404{
4405 size_t segs;
4406 asection *s;
2b05f1b7 4407 const struct elf_backend_data *bed;
8ded5a0f
AM
4408
4409 /* Assume we will need exactly two PT_LOAD segments: one for text
4410 and one for data. */
4411 segs = 2;
4412
4413 s = bfd_get_section_by_name (abfd, ".interp");
1b9e270b 4414 if (s != NULL && (s->flags & SEC_LOAD) != 0 && s->size != 0)
8ded5a0f
AM
4415 {
4416 /* If we have a loadable interpreter section, we need a
4417 PT_INTERP segment. In this case, assume we also need a
4418 PT_PHDR segment, although that may not be true for all
4419 targets. */
e9a38e0f 4420 segs += 2;
8ded5a0f
AM
4421 }
4422
4423 if (bfd_get_section_by_name (abfd, ".dynamic") != NULL)
4424 {
4425 /* We need a PT_DYNAMIC segment. */
4426 ++segs;
f210dcff 4427 }
08a40648 4428
ceae84aa 4429 if (info != NULL && info->relro)
f210dcff
L
4430 {
4431 /* We need a PT_GNU_RELRO segment. */
4432 ++segs;
8ded5a0f
AM
4433 }
4434
12bd6957 4435 if (elf_eh_frame_hdr (abfd))
8ded5a0f
AM
4436 {
4437 /* We need a PT_GNU_EH_FRAME segment. */
4438 ++segs;
4439 }
4440
12bd6957 4441 if (elf_stack_flags (abfd))
8ded5a0f 4442 {
2b05f1b7
L
4443 /* We need a PT_GNU_STACK segment. */
4444 ++segs;
4445 }
94b11780 4446
0a59decb
L
4447 s = bfd_get_section_by_name (abfd,
4448 NOTE_GNU_PROPERTY_SECTION_NAME);
4449 if (s != NULL && s->size != 0)
4450 {
4451 /* We need a PT_GNU_PROPERTY segment. */
4452 ++segs;
4453 }
4454
2b05f1b7
L
4455 for (s = abfd->sections; s != NULL; s = s->next)
4456 {
8ded5a0f 4457 if ((s->flags & SEC_LOAD) != 0
23e463ed 4458 && elf_section_type (s) == SHT_NOTE)
8ded5a0f 4459 {
23e463ed 4460 unsigned int alignment_power;
8ded5a0f
AM
4461 /* We need a PT_NOTE segment. */
4462 ++segs;
23e463ed
L
4463 /* Try to create just one PT_NOTE segment for all adjacent
4464 loadable SHT_NOTE sections. gABI requires that within a
4465 PT_NOTE segment (and also inside of each SHT_NOTE section)
4466 each note should have the same alignment. So we check
4467 whether the sections are correctly aligned. */
4468 alignment_power = s->alignment_power;
4469 while (s->next != NULL
4470 && s->next->alignment_power == alignment_power
4471 && (s->next->flags & SEC_LOAD) != 0
4472 && elf_section_type (s->next) == SHT_NOTE)
4473 s = s->next;
8ded5a0f
AM
4474 }
4475 }
4476
4477 for (s = abfd->sections; s != NULL; s = s->next)
4478 {
4479 if (s->flags & SEC_THREAD_LOCAL)
4480 {
4481 /* We need a PT_TLS segment. */
4482 ++segs;
4483 break;
4484 }
4485 }
4486
2b05f1b7 4487 bed = get_elf_backend_data (abfd);
a91e1603 4488
df3a023b
AM
4489 if ((abfd->flags & D_PAGED) != 0
4490 && (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_mbind) != 0)
4491 {
4492 /* Add a PT_GNU_MBIND segment for each mbind section. */
4493 unsigned int page_align_power = bfd_log2 (bed->commonpagesize);
4494 for (s = abfd->sections; s != NULL; s = s->next)
4495 if (elf_section_flags (s) & SHF_GNU_MBIND)
4496 {
4497 if (elf_section_data (s)->this_hdr.sh_info > PT_GNU_MBIND_NUM)
4498 {
4499 _bfd_error_handler
4500 /* xgettext:c-format */
4501 (_("%pB: GNU_MBIND section `%pA' has invalid "
4502 "sh_info field: %d"),
4503 abfd, s, elf_section_data (s)->this_hdr.sh_info);
4504 continue;
4505 }
4506 /* Align mbind section to page size. */
4507 if (s->alignment_power < page_align_power)
4508 s->alignment_power = page_align_power;
4509 segs ++;
4510 }
4511 }
4512
4513 /* Let the backend count up any program headers it might need. */
4514 if (bed->elf_backend_additional_program_headers)
8ded5a0f
AM
4515 {
4516 int a;
4517
4518 a = (*bed->elf_backend_additional_program_headers) (abfd, info);
4519 if (a == -1)
4520 abort ();
4521 segs += a;
4522 }
4523
4524 return segs * bed->s->sizeof_phdr;
4525}
4526
2ea37f1c
NC
4527/* Find the segment that contains the output_section of section. */
4528
4529Elf_Internal_Phdr *
4530_bfd_elf_find_segment_containing_section (bfd * abfd, asection * section)
4531{
4532 struct elf_segment_map *m;
4533 Elf_Internal_Phdr *p;
4534
12bd6957 4535 for (m = elf_seg_map (abfd), p = elf_tdata (abfd)->phdr;
2ea37f1c
NC
4536 m != NULL;
4537 m = m->next, p++)
4538 {
4539 int i;
4540
4541 for (i = m->count - 1; i >= 0; i--)
4542 if (m->sections[i] == section)
4543 return p;
4544 }
4545
4546 return NULL;
4547}
4548
252b5132
RH
4549/* Create a mapping from a set of sections to a program segment. */
4550
217aa764
AM
4551static struct elf_segment_map *
4552make_mapping (bfd *abfd,
4553 asection **sections,
4554 unsigned int from,
4555 unsigned int to,
4556 bfd_boolean phdr)
252b5132
RH
4557{
4558 struct elf_segment_map *m;
4559 unsigned int i;
4560 asection **hdrpp;
dc810e39 4561 bfd_size_type amt;
252b5132 4562
00bee008
AM
4563 amt = sizeof (struct elf_segment_map) - sizeof (asection *);
4564 amt += (to - from) * sizeof (asection *);
a50b1753 4565 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
252b5132
RH
4566 if (m == NULL)
4567 return NULL;
4568 m->next = NULL;
4569 m->p_type = PT_LOAD;
4570 for (i = from, hdrpp = sections + from; i < to; i++, hdrpp++)
4571 m->sections[i - from] = *hdrpp;
4572 m->count = to - from;
4573
4574 if (from == 0 && phdr)
4575 {
4576 /* Include the headers in the first PT_LOAD segment. */
4577 m->includes_filehdr = 1;
4578 m->includes_phdrs = 1;
4579 }
4580
4581 return m;
4582}
4583
229fcec5
MM
4584/* Create the PT_DYNAMIC segment, which includes DYNSEC. Returns NULL
4585 on failure. */
4586
4587struct elf_segment_map *
4588_bfd_elf_make_dynamic_segment (bfd *abfd, asection *dynsec)
4589{
4590 struct elf_segment_map *m;
4591
a50b1753 4592 m = (struct elf_segment_map *) bfd_zalloc (abfd,
07d6d2b8 4593 sizeof (struct elf_segment_map));
229fcec5
MM
4594 if (m == NULL)
4595 return NULL;
4596 m->next = NULL;
4597 m->p_type = PT_DYNAMIC;
4598 m->count = 1;
4599 m->sections[0] = dynsec;
08a40648 4600
229fcec5
MM
4601 return m;
4602}
4603
8ded5a0f 4604/* Possibly add or remove segments from the segment map. */
252b5132 4605
b34976b6 4606static bfd_boolean
3dea8fca
AM
4607elf_modify_segment_map (bfd *abfd,
4608 struct bfd_link_info *info,
4609 bfd_boolean remove_empty_load)
252b5132 4610{
252e386e 4611 struct elf_segment_map **m;
8ded5a0f 4612 const struct elf_backend_data *bed;
252b5132 4613
8ded5a0f
AM
4614 /* The placement algorithm assumes that non allocated sections are
4615 not in PT_LOAD segments. We ensure this here by removing such
4616 sections from the segment map. We also remove excluded
252e386e
AM
4617 sections. Finally, any PT_LOAD segment without sections is
4618 removed. */
12bd6957 4619 m = &elf_seg_map (abfd);
252e386e 4620 while (*m)
8ded5a0f
AM
4621 {
4622 unsigned int i, new_count;
252b5132 4623
252e386e 4624 for (new_count = 0, i = 0; i < (*m)->count; i++)
8ded5a0f 4625 {
252e386e
AM
4626 if (((*m)->sections[i]->flags & SEC_EXCLUDE) == 0
4627 && (((*m)->sections[i]->flags & SEC_ALLOC) != 0
4628 || (*m)->p_type != PT_LOAD))
8ded5a0f 4629 {
252e386e
AM
4630 (*m)->sections[new_count] = (*m)->sections[i];
4631 new_count++;
8ded5a0f
AM
4632 }
4633 }
252e386e 4634 (*m)->count = new_count;
252b5132 4635
1a9ccd70
NC
4636 if (remove_empty_load
4637 && (*m)->p_type == PT_LOAD
4638 && (*m)->count == 0
4639 && !(*m)->includes_phdrs)
252e386e
AM
4640 *m = (*m)->next;
4641 else
4642 m = &(*m)->next;
8ded5a0f 4643 }
252b5132 4644
8ded5a0f
AM
4645 bed = get_elf_backend_data (abfd);
4646 if (bed->elf_backend_modify_segment_map != NULL)
252b5132 4647 {
252e386e 4648 if (!(*bed->elf_backend_modify_segment_map) (abfd, info))
8ded5a0f 4649 return FALSE;
252b5132 4650 }
252b5132 4651
8ded5a0f
AM
4652 return TRUE;
4653}
252b5132 4654
dbc88fc1
AM
4655#define IS_TBSS(s) \
4656 ((s->flags & (SEC_THREAD_LOCAL | SEC_LOAD)) == SEC_THREAD_LOCAL)
4657
8ded5a0f 4658/* Set up a mapping from BFD sections to program segments. */
252b5132 4659
8ded5a0f
AM
4660bfd_boolean
4661_bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
4662{
4663 unsigned int count;
4664 struct elf_segment_map *m;
4665 asection **sections = NULL;
4666 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3dea8fca 4667 bfd_boolean no_user_phdrs;
252b5132 4668
12bd6957 4669 no_user_phdrs = elf_seg_map (abfd) == NULL;
d324f6d6
RM
4670
4671 if (info != NULL)
4672 info->user_phdrs = !no_user_phdrs;
4673
3dea8fca 4674 if (no_user_phdrs && bfd_count_sections (abfd) != 0)
252b5132 4675 {
8ded5a0f
AM
4676 asection *s;
4677 unsigned int i;
4678 struct elf_segment_map *mfirst;
4679 struct elf_segment_map **pm;
4680 asection *last_hdr;
4681 bfd_vma last_size;
00bee008 4682 unsigned int hdr_index;
8ded5a0f
AM
4683 bfd_vma maxpagesize;
4684 asection **hdrpp;
64029e93 4685 bfd_boolean phdr_in_segment;
8ded5a0f 4686 bfd_boolean writable;
2888249f 4687 bfd_boolean executable;
8ded5a0f
AM
4688 int tls_count = 0;
4689 asection *first_tls = NULL;
a91e1603 4690 asection *first_mbind = NULL;
8ded5a0f
AM
4691 asection *dynsec, *eh_frame_hdr;
4692 bfd_size_type amt;
8d06853e 4693 bfd_vma addr_mask, wrap_to = 0;
64029e93 4694 bfd_size_type phdr_size;
252b5132 4695
8ded5a0f 4696 /* Select the allocated sections, and sort them. */
252b5132 4697
a50b1753 4698 sections = (asection **) bfd_malloc2 (bfd_count_sections (abfd),
07d6d2b8 4699 sizeof (asection *));
8ded5a0f 4700 if (sections == NULL)
252b5132 4701 goto error_return;
252b5132 4702
8d06853e
AM
4703 /* Calculate top address, avoiding undefined behaviour of shift
4704 left operator when shift count is equal to size of type
4705 being shifted. */
4706 addr_mask = ((bfd_vma) 1 << (bfd_arch_bits_per_address (abfd) - 1)) - 1;
4707 addr_mask = (addr_mask << 1) + 1;
4708
8ded5a0f
AM
4709 i = 0;
4710 for (s = abfd->sections; s != NULL; s = s->next)
4711 {
4712 if ((s->flags & SEC_ALLOC) != 0)
4713 {
48db3297
AM
4714 /* target_index is unused until bfd_elf_final_link
4715 starts output of section symbols. Use it to make
4716 qsort stable. */
4717 s->target_index = i;
8ded5a0f
AM
4718 sections[i] = s;
4719 ++i;
8d06853e
AM
4720 /* A wrapping section potentially clashes with header. */
4721 if (((s->lma + s->size) & addr_mask) < (s->lma & addr_mask))
4722 wrap_to = (s->lma + s->size) & addr_mask;
8ded5a0f
AM
4723 }
4724 }
4725 BFD_ASSERT (i <= bfd_count_sections (abfd));
4726 count = i;
252b5132 4727
8ded5a0f 4728 qsort (sections, (size_t) count, sizeof (asection *), elf_sort_sections);
252b5132 4729
64029e93
AM
4730 phdr_size = elf_program_header_size (abfd);
4731 if (phdr_size == (bfd_size_type) -1)
4732 phdr_size = get_program_header_size (abfd, info);
4733 phdr_size += bed->s->sizeof_ehdr;
4734 maxpagesize = bed->maxpagesize;
4735 if (maxpagesize == 0)
4736 maxpagesize = 1;
4737 phdr_in_segment = info != NULL && info->load_phdrs;
4738 if (count != 0
4739 && (((sections[0]->lma & addr_mask) & (maxpagesize - 1))
4740 >= (phdr_size & (maxpagesize - 1))))
4741 /* For compatibility with old scripts that may not be using
4742 SIZEOF_HEADERS, add headers when it looks like space has
4743 been left for them. */
4744 phdr_in_segment = TRUE;
252b5132 4745
64029e93 4746 /* Build the mapping. */
8ded5a0f
AM
4747 mfirst = NULL;
4748 pm = &mfirst;
252b5132 4749
8ded5a0f
AM
4750 /* If we have a .interp section, then create a PT_PHDR segment for
4751 the program headers and a PT_INTERP segment for the .interp
4752 section. */
4753 s = bfd_get_section_by_name (abfd, ".interp");
1b9e270b 4754 if (s != NULL && (s->flags & SEC_LOAD) != 0 && s->size != 0)
8ded5a0f
AM
4755 {
4756 amt = sizeof (struct elf_segment_map);
a50b1753 4757 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
4758 if (m == NULL)
4759 goto error_return;
4760 m->next = NULL;
4761 m->p_type = PT_PHDR;
f882209d 4762 m->p_flags = PF_R;
8ded5a0f
AM
4763 m->p_flags_valid = 1;
4764 m->includes_phdrs = 1;
64029e93 4765 phdr_in_segment = TRUE;
8ded5a0f
AM
4766 *pm = m;
4767 pm = &m->next;
252b5132 4768
8ded5a0f 4769 amt = sizeof (struct elf_segment_map);
a50b1753 4770 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
4771 if (m == NULL)
4772 goto error_return;
4773 m->next = NULL;
4774 m->p_type = PT_INTERP;
4775 m->count = 1;
4776 m->sections[0] = s;
4777
4778 *pm = m;
4779 pm = &m->next;
252b5132 4780 }
8ded5a0f
AM
4781
4782 /* Look through the sections. We put sections in the same program
4783 segment when the start of the second section can be placed within
4784 a few bytes of the end of the first section. */
4785 last_hdr = NULL;
4786 last_size = 0;
00bee008 4787 hdr_index = 0;
8ded5a0f 4788 writable = FALSE;
2888249f 4789 executable = FALSE;
8ded5a0f
AM
4790 dynsec = bfd_get_section_by_name (abfd, ".dynamic");
4791 if (dynsec != NULL
4792 && (dynsec->flags & SEC_LOAD) == 0)
4793 dynsec = NULL;
4794
64029e93
AM
4795 if ((abfd->flags & D_PAGED) == 0)
4796 phdr_in_segment = FALSE;
4797
8ded5a0f
AM
4798 /* Deal with -Ttext or something similar such that the first section
4799 is not adjacent to the program headers. This is an
4800 approximation, since at this point we don't know exactly how many
4801 program headers we will need. */
64029e93 4802 if (phdr_in_segment && count > 0)
252b5132 4803 {
64029e93
AM
4804 bfd_vma phdr_lma;
4805 bfd_boolean separate_phdr = FALSE;
4806
4807 phdr_lma = (sections[0]->lma - phdr_size) & addr_mask & -maxpagesize;
4808 if (info != NULL
4809 && info->separate_code
4810 && (sections[0]->flags & SEC_CODE) != 0)
1a9ccd70 4811 {
64029e93
AM
4812 /* If data sections should be separate from code and
4813 thus not executable, and the first section is
4814 executable then put the file and program headers in
4815 their own PT_LOAD. */
4816 separate_phdr = TRUE;
4817 if ((((phdr_lma + phdr_size - 1) & addr_mask & -maxpagesize)
4818 == (sections[0]->lma & addr_mask & -maxpagesize)))
4819 {
4820 /* The file and program headers are currently on the
4821 same page as the first section. Put them on the
4822 previous page if we can. */
4823 if (phdr_lma >= maxpagesize)
4824 phdr_lma -= maxpagesize;
4825 else
4826 separate_phdr = FALSE;
4827 }
4828 }
4829 if ((sections[0]->lma & addr_mask) < phdr_lma
4830 || (sections[0]->lma & addr_mask) < phdr_size)
4831 /* If file and program headers would be placed at the end
4832 of memory then it's probably better to omit them. */
4833 phdr_in_segment = FALSE;
4834 else if (phdr_lma < wrap_to)
4835 /* If a section wraps around to where we'll be placing
4836 file and program headers, then the headers will be
4837 overwritten. */
4838 phdr_in_segment = FALSE;
4839 else if (separate_phdr)
4840 {
4841 m = make_mapping (abfd, sections, 0, 0, phdr_in_segment);
4842 if (m == NULL)
4843 goto error_return;
4844 m->p_paddr = phdr_lma;
4845 m->p_vaddr_offset
4846 = (sections[0]->vma - phdr_size) & addr_mask & -maxpagesize;
4847 m->p_paddr_valid = 1;
4848 *pm = m;
4849 pm = &m->next;
4850 phdr_in_segment = FALSE;
1a9ccd70 4851 }
252b5132
RH
4852 }
4853
8ded5a0f 4854 for (i = 0, hdrpp = sections; i < count; i++, hdrpp++)
252b5132 4855 {
8ded5a0f
AM
4856 asection *hdr;
4857 bfd_boolean new_segment;
4858
4859 hdr = *hdrpp;
4860
4861 /* See if this section and the last one will fit in the same
4862 segment. */
4863
4864 if (last_hdr == NULL)
4865 {
4866 /* If we don't have a segment yet, then we don't need a new
4867 one (we build the last one after this loop). */
4868 new_segment = FALSE;
4869 }
4870 else if (last_hdr->lma - last_hdr->vma != hdr->lma - hdr->vma)
4871 {
4872 /* If this section has a different relation between the
4873 virtual address and the load address, then we need a new
4874 segment. */
4875 new_segment = TRUE;
4876 }
b5599592
AM
4877 else if (hdr->lma < last_hdr->lma + last_size
4878 || last_hdr->lma + last_size < last_hdr->lma)
4879 {
4880 /* If this section has a load address that makes it overlap
4881 the previous section, then we need a new segment. */
4882 new_segment = TRUE;
4883 }
76cb3a89
AM
4884 else if ((abfd->flags & D_PAGED) != 0
4885 && (((last_hdr->lma + last_size - 1) & -maxpagesize)
4886 == (hdr->lma & -maxpagesize)))
4887 {
4888 /* If we are demand paged then we can't map two disk
4889 pages onto the same memory page. */
4890 new_segment = FALSE;
4891 }
39948a60
NC
4892 /* In the next test we have to be careful when last_hdr->lma is close
4893 to the end of the address space. If the aligned address wraps
4894 around to the start of the address space, then there are no more
4895 pages left in memory and it is OK to assume that the current
4896 section can be included in the current segment. */
76cb3a89
AM
4897 else if ((BFD_ALIGN (last_hdr->lma + last_size, maxpagesize)
4898 + maxpagesize > last_hdr->lma)
4899 && (BFD_ALIGN (last_hdr->lma + last_size, maxpagesize)
4900 + maxpagesize <= hdr->lma))
8ded5a0f
AM
4901 {
4902 /* If putting this section in this segment would force us to
4903 skip a page in the segment, then we need a new segment. */
4904 new_segment = TRUE;
4905 }
4906 else if ((last_hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0
76cb3a89 4907 && (hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) != 0)
8ded5a0f 4908 {
e5654c0f
AM
4909 /* We don't want to put a loaded section after a
4910 nonloaded (ie. bss style) section in the same segment
4911 as that will force the non-loaded section to be loaded.
76cb3a89 4912 Consider .tbss sections as loaded for this purpose. */
8ded5a0f
AM
4913 new_segment = TRUE;
4914 }
4915 else if ((abfd->flags & D_PAGED) == 0)
4916 {
4917 /* If the file is not demand paged, which means that we
4918 don't require the sections to be correctly aligned in the
4919 file, then there is no other reason for a new segment. */
4920 new_segment = FALSE;
4921 }
2888249f
L
4922 else if (info != NULL
4923 && info->separate_code
4924 && executable != ((hdr->flags & SEC_CODE) != 0))
4925 {
4926 new_segment = TRUE;
4927 }
8ded5a0f 4928 else if (! writable
76cb3a89 4929 && (hdr->flags & SEC_READONLY) == 0)
8ded5a0f
AM
4930 {
4931 /* We don't want to put a writable section in a read only
76cb3a89 4932 segment. */
8ded5a0f
AM
4933 new_segment = TRUE;
4934 }
4935 else
4936 {
4937 /* Otherwise, we can use the same segment. */
4938 new_segment = FALSE;
4939 }
4940
2889e75b 4941 /* Allow interested parties a chance to override our decision. */
ceae84aa
AM
4942 if (last_hdr != NULL
4943 && info != NULL
4944 && info->callbacks->override_segment_assignment != NULL)
4945 new_segment
4946 = info->callbacks->override_segment_assignment (info, abfd, hdr,
4947 last_hdr,
4948 new_segment);
2889e75b 4949
8ded5a0f
AM
4950 if (! new_segment)
4951 {
4952 if ((hdr->flags & SEC_READONLY) == 0)
4953 writable = TRUE;
2888249f
L
4954 if ((hdr->flags & SEC_CODE) != 0)
4955 executable = TRUE;
8ded5a0f
AM
4956 last_hdr = hdr;
4957 /* .tbss sections effectively have zero size. */
dbc88fc1 4958 last_size = !IS_TBSS (hdr) ? hdr->size : 0;
8ded5a0f
AM
4959 continue;
4960 }
4961
4962 /* We need a new program segment. We must create a new program
00bee008 4963 header holding all the sections from hdr_index until hdr. */
8ded5a0f 4964
00bee008 4965 m = make_mapping (abfd, sections, hdr_index, i, phdr_in_segment);
8ded5a0f
AM
4966 if (m == NULL)
4967 goto error_return;
4968
4969 *pm = m;
4970 pm = &m->next;
4971
252b5132 4972 if ((hdr->flags & SEC_READONLY) == 0)
b34976b6 4973 writable = TRUE;
8ded5a0f
AM
4974 else
4975 writable = FALSE;
4976
2888249f
L
4977 if ((hdr->flags & SEC_CODE) == 0)
4978 executable = FALSE;
4979 else
4980 executable = TRUE;
4981
baaff79e
JJ
4982 last_hdr = hdr;
4983 /* .tbss sections effectively have zero size. */
dbc88fc1 4984 last_size = !IS_TBSS (hdr) ? hdr->size : 0;
00bee008 4985 hdr_index = i;
8ded5a0f 4986 phdr_in_segment = FALSE;
252b5132
RH
4987 }
4988
86b2281f
AM
4989 /* Create a final PT_LOAD program segment, but not if it's just
4990 for .tbss. */
4991 if (last_hdr != NULL
00bee008 4992 && (i - hdr_index != 1
dbc88fc1 4993 || !IS_TBSS (last_hdr)))
8ded5a0f 4994 {
00bee008 4995 m = make_mapping (abfd, sections, hdr_index, i, phdr_in_segment);
8ded5a0f
AM
4996 if (m == NULL)
4997 goto error_return;
252b5132 4998
8ded5a0f
AM
4999 *pm = m;
5000 pm = &m->next;
5001 }
252b5132 5002
8ded5a0f
AM
5003 /* If there is a .dynamic section, throw in a PT_DYNAMIC segment. */
5004 if (dynsec != NULL)
5005 {
5006 m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
5007 if (m == NULL)
5008 goto error_return;
5009 *pm = m;
5010 pm = &m->next;
5011 }
252b5132 5012
23e463ed 5013 /* For each batch of consecutive loadable SHT_NOTE sections,
1c5265b5
JJ
5014 add a PT_NOTE segment. We don't use bfd_get_section_by_name,
5015 because if we link together nonloadable .note sections and
5016 loadable .note sections, we will generate two .note sections
23e463ed 5017 in the output file. */
8ded5a0f
AM
5018 for (s = abfd->sections; s != NULL; s = s->next)
5019 {
5020 if ((s->flags & SEC_LOAD) != 0
23e463ed 5021 && elf_section_type (s) == SHT_NOTE)
8ded5a0f 5022 {
1c5265b5 5023 asection *s2;
23e463ed 5024 unsigned int alignment_power = s->alignment_power;
91d6fa6a
NC
5025
5026 count = 1;
23e463ed
L
5027 for (s2 = s; s2->next != NULL; s2 = s2->next)
5028 {
5029 if (s2->next->alignment_power == alignment_power
5030 && (s2->next->flags & SEC_LOAD) != 0
5031 && elf_section_type (s2->next) == SHT_NOTE
5032 && align_power (s2->lma + s2->size,
5033 alignment_power)
5034 == s2->next->lma)
5035 count++;
5036 else
5037 break;
5038 }
00bee008
AM
5039 amt = sizeof (struct elf_segment_map) - sizeof (asection *);
5040 amt += count * sizeof (asection *);
a50b1753 5041 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
5042 if (m == NULL)
5043 goto error_return;
5044 m->next = NULL;
5045 m->p_type = PT_NOTE;
1c5265b5
JJ
5046 m->count = count;
5047 while (count > 1)
5048 {
5049 m->sections[m->count - count--] = s;
5050 BFD_ASSERT ((s->flags & SEC_THREAD_LOCAL) == 0);
5051 s = s->next;
5052 }
5053 m->sections[m->count - 1] = s;
5054 BFD_ASSERT ((s->flags & SEC_THREAD_LOCAL) == 0);
8ded5a0f
AM
5055 *pm = m;
5056 pm = &m->next;
5057 }
5058 if (s->flags & SEC_THREAD_LOCAL)
5059 {
5060 if (! tls_count)
5061 first_tls = s;
5062 tls_count++;
5063 }
a91e1603
L
5064 if (first_mbind == NULL
5065 && (elf_section_flags (s) & SHF_GNU_MBIND) != 0)
5066 first_mbind = s;
8ded5a0f 5067 }
252b5132 5068
8ded5a0f
AM
5069 /* If there are any SHF_TLS output sections, add PT_TLS segment. */
5070 if (tls_count > 0)
5071 {
00bee008
AM
5072 amt = sizeof (struct elf_segment_map) - sizeof (asection *);
5073 amt += tls_count * sizeof (asection *);
a50b1753 5074 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
5075 if (m == NULL)
5076 goto error_return;
5077 m->next = NULL;
5078 m->p_type = PT_TLS;
5079 m->count = tls_count;
5080 /* Mandated PF_R. */
5081 m->p_flags = PF_R;
5082 m->p_flags_valid = 1;
d923cae0 5083 s = first_tls;
91d6fa6a 5084 for (i = 0; i < (unsigned int) tls_count; ++i)
8ded5a0f 5085 {
d923cae0
L
5086 if ((s->flags & SEC_THREAD_LOCAL) == 0)
5087 {
5088 _bfd_error_handler
871b3ab2 5089 (_("%pB: TLS sections are not adjacent:"), abfd);
d923cae0
L
5090 s = first_tls;
5091 i = 0;
5092 while (i < (unsigned int) tls_count)
5093 {
5094 if ((s->flags & SEC_THREAD_LOCAL) != 0)
5095 {
871b3ab2 5096 _bfd_error_handler (_(" TLS: %pA"), s);
d923cae0
L
5097 i++;
5098 }
5099 else
871b3ab2 5100 _bfd_error_handler (_(" non-TLS: %pA"), s);
d923cae0
L
5101 s = s->next;
5102 }
5103 bfd_set_error (bfd_error_bad_value);
5104 goto error_return;
5105 }
5106 m->sections[i] = s;
5107 s = s->next;
8ded5a0f 5108 }
252b5132 5109
8ded5a0f
AM
5110 *pm = m;
5111 pm = &m->next;
5112 }
252b5132 5113
df3a023b
AM
5114 if (first_mbind
5115 && (abfd->flags & D_PAGED) != 0
5116 && (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_mbind) != 0)
a91e1603
L
5117 for (s = first_mbind; s != NULL; s = s->next)
5118 if ((elf_section_flags (s) & SHF_GNU_MBIND) != 0
df3a023b 5119 && elf_section_data (s)->this_hdr.sh_info <= PT_GNU_MBIND_NUM)
a91e1603
L
5120 {
5121 /* Mandated PF_R. */
5122 unsigned long p_flags = PF_R;
5123 if ((s->flags & SEC_READONLY) == 0)
5124 p_flags |= PF_W;
5125 if ((s->flags & SEC_CODE) != 0)
5126 p_flags |= PF_X;
5127
5128 amt = sizeof (struct elf_segment_map) + sizeof (asection *);
5129 m = bfd_zalloc (abfd, amt);
5130 if (m == NULL)
5131 goto error_return;
5132 m->next = NULL;
5133 m->p_type = (PT_GNU_MBIND_LO
5134 + elf_section_data (s)->this_hdr.sh_info);
5135 m->count = 1;
5136 m->p_flags_valid = 1;
5137 m->sections[0] = s;
5138 m->p_flags = p_flags;
5139
5140 *pm = m;
5141 pm = &m->next;
5142 }
5143
0a59decb
L
5144 s = bfd_get_section_by_name (abfd,
5145 NOTE_GNU_PROPERTY_SECTION_NAME);
5146 if (s != NULL && s->size != 0)
5147 {
5148 amt = sizeof (struct elf_segment_map) + sizeof (asection *);
5149 m = bfd_zalloc (abfd, amt);
5150 if (m == NULL)
5151 goto error_return;
5152 m->next = NULL;
5153 m->p_type = PT_GNU_PROPERTY;
5154 m->count = 1;
5155 m->p_flags_valid = 1;
5156 m->sections[0] = s;
5157 m->p_flags = PF_R;
5158 *pm = m;
5159 pm = &m->next;
5160 }
5161
8ded5a0f
AM
5162 /* If there is a .eh_frame_hdr section, throw in a PT_GNU_EH_FRAME
5163 segment. */
12bd6957 5164 eh_frame_hdr = elf_eh_frame_hdr (abfd);
8ded5a0f
AM
5165 if (eh_frame_hdr != NULL
5166 && (eh_frame_hdr->output_section->flags & SEC_LOAD) != 0)
252b5132 5167 {
dc810e39 5168 amt = sizeof (struct elf_segment_map);
a50b1753 5169 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
252b5132
RH
5170 if (m == NULL)
5171 goto error_return;
5172 m->next = NULL;
8ded5a0f 5173 m->p_type = PT_GNU_EH_FRAME;
252b5132 5174 m->count = 1;
8ded5a0f 5175 m->sections[0] = eh_frame_hdr->output_section;
252b5132
RH
5176
5177 *pm = m;
5178 pm = &m->next;
5179 }
13ae64f3 5180
12bd6957 5181 if (elf_stack_flags (abfd))
13ae64f3 5182 {
8ded5a0f 5183 amt = sizeof (struct elf_segment_map);
a50b1753 5184 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
5185 if (m == NULL)
5186 goto error_return;
5187 m->next = NULL;
2b05f1b7 5188 m->p_type = PT_GNU_STACK;
12bd6957 5189 m->p_flags = elf_stack_flags (abfd);
04c3a755 5190 m->p_align = bed->stack_align;
8ded5a0f 5191 m->p_flags_valid = 1;
04c3a755
NS
5192 m->p_align_valid = m->p_align != 0;
5193 if (info->stacksize > 0)
5194 {
5195 m->p_size = info->stacksize;
5196 m->p_size_valid = 1;
5197 }
252b5132 5198
8ded5a0f
AM
5199 *pm = m;
5200 pm = &m->next;
5201 }
65765700 5202
ceae84aa 5203 if (info != NULL && info->relro)
8ded5a0f 5204 {
f210dcff
L
5205 for (m = mfirst; m != NULL; m = m->next)
5206 {
3832a4d8
AM
5207 if (m->p_type == PT_LOAD
5208 && m->count != 0
5209 && m->sections[0]->vma >= info->relro_start
5210 && m->sections[0]->vma < info->relro_end)
f210dcff 5211 {
3832a4d8
AM
5212 i = m->count;
5213 while (--i != (unsigned) -1)
5214 if ((m->sections[i]->flags & (SEC_LOAD | SEC_HAS_CONTENTS))
5215 == (SEC_LOAD | SEC_HAS_CONTENTS))
5216 break;
5217
43a8475c 5218 if (i != (unsigned) -1)
f210dcff
L
5219 break;
5220 }
be01b344 5221 }
f210dcff
L
5222
5223 /* Make a PT_GNU_RELRO segment only when it isn't empty. */
5224 if (m != NULL)
5225 {
5226 amt = sizeof (struct elf_segment_map);
a50b1753 5227 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
f210dcff
L
5228 if (m == NULL)
5229 goto error_return;
5230 m->next = NULL;
5231 m->p_type = PT_GNU_RELRO;
f210dcff
L
5232 *pm = m;
5233 pm = &m->next;
5234 }
8ded5a0f 5235 }
9ee5e499 5236
8ded5a0f 5237 free (sections);
12bd6957 5238 elf_seg_map (abfd) = mfirst;
9ee5e499
JJ
5239 }
5240
3dea8fca 5241 if (!elf_modify_segment_map (abfd, info, no_user_phdrs))
8ded5a0f 5242 return FALSE;
8c37241b 5243
12bd6957 5244 for (count = 0, m = elf_seg_map (abfd); m != NULL; m = m->next)
8ded5a0f 5245 ++count;
12bd6957 5246 elf_program_header_size (abfd) = count * bed->s->sizeof_phdr;
252b5132 5247
b34976b6 5248 return TRUE;
252b5132
RH
5249
5250 error_return:
5251 if (sections != NULL)
5252 free (sections);
b34976b6 5253 return FALSE;
252b5132
RH
5254}
5255
5256/* Sort sections by address. */
5257
5258static int
217aa764 5259elf_sort_sections (const void *arg1, const void *arg2)
252b5132
RH
5260{
5261 const asection *sec1 = *(const asection **) arg1;
5262 const asection *sec2 = *(const asection **) arg2;
eecdbe52 5263 bfd_size_type size1, size2;
252b5132
RH
5264
5265 /* Sort by LMA first, since this is the address used to
5266 place the section into a segment. */
5267 if (sec1->lma < sec2->lma)
5268 return -1;
5269 else if (sec1->lma > sec2->lma)
5270 return 1;
5271
5272 /* Then sort by VMA. Normally the LMA and the VMA will be
5273 the same, and this will do nothing. */
5274 if (sec1->vma < sec2->vma)
5275 return -1;
5276 else if (sec1->vma > sec2->vma)
5277 return 1;
5278
5279 /* Put !SEC_LOAD sections after SEC_LOAD ones. */
5280
07c6e936 5281#define TOEND(x) (((x)->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0)
252b5132
RH
5282
5283 if (TOEND (sec1))
5284 {
48db3297 5285 if (!TOEND (sec2))
252b5132
RH
5286 return 1;
5287 }
00a7cdc5 5288 else if (TOEND (sec2))
252b5132
RH
5289 return -1;
5290
5291#undef TOEND
5292
00a7cdc5
NC
5293 /* Sort by size, to put zero sized sections
5294 before others at the same address. */
252b5132 5295
eea6121a
AM
5296 size1 = (sec1->flags & SEC_LOAD) ? sec1->size : 0;
5297 size2 = (sec2->flags & SEC_LOAD) ? sec2->size : 0;
eecdbe52
JJ
5298
5299 if (size1 < size2)
252b5132 5300 return -1;
eecdbe52 5301 if (size1 > size2)
252b5132
RH
5302 return 1;
5303
5304 return sec1->target_index - sec2->target_index;
5305}
5306
30fe1832
AM
5307/* This qsort comparison functions sorts PT_LOAD segments first and
5308 by p_paddr, for assign_file_positions_for_load_sections. */
5309
5310static int
5311elf_sort_segments (const void *arg1, const void *arg2)
5312{
5313 const struct elf_segment_map *m1 = *(const struct elf_segment_map **) arg1;
5314 const struct elf_segment_map *m2 = *(const struct elf_segment_map **) arg2;
5315
5316 if (m1->p_type != m2->p_type)
5317 {
5318 if (m1->p_type == PT_NULL)
5319 return 1;
5320 if (m2->p_type == PT_NULL)
5321 return -1;
5322 return m1->p_type < m2->p_type ? -1 : 1;
5323 }
5324 if (m1->includes_filehdr != m2->includes_filehdr)
5325 return m1->includes_filehdr ? -1 : 1;
5326 if (m1->no_sort_lma != m2->no_sort_lma)
5327 return m1->no_sort_lma ? -1 : 1;
5328 if (m1->p_type == PT_LOAD && !m1->no_sort_lma)
5329 {
5330 bfd_vma lma1, lma2;
5331 lma1 = 0;
5332 if (m1->p_paddr_valid)
5333 lma1 = m1->p_paddr;
5334 else if (m1->count != 0)
5335 lma1 = m1->sections[0]->lma + m1->p_vaddr_offset;
5336 lma2 = 0;
5337 if (m2->p_paddr_valid)
5338 lma2 = m2->p_paddr;
5339 else if (m2->count != 0)
5340 lma2 = m2->sections[0]->lma + m2->p_vaddr_offset;
5341 if (lma1 != lma2)
5342 return lma1 < lma2 ? -1 : 1;
5343 }
5344 if (m1->idx != m2->idx)
5345 return m1->idx < m2->idx ? -1 : 1;
5346 return 0;
5347}
5348
340b6d91
AC
5349/* Ian Lance Taylor writes:
5350
5351 We shouldn't be using % with a negative signed number. That's just
5352 not good. We have to make sure either that the number is not
5353 negative, or that the number has an unsigned type. When the types
5354 are all the same size they wind up as unsigned. When file_ptr is a
5355 larger signed type, the arithmetic winds up as signed long long,
5356 which is wrong.
5357
5358 What we're trying to say here is something like ``increase OFF by
5359 the least amount that will cause it to be equal to the VMA modulo
5360 the page size.'' */
5361/* In other words, something like:
5362
5363 vma_offset = m->sections[0]->vma % bed->maxpagesize;
5364 off_offset = off % bed->maxpagesize;
5365 if (vma_offset < off_offset)
5366 adjustment = vma_offset + bed->maxpagesize - off_offset;
5367 else
5368 adjustment = vma_offset - off_offset;
08a40648 5369
de194d85 5370 which can be collapsed into the expression below. */
340b6d91
AC
5371
5372static file_ptr
5373vma_page_aligned_bias (bfd_vma vma, ufile_ptr off, bfd_vma maxpagesize)
5374{
dc9155b2
NC
5375 /* PR binutils/16199: Handle an alignment of zero. */
5376 if (maxpagesize == 0)
5377 maxpagesize = 1;
340b6d91
AC
5378 return ((vma - off) % maxpagesize);
5379}
5380
6d33f217
L
5381static void
5382print_segment_map (const struct elf_segment_map *m)
5383{
5384 unsigned int j;
5385 const char *pt = get_segment_type (m->p_type);
5386 char buf[32];
5387
5388 if (pt == NULL)
5389 {
5390 if (m->p_type >= PT_LOPROC && m->p_type <= PT_HIPROC)
5391 sprintf (buf, "LOPROC+%7.7x",
5392 (unsigned int) (m->p_type - PT_LOPROC));
5393 else if (m->p_type >= PT_LOOS && m->p_type <= PT_HIOS)
5394 sprintf (buf, "LOOS+%7.7x",
5395 (unsigned int) (m->p_type - PT_LOOS));
5396 else
5397 snprintf (buf, sizeof (buf), "%8.8x",
5398 (unsigned int) m->p_type);
5399 pt = buf;
5400 }
4a97a0e5 5401 fflush (stdout);
6d33f217
L
5402 fprintf (stderr, "%s:", pt);
5403 for (j = 0; j < m->count; j++)
5404 fprintf (stderr, " %s", m->sections [j]->name);
5405 putc ('\n',stderr);
4a97a0e5 5406 fflush (stderr);
6d33f217
L
5407}
5408
32812159
AM
5409static bfd_boolean
5410write_zeros (bfd *abfd, file_ptr pos, bfd_size_type len)
5411{
5412 void *buf;
5413 bfd_boolean ret;
5414
5415 if (bfd_seek (abfd, pos, SEEK_SET) != 0)
5416 return FALSE;
5417 buf = bfd_zmalloc (len);
5418 if (buf == NULL)
5419 return FALSE;
5420 ret = bfd_bwrite (buf, len, abfd) == len;
5421 free (buf);
5422 return ret;
5423}
5424
252b5132
RH
5425/* Assign file positions to the sections based on the mapping from
5426 sections to segments. This function also sets up some fields in
f3520d2f 5427 the file header. */
252b5132 5428
b34976b6 5429static bfd_boolean
f3520d2f
AM
5430assign_file_positions_for_load_sections (bfd *abfd,
5431 struct bfd_link_info *link_info)
252b5132
RH
5432{
5433 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 5434 struct elf_segment_map *m;
30fe1832 5435 struct elf_segment_map *phdr_load_seg;
252b5132 5436 Elf_Internal_Phdr *phdrs;
252b5132 5437 Elf_Internal_Phdr *p;
02bf8d82 5438 file_ptr off;
3f570048 5439 bfd_size_type maxpagesize;
30fe1832 5440 unsigned int alloc, actual;
0920dee7 5441 unsigned int i, j;
30fe1832 5442 struct elf_segment_map **sorted_seg_map;
252b5132 5443
e36284ab 5444 if (link_info == NULL
ceae84aa 5445 && !_bfd_elf_map_sections_to_segments (abfd, link_info))
8ded5a0f 5446 return FALSE;
252b5132 5447
8ded5a0f 5448 alloc = 0;
12bd6957 5449 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
30fe1832 5450 m->idx = alloc++;
252b5132 5451
82f2dbf7
NC
5452 if (alloc)
5453 {
5454 elf_elfheader (abfd)->e_phoff = bed->s->sizeof_ehdr;
5455 elf_elfheader (abfd)->e_phentsize = bed->s->sizeof_phdr;
5456 }
5457 else
5458 {
5459 /* PR binutils/12467. */
5460 elf_elfheader (abfd)->e_phoff = 0;
5461 elf_elfheader (abfd)->e_phentsize = 0;
5462 }
d324f6d6 5463
8ded5a0f 5464 elf_elfheader (abfd)->e_phnum = alloc;
252b5132 5465
12bd6957 5466 if (elf_program_header_size (abfd) == (bfd_size_type) -1)
30fe1832
AM
5467 {
5468 actual = alloc;
5469 elf_program_header_size (abfd) = alloc * bed->s->sizeof_phdr;
5470 }
8ded5a0f 5471 else
30fe1832
AM
5472 {
5473 actual = elf_program_header_size (abfd) / bed->s->sizeof_phdr;
5474 BFD_ASSERT (elf_program_header_size (abfd)
5475 == actual * bed->s->sizeof_phdr);
5476 BFD_ASSERT (actual >= alloc);
5477 }
252b5132
RH
5478
5479 if (alloc == 0)
f3520d2f 5480 {
12bd6957 5481 elf_next_file_pos (abfd) = bed->s->sizeof_ehdr;
8ded5a0f 5482 return TRUE;
f3520d2f 5483 }
252b5132 5484
12bd6957 5485 /* We're writing the size in elf_program_header_size (abfd),
57268894
HPN
5486 see assign_file_positions_except_relocs, so make sure we have
5487 that amount allocated, with trailing space cleared.
12bd6957
AM
5488 The variable alloc contains the computed need, while
5489 elf_program_header_size (abfd) contains the size used for the
57268894
HPN
5490 layout.
5491 See ld/emultempl/elf-generic.em:gld${EMULATION_NAME}_map_segments
5492 where the layout is forced to according to a larger size in the
5493 last iterations for the testcase ld-elf/header. */
30fe1832
AM
5494 phdrs = bfd_zalloc (abfd, (actual * sizeof (*phdrs)
5495 + alloc * sizeof (*sorted_seg_map)));
5496 sorted_seg_map = (struct elf_segment_map **) (phdrs + actual);
f3520d2f 5497 elf_tdata (abfd)->phdr = phdrs;
252b5132 5498 if (phdrs == NULL)
b34976b6 5499 return FALSE;
252b5132 5500
30fe1832 5501 for (m = elf_seg_map (abfd), j = 0; m != NULL; m = m->next, j++)
252b5132 5502 {
30fe1832 5503 sorted_seg_map[j] = m;
252b5132 5504 /* If elf_segment_map is not from map_sections_to_segments, the
08a40648 5505 sections may not be correctly ordered. NOTE: sorting should
52e9b619
MS
5506 not be done to the PT_NOTE section of a corefile, which may
5507 contain several pseudo-sections artificially created by bfd.
5508 Sorting these pseudo-sections breaks things badly. */
47d9a591
AM
5509 if (m->count > 1
5510 && !(elf_elfheader (abfd)->e_type == ET_CORE
52e9b619 5511 && m->p_type == PT_NOTE))
48db3297
AM
5512 {
5513 for (i = 0; i < m->count; i++)
5514 m->sections[i]->target_index = i;
5515 qsort (m->sections, (size_t) m->count, sizeof (asection *),
5516 elf_sort_sections);
5517 }
30fe1832
AM
5518 }
5519 if (alloc > 1)
5520 qsort (sorted_seg_map, alloc, sizeof (*sorted_seg_map),
5521 elf_sort_segments);
5522
5523 maxpagesize = 1;
5524 if ((abfd->flags & D_PAGED) != 0)
5525 maxpagesize = bed->maxpagesize;
5526
5527 /* Sections must map to file offsets past the ELF file header. */
5528 off = bed->s->sizeof_ehdr;
5529 /* And if one of the PT_LOAD headers doesn't include the program
5530 headers then we'll be mapping program headers in the usual
5531 position after the ELF file header. */
5532 phdr_load_seg = NULL;
5533 for (j = 0; j < alloc; j++)
5534 {
5535 m = sorted_seg_map[j];
5536 if (m->p_type != PT_LOAD)
5537 break;
5538 if (m->includes_phdrs)
5539 {
5540 phdr_load_seg = m;
5541 break;
5542 }
5543 }
5544 if (phdr_load_seg == NULL)
5545 off += actual * bed->s->sizeof_phdr;
5546
5547 for (j = 0; j < alloc; j++)
5548 {
5549 asection **secpp;
5550 bfd_vma off_adjust;
5551 bfd_boolean no_contents;
252b5132 5552
b301b248
AM
5553 /* An ELF segment (described by Elf_Internal_Phdr) may contain a
5554 number of sections with contents contributing to both p_filesz
5555 and p_memsz, followed by a number of sections with no contents
5556 that just contribute to p_memsz. In this loop, OFF tracks next
02bf8d82 5557 available file offset for PT_LOAD and PT_NOTE segments. */
30fe1832
AM
5558 m = sorted_seg_map[j];
5559 p = phdrs + m->idx;
252b5132 5560 p->p_type = m->p_type;
28a7f3e7 5561 p->p_flags = m->p_flags;
252b5132 5562
3f570048 5563 if (m->count == 0)
5d695627 5564 p->p_vaddr = m->p_vaddr_offset;
3f570048 5565 else
5d695627 5566 p->p_vaddr = m->sections[0]->vma + m->p_vaddr_offset;
3f570048
AM
5567
5568 if (m->p_paddr_valid)
5569 p->p_paddr = m->p_paddr;
5570 else if (m->count == 0)
5571 p->p_paddr = 0;
5572 else
5d695627 5573 p->p_paddr = m->sections[0]->lma + m->p_vaddr_offset;
3f570048
AM
5574
5575 if (p->p_type == PT_LOAD
5576 && (abfd->flags & D_PAGED) != 0)
5577 {
5578 /* p_align in demand paged PT_LOAD segments effectively stores
5579 the maximum page size. When copying an executable with
5580 objcopy, we set m->p_align from the input file. Use this
5581 value for maxpagesize rather than bed->maxpagesize, which
5582 may be different. Note that we use maxpagesize for PT_TLS
5583 segment alignment later in this function, so we are relying
5584 on at least one PT_LOAD segment appearing before a PT_TLS
5585 segment. */
5586 if (m->p_align_valid)
5587 maxpagesize = m->p_align;
5588
5589 p->p_align = maxpagesize;
5590 }
3271a814
NS
5591 else if (m->p_align_valid)
5592 p->p_align = m->p_align;
e970b90a
DJ
5593 else if (m->count == 0)
5594 p->p_align = 1 << bed->s->log_file_align;
30fe1832
AM
5595
5596 if (m == phdr_load_seg)
5597 {
5598 if (!m->includes_filehdr)
5599 p->p_offset = off;
5600 off += actual * bed->s->sizeof_phdr;
5601 }
3f570048 5602
bf988460
AM
5603 no_contents = FALSE;
5604 off_adjust = 0;
252b5132 5605 if (p->p_type == PT_LOAD
b301b248 5606 && m->count > 0)
252b5132 5607 {
b301b248 5608 bfd_size_type align;
a49e53ed 5609 unsigned int align_power = 0;
b301b248 5610
3271a814
NS
5611 if (m->p_align_valid)
5612 align = p->p_align;
5613 else
252b5132 5614 {
3271a814
NS
5615 for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
5616 {
5617 unsigned int secalign;
08a40648 5618
fd361982 5619 secalign = bfd_section_alignment (*secpp);
3271a814
NS
5620 if (secalign > align_power)
5621 align_power = secalign;
5622 }
5623 align = (bfd_size_type) 1 << align_power;
5624 if (align < maxpagesize)
5625 align = maxpagesize;
b301b248 5626 }
252b5132 5627
02bf8d82
AM
5628 for (i = 0; i < m->count; i++)
5629 if ((m->sections[i]->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
5630 /* If we aren't making room for this section, then
5631 it must be SHT_NOBITS regardless of what we've
5632 set via struct bfd_elf_special_section. */
5633 elf_section_type (m->sections[i]) = SHT_NOBITS;
5634
bf988460 5635 /* Find out whether this segment contains any loadable
aea274d3
AM
5636 sections. */
5637 no_contents = TRUE;
5638 for (i = 0; i < m->count; i++)
5639 if (elf_section_type (m->sections[i]) != SHT_NOBITS)
5640 {
5641 no_contents = FALSE;
5642 break;
5643 }
bf988460 5644
85cfcbfb 5645 off_adjust = vma_page_aligned_bias (p->p_vaddr, off, align);
a8c75b76
AM
5646
5647 /* Broken hardware and/or kernel require that files do not
5648 map the same page with different permissions on some hppa
5649 processors. */
30fe1832
AM
5650 if (j != 0
5651 && (abfd->flags & D_PAGED) != 0
a8c75b76
AM
5652 && bed->no_page_alias
5653 && (off & (maxpagesize - 1)) != 0
5654 && (off & -maxpagesize) == ((off + off_adjust) & -maxpagesize))
5655 off_adjust += maxpagesize;
bf988460
AM
5656 off += off_adjust;
5657 if (no_contents)
5658 {
5659 /* We shouldn't need to align the segment on disk since
5660 the segment doesn't need file space, but the gABI
5661 arguably requires the alignment and glibc ld.so
5662 checks it. So to comply with the alignment
5663 requirement but not waste file space, we adjust
5664 p_offset for just this segment. (OFF_ADJUST is
5665 subtracted from OFF later.) This may put p_offset
5666 past the end of file, but that shouldn't matter. */
5667 }
5668 else
5669 off_adjust = 0;
252b5132 5670 }
b1a6d0b1
NC
5671 /* Make sure the .dynamic section is the first section in the
5672 PT_DYNAMIC segment. */
5673 else if (p->p_type == PT_DYNAMIC
5674 && m->count > 1
5675 && strcmp (m->sections[0]->name, ".dynamic") != 0)
5676 {
5677 _bfd_error_handler
871b3ab2 5678 (_("%pB: The first section in the PT_DYNAMIC segment"
63a5468a 5679 " is not the .dynamic section"),
b301b248 5680 abfd);
b1a6d0b1
NC
5681 bfd_set_error (bfd_error_bad_value);
5682 return FALSE;
5683 }
3f001e84
JK
5684 /* Set the note section type to SHT_NOTE. */
5685 else if (p->p_type == PT_NOTE)
5686 for (i = 0; i < m->count; i++)
5687 elf_section_type (m->sections[i]) = SHT_NOTE;
252b5132 5688
252b5132
RH
5689 if (m->includes_filehdr)
5690 {
bf988460 5691 if (!m->p_flags_valid)
252b5132 5692 p->p_flags |= PF_R;
252b5132
RH
5693 p->p_filesz = bed->s->sizeof_ehdr;
5694 p->p_memsz = bed->s->sizeof_ehdr;
30fe1832 5695 if (p->p_type == PT_LOAD)
252b5132 5696 {
30fe1832 5697 if (m->count > 0)
252b5132 5698 {
30fe1832
AM
5699 if (p->p_vaddr < (bfd_vma) off
5700 || (!m->p_paddr_valid
5701 && p->p_paddr < (bfd_vma) off))
5702 {
5703 _bfd_error_handler
5704 (_("%pB: not enough room for program headers,"
5705 " try linking with -N"),
5706 abfd);
5707 bfd_set_error (bfd_error_bad_value);
5708 return FALSE;
5709 }
5710 p->p_vaddr -= off;
5711 if (!m->p_paddr_valid)
5712 p->p_paddr -= off;
252b5132 5713 }
30fe1832
AM
5714 }
5715 else if (sorted_seg_map[0]->includes_filehdr)
5716 {
5717 Elf_Internal_Phdr *filehdr = phdrs + sorted_seg_map[0]->idx;
5718 p->p_vaddr = filehdr->p_vaddr;
bf988460 5719 if (!m->p_paddr_valid)
30fe1832 5720 p->p_paddr = filehdr->p_paddr;
252b5132 5721 }
252b5132
RH
5722 }
5723
5724 if (m->includes_phdrs)
5725 {
bf988460 5726 if (!m->p_flags_valid)
252b5132 5727 p->p_flags |= PF_R;
30fe1832
AM
5728 p->p_filesz += actual * bed->s->sizeof_phdr;
5729 p->p_memsz += actual * bed->s->sizeof_phdr;
f3520d2f 5730 if (!m->includes_filehdr)
252b5132 5731 {
30fe1832 5732 if (p->p_type == PT_LOAD)
252b5132 5733 {
30fe1832
AM
5734 elf_elfheader (abfd)->e_phoff = p->p_offset;
5735 if (m->count > 0)
5736 {
5737 p->p_vaddr -= off - p->p_offset;
5738 if (!m->p_paddr_valid)
5739 p->p_paddr -= off - p->p_offset;
5740 }
5741 }
5742 else if (phdr_load_seg != NULL)
5743 {
5744 Elf_Internal_Phdr *phdr = phdrs + phdr_load_seg->idx;
5745 bfd_vma phdr_off = 0;
5746 if (phdr_load_seg->includes_filehdr)
5747 phdr_off = bed->s->sizeof_ehdr;
5748 p->p_vaddr = phdr->p_vaddr + phdr_off;
bf988460 5749 if (!m->p_paddr_valid)
30fe1832
AM
5750 p->p_paddr = phdr->p_paddr + phdr_off;
5751 p->p_offset = phdr->p_offset + phdr_off;
252b5132 5752 }
30fe1832
AM
5753 else
5754 p->p_offset = bed->s->sizeof_ehdr;
2b0bc088 5755 }
252b5132
RH
5756 }
5757
5758 if (p->p_type == PT_LOAD
5759 || (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core))
5760 {
bf988460 5761 if (!m->includes_filehdr && !m->includes_phdrs)
02bf8d82 5762 p->p_offset = off;
252b5132
RH
5763 else
5764 {
5765 file_ptr adjust;
5766
5767 adjust = off - (p->p_offset + p->p_filesz);
bf988460
AM
5768 if (!no_contents)
5769 p->p_filesz += adjust;
252b5132
RH
5770 p->p_memsz += adjust;
5771 }
5772 }
5773
1ea63fd2
AM
5774 /* Set up p_filesz, p_memsz, p_align and p_flags from the section
5775 maps. Set filepos for sections in PT_LOAD segments, and in
5776 core files, for sections in PT_NOTE segments.
5777 assign_file_positions_for_non_load_sections will set filepos
5778 for other sections and update p_filesz for other segments. */
252b5132
RH
5779 for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
5780 {
5781 asection *sec;
252b5132 5782 bfd_size_type align;
627b32bc 5783 Elf_Internal_Shdr *this_hdr;
252b5132
RH
5784
5785 sec = *secpp;
02bf8d82 5786 this_hdr = &elf_section_data (sec)->this_hdr;
fd361982 5787 align = (bfd_size_type) 1 << bfd_section_alignment (sec);
252b5132 5788
88967714
AM
5789 if ((p->p_type == PT_LOAD
5790 || p->p_type == PT_TLS)
5791 && (this_hdr->sh_type != SHT_NOBITS
5792 || ((this_hdr->sh_flags & SHF_ALLOC) != 0
5793 && ((this_hdr->sh_flags & SHF_TLS) == 0
5794 || p->p_type == PT_TLS))))
252b5132 5795 {
b5599592
AM
5796 bfd_vma p_start = p->p_paddr;
5797 bfd_vma p_end = p_start + p->p_memsz;
5798 bfd_vma s_start = sec->lma;
5799 bfd_vma adjust = s_start - p_end;
252b5132 5800
a2d1e028
L
5801 if (adjust != 0
5802 && (s_start < p_end
5803 || p_end < p_start))
252b5132 5804 {
4eca0228 5805 _bfd_error_handler
695344c0 5806 /* xgettext:c-format */
2dcf00ce
AM
5807 (_("%pB: section %pA lma %#" PRIx64 " adjusted to %#" PRIx64),
5808 abfd, sec, (uint64_t) s_start, (uint64_t) p_end);
88967714 5809 adjust = 0;
b5599592 5810 sec->lma = p_end;
1cfb7d1e 5811 }
3ac9b6c9 5812 p->p_memsz += adjust;
1cfb7d1e 5813
88967714
AM
5814 if (this_hdr->sh_type != SHT_NOBITS)
5815 {
30fe1832 5816 if (p->p_type == PT_LOAD)
32812159 5817 {
30fe1832
AM
5818 if (p->p_filesz + adjust < p->p_memsz)
5819 {
5820 /* We have a PROGBITS section following NOBITS ones.
5821 Allocate file space for the NOBITS section(s) and
5822 zero it. */
5823 adjust = p->p_memsz - p->p_filesz;
5824 if (!write_zeros (abfd, off, adjust))
5825 return FALSE;
5826 }
5827 off += adjust;
32812159 5828 }
88967714 5829 p->p_filesz += adjust;
252b5132 5830 }
252b5132
RH
5831 }
5832
5833 if (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core)
5834 {
b301b248
AM
5835 /* The section at i == 0 is the one that actually contains
5836 everything. */
4a938328
MS
5837 if (i == 0)
5838 {
627b32bc 5839 this_hdr->sh_offset = sec->filepos = off;
6a3cd2b4
AM
5840 off += this_hdr->sh_size;
5841 p->p_filesz = this_hdr->sh_size;
b301b248
AM
5842 p->p_memsz = 0;
5843 p->p_align = 1;
252b5132 5844 }
4a938328 5845 else
252b5132 5846 {
b301b248 5847 /* The rest are fake sections that shouldn't be written. */
252b5132 5848 sec->filepos = 0;
eea6121a 5849 sec->size = 0;
b301b248
AM
5850 sec->flags = 0;
5851 continue;
252b5132 5852 }
252b5132
RH
5853 }
5854 else
5855 {
1e951488 5856 if (p->p_type == PT_LOAD)
b301b248 5857 {
1e951488
AM
5858 this_hdr->sh_offset = sec->filepos = off;
5859 if (this_hdr->sh_type != SHT_NOBITS)
5860 off += this_hdr->sh_size;
5861 }
5862 else if (this_hdr->sh_type == SHT_NOBITS
5863 && (this_hdr->sh_flags & SHF_TLS) != 0
5864 && this_hdr->sh_offset == 0)
5865 {
5866 /* This is a .tbss section that didn't get a PT_LOAD.
5867 (See _bfd_elf_map_sections_to_segments "Create a
5868 final PT_LOAD".) Set sh_offset to the value it
5869 would have if we had created a zero p_filesz and
5870 p_memsz PT_LOAD header for the section. This
5871 also makes the PT_TLS header have the same
5872 p_offset value. */
5873 bfd_vma adjust = vma_page_aligned_bias (this_hdr->sh_addr,
5874 off, align);
5875 this_hdr->sh_offset = sec->filepos = off + adjust;
b301b248 5876 }
252b5132 5877
02bf8d82 5878 if (this_hdr->sh_type != SHT_NOBITS)
b301b248 5879 {
6a3cd2b4 5880 p->p_filesz += this_hdr->sh_size;
02bf8d82
AM
5881 /* A load section without SHF_ALLOC is something like
5882 a note section in a PT_NOTE segment. These take
5883 file space but are not loaded into memory. */
5884 if ((this_hdr->sh_flags & SHF_ALLOC) != 0)
6a3cd2b4 5885 p->p_memsz += this_hdr->sh_size;
b301b248 5886 }
6a3cd2b4 5887 else if ((this_hdr->sh_flags & SHF_ALLOC) != 0)
13ae64f3 5888 {
6a3cd2b4
AM
5889 if (p->p_type == PT_TLS)
5890 p->p_memsz += this_hdr->sh_size;
5891
5892 /* .tbss is special. It doesn't contribute to p_memsz of
5893 normal segments. */
5894 else if ((this_hdr->sh_flags & SHF_TLS) == 0)
5895 p->p_memsz += this_hdr->sh_size;
13ae64f3
JJ
5896 }
5897
b10a8ae0
L
5898 if (align > p->p_align
5899 && !m->p_align_valid
5900 && (p->p_type != PT_LOAD
5901 || (abfd->flags & D_PAGED) == 0))
252b5132
RH
5902 p->p_align = align;
5903 }
5904
bf988460 5905 if (!m->p_flags_valid)
252b5132
RH
5906 {
5907 p->p_flags |= PF_R;
02bf8d82 5908 if ((this_hdr->sh_flags & SHF_EXECINSTR) != 0)
252b5132 5909 p->p_flags |= PF_X;
02bf8d82 5910 if ((this_hdr->sh_flags & SHF_WRITE) != 0)
252b5132
RH
5911 p->p_flags |= PF_W;
5912 }
5913 }
43a8475c 5914
bf988460 5915 off -= off_adjust;
0920dee7 5916
30fe1832
AM
5917 /* PR ld/20815 - Check that the program header segment, if
5918 present, will be loaded into memory. */
5919 if (p->p_type == PT_PHDR
5920 && phdr_load_seg == NULL
5921 && !(bed->elf_backend_allow_non_load_phdr != NULL
5922 && bed->elf_backend_allow_non_load_phdr (abfd, phdrs, alloc)))
5923 {
5924 /* The fix for this error is usually to edit the linker script being
5925 used and set up the program headers manually. Either that or
5926 leave room for the headers at the start of the SECTIONS. */
5927 _bfd_error_handler (_("%pB: error: PHDR segment not covered"
5928 " by LOAD segment"),
5929 abfd);
5930 return FALSE;
5931 }
5932
7c928300
AM
5933 /* Check that all sections are in a PT_LOAD segment.
5934 Don't check funky gdb generated core files. */
5935 if (p->p_type == PT_LOAD && bfd_get_format (abfd) != bfd_core)
9a83a553
AM
5936 {
5937 bfd_boolean check_vma = TRUE;
5938
5939 for (i = 1; i < m->count; i++)
5940 if (m->sections[i]->vma == m->sections[i - 1]->vma
5941 && ELF_SECTION_SIZE (&(elf_section_data (m->sections[i])
5942 ->this_hdr), p) != 0
5943 && ELF_SECTION_SIZE (&(elf_section_data (m->sections[i - 1])
5944 ->this_hdr), p) != 0)
0920dee7 5945 {
9a83a553
AM
5946 /* Looks like we have overlays packed into the segment. */
5947 check_vma = FALSE;
5948 break;
0920dee7 5949 }
9a83a553
AM
5950
5951 for (i = 0; i < m->count; i++)
5952 {
5953 Elf_Internal_Shdr *this_hdr;
5954 asection *sec;
5955
5956 sec = m->sections[i];
5957 this_hdr = &(elf_section_data(sec)->this_hdr);
86b2281f
AM
5958 if (!ELF_SECTION_IN_SEGMENT_1 (this_hdr, p, check_vma, 0)
5959 && !ELF_TBSS_SPECIAL (this_hdr, p))
9a83a553 5960 {
4eca0228 5961 _bfd_error_handler
695344c0 5962 /* xgettext:c-format */
871b3ab2 5963 (_("%pB: section `%pA' can't be allocated in segment %d"),
9a83a553
AM
5964 abfd, sec, j);
5965 print_segment_map (m);
5966 }
5967 }
5968 }
252b5132
RH
5969 }
5970
12bd6957 5971 elf_next_file_pos (abfd) = off;
30fe1832
AM
5972
5973 if (link_info != NULL
5974 && phdr_load_seg != NULL
5975 && phdr_load_seg->includes_filehdr)
5976 {
5977 /* There is a segment that contains both the file headers and the
5978 program headers, so provide a symbol __ehdr_start pointing there.
5979 A program can use this to examine itself robustly. */
5980
5981 struct elf_link_hash_entry *hash
5982 = elf_link_hash_lookup (elf_hash_table (link_info), "__ehdr_start",
5983 FALSE, FALSE, TRUE);
5984 /* If the symbol was referenced and not defined, define it. */
5985 if (hash != NULL
5986 && (hash->root.type == bfd_link_hash_new
5987 || hash->root.type == bfd_link_hash_undefined
5988 || hash->root.type == bfd_link_hash_undefweak
5989 || hash->root.type == bfd_link_hash_common))
5990 {
5991 asection *s = NULL;
5992 bfd_vma filehdr_vaddr = phdrs[phdr_load_seg->idx].p_vaddr;
5993
5994 if (phdr_load_seg->count != 0)
5995 /* The segment contains sections, so use the first one. */
5996 s = phdr_load_seg->sections[0];
5997 else
5998 /* Use the first (i.e. lowest-addressed) section in any segment. */
5999 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
6000 if (m->p_type == PT_LOAD && m->count != 0)
6001 {
6002 s = m->sections[0];
6003 break;
6004 }
6005
6006 if (s != NULL)
6007 {
6008 hash->root.u.def.value = filehdr_vaddr - s->vma;
6009 hash->root.u.def.section = s;
6010 }
6011 else
6012 {
6013 hash->root.u.def.value = filehdr_vaddr;
6014 hash->root.u.def.section = bfd_abs_section_ptr;
6015 }
6016
6017 hash->root.type = bfd_link_hash_defined;
6018 hash->def_regular = 1;
6019 hash->non_elf = 0;
6020 }
6021 }
6022
f3520d2f
AM
6023 return TRUE;
6024}
6025
1faa385f
NC
6026/* Determine if a bfd is a debuginfo file. Unfortunately there
6027 is no defined method for detecting such files, so we have to
6028 use heuristics instead. */
6029
6030bfd_boolean
6031is_debuginfo_file (bfd *abfd)
6032{
6033 if (abfd == NULL || bfd_get_flavour (abfd) != bfd_target_elf_flavour)
6034 return FALSE;
6035
6036 Elf_Internal_Shdr **start_headers = elf_elfsections (abfd);
6037 Elf_Internal_Shdr **end_headers = start_headers + elf_numsections (abfd);
6038 Elf_Internal_Shdr **headerp;
6039
6040 for (headerp = start_headers; headerp < end_headers; headerp ++)
6041 {
6042 Elf_Internal_Shdr *header = * headerp;
6043
6044 /* Debuginfo files do not have any allocated SHT_PROGBITS sections.
6045 The only allocated sections are SHT_NOBITS or SHT_NOTES. */
6046 if ((header->sh_flags & SHF_ALLOC) == SHF_ALLOC
6047 && header->sh_type != SHT_NOBITS
6048 && header->sh_type != SHT_NOTE)
6049 return FALSE;
6050 }
6051
6052 return TRUE;
6053}
6054
1ff6de03
NA
6055/* Assign file positions for the other sections, except for compressed debugging
6056 and other sections assigned in _bfd_elf_assign_file_positions_for_non_load(). */
f3520d2f
AM
6057
6058static bfd_boolean
6059assign_file_positions_for_non_load_sections (bfd *abfd,
6060 struct bfd_link_info *link_info)
6061{
6062 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
6063 Elf_Internal_Shdr **i_shdrpp;
e06efbf1 6064 Elf_Internal_Shdr **hdrpp, **end_hdrpp;
f3520d2f
AM
6065 Elf_Internal_Phdr *phdrs;
6066 Elf_Internal_Phdr *p;
6067 struct elf_segment_map *m;
f3520d2f 6068 file_ptr off;
f3520d2f 6069
5c182d5f 6070 i_shdrpp = elf_elfsections (abfd);
e06efbf1 6071 end_hdrpp = i_shdrpp + elf_numsections (abfd);
12bd6957 6072 off = elf_next_file_pos (abfd);
e06efbf1 6073 for (hdrpp = i_shdrpp + 1; hdrpp < end_hdrpp; hdrpp++)
5c182d5f 6074 {
5c182d5f
AM
6075 Elf_Internal_Shdr *hdr;
6076
6077 hdr = *hdrpp;
6078 if (hdr->bfd_section != NULL
252e386e
AM
6079 && (hdr->bfd_section->filepos != 0
6080 || (hdr->sh_type == SHT_NOBITS
6081 && hdr->contents == NULL)))
627b32bc 6082 BFD_ASSERT (hdr->sh_offset == hdr->bfd_section->filepos);
5c182d5f
AM
6083 else if ((hdr->sh_flags & SHF_ALLOC) != 0)
6084 {
1faa385f
NC
6085 if (hdr->sh_size != 0
6086 /* PR 24717 - debuginfo files are known to be not strictly
6087 compliant with the ELF standard. In particular they often
6088 have .note.gnu.property sections that are outside of any
6089 loadable segment. This is not a problem for such files,
6090 so do not warn about them. */
6091 && ! is_debuginfo_file (abfd))
4eca0228 6092 _bfd_error_handler
695344c0 6093 /* xgettext:c-format */
871b3ab2 6094 (_("%pB: warning: allocated section `%s' not in segment"),
e8d2ba53
AM
6095 abfd,
6096 (hdr->bfd_section == NULL
6097 ? "*unknown*"
6098 : hdr->bfd_section->name));
3ba71138
L
6099 /* We don't need to page align empty sections. */
6100 if ((abfd->flags & D_PAGED) != 0 && hdr->sh_size != 0)
5c182d5f
AM
6101 off += vma_page_aligned_bias (hdr->sh_addr, off,
6102 bed->maxpagesize);
6103 else
6104 off += vma_page_aligned_bias (hdr->sh_addr, off,
6105 hdr->sh_addralign);
6106 off = _bfd_elf_assign_file_position_for_section (hdr, off,
6107 FALSE);
6108 }
6109 else if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
6110 && hdr->bfd_section == NULL)
1ff6de03
NA
6111 /* We don't know the offset of these sections yet: their size has
6112 not been decided. */
0ce398f1 6113 || (hdr->bfd_section != NULL
1ff6de03
NA
6114 && (hdr->bfd_section->flags & SEC_ELF_COMPRESS
6115 || (bfd_section_is_ctf (hdr->bfd_section)
6116 && abfd->is_linker_output)))
12bd6957 6117 || hdr == i_shdrpp[elf_onesymtab (abfd)]
6a40cf0c
NC
6118 || (elf_symtab_shndx_list (abfd) != NULL
6119 && hdr == i_shdrpp[elf_symtab_shndx_list (abfd)->ndx])
3e19fb8f
L
6120 || hdr == i_shdrpp[elf_strtab_sec (abfd)]
6121 || hdr == i_shdrpp[elf_shstrtab_sec (abfd)])
5c182d5f
AM
6122 hdr->sh_offset = -1;
6123 else
6124 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
5c182d5f 6125 }
30fe1832 6126 elf_next_file_pos (abfd) = off;
5c182d5f 6127
252b5132
RH
6128 /* Now that we have set the section file positions, we can set up
6129 the file positions for the non PT_LOAD segments. */
f3520d2f 6130 phdrs = elf_tdata (abfd)->phdr;
12bd6957 6131 for (m = elf_seg_map (abfd), p = phdrs; m != NULL; m = m->next, p++)
252b5132 6132 {
129af99f 6133 if (p->p_type == PT_GNU_RELRO)
252b5132 6134 {
f2731e0c 6135 bfd_vma start, end;
01f7e10c 6136 bfd_boolean ok;
1ea63fd2 6137
129af99f 6138 if (link_info != NULL)
8c37241b 6139 {
129af99f 6140 /* During linking the range of the RELRO segment is passed
f2731e0c
AM
6141 in link_info. Note that there may be padding between
6142 relro_start and the first RELRO section. */
6143 start = link_info->relro_start;
6144 end = link_info->relro_end;
6145 }
6146 else if (m->count != 0)
6147 {
6148 if (!m->p_size_valid)
6149 abort ();
6150 start = m->sections[0]->vma;
6151 end = start + m->p_size;
6152 }
6153 else
6154 {
6155 start = 0;
6156 end = 0;
6157 }
6158
01f7e10c 6159 ok = FALSE;
f2731e0c
AM
6160 if (start < end)
6161 {
6162 struct elf_segment_map *lm;
6163 const Elf_Internal_Phdr *lp;
6164 unsigned int i;
6165
6166 /* Find a LOAD segment containing a section in the RELRO
6167 segment. */
12bd6957 6168 for (lm = elf_seg_map (abfd), lp = phdrs;
3146fac4
AM
6169 lm != NULL;
6170 lm = lm->next, lp++)
8c37241b
JJ
6171 {
6172 if (lp->p_type == PT_LOAD
3146fac4 6173 && lm->count != 0
dbc88fc1
AM
6174 && (lm->sections[lm->count - 1]->vma
6175 + (!IS_TBSS (lm->sections[lm->count - 1])
6176 ? lm->sections[lm->count - 1]->size
6177 : 0)) > start
f2731e0c 6178 && lm->sections[0]->vma < end)
8c37241b
JJ
6179 break;
6180 }
f2731e0c 6181
01f7e10c 6182 if (lm != NULL)
129af99f 6183 {
01f7e10c
AM
6184 /* Find the section starting the RELRO segment. */
6185 for (i = 0; i < lm->count; i++)
6186 {
6187 asection *s = lm->sections[i];
6188 if (s->vma >= start
6189 && s->vma < end
6190 && s->size != 0)
6191 break;
6192 }
6193
6194 if (i < lm->count)
6195 {
6196 p->p_vaddr = lm->sections[i]->vma;
6197 p->p_paddr = lm->sections[i]->lma;
6198 p->p_offset = lm->sections[i]->filepos;
6199 p->p_memsz = end - p->p_vaddr;
6200 p->p_filesz = p->p_memsz;
6201
6202 /* The RELRO segment typically ends a few bytes
6203 into .got.plt but other layouts are possible.
6204 In cases where the end does not match any
6205 loaded section (for instance is in file
6206 padding), trim p_filesz back to correspond to
6207 the end of loaded section contents. */
6208 if (p->p_filesz > lp->p_vaddr + lp->p_filesz - p->p_vaddr)
6209 p->p_filesz = lp->p_vaddr + lp->p_filesz - p->p_vaddr;
6210
6211 /* Preserve the alignment and flags if they are
6212 valid. The gold linker generates RW/4 for
6213 the PT_GNU_RELRO section. It is better for
6214 objcopy/strip to honor these attributes
6215 otherwise gdb will choke when using separate
6216 debug files. */
6217 if (!m->p_align_valid)
6218 p->p_align = 1;
6219 if (!m->p_flags_valid)
6220 p->p_flags = PF_R;
6221 ok = TRUE;
6222 }
129af99f 6223 }
b84a33b5 6224 }
01f7e10c
AM
6225 if (link_info != NULL)
6226 BFD_ASSERT (ok);
6227 if (!ok)
6228 memset (p, 0, sizeof *p);
129af99f 6229 }
04c3a755
NS
6230 else if (p->p_type == PT_GNU_STACK)
6231 {
6232 if (m->p_size_valid)
6233 p->p_memsz = m->p_size;
6234 }
129af99f
AS
6235 else if (m->count != 0)
6236 {
e06efbf1 6237 unsigned int i;
1a9ccd70 6238
129af99f
AS
6239 if (p->p_type != PT_LOAD
6240 && (p->p_type != PT_NOTE
6241 || bfd_get_format (abfd) != bfd_core))
6242 {
1a9ccd70
NC
6243 /* A user specified segment layout may include a PHDR
6244 segment that overlaps with a LOAD segment... */
6245 if (p->p_type == PT_PHDR)
6246 {
6247 m->count = 0;
6248 continue;
6249 }
6250
c86934ce
NC
6251 if (m->includes_filehdr || m->includes_phdrs)
6252 {
b1fa9dd6 6253 /* PR 17512: file: 2195325e. */
4eca0228 6254 _bfd_error_handler
871b3ab2 6255 (_("%pB: error: non-load segment %d includes file header "
76cfced5
AM
6256 "and/or program header"),
6257 abfd, (int) (p - phdrs));
c86934ce
NC
6258 return FALSE;
6259 }
129af99f 6260
86b2281f 6261 p->p_filesz = 0;
129af99f 6262 p->p_offset = m->sections[0]->filepos;
86b2281f
AM
6263 for (i = m->count; i-- != 0;)
6264 {
6265 asection *sect = m->sections[i];
6266 Elf_Internal_Shdr *hdr = &elf_section_data (sect)->this_hdr;
6267 if (hdr->sh_type != SHT_NOBITS)
6268 {
6269 p->p_filesz = (sect->filepos - m->sections[0]->filepos
6270 + hdr->sh_size);
6271 break;
6272 }
6273 }
129af99f
AS
6274 }
6275 }
252b5132
RH
6276 }
6277
b34976b6 6278 return TRUE;
252b5132
RH
6279}
6280
6a40cf0c
NC
6281static elf_section_list *
6282find_section_in_list (unsigned int i, elf_section_list * list)
6283{
6284 for (;list != NULL; list = list->next)
6285 if (list->ndx == i)
6286 break;
6287 return list;
6288}
6289
252b5132
RH
6290/* Work out the file positions of all the sections. This is called by
6291 _bfd_elf_compute_section_file_positions. All the section sizes and
6292 VMAs must be known before this is called.
6293
e0638f70 6294 Reloc sections come in two flavours: Those processed specially as
1ff6de03
NA
6295 "side-channel" data attached to a section to which they apply, and those that
6296 bfd doesn't process as relocations. The latter sort are stored in a normal
6297 bfd section by bfd_section_from_shdr. We don't consider the former sort
6298 here, unless they form part of the loadable image. Reloc sections not
6299 assigned here (and compressed debugging sections and CTF sections which
6300 nothing else in the file can rely upon) will be handled later by
e0638f70 6301 assign_file_positions_for_relocs.
252b5132
RH
6302
6303 We also don't set the positions of the .symtab and .strtab here. */
6304
b34976b6 6305static bfd_boolean
c84fca4d
AO
6306assign_file_positions_except_relocs (bfd *abfd,
6307 struct bfd_link_info *link_info)
252b5132 6308{
5c182d5f
AM
6309 struct elf_obj_tdata *tdata = elf_tdata (abfd);
6310 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
9c5bfbb7 6311 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
6d6c25c8 6312 unsigned int alloc;
252b5132
RH
6313
6314 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0
6315 && bfd_get_format (abfd) != bfd_core)
6316 {
5c182d5f
AM
6317 Elf_Internal_Shdr ** const i_shdrpp = elf_elfsections (abfd);
6318 unsigned int num_sec = elf_numsections (abfd);
252b5132
RH
6319 Elf_Internal_Shdr **hdrpp;
6320 unsigned int i;
a485e98e 6321 file_ptr off;
252b5132
RH
6322
6323 /* Start after the ELF header. */
6324 off = i_ehdrp->e_ehsize;
6325
6326 /* We are not creating an executable, which means that we are
6327 not creating a program header, and that the actual order of
6328 the sections in the file is unimportant. */
9ad5cbcf 6329 for (i = 1, hdrpp = i_shdrpp + 1; i < num_sec; i++, hdrpp++)
252b5132
RH
6330 {
6331 Elf_Internal_Shdr *hdr;
6332
6333 hdr = *hdrpp;
e0638f70
AM
6334 if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
6335 && hdr->bfd_section == NULL)
1ff6de03
NA
6336 /* Do not assign offsets for these sections yet: we don't know
6337 their sizes. */
0ce398f1 6338 || (hdr->bfd_section != NULL
1ff6de03
NA
6339 && (hdr->bfd_section->flags & SEC_ELF_COMPRESS
6340 || (bfd_section_is_ctf (hdr->bfd_section)
6341 && abfd->is_linker_output)))
12bd6957 6342 || i == elf_onesymtab (abfd)
6a40cf0c
NC
6343 || (elf_symtab_shndx_list (abfd) != NULL
6344 && hdr == i_shdrpp[elf_symtab_shndx_list (abfd)->ndx])
3e19fb8f
L
6345 || i == elf_strtab_sec (abfd)
6346 || i == elf_shstrtab_sec (abfd))
252b5132
RH
6347 {
6348 hdr->sh_offset = -1;
252b5132 6349 }
9ad5cbcf 6350 else
b34976b6 6351 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
252b5132 6352 }
a485e98e
AM
6353
6354 elf_next_file_pos (abfd) = off;
6d6c25c8 6355 elf_program_header_size (abfd) = 0;
252b5132
RH
6356 }
6357 else
6358 {
252b5132 6359 /* Assign file positions for the loaded sections based on the
08a40648 6360 assignment of sections to segments. */
f3520d2f
AM
6361 if (!assign_file_positions_for_load_sections (abfd, link_info))
6362 return FALSE;
6363
6364 /* And for non-load sections. */
6365 if (!assign_file_positions_for_non_load_sections (abfd, link_info))
6366 return FALSE;
6d6c25c8 6367 }
f3520d2f 6368
6d6c25c8
AM
6369 if (!(*bed->elf_backend_modify_headers) (abfd, link_info))
6370 return FALSE;
1a9ccd70 6371
6d6c25c8
AM
6372 /* Write out the program headers. */
6373 alloc = i_ehdrp->e_phnum;
6374 if (alloc != 0)
6375 {
30fe1832 6376 if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0
cd584857
NC
6377 || bed->s->write_out_phdrs (abfd, tdata->phdr, alloc) != 0)
6378 return FALSE;
252b5132
RH
6379 }
6380
b34976b6 6381 return TRUE;
252b5132
RH
6382}
6383
ed7e9d0b
AM
6384bfd_boolean
6385_bfd_elf_init_file_header (bfd *abfd,
6386 struct bfd_link_info *info ATTRIBUTE_UNUSED)
252b5132 6387{
3d540e93 6388 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form. */
2b0f7ef9 6389 struct elf_strtab_hash *shstrtab;
9c5bfbb7 6390 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132
RH
6391
6392 i_ehdrp = elf_elfheader (abfd);
252b5132 6393
2b0f7ef9 6394 shstrtab = _bfd_elf_strtab_init ();
252b5132 6395 if (shstrtab == NULL)
b34976b6 6396 return FALSE;
252b5132
RH
6397
6398 elf_shstrtab (abfd) = shstrtab;
6399
6400 i_ehdrp->e_ident[EI_MAG0] = ELFMAG0;
6401 i_ehdrp->e_ident[EI_MAG1] = ELFMAG1;
6402 i_ehdrp->e_ident[EI_MAG2] = ELFMAG2;
6403 i_ehdrp->e_ident[EI_MAG3] = ELFMAG3;
6404
6405 i_ehdrp->e_ident[EI_CLASS] = bed->s->elfclass;
6406 i_ehdrp->e_ident[EI_DATA] =
6407 bfd_big_endian (abfd) ? ELFDATA2MSB : ELFDATA2LSB;
6408 i_ehdrp->e_ident[EI_VERSION] = bed->s->ev_current;
6409
252b5132
RH
6410 if ((abfd->flags & DYNAMIC) != 0)
6411 i_ehdrp->e_type = ET_DYN;
6412 else if ((abfd->flags & EXEC_P) != 0)
6413 i_ehdrp->e_type = ET_EXEC;
6414 else if (bfd_get_format (abfd) == bfd_core)
6415 i_ehdrp->e_type = ET_CORE;
6416 else
6417 i_ehdrp->e_type = ET_REL;
6418
6419 switch (bfd_get_arch (abfd))
6420 {
6421 case bfd_arch_unknown:
6422 i_ehdrp->e_machine = EM_NONE;
6423 break;
aa4f99bb
AO
6424
6425 /* There used to be a long list of cases here, each one setting
6426 e_machine to the same EM_* macro #defined as ELF_MACHINE_CODE
6427 in the corresponding bfd definition. To avoid duplication,
6428 the switch was removed. Machines that need special handling
6429 can generally do it in elf_backend_final_write_processing(),
6430 unless they need the information earlier than the final write.
6431 Such need can generally be supplied by replacing the tests for
6432 e_machine with the conditions used to determine it. */
252b5132 6433 default:
9c5bfbb7
AM
6434 i_ehdrp->e_machine = bed->elf_machine_code;
6435 }
aa4f99bb 6436
252b5132
RH
6437 i_ehdrp->e_version = bed->s->ev_current;
6438 i_ehdrp->e_ehsize = bed->s->sizeof_ehdr;
6439
c044fabd 6440 /* No program header, for now. */
252b5132
RH
6441 i_ehdrp->e_phoff = 0;
6442 i_ehdrp->e_phentsize = 0;
6443 i_ehdrp->e_phnum = 0;
6444
c044fabd 6445 /* Each bfd section is section header entry. */
252b5132
RH
6446 i_ehdrp->e_entry = bfd_get_start_address (abfd);
6447 i_ehdrp->e_shentsize = bed->s->sizeof_shdr;
6448
252b5132 6449 elf_tdata (abfd)->symtab_hdr.sh_name =
b34976b6 6450 (unsigned int) _bfd_elf_strtab_add (shstrtab, ".symtab", FALSE);
252b5132 6451 elf_tdata (abfd)->strtab_hdr.sh_name =
b34976b6 6452 (unsigned int) _bfd_elf_strtab_add (shstrtab, ".strtab", FALSE);
252b5132 6453 elf_tdata (abfd)->shstrtab_hdr.sh_name =
b34976b6 6454 (unsigned int) _bfd_elf_strtab_add (shstrtab, ".shstrtab", FALSE);
252b5132 6455 if (elf_tdata (abfd)->symtab_hdr.sh_name == (unsigned int) -1
17ca87fc 6456 || elf_tdata (abfd)->strtab_hdr.sh_name == (unsigned int) -1
252b5132 6457 || elf_tdata (abfd)->shstrtab_hdr.sh_name == (unsigned int) -1)
b34976b6 6458 return FALSE;
252b5132 6459
b34976b6 6460 return TRUE;
252b5132
RH
6461}
6462
6d6c25c8
AM
6463/* Set e_type in ELF header to ET_EXEC for -pie -Ttext-segment=.
6464
6465 FIXME: We used to have code here to sort the PT_LOAD segments into
6466 ascending order, as per the ELF spec. But this breaks some programs,
6467 including the Linux kernel. But really either the spec should be
6468 changed or the programs updated. */
6469
6470bfd_boolean
6471_bfd_elf_modify_headers (bfd *obfd, struct bfd_link_info *link_info)
6472{
6473 if (link_info != NULL && bfd_link_pie (link_info))
6474 {
6475 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (obfd);
6476 unsigned int num_segments = i_ehdrp->e_phnum;
6477 struct elf_obj_tdata *tdata = elf_tdata (obfd);
6478 Elf_Internal_Phdr *segment = tdata->phdr;
6479 Elf_Internal_Phdr *end_segment = &segment[num_segments];
6480
6481 /* Find the lowest p_vaddr in PT_LOAD segments. */
6482 bfd_vma p_vaddr = (bfd_vma) -1;
6483 for (; segment < end_segment; segment++)
6484 if (segment->p_type == PT_LOAD && p_vaddr > segment->p_vaddr)
6485 p_vaddr = segment->p_vaddr;
6486
6487 /* Set e_type to ET_EXEC if the lowest p_vaddr in PT_LOAD
6488 segments is non-zero. */
6489 if (p_vaddr)
6490 i_ehdrp->e_type = ET_EXEC;
6491 }
6492 return TRUE;
6493}
6494
252b5132 6495/* Assign file positions for all the reloc sections which are not part
a485e98e 6496 of the loadable file image, and the file position of section headers. */
252b5132 6497
0ce398f1
L
6498static bfd_boolean
6499_bfd_elf_assign_file_positions_for_non_load (bfd *abfd)
252b5132
RH
6500{
6501 file_ptr off;
e06efbf1 6502 Elf_Internal_Shdr **shdrpp, **end_shdrpp;
3e19fb8f 6503 Elf_Internal_Shdr *shdrp;
a485e98e
AM
6504 Elf_Internal_Ehdr *i_ehdrp;
6505 const struct elf_backend_data *bed;
252b5132 6506
12bd6957 6507 off = elf_next_file_pos (abfd);
252b5132 6508
e06efbf1
L
6509 shdrpp = elf_elfsections (abfd);
6510 end_shdrpp = shdrpp + elf_numsections (abfd);
6511 for (shdrpp++; shdrpp < end_shdrpp; shdrpp++)
252b5132 6512 {
252b5132 6513 shdrp = *shdrpp;
0ce398f1
L
6514 if (shdrp->sh_offset == -1)
6515 {
3e19fb8f 6516 asection *sec = shdrp->bfd_section;
0ce398f1
L
6517 bfd_boolean is_rel = (shdrp->sh_type == SHT_REL
6518 || shdrp->sh_type == SHT_RELA);
1ff6de03 6519 bfd_boolean is_ctf = sec && bfd_section_is_ctf (sec);
0ce398f1 6520 if (is_rel
1ff6de03 6521 || is_ctf
3e19fb8f 6522 || (sec != NULL && (sec->flags & SEC_ELF_COMPRESS)))
0ce398f1 6523 {
1ff6de03 6524 if (!is_rel && !is_ctf)
0ce398f1 6525 {
3e19fb8f
L
6526 const char *name = sec->name;
6527 struct bfd_elf_section_data *d;
6528
0ce398f1 6529 /* Compress DWARF debug sections. */
3e19fb8f 6530 if (!bfd_compress_section (abfd, sec,
0ce398f1
L
6531 shdrp->contents))
6532 return FALSE;
3e19fb8f
L
6533
6534 if (sec->compress_status == COMPRESS_SECTION_DONE
6535 && (abfd->flags & BFD_COMPRESS_GABI) == 0)
6536 {
6537 /* If section is compressed with zlib-gnu, convert
6538 section name from .debug_* to .zdebug_*. */
6539 char *new_name
6540 = convert_debug_to_zdebug (abfd, name);
6541 if (new_name == NULL)
6542 return FALSE;
6543 name = new_name;
6544 }
dd905818 6545 /* Add section name to section name section. */
3e19fb8f
L
6546 if (shdrp->sh_name != (unsigned int) -1)
6547 abort ();
6548 shdrp->sh_name
6549 = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
6550 name, FALSE);
6551 d = elf_section_data (sec);
6552
dd905818 6553 /* Add reloc section name to section name section. */
3e19fb8f
L
6554 if (d->rel.hdr
6555 && !_bfd_elf_set_reloc_sh_name (abfd,
6556 d->rel.hdr,
6557 name, FALSE))
6558 return FALSE;
6559 if (d->rela.hdr
6560 && !_bfd_elf_set_reloc_sh_name (abfd,
6561 d->rela.hdr,
91cb26da 6562 name, TRUE))
3e19fb8f
L
6563 return FALSE;
6564
0ce398f1 6565 /* Update section size and contents. */
3e19fb8f
L
6566 shdrp->sh_size = sec->size;
6567 shdrp->contents = sec->contents;
0ce398f1
L
6568 shdrp->bfd_section->contents = NULL;
6569 }
1ff6de03
NA
6570 else if (is_ctf)
6571 {
6572 /* Update section size and contents. */
6573 shdrp->sh_size = sec->size;
6574 shdrp->contents = sec->contents;
6575 }
6576
0ce398f1
L
6577 off = _bfd_elf_assign_file_position_for_section (shdrp,
6578 off,
6579 TRUE);
6580 }
6581 }
252b5132
RH
6582 }
6583
3e19fb8f
L
6584 /* Place section name section after DWARF debug sections have been
6585 compressed. */
6586 _bfd_elf_strtab_finalize (elf_shstrtab (abfd));
6587 shdrp = &elf_tdata (abfd)->shstrtab_hdr;
6588 shdrp->sh_size = _bfd_elf_strtab_size (elf_shstrtab (abfd));
6589 off = _bfd_elf_assign_file_position_for_section (shdrp, off, TRUE);
6590
6591 /* Place the section headers. */
a485e98e
AM
6592 i_ehdrp = elf_elfheader (abfd);
6593 bed = get_elf_backend_data (abfd);
6594 off = align_file_position (off, 1 << bed->s->log_file_align);
6595 i_ehdrp->e_shoff = off;
6596 off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize;
12bd6957 6597 elf_next_file_pos (abfd) = off;
0ce398f1
L
6598
6599 return TRUE;
252b5132
RH
6600}
6601
b34976b6 6602bfd_boolean
217aa764 6603_bfd_elf_write_object_contents (bfd *abfd)
252b5132 6604{
9c5bfbb7 6605 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 6606 Elf_Internal_Shdr **i_shdrp;
b34976b6 6607 bfd_boolean failed;
9ad5cbcf 6608 unsigned int count, num_sec;
30e8ee25 6609 struct elf_obj_tdata *t;
252b5132
RH
6610
6611 if (! abfd->output_has_begun
217aa764 6612 && ! _bfd_elf_compute_section_file_positions (abfd, NULL))
b34976b6 6613 return FALSE;
db727370
JL
6614 /* Do not rewrite ELF data when the BFD has been opened for update.
6615 abfd->output_has_begun was set to TRUE on opening, so creation of new
6616 sections, and modification of existing section sizes was restricted.
6617 This means the ELF header, program headers and section headers can't have
6618 changed.
6619 If the contents of any sections has been modified, then those changes have
6620 already been written to the BFD. */
6621 else if (abfd->direction == both_direction)
6622 {
6623 BFD_ASSERT (abfd->output_has_begun);
6624 return TRUE;
6625 }
252b5132
RH
6626
6627 i_shdrp = elf_elfsections (abfd);
252b5132 6628
b34976b6 6629 failed = FALSE;
252b5132
RH
6630 bfd_map_over_sections (abfd, bed->s->write_relocs, &failed);
6631 if (failed)
b34976b6 6632 return FALSE;
252b5132 6633
0ce398f1
L
6634 if (!_bfd_elf_assign_file_positions_for_non_load (abfd))
6635 return FALSE;
252b5132 6636
c044fabd 6637 /* After writing the headers, we need to write the sections too... */
9ad5cbcf
AM
6638 num_sec = elf_numsections (abfd);
6639 for (count = 1; count < num_sec; count++)
252b5132 6640 {
3e19fb8f
L
6641 i_shdrp[count]->sh_name
6642 = _bfd_elf_strtab_offset (elf_shstrtab (abfd),
6643 i_shdrp[count]->sh_name);
252b5132 6644 if (bed->elf_backend_section_processing)
75506100
MR
6645 if (!(*bed->elf_backend_section_processing) (abfd, i_shdrp[count]))
6646 return FALSE;
252b5132
RH
6647 if (i_shdrp[count]->contents)
6648 {
dc810e39
AM
6649 bfd_size_type amt = i_shdrp[count]->sh_size;
6650
252b5132 6651 if (bfd_seek (abfd, i_shdrp[count]->sh_offset, SEEK_SET) != 0
dc810e39 6652 || bfd_bwrite (i_shdrp[count]->contents, amt, abfd) != amt)
b34976b6 6653 return FALSE;
252b5132
RH
6654 }
6655 }
6656
6657 /* Write out the section header names. */
30e8ee25 6658 t = elf_tdata (abfd);
26ae6d5e 6659 if (elf_shstrtab (abfd) != NULL
30e8ee25 6660 && (bfd_seek (abfd, t->shstrtab_hdr.sh_offset, SEEK_SET) != 0
08a40648 6661 || !_bfd_elf_strtab_emit (abfd, elf_shstrtab (abfd))))
b34976b6 6662 return FALSE;
252b5132 6663
cc364be6
AM
6664 if (!(*bed->elf_backend_final_write_processing) (abfd))
6665 return FALSE;
252b5132 6666
ff59fc36
RM
6667 if (!bed->s->write_shdrs_and_ehdr (abfd))
6668 return FALSE;
6669
6670 /* This is last since write_shdrs_and_ehdr can touch i_shdrp[0]. */
c0355132
AM
6671 if (t->o->build_id.after_write_object_contents != NULL)
6672 return (*t->o->build_id.after_write_object_contents) (abfd);
ff59fc36
RM
6673
6674 return TRUE;
252b5132
RH
6675}
6676
b34976b6 6677bfd_boolean
217aa764 6678_bfd_elf_write_corefile_contents (bfd *abfd)
252b5132 6679{
c044fabd 6680 /* Hopefully this can be done just like an object file. */
252b5132
RH
6681 return _bfd_elf_write_object_contents (abfd);
6682}
c044fabd
KH
6683
6684/* Given a section, search the header to find them. */
6685
cb33740c 6686unsigned int
198beae2 6687_bfd_elf_section_from_bfd_section (bfd *abfd, struct bfd_section *asect)
252b5132 6688{
9c5bfbb7 6689 const struct elf_backend_data *bed;
91d6fa6a 6690 unsigned int sec_index;
252b5132 6691
9ad5cbcf
AM
6692 if (elf_section_data (asect) != NULL
6693 && elf_section_data (asect)->this_idx != 0)
6694 return elf_section_data (asect)->this_idx;
6695
6696 if (bfd_is_abs_section (asect))
91d6fa6a 6697 sec_index = SHN_ABS;
af746e92 6698 else if (bfd_is_com_section (asect))
91d6fa6a 6699 sec_index = SHN_COMMON;
af746e92 6700 else if (bfd_is_und_section (asect))
91d6fa6a 6701 sec_index = SHN_UNDEF;
af746e92 6702 else
91d6fa6a 6703 sec_index = SHN_BAD;
252b5132 6704
af746e92 6705 bed = get_elf_backend_data (abfd);
252b5132
RH
6706 if (bed->elf_backend_section_from_bfd_section)
6707 {
91d6fa6a 6708 int retval = sec_index;
9ad5cbcf 6709
af746e92
AM
6710 if ((*bed->elf_backend_section_from_bfd_section) (abfd, asect, &retval))
6711 return retval;
252b5132
RH
6712 }
6713
91d6fa6a 6714 if (sec_index == SHN_BAD)
af746e92 6715 bfd_set_error (bfd_error_nonrepresentable_section);
252b5132 6716
91d6fa6a 6717 return sec_index;
252b5132
RH
6718}
6719
6720/* Given a BFD symbol, return the index in the ELF symbol table, or -1
6721 on error. */
6722
6723int
217aa764 6724_bfd_elf_symbol_from_bfd_symbol (bfd *abfd, asymbol **asym_ptr_ptr)
252b5132
RH
6725{
6726 asymbol *asym_ptr = *asym_ptr_ptr;
6727 int idx;
6728 flagword flags = asym_ptr->flags;
6729
6730 /* When gas creates relocations against local labels, it creates its
6731 own symbol for the section, but does put the symbol into the
6732 symbol chain, so udata is 0. When the linker is generating
6733 relocatable output, this section symbol may be for one of the
6734 input sections rather than the output section. */
6735 if (asym_ptr->udata.i == 0
6736 && (flags & BSF_SECTION_SYM)
6737 && asym_ptr->section)
6738 {
5372391b 6739 asection *sec;
252b5132
RH
6740 int indx;
6741
5372391b
AM
6742 sec = asym_ptr->section;
6743 if (sec->owner != abfd && sec->output_section != NULL)
6744 sec = sec->output_section;
6745 if (sec->owner == abfd
6746 && (indx = sec->index) < elf_num_section_syms (abfd)
4e89ac30 6747 && elf_section_syms (abfd)[indx] != NULL)
252b5132
RH
6748 asym_ptr->udata.i = elf_section_syms (abfd)[indx]->udata.i;
6749 }
6750
6751 idx = asym_ptr->udata.i;
6752
6753 if (idx == 0)
6754 {
6755 /* This case can occur when using --strip-symbol on a symbol
08a40648 6756 which is used in a relocation entry. */
4eca0228 6757 _bfd_error_handler
695344c0 6758 /* xgettext:c-format */
871b3ab2 6759 (_("%pB: symbol `%s' required but not present"),
d003868e 6760 abfd, bfd_asymbol_name (asym_ptr));
252b5132
RH
6761 bfd_set_error (bfd_error_no_symbols);
6762 return -1;
6763 }
6764
6765#if DEBUG & 4
6766 {
6767 fprintf (stderr,
cd9af601
AM
6768 "elf_symbol_from_bfd_symbol 0x%.8lx, name = %s, sym num = %d, flags = 0x%.8x\n",
6769 (long) asym_ptr, asym_ptr->name, idx, flags);
252b5132
RH
6770 fflush (stderr);
6771 }
6772#endif
6773
6774 return idx;
6775}
6776
84d1d650 6777/* Rewrite program header information. */
252b5132 6778
b34976b6 6779static bfd_boolean
84d1d650 6780rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
252b5132 6781{
b34976b6
AM
6782 Elf_Internal_Ehdr *iehdr;
6783 struct elf_segment_map *map;
6784 struct elf_segment_map *map_first;
6785 struct elf_segment_map **pointer_to_map;
6786 Elf_Internal_Phdr *segment;
6787 asection *section;
6788 unsigned int i;
6789 unsigned int num_segments;
6790 bfd_boolean phdr_included = FALSE;
5c44b38e 6791 bfd_boolean p_paddr_valid;
b34976b6
AM
6792 bfd_vma maxpagesize;
6793 struct elf_segment_map *phdr_adjust_seg = NULL;
6794 unsigned int phdr_adjust_num = 0;
9c5bfbb7 6795 const struct elf_backend_data *bed;
bc67d8a6 6796
caf47ea6 6797 bed = get_elf_backend_data (ibfd);
252b5132
RH
6798 iehdr = elf_elfheader (ibfd);
6799
bc67d8a6 6800 map_first = NULL;
c044fabd 6801 pointer_to_map = &map_first;
252b5132
RH
6802
6803 num_segments = elf_elfheader (ibfd)->e_phnum;
bc67d8a6
NC
6804 maxpagesize = get_elf_backend_data (obfd)->maxpagesize;
6805
6806 /* Returns the end address of the segment + 1. */
aecc8f8a
AM
6807#define SEGMENT_END(segment, start) \
6808 (start + (segment->p_memsz > segment->p_filesz \
6809 ? segment->p_memsz : segment->p_filesz))
bc67d8a6 6810
eecdbe52
JJ
6811#define SECTION_SIZE(section, segment) \
6812 (((section->flags & (SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) \
6813 != SEC_THREAD_LOCAL || segment->p_type == PT_TLS) \
eea6121a 6814 ? section->size : 0)
eecdbe52 6815
b34976b6 6816 /* Returns TRUE if the given section is contained within
bc67d8a6 6817 the given segment. VMA addresses are compared. */
aecc8f8a
AM
6818#define IS_CONTAINED_BY_VMA(section, segment) \
6819 (section->vma >= segment->p_vaddr \
eecdbe52 6820 && (section->vma + SECTION_SIZE (section, segment) \
aecc8f8a 6821 <= (SEGMENT_END (segment, segment->p_vaddr))))
c044fabd 6822
b34976b6 6823 /* Returns TRUE if the given section is contained within
bc67d8a6 6824 the given segment. LMA addresses are compared. */
aecc8f8a
AM
6825#define IS_CONTAINED_BY_LMA(section, segment, base) \
6826 (section->lma >= base \
beab4532 6827 && (section->lma + SECTION_SIZE (section, segment) >= section->lma) \
eecdbe52 6828 && (section->lma + SECTION_SIZE (section, segment) \
aecc8f8a 6829 <= SEGMENT_END (segment, base)))
252b5132 6830
0efc80c8
L
6831 /* Handle PT_NOTE segment. */
6832#define IS_NOTE(p, s) \
aecc8f8a 6833 (p->p_type == PT_NOTE \
0efc80c8 6834 && elf_section_type (s) == SHT_NOTE \
aecc8f8a 6835 && (bfd_vma) s->filepos >= p->p_offset \
cb3ff1e5 6836 && ((bfd_vma) s->filepos + s->size \
aecc8f8a 6837 <= p->p_offset + p->p_filesz))
252b5132 6838
0efc80c8
L
6839 /* Special case: corefile "NOTE" section containing regs, prpsinfo
6840 etc. */
6841#define IS_COREFILE_NOTE(p, s) \
6842 (IS_NOTE (p, s) \
6843 && bfd_get_format (ibfd) == bfd_core \
6844 && s->vma == 0 \
6845 && s->lma == 0)
6846
252b5132
RH
6847 /* The complicated case when p_vaddr is 0 is to handle the Solaris
6848 linker, which generates a PT_INTERP section with p_vaddr and
6849 p_memsz set to 0. */
aecc8f8a
AM
6850#define IS_SOLARIS_PT_INTERP(p, s) \
6851 (p->p_vaddr == 0 \
6852 && p->p_paddr == 0 \
6853 && p->p_memsz == 0 \
6854 && p->p_filesz > 0 \
6855 && (s->flags & SEC_HAS_CONTENTS) != 0 \
eea6121a 6856 && s->size > 0 \
aecc8f8a 6857 && (bfd_vma) s->filepos >= p->p_offset \
cb3ff1e5 6858 && ((bfd_vma) s->filepos + s->size \
aecc8f8a 6859 <= p->p_offset + p->p_filesz))
5c440b1e 6860
bc67d8a6
NC
6861 /* Decide if the given section should be included in the given segment.
6862 A section will be included if:
f5ffc919 6863 1. It is within the address space of the segment -- we use the LMA
08a40648 6864 if that is set for the segment and the VMA otherwise,
0efc80c8 6865 2. It is an allocated section or a NOTE section in a PT_NOTE
d324f6d6 6866 segment.
bc67d8a6 6867 3. There is an output section associated with it,
eecdbe52 6868 4. The section has not already been allocated to a previous segment.
2b05f1b7 6869 5. PT_GNU_STACK segments do not include any sections.
03394ac9 6870 6. PT_TLS segment includes only SHF_TLS sections.
6f79b219
JJ
6871 7. SHF_TLS sections are only in PT_TLS or PT_LOAD segments.
6872 8. PT_DYNAMIC should not contain empty sections at the beginning
08a40648 6873 (with the possible exception of .dynamic). */
9f17e2a6 6874#define IS_SECTION_IN_INPUT_SEGMENT(section, segment, bed) \
2b05f1b7
L
6875 ((((segment->p_paddr \
6876 ? IS_CONTAINED_BY_LMA (section, segment, segment->p_paddr) \
6877 : IS_CONTAINED_BY_VMA (section, segment)) \
6878 && (section->flags & SEC_ALLOC) != 0) \
0efc80c8 6879 || IS_NOTE (segment, section)) \
2b05f1b7
L
6880 && segment->p_type != PT_GNU_STACK \
6881 && (segment->p_type != PT_TLS \
6882 || (section->flags & SEC_THREAD_LOCAL)) \
6883 && (segment->p_type == PT_LOAD \
6884 || segment->p_type == PT_TLS \
6885 || (section->flags & SEC_THREAD_LOCAL) == 0) \
6886 && (segment->p_type != PT_DYNAMIC \
6887 || SECTION_SIZE (section, segment) > 0 \
6888 || (segment->p_paddr \
6889 ? segment->p_paddr != section->lma \
6890 : segment->p_vaddr != section->vma) \
fd361982 6891 || (strcmp (bfd_section_name (section), ".dynamic") == 0)) \
9933dc52 6892 && (segment->p_type != PT_LOAD || !section->segment_mark))
bc67d8a6 6893
9f17e2a6
L
6894/* If the output section of a section in the input segment is NULL,
6895 it is removed from the corresponding output segment. */
6896#define INCLUDE_SECTION_IN_SEGMENT(section, segment, bed) \
6897 (IS_SECTION_IN_INPUT_SEGMENT (section, segment, bed) \
6898 && section->output_section != NULL)
6899
b34976b6 6900 /* Returns TRUE iff seg1 starts after the end of seg2. */
b5f852ea
NC
6901#define SEGMENT_AFTER_SEGMENT(seg1, seg2, field) \
6902 (seg1->field >= SEGMENT_END (seg2, seg2->field))
6903
6904 /* Returns TRUE iff seg1 and seg2 overlap. Segments overlap iff both
6905 their VMA address ranges and their LMA address ranges overlap.
6906 It is possible to have overlapping VMA ranges without overlapping LMA
6907 ranges. RedBoot images for example can have both .data and .bss mapped
6908 to the same VMA range, but with the .data section mapped to a different
6909 LMA. */
aecc8f8a 6910#define SEGMENT_OVERLAPS(seg1, seg2) \
b5f852ea 6911 ( !(SEGMENT_AFTER_SEGMENT (seg1, seg2, p_vaddr) \
08a40648 6912 || SEGMENT_AFTER_SEGMENT (seg2, seg1, p_vaddr)) \
b5f852ea 6913 && !(SEGMENT_AFTER_SEGMENT (seg1, seg2, p_paddr) \
08a40648 6914 || SEGMENT_AFTER_SEGMENT (seg2, seg1, p_paddr)))
bc67d8a6
NC
6915
6916 /* Initialise the segment mark field. */
6917 for (section = ibfd->sections; section != NULL; section = section->next)
b34976b6 6918 section->segment_mark = FALSE;
bc67d8a6 6919
5c44b38e
AM
6920 /* The Solaris linker creates program headers in which all the
6921 p_paddr fields are zero. When we try to objcopy or strip such a
6922 file, we get confused. Check for this case, and if we find it
6923 don't set the p_paddr_valid fields. */
6924 p_paddr_valid = FALSE;
6925 for (i = 0, segment = elf_tdata (ibfd)->phdr;
6926 i < num_segments;
6927 i++, segment++)
6928 if (segment->p_paddr != 0)
6929 {
6930 p_paddr_valid = TRUE;
6931 break;
6932 }
6933
252b5132 6934 /* Scan through the segments specified in the program header
bc67d8a6 6935 of the input BFD. For this first scan we look for overlaps
9ad5cbcf 6936 in the loadable segments. These can be created by weird
aecc8f8a 6937 parameters to objcopy. Also, fix some solaris weirdness. */
bc67d8a6
NC
6938 for (i = 0, segment = elf_tdata (ibfd)->phdr;
6939 i < num_segments;
c044fabd 6940 i++, segment++)
252b5132 6941 {
252b5132 6942 unsigned int j;
c044fabd 6943 Elf_Internal_Phdr *segment2;
252b5132 6944
aecc8f8a
AM
6945 if (segment->p_type == PT_INTERP)
6946 for (section = ibfd->sections; section; section = section->next)
6947 if (IS_SOLARIS_PT_INTERP (segment, section))
6948 {
6949 /* Mininal change so that the normal section to segment
4cc11e76 6950 assignment code will work. */
aecc8f8a
AM
6951 segment->p_vaddr = section->vma;
6952 break;
6953 }
6954
bc67d8a6 6955 if (segment->p_type != PT_LOAD)
b10a8ae0
L
6956 {
6957 /* Remove PT_GNU_RELRO segment. */
6958 if (segment->p_type == PT_GNU_RELRO)
6959 segment->p_type = PT_NULL;
6960 continue;
6961 }
c044fabd 6962
bc67d8a6 6963 /* Determine if this segment overlaps any previous segments. */
0067a569 6964 for (j = 0, segment2 = elf_tdata (ibfd)->phdr; j < i; j++, segment2++)
bc67d8a6
NC
6965 {
6966 bfd_signed_vma extra_length;
c044fabd 6967
bc67d8a6 6968 if (segment2->p_type != PT_LOAD
0067a569 6969 || !SEGMENT_OVERLAPS (segment, segment2))
bc67d8a6 6970 continue;
c044fabd 6971
bc67d8a6
NC
6972 /* Merge the two segments together. */
6973 if (segment2->p_vaddr < segment->p_vaddr)
6974 {
c044fabd 6975 /* Extend SEGMENT2 to include SEGMENT and then delete
08a40648 6976 SEGMENT. */
0067a569
AM
6977 extra_length = (SEGMENT_END (segment, segment->p_vaddr)
6978 - SEGMENT_END (segment2, segment2->p_vaddr));
c044fabd 6979
bc67d8a6
NC
6980 if (extra_length > 0)
6981 {
0067a569 6982 segment2->p_memsz += extra_length;
bc67d8a6
NC
6983 segment2->p_filesz += extra_length;
6984 }
c044fabd 6985
bc67d8a6 6986 segment->p_type = PT_NULL;
c044fabd 6987
bc67d8a6
NC
6988 /* Since we have deleted P we must restart the outer loop. */
6989 i = 0;
6990 segment = elf_tdata (ibfd)->phdr;
6991 break;
6992 }
6993 else
6994 {
c044fabd 6995 /* Extend SEGMENT to include SEGMENT2 and then delete
08a40648 6996 SEGMENT2. */
0067a569
AM
6997 extra_length = (SEGMENT_END (segment2, segment2->p_vaddr)
6998 - SEGMENT_END (segment, segment->p_vaddr));
c044fabd 6999
bc67d8a6
NC
7000 if (extra_length > 0)
7001 {
0067a569 7002 segment->p_memsz += extra_length;
bc67d8a6
NC
7003 segment->p_filesz += extra_length;
7004 }
c044fabd 7005
bc67d8a6
NC
7006 segment2->p_type = PT_NULL;
7007 }
7008 }
7009 }
c044fabd 7010
bc67d8a6
NC
7011 /* The second scan attempts to assign sections to segments. */
7012 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7013 i < num_segments;
0067a569 7014 i++, segment++)
bc67d8a6 7015 {
0067a569
AM
7016 unsigned int section_count;
7017 asection **sections;
7018 asection *output_section;
7019 unsigned int isec;
9933dc52
AM
7020 asection *matching_lma;
7021 asection *suggested_lma;
0067a569 7022 unsigned int j;
dc810e39 7023 bfd_size_type amt;
0067a569 7024 asection *first_section;
bc67d8a6
NC
7025
7026 if (segment->p_type == PT_NULL)
7027 continue;
c044fabd 7028
9f17e2a6 7029 first_section = NULL;
bc67d8a6 7030 /* Compute how many sections might be placed into this segment. */
b5f852ea
NC
7031 for (section = ibfd->sections, section_count = 0;
7032 section != NULL;
7033 section = section->next)
9f17e2a6
L
7034 {
7035 /* Find the first section in the input segment, which may be
7036 removed from the corresponding output segment. */
7037 if (IS_SECTION_IN_INPUT_SEGMENT (section, segment, bed))
7038 {
7039 if (first_section == NULL)
7040 first_section = section;
7041 if (section->output_section != NULL)
7042 ++section_count;
7043 }
7044 }
811072d8 7045
b5f852ea
NC
7046 /* Allocate a segment map big enough to contain
7047 all of the sections we have selected. */
00bee008
AM
7048 amt = sizeof (struct elf_segment_map) - sizeof (asection *);
7049 amt += (bfd_size_type) section_count * sizeof (asection *);
a50b1753 7050 map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
bc67d8a6 7051 if (map == NULL)
b34976b6 7052 return FALSE;
252b5132
RH
7053
7054 /* Initialise the fields of the segment map. Default to
7055 using the physical address of the segment in the input BFD. */
0067a569
AM
7056 map->next = NULL;
7057 map->p_type = segment->p_type;
7058 map->p_flags = segment->p_flags;
bc67d8a6 7059 map->p_flags_valid = 1;
55d55ac7 7060
9f17e2a6
L
7061 /* If the first section in the input segment is removed, there is
7062 no need to preserve segment physical address in the corresponding
7063 output segment. */
945c025a 7064 if (!first_section || first_section->output_section != NULL)
9f17e2a6
L
7065 {
7066 map->p_paddr = segment->p_paddr;
5c44b38e 7067 map->p_paddr_valid = p_paddr_valid;
9f17e2a6 7068 }
252b5132
RH
7069
7070 /* Determine if this segment contains the ELF file header
7071 and if it contains the program headers themselves. */
bc67d8a6
NC
7072 map->includes_filehdr = (segment->p_offset == 0
7073 && segment->p_filesz >= iehdr->e_ehsize);
bc67d8a6 7074 map->includes_phdrs = 0;
252b5132 7075
0067a569 7076 if (!phdr_included || segment->p_type != PT_LOAD)
252b5132 7077 {
bc67d8a6
NC
7078 map->includes_phdrs =
7079 (segment->p_offset <= (bfd_vma) iehdr->e_phoff
7080 && (segment->p_offset + segment->p_filesz
252b5132
RH
7081 >= ((bfd_vma) iehdr->e_phoff
7082 + iehdr->e_phnum * iehdr->e_phentsize)));
c044fabd 7083
bc67d8a6 7084 if (segment->p_type == PT_LOAD && map->includes_phdrs)
b34976b6 7085 phdr_included = TRUE;
252b5132
RH
7086 }
7087
bc67d8a6 7088 if (section_count == 0)
252b5132
RH
7089 {
7090 /* Special segments, such as the PT_PHDR segment, may contain
7091 no sections, but ordinary, loadable segments should contain
1ed89aa9 7092 something. They are allowed by the ELF spec however, so only
07d6d2b8 7093 a warning is produced.
f98450c6
NC
7094 There is however the valid use case of embedded systems which
7095 have segments with p_filesz of 0 and a p_memsz > 0 to initialize
7096 flash memory with zeros. No warning is shown for that case. */
7097 if (segment->p_type == PT_LOAD
7098 && (segment->p_filesz > 0 || segment->p_memsz == 0))
7099 /* xgettext:c-format */
9793eb77
AM
7100 _bfd_error_handler
7101 (_("%pB: warning: empty loadable segment detected"
7102 " at vaddr=%#" PRIx64 ", is this intentional?"),
7103 ibfd, (uint64_t) segment->p_vaddr);
252b5132 7104
5d695627 7105 map->p_vaddr_offset = segment->p_vaddr;
bc67d8a6 7106 map->count = 0;
c044fabd
KH
7107 *pointer_to_map = map;
7108 pointer_to_map = &map->next;
252b5132
RH
7109
7110 continue;
7111 }
7112
7113 /* Now scan the sections in the input BFD again and attempt
7114 to add their corresponding output sections to the segment map.
7115 The problem here is how to handle an output section which has
7116 been moved (ie had its LMA changed). There are four possibilities:
7117
7118 1. None of the sections have been moved.
7119 In this case we can continue to use the segment LMA from the
7120 input BFD.
7121
7122 2. All of the sections have been moved by the same amount.
7123 In this case we can change the segment's LMA to match the LMA
7124 of the first section.
7125
7126 3. Some of the sections have been moved, others have not.
7127 In this case those sections which have not been moved can be
7128 placed in the current segment which will have to have its size,
7129 and possibly its LMA changed, and a new segment or segments will
7130 have to be created to contain the other sections.
7131
b5f852ea 7132 4. The sections have been moved, but not by the same amount.
252b5132
RH
7133 In this case we can change the segment's LMA to match the LMA
7134 of the first section and we will have to create a new segment
7135 or segments to contain the other sections.
7136
7137 In order to save time, we allocate an array to hold the section
7138 pointers that we are interested in. As these sections get assigned
7139 to a segment, they are removed from this array. */
7140
a50b1753 7141 sections = (asection **) bfd_malloc2 (section_count, sizeof (asection *));
252b5132 7142 if (sections == NULL)
b34976b6 7143 return FALSE;
252b5132
RH
7144
7145 /* Step One: Scan for segment vs section LMA conflicts.
7146 Also add the sections to the section array allocated above.
7147 Also add the sections to the current segment. In the common
7148 case, where the sections have not been moved, this means that
7149 we have completely filled the segment, and there is nothing
7150 more to do. */
252b5132 7151 isec = 0;
9933dc52
AM
7152 matching_lma = NULL;
7153 suggested_lma = NULL;
252b5132 7154
461c4b2e 7155 for (section = first_section, j = 0;
bc67d8a6
NC
7156 section != NULL;
7157 section = section->next)
252b5132 7158 {
caf47ea6 7159 if (INCLUDE_SECTION_IN_SEGMENT (section, segment, bed))
c0f7859b 7160 {
bc67d8a6
NC
7161 output_section = section->output_section;
7162
0067a569 7163 sections[j++] = section;
252b5132
RH
7164
7165 /* The Solaris native linker always sets p_paddr to 0.
7166 We try to catch that case here, and set it to the
5e8d7549
NC
7167 correct value. Note - some backends require that
7168 p_paddr be left as zero. */
5c44b38e 7169 if (!p_paddr_valid
4455705d 7170 && segment->p_vaddr != 0
0067a569 7171 && !bed->want_p_paddr_set_to_zero
252b5132 7172 && isec == 0
bc67d8a6 7173 && output_section->lma != 0
9933dc52
AM
7174 && (align_power (segment->p_vaddr
7175 + (map->includes_filehdr
7176 ? iehdr->e_ehsize : 0)
7177 + (map->includes_phdrs
7178 ? iehdr->e_phnum * iehdr->e_phentsize
7179 : 0),
7180 output_section->alignment_power)
7181 == output_section->vma))
bc67d8a6 7182 map->p_paddr = segment->p_vaddr;
252b5132
RH
7183
7184 /* Match up the physical address of the segment with the
7185 LMA address of the output section. */
bc67d8a6 7186 if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr)
5e8d7549 7187 || IS_COREFILE_NOTE (segment, section)
0067a569
AM
7188 || (bed->want_p_paddr_set_to_zero
7189 && IS_CONTAINED_BY_VMA (output_section, segment)))
252b5132 7190 {
9933dc52
AM
7191 if (matching_lma == NULL
7192 || output_section->lma < matching_lma->lma)
7193 matching_lma = output_section;
252b5132
RH
7194
7195 /* We assume that if the section fits within the segment
bc67d8a6 7196 then it does not overlap any other section within that
252b5132 7197 segment. */
0067a569
AM
7198 map->sections[isec++] = output_section;
7199 }
9933dc52
AM
7200 else if (suggested_lma == NULL)
7201 suggested_lma = output_section;
147d51c2
L
7202
7203 if (j == section_count)
7204 break;
252b5132
RH
7205 }
7206 }
7207
bc67d8a6 7208 BFD_ASSERT (j == section_count);
252b5132
RH
7209
7210 /* Step Two: Adjust the physical address of the current segment,
7211 if necessary. */
bc67d8a6 7212 if (isec == section_count)
252b5132
RH
7213 {
7214 /* All of the sections fitted within the segment as currently
7215 specified. This is the default case. Add the segment to
7216 the list of built segments and carry on to process the next
7217 program header in the input BFD. */
bc67d8a6 7218 map->count = section_count;
c044fabd
KH
7219 *pointer_to_map = map;
7220 pointer_to_map = &map->next;
08a40648 7221
5c44b38e 7222 if (p_paddr_valid
30fe1832
AM
7223 && !bed->want_p_paddr_set_to_zero)
7224 {
7225 bfd_vma hdr_size = 0;
7226 if (map->includes_filehdr)
7227 hdr_size = iehdr->e_ehsize;
7228 if (map->includes_phdrs)
7229 hdr_size += iehdr->e_phnum * iehdr->e_phentsize;
7230
7231 /* Account for padding before the first section in the
7232 segment. */
7233 map->p_vaddr_offset = map->p_paddr + hdr_size - matching_lma->lma;
7234 }
08a40648 7235
252b5132
RH
7236 free (sections);
7237 continue;
7238 }
252b5132
RH
7239 else
7240 {
9933dc52
AM
7241 /* Change the current segment's physical address to match
7242 the LMA of the first section that fitted, or if no
7243 section fitted, the first section. */
7244 if (matching_lma == NULL)
7245 matching_lma = suggested_lma;
7246
7247 map->p_paddr = matching_lma->lma;
72730e0c 7248
bc67d8a6
NC
7249 /* Offset the segment physical address from the lma
7250 to allow for space taken up by elf headers. */
9933dc52 7251 if (map->includes_phdrs)
010c8431 7252 {
9933dc52
AM
7253 map->p_paddr -= iehdr->e_phnum * iehdr->e_phentsize;
7254
7255 /* iehdr->e_phnum is just an estimate of the number
7256 of program headers that we will need. Make a note
7257 here of the number we used and the segment we chose
7258 to hold these headers, so that we can adjust the
7259 offset when we know the correct value. */
7260 phdr_adjust_num = iehdr->e_phnum;
7261 phdr_adjust_seg = map;
010c8431 7262 }
252b5132 7263
9933dc52 7264 if (map->includes_filehdr)
bc67d8a6 7265 {
9933dc52
AM
7266 bfd_vma align = (bfd_vma) 1 << matching_lma->alignment_power;
7267 map->p_paddr -= iehdr->e_ehsize;
7268 /* We've subtracted off the size of headers from the
7269 first section lma, but there may have been some
7270 alignment padding before that section too. Try to
7271 account for that by adjusting the segment lma down to
7272 the same alignment. */
7273 if (segment->p_align != 0 && segment->p_align < align)
7274 align = segment->p_align;
7275 map->p_paddr &= -align;
bc67d8a6 7276 }
252b5132
RH
7277 }
7278
7279 /* Step Three: Loop over the sections again, this time assigning
caf47ea6 7280 those that fit to the current segment and removing them from the
252b5132
RH
7281 sections array; but making sure not to leave large gaps. Once all
7282 possible sections have been assigned to the current segment it is
7283 added to the list of built segments and if sections still remain
7284 to be assigned, a new segment is constructed before repeating
7285 the loop. */
7286 isec = 0;
7287 do
7288 {
bc67d8a6 7289 map->count = 0;
9933dc52 7290 suggested_lma = NULL;
252b5132
RH
7291
7292 /* Fill the current segment with sections that fit. */
bc67d8a6 7293 for (j = 0; j < section_count; j++)
252b5132 7294 {
bc67d8a6 7295 section = sections[j];
252b5132 7296
bc67d8a6 7297 if (section == NULL)
252b5132
RH
7298 continue;
7299
bc67d8a6 7300 output_section = section->output_section;
252b5132 7301
bc67d8a6 7302 BFD_ASSERT (output_section != NULL);
c044fabd 7303
bc67d8a6
NC
7304 if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr)
7305 || IS_COREFILE_NOTE (segment, section))
252b5132 7306 {
bc67d8a6 7307 if (map->count == 0)
252b5132
RH
7308 {
7309 /* If the first section in a segment does not start at
bc67d8a6
NC
7310 the beginning of the segment, then something is
7311 wrong. */
9933dc52
AM
7312 if (align_power (map->p_paddr
7313 + (map->includes_filehdr
7314 ? iehdr->e_ehsize : 0)
7315 + (map->includes_phdrs
7316 ? iehdr->e_phnum * iehdr->e_phentsize
7317 : 0),
7318 output_section->alignment_power)
7319 != output_section->lma)
9aea1e31 7320 goto sorry;
252b5132
RH
7321 }
7322 else
7323 {
0067a569 7324 asection *prev_sec;
252b5132 7325
bc67d8a6 7326 prev_sec = map->sections[map->count - 1];
252b5132
RH
7327
7328 /* If the gap between the end of the previous section
bc67d8a6
NC
7329 and the start of this section is more than
7330 maxpagesize then we need to start a new segment. */
eea6121a 7331 if ((BFD_ALIGN (prev_sec->lma + prev_sec->size,
079e9a2f 7332 maxpagesize)
caf47ea6 7333 < BFD_ALIGN (output_section->lma, maxpagesize))
0067a569 7334 || (prev_sec->lma + prev_sec->size
079e9a2f 7335 > output_section->lma))
252b5132 7336 {
9933dc52
AM
7337 if (suggested_lma == NULL)
7338 suggested_lma = output_section;
252b5132
RH
7339
7340 continue;
7341 }
7342 }
7343
bc67d8a6 7344 map->sections[map->count++] = output_section;
252b5132
RH
7345 ++isec;
7346 sections[j] = NULL;
9933dc52
AM
7347 if (segment->p_type == PT_LOAD)
7348 section->segment_mark = TRUE;
0067a569 7349 }
9933dc52
AM
7350 else if (suggested_lma == NULL)
7351 suggested_lma = output_section;
252b5132
RH
7352 }
7353
beab4532
NC
7354 /* PR 23932. A corrupt input file may contain sections that cannot
7355 be assigned to any segment - because for example they have a
7356 negative size - or segments that do not contain any sections. */
7357 if (map->count == 0)
7358 {
9aea1e31
AM
7359 sorry:
7360 bfd_set_error (bfd_error_sorry);
beab4532
NC
7361 free (sections);
7362 return FALSE;
7363 }
252b5132
RH
7364
7365 /* Add the current segment to the list of built segments. */
c044fabd
KH
7366 *pointer_to_map = map;
7367 pointer_to_map = &map->next;
252b5132 7368
bc67d8a6 7369 if (isec < section_count)
252b5132
RH
7370 {
7371 /* We still have not allocated all of the sections to
7372 segments. Create a new segment here, initialise it
7373 and carry on looping. */
00bee008
AM
7374 amt = sizeof (struct elf_segment_map) - sizeof (asection *);
7375 amt += (bfd_size_type) section_count * sizeof (asection *);
5964fc3a 7376 map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
bc67d8a6 7377 if (map == NULL)
5ed6aba4
NC
7378 {
7379 free (sections);
7380 return FALSE;
7381 }
252b5132
RH
7382
7383 /* Initialise the fields of the segment map. Set the physical
7384 physical address to the LMA of the first section that has
7385 not yet been assigned. */
0067a569
AM
7386 map->next = NULL;
7387 map->p_type = segment->p_type;
7388 map->p_flags = segment->p_flags;
7389 map->p_flags_valid = 1;
9933dc52 7390 map->p_paddr = suggested_lma->lma;
5c44b38e 7391 map->p_paddr_valid = p_paddr_valid;
bc67d8a6 7392 map->includes_filehdr = 0;
0067a569 7393 map->includes_phdrs = 0;
252b5132
RH
7394 }
7395 }
bc67d8a6 7396 while (isec < section_count);
252b5132
RH
7397
7398 free (sections);
7399 }
7400
12bd6957 7401 elf_seg_map (obfd) = map_first;
bc67d8a6
NC
7402
7403 /* If we had to estimate the number of program headers that were
9ad5cbcf 7404 going to be needed, then check our estimate now and adjust
bc67d8a6
NC
7405 the offset if necessary. */
7406 if (phdr_adjust_seg != NULL)
7407 {
7408 unsigned int count;
c044fabd 7409
bc67d8a6 7410 for (count = 0, map = map_first; map != NULL; map = map->next)
c044fabd 7411 count++;
252b5132 7412
bc67d8a6
NC
7413 if (count > phdr_adjust_num)
7414 phdr_adjust_seg->p_paddr
7415 -= (count - phdr_adjust_num) * iehdr->e_phentsize;
9933dc52
AM
7416
7417 for (map = map_first; map != NULL; map = map->next)
7418 if (map->p_type == PT_PHDR)
7419 {
7420 bfd_vma adjust
7421 = phdr_adjust_seg->includes_filehdr ? iehdr->e_ehsize : 0;
7422 map->p_paddr = phdr_adjust_seg->p_paddr + adjust;
7423 break;
7424 }
bc67d8a6 7425 }
c044fabd 7426
bc67d8a6 7427#undef SEGMENT_END
eecdbe52 7428#undef SECTION_SIZE
bc67d8a6
NC
7429#undef IS_CONTAINED_BY_VMA
7430#undef IS_CONTAINED_BY_LMA
0efc80c8 7431#undef IS_NOTE
252b5132 7432#undef IS_COREFILE_NOTE
bc67d8a6 7433#undef IS_SOLARIS_PT_INTERP
9f17e2a6 7434#undef IS_SECTION_IN_INPUT_SEGMENT
bc67d8a6
NC
7435#undef INCLUDE_SECTION_IN_SEGMENT
7436#undef SEGMENT_AFTER_SEGMENT
7437#undef SEGMENT_OVERLAPS
b34976b6 7438 return TRUE;
252b5132
RH
7439}
7440
84d1d650
L
7441/* Copy ELF program header information. */
7442
7443static bfd_boolean
7444copy_elf_program_header (bfd *ibfd, bfd *obfd)
7445{
7446 Elf_Internal_Ehdr *iehdr;
7447 struct elf_segment_map *map;
7448 struct elf_segment_map *map_first;
7449 struct elf_segment_map **pointer_to_map;
7450 Elf_Internal_Phdr *segment;
7451 unsigned int i;
7452 unsigned int num_segments;
7453 bfd_boolean phdr_included = FALSE;
88967714 7454 bfd_boolean p_paddr_valid;
84d1d650
L
7455
7456 iehdr = elf_elfheader (ibfd);
7457
7458 map_first = NULL;
7459 pointer_to_map = &map_first;
7460
88967714
AM
7461 /* If all the segment p_paddr fields are zero, don't set
7462 map->p_paddr_valid. */
7463 p_paddr_valid = FALSE;
84d1d650 7464 num_segments = elf_elfheader (ibfd)->e_phnum;
88967714
AM
7465 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7466 i < num_segments;
7467 i++, segment++)
7468 if (segment->p_paddr != 0)
7469 {
7470 p_paddr_valid = TRUE;
7471 break;
7472 }
7473
84d1d650
L
7474 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7475 i < num_segments;
7476 i++, segment++)
7477 {
7478 asection *section;
7479 unsigned int section_count;
7480 bfd_size_type amt;
7481 Elf_Internal_Shdr *this_hdr;
53020534 7482 asection *first_section = NULL;
a76e6f2f 7483 asection *lowest_section;
84d1d650 7484
84d1d650
L
7485 /* Compute how many sections are in this segment. */
7486 for (section = ibfd->sections, section_count = 0;
7487 section != NULL;
7488 section = section->next)
7489 {
7490 this_hdr = &(elf_section_data(section)->this_hdr);
f4638467 7491 if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
3271a814 7492 {
a76e6f2f
AM
7493 if (first_section == NULL)
7494 first_section = section;
3271a814
NS
7495 section_count++;
7496 }
84d1d650
L
7497 }
7498
7499 /* Allocate a segment map big enough to contain
7500 all of the sections we have selected. */
00bee008
AM
7501 amt = sizeof (struct elf_segment_map) - sizeof (asection *);
7502 amt += (bfd_size_type) section_count * sizeof (asection *);
a50b1753 7503 map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
84d1d650
L
7504 if (map == NULL)
7505 return FALSE;
7506
7507 /* Initialize the fields of the output segment map with the
7508 input segment. */
7509 map->next = NULL;
7510 map->p_type = segment->p_type;
7511 map->p_flags = segment->p_flags;
7512 map->p_flags_valid = 1;
7513 map->p_paddr = segment->p_paddr;
88967714 7514 map->p_paddr_valid = p_paddr_valid;
3f570048
AM
7515 map->p_align = segment->p_align;
7516 map->p_align_valid = 1;
3271a814 7517 map->p_vaddr_offset = 0;
84d1d650 7518
04c3a755
NS
7519 if (map->p_type == PT_GNU_RELRO
7520 || map->p_type == PT_GNU_STACK)
b10a8ae0
L
7521 {
7522 /* The PT_GNU_RELRO segment may contain the first a few
7523 bytes in the .got.plt section even if the whole .got.plt
7524 section isn't in the PT_GNU_RELRO segment. We won't
04c3a755
NS
7525 change the size of the PT_GNU_RELRO segment.
7526 Similarly, PT_GNU_STACK size is significant on uclinux
7527 systems. */
9433b9b1 7528 map->p_size = segment->p_memsz;
b10a8ae0
L
7529 map->p_size_valid = 1;
7530 }
7531
84d1d650
L
7532 /* Determine if this segment contains the ELF file header
7533 and if it contains the program headers themselves. */
7534 map->includes_filehdr = (segment->p_offset == 0
7535 && segment->p_filesz >= iehdr->e_ehsize);
7536
7537 map->includes_phdrs = 0;
7538 if (! phdr_included || segment->p_type != PT_LOAD)
7539 {
7540 map->includes_phdrs =
7541 (segment->p_offset <= (bfd_vma) iehdr->e_phoff
7542 && (segment->p_offset + segment->p_filesz
7543 >= ((bfd_vma) iehdr->e_phoff
7544 + iehdr->e_phnum * iehdr->e_phentsize)));
7545
7546 if (segment->p_type == PT_LOAD && map->includes_phdrs)
7547 phdr_included = TRUE;
7548 }
7549
bbefd0a9 7550 lowest_section = NULL;
84d1d650
L
7551 if (section_count != 0)
7552 {
7553 unsigned int isec = 0;
7554
53020534 7555 for (section = first_section;
84d1d650
L
7556 section != NULL;
7557 section = section->next)
7558 {
7559 this_hdr = &(elf_section_data(section)->this_hdr);
f4638467 7560 if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
53020534
L
7561 {
7562 map->sections[isec++] = section->output_section;
a76e6f2f
AM
7563 if ((section->flags & SEC_ALLOC) != 0)
7564 {
7565 bfd_vma seg_off;
7566
bbefd0a9
AM
7567 if (lowest_section == NULL
7568 || section->lma < lowest_section->lma)
fb8a5684
AM
7569 lowest_section = section;
7570
a76e6f2f
AM
7571 /* Section lmas are set up from PT_LOAD header
7572 p_paddr in _bfd_elf_make_section_from_shdr.
7573 If this header has a p_paddr that disagrees
7574 with the section lma, flag the p_paddr as
7575 invalid. */
7576 if ((section->flags & SEC_LOAD) != 0)
7577 seg_off = this_hdr->sh_offset - segment->p_offset;
7578 else
7579 seg_off = this_hdr->sh_addr - segment->p_vaddr;
7580 if (section->lma - segment->p_paddr != seg_off)
7581 map->p_paddr_valid = FALSE;
7582 }
53020534
L
7583 if (isec == section_count)
7584 break;
7585 }
84d1d650
L
7586 }
7587 }
7588
5d695627
AM
7589 if (section_count == 0)
7590 map->p_vaddr_offset = segment->p_vaddr;
30fe1832
AM
7591 else if (map->p_paddr_valid)
7592 {
7593 /* Account for padding before the first section in the segment. */
7594 bfd_vma hdr_size = 0;
7595 if (map->includes_filehdr)
7596 hdr_size = iehdr->e_ehsize;
7597 if (map->includes_phdrs)
7598 hdr_size += iehdr->e_phnum * iehdr->e_phentsize;
7599
7600 map->p_vaddr_offset = (map->p_paddr + hdr_size
7601 - (lowest_section ? lowest_section->lma : 0));
7602 }
a76e6f2f 7603
84d1d650
L
7604 map->count = section_count;
7605 *pointer_to_map = map;
7606 pointer_to_map = &map->next;
7607 }
7608
12bd6957 7609 elf_seg_map (obfd) = map_first;
84d1d650
L
7610 return TRUE;
7611}
7612
7613/* Copy private BFD data. This copies or rewrites ELF program header
7614 information. */
7615
7616static bfd_boolean
7617copy_private_bfd_data (bfd *ibfd, bfd *obfd)
7618{
84d1d650
L
7619 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
7620 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
7621 return TRUE;
7622
7623 if (elf_tdata (ibfd)->phdr == NULL)
7624 return TRUE;
7625
7626 if (ibfd->xvec == obfd->xvec)
7627 {
cb3ff1e5
NC
7628 /* Check to see if any sections in the input BFD
7629 covered by ELF program header have changed. */
d55ce4e2 7630 Elf_Internal_Phdr *segment;
84d1d650
L
7631 asection *section, *osec;
7632 unsigned int i, num_segments;
7633 Elf_Internal_Shdr *this_hdr;
147d51c2
L
7634 const struct elf_backend_data *bed;
7635
7636 bed = get_elf_backend_data (ibfd);
7637
7638 /* Regenerate the segment map if p_paddr is set to 0. */
7639 if (bed->want_p_paddr_set_to_zero)
7640 goto rewrite;
84d1d650
L
7641
7642 /* Initialize the segment mark field. */
7643 for (section = obfd->sections; section != NULL;
7644 section = section->next)
7645 section->segment_mark = FALSE;
7646
7647 num_segments = elf_elfheader (ibfd)->e_phnum;
7648 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7649 i < num_segments;
7650 i++, segment++)
7651 {
5f6999aa
NC
7652 /* PR binutils/3535. The Solaris linker always sets the p_paddr
7653 and p_memsz fields of special segments (DYNAMIC, INTERP) to 0
7654 which severly confuses things, so always regenerate the segment
7655 map in this case. */
7656 if (segment->p_paddr == 0
7657 && segment->p_memsz == 0
7658 && (segment->p_type == PT_INTERP || segment->p_type == PT_DYNAMIC))
cb3ff1e5 7659 goto rewrite;
5f6999aa 7660
84d1d650
L
7661 for (section = ibfd->sections;
7662 section != NULL; section = section->next)
7663 {
7664 /* We mark the output section so that we know it comes
7665 from the input BFD. */
7666 osec = section->output_section;
7667 if (osec)
7668 osec->segment_mark = TRUE;
7669
7670 /* Check if this section is covered by the segment. */
7671 this_hdr = &(elf_section_data(section)->this_hdr);
f4638467 7672 if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
84d1d650
L
7673 {
7674 /* FIXME: Check if its output section is changed or
7675 removed. What else do we need to check? */
7676 if (osec == NULL
7677 || section->flags != osec->flags
7678 || section->lma != osec->lma
7679 || section->vma != osec->vma
7680 || section->size != osec->size
7681 || section->rawsize != osec->rawsize
7682 || section->alignment_power != osec->alignment_power)
7683 goto rewrite;
7684 }
7685 }
7686 }
7687
cb3ff1e5 7688 /* Check to see if any output section do not come from the
84d1d650
L
7689 input BFD. */
7690 for (section = obfd->sections; section != NULL;
7691 section = section->next)
7692 {
535b785f 7693 if (!section->segment_mark)
84d1d650
L
7694 goto rewrite;
7695 else
7696 section->segment_mark = FALSE;
7697 }
7698
7699 return copy_elf_program_header (ibfd, obfd);
7700 }
7701
7702rewrite:
f1d85785
L
7703 if (ibfd->xvec == obfd->xvec)
7704 {
7705 /* When rewriting program header, set the output maxpagesize to
7706 the maximum alignment of input PT_LOAD segments. */
7707 Elf_Internal_Phdr *segment;
7708 unsigned int i;
7709 unsigned int num_segments = elf_elfheader (ibfd)->e_phnum;
7710 bfd_vma maxpagesize = 0;
7711
7712 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7713 i < num_segments;
7714 i++, segment++)
7715 if (segment->p_type == PT_LOAD
7716 && maxpagesize < segment->p_align)
c86934ce
NC
7717 {
7718 /* PR 17512: file: f17299af. */
7719 if (segment->p_align > (bfd_vma) 1 << ((sizeof (bfd_vma) * 8) - 2))
695344c0 7720 /* xgettext:c-format */
2dcf00ce
AM
7721 _bfd_error_handler (_("%pB: warning: segment alignment of %#"
7722 PRIx64 " is too large"),
7723 ibfd, (uint64_t) segment->p_align);
c86934ce
NC
7724 else
7725 maxpagesize = segment->p_align;
7726 }
f1d85785
L
7727
7728 if (maxpagesize != get_elf_backend_data (obfd)->maxpagesize)
7729 bfd_emul_set_maxpagesize (bfd_get_target (obfd), maxpagesize);
7730 }
7731
84d1d650
L
7732 return rewrite_elf_program_header (ibfd, obfd);
7733}
7734
ccd2ec6a
L
7735/* Initialize private output section information from input section. */
7736
7737bfd_boolean
7738_bfd_elf_init_private_section_data (bfd *ibfd,
7739 asection *isec,
7740 bfd *obfd,
7741 asection *osec,
7742 struct bfd_link_info *link_info)
7743
7744{
7745 Elf_Internal_Shdr *ihdr, *ohdr;
0e1862bb
L
7746 bfd_boolean final_link = (link_info != NULL
7747 && !bfd_link_relocatable (link_info));
ccd2ec6a
L
7748
7749 if (ibfd->xvec->flavour != bfd_target_elf_flavour
7750 || obfd->xvec->flavour != bfd_target_elf_flavour)
7751 return TRUE;
7752
ba85c43e
NC
7753 BFD_ASSERT (elf_section_data (osec) != NULL);
7754
dfa7b0b8
AM
7755 /* For objcopy and relocatable link, don't copy the output ELF
7756 section type from input if the output BFD section flags have been
7757 set to something different. For a final link allow some flags
7758 that the linker clears to differ. */
42bb2e33 7759 if (elf_section_type (osec) == SHT_NULL
dfa7b0b8
AM
7760 && (osec->flags == isec->flags
7761 || (final_link
7762 && ((osec->flags ^ isec->flags)
0814be7d 7763 & ~(SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_RELOC)) == 0)))
42bb2e33 7764 elf_section_type (osec) = elf_section_type (isec);
d270463e
L
7765
7766 /* FIXME: Is this correct for all OS/PROC specific flags? */
7767 elf_section_flags (osec) |= (elf_section_flags (isec)
7768 & (SHF_MASKOS | SHF_MASKPROC));
ccd2ec6a 7769
a91e1603 7770 /* Copy sh_info from input for mbind section. */
df3a023b
AM
7771 if ((elf_tdata (ibfd)->has_gnu_osabi & elf_gnu_osabi_mbind) != 0
7772 && elf_section_flags (isec) & SHF_GNU_MBIND)
a91e1603
L
7773 elf_section_data (osec)->this_hdr.sh_info
7774 = elf_section_data (isec)->this_hdr.sh_info;
7775
ccd2ec6a
L
7776 /* Set things up for objcopy and relocatable link. The output
7777 SHT_GROUP section will have its elf_next_in_group pointing back
7778 to the input group members. Ignore linker created group section.
7779 See elfNN_ia64_object_p in elfxx-ia64.c. */
7bdf4127
AB
7780 if ((link_info == NULL
7781 || !link_info->resolve_section_groups)
7782 && (elf_sec_group (isec) == NULL
7783 || (elf_sec_group (isec)->flags & SEC_LINKER_CREATED) == 0))
ccd2ec6a 7784 {
7bdf4127
AB
7785 if (elf_section_flags (isec) & SHF_GROUP)
7786 elf_section_flags (osec) |= SHF_GROUP;
7787 elf_next_in_group (osec) = elf_next_in_group (isec);
7788 elf_section_data (osec)->group = elf_section_data (isec)->group;
ccd2ec6a
L
7789 }
7790
7bdf4127
AB
7791 /* If not decompress, preserve SHF_COMPRESSED. */
7792 if (!final_link && (ibfd->flags & BFD_DECOMPRESS) == 0)
7793 elf_section_flags (osec) |= (elf_section_flags (isec)
7794 & SHF_COMPRESSED);
7795
ccd2ec6a
L
7796 ihdr = &elf_section_data (isec)->this_hdr;
7797
7798 /* We need to handle elf_linked_to_section for SHF_LINK_ORDER. We
7799 don't use the output section of the linked-to section since it
7800 may be NULL at this point. */
7801 if ((ihdr->sh_flags & SHF_LINK_ORDER) != 0)
7802 {
7803 ohdr = &elf_section_data (osec)->this_hdr;
7804 ohdr->sh_flags |= SHF_LINK_ORDER;
7805 elf_linked_to_section (osec) = elf_linked_to_section (isec);
7806 }
7807
7808 osec->use_rela_p = isec->use_rela_p;
7809
7810 return TRUE;
7811}
7812
252b5132
RH
7813/* Copy private section information. This copies over the entsize
7814 field, and sometimes the info field. */
7815
b34976b6 7816bfd_boolean
217aa764
AM
7817_bfd_elf_copy_private_section_data (bfd *ibfd,
7818 asection *isec,
7819 bfd *obfd,
7820 asection *osec)
252b5132
RH
7821{
7822 Elf_Internal_Shdr *ihdr, *ohdr;
7823
7824 if (ibfd->xvec->flavour != bfd_target_elf_flavour
7825 || obfd->xvec->flavour != bfd_target_elf_flavour)
b34976b6 7826 return TRUE;
252b5132 7827
252b5132
RH
7828 ihdr = &elf_section_data (isec)->this_hdr;
7829 ohdr = &elf_section_data (osec)->this_hdr;
7830
7831 ohdr->sh_entsize = ihdr->sh_entsize;
7832
7833 if (ihdr->sh_type == SHT_SYMTAB
7834 || ihdr->sh_type == SHT_DYNSYM
7835 || ihdr->sh_type == SHT_GNU_verneed
7836 || ihdr->sh_type == SHT_GNU_verdef)
7837 ohdr->sh_info = ihdr->sh_info;
7838
ccd2ec6a
L
7839 return _bfd_elf_init_private_section_data (ibfd, isec, obfd, osec,
7840 NULL);
252b5132
RH
7841}
7842
d0bf826b
AM
7843/* Look at all the SHT_GROUP sections in IBFD, making any adjustments
7844 necessary if we are removing either the SHT_GROUP section or any of
7845 the group member sections. DISCARDED is the value that a section's
7846 output_section has if the section will be discarded, NULL when this
7847 function is called from objcopy, bfd_abs_section_ptr when called
7848 from the linker. */
80fccad2
BW
7849
7850bfd_boolean
d0bf826b 7851_bfd_elf_fixup_group_sections (bfd *ibfd, asection *discarded)
80fccad2 7852{
30288845
AM
7853 asection *isec;
7854
30288845 7855 for (isec = ibfd->sections; isec != NULL; isec = isec->next)
415f38a6 7856 if (elf_section_type (isec) == SHT_GROUP)
30288845
AM
7857 {
7858 asection *first = elf_next_in_group (isec);
7859 asection *s = first;
d0bf826b
AM
7860 bfd_size_type removed = 0;
7861
30288845
AM
7862 while (s != NULL)
7863 {
415f38a6
AM
7864 /* If this member section is being output but the
7865 SHT_GROUP section is not, then clear the group info
7866 set up by _bfd_elf_copy_private_section_data. */
d0bf826b
AM
7867 if (s->output_section != discarded
7868 && isec->output_section == discarded)
30288845
AM
7869 {
7870 elf_section_flags (s->output_section) &= ~SHF_GROUP;
7871 elf_group_name (s->output_section) = NULL;
7872 }
415f38a6
AM
7873 /* Conversely, if the member section is not being output
7874 but the SHT_GROUP section is, then adjust its size. */
d0bf826b
AM
7875 else if (s->output_section == discarded
7876 && isec->output_section != discarded)
6e5e9d58
AM
7877 {
7878 struct bfd_elf_section_data *elf_sec = elf_section_data (s);
7879 removed += 4;
7880 if (elf_sec->rel.hdr != NULL
7881 && (elf_sec->rel.hdr->sh_flags & SHF_GROUP) != 0)
7882 removed += 4;
7883 if (elf_sec->rela.hdr != NULL
7884 && (elf_sec->rela.hdr->sh_flags & SHF_GROUP) != 0)
7885 removed += 4;
7886 }
30288845
AM
7887 s = elf_next_in_group (s);
7888 if (s == first)
7889 break;
7890 }
d0bf826b
AM
7891 if (removed != 0)
7892 {
7893 if (discarded != NULL)
7894 {
7895 /* If we've been called for ld -r, then we need to
6e5e9d58 7896 adjust the input section size. */
d0bf826b
AM
7897 if (isec->rawsize == 0)
7898 isec->rawsize = isec->size;
7899 isec->size = isec->rawsize - removed;
6e5e9d58
AM
7900 if (isec->size <= 4)
7901 {
7902 isec->size = 0;
7903 isec->flags |= SEC_EXCLUDE;
7904 }
d0bf826b
AM
7905 }
7906 else
7907 {
7908 /* Adjust the output section size when called from
7909 objcopy. */
7910 isec->output_section->size -= removed;
6e5e9d58
AM
7911 if (isec->output_section->size <= 4)
7912 {
7913 isec->output_section->size = 0;
7914 isec->output_section->flags |= SEC_EXCLUDE;
7915 }
d0bf826b
AM
7916 }
7917 }
30288845
AM
7918 }
7919
80fccad2
BW
7920 return TRUE;
7921}
7922
d0bf826b
AM
7923/* Copy private header information. */
7924
7925bfd_boolean
7926_bfd_elf_copy_private_header_data (bfd *ibfd, bfd *obfd)
7927{
7928 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
7929 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
7930 return TRUE;
7931
7932 /* Copy over private BFD data if it has not already been copied.
7933 This must be done here, rather than in the copy_private_bfd_data
7934 entry point, because the latter is called after the section
7935 contents have been set, which means that the program headers have
7936 already been worked out. */
12bd6957 7937 if (elf_seg_map (obfd) == NULL && elf_tdata (ibfd)->phdr != NULL)
d0bf826b
AM
7938 {
7939 if (! copy_private_bfd_data (ibfd, obfd))
7940 return FALSE;
7941 }
7942
7943 return _bfd_elf_fixup_group_sections (ibfd, NULL);
7944}
7945
252b5132
RH
7946/* Copy private symbol information. If this symbol is in a section
7947 which we did not map into a BFD section, try to map the section
7948 index correctly. We use special macro definitions for the mapped
7949 section indices; these definitions are interpreted by the
7950 swap_out_syms function. */
7951
9ad5cbcf
AM
7952#define MAP_ONESYMTAB (SHN_HIOS + 1)
7953#define MAP_DYNSYMTAB (SHN_HIOS + 2)
7954#define MAP_STRTAB (SHN_HIOS + 3)
7955#define MAP_SHSTRTAB (SHN_HIOS + 4)
7956#define MAP_SYM_SHNDX (SHN_HIOS + 5)
252b5132 7957
b34976b6 7958bfd_boolean
217aa764
AM
7959_bfd_elf_copy_private_symbol_data (bfd *ibfd,
7960 asymbol *isymarg,
7961 bfd *obfd,
7962 asymbol *osymarg)
252b5132
RH
7963{
7964 elf_symbol_type *isym, *osym;
7965
7966 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
7967 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
b34976b6 7968 return TRUE;
252b5132
RH
7969
7970 isym = elf_symbol_from (ibfd, isymarg);
7971 osym = elf_symbol_from (obfd, osymarg);
7972
7973 if (isym != NULL
8424d8f5 7974 && isym->internal_elf_sym.st_shndx != 0
252b5132
RH
7975 && osym != NULL
7976 && bfd_is_abs_section (isym->symbol.section))
7977 {
7978 unsigned int shndx;
7979
7980 shndx = isym->internal_elf_sym.st_shndx;
7981 if (shndx == elf_onesymtab (ibfd))
7982 shndx = MAP_ONESYMTAB;
7983 else if (shndx == elf_dynsymtab (ibfd))
7984 shndx = MAP_DYNSYMTAB;
12bd6957 7985 else if (shndx == elf_strtab_sec (ibfd))
252b5132 7986 shndx = MAP_STRTAB;
12bd6957 7987 else if (shndx == elf_shstrtab_sec (ibfd))
252b5132 7988 shndx = MAP_SHSTRTAB;
6a40cf0c 7989 else if (find_section_in_list (shndx, elf_symtab_shndx_list (ibfd)))
9ad5cbcf 7990 shndx = MAP_SYM_SHNDX;
252b5132
RH
7991 osym->internal_elf_sym.st_shndx = shndx;
7992 }
7993
b34976b6 7994 return TRUE;
252b5132
RH
7995}
7996
7997/* Swap out the symbols. */
7998
b34976b6 7999static bfd_boolean
217aa764 8000swap_out_syms (bfd *abfd,
ef10c3ac 8001 struct elf_strtab_hash **sttp,
217aa764 8002 int relocatable_p)
252b5132 8003{
9c5bfbb7 8004 const struct elf_backend_data *bed;
079e9a2f
AM
8005 int symcount;
8006 asymbol **syms;
ef10c3ac 8007 struct elf_strtab_hash *stt;
079e9a2f 8008 Elf_Internal_Shdr *symtab_hdr;
9ad5cbcf 8009 Elf_Internal_Shdr *symtab_shndx_hdr;
079e9a2f 8010 Elf_Internal_Shdr *symstrtab_hdr;
ef10c3ac 8011 struct elf_sym_strtab *symstrtab;
f075ee0c
AM
8012 bfd_byte *outbound_syms;
8013 bfd_byte *outbound_shndx;
ef10c3ac
L
8014 unsigned long outbound_syms_index;
8015 unsigned long outbound_shndx_index;
079e9a2f 8016 int idx;
12bd6957 8017 unsigned int num_locals;
079e9a2f 8018 bfd_size_type amt;
174fd7f9 8019 bfd_boolean name_local_sections;
252b5132 8020
12bd6957 8021 if (!elf_map_symbols (abfd, &num_locals))
b34976b6 8022 return FALSE;
252b5132 8023
c044fabd 8024 /* Dump out the symtabs. */
ef10c3ac 8025 stt = _bfd_elf_strtab_init ();
079e9a2f 8026 if (stt == NULL)
b34976b6 8027 return FALSE;
252b5132 8028
079e9a2f
AM
8029 bed = get_elf_backend_data (abfd);
8030 symcount = bfd_get_symcount (abfd);
8031 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8032 symtab_hdr->sh_type = SHT_SYMTAB;
8033 symtab_hdr->sh_entsize = bed->s->sizeof_sym;
8034 symtab_hdr->sh_size = symtab_hdr->sh_entsize * (symcount + 1);
12bd6957 8035 symtab_hdr->sh_info = num_locals + 1;
72de5009 8036 symtab_hdr->sh_addralign = (bfd_vma) 1 << bed->s->log_file_align;
079e9a2f
AM
8037
8038 symstrtab_hdr = &elf_tdata (abfd)->strtab_hdr;
8039 symstrtab_hdr->sh_type = SHT_STRTAB;
8040
ef10c3ac 8041 /* Allocate buffer to swap out the .strtab section. */
7a6e0d89
AM
8042 symstrtab = (struct elf_sym_strtab *) bfd_malloc2 (symcount + 1,
8043 sizeof (*symstrtab));
ef10c3ac
L
8044 if (symstrtab == NULL)
8045 {
8046 _bfd_elf_strtab_free (stt);
8047 return FALSE;
8048 }
8049
a50b1753 8050 outbound_syms = (bfd_byte *) bfd_alloc2 (abfd, 1 + symcount,
07d6d2b8 8051 bed->s->sizeof_sym);
079e9a2f 8052 if (outbound_syms == NULL)
5ed6aba4 8053 {
ef10c3ac
L
8054error_return:
8055 _bfd_elf_strtab_free (stt);
8056 free (symstrtab);
5ed6aba4
NC
8057 return FALSE;
8058 }
217aa764 8059 symtab_hdr->contents = outbound_syms;
ef10c3ac 8060 outbound_syms_index = 0;
252b5132 8061
9ad5cbcf 8062 outbound_shndx = NULL;
ef10c3ac 8063 outbound_shndx_index = 0;
6a40cf0c
NC
8064
8065 if (elf_symtab_shndx_list (abfd))
9ad5cbcf 8066 {
6a40cf0c
NC
8067 symtab_shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
8068 if (symtab_shndx_hdr->sh_name != 0)
8069 {
8070 amt = (bfd_size_type) (1 + symcount) * sizeof (Elf_External_Sym_Shndx);
8071 outbound_shndx = (bfd_byte *)
8072 bfd_zalloc2 (abfd, 1 + symcount, sizeof (Elf_External_Sym_Shndx));
8073 if (outbound_shndx == NULL)
8074 goto error_return;
5ed6aba4 8075
6a40cf0c
NC
8076 symtab_shndx_hdr->contents = outbound_shndx;
8077 symtab_shndx_hdr->sh_type = SHT_SYMTAB_SHNDX;
8078 symtab_shndx_hdr->sh_size = amt;
8079 symtab_shndx_hdr->sh_addralign = sizeof (Elf_External_Sym_Shndx);
8080 symtab_shndx_hdr->sh_entsize = sizeof (Elf_External_Sym_Shndx);
8081 }
8082 /* FIXME: What about any other headers in the list ? */
9ad5cbcf
AM
8083 }
8084
589e6347 8085 /* Now generate the data (for "contents"). */
079e9a2f
AM
8086 {
8087 /* Fill in zeroth symbol and swap it out. */
8088 Elf_Internal_Sym sym;
8089 sym.st_name = 0;
8090 sym.st_value = 0;
8091 sym.st_size = 0;
8092 sym.st_info = 0;
8093 sym.st_other = 0;
8094 sym.st_shndx = SHN_UNDEF;
35fc36a8 8095 sym.st_target_internal = 0;
ef10c3ac
L
8096 symstrtab[0].sym = sym;
8097 symstrtab[0].dest_index = outbound_syms_index;
8098 symstrtab[0].destshndx_index = outbound_shndx_index;
8099 outbound_syms_index++;
9ad5cbcf 8100 if (outbound_shndx != NULL)
ef10c3ac 8101 outbound_shndx_index++;
079e9a2f 8102 }
252b5132 8103
174fd7f9
RS
8104 name_local_sections
8105 = (bed->elf_backend_name_local_section_symbols
8106 && bed->elf_backend_name_local_section_symbols (abfd));
8107
079e9a2f 8108 syms = bfd_get_outsymbols (abfd);
ef10c3ac 8109 for (idx = 0; idx < symcount;)
252b5132 8110 {
252b5132 8111 Elf_Internal_Sym sym;
079e9a2f
AM
8112 bfd_vma value = syms[idx]->value;
8113 elf_symbol_type *type_ptr;
8114 flagword flags = syms[idx]->flags;
8115 int type;
252b5132 8116
174fd7f9
RS
8117 if (!name_local_sections
8118 && (flags & (BSF_SECTION_SYM | BSF_GLOBAL)) == BSF_SECTION_SYM)
079e9a2f
AM
8119 {
8120 /* Local section symbols have no name. */
ef10c3ac 8121 sym.st_name = (unsigned long) -1;
079e9a2f
AM
8122 }
8123 else
8124 {
ef10c3ac
L
8125 /* Call _bfd_elf_strtab_offset after _bfd_elf_strtab_finalize
8126 to get the final offset for st_name. */
8127 sym.st_name
8128 = (unsigned long) _bfd_elf_strtab_add (stt, syms[idx]->name,
8129 FALSE);
079e9a2f 8130 if (sym.st_name == (unsigned long) -1)
ef10c3ac 8131 goto error_return;
079e9a2f 8132 }
252b5132 8133
079e9a2f 8134 type_ptr = elf_symbol_from (abfd, syms[idx]);
252b5132 8135
079e9a2f
AM
8136 if ((flags & BSF_SECTION_SYM) == 0
8137 && bfd_is_com_section (syms[idx]->section))
8138 {
8139 /* ELF common symbols put the alignment into the `value' field,
8140 and the size into the `size' field. This is backwards from
8141 how BFD handles it, so reverse it here. */
8142 sym.st_size = value;
8143 if (type_ptr == NULL
8144 || type_ptr->internal_elf_sym.st_value == 0)
8145 sym.st_value = value >= 16 ? 16 : (1 << bfd_log2 (value));
8146 else
8147 sym.st_value = type_ptr->internal_elf_sym.st_value;
8148 sym.st_shndx = _bfd_elf_section_from_bfd_section
8149 (abfd, syms[idx]->section);
8150 }
8151 else
8152 {
8153 asection *sec = syms[idx]->section;
cb33740c 8154 unsigned int shndx;
252b5132 8155
079e9a2f
AM
8156 if (sec->output_section)
8157 {
8158 value += sec->output_offset;
8159 sec = sec->output_section;
8160 }
589e6347 8161
079e9a2f
AM
8162 /* Don't add in the section vma for relocatable output. */
8163 if (! relocatable_p)
8164 value += sec->vma;
8165 sym.st_value = value;
8166 sym.st_size = type_ptr ? type_ptr->internal_elf_sym.st_size : 0;
8167
8168 if (bfd_is_abs_section (sec)
8169 && type_ptr != NULL
8170 && type_ptr->internal_elf_sym.st_shndx != 0)
8171 {
8172 /* This symbol is in a real ELF section which we did
8173 not create as a BFD section. Undo the mapping done
8174 by copy_private_symbol_data. */
8175 shndx = type_ptr->internal_elf_sym.st_shndx;
8176 switch (shndx)
8177 {
8178 case MAP_ONESYMTAB:
8179 shndx = elf_onesymtab (abfd);
8180 break;
8181 case MAP_DYNSYMTAB:
8182 shndx = elf_dynsymtab (abfd);
8183 break;
8184 case MAP_STRTAB:
12bd6957 8185 shndx = elf_strtab_sec (abfd);
079e9a2f
AM
8186 break;
8187 case MAP_SHSTRTAB:
12bd6957 8188 shndx = elf_shstrtab_sec (abfd);
079e9a2f 8189 break;
9ad5cbcf 8190 case MAP_SYM_SHNDX:
6a40cf0c
NC
8191 if (elf_symtab_shndx_list (abfd))
8192 shndx = elf_symtab_shndx_list (abfd)->ndx;
9ad5cbcf 8193 break;
079e9a2f 8194 default:
15bc576a 8195 shndx = SHN_ABS;
079e9a2f
AM
8196 break;
8197 }
8198 }
8199 else
8200 {
8201 shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
252b5132 8202
cb33740c 8203 if (shndx == SHN_BAD)
079e9a2f
AM
8204 {
8205 asection *sec2;
8206
8207 /* Writing this would be a hell of a lot easier if
8208 we had some decent documentation on bfd, and
8209 knew what to expect of the library, and what to
8210 demand of applications. For example, it
8211 appears that `objcopy' might not set the
8212 section of a symbol to be a section that is
8213 actually in the output file. */
8214 sec2 = bfd_get_section_by_name (abfd, sec->name);
5df1bc57
AM
8215 if (sec2 != NULL)
8216 shndx = _bfd_elf_section_from_bfd_section (abfd, sec2);
8217 if (shndx == SHN_BAD)
589e6347 8218 {
695344c0 8219 /* xgettext:c-format */
9793eb77
AM
8220 _bfd_error_handler
8221 (_("unable to find equivalent output section"
8222 " for symbol '%s' from section '%s'"),
8223 syms[idx]->name ? syms[idx]->name : "<Local sym>",
8224 sec->name);
811072d8 8225 bfd_set_error (bfd_error_invalid_operation);
ef10c3ac 8226 goto error_return;
589e6347 8227 }
079e9a2f
AM
8228 }
8229 }
252b5132 8230
079e9a2f
AM
8231 sym.st_shndx = shndx;
8232 }
252b5132 8233
13ae64f3
JJ
8234 if ((flags & BSF_THREAD_LOCAL) != 0)
8235 type = STT_TLS;
d8045f23
NC
8236 else if ((flags & BSF_GNU_INDIRECT_FUNCTION) != 0)
8237 type = STT_GNU_IFUNC;
13ae64f3 8238 else if ((flags & BSF_FUNCTION) != 0)
079e9a2f
AM
8239 type = STT_FUNC;
8240 else if ((flags & BSF_OBJECT) != 0)
8241 type = STT_OBJECT;
d9352518
DB
8242 else if ((flags & BSF_RELC) != 0)
8243 type = STT_RELC;
8244 else if ((flags & BSF_SRELC) != 0)
8245 type = STT_SRELC;
079e9a2f
AM
8246 else
8247 type = STT_NOTYPE;
252b5132 8248
13ae64f3
JJ
8249 if (syms[idx]->section->flags & SEC_THREAD_LOCAL)
8250 type = STT_TLS;
8251
589e6347 8252 /* Processor-specific types. */
079e9a2f
AM
8253 if (type_ptr != NULL
8254 && bed->elf_backend_get_symbol_type)
8255 type = ((*bed->elf_backend_get_symbol_type)
8256 (&type_ptr->internal_elf_sym, type));
252b5132 8257
079e9a2f
AM
8258 if (flags & BSF_SECTION_SYM)
8259 {
8260 if (flags & BSF_GLOBAL)
8261 sym.st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8262 else
8263 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION);
8264 }
8265 else if (bfd_is_com_section (syms[idx]->section))
0a40daed 8266 {
b8871f35
L
8267 if (type != STT_TLS)
8268 {
8269 if ((abfd->flags & BFD_CONVERT_ELF_COMMON))
8270 type = ((abfd->flags & BFD_USE_ELF_STT_COMMON)
8271 ? STT_COMMON : STT_OBJECT);
8272 else
8273 type = ((flags & BSF_ELF_COMMON) != 0
8274 ? STT_COMMON : STT_OBJECT);
8275 }
8276 sym.st_info = ELF_ST_INFO (STB_GLOBAL, type);
0a40daed 8277 }
079e9a2f
AM
8278 else if (bfd_is_und_section (syms[idx]->section))
8279 sym.st_info = ELF_ST_INFO (((flags & BSF_WEAK)
8280 ? STB_WEAK
8281 : STB_GLOBAL),
8282 type);
8283 else if (flags & BSF_FILE)
8284 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FILE);
8285 else
8286 {
8287 int bind = STB_LOCAL;
252b5132 8288
079e9a2f
AM
8289 if (flags & BSF_LOCAL)
8290 bind = STB_LOCAL;
3e7a7d11
NC
8291 else if (flags & BSF_GNU_UNIQUE)
8292 bind = STB_GNU_UNIQUE;
079e9a2f
AM
8293 else if (flags & BSF_WEAK)
8294 bind = STB_WEAK;
8295 else if (flags & BSF_GLOBAL)
8296 bind = STB_GLOBAL;
252b5132 8297
079e9a2f
AM
8298 sym.st_info = ELF_ST_INFO (bind, type);
8299 }
252b5132 8300
079e9a2f 8301 if (type_ptr != NULL)
35fc36a8
RS
8302 {
8303 sym.st_other = type_ptr->internal_elf_sym.st_other;
8304 sym.st_target_internal
8305 = type_ptr->internal_elf_sym.st_target_internal;
8306 }
079e9a2f 8307 else
35fc36a8
RS
8308 {
8309 sym.st_other = 0;
8310 sym.st_target_internal = 0;
8311 }
252b5132 8312
ef10c3ac
L
8313 idx++;
8314 symstrtab[idx].sym = sym;
8315 symstrtab[idx].dest_index = outbound_syms_index;
8316 symstrtab[idx].destshndx_index = outbound_shndx_index;
8317
8318 outbound_syms_index++;
9ad5cbcf 8319 if (outbound_shndx != NULL)
ef10c3ac
L
8320 outbound_shndx_index++;
8321 }
8322
8323 /* Finalize the .strtab section. */
8324 _bfd_elf_strtab_finalize (stt);
8325
8326 /* Swap out the .strtab section. */
8327 for (idx = 0; idx <= symcount; idx++)
8328 {
8329 struct elf_sym_strtab *elfsym = &symstrtab[idx];
8330 if (elfsym->sym.st_name == (unsigned long) -1)
8331 elfsym->sym.st_name = 0;
8332 else
8333 elfsym->sym.st_name = _bfd_elf_strtab_offset (stt,
8334 elfsym->sym.st_name);
8335 bed->s->swap_symbol_out (abfd, &elfsym->sym,
8336 (outbound_syms
8337 + (elfsym->dest_index
8338 * bed->s->sizeof_sym)),
8339 (outbound_shndx
8340 + (elfsym->destshndx_index
8341 * sizeof (Elf_External_Sym_Shndx))));
079e9a2f 8342 }
ef10c3ac 8343 free (symstrtab);
252b5132 8344
079e9a2f 8345 *sttp = stt;
ef10c3ac 8346 symstrtab_hdr->sh_size = _bfd_elf_strtab_size (stt);
079e9a2f 8347 symstrtab_hdr->sh_type = SHT_STRTAB;
84865015 8348 symstrtab_hdr->sh_flags = bed->elf_strtab_flags;
079e9a2f
AM
8349 symstrtab_hdr->sh_addr = 0;
8350 symstrtab_hdr->sh_entsize = 0;
8351 symstrtab_hdr->sh_link = 0;
8352 symstrtab_hdr->sh_info = 0;
8353 symstrtab_hdr->sh_addralign = 1;
252b5132 8354
b34976b6 8355 return TRUE;
252b5132
RH
8356}
8357
8358/* Return the number of bytes required to hold the symtab vector.
8359
8360 Note that we base it on the count plus 1, since we will null terminate
8361 the vector allocated based on this size. However, the ELF symbol table
8362 always has a dummy entry as symbol #0, so it ends up even. */
8363
8364long
217aa764 8365_bfd_elf_get_symtab_upper_bound (bfd *abfd)
252b5132 8366{
3a551c7a 8367 bfd_size_type symcount;
252b5132
RH
8368 long symtab_size;
8369 Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->symtab_hdr;
8370
8371 symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
3a551c7a
AM
8372 if (symcount >= LONG_MAX / sizeof (asymbol *))
8373 {
8374 bfd_set_error (bfd_error_file_too_big);
8375 return -1;
8376 }
b99d1833
AM
8377 symtab_size = (symcount + 1) * (sizeof (asymbol *));
8378 if (symcount > 0)
8379 symtab_size -= sizeof (asymbol *);
252b5132
RH
8380
8381 return symtab_size;
8382}
8383
8384long
217aa764 8385_bfd_elf_get_dynamic_symtab_upper_bound (bfd *abfd)
252b5132 8386{
3a551c7a 8387 bfd_size_type symcount;
252b5132
RH
8388 long symtab_size;
8389 Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->dynsymtab_hdr;
8390
8391 if (elf_dynsymtab (abfd) == 0)
8392 {
8393 bfd_set_error (bfd_error_invalid_operation);
8394 return -1;
8395 }
8396
8397 symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
3a551c7a
AM
8398 if (symcount >= LONG_MAX / sizeof (asymbol *))
8399 {
8400 bfd_set_error (bfd_error_file_too_big);
8401 return -1;
8402 }
b99d1833
AM
8403 symtab_size = (symcount + 1) * (sizeof (asymbol *));
8404 if (symcount > 0)
8405 symtab_size -= sizeof (asymbol *);
252b5132
RH
8406
8407 return symtab_size;
8408}
8409
8410long
217aa764
AM
8411_bfd_elf_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
8412 sec_ptr asect)
252b5132 8413{
242a1159 8414#if SIZEOF_LONG == SIZEOF_INT
7a6e0d89
AM
8415 if (asect->reloc_count >= LONG_MAX / sizeof (arelent *))
8416 {
8417 bfd_set_error (bfd_error_file_too_big);
8418 return -1;
8419 }
242a1159 8420#endif
252b5132
RH
8421 return (asect->reloc_count + 1) * sizeof (arelent *);
8422}
8423
8424/* Canonicalize the relocs. */
8425
8426long
217aa764
AM
8427_bfd_elf_canonicalize_reloc (bfd *abfd,
8428 sec_ptr section,
8429 arelent **relptr,
8430 asymbol **symbols)
252b5132
RH
8431{
8432 arelent *tblptr;
8433 unsigned int i;
9c5bfbb7 8434 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 8435
b34976b6 8436 if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
252b5132
RH
8437 return -1;
8438
8439 tblptr = section->relocation;
8440 for (i = 0; i < section->reloc_count; i++)
8441 *relptr++ = tblptr++;
8442
8443 *relptr = NULL;
8444
8445 return section->reloc_count;
8446}
8447
8448long
6cee3f79 8449_bfd_elf_canonicalize_symtab (bfd *abfd, asymbol **allocation)
252b5132 8450{
9c5bfbb7 8451 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
217aa764 8452 long symcount = bed->s->slurp_symbol_table (abfd, allocation, FALSE);
252b5132
RH
8453
8454 if (symcount >= 0)
ed48ec2e 8455 abfd->symcount = symcount;
252b5132
RH
8456 return symcount;
8457}
8458
8459long
217aa764
AM
8460_bfd_elf_canonicalize_dynamic_symtab (bfd *abfd,
8461 asymbol **allocation)
252b5132 8462{
9c5bfbb7 8463 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
217aa764 8464 long symcount = bed->s->slurp_symbol_table (abfd, allocation, TRUE);
1f70368c
DJ
8465
8466 if (symcount >= 0)
ed48ec2e 8467 abfd->dynsymcount = symcount;
1f70368c 8468 return symcount;
252b5132
RH
8469}
8470
8615f3f2
AM
8471/* Return the size required for the dynamic reloc entries. Any loadable
8472 section that was actually installed in the BFD, and has type SHT_REL
8473 or SHT_RELA, and uses the dynamic symbol table, is considered to be a
8474 dynamic reloc section. */
252b5132
RH
8475
8476long
217aa764 8477_bfd_elf_get_dynamic_reloc_upper_bound (bfd *abfd)
252b5132 8478{
3a551c7a 8479 bfd_size_type count;
252b5132
RH
8480 asection *s;
8481
8482 if (elf_dynsymtab (abfd) == 0)
8483 {
8484 bfd_set_error (bfd_error_invalid_operation);
8485 return -1;
8486 }
8487
3a551c7a 8488 count = 1;
252b5132 8489 for (s = abfd->sections; s != NULL; s = s->next)
266b05cf 8490 if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
252b5132
RH
8491 && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
8492 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
3a551c7a
AM
8493 {
8494 count += s->size / elf_section_data (s)->this_hdr.sh_entsize;
8495 if (count > LONG_MAX / sizeof (arelent *))
8496 {
8497 bfd_set_error (bfd_error_file_too_big);
8498 return -1;
8499 }
8500 }
8501 return count * sizeof (arelent *);
252b5132
RH
8502}
8503
8615f3f2
AM
8504/* Canonicalize the dynamic relocation entries. Note that we return the
8505 dynamic relocations as a single block, although they are actually
8506 associated with particular sections; the interface, which was
8507 designed for SunOS style shared libraries, expects that there is only
8508 one set of dynamic relocs. Any loadable section that was actually
8509 installed in the BFD, and has type SHT_REL or SHT_RELA, and uses the
8510 dynamic symbol table, is considered to be a dynamic reloc section. */
252b5132
RH
8511
8512long
217aa764
AM
8513_bfd_elf_canonicalize_dynamic_reloc (bfd *abfd,
8514 arelent **storage,
8515 asymbol **syms)
252b5132 8516{
217aa764 8517 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
252b5132
RH
8518 asection *s;
8519 long ret;
8520
8521 if (elf_dynsymtab (abfd) == 0)
8522 {
8523 bfd_set_error (bfd_error_invalid_operation);
8524 return -1;
8525 }
8526
8527 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
8528 ret = 0;
8529 for (s = abfd->sections; s != NULL; s = s->next)
8530 {
266b05cf 8531 if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
252b5132
RH
8532 && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
8533 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
8534 {
8535 arelent *p;
8536 long count, i;
8537
b34976b6 8538 if (! (*slurp_relocs) (abfd, s, syms, TRUE))
252b5132 8539 return -1;
eea6121a 8540 count = s->size / elf_section_data (s)->this_hdr.sh_entsize;
252b5132
RH
8541 p = s->relocation;
8542 for (i = 0; i < count; i++)
8543 *storage++ = p++;
8544 ret += count;
8545 }
8546 }
8547
8548 *storage = NULL;
8549
8550 return ret;
8551}
8552\f
8553/* Read in the version information. */
8554
b34976b6 8555bfd_boolean
fc0e6df6 8556_bfd_elf_slurp_version_tables (bfd *abfd, bfd_boolean default_imported_symver)
252b5132
RH
8557{
8558 bfd_byte *contents = NULL;
fc0e6df6
PB
8559 unsigned int freeidx = 0;
8560
8561 if (elf_dynverref (abfd) != 0)
8562 {
8563 Elf_Internal_Shdr *hdr;
8564 Elf_External_Verneed *everneed;
8565 Elf_Internal_Verneed *iverneed;
8566 unsigned int i;
d0fb9a8d 8567 bfd_byte *contents_end;
fc0e6df6
PB
8568
8569 hdr = &elf_tdata (abfd)->dynverref_hdr;
8570
bd61e135
AM
8571 if (hdr->sh_info == 0
8572 || hdr->sh_info > hdr->sh_size / sizeof (Elf_External_Verneed))
d0fb9a8d 8573 {
601a03ba 8574error_return_bad_verref:
4eca0228 8575 _bfd_error_handler
871b3ab2 8576 (_("%pB: .gnu.version_r invalid entry"), abfd);
601a03ba 8577 bfd_set_error (bfd_error_bad_value);
d0fb9a8d
JJ
8578error_return_verref:
8579 elf_tdata (abfd)->verref = NULL;
8580 elf_tdata (abfd)->cverrefs = 0;
8581 goto error_return;
8582 }
601a03ba 8583
7e56c51c
NC
8584 ufile_ptr filesize = bfd_get_file_size (abfd);
8585 if (filesize > 0 && filesize < hdr->sh_size)
8586 {
8587 /* PR 24708: Avoid attempts to allocate a ridiculous amount
8588 of memory. */
8589 bfd_set_error (bfd_error_no_memory);
8590 _bfd_error_handler
8591 /* xgettext:c-format */
8592 (_("error: %pB version reference section is too large (%#" PRIx64 " bytes)"),
8593 abfd, (uint64_t) hdr->sh_size);
8594 goto error_return_verref;
8595 }
601a03ba
AM
8596 contents = (bfd_byte *) bfd_malloc (hdr->sh_size);
8597 if (contents == NULL)
8598 goto error_return_verref;
8599
fc0e6df6
PB
8600 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
8601 || bfd_bread (contents, hdr->sh_size, abfd) != hdr->sh_size)
d0fb9a8d 8602 goto error_return_verref;
fc0e6df6 8603
601a03ba 8604 elf_tdata (abfd)->verref = (Elf_Internal_Verneed *)
bd61e135 8605 bfd_alloc2 (abfd, hdr->sh_info, sizeof (Elf_Internal_Verneed));
601a03ba
AM
8606
8607 if (elf_tdata (abfd)->verref == NULL)
d0fb9a8d
JJ
8608 goto error_return_verref;
8609
8610 BFD_ASSERT (sizeof (Elf_External_Verneed)
8611 == sizeof (Elf_External_Vernaux));
8612 contents_end = contents + hdr->sh_size - sizeof (Elf_External_Verneed);
fc0e6df6
PB
8613 everneed = (Elf_External_Verneed *) contents;
8614 iverneed = elf_tdata (abfd)->verref;
8615 for (i = 0; i < hdr->sh_info; i++, iverneed++)
8616 {
8617 Elf_External_Vernaux *evernaux;
8618 Elf_Internal_Vernaux *ivernaux;
8619 unsigned int j;
8620
8621 _bfd_elf_swap_verneed_in (abfd, everneed, iverneed);
8622
8623 iverneed->vn_bfd = abfd;
8624
8625 iverneed->vn_filename =
8626 bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
8627 iverneed->vn_file);
8628 if (iverneed->vn_filename == NULL)
601a03ba 8629 goto error_return_bad_verref;
fc0e6df6 8630
d0fb9a8d
JJ
8631 if (iverneed->vn_cnt == 0)
8632 iverneed->vn_auxptr = NULL;
8633 else
8634 {
a50b1753 8635 iverneed->vn_auxptr = (struct elf_internal_vernaux *)
07d6d2b8
AM
8636 bfd_alloc2 (abfd, iverneed->vn_cnt,
8637 sizeof (Elf_Internal_Vernaux));
d0fb9a8d
JJ
8638 if (iverneed->vn_auxptr == NULL)
8639 goto error_return_verref;
8640 }
8641
8642 if (iverneed->vn_aux
8643 > (size_t) (contents_end - (bfd_byte *) everneed))
601a03ba 8644 goto error_return_bad_verref;
fc0e6df6
PB
8645
8646 evernaux = ((Elf_External_Vernaux *)
8647 ((bfd_byte *) everneed + iverneed->vn_aux));
8648 ivernaux = iverneed->vn_auxptr;
8649 for (j = 0; j < iverneed->vn_cnt; j++, ivernaux++)
8650 {
8651 _bfd_elf_swap_vernaux_in (abfd, evernaux, ivernaux);
8652
8653 ivernaux->vna_nodename =
8654 bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
8655 ivernaux->vna_name);
8656 if (ivernaux->vna_nodename == NULL)
601a03ba 8657 goto error_return_bad_verref;
fc0e6df6 8658
25ff461f
AM
8659 if (ivernaux->vna_other > freeidx)
8660 freeidx = ivernaux->vna_other;
8661
8662 ivernaux->vna_nextptr = NULL;
8663 if (ivernaux->vna_next == 0)
8664 {
8665 iverneed->vn_cnt = j + 1;
8666 break;
8667 }
fc0e6df6
PB
8668 if (j + 1 < iverneed->vn_cnt)
8669 ivernaux->vna_nextptr = ivernaux + 1;
fc0e6df6 8670
d0fb9a8d
JJ
8671 if (ivernaux->vna_next
8672 > (size_t) (contents_end - (bfd_byte *) evernaux))
601a03ba 8673 goto error_return_bad_verref;
d0fb9a8d 8674
fc0e6df6
PB
8675 evernaux = ((Elf_External_Vernaux *)
8676 ((bfd_byte *) evernaux + ivernaux->vna_next));
fc0e6df6
PB
8677 }
8678
25ff461f
AM
8679 iverneed->vn_nextref = NULL;
8680 if (iverneed->vn_next == 0)
8681 break;
fc0e6df6
PB
8682 if (i + 1 < hdr->sh_info)
8683 iverneed->vn_nextref = iverneed + 1;
fc0e6df6 8684
d0fb9a8d
JJ
8685 if (iverneed->vn_next
8686 > (size_t) (contents_end - (bfd_byte *) everneed))
601a03ba 8687 goto error_return_bad_verref;
d0fb9a8d 8688
fc0e6df6
PB
8689 everneed = ((Elf_External_Verneed *)
8690 ((bfd_byte *) everneed + iverneed->vn_next));
8691 }
25ff461f 8692 elf_tdata (abfd)->cverrefs = i;
fc0e6df6
PB
8693
8694 free (contents);
8695 contents = NULL;
8696 }
252b5132
RH
8697
8698 if (elf_dynverdef (abfd) != 0)
8699 {
8700 Elf_Internal_Shdr *hdr;
8701 Elf_External_Verdef *everdef;
8702 Elf_Internal_Verdef *iverdef;
f631889e
UD
8703 Elf_Internal_Verdef *iverdefarr;
8704 Elf_Internal_Verdef iverdefmem;
252b5132 8705 unsigned int i;
062e2358 8706 unsigned int maxidx;
d0fb9a8d 8707 bfd_byte *contents_end_def, *contents_end_aux;
252b5132
RH
8708
8709 hdr = &elf_tdata (abfd)->dynverdef_hdr;
8710
601a03ba
AM
8711 if (hdr->sh_info == 0 || hdr->sh_size < sizeof (Elf_External_Verdef))
8712 {
8713 error_return_bad_verdef:
4eca0228 8714 _bfd_error_handler
871b3ab2 8715 (_("%pB: .gnu.version_d invalid entry"), abfd);
601a03ba
AM
8716 bfd_set_error (bfd_error_bad_value);
8717 error_return_verdef:
8718 elf_tdata (abfd)->verdef = NULL;
8719 elf_tdata (abfd)->cverdefs = 0;
8720 goto error_return;
8721 }
8722
a50b1753 8723 contents = (bfd_byte *) bfd_malloc (hdr->sh_size);
252b5132 8724 if (contents == NULL)
601a03ba 8725 goto error_return_verdef;
252b5132 8726 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
217aa764 8727 || bfd_bread (contents, hdr->sh_size, abfd) != hdr->sh_size)
601a03ba 8728 goto error_return_verdef;
d0fb9a8d
JJ
8729
8730 BFD_ASSERT (sizeof (Elf_External_Verdef)
8731 >= sizeof (Elf_External_Verdaux));
8732 contents_end_def = contents + hdr->sh_size
8733 - sizeof (Elf_External_Verdef);
8734 contents_end_aux = contents + hdr->sh_size
8735 - sizeof (Elf_External_Verdaux);
8736
f631889e
UD
8737 /* We know the number of entries in the section but not the maximum
8738 index. Therefore we have to run through all entries and find
8739 the maximum. */
252b5132 8740 everdef = (Elf_External_Verdef *) contents;
f631889e
UD
8741 maxidx = 0;
8742 for (i = 0; i < hdr->sh_info; ++i)
8743 {
8744 _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
8745
601a03ba
AM
8746 if ((iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION)) == 0)
8747 goto error_return_bad_verdef;
062e2358
AM
8748 if ((iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION)) > maxidx)
8749 maxidx = iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION);
f631889e 8750
25ff461f
AM
8751 if (iverdefmem.vd_next == 0)
8752 break;
8753
d0fb9a8d
JJ
8754 if (iverdefmem.vd_next
8755 > (size_t) (contents_end_def - (bfd_byte *) everdef))
601a03ba 8756 goto error_return_bad_verdef;
d0fb9a8d 8757
f631889e
UD
8758 everdef = ((Elf_External_Verdef *)
8759 ((bfd_byte *) everdef + iverdefmem.vd_next));
8760 }
8761
fc0e6df6
PB
8762 if (default_imported_symver)
8763 {
8764 if (freeidx > maxidx)
8765 maxidx = ++freeidx;
8766 else
8767 freeidx = ++maxidx;
8768 }
201159ec 8769
601a03ba
AM
8770 elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *)
8771 bfd_zalloc2 (abfd, maxidx, sizeof (Elf_Internal_Verdef));
f631889e 8772 if (elf_tdata (abfd)->verdef == NULL)
601a03ba 8773 goto error_return_verdef;
f631889e
UD
8774
8775 elf_tdata (abfd)->cverdefs = maxidx;
8776
8777 everdef = (Elf_External_Verdef *) contents;
8778 iverdefarr = elf_tdata (abfd)->verdef;
8779 for (i = 0; i < hdr->sh_info; i++)
252b5132
RH
8780 {
8781 Elf_External_Verdaux *everdaux;
8782 Elf_Internal_Verdaux *iverdaux;
8783 unsigned int j;
8784
f631889e
UD
8785 _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
8786
d0fb9a8d 8787 if ((iverdefmem.vd_ndx & VERSYM_VERSION) == 0)
601a03ba 8788 goto error_return_bad_verdef;
d0fb9a8d 8789
f631889e 8790 iverdef = &iverdefarr[(iverdefmem.vd_ndx & VERSYM_VERSION) - 1];
595bce75 8791 memcpy (iverdef, &iverdefmem, offsetof (Elf_Internal_Verdef, vd_bfd));
252b5132
RH
8792
8793 iverdef->vd_bfd = abfd;
8794
d0fb9a8d
JJ
8795 if (iverdef->vd_cnt == 0)
8796 iverdef->vd_auxptr = NULL;
8797 else
8798 {
a50b1753 8799 iverdef->vd_auxptr = (struct elf_internal_verdaux *)
07d6d2b8
AM
8800 bfd_alloc2 (abfd, iverdef->vd_cnt,
8801 sizeof (Elf_Internal_Verdaux));
d0fb9a8d
JJ
8802 if (iverdef->vd_auxptr == NULL)
8803 goto error_return_verdef;
8804 }
8805
8806 if (iverdef->vd_aux
8807 > (size_t) (contents_end_aux - (bfd_byte *) everdef))
601a03ba 8808 goto error_return_bad_verdef;
252b5132
RH
8809
8810 everdaux = ((Elf_External_Verdaux *)
8811 ((bfd_byte *) everdef + iverdef->vd_aux));
8812 iverdaux = iverdef->vd_auxptr;
8813 for (j = 0; j < iverdef->vd_cnt; j++, iverdaux++)
8814 {
8815 _bfd_elf_swap_verdaux_in (abfd, everdaux, iverdaux);
8816
8817 iverdaux->vda_nodename =
8818 bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
8819 iverdaux->vda_name);
8820 if (iverdaux->vda_nodename == NULL)
601a03ba 8821 goto error_return_bad_verdef;
252b5132 8822
25ff461f
AM
8823 iverdaux->vda_nextptr = NULL;
8824 if (iverdaux->vda_next == 0)
8825 {
8826 iverdef->vd_cnt = j + 1;
8827 break;
8828 }
252b5132
RH
8829 if (j + 1 < iverdef->vd_cnt)
8830 iverdaux->vda_nextptr = iverdaux + 1;
252b5132 8831
d0fb9a8d
JJ
8832 if (iverdaux->vda_next
8833 > (size_t) (contents_end_aux - (bfd_byte *) everdaux))
601a03ba 8834 goto error_return_bad_verdef;
d0fb9a8d 8835
252b5132
RH
8836 everdaux = ((Elf_External_Verdaux *)
8837 ((bfd_byte *) everdaux + iverdaux->vda_next));
8838 }
8839
595bce75 8840 iverdef->vd_nodename = NULL;
d0fb9a8d
JJ
8841 if (iverdef->vd_cnt)
8842 iverdef->vd_nodename = iverdef->vd_auxptr->vda_nodename;
252b5132 8843
25ff461f
AM
8844 iverdef->vd_nextdef = NULL;
8845 if (iverdef->vd_next == 0)
8846 break;
d0fb9a8d 8847 if ((size_t) (iverdef - iverdefarr) + 1 < maxidx)
252b5132 8848 iverdef->vd_nextdef = iverdef + 1;
252b5132
RH
8849
8850 everdef = ((Elf_External_Verdef *)
8851 ((bfd_byte *) everdef + iverdef->vd_next));
8852 }
8853
8854 free (contents);
8855 contents = NULL;
8856 }
fc0e6df6 8857 else if (default_imported_symver)
252b5132 8858 {
fc0e6df6
PB
8859 if (freeidx < 3)
8860 freeidx = 3;
8861 else
8862 freeidx++;
252b5132 8863
a50b1753 8864 elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *)
07d6d2b8 8865 bfd_zalloc2 (abfd, freeidx, sizeof (Elf_Internal_Verdef));
fc0e6df6 8866 if (elf_tdata (abfd)->verdef == NULL)
252b5132
RH
8867 goto error_return;
8868
fc0e6df6
PB
8869 elf_tdata (abfd)->cverdefs = freeidx;
8870 }
252b5132 8871
fc0e6df6
PB
8872 /* Create a default version based on the soname. */
8873 if (default_imported_symver)
8874 {
8875 Elf_Internal_Verdef *iverdef;
8876 Elf_Internal_Verdaux *iverdaux;
252b5132 8877
5bb3703f 8878 iverdef = &elf_tdata (abfd)->verdef[freeidx - 1];
252b5132 8879
fc0e6df6
PB
8880 iverdef->vd_version = VER_DEF_CURRENT;
8881 iverdef->vd_flags = 0;
8882 iverdef->vd_ndx = freeidx;
8883 iverdef->vd_cnt = 1;
252b5132 8884
fc0e6df6 8885 iverdef->vd_bfd = abfd;
252b5132 8886
fc0e6df6
PB
8887 iverdef->vd_nodename = bfd_elf_get_dt_soname (abfd);
8888 if (iverdef->vd_nodename == NULL)
d0fb9a8d 8889 goto error_return_verdef;
fc0e6df6 8890 iverdef->vd_nextdef = NULL;
601a03ba
AM
8891 iverdef->vd_auxptr = ((struct elf_internal_verdaux *)
8892 bfd_zalloc (abfd, sizeof (Elf_Internal_Verdaux)));
d0fb9a8d
JJ
8893 if (iverdef->vd_auxptr == NULL)
8894 goto error_return_verdef;
252b5132 8895
fc0e6df6
PB
8896 iverdaux = iverdef->vd_auxptr;
8897 iverdaux->vda_nodename = iverdef->vd_nodename;
252b5132
RH
8898 }
8899
b34976b6 8900 return TRUE;
252b5132
RH
8901
8902 error_return:
5ed6aba4 8903 if (contents != NULL)
252b5132 8904 free (contents);
b34976b6 8905 return FALSE;
252b5132
RH
8906}
8907\f
8908asymbol *
217aa764 8909_bfd_elf_make_empty_symbol (bfd *abfd)
252b5132
RH
8910{
8911 elf_symbol_type *newsym;
8912
7a6e0d89 8913 newsym = (elf_symbol_type *) bfd_zalloc (abfd, sizeof (*newsym));
252b5132
RH
8914 if (!newsym)
8915 return NULL;
201159ec
NC
8916 newsym->symbol.the_bfd = abfd;
8917 return &newsym->symbol;
252b5132
RH
8918}
8919
8920void
217aa764
AM
8921_bfd_elf_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
8922 asymbol *symbol,
8923 symbol_info *ret)
252b5132
RH
8924{
8925 bfd_symbol_info (symbol, ret);
8926}
8927
8928/* Return whether a symbol name implies a local symbol. Most targets
8929 use this function for the is_local_label_name entry point, but some
8930 override it. */
8931
b34976b6 8932bfd_boolean
217aa764
AM
8933_bfd_elf_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
8934 const char *name)
252b5132
RH
8935{
8936 /* Normal local symbols start with ``.L''. */
8937 if (name[0] == '.' && name[1] == 'L')
b34976b6 8938 return TRUE;
252b5132
RH
8939
8940 /* At least some SVR4 compilers (e.g., UnixWare 2.1 cc) generate
8941 DWARF debugging symbols starting with ``..''. */
8942 if (name[0] == '.' && name[1] == '.')
b34976b6 8943 return TRUE;
252b5132
RH
8944
8945 /* gcc will sometimes generate symbols beginning with ``_.L_'' when
8946 emitting DWARF debugging output. I suspect this is actually a
8947 small bug in gcc (it calls ASM_OUTPUT_LABEL when it should call
8948 ASM_GENERATE_INTERNAL_LABEL, and this causes the leading
8949 underscore to be emitted on some ELF targets). For ease of use,
8950 we treat such symbols as local. */
8951 if (name[0] == '_' && name[1] == '.' && name[2] == 'L' && name[3] == '_')
b34976b6 8952 return TRUE;
252b5132 8953
b1fa9dd6
NC
8954 /* Treat assembler generated fake symbols, dollar local labels and
8955 forward-backward labels (aka local labels) as locals.
8956 These labels have the form:
8957
07d6d2b8 8958 L0^A.* (fake symbols)
b1fa9dd6
NC
8959
8960 [.]?L[0123456789]+{^A|^B}[0123456789]* (local labels)
8961
8962 Versions which start with .L will have already been matched above,
8963 so we only need to match the rest. */
8964 if (name[0] == 'L' && ISDIGIT (name[1]))
8965 {
8966 bfd_boolean ret = FALSE;
8967 const char * p;
8968 char c;
8969
8970 for (p = name + 2; (c = *p); p++)
8971 {
8972 if (c == 1 || c == 2)
8973 {
8974 if (c == 1 && p == name + 2)
8975 /* A fake symbol. */
8976 return TRUE;
8977
8978 /* FIXME: We are being paranoid here and treating symbols like
8979 L0^Bfoo as if there were non-local, on the grounds that the
8980 assembler will never generate them. But can any symbol
8981 containing an ASCII value in the range 1-31 ever be anything
8982 other than some kind of local ? */
8983 ret = TRUE;
8984 }
8985
8986 if (! ISDIGIT (c))
8987 {
8988 ret = FALSE;
8989 break;
8990 }
8991 }
8992 return ret;
8993 }
ffa54770 8994
b34976b6 8995 return FALSE;
252b5132
RH
8996}
8997
8998alent *
217aa764
AM
8999_bfd_elf_get_lineno (bfd *abfd ATTRIBUTE_UNUSED,
9000 asymbol *symbol ATTRIBUTE_UNUSED)
252b5132
RH
9001{
9002 abort ();
9003 return NULL;
9004}
9005
b34976b6 9006bfd_boolean
217aa764
AM
9007_bfd_elf_set_arch_mach (bfd *abfd,
9008 enum bfd_architecture arch,
9009 unsigned long machine)
252b5132
RH
9010{
9011 /* If this isn't the right architecture for this backend, and this
9012 isn't the generic backend, fail. */
9013 if (arch != get_elf_backend_data (abfd)->arch
9014 && arch != bfd_arch_unknown
9015 && get_elf_backend_data (abfd)->arch != bfd_arch_unknown)
b34976b6 9016 return FALSE;
252b5132
RH
9017
9018 return bfd_default_set_arch_mach (abfd, arch, machine);
9019}
9020
d1fad7c6
NC
9021/* Find the nearest line to a particular section and offset,
9022 for error reporting. */
9023
b34976b6 9024bfd_boolean
217aa764 9025_bfd_elf_find_nearest_line (bfd *abfd,
217aa764 9026 asymbol **symbols,
fb167eb2 9027 asection *section,
217aa764
AM
9028 bfd_vma offset,
9029 const char **filename_ptr,
9030 const char **functionname_ptr,
fb167eb2
AM
9031 unsigned int *line_ptr,
9032 unsigned int *discriminator_ptr)
d1fad7c6 9033{
b34976b6 9034 bfd_boolean found;
d1fad7c6 9035
fb167eb2 9036 if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
4e8a9624 9037 filename_ptr, functionname_ptr,
fb167eb2 9038 line_ptr, discriminator_ptr,
9defd221 9039 dwarf_debug_sections,
e00e8198
AM
9040 &elf_tdata (abfd)->dwarf2_find_line_info)
9041 || _bfd_dwarf1_find_nearest_line (abfd, symbols, section, offset,
9042 filename_ptr, functionname_ptr,
9043 line_ptr))
d1fad7c6
NC
9044 {
9045 if (!*functionname_ptr)
e00e8198
AM
9046 _bfd_elf_find_function (abfd, symbols, section, offset,
9047 *filename_ptr ? NULL : filename_ptr,
9048 functionname_ptr);
b34976b6 9049 return TRUE;
d1fad7c6
NC
9050 }
9051
9052 if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
4e8a9624
AM
9053 &found, filename_ptr,
9054 functionname_ptr, line_ptr,
9055 &elf_tdata (abfd)->line_info))
b34976b6 9056 return FALSE;
dc43ada5 9057 if (found && (*functionname_ptr || *line_ptr))
b34976b6 9058 return TRUE;
d1fad7c6
NC
9059
9060 if (symbols == NULL)
b34976b6 9061 return FALSE;
d1fad7c6 9062
e00e8198
AM
9063 if (! _bfd_elf_find_function (abfd, symbols, section, offset,
9064 filename_ptr, functionname_ptr))
b34976b6 9065 return FALSE;
d1fad7c6 9066
252b5132 9067 *line_ptr = 0;
b34976b6 9068 return TRUE;
252b5132
RH
9069}
9070
5420f73d
L
9071/* Find the line for a symbol. */
9072
9073bfd_boolean
9074_bfd_elf_find_line (bfd *abfd, asymbol **symbols, asymbol *symbol,
9075 const char **filename_ptr, unsigned int *line_ptr)
9b8d1a36 9076{
fb167eb2
AM
9077 return _bfd_dwarf2_find_nearest_line (abfd, symbols, symbol, NULL, 0,
9078 filename_ptr, NULL, line_ptr, NULL,
9defd221 9079 dwarf_debug_sections,
fb167eb2 9080 &elf_tdata (abfd)->dwarf2_find_line_info);
5420f73d
L
9081}
9082
4ab527b0
FF
9083/* After a call to bfd_find_nearest_line, successive calls to
9084 bfd_find_inliner_info can be used to get source information about
9085 each level of function inlining that terminated at the address
9086 passed to bfd_find_nearest_line. Currently this is only supported
9087 for DWARF2 with appropriate DWARF3 extensions. */
9088
9089bfd_boolean
9090_bfd_elf_find_inliner_info (bfd *abfd,
9091 const char **filename_ptr,
9092 const char **functionname_ptr,
9093 unsigned int *line_ptr)
9094{
9095 bfd_boolean found;
9096 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
9097 functionname_ptr, line_ptr,
9098 & elf_tdata (abfd)->dwarf2_find_line_info);
9099 return found;
9100}
9101
252b5132 9102int
a6b96beb 9103_bfd_elf_sizeof_headers (bfd *abfd, struct bfd_link_info *info)
252b5132 9104{
8ded5a0f
AM
9105 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
9106 int ret = bed->s->sizeof_ehdr;
252b5132 9107
0e1862bb 9108 if (!bfd_link_relocatable (info))
8ded5a0f 9109 {
12bd6957 9110 bfd_size_type phdr_size = elf_program_header_size (abfd);
8ded5a0f 9111
62d7a5f6
AM
9112 if (phdr_size == (bfd_size_type) -1)
9113 {
9114 struct elf_segment_map *m;
9115
9116 phdr_size = 0;
12bd6957 9117 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
62d7a5f6 9118 phdr_size += bed->s->sizeof_phdr;
8ded5a0f 9119
62d7a5f6
AM
9120 if (phdr_size == 0)
9121 phdr_size = get_program_header_size (abfd, info);
9122 }
8ded5a0f 9123
12bd6957 9124 elf_program_header_size (abfd) = phdr_size;
8ded5a0f
AM
9125 ret += phdr_size;
9126 }
9127
252b5132
RH
9128 return ret;
9129}
9130
b34976b6 9131bfd_boolean
217aa764
AM
9132_bfd_elf_set_section_contents (bfd *abfd,
9133 sec_ptr section,
0f867abe 9134 const void *location,
217aa764
AM
9135 file_ptr offset,
9136 bfd_size_type count)
252b5132
RH
9137{
9138 Elf_Internal_Shdr *hdr;
1b6aeedb 9139 file_ptr pos;
252b5132
RH
9140
9141 if (! abfd->output_has_begun
217aa764 9142 && ! _bfd_elf_compute_section_file_positions (abfd, NULL))
b34976b6 9143 return FALSE;
252b5132 9144
0ce398f1
L
9145 if (!count)
9146 return TRUE;
9147
252b5132 9148 hdr = &elf_section_data (section)->this_hdr;
0ce398f1
L
9149 if (hdr->sh_offset == (file_ptr) -1)
9150 {
1ff6de03
NA
9151 if (bfd_section_is_ctf (section))
9152 /* Nothing to do with this section: the contents are generated
9153 later. */
9154 return TRUE;
9155
0ce398f1
L
9156 /* We must compress this section. Write output to the buffer. */
9157 unsigned char *contents = hdr->contents;
9158 if ((offset + count) > hdr->sh_size
9159 || (section->flags & SEC_ELF_COMPRESS) == 0
9160 || contents == NULL)
9161 abort ();
9162 memcpy (contents + offset, location, count);
9163 return TRUE;
9164 }
dc810e39
AM
9165 pos = hdr->sh_offset + offset;
9166 if (bfd_seek (abfd, pos, SEEK_SET) != 0
9167 || bfd_bwrite (location, count, abfd) != count)
b34976b6 9168 return FALSE;
252b5132 9169
b34976b6 9170 return TRUE;
252b5132
RH
9171}
9172
f3185997 9173bfd_boolean
217aa764
AM
9174_bfd_elf_no_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
9175 arelent *cache_ptr ATTRIBUTE_UNUSED,
9176 Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
252b5132
RH
9177{
9178 abort ();
f3185997 9179 return FALSE;
252b5132
RH
9180}
9181
252b5132
RH
9182/* Try to convert a non-ELF reloc into an ELF one. */
9183
b34976b6 9184bfd_boolean
217aa764 9185_bfd_elf_validate_reloc (bfd *abfd, arelent *areloc)
252b5132 9186{
c044fabd 9187 /* Check whether we really have an ELF howto. */
252b5132
RH
9188
9189 if ((*areloc->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec)
9190 {
9191 bfd_reloc_code_real_type code;
9192 reloc_howto_type *howto;
9193
9194 /* Alien reloc: Try to determine its type to replace it with an
c044fabd 9195 equivalent ELF reloc. */
252b5132
RH
9196
9197 if (areloc->howto->pc_relative)
9198 {
9199 switch (areloc->howto->bitsize)
9200 {
9201 case 8:
9202 code = BFD_RELOC_8_PCREL;
9203 break;
9204 case 12:
9205 code = BFD_RELOC_12_PCREL;
9206 break;
9207 case 16:
9208 code = BFD_RELOC_16_PCREL;
9209 break;
9210 case 24:
9211 code = BFD_RELOC_24_PCREL;
9212 break;
9213 case 32:
9214 code = BFD_RELOC_32_PCREL;
9215 break;
9216 case 64:
9217 code = BFD_RELOC_64_PCREL;
9218 break;
9219 default:
9220 goto fail;
9221 }
9222
9223 howto = bfd_reloc_type_lookup (abfd, code);
9224
9225 if (areloc->howto->pcrel_offset != howto->pcrel_offset)
9226 {
9227 if (howto->pcrel_offset)
9228 areloc->addend += areloc->address;
9229 else
9230 areloc->addend -= areloc->address; /* addend is unsigned!! */
9231 }
9232 }
9233 else
9234 {
9235 switch (areloc->howto->bitsize)
9236 {
9237 case 8:
9238 code = BFD_RELOC_8;
9239 break;
9240 case 14:
9241 code = BFD_RELOC_14;
9242 break;
9243 case 16:
9244 code = BFD_RELOC_16;
9245 break;
9246 case 26:
9247 code = BFD_RELOC_26;
9248 break;
9249 case 32:
9250 code = BFD_RELOC_32;
9251 break;
9252 case 64:
9253 code = BFD_RELOC_64;
9254 break;
9255 default:
9256 goto fail;
9257 }
9258
9259 howto = bfd_reloc_type_lookup (abfd, code);
9260 }
9261
9262 if (howto)
9263 areloc->howto = howto;
9264 else
9265 goto fail;
9266 }
9267
b34976b6 9268 return TRUE;
252b5132
RH
9269
9270 fail:
0aa13fee
AM
9271 /* xgettext:c-format */
9272 _bfd_error_handler (_("%pB: %s unsupported"),
9273 abfd, areloc->howto->name);
9aea1e31 9274 bfd_set_error (bfd_error_sorry);
b34976b6 9275 return FALSE;
252b5132
RH
9276}
9277
b34976b6 9278bfd_boolean
217aa764 9279_bfd_elf_close_and_cleanup (bfd *abfd)
252b5132 9280{
d9071b0c
TG
9281 struct elf_obj_tdata *tdata = elf_tdata (abfd);
9282 if (bfd_get_format (abfd) == bfd_object && tdata != NULL)
252b5132 9283 {
c0355132 9284 if (elf_tdata (abfd)->o != NULL && elf_shstrtab (abfd) != NULL)
2b0f7ef9 9285 _bfd_elf_strtab_free (elf_shstrtab (abfd));
d9071b0c 9286 _bfd_dwarf2_cleanup_debug_info (abfd, &tdata->dwarf2_find_line_info);
252b5132
RH
9287 }
9288
9289 return _bfd_generic_close_and_cleanup (abfd);
9290}
9291
9292/* For Rel targets, we encode meaningful data for BFD_RELOC_VTABLE_ENTRY
9293 in the relocation's offset. Thus we cannot allow any sort of sanity
9294 range-checking to interfere. There is nothing else to do in processing
9295 this reloc. */
9296
9297bfd_reloc_status_type
217aa764
AM
9298_bfd_elf_rel_vtable_reloc_fn
9299 (bfd *abfd ATTRIBUTE_UNUSED, arelent *re ATTRIBUTE_UNUSED,
fc0a2244 9300 struct bfd_symbol *symbol ATTRIBUTE_UNUSED,
217aa764
AM
9301 void *data ATTRIBUTE_UNUSED, asection *is ATTRIBUTE_UNUSED,
9302 bfd *obfd ATTRIBUTE_UNUSED, char **errmsg ATTRIBUTE_UNUSED)
252b5132
RH
9303{
9304 return bfd_reloc_ok;
9305}
252b5132
RH
9306\f
9307/* Elf core file support. Much of this only works on native
9308 toolchains, since we rely on knowing the
9309 machine-dependent procfs structure in order to pick
c044fabd 9310 out details about the corefile. */
252b5132
RH
9311
9312#ifdef HAVE_SYS_PROCFS_H
16231b7b
DG
9313/* Needed for new procfs interface on sparc-solaris. */
9314# define _STRUCTURED_PROC 1
252b5132
RH
9315# include <sys/procfs.h>
9316#endif
9317
261b8d08
PA
9318/* Return a PID that identifies a "thread" for threaded cores, or the
9319 PID of the main process for non-threaded cores. */
252b5132
RH
9320
9321static int
217aa764 9322elfcore_make_pid (bfd *abfd)
252b5132 9323{
261b8d08
PA
9324 int pid;
9325
228e534f 9326 pid = elf_tdata (abfd)->core->lwpid;
261b8d08 9327 if (pid == 0)
228e534f 9328 pid = elf_tdata (abfd)->core->pid;
261b8d08
PA
9329
9330 return pid;
252b5132
RH
9331}
9332
252b5132
RH
9333/* If there isn't a section called NAME, make one, using
9334 data from SECT. Note, this function will generate a
9335 reference to NAME, so you shouldn't deallocate or
c044fabd 9336 overwrite it. */
252b5132 9337
b34976b6 9338static bfd_boolean
217aa764 9339elfcore_maybe_make_sect (bfd *abfd, char *name, asection *sect)
252b5132 9340{
c044fabd 9341 asection *sect2;
252b5132
RH
9342
9343 if (bfd_get_section_by_name (abfd, name) != NULL)
b34976b6 9344 return TRUE;
252b5132 9345
117ed4f8 9346 sect2 = bfd_make_section_with_flags (abfd, name, sect->flags);
252b5132 9347 if (sect2 == NULL)
b34976b6 9348 return FALSE;
252b5132 9349
eea6121a 9350 sect2->size = sect->size;
252b5132 9351 sect2->filepos = sect->filepos;
252b5132 9352 sect2->alignment_power = sect->alignment_power;
b34976b6 9353 return TRUE;
252b5132
RH
9354}
9355
bb0082d6
AM
9356/* Create a pseudosection containing SIZE bytes at FILEPOS. This
9357 actually creates up to two pseudosections:
9358 - For the single-threaded case, a section named NAME, unless
9359 such a section already exists.
9360 - For the multi-threaded case, a section named "NAME/PID", where
9361 PID is elfcore_make_pid (abfd).
24d3e51b 9362 Both pseudosections have identical contents. */
b34976b6 9363bfd_boolean
217aa764
AM
9364_bfd_elfcore_make_pseudosection (bfd *abfd,
9365 char *name,
9366 size_t size,
9367 ufile_ptr filepos)
bb0082d6
AM
9368{
9369 char buf[100];
9370 char *threaded_name;
d4c88bbb 9371 size_t len;
bb0082d6
AM
9372 asection *sect;
9373
9374 /* Build the section name. */
9375
9376 sprintf (buf, "%s/%d", name, elfcore_make_pid (abfd));
d4c88bbb 9377 len = strlen (buf) + 1;
a50b1753 9378 threaded_name = (char *) bfd_alloc (abfd, len);
bb0082d6 9379 if (threaded_name == NULL)
b34976b6 9380 return FALSE;
d4c88bbb 9381 memcpy (threaded_name, buf, len);
bb0082d6 9382
117ed4f8
AM
9383 sect = bfd_make_section_anyway_with_flags (abfd, threaded_name,
9384 SEC_HAS_CONTENTS);
bb0082d6 9385 if (sect == NULL)
b34976b6 9386 return FALSE;
eea6121a 9387 sect->size = size;
bb0082d6 9388 sect->filepos = filepos;
bb0082d6
AM
9389 sect->alignment_power = 2;
9390
936e320b 9391 return elfcore_maybe_make_sect (abfd, name, sect);
bb0082d6
AM
9392}
9393
58e07198
CZ
9394static bfd_boolean
9395elfcore_make_auxv_note_section (bfd *abfd, Elf_Internal_Note *note,
9396 size_t offs)
9397{
9398 asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
9399 SEC_HAS_CONTENTS);
9400
9401 if (sect == NULL)
9402 return FALSE;
9403
9404 sect->size = note->descsz - offs;
9405 sect->filepos = note->descpos + offs;
9406 sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
9407
9408 return TRUE;
9409}
9410
252b5132 9411/* prstatus_t exists on:
4a938328 9412 solaris 2.5+
252b5132
RH
9413 linux 2.[01] + glibc
9414 unixware 4.2
9415*/
9416
9417#if defined (HAVE_PRSTATUS_T)
a7b97311 9418
b34976b6 9419static bfd_boolean
217aa764 9420elfcore_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132 9421{
eea6121a 9422 size_t size;
7ee38065 9423 int offset;
252b5132 9424
4a938328
MS
9425 if (note->descsz == sizeof (prstatus_t))
9426 {
9427 prstatus_t prstat;
252b5132 9428
eea6121a 9429 size = sizeof (prstat.pr_reg);
7ee38065 9430 offset = offsetof (prstatus_t, pr_reg);
4a938328 9431 memcpy (&prstat, note->descdata, sizeof (prstat));
252b5132 9432
fa49d224
NC
9433 /* Do not overwrite the core signal if it
9434 has already been set by another thread. */
228e534f
AM
9435 if (elf_tdata (abfd)->core->signal == 0)
9436 elf_tdata (abfd)->core->signal = prstat.pr_cursig;
9437 if (elf_tdata (abfd)->core->pid == 0)
9438 elf_tdata (abfd)->core->pid = prstat.pr_pid;
252b5132 9439
4a938328
MS
9440 /* pr_who exists on:
9441 solaris 2.5+
9442 unixware 4.2
9443 pr_who doesn't exist on:
9444 linux 2.[01]
9445 */
252b5132 9446#if defined (HAVE_PRSTATUS_T_PR_WHO)
228e534f 9447 elf_tdata (abfd)->core->lwpid = prstat.pr_who;
261b8d08 9448#else
228e534f 9449 elf_tdata (abfd)->core->lwpid = prstat.pr_pid;
252b5132 9450#endif
4a938328 9451 }
7ee38065 9452#if defined (HAVE_PRSTATUS32_T)
4a938328
MS
9453 else if (note->descsz == sizeof (prstatus32_t))
9454 {
9455 /* 64-bit host, 32-bit corefile */
9456 prstatus32_t prstat;
9457
eea6121a 9458 size = sizeof (prstat.pr_reg);
7ee38065 9459 offset = offsetof (prstatus32_t, pr_reg);
4a938328
MS
9460 memcpy (&prstat, note->descdata, sizeof (prstat));
9461
fa49d224
NC
9462 /* Do not overwrite the core signal if it
9463 has already been set by another thread. */
228e534f
AM
9464 if (elf_tdata (abfd)->core->signal == 0)
9465 elf_tdata (abfd)->core->signal = prstat.pr_cursig;
9466 if (elf_tdata (abfd)->core->pid == 0)
9467 elf_tdata (abfd)->core->pid = prstat.pr_pid;
4a938328
MS
9468
9469 /* pr_who exists on:
9470 solaris 2.5+
9471 unixware 4.2
9472 pr_who doesn't exist on:
9473 linux 2.[01]
9474 */
7ee38065 9475#if defined (HAVE_PRSTATUS32_T_PR_WHO)
228e534f 9476 elf_tdata (abfd)->core->lwpid = prstat.pr_who;
261b8d08 9477#else
228e534f 9478 elf_tdata (abfd)->core->lwpid = prstat.pr_pid;
4a938328
MS
9479#endif
9480 }
7ee38065 9481#endif /* HAVE_PRSTATUS32_T */
4a938328
MS
9482 else
9483 {
9484 /* Fail - we don't know how to handle any other
9485 note size (ie. data object type). */
b34976b6 9486 return TRUE;
4a938328 9487 }
252b5132 9488
bb0082d6 9489 /* Make a ".reg/999" section and a ".reg" section. */
936e320b 9490 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 9491 size, note->descpos + offset);
252b5132
RH
9492}
9493#endif /* defined (HAVE_PRSTATUS_T) */
9494
bb0082d6 9495/* Create a pseudosection containing the exact contents of NOTE. */
b34976b6 9496static bfd_boolean
217aa764
AM
9497elfcore_make_note_pseudosection (bfd *abfd,
9498 char *name,
9499 Elf_Internal_Note *note)
252b5132 9500{
936e320b
AM
9501 return _bfd_elfcore_make_pseudosection (abfd, name,
9502 note->descsz, note->descpos);
252b5132
RH
9503}
9504
ff08c6bb
JB
9505/* There isn't a consistent prfpregset_t across platforms,
9506 but it doesn't matter, because we don't have to pick this
c044fabd
KH
9507 data structure apart. */
9508
b34976b6 9509static bfd_boolean
217aa764 9510elfcore_grok_prfpreg (bfd *abfd, Elf_Internal_Note *note)
ff08c6bb
JB
9511{
9512 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
9513}
9514
ff08c6bb 9515/* Linux dumps the Intel SSE regs in a note named "LINUX" with a note
971d4640 9516 type of NT_PRXFPREG. Just include the whole note's contents
ff08c6bb 9517 literally. */
c044fabd 9518
b34976b6 9519static bfd_boolean
217aa764 9520elfcore_grok_prxfpreg (bfd *abfd, Elf_Internal_Note *note)
ff08c6bb
JB
9521{
9522 return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
9523}
9524
4339cae0
L
9525/* Linux dumps the Intel XSAVE extended state in a note named "LINUX"
9526 with a note type of NT_X86_XSTATE. Just include the whole note's
9527 contents literally. */
9528
9529static bfd_boolean
9530elfcore_grok_xstatereg (bfd *abfd, Elf_Internal_Note *note)
9531{
9532 return elfcore_make_note_pseudosection (abfd, ".reg-xstate", note);
9533}
9534
97753bd5
AM
9535static bfd_boolean
9536elfcore_grok_ppc_vmx (bfd *abfd, Elf_Internal_Note *note)
9537{
9538 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-vmx", note);
9539}
9540
89eeb0bc
LM
9541static bfd_boolean
9542elfcore_grok_ppc_vsx (bfd *abfd, Elf_Internal_Note *note)
9543{
9544 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-vsx", note);
9545}
97753bd5 9546
cb2366c1
EBM
9547static bfd_boolean
9548elfcore_grok_ppc_tar (bfd *abfd, Elf_Internal_Note *note)
9549{
9550 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tar", note);
9551}
9552
9553static bfd_boolean
9554elfcore_grok_ppc_ppr (bfd *abfd, Elf_Internal_Note *note)
9555{
9556 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-ppr", note);
9557}
9558
9559static bfd_boolean
9560elfcore_grok_ppc_dscr (bfd *abfd, Elf_Internal_Note *note)
9561{
9562 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-dscr", note);
9563}
9564
9565static bfd_boolean
9566elfcore_grok_ppc_ebb (bfd *abfd, Elf_Internal_Note *note)
9567{
9568 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-ebb", note);
9569}
9570
9571static bfd_boolean
9572elfcore_grok_ppc_pmu (bfd *abfd, Elf_Internal_Note *note)
9573{
9574 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-pmu", note);
9575}
9576
9577static bfd_boolean
9578elfcore_grok_ppc_tm_cgpr (bfd *abfd, Elf_Internal_Note *note)
9579{
9580 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cgpr", note);
9581}
9582
9583static bfd_boolean
9584elfcore_grok_ppc_tm_cfpr (bfd *abfd, Elf_Internal_Note *note)
9585{
9586 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cfpr", note);
9587}
9588
9589static bfd_boolean
9590elfcore_grok_ppc_tm_cvmx (bfd *abfd, Elf_Internal_Note *note)
9591{
9592 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cvmx", note);
9593}
9594
9595static bfd_boolean
9596elfcore_grok_ppc_tm_cvsx (bfd *abfd, Elf_Internal_Note *note)
9597{
9598 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cvsx", note);
9599}
9600
9601static bfd_boolean
9602elfcore_grok_ppc_tm_spr (bfd *abfd, Elf_Internal_Note *note)
9603{
9604 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-spr", note);
9605}
9606
9607static bfd_boolean
9608elfcore_grok_ppc_tm_ctar (bfd *abfd, Elf_Internal_Note *note)
9609{
9610 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-ctar", note);
9611}
9612
9613static bfd_boolean
9614elfcore_grok_ppc_tm_cppr (bfd *abfd, Elf_Internal_Note *note)
9615{
9616 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cppr", note);
9617}
9618
9619static bfd_boolean
9620elfcore_grok_ppc_tm_cdscr (bfd *abfd, Elf_Internal_Note *note)
9621{
9622 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cdscr", note);
9623}
9624
0675e188
UW
9625static bfd_boolean
9626elfcore_grok_s390_high_gprs (bfd *abfd, Elf_Internal_Note *note)
9627{
9628 return elfcore_make_note_pseudosection (abfd, ".reg-s390-high-gprs", note);
9629}
9630
d7eeb400
MS
9631static bfd_boolean
9632elfcore_grok_s390_timer (bfd *abfd, Elf_Internal_Note *note)
9633{
9634 return elfcore_make_note_pseudosection (abfd, ".reg-s390-timer", note);
9635}
9636
9637static bfd_boolean
9638elfcore_grok_s390_todcmp (bfd *abfd, Elf_Internal_Note *note)
9639{
9640 return elfcore_make_note_pseudosection (abfd, ".reg-s390-todcmp", note);
9641}
9642
9643static bfd_boolean
9644elfcore_grok_s390_todpreg (bfd *abfd, Elf_Internal_Note *note)
9645{
9646 return elfcore_make_note_pseudosection (abfd, ".reg-s390-todpreg", note);
9647}
9648
9649static bfd_boolean
9650elfcore_grok_s390_ctrs (bfd *abfd, Elf_Internal_Note *note)
9651{
9652 return elfcore_make_note_pseudosection (abfd, ".reg-s390-ctrs", note);
9653}
9654
9655static bfd_boolean
9656elfcore_grok_s390_prefix (bfd *abfd, Elf_Internal_Note *note)
9657{
9658 return elfcore_make_note_pseudosection (abfd, ".reg-s390-prefix", note);
9659}
9660
355b81d9
UW
9661static bfd_boolean
9662elfcore_grok_s390_last_break (bfd *abfd, Elf_Internal_Note *note)
9663{
9664 return elfcore_make_note_pseudosection (abfd, ".reg-s390-last-break", note);
9665}
9666
9667static bfd_boolean
9668elfcore_grok_s390_system_call (bfd *abfd, Elf_Internal_Note *note)
9669{
9670 return elfcore_make_note_pseudosection (abfd, ".reg-s390-system-call", note);
9671}
9672
abb3f6cc
NC
9673static bfd_boolean
9674elfcore_grok_s390_tdb (bfd *abfd, Elf_Internal_Note *note)
9675{
9676 return elfcore_make_note_pseudosection (abfd, ".reg-s390-tdb", note);
9677}
9678
4ef9f41a
AA
9679static bfd_boolean
9680elfcore_grok_s390_vxrs_low (bfd *abfd, Elf_Internal_Note *note)
9681{
9682 return elfcore_make_note_pseudosection (abfd, ".reg-s390-vxrs-low", note);
9683}
9684
9685static bfd_boolean
9686elfcore_grok_s390_vxrs_high (bfd *abfd, Elf_Internal_Note *note)
9687{
9688 return elfcore_make_note_pseudosection (abfd, ".reg-s390-vxrs-high", note);
9689}
9690
88ab90e8
AA
9691static bfd_boolean
9692elfcore_grok_s390_gs_cb (bfd *abfd, Elf_Internal_Note *note)
9693{
9694 return elfcore_make_note_pseudosection (abfd, ".reg-s390-gs-cb", note);
9695}
9696
9697static bfd_boolean
9698elfcore_grok_s390_gs_bc (bfd *abfd, Elf_Internal_Note *note)
9699{
9700 return elfcore_make_note_pseudosection (abfd, ".reg-s390-gs-bc", note);
9701}
9702
faa9a424
UW
9703static bfd_boolean
9704elfcore_grok_arm_vfp (bfd *abfd, Elf_Internal_Note *note)
9705{
9706 return elfcore_make_note_pseudosection (abfd, ".reg-arm-vfp", note);
9707}
9708
652451f8
YZ
9709static bfd_boolean
9710elfcore_grok_aarch_tls (bfd *abfd, Elf_Internal_Note *note)
9711{
9712 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-tls", note);
9713}
9714
9715static bfd_boolean
9716elfcore_grok_aarch_hw_break (bfd *abfd, Elf_Internal_Note *note)
9717{
9718 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-hw-break", note);
9719}
9720
9721static bfd_boolean
9722elfcore_grok_aarch_hw_watch (bfd *abfd, Elf_Internal_Note *note)
9723{
9724 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-hw-watch", note);
9725}
9726
ad1cc4e4
AH
9727static bfd_boolean
9728elfcore_grok_aarch_sve (bfd *abfd, Elf_Internal_Note *note)
9729{
9730 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-sve", note);
9731}
9732
e6c3b5bf
AH
9733static bfd_boolean
9734elfcore_grok_aarch_pauth (bfd *abfd, Elf_Internal_Note *note)
9735{
9736 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-pauth", note);
9737}
9738
252b5132 9739#if defined (HAVE_PRPSINFO_T)
4a938328 9740typedef prpsinfo_t elfcore_psinfo_t;
7ee38065 9741#if defined (HAVE_PRPSINFO32_T) /* Sparc64 cross Sparc32 */
4a938328
MS
9742typedef prpsinfo32_t elfcore_psinfo32_t;
9743#endif
252b5132
RH
9744#endif
9745
9746#if defined (HAVE_PSINFO_T)
4a938328 9747typedef psinfo_t elfcore_psinfo_t;
7ee38065 9748#if defined (HAVE_PSINFO32_T) /* Sparc64 cross Sparc32 */
4a938328
MS
9749typedef psinfo32_t elfcore_psinfo32_t;
9750#endif
252b5132
RH
9751#endif
9752
252b5132
RH
9753/* return a malloc'ed copy of a string at START which is at
9754 most MAX bytes long, possibly without a terminating '\0'.
c044fabd 9755 the copy will always have a terminating '\0'. */
252b5132 9756
936e320b 9757char *
217aa764 9758_bfd_elfcore_strndup (bfd *abfd, char *start, size_t max)
252b5132 9759{
dc810e39 9760 char *dups;
a50b1753 9761 char *end = (char *) memchr (start, '\0', max);
dc810e39 9762 size_t len;
252b5132
RH
9763
9764 if (end == NULL)
9765 len = max;
9766 else
9767 len = end - start;
9768
a50b1753 9769 dups = (char *) bfd_alloc (abfd, len + 1);
dc810e39 9770 if (dups == NULL)
252b5132
RH
9771 return NULL;
9772
dc810e39
AM
9773 memcpy (dups, start, len);
9774 dups[len] = '\0';
252b5132 9775
dc810e39 9776 return dups;
252b5132
RH
9777}
9778
bb0082d6 9779#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
b34976b6 9780static bfd_boolean
217aa764 9781elfcore_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
252b5132 9782{
4a938328
MS
9783 if (note->descsz == sizeof (elfcore_psinfo_t))
9784 {
9785 elfcore_psinfo_t psinfo;
252b5132 9786
7ee38065 9787 memcpy (&psinfo, note->descdata, sizeof (psinfo));
252b5132 9788
335e41d4 9789#if defined (HAVE_PSINFO_T_PR_PID) || defined (HAVE_PRPSINFO_T_PR_PID)
228e534f 9790 elf_tdata (abfd)->core->pid = psinfo.pr_pid;
335e41d4 9791#endif
228e534f 9792 elf_tdata (abfd)->core->program
936e320b
AM
9793 = _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
9794 sizeof (psinfo.pr_fname));
252b5132 9795
228e534f 9796 elf_tdata (abfd)->core->command
936e320b
AM
9797 = _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
9798 sizeof (psinfo.pr_psargs));
4a938328 9799 }
7ee38065 9800#if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
4a938328
MS
9801 else if (note->descsz == sizeof (elfcore_psinfo32_t))
9802 {
9803 /* 64-bit host, 32-bit corefile */
9804 elfcore_psinfo32_t psinfo;
9805
7ee38065 9806 memcpy (&psinfo, note->descdata, sizeof (psinfo));
252b5132 9807
335e41d4 9808#if defined (HAVE_PSINFO32_T_PR_PID) || defined (HAVE_PRPSINFO32_T_PR_PID)
228e534f 9809 elf_tdata (abfd)->core->pid = psinfo.pr_pid;
335e41d4 9810#endif
228e534f 9811 elf_tdata (abfd)->core->program
936e320b
AM
9812 = _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
9813 sizeof (psinfo.pr_fname));
4a938328 9814
228e534f 9815 elf_tdata (abfd)->core->command
936e320b
AM
9816 = _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
9817 sizeof (psinfo.pr_psargs));
4a938328
MS
9818 }
9819#endif
9820
9821 else
9822 {
9823 /* Fail - we don't know how to handle any other
9824 note size (ie. data object type). */
b34976b6 9825 return TRUE;
4a938328 9826 }
252b5132
RH
9827
9828 /* Note that for some reason, a spurious space is tacked
9829 onto the end of the args in some (at least one anyway)
c044fabd 9830 implementations, so strip it off if it exists. */
252b5132
RH
9831
9832 {
228e534f 9833 char *command = elf_tdata (abfd)->core->command;
252b5132
RH
9834 int n = strlen (command);
9835
9836 if (0 < n && command[n - 1] == ' ')
9837 command[n - 1] = '\0';
9838 }
9839
b34976b6 9840 return TRUE;
252b5132
RH
9841}
9842#endif /* defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T) */
9843
252b5132 9844#if defined (HAVE_PSTATUS_T)
b34976b6 9845static bfd_boolean
217aa764 9846elfcore_grok_pstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132 9847{
f572a39d
AM
9848 if (note->descsz == sizeof (pstatus_t)
9849#if defined (HAVE_PXSTATUS_T)
9850 || note->descsz == sizeof (pxstatus_t)
9851#endif
9852 )
4a938328
MS
9853 {
9854 pstatus_t pstat;
252b5132 9855
4a938328 9856 memcpy (&pstat, note->descdata, sizeof (pstat));
252b5132 9857
228e534f 9858 elf_tdata (abfd)->core->pid = pstat.pr_pid;
4a938328 9859 }
7ee38065 9860#if defined (HAVE_PSTATUS32_T)
4a938328
MS
9861 else if (note->descsz == sizeof (pstatus32_t))
9862 {
9863 /* 64-bit host, 32-bit corefile */
9864 pstatus32_t pstat;
252b5132 9865
4a938328 9866 memcpy (&pstat, note->descdata, sizeof (pstat));
252b5132 9867
228e534f 9868 elf_tdata (abfd)->core->pid = pstat.pr_pid;
4a938328
MS
9869 }
9870#endif
252b5132
RH
9871 /* Could grab some more details from the "representative"
9872 lwpstatus_t in pstat.pr_lwp, but we'll catch it all in an
c044fabd 9873 NT_LWPSTATUS note, presumably. */
252b5132 9874
b34976b6 9875 return TRUE;
252b5132
RH
9876}
9877#endif /* defined (HAVE_PSTATUS_T) */
9878
252b5132 9879#if defined (HAVE_LWPSTATUS_T)
b34976b6 9880static bfd_boolean
217aa764 9881elfcore_grok_lwpstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132
RH
9882{
9883 lwpstatus_t lwpstat;
9884 char buf[100];
c044fabd 9885 char *name;
d4c88bbb 9886 size_t len;
c044fabd 9887 asection *sect;
252b5132 9888
f572a39d
AM
9889 if (note->descsz != sizeof (lwpstat)
9890#if defined (HAVE_LWPXSTATUS_T)
9891 && note->descsz != sizeof (lwpxstatus_t)
9892#endif
9893 )
b34976b6 9894 return TRUE;
252b5132
RH
9895
9896 memcpy (&lwpstat, note->descdata, sizeof (lwpstat));
9897
228e534f 9898 elf_tdata (abfd)->core->lwpid = lwpstat.pr_lwpid;
a1504221
JB
9899 /* Do not overwrite the core signal if it has already been set by
9900 another thread. */
228e534f
AM
9901 if (elf_tdata (abfd)->core->signal == 0)
9902 elf_tdata (abfd)->core->signal = lwpstat.pr_cursig;
252b5132 9903
c044fabd 9904 /* Make a ".reg/999" section. */
252b5132
RH
9905
9906 sprintf (buf, ".reg/%d", elfcore_make_pid (abfd));
d4c88bbb 9907 len = strlen (buf) + 1;
217aa764 9908 name = bfd_alloc (abfd, len);
252b5132 9909 if (name == NULL)
b34976b6 9910 return FALSE;
d4c88bbb 9911 memcpy (name, buf, len);
252b5132 9912
117ed4f8 9913 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
252b5132 9914 if (sect == NULL)
b34976b6 9915 return FALSE;
252b5132
RH
9916
9917#if defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
eea6121a 9918 sect->size = sizeof (lwpstat.pr_context.uc_mcontext.gregs);
252b5132
RH
9919 sect->filepos = note->descpos
9920 + offsetof (lwpstatus_t, pr_context.uc_mcontext.gregs);
9921#endif
9922
9923#if defined (HAVE_LWPSTATUS_T_PR_REG)
eea6121a 9924 sect->size = sizeof (lwpstat.pr_reg);
252b5132
RH
9925 sect->filepos = note->descpos + offsetof (lwpstatus_t, pr_reg);
9926#endif
9927
252b5132
RH
9928 sect->alignment_power = 2;
9929
9930 if (!elfcore_maybe_make_sect (abfd, ".reg", sect))
b34976b6 9931 return FALSE;
252b5132
RH
9932
9933 /* Make a ".reg2/999" section */
9934
9935 sprintf (buf, ".reg2/%d", elfcore_make_pid (abfd));
d4c88bbb 9936 len = strlen (buf) + 1;
217aa764 9937 name = bfd_alloc (abfd, len);
252b5132 9938 if (name == NULL)
b34976b6 9939 return FALSE;
d4c88bbb 9940 memcpy (name, buf, len);
252b5132 9941
117ed4f8 9942 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
252b5132 9943 if (sect == NULL)
b34976b6 9944 return FALSE;
252b5132
RH
9945
9946#if defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
eea6121a 9947 sect->size = sizeof (lwpstat.pr_context.uc_mcontext.fpregs);
252b5132
RH
9948 sect->filepos = note->descpos
9949 + offsetof (lwpstatus_t, pr_context.uc_mcontext.fpregs);
9950#endif
9951
9952#if defined (HAVE_LWPSTATUS_T_PR_FPREG)
eea6121a 9953 sect->size = sizeof (lwpstat.pr_fpreg);
252b5132
RH
9954 sect->filepos = note->descpos + offsetof (lwpstatus_t, pr_fpreg);
9955#endif
9956
252b5132
RH
9957 sect->alignment_power = 2;
9958
936e320b 9959 return elfcore_maybe_make_sect (abfd, ".reg2", sect);
252b5132
RH
9960}
9961#endif /* defined (HAVE_LWPSTATUS_T) */
9962
b34976b6 9963static bfd_boolean
217aa764 9964elfcore_grok_win32pstatus (bfd *abfd, Elf_Internal_Note *note)
16e9c715
NC
9965{
9966 char buf[30];
c044fabd 9967 char *name;
d4c88bbb 9968 size_t len;
c044fabd 9969 asection *sect;
4a6636fb
PA
9970 int type;
9971 int is_active_thread;
9972 bfd_vma base_addr;
16e9c715 9973
4a6636fb 9974 if (note->descsz < 728)
b34976b6 9975 return TRUE;
16e9c715 9976
4a6636fb
PA
9977 if (! CONST_STRNEQ (note->namedata, "win32"))
9978 return TRUE;
9979
9980 type = bfd_get_32 (abfd, note->descdata);
c044fabd 9981
4a6636fb 9982 switch (type)
16e9c715 9983 {
4a6636fb 9984 case 1 /* NOTE_INFO_PROCESS */:
228e534f 9985 /* FIXME: need to add ->core->command. */
4a6636fb 9986 /* process_info.pid */
228e534f 9987 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 8);
4a6636fb 9988 /* process_info.signal */
228e534f 9989 elf_tdata (abfd)->core->signal = bfd_get_32 (abfd, note->descdata + 12);
c044fabd 9990 break;
16e9c715 9991
4a6636fb 9992 case 2 /* NOTE_INFO_THREAD */:
16e9c715 9993 /* Make a ".reg/999" section. */
4a6636fb
PA
9994 /* thread_info.tid */
9995 sprintf (buf, ".reg/%ld", (long) bfd_get_32 (abfd, note->descdata + 8));
c044fabd 9996
d4c88bbb 9997 len = strlen (buf) + 1;
a50b1753 9998 name = (char *) bfd_alloc (abfd, len);
16e9c715 9999 if (name == NULL)
b34976b6 10000 return FALSE;
c044fabd 10001
d4c88bbb 10002 memcpy (name, buf, len);
16e9c715 10003
117ed4f8 10004 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
16e9c715 10005 if (sect == NULL)
b34976b6 10006 return FALSE;
c044fabd 10007
4a6636fb
PA
10008 /* sizeof (thread_info.thread_context) */
10009 sect->size = 716;
10010 /* offsetof (thread_info.thread_context) */
10011 sect->filepos = note->descpos + 12;
16e9c715
NC
10012 sect->alignment_power = 2;
10013
4a6636fb
PA
10014 /* thread_info.is_active_thread */
10015 is_active_thread = bfd_get_32 (abfd, note->descdata + 8);
10016
10017 if (is_active_thread)
16e9c715 10018 if (! elfcore_maybe_make_sect (abfd, ".reg", sect))
b34976b6 10019 return FALSE;
16e9c715
NC
10020 break;
10021
4a6636fb 10022 case 3 /* NOTE_INFO_MODULE */:
16e9c715 10023 /* Make a ".module/xxxxxxxx" section. */
4a6636fb
PA
10024 /* module_info.base_address */
10025 base_addr = bfd_get_32 (abfd, note->descdata + 4);
0af1713e 10026 sprintf (buf, ".module/%08lx", (unsigned long) base_addr);
c044fabd 10027
d4c88bbb 10028 len = strlen (buf) + 1;
a50b1753 10029 name = (char *) bfd_alloc (abfd, len);
16e9c715 10030 if (name == NULL)
b34976b6 10031 return FALSE;
c044fabd 10032
d4c88bbb 10033 memcpy (name, buf, len);
252b5132 10034
117ed4f8 10035 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
c044fabd 10036
16e9c715 10037 if (sect == NULL)
b34976b6 10038 return FALSE;
c044fabd 10039
eea6121a 10040 sect->size = note->descsz;
16e9c715 10041 sect->filepos = note->descpos;
16e9c715
NC
10042 sect->alignment_power = 2;
10043 break;
10044
10045 default:
b34976b6 10046 return TRUE;
16e9c715
NC
10047 }
10048
b34976b6 10049 return TRUE;
16e9c715 10050}
252b5132 10051
b34976b6 10052static bfd_boolean
217aa764 10053elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
252b5132 10054{
9c5bfbb7 10055 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
bb0082d6 10056
252b5132
RH
10057 switch (note->type)
10058 {
10059 default:
b34976b6 10060 return TRUE;
252b5132 10061
252b5132 10062 case NT_PRSTATUS:
bb0082d6
AM
10063 if (bed->elf_backend_grok_prstatus)
10064 if ((*bed->elf_backend_grok_prstatus) (abfd, note))
b34976b6 10065 return TRUE;
bb0082d6 10066#if defined (HAVE_PRSTATUS_T)
252b5132 10067 return elfcore_grok_prstatus (abfd, note);
bb0082d6 10068#else
b34976b6 10069 return TRUE;
252b5132
RH
10070#endif
10071
10072#if defined (HAVE_PSTATUS_T)
10073 case NT_PSTATUS:
10074 return elfcore_grok_pstatus (abfd, note);
10075#endif
10076
10077#if defined (HAVE_LWPSTATUS_T)
10078 case NT_LWPSTATUS:
10079 return elfcore_grok_lwpstatus (abfd, note);
10080#endif
10081
10082 case NT_FPREGSET: /* FIXME: rename to NT_PRFPREG */
10083 return elfcore_grok_prfpreg (abfd, note);
10084
c044fabd 10085 case NT_WIN32PSTATUS:
16e9c715 10086 return elfcore_grok_win32pstatus (abfd, note);
16e9c715 10087
c044fabd 10088 case NT_PRXFPREG: /* Linux SSE extension */
e377ab71
MK
10089 if (note->namesz == 6
10090 && strcmp (note->namedata, "LINUX") == 0)
ff08c6bb
JB
10091 return elfcore_grok_prxfpreg (abfd, note);
10092 else
b34976b6 10093 return TRUE;
ff08c6bb 10094
4339cae0
L
10095 case NT_X86_XSTATE: /* Linux XSAVE extension */
10096 if (note->namesz == 6
10097 && strcmp (note->namedata, "LINUX") == 0)
10098 return elfcore_grok_xstatereg (abfd, note);
10099 else
10100 return TRUE;
10101
97753bd5
AM
10102 case NT_PPC_VMX:
10103 if (note->namesz == 6
10104 && strcmp (note->namedata, "LINUX") == 0)
10105 return elfcore_grok_ppc_vmx (abfd, note);
10106 else
10107 return TRUE;
10108
89eeb0bc
LM
10109 case NT_PPC_VSX:
10110 if (note->namesz == 6
07d6d2b8
AM
10111 && strcmp (note->namedata, "LINUX") == 0)
10112 return elfcore_grok_ppc_vsx (abfd, note);
89eeb0bc 10113 else
07d6d2b8 10114 return TRUE;
89eeb0bc 10115
cb2366c1
EBM
10116 case NT_PPC_TAR:
10117 if (note->namesz == 6
4b24dd1a
AM
10118 && strcmp (note->namedata, "LINUX") == 0)
10119 return elfcore_grok_ppc_tar (abfd, note);
cb2366c1 10120 else
4b24dd1a 10121 return TRUE;
cb2366c1
EBM
10122
10123 case NT_PPC_PPR:
10124 if (note->namesz == 6
4b24dd1a
AM
10125 && strcmp (note->namedata, "LINUX") == 0)
10126 return elfcore_grok_ppc_ppr (abfd, note);
cb2366c1 10127 else
4b24dd1a 10128 return TRUE;
cb2366c1
EBM
10129
10130 case NT_PPC_DSCR:
10131 if (note->namesz == 6
4b24dd1a
AM
10132 && strcmp (note->namedata, "LINUX") == 0)
10133 return elfcore_grok_ppc_dscr (abfd, note);
cb2366c1 10134 else
4b24dd1a 10135 return TRUE;
cb2366c1
EBM
10136
10137 case NT_PPC_EBB:
10138 if (note->namesz == 6
4b24dd1a
AM
10139 && strcmp (note->namedata, "LINUX") == 0)
10140 return elfcore_grok_ppc_ebb (abfd, note);
cb2366c1 10141 else
4b24dd1a 10142 return TRUE;
cb2366c1
EBM
10143
10144 case NT_PPC_PMU:
10145 if (note->namesz == 6
4b24dd1a
AM
10146 && strcmp (note->namedata, "LINUX") == 0)
10147 return elfcore_grok_ppc_pmu (abfd, note);
cb2366c1 10148 else
4b24dd1a 10149 return TRUE;
cb2366c1
EBM
10150
10151 case NT_PPC_TM_CGPR:
10152 if (note->namesz == 6
4b24dd1a
AM
10153 && strcmp (note->namedata, "LINUX") == 0)
10154 return elfcore_grok_ppc_tm_cgpr (abfd, note);
cb2366c1 10155 else
4b24dd1a 10156 return TRUE;
cb2366c1
EBM
10157
10158 case NT_PPC_TM_CFPR:
10159 if (note->namesz == 6
4b24dd1a
AM
10160 && strcmp (note->namedata, "LINUX") == 0)
10161 return elfcore_grok_ppc_tm_cfpr (abfd, note);
cb2366c1 10162 else
4b24dd1a 10163 return TRUE;
cb2366c1
EBM
10164
10165 case NT_PPC_TM_CVMX:
10166 if (note->namesz == 6
4b24dd1a
AM
10167 && strcmp (note->namedata, "LINUX") == 0)
10168 return elfcore_grok_ppc_tm_cvmx (abfd, note);
cb2366c1 10169 else
4b24dd1a 10170 return TRUE;
cb2366c1
EBM
10171
10172 case NT_PPC_TM_CVSX:
10173 if (note->namesz == 6
4b24dd1a
AM
10174 && strcmp (note->namedata, "LINUX") == 0)
10175 return elfcore_grok_ppc_tm_cvsx (abfd, note);
cb2366c1 10176 else
4b24dd1a 10177 return TRUE;
cb2366c1
EBM
10178
10179 case NT_PPC_TM_SPR:
10180 if (note->namesz == 6
4b24dd1a
AM
10181 && strcmp (note->namedata, "LINUX") == 0)
10182 return elfcore_grok_ppc_tm_spr (abfd, note);
cb2366c1 10183 else
4b24dd1a 10184 return TRUE;
cb2366c1
EBM
10185
10186 case NT_PPC_TM_CTAR:
10187 if (note->namesz == 6
4b24dd1a
AM
10188 && strcmp (note->namedata, "LINUX") == 0)
10189 return elfcore_grok_ppc_tm_ctar (abfd, note);
cb2366c1 10190 else
4b24dd1a 10191 return TRUE;
cb2366c1
EBM
10192
10193 case NT_PPC_TM_CPPR:
10194 if (note->namesz == 6
4b24dd1a
AM
10195 && strcmp (note->namedata, "LINUX") == 0)
10196 return elfcore_grok_ppc_tm_cppr (abfd, note);
cb2366c1 10197 else
4b24dd1a 10198 return TRUE;
cb2366c1
EBM
10199
10200 case NT_PPC_TM_CDSCR:
10201 if (note->namesz == 6
4b24dd1a
AM
10202 && strcmp (note->namedata, "LINUX") == 0)
10203 return elfcore_grok_ppc_tm_cdscr (abfd, note);
cb2366c1 10204 else
4b24dd1a 10205 return TRUE;
cb2366c1 10206
0675e188
UW
10207 case NT_S390_HIGH_GPRS:
10208 if (note->namesz == 6
07d6d2b8
AM
10209 && strcmp (note->namedata, "LINUX") == 0)
10210 return elfcore_grok_s390_high_gprs (abfd, note);
0675e188 10211 else
07d6d2b8 10212 return TRUE;
0675e188 10213
d7eeb400
MS
10214 case NT_S390_TIMER:
10215 if (note->namesz == 6
07d6d2b8
AM
10216 && strcmp (note->namedata, "LINUX") == 0)
10217 return elfcore_grok_s390_timer (abfd, note);
d7eeb400 10218 else
07d6d2b8 10219 return TRUE;
d7eeb400
MS
10220
10221 case NT_S390_TODCMP:
10222 if (note->namesz == 6
07d6d2b8
AM
10223 && strcmp (note->namedata, "LINUX") == 0)
10224 return elfcore_grok_s390_todcmp (abfd, note);
d7eeb400 10225 else
07d6d2b8 10226 return TRUE;
d7eeb400
MS
10227
10228 case NT_S390_TODPREG:
10229 if (note->namesz == 6
07d6d2b8
AM
10230 && strcmp (note->namedata, "LINUX") == 0)
10231 return elfcore_grok_s390_todpreg (abfd, note);
d7eeb400 10232 else
07d6d2b8 10233 return TRUE;
d7eeb400
MS
10234
10235 case NT_S390_CTRS:
10236 if (note->namesz == 6
07d6d2b8
AM
10237 && strcmp (note->namedata, "LINUX") == 0)
10238 return elfcore_grok_s390_ctrs (abfd, note);
d7eeb400 10239 else
07d6d2b8 10240 return TRUE;
d7eeb400
MS
10241
10242 case NT_S390_PREFIX:
10243 if (note->namesz == 6
07d6d2b8
AM
10244 && strcmp (note->namedata, "LINUX") == 0)
10245 return elfcore_grok_s390_prefix (abfd, note);
d7eeb400 10246 else
07d6d2b8 10247 return TRUE;
d7eeb400 10248
355b81d9
UW
10249 case NT_S390_LAST_BREAK:
10250 if (note->namesz == 6
07d6d2b8
AM
10251 && strcmp (note->namedata, "LINUX") == 0)
10252 return elfcore_grok_s390_last_break (abfd, note);
355b81d9 10253 else
07d6d2b8 10254 return TRUE;
355b81d9
UW
10255
10256 case NT_S390_SYSTEM_CALL:
10257 if (note->namesz == 6
07d6d2b8
AM
10258 && strcmp (note->namedata, "LINUX") == 0)
10259 return elfcore_grok_s390_system_call (abfd, note);
355b81d9 10260 else
07d6d2b8 10261 return TRUE;
355b81d9 10262
abb3f6cc
NC
10263 case NT_S390_TDB:
10264 if (note->namesz == 6
07d6d2b8
AM
10265 && strcmp (note->namedata, "LINUX") == 0)
10266 return elfcore_grok_s390_tdb (abfd, note);
abb3f6cc 10267 else
07d6d2b8 10268 return TRUE;
abb3f6cc 10269
4ef9f41a
AA
10270 case NT_S390_VXRS_LOW:
10271 if (note->namesz == 6
10272 && strcmp (note->namedata, "LINUX") == 0)
10273 return elfcore_grok_s390_vxrs_low (abfd, note);
10274 else
10275 return TRUE;
10276
10277 case NT_S390_VXRS_HIGH:
10278 if (note->namesz == 6
10279 && strcmp (note->namedata, "LINUX") == 0)
10280 return elfcore_grok_s390_vxrs_high (abfd, note);
10281 else
10282 return TRUE;
10283
88ab90e8
AA
10284 case NT_S390_GS_CB:
10285 if (note->namesz == 6
10286 && strcmp (note->namedata, "LINUX") == 0)
8fe09d74 10287 return elfcore_grok_s390_gs_cb (abfd, note);
88ab90e8
AA
10288 else
10289 return TRUE;
10290
10291 case NT_S390_GS_BC:
10292 if (note->namesz == 6
10293 && strcmp (note->namedata, "LINUX") == 0)
8fe09d74 10294 return elfcore_grok_s390_gs_bc (abfd, note);
88ab90e8
AA
10295 else
10296 return TRUE;
10297
faa9a424
UW
10298 case NT_ARM_VFP:
10299 if (note->namesz == 6
10300 && strcmp (note->namedata, "LINUX") == 0)
10301 return elfcore_grok_arm_vfp (abfd, note);
10302 else
10303 return TRUE;
10304
652451f8
YZ
10305 case NT_ARM_TLS:
10306 if (note->namesz == 6
10307 && strcmp (note->namedata, "LINUX") == 0)
10308 return elfcore_grok_aarch_tls (abfd, note);
10309 else
10310 return TRUE;
10311
10312 case NT_ARM_HW_BREAK:
10313 if (note->namesz == 6
10314 && strcmp (note->namedata, "LINUX") == 0)
10315 return elfcore_grok_aarch_hw_break (abfd, note);
10316 else
10317 return TRUE;
10318
10319 case NT_ARM_HW_WATCH:
10320 if (note->namesz == 6
10321 && strcmp (note->namedata, "LINUX") == 0)
10322 return elfcore_grok_aarch_hw_watch (abfd, note);
10323 else
10324 return TRUE;
10325
ad1cc4e4
AH
10326 case NT_ARM_SVE:
10327 if (note->namesz == 6
10328 && strcmp (note->namedata, "LINUX") == 0)
10329 return elfcore_grok_aarch_sve (abfd, note);
10330 else
10331 return TRUE;
10332
e6c3b5bf
AH
10333 case NT_ARM_PAC_MASK:
10334 if (note->namesz == 6
10335 && strcmp (note->namedata, "LINUX") == 0)
10336 return elfcore_grok_aarch_pauth (abfd, note);
10337 else
10338 return TRUE;
10339
252b5132
RH
10340 case NT_PRPSINFO:
10341 case NT_PSINFO:
bb0082d6
AM
10342 if (bed->elf_backend_grok_psinfo)
10343 if ((*bed->elf_backend_grok_psinfo) (abfd, note))
b34976b6 10344 return TRUE;
bb0082d6 10345#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
252b5132 10346 return elfcore_grok_psinfo (abfd, note);
bb0082d6 10347#else
b34976b6 10348 return TRUE;
252b5132 10349#endif
3333a7c3
RM
10350
10351 case NT_AUXV:
58e07198 10352 return elfcore_make_auxv_note_section (abfd, note, 0);
9015683b 10353
451b7c33
TT
10354 case NT_FILE:
10355 return elfcore_make_note_pseudosection (abfd, ".note.linuxcore.file",
10356 note);
10357
9015683b
TT
10358 case NT_SIGINFO:
10359 return elfcore_make_note_pseudosection (abfd, ".note.linuxcore.siginfo",
10360 note);
5b2c414d 10361
252b5132
RH
10362 }
10363}
10364
718175fa
JK
10365static bfd_boolean
10366elfobj_grok_gnu_build_id (bfd *abfd, Elf_Internal_Note *note)
10367{
c74f7d1c 10368 struct bfd_build_id* build_id;
30e8ee25
AM
10369
10370 if (note->descsz == 0)
10371 return FALSE;
10372
c74f7d1c
JT
10373 build_id = bfd_alloc (abfd, sizeof (struct bfd_build_id) - 1 + note->descsz);
10374 if (build_id == NULL)
718175fa
JK
10375 return FALSE;
10376
c74f7d1c
JT
10377 build_id->size = note->descsz;
10378 memcpy (build_id->data, note->descdata, note->descsz);
10379 abfd->build_id = build_id;
718175fa
JK
10380
10381 return TRUE;
10382}
10383
10384static bfd_boolean
10385elfobj_grok_gnu_note (bfd *abfd, Elf_Internal_Note *note)
10386{
10387 switch (note->type)
10388 {
10389 default:
10390 return TRUE;
10391
46bed679
L
10392 case NT_GNU_PROPERTY_TYPE_0:
10393 return _bfd_elf_parse_gnu_properties (abfd, note);
10394
718175fa
JK
10395 case NT_GNU_BUILD_ID:
10396 return elfobj_grok_gnu_build_id (abfd, note);
10397 }
10398}
10399
e21e5835
NC
10400static bfd_boolean
10401elfobj_grok_stapsdt_note_1 (bfd *abfd, Elf_Internal_Note *note)
10402{
10403 struct sdt_note *cur =
7a6e0d89
AM
10404 (struct sdt_note *) bfd_alloc (abfd,
10405 sizeof (struct sdt_note) + note->descsz);
e21e5835
NC
10406
10407 cur->next = (struct sdt_note *) (elf_tdata (abfd))->sdt_note_head;
10408 cur->size = (bfd_size_type) note->descsz;
10409 memcpy (cur->data, note->descdata, note->descsz);
10410
10411 elf_tdata (abfd)->sdt_note_head = cur;
10412
10413 return TRUE;
10414}
10415
10416static bfd_boolean
10417elfobj_grok_stapsdt_note (bfd *abfd, Elf_Internal_Note *note)
10418{
10419 switch (note->type)
10420 {
10421 case NT_STAPSDT:
10422 return elfobj_grok_stapsdt_note_1 (abfd, note);
10423
10424 default:
10425 return TRUE;
10426 }
10427}
10428
aa1ed4a9
JB
10429static bfd_boolean
10430elfcore_grok_freebsd_psinfo (bfd *abfd, Elf_Internal_Note *note)
10431{
10432 size_t offset;
10433
b5430a3c 10434 switch (elf_elfheader (abfd)->e_ident[EI_CLASS])
aa1ed4a9 10435 {
b5430a3c 10436 case ELFCLASS32:
0064d223
JB
10437 if (note->descsz < 108)
10438 return FALSE;
aa1ed4a9
JB
10439 break;
10440
b5430a3c 10441 case ELFCLASS64:
0064d223
JB
10442 if (note->descsz < 120)
10443 return FALSE;
aa1ed4a9
JB
10444 break;
10445
10446 default:
10447 return FALSE;
10448 }
10449
0064d223
JB
10450 /* Check for version 1 in pr_version. */
10451 if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
10452 return FALSE;
80a04378 10453
0064d223
JB
10454 offset = 4;
10455
10456 /* Skip over pr_psinfosz. */
b5430a3c 10457 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS32)
0064d223
JB
10458 offset += 4;
10459 else
10460 {
10461 offset += 4; /* Padding before pr_psinfosz. */
10462 offset += 8;
10463 }
10464
aa1ed4a9
JB
10465 /* pr_fname is PRFNAMESZ (16) + 1 bytes in size. */
10466 elf_tdata (abfd)->core->program
10467 = _bfd_elfcore_strndup (abfd, note->descdata + offset, 17);
10468 offset += 17;
10469
10470 /* pr_psargs is PRARGSZ (80) + 1 bytes in size. */
10471 elf_tdata (abfd)->core->command
10472 = _bfd_elfcore_strndup (abfd, note->descdata + offset, 81);
0064d223
JB
10473 offset += 81;
10474
10475 /* Padding before pr_pid. */
10476 offset += 2;
10477
10478 /* The pr_pid field was added in version "1a". */
10479 if (note->descsz < offset + 4)
10480 return TRUE;
10481
10482 elf_tdata (abfd)->core->pid
10483 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
aa1ed4a9
JB
10484
10485 return TRUE;
10486}
10487
10488static bfd_boolean
10489elfcore_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note)
10490{
10491 size_t offset;
10492 size_t size;
24d3e51b 10493 size_t min_size;
aa1ed4a9 10494
24d3e51b
NC
10495 /* Compute offset of pr_getregsz, skipping over pr_statussz.
10496 Also compute minimum size of this note. */
b5430a3c 10497 switch (elf_elfheader (abfd)->e_ident[EI_CLASS])
aa1ed4a9 10498 {
b5430a3c 10499 case ELFCLASS32:
24d3e51b
NC
10500 offset = 4 + 4;
10501 min_size = offset + (4 * 2) + 4 + 4 + 4;
aa1ed4a9
JB
10502 break;
10503
b5430a3c 10504 case ELFCLASS64:
24d3e51b
NC
10505 offset = 4 + 4 + 8; /* Includes padding before pr_statussz. */
10506 min_size = offset + (8 * 2) + 4 + 4 + 4 + 4;
aa1ed4a9
JB
10507 break;
10508
10509 default:
10510 return FALSE;
10511 }
10512
24d3e51b
NC
10513 if (note->descsz < min_size)
10514 return FALSE;
10515
10516 /* Check for version 1 in pr_version. */
10517 if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
10518 return FALSE;
aa1ed4a9 10519
24d3e51b
NC
10520 /* Extract size of pr_reg from pr_gregsetsz. */
10521 /* Skip over pr_gregsetsz and pr_fpregsetsz. */
b5430a3c 10522 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS32)
24d3e51b
NC
10523 {
10524 size = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
10525 offset += 4 * 2;
10526 }
b5430a3c 10527 else
24d3e51b
NC
10528 {
10529 size = bfd_h_get_64 (abfd, (bfd_byte *) note->descdata + offset);
10530 offset += 8 * 2;
10531 }
aa1ed4a9 10532
24d3e51b 10533 /* Skip over pr_osreldate. */
aa1ed4a9
JB
10534 offset += 4;
10535
24d3e51b 10536 /* Read signal from pr_cursig. */
aa1ed4a9
JB
10537 if (elf_tdata (abfd)->core->signal == 0)
10538 elf_tdata (abfd)->core->signal
10539 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
10540 offset += 4;
10541
24d3e51b 10542 /* Read TID from pr_pid. */
aa1ed4a9
JB
10543 elf_tdata (abfd)->core->lwpid
10544 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
10545 offset += 4;
10546
24d3e51b 10547 /* Padding before pr_reg. */
b5430a3c 10548 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64)
aa1ed4a9
JB
10549 offset += 4;
10550
24d3e51b
NC
10551 /* Make sure that there is enough data remaining in the note. */
10552 if ((note->descsz - offset) < size)
10553 return FALSE;
10554
aa1ed4a9
JB
10555 /* Make a ".reg/999" section and a ".reg" section. */
10556 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
10557 size, note->descpos + offset);
10558}
10559
10560static bfd_boolean
10561elfcore_grok_freebsd_note (bfd *abfd, Elf_Internal_Note *note)
10562{
544c67cd
JB
10563 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
10564
aa1ed4a9
JB
10565 switch (note->type)
10566 {
10567 case NT_PRSTATUS:
544c67cd
JB
10568 if (bed->elf_backend_grok_freebsd_prstatus)
10569 if ((*bed->elf_backend_grok_freebsd_prstatus) (abfd, note))
10570 return TRUE;
aa1ed4a9
JB
10571 return elfcore_grok_freebsd_prstatus (abfd, note);
10572
10573 case NT_FPREGSET:
10574 return elfcore_grok_prfpreg (abfd, note);
10575
10576 case NT_PRPSINFO:
10577 return elfcore_grok_freebsd_psinfo (abfd, note);
10578
10579 case NT_FREEBSD_THRMISC:
10580 if (note->namesz == 8)
10581 return elfcore_make_note_pseudosection (abfd, ".thrmisc", note);
10582 else
10583 return TRUE;
10584
ddb2bbcf
JB
10585 case NT_FREEBSD_PROCSTAT_PROC:
10586 return elfcore_make_note_pseudosection (abfd, ".note.freebsdcore.proc",
10587 note);
10588
10589 case NT_FREEBSD_PROCSTAT_FILES:
10590 return elfcore_make_note_pseudosection (abfd, ".note.freebsdcore.files",
10591 note);
10592
10593 case NT_FREEBSD_PROCSTAT_VMMAP:
10594 return elfcore_make_note_pseudosection (abfd, ".note.freebsdcore.vmmap",
10595 note);
10596
3350c5f5 10597 case NT_FREEBSD_PROCSTAT_AUXV:
58e07198 10598 return elfcore_make_auxv_note_section (abfd, note, 4);
3350c5f5 10599
aa1ed4a9
JB
10600 case NT_X86_XSTATE:
10601 if (note->namesz == 8)
10602 return elfcore_grok_xstatereg (abfd, note);
10603 else
10604 return TRUE;
10605
e6f3b9c3
JB
10606 case NT_FREEBSD_PTLWPINFO:
10607 return elfcore_make_note_pseudosection (abfd, ".note.freebsdcore.lwpinfo",
10608 note);
10609
6d5be5d6
JB
10610 case NT_ARM_VFP:
10611 return elfcore_grok_arm_vfp (abfd, note);
10612
aa1ed4a9
JB
10613 default:
10614 return TRUE;
10615 }
10616}
10617
b34976b6 10618static bfd_boolean
217aa764 10619elfcore_netbsd_get_lwpid (Elf_Internal_Note *note, int *lwpidp)
50b2bdb7
AM
10620{
10621 char *cp;
10622
10623 cp = strchr (note->namedata, '@');
10624 if (cp != NULL)
10625 {
d2b64500 10626 *lwpidp = atoi(cp + 1);
b34976b6 10627 return TRUE;
50b2bdb7 10628 }
b34976b6 10629 return FALSE;
50b2bdb7
AM
10630}
10631
b34976b6 10632static bfd_boolean
217aa764 10633elfcore_grok_netbsd_procinfo (bfd *abfd, Elf_Internal_Note *note)
50b2bdb7 10634{
80a04378
NC
10635 if (note->descsz <= 0x7c + 31)
10636 return FALSE;
10637
50b2bdb7 10638 /* Signal number at offset 0x08. */
228e534f 10639 elf_tdata (abfd)->core->signal
50b2bdb7
AM
10640 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x08);
10641
10642 /* Process ID at offset 0x50. */
228e534f 10643 elf_tdata (abfd)->core->pid
50b2bdb7
AM
10644 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x50);
10645
10646 /* Command name at 0x7c (max 32 bytes, including nul). */
228e534f 10647 elf_tdata (abfd)->core->command
50b2bdb7
AM
10648 = _bfd_elfcore_strndup (abfd, note->descdata + 0x7c, 31);
10649
7720ba9f
MK
10650 return elfcore_make_note_pseudosection (abfd, ".note.netbsdcore.procinfo",
10651 note);
50b2bdb7
AM
10652}
10653
b34976b6 10654static bfd_boolean
217aa764 10655elfcore_grok_netbsd_note (bfd *abfd, Elf_Internal_Note *note)
50b2bdb7
AM
10656{
10657 int lwp;
10658
10659 if (elfcore_netbsd_get_lwpid (note, &lwp))
228e534f 10660 elf_tdata (abfd)->core->lwpid = lwp;
50b2bdb7 10661
58e07198 10662 switch (note->type)
50b2bdb7 10663 {
58e07198 10664 case NT_NETBSDCORE_PROCINFO:
50b2bdb7 10665 /* NetBSD-specific core "procinfo". Note that we expect to
08a40648
AM
10666 find this note before any of the others, which is fine,
10667 since the kernel writes this note out first when it
10668 creates a core file. */
50b2bdb7 10669 return elfcore_grok_netbsd_procinfo (abfd, note);
58e07198
CZ
10670#ifdef NT_NETBSDCORE_AUXV
10671 case NT_NETBSDCORE_AUXV:
10672 /* NetBSD-specific Elf Auxiliary Vector data. */
10673 return elfcore_make_auxv_note_section (abfd, note, 4);
10674#endif
10675 default:
10676 break;
50b2bdb7
AM
10677 }
10678
58e07198 10679 /* As of March 2017 there are no other machine-independent notes
b4db1224
JT
10680 defined for NetBSD core files. If the note type is less
10681 than the start of the machine-dependent note types, we don't
10682 understand it. */
47d9a591 10683
b4db1224 10684 if (note->type < NT_NETBSDCORE_FIRSTMACH)
b34976b6 10685 return TRUE;
50b2bdb7
AM
10686
10687
10688 switch (bfd_get_arch (abfd))
10689 {
08a40648
AM
10690 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0 and
10691 PT_GETFPREGS == mach+2. */
50b2bdb7
AM
10692
10693 case bfd_arch_alpha:
10694 case bfd_arch_sparc:
10695 switch (note->type)
08a40648
AM
10696 {
10697 case NT_NETBSDCORE_FIRSTMACH+0:
10698 return elfcore_make_note_pseudosection (abfd, ".reg", note);
50b2bdb7 10699
08a40648
AM
10700 case NT_NETBSDCORE_FIRSTMACH+2:
10701 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
50b2bdb7 10702
08a40648
AM
10703 default:
10704 return TRUE;
10705 }
50b2bdb7 10706
58e07198
CZ
10707 /* On SuperH, PT_GETREGS == mach+3 and PT_GETFPREGS == mach+5.
10708 There's also old PT___GETREGS40 == mach + 1 for old reg
10709 structure which lacks GBR. */
10710
10711 case bfd_arch_sh:
10712 switch (note->type)
10713 {
10714 case NT_NETBSDCORE_FIRSTMACH+3:
10715 return elfcore_make_note_pseudosection (abfd, ".reg", note);
10716
10717 case NT_NETBSDCORE_FIRSTMACH+5:
10718 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
10719
10720 default:
10721 return TRUE;
10722 }
10723
08a40648
AM
10724 /* On all other arch's, PT_GETREGS == mach+1 and
10725 PT_GETFPREGS == mach+3. */
50b2bdb7
AM
10726
10727 default:
10728 switch (note->type)
08a40648
AM
10729 {
10730 case NT_NETBSDCORE_FIRSTMACH+1:
10731 return elfcore_make_note_pseudosection (abfd, ".reg", note);
50b2bdb7 10732
08a40648
AM
10733 case NT_NETBSDCORE_FIRSTMACH+3:
10734 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
50b2bdb7 10735
08a40648
AM
10736 default:
10737 return TRUE;
10738 }
50b2bdb7
AM
10739 }
10740 /* NOTREACHED */
10741}
10742
67cc5033
MK
10743static bfd_boolean
10744elfcore_grok_openbsd_procinfo (bfd *abfd, Elf_Internal_Note *note)
10745{
80a04378
NC
10746 if (note->descsz <= 0x48 + 31)
10747 return FALSE;
10748
67cc5033 10749 /* Signal number at offset 0x08. */
228e534f 10750 elf_tdata (abfd)->core->signal
67cc5033
MK
10751 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x08);
10752
10753 /* Process ID at offset 0x20. */
228e534f 10754 elf_tdata (abfd)->core->pid
67cc5033
MK
10755 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x20);
10756
10757 /* Command name at 0x48 (max 32 bytes, including nul). */
228e534f 10758 elf_tdata (abfd)->core->command
67cc5033
MK
10759 = _bfd_elfcore_strndup (abfd, note->descdata + 0x48, 31);
10760
10761 return TRUE;
10762}
10763
10764static bfd_boolean
10765elfcore_grok_openbsd_note (bfd *abfd, Elf_Internal_Note *note)
10766{
10767 if (note->type == NT_OPENBSD_PROCINFO)
10768 return elfcore_grok_openbsd_procinfo (abfd, note);
10769
10770 if (note->type == NT_OPENBSD_REGS)
10771 return elfcore_make_note_pseudosection (abfd, ".reg", note);
10772
10773 if (note->type == NT_OPENBSD_FPREGS)
10774 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
10775
10776 if (note->type == NT_OPENBSD_XFPREGS)
10777 return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
10778
10779 if (note->type == NT_OPENBSD_AUXV)
58e07198 10780 return elfcore_make_auxv_note_section (abfd, note, 0);
67cc5033
MK
10781
10782 if (note->type == NT_OPENBSD_WCOOKIE)
10783 {
10784 asection *sect = bfd_make_section_anyway_with_flags (abfd, ".wcookie",
10785 SEC_HAS_CONTENTS);
10786
10787 if (sect == NULL)
10788 return FALSE;
10789 sect->size = note->descsz;
10790 sect->filepos = note->descpos;
10791 sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
10792
10793 return TRUE;
10794 }
10795
10796 return TRUE;
10797}
10798
07c6e936 10799static bfd_boolean
d3fd4074 10800elfcore_grok_nto_status (bfd *abfd, Elf_Internal_Note *note, long *tid)
07c6e936
NC
10801{
10802 void *ddata = note->descdata;
10803 char buf[100];
10804 char *name;
10805 asection *sect;
f8843e87
AM
10806 short sig;
10807 unsigned flags;
07c6e936 10808
80a04378
NC
10809 if (note->descsz < 16)
10810 return FALSE;
10811
07c6e936 10812 /* nto_procfs_status 'pid' field is at offset 0. */
228e534f 10813 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, (bfd_byte *) ddata);
07c6e936 10814
f8843e87
AM
10815 /* nto_procfs_status 'tid' field is at offset 4. Pass it back. */
10816 *tid = bfd_get_32 (abfd, (bfd_byte *) ddata + 4);
10817
10818 /* nto_procfs_status 'flags' field is at offset 8. */
10819 flags = bfd_get_32 (abfd, (bfd_byte *) ddata + 8);
07c6e936
NC
10820
10821 /* nto_procfs_status 'what' field is at offset 14. */
f8843e87
AM
10822 if ((sig = bfd_get_16 (abfd, (bfd_byte *) ddata + 14)) > 0)
10823 {
228e534f
AM
10824 elf_tdata (abfd)->core->signal = sig;
10825 elf_tdata (abfd)->core->lwpid = *tid;
f8843e87 10826 }
07c6e936 10827
f8843e87
AM
10828 /* _DEBUG_FLAG_CURTID (current thread) is 0x80. Some cores
10829 do not come from signals so we make sure we set the current
10830 thread just in case. */
10831 if (flags & 0x00000080)
228e534f 10832 elf_tdata (abfd)->core->lwpid = *tid;
07c6e936
NC
10833
10834 /* Make a ".qnx_core_status/%d" section. */
d3fd4074 10835 sprintf (buf, ".qnx_core_status/%ld", *tid);
07c6e936 10836
a50b1753 10837 name = (char *) bfd_alloc (abfd, strlen (buf) + 1);
07c6e936
NC
10838 if (name == NULL)
10839 return FALSE;
10840 strcpy (name, buf);
10841
117ed4f8 10842 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
07c6e936
NC
10843 if (sect == NULL)
10844 return FALSE;
10845
07d6d2b8
AM
10846 sect->size = note->descsz;
10847 sect->filepos = note->descpos;
07c6e936
NC
10848 sect->alignment_power = 2;
10849
10850 return (elfcore_maybe_make_sect (abfd, ".qnx_core_status", sect));
10851}
10852
10853static bfd_boolean
d69f560c
KW
10854elfcore_grok_nto_regs (bfd *abfd,
10855 Elf_Internal_Note *note,
d3fd4074 10856 long tid,
d69f560c 10857 char *base)
07c6e936
NC
10858{
10859 char buf[100];
10860 char *name;
10861 asection *sect;
10862
d69f560c 10863 /* Make a "(base)/%d" section. */
d3fd4074 10864 sprintf (buf, "%s/%ld", base, tid);
07c6e936 10865
a50b1753 10866 name = (char *) bfd_alloc (abfd, strlen (buf) + 1);
07c6e936
NC
10867 if (name == NULL)
10868 return FALSE;
10869 strcpy (name, buf);
10870
117ed4f8 10871 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
07c6e936
NC
10872 if (sect == NULL)
10873 return FALSE;
10874
07d6d2b8
AM
10875 sect->size = note->descsz;
10876 sect->filepos = note->descpos;
07c6e936
NC
10877 sect->alignment_power = 2;
10878
f8843e87 10879 /* This is the current thread. */
228e534f 10880 if (elf_tdata (abfd)->core->lwpid == tid)
d69f560c 10881 return elfcore_maybe_make_sect (abfd, base, sect);
f8843e87
AM
10882
10883 return TRUE;
07c6e936
NC
10884}
10885
10886#define BFD_QNT_CORE_INFO 7
10887#define BFD_QNT_CORE_STATUS 8
10888#define BFD_QNT_CORE_GREG 9
10889#define BFD_QNT_CORE_FPREG 10
10890
10891static bfd_boolean
217aa764 10892elfcore_grok_nto_note (bfd *abfd, Elf_Internal_Note *note)
07c6e936
NC
10893{
10894 /* Every GREG section has a STATUS section before it. Store the
811072d8 10895 tid from the previous call to pass down to the next gregs
07c6e936 10896 function. */
d3fd4074 10897 static long tid = 1;
07c6e936
NC
10898
10899 switch (note->type)
10900 {
d69f560c
KW
10901 case BFD_QNT_CORE_INFO:
10902 return elfcore_make_note_pseudosection (abfd, ".qnx_core_info", note);
10903 case BFD_QNT_CORE_STATUS:
10904 return elfcore_grok_nto_status (abfd, note, &tid);
10905 case BFD_QNT_CORE_GREG:
10906 return elfcore_grok_nto_regs (abfd, note, tid, ".reg");
10907 case BFD_QNT_CORE_FPREG:
10908 return elfcore_grok_nto_regs (abfd, note, tid, ".reg2");
10909 default:
10910 return TRUE;
07c6e936
NC
10911 }
10912}
10913
b15fa79e
AM
10914static bfd_boolean
10915elfcore_grok_spu_note (bfd *abfd, Elf_Internal_Note *note)
10916{
10917 char *name;
10918 asection *sect;
10919 size_t len;
10920
10921 /* Use note name as section name. */
10922 len = note->namesz;
a50b1753 10923 name = (char *) bfd_alloc (abfd, len);
b15fa79e
AM
10924 if (name == NULL)
10925 return FALSE;
10926 memcpy (name, note->namedata, len);
10927 name[len - 1] = '\0';
10928
10929 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
10930 if (sect == NULL)
10931 return FALSE;
10932
07d6d2b8
AM
10933 sect->size = note->descsz;
10934 sect->filepos = note->descpos;
b15fa79e
AM
10935 sect->alignment_power = 1;
10936
10937 return TRUE;
10938}
10939
7c76fa91
MS
10940/* Function: elfcore_write_note
10941
47d9a591 10942 Inputs:
a39f3346 10943 buffer to hold note, and current size of buffer
7c76fa91
MS
10944 name of note
10945 type of note
10946 data for note
10947 size of data for note
10948
a39f3346
AM
10949 Writes note to end of buffer. ELF64 notes are written exactly as
10950 for ELF32, despite the current (as of 2006) ELF gabi specifying
10951 that they ought to have 8-byte namesz and descsz field, and have
10952 8-byte alignment. Other writers, eg. Linux kernel, do the same.
10953
7c76fa91 10954 Return:
a39f3346 10955 Pointer to realloc'd buffer, *BUFSIZ updated. */
7c76fa91
MS
10956
10957char *
a39f3346 10958elfcore_write_note (bfd *abfd,
217aa764 10959 char *buf,
a39f3346 10960 int *bufsiz,
217aa764 10961 const char *name,
a39f3346 10962 int type,
217aa764 10963 const void *input,
a39f3346 10964 int size)
7c76fa91
MS
10965{
10966 Elf_External_Note *xnp;
d4c88bbb 10967 size_t namesz;
d4c88bbb 10968 size_t newspace;
a39f3346 10969 char *dest;
7c76fa91 10970
d4c88bbb 10971 namesz = 0;
d4c88bbb 10972 if (name != NULL)
a39f3346 10973 namesz = strlen (name) + 1;
d4c88bbb 10974
a39f3346 10975 newspace = 12 + ((namesz + 3) & -4) + ((size + 3) & -4);
d4c88bbb 10976
a50b1753 10977 buf = (char *) realloc (buf, *bufsiz + newspace);
14b1c01e
AM
10978 if (buf == NULL)
10979 return buf;
a39f3346 10980 dest = buf + *bufsiz;
7c76fa91
MS
10981 *bufsiz += newspace;
10982 xnp = (Elf_External_Note *) dest;
10983 H_PUT_32 (abfd, namesz, xnp->namesz);
10984 H_PUT_32 (abfd, size, xnp->descsz);
10985 H_PUT_32 (abfd, type, xnp->type);
d4c88bbb
AM
10986 dest = xnp->name;
10987 if (name != NULL)
10988 {
10989 memcpy (dest, name, namesz);
10990 dest += namesz;
a39f3346 10991 while (namesz & 3)
d4c88bbb
AM
10992 {
10993 *dest++ = '\0';
a39f3346 10994 ++namesz;
d4c88bbb
AM
10995 }
10996 }
10997 memcpy (dest, input, size);
a39f3346
AM
10998 dest += size;
10999 while (size & 3)
11000 {
11001 *dest++ = '\0';
11002 ++size;
11003 }
11004 return buf;
7c76fa91
MS
11005}
11006
602f1657
AM
11007/* gcc-8 warns (*) on all the strncpy calls in this function about
11008 possible string truncation. The "truncation" is not a bug. We
11009 have an external representation of structs with fields that are not
11010 necessarily NULL terminated and corresponding internal
11011 representation fields that are one larger so that they can always
11012 be NULL terminated.
11013 gcc versions between 4.2 and 4.6 do not allow pragma control of
11014 diagnostics inside functions, giving a hard error if you try to use
11015 the finer control available with later versions.
11016 gcc prior to 4.2 warns about diagnostic push and pop.
11017 gcc-5, gcc-6 and gcc-7 warn that -Wstringop-truncation is unknown,
11018 unless you also add #pragma GCC diagnostic ignored "-Wpragma".
11019 (*) Depending on your system header files! */
d99b4b92 11020#if GCC_VERSION >= 8000
602f1657
AM
11021# pragma GCC diagnostic push
11022# pragma GCC diagnostic ignored "-Wstringop-truncation"
d99b4b92 11023#endif
7c76fa91 11024char *
217aa764
AM
11025elfcore_write_prpsinfo (bfd *abfd,
11026 char *buf,
11027 int *bufsiz,
11028 const char *fname,
11029 const char *psargs)
7c76fa91 11030{
183e98be
AM
11031 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
11032
11033 if (bed->elf_backend_write_core_note != NULL)
11034 {
11035 char *ret;
11036 ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
11037 NT_PRPSINFO, fname, psargs);
11038 if (ret != NULL)
11039 return ret;
11040 }
7c76fa91 11041
1f20dca5 11042#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
602f1657 11043# if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
183e98be
AM
11044 if (bed->s->elfclass == ELFCLASS32)
11045 {
602f1657 11046# if defined (HAVE_PSINFO32_T)
183e98be
AM
11047 psinfo32_t data;
11048 int note_type = NT_PSINFO;
602f1657 11049# else
183e98be
AM
11050 prpsinfo32_t data;
11051 int note_type = NT_PRPSINFO;
602f1657 11052# endif
183e98be
AM
11053
11054 memset (&data, 0, sizeof (data));
11055 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
11056 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
11057 return elfcore_write_note (abfd, buf, bufsiz,
1f20dca5 11058 "CORE", note_type, &data, sizeof (data));
183e98be
AM
11059 }
11060 else
602f1657 11061# endif
183e98be 11062 {
602f1657 11063# if defined (HAVE_PSINFO_T)
183e98be
AM
11064 psinfo_t data;
11065 int note_type = NT_PSINFO;
602f1657 11066# else
183e98be
AM
11067 prpsinfo_t data;
11068 int note_type = NT_PRPSINFO;
602f1657 11069# endif
7c76fa91 11070
183e98be
AM
11071 memset (&data, 0, sizeof (data));
11072 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
11073 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
11074 return elfcore_write_note (abfd, buf, bufsiz,
1f20dca5 11075 "CORE", note_type, &data, sizeof (data));
183e98be 11076 }
7c76fa91
MS
11077#endif /* PSINFO_T or PRPSINFO_T */
11078
1f20dca5
UW
11079 free (buf);
11080 return NULL;
11081}
d99b4b92 11082#if GCC_VERSION >= 8000
602f1657 11083# pragma GCC diagnostic pop
d99b4b92 11084#endif
1f20dca5 11085
70a38d42
SDJ
11086char *
11087elfcore_write_linux_prpsinfo32
11088 (bfd *abfd, char *buf, int *bufsiz,
11089 const struct elf_internal_linux_prpsinfo *prpsinfo)
11090{
a2f63b2e
MR
11091 if (get_elf_backend_data (abfd)->linux_prpsinfo32_ugid16)
11092 {
11093 struct elf_external_linux_prpsinfo32_ugid16 data;
11094
11095 swap_linux_prpsinfo32_ugid16_out (abfd, prpsinfo, &data);
11096 return elfcore_write_note (abfd, buf, bufsiz, "CORE", NT_PRPSINFO,
11097 &data, sizeof (data));
11098 }
11099 else
11100 {
11101 struct elf_external_linux_prpsinfo32_ugid32 data;
70a38d42 11102
a2f63b2e
MR
11103 swap_linux_prpsinfo32_ugid32_out (abfd, prpsinfo, &data);
11104 return elfcore_write_note (abfd, buf, bufsiz, "CORE", NT_PRPSINFO,
11105 &data, sizeof (data));
11106 }
70a38d42
SDJ
11107}
11108
11109char *
11110elfcore_write_linux_prpsinfo64
11111 (bfd *abfd, char *buf, int *bufsiz,
11112 const struct elf_internal_linux_prpsinfo *prpsinfo)
11113{
3c9a7b0d
MR
11114 if (get_elf_backend_data (abfd)->linux_prpsinfo64_ugid16)
11115 {
11116 struct elf_external_linux_prpsinfo64_ugid16 data;
11117
11118 swap_linux_prpsinfo64_ugid16_out (abfd, prpsinfo, &data);
11119 return elfcore_write_note (abfd, buf, bufsiz,
11120 "CORE", NT_PRPSINFO, &data, sizeof (data));
11121 }
11122 else
11123 {
11124 struct elf_external_linux_prpsinfo64_ugid32 data;
70a38d42 11125
3c9a7b0d
MR
11126 swap_linux_prpsinfo64_ugid32_out (abfd, prpsinfo, &data);
11127 return elfcore_write_note (abfd, buf, bufsiz,
11128 "CORE", NT_PRPSINFO, &data, sizeof (data));
11129 }
70a38d42
SDJ
11130}
11131
7c76fa91 11132char *
217aa764
AM
11133elfcore_write_prstatus (bfd *abfd,
11134 char *buf,
11135 int *bufsiz,
11136 long pid,
11137 int cursig,
11138 const void *gregs)
7c76fa91 11139{
183e98be 11140 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7c76fa91 11141
183e98be
AM
11142 if (bed->elf_backend_write_core_note != NULL)
11143 {
11144 char *ret;
11145 ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
11146 NT_PRSTATUS,
11147 pid, cursig, gregs);
11148 if (ret != NULL)
11149 return ret;
11150 }
11151
1f20dca5 11152#if defined (HAVE_PRSTATUS_T)
183e98be
AM
11153#if defined (HAVE_PRSTATUS32_T)
11154 if (bed->s->elfclass == ELFCLASS32)
11155 {
11156 prstatus32_t prstat;
11157
11158 memset (&prstat, 0, sizeof (prstat));
11159 prstat.pr_pid = pid;
11160 prstat.pr_cursig = cursig;
11161 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
1f20dca5 11162 return elfcore_write_note (abfd, buf, bufsiz, "CORE",
183e98be
AM
11163 NT_PRSTATUS, &prstat, sizeof (prstat));
11164 }
11165 else
11166#endif
11167 {
11168 prstatus_t prstat;
11169
11170 memset (&prstat, 0, sizeof (prstat));
11171 prstat.pr_pid = pid;
11172 prstat.pr_cursig = cursig;
11173 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
1f20dca5 11174 return elfcore_write_note (abfd, buf, bufsiz, "CORE",
183e98be
AM
11175 NT_PRSTATUS, &prstat, sizeof (prstat));
11176 }
7c76fa91
MS
11177#endif /* HAVE_PRSTATUS_T */
11178
1f20dca5
UW
11179 free (buf);
11180 return NULL;
11181}
11182
51316059
MS
11183#if defined (HAVE_LWPSTATUS_T)
11184char *
217aa764
AM
11185elfcore_write_lwpstatus (bfd *abfd,
11186 char *buf,
11187 int *bufsiz,
11188 long pid,
11189 int cursig,
11190 const void *gregs)
51316059
MS
11191{
11192 lwpstatus_t lwpstat;
183e98be 11193 const char *note_name = "CORE";
51316059
MS
11194
11195 memset (&lwpstat, 0, sizeof (lwpstat));
11196 lwpstat.pr_lwpid = pid >> 16;
11197 lwpstat.pr_cursig = cursig;
11198#if defined (HAVE_LWPSTATUS_T_PR_REG)
d1e8523e 11199 memcpy (&lwpstat.pr_reg, gregs, sizeof (lwpstat.pr_reg));
51316059
MS
11200#elif defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
11201#if !defined(gregs)
11202 memcpy (lwpstat.pr_context.uc_mcontext.gregs,
11203 gregs, sizeof (lwpstat.pr_context.uc_mcontext.gregs));
11204#else
11205 memcpy (lwpstat.pr_context.uc_mcontext.__gregs,
11206 gregs, sizeof (lwpstat.pr_context.uc_mcontext.__gregs));
11207#endif
11208#endif
47d9a591 11209 return elfcore_write_note (abfd, buf, bufsiz, note_name,
51316059
MS
11210 NT_LWPSTATUS, &lwpstat, sizeof (lwpstat));
11211}
11212#endif /* HAVE_LWPSTATUS_T */
11213
7c76fa91
MS
11214#if defined (HAVE_PSTATUS_T)
11215char *
217aa764
AM
11216elfcore_write_pstatus (bfd *abfd,
11217 char *buf,
11218 int *bufsiz,
11219 long pid,
6c10990d
NC
11220 int cursig ATTRIBUTE_UNUSED,
11221 const void *gregs ATTRIBUTE_UNUSED)
7c76fa91 11222{
183e98be
AM
11223 const char *note_name = "CORE";
11224#if defined (HAVE_PSTATUS32_T)
11225 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7c76fa91 11226
183e98be
AM
11227 if (bed->s->elfclass == ELFCLASS32)
11228 {
11229 pstatus32_t pstat;
11230
11231 memset (&pstat, 0, sizeof (pstat));
11232 pstat.pr_pid = pid & 0xffff;
11233 buf = elfcore_write_note (abfd, buf, bufsiz, note_name,
11234 NT_PSTATUS, &pstat, sizeof (pstat));
11235 return buf;
11236 }
11237 else
11238#endif
11239 {
11240 pstatus_t pstat;
11241
11242 memset (&pstat, 0, sizeof (pstat));
11243 pstat.pr_pid = pid & 0xffff;
11244 buf = elfcore_write_note (abfd, buf, bufsiz, note_name,
11245 NT_PSTATUS, &pstat, sizeof (pstat));
11246 return buf;
11247 }
7c76fa91
MS
11248}
11249#endif /* HAVE_PSTATUS_T */
11250
11251char *
217aa764
AM
11252elfcore_write_prfpreg (bfd *abfd,
11253 char *buf,
11254 int *bufsiz,
11255 const void *fpregs,
11256 int size)
7c76fa91 11257{
183e98be 11258 const char *note_name = "CORE";
47d9a591 11259 return elfcore_write_note (abfd, buf, bufsiz,
7c76fa91
MS
11260 note_name, NT_FPREGSET, fpregs, size);
11261}
11262
11263char *
217aa764
AM
11264elfcore_write_prxfpreg (bfd *abfd,
11265 char *buf,
11266 int *bufsiz,
11267 const void *xfpregs,
11268 int size)
7c76fa91
MS
11269{
11270 char *note_name = "LINUX";
47d9a591 11271 return elfcore_write_note (abfd, buf, bufsiz,
7c76fa91
MS
11272 note_name, NT_PRXFPREG, xfpregs, size);
11273}
11274
4339cae0
L
11275char *
11276elfcore_write_xstatereg (bfd *abfd, char *buf, int *bufsiz,
11277 const void *xfpregs, int size)
11278{
97de3545
JB
11279 char *note_name;
11280 if (get_elf_backend_data (abfd)->elf_osabi == ELFOSABI_FREEBSD)
11281 note_name = "FreeBSD";
11282 else
11283 note_name = "LINUX";
4339cae0
L
11284 return elfcore_write_note (abfd, buf, bufsiz,
11285 note_name, NT_X86_XSTATE, xfpregs, size);
11286}
11287
97753bd5
AM
11288char *
11289elfcore_write_ppc_vmx (bfd *abfd,
11290 char *buf,
11291 int *bufsiz,
11292 const void *ppc_vmx,
11293 int size)
11294{
11295 char *note_name = "LINUX";
11296 return elfcore_write_note (abfd, buf, bufsiz,
11297 note_name, NT_PPC_VMX, ppc_vmx, size);
11298}
11299
89eeb0bc
LM
11300char *
11301elfcore_write_ppc_vsx (bfd *abfd,
07d6d2b8
AM
11302 char *buf,
11303 int *bufsiz,
11304 const void *ppc_vsx,
11305 int size)
89eeb0bc
LM
11306{
11307 char *note_name = "LINUX";
11308 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11309 note_name, NT_PPC_VSX, ppc_vsx, size);
89eeb0bc
LM
11310}
11311
cb2366c1
EBM
11312char *
11313elfcore_write_ppc_tar (bfd *abfd,
4b24dd1a
AM
11314 char *buf,
11315 int *bufsiz,
11316 const void *ppc_tar,
11317 int size)
cb2366c1
EBM
11318{
11319 char *note_name = "LINUX";
11320 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11321 note_name, NT_PPC_TAR, ppc_tar, size);
cb2366c1
EBM
11322}
11323
11324char *
11325elfcore_write_ppc_ppr (bfd *abfd,
4b24dd1a
AM
11326 char *buf,
11327 int *bufsiz,
11328 const void *ppc_ppr,
11329 int size)
cb2366c1
EBM
11330{
11331 char *note_name = "LINUX";
11332 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11333 note_name, NT_PPC_PPR, ppc_ppr, size);
cb2366c1
EBM
11334}
11335
11336char *
11337elfcore_write_ppc_dscr (bfd *abfd,
4b24dd1a
AM
11338 char *buf,
11339 int *bufsiz,
11340 const void *ppc_dscr,
11341 int size)
cb2366c1
EBM
11342{
11343 char *note_name = "LINUX";
11344 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11345 note_name, NT_PPC_DSCR, ppc_dscr, size);
cb2366c1
EBM
11346}
11347
11348char *
11349elfcore_write_ppc_ebb (bfd *abfd,
4b24dd1a
AM
11350 char *buf,
11351 int *bufsiz,
11352 const void *ppc_ebb,
11353 int size)
cb2366c1
EBM
11354{
11355 char *note_name = "LINUX";
11356 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11357 note_name, NT_PPC_EBB, ppc_ebb, size);
cb2366c1
EBM
11358}
11359
11360char *
11361elfcore_write_ppc_pmu (bfd *abfd,
4b24dd1a
AM
11362 char *buf,
11363 int *bufsiz,
11364 const void *ppc_pmu,
11365 int size)
cb2366c1
EBM
11366{
11367 char *note_name = "LINUX";
11368 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11369 note_name, NT_PPC_PMU, ppc_pmu, size);
cb2366c1
EBM
11370}
11371
11372char *
11373elfcore_write_ppc_tm_cgpr (bfd *abfd,
4b24dd1a
AM
11374 char *buf,
11375 int *bufsiz,
11376 const void *ppc_tm_cgpr,
11377 int size)
cb2366c1
EBM
11378{
11379 char *note_name = "LINUX";
11380 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11381 note_name, NT_PPC_TM_CGPR, ppc_tm_cgpr, size);
cb2366c1
EBM
11382}
11383
11384char *
11385elfcore_write_ppc_tm_cfpr (bfd *abfd,
4b24dd1a
AM
11386 char *buf,
11387 int *bufsiz,
11388 const void *ppc_tm_cfpr,
11389 int size)
cb2366c1
EBM
11390{
11391 char *note_name = "LINUX";
11392 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11393 note_name, NT_PPC_TM_CFPR, ppc_tm_cfpr, size);
cb2366c1
EBM
11394}
11395
11396char *
11397elfcore_write_ppc_tm_cvmx (bfd *abfd,
4b24dd1a
AM
11398 char *buf,
11399 int *bufsiz,
11400 const void *ppc_tm_cvmx,
11401 int size)
cb2366c1
EBM
11402{
11403 char *note_name = "LINUX";
11404 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11405 note_name, NT_PPC_TM_CVMX, ppc_tm_cvmx, size);
cb2366c1
EBM
11406}
11407
11408char *
11409elfcore_write_ppc_tm_cvsx (bfd *abfd,
4b24dd1a
AM
11410 char *buf,
11411 int *bufsiz,
11412 const void *ppc_tm_cvsx,
11413 int size)
cb2366c1
EBM
11414{
11415 char *note_name = "LINUX";
11416 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11417 note_name, NT_PPC_TM_CVSX, ppc_tm_cvsx, size);
cb2366c1
EBM
11418}
11419
11420char *
11421elfcore_write_ppc_tm_spr (bfd *abfd,
4b24dd1a
AM
11422 char *buf,
11423 int *bufsiz,
11424 const void *ppc_tm_spr,
11425 int size)
cb2366c1
EBM
11426{
11427 char *note_name = "LINUX";
11428 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11429 note_name, NT_PPC_TM_SPR, ppc_tm_spr, size);
cb2366c1
EBM
11430}
11431
11432char *
11433elfcore_write_ppc_tm_ctar (bfd *abfd,
4b24dd1a
AM
11434 char *buf,
11435 int *bufsiz,
11436 const void *ppc_tm_ctar,
11437 int size)
cb2366c1
EBM
11438{
11439 char *note_name = "LINUX";
11440 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11441 note_name, NT_PPC_TM_CTAR, ppc_tm_ctar, size);
cb2366c1
EBM
11442}
11443
11444char *
11445elfcore_write_ppc_tm_cppr (bfd *abfd,
4b24dd1a
AM
11446 char *buf,
11447 int *bufsiz,
11448 const void *ppc_tm_cppr,
11449 int size)
cb2366c1
EBM
11450{
11451 char *note_name = "LINUX";
11452 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11453 note_name, NT_PPC_TM_CPPR, ppc_tm_cppr, size);
cb2366c1
EBM
11454}
11455
11456char *
11457elfcore_write_ppc_tm_cdscr (bfd *abfd,
4b24dd1a
AM
11458 char *buf,
11459 int *bufsiz,
11460 const void *ppc_tm_cdscr,
11461 int size)
cb2366c1
EBM
11462{
11463 char *note_name = "LINUX";
11464 return elfcore_write_note (abfd, buf, bufsiz,
4b24dd1a 11465 note_name, NT_PPC_TM_CDSCR, ppc_tm_cdscr, size);
cb2366c1
EBM
11466}
11467
0675e188
UW
11468static char *
11469elfcore_write_s390_high_gprs (bfd *abfd,
11470 char *buf,
11471 int *bufsiz,
11472 const void *s390_high_gprs,
11473 int size)
11474{
11475 char *note_name = "LINUX";
11476 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11477 note_name, NT_S390_HIGH_GPRS,
0675e188
UW
11478 s390_high_gprs, size);
11479}
11480
d7eeb400
MS
11481char *
11482elfcore_write_s390_timer (bfd *abfd,
07d6d2b8
AM
11483 char *buf,
11484 int *bufsiz,
11485 const void *s390_timer,
11486 int size)
d7eeb400
MS
11487{
11488 char *note_name = "LINUX";
11489 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11490 note_name, NT_S390_TIMER, s390_timer, size);
d7eeb400
MS
11491}
11492
11493char *
11494elfcore_write_s390_todcmp (bfd *abfd,
07d6d2b8
AM
11495 char *buf,
11496 int *bufsiz,
11497 const void *s390_todcmp,
11498 int size)
d7eeb400
MS
11499{
11500 char *note_name = "LINUX";
11501 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11502 note_name, NT_S390_TODCMP, s390_todcmp, size);
d7eeb400
MS
11503}
11504
11505char *
11506elfcore_write_s390_todpreg (bfd *abfd,
07d6d2b8
AM
11507 char *buf,
11508 int *bufsiz,
11509 const void *s390_todpreg,
11510 int size)
d7eeb400
MS
11511{
11512 char *note_name = "LINUX";
11513 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11514 note_name, NT_S390_TODPREG, s390_todpreg, size);
d7eeb400
MS
11515}
11516
11517char *
11518elfcore_write_s390_ctrs (bfd *abfd,
07d6d2b8
AM
11519 char *buf,
11520 int *bufsiz,
11521 const void *s390_ctrs,
11522 int size)
d7eeb400
MS
11523{
11524 char *note_name = "LINUX";
11525 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11526 note_name, NT_S390_CTRS, s390_ctrs, size);
d7eeb400
MS
11527}
11528
11529char *
11530elfcore_write_s390_prefix (bfd *abfd,
07d6d2b8
AM
11531 char *buf,
11532 int *bufsiz,
11533 const void *s390_prefix,
11534 int size)
d7eeb400
MS
11535{
11536 char *note_name = "LINUX";
11537 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11538 note_name, NT_S390_PREFIX, s390_prefix, size);
d7eeb400
MS
11539}
11540
355b81d9
UW
11541char *
11542elfcore_write_s390_last_break (bfd *abfd,
11543 char *buf,
11544 int *bufsiz,
11545 const void *s390_last_break,
11546 int size)
11547{
11548 char *note_name = "LINUX";
11549 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11550 note_name, NT_S390_LAST_BREAK,
355b81d9
UW
11551 s390_last_break, size);
11552}
11553
11554char *
11555elfcore_write_s390_system_call (bfd *abfd,
11556 char *buf,
11557 int *bufsiz,
11558 const void *s390_system_call,
11559 int size)
11560{
11561 char *note_name = "LINUX";
11562 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11563 note_name, NT_S390_SYSTEM_CALL,
355b81d9
UW
11564 s390_system_call, size);
11565}
11566
abb3f6cc
NC
11567char *
11568elfcore_write_s390_tdb (bfd *abfd,
11569 char *buf,
11570 int *bufsiz,
11571 const void *s390_tdb,
11572 int size)
11573{
11574 char *note_name = "LINUX";
11575 return elfcore_write_note (abfd, buf, bufsiz,
07d6d2b8 11576 note_name, NT_S390_TDB, s390_tdb, size);
abb3f6cc
NC
11577}
11578
4ef9f41a
AA
11579char *
11580elfcore_write_s390_vxrs_low (bfd *abfd,
11581 char *buf,
11582 int *bufsiz,
11583 const void *s390_vxrs_low,
11584 int size)
11585{
11586 char *note_name = "LINUX";
11587 return elfcore_write_note (abfd, buf, bufsiz,
11588 note_name, NT_S390_VXRS_LOW, s390_vxrs_low, size);
11589}
11590
11591char *
11592elfcore_write_s390_vxrs_high (bfd *abfd,
11593 char *buf,
11594 int *bufsiz,
11595 const void *s390_vxrs_high,
11596 int size)
11597{
11598 char *note_name = "LINUX";
11599 return elfcore_write_note (abfd, buf, bufsiz,
11600 note_name, NT_S390_VXRS_HIGH,
11601 s390_vxrs_high, size);
11602}
11603
88ab90e8
AA
11604char *
11605elfcore_write_s390_gs_cb (bfd *abfd,
11606 char *buf,
11607 int *bufsiz,
11608 const void *s390_gs_cb,
11609 int size)
11610{
11611 char *note_name = "LINUX";
11612 return elfcore_write_note (abfd, buf, bufsiz,
11613 note_name, NT_S390_GS_CB,
11614 s390_gs_cb, size);
11615}
11616
11617char *
11618elfcore_write_s390_gs_bc (bfd *abfd,
11619 char *buf,
11620 int *bufsiz,
11621 const void *s390_gs_bc,
11622 int size)
11623{
11624 char *note_name = "LINUX";
11625 return elfcore_write_note (abfd, buf, bufsiz,
11626 note_name, NT_S390_GS_BC,
11627 s390_gs_bc, size);
11628}
11629
faa9a424
UW
11630char *
11631elfcore_write_arm_vfp (bfd *abfd,
11632 char *buf,
11633 int *bufsiz,
11634 const void *arm_vfp,
11635 int size)
11636{
11637 char *note_name = "LINUX";
11638 return elfcore_write_note (abfd, buf, bufsiz,
11639 note_name, NT_ARM_VFP, arm_vfp, size);
11640}
11641
652451f8
YZ
11642char *
11643elfcore_write_aarch_tls (bfd *abfd,
11644 char *buf,
11645 int *bufsiz,
11646 const void *aarch_tls,
11647 int size)
11648{
11649 char *note_name = "LINUX";
11650 return elfcore_write_note (abfd, buf, bufsiz,
11651 note_name, NT_ARM_TLS, aarch_tls, size);
11652}
11653
11654char *
11655elfcore_write_aarch_hw_break (bfd *abfd,
11656 char *buf,
11657 int *bufsiz,
11658 const void *aarch_hw_break,
11659 int size)
11660{
11661 char *note_name = "LINUX";
11662 return elfcore_write_note (abfd, buf, bufsiz,
11663 note_name, NT_ARM_HW_BREAK, aarch_hw_break, size);
11664}
11665
11666char *
11667elfcore_write_aarch_hw_watch (bfd *abfd,
11668 char *buf,
11669 int *bufsiz,
11670 const void *aarch_hw_watch,
11671 int size)
11672{
11673 char *note_name = "LINUX";
11674 return elfcore_write_note (abfd, buf, bufsiz,
11675 note_name, NT_ARM_HW_WATCH, aarch_hw_watch, size);
11676}
11677
ad1cc4e4
AH
11678char *
11679elfcore_write_aarch_sve (bfd *abfd,
11680 char *buf,
11681 int *bufsiz,
11682 const void *aarch_sve,
11683 int size)
11684{
11685 char *note_name = "LINUX";
11686 return elfcore_write_note (abfd, buf, bufsiz,
11687 note_name, NT_ARM_SVE, aarch_sve, size);
11688}
11689
e6c3b5bf
AH
11690char *
11691elfcore_write_aarch_pauth (bfd *abfd,
11692 char *buf,
11693 int *bufsiz,
11694 const void *aarch_pauth,
11695 int size)
11696{
11697 char *note_name = "LINUX";
11698 return elfcore_write_note (abfd, buf, bufsiz,
11699 note_name, NT_ARM_PAC_MASK, aarch_pauth, size);
11700}
11701
bb864ac1
CES
11702char *
11703elfcore_write_register_note (bfd *abfd,
11704 char *buf,
11705 int *bufsiz,
11706 const char *section,
11707 const void *data,
11708 int size)
11709{
11710 if (strcmp (section, ".reg2") == 0)
11711 return elfcore_write_prfpreg (abfd, buf, bufsiz, data, size);
11712 if (strcmp (section, ".reg-xfp") == 0)
11713 return elfcore_write_prxfpreg (abfd, buf, bufsiz, data, size);
4339cae0
L
11714 if (strcmp (section, ".reg-xstate") == 0)
11715 return elfcore_write_xstatereg (abfd, buf, bufsiz, data, size);
bb864ac1
CES
11716 if (strcmp (section, ".reg-ppc-vmx") == 0)
11717 return elfcore_write_ppc_vmx (abfd, buf, bufsiz, data, size);
89eeb0bc
LM
11718 if (strcmp (section, ".reg-ppc-vsx") == 0)
11719 return elfcore_write_ppc_vsx (abfd, buf, bufsiz, data, size);
cb2366c1
EBM
11720 if (strcmp (section, ".reg-ppc-tar") == 0)
11721 return elfcore_write_ppc_tar (abfd, buf, bufsiz, data, size);
11722 if (strcmp (section, ".reg-ppc-ppr") == 0)
11723 return elfcore_write_ppc_ppr (abfd, buf, bufsiz, data, size);
11724 if (strcmp (section, ".reg-ppc-dscr") == 0)
11725 return elfcore_write_ppc_dscr (abfd, buf, bufsiz, data, size);
11726 if (strcmp (section, ".reg-ppc-ebb") == 0)
11727 return elfcore_write_ppc_ebb (abfd, buf, bufsiz, data, size);
11728 if (strcmp (section, ".reg-ppc-pmu") == 0)
11729 return elfcore_write_ppc_pmu (abfd, buf, bufsiz, data, size);
11730 if (strcmp (section, ".reg-ppc-tm-cgpr") == 0)
11731 return elfcore_write_ppc_tm_cgpr (abfd, buf, bufsiz, data, size);
11732 if (strcmp (section, ".reg-ppc-tm-cfpr") == 0)
11733 return elfcore_write_ppc_tm_cfpr (abfd, buf, bufsiz, data, size);
11734 if (strcmp (section, ".reg-ppc-tm-cvmx") == 0)
11735 return elfcore_write_ppc_tm_cvmx (abfd, buf, bufsiz, data, size);
11736 if (strcmp (section, ".reg-ppc-tm-cvsx") == 0)
11737 return elfcore_write_ppc_tm_cvsx (abfd, buf, bufsiz, data, size);
11738 if (strcmp (section, ".reg-ppc-tm-spr") == 0)
11739 return elfcore_write_ppc_tm_spr (abfd, buf, bufsiz, data, size);
11740 if (strcmp (section, ".reg-ppc-tm-ctar") == 0)
11741 return elfcore_write_ppc_tm_ctar (abfd, buf, bufsiz, data, size);
11742 if (strcmp (section, ".reg-ppc-tm-cppr") == 0)
11743 return elfcore_write_ppc_tm_cppr (abfd, buf, bufsiz, data, size);
11744 if (strcmp (section, ".reg-ppc-tm-cdscr") == 0)
11745 return elfcore_write_ppc_tm_cdscr (abfd, buf, bufsiz, data, size);
0675e188
UW
11746 if (strcmp (section, ".reg-s390-high-gprs") == 0)
11747 return elfcore_write_s390_high_gprs (abfd, buf, bufsiz, data, size);
d7eeb400
MS
11748 if (strcmp (section, ".reg-s390-timer") == 0)
11749 return elfcore_write_s390_timer (abfd, buf, bufsiz, data, size);
11750 if (strcmp (section, ".reg-s390-todcmp") == 0)
11751 return elfcore_write_s390_todcmp (abfd, buf, bufsiz, data, size);
11752 if (strcmp (section, ".reg-s390-todpreg") == 0)
11753 return elfcore_write_s390_todpreg (abfd, buf, bufsiz, data, size);
11754 if (strcmp (section, ".reg-s390-ctrs") == 0)
11755 return elfcore_write_s390_ctrs (abfd, buf, bufsiz, data, size);
11756 if (strcmp (section, ".reg-s390-prefix") == 0)
11757 return elfcore_write_s390_prefix (abfd, buf, bufsiz, data, size);
355b81d9
UW
11758 if (strcmp (section, ".reg-s390-last-break") == 0)
11759 return elfcore_write_s390_last_break (abfd, buf, bufsiz, data, size);
11760 if (strcmp (section, ".reg-s390-system-call") == 0)
11761 return elfcore_write_s390_system_call (abfd, buf, bufsiz, data, size);
abb3f6cc
NC
11762 if (strcmp (section, ".reg-s390-tdb") == 0)
11763 return elfcore_write_s390_tdb (abfd, buf, bufsiz, data, size);
4ef9f41a
AA
11764 if (strcmp (section, ".reg-s390-vxrs-low") == 0)
11765 return elfcore_write_s390_vxrs_low (abfd, buf, bufsiz, data, size);
11766 if (strcmp (section, ".reg-s390-vxrs-high") == 0)
11767 return elfcore_write_s390_vxrs_high (abfd, buf, bufsiz, data, size);
88ab90e8
AA
11768 if (strcmp (section, ".reg-s390-gs-cb") == 0)
11769 return elfcore_write_s390_gs_cb (abfd, buf, bufsiz, data, size);
11770 if (strcmp (section, ".reg-s390-gs-bc") == 0)
11771 return elfcore_write_s390_gs_bc (abfd, buf, bufsiz, data, size);
faa9a424
UW
11772 if (strcmp (section, ".reg-arm-vfp") == 0)
11773 return elfcore_write_arm_vfp (abfd, buf, bufsiz, data, size);
652451f8
YZ
11774 if (strcmp (section, ".reg-aarch-tls") == 0)
11775 return elfcore_write_aarch_tls (abfd, buf, bufsiz, data, size);
11776 if (strcmp (section, ".reg-aarch-hw-break") == 0)
11777 return elfcore_write_aarch_hw_break (abfd, buf, bufsiz, data, size);
11778 if (strcmp (section, ".reg-aarch-hw-watch") == 0)
11779 return elfcore_write_aarch_hw_watch (abfd, buf, bufsiz, data, size);
ad1cc4e4
AH
11780 if (strcmp (section, ".reg-aarch-sve") == 0)
11781 return elfcore_write_aarch_sve (abfd, buf, bufsiz, data, size);
e6c3b5bf
AH
11782 if (strcmp (section, ".reg-aarch-pauth") == 0)
11783 return elfcore_write_aarch_pauth (abfd, buf, bufsiz, data, size);
bb864ac1
CES
11784 return NULL;
11785}
11786
b34976b6 11787static bfd_boolean
276da9b3
L
11788elf_parse_notes (bfd *abfd, char *buf, size_t size, file_ptr offset,
11789 size_t align)
252b5132 11790{
c044fabd 11791 char *p;
252b5132 11792
276da9b3
L
11793 /* NB: CORE PT_NOTE segments may have p_align values of 0 or 1.
11794 gABI specifies that PT_NOTE alignment should be aligned to 4
11795 bytes for 32-bit objects and to 8 bytes for 64-bit objects. If
11796 align is less than 4, we use 4 byte alignment. */
11797 if (align < 4)
11798 align = 4;
ef135d43
NC
11799 if (align != 4 && align != 8)
11800 return FALSE;
276da9b3 11801
252b5132
RH
11802 p = buf;
11803 while (p < buf + size)
11804 {
c044fabd 11805 Elf_External_Note *xnp = (Elf_External_Note *) p;
252b5132
RH
11806 Elf_Internal_Note in;
11807
baea7ef1
AM
11808 if (offsetof (Elf_External_Note, name) > buf - p + size)
11809 return FALSE;
11810
dc810e39 11811 in.type = H_GET_32 (abfd, xnp->type);
252b5132 11812
dc810e39 11813 in.namesz = H_GET_32 (abfd, xnp->namesz);
252b5132 11814 in.namedata = xnp->name;
baea7ef1
AM
11815 if (in.namesz > buf - in.namedata + size)
11816 return FALSE;
252b5132 11817
dc810e39 11818 in.descsz = H_GET_32 (abfd, xnp->descsz);
276da9b3 11819 in.descdata = p + ELF_NOTE_DESC_OFFSET (in.namesz, align);
252b5132 11820 in.descpos = offset + (in.descdata - buf);
baea7ef1
AM
11821 if (in.descsz != 0
11822 && (in.descdata >= buf + size
11823 || in.descsz > buf - in.descdata + size))
11824 return FALSE;
252b5132 11825
718175fa 11826 switch (bfd_get_format (abfd))
07d6d2b8 11827 {
718175fa
JK
11828 default:
11829 return TRUE;
11830
11831 case bfd_core:
f64e188b 11832 {
8acbedd6 11833#define GROKER_ELEMENT(S,F) {S, sizeof (S) - 1, F}
f64e188b 11834 struct
718175fa 11835 {
f64e188b 11836 const char * string;
8acbedd6 11837 size_t len;
f64e188b 11838 bfd_boolean (* func)(bfd *, Elf_Internal_Note *);
718175fa 11839 }
f64e188b 11840 grokers[] =
b15fa79e 11841 {
8acbedd6 11842 GROKER_ELEMENT ("", elfcore_grok_note),
aa1ed4a9 11843 GROKER_ELEMENT ("FreeBSD", elfcore_grok_freebsd_note),
8acbedd6
KS
11844 GROKER_ELEMENT ("NetBSD-CORE", elfcore_grok_netbsd_note),
11845 GROKER_ELEMENT ( "OpenBSD", elfcore_grok_openbsd_note),
11846 GROKER_ELEMENT ("QNX", elfcore_grok_nto_note),
864619bb
KS
11847 GROKER_ELEMENT ("SPU/", elfcore_grok_spu_note),
11848 GROKER_ELEMENT ("GNU", elfobj_grok_gnu_note)
f64e188b 11849 };
8acbedd6 11850#undef GROKER_ELEMENT
f64e188b
NC
11851 int i;
11852
11853 for (i = ARRAY_SIZE (grokers); i--;)
8acbedd6
KS
11854 {
11855 if (in.namesz >= grokers[i].len
11856 && strncmp (in.namedata, grokers[i].string,
11857 grokers[i].len) == 0)
11858 {
11859 if (! grokers[i].func (abfd, & in))
11860 return FALSE;
11861 break;
11862 }
11863 }
f64e188b
NC
11864 break;
11865 }
718175fa
JK
11866
11867 case bfd_object:
11868 if (in.namesz == sizeof "GNU" && strcmp (in.namedata, "GNU") == 0)
11869 {
11870 if (! elfobj_grok_gnu_note (abfd, &in))
11871 return FALSE;
11872 }
e21e5835
NC
11873 else if (in.namesz == sizeof "stapsdt"
11874 && strcmp (in.namedata, "stapsdt") == 0)
11875 {
11876 if (! elfobj_grok_stapsdt_note (abfd, &in))
11877 return FALSE;
11878 }
718175fa 11879 break;
08a40648 11880 }
252b5132 11881
276da9b3 11882 p += ELF_NOTE_NEXT_OFFSET (in.namesz, in.descsz, align);
252b5132
RH
11883 }
11884
718175fa
JK
11885 return TRUE;
11886}
11887
864619bb 11888bfd_boolean
276da9b3
L
11889elf_read_notes (bfd *abfd, file_ptr offset, bfd_size_type size,
11890 size_t align)
718175fa
JK
11891{
11892 char *buf;
11893
957e1fc1 11894 if (size == 0 || (size + 1) == 0)
718175fa
JK
11895 return TRUE;
11896
11897 if (bfd_seek (abfd, offset, SEEK_SET) != 0)
11898 return FALSE;
11899
f64e188b 11900 buf = (char *) bfd_malloc (size + 1);
718175fa
JK
11901 if (buf == NULL)
11902 return FALSE;
11903
f64e188b
NC
11904 /* PR 17512: file: ec08f814
11905 0-termintate the buffer so that string searches will not overflow. */
11906 buf[size] = 0;
11907
718175fa 11908 if (bfd_bread (buf, size, abfd) != size
276da9b3 11909 || !elf_parse_notes (abfd, buf, size, offset, align))
718175fa
JK
11910 {
11911 free (buf);
11912 return FALSE;
11913 }
11914
252b5132 11915 free (buf);
b34976b6 11916 return TRUE;
252b5132 11917}
98d8431c
JB
11918\f
11919/* Providing external access to the ELF program header table. */
11920
11921/* Return an upper bound on the number of bytes required to store a
11922 copy of ABFD's program header table entries. Return -1 if an error
11923 occurs; bfd_get_error will return an appropriate code. */
c044fabd 11924
98d8431c 11925long
217aa764 11926bfd_get_elf_phdr_upper_bound (bfd *abfd)
98d8431c
JB
11927{
11928 if (abfd->xvec->flavour != bfd_target_elf_flavour)
11929 {
11930 bfd_set_error (bfd_error_wrong_format);
11931 return -1;
11932 }
11933
936e320b 11934 return elf_elfheader (abfd)->e_phnum * sizeof (Elf_Internal_Phdr);
98d8431c
JB
11935}
11936
98d8431c
JB
11937/* Copy ABFD's program header table entries to *PHDRS. The entries
11938 will be stored as an array of Elf_Internal_Phdr structures, as
11939 defined in include/elf/internal.h. To find out how large the
11940 buffer needs to be, call bfd_get_elf_phdr_upper_bound.
11941
11942 Return the number of program header table entries read, or -1 if an
11943 error occurs; bfd_get_error will return an appropriate code. */
c044fabd 11944
98d8431c 11945int
217aa764 11946bfd_get_elf_phdrs (bfd *abfd, void *phdrs)
98d8431c
JB
11947{
11948 int num_phdrs;
11949
11950 if (abfd->xvec->flavour != bfd_target_elf_flavour)
11951 {
11952 bfd_set_error (bfd_error_wrong_format);
11953 return -1;
11954 }
11955
11956 num_phdrs = elf_elfheader (abfd)->e_phnum;
01bcaf63
TT
11957 if (num_phdrs != 0)
11958 memcpy (phdrs, elf_tdata (abfd)->phdr,
11959 num_phdrs * sizeof (Elf_Internal_Phdr));
98d8431c
JB
11960
11961 return num_phdrs;
11962}
ae4221d7 11963
db6751f2 11964enum elf_reloc_type_class
7e612e98
AM
11965_bfd_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
11966 const asection *rel_sec ATTRIBUTE_UNUSED,
11967 const Elf_Internal_Rela *rela ATTRIBUTE_UNUSED)
db6751f2
JJ
11968{
11969 return reloc_class_normal;
11970}
f8df10f4 11971
47d9a591 11972/* For RELA architectures, return the relocation value for a
f8df10f4
JJ
11973 relocation against a local symbol. */
11974
11975bfd_vma
217aa764
AM
11976_bfd_elf_rela_local_sym (bfd *abfd,
11977 Elf_Internal_Sym *sym,
8517fae7 11978 asection **psec,
217aa764 11979 Elf_Internal_Rela *rel)
f8df10f4 11980{
8517fae7 11981 asection *sec = *psec;
f8df10f4
JJ
11982 bfd_vma relocation;
11983
6835821b
AM
11984 relocation = (sec->output_section->vma
11985 + sec->output_offset
11986 + sym->st_value);
f8df10f4 11987 if ((sec->flags & SEC_MERGE)
c629eae0 11988 && ELF_ST_TYPE (sym->st_info) == STT_SECTION
dbaa2011 11989 && sec->sec_info_type == SEC_INFO_TYPE_MERGE)
f8df10f4 11990 {
f8df10f4 11991 rel->r_addend =
8517fae7 11992 _bfd_merged_section_offset (abfd, psec,
65765700 11993 elf_section_data (sec)->sec_info,
753731ee
AM
11994 sym->st_value + rel->r_addend);
11995 if (sec != *psec)
11996 {
11997 /* If we have changed the section, and our original section is
11998 marked with SEC_EXCLUDE, it means that the original
11999 SEC_MERGE section has been completely subsumed in some
12000 other SEC_MERGE section. In this case, we need to leave
12001 some info around for --emit-relocs. */
12002 if ((sec->flags & SEC_EXCLUDE) != 0)
12003 sec->kept_section = *psec;
12004 sec = *psec;
12005 }
8517fae7
AM
12006 rel->r_addend -= relocation;
12007 rel->r_addend += sec->output_section->vma + sec->output_offset;
f8df10f4
JJ
12008 }
12009 return relocation;
12010}
c629eae0
JJ
12011
12012bfd_vma
217aa764
AM
12013_bfd_elf_rel_local_sym (bfd *abfd,
12014 Elf_Internal_Sym *sym,
12015 asection **psec,
12016 bfd_vma addend)
47d9a591 12017{
c629eae0
JJ
12018 asection *sec = *psec;
12019
6835821b 12020 if (sec->sec_info_type != SEC_INFO_TYPE_MERGE)
c629eae0
JJ
12021 return sym->st_value + addend;
12022
12023 return _bfd_merged_section_offset (abfd, psec,
65765700 12024 elf_section_data (sec)->sec_info,
753731ee 12025 sym->st_value + addend);
c629eae0
JJ
12026}
12027
37b01f6a
DG
12028/* Adjust an address within a section. Given OFFSET within SEC, return
12029 the new offset within the section, based upon changes made to the
12030 section. Returns -1 if the offset is now invalid.
12031 The offset (in abnd out) is in target sized bytes, however big a
12032 byte may be. */
12033
c629eae0 12034bfd_vma
217aa764 12035_bfd_elf_section_offset (bfd *abfd,
92e4ec35 12036 struct bfd_link_info *info,
217aa764
AM
12037 asection *sec,
12038 bfd_vma offset)
c629eae0 12039{
68bfbfcc 12040 switch (sec->sec_info_type)
65765700 12041 {
dbaa2011 12042 case SEC_INFO_TYPE_STABS:
eea6121a
AM
12043 return _bfd_stab_section_offset (sec, elf_section_data (sec)->sec_info,
12044 offset);
dbaa2011 12045 case SEC_INFO_TYPE_EH_FRAME:
92e4ec35 12046 return _bfd_elf_eh_frame_section_offset (abfd, info, sec, offset);
37b01f6a 12047
65765700 12048 default:
310fd250
L
12049 if ((sec->flags & SEC_ELF_REVERSE_COPY) != 0)
12050 {
37b01f6a 12051 /* Reverse the offset. */
310fd250
L
12052 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
12053 bfd_size_type address_size = bed->s->arch_size / 8;
37b01f6a
DG
12054
12055 /* address_size and sec->size are in octets. Convert
12056 to bytes before subtracting the original offset. */
12057 offset = (sec->size - address_size) / bfd_octets_per_byte (abfd) - offset;
310fd250 12058 }
65765700
JJ
12059 return offset;
12060 }
c629eae0 12061}
3333a7c3
RM
12062\f
12063/* Create a new BFD as if by bfd_openr. Rather than opening a file,
12064 reconstruct an ELF file by reading the segments out of remote memory
12065 based on the ELF file header at EHDR_VMA and the ELF program headers it
12066 points to. If not null, *LOADBASEP is filled in with the difference
12067 between the VMAs from which the segments were read, and the VMAs the
12068 file headers (and hence BFD's idea of each section's VMA) put them at.
12069
12070 The function TARGET_READ_MEMORY is called to copy LEN bytes from the
12071 remote memory at target address VMA into the local buffer at MYADDR; it
12072 should return zero on success or an `errno' code on failure. TEMPL must
12073 be a BFD for an ELF target with the word size and byte order found in
12074 the remote memory. */
12075
12076bfd *
217aa764
AM
12077bfd_elf_bfd_from_remote_memory
12078 (bfd *templ,
12079 bfd_vma ehdr_vma,
f0a5d95a 12080 bfd_size_type size,
217aa764 12081 bfd_vma *loadbasep,
fe78531d 12082 int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
3333a7c3
RM
12083{
12084 return (*get_elf_backend_data (templ)->elf_backend_bfd_from_remote_memory)
5979d6b6 12085 (templ, ehdr_vma, size, loadbasep, target_read_memory);
3333a7c3 12086}
4c45e5c9
JJ
12087\f
12088long
c9727e01
AM
12089_bfd_elf_get_synthetic_symtab (bfd *abfd,
12090 long symcount ATTRIBUTE_UNUSED,
12091 asymbol **syms ATTRIBUTE_UNUSED,
8615f3f2 12092 long dynsymcount,
c9727e01
AM
12093 asymbol **dynsyms,
12094 asymbol **ret)
4c45e5c9
JJ
12095{
12096 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
12097 asection *relplt;
12098 asymbol *s;
12099 const char *relplt_name;
12100 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
12101 arelent *p;
12102 long count, i, n;
12103 size_t size;
12104 Elf_Internal_Shdr *hdr;
12105 char *names;
12106 asection *plt;
12107
8615f3f2
AM
12108 *ret = NULL;
12109
90e3cdf2
JJ
12110 if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
12111 return 0;
12112
8615f3f2
AM
12113 if (dynsymcount <= 0)
12114 return 0;
12115
4c45e5c9
JJ
12116 if (!bed->plt_sym_val)
12117 return 0;
12118
12119 relplt_name = bed->relplt_name;
12120 if (relplt_name == NULL)
d35fd659 12121 relplt_name = bed->rela_plts_and_copies_p ? ".rela.plt" : ".rel.plt";
4c45e5c9
JJ
12122 relplt = bfd_get_section_by_name (abfd, relplt_name);
12123 if (relplt == NULL)
12124 return 0;
12125
12126 hdr = &elf_section_data (relplt)->this_hdr;
12127 if (hdr->sh_link != elf_dynsymtab (abfd)
12128 || (hdr->sh_type != SHT_REL && hdr->sh_type != SHT_RELA))
12129 return 0;
12130
12131 plt = bfd_get_section_by_name (abfd, ".plt");
12132 if (plt == NULL)
12133 return 0;
12134
12135 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
c9727e01 12136 if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
4c45e5c9
JJ
12137 return -1;
12138
eea6121a 12139 count = relplt->size / hdr->sh_entsize;
4c45e5c9
JJ
12140 size = count * sizeof (asymbol);
12141 p = relplt->relocation;
cb53bf42 12142 for (i = 0; i < count; i++, p += bed->s->int_rels_per_ext_rel)
041de40d
AM
12143 {
12144 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
12145 if (p->addend != 0)
12146 {
12147#ifdef BFD64
12148 size += sizeof ("+0x") - 1 + 8 + 8 * (bed->s->elfclass == ELFCLASS64);
12149#else
12150 size += sizeof ("+0x") - 1 + 8;
12151#endif
12152 }
12153 }
4c45e5c9 12154
a50b1753 12155 s = *ret = (asymbol *) bfd_malloc (size);
4c45e5c9
JJ
12156 if (s == NULL)
12157 return -1;
12158
12159 names = (char *) (s + count);
12160 p = relplt->relocation;
12161 n = 0;
cb53bf42 12162 for (i = 0; i < count; i++, p += bed->s->int_rels_per_ext_rel)
4c45e5c9
JJ
12163 {
12164 size_t len;
12165 bfd_vma addr;
12166
12167 addr = bed->plt_sym_val (i, plt, p);
12168 if (addr == (bfd_vma) -1)
12169 continue;
12170
12171 *s = **p->sym_ptr_ptr;
65a7a66f
AM
12172 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
12173 we are defining a symbol, ensure one of them is set. */
12174 if ((s->flags & BSF_LOCAL) == 0)
12175 s->flags |= BSF_GLOBAL;
6ba2a415 12176 s->flags |= BSF_SYNTHETIC;
4c45e5c9
JJ
12177 s->section = plt;
12178 s->value = addr - plt->vma;
12179 s->name = names;
8f39ba8e 12180 s->udata.p = NULL;
4c45e5c9
JJ
12181 len = strlen ((*p->sym_ptr_ptr)->name);
12182 memcpy (names, (*p->sym_ptr_ptr)->name, len);
12183 names += len;
041de40d
AM
12184 if (p->addend != 0)
12185 {
1d770845 12186 char buf[30], *a;
d324f6d6 12187
041de40d
AM
12188 memcpy (names, "+0x", sizeof ("+0x") - 1);
12189 names += sizeof ("+0x") - 1;
1d770845
L
12190 bfd_sprintf_vma (abfd, buf, p->addend);
12191 for (a = buf; *a == '0'; ++a)
12192 ;
12193 len = strlen (a);
12194 memcpy (names, a, len);
12195 names += len;
041de40d 12196 }
4c45e5c9
JJ
12197 memcpy (names, "@plt", sizeof ("@plt"));
12198 names += sizeof ("@plt");
8f39ba8e 12199 ++s, ++n;
4c45e5c9
JJ
12200 }
12201
12202 return n;
12203}
3d7f7666 12204
821e6ff6
AM
12205/* It is only used by x86-64 so far.
12206 ??? This repeats *COM* id of zero. sec->id is supposed to be unique,
7eacd66b
AM
12207 but current usage would allow all of _bfd_std_section to be zero. */
12208static const asymbol lcomm_sym
12209 = GLOBAL_SYM_INIT ("LARGE_COMMON", &_bfd_elf_large_com_section);
3b22753a 12210asection _bfd_elf_large_com_section
7eacd66b 12211 = BFD_FAKE_SECTION (_bfd_elf_large_com_section, &lcomm_sym,
821e6ff6 12212 "LARGE_COMMON", 0, SEC_IS_COMMON);
ecca9871 12213
cc364be6
AM
12214bfd_boolean
12215_bfd_elf_final_write_processing (bfd *abfd)
06f44071
AM
12216{
12217 Elf_Internal_Ehdr *i_ehdrp; /* ELF file header, internal form. */
d1036acb
L
12218
12219 i_ehdrp = elf_elfheader (abfd);
12220
06f44071
AM
12221 if (i_ehdrp->e_ident[EI_OSABI] == ELFOSABI_NONE)
12222 i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
d8045f23 12223
df3a023b
AM
12224 /* Set the osabi field to ELFOSABI_GNU if the binary contains
12225 SHF_GNU_MBIND sections or symbols of STT_GNU_IFUNC type or
12226 STB_GNU_UNIQUE binding. */
cc364be6
AM
12227 if (elf_tdata (abfd)->has_gnu_osabi != 0)
12228 {
12229 if (i_ehdrp->e_ident[EI_OSABI] == ELFOSABI_NONE)
12230 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_GNU;
12231 else if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_GNU
12232 && i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_FREEBSD)
12233 {
12234 if (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_mbind)
12235 _bfd_error_handler (_("GNU_MBIND section is unsupported"));
12236 if (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_ifunc)
12237 _bfd_error_handler (_("symbol type STT_GNU_IFUNC is unsupported"));
12238 if (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_unique)
12239 _bfd_error_handler (_("symbol binding STB_GNU_UNIQUE is unsupported"));
9aea1e31 12240 bfd_set_error (bfd_error_sorry);
cc364be6
AM
12241 return FALSE;
12242 }
12243 }
12244 return TRUE;
d1036acb 12245}
fcb93ecf
PB
12246
12247
12248/* Return TRUE for ELF symbol types that represent functions.
12249 This is the default version of this function, which is sufficient for
d8045f23 12250 most targets. It returns true if TYPE is STT_FUNC or STT_GNU_IFUNC. */
fcb93ecf
PB
12251
12252bfd_boolean
12253_bfd_elf_is_function_type (unsigned int type)
12254{
d8045f23
NC
12255 return (type == STT_FUNC
12256 || type == STT_GNU_IFUNC);
fcb93ecf 12257}
9f296da3 12258
aef36ac1
AM
12259/* If the ELF symbol SYM might be a function in SEC, return the
12260 function size and set *CODE_OFF to the function's entry point,
12261 otherwise return zero. */
9f296da3 12262
aef36ac1
AM
12263bfd_size_type
12264_bfd_elf_maybe_function_sym (const asymbol *sym, asection *sec,
12265 bfd_vma *code_off)
9f296da3 12266{
aef36ac1
AM
12267 bfd_size_type size;
12268
ff9e0f5b 12269 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
aef36ac1
AM
12270 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0
12271 || sym->section != sec)
12272 return 0;
ff9e0f5b 12273
ff9e0f5b 12274 *code_off = sym->value;
aef36ac1
AM
12275 size = 0;
12276 if (!(sym->flags & BSF_SYNTHETIC))
12277 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
12278 if (size == 0)
12279 size = 1;
12280 return size;
9f296da3 12281}
This page took 2.576518 seconds and 4 git commands to generate.