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