]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elf.c
Automatic date update in version.in
[thirdparty/binutils-gdb.git] / bfd / elf.c
CommitLineData
252b5132 1/* ELF executable support for BFD.
340b6d91 2
6f2750fe 3 Copyright (C) 1993-2016 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"
3db64b00 38#include "bfd.h"
252b5132
RH
39#include "bfdlink.h"
40#include "libbfd.h"
41#define ARCH_SIZE 0
42#include "elf-bfd.h"
e0e8c97f 43#include "libiberty.h"
ff59fc36 44#include "safe-ctype.h"
de64ce13 45#include "elf-linux-core.h"
252b5132 46
8bc7f138
L
47#ifdef CORE_HEADER
48#include CORE_HEADER
49#endif
50
217aa764 51static int elf_sort_sections (const void *, const void *);
c84fca4d 52static bfd_boolean assign_file_positions_except_relocs (bfd *, struct bfd_link_info *);
217aa764 53static bfd_boolean prep_headers (bfd *);
ef10c3ac 54static bfd_boolean swap_out_syms (bfd *, struct elf_strtab_hash **, int) ;
718175fa
JK
55static bfd_boolean elf_read_notes (bfd *, file_ptr, bfd_size_type) ;
56static bfd_boolean elf_parse_notes (bfd *abfd, char *buf, size_t size,
57 file_ptr offset);
50b2bdb7 58
252b5132
RH
59/* Swap version information in and out. The version information is
60 currently size independent. If that ever changes, this code will
61 need to move into elfcode.h. */
62
63/* Swap in a Verdef structure. */
64
65void
217aa764
AM
66_bfd_elf_swap_verdef_in (bfd *abfd,
67 const Elf_External_Verdef *src,
68 Elf_Internal_Verdef *dst)
252b5132 69{
dc810e39
AM
70 dst->vd_version = H_GET_16 (abfd, src->vd_version);
71 dst->vd_flags = H_GET_16 (abfd, src->vd_flags);
72 dst->vd_ndx = H_GET_16 (abfd, src->vd_ndx);
73 dst->vd_cnt = H_GET_16 (abfd, src->vd_cnt);
74 dst->vd_hash = H_GET_32 (abfd, src->vd_hash);
75 dst->vd_aux = H_GET_32 (abfd, src->vd_aux);
76 dst->vd_next = H_GET_32 (abfd, src->vd_next);
252b5132
RH
77}
78
79/* Swap out a Verdef structure. */
80
81void
217aa764
AM
82_bfd_elf_swap_verdef_out (bfd *abfd,
83 const Elf_Internal_Verdef *src,
84 Elf_External_Verdef *dst)
252b5132 85{
dc810e39
AM
86 H_PUT_16 (abfd, src->vd_version, dst->vd_version);
87 H_PUT_16 (abfd, src->vd_flags, dst->vd_flags);
88 H_PUT_16 (abfd, src->vd_ndx, dst->vd_ndx);
89 H_PUT_16 (abfd, src->vd_cnt, dst->vd_cnt);
90 H_PUT_32 (abfd, src->vd_hash, dst->vd_hash);
91 H_PUT_32 (abfd, src->vd_aux, dst->vd_aux);
92 H_PUT_32 (abfd, src->vd_next, dst->vd_next);
252b5132
RH
93}
94
95/* Swap in a Verdaux structure. */
96
97void
217aa764
AM
98_bfd_elf_swap_verdaux_in (bfd *abfd,
99 const Elf_External_Verdaux *src,
100 Elf_Internal_Verdaux *dst)
252b5132 101{
dc810e39
AM
102 dst->vda_name = H_GET_32 (abfd, src->vda_name);
103 dst->vda_next = H_GET_32 (abfd, src->vda_next);
252b5132
RH
104}
105
106/* Swap out a Verdaux structure. */
107
108void
217aa764
AM
109_bfd_elf_swap_verdaux_out (bfd *abfd,
110 const Elf_Internal_Verdaux *src,
111 Elf_External_Verdaux *dst)
252b5132 112{
dc810e39
AM
113 H_PUT_32 (abfd, src->vda_name, dst->vda_name);
114 H_PUT_32 (abfd, src->vda_next, dst->vda_next);
252b5132
RH
115}
116
117/* Swap in a Verneed structure. */
118
119void
217aa764
AM
120_bfd_elf_swap_verneed_in (bfd *abfd,
121 const Elf_External_Verneed *src,
122 Elf_Internal_Verneed *dst)
252b5132 123{
dc810e39
AM
124 dst->vn_version = H_GET_16 (abfd, src->vn_version);
125 dst->vn_cnt = H_GET_16 (abfd, src->vn_cnt);
126 dst->vn_file = H_GET_32 (abfd, src->vn_file);
127 dst->vn_aux = H_GET_32 (abfd, src->vn_aux);
128 dst->vn_next = H_GET_32 (abfd, src->vn_next);
252b5132
RH
129}
130
131/* Swap out a Verneed structure. */
132
133void
217aa764
AM
134_bfd_elf_swap_verneed_out (bfd *abfd,
135 const Elf_Internal_Verneed *src,
136 Elf_External_Verneed *dst)
252b5132 137{
dc810e39
AM
138 H_PUT_16 (abfd, src->vn_version, dst->vn_version);
139 H_PUT_16 (abfd, src->vn_cnt, dst->vn_cnt);
140 H_PUT_32 (abfd, src->vn_file, dst->vn_file);
141 H_PUT_32 (abfd, src->vn_aux, dst->vn_aux);
142 H_PUT_32 (abfd, src->vn_next, dst->vn_next);
252b5132
RH
143}
144
145/* Swap in a Vernaux structure. */
146
147void
217aa764
AM
148_bfd_elf_swap_vernaux_in (bfd *abfd,
149 const Elf_External_Vernaux *src,
150 Elf_Internal_Vernaux *dst)
252b5132 151{
dc810e39
AM
152 dst->vna_hash = H_GET_32 (abfd, src->vna_hash);
153 dst->vna_flags = H_GET_16 (abfd, src->vna_flags);
154 dst->vna_other = H_GET_16 (abfd, src->vna_other);
155 dst->vna_name = H_GET_32 (abfd, src->vna_name);
156 dst->vna_next = H_GET_32 (abfd, src->vna_next);
252b5132
RH
157}
158
159/* Swap out a Vernaux structure. */
160
161void
217aa764
AM
162_bfd_elf_swap_vernaux_out (bfd *abfd,
163 const Elf_Internal_Vernaux *src,
164 Elf_External_Vernaux *dst)
252b5132 165{
dc810e39
AM
166 H_PUT_32 (abfd, src->vna_hash, dst->vna_hash);
167 H_PUT_16 (abfd, src->vna_flags, dst->vna_flags);
168 H_PUT_16 (abfd, src->vna_other, dst->vna_other);
169 H_PUT_32 (abfd, src->vna_name, dst->vna_name);
170 H_PUT_32 (abfd, src->vna_next, dst->vna_next);
252b5132
RH
171}
172
173/* Swap in a Versym structure. */
174
175void
217aa764
AM
176_bfd_elf_swap_versym_in (bfd *abfd,
177 const Elf_External_Versym *src,
178 Elf_Internal_Versym *dst)
252b5132 179{
dc810e39 180 dst->vs_vers = H_GET_16 (abfd, src->vs_vers);
252b5132
RH
181}
182
183/* Swap out a Versym structure. */
184
185void
217aa764
AM
186_bfd_elf_swap_versym_out (bfd *abfd,
187 const Elf_Internal_Versym *src,
188 Elf_External_Versym *dst)
252b5132 189{
dc810e39 190 H_PUT_16 (abfd, src->vs_vers, dst->vs_vers);
252b5132
RH
191}
192
193/* Standard ELF hash function. Do not change this function; you will
194 cause invalid hash tables to be generated. */
3a99b017 195
252b5132 196unsigned long
217aa764 197bfd_elf_hash (const char *namearg)
252b5132 198{
3a99b017 199 const unsigned char *name = (const unsigned char *) namearg;
252b5132
RH
200 unsigned long h = 0;
201 unsigned long g;
202 int ch;
203
204 while ((ch = *name++) != '\0')
205 {
206 h = (h << 4) + ch;
207 if ((g = (h & 0xf0000000)) != 0)
208 {
209 h ^= g >> 24;
210 /* The ELF ABI says `h &= ~g', but this is equivalent in
211 this case and on some machines one insn instead of two. */
212 h ^= g;
213 }
214 }
32dfa85d 215 return h & 0xffffffff;
252b5132
RH
216}
217
fdc90cb4
JJ
218/* DT_GNU_HASH hash function. Do not change this function; you will
219 cause invalid hash tables to be generated. */
220
221unsigned long
222bfd_elf_gnu_hash (const char *namearg)
223{
224 const unsigned char *name = (const unsigned char *) namearg;
225 unsigned long h = 5381;
226 unsigned char ch;
227
228 while ((ch = *name++) != '\0')
229 h = (h << 5) + h + ch;
230 return h & 0xffffffff;
231}
232
0c8d6e5c
AM
233/* Create a tdata field OBJECT_SIZE bytes in length, zeroed out and with
234 the object_id field of an elf_obj_tdata field set to OBJECT_ID. */
b34976b6 235bfd_boolean
0c8d6e5c 236bfd_elf_allocate_object (bfd *abfd,
0ffa91dd 237 size_t object_size,
4dfe6ac6 238 enum elf_target_id object_id)
252b5132 239{
0ffa91dd
NC
240 BFD_ASSERT (object_size >= sizeof (struct elf_obj_tdata));
241 abfd->tdata.any = bfd_zalloc (abfd, object_size);
242 if (abfd->tdata.any == NULL)
243 return FALSE;
252b5132 244
0ffa91dd 245 elf_object_id (abfd) = object_id;
c0355132
AM
246 if (abfd->direction != read_direction)
247 {
248 struct output_elf_obj_tdata *o = bfd_zalloc (abfd, sizeof *o);
249 if (o == NULL)
250 return FALSE;
251 elf_tdata (abfd)->o = o;
252 elf_program_header_size (abfd) = (bfd_size_type) -1;
253 }
b34976b6 254 return TRUE;
252b5132
RH
255}
256
0ffa91dd
NC
257
258bfd_boolean
ae95ffa6 259bfd_elf_make_object (bfd *abfd)
0ffa91dd 260{
ae95ffa6 261 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
0ffa91dd 262 return bfd_elf_allocate_object (abfd, sizeof (struct elf_obj_tdata),
ae95ffa6 263 bed->target_id);
0ffa91dd
NC
264}
265
b34976b6 266bfd_boolean
217aa764 267bfd_elf_mkcorefile (bfd *abfd)
252b5132 268{
c044fabd 269 /* I think this can be done just like an object file. */
228e534f
AM
270 if (!abfd->xvec->_bfd_set_format[(int) bfd_object] (abfd))
271 return FALSE;
272 elf_tdata (abfd)->core = bfd_zalloc (abfd, sizeof (*elf_tdata (abfd)->core));
273 return elf_tdata (abfd)->core != NULL;
252b5132
RH
274}
275
72a80a16 276static char *
217aa764 277bfd_elf_get_str_section (bfd *abfd, unsigned int shindex)
252b5132
RH
278{
279 Elf_Internal_Shdr **i_shdrp;
f075ee0c 280 bfd_byte *shstrtab = NULL;
dc810e39
AM
281 file_ptr offset;
282 bfd_size_type shstrtabsize;
252b5132
RH
283
284 i_shdrp = elf_elfsections (abfd);
74f2e02b
AM
285 if (i_shdrp == 0
286 || shindex >= elf_numsections (abfd)
287 || i_shdrp[shindex] == 0)
f075ee0c 288 return NULL;
252b5132 289
f075ee0c 290 shstrtab = i_shdrp[shindex]->contents;
252b5132
RH
291 if (shstrtab == NULL)
292 {
c044fabd 293 /* No cached one, attempt to read, and cache what we read. */
252b5132
RH
294 offset = i_shdrp[shindex]->sh_offset;
295 shstrtabsize = i_shdrp[shindex]->sh_size;
c6c60d09
JJ
296
297 /* Allocate and clear an extra byte at the end, to prevent crashes
298 in case the string table is not terminated. */
3471d59d 299 if (shstrtabsize + 1 <= 1
06614111
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. */
341 _bfd_error_handler (_("%B: attempt to load strings from a non-string section (number %d)"),
342 abfd, shindex);
343 return NULL;
344 }
b1fa9dd6 345
06614111
NC
346 if (bfd_elf_get_str_section (abfd, shindex) == NULL)
347 return NULL;
348 }
252b5132
RH
349
350 if (strindex >= hdr->sh_size)
351 {
1b3a8575 352 unsigned int shstrndx = elf_elfheader(abfd)->e_shstrndx;
252b5132 353 (*_bfd_error_handler)
d003868e
AM
354 (_("%B: invalid string offset %u >= %lu for section `%s'"),
355 abfd, strindex, (unsigned long) hdr->sh_size,
1b3a8575 356 (shindex == shstrndx && strindex == hdr->sh_name
252b5132 357 ? ".shstrtab"
1b3a8575 358 : bfd_elf_string_from_elf_section (abfd, shstrndx, hdr->sh_name)));
45b222d6 359 return NULL;
252b5132
RH
360 }
361
362 return ((char *) hdr->contents) + strindex;
363}
364
6cdc0ccc
AM
365/* Read and convert symbols to internal format.
366 SYMCOUNT specifies the number of symbols to read, starting from
367 symbol SYMOFFSET. If any of INTSYM_BUF, EXTSYM_BUF or EXTSHNDX_BUF
368 are non-NULL, they are used to store the internal symbols, external
b7c368d0
NC
369 symbols, and symbol section index extensions, respectively.
370 Returns a pointer to the internal symbol buffer (malloced if necessary)
371 or NULL if there were no symbols or some kind of problem. */
6cdc0ccc
AM
372
373Elf_Internal_Sym *
217aa764
AM
374bfd_elf_get_elf_syms (bfd *ibfd,
375 Elf_Internal_Shdr *symtab_hdr,
376 size_t symcount,
377 size_t symoffset,
378 Elf_Internal_Sym *intsym_buf,
379 void *extsym_buf,
380 Elf_External_Sym_Shndx *extshndx_buf)
6cdc0ccc
AM
381{
382 Elf_Internal_Shdr *shndx_hdr;
217aa764 383 void *alloc_ext;
df622259 384 const bfd_byte *esym;
6cdc0ccc
AM
385 Elf_External_Sym_Shndx *alloc_extshndx;
386 Elf_External_Sym_Shndx *shndx;
4dd07732 387 Elf_Internal_Sym *alloc_intsym;
6cdc0ccc
AM
388 Elf_Internal_Sym *isym;
389 Elf_Internal_Sym *isymend;
9c5bfbb7 390 const struct elf_backend_data *bed;
6cdc0ccc
AM
391 size_t extsym_size;
392 bfd_size_type amt;
393 file_ptr pos;
394
e44a2c9c
AM
395 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
396 abort ();
397
6cdc0ccc
AM
398 if (symcount == 0)
399 return intsym_buf;
400
401 /* Normal syms might have section extension entries. */
402 shndx_hdr = NULL;
6a40cf0c
NC
403 if (elf_symtab_shndx_list (ibfd) != NULL)
404 {
405 elf_section_list * entry;
406 Elf_Internal_Shdr **sections = elf_elfsections (ibfd);
407
408 /* Find an index section that is linked to this symtab section. */
409 for (entry = elf_symtab_shndx_list (ibfd); entry != NULL; entry = entry->next)
315350be
NC
410 {
411 /* PR 20063. */
412 if (entry->hdr.sh_link >= elf_numsections (ibfd))
413 continue;
414
415 if (sections[entry->hdr.sh_link] == symtab_hdr)
416 {
417 shndx_hdr = & entry->hdr;
418 break;
419 };
420 }
6a40cf0c
NC
421
422 if (shndx_hdr == NULL)
423 {
424 if (symtab_hdr == & elf_symtab_hdr (ibfd))
425 /* Not really accurate, but this was how the old code used to work. */
426 shndx_hdr = & elf_symtab_shndx_list (ibfd)->hdr;
427 /* Otherwise we do nothing. The assumption is that
428 the index table will not be needed. */
429 }
430 }
6cdc0ccc
AM
431
432 /* Read the symbols. */
433 alloc_ext = NULL;
434 alloc_extshndx = NULL;
4dd07732 435 alloc_intsym = NULL;
6cdc0ccc
AM
436 bed = get_elf_backend_data (ibfd);
437 extsym_size = bed->s->sizeof_sym;
438 amt = symcount * extsym_size;
439 pos = symtab_hdr->sh_offset + symoffset * extsym_size;
440 if (extsym_buf == NULL)
441 {
d0fb9a8d 442 alloc_ext = bfd_malloc2 (symcount, extsym_size);
6cdc0ccc
AM
443 extsym_buf = alloc_ext;
444 }
445 if (extsym_buf == NULL
446 || bfd_seek (ibfd, pos, SEEK_SET) != 0
447 || bfd_bread (extsym_buf, amt, ibfd) != amt)
448 {
449 intsym_buf = NULL;
450 goto out;
451 }
452
453 if (shndx_hdr == NULL || shndx_hdr->sh_size == 0)
454 extshndx_buf = NULL;
455 else
456 {
457 amt = symcount * sizeof (Elf_External_Sym_Shndx);
458 pos = shndx_hdr->sh_offset + symoffset * sizeof (Elf_External_Sym_Shndx);
459 if (extshndx_buf == NULL)
460 {
a50b1753
NC
461 alloc_extshndx = (Elf_External_Sym_Shndx *)
462 bfd_malloc2 (symcount, sizeof (Elf_External_Sym_Shndx));
6cdc0ccc
AM
463 extshndx_buf = alloc_extshndx;
464 }
465 if (extshndx_buf == NULL
466 || bfd_seek (ibfd, pos, SEEK_SET) != 0
467 || bfd_bread (extshndx_buf, amt, ibfd) != amt)
468 {
469 intsym_buf = NULL;
470 goto out;
471 }
472 }
473
474 if (intsym_buf == NULL)
475 {
a50b1753
NC
476 alloc_intsym = (Elf_Internal_Sym *)
477 bfd_malloc2 (symcount, sizeof (Elf_Internal_Sym));
4dd07732 478 intsym_buf = alloc_intsym;
6cdc0ccc
AM
479 if (intsym_buf == NULL)
480 goto out;
481 }
482
483 /* Convert the symbols to internal form. */
484 isymend = intsym_buf + symcount;
a50b1753
NC
485 for (esym = (const bfd_byte *) extsym_buf, isym = intsym_buf,
486 shndx = extshndx_buf;
6cdc0ccc
AM
487 isym < isymend;
488 esym += extsym_size, isym++, shndx = shndx != NULL ? shndx + 1 : NULL)
8384fb8f
AM
489 if (!(*bed->s->swap_symbol_in) (ibfd, esym, shndx, isym))
490 {
491 symoffset += (esym - (bfd_byte *) extsym_buf) / extsym_size;
492 (*_bfd_error_handler) (_("%B symbol number %lu references "
493 "nonexistent SHT_SYMTAB_SHNDX section"),
494 ibfd, (unsigned long) symoffset);
4dd07732
AM
495 if (alloc_intsym != NULL)
496 free (alloc_intsym);
8384fb8f
AM
497 intsym_buf = NULL;
498 goto out;
499 }
6cdc0ccc
AM
500
501 out:
502 if (alloc_ext != NULL)
503 free (alloc_ext);
504 if (alloc_extshndx != NULL)
505 free (alloc_extshndx);
506
507 return intsym_buf;
508}
509
5cab59f6
AM
510/* Look up a symbol name. */
511const char *
be8dd2ca
AM
512bfd_elf_sym_name (bfd *abfd,
513 Elf_Internal_Shdr *symtab_hdr,
26c61ae5
L
514 Elf_Internal_Sym *isym,
515 asection *sym_sec)
5cab59f6 516{
26c61ae5 517 const char *name;
5cab59f6 518 unsigned int iname = isym->st_name;
be8dd2ca 519 unsigned int shindex = symtab_hdr->sh_link;
26c61ae5 520
138f35cc
JJ
521 if (iname == 0 && ELF_ST_TYPE (isym->st_info) == STT_SECTION
522 /* Check for a bogus st_shndx to avoid crashing. */
4fbb74a6 523 && isym->st_shndx < elf_numsections (abfd))
5cab59f6
AM
524 {
525 iname = elf_elfsections (abfd)[isym->st_shndx]->sh_name;
526 shindex = elf_elfheader (abfd)->e_shstrndx;
527 }
528
26c61ae5
L
529 name = bfd_elf_string_from_elf_section (abfd, shindex, iname);
530 if (name == NULL)
531 name = "(null)";
532 else if (sym_sec && *name == '\0')
533 name = bfd_section_name (abfd, sym_sec);
534
535 return name;
5cab59f6
AM
536}
537
dbb410c3
AM
538/* Elf_Internal_Shdr->contents is an array of these for SHT_GROUP
539 sections. The first element is the flags, the rest are section
540 pointers. */
541
542typedef union elf_internal_group {
543 Elf_Internal_Shdr *shdr;
544 unsigned int flags;
545} Elf_Internal_Group;
546
b885599b
AM
547/* Return the name of the group signature symbol. Why isn't the
548 signature just a string? */
549
550static const char *
217aa764 551group_signature (bfd *abfd, Elf_Internal_Shdr *ghdr)
b885599b 552{
9dce4196 553 Elf_Internal_Shdr *hdr;
9dce4196
AM
554 unsigned char esym[sizeof (Elf64_External_Sym)];
555 Elf_External_Sym_Shndx eshndx;
556 Elf_Internal_Sym isym;
b885599b 557
13792e9d
L
558 /* First we need to ensure the symbol table is available. Make sure
559 that it is a symbol table section. */
4fbb74a6
AM
560 if (ghdr->sh_link >= elf_numsections (abfd))
561 return NULL;
13792e9d
L
562 hdr = elf_elfsections (abfd) [ghdr->sh_link];
563 if (hdr->sh_type != SHT_SYMTAB
564 || ! bfd_section_from_shdr (abfd, ghdr->sh_link))
b885599b
AM
565 return NULL;
566
9dce4196
AM
567 /* Go read the symbol. */
568 hdr = &elf_tdata (abfd)->symtab_hdr;
6cdc0ccc
AM
569 if (bfd_elf_get_elf_syms (abfd, hdr, 1, ghdr->sh_info,
570 &isym, esym, &eshndx) == NULL)
b885599b 571 return NULL;
9dce4196 572
26c61ae5 573 return bfd_elf_sym_name (abfd, hdr, &isym, NULL);
b885599b
AM
574}
575
dbb410c3
AM
576/* Set next_in_group list pointer, and group name for NEWSECT. */
577
b34976b6 578static bfd_boolean
217aa764 579setup_group (bfd *abfd, Elf_Internal_Shdr *hdr, asection *newsect)
dbb410c3
AM
580{
581 unsigned int num_group = elf_tdata (abfd)->num_group;
582
583 /* If num_group is zero, read in all SHT_GROUP sections. The count
584 is set to -1 if there are no SHT_GROUP sections. */
585 if (num_group == 0)
586 {
587 unsigned int i, shnum;
588
589 /* First count the number of groups. If we have a SHT_GROUP
590 section with just a flag word (ie. sh_size is 4), ignore it. */
9ad5cbcf 591 shnum = elf_numsections (abfd);
dbb410c3 592 num_group = 0;
08a40648 593
44534af3 594#define IS_VALID_GROUP_SECTION_HEADER(shdr, minsize) \
1783205a 595 ( (shdr)->sh_type == SHT_GROUP \
44534af3 596 && (shdr)->sh_size >= minsize \
1783205a
NC
597 && (shdr)->sh_entsize == GRP_ENTRY_SIZE \
598 && ((shdr)->sh_size % GRP_ENTRY_SIZE) == 0)
08a40648 599
dbb410c3
AM
600 for (i = 0; i < shnum; i++)
601 {
602 Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[i];
1783205a 603
44534af3 604 if (IS_VALID_GROUP_SECTION_HEADER (shdr, 2 * GRP_ENTRY_SIZE))
dbb410c3
AM
605 num_group += 1;
606 }
607
608 if (num_group == 0)
20dbb49d
L
609 {
610 num_group = (unsigned) -1;
611 elf_tdata (abfd)->num_group = num_group;
612 }
613 else
dbb410c3
AM
614 {
615 /* We keep a list of elf section headers for group sections,
616 so we can find them quickly. */
20dbb49d 617 bfd_size_type amt;
d0fb9a8d 618
20dbb49d 619 elf_tdata (abfd)->num_group = num_group;
a50b1753
NC
620 elf_tdata (abfd)->group_sect_ptr = (Elf_Internal_Shdr **)
621 bfd_alloc2 (abfd, num_group, sizeof (Elf_Internal_Shdr *));
dbb410c3 622 if (elf_tdata (abfd)->group_sect_ptr == NULL)
b34976b6 623 return FALSE;
dbb410c3
AM
624
625 num_group = 0;
626 for (i = 0; i < shnum; i++)
627 {
628 Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[i];
1783205a 629
44534af3 630 if (IS_VALID_GROUP_SECTION_HEADER (shdr, 2 * GRP_ENTRY_SIZE))
dbb410c3 631 {
973ffd63 632 unsigned char *src;
dbb410c3
AM
633 Elf_Internal_Group *dest;
634
635 /* Add to list of sections. */
636 elf_tdata (abfd)->group_sect_ptr[num_group] = shdr;
637 num_group += 1;
638
639 /* Read the raw contents. */
640 BFD_ASSERT (sizeof (*dest) >= 4);
641 amt = shdr->sh_size * sizeof (*dest) / 4;
a50b1753
NC
642 shdr->contents = (unsigned char *)
643 bfd_alloc2 (abfd, shdr->sh_size, sizeof (*dest) / 4);
1783205a
NC
644 /* PR binutils/4110: Handle corrupt group headers. */
645 if (shdr->contents == NULL)
646 {
647 _bfd_error_handler
493a3386 648 (_("%B: corrupt size field in group section header: 0x%lx"), abfd, shdr->sh_size);
1783205a 649 bfd_set_error (bfd_error_bad_value);
493a3386
NC
650 -- num_group;
651 continue;
1783205a
NC
652 }
653
654 memset (shdr->contents, 0, amt);
655
656 if (bfd_seek (abfd, shdr->sh_offset, SEEK_SET) != 0
dbb410c3
AM
657 || (bfd_bread (shdr->contents, shdr->sh_size, abfd)
658 != shdr->sh_size))
493a3386
NC
659 {
660 _bfd_error_handler
661 (_("%B: invalid size field in group section header: 0x%lx"), abfd, shdr->sh_size);
662 bfd_set_error (bfd_error_bad_value);
663 -- num_group;
664 /* PR 17510: If the group contents are even partially
665 corrupt, do not allow any of the contents to be used. */
666 memset (shdr->contents, 0, amt);
667 continue;
668 }
708d7d0d 669
dbb410c3
AM
670 /* Translate raw contents, a flag word followed by an
671 array of elf section indices all in target byte order,
672 to the flag word followed by an array of elf section
673 pointers. */
674 src = shdr->contents + shdr->sh_size;
675 dest = (Elf_Internal_Group *) (shdr->contents + amt);
06614111 676
dbb410c3
AM
677 while (1)
678 {
679 unsigned int idx;
680
681 src -= 4;
682 --dest;
683 idx = H_GET_32 (abfd, src);
684 if (src == shdr->contents)
685 {
686 dest->flags = idx;
b885599b
AM
687 if (shdr->bfd_section != NULL && (idx & GRP_COMDAT))
688 shdr->bfd_section->flags
689 |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
dbb410c3
AM
690 break;
691 }
692 if (idx >= shnum)
693 {
694 ((*_bfd_error_handler)
d003868e 695 (_("%B: invalid SHT_GROUP entry"), abfd));
dbb410c3
AM
696 idx = 0;
697 }
698 dest->shdr = elf_elfsections (abfd)[idx];
699 }
700 }
701 }
493a3386
NC
702
703 /* PR 17510: Corrupt binaries might contain invalid groups. */
704 if (num_group != (unsigned) elf_tdata (abfd)->num_group)
705 {
706 elf_tdata (abfd)->num_group = num_group;
707
708 /* If all groups are invalid then fail. */
709 if (num_group == 0)
710 {
711 elf_tdata (abfd)->group_sect_ptr = NULL;
712 elf_tdata (abfd)->num_group = num_group = -1;
713 (*_bfd_error_handler) (_("%B: no valid group sections found"), abfd);
714 bfd_set_error (bfd_error_bad_value);
715 }
716 }
dbb410c3
AM
717 }
718 }
719
720 if (num_group != (unsigned) -1)
721 {
722 unsigned int i;
723
724 for (i = 0; i < num_group; i++)
725 {
726 Elf_Internal_Shdr *shdr = elf_tdata (abfd)->group_sect_ptr[i];
727 Elf_Internal_Group *idx = (Elf_Internal_Group *) shdr->contents;
728 unsigned int n_elt = shdr->sh_size / 4;
729
730 /* Look through this group's sections to see if current
731 section is a member. */
732 while (--n_elt != 0)
733 if ((++idx)->shdr == hdr)
734 {
e0e8c97f 735 asection *s = NULL;
dbb410c3
AM
736
737 /* We are a member of this group. Go looking through
738 other members to see if any others are linked via
739 next_in_group. */
740 idx = (Elf_Internal_Group *) shdr->contents;
741 n_elt = shdr->sh_size / 4;
742 while (--n_elt != 0)
743 if ((s = (++idx)->shdr->bfd_section) != NULL
945906ff 744 && elf_next_in_group (s) != NULL)
dbb410c3
AM
745 break;
746 if (n_elt != 0)
747 {
dbb410c3
AM
748 /* Snarf the group name from other member, and
749 insert current section in circular list. */
945906ff
AM
750 elf_group_name (newsect) = elf_group_name (s);
751 elf_next_in_group (newsect) = elf_next_in_group (s);
752 elf_next_in_group (s) = newsect;
dbb410c3
AM
753 }
754 else
755 {
dbb410c3
AM
756 const char *gname;
757
b885599b
AM
758 gname = group_signature (abfd, shdr);
759 if (gname == NULL)
b34976b6 760 return FALSE;
945906ff 761 elf_group_name (newsect) = gname;
dbb410c3
AM
762
763 /* Start a circular list with one element. */
945906ff 764 elf_next_in_group (newsect) = newsect;
dbb410c3 765 }
b885599b 766
9dce4196
AM
767 /* If the group section has been created, point to the
768 new member. */
dbb410c3 769 if (shdr->bfd_section != NULL)
945906ff 770 elf_next_in_group (shdr->bfd_section) = newsect;
b885599b 771
dbb410c3
AM
772 i = num_group - 1;
773 break;
774 }
775 }
776 }
777
945906ff 778 if (elf_group_name (newsect) == NULL)
dbb410c3 779 {
d003868e
AM
780 (*_bfd_error_handler) (_("%B: no group info for section %A"),
781 abfd, newsect);
493a3386 782 return FALSE;
dbb410c3 783 }
b34976b6 784 return TRUE;
dbb410c3
AM
785}
786
3d7f7666 787bfd_boolean
dd863624 788_bfd_elf_setup_sections (bfd *abfd)
3d7f7666
L
789{
790 unsigned int i;
791 unsigned int num_group = elf_tdata (abfd)->num_group;
792 bfd_boolean result = TRUE;
dd863624
L
793 asection *s;
794
795 /* Process SHF_LINK_ORDER. */
796 for (s = abfd->sections; s != NULL; s = s->next)
797 {
798 Elf_Internal_Shdr *this_hdr = &elf_section_data (s)->this_hdr;
799 if ((this_hdr->sh_flags & SHF_LINK_ORDER) != 0)
800 {
801 unsigned int elfsec = this_hdr->sh_link;
802 /* FIXME: The old Intel compiler and old strip/objcopy may
803 not set the sh_link or sh_info fields. Hence we could
804 get the situation where elfsec is 0. */
805 if (elfsec == 0)
806 {
4fbb74a6 807 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
dd863624
L
808 if (bed->link_order_error_handler)
809 bed->link_order_error_handler
810 (_("%B: warning: sh_link not set for section `%A'"),
811 abfd, s);
812 }
813 else
814 {
91d6fa6a 815 asection *linksec = NULL;
25bbc984 816
4fbb74a6
AM
817 if (elfsec < elf_numsections (abfd))
818 {
819 this_hdr = elf_elfsections (abfd)[elfsec];
91d6fa6a 820 linksec = this_hdr->bfd_section;
4fbb74a6 821 }
25bbc984
L
822
823 /* PR 1991, 2008:
824 Some strip/objcopy may leave an incorrect value in
825 sh_link. We don't want to proceed. */
91d6fa6a 826 if (linksec == NULL)
25bbc984
L
827 {
828 (*_bfd_error_handler)
829 (_("%B: sh_link [%d] in section `%A' is incorrect"),
830 s->owner, s, elfsec);
831 result = FALSE;
832 }
833
91d6fa6a 834 elf_linked_to_section (s) = linksec;
dd863624
L
835 }
836 }
837 }
3d7f7666 838
dd863624 839 /* Process section groups. */
3d7f7666
L
840 if (num_group == (unsigned) -1)
841 return result;
842
843 for (i = 0; i < num_group; i++)
844 {
845 Elf_Internal_Shdr *shdr = elf_tdata (abfd)->group_sect_ptr[i];
4b0e8a5f
NC
846 Elf_Internal_Group *idx;
847 unsigned int n_elt;
3d7f7666 848
4b0e8a5f
NC
849 /* PR binutils/18758: Beware of corrupt binaries with invalid group data. */
850 if (shdr == NULL || shdr->bfd_section == NULL || shdr->contents == NULL)
851 {
852 (*_bfd_error_handler)
853 (_("%B: section group entry number %u is corrupt"),
854 abfd, i);
855 result = FALSE;
856 continue;
857 }
858
859 idx = (Elf_Internal_Group *) shdr->contents;
860 n_elt = shdr->sh_size / 4;
1b786873 861
3d7f7666
L
862 while (--n_elt != 0)
863 if ((++idx)->shdr->bfd_section)
864 elf_sec_group (idx->shdr->bfd_section) = shdr->bfd_section;
865 else if (idx->shdr->sh_type == SHT_RELA
866 || idx->shdr->sh_type == SHT_REL)
867 /* We won't include relocation sections in section groups in
868 output object files. We adjust the group section size here
869 so that relocatable link will work correctly when
870 relocation sections are in section group in input object
871 files. */
872 shdr->bfd_section->size -= 4;
873 else
874 {
875 /* There are some unknown sections in the group. */
876 (*_bfd_error_handler)
d003868e
AM
877 (_("%B: unknown [%d] section `%s' in group [%s]"),
878 abfd,
3d7f7666 879 (unsigned int) idx->shdr->sh_type,
1b3a8575
AM
880 bfd_elf_string_from_elf_section (abfd,
881 (elf_elfheader (abfd)
882 ->e_shstrndx),
883 idx->shdr->sh_name),
3d7f7666
L
884 shdr->bfd_section->name);
885 result = FALSE;
886 }
887 }
888 return result;
889}
890
72adc230
AM
891bfd_boolean
892bfd_elf_is_group_section (bfd *abfd ATTRIBUTE_UNUSED, const asection *sec)
893{
894 return elf_next_in_group (sec) != NULL;
895}
896
f6fe1ccd
L
897static char *
898convert_debug_to_zdebug (bfd *abfd, const char *name)
899{
900 unsigned int len = strlen (name);
901 char *new_name = bfd_alloc (abfd, len + 2);
902 if (new_name == NULL)
903 return NULL;
904 new_name[0] = '.';
905 new_name[1] = 'z';
906 memcpy (new_name + 2, name + 1, len);
907 return new_name;
908}
909
910static char *
911convert_zdebug_to_debug (bfd *abfd, const char *name)
912{
913 unsigned int len = strlen (name);
914 char *new_name = bfd_alloc (abfd, len);
915 if (new_name == NULL)
916 return NULL;
917 new_name[0] = '.';
918 memcpy (new_name + 1, name + 2, len - 1);
919 return new_name;
920}
921
252b5132
RH
922/* Make a BFD section from an ELF section. We store a pointer to the
923 BFD section in the bfd_section field of the header. */
924
b34976b6 925bfd_boolean
217aa764
AM
926_bfd_elf_make_section_from_shdr (bfd *abfd,
927 Elf_Internal_Shdr *hdr,
6dc132d9
L
928 const char *name,
929 int shindex)
252b5132
RH
930{
931 asection *newsect;
932 flagword flags;
9c5bfbb7 933 const struct elf_backend_data *bed;
252b5132
RH
934
935 if (hdr->bfd_section != NULL)
4e011fb5 936 return TRUE;
252b5132
RH
937
938 newsect = bfd_make_section_anyway (abfd, name);
939 if (newsect == NULL)
b34976b6 940 return FALSE;
252b5132 941
1829f4b2
AM
942 hdr->bfd_section = newsect;
943 elf_section_data (newsect)->this_hdr = *hdr;
6dc132d9 944 elf_section_data (newsect)->this_idx = shindex;
1829f4b2 945
2f89ff8d
L
946 /* Always use the real type/flags. */
947 elf_section_type (newsect) = hdr->sh_type;
948 elf_section_flags (newsect) = hdr->sh_flags;
949
252b5132
RH
950 newsect->filepos = hdr->sh_offset;
951
952 if (! bfd_set_section_vma (abfd, newsect, hdr->sh_addr)
953 || ! bfd_set_section_size (abfd, newsect, hdr->sh_size)
954 || ! bfd_set_section_alignment (abfd, newsect,
72de5009 955 bfd_log2 (hdr->sh_addralign)))
b34976b6 956 return FALSE;
252b5132
RH
957
958 flags = SEC_NO_FLAGS;
959 if (hdr->sh_type != SHT_NOBITS)
960 flags |= SEC_HAS_CONTENTS;
dbb410c3 961 if (hdr->sh_type == SHT_GROUP)
b3096250 962 flags |= SEC_GROUP | SEC_EXCLUDE;
252b5132
RH
963 if ((hdr->sh_flags & SHF_ALLOC) != 0)
964 {
965 flags |= SEC_ALLOC;
966 if (hdr->sh_type != SHT_NOBITS)
967 flags |= SEC_LOAD;
968 }
969 if ((hdr->sh_flags & SHF_WRITE) == 0)
970 flags |= SEC_READONLY;
971 if ((hdr->sh_flags & SHF_EXECINSTR) != 0)
972 flags |= SEC_CODE;
973 else if ((flags & SEC_LOAD) != 0)
974 flags |= SEC_DATA;
f5fa8ca2
JJ
975 if ((hdr->sh_flags & SHF_MERGE) != 0)
976 {
977 flags |= SEC_MERGE;
978 newsect->entsize = hdr->sh_entsize;
f5fa8ca2 979 }
84865015
NC
980 if ((hdr->sh_flags & SHF_STRINGS) != 0)
981 flags |= SEC_STRINGS;
dbb410c3
AM
982 if (hdr->sh_flags & SHF_GROUP)
983 if (!setup_group (abfd, hdr, newsect))
b34976b6 984 return FALSE;
13ae64f3
JJ
985 if ((hdr->sh_flags & SHF_TLS) != 0)
986 flags |= SEC_THREAD_LOCAL;
18ae9cc1
L
987 if ((hdr->sh_flags & SHF_EXCLUDE) != 0)
988 flags |= SEC_EXCLUDE;
252b5132 989
3d2b39cf 990 if ((flags & SEC_ALLOC) == 0)
7a6cc5fb 991 {
3d2b39cf
L
992 /* The debugging sections appear to be recognized only by name,
993 not any sort of flag. Their SEC_ALLOC bits are cleared. */
3d2b39cf
L
994 if (name [0] == '.')
995 {
f073ced3
AM
996 const char *p;
997 int n;
998 if (name[1] == 'd')
999 p = ".debug", n = 6;
1000 else if (name[1] == 'g' && name[2] == 'n')
1001 p = ".gnu.linkonce.wi.", n = 17;
1002 else if (name[1] == 'g' && name[2] == 'd')
1003 p = ".gdb_index", n = 11; /* yes we really do mean 11. */
1004 else if (name[1] == 'l')
1005 p = ".line", n = 5;
1006 else if (name[1] == 's')
1007 p = ".stab", n = 5;
1008 else if (name[1] == 'z')
1009 p = ".zdebug", n = 7;
1010 else
1011 p = NULL, n = 0;
1012 if (p != NULL && strncmp (name, p, n) == 0)
3d2b39cf
L
1013 flags |= SEC_DEBUGGING;
1014 }
1015 }
252b5132
RH
1016
1017 /* As a GNU extension, if the name begins with .gnu.linkonce, we
1018 only link a single copy of the section. This is used to support
1019 g++. g++ will emit each template expansion in its own section.
1020 The symbols will be defined as weak, so that multiple definitions
1021 are permitted. The GNU linker extension is to actually discard
1022 all but one of the sections. */
0112cd26 1023 if (CONST_STRNEQ (name, ".gnu.linkonce")
b885599b 1024 && elf_next_in_group (newsect) == NULL)
252b5132
RH
1025 flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
1026
fa152c49
JW
1027 bed = get_elf_backend_data (abfd);
1028 if (bed->elf_backend_section_flags)
1029 if (! bed->elf_backend_section_flags (&flags, hdr))
b34976b6 1030 return FALSE;
fa152c49 1031
252b5132 1032 if (! bfd_set_section_flags (abfd, newsect, flags))
b34976b6 1033 return FALSE;
252b5132 1034
718175fa
JK
1035 /* We do not parse the PT_NOTE segments as we are interested even in the
1036 separate debug info files which may have the segments offsets corrupted.
1037 PT_NOTEs from the core files are currently not parsed using BFD. */
1038 if (hdr->sh_type == SHT_NOTE)
1039 {
baea7ef1 1040 bfd_byte *contents;
718175fa 1041
baea7ef1 1042 if (!bfd_malloc_and_get_section (abfd, newsect, &contents))
718175fa
JK
1043 return FALSE;
1044
baea7ef1 1045 elf_parse_notes (abfd, (char *) contents, hdr->sh_size, -1);
718175fa
JK
1046 free (contents);
1047 }
1048
252b5132
RH
1049 if ((flags & SEC_ALLOC) != 0)
1050 {
1051 Elf_Internal_Phdr *phdr;
6ffd7900
AM
1052 unsigned int i, nload;
1053
1054 /* Some ELF linkers produce binaries with all the program header
1055 p_paddr fields zero. If we have such a binary with more than
1056 one PT_LOAD header, then leave the section lma equal to vma
1057 so that we don't create sections with overlapping lma. */
1058 phdr = elf_tdata (abfd)->phdr;
1059 for (nload = 0, i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
1060 if (phdr->p_paddr != 0)
1061 break;
1062 else if (phdr->p_type == PT_LOAD && phdr->p_memsz != 0)
1063 ++nload;
1064 if (i >= elf_elfheader (abfd)->e_phnum && nload > 1)
1065 return TRUE;
252b5132 1066
252b5132
RH
1067 phdr = elf_tdata (abfd)->phdr;
1068 for (i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
1069 {
86b2281f
AM
1070 if (((phdr->p_type == PT_LOAD
1071 && (hdr->sh_flags & SHF_TLS) == 0)
1072 || phdr->p_type == PT_TLS)
9a83a553 1073 && ELF_SECTION_IN_SEGMENT (hdr, phdr))
252b5132 1074 {
88967714
AM
1075 if ((flags & SEC_LOAD) == 0)
1076 newsect->lma = (phdr->p_paddr
1077 + hdr->sh_addr - phdr->p_vaddr);
1078 else
1079 /* We used to use the same adjustment for SEC_LOAD
1080 sections, but that doesn't work if the segment
1081 is packed with code from multiple VMAs.
1082 Instead we calculate the section LMA based on
1083 the segment LMA. It is assumed that the
1084 segment will contain sections with contiguous
1085 LMAs, even if the VMAs are not. */
1086 newsect->lma = (phdr->p_paddr
1087 + hdr->sh_offset - phdr->p_offset);
1088
1089 /* With contiguous segments, we can't tell from file
1090 offsets whether a section with zero size should
1091 be placed at the end of one segment or the
1092 beginning of the next. Decide based on vaddr. */
1093 if (hdr->sh_addr >= phdr->p_vaddr
1094 && (hdr->sh_addr + hdr->sh_size
1095 <= phdr->p_vaddr + phdr->p_memsz))
1096 break;
252b5132
RH
1097 }
1098 }
1099 }
1100
4a114e3e
L
1101 /* Compress/decompress DWARF debug sections with names: .debug_* and
1102 .zdebug_*, after the section flags is set. */
1103 if ((flags & SEC_DEBUGGING)
1104 && ((name[1] == 'd' && name[6] == '_')
1105 || (name[1] == 'z' && name[7] == '_')))
1106 {
1107 enum { nothing, compress, decompress } action = nothing;
151411f8 1108 int compression_header_size;
dab394de 1109 bfd_size_type uncompressed_size;
151411f8
L
1110 bfd_boolean compressed
1111 = bfd_is_section_compressed_with_header (abfd, newsect,
dab394de
L
1112 &compression_header_size,
1113 &uncompressed_size);
4a114e3e 1114
151411f8 1115 if (compressed)
4a114e3e
L
1116 {
1117 /* Compressed section. Check if we should decompress. */
1118 if ((abfd->flags & BFD_DECOMPRESS))
1119 action = decompress;
1120 }
151411f8
L
1121
1122 /* Compress the uncompressed section or convert from/to .zdebug*
1123 section. Check if we should compress. */
1124 if (action == nothing)
4a114e3e 1125 {
151411f8
L
1126 if (newsect->size != 0
1127 && (abfd->flags & BFD_COMPRESS)
1128 && compression_header_size >= 0
dab394de 1129 && uncompressed_size > 0
151411f8
L
1130 && (!compressed
1131 || ((compression_header_size > 0)
1132 != ((abfd->flags & BFD_COMPRESS_GABI) != 0))))
4a114e3e 1133 action = compress;
151411f8
L
1134 else
1135 return TRUE;
4a114e3e
L
1136 }
1137
151411f8 1138 if (action == compress)
4a114e3e 1139 {
4a114e3e
L
1140 if (!bfd_init_section_compress_status (abfd, newsect))
1141 {
1142 (*_bfd_error_handler)
bc823199 1143 (_("%B: unable to initialize compress status for section %s"),
4a114e3e
L
1144 abfd, name);
1145 return FALSE;
1146 }
151411f8
L
1147 }
1148 else
1149 {
4a114e3e
L
1150 if (!bfd_init_section_decompress_status (abfd, newsect))
1151 {
1152 (*_bfd_error_handler)
bc823199 1153 (_("%B: unable to initialize decompress status for section %s"),
4a114e3e
L
1154 abfd, name);
1155 return FALSE;
1156 }
151411f8
L
1157 }
1158
f6fe1ccd 1159 if (abfd->is_linker_input)
151411f8 1160 {
f6fe1ccd
L
1161 if (name[1] == 'z'
1162 && (action == decompress
1163 || (action == compress
1164 && (abfd->flags & BFD_COMPRESS_GABI) != 0)))
4e011fb5 1165 {
f6fe1ccd
L
1166 /* Convert section name from .zdebug_* to .debug_* so
1167 that linker will consider this section as a debug
1168 section. */
1169 char *new_name = convert_zdebug_to_debug (abfd, name);
151411f8
L
1170 if (new_name == NULL)
1171 return FALSE;
f6fe1ccd 1172 bfd_rename_section (abfd, newsect, new_name);
151411f8 1173 }
4a114e3e 1174 }
f6fe1ccd
L
1175 else
1176 /* For objdump, don't rename the section. For objcopy, delay
1177 section rename to elf_fake_sections. */
1178 newsect->flags |= SEC_ELF_RENAME;
4a114e3e
L
1179 }
1180
b34976b6 1181 return TRUE;
252b5132
RH
1182}
1183
84865015
NC
1184const char *const bfd_elf_section_type_names[] =
1185{
252b5132
RH
1186 "SHT_NULL", "SHT_PROGBITS", "SHT_SYMTAB", "SHT_STRTAB",
1187 "SHT_RELA", "SHT_HASH", "SHT_DYNAMIC", "SHT_NOTE",
1188 "SHT_NOBITS", "SHT_REL", "SHT_SHLIB", "SHT_DYNSYM",
1189};
1190
1049f94e 1191/* ELF relocs are against symbols. If we are producing relocatable
252b5132
RH
1192 output, and the reloc is against an external symbol, and nothing
1193 has given us any additional addend, the resulting reloc will also
1194 be against the same symbol. In such a case, we don't want to
1195 change anything about the way the reloc is handled, since it will
1196 all be done at final link time. Rather than put special case code
1197 into bfd_perform_relocation, all the reloc types use this howto
1198 function. It just short circuits the reloc if producing
1049f94e 1199 relocatable output against an external symbol. */
252b5132 1200
252b5132 1201bfd_reloc_status_type
217aa764
AM
1202bfd_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED,
1203 arelent *reloc_entry,
1204 asymbol *symbol,
1205 void *data ATTRIBUTE_UNUSED,
1206 asection *input_section,
1207 bfd *output_bfd,
1208 char **error_message ATTRIBUTE_UNUSED)
1209{
1210 if (output_bfd != NULL
252b5132
RH
1211 && (symbol->flags & BSF_SECTION_SYM) == 0
1212 && (! reloc_entry->howto->partial_inplace
1213 || reloc_entry->addend == 0))
1214 {
1215 reloc_entry->address += input_section->output_offset;
1216 return bfd_reloc_ok;
1217 }
1218
1219 return bfd_reloc_continue;
1220}
1221\f
84865015
NC
1222/* Returns TRUE if section A matches section B.
1223 Names, addresses and links may be different, but everything else
1224 should be the same. */
1225
1226static bfd_boolean
5522f910
NC
1227section_match (const Elf_Internal_Shdr * a,
1228 const Elf_Internal_Shdr * b)
84865015
NC
1229{
1230 return
1231 a->sh_type == b->sh_type
5522f910
NC
1232 && (a->sh_flags & ~ SHF_INFO_LINK)
1233 == (b->sh_flags & ~ SHF_INFO_LINK)
84865015
NC
1234 && a->sh_addralign == b->sh_addralign
1235 && a->sh_size == b->sh_size
1236 && a->sh_entsize == b->sh_entsize
1237 /* FIXME: Check sh_addr ? */
1238 ;
1239}
1240
1241/* Find a section in OBFD that has the same characteristics
1242 as IHEADER. Return the index of this section or SHN_UNDEF if
1243 none can be found. Check's section HINT first, as this is likely
1244 to be the correct section. */
1245
1246static unsigned int
5522f910 1247find_link (const bfd * obfd, const Elf_Internal_Shdr * iheader, const unsigned int hint)
84865015
NC
1248{
1249 Elf_Internal_Shdr ** oheaders = elf_elfsections (obfd);
1250 unsigned int i;
1251
1252 if (section_match (oheaders[hint], iheader))
1253 return hint;
1254
1255 for (i = 1; i < elf_numsections (obfd); i++)
1256 {
1257 Elf_Internal_Shdr * oheader = oheaders[i];
1258
1259 if (section_match (oheader, iheader))
1260 /* FIXME: Do we care if there is a potential for
1261 multiple matches ? */
1262 return i;
1263 }
1264
1265 return SHN_UNDEF;
1266}
1267
5522f910
NC
1268/* PR 19938: Attempt to set the ELF section header fields of an OS or
1269 Processor specific section, based upon a matching input section.
1270 Returns TRUE upon success, FALSE otherwise. */
1271
1272static bfd_boolean
1273copy_special_section_fields (const bfd *ibfd,
1274 bfd *obfd,
1275 const Elf_Internal_Shdr *iheader,
1276 Elf_Internal_Shdr *oheader,
1277 const unsigned int secnum)
1278{
1279 const struct elf_backend_data *bed = get_elf_backend_data (obfd);
1280 const Elf_Internal_Shdr **iheaders = (const Elf_Internal_Shdr **) elf_elfsections (ibfd);
1281 bfd_boolean changed = FALSE;
1282 unsigned int sh_link;
1283
1284 if (oheader->sh_type == SHT_NOBITS)
1285 {
1286 /* This is a feature for objcopy --only-keep-debug:
1287 When a section's type is changed to NOBITS, we preserve
1288 the sh_link and sh_info fields so that they can be
1289 matched up with the original.
1290
1291 Note: Strictly speaking these assignments are wrong.
1292 The sh_link and sh_info fields should point to the
1293 relevent sections in the output BFD, which may not be in
1294 the same location as they were in the input BFD. But
1295 the whole point of this action is to preserve the
1296 original values of the sh_link and sh_info fields, so
1297 that they can be matched up with the section headers in
1298 the original file. So strictly speaking we may be
1299 creating an invalid ELF file, but it is only for a file
1300 that just contains debug info and only for sections
1301 without any contents. */
1302 if (oheader->sh_link == 0)
1303 oheader->sh_link = iheader->sh_link;
1304 if (oheader->sh_info == 0)
1305 oheader->sh_info = iheader->sh_info;
1306 return TRUE;
1307 }
1308
1309 /* Allow the target a chance to decide how these fields should be set. */
1310 if (bed->elf_backend_copy_special_section_fields != NULL
1311 && bed->elf_backend_copy_special_section_fields
1312 (ibfd, obfd, iheader, oheader))
1313 return TRUE;
1314
1315 /* We have an iheader which might match oheader, and which has non-zero
1316 sh_info and/or sh_link fields. Attempt to follow those links and find
1317 the section in the output bfd which corresponds to the linked section
1318 in the input bfd. */
1319 if (iheader->sh_link != SHN_UNDEF)
1320 {
1321 sh_link = find_link (obfd, iheaders[iheader->sh_link], iheader->sh_link);
1322 if (sh_link != SHN_UNDEF)
1323 {
1324 oheader->sh_link = sh_link;
1325 changed = TRUE;
1326 }
1327 else
1328 /* FIXME: Should we install iheader->sh_link
1329 if we could not find a match ? */
1330 (* _bfd_error_handler)
1331 (_("%B: Failed to find link section for section %d"), obfd, secnum);
1332 }
1333
1334 if (iheader->sh_info)
1335 {
1336 /* The sh_info field can hold arbitrary information, but if the
1337 SHF_LINK_INFO flag is set then it should be interpreted as a
1338 section index. */
1339 if (iheader->sh_flags & SHF_INFO_LINK)
1340 {
1341 sh_link = find_link (obfd, iheaders[iheader->sh_info],
1342 iheader->sh_info);
1343 if (sh_link != SHN_UNDEF)
1344 oheader->sh_flags |= SHF_INFO_LINK;
1345 }
1346 else
1347 /* No idea what it means - just copy it. */
1348 sh_link = iheader->sh_info;
1349
1350 if (sh_link != SHN_UNDEF)
1351 {
1352 oheader->sh_info = sh_link;
1353 changed = TRUE;
1354 }
1355 else
1356 (* _bfd_error_handler)
1357 (_("%B: Failed to find info section for section %d"), obfd, secnum);
1358 }
1359
1360 return changed;
1361}
1362
0ac4564e
L
1363/* Copy the program header and other data from one object module to
1364 another. */
252b5132 1365
b34976b6 1366bfd_boolean
217aa764 1367_bfd_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
2d502050 1368{
5522f910
NC
1369 const Elf_Internal_Shdr **iheaders = (const Elf_Internal_Shdr **) elf_elfsections (ibfd);
1370 Elf_Internal_Shdr **oheaders = elf_elfsections (obfd);
1371 const struct elf_backend_data *bed;
84865015
NC
1372 unsigned int i;
1373
2d502050 1374 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
84865015 1375 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
b34976b6 1376 return TRUE;
2d502050 1377
57b828ef
L
1378 if (!elf_flags_init (obfd))
1379 {
1380 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
1381 elf_flags_init (obfd) = TRUE;
1382 }
2d502050 1383
0ac4564e 1384 elf_gp (obfd) = elf_gp (ibfd);
57b828ef
L
1385
1386 /* Also copy the EI_OSABI field. */
1387 elf_elfheader (obfd)->e_ident[EI_OSABI] =
1388 elf_elfheader (ibfd)->e_ident[EI_OSABI];
104d59d1 1389
5522f910
NC
1390 /* If set, copy the EI_ABIVERSION field. */
1391 if (elf_elfheader (ibfd)->e_ident[EI_ABIVERSION])
1392 elf_elfheader (obfd)->e_ident[EI_ABIVERSION]
1393 = elf_elfheader (ibfd)->e_ident[EI_ABIVERSION];
1394
104d59d1
JM
1395 /* Copy object attributes. */
1396 _bfd_elf_copy_obj_attributes (ibfd, obfd);
63b9bbb7 1397
84865015
NC
1398 if (iheaders == NULL || oheaders == NULL)
1399 return TRUE;
63b9bbb7 1400
5522f910
NC
1401 bed = get_elf_backend_data (obfd);
1402
1403 /* Possibly copy other fields in the section header. */
84865015 1404 for (i = 1; i < elf_numsections (obfd); i++)
63b9bbb7 1405 {
84865015
NC
1406 unsigned int j;
1407 Elf_Internal_Shdr * oheader = oheaders[i];
63b9bbb7 1408
5522f910
NC
1409 /* Ignore ordinary sections. SHT_NOBITS sections are considered however
1410 because of a special case need for generating separate debug info
1411 files. See below for more details. */
84865015
NC
1412 if (oheader == NULL
1413 || (oheader->sh_type != SHT_NOBITS
5522f910
NC
1414 && oheader->sh_type < SHT_LOOS))
1415 continue;
1416
1417 /* Ignore empty sections, and sections whose
1418 fields have already been initialised. */
1419 if (oheader->sh_size == 0
84865015
NC
1420 || (oheader->sh_info != 0 && oheader->sh_link != 0))
1421 continue;
63b9bbb7 1422
84865015 1423 /* Scan for the matching section in the input bfd.
5522f910
NC
1424 First we try for a direct mapping between the input and output sections. */
1425 for (j = 1; j < elf_numsections (ibfd); j++)
1426 {
1427 const Elf_Internal_Shdr * iheader = iheaders[j];
1428
1429 if (iheader == NULL)
1430 continue;
1431
1432 if (oheader->bfd_section != NULL
1433 && iheader->bfd_section != NULL
1434 && iheader->bfd_section->output_section != NULL
1435 && iheader->bfd_section->output_section == oheader->bfd_section)
1436 {
1437 /* We have found a connection from the input section to the
1438 output section. Attempt to copy the header fields. If
1439 this fails then do not try any further sections - there
1440 should only be a one-to-one mapping between input and output. */
1441 if (! copy_special_section_fields (ibfd, obfd, iheader, oheader, i))
1442 j = elf_numsections (ibfd);
1443 break;
1444 }
1445 }
1446
1447 if (j < elf_numsections (ibfd))
1448 continue;
1449
1450 /* That failed. So try to deduce the corresponding input section.
84865015
NC
1451 Unfortunately we cannot compare names as the output string table
1452 is empty, so instead we check size, address and type. */
1453 for (j = 1; j < elf_numsections (ibfd); j++)
1454 {
5522f910 1455 const Elf_Internal_Shdr * iheader = iheaders[j];
84865015 1456
5522f910
NC
1457 if (iheader == NULL)
1458 continue;
1459
1460 /* Try matching fields in the input section's header.
1461 Since --only-keep-debug turns all non-debug sections into
84865015
NC
1462 SHT_NOBITS sections, the output SHT_NOBITS type matches any
1463 input type. */
1464 if ((oheader->sh_type == SHT_NOBITS
1465 || iheader->sh_type == oheader->sh_type)
5522f910
NC
1466 && (iheader->sh_flags & ~ SHF_INFO_LINK)
1467 == (oheader->sh_flags & ~ SHF_INFO_LINK)
84865015
NC
1468 && iheader->sh_addralign == oheader->sh_addralign
1469 && iheader->sh_entsize == oheader->sh_entsize
1470 && iheader->sh_size == oheader->sh_size
1471 && iheader->sh_addr == oheader->sh_addr
1472 && (iheader->sh_info != oheader->sh_info
1473 || iheader->sh_link != oheader->sh_link))
63b9bbb7 1474 {
5522f910
NC
1475 if (copy_special_section_fields (ibfd, obfd, iheader, oheader, i))
1476 break;
63b9bbb7
NC
1477 }
1478 }
5522f910
NC
1479
1480 if (j == elf_numsections (ibfd) && oheader->sh_type >= SHT_LOOS)
1481 {
1482 /* Final attempt. Call the backend copy function
1483 with a NULL input section. */
1484 if (bed->elf_backend_copy_special_section_fields != NULL)
1485 bed->elf_backend_copy_special_section_fields (ibfd, obfd, NULL, oheader);
1486 }
63b9bbb7
NC
1487 }
1488
b34976b6 1489 return TRUE;
2d502050
L
1490}
1491
cedc298e
L
1492static const char *
1493get_segment_type (unsigned int p_type)
1494{
1495 const char *pt;
1496 switch (p_type)
1497 {
1498 case PT_NULL: pt = "NULL"; break;
1499 case PT_LOAD: pt = "LOAD"; break;
1500 case PT_DYNAMIC: pt = "DYNAMIC"; break;
1501 case PT_INTERP: pt = "INTERP"; break;
1502 case PT_NOTE: pt = "NOTE"; break;
1503 case PT_SHLIB: pt = "SHLIB"; break;
1504 case PT_PHDR: pt = "PHDR"; break;
1505 case PT_TLS: pt = "TLS"; break;
1506 case PT_GNU_EH_FRAME: pt = "EH_FRAME"; break;
2b05f1b7 1507 case PT_GNU_STACK: pt = "STACK"; break;
cedc298e
L
1508 case PT_GNU_RELRO: pt = "RELRO"; break;
1509 default: pt = NULL; break;
1510 }
1511 return pt;
1512}
1513
f0b79d91
L
1514/* Print out the program headers. */
1515
b34976b6 1516bfd_boolean
217aa764 1517_bfd_elf_print_private_bfd_data (bfd *abfd, void *farg)
252b5132 1518{
a50b1753 1519 FILE *f = (FILE *) farg;
252b5132
RH
1520 Elf_Internal_Phdr *p;
1521 asection *s;
1522 bfd_byte *dynbuf = NULL;
1523
1524 p = elf_tdata (abfd)->phdr;
1525 if (p != NULL)
1526 {
1527 unsigned int i, c;
1528
1529 fprintf (f, _("\nProgram Header:\n"));
1530 c = elf_elfheader (abfd)->e_phnum;
1531 for (i = 0; i < c; i++, p++)
1532 {
cedc298e 1533 const char *pt = get_segment_type (p->p_type);
252b5132
RH
1534 char buf[20];
1535
cedc298e 1536 if (pt == NULL)
252b5132 1537 {
cedc298e
L
1538 sprintf (buf, "0x%lx", p->p_type);
1539 pt = buf;
252b5132 1540 }
dc810e39 1541 fprintf (f, "%8s off 0x", pt);
60b89a18 1542 bfd_fprintf_vma (abfd, f, p->p_offset);
252b5132 1543 fprintf (f, " vaddr 0x");
60b89a18 1544 bfd_fprintf_vma (abfd, f, p->p_vaddr);
252b5132 1545 fprintf (f, " paddr 0x");
60b89a18 1546 bfd_fprintf_vma (abfd, f, p->p_paddr);
252b5132
RH
1547 fprintf (f, " align 2**%u\n", bfd_log2 (p->p_align));
1548 fprintf (f, " filesz 0x");
60b89a18 1549 bfd_fprintf_vma (abfd, f, p->p_filesz);
252b5132 1550 fprintf (f, " memsz 0x");
60b89a18 1551 bfd_fprintf_vma (abfd, f, p->p_memsz);
252b5132
RH
1552 fprintf (f, " flags %c%c%c",
1553 (p->p_flags & PF_R) != 0 ? 'r' : '-',
1554 (p->p_flags & PF_W) != 0 ? 'w' : '-',
1555 (p->p_flags & PF_X) != 0 ? 'x' : '-');
dc810e39
AM
1556 if ((p->p_flags &~ (unsigned) (PF_R | PF_W | PF_X)) != 0)
1557 fprintf (f, " %lx", p->p_flags &~ (unsigned) (PF_R | PF_W | PF_X));
252b5132
RH
1558 fprintf (f, "\n");
1559 }
1560 }
1561
1562 s = bfd_get_section_by_name (abfd, ".dynamic");
1563 if (s != NULL)
1564 {
cb33740c 1565 unsigned int elfsec;
dc810e39 1566 unsigned long shlink;
252b5132
RH
1567 bfd_byte *extdyn, *extdynend;
1568 size_t extdynsize;
217aa764 1569 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
252b5132
RH
1570
1571 fprintf (f, _("\nDynamic Section:\n"));
1572
eea6121a 1573 if (!bfd_malloc_and_get_section (abfd, s, &dynbuf))
252b5132
RH
1574 goto error_return;
1575
1576 elfsec = _bfd_elf_section_from_bfd_section (abfd, s);
cb33740c 1577 if (elfsec == SHN_BAD)
252b5132 1578 goto error_return;
dc810e39 1579 shlink = elf_elfsections (abfd)[elfsec]->sh_link;
252b5132
RH
1580
1581 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
1582 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
1583
1584 extdyn = dynbuf;
06614111
NC
1585 /* PR 17512: file: 6f427532. */
1586 if (s->size < extdynsize)
1587 goto error_return;
eea6121a 1588 extdynend = extdyn + s->size;
1036838a
NC
1589 /* PR 17512: file: id:000006,sig:06,src:000000,op:flip4,pos:5664.
1590 Fix range check. */
1591 for (; extdyn <= (extdynend - extdynsize); extdyn += extdynsize)
252b5132
RH
1592 {
1593 Elf_Internal_Dyn dyn;
ad9563d6 1594 const char *name = "";
252b5132 1595 char ab[20];
b34976b6 1596 bfd_boolean stringp;
ad9563d6 1597 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 1598
217aa764 1599 (*swap_dyn_in) (abfd, extdyn, &dyn);
252b5132
RH
1600
1601 if (dyn.d_tag == DT_NULL)
1602 break;
1603
b34976b6 1604 stringp = FALSE;
252b5132
RH
1605 switch (dyn.d_tag)
1606 {
1607 default:
ad9563d6
CM
1608 if (bed->elf_backend_get_target_dtag)
1609 name = (*bed->elf_backend_get_target_dtag) (dyn.d_tag);
1610
1611 if (!strcmp (name, ""))
1612 {
1613 sprintf (ab, "0x%lx", (unsigned long) dyn.d_tag);
1614 name = ab;
1615 }
252b5132
RH
1616 break;
1617
b34976b6 1618 case DT_NEEDED: name = "NEEDED"; stringp = TRUE; break;
252b5132
RH
1619 case DT_PLTRELSZ: name = "PLTRELSZ"; break;
1620 case DT_PLTGOT: name = "PLTGOT"; break;
1621 case DT_HASH: name = "HASH"; break;
1622 case DT_STRTAB: name = "STRTAB"; break;
1623 case DT_SYMTAB: name = "SYMTAB"; break;
1624 case DT_RELA: name = "RELA"; break;
1625 case DT_RELASZ: name = "RELASZ"; break;
1626 case DT_RELAENT: name = "RELAENT"; break;
1627 case DT_STRSZ: name = "STRSZ"; break;
1628 case DT_SYMENT: name = "SYMENT"; break;
1629 case DT_INIT: name = "INIT"; break;
1630 case DT_FINI: name = "FINI"; break;
b34976b6
AM
1631 case DT_SONAME: name = "SONAME"; stringp = TRUE; break;
1632 case DT_RPATH: name = "RPATH"; stringp = TRUE; break;
252b5132
RH
1633 case DT_SYMBOLIC: name = "SYMBOLIC"; break;
1634 case DT_REL: name = "REL"; break;
1635 case DT_RELSZ: name = "RELSZ"; break;
1636 case DT_RELENT: name = "RELENT"; break;
1637 case DT_PLTREL: name = "PLTREL"; break;
1638 case DT_DEBUG: name = "DEBUG"; break;
1639 case DT_TEXTREL: name = "TEXTREL"; break;
1640 case DT_JMPREL: name = "JMPREL"; break;
94558834
L
1641 case DT_BIND_NOW: name = "BIND_NOW"; break;
1642 case DT_INIT_ARRAY: name = "INIT_ARRAY"; break;
1643 case DT_FINI_ARRAY: name = "FINI_ARRAY"; break;
1644 case DT_INIT_ARRAYSZ: name = "INIT_ARRAYSZ"; break;
1645 case DT_FINI_ARRAYSZ: name = "FINI_ARRAYSZ"; break;
b34976b6 1646 case DT_RUNPATH: name = "RUNPATH"; stringp = TRUE; break;
94558834
L
1647 case DT_FLAGS: name = "FLAGS"; break;
1648 case DT_PREINIT_ARRAY: name = "PREINIT_ARRAY"; break;
1649 case DT_PREINIT_ARRAYSZ: name = "PREINIT_ARRAYSZ"; break;
d48188b9 1650 case DT_CHECKSUM: name = "CHECKSUM"; break;
94558834
L
1651 case DT_PLTPADSZ: name = "PLTPADSZ"; break;
1652 case DT_MOVEENT: name = "MOVEENT"; break;
1653 case DT_MOVESZ: name = "MOVESZ"; break;
1654 case DT_FEATURE: name = "FEATURE"; break;
1655 case DT_POSFLAG_1: name = "POSFLAG_1"; break;
1656 case DT_SYMINSZ: name = "SYMINSZ"; break;
1657 case DT_SYMINENT: name = "SYMINENT"; break;
b34976b6
AM
1658 case DT_CONFIG: name = "CONFIG"; stringp = TRUE; break;
1659 case DT_DEPAUDIT: name = "DEPAUDIT"; stringp = TRUE; break;
1660 case DT_AUDIT: name = "AUDIT"; stringp = TRUE; break;
94558834
L
1661 case DT_PLTPAD: name = "PLTPAD"; break;
1662 case DT_MOVETAB: name = "MOVETAB"; break;
1663 case DT_SYMINFO: name = "SYMINFO"; break;
1664 case DT_RELACOUNT: name = "RELACOUNT"; break;
1665 case DT_RELCOUNT: name = "RELCOUNT"; break;
1666 case DT_FLAGS_1: name = "FLAGS_1"; break;
252b5132
RH
1667 case DT_VERSYM: name = "VERSYM"; break;
1668 case DT_VERDEF: name = "VERDEF"; break;
1669 case DT_VERDEFNUM: name = "VERDEFNUM"; break;
1670 case DT_VERNEED: name = "VERNEED"; break;
1671 case DT_VERNEEDNUM: name = "VERNEEDNUM"; break;
b34976b6 1672 case DT_AUXILIARY: name = "AUXILIARY"; stringp = TRUE; break;
94558834 1673 case DT_USED: name = "USED"; break;
b34976b6 1674 case DT_FILTER: name = "FILTER"; stringp = TRUE; break;
fdc90cb4 1675 case DT_GNU_HASH: name = "GNU_HASH"; break;
252b5132
RH
1676 }
1677
ad9563d6 1678 fprintf (f, " %-20s ", name);
252b5132 1679 if (! stringp)
a1f3c56e
AN
1680 {
1681 fprintf (f, "0x");
1682 bfd_fprintf_vma (abfd, f, dyn.d_un.d_val);
1683 }
252b5132
RH
1684 else
1685 {
1686 const char *string;
dc810e39 1687 unsigned int tagv = dyn.d_un.d_val;
252b5132 1688
dc810e39 1689 string = bfd_elf_string_from_elf_section (abfd, shlink, tagv);
252b5132
RH
1690 if (string == NULL)
1691 goto error_return;
1692 fprintf (f, "%s", string);
1693 }
1694 fprintf (f, "\n");
1695 }
1696
1697 free (dynbuf);
1698 dynbuf = NULL;
1699 }
1700
1701 if ((elf_dynverdef (abfd) != 0 && elf_tdata (abfd)->verdef == NULL)
1702 || (elf_dynverref (abfd) != 0 && elf_tdata (abfd)->verref == NULL))
1703 {
fc0e6df6 1704 if (! _bfd_elf_slurp_version_tables (abfd, FALSE))
b34976b6 1705 return FALSE;
252b5132
RH
1706 }
1707
1708 if (elf_dynverdef (abfd) != 0)
1709 {
1710 Elf_Internal_Verdef *t;
1711
1712 fprintf (f, _("\nVersion definitions:\n"));
1713 for (t = elf_tdata (abfd)->verdef; t != NULL; t = t->vd_nextdef)
1714 {
1715 fprintf (f, "%d 0x%2.2x 0x%8.8lx %s\n", t->vd_ndx,
d0fb9a8d
JJ
1716 t->vd_flags, t->vd_hash,
1717 t->vd_nodename ? t->vd_nodename : "<corrupt>");
1718 if (t->vd_auxptr != NULL && t->vd_auxptr->vda_nextptr != NULL)
252b5132
RH
1719 {
1720 Elf_Internal_Verdaux *a;
1721
1722 fprintf (f, "\t");
1723 for (a = t->vd_auxptr->vda_nextptr;
1724 a != NULL;
1725 a = a->vda_nextptr)
d0fb9a8d
JJ
1726 fprintf (f, "%s ",
1727 a->vda_nodename ? a->vda_nodename : "<corrupt>");
252b5132
RH
1728 fprintf (f, "\n");
1729 }
1730 }
1731 }
1732
1733 if (elf_dynverref (abfd) != 0)
1734 {
1735 Elf_Internal_Verneed *t;
1736
1737 fprintf (f, _("\nVersion References:\n"));
1738 for (t = elf_tdata (abfd)->verref; t != NULL; t = t->vn_nextref)
1739 {
1740 Elf_Internal_Vernaux *a;
1741
d0fb9a8d
JJ
1742 fprintf (f, _(" required from %s:\n"),
1743 t->vn_filename ? t->vn_filename : "<corrupt>");
252b5132
RH
1744 for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr)
1745 fprintf (f, " 0x%8.8lx 0x%2.2x %2.2d %s\n", a->vna_hash,
d0fb9a8d
JJ
1746 a->vna_flags, a->vna_other,
1747 a->vna_nodename ? a->vna_nodename : "<corrupt>");
252b5132
RH
1748 }
1749 }
1750
b34976b6 1751 return TRUE;
252b5132
RH
1752
1753 error_return:
1754 if (dynbuf != NULL)
1755 free (dynbuf);
b34976b6 1756 return FALSE;
252b5132
RH
1757}
1758
bb4d2ac2
L
1759/* Get version string. */
1760
1761const char *
60bb06bc
L
1762_bfd_elf_get_symbol_version_string (bfd *abfd, asymbol *symbol,
1763 bfd_boolean *hidden)
bb4d2ac2
L
1764{
1765 const char *version_string = NULL;
1766 if (elf_dynversym (abfd) != 0
1767 && (elf_dynverdef (abfd) != 0 || elf_dynverref (abfd) != 0))
1768 {
1769 unsigned int vernum = ((elf_symbol_type *) symbol)->version;
1770
1771 *hidden = (vernum & VERSYM_HIDDEN) != 0;
1772 vernum &= VERSYM_VERSION;
1773
1774 if (vernum == 0)
1775 version_string = "";
1776 else if (vernum == 1)
1777 version_string = "Base";
1778 else if (vernum <= elf_tdata (abfd)->cverdefs)
1779 version_string =
1780 elf_tdata (abfd)->verdef[vernum - 1].vd_nodename;
1781 else
1782 {
1783 Elf_Internal_Verneed *t;
1784
1785 version_string = "";
1786 for (t = elf_tdata (abfd)->verref;
1787 t != NULL;
1788 t = t->vn_nextref)
1789 {
1790 Elf_Internal_Vernaux *a;
1791
1792 for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr)
1793 {
1794 if (a->vna_other == vernum)
1795 {
1796 version_string = a->vna_nodename;
1797 break;
1798 }
1799 }
1800 }
1801 }
1802 }
1803 return version_string;
1804}
1805
252b5132
RH
1806/* Display ELF-specific fields of a symbol. */
1807
1808void
217aa764
AM
1809bfd_elf_print_symbol (bfd *abfd,
1810 void *filep,
1811 asymbol *symbol,
1812 bfd_print_symbol_type how)
252b5132 1813{
a50b1753 1814 FILE *file = (FILE *) filep;
252b5132
RH
1815 switch (how)
1816 {
1817 case bfd_print_symbol_name:
1818 fprintf (file, "%s", symbol->name);
1819 break;
1820 case bfd_print_symbol_more:
1821 fprintf (file, "elf ");
60b89a18 1822 bfd_fprintf_vma (abfd, file, symbol->value);
0af1713e 1823 fprintf (file, " %lx", (unsigned long) symbol->flags);
252b5132
RH
1824 break;
1825 case bfd_print_symbol_all:
1826 {
4e8a9624
AM
1827 const char *section_name;
1828 const char *name = NULL;
9c5bfbb7 1829 const struct elf_backend_data *bed;
7a13edea 1830 unsigned char st_other;
dbb410c3 1831 bfd_vma val;
bb4d2ac2
L
1832 const char *version_string;
1833 bfd_boolean hidden;
c044fabd 1834
252b5132 1835 section_name = symbol->section ? symbol->section->name : "(*none*)";
587ff49e
RH
1836
1837 bed = get_elf_backend_data (abfd);
1838 if (bed->elf_backend_print_symbol_all)
c044fabd 1839 name = (*bed->elf_backend_print_symbol_all) (abfd, filep, symbol);
587ff49e
RH
1840
1841 if (name == NULL)
1842 {
7ee38065 1843 name = symbol->name;
217aa764 1844 bfd_print_symbol_vandf (abfd, file, symbol);
587ff49e
RH
1845 }
1846
252b5132
RH
1847 fprintf (file, " %s\t", section_name);
1848 /* Print the "other" value for a symbol. For common symbols,
1849 we've already printed the size; now print the alignment.
1850 For other symbols, we have no specified alignment, and
1851 we've printed the address; now print the size. */
dcf6c779 1852 if (symbol->section && bfd_is_com_section (symbol->section))
dbb410c3
AM
1853 val = ((elf_symbol_type *) symbol)->internal_elf_sym.st_value;
1854 else
1855 val = ((elf_symbol_type *) symbol)->internal_elf_sym.st_size;
1856 bfd_fprintf_vma (abfd, file, val);
252b5132
RH
1857
1858 /* If we have version information, print it. */
60bb06bc
L
1859 version_string = _bfd_elf_get_symbol_version_string (abfd,
1860 symbol,
1861 &hidden);
bb4d2ac2 1862 if (version_string)
252b5132 1863 {
bb4d2ac2 1864 if (!hidden)
252b5132
RH
1865 fprintf (file, " %-11s", version_string);
1866 else
1867 {
1868 int i;
1869
1870 fprintf (file, " (%s)", version_string);
1871 for (i = 10 - strlen (version_string); i > 0; --i)
1872 putc (' ', file);
1873 }
1874 }
1875
1876 /* If the st_other field is not zero, print it. */
7a13edea 1877 st_other = ((elf_symbol_type *) symbol)->internal_elf_sym.st_other;
c044fabd 1878
7a13edea
NC
1879 switch (st_other)
1880 {
1881 case 0: break;
1882 case STV_INTERNAL: fprintf (file, " .internal"); break;
1883 case STV_HIDDEN: fprintf (file, " .hidden"); break;
1884 case STV_PROTECTED: fprintf (file, " .protected"); break;
1885 default:
1886 /* Some other non-defined flags are also present, so print
1887 everything hex. */
1888 fprintf (file, " 0x%02x", (unsigned int) st_other);
1889 }
252b5132 1890
587ff49e 1891 fprintf (file, " %s", name);
252b5132
RH
1892 }
1893 break;
1894 }
1895}
252b5132
RH
1896\f
1897/* ELF .o/exec file reading */
1898
c044fabd 1899/* Create a new bfd section from an ELF section header. */
252b5132 1900
b34976b6 1901bfd_boolean
217aa764 1902bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
252b5132 1903{
4fbb74a6
AM
1904 Elf_Internal_Shdr *hdr;
1905 Elf_Internal_Ehdr *ehdr;
1906 const struct elf_backend_data *bed;
90937f86 1907 const char *name;
bf67003b
NC
1908 bfd_boolean ret = TRUE;
1909 static bfd_boolean * sections_being_created = NULL;
5a4b0ccc 1910 static bfd * sections_being_created_abfd = NULL;
bf67003b 1911 static unsigned int nesting = 0;
252b5132 1912
4fbb74a6
AM
1913 if (shindex >= elf_numsections (abfd))
1914 return FALSE;
1915
bf67003b
NC
1916 if (++ nesting > 3)
1917 {
1918 /* PR17512: A corrupt ELF binary might contain a recursive group of
06614111 1919 sections, with each the string indicies pointing to the next in the
bf67003b
NC
1920 loop. Detect this here, by refusing to load a section that we are
1921 already in the process of loading. We only trigger this test if
1922 we have nested at least three sections deep as normal ELF binaries
5a4b0ccc
NC
1923 can expect to recurse at least once.
1924
1925 FIXME: It would be better if this array was attached to the bfd,
1926 rather than being held in a static pointer. */
1927
1928 if (sections_being_created_abfd != abfd)
1929 sections_being_created = NULL;
bf67003b
NC
1930 if (sections_being_created == NULL)
1931 {
1932 /* FIXME: It would be more efficient to attach this array to the bfd somehow. */
1933 sections_being_created = (bfd_boolean *)
1934 bfd_zalloc (abfd, elf_numsections (abfd) * sizeof (bfd_boolean));
5a4b0ccc 1935 sections_being_created_abfd = abfd;
bf67003b
NC
1936 }
1937 if (sections_being_created [shindex])
1938 {
1939 (*_bfd_error_handler)
1940 (_("%B: warning: loop in section dependencies detected"), abfd);
1941 return FALSE;
1942 }
1943 sections_being_created [shindex] = TRUE;
1944 }
1945
4fbb74a6
AM
1946 hdr = elf_elfsections (abfd)[shindex];
1947 ehdr = elf_elfheader (abfd);
1948 name = bfd_elf_string_from_elf_section (abfd, ehdr->e_shstrndx,
1b3a8575 1949 hdr->sh_name);
933d961a 1950 if (name == NULL)
bf67003b 1951 goto fail;
252b5132 1952
4fbb74a6 1953 bed = get_elf_backend_data (abfd);
252b5132
RH
1954 switch (hdr->sh_type)
1955 {
1956 case SHT_NULL:
1957 /* Inactive section. Throw it away. */
bf67003b 1958 goto success;
252b5132 1959
bf67003b
NC
1960 case SHT_PROGBITS: /* Normal section with contents. */
1961 case SHT_NOBITS: /* .bss section. */
1962 case SHT_HASH: /* .hash section. */
1963 case SHT_NOTE: /* .note section. */
25e27870
L
1964 case SHT_INIT_ARRAY: /* .init_array section. */
1965 case SHT_FINI_ARRAY: /* .fini_array section. */
1966 case SHT_PREINIT_ARRAY: /* .preinit_array section. */
7f1204bb 1967 case SHT_GNU_LIBLIST: /* .gnu.liblist section. */
fdc90cb4 1968 case SHT_GNU_HASH: /* .gnu.hash section. */
bf67003b
NC
1969 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
1970 goto success;
252b5132 1971
797fc050 1972 case SHT_DYNAMIC: /* Dynamic linking information. */
6dc132d9 1973 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
bf67003b
NC
1974 goto fail;
1975
cfcac11d
NC
1976 if (hdr->sh_link > elf_numsections (abfd))
1977 {
caa83f8b 1978 /* PR 10478: Accept Solaris binaries with a sh_link
cfcac11d
NC
1979 field set to SHN_BEFORE or SHN_AFTER. */
1980 switch (bfd_get_arch (abfd))
1981 {
caa83f8b 1982 case bfd_arch_i386:
cfcac11d
NC
1983 case bfd_arch_sparc:
1984 if (hdr->sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
1985 || hdr->sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
1986 break;
1987 /* Otherwise fall through. */
1988 default:
bf67003b 1989 goto fail;
cfcac11d
NC
1990 }
1991 }
1992 else if (elf_elfsections (abfd)[hdr->sh_link] == NULL)
bf67003b 1993 goto fail;
cfcac11d 1994 else if (elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_STRTAB)
797fc050
AM
1995 {
1996 Elf_Internal_Shdr *dynsymhdr;
1997
1998 /* The shared libraries distributed with hpux11 have a bogus
1999 sh_link field for the ".dynamic" section. Find the
2000 string table for the ".dynsym" section instead. */
2001 if (elf_dynsymtab (abfd) != 0)
2002 {
2003 dynsymhdr = elf_elfsections (abfd)[elf_dynsymtab (abfd)];
2004 hdr->sh_link = dynsymhdr->sh_link;
2005 }
2006 else
2007 {
2008 unsigned int i, num_sec;
2009
2010 num_sec = elf_numsections (abfd);
2011 for (i = 1; i < num_sec; i++)
2012 {
2013 dynsymhdr = elf_elfsections (abfd)[i];
2014 if (dynsymhdr->sh_type == SHT_DYNSYM)
2015 {
2016 hdr->sh_link = dynsymhdr->sh_link;
2017 break;
2018 }
2019 }
2020 }
2021 }
bf67003b 2022 goto success;
797fc050 2023
bf67003b 2024 case SHT_SYMTAB: /* A symbol table. */
252b5132 2025 if (elf_onesymtab (abfd) == shindex)
bf67003b 2026 goto success;
252b5132 2027
a50b2160 2028 if (hdr->sh_entsize != bed->s->sizeof_sym)
bf67003b
NC
2029 goto fail;
2030
3337c1e5 2031 if (hdr->sh_info * hdr->sh_entsize > hdr->sh_size)
eee3b786
AM
2032 {
2033 if (hdr->sh_size != 0)
bf67003b 2034 goto fail;
eee3b786
AM
2035 /* Some assemblers erroneously set sh_info to one with a
2036 zero sh_size. ld sees this as a global symbol count
2037 of (unsigned) -1. Fix it here. */
2038 hdr->sh_info = 0;
bf67003b 2039 goto success;
eee3b786 2040 }
bf67003b 2041
16ad13ec
NC
2042 /* PR 18854: A binary might contain more than one symbol table.
2043 Unusual, but possible. Warn, but continue. */
2044 if (elf_onesymtab (abfd) != 0)
2045 {
2046 (*_bfd_error_handler)
2047 (_("%B: warning: multiple symbol tables detected - ignoring the table in section %u"),
2048 abfd, shindex);
2049 goto success;
2050 }
252b5132 2051 elf_onesymtab (abfd) = shindex;
6a40cf0c
NC
2052 elf_symtab_hdr (abfd) = *hdr;
2053 elf_elfsections (abfd)[shindex] = hdr = & elf_symtab_hdr (abfd);
252b5132
RH
2054 abfd->flags |= HAS_SYMS;
2055
2056 /* Sometimes a shared object will map in the symbol table. If
08a40648
AM
2057 SHF_ALLOC is set, and this is a shared object, then we also
2058 treat this section as a BFD section. We can not base the
2059 decision purely on SHF_ALLOC, because that flag is sometimes
2060 set in a relocatable object file, which would confuse the
2061 linker. */
252b5132
RH
2062 if ((hdr->sh_flags & SHF_ALLOC) != 0
2063 && (abfd->flags & DYNAMIC) != 0
6dc132d9
L
2064 && ! _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2065 shindex))
bf67003b 2066 goto fail;
252b5132 2067
1b3a8575
AM
2068 /* Go looking for SHT_SYMTAB_SHNDX too, since if there is one we
2069 can't read symbols without that section loaded as well. It
2070 is most likely specified by the next section header. */
6a40cf0c
NC
2071 {
2072 elf_section_list * entry;
2073 unsigned int i, num_sec;
1b3a8575 2074
6a40cf0c
NC
2075 for (entry = elf_symtab_shndx_list (abfd); entry != NULL; entry = entry->next)
2076 if (entry->hdr.sh_link == shindex)
2077 goto success;
2078
2079 num_sec = elf_numsections (abfd);
2080 for (i = shindex + 1; i < num_sec; i++)
2081 {
2082 Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
2083
2084 if (hdr2->sh_type == SHT_SYMTAB_SHNDX
2085 && hdr2->sh_link == shindex)
2086 break;
2087 }
2088
2089 if (i == num_sec)
2090 for (i = 1; i < shindex; i++)
1b3a8575
AM
2091 {
2092 Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
6a40cf0c 2093
1b3a8575
AM
2094 if (hdr2->sh_type == SHT_SYMTAB_SHNDX
2095 && hdr2->sh_link == shindex)
2096 break;
2097 }
6a40cf0c
NC
2098
2099 if (i != shindex)
2100 ret = bfd_section_from_shdr (abfd, i);
2101 /* else FIXME: we have failed to find the symbol table - should we issue an error ? */
2102 goto success;
2103 }
252b5132 2104
bf67003b 2105 case SHT_DYNSYM: /* A dynamic symbol table. */
252b5132 2106 if (elf_dynsymtab (abfd) == shindex)
bf67003b 2107 goto success;
252b5132 2108
a50b2160 2109 if (hdr->sh_entsize != bed->s->sizeof_sym)
bf67003b
NC
2110 goto fail;
2111
eee3b786
AM
2112 if (hdr->sh_info * hdr->sh_entsize > hdr->sh_size)
2113 {
2114 if (hdr->sh_size != 0)
bf67003b
NC
2115 goto fail;
2116
eee3b786
AM
2117 /* Some linkers erroneously set sh_info to one with a
2118 zero sh_size. ld sees this as a global symbol count
2119 of (unsigned) -1. Fix it here. */
2120 hdr->sh_info = 0;
bf67003b 2121 goto success;
eee3b786 2122 }
bf67003b 2123
16ad13ec
NC
2124 /* PR 18854: A binary might contain more than one dynamic symbol table.
2125 Unusual, but possible. Warn, but continue. */
2126 if (elf_dynsymtab (abfd) != 0)
2127 {
2128 (*_bfd_error_handler)
2129 (_("%B: warning: multiple dynamic symbol tables detected - ignoring the table in section %u"),
2130 abfd, shindex);
2131 goto success;
2132 }
252b5132
RH
2133 elf_dynsymtab (abfd) = shindex;
2134 elf_tdata (abfd)->dynsymtab_hdr = *hdr;
2135 elf_elfsections (abfd)[shindex] = hdr = &elf_tdata (abfd)->dynsymtab_hdr;
2136 abfd->flags |= HAS_SYMS;
2137
2138 /* Besides being a symbol table, we also treat this as a regular
2139 section, so that objcopy can handle it. */
bf67003b
NC
2140 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2141 goto success;
252b5132 2142
bf67003b 2143 case SHT_SYMTAB_SHNDX: /* Symbol section indices when >64k sections. */
6a40cf0c
NC
2144 {
2145 elf_section_list * entry;
9ad5cbcf 2146
6a40cf0c
NC
2147 for (entry = elf_symtab_shndx_list (abfd); entry != NULL; entry = entry->next)
2148 if (entry->ndx == shindex)
2149 goto success;
2150
2151 entry = bfd_alloc (abfd, sizeof * entry);
2152 if (entry == NULL)
2153 goto fail;
2154 entry->ndx = shindex;
2155 entry->hdr = * hdr;
2156 entry->next = elf_symtab_shndx_list (abfd);
2157 elf_symtab_shndx_list (abfd) = entry;
2158 elf_elfsections (abfd)[shindex] = & entry->hdr;
2159 goto success;
2160 }
9ad5cbcf 2161
bf67003b 2162 case SHT_STRTAB: /* A string table. */
252b5132 2163 if (hdr->bfd_section != NULL)
bf67003b
NC
2164 goto success;
2165
252b5132
RH
2166 if (ehdr->e_shstrndx == shindex)
2167 {
2168 elf_tdata (abfd)->shstrtab_hdr = *hdr;
2169 elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->shstrtab_hdr;
bf67003b 2170 goto success;
252b5132 2171 }
bf67003b 2172
1b3a8575
AM
2173 if (elf_elfsections (abfd)[elf_onesymtab (abfd)]->sh_link == shindex)
2174 {
2175 symtab_strtab:
2176 elf_tdata (abfd)->strtab_hdr = *hdr;
2177 elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->strtab_hdr;
bf67003b 2178 goto success;
1b3a8575 2179 }
bf67003b 2180
1b3a8575
AM
2181 if (elf_elfsections (abfd)[elf_dynsymtab (abfd)]->sh_link == shindex)
2182 {
2183 dynsymtab_strtab:
2184 elf_tdata (abfd)->dynstrtab_hdr = *hdr;
2185 hdr = &elf_tdata (abfd)->dynstrtab_hdr;
2186 elf_elfsections (abfd)[shindex] = hdr;
2187 /* We also treat this as a regular section, so that objcopy
2188 can handle it. */
bf67003b
NC
2189 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2190 shindex);
2191 goto success;
1b3a8575 2192 }
252b5132 2193
1b3a8575
AM
2194 /* If the string table isn't one of the above, then treat it as a
2195 regular section. We need to scan all the headers to be sure,
2196 just in case this strtab section appeared before the above. */
2197 if (elf_onesymtab (abfd) == 0 || elf_dynsymtab (abfd) == 0)
2198 {
2199 unsigned int i, num_sec;
252b5132 2200
1b3a8575
AM
2201 num_sec = elf_numsections (abfd);
2202 for (i = 1; i < num_sec; i++)
2203 {
2204 Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
2205 if (hdr2->sh_link == shindex)
2206 {
933d961a
JJ
2207 /* Prevent endless recursion on broken objects. */
2208 if (i == shindex)
bf67003b 2209 goto fail;
1b3a8575 2210 if (! bfd_section_from_shdr (abfd, i))
bf67003b 2211 goto fail;
1b3a8575
AM
2212 if (elf_onesymtab (abfd) == i)
2213 goto symtab_strtab;
2214 if (elf_dynsymtab (abfd) == i)
2215 goto dynsymtab_strtab;
2216 }
2217 }
2218 }
bf67003b
NC
2219 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2220 goto success;
252b5132
RH
2221
2222 case SHT_REL:
2223 case SHT_RELA:
2224 /* *These* do a lot of work -- but build no sections! */
2225 {
2226 asection *target_sect;
d4730f92 2227 Elf_Internal_Shdr *hdr2, **p_hdr;
9ad5cbcf 2228 unsigned int num_sec = elf_numsections (abfd);
d4730f92
BS
2229 struct bfd_elf_section_data *esdt;
2230 bfd_size_type amt;
252b5132 2231
aa2ca951
JJ
2232 if (hdr->sh_entsize
2233 != (bfd_size_type) (hdr->sh_type == SHT_REL
a50b2160 2234 ? bed->s->sizeof_rel : bed->s->sizeof_rela))
bf67003b 2235 goto fail;
a50b2160 2236
03ae5f59 2237 /* Check for a bogus link to avoid crashing. */
4fbb74a6 2238 if (hdr->sh_link >= num_sec)
03ae5f59
ILT
2239 {
2240 ((*_bfd_error_handler)
d003868e
AM
2241 (_("%B: invalid link %lu for reloc section %s (index %u)"),
2242 abfd, hdr->sh_link, name, shindex));
bf67003b
NC
2243 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2244 shindex);
2245 goto success;
03ae5f59
ILT
2246 }
2247
252b5132
RH
2248 /* For some incomprehensible reason Oracle distributes
2249 libraries for Solaris in which some of the objects have
2250 bogus sh_link fields. It would be nice if we could just
2251 reject them, but, unfortunately, some people need to use
2252 them. We scan through the section headers; if we find only
2253 one suitable symbol table, we clobber the sh_link to point
83b89087
L
2254 to it. I hope this doesn't break anything.
2255
2256 Don't do it on executable nor shared library. */
2257 if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0
2258 && elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_SYMTAB
252b5132
RH
2259 && elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_DYNSYM)
2260 {
9ad5cbcf 2261 unsigned int scan;
252b5132
RH
2262 int found;
2263
2264 found = 0;
9ad5cbcf 2265 for (scan = 1; scan < num_sec; scan++)
252b5132
RH
2266 {
2267 if (elf_elfsections (abfd)[scan]->sh_type == SHT_SYMTAB
2268 || elf_elfsections (abfd)[scan]->sh_type == SHT_DYNSYM)
2269 {
2270 if (found != 0)
2271 {
2272 found = 0;
2273 break;
2274 }
2275 found = scan;
2276 }
2277 }
2278 if (found != 0)
2279 hdr->sh_link = found;
2280 }
2281
2282 /* Get the symbol table. */
1b3a8575
AM
2283 if ((elf_elfsections (abfd)[hdr->sh_link]->sh_type == SHT_SYMTAB
2284 || elf_elfsections (abfd)[hdr->sh_link]->sh_type == SHT_DYNSYM)
252b5132 2285 && ! bfd_section_from_shdr (abfd, hdr->sh_link))
bf67003b 2286 goto fail;
252b5132
RH
2287
2288 /* If this reloc section does not use the main symbol table we
2289 don't treat it as a reloc section. BFD can't adequately
2290 represent such a section, so at least for now, we don't
c044fabd 2291 try. We just present it as a normal section. We also
60bcf0fa 2292 can't use it as a reloc section if it points to the null
83b89087
L
2293 section, an invalid section, another reloc section, or its
2294 sh_link points to the null section. */
185ef66d 2295 if (hdr->sh_link != elf_onesymtab (abfd)
83b89087 2296 || hdr->sh_link == SHN_UNDEF
185ef66d 2297 || hdr->sh_info == SHN_UNDEF
185ef66d
AM
2298 || hdr->sh_info >= num_sec
2299 || elf_elfsections (abfd)[hdr->sh_info]->sh_type == SHT_REL
2300 || elf_elfsections (abfd)[hdr->sh_info]->sh_type == SHT_RELA)
bf67003b
NC
2301 {
2302 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2303 shindex);
2304 goto success;
2305 }
252b5132
RH
2306
2307 if (! bfd_section_from_shdr (abfd, hdr->sh_info))
bf67003b
NC
2308 goto fail;
2309
252b5132
RH
2310 target_sect = bfd_section_from_elf_index (abfd, hdr->sh_info);
2311 if (target_sect == NULL)
bf67003b 2312 goto fail;
252b5132 2313
d4730f92
BS
2314 esdt = elf_section_data (target_sect);
2315 if (hdr->sh_type == SHT_RELA)
2316 p_hdr = &esdt->rela.hdr;
252b5132 2317 else
d4730f92
BS
2318 p_hdr = &esdt->rel.hdr;
2319
06614111
NC
2320 /* PR 17512: file: 0b4f81b7. */
2321 if (*p_hdr != NULL)
2322 goto fail;
d4730f92
BS
2323 amt = sizeof (*hdr2);
2324 hdr2 = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
2325 if (hdr2 == NULL)
bf67003b 2326 goto fail;
252b5132 2327 *hdr2 = *hdr;
d4730f92 2328 *p_hdr = hdr2;
252b5132 2329 elf_elfsections (abfd)[shindex] = hdr2;
d9bc7a44 2330 target_sect->reloc_count += NUM_SHDR_ENTRIES (hdr);
252b5132
RH
2331 target_sect->flags |= SEC_RELOC;
2332 target_sect->relocation = NULL;
2333 target_sect->rel_filepos = hdr->sh_offset;
bf572ba0
MM
2334 /* In the section to which the relocations apply, mark whether
2335 its relocations are of the REL or RELA variety. */
72730e0c 2336 if (hdr->sh_size != 0)
d4730f92
BS
2337 {
2338 if (hdr->sh_type == SHT_RELA)
2339 target_sect->use_rela_p = 1;
2340 }
252b5132 2341 abfd->flags |= HAS_RELOC;
bf67003b 2342 goto success;
252b5132 2343 }
252b5132
RH
2344
2345 case SHT_GNU_verdef:
2346 elf_dynverdef (abfd) = shindex;
2347 elf_tdata (abfd)->dynverdef_hdr = *hdr;
bf67003b
NC
2348 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2349 goto success;
252b5132
RH
2350
2351 case SHT_GNU_versym:
a50b2160 2352 if (hdr->sh_entsize != sizeof (Elf_External_Versym))
bf67003b
NC
2353 goto fail;
2354
252b5132
RH
2355 elf_dynversym (abfd) = shindex;
2356 elf_tdata (abfd)->dynversym_hdr = *hdr;
bf67003b
NC
2357 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2358 goto success;
252b5132
RH
2359
2360 case SHT_GNU_verneed:
2361 elf_dynverref (abfd) = shindex;
2362 elf_tdata (abfd)->dynverref_hdr = *hdr;
bf67003b
NC
2363 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2364 goto success;
252b5132
RH
2365
2366 case SHT_SHLIB:
bf67003b 2367 goto success;
252b5132 2368
dbb410c3 2369 case SHT_GROUP:
44534af3 2370 if (! IS_VALID_GROUP_SECTION_HEADER (hdr, GRP_ENTRY_SIZE))
bf67003b
NC
2371 goto fail;
2372
6dc132d9 2373 if (!_bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
bf67003b
NC
2374 goto fail;
2375
dbb410c3
AM
2376 if (hdr->contents != NULL)
2377 {
2378 Elf_Internal_Group *idx = (Elf_Internal_Group *) hdr->contents;
06614111 2379 unsigned int n_elt = hdr->sh_size / sizeof (* idx);
dbb410c3
AM
2380 asection *s;
2381
06614111
NC
2382 if (n_elt == 0)
2383 goto fail;
b885599b
AM
2384 if (idx->flags & GRP_COMDAT)
2385 hdr->bfd_section->flags
2386 |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
2387
45c5e9ed
L
2388 /* We try to keep the same section order as it comes in. */
2389 idx += n_elt;
06614111 2390
dbb410c3 2391 while (--n_elt != 0)
1783205a
NC
2392 {
2393 --idx;
2394
2395 if (idx->shdr != NULL
2396 && (s = idx->shdr->bfd_section) != NULL
2397 && elf_next_in_group (s) != NULL)
2398 {
2399 elf_next_in_group (hdr->bfd_section) = s;
2400 break;
2401 }
2402 }
dbb410c3 2403 }
bf67003b 2404 goto success;
dbb410c3 2405
252b5132 2406 default:
104d59d1
JM
2407 /* Possibly an attributes section. */
2408 if (hdr->sh_type == SHT_GNU_ATTRIBUTES
2409 || hdr->sh_type == bed->obj_attrs_section_type)
2410 {
2411 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
bf67003b 2412 goto fail;
104d59d1 2413 _bfd_elf_parse_attributes (abfd, hdr);
bf67003b 2414 goto success;
104d59d1
JM
2415 }
2416
252b5132 2417 /* Check for any processor-specific section types. */
3eb70a79 2418 if (bed->elf_backend_section_from_shdr (abfd, hdr, name, shindex))
bf67003b 2419 goto success;
3eb70a79
L
2420
2421 if (hdr->sh_type >= SHT_LOUSER && hdr->sh_type <= SHT_HIUSER)
2422 {
2423 if ((hdr->sh_flags & SHF_ALLOC) != 0)
2424 /* FIXME: How to properly handle allocated section reserved
2425 for applications? */
2426 (*_bfd_error_handler)
2427 (_("%B: don't know how to handle allocated, application "
2428 "specific section `%s' [0x%8x]"),
2429 abfd, name, hdr->sh_type);
2430 else
bf67003b
NC
2431 {
2432 /* Allow sections reserved for applications. */
2433 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2434 shindex);
2435 goto success;
2436 }
3eb70a79
L
2437 }
2438 else if (hdr->sh_type >= SHT_LOPROC
2439 && hdr->sh_type <= SHT_HIPROC)
2440 /* FIXME: We should handle this section. */
2441 (*_bfd_error_handler)
2442 (_("%B: don't know how to handle processor specific section "
2443 "`%s' [0x%8x]"),
2444 abfd, name, hdr->sh_type);
2445 else if (hdr->sh_type >= SHT_LOOS && hdr->sh_type <= SHT_HIOS)
ff15b240
NC
2446 {
2447 /* Unrecognised OS-specific sections. */
2448 if ((hdr->sh_flags & SHF_OS_NONCONFORMING) != 0)
2449 /* SHF_OS_NONCONFORMING indicates that special knowledge is
08a40648 2450 required to correctly process the section and the file should
ff15b240
NC
2451 be rejected with an error message. */
2452 (*_bfd_error_handler)
2453 (_("%B: don't know how to handle OS specific section "
2454 "`%s' [0x%8x]"),
2455 abfd, name, hdr->sh_type);
2456 else
bf67003b
NC
2457 {
2458 /* Otherwise it should be processed. */
2459 ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2460 goto success;
2461 }
ff15b240 2462 }
3eb70a79
L
2463 else
2464 /* FIXME: We should handle this section. */
2465 (*_bfd_error_handler)
2466 (_("%B: don't know how to handle section `%s' [0x%8x]"),
2467 abfd, name, hdr->sh_type);
2468
bf67003b 2469 goto fail;
252b5132
RH
2470 }
2471
bf67003b
NC
2472 fail:
2473 ret = FALSE;
2474 success:
e5b470e2 2475 if (sections_being_created && sections_being_created_abfd == abfd)
bf67003b
NC
2476 sections_being_created [shindex] = FALSE;
2477 if (-- nesting == 0)
5a4b0ccc
NC
2478 {
2479 sections_being_created = NULL;
2480 sections_being_created_abfd = abfd;
2481 }
bf67003b 2482 return ret;
252b5132
RH
2483}
2484
87d72d41 2485/* Return the local symbol specified by ABFD, R_SYMNDX. */
ec338859 2486
87d72d41
AM
2487Elf_Internal_Sym *
2488bfd_sym_from_r_symndx (struct sym_cache *cache,
2489 bfd *abfd,
2490 unsigned long r_symndx)
ec338859 2491{
ec338859
AM
2492 unsigned int ent = r_symndx % LOCAL_SYM_CACHE_SIZE;
2493
a5d1b3b5
AM
2494 if (cache->abfd != abfd || cache->indx[ent] != r_symndx)
2495 {
2496 Elf_Internal_Shdr *symtab_hdr;
2497 unsigned char esym[sizeof (Elf64_External_Sym)];
2498 Elf_External_Sym_Shndx eshndx;
ec338859 2499
a5d1b3b5
AM
2500 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2501 if (bfd_elf_get_elf_syms (abfd, symtab_hdr, 1, r_symndx,
87d72d41 2502 &cache->sym[ent], esym, &eshndx) == NULL)
a5d1b3b5 2503 return NULL;
9ad5cbcf 2504
a5d1b3b5
AM
2505 if (cache->abfd != abfd)
2506 {
2507 memset (cache->indx, -1, sizeof (cache->indx));
2508 cache->abfd = abfd;
2509 }
2510 cache->indx[ent] = r_symndx;
ec338859 2511 }
a5d1b3b5 2512
87d72d41 2513 return &cache->sym[ent];
ec338859
AM
2514}
2515
252b5132
RH
2516/* Given an ELF section number, retrieve the corresponding BFD
2517 section. */
2518
2519asection *
91d6fa6a 2520bfd_section_from_elf_index (bfd *abfd, unsigned int sec_index)
252b5132 2521{
91d6fa6a 2522 if (sec_index >= elf_numsections (abfd))
252b5132 2523 return NULL;
91d6fa6a 2524 return elf_elfsections (abfd)[sec_index]->bfd_section;
252b5132
RH
2525}
2526
b35d266b 2527static const struct bfd_elf_special_section special_sections_b[] =
2f89ff8d 2528{
0112cd26
NC
2529 { STRING_COMMA_LEN (".bss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2530 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2531};
2532
b35d266b 2533static const struct bfd_elf_special_section special_sections_c[] =
7f4d3958 2534{
0112cd26
NC
2535 { STRING_COMMA_LEN (".comment"), 0, SHT_PROGBITS, 0 },
2536 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2537};
2538
b35d266b 2539static const struct bfd_elf_special_section special_sections_d[] =
7f4d3958 2540{
0112cd26
NC
2541 { STRING_COMMA_LEN (".data"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2542 { STRING_COMMA_LEN (".data1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
a9a72a65
DE
2543 /* There are more DWARF sections than these, but they needn't be added here
2544 unless you have to cope with broken compilers that don't emit section
2545 attributes or you want to help the user writing assembler. */
0112cd26
NC
2546 { STRING_COMMA_LEN (".debug"), 0, SHT_PROGBITS, 0 },
2547 { STRING_COMMA_LEN (".debug_line"), 0, SHT_PROGBITS, 0 },
2548 { STRING_COMMA_LEN (".debug_info"), 0, SHT_PROGBITS, 0 },
2549 { STRING_COMMA_LEN (".debug_abbrev"), 0, SHT_PROGBITS, 0 },
2550 { STRING_COMMA_LEN (".debug_aranges"), 0, SHT_PROGBITS, 0 },
2551 { STRING_COMMA_LEN (".dynamic"), 0, SHT_DYNAMIC, SHF_ALLOC },
2552 { STRING_COMMA_LEN (".dynstr"), 0, SHT_STRTAB, SHF_ALLOC },
2553 { STRING_COMMA_LEN (".dynsym"), 0, SHT_DYNSYM, SHF_ALLOC },
2554 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2555};
2556
b35d266b 2557static const struct bfd_elf_special_section special_sections_f[] =
7f4d3958 2558{
0112cd26
NC
2559 { STRING_COMMA_LEN (".fini"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2560 { STRING_COMMA_LEN (".fini_array"), 0, SHT_FINI_ARRAY, SHF_ALLOC + SHF_WRITE },
2561 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2562};
2563
b35d266b 2564static const struct bfd_elf_special_section special_sections_g[] =
7f4d3958 2565{
0112cd26 2566 { STRING_COMMA_LEN (".gnu.linkonce.b"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
68efed41 2567 { STRING_COMMA_LEN (".gnu.lto_"), -1, SHT_PROGBITS, SHF_EXCLUDE },
0112cd26
NC
2568 { STRING_COMMA_LEN (".got"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2569 { STRING_COMMA_LEN (".gnu.version"), 0, SHT_GNU_versym, 0 },
2570 { STRING_COMMA_LEN (".gnu.version_d"), 0, SHT_GNU_verdef, 0 },
2571 { STRING_COMMA_LEN (".gnu.version_r"), 0, SHT_GNU_verneed, 0 },
2572 { STRING_COMMA_LEN (".gnu.liblist"), 0, SHT_GNU_LIBLIST, SHF_ALLOC },
2573 { STRING_COMMA_LEN (".gnu.conflict"), 0, SHT_RELA, SHF_ALLOC },
2574 { STRING_COMMA_LEN (".gnu.hash"), 0, SHT_GNU_HASH, SHF_ALLOC },
2575 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2576};
2577
b35d266b 2578static const struct bfd_elf_special_section special_sections_h[] =
7f4d3958 2579{
0112cd26
NC
2580 { STRING_COMMA_LEN (".hash"), 0, SHT_HASH, SHF_ALLOC },
2581 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2582};
2583
b35d266b 2584static const struct bfd_elf_special_section special_sections_i[] =
7f4d3958 2585{
0112cd26
NC
2586 { STRING_COMMA_LEN (".init"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2587 { STRING_COMMA_LEN (".init_array"), 0, SHT_INIT_ARRAY, SHF_ALLOC + SHF_WRITE },
2588 { STRING_COMMA_LEN (".interp"), 0, SHT_PROGBITS, 0 },
2589 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2590};
2591
b35d266b 2592static const struct bfd_elf_special_section special_sections_l[] =
7f4d3958 2593{
0112cd26
NC
2594 { STRING_COMMA_LEN (".line"), 0, SHT_PROGBITS, 0 },
2595 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2596};
2597
b35d266b 2598static const struct bfd_elf_special_section special_sections_n[] =
7f4d3958 2599{
0112cd26
NC
2600 { STRING_COMMA_LEN (".note.GNU-stack"), 0, SHT_PROGBITS, 0 },
2601 { STRING_COMMA_LEN (".note"), -1, SHT_NOTE, 0 },
2602 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2603};
2604
b35d266b 2605static const struct bfd_elf_special_section special_sections_p[] =
7f4d3958 2606{
0112cd26
NC
2607 { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_WRITE },
2608 { STRING_COMMA_LEN (".plt"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2609 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2610};
2611
b35d266b 2612static const struct bfd_elf_special_section special_sections_r[] =
7f4d3958 2613{
0112cd26
NC
2614 { STRING_COMMA_LEN (".rodata"), -2, SHT_PROGBITS, SHF_ALLOC },
2615 { STRING_COMMA_LEN (".rodata1"), 0, SHT_PROGBITS, SHF_ALLOC },
2616 { STRING_COMMA_LEN (".rela"), -1, SHT_RELA, 0 },
2617 { STRING_COMMA_LEN (".rel"), -1, SHT_REL, 0 },
2618 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2619};
2620
b35d266b 2621static const struct bfd_elf_special_section special_sections_s[] =
7f4d3958 2622{
0112cd26
NC
2623 { STRING_COMMA_LEN (".shstrtab"), 0, SHT_STRTAB, 0 },
2624 { STRING_COMMA_LEN (".strtab"), 0, SHT_STRTAB, 0 },
2625 { STRING_COMMA_LEN (".symtab"), 0, SHT_SYMTAB, 0 },
60ff4dc4
HPN
2626 /* See struct bfd_elf_special_section declaration for the semantics of
2627 this special case where .prefix_length != strlen (.prefix). */
2628 { ".stabstr", 5, 3, SHT_STRTAB, 0 },
0112cd26 2629 { NULL, 0, 0, 0, 0 }
2f89ff8d
L
2630};
2631
b35d266b 2632static const struct bfd_elf_special_section special_sections_t[] =
7f4d3958 2633{
0112cd26
NC
2634 { STRING_COMMA_LEN (".text"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2635 { STRING_COMMA_LEN (".tbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
2636 { STRING_COMMA_LEN (".tdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
2637 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2638};
2639
1b315056
CS
2640static const struct bfd_elf_special_section special_sections_z[] =
2641{
2642 { STRING_COMMA_LEN (".zdebug_line"), 0, SHT_PROGBITS, 0 },
2643 { STRING_COMMA_LEN (".zdebug_info"), 0, SHT_PROGBITS, 0 },
2644 { STRING_COMMA_LEN (".zdebug_abbrev"), 0, SHT_PROGBITS, 0 },
2645 { STRING_COMMA_LEN (".zdebug_aranges"), 0, SHT_PROGBITS, 0 },
2646 { NULL, 0, 0, 0, 0 }
2647};
2648
e4c93b56 2649static const struct bfd_elf_special_section * const special_sections[] =
7f4d3958 2650{
7f4d3958 2651 special_sections_b, /* 'b' */
98ece1b3 2652 special_sections_c, /* 'c' */
7f4d3958
L
2653 special_sections_d, /* 'd' */
2654 NULL, /* 'e' */
2655 special_sections_f, /* 'f' */
2656 special_sections_g, /* 'g' */
2657 special_sections_h, /* 'h' */
2658 special_sections_i, /* 'i' */
2659 NULL, /* 'j' */
2660 NULL, /* 'k' */
2661 special_sections_l, /* 'l' */
2662 NULL, /* 'm' */
2663 special_sections_n, /* 'n' */
2664 NULL, /* 'o' */
2665 special_sections_p, /* 'p' */
2666 NULL, /* 'q' */
2667 special_sections_r, /* 'r' */
2668 special_sections_s, /* 's' */
2669 special_sections_t, /* 't' */
1b315056
CS
2670 NULL, /* 'u' */
2671 NULL, /* 'v' */
2672 NULL, /* 'w' */
2673 NULL, /* 'x' */
2674 NULL, /* 'y' */
2675 special_sections_z /* 'z' */
7f4d3958
L
2676};
2677
551b43fd
AM
2678const struct bfd_elf_special_section *
2679_bfd_elf_get_special_section (const char *name,
2680 const struct bfd_elf_special_section *spec,
2681 unsigned int rela)
2f89ff8d
L
2682{
2683 int i;
7f4d3958 2684 int len;
7f4d3958 2685
551b43fd 2686 len = strlen (name);
7f4d3958 2687
551b43fd 2688 for (i = 0; spec[i].prefix != NULL; i++)
7dcb9820
AM
2689 {
2690 int suffix_len;
551b43fd 2691 int prefix_len = spec[i].prefix_length;
7dcb9820
AM
2692
2693 if (len < prefix_len)
2694 continue;
551b43fd 2695 if (memcmp (name, spec[i].prefix, prefix_len) != 0)
7dcb9820
AM
2696 continue;
2697
551b43fd 2698 suffix_len = spec[i].suffix_length;
7dcb9820
AM
2699 if (suffix_len <= 0)
2700 {
2701 if (name[prefix_len] != 0)
2702 {
2703 if (suffix_len == 0)
2704 continue;
2705 if (name[prefix_len] != '.'
2706 && (suffix_len == -2
551b43fd 2707 || (rela && spec[i].type == SHT_REL)))
7dcb9820
AM
2708 continue;
2709 }
2710 }
2711 else
2712 {
2713 if (len < prefix_len + suffix_len)
2714 continue;
2715 if (memcmp (name + len - suffix_len,
551b43fd 2716 spec[i].prefix + prefix_len,
7dcb9820
AM
2717 suffix_len) != 0)
2718 continue;
2719 }
551b43fd 2720 return &spec[i];
7dcb9820 2721 }
2f89ff8d
L
2722
2723 return NULL;
2724}
2725
7dcb9820 2726const struct bfd_elf_special_section *
29ef7005 2727_bfd_elf_get_sec_type_attr (bfd *abfd, asection *sec)
2f89ff8d 2728{
551b43fd
AM
2729 int i;
2730 const struct bfd_elf_special_section *spec;
29ef7005 2731 const struct elf_backend_data *bed;
2f89ff8d
L
2732
2733 /* See if this is one of the special sections. */
551b43fd
AM
2734 if (sec->name == NULL)
2735 return NULL;
2f89ff8d 2736
29ef7005
L
2737 bed = get_elf_backend_data (abfd);
2738 spec = bed->special_sections;
2739 if (spec)
2740 {
2741 spec = _bfd_elf_get_special_section (sec->name,
2742 bed->special_sections,
2743 sec->use_rela_p);
2744 if (spec != NULL)
2745 return spec;
2746 }
2747
551b43fd
AM
2748 if (sec->name[0] != '.')
2749 return NULL;
2f89ff8d 2750
551b43fd 2751 i = sec->name[1] - 'b';
1b315056 2752 if (i < 0 || i > 'z' - 'b')
551b43fd
AM
2753 return NULL;
2754
2755 spec = special_sections[i];
2f89ff8d 2756
551b43fd
AM
2757 if (spec == NULL)
2758 return NULL;
2759
2760 return _bfd_elf_get_special_section (sec->name, spec, sec->use_rela_p);
2f89ff8d
L
2761}
2762
b34976b6 2763bfd_boolean
217aa764 2764_bfd_elf_new_section_hook (bfd *abfd, asection *sec)
252b5132
RH
2765{
2766 struct bfd_elf_section_data *sdata;
551b43fd 2767 const struct elf_backend_data *bed;
7dcb9820 2768 const struct bfd_elf_special_section *ssect;
252b5132 2769
f0abc2a1
AM
2770 sdata = (struct bfd_elf_section_data *) sec->used_by_bfd;
2771 if (sdata == NULL)
2772 {
a50b1753
NC
2773 sdata = (struct bfd_elf_section_data *) bfd_zalloc (abfd,
2774 sizeof (*sdata));
f0abc2a1
AM
2775 if (sdata == NULL)
2776 return FALSE;
217aa764 2777 sec->used_by_bfd = sdata;
f0abc2a1 2778 }
bf572ba0 2779
551b43fd
AM
2780 /* Indicate whether or not this section should use RELA relocations. */
2781 bed = get_elf_backend_data (abfd);
2782 sec->use_rela_p = bed->default_use_rela_p;
2783
e843e0f8
L
2784 /* When we read a file, we don't need to set ELF section type and
2785 flags. They will be overridden in _bfd_elf_make_section_from_shdr
2786 anyway. We will set ELF section type and flags for all linker
2787 created sections. If user specifies BFD section flags, we will
2788 set ELF section type and flags based on BFD section flags in
02ecc8e9
L
2789 elf_fake_sections. Special handling for .init_array/.fini_array
2790 output sections since they may contain .ctors/.dtors input
2791 sections. We don't want _bfd_elf_init_private_section_data to
2792 copy ELF section type from .ctors/.dtors input sections. */
2793 if (abfd->direction != read_direction
3496cb2a 2794 || (sec->flags & SEC_LINKER_CREATED) != 0)
2f89ff8d 2795 {
551b43fd 2796 ssect = (*bed->get_sec_type_attr) (abfd, sec);
02ecc8e9
L
2797 if (ssect != NULL
2798 && (!sec->flags
2799 || (sec->flags & SEC_LINKER_CREATED) != 0
2800 || ssect->type == SHT_INIT_ARRAY
2801 || ssect->type == SHT_FINI_ARRAY))
a31501e9
L
2802 {
2803 elf_section_type (sec) = ssect->type;
2804 elf_section_flags (sec) = ssect->attr;
2805 }
2f89ff8d
L
2806 }
2807
f592407e 2808 return _bfd_generic_new_section_hook (abfd, sec);
252b5132
RH
2809}
2810
2811/* Create a new bfd section from an ELF program header.
2812
2813 Since program segments have no names, we generate a synthetic name
2814 of the form segment<NUM>, where NUM is generally the index in the
2815 program header table. For segments that are split (see below) we
2816 generate the names segment<NUM>a and segment<NUM>b.
2817
2818 Note that some program segments may have a file size that is different than
2819 (less than) the memory size. All this means is that at execution the
2820 system must allocate the amount of memory specified by the memory size,
2821 but only initialize it with the first "file size" bytes read from the
2822 file. This would occur for example, with program segments consisting
2823 of combined data+bss.
2824
2825 To handle the above situation, this routine generates TWO bfd sections
2826 for the single program segment. The first has the length specified by
2827 the file size of the segment, and the second has the length specified
2828 by the difference between the two sizes. In effect, the segment is split
d5191d0c 2829 into its initialized and uninitialized parts.
252b5132
RH
2830
2831 */
2832
b34976b6 2833bfd_boolean
217aa764
AM
2834_bfd_elf_make_section_from_phdr (bfd *abfd,
2835 Elf_Internal_Phdr *hdr,
91d6fa6a 2836 int hdr_index,
a50b1753 2837 const char *type_name)
252b5132
RH
2838{
2839 asection *newsect;
2840 char *name;
2841 char namebuf[64];
d4c88bbb 2842 size_t len;
252b5132
RH
2843 int split;
2844
2845 split = ((hdr->p_memsz > 0)
2846 && (hdr->p_filesz > 0)
2847 && (hdr->p_memsz > hdr->p_filesz));
d5191d0c
AM
2848
2849 if (hdr->p_filesz > 0)
252b5132 2850 {
91d6fa6a 2851 sprintf (namebuf, "%s%d%s", type_name, hdr_index, split ? "a" : "");
d5191d0c 2852 len = strlen (namebuf) + 1;
a50b1753 2853 name = (char *) bfd_alloc (abfd, len);
d5191d0c
AM
2854 if (!name)
2855 return FALSE;
2856 memcpy (name, namebuf, len);
2857 newsect = bfd_make_section (abfd, name);
2858 if (newsect == NULL)
2859 return FALSE;
2860 newsect->vma = hdr->p_vaddr;
2861 newsect->lma = hdr->p_paddr;
2862 newsect->size = hdr->p_filesz;
2863 newsect->filepos = hdr->p_offset;
2864 newsect->flags |= SEC_HAS_CONTENTS;
2865 newsect->alignment_power = bfd_log2 (hdr->p_align);
2866 if (hdr->p_type == PT_LOAD)
252b5132 2867 {
d5191d0c
AM
2868 newsect->flags |= SEC_ALLOC;
2869 newsect->flags |= SEC_LOAD;
2870 if (hdr->p_flags & PF_X)
2871 {
2872 /* FIXME: all we known is that it has execute PERMISSION,
2873 may be data. */
2874 newsect->flags |= SEC_CODE;
2875 }
2876 }
2877 if (!(hdr->p_flags & PF_W))
2878 {
2879 newsect->flags |= SEC_READONLY;
252b5132 2880 }
252b5132
RH
2881 }
2882
d5191d0c 2883 if (hdr->p_memsz > hdr->p_filesz)
252b5132 2884 {
d5191d0c
AM
2885 bfd_vma align;
2886
91d6fa6a 2887 sprintf (namebuf, "%s%d%s", type_name, hdr_index, split ? "b" : "");
d4c88bbb 2888 len = strlen (namebuf) + 1;
a50b1753 2889 name = (char *) bfd_alloc (abfd, len);
252b5132 2890 if (!name)
b34976b6 2891 return FALSE;
d4c88bbb 2892 memcpy (name, namebuf, len);
252b5132
RH
2893 newsect = bfd_make_section (abfd, name);
2894 if (newsect == NULL)
b34976b6 2895 return FALSE;
252b5132
RH
2896 newsect->vma = hdr->p_vaddr + hdr->p_filesz;
2897 newsect->lma = hdr->p_paddr + hdr->p_filesz;
eea6121a 2898 newsect->size = hdr->p_memsz - hdr->p_filesz;
d5191d0c
AM
2899 newsect->filepos = hdr->p_offset + hdr->p_filesz;
2900 align = newsect->vma & -newsect->vma;
2901 if (align == 0 || align > hdr->p_align)
2902 align = hdr->p_align;
2903 newsect->alignment_power = bfd_log2 (align);
252b5132
RH
2904 if (hdr->p_type == PT_LOAD)
2905 {
d5191d0c
AM
2906 /* Hack for gdb. Segments that have not been modified do
2907 not have their contents written to a core file, on the
2908 assumption that a debugger can find the contents in the
2909 executable. We flag this case by setting the fake
2910 section size to zero. Note that "real" bss sections will
2911 always have their contents dumped to the core file. */
2912 if (bfd_get_format (abfd) == bfd_core)
2913 newsect->size = 0;
252b5132
RH
2914 newsect->flags |= SEC_ALLOC;
2915 if (hdr->p_flags & PF_X)
2916 newsect->flags |= SEC_CODE;
2917 }
2918 if (!(hdr->p_flags & PF_W))
2919 newsect->flags |= SEC_READONLY;
2920 }
2921
b34976b6 2922 return TRUE;
252b5132
RH
2923}
2924
b34976b6 2925bfd_boolean
91d6fa6a 2926bfd_section_from_phdr (bfd *abfd, Elf_Internal_Phdr *hdr, int hdr_index)
20cfcaae 2927{
9c5bfbb7 2928 const struct elf_backend_data *bed;
20cfcaae
NC
2929
2930 switch (hdr->p_type)
2931 {
2932 case PT_NULL:
91d6fa6a 2933 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "null");
20cfcaae
NC
2934
2935 case PT_LOAD:
91d6fa6a 2936 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "load");
20cfcaae
NC
2937
2938 case PT_DYNAMIC:
91d6fa6a 2939 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "dynamic");
20cfcaae
NC
2940
2941 case PT_INTERP:
91d6fa6a 2942 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "interp");
20cfcaae
NC
2943
2944 case PT_NOTE:
91d6fa6a 2945 if (! _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "note"))
b34976b6 2946 return FALSE;
718175fa 2947 if (! elf_read_notes (abfd, hdr->p_offset, hdr->p_filesz))
b34976b6
AM
2948 return FALSE;
2949 return TRUE;
20cfcaae
NC
2950
2951 case PT_SHLIB:
91d6fa6a 2952 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "shlib");
20cfcaae
NC
2953
2954 case PT_PHDR:
91d6fa6a 2955 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "phdr");
20cfcaae 2956
811072d8 2957 case PT_GNU_EH_FRAME:
91d6fa6a 2958 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index,
811072d8
RM
2959 "eh_frame_hdr");
2960
2b05f1b7 2961 case PT_GNU_STACK:
91d6fa6a 2962 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "stack");
9ee5e499 2963
8c37241b 2964 case PT_GNU_RELRO:
91d6fa6a 2965 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "relro");
8c37241b 2966
20cfcaae 2967 default:
8c1acd09 2968 /* Check for any processor-specific program segment types. */
20cfcaae 2969 bed = get_elf_backend_data (abfd);
91d6fa6a 2970 return bed->elf_backend_section_from_phdr (abfd, hdr, hdr_index, "proc");
20cfcaae
NC
2971 }
2972}
2973
d4730f92
BS
2974/* Return the REL_HDR for SEC, assuming there is only a single one, either
2975 REL or RELA. */
2976
2977Elf_Internal_Shdr *
2978_bfd_elf_single_rel_hdr (asection *sec)
2979{
2980 if (elf_section_data (sec)->rel.hdr)
2981 {
2982 BFD_ASSERT (elf_section_data (sec)->rela.hdr == NULL);
2983 return elf_section_data (sec)->rel.hdr;
2984 }
2985 else
2986 return elf_section_data (sec)->rela.hdr;
2987}
2988
3e19fb8f
L
2989static bfd_boolean
2990_bfd_elf_set_reloc_sh_name (bfd *abfd,
2991 Elf_Internal_Shdr *rel_hdr,
2992 const char *sec_name,
2993 bfd_boolean use_rela_p)
2994{
2995 char *name = (char *) bfd_alloc (abfd,
2996 sizeof ".rela" + strlen (sec_name));
2997 if (name == NULL)
2998 return FALSE;
2999
3000 sprintf (name, "%s%s", use_rela_p ? ".rela" : ".rel", sec_name);
3001 rel_hdr->sh_name =
3002 (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd), name,
3003 FALSE);
3004 if (rel_hdr->sh_name == (unsigned int) -1)
3005 return FALSE;
3006
3007 return TRUE;
3008}
3009
d4730f92
BS
3010/* Allocate and initialize a section-header for a new reloc section,
3011 containing relocations against ASECT. It is stored in RELDATA. If
3012 USE_RELA_P is TRUE, we use RELA relocations; otherwise, we use REL
3013 relocations. */
23bc299b 3014
5d13b3b3 3015static bfd_boolean
217aa764 3016_bfd_elf_init_reloc_shdr (bfd *abfd,
d4730f92 3017 struct bfd_elf_section_reloc_data *reldata,
f6fe1ccd 3018 const char *sec_name,
3e19fb8f
L
3019 bfd_boolean use_rela_p,
3020 bfd_boolean delay_st_name_p)
23bc299b 3021{
d4730f92 3022 Elf_Internal_Shdr *rel_hdr;
9c5bfbb7 3023 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
d4730f92
BS
3024 bfd_size_type amt;
3025
3026 amt = sizeof (Elf_Internal_Shdr);
3027 BFD_ASSERT (reldata->hdr == NULL);
3028 rel_hdr = bfd_zalloc (abfd, amt);
3029 reldata->hdr = rel_hdr;
23bc299b 3030
3e19fb8f
L
3031 if (delay_st_name_p)
3032 rel_hdr->sh_name = (unsigned int) -1;
3033 else if (!_bfd_elf_set_reloc_sh_name (abfd, rel_hdr, sec_name,
3034 use_rela_p))
b34976b6 3035 return FALSE;
23bc299b
MM
3036 rel_hdr->sh_type = use_rela_p ? SHT_RELA : SHT_REL;
3037 rel_hdr->sh_entsize = (use_rela_p
3038 ? bed->s->sizeof_rela
3039 : bed->s->sizeof_rel);
72de5009 3040 rel_hdr->sh_addralign = (bfd_vma) 1 << bed->s->log_file_align;
23bc299b
MM
3041 rel_hdr->sh_flags = 0;
3042 rel_hdr->sh_addr = 0;
3043 rel_hdr->sh_size = 0;
3044 rel_hdr->sh_offset = 0;
3045
b34976b6 3046 return TRUE;
23bc299b
MM
3047}
3048
94be91de
JB
3049/* Return the default section type based on the passed in section flags. */
3050
3051int
3052bfd_elf_get_default_section_type (flagword flags)
3053{
3054 if ((flags & SEC_ALLOC) != 0
2e76e85a 3055 && (flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
94be91de
JB
3056 return SHT_NOBITS;
3057 return SHT_PROGBITS;
3058}
3059
d4730f92
BS
3060struct fake_section_arg
3061{
3062 struct bfd_link_info *link_info;
3063 bfd_boolean failed;
3064};
3065
252b5132
RH
3066/* Set up an ELF internal section header for a section. */
3067
252b5132 3068static void
d4730f92 3069elf_fake_sections (bfd *abfd, asection *asect, void *fsarg)
252b5132 3070{
d4730f92 3071 struct fake_section_arg *arg = (struct fake_section_arg *)fsarg;
9c5bfbb7 3072 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
d4730f92 3073 struct bfd_elf_section_data *esd = elf_section_data (asect);
252b5132 3074 Elf_Internal_Shdr *this_hdr;
0414f35b 3075 unsigned int sh_type;
0ce398f1 3076 const char *name = asect->name;
3e19fb8f 3077 bfd_boolean delay_st_name_p = FALSE;
252b5132 3078
d4730f92 3079 if (arg->failed)
252b5132
RH
3080 {
3081 /* We already failed; just get out of the bfd_map_over_sections
08a40648 3082 loop. */
252b5132
RH
3083 return;
3084 }
3085
d4730f92 3086 this_hdr = &esd->this_hdr;
252b5132 3087
f6fe1ccd 3088 if (arg->link_info)
0ce398f1 3089 {
f6fe1ccd
L
3090 /* ld: compress DWARF debug sections with names: .debug_*. */
3091 if ((arg->link_info->compress_debug & COMPRESS_DEBUG)
3092 && (asect->flags & SEC_DEBUGGING)
3093 && name[1] == 'd'
3094 && name[6] == '_')
3095 {
3096 /* Set SEC_ELF_COMPRESS to indicate this section should be
3097 compressed. */
3098 asect->flags |= SEC_ELF_COMPRESS;
0ce398f1 3099
3e19fb8f
L
3100 /* If this section will be compressed, delay adding setion
3101 name to section name section after it is compressed in
3102 _bfd_elf_assign_file_positions_for_non_load. */
3103 delay_st_name_p = TRUE;
f6fe1ccd
L
3104 }
3105 }
3106 else if ((asect->flags & SEC_ELF_RENAME))
3107 {
3108 /* objcopy: rename output DWARF debug section. */
3109 if ((abfd->flags & (BFD_DECOMPRESS | BFD_COMPRESS_GABI)))
3110 {
3111 /* When we decompress or compress with SHF_COMPRESSED,
3112 convert section name from .zdebug_* to .debug_* if
3113 needed. */
3114 if (name[1] == 'z')
3115 {
3116 char *new_name = convert_zdebug_to_debug (abfd, name);
3117 if (new_name == NULL)
3118 {
3119 arg->failed = TRUE;
3120 return;
3121 }
3122 name = new_name;
3123 }
3124 }
3125 else if (asect->compress_status == COMPRESS_SECTION_DONE)
0ce398f1 3126 {
f6fe1ccd
L
3127 /* PR binutils/18087: Compression does not always make a
3128 section smaller. So only rename the section when
3129 compression has actually taken place. If input section
3130 name is .zdebug_*, we should never compress it again. */
3131 char *new_name = convert_debug_to_zdebug (abfd, name);
0ce398f1
L
3132 if (new_name == NULL)
3133 {
3134 arg->failed = TRUE;
3135 return;
3136 }
f6fe1ccd
L
3137 BFD_ASSERT (name[1] != 'z');
3138 name = new_name;
0ce398f1
L
3139 }
3140 }
3141
3e19fb8f
L
3142 if (delay_st_name_p)
3143 this_hdr->sh_name = (unsigned int) -1;
3144 else
252b5132 3145 {
3e19fb8f
L
3146 this_hdr->sh_name
3147 = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
3148 name, FALSE);
3149 if (this_hdr->sh_name == (unsigned int) -1)
3150 {
3151 arg->failed = TRUE;
3152 return;
3153 }
252b5132
RH
3154 }
3155
a4d8e49b 3156 /* Don't clear sh_flags. Assembler may set additional bits. */
252b5132
RH
3157
3158 if ((asect->flags & SEC_ALLOC) != 0
3159 || asect->user_set_vma)
3160 this_hdr->sh_addr = asect->vma;
3161 else
3162 this_hdr->sh_addr = 0;
3163
3164 this_hdr->sh_offset = 0;
eea6121a 3165 this_hdr->sh_size = asect->size;
252b5132 3166 this_hdr->sh_link = 0;
c86934ce
NC
3167 /* PR 17512: file: 0eb809fe, 8b0535ee. */
3168 if (asect->alignment_power >= (sizeof (bfd_vma) * 8) - 1)
3169 {
3170 (*_bfd_error_handler)
3171 (_("%B: error: Alignment power %d of section `%A' is too big"),
3172 abfd, asect, asect->alignment_power);
3173 arg->failed = TRUE;
3174 return;
3175 }
72de5009 3176 this_hdr->sh_addralign = (bfd_vma) 1 << asect->alignment_power;
252b5132
RH
3177 /* The sh_entsize and sh_info fields may have been set already by
3178 copy_private_section_data. */
3179
3180 this_hdr->bfd_section = asect;
3181 this_hdr->contents = NULL;
3182
3cddba1e
L
3183 /* If the section type is unspecified, we set it based on
3184 asect->flags. */
98ece1b3
AM
3185 if ((asect->flags & SEC_GROUP) != 0)
3186 sh_type = SHT_GROUP;
98ece1b3 3187 else
94be91de 3188 sh_type = bfd_elf_get_default_section_type (asect->flags);
98ece1b3 3189
3cddba1e 3190 if (this_hdr->sh_type == SHT_NULL)
98ece1b3
AM
3191 this_hdr->sh_type = sh_type;
3192 else if (this_hdr->sh_type == SHT_NOBITS
3193 && sh_type == SHT_PROGBITS
3194 && (asect->flags & SEC_ALLOC) != 0)
3cddba1e 3195 {
98ece1b3
AM
3196 /* Warn if we are changing a NOBITS section to PROGBITS, but
3197 allow the link to proceed. This can happen when users link
3198 non-bss input sections to bss output sections, or emit data
3199 to a bss output section via a linker script. */
3200 (*_bfd_error_handler)
58f0869b 3201 (_("warning: section `%A' type changed to PROGBITS"), asect);
98ece1b3 3202 this_hdr->sh_type = sh_type;
3cddba1e
L
3203 }
3204
2f89ff8d 3205 switch (this_hdr->sh_type)
252b5132 3206 {
2f89ff8d 3207 default:
2f89ff8d
L
3208 break;
3209
3210 case SHT_STRTAB:
2f89ff8d
L
3211 case SHT_NOTE:
3212 case SHT_NOBITS:
3213 case SHT_PROGBITS:
3214 break;
606851fb
AM
3215
3216 case SHT_INIT_ARRAY:
3217 case SHT_FINI_ARRAY:
3218 case SHT_PREINIT_ARRAY:
3219 this_hdr->sh_entsize = bed->s->arch_size / 8;
3220 break;
2f89ff8d
L
3221
3222 case SHT_HASH:
c7ac6ff8 3223 this_hdr->sh_entsize = bed->s->sizeof_hash_entry;
2f89ff8d 3224 break;
5de3bf90 3225
2f89ff8d 3226 case SHT_DYNSYM:
252b5132 3227 this_hdr->sh_entsize = bed->s->sizeof_sym;
2f89ff8d
L
3228 break;
3229
3230 case SHT_DYNAMIC:
252b5132 3231 this_hdr->sh_entsize = bed->s->sizeof_dyn;
2f89ff8d
L
3232 break;
3233
3234 case SHT_RELA:
3235 if (get_elf_backend_data (abfd)->may_use_rela_p)
3236 this_hdr->sh_entsize = bed->s->sizeof_rela;
3237 break;
3238
3239 case SHT_REL:
3240 if (get_elf_backend_data (abfd)->may_use_rel_p)
3241 this_hdr->sh_entsize = bed->s->sizeof_rel;
3242 break;
3243
3244 case SHT_GNU_versym:
252b5132 3245 this_hdr->sh_entsize = sizeof (Elf_External_Versym);
2f89ff8d
L
3246 break;
3247
3248 case SHT_GNU_verdef:
252b5132
RH
3249 this_hdr->sh_entsize = 0;
3250 /* objcopy or strip will copy over sh_info, but may not set
08a40648
AM
3251 cverdefs. The linker will set cverdefs, but sh_info will be
3252 zero. */
252b5132
RH
3253 if (this_hdr->sh_info == 0)
3254 this_hdr->sh_info = elf_tdata (abfd)->cverdefs;
3255 else
3256 BFD_ASSERT (elf_tdata (abfd)->cverdefs == 0
3257 || this_hdr->sh_info == elf_tdata (abfd)->cverdefs);
2f89ff8d
L
3258 break;
3259
3260 case SHT_GNU_verneed:
252b5132
RH
3261 this_hdr->sh_entsize = 0;
3262 /* objcopy or strip will copy over sh_info, but may not set
08a40648
AM
3263 cverrefs. The linker will set cverrefs, but sh_info will be
3264 zero. */
252b5132
RH
3265 if (this_hdr->sh_info == 0)
3266 this_hdr->sh_info = elf_tdata (abfd)->cverrefs;
3267 else
3268 BFD_ASSERT (elf_tdata (abfd)->cverrefs == 0
3269 || this_hdr->sh_info == elf_tdata (abfd)->cverrefs);
2f89ff8d
L
3270 break;
3271
3272 case SHT_GROUP:
1783205a 3273 this_hdr->sh_entsize = GRP_ENTRY_SIZE;
2f89ff8d 3274 break;
fdc90cb4
JJ
3275
3276 case SHT_GNU_HASH:
3277 this_hdr->sh_entsize = bed->s->arch_size == 64 ? 0 : 4;
3278 break;
dbb410c3 3279 }
252b5132
RH
3280
3281 if ((asect->flags & SEC_ALLOC) != 0)
3282 this_hdr->sh_flags |= SHF_ALLOC;
3283 if ((asect->flags & SEC_READONLY) == 0)
3284 this_hdr->sh_flags |= SHF_WRITE;
3285 if ((asect->flags & SEC_CODE) != 0)
3286 this_hdr->sh_flags |= SHF_EXECINSTR;
f5fa8ca2
JJ
3287 if ((asect->flags & SEC_MERGE) != 0)
3288 {
3289 this_hdr->sh_flags |= SHF_MERGE;
3290 this_hdr->sh_entsize = asect->entsize;
f5fa8ca2 3291 }
84865015
NC
3292 if ((asect->flags & SEC_STRINGS) != 0)
3293 this_hdr->sh_flags |= SHF_STRINGS;
1126897b 3294 if ((asect->flags & SEC_GROUP) == 0 && elf_group_name (asect) != NULL)
dbb410c3 3295 this_hdr->sh_flags |= SHF_GROUP;
13ae64f3 3296 if ((asect->flags & SEC_THREAD_LOCAL) != 0)
704afa60
JJ
3297 {
3298 this_hdr->sh_flags |= SHF_TLS;
3a800eb9
AM
3299 if (asect->size == 0
3300 && (asect->flags & SEC_HAS_CONTENTS) == 0)
704afa60 3301 {
3a800eb9 3302 struct bfd_link_order *o = asect->map_tail.link_order;
b34976b6 3303
704afa60 3304 this_hdr->sh_size = 0;
3a800eb9
AM
3305 if (o != NULL)
3306 {
704afa60 3307 this_hdr->sh_size = o->offset + o->size;
3a800eb9
AM
3308 if (this_hdr->sh_size != 0)
3309 this_hdr->sh_type = SHT_NOBITS;
3310 }
704afa60
JJ
3311 }
3312 }
18ae9cc1
L
3313 if ((asect->flags & (SEC_GROUP | SEC_EXCLUDE)) == SEC_EXCLUDE)
3314 this_hdr->sh_flags |= SHF_EXCLUDE;
252b5132 3315
d4730f92
BS
3316 /* If the section has relocs, set up a section header for the
3317 SHT_REL[A] section. If two relocation sections are required for
3318 this section, it is up to the processor-specific back-end to
3319 create the other. */
3320 if ((asect->flags & SEC_RELOC) != 0)
3321 {
3322 /* When doing a relocatable link, create both REL and RELA sections if
3323 needed. */
3324 if (arg->link_info
3325 /* Do the normal setup if we wouldn't create any sections here. */
3326 && esd->rel.count + esd->rela.count > 0
0e1862bb
L
3327 && (bfd_link_relocatable (arg->link_info)
3328 || arg->link_info->emitrelocations))
d4730f92
BS
3329 {
3330 if (esd->rel.count && esd->rel.hdr == NULL
3e19fb8f
L
3331 && !_bfd_elf_init_reloc_shdr (abfd, &esd->rel, name, FALSE,
3332 delay_st_name_p))
d4730f92
BS
3333 {
3334 arg->failed = TRUE;
3335 return;
3336 }
3337 if (esd->rela.count && esd->rela.hdr == NULL
3e19fb8f
L
3338 && !_bfd_elf_init_reloc_shdr (abfd, &esd->rela, name, TRUE,
3339 delay_st_name_p))
d4730f92
BS
3340 {
3341 arg->failed = TRUE;
3342 return;
3343 }
3344 }
3345 else if (!_bfd_elf_init_reloc_shdr (abfd,
3346 (asect->use_rela_p
3347 ? &esd->rela : &esd->rel),
f6fe1ccd 3348 name,
3e19fb8f
L
3349 asect->use_rela_p,
3350 delay_st_name_p))
d4730f92
BS
3351 arg->failed = TRUE;
3352 }
3353
252b5132 3354 /* Check for processor-specific section types. */
0414f35b 3355 sh_type = this_hdr->sh_type;
e1fddb6b
AO
3356 if (bed->elf_backend_fake_sections
3357 && !(*bed->elf_backend_fake_sections) (abfd, this_hdr, asect))
d4730f92 3358 arg->failed = TRUE;
252b5132 3359
42bb2e33 3360 if (sh_type == SHT_NOBITS && asect->size != 0)
0414f35b
AM
3361 {
3362 /* Don't change the header type from NOBITS if we are being
42bb2e33 3363 called for objcopy --only-keep-debug. */
0414f35b
AM
3364 this_hdr->sh_type = sh_type;
3365 }
252b5132
RH
3366}
3367
bcacc0f5
AM
3368/* Fill in the contents of a SHT_GROUP section. Called from
3369 _bfd_elf_compute_section_file_positions for gas, objcopy, and
3370 when ELF targets use the generic linker, ld. Called for ld -r
3371 from bfd_elf_final_link. */
dbb410c3 3372
1126897b 3373void
217aa764 3374bfd_elf_set_group_contents (bfd *abfd, asection *sec, void *failedptrarg)
dbb410c3 3375{
a50b1753 3376 bfd_boolean *failedptr = (bfd_boolean *) failedptrarg;
9dce4196 3377 asection *elt, *first;
dbb410c3 3378 unsigned char *loc;
b34976b6 3379 bfd_boolean gas;
dbb410c3 3380
7e4111ad
L
3381 /* Ignore linker created group section. See elfNN_ia64_object_p in
3382 elfxx-ia64.c. */
3383 if (((sec->flags & (SEC_GROUP | SEC_LINKER_CREATED)) != SEC_GROUP)
dbb410c3
AM
3384 || *failedptr)
3385 return;
3386
bcacc0f5
AM
3387 if (elf_section_data (sec)->this_hdr.sh_info == 0)
3388 {
3389 unsigned long symindx = 0;
3390
3391 /* elf_group_id will have been set up by objcopy and the
3392 generic linker. */
3393 if (elf_group_id (sec) != NULL)
3394 symindx = elf_group_id (sec)->udata.i;
1126897b 3395
bcacc0f5
AM
3396 if (symindx == 0)
3397 {
3398 /* If called from the assembler, swap_out_syms will have set up
3399 elf_section_syms. */
3400 BFD_ASSERT (elf_section_syms (abfd) != NULL);
3401 symindx = elf_section_syms (abfd)[sec->index]->udata.i;
3402 }
3403 elf_section_data (sec)->this_hdr.sh_info = symindx;
3404 }
3405 else if (elf_section_data (sec)->this_hdr.sh_info == (unsigned int) -2)
1126897b 3406 {
bcacc0f5
AM
3407 /* The ELF backend linker sets sh_info to -2 when the group
3408 signature symbol is global, and thus the index can't be
3409 set until all local symbols are output. */
3410 asection *igroup = elf_sec_group (elf_next_in_group (sec));
3411 struct bfd_elf_section_data *sec_data = elf_section_data (igroup);
3412 unsigned long symndx = sec_data->this_hdr.sh_info;
3413 unsigned long extsymoff = 0;
3414 struct elf_link_hash_entry *h;
3415
3416 if (!elf_bad_symtab (igroup->owner))
3417 {
3418 Elf_Internal_Shdr *symtab_hdr;
3419
3420 symtab_hdr = &elf_tdata (igroup->owner)->symtab_hdr;
3421 extsymoff = symtab_hdr->sh_info;
3422 }
3423 h = elf_sym_hashes (igroup->owner)[symndx - extsymoff];
3424 while (h->root.type == bfd_link_hash_indirect
3425 || h->root.type == bfd_link_hash_warning)
3426 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3427
3428 elf_section_data (sec)->this_hdr.sh_info = h->indx;
1126897b 3429 }
dbb410c3 3430
1126897b 3431 /* The contents won't be allocated for "ld -r" or objcopy. */
b34976b6 3432 gas = TRUE;
dbb410c3
AM
3433 if (sec->contents == NULL)
3434 {
b34976b6 3435 gas = FALSE;
a50b1753 3436 sec->contents = (unsigned char *) bfd_alloc (abfd, sec->size);
9dce4196
AM
3437
3438 /* Arrange for the section to be written out. */
3439 elf_section_data (sec)->this_hdr.contents = sec->contents;
dbb410c3
AM
3440 if (sec->contents == NULL)
3441 {
b34976b6 3442 *failedptr = TRUE;
dbb410c3
AM
3443 return;
3444 }
3445 }
3446
eea6121a 3447 loc = sec->contents + sec->size;
dbb410c3 3448
9dce4196
AM
3449 /* Get the pointer to the first section in the group that gas
3450 squirreled away here. objcopy arranges for this to be set to the
3451 start of the input section group. */
3452 first = elt = elf_next_in_group (sec);
dbb410c3
AM
3453
3454 /* First element is a flag word. Rest of section is elf section
3455 indices for all the sections of the group. Write them backwards
3456 just to keep the group in the same order as given in .section
3457 directives, not that it matters. */
3458 while (elt != NULL)
3459 {
9dce4196 3460 asection *s;
9dce4196 3461
9dce4196 3462 s = elt;
415f38a6
AM
3463 if (!gas)
3464 s = s->output_section;
3465 if (s != NULL
3466 && !bfd_is_abs_section (s))
01e1a5bc 3467 {
415f38a6
AM
3468 unsigned int idx = elf_section_data (s)->this_idx;
3469
01e1a5bc 3470 loc -= 4;
01e1a5bc
NC
3471 H_PUT_32 (abfd, idx, loc);
3472 }
945906ff 3473 elt = elf_next_in_group (elt);
9dce4196
AM
3474 if (elt == first)
3475 break;
dbb410c3
AM
3476 }
3477
3d7f7666 3478 if ((loc -= 4) != sec->contents)
9dce4196 3479 abort ();
dbb410c3 3480
9dce4196 3481 H_PUT_32 (abfd, sec->flags & SEC_LINK_ONCE ? GRP_COMDAT : 0, loc);
dbb410c3
AM
3482}
3483
bd53a53a
L
3484/* Return the section which RELOC_SEC applies to. */
3485
3486asection *
3487_bfd_elf_get_reloc_section (asection *reloc_sec)
3488{
3489 const char *name;
3490 unsigned int type;
3491 bfd *abfd;
3492
3493 if (reloc_sec == NULL)
3494 return NULL;
3495
3496 type = elf_section_data (reloc_sec)->this_hdr.sh_type;
3497 if (type != SHT_REL && type != SHT_RELA)
3498 return NULL;
3499
3500 /* We look up the section the relocs apply to by name. */
3501 name = reloc_sec->name;
3502 if (type == SHT_REL)
3503 name += 4;
3504 else
3505 name += 5;
3506
3507 /* If a target needs .got.plt section, relocations in rela.plt/rel.plt
3508 section apply to .got.plt section. */
3509 abfd = reloc_sec->owner;
3510 if (get_elf_backend_data (abfd)->want_got_plt
3511 && strcmp (name, ".plt") == 0)
87070c08
AM
3512 {
3513 /* .got.plt is a linker created input section. It may be mapped
3514 to some other output section. Try two likely sections. */
3515 name = ".got.plt";
3516 reloc_sec = bfd_get_section_by_name (abfd, name);
3517 if (reloc_sec != NULL)
3518 return reloc_sec;
3519 name = ".got";
3520 }
bd53a53a
L
3521
3522 reloc_sec = bfd_get_section_by_name (abfd, name);
3523 return reloc_sec;
3524}
3525
252b5132
RH
3526/* Assign all ELF section numbers. The dummy first section is handled here
3527 too. The link/info pointers for the standard section types are filled
3528 in here too, while we're at it. */
3529
b34976b6 3530static bfd_boolean
da9f89d4 3531assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
252b5132
RH
3532{
3533 struct elf_obj_tdata *t = elf_tdata (abfd);
3534 asection *sec;
3e19fb8f 3535 unsigned int section_number;
252b5132 3536 Elf_Internal_Shdr **i_shdrp;
47cc2cf5 3537 struct bfd_elf_section_data *d;
3516e984 3538 bfd_boolean need_symtab;
252b5132
RH
3539
3540 section_number = 1;
3541
2b0f7ef9
JJ
3542 _bfd_elf_strtab_clear_all_refs (elf_shstrtab (abfd));
3543
da9f89d4 3544 /* SHT_GROUP sections are in relocatable files only. */
0e1862bb 3545 if (link_info == NULL || bfd_link_relocatable (link_info))
252b5132 3546 {
14f2c699
L
3547 bfd_size_type reloc_count = 0;
3548
da9f89d4 3549 /* Put SHT_GROUP sections first. */
04dd1667 3550 for (sec = abfd->sections; sec != NULL; sec = sec->next)
47cc2cf5 3551 {
5daa8fe7 3552 d = elf_section_data (sec);
da9f89d4
L
3553
3554 if (d->this_hdr.sh_type == SHT_GROUP)
08a40648 3555 {
5daa8fe7 3556 if (sec->flags & SEC_LINKER_CREATED)
da9f89d4
L
3557 {
3558 /* Remove the linker created SHT_GROUP sections. */
5daa8fe7 3559 bfd_section_list_remove (abfd, sec);
da9f89d4 3560 abfd->section_count--;
da9f89d4 3561 }
08a40648 3562 else
4fbb74a6 3563 d->this_idx = section_number++;
da9f89d4 3564 }
14f2c699
L
3565
3566 /* Count relocations. */
3567 reloc_count += sec->reloc_count;
47cc2cf5 3568 }
14f2c699
L
3569
3570 /* Clear HAS_RELOC if there are no relocations. */
3571 if (reloc_count == 0)
3572 abfd->flags &= ~HAS_RELOC;
47cc2cf5
PB
3573 }
3574
3575 for (sec = abfd->sections; sec; sec = sec->next)
3576 {
3577 d = elf_section_data (sec);
3578
3579 if (d->this_hdr.sh_type != SHT_GROUP)
4fbb74a6 3580 d->this_idx = section_number++;
3e19fb8f
L
3581 if (d->this_hdr.sh_name != (unsigned int) -1)
3582 _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->this_hdr.sh_name);
d4730f92 3583 if (d->rel.hdr)
2b0f7ef9 3584 {
d4730f92 3585 d->rel.idx = section_number++;
3e19fb8f
L
3586 if (d->rel.hdr->sh_name != (unsigned int) -1)
3587 _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->rel.hdr->sh_name);
2b0f7ef9 3588 }
d4730f92
BS
3589 else
3590 d->rel.idx = 0;
23bc299b 3591
d4730f92 3592 if (d->rela.hdr)
2b0f7ef9 3593 {
d4730f92 3594 d->rela.idx = section_number++;
3e19fb8f
L
3595 if (d->rela.hdr->sh_name != (unsigned int) -1)
3596 _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->rela.hdr->sh_name);
2b0f7ef9 3597 }
23bc299b 3598 else
d4730f92 3599 d->rela.idx = 0;
252b5132
RH
3600 }
3601
12bd6957 3602 elf_shstrtab_sec (abfd) = section_number++;
2b0f7ef9 3603 _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->shstrtab_hdr.sh_name);
12bd6957 3604 elf_elfheader (abfd)->e_shstrndx = elf_shstrtab_sec (abfd);
252b5132 3605
3516e984
L
3606 need_symtab = (bfd_get_symcount (abfd) > 0
3607 || (link_info == NULL
3608 && ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC))
3609 == HAS_RELOC)));
3610 if (need_symtab)
252b5132 3611 {
12bd6957 3612 elf_onesymtab (abfd) = section_number++;
2b0f7ef9 3613 _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->symtab_hdr.sh_name);
4fbb74a6 3614 if (section_number > ((SHN_LORESERVE - 2) & 0xFFFF))
9ad5cbcf 3615 {
6a40cf0c
NC
3616 elf_section_list * entry;
3617
3618 BFD_ASSERT (elf_symtab_shndx_list (abfd) == NULL);
3619
3620 entry = bfd_zalloc (abfd, sizeof * entry);
3621 entry->ndx = section_number++;
3622 elf_symtab_shndx_list (abfd) = entry;
3623 entry->hdr.sh_name
9ad5cbcf 3624 = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
b34976b6 3625 ".symtab_shndx", FALSE);
6a40cf0c 3626 if (entry->hdr.sh_name == (unsigned int) -1)
b34976b6 3627 return FALSE;
9ad5cbcf 3628 }
12bd6957 3629 elf_strtab_sec (abfd) = section_number++;
2b0f7ef9 3630 _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->strtab_hdr.sh_name);
252b5132
RH
3631 }
3632
1c52a645
L
3633 if (section_number >= SHN_LORESERVE)
3634 {
3635 _bfd_error_handler (_("%B: too many sections: %u"),
3636 abfd, section_number);
3637 return FALSE;
3638 }
3639
9ad5cbcf 3640 elf_numsections (abfd) = section_number;
252b5132
RH
3641 elf_elfheader (abfd)->e_shnum = section_number;
3642
3643 /* Set up the list of section header pointers, in agreement with the
3644 indices. */
a50b1753
NC
3645 i_shdrp = (Elf_Internal_Shdr **) bfd_zalloc2 (abfd, section_number,
3646 sizeof (Elf_Internal_Shdr *));
252b5132 3647 if (i_shdrp == NULL)
b34976b6 3648 return FALSE;
252b5132 3649
a50b1753
NC
3650 i_shdrp[0] = (Elf_Internal_Shdr *) bfd_zalloc (abfd,
3651 sizeof (Elf_Internal_Shdr));
252b5132
RH
3652 if (i_shdrp[0] == NULL)
3653 {
3654 bfd_release (abfd, i_shdrp);
b34976b6 3655 return FALSE;
252b5132 3656 }
252b5132
RH
3657
3658 elf_elfsections (abfd) = i_shdrp;
3659
12bd6957 3660 i_shdrp[elf_shstrtab_sec (abfd)] = &t->shstrtab_hdr;
3516e984 3661 if (need_symtab)
252b5132 3662 {
12bd6957 3663 i_shdrp[elf_onesymtab (abfd)] = &t->symtab_hdr;
4fbb74a6 3664 if (elf_numsections (abfd) > (SHN_LORESERVE & 0xFFFF))
9ad5cbcf 3665 {
6a40cf0c
NC
3666 elf_section_list * entry = elf_symtab_shndx_list (abfd);
3667 BFD_ASSERT (entry != NULL);
3668 i_shdrp[entry->ndx] = & entry->hdr;
3669 entry->hdr.sh_link = elf_onesymtab (abfd);
9ad5cbcf 3670 }
12bd6957
AM
3671 i_shdrp[elf_strtab_sec (abfd)] = &t->strtab_hdr;
3672 t->symtab_hdr.sh_link = elf_strtab_sec (abfd);
252b5132 3673 }
38ce5b11 3674
252b5132
RH
3675 for (sec = abfd->sections; sec; sec = sec->next)
3676 {
252b5132 3677 asection *s;
252b5132 3678
91d6fa6a
NC
3679 d = elf_section_data (sec);
3680
252b5132 3681 i_shdrp[d->this_idx] = &d->this_hdr;
d4730f92
BS
3682 if (d->rel.idx != 0)
3683 i_shdrp[d->rel.idx] = d->rel.hdr;
3684 if (d->rela.idx != 0)
3685 i_shdrp[d->rela.idx] = d->rela.hdr;
252b5132
RH
3686
3687 /* Fill in the sh_link and sh_info fields while we're at it. */
3688
3689 /* sh_link of a reloc section is the section index of the symbol
3690 table. sh_info is the section index of the section to which
3691 the relocation entries apply. */
d4730f92 3692 if (d->rel.idx != 0)
252b5132 3693 {
12bd6957 3694 d->rel.hdr->sh_link = elf_onesymtab (abfd);
d4730f92 3695 d->rel.hdr->sh_info = d->this_idx;
9ef5d938 3696 d->rel.hdr->sh_flags |= SHF_INFO_LINK;
252b5132 3697 }
d4730f92 3698 if (d->rela.idx != 0)
23bc299b 3699 {
12bd6957 3700 d->rela.hdr->sh_link = elf_onesymtab (abfd);
d4730f92 3701 d->rela.hdr->sh_info = d->this_idx;
9ef5d938 3702 d->rela.hdr->sh_flags |= SHF_INFO_LINK;
23bc299b 3703 }
252b5132 3704
38ce5b11
L
3705 /* We need to set up sh_link for SHF_LINK_ORDER. */
3706 if ((d->this_hdr.sh_flags & SHF_LINK_ORDER) != 0)
3707 {
3708 s = elf_linked_to_section (sec);
3709 if (s)
38ce5b11 3710 {
f2876037 3711 /* elf_linked_to_section points to the input section. */
ccd2ec6a 3712 if (link_info != NULL)
38ce5b11 3713 {
f2876037 3714 /* Check discarded linkonce section. */
dbaa2011 3715 if (discarded_section (s))
38ce5b11 3716 {
ccd2ec6a
L
3717 asection *kept;
3718 (*_bfd_error_handler)
3719 (_("%B: sh_link of section `%A' points to discarded section `%A' of `%B'"),
3720 abfd, d->this_hdr.bfd_section,
3721 s, s->owner);
3722 /* Point to the kept section if it has the same
3723 size as the discarded one. */
c0f00686 3724 kept = _bfd_elf_check_kept_section (s, link_info);
ccd2ec6a 3725 if (kept == NULL)
185d09ad 3726 {
ccd2ec6a
L
3727 bfd_set_error (bfd_error_bad_value);
3728 return FALSE;
185d09ad 3729 }
ccd2ec6a 3730 s = kept;
38ce5b11 3731 }
e424ecc8 3732
ccd2ec6a
L
3733 s = s->output_section;
3734 BFD_ASSERT (s != NULL);
38ce5b11 3735 }
f2876037
L
3736 else
3737 {
3738 /* Handle objcopy. */
3739 if (s->output_section == NULL)
3740 {
3741 (*_bfd_error_handler)
3742 (_("%B: sh_link of section `%A' points to removed section `%A' of `%B'"),
3743 abfd, d->this_hdr.bfd_section, s, s->owner);
3744 bfd_set_error (bfd_error_bad_value);
3745 return FALSE;
3746 }
3747 s = s->output_section;
3748 }
ccd2ec6a
L
3749 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3750 }
3751 else
3752 {
3753 /* PR 290:
3754 The Intel C compiler generates SHT_IA_64_UNWIND with
3755 SHF_LINK_ORDER. But it doesn't set the sh_link or
3756 sh_info fields. Hence we could get the situation
08a40648 3757 where s is NULL. */
ccd2ec6a
L
3758 const struct elf_backend_data *bed
3759 = get_elf_backend_data (abfd);
3760 if (bed->link_order_error_handler)
3761 bed->link_order_error_handler
3762 (_("%B: warning: sh_link not set for section `%A'"),
3763 abfd, sec);
38ce5b11
L
3764 }
3765 }
3766
252b5132
RH
3767 switch (d->this_hdr.sh_type)
3768 {
3769 case SHT_REL:
3770 case SHT_RELA:
3771 /* A reloc section which we are treating as a normal BFD
3772 section. sh_link is the section index of the symbol
3773 table. sh_info is the section index of the section to
3774 which the relocation entries apply. We assume that an
3775 allocated reloc section uses the dynamic symbol table.
3776 FIXME: How can we be sure? */
3777 s = bfd_get_section_by_name (abfd, ".dynsym");
3778 if (s != NULL)
3779 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3780
bd53a53a 3781 s = get_elf_backend_data (abfd)->get_reloc_section (sec);
252b5132 3782 if (s != NULL)
9ef5d938
L
3783 {
3784 d->this_hdr.sh_info = elf_section_data (s)->this_idx;
3785 d->this_hdr.sh_flags |= SHF_INFO_LINK;
3786 }
252b5132
RH
3787 break;
3788
3789 case SHT_STRTAB:
3790 /* We assume that a section named .stab*str is a stabs
3791 string section. We look for a section with the same name
3792 but without the trailing ``str'', and set its sh_link
3793 field to point to this section. */
0112cd26 3794 if (CONST_STRNEQ (sec->name, ".stab")
252b5132
RH
3795 && strcmp (sec->name + strlen (sec->name) - 3, "str") == 0)
3796 {
3797 size_t len;
3798 char *alc;
3799
3800 len = strlen (sec->name);
a50b1753 3801 alc = (char *) bfd_malloc (len - 2);
252b5132 3802 if (alc == NULL)
b34976b6 3803 return FALSE;
d4c88bbb 3804 memcpy (alc, sec->name, len - 3);
252b5132
RH
3805 alc[len - 3] = '\0';
3806 s = bfd_get_section_by_name (abfd, alc);
3807 free (alc);
3808 if (s != NULL)
3809 {
3810 elf_section_data (s)->this_hdr.sh_link = d->this_idx;
3811
3812 /* This is a .stab section. */
0594c12d
AM
3813 if (elf_section_data (s)->this_hdr.sh_entsize == 0)
3814 elf_section_data (s)->this_hdr.sh_entsize
3815 = 4 + 2 * bfd_get_arch_size (abfd) / 8;
252b5132
RH
3816 }
3817 }
3818 break;
3819
3820 case SHT_DYNAMIC:
3821 case SHT_DYNSYM:
3822 case SHT_GNU_verneed:
3823 case SHT_GNU_verdef:
3824 /* sh_link is the section header index of the string table
3825 used for the dynamic entries, or the symbol table, or the
3826 version strings. */
3827 s = bfd_get_section_by_name (abfd, ".dynstr");
3828 if (s != NULL)
3829 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3830 break;
3831
7f1204bb
JJ
3832 case SHT_GNU_LIBLIST:
3833 /* sh_link is the section header index of the prelink library
08a40648
AM
3834 list used for the dynamic entries, or the symbol table, or
3835 the version strings. */
7f1204bb
JJ
3836 s = bfd_get_section_by_name (abfd, (sec->flags & SEC_ALLOC)
3837 ? ".dynstr" : ".gnu.libstr");
3838 if (s != NULL)
3839 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3840 break;
3841
252b5132 3842 case SHT_HASH:
fdc90cb4 3843 case SHT_GNU_HASH:
252b5132
RH
3844 case SHT_GNU_versym:
3845 /* sh_link is the section header index of the symbol table
3846 this hash table or version table is for. */
3847 s = bfd_get_section_by_name (abfd, ".dynsym");
3848 if (s != NULL)
3849 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3850 break;
dbb410c3
AM
3851
3852 case SHT_GROUP:
12bd6957 3853 d->this_hdr.sh_link = elf_onesymtab (abfd);
252b5132
RH
3854 }
3855 }
3856
3e19fb8f
L
3857 /* Delay setting sh_name to _bfd_elf_write_object_contents so that
3858 _bfd_elf_assign_file_positions_for_non_load can convert DWARF
3859 debug section name from .debug_* to .zdebug_* if needed. */
3860
b34976b6 3861 return TRUE;
252b5132
RH
3862}
3863
5372391b 3864static bfd_boolean
217aa764 3865sym_is_global (bfd *abfd, asymbol *sym)
252b5132
RH
3866{
3867 /* If the backend has a special mapping, use it. */
9c5bfbb7 3868 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
217aa764
AM
3869 if (bed->elf_backend_sym_is_global)
3870 return (*bed->elf_backend_sym_is_global) (abfd, sym);
252b5132 3871
e47bf690 3872 return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
252b5132
RH
3873 || bfd_is_und_section (bfd_get_section (sym))
3874 || bfd_is_com_section (bfd_get_section (sym)));
3875}
3876
5372391b 3877/* Don't output section symbols for sections that are not going to be
c6d8cab4 3878 output, that are duplicates or there is no BFD section. */
5372391b
AM
3879
3880static bfd_boolean
3881ignore_section_sym (bfd *abfd, asymbol *sym)
3882{
c6d8cab4
L
3883 elf_symbol_type *type_ptr;
3884
3885 if ((sym->flags & BSF_SECTION_SYM) == 0)
3886 return FALSE;
3887
3888 type_ptr = elf_symbol_from (abfd, sym);
3889 return ((type_ptr != NULL
3890 && type_ptr->internal_elf_sym.st_shndx != 0
3891 && bfd_is_abs_section (sym->section))
3892 || !(sym->section->owner == abfd
0f0a5e58 3893 || (sym->section->output_section->owner == abfd
2633a79c
AM
3894 && sym->section->output_offset == 0)
3895 || bfd_is_abs_section (sym->section)));
5372391b
AM
3896}
3897
2633a79c
AM
3898/* Map symbol from it's internal number to the external number, moving
3899 all local symbols to be at the head of the list. */
3900
b34976b6 3901static bfd_boolean
12bd6957 3902elf_map_symbols (bfd *abfd, unsigned int *pnum_locals)
252b5132 3903{
dc810e39 3904 unsigned int symcount = bfd_get_symcount (abfd);
252b5132
RH
3905 asymbol **syms = bfd_get_outsymbols (abfd);
3906 asymbol **sect_syms;
dc810e39
AM
3907 unsigned int num_locals = 0;
3908 unsigned int num_globals = 0;
3909 unsigned int num_locals2 = 0;
3910 unsigned int num_globals2 = 0;
7292b3ac 3911 unsigned int max_index = 0;
dc810e39 3912 unsigned int idx;
252b5132
RH
3913 asection *asect;
3914 asymbol **new_syms;
252b5132
RH
3915
3916#ifdef DEBUG
3917 fprintf (stderr, "elf_map_symbols\n");
3918 fflush (stderr);
3919#endif
3920
252b5132
RH
3921 for (asect = abfd->sections; asect; asect = asect->next)
3922 {
3923 if (max_index < asect->index)
3924 max_index = asect->index;
3925 }
3926
3927 max_index++;
a50b1753 3928 sect_syms = (asymbol **) bfd_zalloc2 (abfd, max_index, sizeof (asymbol *));
252b5132 3929 if (sect_syms == NULL)
b34976b6 3930 return FALSE;
252b5132 3931 elf_section_syms (abfd) = sect_syms;
4e89ac30 3932 elf_num_section_syms (abfd) = max_index;
252b5132 3933
079e9a2f
AM
3934 /* Init sect_syms entries for any section symbols we have already
3935 decided to output. */
252b5132
RH
3936 for (idx = 0; idx < symcount; idx++)
3937 {
dc810e39 3938 asymbol *sym = syms[idx];
c044fabd 3939
252b5132 3940 if ((sym->flags & BSF_SECTION_SYM) != 0
0f0a5e58 3941 && sym->value == 0
2633a79c
AM
3942 && !ignore_section_sym (abfd, sym)
3943 && !bfd_is_abs_section (sym->section))
252b5132 3944 {
5372391b 3945 asection *sec = sym->section;
252b5132 3946
5372391b
AM
3947 if (sec->owner != abfd)
3948 sec = sec->output_section;
252b5132 3949
5372391b 3950 sect_syms[sec->index] = syms[idx];
252b5132
RH
3951 }
3952 }
3953
252b5132
RH
3954 /* Classify all of the symbols. */
3955 for (idx = 0; idx < symcount; idx++)
3956 {
2633a79c 3957 if (sym_is_global (abfd, syms[idx]))
252b5132 3958 num_globals++;
2633a79c
AM
3959 else if (!ignore_section_sym (abfd, syms[idx]))
3960 num_locals++;
252b5132 3961 }
079e9a2f 3962
5372391b 3963 /* We will be adding a section symbol for each normal BFD section. Most
079e9a2f
AM
3964 sections will already have a section symbol in outsymbols, but
3965 eg. SHT_GROUP sections will not, and we need the section symbol mapped
3966 at least in that case. */
252b5132
RH
3967 for (asect = abfd->sections; asect; asect = asect->next)
3968 {
079e9a2f 3969 if (sect_syms[asect->index] == NULL)
252b5132 3970 {
079e9a2f 3971 if (!sym_is_global (abfd, asect->symbol))
252b5132
RH
3972 num_locals++;
3973 else
3974 num_globals++;
252b5132
RH
3975 }
3976 }
3977
3978 /* Now sort the symbols so the local symbols are first. */
a50b1753
NC
3979 new_syms = (asymbol **) bfd_alloc2 (abfd, num_locals + num_globals,
3980 sizeof (asymbol *));
dc810e39 3981
252b5132 3982 if (new_syms == NULL)
b34976b6 3983 return FALSE;
252b5132
RH
3984
3985 for (idx = 0; idx < symcount; idx++)
3986 {
3987 asymbol *sym = syms[idx];
dc810e39 3988 unsigned int i;
252b5132 3989
2633a79c
AM
3990 if (sym_is_global (abfd, sym))
3991 i = num_locals + num_globals2++;
3992 else if (!ignore_section_sym (abfd, sym))
252b5132
RH
3993 i = num_locals2++;
3994 else
2633a79c 3995 continue;
252b5132
RH
3996 new_syms[i] = sym;
3997 sym->udata.i = i + 1;
3998 }
3999 for (asect = abfd->sections; asect; asect = asect->next)
4000 {
079e9a2f 4001 if (sect_syms[asect->index] == NULL)
252b5132 4002 {
079e9a2f 4003 asymbol *sym = asect->symbol;
dc810e39 4004 unsigned int i;
252b5132 4005
079e9a2f 4006 sect_syms[asect->index] = sym;
252b5132
RH
4007 if (!sym_is_global (abfd, sym))
4008 i = num_locals2++;
4009 else
4010 i = num_locals + num_globals2++;
4011 new_syms[i] = sym;
4012 sym->udata.i = i + 1;
4013 }
4014 }
4015
4016 bfd_set_symtab (abfd, new_syms, num_locals + num_globals);
4017
12bd6957 4018 *pnum_locals = num_locals;
b34976b6 4019 return TRUE;
252b5132
RH
4020}
4021
4022/* Align to the maximum file alignment that could be required for any
4023 ELF data structure. */
4024
268b6b39 4025static inline file_ptr
217aa764 4026align_file_position (file_ptr off, int align)
252b5132
RH
4027{
4028 return (off + align - 1) & ~(align - 1);
4029}
4030
4031/* Assign a file position to a section, optionally aligning to the
4032 required section alignment. */
4033
217aa764
AM
4034file_ptr
4035_bfd_elf_assign_file_position_for_section (Elf_Internal_Shdr *i_shdrp,
4036 file_ptr offset,
4037 bfd_boolean align)
252b5132 4038{
72de5009
AM
4039 if (align && i_shdrp->sh_addralign > 1)
4040 offset = BFD_ALIGN (offset, i_shdrp->sh_addralign);
252b5132
RH
4041 i_shdrp->sh_offset = offset;
4042 if (i_shdrp->bfd_section != NULL)
4043 i_shdrp->bfd_section->filepos = offset;
4044 if (i_shdrp->sh_type != SHT_NOBITS)
4045 offset += i_shdrp->sh_size;
4046 return offset;
4047}
4048
4049/* Compute the file positions we are going to put the sections at, and
4050 otherwise prepare to begin writing out the ELF file. If LINK_INFO
4051 is not NULL, this is being called by the ELF backend linker. */
4052
b34976b6 4053bfd_boolean
217aa764
AM
4054_bfd_elf_compute_section_file_positions (bfd *abfd,
4055 struct bfd_link_info *link_info)
252b5132 4056{
9c5bfbb7 4057 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
d4730f92 4058 struct fake_section_arg fsargs;
b34976b6 4059 bfd_boolean failed;
ef10c3ac 4060 struct elf_strtab_hash *strtab = NULL;
252b5132 4061 Elf_Internal_Shdr *shstrtab_hdr;
3516e984 4062 bfd_boolean need_symtab;
252b5132
RH
4063
4064 if (abfd->output_has_begun)
b34976b6 4065 return TRUE;
252b5132
RH
4066
4067 /* Do any elf backend specific processing first. */
4068 if (bed->elf_backend_begin_write_processing)
4069 (*bed->elf_backend_begin_write_processing) (abfd, link_info);
4070
4071 if (! prep_headers (abfd))
b34976b6 4072 return FALSE;
252b5132 4073
e6c51ed4 4074 /* Post process the headers if necessary. */
78245035 4075 (*bed->elf_backend_post_process_headers) (abfd, link_info);
e6c51ed4 4076
d4730f92
BS
4077 fsargs.failed = FALSE;
4078 fsargs.link_info = link_info;
4079 bfd_map_over_sections (abfd, elf_fake_sections, &fsargs);
4080 if (fsargs.failed)
b34976b6 4081 return FALSE;
252b5132 4082
da9f89d4 4083 if (!assign_section_numbers (abfd, link_info))
b34976b6 4084 return FALSE;
252b5132
RH
4085
4086 /* The backend linker builds symbol table information itself. */
3516e984
L
4087 need_symtab = (link_info == NULL
4088 && (bfd_get_symcount (abfd) > 0
4089 || ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC))
4090 == HAS_RELOC)));
4091 if (need_symtab)
252b5132
RH
4092 {
4093 /* Non-zero if doing a relocatable link. */
4094 int relocatable_p = ! (abfd->flags & (EXEC_P | DYNAMIC));
4095
4096 if (! swap_out_syms (abfd, &strtab, relocatable_p))
b34976b6 4097 return FALSE;
252b5132
RH
4098 }
4099
d4730f92 4100 failed = FALSE;
1126897b 4101 if (link_info == NULL)
dbb410c3 4102 {
1126897b 4103 bfd_map_over_sections (abfd, bfd_elf_set_group_contents, &failed);
dbb410c3 4104 if (failed)
b34976b6 4105 return FALSE;
dbb410c3
AM
4106 }
4107
252b5132
RH
4108 shstrtab_hdr = &elf_tdata (abfd)->shstrtab_hdr;
4109 /* sh_name was set in prep_headers. */
4110 shstrtab_hdr->sh_type = SHT_STRTAB;
84865015 4111 shstrtab_hdr->sh_flags = bed->elf_strtab_flags;
252b5132 4112 shstrtab_hdr->sh_addr = 0;
946748d5 4113 /* sh_size is set in _bfd_elf_assign_file_positions_for_non_load. */
252b5132
RH
4114 shstrtab_hdr->sh_entsize = 0;
4115 shstrtab_hdr->sh_link = 0;
4116 shstrtab_hdr->sh_info = 0;
3e19fb8f 4117 /* sh_offset is set in _bfd_elf_assign_file_positions_for_non_load. */
252b5132
RH
4118 shstrtab_hdr->sh_addralign = 1;
4119
c84fca4d 4120 if (!assign_file_positions_except_relocs (abfd, link_info))
b34976b6 4121 return FALSE;
252b5132 4122
3516e984 4123 if (need_symtab)
252b5132
RH
4124 {
4125 file_ptr off;
4126 Elf_Internal_Shdr *hdr;
4127
12bd6957 4128 off = elf_next_file_pos (abfd);
252b5132 4129
6a40cf0c 4130 hdr = & elf_symtab_hdr (abfd);
b34976b6 4131 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
252b5132 4132
6a40cf0c
NC
4133 if (elf_symtab_shndx_list (abfd) != NULL)
4134 {
4135 hdr = & elf_symtab_shndx_list (abfd)->hdr;
4136 if (hdr->sh_size != 0)
4137 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
4138 /* FIXME: What about other symtab_shndx sections in the list ? */
4139 }
9ad5cbcf 4140
252b5132 4141 hdr = &elf_tdata (abfd)->strtab_hdr;
b34976b6 4142 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
252b5132 4143
12bd6957 4144 elf_next_file_pos (abfd) = off;
252b5132
RH
4145
4146 /* Now that we know where the .strtab section goes, write it
08a40648 4147 out. */
252b5132 4148 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
ef10c3ac 4149 || ! _bfd_elf_strtab_emit (abfd, strtab))
b34976b6 4150 return FALSE;
ef10c3ac 4151 _bfd_elf_strtab_free (strtab);
252b5132
RH
4152 }
4153
b34976b6 4154 abfd->output_has_begun = TRUE;
252b5132 4155
b34976b6 4156 return TRUE;
252b5132
RH
4157}
4158
8ded5a0f
AM
4159/* Make an initial estimate of the size of the program header. If we
4160 get the number wrong here, we'll redo section placement. */
4161
4162static bfd_size_type
4163get_program_header_size (bfd *abfd, struct bfd_link_info *info)
4164{
4165 size_t segs;
4166 asection *s;
2b05f1b7 4167 const struct elf_backend_data *bed;
8ded5a0f
AM
4168
4169 /* Assume we will need exactly two PT_LOAD segments: one for text
4170 and one for data. */
4171 segs = 2;
4172
4173 s = bfd_get_section_by_name (abfd, ".interp");
4174 if (s != NULL && (s->flags & SEC_LOAD) != 0)
4175 {
4176 /* If we have a loadable interpreter section, we need a
4177 PT_INTERP segment. In this case, assume we also need a
4178 PT_PHDR segment, although that may not be true for all
4179 targets. */
4180 segs += 2;
4181 }
4182
4183 if (bfd_get_section_by_name (abfd, ".dynamic") != NULL)
4184 {
4185 /* We need a PT_DYNAMIC segment. */
4186 ++segs;
f210dcff 4187 }
08a40648 4188
ceae84aa 4189 if (info != NULL && info->relro)
f210dcff
L
4190 {
4191 /* We need a PT_GNU_RELRO segment. */
4192 ++segs;
8ded5a0f
AM
4193 }
4194
12bd6957 4195 if (elf_eh_frame_hdr (abfd))
8ded5a0f
AM
4196 {
4197 /* We need a PT_GNU_EH_FRAME segment. */
4198 ++segs;
4199 }
4200
12bd6957 4201 if (elf_stack_flags (abfd))
8ded5a0f 4202 {
2b05f1b7
L
4203 /* We need a PT_GNU_STACK segment. */
4204 ++segs;
4205 }
94b11780 4206
2b05f1b7
L
4207 for (s = abfd->sections; s != NULL; s = s->next)
4208 {
8ded5a0f 4209 if ((s->flags & SEC_LOAD) != 0
0112cd26 4210 && CONST_STRNEQ (s->name, ".note"))
8ded5a0f
AM
4211 {
4212 /* We need a PT_NOTE segment. */
4213 ++segs;
1c5265b5
JJ
4214 /* Try to create just one PT_NOTE segment
4215 for all adjacent loadable .note* sections.
4216 gABI requires that within a PT_NOTE segment
4217 (and also inside of each SHT_NOTE section)
4218 each note is padded to a multiple of 4 size,
4219 so we check whether the sections are correctly
4220 aligned. */
4221 if (s->alignment_power == 2)
4222 while (s->next != NULL
4223 && s->next->alignment_power == 2
4224 && (s->next->flags & SEC_LOAD) != 0
4225 && CONST_STRNEQ (s->next->name, ".note"))
4226 s = s->next;
8ded5a0f
AM
4227 }
4228 }
4229
4230 for (s = abfd->sections; s != NULL; s = s->next)
4231 {
4232 if (s->flags & SEC_THREAD_LOCAL)
4233 {
4234 /* We need a PT_TLS segment. */
4235 ++segs;
4236 break;
4237 }
4238 }
4239
4240 /* Let the backend count up any program headers it might need. */
2b05f1b7 4241 bed = get_elf_backend_data (abfd);
8ded5a0f
AM
4242 if (bed->elf_backend_additional_program_headers)
4243 {
4244 int a;
4245
4246 a = (*bed->elf_backend_additional_program_headers) (abfd, info);
4247 if (a == -1)
4248 abort ();
4249 segs += a;
4250 }
4251
4252 return segs * bed->s->sizeof_phdr;
4253}
4254
2ea37f1c
NC
4255/* Find the segment that contains the output_section of section. */
4256
4257Elf_Internal_Phdr *
4258_bfd_elf_find_segment_containing_section (bfd * abfd, asection * section)
4259{
4260 struct elf_segment_map *m;
4261 Elf_Internal_Phdr *p;
4262
12bd6957 4263 for (m = elf_seg_map (abfd), p = elf_tdata (abfd)->phdr;
2ea37f1c
NC
4264 m != NULL;
4265 m = m->next, p++)
4266 {
4267 int i;
4268
4269 for (i = m->count - 1; i >= 0; i--)
4270 if (m->sections[i] == section)
4271 return p;
4272 }
4273
4274 return NULL;
4275}
4276
252b5132
RH
4277/* Create a mapping from a set of sections to a program segment. */
4278
217aa764
AM
4279static struct elf_segment_map *
4280make_mapping (bfd *abfd,
4281 asection **sections,
4282 unsigned int from,
4283 unsigned int to,
4284 bfd_boolean phdr)
252b5132
RH
4285{
4286 struct elf_segment_map *m;
4287 unsigned int i;
4288 asection **hdrpp;
dc810e39 4289 bfd_size_type amt;
252b5132 4290
dc810e39
AM
4291 amt = sizeof (struct elf_segment_map);
4292 amt += (to - from - 1) * sizeof (asection *);
a50b1753 4293 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
252b5132
RH
4294 if (m == NULL)
4295 return NULL;
4296 m->next = NULL;
4297 m->p_type = PT_LOAD;
4298 for (i = from, hdrpp = sections + from; i < to; i++, hdrpp++)
4299 m->sections[i - from] = *hdrpp;
4300 m->count = to - from;
4301
4302 if (from == 0 && phdr)
4303 {
4304 /* Include the headers in the first PT_LOAD segment. */
4305 m->includes_filehdr = 1;
4306 m->includes_phdrs = 1;
4307 }
4308
4309 return m;
4310}
4311
229fcec5
MM
4312/* Create the PT_DYNAMIC segment, which includes DYNSEC. Returns NULL
4313 on failure. */
4314
4315struct elf_segment_map *
4316_bfd_elf_make_dynamic_segment (bfd *abfd, asection *dynsec)
4317{
4318 struct elf_segment_map *m;
4319
a50b1753
NC
4320 m = (struct elf_segment_map *) bfd_zalloc (abfd,
4321 sizeof (struct elf_segment_map));
229fcec5
MM
4322 if (m == NULL)
4323 return NULL;
4324 m->next = NULL;
4325 m->p_type = PT_DYNAMIC;
4326 m->count = 1;
4327 m->sections[0] = dynsec;
08a40648 4328
229fcec5
MM
4329 return m;
4330}
4331
8ded5a0f 4332/* Possibly add or remove segments from the segment map. */
252b5132 4333
b34976b6 4334static bfd_boolean
3dea8fca
AM
4335elf_modify_segment_map (bfd *abfd,
4336 struct bfd_link_info *info,
4337 bfd_boolean remove_empty_load)
252b5132 4338{
252e386e 4339 struct elf_segment_map **m;
8ded5a0f 4340 const struct elf_backend_data *bed;
252b5132 4341
8ded5a0f
AM
4342 /* The placement algorithm assumes that non allocated sections are
4343 not in PT_LOAD segments. We ensure this here by removing such
4344 sections from the segment map. We also remove excluded
252e386e
AM
4345 sections. Finally, any PT_LOAD segment without sections is
4346 removed. */
12bd6957 4347 m = &elf_seg_map (abfd);
252e386e 4348 while (*m)
8ded5a0f
AM
4349 {
4350 unsigned int i, new_count;
252b5132 4351
252e386e 4352 for (new_count = 0, i = 0; i < (*m)->count; i++)
8ded5a0f 4353 {
252e386e
AM
4354 if (((*m)->sections[i]->flags & SEC_EXCLUDE) == 0
4355 && (((*m)->sections[i]->flags & SEC_ALLOC) != 0
4356 || (*m)->p_type != PT_LOAD))
8ded5a0f 4357 {
252e386e
AM
4358 (*m)->sections[new_count] = (*m)->sections[i];
4359 new_count++;
8ded5a0f
AM
4360 }
4361 }
252e386e 4362 (*m)->count = new_count;
252b5132 4363
3dea8fca 4364 if (remove_empty_load && (*m)->p_type == PT_LOAD && (*m)->count == 0)
252e386e
AM
4365 *m = (*m)->next;
4366 else
4367 m = &(*m)->next;
8ded5a0f 4368 }
252b5132 4369
8ded5a0f
AM
4370 bed = get_elf_backend_data (abfd);
4371 if (bed->elf_backend_modify_segment_map != NULL)
252b5132 4372 {
252e386e 4373 if (!(*bed->elf_backend_modify_segment_map) (abfd, info))
8ded5a0f 4374 return FALSE;
252b5132 4375 }
252b5132 4376
8ded5a0f
AM
4377 return TRUE;
4378}
252b5132 4379
8ded5a0f 4380/* Set up a mapping from BFD sections to program segments. */
252b5132 4381
8ded5a0f
AM
4382bfd_boolean
4383_bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
4384{
4385 unsigned int count;
4386 struct elf_segment_map *m;
4387 asection **sections = NULL;
4388 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3dea8fca 4389 bfd_boolean no_user_phdrs;
252b5132 4390
12bd6957 4391 no_user_phdrs = elf_seg_map (abfd) == NULL;
d324f6d6
RM
4392
4393 if (info != NULL)
4394 info->user_phdrs = !no_user_phdrs;
4395
3dea8fca 4396 if (no_user_phdrs && bfd_count_sections (abfd) != 0)
252b5132 4397 {
8ded5a0f
AM
4398 asection *s;
4399 unsigned int i;
4400 struct elf_segment_map *mfirst;
4401 struct elf_segment_map **pm;
4402 asection *last_hdr;
4403 bfd_vma last_size;
4404 unsigned int phdr_index;
4405 bfd_vma maxpagesize;
4406 asection **hdrpp;
4407 bfd_boolean phdr_in_segment = TRUE;
4408 bfd_boolean writable;
4409 int tls_count = 0;
4410 asection *first_tls = NULL;
4411 asection *dynsec, *eh_frame_hdr;
4412 bfd_size_type amt;
8d06853e 4413 bfd_vma addr_mask, wrap_to = 0;
252b5132 4414
8ded5a0f 4415 /* Select the allocated sections, and sort them. */
252b5132 4416
a50b1753
NC
4417 sections = (asection **) bfd_malloc2 (bfd_count_sections (abfd),
4418 sizeof (asection *));
8ded5a0f 4419 if (sections == NULL)
252b5132 4420 goto error_return;
252b5132 4421
8d06853e
AM
4422 /* Calculate top address, avoiding undefined behaviour of shift
4423 left operator when shift count is equal to size of type
4424 being shifted. */
4425 addr_mask = ((bfd_vma) 1 << (bfd_arch_bits_per_address (abfd) - 1)) - 1;
4426 addr_mask = (addr_mask << 1) + 1;
4427
8ded5a0f
AM
4428 i = 0;
4429 for (s = abfd->sections; s != NULL; s = s->next)
4430 {
4431 if ((s->flags & SEC_ALLOC) != 0)
4432 {
4433 sections[i] = s;
4434 ++i;
8d06853e
AM
4435 /* A wrapping section potentially clashes with header. */
4436 if (((s->lma + s->size) & addr_mask) < (s->lma & addr_mask))
4437 wrap_to = (s->lma + s->size) & addr_mask;
8ded5a0f
AM
4438 }
4439 }
4440 BFD_ASSERT (i <= bfd_count_sections (abfd));
4441 count = i;
252b5132 4442
8ded5a0f 4443 qsort (sections, (size_t) count, sizeof (asection *), elf_sort_sections);
252b5132 4444
8ded5a0f 4445 /* Build the mapping. */
252b5132 4446
8ded5a0f
AM
4447 mfirst = NULL;
4448 pm = &mfirst;
252b5132 4449
8ded5a0f
AM
4450 /* If we have a .interp section, then create a PT_PHDR segment for
4451 the program headers and a PT_INTERP segment for the .interp
4452 section. */
4453 s = bfd_get_section_by_name (abfd, ".interp");
4454 if (s != NULL && (s->flags & SEC_LOAD) != 0)
4455 {
4456 amt = sizeof (struct elf_segment_map);
a50b1753 4457 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
4458 if (m == NULL)
4459 goto error_return;
4460 m->next = NULL;
4461 m->p_type = PT_PHDR;
4462 /* FIXME: UnixWare and Solaris set PF_X, Irix 5 does not. */
4463 m->p_flags = PF_R | PF_X;
4464 m->p_flags_valid = 1;
4465 m->includes_phdrs = 1;
252b5132 4466
8ded5a0f
AM
4467 *pm = m;
4468 pm = &m->next;
252b5132 4469
8ded5a0f 4470 amt = sizeof (struct elf_segment_map);
a50b1753 4471 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
4472 if (m == NULL)
4473 goto error_return;
4474 m->next = NULL;
4475 m->p_type = PT_INTERP;
4476 m->count = 1;
4477 m->sections[0] = s;
4478
4479 *pm = m;
4480 pm = &m->next;
252b5132 4481 }
8ded5a0f
AM
4482
4483 /* Look through the sections. We put sections in the same program
4484 segment when the start of the second section can be placed within
4485 a few bytes of the end of the first section. */
4486 last_hdr = NULL;
4487 last_size = 0;
4488 phdr_index = 0;
4489 maxpagesize = bed->maxpagesize;
063bb025
NC
4490 /* PR 17512: file: c8455299.
4491 Avoid divide-by-zero errors later on.
4492 FIXME: Should we abort if the maxpagesize is zero ? */
4493 if (maxpagesize == 0)
4494 maxpagesize = 1;
8ded5a0f
AM
4495 writable = FALSE;
4496 dynsec = bfd_get_section_by_name (abfd, ".dynamic");
4497 if (dynsec != NULL
4498 && (dynsec->flags & SEC_LOAD) == 0)
4499 dynsec = NULL;
4500
4501 /* Deal with -Ttext or something similar such that the first section
4502 is not adjacent to the program headers. This is an
4503 approximation, since at this point we don't know exactly how many
4504 program headers we will need. */
4505 if (count > 0)
252b5132 4506 {
12bd6957 4507 bfd_size_type phdr_size = elf_program_header_size (abfd);
8ded5a0f 4508
62d7a5f6 4509 if (phdr_size == (bfd_size_type) -1)
8ded5a0f 4510 phdr_size = get_program_header_size (abfd, info);
d2bcb0d1 4511 phdr_size += bed->s->sizeof_ehdr;
8ded5a0f 4512 if ((abfd->flags & D_PAGED) == 0
8d06853e
AM
4513 || (sections[0]->lma & addr_mask) < phdr_size
4514 || ((sections[0]->lma & addr_mask) % maxpagesize
4515 < phdr_size % maxpagesize)
4516 || (sections[0]->lma & addr_mask & -maxpagesize) < wrap_to)
8ded5a0f 4517 phdr_in_segment = FALSE;
252b5132
RH
4518 }
4519
8ded5a0f 4520 for (i = 0, hdrpp = sections; i < count; i++, hdrpp++)
252b5132 4521 {
8ded5a0f
AM
4522 asection *hdr;
4523 bfd_boolean new_segment;
4524
4525 hdr = *hdrpp;
4526
4527 /* See if this section and the last one will fit in the same
4528 segment. */
4529
4530 if (last_hdr == NULL)
4531 {
4532 /* If we don't have a segment yet, then we don't need a new
4533 one (we build the last one after this loop). */
4534 new_segment = FALSE;
4535 }
4536 else if (last_hdr->lma - last_hdr->vma != hdr->lma - hdr->vma)
4537 {
4538 /* If this section has a different relation between the
4539 virtual address and the load address, then we need a new
4540 segment. */
4541 new_segment = TRUE;
4542 }
b5599592
AM
4543 else if (hdr->lma < last_hdr->lma + last_size
4544 || last_hdr->lma + last_size < last_hdr->lma)
4545 {
4546 /* If this section has a load address that makes it overlap
4547 the previous section, then we need a new segment. */
4548 new_segment = TRUE;
4549 }
39948a60
NC
4550 /* In the next test we have to be careful when last_hdr->lma is close
4551 to the end of the address space. If the aligned address wraps
4552 around to the start of the address space, then there are no more
4553 pages left in memory and it is OK to assume that the current
4554 section can be included in the current segment. */
4555 else if ((BFD_ALIGN (last_hdr->lma + last_size, maxpagesize) + maxpagesize
4556 > last_hdr->lma)
4557 && (BFD_ALIGN (last_hdr->lma + last_size, maxpagesize) + maxpagesize
4ff73856 4558 <= hdr->lma))
8ded5a0f
AM
4559 {
4560 /* If putting this section in this segment would force us to
4561 skip a page in the segment, then we need a new segment. */
4562 new_segment = TRUE;
4563 }
4564 else if ((last_hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0
e5654c0f
AM
4565 && (hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) != 0
4566 && ((abfd->flags & D_PAGED) == 0
4567 || (((last_hdr->lma + last_size - 1) & -maxpagesize)
4568 != (hdr->lma & -maxpagesize))))
8ded5a0f 4569 {
e5654c0f
AM
4570 /* We don't want to put a loaded section after a
4571 nonloaded (ie. bss style) section in the same segment
4572 as that will force the non-loaded section to be loaded.
4573 Consider .tbss sections as loaded for this purpose.
4574 However, like the writable/non-writable case below,
4575 if they are on the same page then they must be put
4576 in the same segment. */
8ded5a0f
AM
4577 new_segment = TRUE;
4578 }
4579 else if ((abfd->flags & D_PAGED) == 0)
4580 {
4581 /* If the file is not demand paged, which means that we
4582 don't require the sections to be correctly aligned in the
4583 file, then there is no other reason for a new segment. */
4584 new_segment = FALSE;
4585 }
4586 else if (! writable
4587 && (hdr->flags & SEC_READONLY) == 0
8d06853e
AM
4588 && (((last_hdr->lma + last_size - 1) & -maxpagesize)
4589 != (hdr->lma & -maxpagesize)))
8ded5a0f
AM
4590 {
4591 /* We don't want to put a writable section in a read only
4592 segment, unless they are on the same page in memory
4593 anyhow. We already know that the last section does not
4594 bring us past the current section on the page, so the
4595 only case in which the new section is not on the same
4596 page as the previous section is when the previous section
4597 ends precisely on a page boundary. */
4598 new_segment = TRUE;
4599 }
4600 else
4601 {
4602 /* Otherwise, we can use the same segment. */
4603 new_segment = FALSE;
4604 }
4605
2889e75b 4606 /* Allow interested parties a chance to override our decision. */
ceae84aa
AM
4607 if (last_hdr != NULL
4608 && info != NULL
4609 && info->callbacks->override_segment_assignment != NULL)
4610 new_segment
4611 = info->callbacks->override_segment_assignment (info, abfd, hdr,
4612 last_hdr,
4613 new_segment);
2889e75b 4614
8ded5a0f
AM
4615 if (! new_segment)
4616 {
4617 if ((hdr->flags & SEC_READONLY) == 0)
4618 writable = TRUE;
4619 last_hdr = hdr;
4620 /* .tbss sections effectively have zero size. */
4621 if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD))
4622 != SEC_THREAD_LOCAL)
4623 last_size = hdr->size;
4624 else
4625 last_size = 0;
4626 continue;
4627 }
4628
4629 /* We need a new program segment. We must create a new program
4630 header holding all the sections from phdr_index until hdr. */
4631
4632 m = make_mapping (abfd, sections, phdr_index, i, phdr_in_segment);
4633 if (m == NULL)
4634 goto error_return;
4635
4636 *pm = m;
4637 pm = &m->next;
4638
252b5132 4639 if ((hdr->flags & SEC_READONLY) == 0)
b34976b6 4640 writable = TRUE;
8ded5a0f
AM
4641 else
4642 writable = FALSE;
4643
baaff79e
JJ
4644 last_hdr = hdr;
4645 /* .tbss sections effectively have zero size. */
e5caec89 4646 if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD)) != SEC_THREAD_LOCAL)
eea6121a 4647 last_size = hdr->size;
baaff79e
JJ
4648 else
4649 last_size = 0;
8ded5a0f
AM
4650 phdr_index = i;
4651 phdr_in_segment = FALSE;
252b5132
RH
4652 }
4653
86b2281f
AM
4654 /* Create a final PT_LOAD program segment, but not if it's just
4655 for .tbss. */
4656 if (last_hdr != NULL
4657 && (i - phdr_index != 1
4658 || ((last_hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD))
4659 != SEC_THREAD_LOCAL)))
8ded5a0f
AM
4660 {
4661 m = make_mapping (abfd, sections, phdr_index, i, phdr_in_segment);
4662 if (m == NULL)
4663 goto error_return;
252b5132 4664
8ded5a0f
AM
4665 *pm = m;
4666 pm = &m->next;
4667 }
252b5132 4668
8ded5a0f
AM
4669 /* If there is a .dynamic section, throw in a PT_DYNAMIC segment. */
4670 if (dynsec != NULL)
4671 {
4672 m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
4673 if (m == NULL)
4674 goto error_return;
4675 *pm = m;
4676 pm = &m->next;
4677 }
252b5132 4678
1c5265b5
JJ
4679 /* For each batch of consecutive loadable .note sections,
4680 add a PT_NOTE segment. We don't use bfd_get_section_by_name,
4681 because if we link together nonloadable .note sections and
4682 loadable .note sections, we will generate two .note sections
4683 in the output file. FIXME: Using names for section types is
4684 bogus anyhow. */
8ded5a0f
AM
4685 for (s = abfd->sections; s != NULL; s = s->next)
4686 {
4687 if ((s->flags & SEC_LOAD) != 0
0112cd26 4688 && CONST_STRNEQ (s->name, ".note"))
8ded5a0f 4689 {
1c5265b5 4690 asection *s2;
91d6fa6a
NC
4691
4692 count = 1;
8ded5a0f 4693 amt = sizeof (struct elf_segment_map);
1c5265b5
JJ
4694 if (s->alignment_power == 2)
4695 for (s2 = s; s2->next != NULL; s2 = s2->next)
55b581a6
JJ
4696 {
4697 if (s2->next->alignment_power == 2
4698 && (s2->next->flags & SEC_LOAD) != 0
4699 && CONST_STRNEQ (s2->next->name, ".note")
8d06853e
AM
4700 && align_power (s2->lma + s2->size, 2)
4701 == s2->next->lma)
55b581a6
JJ
4702 count++;
4703 else
4704 break;
4705 }
1c5265b5 4706 amt += (count - 1) * sizeof (asection *);
a50b1753 4707 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
4708 if (m == NULL)
4709 goto error_return;
4710 m->next = NULL;
4711 m->p_type = PT_NOTE;
1c5265b5
JJ
4712 m->count = count;
4713 while (count > 1)
4714 {
4715 m->sections[m->count - count--] = s;
4716 BFD_ASSERT ((s->flags & SEC_THREAD_LOCAL) == 0);
4717 s = s->next;
4718 }
4719 m->sections[m->count - 1] = s;
4720 BFD_ASSERT ((s->flags & SEC_THREAD_LOCAL) == 0);
8ded5a0f
AM
4721 *pm = m;
4722 pm = &m->next;
4723 }
4724 if (s->flags & SEC_THREAD_LOCAL)
4725 {
4726 if (! tls_count)
4727 first_tls = s;
4728 tls_count++;
4729 }
4730 }
252b5132 4731
8ded5a0f
AM
4732 /* If there are any SHF_TLS output sections, add PT_TLS segment. */
4733 if (tls_count > 0)
4734 {
8ded5a0f
AM
4735 amt = sizeof (struct elf_segment_map);
4736 amt += (tls_count - 1) * sizeof (asection *);
a50b1753 4737 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
4738 if (m == NULL)
4739 goto error_return;
4740 m->next = NULL;
4741 m->p_type = PT_TLS;
4742 m->count = tls_count;
4743 /* Mandated PF_R. */
4744 m->p_flags = PF_R;
4745 m->p_flags_valid = 1;
d923cae0 4746 s = first_tls;
91d6fa6a 4747 for (i = 0; i < (unsigned int) tls_count; ++i)
8ded5a0f 4748 {
d923cae0
L
4749 if ((s->flags & SEC_THREAD_LOCAL) == 0)
4750 {
4751 _bfd_error_handler
4752 (_("%B: TLS sections are not adjacent:"), abfd);
4753 s = first_tls;
4754 i = 0;
4755 while (i < (unsigned int) tls_count)
4756 {
4757 if ((s->flags & SEC_THREAD_LOCAL) != 0)
4758 {
4759 _bfd_error_handler (_(" TLS: %A"), s);
4760 i++;
4761 }
4762 else
4763 _bfd_error_handler (_(" non-TLS: %A"), s);
4764 s = s->next;
4765 }
4766 bfd_set_error (bfd_error_bad_value);
4767 goto error_return;
4768 }
4769 m->sections[i] = s;
4770 s = s->next;
8ded5a0f 4771 }
252b5132 4772
8ded5a0f
AM
4773 *pm = m;
4774 pm = &m->next;
4775 }
252b5132 4776
8ded5a0f
AM
4777 /* If there is a .eh_frame_hdr section, throw in a PT_GNU_EH_FRAME
4778 segment. */
12bd6957 4779 eh_frame_hdr = elf_eh_frame_hdr (abfd);
8ded5a0f
AM
4780 if (eh_frame_hdr != NULL
4781 && (eh_frame_hdr->output_section->flags & SEC_LOAD) != 0)
252b5132 4782 {
dc810e39 4783 amt = sizeof (struct elf_segment_map);
a50b1753 4784 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
252b5132
RH
4785 if (m == NULL)
4786 goto error_return;
4787 m->next = NULL;
8ded5a0f 4788 m->p_type = PT_GNU_EH_FRAME;
252b5132 4789 m->count = 1;
8ded5a0f 4790 m->sections[0] = eh_frame_hdr->output_section;
252b5132
RH
4791
4792 *pm = m;
4793 pm = &m->next;
4794 }
13ae64f3 4795
12bd6957 4796 if (elf_stack_flags (abfd))
13ae64f3 4797 {
8ded5a0f 4798 amt = sizeof (struct elf_segment_map);
a50b1753 4799 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
4800 if (m == NULL)
4801 goto error_return;
4802 m->next = NULL;
2b05f1b7 4803 m->p_type = PT_GNU_STACK;
12bd6957 4804 m->p_flags = elf_stack_flags (abfd);
04c3a755 4805 m->p_align = bed->stack_align;
8ded5a0f 4806 m->p_flags_valid = 1;
04c3a755
NS
4807 m->p_align_valid = m->p_align != 0;
4808 if (info->stacksize > 0)
4809 {
4810 m->p_size = info->stacksize;
4811 m->p_size_valid = 1;
4812 }
252b5132 4813
8ded5a0f
AM
4814 *pm = m;
4815 pm = &m->next;
4816 }
65765700 4817
ceae84aa 4818 if (info != NULL && info->relro)
8ded5a0f 4819 {
f210dcff
L
4820 for (m = mfirst; m != NULL; m = m->next)
4821 {
3832a4d8
AM
4822 if (m->p_type == PT_LOAD
4823 && m->count != 0
4824 && m->sections[0]->vma >= info->relro_start
4825 && m->sections[0]->vma < info->relro_end)
f210dcff 4826 {
3832a4d8
AM
4827 i = m->count;
4828 while (--i != (unsigned) -1)
4829 if ((m->sections[i]->flags & (SEC_LOAD | SEC_HAS_CONTENTS))
4830 == (SEC_LOAD | SEC_HAS_CONTENTS))
4831 break;
4832
43a8475c 4833 if (i != (unsigned) -1)
f210dcff
L
4834 break;
4835 }
be01b344 4836 }
f210dcff
L
4837
4838 /* Make a PT_GNU_RELRO segment only when it isn't empty. */
4839 if (m != NULL)
4840 {
4841 amt = sizeof (struct elf_segment_map);
a50b1753 4842 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
f210dcff
L
4843 if (m == NULL)
4844 goto error_return;
4845 m->next = NULL;
4846 m->p_type = PT_GNU_RELRO;
f210dcff
L
4847 *pm = m;
4848 pm = &m->next;
4849 }
8ded5a0f 4850 }
9ee5e499 4851
8ded5a0f 4852 free (sections);
12bd6957 4853 elf_seg_map (abfd) = mfirst;
9ee5e499
JJ
4854 }
4855
3dea8fca 4856 if (!elf_modify_segment_map (abfd, info, no_user_phdrs))
8ded5a0f 4857 return FALSE;
8c37241b 4858
12bd6957 4859 for (count = 0, m = elf_seg_map (abfd); m != NULL; m = m->next)
8ded5a0f 4860 ++count;
12bd6957 4861 elf_program_header_size (abfd) = count * bed->s->sizeof_phdr;
252b5132 4862
b34976b6 4863 return TRUE;
252b5132
RH
4864
4865 error_return:
4866 if (sections != NULL)
4867 free (sections);
b34976b6 4868 return FALSE;
252b5132
RH
4869}
4870
4871/* Sort sections by address. */
4872
4873static int
217aa764 4874elf_sort_sections (const void *arg1, const void *arg2)
252b5132
RH
4875{
4876 const asection *sec1 = *(const asection **) arg1;
4877 const asection *sec2 = *(const asection **) arg2;
eecdbe52 4878 bfd_size_type size1, size2;
252b5132
RH
4879
4880 /* Sort by LMA first, since this is the address used to
4881 place the section into a segment. */
4882 if (sec1->lma < sec2->lma)
4883 return -1;
4884 else if (sec1->lma > sec2->lma)
4885 return 1;
4886
4887 /* Then sort by VMA. Normally the LMA and the VMA will be
4888 the same, and this will do nothing. */
4889 if (sec1->vma < sec2->vma)
4890 return -1;
4891 else if (sec1->vma > sec2->vma)
4892 return 1;
4893
4894 /* Put !SEC_LOAD sections after SEC_LOAD ones. */
4895
07c6e936 4896#define TOEND(x) (((x)->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0)
252b5132
RH
4897
4898 if (TOEND (sec1))
4899 {
4900 if (TOEND (sec2))
00a7cdc5
NC
4901 {
4902 /* If the indicies are the same, do not return 0
4903 here, but continue to try the next comparison. */
4904 if (sec1->target_index - sec2->target_index != 0)
4905 return sec1->target_index - sec2->target_index;
4906 }
252b5132
RH
4907 else
4908 return 1;
4909 }
00a7cdc5 4910 else if (TOEND (sec2))
252b5132
RH
4911 return -1;
4912
4913#undef TOEND
4914
00a7cdc5
NC
4915 /* Sort by size, to put zero sized sections
4916 before others at the same address. */
252b5132 4917
eea6121a
AM
4918 size1 = (sec1->flags & SEC_LOAD) ? sec1->size : 0;
4919 size2 = (sec2->flags & SEC_LOAD) ? sec2->size : 0;
eecdbe52
JJ
4920
4921 if (size1 < size2)
252b5132 4922 return -1;
eecdbe52 4923 if (size1 > size2)
252b5132
RH
4924 return 1;
4925
4926 return sec1->target_index - sec2->target_index;
4927}
4928
340b6d91
AC
4929/* Ian Lance Taylor writes:
4930
4931 We shouldn't be using % with a negative signed number. That's just
4932 not good. We have to make sure either that the number is not
4933 negative, or that the number has an unsigned type. When the types
4934 are all the same size they wind up as unsigned. When file_ptr is a
4935 larger signed type, the arithmetic winds up as signed long long,
4936 which is wrong.
4937
4938 What we're trying to say here is something like ``increase OFF by
4939 the least amount that will cause it to be equal to the VMA modulo
4940 the page size.'' */
4941/* In other words, something like:
4942
4943 vma_offset = m->sections[0]->vma % bed->maxpagesize;
4944 off_offset = off % bed->maxpagesize;
4945 if (vma_offset < off_offset)
4946 adjustment = vma_offset + bed->maxpagesize - off_offset;
4947 else
4948 adjustment = vma_offset - off_offset;
08a40648 4949
340b6d91
AC
4950 which can can be collapsed into the expression below. */
4951
4952static file_ptr
4953vma_page_aligned_bias (bfd_vma vma, ufile_ptr off, bfd_vma maxpagesize)
4954{
dc9155b2
NC
4955 /* PR binutils/16199: Handle an alignment of zero. */
4956 if (maxpagesize == 0)
4957 maxpagesize = 1;
340b6d91
AC
4958 return ((vma - off) % maxpagesize);
4959}
4960
6d33f217
L
4961static void
4962print_segment_map (const struct elf_segment_map *m)
4963{
4964 unsigned int j;
4965 const char *pt = get_segment_type (m->p_type);
4966 char buf[32];
4967
4968 if (pt == NULL)
4969 {
4970 if (m->p_type >= PT_LOPROC && m->p_type <= PT_HIPROC)
4971 sprintf (buf, "LOPROC+%7.7x",
4972 (unsigned int) (m->p_type - PT_LOPROC));
4973 else if (m->p_type >= PT_LOOS && m->p_type <= PT_HIOS)
4974 sprintf (buf, "LOOS+%7.7x",
4975 (unsigned int) (m->p_type - PT_LOOS));
4976 else
4977 snprintf (buf, sizeof (buf), "%8.8x",
4978 (unsigned int) m->p_type);
4979 pt = buf;
4980 }
4a97a0e5 4981 fflush (stdout);
6d33f217
L
4982 fprintf (stderr, "%s:", pt);
4983 for (j = 0; j < m->count; j++)
4984 fprintf (stderr, " %s", m->sections [j]->name);
4985 putc ('\n',stderr);
4a97a0e5 4986 fflush (stderr);
6d33f217
L
4987}
4988
32812159
AM
4989static bfd_boolean
4990write_zeros (bfd *abfd, file_ptr pos, bfd_size_type len)
4991{
4992 void *buf;
4993 bfd_boolean ret;
4994
4995 if (bfd_seek (abfd, pos, SEEK_SET) != 0)
4996 return FALSE;
4997 buf = bfd_zmalloc (len);
4998 if (buf == NULL)
4999 return FALSE;
5000 ret = bfd_bwrite (buf, len, abfd) == len;
5001 free (buf);
5002 return ret;
5003}
5004
252b5132
RH
5005/* Assign file positions to the sections based on the mapping from
5006 sections to segments. This function also sets up some fields in
f3520d2f 5007 the file header. */
252b5132 5008
b34976b6 5009static bfd_boolean
f3520d2f
AM
5010assign_file_positions_for_load_sections (bfd *abfd,
5011 struct bfd_link_info *link_info)
252b5132
RH
5012{
5013 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 5014 struct elf_segment_map *m;
252b5132 5015 Elf_Internal_Phdr *phdrs;
252b5132 5016 Elf_Internal_Phdr *p;
02bf8d82 5017 file_ptr off;
3f570048 5018 bfd_size_type maxpagesize;
f3520d2f 5019 unsigned int alloc;
0920dee7 5020 unsigned int i, j;
2b0bc088 5021 bfd_vma header_pad = 0;
252b5132 5022
e36284ab 5023 if (link_info == NULL
ceae84aa 5024 && !_bfd_elf_map_sections_to_segments (abfd, link_info))
8ded5a0f 5025 return FALSE;
252b5132 5026
8ded5a0f 5027 alloc = 0;
12bd6957 5028 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
2b0bc088
NC
5029 {
5030 ++alloc;
5031 if (m->header_size)
5032 header_pad = m->header_size;
5033 }
252b5132 5034
82f2dbf7
NC
5035 if (alloc)
5036 {
5037 elf_elfheader (abfd)->e_phoff = bed->s->sizeof_ehdr;
5038 elf_elfheader (abfd)->e_phentsize = bed->s->sizeof_phdr;
5039 }
5040 else
5041 {
5042 /* PR binutils/12467. */
5043 elf_elfheader (abfd)->e_phoff = 0;
5044 elf_elfheader (abfd)->e_phentsize = 0;
5045 }
d324f6d6 5046
8ded5a0f 5047 elf_elfheader (abfd)->e_phnum = alloc;
252b5132 5048
12bd6957
AM
5049 if (elf_program_header_size (abfd) == (bfd_size_type) -1)
5050 elf_program_header_size (abfd) = alloc * bed->s->sizeof_phdr;
8ded5a0f 5051 else
12bd6957 5052 BFD_ASSERT (elf_program_header_size (abfd)
59e0647f 5053 >= alloc * bed->s->sizeof_phdr);
252b5132
RH
5054
5055 if (alloc == 0)
f3520d2f 5056 {
12bd6957 5057 elf_next_file_pos (abfd) = bed->s->sizeof_ehdr;
8ded5a0f 5058 return TRUE;
f3520d2f 5059 }
252b5132 5060
12bd6957 5061 /* We're writing the size in elf_program_header_size (abfd),
57268894
HPN
5062 see assign_file_positions_except_relocs, so make sure we have
5063 that amount allocated, with trailing space cleared.
12bd6957
AM
5064 The variable alloc contains the computed need, while
5065 elf_program_header_size (abfd) contains the size used for the
57268894
HPN
5066 layout.
5067 See ld/emultempl/elf-generic.em:gld${EMULATION_NAME}_map_segments
5068 where the layout is forced to according to a larger size in the
5069 last iterations for the testcase ld-elf/header. */
12bd6957 5070 BFD_ASSERT (elf_program_header_size (abfd) % bed->s->sizeof_phdr
57268894 5071 == 0);
a50b1753
NC
5072 phdrs = (Elf_Internal_Phdr *)
5073 bfd_zalloc2 (abfd,
12bd6957 5074 (elf_program_header_size (abfd) / bed->s->sizeof_phdr),
a50b1753 5075 sizeof (Elf_Internal_Phdr));
f3520d2f 5076 elf_tdata (abfd)->phdr = phdrs;
252b5132 5077 if (phdrs == NULL)
b34976b6 5078 return FALSE;
252b5132 5079
3f570048
AM
5080 maxpagesize = 1;
5081 if ((abfd->flags & D_PAGED) != 0)
5082 maxpagesize = bed->maxpagesize;
5083
252b5132
RH
5084 off = bed->s->sizeof_ehdr;
5085 off += alloc * bed->s->sizeof_phdr;
2b0bc088
NC
5086 if (header_pad < (bfd_vma) off)
5087 header_pad = 0;
5088 else
5089 header_pad -= off;
5090 off += header_pad;
252b5132 5091
12bd6957 5092 for (m = elf_seg_map (abfd), p = phdrs, j = 0;
252b5132 5093 m != NULL;
0920dee7 5094 m = m->next, p++, j++)
252b5132 5095 {
252b5132 5096 asection **secpp;
bf988460
AM
5097 bfd_vma off_adjust;
5098 bfd_boolean no_contents;
252b5132
RH
5099
5100 /* If elf_segment_map is not from map_sections_to_segments, the
08a40648 5101 sections may not be correctly ordered. NOTE: sorting should
52e9b619
MS
5102 not be done to the PT_NOTE section of a corefile, which may
5103 contain several pseudo-sections artificially created by bfd.
5104 Sorting these pseudo-sections breaks things badly. */
47d9a591
AM
5105 if (m->count > 1
5106 && !(elf_elfheader (abfd)->e_type == ET_CORE
52e9b619 5107 && m->p_type == PT_NOTE))
252b5132
RH
5108 qsort (m->sections, (size_t) m->count, sizeof (asection *),
5109 elf_sort_sections);
5110
b301b248
AM
5111 /* An ELF segment (described by Elf_Internal_Phdr) may contain a
5112 number of sections with contents contributing to both p_filesz
5113 and p_memsz, followed by a number of sections with no contents
5114 that just contribute to p_memsz. In this loop, OFF tracks next
02bf8d82 5115 available file offset for PT_LOAD and PT_NOTE segments. */
252b5132 5116 p->p_type = m->p_type;
28a7f3e7 5117 p->p_flags = m->p_flags;
252b5132 5118
3f570048
AM
5119 if (m->count == 0)
5120 p->p_vaddr = 0;
5121 else
3271a814 5122 p->p_vaddr = m->sections[0]->vma - m->p_vaddr_offset;
3f570048
AM
5123
5124 if (m->p_paddr_valid)
5125 p->p_paddr = m->p_paddr;
5126 else if (m->count == 0)
5127 p->p_paddr = 0;
5128 else
08a40648 5129 p->p_paddr = m->sections[0]->lma - m->p_vaddr_offset;
3f570048
AM
5130
5131 if (p->p_type == PT_LOAD
5132 && (abfd->flags & D_PAGED) != 0)
5133 {
5134 /* p_align in demand paged PT_LOAD segments effectively stores
5135 the maximum page size. When copying an executable with
5136 objcopy, we set m->p_align from the input file. Use this
5137 value for maxpagesize rather than bed->maxpagesize, which
5138 may be different. Note that we use maxpagesize for PT_TLS
5139 segment alignment later in this function, so we are relying
5140 on at least one PT_LOAD segment appearing before a PT_TLS
5141 segment. */
5142 if (m->p_align_valid)
5143 maxpagesize = m->p_align;
5144
5145 p->p_align = maxpagesize;
5146 }
3271a814
NS
5147 else if (m->p_align_valid)
5148 p->p_align = m->p_align;
e970b90a
DJ
5149 else if (m->count == 0)
5150 p->p_align = 1 << bed->s->log_file_align;
3f570048
AM
5151 else
5152 p->p_align = 0;
5153
bf988460
AM
5154 no_contents = FALSE;
5155 off_adjust = 0;
252b5132 5156 if (p->p_type == PT_LOAD
b301b248 5157 && m->count > 0)
252b5132 5158 {
b301b248 5159 bfd_size_type align;
a49e53ed 5160 unsigned int align_power = 0;
b301b248 5161
3271a814
NS
5162 if (m->p_align_valid)
5163 align = p->p_align;
5164 else
252b5132 5165 {
3271a814
NS
5166 for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
5167 {
5168 unsigned int secalign;
08a40648 5169
3271a814
NS
5170 secalign = bfd_get_section_alignment (abfd, *secpp);
5171 if (secalign > align_power)
5172 align_power = secalign;
5173 }
5174 align = (bfd_size_type) 1 << align_power;
5175 if (align < maxpagesize)
5176 align = maxpagesize;
b301b248 5177 }
252b5132 5178
02bf8d82
AM
5179 for (i = 0; i < m->count; i++)
5180 if ((m->sections[i]->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
5181 /* If we aren't making room for this section, then
5182 it must be SHT_NOBITS regardless of what we've
5183 set via struct bfd_elf_special_section. */
5184 elf_section_type (m->sections[i]) = SHT_NOBITS;
5185
bf988460 5186 /* Find out whether this segment contains any loadable
aea274d3
AM
5187 sections. */
5188 no_contents = TRUE;
5189 for (i = 0; i < m->count; i++)
5190 if (elf_section_type (m->sections[i]) != SHT_NOBITS)
5191 {
5192 no_contents = FALSE;
5193 break;
5194 }
bf988460 5195
85cfcbfb 5196 off_adjust = vma_page_aligned_bias (p->p_vaddr, off, align);
bf988460
AM
5197 off += off_adjust;
5198 if (no_contents)
5199 {
5200 /* We shouldn't need to align the segment on disk since
5201 the segment doesn't need file space, but the gABI
5202 arguably requires the alignment and glibc ld.so
5203 checks it. So to comply with the alignment
5204 requirement but not waste file space, we adjust
5205 p_offset for just this segment. (OFF_ADJUST is
5206 subtracted from OFF later.) This may put p_offset
5207 past the end of file, but that shouldn't matter. */
5208 }
5209 else
5210 off_adjust = 0;
252b5132 5211 }
b1a6d0b1
NC
5212 /* Make sure the .dynamic section is the first section in the
5213 PT_DYNAMIC segment. */
5214 else if (p->p_type == PT_DYNAMIC
5215 && m->count > 1
5216 && strcmp (m->sections[0]->name, ".dynamic") != 0)
5217 {
5218 _bfd_error_handler
b301b248
AM
5219 (_("%B: The first section in the PT_DYNAMIC segment is not the .dynamic section"),
5220 abfd);
b1a6d0b1
NC
5221 bfd_set_error (bfd_error_bad_value);
5222 return FALSE;
5223 }
3f001e84
JK
5224 /* Set the note section type to SHT_NOTE. */
5225 else if (p->p_type == PT_NOTE)
5226 for (i = 0; i < m->count; i++)
5227 elf_section_type (m->sections[i]) = SHT_NOTE;
252b5132 5228
252b5132
RH
5229 p->p_offset = 0;
5230 p->p_filesz = 0;
5231 p->p_memsz = 0;
5232
5233 if (m->includes_filehdr)
5234 {
bf988460 5235 if (!m->p_flags_valid)
252b5132 5236 p->p_flags |= PF_R;
252b5132
RH
5237 p->p_filesz = bed->s->sizeof_ehdr;
5238 p->p_memsz = bed->s->sizeof_ehdr;
5239 if (m->count > 0)
5240 {
252b5132
RH
5241 if (p->p_vaddr < (bfd_vma) off)
5242 {
caf47ea6 5243 (*_bfd_error_handler)
b301b248
AM
5244 (_("%B: Not enough room for program headers, try linking with -N"),
5245 abfd);
252b5132 5246 bfd_set_error (bfd_error_bad_value);
b34976b6 5247 return FALSE;
252b5132
RH
5248 }
5249
5250 p->p_vaddr -= off;
bf988460 5251 if (!m->p_paddr_valid)
252b5132
RH
5252 p->p_paddr -= off;
5253 }
252b5132
RH
5254 }
5255
5256 if (m->includes_phdrs)
5257 {
bf988460 5258 if (!m->p_flags_valid)
252b5132
RH
5259 p->p_flags |= PF_R;
5260
f3520d2f 5261 if (!m->includes_filehdr)
252b5132
RH
5262 {
5263 p->p_offset = bed->s->sizeof_ehdr;
5264
5265 if (m->count > 0)
5266 {
252b5132 5267 p->p_vaddr -= off - p->p_offset;
bf988460 5268 if (!m->p_paddr_valid)
252b5132
RH
5269 p->p_paddr -= off - p->p_offset;
5270 }
252b5132
RH
5271 }
5272
5273 p->p_filesz += alloc * bed->s->sizeof_phdr;
5274 p->p_memsz += alloc * bed->s->sizeof_phdr;
2b0bc088
NC
5275 if (m->count)
5276 {
5277 p->p_filesz += header_pad;
5278 p->p_memsz += header_pad;
5279 }
252b5132
RH
5280 }
5281
5282 if (p->p_type == PT_LOAD
5283 || (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core))
5284 {
bf988460 5285 if (!m->includes_filehdr && !m->includes_phdrs)
02bf8d82 5286 p->p_offset = off;
252b5132
RH
5287 else
5288 {
5289 file_ptr adjust;
5290
5291 adjust = off - (p->p_offset + p->p_filesz);
bf988460
AM
5292 if (!no_contents)
5293 p->p_filesz += adjust;
252b5132
RH
5294 p->p_memsz += adjust;
5295 }
5296 }
5297
1ea63fd2
AM
5298 /* Set up p_filesz, p_memsz, p_align and p_flags from the section
5299 maps. Set filepos for sections in PT_LOAD segments, and in
5300 core files, for sections in PT_NOTE segments.
5301 assign_file_positions_for_non_load_sections will set filepos
5302 for other sections and update p_filesz for other segments. */
252b5132
RH
5303 for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
5304 {
5305 asection *sec;
252b5132 5306 bfd_size_type align;
627b32bc 5307 Elf_Internal_Shdr *this_hdr;
252b5132
RH
5308
5309 sec = *secpp;
02bf8d82 5310 this_hdr = &elf_section_data (sec)->this_hdr;
3f570048 5311 align = (bfd_size_type) 1 << bfd_get_section_alignment (abfd, sec);
252b5132 5312
88967714
AM
5313 if ((p->p_type == PT_LOAD
5314 || p->p_type == PT_TLS)
5315 && (this_hdr->sh_type != SHT_NOBITS
5316 || ((this_hdr->sh_flags & SHF_ALLOC) != 0
5317 && ((this_hdr->sh_flags & SHF_TLS) == 0
5318 || p->p_type == PT_TLS))))
252b5132 5319 {
b5599592
AM
5320 bfd_vma p_start = p->p_paddr;
5321 bfd_vma p_end = p_start + p->p_memsz;
5322 bfd_vma s_start = sec->lma;
5323 bfd_vma adjust = s_start - p_end;
252b5132 5324
a2d1e028
L
5325 if (adjust != 0
5326 && (s_start < p_end
5327 || p_end < p_start))
252b5132 5328 {
88967714 5329 (*_bfd_error_handler)
b5599592
AM
5330 (_("%B: section %A lma %#lx adjusted to %#lx"), abfd, sec,
5331 (unsigned long) s_start, (unsigned long) p_end);
88967714 5332 adjust = 0;
b5599592 5333 sec->lma = p_end;
1cfb7d1e 5334 }
3ac9b6c9 5335 p->p_memsz += adjust;
1cfb7d1e 5336
88967714
AM
5337 if (this_hdr->sh_type != SHT_NOBITS)
5338 {
32812159
AM
5339 if (p->p_filesz + adjust < p->p_memsz)
5340 {
5341 /* We have a PROGBITS section following NOBITS ones.
5342 Allocate file space for the NOBITS section(s) and
5343 zero it. */
5344 adjust = p->p_memsz - p->p_filesz;
5345 if (!write_zeros (abfd, off, adjust))
5346 return FALSE;
5347 }
88967714
AM
5348 off += adjust;
5349 p->p_filesz += adjust;
252b5132 5350 }
252b5132
RH
5351 }
5352
5353 if (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core)
5354 {
b301b248
AM
5355 /* The section at i == 0 is the one that actually contains
5356 everything. */
4a938328
MS
5357 if (i == 0)
5358 {
627b32bc 5359 this_hdr->sh_offset = sec->filepos = off;
6a3cd2b4
AM
5360 off += this_hdr->sh_size;
5361 p->p_filesz = this_hdr->sh_size;
b301b248
AM
5362 p->p_memsz = 0;
5363 p->p_align = 1;
252b5132 5364 }
4a938328 5365 else
252b5132 5366 {
b301b248 5367 /* The rest are fake sections that shouldn't be written. */
252b5132 5368 sec->filepos = 0;
eea6121a 5369 sec->size = 0;
b301b248
AM
5370 sec->flags = 0;
5371 continue;
252b5132 5372 }
252b5132
RH
5373 }
5374 else
5375 {
1e951488 5376 if (p->p_type == PT_LOAD)
b301b248 5377 {
1e951488
AM
5378 this_hdr->sh_offset = sec->filepos = off;
5379 if (this_hdr->sh_type != SHT_NOBITS)
5380 off += this_hdr->sh_size;
5381 }
5382 else if (this_hdr->sh_type == SHT_NOBITS
5383 && (this_hdr->sh_flags & SHF_TLS) != 0
5384 && this_hdr->sh_offset == 0)
5385 {
5386 /* This is a .tbss section that didn't get a PT_LOAD.
5387 (See _bfd_elf_map_sections_to_segments "Create a
5388 final PT_LOAD".) Set sh_offset to the value it
5389 would have if we had created a zero p_filesz and
5390 p_memsz PT_LOAD header for the section. This
5391 also makes the PT_TLS header have the same
5392 p_offset value. */
5393 bfd_vma adjust = vma_page_aligned_bias (this_hdr->sh_addr,
5394 off, align);
5395 this_hdr->sh_offset = sec->filepos = off + adjust;
b301b248 5396 }
252b5132 5397
02bf8d82 5398 if (this_hdr->sh_type != SHT_NOBITS)
b301b248 5399 {
6a3cd2b4 5400 p->p_filesz += this_hdr->sh_size;
02bf8d82
AM
5401 /* A load section without SHF_ALLOC is something like
5402 a note section in a PT_NOTE segment. These take
5403 file space but are not loaded into memory. */
5404 if ((this_hdr->sh_flags & SHF_ALLOC) != 0)
6a3cd2b4 5405 p->p_memsz += this_hdr->sh_size;
b301b248 5406 }
6a3cd2b4 5407 else if ((this_hdr->sh_flags & SHF_ALLOC) != 0)
13ae64f3 5408 {
6a3cd2b4
AM
5409 if (p->p_type == PT_TLS)
5410 p->p_memsz += this_hdr->sh_size;
5411
5412 /* .tbss is special. It doesn't contribute to p_memsz of
5413 normal segments. */
5414 else if ((this_hdr->sh_flags & SHF_TLS) == 0)
5415 p->p_memsz += this_hdr->sh_size;
13ae64f3
JJ
5416 }
5417
b10a8ae0
L
5418 if (align > p->p_align
5419 && !m->p_align_valid
5420 && (p->p_type != PT_LOAD
5421 || (abfd->flags & D_PAGED) == 0))
252b5132
RH
5422 p->p_align = align;
5423 }
5424
bf988460 5425 if (!m->p_flags_valid)
252b5132
RH
5426 {
5427 p->p_flags |= PF_R;
02bf8d82 5428 if ((this_hdr->sh_flags & SHF_EXECINSTR) != 0)
252b5132 5429 p->p_flags |= PF_X;
02bf8d82 5430 if ((this_hdr->sh_flags & SHF_WRITE) != 0)
252b5132
RH
5431 p->p_flags |= PF_W;
5432 }
5433 }
43a8475c 5434
bf988460 5435 off -= off_adjust;
0920dee7 5436
7c928300
AM
5437 /* Check that all sections are in a PT_LOAD segment.
5438 Don't check funky gdb generated core files. */
5439 if (p->p_type == PT_LOAD && bfd_get_format (abfd) != bfd_core)
9a83a553
AM
5440 {
5441 bfd_boolean check_vma = TRUE;
5442
5443 for (i = 1; i < m->count; i++)
5444 if (m->sections[i]->vma == m->sections[i - 1]->vma
5445 && ELF_SECTION_SIZE (&(elf_section_data (m->sections[i])
5446 ->this_hdr), p) != 0
5447 && ELF_SECTION_SIZE (&(elf_section_data (m->sections[i - 1])
5448 ->this_hdr), p) != 0)
0920dee7 5449 {
9a83a553
AM
5450 /* Looks like we have overlays packed into the segment. */
5451 check_vma = FALSE;
5452 break;
0920dee7 5453 }
9a83a553
AM
5454
5455 for (i = 0; i < m->count; i++)
5456 {
5457 Elf_Internal_Shdr *this_hdr;
5458 asection *sec;
5459
5460 sec = m->sections[i];
5461 this_hdr = &(elf_section_data(sec)->this_hdr);
86b2281f
AM
5462 if (!ELF_SECTION_IN_SEGMENT_1 (this_hdr, p, check_vma, 0)
5463 && !ELF_TBSS_SPECIAL (this_hdr, p))
9a83a553
AM
5464 {
5465 (*_bfd_error_handler)
5466 (_("%B: section `%A' can't be allocated in segment %d"),
5467 abfd, sec, j);
5468 print_segment_map (m);
5469 }
5470 }
5471 }
252b5132
RH
5472 }
5473
12bd6957 5474 elf_next_file_pos (abfd) = off;
f3520d2f
AM
5475 return TRUE;
5476}
5477
5478/* Assign file positions for the other sections. */
5479
5480static bfd_boolean
5481assign_file_positions_for_non_load_sections (bfd *abfd,
5482 struct bfd_link_info *link_info)
5483{
5484 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5485 Elf_Internal_Shdr **i_shdrpp;
e06efbf1 5486 Elf_Internal_Shdr **hdrpp, **end_hdrpp;
f3520d2f
AM
5487 Elf_Internal_Phdr *phdrs;
5488 Elf_Internal_Phdr *p;
5489 struct elf_segment_map *m;
62655c7b 5490 struct elf_segment_map *hdrs_segment;
f3520d2f
AM
5491 bfd_vma filehdr_vaddr, filehdr_paddr;
5492 bfd_vma phdrs_vaddr, phdrs_paddr;
5493 file_ptr off;
f3520d2f
AM
5494 unsigned int count;
5495
5c182d5f 5496 i_shdrpp = elf_elfsections (abfd);
e06efbf1 5497 end_hdrpp = i_shdrpp + elf_numsections (abfd);
12bd6957 5498 off = elf_next_file_pos (abfd);
e06efbf1 5499 for (hdrpp = i_shdrpp + 1; hdrpp < end_hdrpp; hdrpp++)
5c182d5f 5500 {
5c182d5f
AM
5501 Elf_Internal_Shdr *hdr;
5502
5503 hdr = *hdrpp;
5504 if (hdr->bfd_section != NULL
252e386e
AM
5505 && (hdr->bfd_section->filepos != 0
5506 || (hdr->sh_type == SHT_NOBITS
5507 && hdr->contents == NULL)))
627b32bc 5508 BFD_ASSERT (hdr->sh_offset == hdr->bfd_section->filepos);
5c182d5f
AM
5509 else if ((hdr->sh_flags & SHF_ALLOC) != 0)
5510 {
e8d2ba53
AM
5511 if (hdr->sh_size != 0)
5512 (*_bfd_error_handler)
5513 (_("%B: warning: allocated section `%s' not in segment"),
5514 abfd,
5515 (hdr->bfd_section == NULL
5516 ? "*unknown*"
5517 : hdr->bfd_section->name));
3ba71138
L
5518 /* We don't need to page align empty sections. */
5519 if ((abfd->flags & D_PAGED) != 0 && hdr->sh_size != 0)
5c182d5f
AM
5520 off += vma_page_aligned_bias (hdr->sh_addr, off,
5521 bed->maxpagesize);
5522 else
5523 off += vma_page_aligned_bias (hdr->sh_addr, off,
5524 hdr->sh_addralign);
5525 off = _bfd_elf_assign_file_position_for_section (hdr, off,
5526 FALSE);
5527 }
5528 else if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
5529 && hdr->bfd_section == NULL)
0ce398f1
L
5530 || (hdr->bfd_section != NULL
5531 && (hdr->bfd_section->flags & SEC_ELF_COMPRESS))
5532 /* Compress DWARF debug sections. */
12bd6957 5533 || hdr == i_shdrpp[elf_onesymtab (abfd)]
6a40cf0c
NC
5534 || (elf_symtab_shndx_list (abfd) != NULL
5535 && hdr == i_shdrpp[elf_symtab_shndx_list (abfd)->ndx])
3e19fb8f
L
5536 || hdr == i_shdrpp[elf_strtab_sec (abfd)]
5537 || hdr == i_shdrpp[elf_shstrtab_sec (abfd)])
5c182d5f
AM
5538 hdr->sh_offset = -1;
5539 else
5540 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
5c182d5f
AM
5541 }
5542
252b5132
RH
5543 /* Now that we have set the section file positions, we can set up
5544 the file positions for the non PT_LOAD segments. */
f3520d2f
AM
5545 count = 0;
5546 filehdr_vaddr = 0;
5547 filehdr_paddr = 0;
5548 phdrs_vaddr = bed->maxpagesize + bed->s->sizeof_ehdr;
5549 phdrs_paddr = 0;
62655c7b 5550 hdrs_segment = NULL;
f3520d2f 5551 phdrs = elf_tdata (abfd)->phdr;
12bd6957 5552 for (m = elf_seg_map (abfd), p = phdrs; m != NULL; m = m->next, p++)
f3520d2f
AM
5553 {
5554 ++count;
5555 if (p->p_type != PT_LOAD)
5556 continue;
5557
5558 if (m->includes_filehdr)
5559 {
5560 filehdr_vaddr = p->p_vaddr;
5561 filehdr_paddr = p->p_paddr;
5562 }
5563 if (m->includes_phdrs)
5564 {
5565 phdrs_vaddr = p->p_vaddr;
5566 phdrs_paddr = p->p_paddr;
5567 if (m->includes_filehdr)
5568 {
62655c7b 5569 hdrs_segment = m;
f3520d2f
AM
5570 phdrs_vaddr += bed->s->sizeof_ehdr;
5571 phdrs_paddr += bed->s->sizeof_ehdr;
5572 }
5573 }
5574 }
5575
62655c7b
RM
5576 if (hdrs_segment != NULL && link_info != NULL)
5577 {
5578 /* There is a segment that contains both the file headers and the
5579 program headers, so provide a symbol __ehdr_start pointing there.
5580 A program can use this to examine itself robustly. */
5581
5582 struct elf_link_hash_entry *hash
5583 = elf_link_hash_lookup (elf_hash_table (link_info), "__ehdr_start",
5584 FALSE, FALSE, TRUE);
5585 /* If the symbol was referenced and not defined, define it. */
5586 if (hash != NULL
5587 && (hash->root.type == bfd_link_hash_new
5588 || hash->root.type == bfd_link_hash_undefined
5589 || hash->root.type == bfd_link_hash_undefweak
5590 || hash->root.type == bfd_link_hash_common))
5591 {
5592 asection *s = NULL;
5593 if (hdrs_segment->count != 0)
5594 /* The segment contains sections, so use the first one. */
5595 s = hdrs_segment->sections[0];
5596 else
5597 /* Use the first (i.e. lowest-addressed) section in any segment. */
12bd6957 5598 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
62655c7b
RM
5599 if (m->count != 0)
5600 {
5601 s = m->sections[0];
5602 break;
5603 }
5604
5605 if (s != NULL)
5606 {
5607 hash->root.u.def.value = filehdr_vaddr - s->vma;
5608 hash->root.u.def.section = s;
5609 }
5610 else
5611 {
5612 hash->root.u.def.value = filehdr_vaddr;
5613 hash->root.u.def.section = bfd_abs_section_ptr;
5614 }
5615
5616 hash->root.type = bfd_link_hash_defined;
5617 hash->def_regular = 1;
5618 hash->non_elf = 0;
5619 }
5620 }
5621
12bd6957 5622 for (m = elf_seg_map (abfd), p = phdrs; m != NULL; m = m->next, p++)
252b5132 5623 {
129af99f 5624 if (p->p_type == PT_GNU_RELRO)
252b5132 5625 {
b84a33b5 5626 const Elf_Internal_Phdr *lp;
3146fac4 5627 struct elf_segment_map *lm;
1ea63fd2 5628
129af99f 5629 if (link_info != NULL)
8c37241b 5630 {
129af99f
AS
5631 /* During linking the range of the RELRO segment is passed
5632 in link_info. */
12bd6957 5633 for (lm = elf_seg_map (abfd), lp = phdrs;
3146fac4
AM
5634 lm != NULL;
5635 lm = lm->next, lp++)
8c37241b
JJ
5636 {
5637 if (lp->p_type == PT_LOAD
b84a33b5 5638 && lp->p_vaddr < link_info->relro_end
3146fac4
AM
5639 && lm->count != 0
5640 && lm->sections[0]->vma >= link_info->relro_start)
8c37241b
JJ
5641 break;
5642 }
8981c88a 5643
3146fac4 5644 BFD_ASSERT (lm != NULL);
8c37241b 5645 }
129af99f
AS
5646 else
5647 {
5648 /* Otherwise we are copying an executable or shared
b84a33b5 5649 library, but we need to use the same linker logic. */
129af99f
AS
5650 for (lp = phdrs; lp < phdrs + count; ++lp)
5651 {
5652 if (lp->p_type == PT_LOAD
5653 && lp->p_paddr == p->p_paddr)
5654 break;
5655 }
b84a33b5
AM
5656 }
5657
5658 if (lp < phdrs + count)
5659 {
5660 p->p_vaddr = lp->p_vaddr;
5661 p->p_paddr = lp->p_paddr;
5662 p->p_offset = lp->p_offset;
5663 if (link_info != NULL)
5664 p->p_filesz = link_info->relro_end - lp->p_vaddr;
5665 else if (m->p_size_valid)
5666 p->p_filesz = m->p_size;
129af99f
AS
5667 else
5668 abort ();
b84a33b5 5669 p->p_memsz = p->p_filesz;
f3944f72
L
5670 /* Preserve the alignment and flags if they are valid. The
5671 gold linker generates RW/4 for the PT_GNU_RELRO section.
5672 It is better for objcopy/strip to honor these attributes
5673 otherwise gdb will choke when using separate debug files.
5674 */
5675 if (!m->p_align_valid)
5676 p->p_align = 1;
5677 if (!m->p_flags_valid)
341b8ee7 5678 p->p_flags = PF_R;
129af99f 5679 }
9433b9b1 5680 else
b84a33b5
AM
5681 {
5682 memset (p, 0, sizeof *p);
5683 p->p_type = PT_NULL;
5684 }
129af99f 5685 }
04c3a755
NS
5686 else if (p->p_type == PT_GNU_STACK)
5687 {
5688 if (m->p_size_valid)
5689 p->p_memsz = m->p_size;
5690 }
129af99f
AS
5691 else if (m->count != 0)
5692 {
e06efbf1 5693 unsigned int i;
129af99f
AS
5694 if (p->p_type != PT_LOAD
5695 && (p->p_type != PT_NOTE
5696 || bfd_get_format (abfd) != bfd_core))
5697 {
c86934ce
NC
5698 if (m->includes_filehdr || m->includes_phdrs)
5699 {
b1fa9dd6 5700 /* PR 17512: file: 2195325e. */
c86934ce
NC
5701 (*_bfd_error_handler)
5702 (_("%B: warning: non-load segment includes file header and/or program header"),
5703 abfd);
5704 return FALSE;
5705 }
129af99f 5706
86b2281f 5707 p->p_filesz = 0;
129af99f 5708 p->p_offset = m->sections[0]->filepos;
86b2281f
AM
5709 for (i = m->count; i-- != 0;)
5710 {
5711 asection *sect = m->sections[i];
5712 Elf_Internal_Shdr *hdr = &elf_section_data (sect)->this_hdr;
5713 if (hdr->sh_type != SHT_NOBITS)
5714 {
5715 p->p_filesz = (sect->filepos - m->sections[0]->filepos
5716 + hdr->sh_size);
5717 break;
5718 }
5719 }
129af99f
AS
5720 }
5721 }
5722 else if (m->includes_filehdr)
5723 {
5724 p->p_vaddr = filehdr_vaddr;
5725 if (! m->p_paddr_valid)
5726 p->p_paddr = filehdr_paddr;
5727 }
5728 else if (m->includes_phdrs)
5729 {
5730 p->p_vaddr = phdrs_vaddr;
5731 if (! m->p_paddr_valid)
5732 p->p_paddr = phdrs_paddr;
252b5132
RH
5733 }
5734 }
5735
12bd6957 5736 elf_next_file_pos (abfd) = off;
252b5132 5737
b34976b6 5738 return TRUE;
252b5132
RH
5739}
5740
6a40cf0c
NC
5741static elf_section_list *
5742find_section_in_list (unsigned int i, elf_section_list * list)
5743{
5744 for (;list != NULL; list = list->next)
5745 if (list->ndx == i)
5746 break;
5747 return list;
5748}
5749
252b5132
RH
5750/* Work out the file positions of all the sections. This is called by
5751 _bfd_elf_compute_section_file_positions. All the section sizes and
5752 VMAs must be known before this is called.
5753
e0638f70
AM
5754 Reloc sections come in two flavours: Those processed specially as
5755 "side-channel" data attached to a section to which they apply, and
5756 those that bfd doesn't process as relocations. The latter sort are
5757 stored in a normal bfd section by bfd_section_from_shdr. We don't
5758 consider the former sort here, unless they form part of the loadable
5759 image. Reloc sections not assigned here will be handled later by
5760 assign_file_positions_for_relocs.
252b5132
RH
5761
5762 We also don't set the positions of the .symtab and .strtab here. */
5763
b34976b6 5764static bfd_boolean
c84fca4d
AO
5765assign_file_positions_except_relocs (bfd *abfd,
5766 struct bfd_link_info *link_info)
252b5132 5767{
5c182d5f
AM
5768 struct elf_obj_tdata *tdata = elf_tdata (abfd);
5769 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
9c5bfbb7 5770 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132
RH
5771
5772 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0
5773 && bfd_get_format (abfd) != bfd_core)
5774 {
5c182d5f
AM
5775 Elf_Internal_Shdr ** const i_shdrpp = elf_elfsections (abfd);
5776 unsigned int num_sec = elf_numsections (abfd);
252b5132
RH
5777 Elf_Internal_Shdr **hdrpp;
5778 unsigned int i;
a485e98e 5779 file_ptr off;
252b5132
RH
5780
5781 /* Start after the ELF header. */
5782 off = i_ehdrp->e_ehsize;
5783
5784 /* We are not creating an executable, which means that we are
5785 not creating a program header, and that the actual order of
5786 the sections in the file is unimportant. */
9ad5cbcf 5787 for (i = 1, hdrpp = i_shdrpp + 1; i < num_sec; i++, hdrpp++)
252b5132
RH
5788 {
5789 Elf_Internal_Shdr *hdr;
5790
5791 hdr = *hdrpp;
e0638f70
AM
5792 if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
5793 && hdr->bfd_section == NULL)
0ce398f1
L
5794 || (hdr->bfd_section != NULL
5795 && (hdr->bfd_section->flags & SEC_ELF_COMPRESS))
5796 /* Compress DWARF debug sections. */
12bd6957 5797 || i == elf_onesymtab (abfd)
6a40cf0c
NC
5798 || (elf_symtab_shndx_list (abfd) != NULL
5799 && hdr == i_shdrpp[elf_symtab_shndx_list (abfd)->ndx])
3e19fb8f
L
5800 || i == elf_strtab_sec (abfd)
5801 || i == elf_shstrtab_sec (abfd))
252b5132
RH
5802 {
5803 hdr->sh_offset = -1;
252b5132 5804 }
9ad5cbcf 5805 else
b34976b6 5806 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
252b5132 5807 }
a485e98e
AM
5808
5809 elf_next_file_pos (abfd) = off;
252b5132
RH
5810 }
5811 else
5812 {
f3520d2f
AM
5813 unsigned int alloc;
5814
252b5132 5815 /* Assign file positions for the loaded sections based on the
08a40648 5816 assignment of sections to segments. */
f3520d2f
AM
5817 if (!assign_file_positions_for_load_sections (abfd, link_info))
5818 return FALSE;
5819
5820 /* And for non-load sections. */
5821 if (!assign_file_positions_for_non_load_sections (abfd, link_info))
5822 return FALSE;
5823
e36284ab
AM
5824 if (bed->elf_backend_modify_program_headers != NULL)
5825 {
5826 if (!(*bed->elf_backend_modify_program_headers) (abfd, link_info))
5827 return FALSE;
5828 }
5829
58e7ebac 5830 /* Set e_type in ELF header to ET_EXEC for -pie -Ttext-segment=. */
0e1862bb 5831 if (link_info != NULL && bfd_link_pie (link_info))
58e7ebac
L
5832 {
5833 unsigned int num_segments = elf_elfheader (abfd)->e_phnum;
5834 Elf_Internal_Phdr *segment = elf_tdata (abfd)->phdr;
5835 Elf_Internal_Phdr *end_segment = &segment[num_segments];
5836
5837 /* Find the lowest p_vaddr in PT_LOAD segments. */
5838 bfd_vma p_vaddr = (bfd_vma) -1;
5839 for (; segment < end_segment; segment++)
5840 if (segment->p_type == PT_LOAD && p_vaddr > segment->p_vaddr)
5841 p_vaddr = segment->p_vaddr;
5842
5843 /* Set e_type to ET_EXEC if the lowest p_vaddr in PT_LOAD
5844 segments is non-zero. */
5845 if (p_vaddr)
5846 i_ehdrp->e_type = ET_EXEC;
5847 }
5848
f3520d2f 5849 /* Write out the program headers. */
12bd6957 5850 alloc = elf_program_header_size (abfd) / bed->s->sizeof_phdr;
f3520d2f
AM
5851 if (bfd_seek (abfd, (bfd_signed_vma) bed->s->sizeof_ehdr, SEEK_SET) != 0
5852 || bed->s->write_out_phdrs (abfd, tdata->phdr, alloc) != 0)
b34976b6 5853 return FALSE;
252b5132
RH
5854 }
5855
b34976b6 5856 return TRUE;
252b5132
RH
5857}
5858
b34976b6 5859static bfd_boolean
217aa764 5860prep_headers (bfd *abfd)
252b5132 5861{
3d540e93 5862 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form. */
2b0f7ef9 5863 struct elf_strtab_hash *shstrtab;
9c5bfbb7 5864 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132
RH
5865
5866 i_ehdrp = elf_elfheader (abfd);
252b5132 5867
2b0f7ef9 5868 shstrtab = _bfd_elf_strtab_init ();
252b5132 5869 if (shstrtab == NULL)
b34976b6 5870 return FALSE;
252b5132
RH
5871
5872 elf_shstrtab (abfd) = shstrtab;
5873
5874 i_ehdrp->e_ident[EI_MAG0] = ELFMAG0;
5875 i_ehdrp->e_ident[EI_MAG1] = ELFMAG1;
5876 i_ehdrp->e_ident[EI_MAG2] = ELFMAG2;
5877 i_ehdrp->e_ident[EI_MAG3] = ELFMAG3;
5878
5879 i_ehdrp->e_ident[EI_CLASS] = bed->s->elfclass;
5880 i_ehdrp->e_ident[EI_DATA] =
5881 bfd_big_endian (abfd) ? ELFDATA2MSB : ELFDATA2LSB;
5882 i_ehdrp->e_ident[EI_VERSION] = bed->s->ev_current;
5883
252b5132
RH
5884 if ((abfd->flags & DYNAMIC) != 0)
5885 i_ehdrp->e_type = ET_DYN;
5886 else if ((abfd->flags & EXEC_P) != 0)
5887 i_ehdrp->e_type = ET_EXEC;
5888 else if (bfd_get_format (abfd) == bfd_core)
5889 i_ehdrp->e_type = ET_CORE;
5890 else
5891 i_ehdrp->e_type = ET_REL;
5892
5893 switch (bfd_get_arch (abfd))
5894 {
5895 case bfd_arch_unknown:
5896 i_ehdrp->e_machine = EM_NONE;
5897 break;
aa4f99bb
AO
5898
5899 /* There used to be a long list of cases here, each one setting
5900 e_machine to the same EM_* macro #defined as ELF_MACHINE_CODE
5901 in the corresponding bfd definition. To avoid duplication,
5902 the switch was removed. Machines that need special handling
5903 can generally do it in elf_backend_final_write_processing(),
5904 unless they need the information earlier than the final write.
5905 Such need can generally be supplied by replacing the tests for
5906 e_machine with the conditions used to determine it. */
252b5132 5907 default:
9c5bfbb7
AM
5908 i_ehdrp->e_machine = bed->elf_machine_code;
5909 }
aa4f99bb 5910
252b5132
RH
5911 i_ehdrp->e_version = bed->s->ev_current;
5912 i_ehdrp->e_ehsize = bed->s->sizeof_ehdr;
5913
c044fabd 5914 /* No program header, for now. */
252b5132
RH
5915 i_ehdrp->e_phoff = 0;
5916 i_ehdrp->e_phentsize = 0;
5917 i_ehdrp->e_phnum = 0;
5918
c044fabd 5919 /* Each bfd section is section header entry. */
252b5132
RH
5920 i_ehdrp->e_entry = bfd_get_start_address (abfd);
5921 i_ehdrp->e_shentsize = bed->s->sizeof_shdr;
5922
c044fabd 5923 /* If we're building an executable, we'll need a program header table. */
252b5132 5924 if (abfd->flags & EXEC_P)
0e71e495
BE
5925 /* It all happens later. */
5926 ;
252b5132
RH
5927 else
5928 {
5929 i_ehdrp->e_phentsize = 0;
252b5132
RH
5930 i_ehdrp->e_phoff = 0;
5931 }
5932
5933 elf_tdata (abfd)->symtab_hdr.sh_name =
b34976b6 5934 (unsigned int) _bfd_elf_strtab_add (shstrtab, ".symtab", FALSE);
252b5132 5935 elf_tdata (abfd)->strtab_hdr.sh_name =
b34976b6 5936 (unsigned int) _bfd_elf_strtab_add (shstrtab, ".strtab", FALSE);
252b5132 5937 elf_tdata (abfd)->shstrtab_hdr.sh_name =
b34976b6 5938 (unsigned int) _bfd_elf_strtab_add (shstrtab, ".shstrtab", FALSE);
252b5132 5939 if (elf_tdata (abfd)->symtab_hdr.sh_name == (unsigned int) -1
17ca87fc 5940 || elf_tdata (abfd)->strtab_hdr.sh_name == (unsigned int) -1
252b5132 5941 || elf_tdata (abfd)->shstrtab_hdr.sh_name == (unsigned int) -1)
b34976b6 5942 return FALSE;
252b5132 5943
b34976b6 5944 return TRUE;
252b5132
RH
5945}
5946
5947/* Assign file positions for all the reloc sections which are not part
a485e98e 5948 of the loadable file image, and the file position of section headers. */
252b5132 5949
0ce398f1
L
5950static bfd_boolean
5951_bfd_elf_assign_file_positions_for_non_load (bfd *abfd)
252b5132
RH
5952{
5953 file_ptr off;
e06efbf1 5954 Elf_Internal_Shdr **shdrpp, **end_shdrpp;
3e19fb8f 5955 Elf_Internal_Shdr *shdrp;
a485e98e
AM
5956 Elf_Internal_Ehdr *i_ehdrp;
5957 const struct elf_backend_data *bed;
252b5132 5958
12bd6957 5959 off = elf_next_file_pos (abfd);
252b5132 5960
e06efbf1
L
5961 shdrpp = elf_elfsections (abfd);
5962 end_shdrpp = shdrpp + elf_numsections (abfd);
5963 for (shdrpp++; shdrpp < end_shdrpp; shdrpp++)
252b5132 5964 {
252b5132 5965 shdrp = *shdrpp;
0ce398f1
L
5966 if (shdrp->sh_offset == -1)
5967 {
3e19fb8f 5968 asection *sec = shdrp->bfd_section;
0ce398f1
L
5969 bfd_boolean is_rel = (shdrp->sh_type == SHT_REL
5970 || shdrp->sh_type == SHT_RELA);
5971 if (is_rel
3e19fb8f 5972 || (sec != NULL && (sec->flags & SEC_ELF_COMPRESS)))
0ce398f1
L
5973 {
5974 if (!is_rel)
5975 {
3e19fb8f
L
5976 const char *name = sec->name;
5977 struct bfd_elf_section_data *d;
5978
0ce398f1 5979 /* Compress DWARF debug sections. */
3e19fb8f 5980 if (!bfd_compress_section (abfd, sec,
0ce398f1
L
5981 shdrp->contents))
5982 return FALSE;
3e19fb8f
L
5983
5984 if (sec->compress_status == COMPRESS_SECTION_DONE
5985 && (abfd->flags & BFD_COMPRESS_GABI) == 0)
5986 {
5987 /* If section is compressed with zlib-gnu, convert
5988 section name from .debug_* to .zdebug_*. */
5989 char *new_name
5990 = convert_debug_to_zdebug (abfd, name);
5991 if (new_name == NULL)
5992 return FALSE;
5993 name = new_name;
5994 }
5995 /* Add setion name to section name section. */
5996 if (shdrp->sh_name != (unsigned int) -1)
5997 abort ();
5998 shdrp->sh_name
5999 = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
6000 name, FALSE);
6001 d = elf_section_data (sec);
6002
6003 /* Add reloc setion name to section name section. */
6004 if (d->rel.hdr
6005 && !_bfd_elf_set_reloc_sh_name (abfd,
6006 d->rel.hdr,
6007 name, FALSE))
6008 return FALSE;
6009 if (d->rela.hdr
6010 && !_bfd_elf_set_reloc_sh_name (abfd,
6011 d->rela.hdr,
91cb26da 6012 name, TRUE))
3e19fb8f
L
6013 return FALSE;
6014
0ce398f1 6015 /* Update section size and contents. */
3e19fb8f
L
6016 shdrp->sh_size = sec->size;
6017 shdrp->contents = sec->contents;
0ce398f1
L
6018 shdrp->bfd_section->contents = NULL;
6019 }
6020 off = _bfd_elf_assign_file_position_for_section (shdrp,
6021 off,
6022 TRUE);
6023 }
6024 }
252b5132
RH
6025 }
6026
3e19fb8f
L
6027 /* Place section name section after DWARF debug sections have been
6028 compressed. */
6029 _bfd_elf_strtab_finalize (elf_shstrtab (abfd));
6030 shdrp = &elf_tdata (abfd)->shstrtab_hdr;
6031 shdrp->sh_size = _bfd_elf_strtab_size (elf_shstrtab (abfd));
6032 off = _bfd_elf_assign_file_position_for_section (shdrp, off, TRUE);
6033
6034 /* Place the section headers. */
a485e98e
AM
6035 i_ehdrp = elf_elfheader (abfd);
6036 bed = get_elf_backend_data (abfd);
6037 off = align_file_position (off, 1 << bed->s->log_file_align);
6038 i_ehdrp->e_shoff = off;
6039 off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize;
12bd6957 6040 elf_next_file_pos (abfd) = off;
0ce398f1
L
6041
6042 return TRUE;
252b5132
RH
6043}
6044
b34976b6 6045bfd_boolean
217aa764 6046_bfd_elf_write_object_contents (bfd *abfd)
252b5132 6047{
9c5bfbb7 6048 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 6049 Elf_Internal_Shdr **i_shdrp;
b34976b6 6050 bfd_boolean failed;
9ad5cbcf 6051 unsigned int count, num_sec;
30e8ee25 6052 struct elf_obj_tdata *t;
252b5132
RH
6053
6054 if (! abfd->output_has_begun
217aa764 6055 && ! _bfd_elf_compute_section_file_positions (abfd, NULL))
b34976b6 6056 return FALSE;
252b5132
RH
6057
6058 i_shdrp = elf_elfsections (abfd);
252b5132 6059
b34976b6 6060 failed = FALSE;
252b5132
RH
6061 bfd_map_over_sections (abfd, bed->s->write_relocs, &failed);
6062 if (failed)
b34976b6 6063 return FALSE;
252b5132 6064
0ce398f1
L
6065 if (!_bfd_elf_assign_file_positions_for_non_load (abfd))
6066 return FALSE;
252b5132 6067
c044fabd 6068 /* After writing the headers, we need to write the sections too... */
9ad5cbcf
AM
6069 num_sec = elf_numsections (abfd);
6070 for (count = 1; count < num_sec; count++)
252b5132 6071 {
3e19fb8f
L
6072 i_shdrp[count]->sh_name
6073 = _bfd_elf_strtab_offset (elf_shstrtab (abfd),
6074 i_shdrp[count]->sh_name);
252b5132
RH
6075 if (bed->elf_backend_section_processing)
6076 (*bed->elf_backend_section_processing) (abfd, i_shdrp[count]);
6077 if (i_shdrp[count]->contents)
6078 {
dc810e39
AM
6079 bfd_size_type amt = i_shdrp[count]->sh_size;
6080
252b5132 6081 if (bfd_seek (abfd, i_shdrp[count]->sh_offset, SEEK_SET) != 0
dc810e39 6082 || bfd_bwrite (i_shdrp[count]->contents, amt, abfd) != amt)
b34976b6 6083 return FALSE;
252b5132
RH
6084 }
6085 }
6086
6087 /* Write out the section header names. */
30e8ee25 6088 t = elf_tdata (abfd);
26ae6d5e 6089 if (elf_shstrtab (abfd) != NULL
30e8ee25 6090 && (bfd_seek (abfd, t->shstrtab_hdr.sh_offset, SEEK_SET) != 0
08a40648 6091 || !_bfd_elf_strtab_emit (abfd, elf_shstrtab (abfd))))
b34976b6 6092 return FALSE;
252b5132
RH
6093
6094 if (bed->elf_backend_final_write_processing)
12bd6957 6095 (*bed->elf_backend_final_write_processing) (abfd, elf_linker (abfd));
252b5132 6096
ff59fc36
RM
6097 if (!bed->s->write_shdrs_and_ehdr (abfd))
6098 return FALSE;
6099
6100 /* This is last since write_shdrs_and_ehdr can touch i_shdrp[0]. */
c0355132
AM
6101 if (t->o->build_id.after_write_object_contents != NULL)
6102 return (*t->o->build_id.after_write_object_contents) (abfd);
ff59fc36
RM
6103
6104 return TRUE;
252b5132
RH
6105}
6106
b34976b6 6107bfd_boolean
217aa764 6108_bfd_elf_write_corefile_contents (bfd *abfd)
252b5132 6109{
c044fabd 6110 /* Hopefully this can be done just like an object file. */
252b5132
RH
6111 return _bfd_elf_write_object_contents (abfd);
6112}
c044fabd
KH
6113
6114/* Given a section, search the header to find them. */
6115
cb33740c 6116unsigned int
198beae2 6117_bfd_elf_section_from_bfd_section (bfd *abfd, struct bfd_section *asect)
252b5132 6118{
9c5bfbb7 6119 const struct elf_backend_data *bed;
91d6fa6a 6120 unsigned int sec_index;
252b5132 6121
9ad5cbcf
AM
6122 if (elf_section_data (asect) != NULL
6123 && elf_section_data (asect)->this_idx != 0)
6124 return elf_section_data (asect)->this_idx;
6125
6126 if (bfd_is_abs_section (asect))
91d6fa6a 6127 sec_index = SHN_ABS;
af746e92 6128 else if (bfd_is_com_section (asect))
91d6fa6a 6129 sec_index = SHN_COMMON;
af746e92 6130 else if (bfd_is_und_section (asect))
91d6fa6a 6131 sec_index = SHN_UNDEF;
af746e92 6132 else
91d6fa6a 6133 sec_index = SHN_BAD;
252b5132 6134
af746e92 6135 bed = get_elf_backend_data (abfd);
252b5132
RH
6136 if (bed->elf_backend_section_from_bfd_section)
6137 {
91d6fa6a 6138 int retval = sec_index;
9ad5cbcf 6139
af746e92
AM
6140 if ((*bed->elf_backend_section_from_bfd_section) (abfd, asect, &retval))
6141 return retval;
252b5132
RH
6142 }
6143
91d6fa6a 6144 if (sec_index == SHN_BAD)
af746e92 6145 bfd_set_error (bfd_error_nonrepresentable_section);
252b5132 6146
91d6fa6a 6147 return sec_index;
252b5132
RH
6148}
6149
6150/* Given a BFD symbol, return the index in the ELF symbol table, or -1
6151 on error. */
6152
6153int
217aa764 6154_bfd_elf_symbol_from_bfd_symbol (bfd *abfd, asymbol **asym_ptr_ptr)
252b5132
RH
6155{
6156 asymbol *asym_ptr = *asym_ptr_ptr;
6157 int idx;
6158 flagword flags = asym_ptr->flags;
6159
6160 /* When gas creates relocations against local labels, it creates its
6161 own symbol for the section, but does put the symbol into the
6162 symbol chain, so udata is 0. When the linker is generating
6163 relocatable output, this section symbol may be for one of the
6164 input sections rather than the output section. */
6165 if (asym_ptr->udata.i == 0
6166 && (flags & BSF_SECTION_SYM)
6167 && asym_ptr->section)
6168 {
5372391b 6169 asection *sec;
252b5132
RH
6170 int indx;
6171
5372391b
AM
6172 sec = asym_ptr->section;
6173 if (sec->owner != abfd && sec->output_section != NULL)
6174 sec = sec->output_section;
6175 if (sec->owner == abfd
6176 && (indx = sec->index) < elf_num_section_syms (abfd)
4e89ac30 6177 && elf_section_syms (abfd)[indx] != NULL)
252b5132
RH
6178 asym_ptr->udata.i = elf_section_syms (abfd)[indx]->udata.i;
6179 }
6180
6181 idx = asym_ptr->udata.i;
6182
6183 if (idx == 0)
6184 {
6185 /* This case can occur when using --strip-symbol on a symbol
08a40648 6186 which is used in a relocation entry. */
252b5132 6187 (*_bfd_error_handler)
d003868e
AM
6188 (_("%B: symbol `%s' required but not present"),
6189 abfd, bfd_asymbol_name (asym_ptr));
252b5132
RH
6190 bfd_set_error (bfd_error_no_symbols);
6191 return -1;
6192 }
6193
6194#if DEBUG & 4
6195 {
6196 fprintf (stderr,
9ccb8af9
AM
6197 "elf_symbol_from_bfd_symbol 0x%.8lx, name = %s, sym num = %d, flags = 0x%.8lx\n",
6198 (long) asym_ptr, asym_ptr->name, idx, (long) flags);
252b5132
RH
6199 fflush (stderr);
6200 }
6201#endif
6202
6203 return idx;
6204}
6205
84d1d650 6206/* Rewrite program header information. */
252b5132 6207
b34976b6 6208static bfd_boolean
84d1d650 6209rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
252b5132 6210{
b34976b6
AM
6211 Elf_Internal_Ehdr *iehdr;
6212 struct elf_segment_map *map;
6213 struct elf_segment_map *map_first;
6214 struct elf_segment_map **pointer_to_map;
6215 Elf_Internal_Phdr *segment;
6216 asection *section;
6217 unsigned int i;
6218 unsigned int num_segments;
6219 bfd_boolean phdr_included = FALSE;
5c44b38e 6220 bfd_boolean p_paddr_valid;
b34976b6
AM
6221 bfd_vma maxpagesize;
6222 struct elf_segment_map *phdr_adjust_seg = NULL;
6223 unsigned int phdr_adjust_num = 0;
9c5bfbb7 6224 const struct elf_backend_data *bed;
bc67d8a6 6225
caf47ea6 6226 bed = get_elf_backend_data (ibfd);
252b5132
RH
6227 iehdr = elf_elfheader (ibfd);
6228
bc67d8a6 6229 map_first = NULL;
c044fabd 6230 pointer_to_map = &map_first;
252b5132
RH
6231
6232 num_segments = elf_elfheader (ibfd)->e_phnum;
bc67d8a6
NC
6233 maxpagesize = get_elf_backend_data (obfd)->maxpagesize;
6234
6235 /* Returns the end address of the segment + 1. */
aecc8f8a
AM
6236#define SEGMENT_END(segment, start) \
6237 (start + (segment->p_memsz > segment->p_filesz \
6238 ? segment->p_memsz : segment->p_filesz))
bc67d8a6 6239
eecdbe52
JJ
6240#define SECTION_SIZE(section, segment) \
6241 (((section->flags & (SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) \
6242 != SEC_THREAD_LOCAL || segment->p_type == PT_TLS) \
eea6121a 6243 ? section->size : 0)
eecdbe52 6244
b34976b6 6245 /* Returns TRUE if the given section is contained within
bc67d8a6 6246 the given segment. VMA addresses are compared. */
aecc8f8a
AM
6247#define IS_CONTAINED_BY_VMA(section, segment) \
6248 (section->vma >= segment->p_vaddr \
eecdbe52 6249 && (section->vma + SECTION_SIZE (section, segment) \
aecc8f8a 6250 <= (SEGMENT_END (segment, segment->p_vaddr))))
c044fabd 6251
b34976b6 6252 /* Returns TRUE if the given section is contained within
bc67d8a6 6253 the given segment. LMA addresses are compared. */
aecc8f8a
AM
6254#define IS_CONTAINED_BY_LMA(section, segment, base) \
6255 (section->lma >= base \
eecdbe52 6256 && (section->lma + SECTION_SIZE (section, segment) \
aecc8f8a 6257 <= SEGMENT_END (segment, base)))
252b5132 6258
0efc80c8
L
6259 /* Handle PT_NOTE segment. */
6260#define IS_NOTE(p, s) \
aecc8f8a 6261 (p->p_type == PT_NOTE \
0efc80c8 6262 && elf_section_type (s) == SHT_NOTE \
aecc8f8a 6263 && (bfd_vma) s->filepos >= p->p_offset \
cb3ff1e5 6264 && ((bfd_vma) s->filepos + s->size \
aecc8f8a 6265 <= p->p_offset + p->p_filesz))
252b5132 6266
0efc80c8
L
6267 /* Special case: corefile "NOTE" section containing regs, prpsinfo
6268 etc. */
6269#define IS_COREFILE_NOTE(p, s) \
6270 (IS_NOTE (p, s) \
6271 && bfd_get_format (ibfd) == bfd_core \
6272 && s->vma == 0 \
6273 && s->lma == 0)
6274
252b5132
RH
6275 /* The complicated case when p_vaddr is 0 is to handle the Solaris
6276 linker, which generates a PT_INTERP section with p_vaddr and
6277 p_memsz set to 0. */
aecc8f8a
AM
6278#define IS_SOLARIS_PT_INTERP(p, s) \
6279 (p->p_vaddr == 0 \
6280 && p->p_paddr == 0 \
6281 && p->p_memsz == 0 \
6282 && p->p_filesz > 0 \
6283 && (s->flags & SEC_HAS_CONTENTS) != 0 \
eea6121a 6284 && s->size > 0 \
aecc8f8a 6285 && (bfd_vma) s->filepos >= p->p_offset \
cb3ff1e5 6286 && ((bfd_vma) s->filepos + s->size \
aecc8f8a 6287 <= p->p_offset + p->p_filesz))
5c440b1e 6288
bc67d8a6
NC
6289 /* Decide if the given section should be included in the given segment.
6290 A section will be included if:
f5ffc919 6291 1. It is within the address space of the segment -- we use the LMA
08a40648 6292 if that is set for the segment and the VMA otherwise,
0efc80c8 6293 2. It is an allocated section or a NOTE section in a PT_NOTE
d324f6d6 6294 segment.
bc67d8a6 6295 3. There is an output section associated with it,
eecdbe52 6296 4. The section has not already been allocated to a previous segment.
2b05f1b7 6297 5. PT_GNU_STACK segments do not include any sections.
03394ac9 6298 6. PT_TLS segment includes only SHF_TLS sections.
6f79b219
JJ
6299 7. SHF_TLS sections are only in PT_TLS or PT_LOAD segments.
6300 8. PT_DYNAMIC should not contain empty sections at the beginning
08a40648 6301 (with the possible exception of .dynamic). */
9f17e2a6 6302#define IS_SECTION_IN_INPUT_SEGMENT(section, segment, bed) \
2b05f1b7
L
6303 ((((segment->p_paddr \
6304 ? IS_CONTAINED_BY_LMA (section, segment, segment->p_paddr) \
6305 : IS_CONTAINED_BY_VMA (section, segment)) \
6306 && (section->flags & SEC_ALLOC) != 0) \
0efc80c8 6307 || IS_NOTE (segment, section)) \
2b05f1b7
L
6308 && segment->p_type != PT_GNU_STACK \
6309 && (segment->p_type != PT_TLS \
6310 || (section->flags & SEC_THREAD_LOCAL)) \
6311 && (segment->p_type == PT_LOAD \
6312 || segment->p_type == PT_TLS \
6313 || (section->flags & SEC_THREAD_LOCAL) == 0) \
6314 && (segment->p_type != PT_DYNAMIC \
6315 || SECTION_SIZE (section, segment) > 0 \
6316 || (segment->p_paddr \
6317 ? segment->p_paddr != section->lma \
6318 : segment->p_vaddr != section->vma) \
6319 || (strcmp (bfd_get_section_name (ibfd, section), ".dynamic") \
6320 == 0)) \
0067a569 6321 && !section->segment_mark)
bc67d8a6 6322
9f17e2a6
L
6323/* If the output section of a section in the input segment is NULL,
6324 it is removed from the corresponding output segment. */
6325#define INCLUDE_SECTION_IN_SEGMENT(section, segment, bed) \
6326 (IS_SECTION_IN_INPUT_SEGMENT (section, segment, bed) \
6327 && section->output_section != NULL)
6328
b34976b6 6329 /* Returns TRUE iff seg1 starts after the end of seg2. */
b5f852ea
NC
6330#define SEGMENT_AFTER_SEGMENT(seg1, seg2, field) \
6331 (seg1->field >= SEGMENT_END (seg2, seg2->field))
6332
6333 /* Returns TRUE iff seg1 and seg2 overlap. Segments overlap iff both
6334 their VMA address ranges and their LMA address ranges overlap.
6335 It is possible to have overlapping VMA ranges without overlapping LMA
6336 ranges. RedBoot images for example can have both .data and .bss mapped
6337 to the same VMA range, but with the .data section mapped to a different
6338 LMA. */
aecc8f8a 6339#define SEGMENT_OVERLAPS(seg1, seg2) \
b5f852ea 6340 ( !(SEGMENT_AFTER_SEGMENT (seg1, seg2, p_vaddr) \
08a40648 6341 || SEGMENT_AFTER_SEGMENT (seg2, seg1, p_vaddr)) \
b5f852ea 6342 && !(SEGMENT_AFTER_SEGMENT (seg1, seg2, p_paddr) \
08a40648 6343 || SEGMENT_AFTER_SEGMENT (seg2, seg1, p_paddr)))
bc67d8a6
NC
6344
6345 /* Initialise the segment mark field. */
6346 for (section = ibfd->sections; section != NULL; section = section->next)
b34976b6 6347 section->segment_mark = FALSE;
bc67d8a6 6348
5c44b38e
AM
6349 /* The Solaris linker creates program headers in which all the
6350 p_paddr fields are zero. When we try to objcopy or strip such a
6351 file, we get confused. Check for this case, and if we find it
6352 don't set the p_paddr_valid fields. */
6353 p_paddr_valid = FALSE;
6354 for (i = 0, segment = elf_tdata (ibfd)->phdr;
6355 i < num_segments;
6356 i++, segment++)
6357 if (segment->p_paddr != 0)
6358 {
6359 p_paddr_valid = TRUE;
6360 break;
6361 }
6362
252b5132 6363 /* Scan through the segments specified in the program header
bc67d8a6 6364 of the input BFD. For this first scan we look for overlaps
9ad5cbcf 6365 in the loadable segments. These can be created by weird
aecc8f8a 6366 parameters to objcopy. Also, fix some solaris weirdness. */
bc67d8a6
NC
6367 for (i = 0, segment = elf_tdata (ibfd)->phdr;
6368 i < num_segments;
c044fabd 6369 i++, segment++)
252b5132 6370 {
252b5132 6371 unsigned int j;
c044fabd 6372 Elf_Internal_Phdr *segment2;
252b5132 6373
aecc8f8a
AM
6374 if (segment->p_type == PT_INTERP)
6375 for (section = ibfd->sections; section; section = section->next)
6376 if (IS_SOLARIS_PT_INTERP (segment, section))
6377 {
6378 /* Mininal change so that the normal section to segment
4cc11e76 6379 assignment code will work. */
aecc8f8a
AM
6380 segment->p_vaddr = section->vma;
6381 break;
6382 }
6383
bc67d8a6 6384 if (segment->p_type != PT_LOAD)
b10a8ae0
L
6385 {
6386 /* Remove PT_GNU_RELRO segment. */
6387 if (segment->p_type == PT_GNU_RELRO)
6388 segment->p_type = PT_NULL;
6389 continue;
6390 }
c044fabd 6391
bc67d8a6 6392 /* Determine if this segment overlaps any previous segments. */
0067a569 6393 for (j = 0, segment2 = elf_tdata (ibfd)->phdr; j < i; j++, segment2++)
bc67d8a6
NC
6394 {
6395 bfd_signed_vma extra_length;
c044fabd 6396
bc67d8a6 6397 if (segment2->p_type != PT_LOAD
0067a569 6398 || !SEGMENT_OVERLAPS (segment, segment2))
bc67d8a6 6399 continue;
c044fabd 6400
bc67d8a6
NC
6401 /* Merge the two segments together. */
6402 if (segment2->p_vaddr < segment->p_vaddr)
6403 {
c044fabd 6404 /* Extend SEGMENT2 to include SEGMENT and then delete
08a40648 6405 SEGMENT. */
0067a569
AM
6406 extra_length = (SEGMENT_END (segment, segment->p_vaddr)
6407 - SEGMENT_END (segment2, segment2->p_vaddr));
c044fabd 6408
bc67d8a6
NC
6409 if (extra_length > 0)
6410 {
0067a569 6411 segment2->p_memsz += extra_length;
bc67d8a6
NC
6412 segment2->p_filesz += extra_length;
6413 }
c044fabd 6414
bc67d8a6 6415 segment->p_type = PT_NULL;
c044fabd 6416
bc67d8a6
NC
6417 /* Since we have deleted P we must restart the outer loop. */
6418 i = 0;
6419 segment = elf_tdata (ibfd)->phdr;
6420 break;
6421 }
6422 else
6423 {
c044fabd 6424 /* Extend SEGMENT to include SEGMENT2 and then delete
08a40648 6425 SEGMENT2. */
0067a569
AM
6426 extra_length = (SEGMENT_END (segment2, segment2->p_vaddr)
6427 - SEGMENT_END (segment, segment->p_vaddr));
c044fabd 6428
bc67d8a6
NC
6429 if (extra_length > 0)
6430 {
0067a569 6431 segment->p_memsz += extra_length;
bc67d8a6
NC
6432 segment->p_filesz += extra_length;
6433 }
c044fabd 6434
bc67d8a6
NC
6435 segment2->p_type = PT_NULL;
6436 }
6437 }
6438 }
c044fabd 6439
bc67d8a6
NC
6440 /* The second scan attempts to assign sections to segments. */
6441 for (i = 0, segment = elf_tdata (ibfd)->phdr;
6442 i < num_segments;
0067a569 6443 i++, segment++)
bc67d8a6 6444 {
0067a569
AM
6445 unsigned int section_count;
6446 asection **sections;
6447 asection *output_section;
6448 unsigned int isec;
6449 bfd_vma matching_lma;
6450 bfd_vma suggested_lma;
6451 unsigned int j;
dc810e39 6452 bfd_size_type amt;
0067a569
AM
6453 asection *first_section;
6454 bfd_boolean first_matching_lma;
6455 bfd_boolean first_suggested_lma;
bc67d8a6
NC
6456
6457 if (segment->p_type == PT_NULL)
6458 continue;
c044fabd 6459
9f17e2a6 6460 first_section = NULL;
bc67d8a6 6461 /* Compute how many sections might be placed into this segment. */
b5f852ea
NC
6462 for (section = ibfd->sections, section_count = 0;
6463 section != NULL;
6464 section = section->next)
9f17e2a6
L
6465 {
6466 /* Find the first section in the input segment, which may be
6467 removed from the corresponding output segment. */
6468 if (IS_SECTION_IN_INPUT_SEGMENT (section, segment, bed))
6469 {
6470 if (first_section == NULL)
6471 first_section = section;
6472 if (section->output_section != NULL)
6473 ++section_count;
6474 }
6475 }
811072d8 6476
b5f852ea
NC
6477 /* Allocate a segment map big enough to contain
6478 all of the sections we have selected. */
dc810e39
AM
6479 amt = sizeof (struct elf_segment_map);
6480 amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
a50b1753 6481 map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
bc67d8a6 6482 if (map == NULL)
b34976b6 6483 return FALSE;
252b5132
RH
6484
6485 /* Initialise the fields of the segment map. Default to
6486 using the physical address of the segment in the input BFD. */
0067a569
AM
6487 map->next = NULL;
6488 map->p_type = segment->p_type;
6489 map->p_flags = segment->p_flags;
bc67d8a6 6490 map->p_flags_valid = 1;
55d55ac7 6491
9f17e2a6
L
6492 /* If the first section in the input segment is removed, there is
6493 no need to preserve segment physical address in the corresponding
6494 output segment. */
945c025a 6495 if (!first_section || first_section->output_section != NULL)
9f17e2a6
L
6496 {
6497 map->p_paddr = segment->p_paddr;
5c44b38e 6498 map->p_paddr_valid = p_paddr_valid;
9f17e2a6 6499 }
252b5132
RH
6500
6501 /* Determine if this segment contains the ELF file header
6502 and if it contains the program headers themselves. */
bc67d8a6
NC
6503 map->includes_filehdr = (segment->p_offset == 0
6504 && segment->p_filesz >= iehdr->e_ehsize);
bc67d8a6 6505 map->includes_phdrs = 0;
252b5132 6506
0067a569 6507 if (!phdr_included || segment->p_type != PT_LOAD)
252b5132 6508 {
bc67d8a6
NC
6509 map->includes_phdrs =
6510 (segment->p_offset <= (bfd_vma) iehdr->e_phoff
6511 && (segment->p_offset + segment->p_filesz
252b5132
RH
6512 >= ((bfd_vma) iehdr->e_phoff
6513 + iehdr->e_phnum * iehdr->e_phentsize)));
c044fabd 6514
bc67d8a6 6515 if (segment->p_type == PT_LOAD && map->includes_phdrs)
b34976b6 6516 phdr_included = TRUE;
252b5132
RH
6517 }
6518
bc67d8a6 6519 if (section_count == 0)
252b5132
RH
6520 {
6521 /* Special segments, such as the PT_PHDR segment, may contain
6522 no sections, but ordinary, loadable segments should contain
1ed89aa9
NC
6523 something. They are allowed by the ELF spec however, so only
6524 a warning is produced. */
bc67d8a6 6525 if (segment->p_type == PT_LOAD)
c86934ce
NC
6526 (*_bfd_error_handler) (_("\
6527%B: warning: Empty loadable segment detected, is this intentional ?"),
0067a569 6528 ibfd);
252b5132 6529
bc67d8a6 6530 map->count = 0;
c044fabd
KH
6531 *pointer_to_map = map;
6532 pointer_to_map = &map->next;
252b5132
RH
6533
6534 continue;
6535 }
6536
6537 /* Now scan the sections in the input BFD again and attempt
6538 to add their corresponding output sections to the segment map.
6539 The problem here is how to handle an output section which has
6540 been moved (ie had its LMA changed). There are four possibilities:
6541
6542 1. None of the sections have been moved.
6543 In this case we can continue to use the segment LMA from the
6544 input BFD.
6545
6546 2. All of the sections have been moved by the same amount.
6547 In this case we can change the segment's LMA to match the LMA
6548 of the first section.
6549
6550 3. Some of the sections have been moved, others have not.
6551 In this case those sections which have not been moved can be
6552 placed in the current segment which will have to have its size,
6553 and possibly its LMA changed, and a new segment or segments will
6554 have to be created to contain the other sections.
6555
b5f852ea 6556 4. The sections have been moved, but not by the same amount.
252b5132
RH
6557 In this case we can change the segment's LMA to match the LMA
6558 of the first section and we will have to create a new segment
6559 or segments to contain the other sections.
6560
6561 In order to save time, we allocate an array to hold the section
6562 pointers that we are interested in. As these sections get assigned
6563 to a segment, they are removed from this array. */
6564
a50b1753 6565 sections = (asection **) bfd_malloc2 (section_count, sizeof (asection *));
252b5132 6566 if (sections == NULL)
b34976b6 6567 return FALSE;
252b5132
RH
6568
6569 /* Step One: Scan for segment vs section LMA conflicts.
6570 Also add the sections to the section array allocated above.
6571 Also add the sections to the current segment. In the common
6572 case, where the sections have not been moved, this means that
6573 we have completely filled the segment, and there is nothing
6574 more to do. */
252b5132 6575 isec = 0;
72730e0c 6576 matching_lma = 0;
252b5132 6577 suggested_lma = 0;
0067a569
AM
6578 first_matching_lma = TRUE;
6579 first_suggested_lma = TRUE;
252b5132 6580
461c4b2e 6581 for (section = first_section, j = 0;
bc67d8a6
NC
6582 section != NULL;
6583 section = section->next)
252b5132 6584 {
caf47ea6 6585 if (INCLUDE_SECTION_IN_SEGMENT (section, segment, bed))
c0f7859b 6586 {
bc67d8a6
NC
6587 output_section = section->output_section;
6588
0067a569 6589 sections[j++] = section;
252b5132
RH
6590
6591 /* The Solaris native linker always sets p_paddr to 0.
6592 We try to catch that case here, and set it to the
5e8d7549
NC
6593 correct value. Note - some backends require that
6594 p_paddr be left as zero. */
5c44b38e 6595 if (!p_paddr_valid
4455705d 6596 && segment->p_vaddr != 0
0067a569 6597 && !bed->want_p_paddr_set_to_zero
252b5132 6598 && isec == 0
bc67d8a6 6599 && output_section->lma != 0
0067a569
AM
6600 && output_section->vma == (segment->p_vaddr
6601 + (map->includes_filehdr
6602 ? iehdr->e_ehsize
6603 : 0)
6604 + (map->includes_phdrs
6605 ? (iehdr->e_phnum
6606 * iehdr->e_phentsize)
6607 : 0)))
bc67d8a6 6608 map->p_paddr = segment->p_vaddr;
252b5132
RH
6609
6610 /* Match up the physical address of the segment with the
6611 LMA address of the output section. */
bc67d8a6 6612 if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr)
5e8d7549 6613 || IS_COREFILE_NOTE (segment, section)
0067a569
AM
6614 || (bed->want_p_paddr_set_to_zero
6615 && IS_CONTAINED_BY_VMA (output_section, segment)))
252b5132 6616 {
0067a569
AM
6617 if (first_matching_lma || output_section->lma < matching_lma)
6618 {
6619 matching_lma = output_section->lma;
6620 first_matching_lma = FALSE;
6621 }
252b5132
RH
6622
6623 /* We assume that if the section fits within the segment
bc67d8a6 6624 then it does not overlap any other section within that
252b5132 6625 segment. */
0067a569
AM
6626 map->sections[isec++] = output_section;
6627 }
6628 else if (first_suggested_lma)
6629 {
6630 suggested_lma = output_section->lma;
6631 first_suggested_lma = FALSE;
252b5132 6632 }
147d51c2
L
6633
6634 if (j == section_count)
6635 break;
252b5132
RH
6636 }
6637 }
6638
bc67d8a6 6639 BFD_ASSERT (j == section_count);
252b5132
RH
6640
6641 /* Step Two: Adjust the physical address of the current segment,
6642 if necessary. */
bc67d8a6 6643 if (isec == section_count)
252b5132
RH
6644 {
6645 /* All of the sections fitted within the segment as currently
6646 specified. This is the default case. Add the segment to
6647 the list of built segments and carry on to process the next
6648 program header in the input BFD. */
bc67d8a6 6649 map->count = section_count;
c044fabd
KH
6650 *pointer_to_map = map;
6651 pointer_to_map = &map->next;
08a40648 6652
5c44b38e
AM
6653 if (p_paddr_valid
6654 && !bed->want_p_paddr_set_to_zero
147d51c2 6655 && matching_lma != map->p_paddr
5c44b38e
AM
6656 && !map->includes_filehdr
6657 && !map->includes_phdrs)
3271a814
NS
6658 /* There is some padding before the first section in the
6659 segment. So, we must account for that in the output
6660 segment's vma. */
6661 map->p_vaddr_offset = matching_lma - map->p_paddr;
08a40648 6662
252b5132
RH
6663 free (sections);
6664 continue;
6665 }
252b5132
RH
6666 else
6667 {
0067a569 6668 if (!first_matching_lma)
72730e0c
AM
6669 {
6670 /* At least one section fits inside the current segment.
6671 Keep it, but modify its physical address to match the
6672 LMA of the first section that fitted. */
bc67d8a6 6673 map->p_paddr = matching_lma;
72730e0c
AM
6674 }
6675 else
6676 {
6677 /* None of the sections fitted inside the current segment.
6678 Change the current segment's physical address to match
6679 the LMA of the first section. */
bc67d8a6 6680 map->p_paddr = suggested_lma;
72730e0c
AM
6681 }
6682
bc67d8a6
NC
6683 /* Offset the segment physical address from the lma
6684 to allow for space taken up by elf headers. */
6685 if (map->includes_filehdr)
010c8431
AM
6686 {
6687 if (map->p_paddr >= iehdr->e_ehsize)
6688 map->p_paddr -= iehdr->e_ehsize;
6689 else
6690 {
6691 map->includes_filehdr = FALSE;
6692 map->includes_phdrs = FALSE;
6693 }
6694 }
252b5132 6695
bc67d8a6
NC
6696 if (map->includes_phdrs)
6697 {
010c8431
AM
6698 if (map->p_paddr >= iehdr->e_phnum * iehdr->e_phentsize)
6699 {
6700 map->p_paddr -= iehdr->e_phnum * iehdr->e_phentsize;
6701
6702 /* iehdr->e_phnum is just an estimate of the number
6703 of program headers that we will need. Make a note
6704 here of the number we used and the segment we chose
6705 to hold these headers, so that we can adjust the
6706 offset when we know the correct value. */
6707 phdr_adjust_num = iehdr->e_phnum;
6708 phdr_adjust_seg = map;
6709 }
6710 else
6711 map->includes_phdrs = FALSE;
bc67d8a6 6712 }
252b5132
RH
6713 }
6714
6715 /* Step Three: Loop over the sections again, this time assigning
caf47ea6 6716 those that fit to the current segment and removing them from the
252b5132
RH
6717 sections array; but making sure not to leave large gaps. Once all
6718 possible sections have been assigned to the current segment it is
6719 added to the list of built segments and if sections still remain
6720 to be assigned, a new segment is constructed before repeating
6721 the loop. */
6722 isec = 0;
6723 do
6724 {
bc67d8a6 6725 map->count = 0;
252b5132 6726 suggested_lma = 0;
0067a569 6727 first_suggested_lma = TRUE;
252b5132
RH
6728
6729 /* Fill the current segment with sections that fit. */
bc67d8a6 6730 for (j = 0; j < section_count; j++)
252b5132 6731 {
bc67d8a6 6732 section = sections[j];
252b5132 6733
bc67d8a6 6734 if (section == NULL)
252b5132
RH
6735 continue;
6736
bc67d8a6 6737 output_section = section->output_section;
252b5132 6738
bc67d8a6 6739 BFD_ASSERT (output_section != NULL);
c044fabd 6740
bc67d8a6
NC
6741 if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr)
6742 || IS_COREFILE_NOTE (segment, section))
252b5132 6743 {
bc67d8a6 6744 if (map->count == 0)
252b5132
RH
6745 {
6746 /* If the first section in a segment does not start at
bc67d8a6
NC
6747 the beginning of the segment, then something is
6748 wrong. */
0067a569
AM
6749 if (output_section->lma
6750 != (map->p_paddr
6751 + (map->includes_filehdr ? iehdr->e_ehsize : 0)
6752 + (map->includes_phdrs
6753 ? iehdr->e_phnum * iehdr->e_phentsize
6754 : 0)))
252b5132
RH
6755 abort ();
6756 }
6757 else
6758 {
0067a569 6759 asection *prev_sec;
252b5132 6760
bc67d8a6 6761 prev_sec = map->sections[map->count - 1];
252b5132
RH
6762
6763 /* If the gap between the end of the previous section
bc67d8a6
NC
6764 and the start of this section is more than
6765 maxpagesize then we need to start a new segment. */
eea6121a 6766 if ((BFD_ALIGN (prev_sec->lma + prev_sec->size,
079e9a2f 6767 maxpagesize)
caf47ea6 6768 < BFD_ALIGN (output_section->lma, maxpagesize))
0067a569 6769 || (prev_sec->lma + prev_sec->size
079e9a2f 6770 > output_section->lma))
252b5132 6771 {
0067a569
AM
6772 if (first_suggested_lma)
6773 {
6774 suggested_lma = output_section->lma;
6775 first_suggested_lma = FALSE;
6776 }
252b5132
RH
6777
6778 continue;
6779 }
6780 }
6781
bc67d8a6 6782 map->sections[map->count++] = output_section;
252b5132
RH
6783 ++isec;
6784 sections[j] = NULL;
b34976b6 6785 section->segment_mark = TRUE;
252b5132 6786 }
0067a569
AM
6787 else if (first_suggested_lma)
6788 {
6789 suggested_lma = output_section->lma;
6790 first_suggested_lma = FALSE;
6791 }
252b5132
RH
6792 }
6793
bc67d8a6 6794 BFD_ASSERT (map->count > 0);
252b5132
RH
6795
6796 /* Add the current segment to the list of built segments. */
c044fabd
KH
6797 *pointer_to_map = map;
6798 pointer_to_map = &map->next;
252b5132 6799
bc67d8a6 6800 if (isec < section_count)
252b5132
RH
6801 {
6802 /* We still have not allocated all of the sections to
6803 segments. Create a new segment here, initialise it
6804 and carry on looping. */
dc810e39
AM
6805 amt = sizeof (struct elf_segment_map);
6806 amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
5964fc3a 6807 map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
bc67d8a6 6808 if (map == NULL)
5ed6aba4
NC
6809 {
6810 free (sections);
6811 return FALSE;
6812 }
252b5132
RH
6813
6814 /* Initialise the fields of the segment map. Set the physical
6815 physical address to the LMA of the first section that has
6816 not yet been assigned. */
0067a569
AM
6817 map->next = NULL;
6818 map->p_type = segment->p_type;
6819 map->p_flags = segment->p_flags;
6820 map->p_flags_valid = 1;
6821 map->p_paddr = suggested_lma;
5c44b38e 6822 map->p_paddr_valid = p_paddr_valid;
bc67d8a6 6823 map->includes_filehdr = 0;
0067a569 6824 map->includes_phdrs = 0;
252b5132
RH
6825 }
6826 }
bc67d8a6 6827 while (isec < section_count);
252b5132
RH
6828
6829 free (sections);
6830 }
6831
12bd6957 6832 elf_seg_map (obfd) = map_first;
bc67d8a6
NC
6833
6834 /* If we had to estimate the number of program headers that were
9ad5cbcf 6835 going to be needed, then check our estimate now and adjust
bc67d8a6
NC
6836 the offset if necessary. */
6837 if (phdr_adjust_seg != NULL)
6838 {
6839 unsigned int count;
c044fabd 6840
bc67d8a6 6841 for (count = 0, map = map_first; map != NULL; map = map->next)
c044fabd 6842 count++;
252b5132 6843
bc67d8a6
NC
6844 if (count > phdr_adjust_num)
6845 phdr_adjust_seg->p_paddr
6846 -= (count - phdr_adjust_num) * iehdr->e_phentsize;
6847 }
c044fabd 6848
bc67d8a6 6849#undef SEGMENT_END
eecdbe52 6850#undef SECTION_SIZE
bc67d8a6
NC
6851#undef IS_CONTAINED_BY_VMA
6852#undef IS_CONTAINED_BY_LMA
0efc80c8 6853#undef IS_NOTE
252b5132 6854#undef IS_COREFILE_NOTE
bc67d8a6 6855#undef IS_SOLARIS_PT_INTERP
9f17e2a6 6856#undef IS_SECTION_IN_INPUT_SEGMENT
bc67d8a6
NC
6857#undef INCLUDE_SECTION_IN_SEGMENT
6858#undef SEGMENT_AFTER_SEGMENT
6859#undef SEGMENT_OVERLAPS
b34976b6 6860 return TRUE;
252b5132
RH
6861}
6862
84d1d650
L
6863/* Copy ELF program header information. */
6864
6865static bfd_boolean
6866copy_elf_program_header (bfd *ibfd, bfd *obfd)
6867{
6868 Elf_Internal_Ehdr *iehdr;
6869 struct elf_segment_map *map;
6870 struct elf_segment_map *map_first;
6871 struct elf_segment_map **pointer_to_map;
6872 Elf_Internal_Phdr *segment;
6873 unsigned int i;
6874 unsigned int num_segments;
6875 bfd_boolean phdr_included = FALSE;
88967714 6876 bfd_boolean p_paddr_valid;
84d1d650
L
6877
6878 iehdr = elf_elfheader (ibfd);
6879
6880 map_first = NULL;
6881 pointer_to_map = &map_first;
6882
88967714
AM
6883 /* If all the segment p_paddr fields are zero, don't set
6884 map->p_paddr_valid. */
6885 p_paddr_valid = FALSE;
84d1d650 6886 num_segments = elf_elfheader (ibfd)->e_phnum;
88967714
AM
6887 for (i = 0, segment = elf_tdata (ibfd)->phdr;
6888 i < num_segments;
6889 i++, segment++)
6890 if (segment->p_paddr != 0)
6891 {
6892 p_paddr_valid = TRUE;
6893 break;
6894 }
6895
84d1d650
L
6896 for (i = 0, segment = elf_tdata (ibfd)->phdr;
6897 i < num_segments;
6898 i++, segment++)
6899 {
6900 asection *section;
6901 unsigned int section_count;
6902 bfd_size_type amt;
6903 Elf_Internal_Shdr *this_hdr;
53020534 6904 asection *first_section = NULL;
a76e6f2f 6905 asection *lowest_section;
84d1d650 6906
84d1d650
L
6907 /* Compute how many sections are in this segment. */
6908 for (section = ibfd->sections, section_count = 0;
6909 section != NULL;
6910 section = section->next)
6911 {
6912 this_hdr = &(elf_section_data(section)->this_hdr);
f4638467 6913 if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
3271a814 6914 {
a76e6f2f
AM
6915 if (first_section == NULL)
6916 first_section = section;
3271a814
NS
6917 section_count++;
6918 }
84d1d650
L
6919 }
6920
6921 /* Allocate a segment map big enough to contain
6922 all of the sections we have selected. */
6923 amt = sizeof (struct elf_segment_map);
6924 if (section_count != 0)
6925 amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
a50b1753 6926 map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
84d1d650
L
6927 if (map == NULL)
6928 return FALSE;
6929
6930 /* Initialize the fields of the output segment map with the
6931 input segment. */
6932 map->next = NULL;
6933 map->p_type = segment->p_type;
6934 map->p_flags = segment->p_flags;
6935 map->p_flags_valid = 1;
6936 map->p_paddr = segment->p_paddr;
88967714 6937 map->p_paddr_valid = p_paddr_valid;
3f570048
AM
6938 map->p_align = segment->p_align;
6939 map->p_align_valid = 1;
3271a814 6940 map->p_vaddr_offset = 0;
84d1d650 6941
04c3a755
NS
6942 if (map->p_type == PT_GNU_RELRO
6943 || map->p_type == PT_GNU_STACK)
b10a8ae0
L
6944 {
6945 /* The PT_GNU_RELRO segment may contain the first a few
6946 bytes in the .got.plt section even if the whole .got.plt
6947 section isn't in the PT_GNU_RELRO segment. We won't
04c3a755
NS
6948 change the size of the PT_GNU_RELRO segment.
6949 Similarly, PT_GNU_STACK size is significant on uclinux
6950 systems. */
9433b9b1 6951 map->p_size = segment->p_memsz;
b10a8ae0
L
6952 map->p_size_valid = 1;
6953 }
6954
84d1d650
L
6955 /* Determine if this segment contains the ELF file header
6956 and if it contains the program headers themselves. */
6957 map->includes_filehdr = (segment->p_offset == 0
6958 && segment->p_filesz >= iehdr->e_ehsize);
6959
6960 map->includes_phdrs = 0;
6961 if (! phdr_included || segment->p_type != PT_LOAD)
6962 {
6963 map->includes_phdrs =
6964 (segment->p_offset <= (bfd_vma) iehdr->e_phoff
6965 && (segment->p_offset + segment->p_filesz
6966 >= ((bfd_vma) iehdr->e_phoff
6967 + iehdr->e_phnum * iehdr->e_phentsize)));
6968
6969 if (segment->p_type == PT_LOAD && map->includes_phdrs)
6970 phdr_included = TRUE;
6971 }
6972
bbefd0a9 6973 lowest_section = NULL;
84d1d650
L
6974 if (section_count != 0)
6975 {
6976 unsigned int isec = 0;
6977
53020534 6978 for (section = first_section;
84d1d650
L
6979 section != NULL;
6980 section = section->next)
6981 {
6982 this_hdr = &(elf_section_data(section)->this_hdr);
f4638467 6983 if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
53020534
L
6984 {
6985 map->sections[isec++] = section->output_section;
a76e6f2f
AM
6986 if ((section->flags & SEC_ALLOC) != 0)
6987 {
6988 bfd_vma seg_off;
6989
bbefd0a9
AM
6990 if (lowest_section == NULL
6991 || section->lma < lowest_section->lma)
fb8a5684
AM
6992 lowest_section = section;
6993
a76e6f2f
AM
6994 /* Section lmas are set up from PT_LOAD header
6995 p_paddr in _bfd_elf_make_section_from_shdr.
6996 If this header has a p_paddr that disagrees
6997 with the section lma, flag the p_paddr as
6998 invalid. */
6999 if ((section->flags & SEC_LOAD) != 0)
7000 seg_off = this_hdr->sh_offset - segment->p_offset;
7001 else
7002 seg_off = this_hdr->sh_addr - segment->p_vaddr;
7003 if (section->lma - segment->p_paddr != seg_off)
7004 map->p_paddr_valid = FALSE;
7005 }
53020534
L
7006 if (isec == section_count)
7007 break;
7008 }
84d1d650
L
7009 }
7010 }
7011
a76e6f2f
AM
7012 if (map->includes_filehdr && lowest_section != NULL)
7013 /* We need to keep the space used by the headers fixed. */
7014 map->header_size = lowest_section->vma - segment->p_vaddr;
d324f6d6 7015
a76e6f2f
AM
7016 if (!map->includes_phdrs
7017 && !map->includes_filehdr
7018 && map->p_paddr_valid)
7019 /* There is some other padding before the first section. */
7020 map->p_vaddr_offset = ((lowest_section ? lowest_section->lma : 0)
7021 - segment->p_paddr);
7022
84d1d650
L
7023 map->count = section_count;
7024 *pointer_to_map = map;
7025 pointer_to_map = &map->next;
7026 }
7027
12bd6957 7028 elf_seg_map (obfd) = map_first;
84d1d650
L
7029 return TRUE;
7030}
7031
7032/* Copy private BFD data. This copies or rewrites ELF program header
7033 information. */
7034
7035static bfd_boolean
7036copy_private_bfd_data (bfd *ibfd, bfd *obfd)
7037{
84d1d650
L
7038 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
7039 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
7040 return TRUE;
7041
7042 if (elf_tdata (ibfd)->phdr == NULL)
7043 return TRUE;
7044
7045 if (ibfd->xvec == obfd->xvec)
7046 {
cb3ff1e5
NC
7047 /* Check to see if any sections in the input BFD
7048 covered by ELF program header have changed. */
d55ce4e2 7049 Elf_Internal_Phdr *segment;
84d1d650
L
7050 asection *section, *osec;
7051 unsigned int i, num_segments;
7052 Elf_Internal_Shdr *this_hdr;
147d51c2
L
7053 const struct elf_backend_data *bed;
7054
7055 bed = get_elf_backend_data (ibfd);
7056
7057 /* Regenerate the segment map if p_paddr is set to 0. */
7058 if (bed->want_p_paddr_set_to_zero)
7059 goto rewrite;
84d1d650
L
7060
7061 /* Initialize the segment mark field. */
7062 for (section = obfd->sections; section != NULL;
7063 section = section->next)
7064 section->segment_mark = FALSE;
7065
7066 num_segments = elf_elfheader (ibfd)->e_phnum;
7067 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7068 i < num_segments;
7069 i++, segment++)
7070 {
5f6999aa
NC
7071 /* PR binutils/3535. The Solaris linker always sets the p_paddr
7072 and p_memsz fields of special segments (DYNAMIC, INTERP) to 0
7073 which severly confuses things, so always regenerate the segment
7074 map in this case. */
7075 if (segment->p_paddr == 0
7076 && segment->p_memsz == 0
7077 && (segment->p_type == PT_INTERP || segment->p_type == PT_DYNAMIC))
cb3ff1e5 7078 goto rewrite;
5f6999aa 7079
84d1d650
L
7080 for (section = ibfd->sections;
7081 section != NULL; section = section->next)
7082 {
7083 /* We mark the output section so that we know it comes
7084 from the input BFD. */
7085 osec = section->output_section;
7086 if (osec)
7087 osec->segment_mark = TRUE;
7088
7089 /* Check if this section is covered by the segment. */
7090 this_hdr = &(elf_section_data(section)->this_hdr);
f4638467 7091 if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
84d1d650
L
7092 {
7093 /* FIXME: Check if its output section is changed or
7094 removed. What else do we need to check? */
7095 if (osec == NULL
7096 || section->flags != osec->flags
7097 || section->lma != osec->lma
7098 || section->vma != osec->vma
7099 || section->size != osec->size
7100 || section->rawsize != osec->rawsize
7101 || section->alignment_power != osec->alignment_power)
7102 goto rewrite;
7103 }
7104 }
7105 }
7106
cb3ff1e5 7107 /* Check to see if any output section do not come from the
84d1d650
L
7108 input BFD. */
7109 for (section = obfd->sections; section != NULL;
7110 section = section->next)
7111 {
7112 if (section->segment_mark == FALSE)
7113 goto rewrite;
7114 else
7115 section->segment_mark = FALSE;
7116 }
7117
7118 return copy_elf_program_header (ibfd, obfd);
7119 }
7120
7121rewrite:
f1d85785
L
7122 if (ibfd->xvec == obfd->xvec)
7123 {
7124 /* When rewriting program header, set the output maxpagesize to
7125 the maximum alignment of input PT_LOAD segments. */
7126 Elf_Internal_Phdr *segment;
7127 unsigned int i;
7128 unsigned int num_segments = elf_elfheader (ibfd)->e_phnum;
7129 bfd_vma maxpagesize = 0;
7130
7131 for (i = 0, segment = elf_tdata (ibfd)->phdr;
7132 i < num_segments;
7133 i++, segment++)
7134 if (segment->p_type == PT_LOAD
7135 && maxpagesize < segment->p_align)
c86934ce
NC
7136 {
7137 /* PR 17512: file: f17299af. */
7138 if (segment->p_align > (bfd_vma) 1 << ((sizeof (bfd_vma) * 8) - 2))
7139 (*_bfd_error_handler) (_("\
7140%B: warning: segment alignment of 0x%llx is too large"),
7141 ibfd, (long long) segment->p_align);
7142 else
7143 maxpagesize = segment->p_align;
7144 }
f1d85785
L
7145
7146 if (maxpagesize != get_elf_backend_data (obfd)->maxpagesize)
7147 bfd_emul_set_maxpagesize (bfd_get_target (obfd), maxpagesize);
7148 }
7149
84d1d650
L
7150 return rewrite_elf_program_header (ibfd, obfd);
7151}
7152
ccd2ec6a
L
7153/* Initialize private output section information from input section. */
7154
7155bfd_boolean
7156_bfd_elf_init_private_section_data (bfd *ibfd,
7157 asection *isec,
7158 bfd *obfd,
7159 asection *osec,
7160 struct bfd_link_info *link_info)
7161
7162{
7163 Elf_Internal_Shdr *ihdr, *ohdr;
0e1862bb
L
7164 bfd_boolean final_link = (link_info != NULL
7165 && !bfd_link_relocatable (link_info));
ccd2ec6a
L
7166
7167 if (ibfd->xvec->flavour != bfd_target_elf_flavour
7168 || obfd->xvec->flavour != bfd_target_elf_flavour)
7169 return TRUE;
7170
ba85c43e
NC
7171 BFD_ASSERT (elf_section_data (osec) != NULL);
7172
dfa7b0b8
AM
7173 /* For objcopy and relocatable link, don't copy the output ELF
7174 section type from input if the output BFD section flags have been
7175 set to something different. For a final link allow some flags
7176 that the linker clears to differ. */
42bb2e33 7177 if (elf_section_type (osec) == SHT_NULL
dfa7b0b8
AM
7178 && (osec->flags == isec->flags
7179 || (final_link
7180 && ((osec->flags ^ isec->flags)
0814be7d 7181 & ~(SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_RELOC)) == 0)))
42bb2e33 7182 elf_section_type (osec) = elf_section_type (isec);
d270463e
L
7183
7184 /* FIXME: Is this correct for all OS/PROC specific flags? */
7185 elf_section_flags (osec) |= (elf_section_flags (isec)
7186 & (SHF_MASKOS | SHF_MASKPROC));
ccd2ec6a
L
7187
7188 /* Set things up for objcopy and relocatable link. The output
7189 SHT_GROUP section will have its elf_next_in_group pointing back
7190 to the input group members. Ignore linker created group section.
7191 See elfNN_ia64_object_p in elfxx-ia64.c. */
dfa7b0b8 7192 if (!final_link)
ccd2ec6a
L
7193 {
7194 if (elf_sec_group (isec) == NULL
7195 || (elf_sec_group (isec)->flags & SEC_LINKER_CREATED) == 0)
7196 {
7197 if (elf_section_flags (isec) & SHF_GROUP)
7198 elf_section_flags (osec) |= SHF_GROUP;
7199 elf_next_in_group (osec) = elf_next_in_group (isec);
9659de1c 7200 elf_section_data (osec)->group = elf_section_data (isec)->group;
ccd2ec6a 7201 }
68f5ff89
L
7202
7203 /* If not decompress, preserve SHF_COMPRESSED. */
7204 if ((ibfd->flags & BFD_DECOMPRESS) == 0)
7205 elf_section_flags (osec) |= (elf_section_flags (isec)
7206 & SHF_COMPRESSED);
ccd2ec6a
L
7207 }
7208
7209 ihdr = &elf_section_data (isec)->this_hdr;
7210
7211 /* We need to handle elf_linked_to_section for SHF_LINK_ORDER. We
7212 don't use the output section of the linked-to section since it
7213 may be NULL at this point. */
7214 if ((ihdr->sh_flags & SHF_LINK_ORDER) != 0)
7215 {
7216 ohdr = &elf_section_data (osec)->this_hdr;
7217 ohdr->sh_flags |= SHF_LINK_ORDER;
7218 elf_linked_to_section (osec) = elf_linked_to_section (isec);
7219 }
7220
7221 osec->use_rela_p = isec->use_rela_p;
7222
7223 return TRUE;
7224}
7225
252b5132
RH
7226/* Copy private section information. This copies over the entsize
7227 field, and sometimes the info field. */
7228
b34976b6 7229bfd_boolean
217aa764
AM
7230_bfd_elf_copy_private_section_data (bfd *ibfd,
7231 asection *isec,
7232 bfd *obfd,
7233 asection *osec)
252b5132
RH
7234{
7235 Elf_Internal_Shdr *ihdr, *ohdr;
7236
7237 if (ibfd->xvec->flavour != bfd_target_elf_flavour
7238 || obfd->xvec->flavour != bfd_target_elf_flavour)
b34976b6 7239 return TRUE;
252b5132 7240
252b5132
RH
7241 ihdr = &elf_section_data (isec)->this_hdr;
7242 ohdr = &elf_section_data (osec)->this_hdr;
7243
7244 ohdr->sh_entsize = ihdr->sh_entsize;
7245
7246 if (ihdr->sh_type == SHT_SYMTAB
7247 || ihdr->sh_type == SHT_DYNSYM
7248 || ihdr->sh_type == SHT_GNU_verneed
7249 || ihdr->sh_type == SHT_GNU_verdef)
7250 ohdr->sh_info = ihdr->sh_info;
7251
ccd2ec6a
L
7252 return _bfd_elf_init_private_section_data (ibfd, isec, obfd, osec,
7253 NULL);
252b5132
RH
7254}
7255
d0bf826b
AM
7256/* Look at all the SHT_GROUP sections in IBFD, making any adjustments
7257 necessary if we are removing either the SHT_GROUP section or any of
7258 the group member sections. DISCARDED is the value that a section's
7259 output_section has if the section will be discarded, NULL when this
7260 function is called from objcopy, bfd_abs_section_ptr when called
7261 from the linker. */
80fccad2
BW
7262
7263bfd_boolean
d0bf826b 7264_bfd_elf_fixup_group_sections (bfd *ibfd, asection *discarded)
80fccad2 7265{
30288845
AM
7266 asection *isec;
7267
30288845 7268 for (isec = ibfd->sections; isec != NULL; isec = isec->next)
415f38a6 7269 if (elf_section_type (isec) == SHT_GROUP)
30288845
AM
7270 {
7271 asection *first = elf_next_in_group (isec);
7272 asection *s = first;
d0bf826b
AM
7273 bfd_size_type removed = 0;
7274
30288845
AM
7275 while (s != NULL)
7276 {
415f38a6
AM
7277 /* If this member section is being output but the
7278 SHT_GROUP section is not, then clear the group info
7279 set up by _bfd_elf_copy_private_section_data. */
d0bf826b
AM
7280 if (s->output_section != discarded
7281 && isec->output_section == discarded)
30288845
AM
7282 {
7283 elf_section_flags (s->output_section) &= ~SHF_GROUP;
7284 elf_group_name (s->output_section) = NULL;
7285 }
415f38a6
AM
7286 /* Conversely, if the member section is not being output
7287 but the SHT_GROUP section is, then adjust its size. */
d0bf826b
AM
7288 else if (s->output_section == discarded
7289 && isec->output_section != discarded)
7290 removed += 4;
30288845
AM
7291 s = elf_next_in_group (s);
7292 if (s == first)
7293 break;
7294 }
d0bf826b
AM
7295 if (removed != 0)
7296 {
7297 if (discarded != NULL)
7298 {
7299 /* If we've been called for ld -r, then we need to
7300 adjust the input section size. This function may
7301 be called multiple times, so save the original
7302 size. */
7303 if (isec->rawsize == 0)
7304 isec->rawsize = isec->size;
7305 isec->size = isec->rawsize - removed;
7306 }
7307 else
7308 {
7309 /* Adjust the output section size when called from
7310 objcopy. */
7311 isec->output_section->size -= removed;
7312 }
7313 }
30288845
AM
7314 }
7315
80fccad2
BW
7316 return TRUE;
7317}
7318
d0bf826b
AM
7319/* Copy private header information. */
7320
7321bfd_boolean
7322_bfd_elf_copy_private_header_data (bfd *ibfd, bfd *obfd)
7323{
7324 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
7325 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
7326 return TRUE;
7327
7328 /* Copy over private BFD data if it has not already been copied.
7329 This must be done here, rather than in the copy_private_bfd_data
7330 entry point, because the latter is called after the section
7331 contents have been set, which means that the program headers have
7332 already been worked out. */
12bd6957 7333 if (elf_seg_map (obfd) == NULL && elf_tdata (ibfd)->phdr != NULL)
d0bf826b
AM
7334 {
7335 if (! copy_private_bfd_data (ibfd, obfd))
7336 return FALSE;
7337 }
7338
7339 return _bfd_elf_fixup_group_sections (ibfd, NULL);
7340}
7341
252b5132
RH
7342/* Copy private symbol information. If this symbol is in a section
7343 which we did not map into a BFD section, try to map the section
7344 index correctly. We use special macro definitions for the mapped
7345 section indices; these definitions are interpreted by the
7346 swap_out_syms function. */
7347
9ad5cbcf
AM
7348#define MAP_ONESYMTAB (SHN_HIOS + 1)
7349#define MAP_DYNSYMTAB (SHN_HIOS + 2)
7350#define MAP_STRTAB (SHN_HIOS + 3)
7351#define MAP_SHSTRTAB (SHN_HIOS + 4)
7352#define MAP_SYM_SHNDX (SHN_HIOS + 5)
252b5132 7353
b34976b6 7354bfd_boolean
217aa764
AM
7355_bfd_elf_copy_private_symbol_data (bfd *ibfd,
7356 asymbol *isymarg,
7357 bfd *obfd,
7358 asymbol *osymarg)
252b5132
RH
7359{
7360 elf_symbol_type *isym, *osym;
7361
7362 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
7363 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
b34976b6 7364 return TRUE;
252b5132
RH
7365
7366 isym = elf_symbol_from (ibfd, isymarg);
7367 osym = elf_symbol_from (obfd, osymarg);
7368
7369 if (isym != NULL
8424d8f5 7370 && isym->internal_elf_sym.st_shndx != 0
252b5132
RH
7371 && osym != NULL
7372 && bfd_is_abs_section (isym->symbol.section))
7373 {
7374 unsigned int shndx;
7375
7376 shndx = isym->internal_elf_sym.st_shndx;
7377 if (shndx == elf_onesymtab (ibfd))
7378 shndx = MAP_ONESYMTAB;
7379 else if (shndx == elf_dynsymtab (ibfd))
7380 shndx = MAP_DYNSYMTAB;
12bd6957 7381 else if (shndx == elf_strtab_sec (ibfd))
252b5132 7382 shndx = MAP_STRTAB;
12bd6957 7383 else if (shndx == elf_shstrtab_sec (ibfd))
252b5132 7384 shndx = MAP_SHSTRTAB;
6a40cf0c 7385 else if (find_section_in_list (shndx, elf_symtab_shndx_list (ibfd)))
9ad5cbcf 7386 shndx = MAP_SYM_SHNDX;
252b5132
RH
7387 osym->internal_elf_sym.st_shndx = shndx;
7388 }
7389
b34976b6 7390 return TRUE;
252b5132
RH
7391}
7392
7393/* Swap out the symbols. */
7394
b34976b6 7395static bfd_boolean
217aa764 7396swap_out_syms (bfd *abfd,
ef10c3ac 7397 struct elf_strtab_hash **sttp,
217aa764 7398 int relocatable_p)
252b5132 7399{
9c5bfbb7 7400 const struct elf_backend_data *bed;
079e9a2f
AM
7401 int symcount;
7402 asymbol **syms;
ef10c3ac 7403 struct elf_strtab_hash *stt;
079e9a2f 7404 Elf_Internal_Shdr *symtab_hdr;
9ad5cbcf 7405 Elf_Internal_Shdr *symtab_shndx_hdr;
079e9a2f 7406 Elf_Internal_Shdr *symstrtab_hdr;
ef10c3ac 7407 struct elf_sym_strtab *symstrtab;
f075ee0c
AM
7408 bfd_byte *outbound_syms;
7409 bfd_byte *outbound_shndx;
ef10c3ac
L
7410 unsigned long outbound_syms_index;
7411 unsigned long outbound_shndx_index;
079e9a2f 7412 int idx;
12bd6957 7413 unsigned int num_locals;
079e9a2f 7414 bfd_size_type amt;
174fd7f9 7415 bfd_boolean name_local_sections;
252b5132 7416
12bd6957 7417 if (!elf_map_symbols (abfd, &num_locals))
b34976b6 7418 return FALSE;
252b5132 7419
c044fabd 7420 /* Dump out the symtabs. */
ef10c3ac 7421 stt = _bfd_elf_strtab_init ();
079e9a2f 7422 if (stt == NULL)
b34976b6 7423 return FALSE;
252b5132 7424
079e9a2f
AM
7425 bed = get_elf_backend_data (abfd);
7426 symcount = bfd_get_symcount (abfd);
7427 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
7428 symtab_hdr->sh_type = SHT_SYMTAB;
7429 symtab_hdr->sh_entsize = bed->s->sizeof_sym;
7430 symtab_hdr->sh_size = symtab_hdr->sh_entsize * (symcount + 1);
12bd6957 7431 symtab_hdr->sh_info = num_locals + 1;
72de5009 7432 symtab_hdr->sh_addralign = (bfd_vma) 1 << bed->s->log_file_align;
079e9a2f
AM
7433
7434 symstrtab_hdr = &elf_tdata (abfd)->strtab_hdr;
7435 symstrtab_hdr->sh_type = SHT_STRTAB;
7436
ef10c3ac
L
7437 /* Allocate buffer to swap out the .strtab section. */
7438 symstrtab = (struct elf_sym_strtab *) bfd_malloc ((symcount + 1)
7439 * sizeof (*symstrtab));
7440 if (symstrtab == NULL)
7441 {
7442 _bfd_elf_strtab_free (stt);
7443 return FALSE;
7444 }
7445
a50b1753
NC
7446 outbound_syms = (bfd_byte *) bfd_alloc2 (abfd, 1 + symcount,
7447 bed->s->sizeof_sym);
079e9a2f 7448 if (outbound_syms == NULL)
5ed6aba4 7449 {
ef10c3ac
L
7450error_return:
7451 _bfd_elf_strtab_free (stt);
7452 free (symstrtab);
5ed6aba4
NC
7453 return FALSE;
7454 }
217aa764 7455 symtab_hdr->contents = outbound_syms;
ef10c3ac 7456 outbound_syms_index = 0;
252b5132 7457
9ad5cbcf 7458 outbound_shndx = NULL;
ef10c3ac 7459 outbound_shndx_index = 0;
6a40cf0c
NC
7460
7461 if (elf_symtab_shndx_list (abfd))
9ad5cbcf 7462 {
6a40cf0c
NC
7463 symtab_shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
7464 if (symtab_shndx_hdr->sh_name != 0)
7465 {
7466 amt = (bfd_size_type) (1 + symcount) * sizeof (Elf_External_Sym_Shndx);
7467 outbound_shndx = (bfd_byte *)
7468 bfd_zalloc2 (abfd, 1 + symcount, sizeof (Elf_External_Sym_Shndx));
7469 if (outbound_shndx == NULL)
7470 goto error_return;
5ed6aba4 7471
6a40cf0c
NC
7472 symtab_shndx_hdr->contents = outbound_shndx;
7473 symtab_shndx_hdr->sh_type = SHT_SYMTAB_SHNDX;
7474 symtab_shndx_hdr->sh_size = amt;
7475 symtab_shndx_hdr->sh_addralign = sizeof (Elf_External_Sym_Shndx);
7476 symtab_shndx_hdr->sh_entsize = sizeof (Elf_External_Sym_Shndx);
7477 }
7478 /* FIXME: What about any other headers in the list ? */
9ad5cbcf
AM
7479 }
7480
589e6347 7481 /* Now generate the data (for "contents"). */
079e9a2f
AM
7482 {
7483 /* Fill in zeroth symbol and swap it out. */
7484 Elf_Internal_Sym sym;
7485 sym.st_name = 0;
7486 sym.st_value = 0;
7487 sym.st_size = 0;
7488 sym.st_info = 0;
7489 sym.st_other = 0;
7490 sym.st_shndx = SHN_UNDEF;
35fc36a8 7491 sym.st_target_internal = 0;
ef10c3ac
L
7492 symstrtab[0].sym = sym;
7493 symstrtab[0].dest_index = outbound_syms_index;
7494 symstrtab[0].destshndx_index = outbound_shndx_index;
7495 outbound_syms_index++;
9ad5cbcf 7496 if (outbound_shndx != NULL)
ef10c3ac 7497 outbound_shndx_index++;
079e9a2f 7498 }
252b5132 7499
174fd7f9
RS
7500 name_local_sections
7501 = (bed->elf_backend_name_local_section_symbols
7502 && bed->elf_backend_name_local_section_symbols (abfd));
7503
079e9a2f 7504 syms = bfd_get_outsymbols (abfd);
ef10c3ac 7505 for (idx = 0; idx < symcount;)
252b5132 7506 {
252b5132 7507 Elf_Internal_Sym sym;
079e9a2f
AM
7508 bfd_vma value = syms[idx]->value;
7509 elf_symbol_type *type_ptr;
7510 flagword flags = syms[idx]->flags;
7511 int type;
252b5132 7512
174fd7f9
RS
7513 if (!name_local_sections
7514 && (flags & (BSF_SECTION_SYM | BSF_GLOBAL)) == BSF_SECTION_SYM)
079e9a2f
AM
7515 {
7516 /* Local section symbols have no name. */
ef10c3ac 7517 sym.st_name = (unsigned long) -1;
079e9a2f
AM
7518 }
7519 else
7520 {
ef10c3ac
L
7521 /* Call _bfd_elf_strtab_offset after _bfd_elf_strtab_finalize
7522 to get the final offset for st_name. */
7523 sym.st_name
7524 = (unsigned long) _bfd_elf_strtab_add (stt, syms[idx]->name,
7525 FALSE);
079e9a2f 7526 if (sym.st_name == (unsigned long) -1)
ef10c3ac 7527 goto error_return;
079e9a2f 7528 }
252b5132 7529
079e9a2f 7530 type_ptr = elf_symbol_from (abfd, syms[idx]);
252b5132 7531
079e9a2f
AM
7532 if ((flags & BSF_SECTION_SYM) == 0
7533 && bfd_is_com_section (syms[idx]->section))
7534 {
7535 /* ELF common symbols put the alignment into the `value' field,
7536 and the size into the `size' field. This is backwards from
7537 how BFD handles it, so reverse it here. */
7538 sym.st_size = value;
7539 if (type_ptr == NULL
7540 || type_ptr->internal_elf_sym.st_value == 0)
7541 sym.st_value = value >= 16 ? 16 : (1 << bfd_log2 (value));
7542 else
7543 sym.st_value = type_ptr->internal_elf_sym.st_value;
7544 sym.st_shndx = _bfd_elf_section_from_bfd_section
7545 (abfd, syms[idx]->section);
7546 }
7547 else
7548 {
7549 asection *sec = syms[idx]->section;
cb33740c 7550 unsigned int shndx;
252b5132 7551
079e9a2f
AM
7552 if (sec->output_section)
7553 {
7554 value += sec->output_offset;
7555 sec = sec->output_section;
7556 }
589e6347 7557
079e9a2f
AM
7558 /* Don't add in the section vma for relocatable output. */
7559 if (! relocatable_p)
7560 value += sec->vma;
7561 sym.st_value = value;
7562 sym.st_size = type_ptr ? type_ptr->internal_elf_sym.st_size : 0;
7563
7564 if (bfd_is_abs_section (sec)
7565 && type_ptr != NULL
7566 && type_ptr->internal_elf_sym.st_shndx != 0)
7567 {
7568 /* This symbol is in a real ELF section which we did
7569 not create as a BFD section. Undo the mapping done
7570 by copy_private_symbol_data. */
7571 shndx = type_ptr->internal_elf_sym.st_shndx;
7572 switch (shndx)
7573 {
7574 case MAP_ONESYMTAB:
7575 shndx = elf_onesymtab (abfd);
7576 break;
7577 case MAP_DYNSYMTAB:
7578 shndx = elf_dynsymtab (abfd);
7579 break;
7580 case MAP_STRTAB:
12bd6957 7581 shndx = elf_strtab_sec (abfd);
079e9a2f
AM
7582 break;
7583 case MAP_SHSTRTAB:
12bd6957 7584 shndx = elf_shstrtab_sec (abfd);
079e9a2f 7585 break;
9ad5cbcf 7586 case MAP_SYM_SHNDX:
6a40cf0c
NC
7587 if (elf_symtab_shndx_list (abfd))
7588 shndx = elf_symtab_shndx_list (abfd)->ndx;
9ad5cbcf 7589 break;
079e9a2f 7590 default:
15bc576a 7591 shndx = SHN_ABS;
079e9a2f
AM
7592 break;
7593 }
7594 }
7595 else
7596 {
7597 shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
252b5132 7598
cb33740c 7599 if (shndx == SHN_BAD)
079e9a2f
AM
7600 {
7601 asection *sec2;
7602
7603 /* Writing this would be a hell of a lot easier if
7604 we had some decent documentation on bfd, and
7605 knew what to expect of the library, and what to
7606 demand of applications. For example, it
7607 appears that `objcopy' might not set the
7608 section of a symbol to be a section that is
7609 actually in the output file. */
7610 sec2 = bfd_get_section_by_name (abfd, sec->name);
589e6347
NC
7611 if (sec2 == NULL)
7612 {
7613 _bfd_error_handler (_("\
7614Unable to find equivalent output section for symbol '%s' from section '%s'"),
7615 syms[idx]->name ? syms[idx]->name : "<Local sym>",
7616 sec->name);
811072d8 7617 bfd_set_error (bfd_error_invalid_operation);
ef10c3ac 7618 goto error_return;
589e6347 7619 }
811072d8 7620
079e9a2f 7621 shndx = _bfd_elf_section_from_bfd_section (abfd, sec2);
cb33740c 7622 BFD_ASSERT (shndx != SHN_BAD);
079e9a2f
AM
7623 }
7624 }
252b5132 7625
079e9a2f
AM
7626 sym.st_shndx = shndx;
7627 }
252b5132 7628
13ae64f3
JJ
7629 if ((flags & BSF_THREAD_LOCAL) != 0)
7630 type = STT_TLS;
d8045f23
NC
7631 else if ((flags & BSF_GNU_INDIRECT_FUNCTION) != 0)
7632 type = STT_GNU_IFUNC;
13ae64f3 7633 else if ((flags & BSF_FUNCTION) != 0)
079e9a2f
AM
7634 type = STT_FUNC;
7635 else if ((flags & BSF_OBJECT) != 0)
7636 type = STT_OBJECT;
d9352518
DB
7637 else if ((flags & BSF_RELC) != 0)
7638 type = STT_RELC;
7639 else if ((flags & BSF_SRELC) != 0)
7640 type = STT_SRELC;
079e9a2f
AM
7641 else
7642 type = STT_NOTYPE;
252b5132 7643
13ae64f3
JJ
7644 if (syms[idx]->section->flags & SEC_THREAD_LOCAL)
7645 type = STT_TLS;
7646
589e6347 7647 /* Processor-specific types. */
079e9a2f
AM
7648 if (type_ptr != NULL
7649 && bed->elf_backend_get_symbol_type)
7650 type = ((*bed->elf_backend_get_symbol_type)
7651 (&type_ptr->internal_elf_sym, type));
252b5132 7652
079e9a2f
AM
7653 if (flags & BSF_SECTION_SYM)
7654 {
7655 if (flags & BSF_GLOBAL)
7656 sym.st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
7657 else
7658 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION);
7659 }
7660 else if (bfd_is_com_section (syms[idx]->section))
0a40daed 7661 {
b8871f35
L
7662 if (type != STT_TLS)
7663 {
7664 if ((abfd->flags & BFD_CONVERT_ELF_COMMON))
7665 type = ((abfd->flags & BFD_USE_ELF_STT_COMMON)
7666 ? STT_COMMON : STT_OBJECT);
7667 else
7668 type = ((flags & BSF_ELF_COMMON) != 0
7669 ? STT_COMMON : STT_OBJECT);
7670 }
7671 sym.st_info = ELF_ST_INFO (STB_GLOBAL, type);
0a40daed 7672 }
079e9a2f
AM
7673 else if (bfd_is_und_section (syms[idx]->section))
7674 sym.st_info = ELF_ST_INFO (((flags & BSF_WEAK)
7675 ? STB_WEAK
7676 : STB_GLOBAL),
7677 type);
7678 else if (flags & BSF_FILE)
7679 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FILE);
7680 else
7681 {
7682 int bind = STB_LOCAL;
252b5132 7683
079e9a2f
AM
7684 if (flags & BSF_LOCAL)
7685 bind = STB_LOCAL;
3e7a7d11
NC
7686 else if (flags & BSF_GNU_UNIQUE)
7687 bind = STB_GNU_UNIQUE;
079e9a2f
AM
7688 else if (flags & BSF_WEAK)
7689 bind = STB_WEAK;
7690 else if (flags & BSF_GLOBAL)
7691 bind = STB_GLOBAL;
252b5132 7692
079e9a2f
AM
7693 sym.st_info = ELF_ST_INFO (bind, type);
7694 }
252b5132 7695
079e9a2f 7696 if (type_ptr != NULL)
35fc36a8
RS
7697 {
7698 sym.st_other = type_ptr->internal_elf_sym.st_other;
7699 sym.st_target_internal
7700 = type_ptr->internal_elf_sym.st_target_internal;
7701 }
079e9a2f 7702 else
35fc36a8
RS
7703 {
7704 sym.st_other = 0;
7705 sym.st_target_internal = 0;
7706 }
252b5132 7707
ef10c3ac
L
7708 idx++;
7709 symstrtab[idx].sym = sym;
7710 symstrtab[idx].dest_index = outbound_syms_index;
7711 symstrtab[idx].destshndx_index = outbound_shndx_index;
7712
7713 outbound_syms_index++;
9ad5cbcf 7714 if (outbound_shndx != NULL)
ef10c3ac
L
7715 outbound_shndx_index++;
7716 }
7717
7718 /* Finalize the .strtab section. */
7719 _bfd_elf_strtab_finalize (stt);
7720
7721 /* Swap out the .strtab section. */
7722 for (idx = 0; idx <= symcount; idx++)
7723 {
7724 struct elf_sym_strtab *elfsym = &symstrtab[idx];
7725 if (elfsym->sym.st_name == (unsigned long) -1)
7726 elfsym->sym.st_name = 0;
7727 else
7728 elfsym->sym.st_name = _bfd_elf_strtab_offset (stt,
7729 elfsym->sym.st_name);
7730 bed->s->swap_symbol_out (abfd, &elfsym->sym,
7731 (outbound_syms
7732 + (elfsym->dest_index
7733 * bed->s->sizeof_sym)),
7734 (outbound_shndx
7735 + (elfsym->destshndx_index
7736 * sizeof (Elf_External_Sym_Shndx))));
079e9a2f 7737 }
ef10c3ac 7738 free (symstrtab);
252b5132 7739
079e9a2f 7740 *sttp = stt;
ef10c3ac 7741 symstrtab_hdr->sh_size = _bfd_elf_strtab_size (stt);
079e9a2f 7742 symstrtab_hdr->sh_type = SHT_STRTAB;
84865015 7743 symstrtab_hdr->sh_flags = bed->elf_strtab_flags;
079e9a2f
AM
7744 symstrtab_hdr->sh_addr = 0;
7745 symstrtab_hdr->sh_entsize = 0;
7746 symstrtab_hdr->sh_link = 0;
7747 symstrtab_hdr->sh_info = 0;
7748 symstrtab_hdr->sh_addralign = 1;
252b5132 7749
b34976b6 7750 return TRUE;
252b5132
RH
7751}
7752
7753/* Return the number of bytes required to hold the symtab vector.
7754
7755 Note that we base it on the count plus 1, since we will null terminate
7756 the vector allocated based on this size. However, the ELF symbol table
7757 always has a dummy entry as symbol #0, so it ends up even. */
7758
7759long
217aa764 7760_bfd_elf_get_symtab_upper_bound (bfd *abfd)
252b5132
RH
7761{
7762 long symcount;
7763 long symtab_size;
7764 Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->symtab_hdr;
7765
7766 symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
b99d1833
AM
7767 symtab_size = (symcount + 1) * (sizeof (asymbol *));
7768 if (symcount > 0)
7769 symtab_size -= sizeof (asymbol *);
252b5132
RH
7770
7771 return symtab_size;
7772}
7773
7774long
217aa764 7775_bfd_elf_get_dynamic_symtab_upper_bound (bfd *abfd)
252b5132
RH
7776{
7777 long symcount;
7778 long symtab_size;
7779 Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->dynsymtab_hdr;
7780
7781 if (elf_dynsymtab (abfd) == 0)
7782 {
7783 bfd_set_error (bfd_error_invalid_operation);
7784 return -1;
7785 }
7786
7787 symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
b99d1833
AM
7788 symtab_size = (symcount + 1) * (sizeof (asymbol *));
7789 if (symcount > 0)
7790 symtab_size -= sizeof (asymbol *);
252b5132
RH
7791
7792 return symtab_size;
7793}
7794
7795long
217aa764
AM
7796_bfd_elf_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
7797 sec_ptr asect)
252b5132
RH
7798{
7799 return (asect->reloc_count + 1) * sizeof (arelent *);
7800}
7801
7802/* Canonicalize the relocs. */
7803
7804long
217aa764
AM
7805_bfd_elf_canonicalize_reloc (bfd *abfd,
7806 sec_ptr section,
7807 arelent **relptr,
7808 asymbol **symbols)
252b5132
RH
7809{
7810 arelent *tblptr;
7811 unsigned int i;
9c5bfbb7 7812 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 7813
b34976b6 7814 if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
252b5132
RH
7815 return -1;
7816
7817 tblptr = section->relocation;
7818 for (i = 0; i < section->reloc_count; i++)
7819 *relptr++ = tblptr++;
7820
7821 *relptr = NULL;
7822
7823 return section->reloc_count;
7824}
7825
7826long
6cee3f79 7827_bfd_elf_canonicalize_symtab (bfd *abfd, asymbol **allocation)
252b5132 7828{
9c5bfbb7 7829 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
217aa764 7830 long symcount = bed->s->slurp_symbol_table (abfd, allocation, FALSE);
252b5132
RH
7831
7832 if (symcount >= 0)
7833 bfd_get_symcount (abfd) = symcount;
7834 return symcount;
7835}
7836
7837long
217aa764
AM
7838_bfd_elf_canonicalize_dynamic_symtab (bfd *abfd,
7839 asymbol **allocation)
252b5132 7840{
9c5bfbb7 7841 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
217aa764 7842 long symcount = bed->s->slurp_symbol_table (abfd, allocation, TRUE);
1f70368c
DJ
7843
7844 if (symcount >= 0)
7845 bfd_get_dynamic_symcount (abfd) = symcount;
7846 return symcount;
252b5132
RH
7847}
7848
8615f3f2
AM
7849/* Return the size required for the dynamic reloc entries. Any loadable
7850 section that was actually installed in the BFD, and has type SHT_REL
7851 or SHT_RELA, and uses the dynamic symbol table, is considered to be a
7852 dynamic reloc section. */
252b5132
RH
7853
7854long
217aa764 7855_bfd_elf_get_dynamic_reloc_upper_bound (bfd *abfd)
252b5132
RH
7856{
7857 long ret;
7858 asection *s;
7859
7860 if (elf_dynsymtab (abfd) == 0)
7861 {
7862 bfd_set_error (bfd_error_invalid_operation);
7863 return -1;
7864 }
7865
7866 ret = sizeof (arelent *);
7867 for (s = abfd->sections; s != NULL; s = s->next)
266b05cf 7868 if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
252b5132
RH
7869 && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
7870 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
eea6121a 7871 ret += ((s->size / elf_section_data (s)->this_hdr.sh_entsize)
252b5132
RH
7872 * sizeof (arelent *));
7873
7874 return ret;
7875}
7876
8615f3f2
AM
7877/* Canonicalize the dynamic relocation entries. Note that we return the
7878 dynamic relocations as a single block, although they are actually
7879 associated with particular sections; the interface, which was
7880 designed for SunOS style shared libraries, expects that there is only
7881 one set of dynamic relocs. Any loadable section that was actually
7882 installed in the BFD, and has type SHT_REL or SHT_RELA, and uses the
7883 dynamic symbol table, is considered to be a dynamic reloc section. */
252b5132
RH
7884
7885long
217aa764
AM
7886_bfd_elf_canonicalize_dynamic_reloc (bfd *abfd,
7887 arelent **storage,
7888 asymbol **syms)
252b5132 7889{
217aa764 7890 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
252b5132
RH
7891 asection *s;
7892 long ret;
7893
7894 if (elf_dynsymtab (abfd) == 0)
7895 {
7896 bfd_set_error (bfd_error_invalid_operation);
7897 return -1;
7898 }
7899
7900 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
7901 ret = 0;
7902 for (s = abfd->sections; s != NULL; s = s->next)
7903 {
266b05cf 7904 if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
252b5132
RH
7905 && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
7906 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
7907 {
7908 arelent *p;
7909 long count, i;
7910
b34976b6 7911 if (! (*slurp_relocs) (abfd, s, syms, TRUE))
252b5132 7912 return -1;
eea6121a 7913 count = s->size / elf_section_data (s)->this_hdr.sh_entsize;
252b5132
RH
7914 p = s->relocation;
7915 for (i = 0; i < count; i++)
7916 *storage++ = p++;
7917 ret += count;
7918 }
7919 }
7920
7921 *storage = NULL;
7922
7923 return ret;
7924}
7925\f
7926/* Read in the version information. */
7927
b34976b6 7928bfd_boolean
fc0e6df6 7929_bfd_elf_slurp_version_tables (bfd *abfd, bfd_boolean default_imported_symver)
252b5132
RH
7930{
7931 bfd_byte *contents = NULL;
fc0e6df6
PB
7932 unsigned int freeidx = 0;
7933
7934 if (elf_dynverref (abfd) != 0)
7935 {
7936 Elf_Internal_Shdr *hdr;
7937 Elf_External_Verneed *everneed;
7938 Elf_Internal_Verneed *iverneed;
7939 unsigned int i;
d0fb9a8d 7940 bfd_byte *contents_end;
fc0e6df6
PB
7941
7942 hdr = &elf_tdata (abfd)->dynverref_hdr;
7943
601a03ba 7944 if (hdr->sh_info == 0 || hdr->sh_size < sizeof (Elf_External_Verneed))
d0fb9a8d 7945 {
601a03ba
AM
7946error_return_bad_verref:
7947 (*_bfd_error_handler)
7948 (_("%B: .gnu.version_r invalid entry"), abfd);
7949 bfd_set_error (bfd_error_bad_value);
d0fb9a8d
JJ
7950error_return_verref:
7951 elf_tdata (abfd)->verref = NULL;
7952 elf_tdata (abfd)->cverrefs = 0;
7953 goto error_return;
7954 }
601a03ba
AM
7955
7956 contents = (bfd_byte *) bfd_malloc (hdr->sh_size);
7957 if (contents == NULL)
7958 goto error_return_verref;
7959
fc0e6df6
PB
7960 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
7961 || bfd_bread (contents, hdr->sh_size, abfd) != hdr->sh_size)
d0fb9a8d 7962 goto error_return_verref;
fc0e6df6 7963
601a03ba
AM
7964 elf_tdata (abfd)->verref = (Elf_Internal_Verneed *)
7965 bfd_zalloc2 (abfd, hdr->sh_info, sizeof (Elf_Internal_Verneed));
7966
7967 if (elf_tdata (abfd)->verref == NULL)
d0fb9a8d
JJ
7968 goto error_return_verref;
7969
7970 BFD_ASSERT (sizeof (Elf_External_Verneed)
7971 == sizeof (Elf_External_Vernaux));
7972 contents_end = contents + hdr->sh_size - sizeof (Elf_External_Verneed);
fc0e6df6
PB
7973 everneed = (Elf_External_Verneed *) contents;
7974 iverneed = elf_tdata (abfd)->verref;
7975 for (i = 0; i < hdr->sh_info; i++, iverneed++)
7976 {
7977 Elf_External_Vernaux *evernaux;
7978 Elf_Internal_Vernaux *ivernaux;
7979 unsigned int j;
7980
7981 _bfd_elf_swap_verneed_in (abfd, everneed, iverneed);
7982
7983 iverneed->vn_bfd = abfd;
7984
7985 iverneed->vn_filename =
7986 bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
7987 iverneed->vn_file);
7988 if (iverneed->vn_filename == NULL)
601a03ba 7989 goto error_return_bad_verref;
fc0e6df6 7990
d0fb9a8d
JJ
7991 if (iverneed->vn_cnt == 0)
7992 iverneed->vn_auxptr = NULL;
7993 else
7994 {
a50b1753
NC
7995 iverneed->vn_auxptr = (struct elf_internal_vernaux *)
7996 bfd_alloc2 (abfd, iverneed->vn_cnt,
7997 sizeof (Elf_Internal_Vernaux));
d0fb9a8d
JJ
7998 if (iverneed->vn_auxptr == NULL)
7999 goto error_return_verref;
8000 }
8001
8002 if (iverneed->vn_aux
8003 > (size_t) (contents_end - (bfd_byte *) everneed))
601a03ba 8004 goto error_return_bad_verref;
fc0e6df6
PB
8005
8006 evernaux = ((Elf_External_Vernaux *)
8007 ((bfd_byte *) everneed + iverneed->vn_aux));
8008 ivernaux = iverneed->vn_auxptr;
8009 for (j = 0; j < iverneed->vn_cnt; j++, ivernaux++)
8010 {
8011 _bfd_elf_swap_vernaux_in (abfd, evernaux, ivernaux);
8012
8013 ivernaux->vna_nodename =
8014 bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
8015 ivernaux->vna_name);
8016 if (ivernaux->vna_nodename == NULL)
601a03ba 8017 goto error_return_bad_verref;
fc0e6df6 8018
25ff461f
AM
8019 if (ivernaux->vna_other > freeidx)
8020 freeidx = ivernaux->vna_other;
8021
8022 ivernaux->vna_nextptr = NULL;
8023 if (ivernaux->vna_next == 0)
8024 {
8025 iverneed->vn_cnt = j + 1;
8026 break;
8027 }
fc0e6df6
PB
8028 if (j + 1 < iverneed->vn_cnt)
8029 ivernaux->vna_nextptr = ivernaux + 1;
fc0e6df6 8030
d0fb9a8d
JJ
8031 if (ivernaux->vna_next
8032 > (size_t) (contents_end - (bfd_byte *) evernaux))
601a03ba 8033 goto error_return_bad_verref;
d0fb9a8d 8034
fc0e6df6
PB
8035 evernaux = ((Elf_External_Vernaux *)
8036 ((bfd_byte *) evernaux + ivernaux->vna_next));
fc0e6df6
PB
8037 }
8038
25ff461f
AM
8039 iverneed->vn_nextref = NULL;
8040 if (iverneed->vn_next == 0)
8041 break;
fc0e6df6
PB
8042 if (i + 1 < hdr->sh_info)
8043 iverneed->vn_nextref = iverneed + 1;
fc0e6df6 8044
d0fb9a8d
JJ
8045 if (iverneed->vn_next
8046 > (size_t) (contents_end - (bfd_byte *) everneed))
601a03ba 8047 goto error_return_bad_verref;
d0fb9a8d 8048
fc0e6df6
PB
8049 everneed = ((Elf_External_Verneed *)
8050 ((bfd_byte *) everneed + iverneed->vn_next));
8051 }
25ff461f 8052 elf_tdata (abfd)->cverrefs = i;
fc0e6df6
PB
8053
8054 free (contents);
8055 contents = NULL;
8056 }
252b5132
RH
8057
8058 if (elf_dynverdef (abfd) != 0)
8059 {
8060 Elf_Internal_Shdr *hdr;
8061 Elf_External_Verdef *everdef;
8062 Elf_Internal_Verdef *iverdef;
f631889e
UD
8063 Elf_Internal_Verdef *iverdefarr;
8064 Elf_Internal_Verdef iverdefmem;
252b5132 8065 unsigned int i;
062e2358 8066 unsigned int maxidx;
d0fb9a8d 8067 bfd_byte *contents_end_def, *contents_end_aux;
252b5132
RH
8068
8069 hdr = &elf_tdata (abfd)->dynverdef_hdr;
8070
601a03ba
AM
8071 if (hdr->sh_info == 0 || hdr->sh_size < sizeof (Elf_External_Verdef))
8072 {
8073 error_return_bad_verdef:
8074 (*_bfd_error_handler)
8075 (_("%B: .gnu.version_d invalid entry"), abfd);
8076 bfd_set_error (bfd_error_bad_value);
8077 error_return_verdef:
8078 elf_tdata (abfd)->verdef = NULL;
8079 elf_tdata (abfd)->cverdefs = 0;
8080 goto error_return;
8081 }
8082
a50b1753 8083 contents = (bfd_byte *) bfd_malloc (hdr->sh_size);
252b5132 8084 if (contents == NULL)
601a03ba 8085 goto error_return_verdef;
252b5132 8086 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
217aa764 8087 || bfd_bread (contents, hdr->sh_size, abfd) != hdr->sh_size)
601a03ba 8088 goto error_return_verdef;
d0fb9a8d
JJ
8089
8090 BFD_ASSERT (sizeof (Elf_External_Verdef)
8091 >= sizeof (Elf_External_Verdaux));
8092 contents_end_def = contents + hdr->sh_size
8093 - sizeof (Elf_External_Verdef);
8094 contents_end_aux = contents + hdr->sh_size
8095 - sizeof (Elf_External_Verdaux);
8096
f631889e
UD
8097 /* We know the number of entries in the section but not the maximum
8098 index. Therefore we have to run through all entries and find
8099 the maximum. */
252b5132 8100 everdef = (Elf_External_Verdef *) contents;
f631889e
UD
8101 maxidx = 0;
8102 for (i = 0; i < hdr->sh_info; ++i)
8103 {
8104 _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
8105
601a03ba
AM
8106 if ((iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION)) == 0)
8107 goto error_return_bad_verdef;
062e2358
AM
8108 if ((iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION)) > maxidx)
8109 maxidx = iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION);
f631889e 8110
25ff461f
AM
8111 if (iverdefmem.vd_next == 0)
8112 break;
8113
d0fb9a8d
JJ
8114 if (iverdefmem.vd_next
8115 > (size_t) (contents_end_def - (bfd_byte *) everdef))
601a03ba 8116 goto error_return_bad_verdef;
d0fb9a8d 8117
f631889e
UD
8118 everdef = ((Elf_External_Verdef *)
8119 ((bfd_byte *) everdef + iverdefmem.vd_next));
8120 }
8121
fc0e6df6
PB
8122 if (default_imported_symver)
8123 {
8124 if (freeidx > maxidx)
8125 maxidx = ++freeidx;
8126 else
8127 freeidx = ++maxidx;
8128 }
201159ec 8129
601a03ba
AM
8130 elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *)
8131 bfd_zalloc2 (abfd, maxidx, sizeof (Elf_Internal_Verdef));
f631889e 8132 if (elf_tdata (abfd)->verdef == NULL)
601a03ba 8133 goto error_return_verdef;
f631889e
UD
8134
8135 elf_tdata (abfd)->cverdefs = maxidx;
8136
8137 everdef = (Elf_External_Verdef *) contents;
8138 iverdefarr = elf_tdata (abfd)->verdef;
8139 for (i = 0; i < hdr->sh_info; i++)
252b5132
RH
8140 {
8141 Elf_External_Verdaux *everdaux;
8142 Elf_Internal_Verdaux *iverdaux;
8143 unsigned int j;
8144
f631889e
UD
8145 _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
8146
d0fb9a8d 8147 if ((iverdefmem.vd_ndx & VERSYM_VERSION) == 0)
601a03ba 8148 goto error_return_bad_verdef;
d0fb9a8d 8149
f631889e 8150 iverdef = &iverdefarr[(iverdefmem.vd_ndx & VERSYM_VERSION) - 1];
595bce75 8151 memcpy (iverdef, &iverdefmem, offsetof (Elf_Internal_Verdef, vd_bfd));
252b5132
RH
8152
8153 iverdef->vd_bfd = abfd;
8154
d0fb9a8d
JJ
8155 if (iverdef->vd_cnt == 0)
8156 iverdef->vd_auxptr = NULL;
8157 else
8158 {
a50b1753
NC
8159 iverdef->vd_auxptr = (struct elf_internal_verdaux *)
8160 bfd_alloc2 (abfd, iverdef->vd_cnt,
8161 sizeof (Elf_Internal_Verdaux));
d0fb9a8d
JJ
8162 if (iverdef->vd_auxptr == NULL)
8163 goto error_return_verdef;
8164 }
8165
8166 if (iverdef->vd_aux
8167 > (size_t) (contents_end_aux - (bfd_byte *) everdef))
601a03ba 8168 goto error_return_bad_verdef;
252b5132
RH
8169
8170 everdaux = ((Elf_External_Verdaux *)
8171 ((bfd_byte *) everdef + iverdef->vd_aux));
8172 iverdaux = iverdef->vd_auxptr;
8173 for (j = 0; j < iverdef->vd_cnt; j++, iverdaux++)
8174 {
8175 _bfd_elf_swap_verdaux_in (abfd, everdaux, iverdaux);
8176
8177 iverdaux->vda_nodename =
8178 bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
8179 iverdaux->vda_name);
8180 if (iverdaux->vda_nodename == NULL)
601a03ba 8181 goto error_return_bad_verdef;
252b5132 8182
25ff461f
AM
8183 iverdaux->vda_nextptr = NULL;
8184 if (iverdaux->vda_next == 0)
8185 {
8186 iverdef->vd_cnt = j + 1;
8187 break;
8188 }
252b5132
RH
8189 if (j + 1 < iverdef->vd_cnt)
8190 iverdaux->vda_nextptr = iverdaux + 1;
252b5132 8191
d0fb9a8d
JJ
8192 if (iverdaux->vda_next
8193 > (size_t) (contents_end_aux - (bfd_byte *) everdaux))
601a03ba 8194 goto error_return_bad_verdef;
d0fb9a8d 8195
252b5132
RH
8196 everdaux = ((Elf_External_Verdaux *)
8197 ((bfd_byte *) everdaux + iverdaux->vda_next));
8198 }
8199
595bce75 8200 iverdef->vd_nodename = NULL;
d0fb9a8d
JJ
8201 if (iverdef->vd_cnt)
8202 iverdef->vd_nodename = iverdef->vd_auxptr->vda_nodename;
252b5132 8203
25ff461f
AM
8204 iverdef->vd_nextdef = NULL;
8205 if (iverdef->vd_next == 0)
8206 break;
d0fb9a8d 8207 if ((size_t) (iverdef - iverdefarr) + 1 < maxidx)
252b5132 8208 iverdef->vd_nextdef = iverdef + 1;
252b5132
RH
8209
8210 everdef = ((Elf_External_Verdef *)
8211 ((bfd_byte *) everdef + iverdef->vd_next));
8212 }
8213
8214 free (contents);
8215 contents = NULL;
8216 }
fc0e6df6 8217 else if (default_imported_symver)
252b5132 8218 {
fc0e6df6
PB
8219 if (freeidx < 3)
8220 freeidx = 3;
8221 else
8222 freeidx++;
252b5132 8223
a50b1753
NC
8224 elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *)
8225 bfd_zalloc2 (abfd, freeidx, sizeof (Elf_Internal_Verdef));
fc0e6df6 8226 if (elf_tdata (abfd)->verdef == NULL)
252b5132
RH
8227 goto error_return;
8228
fc0e6df6
PB
8229 elf_tdata (abfd)->cverdefs = freeidx;
8230 }
252b5132 8231
fc0e6df6
PB
8232 /* Create a default version based on the soname. */
8233 if (default_imported_symver)
8234 {
8235 Elf_Internal_Verdef *iverdef;
8236 Elf_Internal_Verdaux *iverdaux;
252b5132 8237
5bb3703f 8238 iverdef = &elf_tdata (abfd)->verdef[freeidx - 1];
252b5132 8239
fc0e6df6
PB
8240 iverdef->vd_version = VER_DEF_CURRENT;
8241 iverdef->vd_flags = 0;
8242 iverdef->vd_ndx = freeidx;
8243 iverdef->vd_cnt = 1;
252b5132 8244
fc0e6df6 8245 iverdef->vd_bfd = abfd;
252b5132 8246
fc0e6df6
PB
8247 iverdef->vd_nodename = bfd_elf_get_dt_soname (abfd);
8248 if (iverdef->vd_nodename == NULL)
d0fb9a8d 8249 goto error_return_verdef;
fc0e6df6 8250 iverdef->vd_nextdef = NULL;
601a03ba
AM
8251 iverdef->vd_auxptr = ((struct elf_internal_verdaux *)
8252 bfd_zalloc (abfd, sizeof (Elf_Internal_Verdaux)));
d0fb9a8d
JJ
8253 if (iverdef->vd_auxptr == NULL)
8254 goto error_return_verdef;
252b5132 8255
fc0e6df6
PB
8256 iverdaux = iverdef->vd_auxptr;
8257 iverdaux->vda_nodename = iverdef->vd_nodename;
252b5132
RH
8258 }
8259
b34976b6 8260 return TRUE;
252b5132
RH
8261
8262 error_return:
5ed6aba4 8263 if (contents != NULL)
252b5132 8264 free (contents);
b34976b6 8265 return FALSE;
252b5132
RH
8266}
8267\f
8268asymbol *
217aa764 8269_bfd_elf_make_empty_symbol (bfd *abfd)
252b5132
RH
8270{
8271 elf_symbol_type *newsym;
8272
201159ec 8273 newsym = (elf_symbol_type *) bfd_zalloc (abfd, sizeof * newsym);
252b5132
RH
8274 if (!newsym)
8275 return NULL;
201159ec
NC
8276 newsym->symbol.the_bfd = abfd;
8277 return &newsym->symbol;
252b5132
RH
8278}
8279
8280void
217aa764
AM
8281_bfd_elf_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
8282 asymbol *symbol,
8283 symbol_info *ret)
252b5132
RH
8284{
8285 bfd_symbol_info (symbol, ret);
8286}
8287
8288/* Return whether a symbol name implies a local symbol. Most targets
8289 use this function for the is_local_label_name entry point, but some
8290 override it. */
8291
b34976b6 8292bfd_boolean
217aa764
AM
8293_bfd_elf_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
8294 const char *name)
252b5132
RH
8295{
8296 /* Normal local symbols start with ``.L''. */
8297 if (name[0] == '.' && name[1] == 'L')
b34976b6 8298 return TRUE;
252b5132
RH
8299
8300 /* At least some SVR4 compilers (e.g., UnixWare 2.1 cc) generate
8301 DWARF debugging symbols starting with ``..''. */
8302 if (name[0] == '.' && name[1] == '.')
b34976b6 8303 return TRUE;
252b5132
RH
8304
8305 /* gcc will sometimes generate symbols beginning with ``_.L_'' when
8306 emitting DWARF debugging output. I suspect this is actually a
8307 small bug in gcc (it calls ASM_OUTPUT_LABEL when it should call
8308 ASM_GENERATE_INTERNAL_LABEL, and this causes the leading
8309 underscore to be emitted on some ELF targets). For ease of use,
8310 we treat such symbols as local. */
8311 if (name[0] == '_' && name[1] == '.' && name[2] == 'L' && name[3] == '_')
b34976b6 8312 return TRUE;
252b5132 8313
b1fa9dd6
NC
8314 /* Treat assembler generated fake symbols, dollar local labels and
8315 forward-backward labels (aka local labels) as locals.
8316 These labels have the form:
8317
8318 L0^A.* (fake symbols)
8319
8320 [.]?L[0123456789]+{^A|^B}[0123456789]* (local labels)
8321
8322 Versions which start with .L will have already been matched above,
8323 so we only need to match the rest. */
8324 if (name[0] == 'L' && ISDIGIT (name[1]))
8325 {
8326 bfd_boolean ret = FALSE;
8327 const char * p;
8328 char c;
8329
8330 for (p = name + 2; (c = *p); p++)
8331 {
8332 if (c == 1 || c == 2)
8333 {
8334 if (c == 1 && p == name + 2)
8335 /* A fake symbol. */
8336 return TRUE;
8337
8338 /* FIXME: We are being paranoid here and treating symbols like
8339 L0^Bfoo as if there were non-local, on the grounds that the
8340 assembler will never generate them. But can any symbol
8341 containing an ASCII value in the range 1-31 ever be anything
8342 other than some kind of local ? */
8343 ret = TRUE;
8344 }
8345
8346 if (! ISDIGIT (c))
8347 {
8348 ret = FALSE;
8349 break;
8350 }
8351 }
8352 return ret;
8353 }
ffa54770 8354
b34976b6 8355 return FALSE;
252b5132
RH
8356}
8357
8358alent *
217aa764
AM
8359_bfd_elf_get_lineno (bfd *abfd ATTRIBUTE_UNUSED,
8360 asymbol *symbol ATTRIBUTE_UNUSED)
252b5132
RH
8361{
8362 abort ();
8363 return NULL;
8364}
8365
b34976b6 8366bfd_boolean
217aa764
AM
8367_bfd_elf_set_arch_mach (bfd *abfd,
8368 enum bfd_architecture arch,
8369 unsigned long machine)
252b5132
RH
8370{
8371 /* If this isn't the right architecture for this backend, and this
8372 isn't the generic backend, fail. */
8373 if (arch != get_elf_backend_data (abfd)->arch
8374 && arch != bfd_arch_unknown
8375 && get_elf_backend_data (abfd)->arch != bfd_arch_unknown)
b34976b6 8376 return FALSE;
252b5132
RH
8377
8378 return bfd_default_set_arch_mach (abfd, arch, machine);
8379}
8380
d1fad7c6
NC
8381/* Find the nearest line to a particular section and offset,
8382 for error reporting. */
8383
b34976b6 8384bfd_boolean
217aa764 8385_bfd_elf_find_nearest_line (bfd *abfd,
217aa764 8386 asymbol **symbols,
fb167eb2 8387 asection *section,
217aa764
AM
8388 bfd_vma offset,
8389 const char **filename_ptr,
8390 const char **functionname_ptr,
fb167eb2
AM
8391 unsigned int *line_ptr,
8392 unsigned int *discriminator_ptr)
d1fad7c6 8393{
b34976b6 8394 bfd_boolean found;
d1fad7c6 8395
fb167eb2 8396 if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
4e8a9624 8397 filename_ptr, functionname_ptr,
fb167eb2
AM
8398 line_ptr, discriminator_ptr,
8399 dwarf_debug_sections, 0,
e00e8198
AM
8400 &elf_tdata (abfd)->dwarf2_find_line_info)
8401 || _bfd_dwarf1_find_nearest_line (abfd, symbols, section, offset,
8402 filename_ptr, functionname_ptr,
8403 line_ptr))
d1fad7c6
NC
8404 {
8405 if (!*functionname_ptr)
e00e8198
AM
8406 _bfd_elf_find_function (abfd, symbols, section, offset,
8407 *filename_ptr ? NULL : filename_ptr,
8408 functionname_ptr);
b34976b6 8409 return TRUE;
d1fad7c6
NC
8410 }
8411
8412 if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
4e8a9624
AM
8413 &found, filename_ptr,
8414 functionname_ptr, line_ptr,
8415 &elf_tdata (abfd)->line_info))
b34976b6 8416 return FALSE;
dc43ada5 8417 if (found && (*functionname_ptr || *line_ptr))
b34976b6 8418 return TRUE;
d1fad7c6
NC
8419
8420 if (symbols == NULL)
b34976b6 8421 return FALSE;
d1fad7c6 8422
e00e8198
AM
8423 if (! _bfd_elf_find_function (abfd, symbols, section, offset,
8424 filename_ptr, functionname_ptr))
b34976b6 8425 return FALSE;
d1fad7c6 8426
252b5132 8427 *line_ptr = 0;
b34976b6 8428 return TRUE;
252b5132
RH
8429}
8430
5420f73d
L
8431/* Find the line for a symbol. */
8432
8433bfd_boolean
8434_bfd_elf_find_line (bfd *abfd, asymbol **symbols, asymbol *symbol,
8435 const char **filename_ptr, unsigned int *line_ptr)
9b8d1a36 8436{
fb167eb2
AM
8437 return _bfd_dwarf2_find_nearest_line (abfd, symbols, symbol, NULL, 0,
8438 filename_ptr, NULL, line_ptr, NULL,
8439 dwarf_debug_sections, 0,
8440 &elf_tdata (abfd)->dwarf2_find_line_info);
5420f73d
L
8441}
8442
4ab527b0
FF
8443/* After a call to bfd_find_nearest_line, successive calls to
8444 bfd_find_inliner_info can be used to get source information about
8445 each level of function inlining that terminated at the address
8446 passed to bfd_find_nearest_line. Currently this is only supported
8447 for DWARF2 with appropriate DWARF3 extensions. */
8448
8449bfd_boolean
8450_bfd_elf_find_inliner_info (bfd *abfd,
8451 const char **filename_ptr,
8452 const char **functionname_ptr,
8453 unsigned int *line_ptr)
8454{
8455 bfd_boolean found;
8456 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
8457 functionname_ptr, line_ptr,
8458 & elf_tdata (abfd)->dwarf2_find_line_info);
8459 return found;
8460}
8461
252b5132 8462int
a6b96beb 8463_bfd_elf_sizeof_headers (bfd *abfd, struct bfd_link_info *info)
252b5132 8464{
8ded5a0f
AM
8465 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
8466 int ret = bed->s->sizeof_ehdr;
252b5132 8467
0e1862bb 8468 if (!bfd_link_relocatable (info))
8ded5a0f 8469 {
12bd6957 8470 bfd_size_type phdr_size = elf_program_header_size (abfd);
8ded5a0f 8471
62d7a5f6
AM
8472 if (phdr_size == (bfd_size_type) -1)
8473 {
8474 struct elf_segment_map *m;
8475
8476 phdr_size = 0;
12bd6957 8477 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
62d7a5f6 8478 phdr_size += bed->s->sizeof_phdr;
8ded5a0f 8479
62d7a5f6
AM
8480 if (phdr_size == 0)
8481 phdr_size = get_program_header_size (abfd, info);
8482 }
8ded5a0f 8483
12bd6957 8484 elf_program_header_size (abfd) = phdr_size;
8ded5a0f
AM
8485 ret += phdr_size;
8486 }
8487
252b5132
RH
8488 return ret;
8489}
8490
b34976b6 8491bfd_boolean
217aa764
AM
8492_bfd_elf_set_section_contents (bfd *abfd,
8493 sec_ptr section,
0f867abe 8494 const void *location,
217aa764
AM
8495 file_ptr offset,
8496 bfd_size_type count)
252b5132
RH
8497{
8498 Elf_Internal_Shdr *hdr;
1b6aeedb 8499 file_ptr pos;
252b5132
RH
8500
8501 if (! abfd->output_has_begun
217aa764 8502 && ! _bfd_elf_compute_section_file_positions (abfd, NULL))
b34976b6 8503 return FALSE;
252b5132 8504
0ce398f1
L
8505 if (!count)
8506 return TRUE;
8507
252b5132 8508 hdr = &elf_section_data (section)->this_hdr;
0ce398f1
L
8509 if (hdr->sh_offset == (file_ptr) -1)
8510 {
8511 /* We must compress this section. Write output to the buffer. */
8512 unsigned char *contents = hdr->contents;
8513 if ((offset + count) > hdr->sh_size
8514 || (section->flags & SEC_ELF_COMPRESS) == 0
8515 || contents == NULL)
8516 abort ();
8517 memcpy (contents + offset, location, count);
8518 return TRUE;
8519 }
dc810e39
AM
8520 pos = hdr->sh_offset + offset;
8521 if (bfd_seek (abfd, pos, SEEK_SET) != 0
8522 || bfd_bwrite (location, count, abfd) != count)
b34976b6 8523 return FALSE;
252b5132 8524
b34976b6 8525 return TRUE;
252b5132
RH
8526}
8527
8528void
217aa764
AM
8529_bfd_elf_no_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
8530 arelent *cache_ptr ATTRIBUTE_UNUSED,
8531 Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
252b5132
RH
8532{
8533 abort ();
8534}
8535
252b5132
RH
8536/* Try to convert a non-ELF reloc into an ELF one. */
8537
b34976b6 8538bfd_boolean
217aa764 8539_bfd_elf_validate_reloc (bfd *abfd, arelent *areloc)
252b5132 8540{
c044fabd 8541 /* Check whether we really have an ELF howto. */
252b5132
RH
8542
8543 if ((*areloc->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec)
8544 {
8545 bfd_reloc_code_real_type code;
8546 reloc_howto_type *howto;
8547
8548 /* Alien reloc: Try to determine its type to replace it with an
c044fabd 8549 equivalent ELF reloc. */
252b5132
RH
8550
8551 if (areloc->howto->pc_relative)
8552 {
8553 switch (areloc->howto->bitsize)
8554 {
8555 case 8:
8556 code = BFD_RELOC_8_PCREL;
8557 break;
8558 case 12:
8559 code = BFD_RELOC_12_PCREL;
8560 break;
8561 case 16:
8562 code = BFD_RELOC_16_PCREL;
8563 break;
8564 case 24:
8565 code = BFD_RELOC_24_PCREL;
8566 break;
8567 case 32:
8568 code = BFD_RELOC_32_PCREL;
8569 break;
8570 case 64:
8571 code = BFD_RELOC_64_PCREL;
8572 break;
8573 default:
8574 goto fail;
8575 }
8576
8577 howto = bfd_reloc_type_lookup (abfd, code);
8578
8579 if (areloc->howto->pcrel_offset != howto->pcrel_offset)
8580 {
8581 if (howto->pcrel_offset)
8582 areloc->addend += areloc->address;
8583 else
8584 areloc->addend -= areloc->address; /* addend is unsigned!! */
8585 }
8586 }
8587 else
8588 {
8589 switch (areloc->howto->bitsize)
8590 {
8591 case 8:
8592 code = BFD_RELOC_8;
8593 break;
8594 case 14:
8595 code = BFD_RELOC_14;
8596 break;
8597 case 16:
8598 code = BFD_RELOC_16;
8599 break;
8600 case 26:
8601 code = BFD_RELOC_26;
8602 break;
8603 case 32:
8604 code = BFD_RELOC_32;
8605 break;
8606 case 64:
8607 code = BFD_RELOC_64;
8608 break;
8609 default:
8610 goto fail;
8611 }
8612
8613 howto = bfd_reloc_type_lookup (abfd, code);
8614 }
8615
8616 if (howto)
8617 areloc->howto = howto;
8618 else
8619 goto fail;
8620 }
8621
b34976b6 8622 return TRUE;
252b5132
RH
8623
8624 fail:
8625 (*_bfd_error_handler)
d003868e
AM
8626 (_("%B: unsupported relocation type %s"),
8627 abfd, areloc->howto->name);
252b5132 8628 bfd_set_error (bfd_error_bad_value);
b34976b6 8629 return FALSE;
252b5132
RH
8630}
8631
b34976b6 8632bfd_boolean
217aa764 8633_bfd_elf_close_and_cleanup (bfd *abfd)
252b5132 8634{
d9071b0c
TG
8635 struct elf_obj_tdata *tdata = elf_tdata (abfd);
8636 if (bfd_get_format (abfd) == bfd_object && tdata != NULL)
252b5132 8637 {
c0355132 8638 if (elf_tdata (abfd)->o != NULL && elf_shstrtab (abfd) != NULL)
2b0f7ef9 8639 _bfd_elf_strtab_free (elf_shstrtab (abfd));
d9071b0c 8640 _bfd_dwarf2_cleanup_debug_info (abfd, &tdata->dwarf2_find_line_info);
252b5132
RH
8641 }
8642
8643 return _bfd_generic_close_and_cleanup (abfd);
8644}
8645
8646/* For Rel targets, we encode meaningful data for BFD_RELOC_VTABLE_ENTRY
8647 in the relocation's offset. Thus we cannot allow any sort of sanity
8648 range-checking to interfere. There is nothing else to do in processing
8649 this reloc. */
8650
8651bfd_reloc_status_type
217aa764
AM
8652_bfd_elf_rel_vtable_reloc_fn
8653 (bfd *abfd ATTRIBUTE_UNUSED, arelent *re ATTRIBUTE_UNUSED,
fc0a2244 8654 struct bfd_symbol *symbol ATTRIBUTE_UNUSED,
217aa764
AM
8655 void *data ATTRIBUTE_UNUSED, asection *is ATTRIBUTE_UNUSED,
8656 bfd *obfd ATTRIBUTE_UNUSED, char **errmsg ATTRIBUTE_UNUSED)
252b5132
RH
8657{
8658 return bfd_reloc_ok;
8659}
252b5132
RH
8660\f
8661/* Elf core file support. Much of this only works on native
8662 toolchains, since we rely on knowing the
8663 machine-dependent procfs structure in order to pick
c044fabd 8664 out details about the corefile. */
252b5132
RH
8665
8666#ifdef HAVE_SYS_PROCFS_H
16231b7b
DG
8667/* Needed for new procfs interface on sparc-solaris. */
8668# define _STRUCTURED_PROC 1
252b5132
RH
8669# include <sys/procfs.h>
8670#endif
8671
261b8d08
PA
8672/* Return a PID that identifies a "thread" for threaded cores, or the
8673 PID of the main process for non-threaded cores. */
252b5132
RH
8674
8675static int
217aa764 8676elfcore_make_pid (bfd *abfd)
252b5132 8677{
261b8d08
PA
8678 int pid;
8679
228e534f 8680 pid = elf_tdata (abfd)->core->lwpid;
261b8d08 8681 if (pid == 0)
228e534f 8682 pid = elf_tdata (abfd)->core->pid;
261b8d08
PA
8683
8684 return pid;
252b5132
RH
8685}
8686
252b5132
RH
8687/* If there isn't a section called NAME, make one, using
8688 data from SECT. Note, this function will generate a
8689 reference to NAME, so you shouldn't deallocate or
c044fabd 8690 overwrite it. */
252b5132 8691
b34976b6 8692static bfd_boolean
217aa764 8693elfcore_maybe_make_sect (bfd *abfd, char *name, asection *sect)
252b5132 8694{
c044fabd 8695 asection *sect2;
252b5132
RH
8696
8697 if (bfd_get_section_by_name (abfd, name) != NULL)
b34976b6 8698 return TRUE;
252b5132 8699
117ed4f8 8700 sect2 = bfd_make_section_with_flags (abfd, name, sect->flags);
252b5132 8701 if (sect2 == NULL)
b34976b6 8702 return FALSE;
252b5132 8703
eea6121a 8704 sect2->size = sect->size;
252b5132 8705 sect2->filepos = sect->filepos;
252b5132 8706 sect2->alignment_power = sect->alignment_power;
b34976b6 8707 return TRUE;
252b5132
RH
8708}
8709
bb0082d6
AM
8710/* Create a pseudosection containing SIZE bytes at FILEPOS. This
8711 actually creates up to two pseudosections:
8712 - For the single-threaded case, a section named NAME, unless
8713 such a section already exists.
8714 - For the multi-threaded case, a section named "NAME/PID", where
8715 PID is elfcore_make_pid (abfd).
8716 Both pseudosections have identical contents. */
b34976b6 8717bfd_boolean
217aa764
AM
8718_bfd_elfcore_make_pseudosection (bfd *abfd,
8719 char *name,
8720 size_t size,
8721 ufile_ptr filepos)
bb0082d6
AM
8722{
8723 char buf[100];
8724 char *threaded_name;
d4c88bbb 8725 size_t len;
bb0082d6
AM
8726 asection *sect;
8727
8728 /* Build the section name. */
8729
8730 sprintf (buf, "%s/%d", name, elfcore_make_pid (abfd));
d4c88bbb 8731 len = strlen (buf) + 1;
a50b1753 8732 threaded_name = (char *) bfd_alloc (abfd, len);
bb0082d6 8733 if (threaded_name == NULL)
b34976b6 8734 return FALSE;
d4c88bbb 8735 memcpy (threaded_name, buf, len);
bb0082d6 8736
117ed4f8
AM
8737 sect = bfd_make_section_anyway_with_flags (abfd, threaded_name,
8738 SEC_HAS_CONTENTS);
bb0082d6 8739 if (sect == NULL)
b34976b6 8740 return FALSE;
eea6121a 8741 sect->size = size;
bb0082d6 8742 sect->filepos = filepos;
bb0082d6
AM
8743 sect->alignment_power = 2;
8744
936e320b 8745 return elfcore_maybe_make_sect (abfd, name, sect);
bb0082d6
AM
8746}
8747
252b5132 8748/* prstatus_t exists on:
4a938328 8749 solaris 2.5+
252b5132
RH
8750 linux 2.[01] + glibc
8751 unixware 4.2
8752*/
8753
8754#if defined (HAVE_PRSTATUS_T)
a7b97311 8755
b34976b6 8756static bfd_boolean
217aa764 8757elfcore_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132 8758{
eea6121a 8759 size_t size;
7ee38065 8760 int offset;
252b5132 8761
4a938328
MS
8762 if (note->descsz == sizeof (prstatus_t))
8763 {
8764 prstatus_t prstat;
252b5132 8765
eea6121a 8766 size = sizeof (prstat.pr_reg);
7ee38065 8767 offset = offsetof (prstatus_t, pr_reg);
4a938328 8768 memcpy (&prstat, note->descdata, sizeof (prstat));
252b5132 8769
fa49d224
NC
8770 /* Do not overwrite the core signal if it
8771 has already been set by another thread. */
228e534f
AM
8772 if (elf_tdata (abfd)->core->signal == 0)
8773 elf_tdata (abfd)->core->signal = prstat.pr_cursig;
8774 if (elf_tdata (abfd)->core->pid == 0)
8775 elf_tdata (abfd)->core->pid = prstat.pr_pid;
252b5132 8776
4a938328
MS
8777 /* pr_who exists on:
8778 solaris 2.5+
8779 unixware 4.2
8780 pr_who doesn't exist on:
8781 linux 2.[01]
8782 */
252b5132 8783#if defined (HAVE_PRSTATUS_T_PR_WHO)
228e534f 8784 elf_tdata (abfd)->core->lwpid = prstat.pr_who;
261b8d08 8785#else
228e534f 8786 elf_tdata (abfd)->core->lwpid = prstat.pr_pid;
252b5132 8787#endif
4a938328 8788 }
7ee38065 8789#if defined (HAVE_PRSTATUS32_T)
4a938328
MS
8790 else if (note->descsz == sizeof (prstatus32_t))
8791 {
8792 /* 64-bit host, 32-bit corefile */
8793 prstatus32_t prstat;
8794
eea6121a 8795 size = sizeof (prstat.pr_reg);
7ee38065 8796 offset = offsetof (prstatus32_t, pr_reg);
4a938328
MS
8797 memcpy (&prstat, note->descdata, sizeof (prstat));
8798
fa49d224
NC
8799 /* Do not overwrite the core signal if it
8800 has already been set by another thread. */
228e534f
AM
8801 if (elf_tdata (abfd)->core->signal == 0)
8802 elf_tdata (abfd)->core->signal = prstat.pr_cursig;
8803 if (elf_tdata (abfd)->core->pid == 0)
8804 elf_tdata (abfd)->core->pid = prstat.pr_pid;
4a938328
MS
8805
8806 /* pr_who exists on:
8807 solaris 2.5+
8808 unixware 4.2
8809 pr_who doesn't exist on:
8810 linux 2.[01]
8811 */
7ee38065 8812#if defined (HAVE_PRSTATUS32_T_PR_WHO)
228e534f 8813 elf_tdata (abfd)->core->lwpid = prstat.pr_who;
261b8d08 8814#else
228e534f 8815 elf_tdata (abfd)->core->lwpid = prstat.pr_pid;
4a938328
MS
8816#endif
8817 }
7ee38065 8818#endif /* HAVE_PRSTATUS32_T */
4a938328
MS
8819 else
8820 {
8821 /* Fail - we don't know how to handle any other
8822 note size (ie. data object type). */
b34976b6 8823 return TRUE;
4a938328 8824 }
252b5132 8825
bb0082d6 8826 /* Make a ".reg/999" section and a ".reg" section. */
936e320b 8827 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 8828 size, note->descpos + offset);
252b5132
RH
8829}
8830#endif /* defined (HAVE_PRSTATUS_T) */
8831
bb0082d6 8832/* Create a pseudosection containing the exact contents of NOTE. */
b34976b6 8833static bfd_boolean
217aa764
AM
8834elfcore_make_note_pseudosection (bfd *abfd,
8835 char *name,
8836 Elf_Internal_Note *note)
252b5132 8837{
936e320b
AM
8838 return _bfd_elfcore_make_pseudosection (abfd, name,
8839 note->descsz, note->descpos);
252b5132
RH
8840}
8841
ff08c6bb
JB
8842/* There isn't a consistent prfpregset_t across platforms,
8843 but it doesn't matter, because we don't have to pick this
c044fabd
KH
8844 data structure apart. */
8845
b34976b6 8846static bfd_boolean
217aa764 8847elfcore_grok_prfpreg (bfd *abfd, Elf_Internal_Note *note)
ff08c6bb
JB
8848{
8849 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
8850}
8851
ff08c6bb 8852/* Linux dumps the Intel SSE regs in a note named "LINUX" with a note
971d4640 8853 type of NT_PRXFPREG. Just include the whole note's contents
ff08c6bb 8854 literally. */
c044fabd 8855
b34976b6 8856static bfd_boolean
217aa764 8857elfcore_grok_prxfpreg (bfd *abfd, Elf_Internal_Note *note)
ff08c6bb
JB
8858{
8859 return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
8860}
8861
4339cae0
L
8862/* Linux dumps the Intel XSAVE extended state in a note named "LINUX"
8863 with a note type of NT_X86_XSTATE. Just include the whole note's
8864 contents literally. */
8865
8866static bfd_boolean
8867elfcore_grok_xstatereg (bfd *abfd, Elf_Internal_Note *note)
8868{
8869 return elfcore_make_note_pseudosection (abfd, ".reg-xstate", note);
8870}
8871
97753bd5
AM
8872static bfd_boolean
8873elfcore_grok_ppc_vmx (bfd *abfd, Elf_Internal_Note *note)
8874{
8875 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-vmx", note);
8876}
8877
89eeb0bc
LM
8878static bfd_boolean
8879elfcore_grok_ppc_vsx (bfd *abfd, Elf_Internal_Note *note)
8880{
8881 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-vsx", note);
8882}
97753bd5 8883
0675e188
UW
8884static bfd_boolean
8885elfcore_grok_s390_high_gprs (bfd *abfd, Elf_Internal_Note *note)
8886{
8887 return elfcore_make_note_pseudosection (abfd, ".reg-s390-high-gprs", note);
8888}
8889
d7eeb400
MS
8890static bfd_boolean
8891elfcore_grok_s390_timer (bfd *abfd, Elf_Internal_Note *note)
8892{
8893 return elfcore_make_note_pseudosection (abfd, ".reg-s390-timer", note);
8894}
8895
8896static bfd_boolean
8897elfcore_grok_s390_todcmp (bfd *abfd, Elf_Internal_Note *note)
8898{
8899 return elfcore_make_note_pseudosection (abfd, ".reg-s390-todcmp", note);
8900}
8901
8902static bfd_boolean
8903elfcore_grok_s390_todpreg (bfd *abfd, Elf_Internal_Note *note)
8904{
8905 return elfcore_make_note_pseudosection (abfd, ".reg-s390-todpreg", note);
8906}
8907
8908static bfd_boolean
8909elfcore_grok_s390_ctrs (bfd *abfd, Elf_Internal_Note *note)
8910{
8911 return elfcore_make_note_pseudosection (abfd, ".reg-s390-ctrs", note);
8912}
8913
8914static bfd_boolean
8915elfcore_grok_s390_prefix (bfd *abfd, Elf_Internal_Note *note)
8916{
8917 return elfcore_make_note_pseudosection (abfd, ".reg-s390-prefix", note);
8918}
8919
355b81d9
UW
8920static bfd_boolean
8921elfcore_grok_s390_last_break (bfd *abfd, Elf_Internal_Note *note)
8922{
8923 return elfcore_make_note_pseudosection (abfd, ".reg-s390-last-break", note);
8924}
8925
8926static bfd_boolean
8927elfcore_grok_s390_system_call (bfd *abfd, Elf_Internal_Note *note)
8928{
8929 return elfcore_make_note_pseudosection (abfd, ".reg-s390-system-call", note);
8930}
8931
abb3f6cc
NC
8932static bfd_boolean
8933elfcore_grok_s390_tdb (bfd *abfd, Elf_Internal_Note *note)
8934{
8935 return elfcore_make_note_pseudosection (abfd, ".reg-s390-tdb", note);
8936}
8937
4ef9f41a
AA
8938static bfd_boolean
8939elfcore_grok_s390_vxrs_low (bfd *abfd, Elf_Internal_Note *note)
8940{
8941 return elfcore_make_note_pseudosection (abfd, ".reg-s390-vxrs-low", note);
8942}
8943
8944static bfd_boolean
8945elfcore_grok_s390_vxrs_high (bfd *abfd, Elf_Internal_Note *note)
8946{
8947 return elfcore_make_note_pseudosection (abfd, ".reg-s390-vxrs-high", note);
8948}
8949
faa9a424
UW
8950static bfd_boolean
8951elfcore_grok_arm_vfp (bfd *abfd, Elf_Internal_Note *note)
8952{
8953 return elfcore_make_note_pseudosection (abfd, ".reg-arm-vfp", note);
8954}
8955
652451f8
YZ
8956static bfd_boolean
8957elfcore_grok_aarch_tls (bfd *abfd, Elf_Internal_Note *note)
8958{
8959 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-tls", note);
8960}
8961
8962static bfd_boolean
8963elfcore_grok_aarch_hw_break (bfd *abfd, Elf_Internal_Note *note)
8964{
8965 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-hw-break", note);
8966}
8967
8968static bfd_boolean
8969elfcore_grok_aarch_hw_watch (bfd *abfd, Elf_Internal_Note *note)
8970{
8971 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-hw-watch", note);
8972}
8973
252b5132 8974#if defined (HAVE_PRPSINFO_T)
4a938328 8975typedef prpsinfo_t elfcore_psinfo_t;
7ee38065 8976#if defined (HAVE_PRPSINFO32_T) /* Sparc64 cross Sparc32 */
4a938328
MS
8977typedef prpsinfo32_t elfcore_psinfo32_t;
8978#endif
252b5132
RH
8979#endif
8980
8981#if defined (HAVE_PSINFO_T)
4a938328 8982typedef psinfo_t elfcore_psinfo_t;
7ee38065 8983#if defined (HAVE_PSINFO32_T) /* Sparc64 cross Sparc32 */
4a938328
MS
8984typedef psinfo32_t elfcore_psinfo32_t;
8985#endif
252b5132
RH
8986#endif
8987
252b5132
RH
8988/* return a malloc'ed copy of a string at START which is at
8989 most MAX bytes long, possibly without a terminating '\0'.
c044fabd 8990 the copy will always have a terminating '\0'. */
252b5132 8991
936e320b 8992char *
217aa764 8993_bfd_elfcore_strndup (bfd *abfd, char *start, size_t max)
252b5132 8994{
dc810e39 8995 char *dups;
a50b1753 8996 char *end = (char *) memchr (start, '\0', max);
dc810e39 8997 size_t len;
252b5132
RH
8998
8999 if (end == NULL)
9000 len = max;
9001 else
9002 len = end - start;
9003
a50b1753 9004 dups = (char *) bfd_alloc (abfd, len + 1);
dc810e39 9005 if (dups == NULL)
252b5132
RH
9006 return NULL;
9007
dc810e39
AM
9008 memcpy (dups, start, len);
9009 dups[len] = '\0';
252b5132 9010
dc810e39 9011 return dups;
252b5132
RH
9012}
9013
bb0082d6 9014#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
b34976b6 9015static bfd_boolean
217aa764 9016elfcore_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
252b5132 9017{
4a938328
MS
9018 if (note->descsz == sizeof (elfcore_psinfo_t))
9019 {
9020 elfcore_psinfo_t psinfo;
252b5132 9021
7ee38065 9022 memcpy (&psinfo, note->descdata, sizeof (psinfo));
252b5132 9023
335e41d4 9024#if defined (HAVE_PSINFO_T_PR_PID) || defined (HAVE_PRPSINFO_T_PR_PID)
228e534f 9025 elf_tdata (abfd)->core->pid = psinfo.pr_pid;
335e41d4 9026#endif
228e534f 9027 elf_tdata (abfd)->core->program
936e320b
AM
9028 = _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
9029 sizeof (psinfo.pr_fname));
252b5132 9030
228e534f 9031 elf_tdata (abfd)->core->command
936e320b
AM
9032 = _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
9033 sizeof (psinfo.pr_psargs));
4a938328 9034 }
7ee38065 9035#if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
4a938328
MS
9036 else if (note->descsz == sizeof (elfcore_psinfo32_t))
9037 {
9038 /* 64-bit host, 32-bit corefile */
9039 elfcore_psinfo32_t psinfo;
9040
7ee38065 9041 memcpy (&psinfo, note->descdata, sizeof (psinfo));
252b5132 9042
335e41d4 9043#if defined (HAVE_PSINFO32_T_PR_PID) || defined (HAVE_PRPSINFO32_T_PR_PID)
228e534f 9044 elf_tdata (abfd)->core->pid = psinfo.pr_pid;
335e41d4 9045#endif
228e534f 9046 elf_tdata (abfd)->core->program
936e320b
AM
9047 = _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
9048 sizeof (psinfo.pr_fname));
4a938328 9049
228e534f 9050 elf_tdata (abfd)->core->command
936e320b
AM
9051 = _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
9052 sizeof (psinfo.pr_psargs));
4a938328
MS
9053 }
9054#endif
9055
9056 else
9057 {
9058 /* Fail - we don't know how to handle any other
9059 note size (ie. data object type). */
b34976b6 9060 return TRUE;
4a938328 9061 }
252b5132
RH
9062
9063 /* Note that for some reason, a spurious space is tacked
9064 onto the end of the args in some (at least one anyway)
c044fabd 9065 implementations, so strip it off if it exists. */
252b5132
RH
9066
9067 {
228e534f 9068 char *command = elf_tdata (abfd)->core->command;
252b5132
RH
9069 int n = strlen (command);
9070
9071 if (0 < n && command[n - 1] == ' ')
9072 command[n - 1] = '\0';
9073 }
9074
b34976b6 9075 return TRUE;
252b5132
RH
9076}
9077#endif /* defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T) */
9078
252b5132 9079#if defined (HAVE_PSTATUS_T)
b34976b6 9080static bfd_boolean
217aa764 9081elfcore_grok_pstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132 9082{
f572a39d
AM
9083 if (note->descsz == sizeof (pstatus_t)
9084#if defined (HAVE_PXSTATUS_T)
9085 || note->descsz == sizeof (pxstatus_t)
9086#endif
9087 )
4a938328
MS
9088 {
9089 pstatus_t pstat;
252b5132 9090
4a938328 9091 memcpy (&pstat, note->descdata, sizeof (pstat));
252b5132 9092
228e534f 9093 elf_tdata (abfd)->core->pid = pstat.pr_pid;
4a938328 9094 }
7ee38065 9095#if defined (HAVE_PSTATUS32_T)
4a938328
MS
9096 else if (note->descsz == sizeof (pstatus32_t))
9097 {
9098 /* 64-bit host, 32-bit corefile */
9099 pstatus32_t pstat;
252b5132 9100
4a938328 9101 memcpy (&pstat, note->descdata, sizeof (pstat));
252b5132 9102
228e534f 9103 elf_tdata (abfd)->core->pid = pstat.pr_pid;
4a938328
MS
9104 }
9105#endif
252b5132
RH
9106 /* Could grab some more details from the "representative"
9107 lwpstatus_t in pstat.pr_lwp, but we'll catch it all in an
c044fabd 9108 NT_LWPSTATUS note, presumably. */
252b5132 9109
b34976b6 9110 return TRUE;
252b5132
RH
9111}
9112#endif /* defined (HAVE_PSTATUS_T) */
9113
252b5132 9114#if defined (HAVE_LWPSTATUS_T)
b34976b6 9115static bfd_boolean
217aa764 9116elfcore_grok_lwpstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132
RH
9117{
9118 lwpstatus_t lwpstat;
9119 char buf[100];
c044fabd 9120 char *name;
d4c88bbb 9121 size_t len;
c044fabd 9122 asection *sect;
252b5132 9123
f572a39d
AM
9124 if (note->descsz != sizeof (lwpstat)
9125#if defined (HAVE_LWPXSTATUS_T)
9126 && note->descsz != sizeof (lwpxstatus_t)
9127#endif
9128 )
b34976b6 9129 return TRUE;
252b5132
RH
9130
9131 memcpy (&lwpstat, note->descdata, sizeof (lwpstat));
9132
228e534f 9133 elf_tdata (abfd)->core->lwpid = lwpstat.pr_lwpid;
a1504221
JB
9134 /* Do not overwrite the core signal if it has already been set by
9135 another thread. */
228e534f
AM
9136 if (elf_tdata (abfd)->core->signal == 0)
9137 elf_tdata (abfd)->core->signal = lwpstat.pr_cursig;
252b5132 9138
c044fabd 9139 /* Make a ".reg/999" section. */
252b5132
RH
9140
9141 sprintf (buf, ".reg/%d", elfcore_make_pid (abfd));
d4c88bbb 9142 len = strlen (buf) + 1;
217aa764 9143 name = bfd_alloc (abfd, len);
252b5132 9144 if (name == NULL)
b34976b6 9145 return FALSE;
d4c88bbb 9146 memcpy (name, buf, len);
252b5132 9147
117ed4f8 9148 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
252b5132 9149 if (sect == NULL)
b34976b6 9150 return FALSE;
252b5132
RH
9151
9152#if defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
eea6121a 9153 sect->size = sizeof (lwpstat.pr_context.uc_mcontext.gregs);
252b5132
RH
9154 sect->filepos = note->descpos
9155 + offsetof (lwpstatus_t, pr_context.uc_mcontext.gregs);
9156#endif
9157
9158#if defined (HAVE_LWPSTATUS_T_PR_REG)
eea6121a 9159 sect->size = sizeof (lwpstat.pr_reg);
252b5132
RH
9160 sect->filepos = note->descpos + offsetof (lwpstatus_t, pr_reg);
9161#endif
9162
252b5132
RH
9163 sect->alignment_power = 2;
9164
9165 if (!elfcore_maybe_make_sect (abfd, ".reg", sect))
b34976b6 9166 return FALSE;
252b5132
RH
9167
9168 /* Make a ".reg2/999" section */
9169
9170 sprintf (buf, ".reg2/%d", elfcore_make_pid (abfd));
d4c88bbb 9171 len = strlen (buf) + 1;
217aa764 9172 name = bfd_alloc (abfd, len);
252b5132 9173 if (name == NULL)
b34976b6 9174 return FALSE;
d4c88bbb 9175 memcpy (name, buf, len);
252b5132 9176
117ed4f8 9177 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
252b5132 9178 if (sect == NULL)
b34976b6 9179 return FALSE;
252b5132
RH
9180
9181#if defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
eea6121a 9182 sect->size = sizeof (lwpstat.pr_context.uc_mcontext.fpregs);
252b5132
RH
9183 sect->filepos = note->descpos
9184 + offsetof (lwpstatus_t, pr_context.uc_mcontext.fpregs);
9185#endif
9186
9187#if defined (HAVE_LWPSTATUS_T_PR_FPREG)
eea6121a 9188 sect->size = sizeof (lwpstat.pr_fpreg);
252b5132
RH
9189 sect->filepos = note->descpos + offsetof (lwpstatus_t, pr_fpreg);
9190#endif
9191
252b5132
RH
9192 sect->alignment_power = 2;
9193
936e320b 9194 return elfcore_maybe_make_sect (abfd, ".reg2", sect);
252b5132
RH
9195}
9196#endif /* defined (HAVE_LWPSTATUS_T) */
9197
b34976b6 9198static bfd_boolean
217aa764 9199elfcore_grok_win32pstatus (bfd *abfd, Elf_Internal_Note *note)
16e9c715
NC
9200{
9201 char buf[30];
c044fabd 9202 char *name;
d4c88bbb 9203 size_t len;
c044fabd 9204 asection *sect;
4a6636fb
PA
9205 int type;
9206 int is_active_thread;
9207 bfd_vma base_addr;
16e9c715 9208
4a6636fb 9209 if (note->descsz < 728)
b34976b6 9210 return TRUE;
16e9c715 9211
4a6636fb
PA
9212 if (! CONST_STRNEQ (note->namedata, "win32"))
9213 return TRUE;
9214
9215 type = bfd_get_32 (abfd, note->descdata);
c044fabd 9216
4a6636fb 9217 switch (type)
16e9c715 9218 {
4a6636fb 9219 case 1 /* NOTE_INFO_PROCESS */:
228e534f 9220 /* FIXME: need to add ->core->command. */
4a6636fb 9221 /* process_info.pid */
228e534f 9222 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 8);
4a6636fb 9223 /* process_info.signal */
228e534f 9224 elf_tdata (abfd)->core->signal = bfd_get_32 (abfd, note->descdata + 12);
c044fabd 9225 break;
16e9c715 9226
4a6636fb 9227 case 2 /* NOTE_INFO_THREAD */:
16e9c715 9228 /* Make a ".reg/999" section. */
4a6636fb
PA
9229 /* thread_info.tid */
9230 sprintf (buf, ".reg/%ld", (long) bfd_get_32 (abfd, note->descdata + 8));
c044fabd 9231
d4c88bbb 9232 len = strlen (buf) + 1;
a50b1753 9233 name = (char *) bfd_alloc (abfd, len);
16e9c715 9234 if (name == NULL)
b34976b6 9235 return FALSE;
c044fabd 9236
d4c88bbb 9237 memcpy (name, buf, len);
16e9c715 9238
117ed4f8 9239 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
16e9c715 9240 if (sect == NULL)
b34976b6 9241 return FALSE;
c044fabd 9242
4a6636fb
PA
9243 /* sizeof (thread_info.thread_context) */
9244 sect->size = 716;
9245 /* offsetof (thread_info.thread_context) */
9246 sect->filepos = note->descpos + 12;
16e9c715
NC
9247 sect->alignment_power = 2;
9248
4a6636fb
PA
9249 /* thread_info.is_active_thread */
9250 is_active_thread = bfd_get_32 (abfd, note->descdata + 8);
9251
9252 if (is_active_thread)
16e9c715 9253 if (! elfcore_maybe_make_sect (abfd, ".reg", sect))
b34976b6 9254 return FALSE;
16e9c715
NC
9255 break;
9256
4a6636fb 9257 case 3 /* NOTE_INFO_MODULE */:
16e9c715 9258 /* Make a ".module/xxxxxxxx" section. */
4a6636fb
PA
9259 /* module_info.base_address */
9260 base_addr = bfd_get_32 (abfd, note->descdata + 4);
0af1713e 9261 sprintf (buf, ".module/%08lx", (unsigned long) base_addr);
c044fabd 9262
d4c88bbb 9263 len = strlen (buf) + 1;
a50b1753 9264 name = (char *) bfd_alloc (abfd, len);
16e9c715 9265 if (name == NULL)
b34976b6 9266 return FALSE;
c044fabd 9267
d4c88bbb 9268 memcpy (name, buf, len);
252b5132 9269
117ed4f8 9270 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
c044fabd 9271
16e9c715 9272 if (sect == NULL)
b34976b6 9273 return FALSE;
c044fabd 9274
eea6121a 9275 sect->size = note->descsz;
16e9c715 9276 sect->filepos = note->descpos;
16e9c715
NC
9277 sect->alignment_power = 2;
9278 break;
9279
9280 default:
b34976b6 9281 return TRUE;
16e9c715
NC
9282 }
9283
b34976b6 9284 return TRUE;
16e9c715 9285}
252b5132 9286
b34976b6 9287static bfd_boolean
217aa764 9288elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
252b5132 9289{
9c5bfbb7 9290 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
bb0082d6 9291
252b5132
RH
9292 switch (note->type)
9293 {
9294 default:
b34976b6 9295 return TRUE;
252b5132 9296
252b5132 9297 case NT_PRSTATUS:
bb0082d6
AM
9298 if (bed->elf_backend_grok_prstatus)
9299 if ((*bed->elf_backend_grok_prstatus) (abfd, note))
b34976b6 9300 return TRUE;
bb0082d6 9301#if defined (HAVE_PRSTATUS_T)
252b5132 9302 return elfcore_grok_prstatus (abfd, note);
bb0082d6 9303#else
b34976b6 9304 return TRUE;
252b5132
RH
9305#endif
9306
9307#if defined (HAVE_PSTATUS_T)
9308 case NT_PSTATUS:
9309 return elfcore_grok_pstatus (abfd, note);
9310#endif
9311
9312#if defined (HAVE_LWPSTATUS_T)
9313 case NT_LWPSTATUS:
9314 return elfcore_grok_lwpstatus (abfd, note);
9315#endif
9316
9317 case NT_FPREGSET: /* FIXME: rename to NT_PRFPREG */
9318 return elfcore_grok_prfpreg (abfd, note);
9319
c044fabd 9320 case NT_WIN32PSTATUS:
16e9c715 9321 return elfcore_grok_win32pstatus (abfd, note);
16e9c715 9322
c044fabd 9323 case NT_PRXFPREG: /* Linux SSE extension */
e377ab71
MK
9324 if (note->namesz == 6
9325 && strcmp (note->namedata, "LINUX") == 0)
ff08c6bb
JB
9326 return elfcore_grok_prxfpreg (abfd, note);
9327 else
b34976b6 9328 return TRUE;
ff08c6bb 9329
4339cae0
L
9330 case NT_X86_XSTATE: /* Linux XSAVE extension */
9331 if (note->namesz == 6
9332 && strcmp (note->namedata, "LINUX") == 0)
9333 return elfcore_grok_xstatereg (abfd, note);
97de3545
JB
9334 else if (note->namesz == 8
9335 && strcmp (note->namedata, "FreeBSD") == 0)
9336 return elfcore_grok_xstatereg (abfd, note);
4339cae0
L
9337 else
9338 return TRUE;
9339
97753bd5
AM
9340 case NT_PPC_VMX:
9341 if (note->namesz == 6
9342 && strcmp (note->namedata, "LINUX") == 0)
9343 return elfcore_grok_ppc_vmx (abfd, note);
9344 else
9345 return TRUE;
9346
89eeb0bc
LM
9347 case NT_PPC_VSX:
9348 if (note->namesz == 6
9349 && strcmp (note->namedata, "LINUX") == 0)
9350 return elfcore_grok_ppc_vsx (abfd, note);
9351 else
9352 return TRUE;
9353
0675e188
UW
9354 case NT_S390_HIGH_GPRS:
9355 if (note->namesz == 6
9356 && strcmp (note->namedata, "LINUX") == 0)
9357 return elfcore_grok_s390_high_gprs (abfd, note);
9358 else
9359 return TRUE;
9360
d7eeb400
MS
9361 case NT_S390_TIMER:
9362 if (note->namesz == 6
9363 && strcmp (note->namedata, "LINUX") == 0)
9364 return elfcore_grok_s390_timer (abfd, note);
9365 else
9366 return TRUE;
9367
9368 case NT_S390_TODCMP:
9369 if (note->namesz == 6
9370 && strcmp (note->namedata, "LINUX") == 0)
9371 return elfcore_grok_s390_todcmp (abfd, note);
9372 else
9373 return TRUE;
9374
9375 case NT_S390_TODPREG:
9376 if (note->namesz == 6
9377 && strcmp (note->namedata, "LINUX") == 0)
9378 return elfcore_grok_s390_todpreg (abfd, note);
9379 else
9380 return TRUE;
9381
9382 case NT_S390_CTRS:
9383 if (note->namesz == 6
9384 && strcmp (note->namedata, "LINUX") == 0)
9385 return elfcore_grok_s390_ctrs (abfd, note);
9386 else
9387 return TRUE;
9388
9389 case NT_S390_PREFIX:
9390 if (note->namesz == 6
9391 && strcmp (note->namedata, "LINUX") == 0)
9392 return elfcore_grok_s390_prefix (abfd, note);
9393 else
9394 return TRUE;
9395
355b81d9
UW
9396 case NT_S390_LAST_BREAK:
9397 if (note->namesz == 6
9398 && strcmp (note->namedata, "LINUX") == 0)
9399 return elfcore_grok_s390_last_break (abfd, note);
9400 else
9401 return TRUE;
9402
9403 case NT_S390_SYSTEM_CALL:
9404 if (note->namesz == 6
9405 && strcmp (note->namedata, "LINUX") == 0)
9406 return elfcore_grok_s390_system_call (abfd, note);
9407 else
9408 return TRUE;
9409
abb3f6cc
NC
9410 case NT_S390_TDB:
9411 if (note->namesz == 6
9412 && strcmp (note->namedata, "LINUX") == 0)
9413 return elfcore_grok_s390_tdb (abfd, note);
9414 else
9415 return TRUE;
9416
4ef9f41a
AA
9417 case NT_S390_VXRS_LOW:
9418 if (note->namesz == 6
9419 && strcmp (note->namedata, "LINUX") == 0)
9420 return elfcore_grok_s390_vxrs_low (abfd, note);
9421 else
9422 return TRUE;
9423
9424 case NT_S390_VXRS_HIGH:
9425 if (note->namesz == 6
9426 && strcmp (note->namedata, "LINUX") == 0)
9427 return elfcore_grok_s390_vxrs_high (abfd, note);
9428 else
9429 return TRUE;
9430
faa9a424
UW
9431 case NT_ARM_VFP:
9432 if (note->namesz == 6
9433 && strcmp (note->namedata, "LINUX") == 0)
9434 return elfcore_grok_arm_vfp (abfd, note);
9435 else
9436 return TRUE;
9437
652451f8
YZ
9438 case NT_ARM_TLS:
9439 if (note->namesz == 6
9440 && strcmp (note->namedata, "LINUX") == 0)
9441 return elfcore_grok_aarch_tls (abfd, note);
9442 else
9443 return TRUE;
9444
9445 case NT_ARM_HW_BREAK:
9446 if (note->namesz == 6
9447 && strcmp (note->namedata, "LINUX") == 0)
9448 return elfcore_grok_aarch_hw_break (abfd, note);
9449 else
9450 return TRUE;
9451
9452 case NT_ARM_HW_WATCH:
9453 if (note->namesz == 6
9454 && strcmp (note->namedata, "LINUX") == 0)
9455 return elfcore_grok_aarch_hw_watch (abfd, note);
9456 else
9457 return TRUE;
9458
252b5132
RH
9459 case NT_PRPSINFO:
9460 case NT_PSINFO:
bb0082d6
AM
9461 if (bed->elf_backend_grok_psinfo)
9462 if ((*bed->elf_backend_grok_psinfo) (abfd, note))
b34976b6 9463 return TRUE;
bb0082d6 9464#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
252b5132 9465 return elfcore_grok_psinfo (abfd, note);
bb0082d6 9466#else
b34976b6 9467 return TRUE;
252b5132 9468#endif
3333a7c3
RM
9469
9470 case NT_AUXV:
9471 {
117ed4f8
AM
9472 asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
9473 SEC_HAS_CONTENTS);
3333a7c3
RM
9474
9475 if (sect == NULL)
9476 return FALSE;
eea6121a 9477 sect->size = note->descsz;
3333a7c3 9478 sect->filepos = note->descpos;
3333a7c3
RM
9479 sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
9480
9481 return TRUE;
9482 }
9015683b 9483
451b7c33
TT
9484 case NT_FILE:
9485 return elfcore_make_note_pseudosection (abfd, ".note.linuxcore.file",
9486 note);
9487
9015683b
TT
9488 case NT_SIGINFO:
9489 return elfcore_make_note_pseudosection (abfd, ".note.linuxcore.siginfo",
9490 note);
5b2c414d
JB
9491
9492 case NT_FREEBSD_THRMISC:
9493 if (note->namesz == 8
9494 && strcmp (note->namedata, "FreeBSD") == 0)
9495 return elfcore_make_note_pseudosection (abfd, ".thrmisc", note);
9496 else
9497 return TRUE;
252b5132
RH
9498 }
9499}
9500
718175fa
JK
9501static bfd_boolean
9502elfobj_grok_gnu_build_id (bfd *abfd, Elf_Internal_Note *note)
9503{
c74f7d1c 9504 struct bfd_build_id* build_id;
30e8ee25
AM
9505
9506 if (note->descsz == 0)
9507 return FALSE;
9508
c74f7d1c
JT
9509 build_id = bfd_alloc (abfd, sizeof (struct bfd_build_id) - 1 + note->descsz);
9510 if (build_id == NULL)
718175fa
JK
9511 return FALSE;
9512
c74f7d1c
JT
9513 build_id->size = note->descsz;
9514 memcpy (build_id->data, note->descdata, note->descsz);
9515 abfd->build_id = build_id;
718175fa
JK
9516
9517 return TRUE;
9518}
9519
9520static bfd_boolean
9521elfobj_grok_gnu_note (bfd *abfd, Elf_Internal_Note *note)
9522{
9523 switch (note->type)
9524 {
9525 default:
9526 return TRUE;
9527
9528 case NT_GNU_BUILD_ID:
9529 return elfobj_grok_gnu_build_id (abfd, note);
9530 }
9531}
9532
e21e5835
NC
9533static bfd_boolean
9534elfobj_grok_stapsdt_note_1 (bfd *abfd, Elf_Internal_Note *note)
9535{
9536 struct sdt_note *cur =
9537 (struct sdt_note *) bfd_alloc (abfd, sizeof (struct sdt_note)
9538 + note->descsz);
9539
9540 cur->next = (struct sdt_note *) (elf_tdata (abfd))->sdt_note_head;
9541 cur->size = (bfd_size_type) note->descsz;
9542 memcpy (cur->data, note->descdata, note->descsz);
9543
9544 elf_tdata (abfd)->sdt_note_head = cur;
9545
9546 return TRUE;
9547}
9548
9549static bfd_boolean
9550elfobj_grok_stapsdt_note (bfd *abfd, Elf_Internal_Note *note)
9551{
9552 switch (note->type)
9553 {
9554 case NT_STAPSDT:
9555 return elfobj_grok_stapsdt_note_1 (abfd, note);
9556
9557 default:
9558 return TRUE;
9559 }
9560}
9561
b34976b6 9562static bfd_boolean
217aa764 9563elfcore_netbsd_get_lwpid (Elf_Internal_Note *note, int *lwpidp)
50b2bdb7
AM
9564{
9565 char *cp;
9566
9567 cp = strchr (note->namedata, '@');
9568 if (cp != NULL)
9569 {
d2b64500 9570 *lwpidp = atoi(cp + 1);
b34976b6 9571 return TRUE;
50b2bdb7 9572 }
b34976b6 9573 return FALSE;
50b2bdb7
AM
9574}
9575
b34976b6 9576static bfd_boolean
217aa764 9577elfcore_grok_netbsd_procinfo (bfd *abfd, Elf_Internal_Note *note)
50b2bdb7 9578{
50b2bdb7 9579 /* Signal number at offset 0x08. */
228e534f 9580 elf_tdata (abfd)->core->signal
50b2bdb7
AM
9581 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x08);
9582
9583 /* Process ID at offset 0x50. */
228e534f 9584 elf_tdata (abfd)->core->pid
50b2bdb7
AM
9585 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x50);
9586
9587 /* Command name at 0x7c (max 32 bytes, including nul). */
228e534f 9588 elf_tdata (abfd)->core->command
50b2bdb7
AM
9589 = _bfd_elfcore_strndup (abfd, note->descdata + 0x7c, 31);
9590
7720ba9f
MK
9591 return elfcore_make_note_pseudosection (abfd, ".note.netbsdcore.procinfo",
9592 note);
50b2bdb7
AM
9593}
9594
b34976b6 9595static bfd_boolean
217aa764 9596elfcore_grok_netbsd_note (bfd *abfd, Elf_Internal_Note *note)
50b2bdb7
AM
9597{
9598 int lwp;
9599
9600 if (elfcore_netbsd_get_lwpid (note, &lwp))
228e534f 9601 elf_tdata (abfd)->core->lwpid = lwp;
50b2bdb7 9602
b4db1224 9603 if (note->type == NT_NETBSDCORE_PROCINFO)
50b2bdb7
AM
9604 {
9605 /* NetBSD-specific core "procinfo". Note that we expect to
08a40648
AM
9606 find this note before any of the others, which is fine,
9607 since the kernel writes this note out first when it
9608 creates a core file. */
47d9a591 9609
50b2bdb7
AM
9610 return elfcore_grok_netbsd_procinfo (abfd, note);
9611 }
9612
b4db1224
JT
9613 /* As of Jan 2002 there are no other machine-independent notes
9614 defined for NetBSD core files. If the note type is less
9615 than the start of the machine-dependent note types, we don't
9616 understand it. */
47d9a591 9617
b4db1224 9618 if (note->type < NT_NETBSDCORE_FIRSTMACH)
b34976b6 9619 return TRUE;
50b2bdb7
AM
9620
9621
9622 switch (bfd_get_arch (abfd))
9623 {
08a40648
AM
9624 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0 and
9625 PT_GETFPREGS == mach+2. */
50b2bdb7
AM
9626
9627 case bfd_arch_alpha:
9628 case bfd_arch_sparc:
9629 switch (note->type)
08a40648
AM
9630 {
9631 case NT_NETBSDCORE_FIRSTMACH+0:
9632 return elfcore_make_note_pseudosection (abfd, ".reg", note);
50b2bdb7 9633
08a40648
AM
9634 case NT_NETBSDCORE_FIRSTMACH+2:
9635 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
50b2bdb7 9636
08a40648
AM
9637 default:
9638 return TRUE;
9639 }
50b2bdb7 9640
08a40648
AM
9641 /* On all other arch's, PT_GETREGS == mach+1 and
9642 PT_GETFPREGS == mach+3. */
50b2bdb7
AM
9643
9644 default:
9645 switch (note->type)
08a40648
AM
9646 {
9647 case NT_NETBSDCORE_FIRSTMACH+1:
9648 return elfcore_make_note_pseudosection (abfd, ".reg", note);
50b2bdb7 9649
08a40648
AM
9650 case NT_NETBSDCORE_FIRSTMACH+3:
9651 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
50b2bdb7 9652
08a40648
AM
9653 default:
9654 return TRUE;
9655 }
50b2bdb7
AM
9656 }
9657 /* NOTREACHED */
9658}
9659
67cc5033
MK
9660static bfd_boolean
9661elfcore_grok_openbsd_procinfo (bfd *abfd, Elf_Internal_Note *note)
9662{
9663 /* Signal number at offset 0x08. */
228e534f 9664 elf_tdata (abfd)->core->signal
67cc5033
MK
9665 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x08);
9666
9667 /* Process ID at offset 0x20. */
228e534f 9668 elf_tdata (abfd)->core->pid
67cc5033
MK
9669 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x20);
9670
9671 /* Command name at 0x48 (max 32 bytes, including nul). */
228e534f 9672 elf_tdata (abfd)->core->command
67cc5033
MK
9673 = _bfd_elfcore_strndup (abfd, note->descdata + 0x48, 31);
9674
9675 return TRUE;
9676}
9677
9678static bfd_boolean
9679elfcore_grok_openbsd_note (bfd *abfd, Elf_Internal_Note *note)
9680{
9681 if (note->type == NT_OPENBSD_PROCINFO)
9682 return elfcore_grok_openbsd_procinfo (abfd, note);
9683
9684 if (note->type == NT_OPENBSD_REGS)
9685 return elfcore_make_note_pseudosection (abfd, ".reg", note);
9686
9687 if (note->type == NT_OPENBSD_FPREGS)
9688 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
9689
9690 if (note->type == NT_OPENBSD_XFPREGS)
9691 return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
9692
9693 if (note->type == NT_OPENBSD_AUXV)
9694 {
9695 asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
9696 SEC_HAS_CONTENTS);
9697
9698 if (sect == NULL)
9699 return FALSE;
9700 sect->size = note->descsz;
9701 sect->filepos = note->descpos;
9702 sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
9703
9704 return TRUE;
9705 }
9706
9707 if (note->type == NT_OPENBSD_WCOOKIE)
9708 {
9709 asection *sect = bfd_make_section_anyway_with_flags (abfd, ".wcookie",
9710 SEC_HAS_CONTENTS);
9711
9712 if (sect == NULL)
9713 return FALSE;
9714 sect->size = note->descsz;
9715 sect->filepos = note->descpos;
9716 sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
9717
9718 return TRUE;
9719 }
9720
9721 return TRUE;
9722}
9723
07c6e936 9724static bfd_boolean
d3fd4074 9725elfcore_grok_nto_status (bfd *abfd, Elf_Internal_Note *note, long *tid)
07c6e936
NC
9726{
9727 void *ddata = note->descdata;
9728 char buf[100];
9729 char *name;
9730 asection *sect;
f8843e87
AM
9731 short sig;
9732 unsigned flags;
07c6e936
NC
9733
9734 /* nto_procfs_status 'pid' field is at offset 0. */
228e534f 9735 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, (bfd_byte *) ddata);
07c6e936 9736
f8843e87
AM
9737 /* nto_procfs_status 'tid' field is at offset 4. Pass it back. */
9738 *tid = bfd_get_32 (abfd, (bfd_byte *) ddata + 4);
9739
9740 /* nto_procfs_status 'flags' field is at offset 8. */
9741 flags = bfd_get_32 (abfd, (bfd_byte *) ddata + 8);
07c6e936
NC
9742
9743 /* nto_procfs_status 'what' field is at offset 14. */
f8843e87
AM
9744 if ((sig = bfd_get_16 (abfd, (bfd_byte *) ddata + 14)) > 0)
9745 {
228e534f
AM
9746 elf_tdata (abfd)->core->signal = sig;
9747 elf_tdata (abfd)->core->lwpid = *tid;
f8843e87 9748 }
07c6e936 9749
f8843e87
AM
9750 /* _DEBUG_FLAG_CURTID (current thread) is 0x80. Some cores
9751 do not come from signals so we make sure we set the current
9752 thread just in case. */
9753 if (flags & 0x00000080)
228e534f 9754 elf_tdata (abfd)->core->lwpid = *tid;
07c6e936
NC
9755
9756 /* Make a ".qnx_core_status/%d" section. */
d3fd4074 9757 sprintf (buf, ".qnx_core_status/%ld", *tid);
07c6e936 9758
a50b1753 9759 name = (char *) bfd_alloc (abfd, strlen (buf) + 1);
07c6e936
NC
9760 if (name == NULL)
9761 return FALSE;
9762 strcpy (name, buf);
9763
117ed4f8 9764 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
07c6e936
NC
9765 if (sect == NULL)
9766 return FALSE;
9767
eea6121a 9768 sect->size = note->descsz;
07c6e936 9769 sect->filepos = note->descpos;
07c6e936
NC
9770 sect->alignment_power = 2;
9771
9772 return (elfcore_maybe_make_sect (abfd, ".qnx_core_status", sect));
9773}
9774
9775static bfd_boolean
d69f560c
KW
9776elfcore_grok_nto_regs (bfd *abfd,
9777 Elf_Internal_Note *note,
d3fd4074 9778 long tid,
d69f560c 9779 char *base)
07c6e936
NC
9780{
9781 char buf[100];
9782 char *name;
9783 asection *sect;
9784
d69f560c 9785 /* Make a "(base)/%d" section. */
d3fd4074 9786 sprintf (buf, "%s/%ld", base, tid);
07c6e936 9787
a50b1753 9788 name = (char *) bfd_alloc (abfd, strlen (buf) + 1);
07c6e936
NC
9789 if (name == NULL)
9790 return FALSE;
9791 strcpy (name, buf);
9792
117ed4f8 9793 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
07c6e936
NC
9794 if (sect == NULL)
9795 return FALSE;
9796
eea6121a 9797 sect->size = note->descsz;
07c6e936 9798 sect->filepos = note->descpos;
07c6e936
NC
9799 sect->alignment_power = 2;
9800
f8843e87 9801 /* This is the current thread. */
228e534f 9802 if (elf_tdata (abfd)->core->lwpid == tid)
d69f560c 9803 return elfcore_maybe_make_sect (abfd, base, sect);
f8843e87
AM
9804
9805 return TRUE;
07c6e936
NC
9806}
9807
9808#define BFD_QNT_CORE_INFO 7
9809#define BFD_QNT_CORE_STATUS 8
9810#define BFD_QNT_CORE_GREG 9
9811#define BFD_QNT_CORE_FPREG 10
9812
9813static bfd_boolean
217aa764 9814elfcore_grok_nto_note (bfd *abfd, Elf_Internal_Note *note)
07c6e936
NC
9815{
9816 /* Every GREG section has a STATUS section before it. Store the
811072d8 9817 tid from the previous call to pass down to the next gregs
07c6e936 9818 function. */
d3fd4074 9819 static long tid = 1;
07c6e936
NC
9820
9821 switch (note->type)
9822 {
d69f560c
KW
9823 case BFD_QNT_CORE_INFO:
9824 return elfcore_make_note_pseudosection (abfd, ".qnx_core_info", note);
9825 case BFD_QNT_CORE_STATUS:
9826 return elfcore_grok_nto_status (abfd, note, &tid);
9827 case BFD_QNT_CORE_GREG:
9828 return elfcore_grok_nto_regs (abfd, note, tid, ".reg");
9829 case BFD_QNT_CORE_FPREG:
9830 return elfcore_grok_nto_regs (abfd, note, tid, ".reg2");
9831 default:
9832 return TRUE;
07c6e936
NC
9833 }
9834}
9835
b15fa79e
AM
9836static bfd_boolean
9837elfcore_grok_spu_note (bfd *abfd, Elf_Internal_Note *note)
9838{
9839 char *name;
9840 asection *sect;
9841 size_t len;
9842
9843 /* Use note name as section name. */
9844 len = note->namesz;
a50b1753 9845 name = (char *) bfd_alloc (abfd, len);
b15fa79e
AM
9846 if (name == NULL)
9847 return FALSE;
9848 memcpy (name, note->namedata, len);
9849 name[len - 1] = '\0';
9850
9851 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
9852 if (sect == NULL)
9853 return FALSE;
9854
9855 sect->size = note->descsz;
9856 sect->filepos = note->descpos;
9857 sect->alignment_power = 1;
9858
9859 return TRUE;
9860}
9861
7c76fa91
MS
9862/* Function: elfcore_write_note
9863
47d9a591 9864 Inputs:
a39f3346 9865 buffer to hold note, and current size of buffer
7c76fa91
MS
9866 name of note
9867 type of note
9868 data for note
9869 size of data for note
9870
a39f3346
AM
9871 Writes note to end of buffer. ELF64 notes are written exactly as
9872 for ELF32, despite the current (as of 2006) ELF gabi specifying
9873 that they ought to have 8-byte namesz and descsz field, and have
9874 8-byte alignment. Other writers, eg. Linux kernel, do the same.
9875
7c76fa91 9876 Return:
a39f3346 9877 Pointer to realloc'd buffer, *BUFSIZ updated. */
7c76fa91
MS
9878
9879char *
a39f3346 9880elfcore_write_note (bfd *abfd,
217aa764 9881 char *buf,
a39f3346 9882 int *bufsiz,
217aa764 9883 const char *name,
a39f3346 9884 int type,
217aa764 9885 const void *input,
a39f3346 9886 int size)
7c76fa91
MS
9887{
9888 Elf_External_Note *xnp;
d4c88bbb 9889 size_t namesz;
d4c88bbb 9890 size_t newspace;
a39f3346 9891 char *dest;
7c76fa91 9892
d4c88bbb 9893 namesz = 0;
d4c88bbb 9894 if (name != NULL)
a39f3346 9895 namesz = strlen (name) + 1;
d4c88bbb 9896
a39f3346 9897 newspace = 12 + ((namesz + 3) & -4) + ((size + 3) & -4);
d4c88bbb 9898
a50b1753 9899 buf = (char *) realloc (buf, *bufsiz + newspace);
14b1c01e
AM
9900 if (buf == NULL)
9901 return buf;
a39f3346 9902 dest = buf + *bufsiz;
7c76fa91
MS
9903 *bufsiz += newspace;
9904 xnp = (Elf_External_Note *) dest;
9905 H_PUT_32 (abfd, namesz, xnp->namesz);
9906 H_PUT_32 (abfd, size, xnp->descsz);
9907 H_PUT_32 (abfd, type, xnp->type);
d4c88bbb
AM
9908 dest = xnp->name;
9909 if (name != NULL)
9910 {
9911 memcpy (dest, name, namesz);
9912 dest += namesz;
a39f3346 9913 while (namesz & 3)
d4c88bbb
AM
9914 {
9915 *dest++ = '\0';
a39f3346 9916 ++namesz;
d4c88bbb
AM
9917 }
9918 }
9919 memcpy (dest, input, size);
a39f3346
AM
9920 dest += size;
9921 while (size & 3)
9922 {
9923 *dest++ = '\0';
9924 ++size;
9925 }
9926 return buf;
7c76fa91
MS
9927}
9928
7c76fa91 9929char *
217aa764
AM
9930elfcore_write_prpsinfo (bfd *abfd,
9931 char *buf,
9932 int *bufsiz,
9933 const char *fname,
9934 const char *psargs)
7c76fa91 9935{
183e98be
AM
9936 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
9937
9938 if (bed->elf_backend_write_core_note != NULL)
9939 {
9940 char *ret;
9941 ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
9942 NT_PRPSINFO, fname, psargs);
9943 if (ret != NULL)
9944 return ret;
9945 }
7c76fa91 9946
1f20dca5 9947#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
183e98be
AM
9948#if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
9949 if (bed->s->elfclass == ELFCLASS32)
9950 {
9951#if defined (HAVE_PSINFO32_T)
9952 psinfo32_t data;
9953 int note_type = NT_PSINFO;
9954#else
9955 prpsinfo32_t data;
9956 int note_type = NT_PRPSINFO;
9957#endif
9958
9959 memset (&data, 0, sizeof (data));
9960 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
9961 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
9962 return elfcore_write_note (abfd, buf, bufsiz,
1f20dca5 9963 "CORE", note_type, &data, sizeof (data));
183e98be
AM
9964 }
9965 else
9966#endif
9967 {
7c76fa91 9968#if defined (HAVE_PSINFO_T)
183e98be
AM
9969 psinfo_t data;
9970 int note_type = NT_PSINFO;
7c76fa91 9971#else
183e98be
AM
9972 prpsinfo_t data;
9973 int note_type = NT_PRPSINFO;
7c76fa91
MS
9974#endif
9975
183e98be
AM
9976 memset (&data, 0, sizeof (data));
9977 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
9978 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
9979 return elfcore_write_note (abfd, buf, bufsiz,
1f20dca5 9980 "CORE", note_type, &data, sizeof (data));
183e98be 9981 }
7c76fa91
MS
9982#endif /* PSINFO_T or PRPSINFO_T */
9983
1f20dca5
UW
9984 free (buf);
9985 return NULL;
9986}
9987
70a38d42
SDJ
9988char *
9989elfcore_write_linux_prpsinfo32
9990 (bfd *abfd, char *buf, int *bufsiz,
9991 const struct elf_internal_linux_prpsinfo *prpsinfo)
9992{
9993 struct elf_external_linux_prpsinfo32 data;
9994
aeb70569 9995 swap_linux_prpsinfo32_out (abfd, prpsinfo, &data);
70a38d42
SDJ
9996 return elfcore_write_note (abfd, buf, bufsiz, "CORE", NT_PRPSINFO,
9997 &data, sizeof (data));
9998}
9999
10000char *
10001elfcore_write_linux_prpsinfo64
10002 (bfd *abfd, char *buf, int *bufsiz,
10003 const struct elf_internal_linux_prpsinfo *prpsinfo)
10004{
10005 struct elf_external_linux_prpsinfo64 data;
10006
aeb70569 10007 swap_linux_prpsinfo64_out (abfd, prpsinfo, &data);
70a38d42
SDJ
10008 return elfcore_write_note (abfd, buf, bufsiz,
10009 "CORE", NT_PRPSINFO, &data, sizeof (data));
10010}
10011
7c76fa91 10012char *
217aa764
AM
10013elfcore_write_prstatus (bfd *abfd,
10014 char *buf,
10015 int *bufsiz,
10016 long pid,
10017 int cursig,
10018 const void *gregs)
7c76fa91 10019{
183e98be 10020 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7c76fa91 10021
183e98be
AM
10022 if (bed->elf_backend_write_core_note != NULL)
10023 {
10024 char *ret;
10025 ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
10026 NT_PRSTATUS,
10027 pid, cursig, gregs);
10028 if (ret != NULL)
10029 return ret;
10030 }
10031
1f20dca5 10032#if defined (HAVE_PRSTATUS_T)
183e98be
AM
10033#if defined (HAVE_PRSTATUS32_T)
10034 if (bed->s->elfclass == ELFCLASS32)
10035 {
10036 prstatus32_t prstat;
10037
10038 memset (&prstat, 0, sizeof (prstat));
10039 prstat.pr_pid = pid;
10040 prstat.pr_cursig = cursig;
10041 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
1f20dca5 10042 return elfcore_write_note (abfd, buf, bufsiz, "CORE",
183e98be
AM
10043 NT_PRSTATUS, &prstat, sizeof (prstat));
10044 }
10045 else
10046#endif
10047 {
10048 prstatus_t prstat;
10049
10050 memset (&prstat, 0, sizeof (prstat));
10051 prstat.pr_pid = pid;
10052 prstat.pr_cursig = cursig;
10053 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
1f20dca5 10054 return elfcore_write_note (abfd, buf, bufsiz, "CORE",
183e98be
AM
10055 NT_PRSTATUS, &prstat, sizeof (prstat));
10056 }
7c76fa91
MS
10057#endif /* HAVE_PRSTATUS_T */
10058
1f20dca5
UW
10059 free (buf);
10060 return NULL;
10061}
10062
51316059
MS
10063#if defined (HAVE_LWPSTATUS_T)
10064char *
217aa764
AM
10065elfcore_write_lwpstatus (bfd *abfd,
10066 char *buf,
10067 int *bufsiz,
10068 long pid,
10069 int cursig,
10070 const void *gregs)
51316059
MS
10071{
10072 lwpstatus_t lwpstat;
183e98be 10073 const char *note_name = "CORE";
51316059
MS
10074
10075 memset (&lwpstat, 0, sizeof (lwpstat));
10076 lwpstat.pr_lwpid = pid >> 16;
10077 lwpstat.pr_cursig = cursig;
10078#if defined (HAVE_LWPSTATUS_T_PR_REG)
d1e8523e 10079 memcpy (&lwpstat.pr_reg, gregs, sizeof (lwpstat.pr_reg));
51316059
MS
10080#elif defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
10081#if !defined(gregs)
10082 memcpy (lwpstat.pr_context.uc_mcontext.gregs,
10083 gregs, sizeof (lwpstat.pr_context.uc_mcontext.gregs));
10084#else
10085 memcpy (lwpstat.pr_context.uc_mcontext.__gregs,
10086 gregs, sizeof (lwpstat.pr_context.uc_mcontext.__gregs));
10087#endif
10088#endif
47d9a591 10089 return elfcore_write_note (abfd, buf, bufsiz, note_name,
51316059
MS
10090 NT_LWPSTATUS, &lwpstat, sizeof (lwpstat));
10091}
10092#endif /* HAVE_LWPSTATUS_T */
10093
7c76fa91
MS
10094#if defined (HAVE_PSTATUS_T)
10095char *
217aa764
AM
10096elfcore_write_pstatus (bfd *abfd,
10097 char *buf,
10098 int *bufsiz,
10099 long pid,
6c10990d
NC
10100 int cursig ATTRIBUTE_UNUSED,
10101 const void *gregs ATTRIBUTE_UNUSED)
7c76fa91 10102{
183e98be
AM
10103 const char *note_name = "CORE";
10104#if defined (HAVE_PSTATUS32_T)
10105 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7c76fa91 10106
183e98be
AM
10107 if (bed->s->elfclass == ELFCLASS32)
10108 {
10109 pstatus32_t pstat;
10110
10111 memset (&pstat, 0, sizeof (pstat));
10112 pstat.pr_pid = pid & 0xffff;
10113 buf = elfcore_write_note (abfd, buf, bufsiz, note_name,
10114 NT_PSTATUS, &pstat, sizeof (pstat));
10115 return buf;
10116 }
10117 else
10118#endif
10119 {
10120 pstatus_t pstat;
10121
10122 memset (&pstat, 0, sizeof (pstat));
10123 pstat.pr_pid = pid & 0xffff;
10124 buf = elfcore_write_note (abfd, buf, bufsiz, note_name,
10125 NT_PSTATUS, &pstat, sizeof (pstat));
10126 return buf;
10127 }
7c76fa91
MS
10128}
10129#endif /* HAVE_PSTATUS_T */
10130
10131char *
217aa764
AM
10132elfcore_write_prfpreg (bfd *abfd,
10133 char *buf,
10134 int *bufsiz,
10135 const void *fpregs,
10136 int size)
7c76fa91 10137{
183e98be 10138 const char *note_name = "CORE";
47d9a591 10139 return elfcore_write_note (abfd, buf, bufsiz,
7c76fa91
MS
10140 note_name, NT_FPREGSET, fpregs, size);
10141}
10142
10143char *
217aa764
AM
10144elfcore_write_prxfpreg (bfd *abfd,
10145 char *buf,
10146 int *bufsiz,
10147 const void *xfpregs,
10148 int size)
7c76fa91
MS
10149{
10150 char *note_name = "LINUX";
47d9a591 10151 return elfcore_write_note (abfd, buf, bufsiz,
7c76fa91
MS
10152 note_name, NT_PRXFPREG, xfpregs, size);
10153}
10154
4339cae0
L
10155char *
10156elfcore_write_xstatereg (bfd *abfd, char *buf, int *bufsiz,
10157 const void *xfpregs, int size)
10158{
97de3545
JB
10159 char *note_name;
10160 if (get_elf_backend_data (abfd)->elf_osabi == ELFOSABI_FREEBSD)
10161 note_name = "FreeBSD";
10162 else
10163 note_name = "LINUX";
4339cae0
L
10164 return elfcore_write_note (abfd, buf, bufsiz,
10165 note_name, NT_X86_XSTATE, xfpregs, size);
10166}
10167
97753bd5
AM
10168char *
10169elfcore_write_ppc_vmx (bfd *abfd,
10170 char *buf,
10171 int *bufsiz,
10172 const void *ppc_vmx,
10173 int size)
10174{
10175 char *note_name = "LINUX";
10176 return elfcore_write_note (abfd, buf, bufsiz,
10177 note_name, NT_PPC_VMX, ppc_vmx, size);
10178}
10179
89eeb0bc
LM
10180char *
10181elfcore_write_ppc_vsx (bfd *abfd,
10182 char *buf,
10183 int *bufsiz,
10184 const void *ppc_vsx,
10185 int size)
10186{
10187 char *note_name = "LINUX";
10188 return elfcore_write_note (abfd, buf, bufsiz,
10189 note_name, NT_PPC_VSX, ppc_vsx, size);
10190}
10191
0675e188
UW
10192static char *
10193elfcore_write_s390_high_gprs (bfd *abfd,
10194 char *buf,
10195 int *bufsiz,
10196 const void *s390_high_gprs,
10197 int size)
10198{
10199 char *note_name = "LINUX";
10200 return elfcore_write_note (abfd, buf, bufsiz,
10201 note_name, NT_S390_HIGH_GPRS,
10202 s390_high_gprs, size);
10203}
10204
d7eeb400
MS
10205char *
10206elfcore_write_s390_timer (bfd *abfd,
10207 char *buf,
10208 int *bufsiz,
10209 const void *s390_timer,
10210 int size)
10211{
10212 char *note_name = "LINUX";
10213 return elfcore_write_note (abfd, buf, bufsiz,
10214 note_name, NT_S390_TIMER, s390_timer, size);
10215}
10216
10217char *
10218elfcore_write_s390_todcmp (bfd *abfd,
10219 char *buf,
10220 int *bufsiz,
10221 const void *s390_todcmp,
10222 int size)
10223{
10224 char *note_name = "LINUX";
10225 return elfcore_write_note (abfd, buf, bufsiz,
10226 note_name, NT_S390_TODCMP, s390_todcmp, size);
10227}
10228
10229char *
10230elfcore_write_s390_todpreg (bfd *abfd,
10231 char *buf,
10232 int *bufsiz,
10233 const void *s390_todpreg,
10234 int size)
10235{
10236 char *note_name = "LINUX";
10237 return elfcore_write_note (abfd, buf, bufsiz,
10238 note_name, NT_S390_TODPREG, s390_todpreg, size);
10239}
10240
10241char *
10242elfcore_write_s390_ctrs (bfd *abfd,
10243 char *buf,
10244 int *bufsiz,
10245 const void *s390_ctrs,
10246 int size)
10247{
10248 char *note_name = "LINUX";
10249 return elfcore_write_note (abfd, buf, bufsiz,
10250 note_name, NT_S390_CTRS, s390_ctrs, size);
10251}
10252
10253char *
10254elfcore_write_s390_prefix (bfd *abfd,
10255 char *buf,
10256 int *bufsiz,
10257 const void *s390_prefix,
10258 int size)
10259{
10260 char *note_name = "LINUX";
10261 return elfcore_write_note (abfd, buf, bufsiz,
10262 note_name, NT_S390_PREFIX, s390_prefix, size);
10263}
10264
355b81d9
UW
10265char *
10266elfcore_write_s390_last_break (bfd *abfd,
10267 char *buf,
10268 int *bufsiz,
10269 const void *s390_last_break,
10270 int size)
10271{
10272 char *note_name = "LINUX";
10273 return elfcore_write_note (abfd, buf, bufsiz,
10274 note_name, NT_S390_LAST_BREAK,
10275 s390_last_break, size);
10276}
10277
10278char *
10279elfcore_write_s390_system_call (bfd *abfd,
10280 char *buf,
10281 int *bufsiz,
10282 const void *s390_system_call,
10283 int size)
10284{
10285 char *note_name = "LINUX";
10286 return elfcore_write_note (abfd, buf, bufsiz,
10287 note_name, NT_S390_SYSTEM_CALL,
10288 s390_system_call, size);
10289}
10290
abb3f6cc
NC
10291char *
10292elfcore_write_s390_tdb (bfd *abfd,
10293 char *buf,
10294 int *bufsiz,
10295 const void *s390_tdb,
10296 int size)
10297{
10298 char *note_name = "LINUX";
10299 return elfcore_write_note (abfd, buf, bufsiz,
10300 note_name, NT_S390_TDB, s390_tdb, size);
10301}
10302
4ef9f41a
AA
10303char *
10304elfcore_write_s390_vxrs_low (bfd *abfd,
10305 char *buf,
10306 int *bufsiz,
10307 const void *s390_vxrs_low,
10308 int size)
10309{
10310 char *note_name = "LINUX";
10311 return elfcore_write_note (abfd, buf, bufsiz,
10312 note_name, NT_S390_VXRS_LOW, s390_vxrs_low, size);
10313}
10314
10315char *
10316elfcore_write_s390_vxrs_high (bfd *abfd,
10317 char *buf,
10318 int *bufsiz,
10319 const void *s390_vxrs_high,
10320 int size)
10321{
10322 char *note_name = "LINUX";
10323 return elfcore_write_note (abfd, buf, bufsiz,
10324 note_name, NT_S390_VXRS_HIGH,
10325 s390_vxrs_high, size);
10326}
10327
faa9a424
UW
10328char *
10329elfcore_write_arm_vfp (bfd *abfd,
10330 char *buf,
10331 int *bufsiz,
10332 const void *arm_vfp,
10333 int size)
10334{
10335 char *note_name = "LINUX";
10336 return elfcore_write_note (abfd, buf, bufsiz,
10337 note_name, NT_ARM_VFP, arm_vfp, size);
10338}
10339
652451f8
YZ
10340char *
10341elfcore_write_aarch_tls (bfd *abfd,
10342 char *buf,
10343 int *bufsiz,
10344 const void *aarch_tls,
10345 int size)
10346{
10347 char *note_name = "LINUX";
10348 return elfcore_write_note (abfd, buf, bufsiz,
10349 note_name, NT_ARM_TLS, aarch_tls, size);
10350}
10351
10352char *
10353elfcore_write_aarch_hw_break (bfd *abfd,
10354 char *buf,
10355 int *bufsiz,
10356 const void *aarch_hw_break,
10357 int size)
10358{
10359 char *note_name = "LINUX";
10360 return elfcore_write_note (abfd, buf, bufsiz,
10361 note_name, NT_ARM_HW_BREAK, aarch_hw_break, size);
10362}
10363
10364char *
10365elfcore_write_aarch_hw_watch (bfd *abfd,
10366 char *buf,
10367 int *bufsiz,
10368 const void *aarch_hw_watch,
10369 int size)
10370{
10371 char *note_name = "LINUX";
10372 return elfcore_write_note (abfd, buf, bufsiz,
10373 note_name, NT_ARM_HW_WATCH, aarch_hw_watch, size);
10374}
10375
bb864ac1
CES
10376char *
10377elfcore_write_register_note (bfd *abfd,
10378 char *buf,
10379 int *bufsiz,
10380 const char *section,
10381 const void *data,
10382 int size)
10383{
10384 if (strcmp (section, ".reg2") == 0)
10385 return elfcore_write_prfpreg (abfd, buf, bufsiz, data, size);
10386 if (strcmp (section, ".reg-xfp") == 0)
10387 return elfcore_write_prxfpreg (abfd, buf, bufsiz, data, size);
4339cae0
L
10388 if (strcmp (section, ".reg-xstate") == 0)
10389 return elfcore_write_xstatereg (abfd, buf, bufsiz, data, size);
bb864ac1
CES
10390 if (strcmp (section, ".reg-ppc-vmx") == 0)
10391 return elfcore_write_ppc_vmx (abfd, buf, bufsiz, data, size);
89eeb0bc
LM
10392 if (strcmp (section, ".reg-ppc-vsx") == 0)
10393 return elfcore_write_ppc_vsx (abfd, buf, bufsiz, data, size);
0675e188
UW
10394 if (strcmp (section, ".reg-s390-high-gprs") == 0)
10395 return elfcore_write_s390_high_gprs (abfd, buf, bufsiz, data, size);
d7eeb400
MS
10396 if (strcmp (section, ".reg-s390-timer") == 0)
10397 return elfcore_write_s390_timer (abfd, buf, bufsiz, data, size);
10398 if (strcmp (section, ".reg-s390-todcmp") == 0)
10399 return elfcore_write_s390_todcmp (abfd, buf, bufsiz, data, size);
10400 if (strcmp (section, ".reg-s390-todpreg") == 0)
10401 return elfcore_write_s390_todpreg (abfd, buf, bufsiz, data, size);
10402 if (strcmp (section, ".reg-s390-ctrs") == 0)
10403 return elfcore_write_s390_ctrs (abfd, buf, bufsiz, data, size);
10404 if (strcmp (section, ".reg-s390-prefix") == 0)
10405 return elfcore_write_s390_prefix (abfd, buf, bufsiz, data, size);
355b81d9
UW
10406 if (strcmp (section, ".reg-s390-last-break") == 0)
10407 return elfcore_write_s390_last_break (abfd, buf, bufsiz, data, size);
10408 if (strcmp (section, ".reg-s390-system-call") == 0)
10409 return elfcore_write_s390_system_call (abfd, buf, bufsiz, data, size);
abb3f6cc
NC
10410 if (strcmp (section, ".reg-s390-tdb") == 0)
10411 return elfcore_write_s390_tdb (abfd, buf, bufsiz, data, size);
4ef9f41a
AA
10412 if (strcmp (section, ".reg-s390-vxrs-low") == 0)
10413 return elfcore_write_s390_vxrs_low (abfd, buf, bufsiz, data, size);
10414 if (strcmp (section, ".reg-s390-vxrs-high") == 0)
10415 return elfcore_write_s390_vxrs_high (abfd, buf, bufsiz, data, size);
faa9a424
UW
10416 if (strcmp (section, ".reg-arm-vfp") == 0)
10417 return elfcore_write_arm_vfp (abfd, buf, bufsiz, data, size);
652451f8
YZ
10418 if (strcmp (section, ".reg-aarch-tls") == 0)
10419 return elfcore_write_aarch_tls (abfd, buf, bufsiz, data, size);
10420 if (strcmp (section, ".reg-aarch-hw-break") == 0)
10421 return elfcore_write_aarch_hw_break (abfd, buf, bufsiz, data, size);
10422 if (strcmp (section, ".reg-aarch-hw-watch") == 0)
10423 return elfcore_write_aarch_hw_watch (abfd, buf, bufsiz, data, size);
bb864ac1
CES
10424 return NULL;
10425}
10426
b34976b6 10427static bfd_boolean
718175fa 10428elf_parse_notes (bfd *abfd, char *buf, size_t size, file_ptr offset)
252b5132 10429{
c044fabd 10430 char *p;
252b5132 10431
252b5132
RH
10432 p = buf;
10433 while (p < buf + size)
10434 {
c044fabd
KH
10435 /* FIXME: bad alignment assumption. */
10436 Elf_External_Note *xnp = (Elf_External_Note *) p;
252b5132
RH
10437 Elf_Internal_Note in;
10438
baea7ef1
AM
10439 if (offsetof (Elf_External_Note, name) > buf - p + size)
10440 return FALSE;
10441
dc810e39 10442 in.type = H_GET_32 (abfd, xnp->type);
252b5132 10443
dc810e39 10444 in.namesz = H_GET_32 (abfd, xnp->namesz);
252b5132 10445 in.namedata = xnp->name;
baea7ef1
AM
10446 if (in.namesz > buf - in.namedata + size)
10447 return FALSE;
252b5132 10448
dc810e39 10449 in.descsz = H_GET_32 (abfd, xnp->descsz);
252b5132
RH
10450 in.descdata = in.namedata + BFD_ALIGN (in.namesz, 4);
10451 in.descpos = offset + (in.descdata - buf);
baea7ef1
AM
10452 if (in.descsz != 0
10453 && (in.descdata >= buf + size
10454 || in.descsz > buf - in.descdata + size))
10455 return FALSE;
252b5132 10456
718175fa
JK
10457 switch (bfd_get_format (abfd))
10458 {
10459 default:
10460 return TRUE;
10461
10462 case bfd_core:
f64e188b 10463 {
8acbedd6 10464#define GROKER_ELEMENT(S,F) {S, sizeof (S) - 1, F}
f64e188b 10465 struct
718175fa 10466 {
f64e188b 10467 const char * string;
8acbedd6 10468 size_t len;
f64e188b 10469 bfd_boolean (* func)(bfd *, Elf_Internal_Note *);
718175fa 10470 }
f64e188b 10471 grokers[] =
b15fa79e 10472 {
8acbedd6
KS
10473 GROKER_ELEMENT ("", elfcore_grok_note),
10474 GROKER_ELEMENT ("NetBSD-CORE", elfcore_grok_netbsd_note),
10475 GROKER_ELEMENT ( "OpenBSD", elfcore_grok_openbsd_note),
10476 GROKER_ELEMENT ("QNX", elfcore_grok_nto_note),
10477 GROKER_ELEMENT ("SPU/", elfcore_grok_spu_note)
f64e188b 10478 };
8acbedd6 10479#undef GROKER_ELEMENT
f64e188b
NC
10480 int i;
10481
10482 for (i = ARRAY_SIZE (grokers); i--;)
8acbedd6
KS
10483 {
10484 if (in.namesz >= grokers[i].len
10485 && strncmp (in.namedata, grokers[i].string,
10486 grokers[i].len) == 0)
10487 {
10488 if (! grokers[i].func (abfd, & in))
10489 return FALSE;
10490 break;
10491 }
10492 }
f64e188b
NC
10493 break;
10494 }
718175fa
JK
10495
10496 case bfd_object:
10497 if (in.namesz == sizeof "GNU" && strcmp (in.namedata, "GNU") == 0)
10498 {
10499 if (! elfobj_grok_gnu_note (abfd, &in))
10500 return FALSE;
10501 }
e21e5835
NC
10502 else if (in.namesz == sizeof "stapsdt"
10503 && strcmp (in.namedata, "stapsdt") == 0)
10504 {
10505 if (! elfobj_grok_stapsdt_note (abfd, &in))
10506 return FALSE;
10507 }
718175fa 10508 break;
08a40648 10509 }
252b5132
RH
10510
10511 p = in.descdata + BFD_ALIGN (in.descsz, 4);
10512 }
10513
718175fa
JK
10514 return TRUE;
10515}
10516
10517static bfd_boolean
10518elf_read_notes (bfd *abfd, file_ptr offset, bfd_size_type size)
10519{
10520 char *buf;
10521
10522 if (size <= 0)
10523 return TRUE;
10524
10525 if (bfd_seek (abfd, offset, SEEK_SET) != 0)
10526 return FALSE;
10527
f64e188b 10528 buf = (char *) bfd_malloc (size + 1);
718175fa
JK
10529 if (buf == NULL)
10530 return FALSE;
10531
f64e188b
NC
10532 /* PR 17512: file: ec08f814
10533 0-termintate the buffer so that string searches will not overflow. */
10534 buf[size] = 0;
10535
718175fa
JK
10536 if (bfd_bread (buf, size, abfd) != size
10537 || !elf_parse_notes (abfd, buf, size, offset))
10538 {
10539 free (buf);
10540 return FALSE;
10541 }
10542
252b5132 10543 free (buf);
b34976b6 10544 return TRUE;
252b5132 10545}
98d8431c
JB
10546\f
10547/* Providing external access to the ELF program header table. */
10548
10549/* Return an upper bound on the number of bytes required to store a
10550 copy of ABFD's program header table entries. Return -1 if an error
10551 occurs; bfd_get_error will return an appropriate code. */
c044fabd 10552
98d8431c 10553long
217aa764 10554bfd_get_elf_phdr_upper_bound (bfd *abfd)
98d8431c
JB
10555{
10556 if (abfd->xvec->flavour != bfd_target_elf_flavour)
10557 {
10558 bfd_set_error (bfd_error_wrong_format);
10559 return -1;
10560 }
10561
936e320b 10562 return elf_elfheader (abfd)->e_phnum * sizeof (Elf_Internal_Phdr);
98d8431c
JB
10563}
10564
98d8431c
JB
10565/* Copy ABFD's program header table entries to *PHDRS. The entries
10566 will be stored as an array of Elf_Internal_Phdr structures, as
10567 defined in include/elf/internal.h. To find out how large the
10568 buffer needs to be, call bfd_get_elf_phdr_upper_bound.
10569
10570 Return the number of program header table entries read, or -1 if an
10571 error occurs; bfd_get_error will return an appropriate code. */
c044fabd 10572
98d8431c 10573int
217aa764 10574bfd_get_elf_phdrs (bfd *abfd, void *phdrs)
98d8431c
JB
10575{
10576 int num_phdrs;
10577
10578 if (abfd->xvec->flavour != bfd_target_elf_flavour)
10579 {
10580 bfd_set_error (bfd_error_wrong_format);
10581 return -1;
10582 }
10583
10584 num_phdrs = elf_elfheader (abfd)->e_phnum;
c044fabd 10585 memcpy (phdrs, elf_tdata (abfd)->phdr,
98d8431c
JB
10586 num_phdrs * sizeof (Elf_Internal_Phdr));
10587
10588 return num_phdrs;
10589}
ae4221d7 10590
db6751f2 10591enum elf_reloc_type_class
7e612e98
AM
10592_bfd_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
10593 const asection *rel_sec ATTRIBUTE_UNUSED,
10594 const Elf_Internal_Rela *rela ATTRIBUTE_UNUSED)
db6751f2
JJ
10595{
10596 return reloc_class_normal;
10597}
f8df10f4 10598
47d9a591 10599/* For RELA architectures, return the relocation value for a
f8df10f4
JJ
10600 relocation against a local symbol. */
10601
10602bfd_vma
217aa764
AM
10603_bfd_elf_rela_local_sym (bfd *abfd,
10604 Elf_Internal_Sym *sym,
8517fae7 10605 asection **psec,
217aa764 10606 Elf_Internal_Rela *rel)
f8df10f4 10607{
8517fae7 10608 asection *sec = *psec;
f8df10f4
JJ
10609 bfd_vma relocation;
10610
10611 relocation = (sec->output_section->vma
10612 + sec->output_offset
10613 + sym->st_value);
10614 if ((sec->flags & SEC_MERGE)
c629eae0 10615 && ELF_ST_TYPE (sym->st_info) == STT_SECTION
dbaa2011 10616 && sec->sec_info_type == SEC_INFO_TYPE_MERGE)
f8df10f4 10617 {
f8df10f4 10618 rel->r_addend =
8517fae7 10619 _bfd_merged_section_offset (abfd, psec,
65765700 10620 elf_section_data (sec)->sec_info,
753731ee
AM
10621 sym->st_value + rel->r_addend);
10622 if (sec != *psec)
10623 {
10624 /* If we have changed the section, and our original section is
10625 marked with SEC_EXCLUDE, it means that the original
10626 SEC_MERGE section has been completely subsumed in some
10627 other SEC_MERGE section. In this case, we need to leave
10628 some info around for --emit-relocs. */
10629 if ((sec->flags & SEC_EXCLUDE) != 0)
10630 sec->kept_section = *psec;
10631 sec = *psec;
10632 }
8517fae7
AM
10633 rel->r_addend -= relocation;
10634 rel->r_addend += sec->output_section->vma + sec->output_offset;
f8df10f4
JJ
10635 }
10636 return relocation;
10637}
c629eae0
JJ
10638
10639bfd_vma
217aa764
AM
10640_bfd_elf_rel_local_sym (bfd *abfd,
10641 Elf_Internal_Sym *sym,
10642 asection **psec,
10643 bfd_vma addend)
47d9a591 10644{
c629eae0
JJ
10645 asection *sec = *psec;
10646
dbaa2011 10647 if (sec->sec_info_type != SEC_INFO_TYPE_MERGE)
c629eae0
JJ
10648 return sym->st_value + addend;
10649
10650 return _bfd_merged_section_offset (abfd, psec,
65765700 10651 elf_section_data (sec)->sec_info,
753731ee 10652 sym->st_value + addend);
c629eae0
JJ
10653}
10654
37b01f6a
DG
10655/* Adjust an address within a section. Given OFFSET within SEC, return
10656 the new offset within the section, based upon changes made to the
10657 section. Returns -1 if the offset is now invalid.
10658 The offset (in abnd out) is in target sized bytes, however big a
10659 byte may be. */
10660
c629eae0 10661bfd_vma
217aa764 10662_bfd_elf_section_offset (bfd *abfd,
92e4ec35 10663 struct bfd_link_info *info,
217aa764
AM
10664 asection *sec,
10665 bfd_vma offset)
c629eae0 10666{
68bfbfcc 10667 switch (sec->sec_info_type)
65765700 10668 {
dbaa2011 10669 case SEC_INFO_TYPE_STABS:
eea6121a
AM
10670 return _bfd_stab_section_offset (sec, elf_section_data (sec)->sec_info,
10671 offset);
dbaa2011 10672 case SEC_INFO_TYPE_EH_FRAME:
92e4ec35 10673 return _bfd_elf_eh_frame_section_offset (abfd, info, sec, offset);
37b01f6a 10674
65765700 10675 default:
310fd250
L
10676 if ((sec->flags & SEC_ELF_REVERSE_COPY) != 0)
10677 {
37b01f6a 10678 /* Reverse the offset. */
310fd250
L
10679 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
10680 bfd_size_type address_size = bed->s->arch_size / 8;
37b01f6a
DG
10681
10682 /* address_size and sec->size are in octets. Convert
10683 to bytes before subtracting the original offset. */
10684 offset = (sec->size - address_size) / bfd_octets_per_byte (abfd) - offset;
310fd250 10685 }
65765700
JJ
10686 return offset;
10687 }
c629eae0 10688}
3333a7c3
RM
10689\f
10690/* Create a new BFD as if by bfd_openr. Rather than opening a file,
10691 reconstruct an ELF file by reading the segments out of remote memory
10692 based on the ELF file header at EHDR_VMA and the ELF program headers it
10693 points to. If not null, *LOADBASEP is filled in with the difference
10694 between the VMAs from which the segments were read, and the VMAs the
10695 file headers (and hence BFD's idea of each section's VMA) put them at.
10696
10697 The function TARGET_READ_MEMORY is called to copy LEN bytes from the
10698 remote memory at target address VMA into the local buffer at MYADDR; it
10699 should return zero on success or an `errno' code on failure. TEMPL must
10700 be a BFD for an ELF target with the word size and byte order found in
10701 the remote memory. */
10702
10703bfd *
217aa764
AM
10704bfd_elf_bfd_from_remote_memory
10705 (bfd *templ,
10706 bfd_vma ehdr_vma,
f0a5d95a 10707 bfd_size_type size,
217aa764 10708 bfd_vma *loadbasep,
fe78531d 10709 int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
3333a7c3
RM
10710{
10711 return (*get_elf_backend_data (templ)->elf_backend_bfd_from_remote_memory)
5979d6b6 10712 (templ, ehdr_vma, size, loadbasep, target_read_memory);
3333a7c3 10713}
4c45e5c9
JJ
10714\f
10715long
c9727e01
AM
10716_bfd_elf_get_synthetic_symtab (bfd *abfd,
10717 long symcount ATTRIBUTE_UNUSED,
10718 asymbol **syms ATTRIBUTE_UNUSED,
8615f3f2 10719 long dynsymcount,
c9727e01
AM
10720 asymbol **dynsyms,
10721 asymbol **ret)
4c45e5c9
JJ
10722{
10723 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
10724 asection *relplt;
10725 asymbol *s;
10726 const char *relplt_name;
10727 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
10728 arelent *p;
10729 long count, i, n;
10730 size_t size;
10731 Elf_Internal_Shdr *hdr;
10732 char *names;
10733 asection *plt;
10734
8615f3f2
AM
10735 *ret = NULL;
10736
90e3cdf2
JJ
10737 if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
10738 return 0;
10739
8615f3f2
AM
10740 if (dynsymcount <= 0)
10741 return 0;
10742
4c45e5c9
JJ
10743 if (!bed->plt_sym_val)
10744 return 0;
10745
10746 relplt_name = bed->relplt_name;
10747 if (relplt_name == NULL)
d35fd659 10748 relplt_name = bed->rela_plts_and_copies_p ? ".rela.plt" : ".rel.plt";
4c45e5c9
JJ
10749 relplt = bfd_get_section_by_name (abfd, relplt_name);
10750 if (relplt == NULL)
10751 return 0;
10752
10753 hdr = &elf_section_data (relplt)->this_hdr;
10754 if (hdr->sh_link != elf_dynsymtab (abfd)
10755 || (hdr->sh_type != SHT_REL && hdr->sh_type != SHT_RELA))
10756 return 0;
10757
10758 plt = bfd_get_section_by_name (abfd, ".plt");
10759 if (plt == NULL)
10760 return 0;
10761
10762 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
c9727e01 10763 if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
4c45e5c9
JJ
10764 return -1;
10765
eea6121a 10766 count = relplt->size / hdr->sh_entsize;
4c45e5c9
JJ
10767 size = count * sizeof (asymbol);
10768 p = relplt->relocation;
cb53bf42 10769 for (i = 0; i < count; i++, p += bed->s->int_rels_per_ext_rel)
041de40d
AM
10770 {
10771 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
10772 if (p->addend != 0)
10773 {
10774#ifdef BFD64
10775 size += sizeof ("+0x") - 1 + 8 + 8 * (bed->s->elfclass == ELFCLASS64);
10776#else
10777 size += sizeof ("+0x") - 1 + 8;
10778#endif
10779 }
10780 }
4c45e5c9 10781
a50b1753 10782 s = *ret = (asymbol *) bfd_malloc (size);
4c45e5c9
JJ
10783 if (s == NULL)
10784 return -1;
10785
10786 names = (char *) (s + count);
10787 p = relplt->relocation;
10788 n = 0;
cb53bf42 10789 for (i = 0; i < count; i++, p += bed->s->int_rels_per_ext_rel)
4c45e5c9
JJ
10790 {
10791 size_t len;
10792 bfd_vma addr;
10793
10794 addr = bed->plt_sym_val (i, plt, p);
10795 if (addr == (bfd_vma) -1)
10796 continue;
10797
10798 *s = **p->sym_ptr_ptr;
65a7a66f
AM
10799 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
10800 we are defining a symbol, ensure one of them is set. */
10801 if ((s->flags & BSF_LOCAL) == 0)
10802 s->flags |= BSF_GLOBAL;
6ba2a415 10803 s->flags |= BSF_SYNTHETIC;
4c45e5c9
JJ
10804 s->section = plt;
10805 s->value = addr - plt->vma;
10806 s->name = names;
8f39ba8e 10807 s->udata.p = NULL;
4c45e5c9
JJ
10808 len = strlen ((*p->sym_ptr_ptr)->name);
10809 memcpy (names, (*p->sym_ptr_ptr)->name, len);
10810 names += len;
041de40d
AM
10811 if (p->addend != 0)
10812 {
1d770845 10813 char buf[30], *a;
d324f6d6 10814
041de40d
AM
10815 memcpy (names, "+0x", sizeof ("+0x") - 1);
10816 names += sizeof ("+0x") - 1;
1d770845
L
10817 bfd_sprintf_vma (abfd, buf, p->addend);
10818 for (a = buf; *a == '0'; ++a)
10819 ;
10820 len = strlen (a);
10821 memcpy (names, a, len);
10822 names += len;
041de40d 10823 }
4c45e5c9
JJ
10824 memcpy (names, "@plt", sizeof ("@plt"));
10825 names += sizeof ("@plt");
8f39ba8e 10826 ++s, ++n;
4c45e5c9
JJ
10827 }
10828
10829 return n;
10830}
3d7f7666 10831
3b22753a
L
10832/* It is only used by x86-64 so far. */
10833asection _bfd_elf_large_com_section
10834 = BFD_FAKE_SECTION (_bfd_elf_large_com_section,
f592407e 10835 SEC_IS_COMMON, NULL, "LARGE_COMMON", 0);
ecca9871 10836
d1036acb 10837void
78245035
L
10838_bfd_elf_post_process_headers (bfd * abfd,
10839 struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
d1036acb
L
10840{
10841 Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form. */
10842
10843 i_ehdrp = elf_elfheader (abfd);
10844
10845 i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
d8045f23
NC
10846
10847 /* To make things simpler for the loader on Linux systems we set the
9c55345c 10848 osabi field to ELFOSABI_GNU if the binary contains symbols of
f64b2e8d 10849 the STT_GNU_IFUNC type or STB_GNU_UNIQUE binding. */
d8045f23 10850 if (i_ehdrp->e_ident[EI_OSABI] == ELFOSABI_NONE
f64b2e8d 10851 && elf_tdata (abfd)->has_gnu_symbols)
9c55345c 10852 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_GNU;
d1036acb 10853}
fcb93ecf
PB
10854
10855
10856/* Return TRUE for ELF symbol types that represent functions.
10857 This is the default version of this function, which is sufficient for
d8045f23 10858 most targets. It returns true if TYPE is STT_FUNC or STT_GNU_IFUNC. */
fcb93ecf
PB
10859
10860bfd_boolean
10861_bfd_elf_is_function_type (unsigned int type)
10862{
d8045f23
NC
10863 return (type == STT_FUNC
10864 || type == STT_GNU_IFUNC);
fcb93ecf 10865}
9f296da3 10866
aef36ac1
AM
10867/* If the ELF symbol SYM might be a function in SEC, return the
10868 function size and set *CODE_OFF to the function's entry point,
10869 otherwise return zero. */
9f296da3 10870
aef36ac1
AM
10871bfd_size_type
10872_bfd_elf_maybe_function_sym (const asymbol *sym, asection *sec,
10873 bfd_vma *code_off)
9f296da3 10874{
aef36ac1
AM
10875 bfd_size_type size;
10876
ff9e0f5b 10877 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
aef36ac1
AM
10878 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0
10879 || sym->section != sec)
10880 return 0;
ff9e0f5b 10881
ff9e0f5b 10882 *code_off = sym->value;
aef36ac1
AM
10883 size = 0;
10884 if (!(sym->flags & BSF_SYNTHETIC))
10885 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
10886 if (size == 0)
10887 size = 1;
10888 return size;
9f296da3 10889}