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