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