]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elf.c
daily update
[thirdparty/binutils-gdb.git] / bfd / elf.c
CommitLineData
252b5132 1/* ELF executable support for BFD.
340b6d91
AC
2
3 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
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
0414f35b
AM
2910 if (sh_type == SHT_NOBITS
2911 && elf_elfheader (abfd)->e_phnum == 0)
2912 {
2913 /* Don't change the header type from NOBITS if we are being
2914 called for strip/objcopy --only-keep-debug. */
2915 this_hdr->sh_type = sh_type;
2916 }
2917
252b5132 2918 /* If the section has relocs, set up a section header for the
23bc299b
MM
2919 SHT_REL[A] section. If two relocation sections are required for
2920 this section, it is up to the processor-specific back-end to
c044fabd 2921 create the other. */
23bc299b 2922 if ((asect->flags & SEC_RELOC) != 0
c044fabd 2923 && !_bfd_elf_init_reloc_shdr (abfd,
23bc299b 2924 &elf_section_data (asect)->rel_hdr,
c044fabd 2925 asect,
68bfbfcc 2926 asect->use_rela_p))
b34976b6 2927 *failedptr = TRUE;
252b5132
RH
2928}
2929
dbb410c3
AM
2930/* Fill in the contents of a SHT_GROUP section. */
2931
1126897b 2932void
217aa764 2933bfd_elf_set_group_contents (bfd *abfd, asection *sec, void *failedptrarg)
dbb410c3 2934{
217aa764 2935 bfd_boolean *failedptr = failedptrarg;
dbb410c3 2936 unsigned long symindx;
9dce4196 2937 asection *elt, *first;
dbb410c3 2938 unsigned char *loc;
b34976b6 2939 bfd_boolean gas;
dbb410c3 2940
7e4111ad
L
2941 /* Ignore linker created group section. See elfNN_ia64_object_p in
2942 elfxx-ia64.c. */
2943 if (((sec->flags & (SEC_GROUP | SEC_LINKER_CREATED)) != SEC_GROUP)
dbb410c3
AM
2944 || *failedptr)
2945 return;
2946
1126897b
AM
2947 symindx = 0;
2948 if (elf_group_id (sec) != NULL)
2949 symindx = elf_group_id (sec)->udata.i;
2950
2951 if (symindx == 0)
2952 {
2953 /* If called from the assembler, swap_out_syms will have set up
2954 elf_section_syms; If called for "ld -r", use target_index. */
2955 if (elf_section_syms (abfd) != NULL)
2956 symindx = elf_section_syms (abfd)[sec->index]->udata.i;
2957 else
2958 symindx = sec->target_index;
2959 }
dbb410c3
AM
2960 elf_section_data (sec)->this_hdr.sh_info = symindx;
2961
1126897b 2962 /* The contents won't be allocated for "ld -r" or objcopy. */
b34976b6 2963 gas = TRUE;
dbb410c3
AM
2964 if (sec->contents == NULL)
2965 {
b34976b6 2966 gas = FALSE;
eea6121a 2967 sec->contents = bfd_alloc (abfd, sec->size);
9dce4196
AM
2968
2969 /* Arrange for the section to be written out. */
2970 elf_section_data (sec)->this_hdr.contents = sec->contents;
dbb410c3
AM
2971 if (sec->contents == NULL)
2972 {
b34976b6 2973 *failedptr = TRUE;
dbb410c3
AM
2974 return;
2975 }
2976 }
2977
eea6121a 2978 loc = sec->contents + sec->size;
dbb410c3 2979
9dce4196
AM
2980 /* Get the pointer to the first section in the group that gas
2981 squirreled away here. objcopy arranges for this to be set to the
2982 start of the input section group. */
2983 first = elt = elf_next_in_group (sec);
dbb410c3
AM
2984
2985 /* First element is a flag word. Rest of section is elf section
2986 indices for all the sections of the group. Write them backwards
2987 just to keep the group in the same order as given in .section
2988 directives, not that it matters. */
2989 while (elt != NULL)
2990 {
9dce4196
AM
2991 asection *s;
2992 unsigned int idx;
2993
dbb410c3 2994 loc -= 4;
9dce4196
AM
2995 s = elt;
2996 if (!gas)
2997 s = s->output_section;
2998 idx = 0;
2999 if (s != NULL)
3000 idx = elf_section_data (s)->this_idx;
3001 H_PUT_32 (abfd, idx, loc);
945906ff 3002 elt = elf_next_in_group (elt);
9dce4196
AM
3003 if (elt == first)
3004 break;
dbb410c3
AM
3005 }
3006
3d7f7666 3007 if ((loc -= 4) != sec->contents)
9dce4196 3008 abort ();
dbb410c3 3009
9dce4196 3010 H_PUT_32 (abfd, sec->flags & SEC_LINK_ONCE ? GRP_COMDAT : 0, loc);
dbb410c3
AM
3011}
3012
252b5132
RH
3013/* Assign all ELF section numbers. The dummy first section is handled here
3014 too. The link/info pointers for the standard section types are filled
3015 in here too, while we're at it. */
3016
b34976b6 3017static bfd_boolean
da9f89d4 3018assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
252b5132
RH
3019{
3020 struct elf_obj_tdata *t = elf_tdata (abfd);
3021 asection *sec;
2b0f7ef9 3022 unsigned int section_number, secn;
252b5132 3023 Elf_Internal_Shdr **i_shdrp;
47cc2cf5 3024 struct bfd_elf_section_data *d;
252b5132
RH
3025
3026 section_number = 1;
3027
2b0f7ef9
JJ
3028 _bfd_elf_strtab_clear_all_refs (elf_shstrtab (abfd));
3029
da9f89d4
L
3030 /* SHT_GROUP sections are in relocatable files only. */
3031 if (link_info == NULL || link_info->relocatable)
252b5132 3032 {
da9f89d4 3033 /* Put SHT_GROUP sections first. */
04dd1667 3034 for (sec = abfd->sections; sec != NULL; sec = sec->next)
47cc2cf5 3035 {
5daa8fe7 3036 d = elf_section_data (sec);
da9f89d4
L
3037
3038 if (d->this_hdr.sh_type == SHT_GROUP)
3039 {
5daa8fe7 3040 if (sec->flags & SEC_LINKER_CREATED)
da9f89d4
L
3041 {
3042 /* Remove the linker created SHT_GROUP sections. */
5daa8fe7 3043 bfd_section_list_remove (abfd, sec);
da9f89d4 3044 abfd->section_count--;
da9f89d4
L
3045 }
3046 else
3047 {
3048 if (section_number == SHN_LORESERVE)
3049 section_number += SHN_HIRESERVE + 1 - SHN_LORESERVE;
3050 d->this_idx = section_number++;
3051 }
3052 }
47cc2cf5
PB
3053 }
3054 }
3055
3056 for (sec = abfd->sections; sec; sec = sec->next)
3057 {
3058 d = elf_section_data (sec);
3059
3060 if (d->this_hdr.sh_type != SHT_GROUP)
3061 {
3062 if (section_number == SHN_LORESERVE)
3063 section_number += SHN_HIRESERVE + 1 - SHN_LORESERVE;
3064 d->this_idx = section_number++;
3065 }
2b0f7ef9 3066 _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->this_hdr.sh_name);
252b5132
RH
3067 if ((sec->flags & SEC_RELOC) == 0)
3068 d->rel_idx = 0;
3069 else
2b0f7ef9 3070 {
9ad5cbcf
AM
3071 if (section_number == SHN_LORESERVE)
3072 section_number += SHN_HIRESERVE + 1 - SHN_LORESERVE;
2b0f7ef9
JJ
3073 d->rel_idx = section_number++;
3074 _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->rel_hdr.sh_name);
3075 }
23bc299b
MM
3076
3077 if (d->rel_hdr2)
2b0f7ef9 3078 {
9ad5cbcf
AM
3079 if (section_number == SHN_LORESERVE)
3080 section_number += SHN_HIRESERVE + 1 - SHN_LORESERVE;
2b0f7ef9
JJ
3081 d->rel_idx2 = section_number++;
3082 _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->rel_hdr2->sh_name);
3083 }
23bc299b
MM
3084 else
3085 d->rel_idx2 = 0;
252b5132
RH
3086 }
3087
9ad5cbcf
AM
3088 if (section_number == SHN_LORESERVE)
3089 section_number += SHN_HIRESERVE + 1 - SHN_LORESERVE;
252b5132 3090 t->shstrtab_section = section_number++;
2b0f7ef9 3091 _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->shstrtab_hdr.sh_name);
252b5132 3092 elf_elfheader (abfd)->e_shstrndx = t->shstrtab_section;
252b5132
RH
3093
3094 if (bfd_get_symcount (abfd) > 0)
3095 {
9ad5cbcf
AM
3096 if (section_number == SHN_LORESERVE)
3097 section_number += SHN_HIRESERVE + 1 - SHN_LORESERVE;
252b5132 3098 t->symtab_section = section_number++;
2b0f7ef9 3099 _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->symtab_hdr.sh_name);
9ad5cbcf
AM
3100 if (section_number > SHN_LORESERVE - 2)
3101 {
3102 if (section_number == SHN_LORESERVE)
3103 section_number += SHN_HIRESERVE + 1 - SHN_LORESERVE;
3104 t->symtab_shndx_section = section_number++;
3105 t->symtab_shndx_hdr.sh_name
3106 = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
b34976b6 3107 ".symtab_shndx", FALSE);
9ad5cbcf 3108 if (t->symtab_shndx_hdr.sh_name == (unsigned int) -1)
b34976b6 3109 return FALSE;
9ad5cbcf
AM
3110 }
3111 if (section_number == SHN_LORESERVE)
3112 section_number += SHN_HIRESERVE + 1 - SHN_LORESERVE;
252b5132 3113 t->strtab_section = section_number++;
2b0f7ef9 3114 _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->strtab_hdr.sh_name);
252b5132
RH
3115 }
3116
2b0f7ef9
JJ
3117 _bfd_elf_strtab_finalize (elf_shstrtab (abfd));
3118 t->shstrtab_hdr.sh_size = _bfd_elf_strtab_size (elf_shstrtab (abfd));
9ad5cbcf
AM
3119
3120 elf_numsections (abfd) = section_number;
252b5132 3121 elf_elfheader (abfd)->e_shnum = section_number;
9ad5cbcf
AM
3122 if (section_number > SHN_LORESERVE)
3123 elf_elfheader (abfd)->e_shnum -= SHN_HIRESERVE + 1 - SHN_LORESERVE;
252b5132
RH
3124
3125 /* Set up the list of section header pointers, in agreement with the
3126 indices. */
d0fb9a8d 3127 i_shdrp = bfd_zalloc2 (abfd, section_number, sizeof (Elf_Internal_Shdr *));
252b5132 3128 if (i_shdrp == NULL)
b34976b6 3129 return FALSE;
252b5132 3130
d0fb9a8d 3131 i_shdrp[0] = bfd_zalloc (abfd, sizeof (Elf_Internal_Shdr));
252b5132
RH
3132 if (i_shdrp[0] == NULL)
3133 {
3134 bfd_release (abfd, i_shdrp);
b34976b6 3135 return FALSE;
252b5132 3136 }
252b5132
RH
3137
3138 elf_elfsections (abfd) = i_shdrp;
3139
3140 i_shdrp[t->shstrtab_section] = &t->shstrtab_hdr;
3141 if (bfd_get_symcount (abfd) > 0)
3142 {
3143 i_shdrp[t->symtab_section] = &t->symtab_hdr;
9ad5cbcf
AM
3144 if (elf_numsections (abfd) > SHN_LORESERVE)
3145 {
3146 i_shdrp[t->symtab_shndx_section] = &t->symtab_shndx_hdr;
3147 t->symtab_shndx_hdr.sh_link = t->symtab_section;
3148 }
252b5132
RH
3149 i_shdrp[t->strtab_section] = &t->strtab_hdr;
3150 t->symtab_hdr.sh_link = t->strtab_section;
3151 }
38ce5b11 3152
252b5132
RH
3153 for (sec = abfd->sections; sec; sec = sec->next)
3154 {
3155 struct bfd_elf_section_data *d = elf_section_data (sec);
3156 asection *s;
3157 const char *name;
3158
3159 i_shdrp[d->this_idx] = &d->this_hdr;
3160 if (d->rel_idx != 0)
3161 i_shdrp[d->rel_idx] = &d->rel_hdr;
23bc299b
MM
3162 if (d->rel_idx2 != 0)
3163 i_shdrp[d->rel_idx2] = d->rel_hdr2;
252b5132
RH
3164
3165 /* Fill in the sh_link and sh_info fields while we're at it. */
3166
3167 /* sh_link of a reloc section is the section index of the symbol
3168 table. sh_info is the section index of the section to which
3169 the relocation entries apply. */
3170 if (d->rel_idx != 0)
3171 {
3172 d->rel_hdr.sh_link = t->symtab_section;
3173 d->rel_hdr.sh_info = d->this_idx;
3174 }
23bc299b
MM
3175 if (d->rel_idx2 != 0)
3176 {
3177 d->rel_hdr2->sh_link = t->symtab_section;
3178 d->rel_hdr2->sh_info = d->this_idx;
3179 }
252b5132 3180
38ce5b11
L
3181 /* We need to set up sh_link for SHF_LINK_ORDER. */
3182 if ((d->this_hdr.sh_flags & SHF_LINK_ORDER) != 0)
3183 {
3184 s = elf_linked_to_section (sec);
3185 if (s)
38ce5b11 3186 {
f2876037 3187 /* elf_linked_to_section points to the input section. */
ccd2ec6a 3188 if (link_info != NULL)
38ce5b11 3189 {
f2876037 3190 /* Check discarded linkonce section. */
ccd2ec6a 3191 if (elf_discarded_section (s))
38ce5b11 3192 {
ccd2ec6a
L
3193 asection *kept;
3194 (*_bfd_error_handler)
3195 (_("%B: sh_link of section `%A' points to discarded section `%A' of `%B'"),
3196 abfd, d->this_hdr.bfd_section,
3197 s, s->owner);
3198 /* Point to the kept section if it has the same
3199 size as the discarded one. */
c0f00686 3200 kept = _bfd_elf_check_kept_section (s, link_info);
ccd2ec6a 3201 if (kept == NULL)
185d09ad 3202 {
ccd2ec6a
L
3203 bfd_set_error (bfd_error_bad_value);
3204 return FALSE;
185d09ad 3205 }
ccd2ec6a 3206 s = kept;
38ce5b11 3207 }
e424ecc8 3208
ccd2ec6a
L
3209 s = s->output_section;
3210 BFD_ASSERT (s != NULL);
38ce5b11 3211 }
f2876037
L
3212 else
3213 {
3214 /* Handle objcopy. */
3215 if (s->output_section == NULL)
3216 {
3217 (*_bfd_error_handler)
3218 (_("%B: sh_link of section `%A' points to removed section `%A' of `%B'"),
3219 abfd, d->this_hdr.bfd_section, s, s->owner);
3220 bfd_set_error (bfd_error_bad_value);
3221 return FALSE;
3222 }
3223 s = s->output_section;
3224 }
ccd2ec6a
L
3225 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3226 }
3227 else
3228 {
3229 /* PR 290:
3230 The Intel C compiler generates SHT_IA_64_UNWIND with
3231 SHF_LINK_ORDER. But it doesn't set the sh_link or
3232 sh_info fields. Hence we could get the situation
3233 where s is NULL. */
3234 const struct elf_backend_data *bed
3235 = get_elf_backend_data (abfd);
3236 if (bed->link_order_error_handler)
3237 bed->link_order_error_handler
3238 (_("%B: warning: sh_link not set for section `%A'"),
3239 abfd, sec);
38ce5b11
L
3240 }
3241 }
3242
252b5132
RH
3243 switch (d->this_hdr.sh_type)
3244 {
3245 case SHT_REL:
3246 case SHT_RELA:
3247 /* A reloc section which we are treating as a normal BFD
3248 section. sh_link is the section index of the symbol
3249 table. sh_info is the section index of the section to
3250 which the relocation entries apply. We assume that an
3251 allocated reloc section uses the dynamic symbol table.
3252 FIXME: How can we be sure? */
3253 s = bfd_get_section_by_name (abfd, ".dynsym");
3254 if (s != NULL)
3255 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3256
3257 /* We look up the section the relocs apply to by name. */
3258 name = sec->name;
3259 if (d->this_hdr.sh_type == SHT_REL)
3260 name += 4;
3261 else
3262 name += 5;
3263 s = bfd_get_section_by_name (abfd, name);
3264 if (s != NULL)
3265 d->this_hdr.sh_info = elf_section_data (s)->this_idx;
3266 break;
3267
3268 case SHT_STRTAB:
3269 /* We assume that a section named .stab*str is a stabs
3270 string section. We look for a section with the same name
3271 but without the trailing ``str'', and set its sh_link
3272 field to point to this section. */
0112cd26 3273 if (CONST_STRNEQ (sec->name, ".stab")
252b5132
RH
3274 && strcmp (sec->name + strlen (sec->name) - 3, "str") == 0)
3275 {
3276 size_t len;
3277 char *alc;
3278
3279 len = strlen (sec->name);
217aa764 3280 alc = bfd_malloc (len - 2);
252b5132 3281 if (alc == NULL)
b34976b6 3282 return FALSE;
d4c88bbb 3283 memcpy (alc, sec->name, len - 3);
252b5132
RH
3284 alc[len - 3] = '\0';
3285 s = bfd_get_section_by_name (abfd, alc);
3286 free (alc);
3287 if (s != NULL)
3288 {
3289 elf_section_data (s)->this_hdr.sh_link = d->this_idx;
3290
3291 /* This is a .stab section. */
0594c12d
AM
3292 if (elf_section_data (s)->this_hdr.sh_entsize == 0)
3293 elf_section_data (s)->this_hdr.sh_entsize
3294 = 4 + 2 * bfd_get_arch_size (abfd) / 8;
252b5132
RH
3295 }
3296 }
3297 break;
3298
3299 case SHT_DYNAMIC:
3300 case SHT_DYNSYM:
3301 case SHT_GNU_verneed:
3302 case SHT_GNU_verdef:
3303 /* sh_link is the section header index of the string table
3304 used for the dynamic entries, or the symbol table, or the
3305 version strings. */
3306 s = bfd_get_section_by_name (abfd, ".dynstr");
3307 if (s != NULL)
3308 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3309 break;
3310
7f1204bb
JJ
3311 case SHT_GNU_LIBLIST:
3312 /* sh_link is the section header index of the prelink library
3313 list
3314 used for the dynamic entries, or the symbol table, or the
3315 version strings. */
3316 s = bfd_get_section_by_name (abfd, (sec->flags & SEC_ALLOC)
3317 ? ".dynstr" : ".gnu.libstr");
3318 if (s != NULL)
3319 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3320 break;
3321
252b5132 3322 case SHT_HASH:
fdc90cb4 3323 case SHT_GNU_HASH:
252b5132
RH
3324 case SHT_GNU_versym:
3325 /* sh_link is the section header index of the symbol table
3326 this hash table or version table is for. */
3327 s = bfd_get_section_by_name (abfd, ".dynsym");
3328 if (s != NULL)
3329 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3330 break;
dbb410c3
AM
3331
3332 case SHT_GROUP:
3333 d->this_hdr.sh_link = t->symtab_section;
252b5132
RH
3334 }
3335 }
3336
2b0f7ef9 3337 for (secn = 1; secn < section_number; ++secn)
9ad5cbcf
AM
3338 if (i_shdrp[secn] == NULL)
3339 i_shdrp[secn] = i_shdrp[0];
3340 else
3341 i_shdrp[secn]->sh_name = _bfd_elf_strtab_offset (elf_shstrtab (abfd),
3342 i_shdrp[secn]->sh_name);
b34976b6 3343 return TRUE;
252b5132
RH
3344}
3345
3346/* Map symbol from it's internal number to the external number, moving
3347 all local symbols to be at the head of the list. */
3348
5372391b 3349static bfd_boolean
217aa764 3350sym_is_global (bfd *abfd, asymbol *sym)
252b5132
RH
3351{
3352 /* If the backend has a special mapping, use it. */
9c5bfbb7 3353 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
217aa764
AM
3354 if (bed->elf_backend_sym_is_global)
3355 return (*bed->elf_backend_sym_is_global) (abfd, sym);
252b5132
RH
3356
3357 return ((sym->flags & (BSF_GLOBAL | BSF_WEAK)) != 0
3358 || bfd_is_und_section (bfd_get_section (sym))
3359 || bfd_is_com_section (bfd_get_section (sym)));
3360}
3361
5372391b
AM
3362/* Don't output section symbols for sections that are not going to be
3363 output. Also, don't output section symbols for reloc and other
3364 special sections. */
3365
3366static bfd_boolean
3367ignore_section_sym (bfd *abfd, asymbol *sym)
3368{
3369 return ((sym->flags & BSF_SECTION_SYM) != 0
3370 && (sym->value != 0
3371 || (sym->section->owner != abfd
3372 && (sym->section->output_section->owner != abfd
3373 || sym->section->output_offset != 0))));
3374}
3375
b34976b6 3376static bfd_boolean
217aa764 3377elf_map_symbols (bfd *abfd)
252b5132 3378{
dc810e39 3379 unsigned int symcount = bfd_get_symcount (abfd);
252b5132
RH
3380 asymbol **syms = bfd_get_outsymbols (abfd);
3381 asymbol **sect_syms;
dc810e39
AM
3382 unsigned int num_locals = 0;
3383 unsigned int num_globals = 0;
3384 unsigned int num_locals2 = 0;
3385 unsigned int num_globals2 = 0;
252b5132 3386 int max_index = 0;
dc810e39 3387 unsigned int idx;
252b5132
RH
3388 asection *asect;
3389 asymbol **new_syms;
252b5132
RH
3390
3391#ifdef DEBUG
3392 fprintf (stderr, "elf_map_symbols\n");
3393 fflush (stderr);
3394#endif
3395
252b5132
RH
3396 for (asect = abfd->sections; asect; asect = asect->next)
3397 {
3398 if (max_index < asect->index)
3399 max_index = asect->index;
3400 }
3401
3402 max_index++;
d0fb9a8d 3403 sect_syms = bfd_zalloc2 (abfd, max_index, sizeof (asymbol *));
252b5132 3404 if (sect_syms == NULL)
b34976b6 3405 return FALSE;
252b5132 3406 elf_section_syms (abfd) = sect_syms;
4e89ac30 3407 elf_num_section_syms (abfd) = max_index;
252b5132 3408
079e9a2f
AM
3409 /* Init sect_syms entries for any section symbols we have already
3410 decided to output. */
252b5132
RH
3411 for (idx = 0; idx < symcount; idx++)
3412 {
dc810e39 3413 asymbol *sym = syms[idx];
c044fabd 3414
252b5132 3415 if ((sym->flags & BSF_SECTION_SYM) != 0
5372391b 3416 && !ignore_section_sym (abfd, sym))
252b5132 3417 {
5372391b 3418 asection *sec = sym->section;
252b5132 3419
5372391b
AM
3420 if (sec->owner != abfd)
3421 sec = sec->output_section;
252b5132 3422
5372391b 3423 sect_syms[sec->index] = syms[idx];
252b5132
RH
3424 }
3425 }
3426
252b5132
RH
3427 /* Classify all of the symbols. */
3428 for (idx = 0; idx < symcount; idx++)
3429 {
5372391b
AM
3430 if (ignore_section_sym (abfd, syms[idx]))
3431 continue;
252b5132
RH
3432 if (!sym_is_global (abfd, syms[idx]))
3433 num_locals++;
3434 else
3435 num_globals++;
3436 }
079e9a2f 3437
5372391b 3438 /* We will be adding a section symbol for each normal BFD section. Most
079e9a2f
AM
3439 sections will already have a section symbol in outsymbols, but
3440 eg. SHT_GROUP sections will not, and we need the section symbol mapped
3441 at least in that case. */
252b5132
RH
3442 for (asect = abfd->sections; asect; asect = asect->next)
3443 {
079e9a2f 3444 if (sect_syms[asect->index] == NULL)
252b5132 3445 {
079e9a2f 3446 if (!sym_is_global (abfd, asect->symbol))
252b5132
RH
3447 num_locals++;
3448 else
3449 num_globals++;
252b5132
RH
3450 }
3451 }
3452
3453 /* Now sort the symbols so the local symbols are first. */
d0fb9a8d 3454 new_syms = bfd_alloc2 (abfd, num_locals + num_globals, sizeof (asymbol *));
dc810e39 3455
252b5132 3456 if (new_syms == NULL)
b34976b6 3457 return FALSE;
252b5132
RH
3458
3459 for (idx = 0; idx < symcount; idx++)
3460 {
3461 asymbol *sym = syms[idx];
dc810e39 3462 unsigned int i;
252b5132 3463
5372391b
AM
3464 if (ignore_section_sym (abfd, sym))
3465 continue;
252b5132
RH
3466 if (!sym_is_global (abfd, sym))
3467 i = num_locals2++;
3468 else
3469 i = num_locals + num_globals2++;
3470 new_syms[i] = sym;
3471 sym->udata.i = i + 1;
3472 }
3473 for (asect = abfd->sections; asect; asect = asect->next)
3474 {
079e9a2f 3475 if (sect_syms[asect->index] == NULL)
252b5132 3476 {
079e9a2f 3477 asymbol *sym = asect->symbol;
dc810e39 3478 unsigned int i;
252b5132 3479
079e9a2f 3480 sect_syms[asect->index] = sym;
252b5132
RH
3481 if (!sym_is_global (abfd, sym))
3482 i = num_locals2++;
3483 else
3484 i = num_locals + num_globals2++;
3485 new_syms[i] = sym;
3486 sym->udata.i = i + 1;
3487 }
3488 }
3489
3490 bfd_set_symtab (abfd, new_syms, num_locals + num_globals);
3491
3492 elf_num_locals (abfd) = num_locals;
3493 elf_num_globals (abfd) = num_globals;
b34976b6 3494 return TRUE;
252b5132
RH
3495}
3496
3497/* Align to the maximum file alignment that could be required for any
3498 ELF data structure. */
3499
268b6b39 3500static inline file_ptr
217aa764 3501align_file_position (file_ptr off, int align)
252b5132
RH
3502{
3503 return (off + align - 1) & ~(align - 1);
3504}
3505
3506/* Assign a file position to a section, optionally aligning to the
3507 required section alignment. */
3508
217aa764
AM
3509file_ptr
3510_bfd_elf_assign_file_position_for_section (Elf_Internal_Shdr *i_shdrp,
3511 file_ptr offset,
3512 bfd_boolean align)
252b5132
RH
3513{
3514 if (align)
3515 {
3516 unsigned int al;
3517
3518 al = i_shdrp->sh_addralign;
3519 if (al > 1)
3520 offset = BFD_ALIGN (offset, al);
3521 }
3522 i_shdrp->sh_offset = offset;
3523 if (i_shdrp->bfd_section != NULL)
3524 i_shdrp->bfd_section->filepos = offset;
3525 if (i_shdrp->sh_type != SHT_NOBITS)
3526 offset += i_shdrp->sh_size;
3527 return offset;
3528}
3529
3530/* Compute the file positions we are going to put the sections at, and
3531 otherwise prepare to begin writing out the ELF file. If LINK_INFO
3532 is not NULL, this is being called by the ELF backend linker. */
3533
b34976b6 3534bfd_boolean
217aa764
AM
3535_bfd_elf_compute_section_file_positions (bfd *abfd,
3536 struct bfd_link_info *link_info)
252b5132 3537{
9c5bfbb7 3538 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
b34976b6 3539 bfd_boolean failed;
4b6c0f2f 3540 struct bfd_strtab_hash *strtab = NULL;
252b5132
RH
3541 Elf_Internal_Shdr *shstrtab_hdr;
3542
3543 if (abfd->output_has_begun)
b34976b6 3544 return TRUE;
252b5132
RH
3545
3546 /* Do any elf backend specific processing first. */
3547 if (bed->elf_backend_begin_write_processing)
3548 (*bed->elf_backend_begin_write_processing) (abfd, link_info);
3549
3550 if (! prep_headers (abfd))
b34976b6 3551 return FALSE;
252b5132 3552
e6c51ed4
NC
3553 /* Post process the headers if necessary. */
3554 if (bed->elf_backend_post_process_headers)
3555 (*bed->elf_backend_post_process_headers) (abfd, link_info);
3556
b34976b6 3557 failed = FALSE;
252b5132
RH
3558 bfd_map_over_sections (abfd, elf_fake_sections, &failed);
3559 if (failed)
b34976b6 3560 return FALSE;
252b5132 3561
da9f89d4 3562 if (!assign_section_numbers (abfd, link_info))
b34976b6 3563 return FALSE;
252b5132
RH
3564
3565 /* The backend linker builds symbol table information itself. */
3566 if (link_info == NULL && bfd_get_symcount (abfd) > 0)
3567 {
3568 /* Non-zero if doing a relocatable link. */
3569 int relocatable_p = ! (abfd->flags & (EXEC_P | DYNAMIC));
3570
3571 if (! swap_out_syms (abfd, &strtab, relocatable_p))
b34976b6 3572 return FALSE;
252b5132
RH
3573 }
3574
1126897b 3575 if (link_info == NULL)
dbb410c3 3576 {
1126897b 3577 bfd_map_over_sections (abfd, bfd_elf_set_group_contents, &failed);
dbb410c3 3578 if (failed)
b34976b6 3579 return FALSE;
dbb410c3
AM
3580 }
3581
252b5132
RH
3582 shstrtab_hdr = &elf_tdata (abfd)->shstrtab_hdr;
3583 /* sh_name was set in prep_headers. */
3584 shstrtab_hdr->sh_type = SHT_STRTAB;
3585 shstrtab_hdr->sh_flags = 0;
3586 shstrtab_hdr->sh_addr = 0;
2b0f7ef9 3587 shstrtab_hdr->sh_size = _bfd_elf_strtab_size (elf_shstrtab (abfd));
252b5132
RH
3588 shstrtab_hdr->sh_entsize = 0;
3589 shstrtab_hdr->sh_link = 0;
3590 shstrtab_hdr->sh_info = 0;
3591 /* sh_offset is set in assign_file_positions_except_relocs. */
3592 shstrtab_hdr->sh_addralign = 1;
3593
c84fca4d 3594 if (!assign_file_positions_except_relocs (abfd, link_info))
b34976b6 3595 return FALSE;
252b5132
RH
3596
3597 if (link_info == NULL && bfd_get_symcount (abfd) > 0)
3598 {
3599 file_ptr off;
3600 Elf_Internal_Shdr *hdr;
3601
3602 off = elf_tdata (abfd)->next_file_pos;
3603
3604 hdr = &elf_tdata (abfd)->symtab_hdr;
b34976b6 3605 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
252b5132 3606
9ad5cbcf
AM
3607 hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
3608 if (hdr->sh_size != 0)
b34976b6 3609 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
9ad5cbcf 3610
252b5132 3611 hdr = &elf_tdata (abfd)->strtab_hdr;
b34976b6 3612 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
252b5132
RH
3613
3614 elf_tdata (abfd)->next_file_pos = off;
3615
3616 /* Now that we know where the .strtab section goes, write it
3617 out. */
3618 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
3619 || ! _bfd_stringtab_emit (abfd, strtab))
b34976b6 3620 return FALSE;
252b5132
RH
3621 _bfd_stringtab_free (strtab);
3622 }
3623
b34976b6 3624 abfd->output_has_begun = TRUE;
252b5132 3625
b34976b6 3626 return TRUE;
252b5132
RH
3627}
3628
8ded5a0f
AM
3629/* Make an initial estimate of the size of the program header. If we
3630 get the number wrong here, we'll redo section placement. */
3631
3632static bfd_size_type
3633get_program_header_size (bfd *abfd, struct bfd_link_info *info)
3634{
3635 size_t segs;
3636 asection *s;
3637 const struct elf_backend_data *bed;
3638
3639 /* Assume we will need exactly two PT_LOAD segments: one for text
3640 and one for data. */
3641 segs = 2;
3642
3643 s = bfd_get_section_by_name (abfd, ".interp");
3644 if (s != NULL && (s->flags & SEC_LOAD) != 0)
3645 {
3646 /* If we have a loadable interpreter section, we need a
3647 PT_INTERP segment. In this case, assume we also need a
3648 PT_PHDR segment, although that may not be true for all
3649 targets. */
3650 segs += 2;
3651 }
3652
3653 if (bfd_get_section_by_name (abfd, ".dynamic") != NULL)
3654 {
3655 /* We need a PT_DYNAMIC segment. */
3656 ++segs;
c9df6640
L
3657
3658 if (elf_tdata (abfd)->relro)
3659 {
3660 /* We need a PT_GNU_RELRO segment only when there is a
3661 PT_DYNAMIC segment. */
3662 ++segs;
3663 }
8ded5a0f
AM
3664 }
3665
3666 if (elf_tdata (abfd)->eh_frame_hdr)
3667 {
3668 /* We need a PT_GNU_EH_FRAME segment. */
3669 ++segs;
3670 }
3671
3672 if (elf_tdata (abfd)->stack_flags)
3673 {
3674 /* We need a PT_GNU_STACK segment. */
3675 ++segs;
3676 }
3677
8ded5a0f
AM
3678 for (s = abfd->sections; s != NULL; s = s->next)
3679 {
3680 if ((s->flags & SEC_LOAD) != 0
0112cd26 3681 && CONST_STRNEQ (s->name, ".note"))
8ded5a0f
AM
3682 {
3683 /* We need a PT_NOTE segment. */
3684 ++segs;
3685 }
3686 }
3687
3688 for (s = abfd->sections; s != NULL; s = s->next)
3689 {
3690 if (s->flags & SEC_THREAD_LOCAL)
3691 {
3692 /* We need a PT_TLS segment. */
3693 ++segs;
3694 break;
3695 }
3696 }
3697
3698 /* Let the backend count up any program headers it might need. */
3699 bed = get_elf_backend_data (abfd);
3700 if (bed->elf_backend_additional_program_headers)
3701 {
3702 int a;
3703
3704 a = (*bed->elf_backend_additional_program_headers) (abfd, info);
3705 if (a == -1)
3706 abort ();
3707 segs += a;
3708 }
3709
3710 return segs * bed->s->sizeof_phdr;
3711}
3712
252b5132
RH
3713/* Create a mapping from a set of sections to a program segment. */
3714
217aa764
AM
3715static struct elf_segment_map *
3716make_mapping (bfd *abfd,
3717 asection **sections,
3718 unsigned int from,
3719 unsigned int to,
3720 bfd_boolean phdr)
252b5132
RH
3721{
3722 struct elf_segment_map *m;
3723 unsigned int i;
3724 asection **hdrpp;
dc810e39 3725 bfd_size_type amt;
252b5132 3726
dc810e39
AM
3727 amt = sizeof (struct elf_segment_map);
3728 amt += (to - from - 1) * sizeof (asection *);
217aa764 3729 m = bfd_zalloc (abfd, amt);
252b5132
RH
3730 if (m == NULL)
3731 return NULL;
3732 m->next = NULL;
3733 m->p_type = PT_LOAD;
3734 for (i = from, hdrpp = sections + from; i < to; i++, hdrpp++)
3735 m->sections[i - from] = *hdrpp;
3736 m->count = to - from;
3737
3738 if (from == 0 && phdr)
3739 {
3740 /* Include the headers in the first PT_LOAD segment. */
3741 m->includes_filehdr = 1;
3742 m->includes_phdrs = 1;
3743 }
3744
3745 return m;
3746}
3747
229fcec5
MM
3748/* Create the PT_DYNAMIC segment, which includes DYNSEC. Returns NULL
3749 on failure. */
3750
3751struct elf_segment_map *
3752_bfd_elf_make_dynamic_segment (bfd *abfd, asection *dynsec)
3753{
3754 struct elf_segment_map *m;
3755
3756 m = bfd_zalloc (abfd, sizeof (struct elf_segment_map));
3757 if (m == NULL)
3758 return NULL;
3759 m->next = NULL;
3760 m->p_type = PT_DYNAMIC;
3761 m->count = 1;
3762 m->sections[0] = dynsec;
3763
3764 return m;
3765}
3766
8ded5a0f 3767/* Possibly add or remove segments from the segment map. */
252b5132 3768
b34976b6 3769static bfd_boolean
8ded5a0f 3770elf_modify_segment_map (bfd *abfd, struct bfd_link_info *info)
252b5132 3771{
252e386e 3772 struct elf_segment_map **m;
8ded5a0f 3773 const struct elf_backend_data *bed;
252b5132 3774
8ded5a0f
AM
3775 /* The placement algorithm assumes that non allocated sections are
3776 not in PT_LOAD segments. We ensure this here by removing such
3777 sections from the segment map. We also remove excluded
252e386e
AM
3778 sections. Finally, any PT_LOAD segment without sections is
3779 removed. */
3780 m = &elf_tdata (abfd)->segment_map;
3781 while (*m)
8ded5a0f
AM
3782 {
3783 unsigned int i, new_count;
252b5132 3784
252e386e 3785 for (new_count = 0, i = 0; i < (*m)->count; i++)
8ded5a0f 3786 {
252e386e
AM
3787 if (((*m)->sections[i]->flags & SEC_EXCLUDE) == 0
3788 && (((*m)->sections[i]->flags & SEC_ALLOC) != 0
3789 || (*m)->p_type != PT_LOAD))
8ded5a0f 3790 {
252e386e
AM
3791 (*m)->sections[new_count] = (*m)->sections[i];
3792 new_count++;
8ded5a0f
AM
3793 }
3794 }
252e386e 3795 (*m)->count = new_count;
252b5132 3796
252e386e
AM
3797 if ((*m)->p_type == PT_LOAD && (*m)->count == 0)
3798 *m = (*m)->next;
3799 else
3800 m = &(*m)->next;
8ded5a0f 3801 }
252b5132 3802
8ded5a0f
AM
3803 bed = get_elf_backend_data (abfd);
3804 if (bed->elf_backend_modify_segment_map != NULL)
252b5132 3805 {
252e386e 3806 if (!(*bed->elf_backend_modify_segment_map) (abfd, info))
8ded5a0f 3807 return FALSE;
252b5132 3808 }
252b5132 3809
8ded5a0f
AM
3810 return TRUE;
3811}
252b5132 3812
8ded5a0f 3813/* Set up a mapping from BFD sections to program segments. */
252b5132 3814
8ded5a0f
AM
3815bfd_boolean
3816_bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
3817{
3818 unsigned int count;
3819 struct elf_segment_map *m;
3820 asection **sections = NULL;
3821 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 3822
8ded5a0f
AM
3823 if (elf_tdata (abfd)->segment_map == NULL
3824 && bfd_count_sections (abfd) != 0)
252b5132 3825 {
8ded5a0f
AM
3826 asection *s;
3827 unsigned int i;
3828 struct elf_segment_map *mfirst;
3829 struct elf_segment_map **pm;
3830 asection *last_hdr;
3831 bfd_vma last_size;
3832 unsigned int phdr_index;
3833 bfd_vma maxpagesize;
3834 asection **hdrpp;
3835 bfd_boolean phdr_in_segment = TRUE;
3836 bfd_boolean writable;
3837 int tls_count = 0;
3838 asection *first_tls = NULL;
3839 asection *dynsec, *eh_frame_hdr;
3840 bfd_size_type amt;
252b5132 3841
8ded5a0f 3842 /* Select the allocated sections, and sort them. */
252b5132 3843
8ded5a0f
AM
3844 sections = bfd_malloc2 (bfd_count_sections (abfd), sizeof (asection *));
3845 if (sections == NULL)
252b5132 3846 goto error_return;
252b5132 3847
8ded5a0f
AM
3848 i = 0;
3849 for (s = abfd->sections; s != NULL; s = s->next)
3850 {
3851 if ((s->flags & SEC_ALLOC) != 0)
3852 {
3853 sections[i] = s;
3854 ++i;
3855 }
3856 }
3857 BFD_ASSERT (i <= bfd_count_sections (abfd));
3858 count = i;
252b5132 3859
8ded5a0f 3860 qsort (sections, (size_t) count, sizeof (asection *), elf_sort_sections);
252b5132 3861
8ded5a0f 3862 /* Build the mapping. */
252b5132 3863
8ded5a0f
AM
3864 mfirst = NULL;
3865 pm = &mfirst;
252b5132 3866
8ded5a0f
AM
3867 /* If we have a .interp section, then create a PT_PHDR segment for
3868 the program headers and a PT_INTERP segment for the .interp
3869 section. */
3870 s = bfd_get_section_by_name (abfd, ".interp");
3871 if (s != NULL && (s->flags & SEC_LOAD) != 0)
3872 {
3873 amt = sizeof (struct elf_segment_map);
3874 m = bfd_zalloc (abfd, amt);
3875 if (m == NULL)
3876 goto error_return;
3877 m->next = NULL;
3878 m->p_type = PT_PHDR;
3879 /* FIXME: UnixWare and Solaris set PF_X, Irix 5 does not. */
3880 m->p_flags = PF_R | PF_X;
3881 m->p_flags_valid = 1;
3882 m->includes_phdrs = 1;
252b5132 3883
8ded5a0f
AM
3884 *pm = m;
3885 pm = &m->next;
252b5132 3886
8ded5a0f
AM
3887 amt = sizeof (struct elf_segment_map);
3888 m = bfd_zalloc (abfd, amt);
3889 if (m == NULL)
3890 goto error_return;
3891 m->next = NULL;
3892 m->p_type = PT_INTERP;
3893 m->count = 1;
3894 m->sections[0] = s;
3895
3896 *pm = m;
3897 pm = &m->next;
252b5132 3898 }
8ded5a0f
AM
3899
3900 /* Look through the sections. We put sections in the same program
3901 segment when the start of the second section can be placed within
3902 a few bytes of the end of the first section. */
3903 last_hdr = NULL;
3904 last_size = 0;
3905 phdr_index = 0;
3906 maxpagesize = bed->maxpagesize;
3907 writable = FALSE;
3908 dynsec = bfd_get_section_by_name (abfd, ".dynamic");
3909 if (dynsec != NULL
3910 && (dynsec->flags & SEC_LOAD) == 0)
3911 dynsec = NULL;
3912
3913 /* Deal with -Ttext or something similar such that the first section
3914 is not adjacent to the program headers. This is an
3915 approximation, since at this point we don't know exactly how many
3916 program headers we will need. */
3917 if (count > 0)
252b5132 3918 {
8ded5a0f
AM
3919 bfd_size_type phdr_size = elf_tdata (abfd)->program_header_size;
3920
62d7a5f6 3921 if (phdr_size == (bfd_size_type) -1)
8ded5a0f
AM
3922 phdr_size = get_program_header_size (abfd, info);
3923 if ((abfd->flags & D_PAGED) == 0
3924 || sections[0]->lma < phdr_size
3925 || sections[0]->lma % maxpagesize < phdr_size % maxpagesize)
3926 phdr_in_segment = FALSE;
252b5132
RH
3927 }
3928
8ded5a0f 3929 for (i = 0, hdrpp = sections; i < count; i++, hdrpp++)
252b5132 3930 {
8ded5a0f
AM
3931 asection *hdr;
3932 bfd_boolean new_segment;
3933
3934 hdr = *hdrpp;
3935
3936 /* See if this section and the last one will fit in the same
3937 segment. */
3938
3939 if (last_hdr == NULL)
3940 {
3941 /* If we don't have a segment yet, then we don't need a new
3942 one (we build the last one after this loop). */
3943 new_segment = FALSE;
3944 }
3945 else if (last_hdr->lma - last_hdr->vma != hdr->lma - hdr->vma)
3946 {
3947 /* If this section has a different relation between the
3948 virtual address and the load address, then we need a new
3949 segment. */
3950 new_segment = TRUE;
3951 }
3952 else if (BFD_ALIGN (last_hdr->lma + last_size, maxpagesize)
3953 < BFD_ALIGN (hdr->lma, maxpagesize))
3954 {
3955 /* If putting this section in this segment would force us to
3956 skip a page in the segment, then we need a new segment. */
3957 new_segment = TRUE;
3958 }
3959 else if ((last_hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0
3960 && (hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) != 0)
3961 {
3962 /* We don't want to put a loadable section after a
3963 nonloadable section in the same segment.
3964 Consider .tbss sections as loadable for this purpose. */
3965 new_segment = TRUE;
3966 }
3967 else if ((abfd->flags & D_PAGED) == 0)
3968 {
3969 /* If the file is not demand paged, which means that we
3970 don't require the sections to be correctly aligned in the
3971 file, then there is no other reason for a new segment. */
3972 new_segment = FALSE;
3973 }
3974 else if (! writable
3975 && (hdr->flags & SEC_READONLY) == 0
3976 && (((last_hdr->lma + last_size - 1)
3977 & ~(maxpagesize - 1))
3978 != (hdr->lma & ~(maxpagesize - 1))))
3979 {
3980 /* We don't want to put a writable section in a read only
3981 segment, unless they are on the same page in memory
3982 anyhow. We already know that the last section does not
3983 bring us past the current section on the page, so the
3984 only case in which the new section is not on the same
3985 page as the previous section is when the previous section
3986 ends precisely on a page boundary. */
3987 new_segment = TRUE;
3988 }
3989 else
3990 {
3991 /* Otherwise, we can use the same segment. */
3992 new_segment = FALSE;
3993 }
3994
2889e75b
NC
3995 /* Allow interested parties a chance to override our decision. */
3996 if (last_hdr && info->callbacks->override_segment_assignment)
3997 new_segment = info->callbacks->override_segment_assignment (info, abfd, hdr, last_hdr, new_segment);
3998
8ded5a0f
AM
3999 if (! new_segment)
4000 {
4001 if ((hdr->flags & SEC_READONLY) == 0)
4002 writable = TRUE;
4003 last_hdr = hdr;
4004 /* .tbss sections effectively have zero size. */
4005 if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD))
4006 != SEC_THREAD_LOCAL)
4007 last_size = hdr->size;
4008 else
4009 last_size = 0;
4010 continue;
4011 }
4012
4013 /* We need a new program segment. We must create a new program
4014 header holding all the sections from phdr_index until hdr. */
4015
4016 m = make_mapping (abfd, sections, phdr_index, i, phdr_in_segment);
4017 if (m == NULL)
4018 goto error_return;
4019
4020 *pm = m;
4021 pm = &m->next;
4022
252b5132 4023 if ((hdr->flags & SEC_READONLY) == 0)
b34976b6 4024 writable = TRUE;
8ded5a0f
AM
4025 else
4026 writable = FALSE;
4027
baaff79e
JJ
4028 last_hdr = hdr;
4029 /* .tbss sections effectively have zero size. */
e5caec89 4030 if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD)) != SEC_THREAD_LOCAL)
eea6121a 4031 last_size = hdr->size;
baaff79e
JJ
4032 else
4033 last_size = 0;
8ded5a0f
AM
4034 phdr_index = i;
4035 phdr_in_segment = FALSE;
252b5132
RH
4036 }
4037
8ded5a0f
AM
4038 /* Create a final PT_LOAD program segment. */
4039 if (last_hdr != NULL)
4040 {
4041 m = make_mapping (abfd, sections, phdr_index, i, phdr_in_segment);
4042 if (m == NULL)
4043 goto error_return;
252b5132 4044
8ded5a0f
AM
4045 *pm = m;
4046 pm = &m->next;
4047 }
252b5132 4048
8ded5a0f
AM
4049 /* If there is a .dynamic section, throw in a PT_DYNAMIC segment. */
4050 if (dynsec != NULL)
4051 {
4052 m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
4053 if (m == NULL)
4054 goto error_return;
4055 *pm = m;
4056 pm = &m->next;
4057 }
252b5132 4058
8ded5a0f
AM
4059 /* For each loadable .note section, add a PT_NOTE segment. We don't
4060 use bfd_get_section_by_name, because if we link together
4061 nonloadable .note sections and loadable .note sections, we will
4062 generate two .note sections in the output file. FIXME: Using
4063 names for section types is bogus anyhow. */
4064 for (s = abfd->sections; s != NULL; s = s->next)
4065 {
4066 if ((s->flags & SEC_LOAD) != 0
0112cd26 4067 && CONST_STRNEQ (s->name, ".note"))
8ded5a0f
AM
4068 {
4069 amt = sizeof (struct elf_segment_map);
4070 m = bfd_zalloc (abfd, amt);
4071 if (m == NULL)
4072 goto error_return;
4073 m->next = NULL;
4074 m->p_type = PT_NOTE;
4075 m->count = 1;
4076 m->sections[0] = s;
252b5132 4077
8ded5a0f
AM
4078 *pm = m;
4079 pm = &m->next;
4080 }
4081 if (s->flags & SEC_THREAD_LOCAL)
4082 {
4083 if (! tls_count)
4084 first_tls = s;
4085 tls_count++;
4086 }
4087 }
252b5132 4088
8ded5a0f
AM
4089 /* If there are any SHF_TLS output sections, add PT_TLS segment. */
4090 if (tls_count > 0)
4091 {
4092 int i;
252b5132 4093
8ded5a0f
AM
4094 amt = sizeof (struct elf_segment_map);
4095 amt += (tls_count - 1) * sizeof (asection *);
4096 m = bfd_zalloc (abfd, amt);
4097 if (m == NULL)
4098 goto error_return;
4099 m->next = NULL;
4100 m->p_type = PT_TLS;
4101 m->count = tls_count;
4102 /* Mandated PF_R. */
4103 m->p_flags = PF_R;
4104 m->p_flags_valid = 1;
4105 for (i = 0; i < tls_count; ++i)
4106 {
4107 BFD_ASSERT (first_tls->flags & SEC_THREAD_LOCAL);
4108 m->sections[i] = first_tls;
4109 first_tls = first_tls->next;
4110 }
252b5132 4111
8ded5a0f
AM
4112 *pm = m;
4113 pm = &m->next;
4114 }
252b5132 4115
8ded5a0f
AM
4116 /* If there is a .eh_frame_hdr section, throw in a PT_GNU_EH_FRAME
4117 segment. */
4118 eh_frame_hdr = elf_tdata (abfd)->eh_frame_hdr;
4119 if (eh_frame_hdr != NULL
4120 && (eh_frame_hdr->output_section->flags & SEC_LOAD) != 0)
252b5132 4121 {
dc810e39 4122 amt = sizeof (struct elf_segment_map);
217aa764 4123 m = bfd_zalloc (abfd, amt);
252b5132
RH
4124 if (m == NULL)
4125 goto error_return;
4126 m->next = NULL;
8ded5a0f 4127 m->p_type = PT_GNU_EH_FRAME;
252b5132 4128 m->count = 1;
8ded5a0f 4129 m->sections[0] = eh_frame_hdr->output_section;
252b5132
RH
4130
4131 *pm = m;
4132 pm = &m->next;
4133 }
13ae64f3 4134
8ded5a0f 4135 if (elf_tdata (abfd)->stack_flags)
13ae64f3 4136 {
8ded5a0f
AM
4137 amt = sizeof (struct elf_segment_map);
4138 m = bfd_zalloc (abfd, amt);
4139 if (m == NULL)
4140 goto error_return;
4141 m->next = NULL;
4142 m->p_type = PT_GNU_STACK;
4143 m->p_flags = elf_tdata (abfd)->stack_flags;
4144 m->p_flags_valid = 1;
252b5132 4145
8ded5a0f
AM
4146 *pm = m;
4147 pm = &m->next;
4148 }
65765700 4149
c9df6640 4150 if (dynsec != NULL && elf_tdata (abfd)->relro)
8ded5a0f 4151 {
c9df6640
L
4152 /* We make a PT_GNU_RELRO segment only when there is a
4153 PT_DYNAMIC segment. */
8ded5a0f
AM
4154 amt = sizeof (struct elf_segment_map);
4155 m = bfd_zalloc (abfd, amt);
4156 if (m == NULL)
4157 goto error_return;
4158 m->next = NULL;
4159 m->p_type = PT_GNU_RELRO;
4160 m->p_flags = PF_R;
4161 m->p_flags_valid = 1;
65765700 4162
8ded5a0f
AM
4163 *pm = m;
4164 pm = &m->next;
4165 }
9ee5e499 4166
8ded5a0f
AM
4167 free (sections);
4168 elf_tdata (abfd)->segment_map = mfirst;
9ee5e499
JJ
4169 }
4170
8ded5a0f
AM
4171 if (!elf_modify_segment_map (abfd, info))
4172 return FALSE;
8c37241b 4173
8ded5a0f
AM
4174 for (count = 0, m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
4175 ++count;
4176 elf_tdata (abfd)->program_header_size = count * bed->s->sizeof_phdr;
252b5132 4177
b34976b6 4178 return TRUE;
252b5132
RH
4179
4180 error_return:
4181 if (sections != NULL)
4182 free (sections);
b34976b6 4183 return FALSE;
252b5132
RH
4184}
4185
4186/* Sort sections by address. */
4187
4188static int
217aa764 4189elf_sort_sections (const void *arg1, const void *arg2)
252b5132
RH
4190{
4191 const asection *sec1 = *(const asection **) arg1;
4192 const asection *sec2 = *(const asection **) arg2;
eecdbe52 4193 bfd_size_type size1, size2;
252b5132
RH
4194
4195 /* Sort by LMA first, since this is the address used to
4196 place the section into a segment. */
4197 if (sec1->lma < sec2->lma)
4198 return -1;
4199 else if (sec1->lma > sec2->lma)
4200 return 1;
4201
4202 /* Then sort by VMA. Normally the LMA and the VMA will be
4203 the same, and this will do nothing. */
4204 if (sec1->vma < sec2->vma)
4205 return -1;
4206 else if (sec1->vma > sec2->vma)
4207 return 1;
4208
4209 /* Put !SEC_LOAD sections after SEC_LOAD ones. */
4210
07c6e936 4211#define TOEND(x) (((x)->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0)
252b5132
RH
4212
4213 if (TOEND (sec1))
4214 {
4215 if (TOEND (sec2))
00a7cdc5
NC
4216 {
4217 /* If the indicies are the same, do not return 0
4218 here, but continue to try the next comparison. */
4219 if (sec1->target_index - sec2->target_index != 0)
4220 return sec1->target_index - sec2->target_index;
4221 }
252b5132
RH
4222 else
4223 return 1;
4224 }
00a7cdc5 4225 else if (TOEND (sec2))
252b5132
RH
4226 return -1;
4227
4228#undef TOEND
4229
00a7cdc5
NC
4230 /* Sort by size, to put zero sized sections
4231 before others at the same address. */
252b5132 4232
eea6121a
AM
4233 size1 = (sec1->flags & SEC_LOAD) ? sec1->size : 0;
4234 size2 = (sec2->flags & SEC_LOAD) ? sec2->size : 0;
eecdbe52
JJ
4235
4236 if (size1 < size2)
252b5132 4237 return -1;
eecdbe52 4238 if (size1 > size2)
252b5132
RH
4239 return 1;
4240
4241 return sec1->target_index - sec2->target_index;
4242}
4243
340b6d91
AC
4244/* Ian Lance Taylor writes:
4245
4246 We shouldn't be using % with a negative signed number. That's just
4247 not good. We have to make sure either that the number is not
4248 negative, or that the number has an unsigned type. When the types
4249 are all the same size they wind up as unsigned. When file_ptr is a
4250 larger signed type, the arithmetic winds up as signed long long,
4251 which is wrong.
4252
4253 What we're trying to say here is something like ``increase OFF by
4254 the least amount that will cause it to be equal to the VMA modulo
4255 the page size.'' */
4256/* In other words, something like:
4257
4258 vma_offset = m->sections[0]->vma % bed->maxpagesize;
4259 off_offset = off % bed->maxpagesize;
4260 if (vma_offset < off_offset)
4261 adjustment = vma_offset + bed->maxpagesize - off_offset;
4262 else
4263 adjustment = vma_offset - off_offset;
4264
4265 which can can be collapsed into the expression below. */
4266
4267static file_ptr
4268vma_page_aligned_bias (bfd_vma vma, ufile_ptr off, bfd_vma maxpagesize)
4269{
4270 return ((vma - off) % maxpagesize);
4271}
4272
252b5132
RH
4273/* Assign file positions to the sections based on the mapping from
4274 sections to segments. This function also sets up some fields in
f3520d2f 4275 the file header. */
252b5132 4276
b34976b6 4277static bfd_boolean
f3520d2f
AM
4278assign_file_positions_for_load_sections (bfd *abfd,
4279 struct bfd_link_info *link_info)
252b5132
RH
4280{
4281 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 4282 struct elf_segment_map *m;
252b5132 4283 Elf_Internal_Phdr *phdrs;
252b5132 4284 Elf_Internal_Phdr *p;
f3520d2f 4285 file_ptr off, voff;
3f570048 4286 bfd_size_type maxpagesize;
f3520d2f 4287 unsigned int alloc;
0920dee7 4288 unsigned int i, j;
252b5132 4289
e36284ab
AM
4290 if (link_info == NULL
4291 && !elf_modify_segment_map (abfd, link_info))
8ded5a0f 4292 return FALSE;
252b5132 4293
8ded5a0f 4294 alloc = 0;
252b5132 4295 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
8ded5a0f 4296 ++alloc;
252b5132
RH
4297
4298 elf_elfheader (abfd)->e_phoff = bed->s->sizeof_ehdr;
4299 elf_elfheader (abfd)->e_phentsize = bed->s->sizeof_phdr;
8ded5a0f 4300 elf_elfheader (abfd)->e_phnum = alloc;
252b5132 4301
62d7a5f6 4302 if (elf_tdata (abfd)->program_header_size == (bfd_size_type) -1)
8ded5a0f
AM
4303 elf_tdata (abfd)->program_header_size = alloc * bed->s->sizeof_phdr;
4304 else
4305 BFD_ASSERT (elf_tdata (abfd)->program_header_size
59e0647f 4306 >= alloc * bed->s->sizeof_phdr);
252b5132
RH
4307
4308 if (alloc == 0)
f3520d2f 4309 {
8ded5a0f
AM
4310 elf_tdata (abfd)->next_file_pos = bed->s->sizeof_ehdr;
4311 return TRUE;
f3520d2f 4312 }
252b5132 4313
d0fb9a8d 4314 phdrs = bfd_alloc2 (abfd, alloc, sizeof (Elf_Internal_Phdr));
f3520d2f 4315 elf_tdata (abfd)->phdr = phdrs;
252b5132 4316 if (phdrs == NULL)
b34976b6 4317 return FALSE;
252b5132 4318
3f570048
AM
4319 maxpagesize = 1;
4320 if ((abfd->flags & D_PAGED) != 0)
4321 maxpagesize = bed->maxpagesize;
4322
252b5132
RH
4323 off = bed->s->sizeof_ehdr;
4324 off += alloc * bed->s->sizeof_phdr;
4325
0920dee7 4326 for (m = elf_tdata (abfd)->segment_map, p = phdrs, j = 0;
252b5132 4327 m != NULL;
0920dee7 4328 m = m->next, p++, j++)
252b5132 4329 {
252b5132
RH
4330 asection **secpp;
4331
4332 /* If elf_segment_map is not from map_sections_to_segments, the
47d9a591 4333 sections may not be correctly ordered. NOTE: sorting should
52e9b619
MS
4334 not be done to the PT_NOTE section of a corefile, which may
4335 contain several pseudo-sections artificially created by bfd.
4336 Sorting these pseudo-sections breaks things badly. */
47d9a591
AM
4337 if (m->count > 1
4338 && !(elf_elfheader (abfd)->e_type == ET_CORE
52e9b619 4339 && m->p_type == PT_NOTE))
252b5132
RH
4340 qsort (m->sections, (size_t) m->count, sizeof (asection *),
4341 elf_sort_sections);
4342
b301b248
AM
4343 /* An ELF segment (described by Elf_Internal_Phdr) may contain a
4344 number of sections with contents contributing to both p_filesz
4345 and p_memsz, followed by a number of sections with no contents
4346 that just contribute to p_memsz. In this loop, OFF tracks next
4347 available file offset for PT_LOAD and PT_NOTE segments. VOFF is
4348 an adjustment we use for segments that have no file contents
4349 but need zero filled memory allocation. */
4350 voff = 0;
252b5132 4351 p->p_type = m->p_type;
28a7f3e7 4352 p->p_flags = m->p_flags;
252b5132 4353
3f570048
AM
4354 if (m->count == 0)
4355 p->p_vaddr = 0;
4356 else
3271a814 4357 p->p_vaddr = m->sections[0]->vma - m->p_vaddr_offset;
3f570048
AM
4358
4359 if (m->p_paddr_valid)
4360 p->p_paddr = m->p_paddr;
4361 else if (m->count == 0)
4362 p->p_paddr = 0;
4363 else
4364 p->p_paddr = m->sections[0]->lma;
4365
4366 if (p->p_type == PT_LOAD
4367 && (abfd->flags & D_PAGED) != 0)
4368 {
4369 /* p_align in demand paged PT_LOAD segments effectively stores
4370 the maximum page size. When copying an executable with
4371 objcopy, we set m->p_align from the input file. Use this
4372 value for maxpagesize rather than bed->maxpagesize, which
4373 may be different. Note that we use maxpagesize for PT_TLS
4374 segment alignment later in this function, so we are relying
4375 on at least one PT_LOAD segment appearing before a PT_TLS
4376 segment. */
4377 if (m->p_align_valid)
4378 maxpagesize = m->p_align;
4379
4380 p->p_align = maxpagesize;
4381 }
4382 else if (m->count == 0)
4383 p->p_align = 1 << bed->s->log_file_align;
3271a814
NS
4384 else if (m->p_align_valid)
4385 p->p_align = m->p_align;
3f570048
AM
4386 else
4387 p->p_align = 0;
4388
252b5132 4389 if (p->p_type == PT_LOAD
b301b248 4390 && m->count > 0)
252b5132 4391 {
b301b248
AM
4392 bfd_size_type align;
4393 bfd_vma adjust;
a49e53ed 4394 unsigned int align_power = 0;
b301b248 4395
3271a814
NS
4396 if (m->p_align_valid)
4397 align = p->p_align;
4398 else
252b5132 4399 {
3271a814
NS
4400 for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
4401 {
4402 unsigned int secalign;
4403
4404 secalign = bfd_get_section_alignment (abfd, *secpp);
4405 if (secalign > align_power)
4406 align_power = secalign;
4407 }
4408 align = (bfd_size_type) 1 << align_power;
4409 if (align < maxpagesize)
4410 align = maxpagesize;
b301b248 4411 }
252b5132 4412
b301b248
AM
4413 adjust = vma_page_aligned_bias (m->sections[0]->vma, off, align);
4414 off += adjust;
4415 if (adjust != 0
4416 && !m->includes_filehdr
4417 && !m->includes_phdrs
4418 && (ufile_ptr) off >= align)
4419 {
4420 /* If the first section isn't loadable, the same holds for
4421 any other sections. Since the segment won't need file
4422 space, we can make p_offset overlap some prior segment.
4423 However, .tbss is special. If a segment starts with
4424 .tbss, we need to look at the next section to decide
4425 whether the segment has any loadable sections. */
4426 i = 0;
252e386e
AM
4427 while ((m->sections[i]->flags & SEC_LOAD) == 0
4428 && (m->sections[i]->flags & SEC_HAS_CONTENTS) == 0)
b301b248
AM
4429 {
4430 if ((m->sections[i]->flags & SEC_THREAD_LOCAL) == 0
4431 || ++i >= m->count)
4432 {
4433 off -= adjust;
4434 voff = adjust - align;
4435 break;
4436 }
4437 }
252b5132
RH
4438 }
4439 }
b1a6d0b1
NC
4440 /* Make sure the .dynamic section is the first section in the
4441 PT_DYNAMIC segment. */
4442 else if (p->p_type == PT_DYNAMIC
4443 && m->count > 1
4444 && strcmp (m->sections[0]->name, ".dynamic") != 0)
4445 {
4446 _bfd_error_handler
b301b248
AM
4447 (_("%B: The first section in the PT_DYNAMIC segment is not the .dynamic section"),
4448 abfd);
b1a6d0b1
NC
4449 bfd_set_error (bfd_error_bad_value);
4450 return FALSE;
4451 }
252b5132 4452
252b5132
RH
4453 p->p_offset = 0;
4454 p->p_filesz = 0;
4455 p->p_memsz = 0;
4456
4457 if (m->includes_filehdr)
4458 {
4459 if (! m->p_flags_valid)
4460 p->p_flags |= PF_R;
252b5132
RH
4461 p->p_filesz = bed->s->sizeof_ehdr;
4462 p->p_memsz = bed->s->sizeof_ehdr;
4463 if (m->count > 0)
4464 {
4465 BFD_ASSERT (p->p_type == PT_LOAD);
4466
4467 if (p->p_vaddr < (bfd_vma) off)
4468 {
caf47ea6 4469 (*_bfd_error_handler)
b301b248
AM
4470 (_("%B: Not enough room for program headers, try linking with -N"),
4471 abfd);
252b5132 4472 bfd_set_error (bfd_error_bad_value);
b34976b6 4473 return FALSE;
252b5132
RH
4474 }
4475
4476 p->p_vaddr -= off;
4477 if (! m->p_paddr_valid)
4478 p->p_paddr -= off;
4479 }
252b5132
RH
4480 }
4481
4482 if (m->includes_phdrs)
4483 {
4484 if (! m->p_flags_valid)
4485 p->p_flags |= PF_R;
4486
f3520d2f 4487 if (!m->includes_filehdr)
252b5132
RH
4488 {
4489 p->p_offset = bed->s->sizeof_ehdr;
4490
4491 if (m->count > 0)
4492 {
4493 BFD_ASSERT (p->p_type == PT_LOAD);
4494 p->p_vaddr -= off - p->p_offset;
4495 if (! m->p_paddr_valid)
4496 p->p_paddr -= off - p->p_offset;
4497 }
252b5132
RH
4498 }
4499
4500 p->p_filesz += alloc * bed->s->sizeof_phdr;
4501 p->p_memsz += alloc * bed->s->sizeof_phdr;
4502 }
4503
4504 if (p->p_type == PT_LOAD
4505 || (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core))
4506 {
4507 if (! m->includes_filehdr && ! m->includes_phdrs)
b301b248 4508 p->p_offset = off + voff;
252b5132
RH
4509 else
4510 {
4511 file_ptr adjust;
4512
4513 adjust = off - (p->p_offset + p->p_filesz);
4514 p->p_filesz += adjust;
4515 p->p_memsz += adjust;
4516 }
4517 }
4518
1ea63fd2
AM
4519 /* Set up p_filesz, p_memsz, p_align and p_flags from the section
4520 maps. Set filepos for sections in PT_LOAD segments, and in
4521 core files, for sections in PT_NOTE segments.
4522 assign_file_positions_for_non_load_sections will set filepos
4523 for other sections and update p_filesz for other segments. */
252b5132
RH
4524 for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
4525 {
4526 asection *sec;
4527 flagword flags;
4528 bfd_size_type align;
627b32bc 4529 Elf_Internal_Shdr *this_hdr;
252b5132
RH
4530
4531 sec = *secpp;
4532 flags = sec->flags;
3f570048 4533 align = (bfd_size_type) 1 << bfd_get_section_alignment (abfd, sec);
252b5132 4534
b301b248
AM
4535 if (p->p_type == PT_LOAD
4536 || p->p_type == PT_TLS)
252b5132 4537 {
8c252fd9 4538 bfd_signed_vma adjust = sec->lma - (p->p_paddr + p->p_memsz);
252b5132 4539
0e922b77
AM
4540 if ((flags & SEC_LOAD) != 0
4541 || ((flags & SEC_ALLOC) != 0
4542 && ((flags & SEC_THREAD_LOCAL) == 0
4543 || p->p_type == PT_TLS)))
252b5132 4544 {
252b5132 4545 if (adjust < 0)
b301b248
AM
4546 {
4547 (*_bfd_error_handler)
4548 (_("%B: section %A lma 0x%lx overlaps previous sections"),
4549 abfd, sec, (unsigned long) sec->lma);
4550 adjust = 0;
4551 }
252b5132 4552 p->p_memsz += adjust;
0e922b77
AM
4553
4554 if ((flags & SEC_LOAD) != 0)
4555 {
4556 off += adjust;
4557 p->p_filesz += adjust;
4558 }
252b5132 4559 }
252b5132
RH
4560 }
4561
627b32bc 4562 this_hdr = &elf_section_data (sec)->this_hdr;
252b5132
RH
4563 if (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core)
4564 {
b301b248
AM
4565 /* The section at i == 0 is the one that actually contains
4566 everything. */
4a938328
MS
4567 if (i == 0)
4568 {
627b32bc 4569 this_hdr->sh_offset = sec->filepos = off;
eea6121a 4570 off += sec->size;
b301b248
AM
4571 p->p_filesz = sec->size;
4572 p->p_memsz = 0;
4573 p->p_align = 1;
252b5132 4574 }
4a938328 4575 else
252b5132 4576 {
b301b248 4577 /* The rest are fake sections that shouldn't be written. */
252b5132 4578 sec->filepos = 0;
eea6121a 4579 sec->size = 0;
b301b248
AM
4580 sec->flags = 0;
4581 continue;
252b5132 4582 }
252b5132
RH
4583 }
4584 else
4585 {
b301b248
AM
4586 if (p->p_type == PT_LOAD)
4587 {
627b32bc 4588 this_hdr->sh_offset = sec->filepos = off + voff;
5efb6261
AM
4589 /* FIXME: The SEC_HAS_CONTENTS test here dates back to
4590 1997, and the exact reason for it isn't clear. One
4591 plausible explanation is that it is to work around
4592 a problem we have with linker scripts using data
4593 statements in NOLOAD sections. I don't think it
4594 makes a great deal of sense to have such a section
4595 assigned to a PT_LOAD segment, but apparently
4596 people do this. The data statement results in a
4597 bfd_data_link_order being built, and these need
4598 section contents to write into. Eventually, we get
4599 to _bfd_elf_write_object_contents which writes any
4600 section with contents to the output. Make room
4601 here for the write, so that following segments are
4602 not trashed. */
4603 if ((flags & SEC_LOAD) != 0
4604 || (flags & SEC_HAS_CONTENTS) != 0)
b301b248 4605 off += sec->size;
627b32bc
AM
4606 else
4607 /* If we aren't making room for this section, then
4608 it must be SHT_NOBITS regardless of what we've
4609 set via struct bfd_elf_special_section. */
4610 this_hdr->sh_type = SHT_NOBITS;
b301b248 4611 }
252b5132 4612
5efb6261 4613 if ((flags & SEC_LOAD) != 0)
b301b248
AM
4614 {
4615 p->p_filesz += sec->size;
627b32bc
AM
4616 /* SEC_LOAD without SEC_ALLOC is a weird combination
4617 used by note sections to signify that a PT_NOTE
4618 segment should be created. These take file space
4619 but are not actually loaded into memory. */
4620 if ((flags & SEC_ALLOC) != 0)
4621 p->p_memsz += sec->size;
b301b248 4622 }
4b6c0f2f 4623
b301b248
AM
4624 /* .tbss is special. It doesn't contribute to p_memsz of
4625 normal segments. */
1ea63fd2
AM
4626 else if ((flags & SEC_ALLOC) != 0
4627 && ((flags & SEC_THREAD_LOCAL) == 0
4628 || p->p_type == PT_TLS))
b301b248 4629 p->p_memsz += sec->size;
252b5132 4630
13ae64f3 4631 if (p->p_type == PT_TLS
eea6121a 4632 && sec->size == 0
13ae64f3
JJ
4633 && (sec->flags & SEC_HAS_CONTENTS) == 0)
4634 {
3a800eb9
AM
4635 struct bfd_link_order *o = sec->map_tail.link_order;
4636 if (o != NULL)
4637 p->p_memsz += o->offset + o->size;
13ae64f3
JJ
4638 }
4639
c9df6640
L
4640 if (p->p_type == PT_GNU_RELRO)
4641 p->p_align = 1;
4642 else if (align > p->p_align
3271a814 4643 && !m->p_align_valid
c9df6640
L
4644 && (p->p_type != PT_LOAD
4645 || (abfd->flags & D_PAGED) == 0))
252b5132
RH
4646 p->p_align = align;
4647 }
4648
4649 if (! m->p_flags_valid)
4650 {
4651 p->p_flags |= PF_R;
4652 if ((flags & SEC_CODE) != 0)
4653 p->p_flags |= PF_X;
4654 if ((flags & SEC_READONLY) == 0)
4655 p->p_flags |= PF_W;
4656 }
4657 }
0920dee7 4658
7c928300
AM
4659 /* Check that all sections are in a PT_LOAD segment.
4660 Don't check funky gdb generated core files. */
4661 if (p->p_type == PT_LOAD && bfd_get_format (abfd) != bfd_core)
0920dee7
L
4662 for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
4663 {
4664 Elf_Internal_Shdr *this_hdr;
4665 asection *sec;
4666
4667 sec = *secpp;
4668 this_hdr = &(elf_section_data(sec)->this_hdr);
4669 if (this_hdr->sh_size != 0
4670 && !ELF_IS_SECTION_IN_SEGMENT_FILE (this_hdr, p))
4671 {
4672 (*_bfd_error_handler)
4673 (_("%B: section `%A' can't be allocated in segment %d"),
4674 abfd, sec, j);
4675 bfd_set_error (bfd_error_bad_value);
4676 return FALSE;
4677 }
4678 }
252b5132
RH
4679 }
4680
f3520d2f
AM
4681 elf_tdata (abfd)->next_file_pos = off;
4682 return TRUE;
4683}
4684
4685/* Assign file positions for the other sections. */
4686
4687static bfd_boolean
4688assign_file_positions_for_non_load_sections (bfd *abfd,
4689 struct bfd_link_info *link_info)
4690{
4691 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
4692 Elf_Internal_Shdr **i_shdrpp;
4693 Elf_Internal_Shdr **hdrpp;
4694 Elf_Internal_Phdr *phdrs;
4695 Elf_Internal_Phdr *p;
4696 struct elf_segment_map *m;
4697 bfd_vma filehdr_vaddr, filehdr_paddr;
4698 bfd_vma phdrs_vaddr, phdrs_paddr;
4699 file_ptr off;
4700 unsigned int num_sec;
4701 unsigned int i;
4702 unsigned int count;
4703
5c182d5f
AM
4704 i_shdrpp = elf_elfsections (abfd);
4705 num_sec = elf_numsections (abfd);
f3520d2f 4706 off = elf_tdata (abfd)->next_file_pos;
5c182d5f
AM
4707 for (i = 1, hdrpp = i_shdrpp + 1; i < num_sec; i++, hdrpp++)
4708 {
4709 struct elf_obj_tdata *tdata = elf_tdata (abfd);
4710 Elf_Internal_Shdr *hdr;
4711
4712 hdr = *hdrpp;
4713 if (hdr->bfd_section != NULL
252e386e
AM
4714 && (hdr->bfd_section->filepos != 0
4715 || (hdr->sh_type == SHT_NOBITS
4716 && hdr->contents == NULL)))
627b32bc 4717 BFD_ASSERT (hdr->sh_offset == hdr->bfd_section->filepos);
5c182d5f
AM
4718 else if ((hdr->sh_flags & SHF_ALLOC) != 0)
4719 {
49c13adb
L
4720 if (hdr->sh_size != 0)
4721 ((*_bfd_error_handler)
4722 (_("%B: warning: allocated section `%s' not in segment"),
3ba71138
L
4723 abfd,
4724 (hdr->bfd_section == NULL
4725 ? "*unknown*"
4726 : hdr->bfd_section->name)));
4727 /* We don't need to page align empty sections. */
4728 if ((abfd->flags & D_PAGED) != 0 && hdr->sh_size != 0)
5c182d5f
AM
4729 off += vma_page_aligned_bias (hdr->sh_addr, off,
4730 bed->maxpagesize);
4731 else
4732 off += vma_page_aligned_bias (hdr->sh_addr, off,
4733 hdr->sh_addralign);
4734 off = _bfd_elf_assign_file_position_for_section (hdr, off,
4735 FALSE);
4736 }
4737 else if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
4738 && hdr->bfd_section == NULL)
4739 || hdr == i_shdrpp[tdata->symtab_section]
4740 || hdr == i_shdrpp[tdata->symtab_shndx_section]
4741 || hdr == i_shdrpp[tdata->strtab_section])
4742 hdr->sh_offset = -1;
4743 else
4744 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
4745
4746 if (i == SHN_LORESERVE - 1)
4747 {
4748 i += SHN_HIRESERVE + 1 - SHN_LORESERVE;
4749 hdrpp += SHN_HIRESERVE + 1 - SHN_LORESERVE;
4750 }
4751 }
4752
252b5132
RH
4753 /* Now that we have set the section file positions, we can set up
4754 the file positions for the non PT_LOAD segments. */
f3520d2f
AM
4755 count = 0;
4756 filehdr_vaddr = 0;
4757 filehdr_paddr = 0;
4758 phdrs_vaddr = bed->maxpagesize + bed->s->sizeof_ehdr;
4759 phdrs_paddr = 0;
4760 phdrs = elf_tdata (abfd)->phdr;
4761 for (m = elf_tdata (abfd)->segment_map, p = phdrs;
4762 m != NULL;
4763 m = m->next, p++)
4764 {
4765 ++count;
4766 if (p->p_type != PT_LOAD)
4767 continue;
4768
4769 if (m->includes_filehdr)
4770 {
4771 filehdr_vaddr = p->p_vaddr;
4772 filehdr_paddr = p->p_paddr;
4773 }
4774 if (m->includes_phdrs)
4775 {
4776 phdrs_vaddr = p->p_vaddr;
4777 phdrs_paddr = p->p_paddr;
4778 if (m->includes_filehdr)
4779 {
4780 phdrs_vaddr += bed->s->sizeof_ehdr;
4781 phdrs_paddr += bed->s->sizeof_ehdr;
4782 }
4783 }
4784 }
4785
252b5132
RH
4786 for (m = elf_tdata (abfd)->segment_map, p = phdrs;
4787 m != NULL;
4788 m = m->next, p++)
4789 {
1ea63fd2 4790 if (m->count != 0)
252b5132 4791 {
1ea63fd2
AM
4792 if (p->p_type != PT_LOAD
4793 && (p->p_type != PT_NOTE || bfd_get_format (abfd) != bfd_core))
229fcec5 4794 {
1ea63fd2
AM
4795 Elf_Internal_Shdr *hdr;
4796 BFD_ASSERT (!m->includes_filehdr && !m->includes_phdrs);
4797
4798 hdr = &elf_section_data (m->sections[m->count - 1])->this_hdr;
4799 p->p_filesz = (m->sections[m->count - 1]->filepos
4800 - m->sections[0]->filepos);
4801 if (hdr->sh_type != SHT_NOBITS)
4802 p->p_filesz += hdr->sh_size;
4803
4804 p->p_offset = m->sections[0]->filepos;
229fcec5 4805 }
252b5132 4806 }
1ea63fd2 4807 else
252b5132
RH
4808 {
4809 if (m->includes_filehdr)
4810 {
4811 p->p_vaddr = filehdr_vaddr;
4812 if (! m->p_paddr_valid)
4813 p->p_paddr = filehdr_paddr;
4814 }
4815 else if (m->includes_phdrs)
4816 {
4817 p->p_vaddr = phdrs_vaddr;
4818 if (! m->p_paddr_valid)
4819 p->p_paddr = phdrs_paddr;
4820 }
8c37241b
JJ
4821 else if (p->p_type == PT_GNU_RELRO)
4822 {
4823 Elf_Internal_Phdr *lp;
4824
4825 for (lp = phdrs; lp < phdrs + count; ++lp)
4826 {
4827 if (lp->p_type == PT_LOAD
4828 && lp->p_vaddr <= link_info->relro_end
4829 && lp->p_vaddr >= link_info->relro_start
e36284ab
AM
4830 && (lp->p_vaddr + lp->p_filesz
4831 >= link_info->relro_end))
8c37241b
JJ
4832 break;
4833 }
4834
4835 if (lp < phdrs + count
4836 && link_info->relro_end > lp->p_vaddr)
4837 {
4838 p->p_vaddr = lp->p_vaddr;
4839 p->p_paddr = lp->p_paddr;
4840 p->p_offset = lp->p_offset;
4841 p->p_filesz = link_info->relro_end - lp->p_vaddr;
4842 p->p_memsz = p->p_filesz;
4843 p->p_align = 1;
4844 p->p_flags = (lp->p_flags & ~PF_W);
4845 }
4846 else
4847 {
4848 memset (p, 0, sizeof *p);
4849 p->p_type = PT_NULL;
4850 }
4851 }
252b5132
RH
4852 }
4853 }
4854
252b5132
RH
4855 elf_tdata (abfd)->next_file_pos = off;
4856
b34976b6 4857 return TRUE;
252b5132
RH
4858}
4859
252b5132
RH
4860/* Work out the file positions of all the sections. This is called by
4861 _bfd_elf_compute_section_file_positions. All the section sizes and
4862 VMAs must be known before this is called.
4863
e0638f70
AM
4864 Reloc sections come in two flavours: Those processed specially as
4865 "side-channel" data attached to a section to which they apply, and
4866 those that bfd doesn't process as relocations. The latter sort are
4867 stored in a normal bfd section by bfd_section_from_shdr. We don't
4868 consider the former sort here, unless they form part of the loadable
4869 image. Reloc sections not assigned here will be handled later by
4870 assign_file_positions_for_relocs.
252b5132
RH
4871
4872 We also don't set the positions of the .symtab and .strtab here. */
4873
b34976b6 4874static bfd_boolean
c84fca4d
AO
4875assign_file_positions_except_relocs (bfd *abfd,
4876 struct bfd_link_info *link_info)
252b5132 4877{
5c182d5f
AM
4878 struct elf_obj_tdata *tdata = elf_tdata (abfd);
4879 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
252b5132 4880 file_ptr off;
9c5bfbb7 4881 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132
RH
4882
4883 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0
4884 && bfd_get_format (abfd) != bfd_core)
4885 {
5c182d5f
AM
4886 Elf_Internal_Shdr ** const i_shdrpp = elf_elfsections (abfd);
4887 unsigned int num_sec = elf_numsections (abfd);
252b5132
RH
4888 Elf_Internal_Shdr **hdrpp;
4889 unsigned int i;
4890
4891 /* Start after the ELF header. */
4892 off = i_ehdrp->e_ehsize;
4893
4894 /* We are not creating an executable, which means that we are
4895 not creating a program header, and that the actual order of
4896 the sections in the file is unimportant. */
9ad5cbcf 4897 for (i = 1, hdrpp = i_shdrpp + 1; i < num_sec; i++, hdrpp++)
252b5132
RH
4898 {
4899 Elf_Internal_Shdr *hdr;
4900
4901 hdr = *hdrpp;
e0638f70
AM
4902 if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
4903 && hdr->bfd_section == NULL)
9ad5cbcf
AM
4904 || i == tdata->symtab_section
4905 || i == tdata->symtab_shndx_section
252b5132
RH
4906 || i == tdata->strtab_section)
4907 {
4908 hdr->sh_offset = -1;
252b5132 4909 }
9ad5cbcf 4910 else
b34976b6 4911 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
252b5132 4912
9ad5cbcf
AM
4913 if (i == SHN_LORESERVE - 1)
4914 {
4915 i += SHN_HIRESERVE + 1 - SHN_LORESERVE;
4916 hdrpp += SHN_HIRESERVE + 1 - SHN_LORESERVE;
4917 }
252b5132
RH
4918 }
4919 }
4920 else
4921 {
f3520d2f
AM
4922 unsigned int alloc;
4923
252b5132
RH
4924 /* Assign file positions for the loaded sections based on the
4925 assignment of sections to segments. */
f3520d2f
AM
4926 if (!assign_file_positions_for_load_sections (abfd, link_info))
4927 return FALSE;
4928
4929 /* And for non-load sections. */
4930 if (!assign_file_positions_for_non_load_sections (abfd, link_info))
4931 return FALSE;
4932
e36284ab
AM
4933 if (bed->elf_backend_modify_program_headers != NULL)
4934 {
4935 if (!(*bed->elf_backend_modify_program_headers) (abfd, link_info))
4936 return FALSE;
4937 }
4938
f3520d2f
AM
4939 /* Write out the program headers. */
4940 alloc = tdata->program_header_size / bed->s->sizeof_phdr;
4941 if (bfd_seek (abfd, (bfd_signed_vma) bed->s->sizeof_ehdr, SEEK_SET) != 0
4942 || bed->s->write_out_phdrs (abfd, tdata->phdr, alloc) != 0)
b34976b6 4943 return FALSE;
252b5132 4944
5c182d5f 4945 off = tdata->next_file_pos;
252b5132
RH
4946 }
4947
4948 /* Place the section headers. */
45d6a902 4949 off = align_file_position (off, 1 << bed->s->log_file_align);
252b5132
RH
4950 i_ehdrp->e_shoff = off;
4951 off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize;
4952
5c182d5f 4953 tdata->next_file_pos = off;
252b5132 4954
b34976b6 4955 return TRUE;
252b5132
RH
4956}
4957
b34976b6 4958static bfd_boolean
217aa764 4959prep_headers (bfd *abfd)
252b5132
RH
4960{
4961 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
4962 Elf_Internal_Phdr *i_phdrp = 0; /* Program header table, internal form */
4963 Elf_Internal_Shdr **i_shdrp; /* Section header table, internal form */
2b0f7ef9 4964 struct elf_strtab_hash *shstrtab;
9c5bfbb7 4965 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132
RH
4966
4967 i_ehdrp = elf_elfheader (abfd);
4968 i_shdrp = elf_elfsections (abfd);
4969
2b0f7ef9 4970 shstrtab = _bfd_elf_strtab_init ();
252b5132 4971 if (shstrtab == NULL)
b34976b6 4972 return FALSE;
252b5132
RH
4973
4974 elf_shstrtab (abfd) = shstrtab;
4975
4976 i_ehdrp->e_ident[EI_MAG0] = ELFMAG0;
4977 i_ehdrp->e_ident[EI_MAG1] = ELFMAG1;
4978 i_ehdrp->e_ident[EI_MAG2] = ELFMAG2;
4979 i_ehdrp->e_ident[EI_MAG3] = ELFMAG3;
4980
4981 i_ehdrp->e_ident[EI_CLASS] = bed->s->elfclass;
4982 i_ehdrp->e_ident[EI_DATA] =
4983 bfd_big_endian (abfd) ? ELFDATA2MSB : ELFDATA2LSB;
4984 i_ehdrp->e_ident[EI_VERSION] = bed->s->ev_current;
4985
252b5132
RH
4986 if ((abfd->flags & DYNAMIC) != 0)
4987 i_ehdrp->e_type = ET_DYN;
4988 else if ((abfd->flags & EXEC_P) != 0)
4989 i_ehdrp->e_type = ET_EXEC;
4990 else if (bfd_get_format (abfd) == bfd_core)
4991 i_ehdrp->e_type = ET_CORE;
4992 else
4993 i_ehdrp->e_type = ET_REL;
4994
4995 switch (bfd_get_arch (abfd))
4996 {
4997 case bfd_arch_unknown:
4998 i_ehdrp->e_machine = EM_NONE;
4999 break;
aa4f99bb
AO
5000
5001 /* There used to be a long list of cases here, each one setting
5002 e_machine to the same EM_* macro #defined as ELF_MACHINE_CODE
5003 in the corresponding bfd definition. To avoid duplication,
5004 the switch was removed. Machines that need special handling
5005 can generally do it in elf_backend_final_write_processing(),
5006 unless they need the information earlier than the final write.
5007 Such need can generally be supplied by replacing the tests for
5008 e_machine with the conditions used to determine it. */
252b5132 5009 default:
9c5bfbb7
AM
5010 i_ehdrp->e_machine = bed->elf_machine_code;
5011 }
aa4f99bb 5012
252b5132
RH
5013 i_ehdrp->e_version = bed->s->ev_current;
5014 i_ehdrp->e_ehsize = bed->s->sizeof_ehdr;
5015
c044fabd 5016 /* No program header, for now. */
252b5132
RH
5017 i_ehdrp->e_phoff = 0;
5018 i_ehdrp->e_phentsize = 0;
5019 i_ehdrp->e_phnum = 0;
5020
c044fabd 5021 /* Each bfd section is section header entry. */
252b5132
RH
5022 i_ehdrp->e_entry = bfd_get_start_address (abfd);
5023 i_ehdrp->e_shentsize = bed->s->sizeof_shdr;
5024
c044fabd 5025 /* If we're building an executable, we'll need a program header table. */
252b5132 5026 if (abfd->flags & EXEC_P)
0e71e495
BE
5027 /* It all happens later. */
5028 ;
252b5132
RH
5029 else
5030 {
5031 i_ehdrp->e_phentsize = 0;
5032 i_phdrp = 0;
5033 i_ehdrp->e_phoff = 0;
5034 }
5035
5036 elf_tdata (abfd)->symtab_hdr.sh_name =
b34976b6 5037 (unsigned int) _bfd_elf_strtab_add (shstrtab, ".symtab", FALSE);
252b5132 5038 elf_tdata (abfd)->strtab_hdr.sh_name =
b34976b6 5039 (unsigned int) _bfd_elf_strtab_add (shstrtab, ".strtab", FALSE);
252b5132 5040 elf_tdata (abfd)->shstrtab_hdr.sh_name =
b34976b6 5041 (unsigned int) _bfd_elf_strtab_add (shstrtab, ".shstrtab", FALSE);
252b5132
RH
5042 if (elf_tdata (abfd)->symtab_hdr.sh_name == (unsigned int) -1
5043 || elf_tdata (abfd)->symtab_hdr.sh_name == (unsigned int) -1
5044 || elf_tdata (abfd)->shstrtab_hdr.sh_name == (unsigned int) -1)
b34976b6 5045 return FALSE;
252b5132 5046
b34976b6 5047 return TRUE;
252b5132
RH
5048}
5049
5050/* Assign file positions for all the reloc sections which are not part
5051 of the loadable file image. */
5052
5053void
217aa764 5054_bfd_elf_assign_file_positions_for_relocs (bfd *abfd)
252b5132
RH
5055{
5056 file_ptr off;
9ad5cbcf 5057 unsigned int i, num_sec;
252b5132
RH
5058 Elf_Internal_Shdr **shdrpp;
5059
5060 off = elf_tdata (abfd)->next_file_pos;
5061
9ad5cbcf
AM
5062 num_sec = elf_numsections (abfd);
5063 for (i = 1, shdrpp = elf_elfsections (abfd) + 1; i < num_sec; i++, shdrpp++)
252b5132
RH
5064 {
5065 Elf_Internal_Shdr *shdrp;
5066
5067 shdrp = *shdrpp;
5068 if ((shdrp->sh_type == SHT_REL || shdrp->sh_type == SHT_RELA)
5069 && shdrp->sh_offset == -1)
b34976b6 5070 off = _bfd_elf_assign_file_position_for_section (shdrp, off, TRUE);
252b5132
RH
5071 }
5072
5073 elf_tdata (abfd)->next_file_pos = off;
5074}
5075
b34976b6 5076bfd_boolean
217aa764 5077_bfd_elf_write_object_contents (bfd *abfd)
252b5132 5078{
9c5bfbb7 5079 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132
RH
5080 Elf_Internal_Ehdr *i_ehdrp;
5081 Elf_Internal_Shdr **i_shdrp;
b34976b6 5082 bfd_boolean failed;
9ad5cbcf 5083 unsigned int count, num_sec;
252b5132
RH
5084
5085 if (! abfd->output_has_begun
217aa764 5086 && ! _bfd_elf_compute_section_file_positions (abfd, NULL))
b34976b6 5087 return FALSE;
252b5132
RH
5088
5089 i_shdrp = elf_elfsections (abfd);
5090 i_ehdrp = elf_elfheader (abfd);
5091
b34976b6 5092 failed = FALSE;
252b5132
RH
5093 bfd_map_over_sections (abfd, bed->s->write_relocs, &failed);
5094 if (failed)
b34976b6 5095 return FALSE;
252b5132
RH
5096
5097 _bfd_elf_assign_file_positions_for_relocs (abfd);
5098
c044fabd 5099 /* After writing the headers, we need to write the sections too... */
9ad5cbcf
AM
5100 num_sec = elf_numsections (abfd);
5101 for (count = 1; count < num_sec; count++)
252b5132
RH
5102 {
5103 if (bed->elf_backend_section_processing)
5104 (*bed->elf_backend_section_processing) (abfd, i_shdrp[count]);
5105 if (i_shdrp[count]->contents)
5106 {
dc810e39
AM
5107 bfd_size_type amt = i_shdrp[count]->sh_size;
5108
252b5132 5109 if (bfd_seek (abfd, i_shdrp[count]->sh_offset, SEEK_SET) != 0
dc810e39 5110 || bfd_bwrite (i_shdrp[count]->contents, amt, abfd) != amt)
b34976b6 5111 return FALSE;
252b5132 5112 }
9ad5cbcf
AM
5113 if (count == SHN_LORESERVE - 1)
5114 count += SHN_HIRESERVE + 1 - SHN_LORESERVE;
252b5132
RH
5115 }
5116
5117 /* Write out the section header names. */
26ae6d5e
DJ
5118 if (elf_shstrtab (abfd) != NULL
5119 && (bfd_seek (abfd, elf_tdata (abfd)->shstrtab_hdr.sh_offset, SEEK_SET) != 0
5120 || ! _bfd_elf_strtab_emit (abfd, elf_shstrtab (abfd))))
b34976b6 5121 return FALSE;
252b5132
RH
5122
5123 if (bed->elf_backend_final_write_processing)
5124 (*bed->elf_backend_final_write_processing) (abfd,
5125 elf_tdata (abfd)->linker);
5126
5127 return bed->s->write_shdrs_and_ehdr (abfd);
5128}
5129
b34976b6 5130bfd_boolean
217aa764 5131_bfd_elf_write_corefile_contents (bfd *abfd)
252b5132 5132{
c044fabd 5133 /* Hopefully this can be done just like an object file. */
252b5132
RH
5134 return _bfd_elf_write_object_contents (abfd);
5135}
c044fabd
KH
5136
5137/* Given a section, search the header to find them. */
5138
252b5132 5139int
198beae2 5140_bfd_elf_section_from_bfd_section (bfd *abfd, struct bfd_section *asect)
252b5132 5141{
9c5bfbb7 5142 const struct elf_backend_data *bed;
252b5132 5143 int index;
252b5132 5144
9ad5cbcf
AM
5145 if (elf_section_data (asect) != NULL
5146 && elf_section_data (asect)->this_idx != 0)
5147 return elf_section_data (asect)->this_idx;
5148
5149 if (bfd_is_abs_section (asect))
af746e92
AM
5150 index = SHN_ABS;
5151 else if (bfd_is_com_section (asect))
5152 index = SHN_COMMON;
5153 else if (bfd_is_und_section (asect))
5154 index = SHN_UNDEF;
5155 else
6dc132d9 5156 index = -1;
252b5132 5157
af746e92 5158 bed = get_elf_backend_data (abfd);
252b5132
RH
5159 if (bed->elf_backend_section_from_bfd_section)
5160 {
af746e92 5161 int retval = index;
9ad5cbcf 5162
af746e92
AM
5163 if ((*bed->elf_backend_section_from_bfd_section) (abfd, asect, &retval))
5164 return retval;
252b5132
RH
5165 }
5166
af746e92
AM
5167 if (index == -1)
5168 bfd_set_error (bfd_error_nonrepresentable_section);
252b5132 5169
af746e92 5170 return index;
252b5132
RH
5171}
5172
5173/* Given a BFD symbol, return the index in the ELF symbol table, or -1
5174 on error. */
5175
5176int
217aa764 5177_bfd_elf_symbol_from_bfd_symbol (bfd *abfd, asymbol **asym_ptr_ptr)
252b5132
RH
5178{
5179 asymbol *asym_ptr = *asym_ptr_ptr;
5180 int idx;
5181 flagword flags = asym_ptr->flags;
5182
5183 /* When gas creates relocations against local labels, it creates its
5184 own symbol for the section, but does put the symbol into the
5185 symbol chain, so udata is 0. When the linker is generating
5186 relocatable output, this section symbol may be for one of the
5187 input sections rather than the output section. */
5188 if (asym_ptr->udata.i == 0
5189 && (flags & BSF_SECTION_SYM)
5190 && asym_ptr->section)
5191 {
5372391b 5192 asection *sec;
252b5132
RH
5193 int indx;
5194
5372391b
AM
5195 sec = asym_ptr->section;
5196 if (sec->owner != abfd && sec->output_section != NULL)
5197 sec = sec->output_section;
5198 if (sec->owner == abfd
5199 && (indx = sec->index) < elf_num_section_syms (abfd)
4e89ac30 5200 && elf_section_syms (abfd)[indx] != NULL)
252b5132
RH
5201 asym_ptr->udata.i = elf_section_syms (abfd)[indx]->udata.i;
5202 }
5203
5204 idx = asym_ptr->udata.i;
5205
5206 if (idx == 0)
5207 {
5208 /* This case can occur when using --strip-symbol on a symbol
5209 which is used in a relocation entry. */
5210 (*_bfd_error_handler)
d003868e
AM
5211 (_("%B: symbol `%s' required but not present"),
5212 abfd, bfd_asymbol_name (asym_ptr));
252b5132
RH
5213 bfd_set_error (bfd_error_no_symbols);
5214 return -1;
5215 }
5216
5217#if DEBUG & 4
5218 {
5219 fprintf (stderr,
661a3fd4 5220 "elf_symbol_from_bfd_symbol 0x%.8lx, name = %s, sym num = %d, flags = 0x%.8lx%s\n",
252b5132
RH
5221 (long) asym_ptr, asym_ptr->name, idx, flags,
5222 elf_symbol_flags (flags));
5223 fflush (stderr);
5224 }
5225#endif
5226
5227 return idx;
5228}
5229
84d1d650 5230/* Rewrite program header information. */
252b5132 5231
b34976b6 5232static bfd_boolean
84d1d650 5233rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
252b5132 5234{
b34976b6
AM
5235 Elf_Internal_Ehdr *iehdr;
5236 struct elf_segment_map *map;
5237 struct elf_segment_map *map_first;
5238 struct elf_segment_map **pointer_to_map;
5239 Elf_Internal_Phdr *segment;
5240 asection *section;
5241 unsigned int i;
5242 unsigned int num_segments;
5243 bfd_boolean phdr_included = FALSE;
5244 bfd_vma maxpagesize;
5245 struct elf_segment_map *phdr_adjust_seg = NULL;
5246 unsigned int phdr_adjust_num = 0;
9c5bfbb7 5247 const struct elf_backend_data *bed;
bc67d8a6 5248
caf47ea6 5249 bed = get_elf_backend_data (ibfd);
252b5132
RH
5250 iehdr = elf_elfheader (ibfd);
5251
bc67d8a6 5252 map_first = NULL;
c044fabd 5253 pointer_to_map = &map_first;
252b5132
RH
5254
5255 num_segments = elf_elfheader (ibfd)->e_phnum;
bc67d8a6
NC
5256 maxpagesize = get_elf_backend_data (obfd)->maxpagesize;
5257
5258 /* Returns the end address of the segment + 1. */
aecc8f8a
AM
5259#define SEGMENT_END(segment, start) \
5260 (start + (segment->p_memsz > segment->p_filesz \
5261 ? segment->p_memsz : segment->p_filesz))
bc67d8a6 5262
eecdbe52
JJ
5263#define SECTION_SIZE(section, segment) \
5264 (((section->flags & (SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) \
5265 != SEC_THREAD_LOCAL || segment->p_type == PT_TLS) \
eea6121a 5266 ? section->size : 0)
eecdbe52 5267
b34976b6 5268 /* Returns TRUE if the given section is contained within
bc67d8a6 5269 the given segment. VMA addresses are compared. */
aecc8f8a
AM
5270#define IS_CONTAINED_BY_VMA(section, segment) \
5271 (section->vma >= segment->p_vaddr \
eecdbe52 5272 && (section->vma + SECTION_SIZE (section, segment) \
aecc8f8a 5273 <= (SEGMENT_END (segment, segment->p_vaddr))))
c044fabd 5274
b34976b6 5275 /* Returns TRUE if the given section is contained within
bc67d8a6 5276 the given segment. LMA addresses are compared. */
aecc8f8a
AM
5277#define IS_CONTAINED_BY_LMA(section, segment, base) \
5278 (section->lma >= base \
eecdbe52 5279 && (section->lma + SECTION_SIZE (section, segment) \
aecc8f8a 5280 <= SEGMENT_END (segment, base)))
252b5132 5281
c044fabd 5282 /* Special case: corefile "NOTE" section containing regs, prpsinfo etc. */
aecc8f8a
AM
5283#define IS_COREFILE_NOTE(p, s) \
5284 (p->p_type == PT_NOTE \
5285 && bfd_get_format (ibfd) == bfd_core \
5286 && s->vma == 0 && s->lma == 0 \
5287 && (bfd_vma) s->filepos >= p->p_offset \
cb3ff1e5 5288 && ((bfd_vma) s->filepos + s->size \
aecc8f8a 5289 <= p->p_offset + p->p_filesz))
252b5132
RH
5290
5291 /* The complicated case when p_vaddr is 0 is to handle the Solaris
5292 linker, which generates a PT_INTERP section with p_vaddr and
5293 p_memsz set to 0. */
aecc8f8a
AM
5294#define IS_SOLARIS_PT_INTERP(p, s) \
5295 (p->p_vaddr == 0 \
5296 && p->p_paddr == 0 \
5297 && p->p_memsz == 0 \
5298 && p->p_filesz > 0 \
5299 && (s->flags & SEC_HAS_CONTENTS) != 0 \
eea6121a 5300 && s->size > 0 \
aecc8f8a 5301 && (bfd_vma) s->filepos >= p->p_offset \
cb3ff1e5 5302 && ((bfd_vma) s->filepos + s->size \
aecc8f8a 5303 <= p->p_offset + p->p_filesz))
5c440b1e 5304
bc67d8a6
NC
5305 /* Decide if the given section should be included in the given segment.
5306 A section will be included if:
f5ffc919
NC
5307 1. It is within the address space of the segment -- we use the LMA
5308 if that is set for the segment and the VMA otherwise,
bc67d8a6
NC
5309 2. It is an allocated segment,
5310 3. There is an output section associated with it,
eecdbe52 5311 4. The section has not already been allocated to a previous segment.
03394ac9
NC
5312 5. PT_GNU_STACK segments do not include any sections.
5313 6. PT_TLS segment includes only SHF_TLS sections.
6f79b219
JJ
5314 7. SHF_TLS sections are only in PT_TLS or PT_LOAD segments.
5315 8. PT_DYNAMIC should not contain empty sections at the beginning
5316 (with the possible exception of .dynamic). */
9f17e2a6 5317#define IS_SECTION_IN_INPUT_SEGMENT(section, segment, bed) \
aecc8f8a
AM
5318 ((((segment->p_paddr \
5319 ? IS_CONTAINED_BY_LMA (section, segment, segment->p_paddr) \
5320 : IS_CONTAINED_BY_VMA (section, segment)) \
f5ffc919 5321 && (section->flags & SEC_ALLOC) != 0) \
b6821651 5322 || IS_COREFILE_NOTE (segment, section)) \
03394ac9 5323 && segment->p_type != PT_GNU_STACK \
eecdbe52
JJ
5324 && (segment->p_type != PT_TLS \
5325 || (section->flags & SEC_THREAD_LOCAL)) \
5326 && (segment->p_type == PT_LOAD \
5327 || segment->p_type == PT_TLS \
5328 || (section->flags & SEC_THREAD_LOCAL) == 0) \
6f79b219
JJ
5329 && (segment->p_type != PT_DYNAMIC \
5330 || SECTION_SIZE (section, segment) > 0 \
5331 || (segment->p_paddr \
5332 ? segment->p_paddr != section->lma \
5333 : segment->p_vaddr != section->vma) \
5334 || (strcmp (bfd_get_section_name (ibfd, section), ".dynamic") \
5335 == 0)) \
82e51918 5336 && ! section->segment_mark)
bc67d8a6 5337
9f17e2a6
L
5338/* If the output section of a section in the input segment is NULL,
5339 it is removed from the corresponding output segment. */
5340#define INCLUDE_SECTION_IN_SEGMENT(section, segment, bed) \
5341 (IS_SECTION_IN_INPUT_SEGMENT (section, segment, bed) \
5342 && section->output_section != NULL)
5343
b34976b6 5344 /* Returns TRUE iff seg1 starts after the end of seg2. */
b5f852ea
NC
5345#define SEGMENT_AFTER_SEGMENT(seg1, seg2, field) \
5346 (seg1->field >= SEGMENT_END (seg2, seg2->field))
5347
5348 /* Returns TRUE iff seg1 and seg2 overlap. Segments overlap iff both
5349 their VMA address ranges and their LMA address ranges overlap.
5350 It is possible to have overlapping VMA ranges without overlapping LMA
5351 ranges. RedBoot images for example can have both .data and .bss mapped
5352 to the same VMA range, but with the .data section mapped to a different
5353 LMA. */
aecc8f8a 5354#define SEGMENT_OVERLAPS(seg1, seg2) \
b5f852ea
NC
5355 ( !(SEGMENT_AFTER_SEGMENT (seg1, seg2, p_vaddr) \
5356 || SEGMENT_AFTER_SEGMENT (seg2, seg1, p_vaddr)) \
5357 && !(SEGMENT_AFTER_SEGMENT (seg1, seg2, p_paddr) \
5358 || SEGMENT_AFTER_SEGMENT (seg2, seg1, p_paddr)))
bc67d8a6
NC
5359
5360 /* Initialise the segment mark field. */
5361 for (section = ibfd->sections; section != NULL; section = section->next)
b34976b6 5362 section->segment_mark = FALSE;
bc67d8a6 5363
252b5132 5364 /* Scan through the segments specified in the program header
bc67d8a6 5365 of the input BFD. For this first scan we look for overlaps
9ad5cbcf 5366 in the loadable segments. These can be created by weird
aecc8f8a 5367 parameters to objcopy. Also, fix some solaris weirdness. */
bc67d8a6
NC
5368 for (i = 0, segment = elf_tdata (ibfd)->phdr;
5369 i < num_segments;
c044fabd 5370 i++, segment++)
252b5132 5371 {
252b5132 5372 unsigned int j;
c044fabd 5373 Elf_Internal_Phdr *segment2;
252b5132 5374
aecc8f8a
AM
5375 if (segment->p_type == PT_INTERP)
5376 for (section = ibfd->sections; section; section = section->next)
5377 if (IS_SOLARIS_PT_INTERP (segment, section))
5378 {
5379 /* Mininal change so that the normal section to segment
4cc11e76 5380 assignment code will work. */
aecc8f8a
AM
5381 segment->p_vaddr = section->vma;
5382 break;
5383 }
5384
bc67d8a6
NC
5385 if (segment->p_type != PT_LOAD)
5386 continue;
c044fabd 5387
bc67d8a6 5388 /* Determine if this segment overlaps any previous segments. */
c044fabd 5389 for (j = 0, segment2 = elf_tdata (ibfd)->phdr; j < i; j++, segment2 ++)
bc67d8a6
NC
5390 {
5391 bfd_signed_vma extra_length;
c044fabd 5392
bc67d8a6
NC
5393 if (segment2->p_type != PT_LOAD
5394 || ! SEGMENT_OVERLAPS (segment, segment2))
5395 continue;
c044fabd 5396
bc67d8a6
NC
5397 /* Merge the two segments together. */
5398 if (segment2->p_vaddr < segment->p_vaddr)
5399 {
c044fabd
KH
5400 /* Extend SEGMENT2 to include SEGMENT and then delete
5401 SEGMENT. */
bc67d8a6
NC
5402 extra_length =
5403 SEGMENT_END (segment, segment->p_vaddr)
5404 - SEGMENT_END (segment2, segment2->p_vaddr);
c044fabd 5405
bc67d8a6
NC
5406 if (extra_length > 0)
5407 {
5408 segment2->p_memsz += extra_length;
5409 segment2->p_filesz += extra_length;
5410 }
c044fabd 5411
bc67d8a6 5412 segment->p_type = PT_NULL;
c044fabd 5413
bc67d8a6
NC
5414 /* Since we have deleted P we must restart the outer loop. */
5415 i = 0;
5416 segment = elf_tdata (ibfd)->phdr;
5417 break;
5418 }
5419 else
5420 {
c044fabd
KH
5421 /* Extend SEGMENT to include SEGMENT2 and then delete
5422 SEGMENT2. */
bc67d8a6
NC
5423 extra_length =
5424 SEGMENT_END (segment2, segment2->p_vaddr)
5425 - SEGMENT_END (segment, segment->p_vaddr);
c044fabd 5426
bc67d8a6
NC
5427 if (extra_length > 0)
5428 {
5429 segment->p_memsz += extra_length;
5430 segment->p_filesz += extra_length;
5431 }
c044fabd 5432
bc67d8a6
NC
5433 segment2->p_type = PT_NULL;
5434 }
5435 }
5436 }
c044fabd 5437
bc67d8a6
NC
5438 /* The second scan attempts to assign sections to segments. */
5439 for (i = 0, segment = elf_tdata (ibfd)->phdr;
5440 i < num_segments;
5441 i ++, segment ++)
5442 {
5443 unsigned int section_count;
5444 asection ** sections;
5445 asection * output_section;
5446 unsigned int isec;
5447 bfd_vma matching_lma;
5448 bfd_vma suggested_lma;
5449 unsigned int j;
dc810e39 5450 bfd_size_type amt;
9f17e2a6 5451 asection * first_section;
bc67d8a6
NC
5452
5453 if (segment->p_type == PT_NULL)
5454 continue;
c044fabd 5455
9f17e2a6 5456 first_section = NULL;
bc67d8a6 5457 /* Compute how many sections might be placed into this segment. */
b5f852ea
NC
5458 for (section = ibfd->sections, section_count = 0;
5459 section != NULL;
5460 section = section->next)
9f17e2a6
L
5461 {
5462 /* Find the first section in the input segment, which may be
5463 removed from the corresponding output segment. */
5464 if (IS_SECTION_IN_INPUT_SEGMENT (section, segment, bed))
5465 {
5466 if (first_section == NULL)
5467 first_section = section;
5468 if (section->output_section != NULL)
5469 ++section_count;
5470 }
5471 }
811072d8 5472
b5f852ea
NC
5473 /* Allocate a segment map big enough to contain
5474 all of the sections we have selected. */
dc810e39
AM
5475 amt = sizeof (struct elf_segment_map);
5476 amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
41f8ce69 5477 map = bfd_zalloc (obfd, amt);
bc67d8a6 5478 if (map == NULL)
b34976b6 5479 return FALSE;
252b5132
RH
5480
5481 /* Initialise the fields of the segment map. Default to
5482 using the physical address of the segment in the input BFD. */
bc67d8a6
NC
5483 map->next = NULL;
5484 map->p_type = segment->p_type;
5485 map->p_flags = segment->p_flags;
5486 map->p_flags_valid = 1;
55d55ac7 5487
9f17e2a6
L
5488 /* If the first section in the input segment is removed, there is
5489 no need to preserve segment physical address in the corresponding
5490 output segment. */
945c025a 5491 if (!first_section || first_section->output_section != NULL)
9f17e2a6
L
5492 {
5493 map->p_paddr = segment->p_paddr;
5494 map->p_paddr_valid = 1;
5495 }
252b5132
RH
5496
5497 /* Determine if this segment contains the ELF file header
5498 and if it contains the program headers themselves. */
bc67d8a6
NC
5499 map->includes_filehdr = (segment->p_offset == 0
5500 && segment->p_filesz >= iehdr->e_ehsize);
252b5132 5501
bc67d8a6 5502 map->includes_phdrs = 0;
252b5132 5503
bc67d8a6 5504 if (! phdr_included || segment->p_type != PT_LOAD)
252b5132 5505 {
bc67d8a6
NC
5506 map->includes_phdrs =
5507 (segment->p_offset <= (bfd_vma) iehdr->e_phoff
5508 && (segment->p_offset + segment->p_filesz
252b5132
RH
5509 >= ((bfd_vma) iehdr->e_phoff
5510 + iehdr->e_phnum * iehdr->e_phentsize)));
c044fabd 5511
bc67d8a6 5512 if (segment->p_type == PT_LOAD && map->includes_phdrs)
b34976b6 5513 phdr_included = TRUE;
252b5132
RH
5514 }
5515
bc67d8a6 5516 if (section_count == 0)
252b5132
RH
5517 {
5518 /* Special segments, such as the PT_PHDR segment, may contain
5519 no sections, but ordinary, loadable segments should contain
1ed89aa9
NC
5520 something. They are allowed by the ELF spec however, so only
5521 a warning is produced. */
bc67d8a6 5522 if (segment->p_type == PT_LOAD)
caf47ea6 5523 (*_bfd_error_handler)
d003868e
AM
5524 (_("%B: warning: Empty loadable segment detected, is this intentional ?\n"),
5525 ibfd);
252b5132 5526
bc67d8a6 5527 map->count = 0;
c044fabd
KH
5528 *pointer_to_map = map;
5529 pointer_to_map = &map->next;
252b5132
RH
5530
5531 continue;
5532 }
5533
5534 /* Now scan the sections in the input BFD again and attempt
5535 to add their corresponding output sections to the segment map.
5536 The problem here is how to handle an output section which has
5537 been moved (ie had its LMA changed). There are four possibilities:
5538
5539 1. None of the sections have been moved.
5540 In this case we can continue to use the segment LMA from the
5541 input BFD.
5542
5543 2. All of the sections have been moved by the same amount.
5544 In this case we can change the segment's LMA to match the LMA
5545 of the first section.
5546
5547 3. Some of the sections have been moved, others have not.
5548 In this case those sections which have not been moved can be
5549 placed in the current segment which will have to have its size,
5550 and possibly its LMA changed, and a new segment or segments will
5551 have to be created to contain the other sections.
5552
b5f852ea 5553 4. The sections have been moved, but not by the same amount.
252b5132
RH
5554 In this case we can change the segment's LMA to match the LMA
5555 of the first section and we will have to create a new segment
5556 or segments to contain the other sections.
5557
5558 In order to save time, we allocate an array to hold the section
5559 pointers that we are interested in. As these sections get assigned
5560 to a segment, they are removed from this array. */
5561
0b14c2aa
L
5562 /* Gcc 2.96 miscompiles this code on mips. Don't do casting here
5563 to work around this long long bug. */
d0fb9a8d 5564 sections = bfd_malloc2 (section_count, sizeof (asection *));
252b5132 5565 if (sections == NULL)
b34976b6 5566 return FALSE;
252b5132
RH
5567
5568 /* Step One: Scan for segment vs section LMA conflicts.
5569 Also add the sections to the section array allocated above.
5570 Also add the sections to the current segment. In the common
5571 case, where the sections have not been moved, this means that
5572 we have completely filled the segment, and there is nothing
5573 more to do. */
252b5132 5574 isec = 0;
72730e0c 5575 matching_lma = 0;
252b5132
RH
5576 suggested_lma = 0;
5577
bc67d8a6
NC
5578 for (j = 0, section = ibfd->sections;
5579 section != NULL;
5580 section = section->next)
252b5132 5581 {
caf47ea6 5582 if (INCLUDE_SECTION_IN_SEGMENT (section, segment, bed))
c0f7859b 5583 {
bc67d8a6
NC
5584 output_section = section->output_section;
5585
5586 sections[j ++] = section;
252b5132
RH
5587
5588 /* The Solaris native linker always sets p_paddr to 0.
5589 We try to catch that case here, and set it to the
5e8d7549
NC
5590 correct value. Note - some backends require that
5591 p_paddr be left as zero. */
bc67d8a6 5592 if (segment->p_paddr == 0
4455705d 5593 && segment->p_vaddr != 0
5e8d7549 5594 && (! bed->want_p_paddr_set_to_zero)
252b5132 5595 && isec == 0
bc67d8a6
NC
5596 && output_section->lma != 0
5597 && (output_section->vma == (segment->p_vaddr
5598 + (map->includes_filehdr
5599 ? iehdr->e_ehsize
5600 : 0)
5601 + (map->includes_phdrs
079e9a2f
AM
5602 ? (iehdr->e_phnum
5603 * iehdr->e_phentsize)
bc67d8a6
NC
5604 : 0))))
5605 map->p_paddr = segment->p_vaddr;
252b5132
RH
5606
5607 /* Match up the physical address of the segment with the
5608 LMA address of the output section. */
bc67d8a6 5609 if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr)
5e8d7549
NC
5610 || IS_COREFILE_NOTE (segment, section)
5611 || (bed->want_p_paddr_set_to_zero &&
5612 IS_CONTAINED_BY_VMA (output_section, segment))
5613 )
252b5132
RH
5614 {
5615 if (matching_lma == 0)
bc67d8a6 5616 matching_lma = output_section->lma;
252b5132
RH
5617
5618 /* We assume that if the section fits within the segment
bc67d8a6 5619 then it does not overlap any other section within that
252b5132 5620 segment. */
bc67d8a6 5621 map->sections[isec ++] = output_section;
252b5132
RH
5622 }
5623 else if (suggested_lma == 0)
bc67d8a6 5624 suggested_lma = output_section->lma;
252b5132
RH
5625 }
5626 }
5627
bc67d8a6 5628 BFD_ASSERT (j == section_count);
252b5132
RH
5629
5630 /* Step Two: Adjust the physical address of the current segment,
5631 if necessary. */
bc67d8a6 5632 if (isec == section_count)
252b5132
RH
5633 {
5634 /* All of the sections fitted within the segment as currently
5635 specified. This is the default case. Add the segment to
5636 the list of built segments and carry on to process the next
5637 program header in the input BFD. */
bc67d8a6 5638 map->count = section_count;
c044fabd
KH
5639 *pointer_to_map = map;
5640 pointer_to_map = &map->next;
3271a814
NS
5641
5642 if (matching_lma != map->p_paddr
5643 && !map->includes_filehdr && !map->includes_phdrs)
5644 /* There is some padding before the first section in the
5645 segment. So, we must account for that in the output
5646 segment's vma. */
5647 map->p_vaddr_offset = matching_lma - map->p_paddr;
5648
252b5132
RH
5649 free (sections);
5650 continue;
5651 }
252b5132
RH
5652 else
5653 {
72730e0c
AM
5654 if (matching_lma != 0)
5655 {
5656 /* At least one section fits inside the current segment.
5657 Keep it, but modify its physical address to match the
5658 LMA of the first section that fitted. */
bc67d8a6 5659 map->p_paddr = matching_lma;
72730e0c
AM
5660 }
5661 else
5662 {
5663 /* None of the sections fitted inside the current segment.
5664 Change the current segment's physical address to match
5665 the LMA of the first section. */
bc67d8a6 5666 map->p_paddr = suggested_lma;
72730e0c
AM
5667 }
5668
bc67d8a6
NC
5669 /* Offset the segment physical address from the lma
5670 to allow for space taken up by elf headers. */
5671 if (map->includes_filehdr)
5672 map->p_paddr -= iehdr->e_ehsize;
252b5132 5673
bc67d8a6
NC
5674 if (map->includes_phdrs)
5675 {
5676 map->p_paddr -= iehdr->e_phnum * iehdr->e_phentsize;
5677
5678 /* iehdr->e_phnum is just an estimate of the number
5679 of program headers that we will need. Make a note
5680 here of the number we used and the segment we chose
5681 to hold these headers, so that we can adjust the
5682 offset when we know the correct value. */
5683 phdr_adjust_num = iehdr->e_phnum;
5684 phdr_adjust_seg = map;
5685 }
252b5132
RH
5686 }
5687
5688 /* Step Three: Loop over the sections again, this time assigning
caf47ea6 5689 those that fit to the current segment and removing them from the
252b5132
RH
5690 sections array; but making sure not to leave large gaps. Once all
5691 possible sections have been assigned to the current segment it is
5692 added to the list of built segments and if sections still remain
5693 to be assigned, a new segment is constructed before repeating
5694 the loop. */
5695 isec = 0;
5696 do
5697 {
bc67d8a6 5698 map->count = 0;
252b5132
RH
5699 suggested_lma = 0;
5700
5701 /* Fill the current segment with sections that fit. */
bc67d8a6 5702 for (j = 0; j < section_count; j++)
252b5132 5703 {
bc67d8a6 5704 section = sections[j];
252b5132 5705
bc67d8a6 5706 if (section == NULL)
252b5132
RH
5707 continue;
5708
bc67d8a6 5709 output_section = section->output_section;
252b5132 5710
bc67d8a6 5711 BFD_ASSERT (output_section != NULL);
c044fabd 5712
bc67d8a6
NC
5713 if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr)
5714 || IS_COREFILE_NOTE (segment, section))
252b5132 5715 {
bc67d8a6 5716 if (map->count == 0)
252b5132
RH
5717 {
5718 /* If the first section in a segment does not start at
bc67d8a6
NC
5719 the beginning of the segment, then something is
5720 wrong. */
5721 if (output_section->lma !=
5722 (map->p_paddr
5723 + (map->includes_filehdr ? iehdr->e_ehsize : 0)
5724 + (map->includes_phdrs
5725 ? iehdr->e_phnum * iehdr->e_phentsize
5726 : 0)))
252b5132
RH
5727 abort ();
5728 }
5729 else
5730 {
5731 asection * prev_sec;
252b5132 5732
bc67d8a6 5733 prev_sec = map->sections[map->count - 1];
252b5132
RH
5734
5735 /* If the gap between the end of the previous section
bc67d8a6
NC
5736 and the start of this section is more than
5737 maxpagesize then we need to start a new segment. */
eea6121a 5738 if ((BFD_ALIGN (prev_sec->lma + prev_sec->size,
079e9a2f 5739 maxpagesize)
caf47ea6 5740 < BFD_ALIGN (output_section->lma, maxpagesize))
eea6121a 5741 || ((prev_sec->lma + prev_sec->size)
079e9a2f 5742 > output_section->lma))
252b5132
RH
5743 {
5744 if (suggested_lma == 0)
bc67d8a6 5745 suggested_lma = output_section->lma;
252b5132
RH
5746
5747 continue;
5748 }
5749 }
5750
bc67d8a6 5751 map->sections[map->count++] = output_section;
252b5132
RH
5752 ++isec;
5753 sections[j] = NULL;
b34976b6 5754 section->segment_mark = TRUE;
252b5132
RH
5755 }
5756 else if (suggested_lma == 0)
bc67d8a6 5757 suggested_lma = output_section->lma;
252b5132
RH
5758 }
5759
bc67d8a6 5760 BFD_ASSERT (map->count > 0);
252b5132
RH
5761
5762 /* Add the current segment to the list of built segments. */
c044fabd
KH
5763 *pointer_to_map = map;
5764 pointer_to_map = &map->next;
252b5132 5765
bc67d8a6 5766 if (isec < section_count)
252b5132
RH
5767 {
5768 /* We still have not allocated all of the sections to
5769 segments. Create a new segment here, initialise it
5770 and carry on looping. */
dc810e39
AM
5771 amt = sizeof (struct elf_segment_map);
5772 amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
217aa764 5773 map = bfd_alloc (obfd, amt);
bc67d8a6 5774 if (map == NULL)
5ed6aba4
NC
5775 {
5776 free (sections);
5777 return FALSE;
5778 }
252b5132
RH
5779
5780 /* Initialise the fields of the segment map. Set the physical
5781 physical address to the LMA of the first section that has
5782 not yet been assigned. */
bc67d8a6
NC
5783 map->next = NULL;
5784 map->p_type = segment->p_type;
5785 map->p_flags = segment->p_flags;
5786 map->p_flags_valid = 1;
5787 map->p_paddr = suggested_lma;
5788 map->p_paddr_valid = 1;
5789 map->includes_filehdr = 0;
5790 map->includes_phdrs = 0;
252b5132
RH
5791 }
5792 }
bc67d8a6 5793 while (isec < section_count);
252b5132
RH
5794
5795 free (sections);
5796 }
5797
5798 /* The Solaris linker creates program headers in which all the
5799 p_paddr fields are zero. When we try to objcopy or strip such a
5800 file, we get confused. Check for this case, and if we find it
5801 reset the p_paddr_valid fields. */
bc67d8a6
NC
5802 for (map = map_first; map != NULL; map = map->next)
5803 if (map->p_paddr != 0)
252b5132 5804 break;
bc67d8a6 5805 if (map == NULL)
b5f852ea
NC
5806 for (map = map_first; map != NULL; map = map->next)
5807 map->p_paddr_valid = 0;
252b5132 5808
bc67d8a6
NC
5809 elf_tdata (obfd)->segment_map = map_first;
5810
5811 /* If we had to estimate the number of program headers that were
9ad5cbcf 5812 going to be needed, then check our estimate now and adjust
bc67d8a6
NC
5813 the offset if necessary. */
5814 if (phdr_adjust_seg != NULL)
5815 {
5816 unsigned int count;
c044fabd 5817
bc67d8a6 5818 for (count = 0, map = map_first; map != NULL; map = map->next)
c044fabd 5819 count++;
252b5132 5820
bc67d8a6
NC
5821 if (count > phdr_adjust_num)
5822 phdr_adjust_seg->p_paddr
5823 -= (count - phdr_adjust_num) * iehdr->e_phentsize;
5824 }
c044fabd 5825
bc67d8a6 5826#undef SEGMENT_END
eecdbe52 5827#undef SECTION_SIZE
bc67d8a6
NC
5828#undef IS_CONTAINED_BY_VMA
5829#undef IS_CONTAINED_BY_LMA
252b5132 5830#undef IS_COREFILE_NOTE
bc67d8a6 5831#undef IS_SOLARIS_PT_INTERP
9f17e2a6 5832#undef IS_SECTION_IN_INPUT_SEGMENT
bc67d8a6
NC
5833#undef INCLUDE_SECTION_IN_SEGMENT
5834#undef SEGMENT_AFTER_SEGMENT
5835#undef SEGMENT_OVERLAPS
b34976b6 5836 return TRUE;
252b5132
RH
5837}
5838
84d1d650
L
5839/* Copy ELF program header information. */
5840
5841static bfd_boolean
5842copy_elf_program_header (bfd *ibfd, bfd *obfd)
5843{
5844 Elf_Internal_Ehdr *iehdr;
5845 struct elf_segment_map *map;
5846 struct elf_segment_map *map_first;
5847 struct elf_segment_map **pointer_to_map;
5848 Elf_Internal_Phdr *segment;
5849 unsigned int i;
5850 unsigned int num_segments;
5851 bfd_boolean phdr_included = FALSE;
5852
5853 iehdr = elf_elfheader (ibfd);
5854
5855 map_first = NULL;
5856 pointer_to_map = &map_first;
5857
5858 num_segments = elf_elfheader (ibfd)->e_phnum;
5859 for (i = 0, segment = elf_tdata (ibfd)->phdr;
5860 i < num_segments;
5861 i++, segment++)
5862 {
5863 asection *section;
5864 unsigned int section_count;
5865 bfd_size_type amt;
5866 Elf_Internal_Shdr *this_hdr;
53020534 5867 asection *first_section = NULL;
84d1d650
L
5868
5869 /* FIXME: Do we need to copy PT_NULL segment? */
5870 if (segment->p_type == PT_NULL)
5871 continue;
5872
5873 /* Compute how many sections are in this segment. */
5874 for (section = ibfd->sections, section_count = 0;
5875 section != NULL;
5876 section = section->next)
5877 {
5878 this_hdr = &(elf_section_data(section)->this_hdr);
5879 if (ELF_IS_SECTION_IN_SEGMENT_FILE (this_hdr, segment))
3271a814 5880 {
53020534
L
5881 if (!first_section)
5882 first_section = section;
3271a814
NS
5883 section_count++;
5884 }
84d1d650
L
5885 }
5886
5887 /* Allocate a segment map big enough to contain
5888 all of the sections we have selected. */
5889 amt = sizeof (struct elf_segment_map);
5890 if (section_count != 0)
5891 amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
41f8ce69 5892 map = bfd_zalloc (obfd, amt);
84d1d650
L
5893 if (map == NULL)
5894 return FALSE;
5895
5896 /* Initialize the fields of the output segment map with the
5897 input segment. */
5898 map->next = NULL;
5899 map->p_type = segment->p_type;
5900 map->p_flags = segment->p_flags;
5901 map->p_flags_valid = 1;
5902 map->p_paddr = segment->p_paddr;
5903 map->p_paddr_valid = 1;
3f570048
AM
5904 map->p_align = segment->p_align;
5905 map->p_align_valid = 1;
3271a814 5906 map->p_vaddr_offset = 0;
84d1d650
L
5907
5908 /* Determine if this segment contains the ELF file header
5909 and if it contains the program headers themselves. */
5910 map->includes_filehdr = (segment->p_offset == 0
5911 && segment->p_filesz >= iehdr->e_ehsize);
5912
5913 map->includes_phdrs = 0;
5914 if (! phdr_included || segment->p_type != PT_LOAD)
5915 {
5916 map->includes_phdrs =
5917 (segment->p_offset <= (bfd_vma) iehdr->e_phoff
5918 && (segment->p_offset + segment->p_filesz
5919 >= ((bfd_vma) iehdr->e_phoff
5920 + iehdr->e_phnum * iehdr->e_phentsize)));
5921
5922 if (segment->p_type == PT_LOAD && map->includes_phdrs)
5923 phdr_included = TRUE;
5924 }
5925
3271a814
NS
5926 if (!map->includes_phdrs && !map->includes_filehdr)
5927 /* There is some other padding before the first section. */
53020534
L
5928 map->p_vaddr_offset = ((first_section ? first_section->lma : 0)
5929 - segment->p_paddr);
3271a814 5930
84d1d650
L
5931 if (section_count != 0)
5932 {
5933 unsigned int isec = 0;
5934
53020534 5935 for (section = first_section;
84d1d650
L
5936 section != NULL;
5937 section = section->next)
5938 {
5939 this_hdr = &(elf_section_data(section)->this_hdr);
5940 if (ELF_IS_SECTION_IN_SEGMENT_FILE (this_hdr, segment))
53020534
L
5941 {
5942 map->sections[isec++] = section->output_section;
5943 if (isec == section_count)
5944 break;
5945 }
84d1d650
L
5946 }
5947 }
5948
5949 map->count = section_count;
5950 *pointer_to_map = map;
5951 pointer_to_map = &map->next;
5952 }
5953
5954 elf_tdata (obfd)->segment_map = map_first;
5955 return TRUE;
5956}
5957
5958/* Copy private BFD data. This copies or rewrites ELF program header
5959 information. */
5960
5961static bfd_boolean
5962copy_private_bfd_data (bfd *ibfd, bfd *obfd)
5963{
84d1d650
L
5964 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
5965 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
5966 return TRUE;
5967
5968 if (elf_tdata (ibfd)->phdr == NULL)
5969 return TRUE;
5970
5971 if (ibfd->xvec == obfd->xvec)
5972 {
cb3ff1e5
NC
5973 /* Check to see if any sections in the input BFD
5974 covered by ELF program header have changed. */
d55ce4e2 5975 Elf_Internal_Phdr *segment;
84d1d650
L
5976 asection *section, *osec;
5977 unsigned int i, num_segments;
5978 Elf_Internal_Shdr *this_hdr;
5979
5980 /* Initialize the segment mark field. */
5981 for (section = obfd->sections; section != NULL;
5982 section = section->next)
5983 section->segment_mark = FALSE;
5984
5985 num_segments = elf_elfheader (ibfd)->e_phnum;
5986 for (i = 0, segment = elf_tdata (ibfd)->phdr;
5987 i < num_segments;
5988 i++, segment++)
5989 {
5f6999aa
NC
5990 /* PR binutils/3535. The Solaris linker always sets the p_paddr
5991 and p_memsz fields of special segments (DYNAMIC, INTERP) to 0
5992 which severly confuses things, so always regenerate the segment
5993 map in this case. */
5994 if (segment->p_paddr == 0
5995 && segment->p_memsz == 0
5996 && (segment->p_type == PT_INTERP || segment->p_type == PT_DYNAMIC))
cb3ff1e5 5997 goto rewrite;
5f6999aa 5998
84d1d650
L
5999 for (section = ibfd->sections;
6000 section != NULL; section = section->next)
6001 {
6002 /* We mark the output section so that we know it comes
6003 from the input BFD. */
6004 osec = section->output_section;
6005 if (osec)
6006 osec->segment_mark = TRUE;
6007
6008 /* Check if this section is covered by the segment. */
6009 this_hdr = &(elf_section_data(section)->this_hdr);
6010 if (ELF_IS_SECTION_IN_SEGMENT_FILE (this_hdr, segment))
6011 {
6012 /* FIXME: Check if its output section is changed or
6013 removed. What else do we need to check? */
6014 if (osec == NULL
6015 || section->flags != osec->flags
6016 || section->lma != osec->lma
6017 || section->vma != osec->vma
6018 || section->size != osec->size
6019 || section->rawsize != osec->rawsize
6020 || section->alignment_power != osec->alignment_power)
6021 goto rewrite;
6022 }
6023 }
6024 }
6025
cb3ff1e5 6026 /* Check to see if any output section do not come from the
84d1d650
L
6027 input BFD. */
6028 for (section = obfd->sections; section != NULL;
6029 section = section->next)
6030 {
6031 if (section->segment_mark == FALSE)
6032 goto rewrite;
6033 else
6034 section->segment_mark = FALSE;
6035 }
6036
6037 return copy_elf_program_header (ibfd, obfd);
6038 }
6039
6040rewrite:
6041 return rewrite_elf_program_header (ibfd, obfd);
6042}
6043
ccd2ec6a
L
6044/* Initialize private output section information from input section. */
6045
6046bfd_boolean
6047_bfd_elf_init_private_section_data (bfd *ibfd,
6048 asection *isec,
6049 bfd *obfd,
6050 asection *osec,
6051 struct bfd_link_info *link_info)
6052
6053{
6054 Elf_Internal_Shdr *ihdr, *ohdr;
6055 bfd_boolean need_group = link_info == NULL || link_info->relocatable;
6056
6057 if (ibfd->xvec->flavour != bfd_target_elf_flavour
6058 || obfd->xvec->flavour != bfd_target_elf_flavour)
6059 return TRUE;
6060
e843e0f8 6061 /* Don't copy the output ELF section type from input if the
d3fd4074 6062 output BFD section flags have been set to something different.
e843e0f8
L
6063 elf_fake_sections will set ELF section type based on BFD
6064 section flags. */
d270463e
L
6065 if (osec->flags == isec->flags || !osec->flags)
6066 {
6067 BFD_ASSERT (osec->flags == isec->flags
6068 || (!osec->flags
6069 && elf_section_type (osec) == SHT_NULL));
6070 elf_section_type (osec) = elf_section_type (isec);
6071 }
6072
6073 /* FIXME: Is this correct for all OS/PROC specific flags? */
6074 elf_section_flags (osec) |= (elf_section_flags (isec)
6075 & (SHF_MASKOS | SHF_MASKPROC));
ccd2ec6a
L
6076
6077 /* Set things up for objcopy and relocatable link. The output
6078 SHT_GROUP section will have its elf_next_in_group pointing back
6079 to the input group members. Ignore linker created group section.
6080 See elfNN_ia64_object_p in elfxx-ia64.c. */
ccd2ec6a
L
6081 if (need_group)
6082 {
6083 if (elf_sec_group (isec) == NULL
6084 || (elf_sec_group (isec)->flags & SEC_LINKER_CREATED) == 0)
6085 {
6086 if (elf_section_flags (isec) & SHF_GROUP)
6087 elf_section_flags (osec) |= SHF_GROUP;
6088 elf_next_in_group (osec) = elf_next_in_group (isec);
6089 elf_group_name (osec) = elf_group_name (isec);
6090 }
6091 }
6092
6093 ihdr = &elf_section_data (isec)->this_hdr;
6094
6095 /* We need to handle elf_linked_to_section for SHF_LINK_ORDER. We
6096 don't use the output section of the linked-to section since it
6097 may be NULL at this point. */
6098 if ((ihdr->sh_flags & SHF_LINK_ORDER) != 0)
6099 {
6100 ohdr = &elf_section_data (osec)->this_hdr;
6101 ohdr->sh_flags |= SHF_LINK_ORDER;
6102 elf_linked_to_section (osec) = elf_linked_to_section (isec);
6103 }
6104
6105 osec->use_rela_p = isec->use_rela_p;
6106
6107 return TRUE;
6108}
6109
252b5132
RH
6110/* Copy private section information. This copies over the entsize
6111 field, and sometimes the info field. */
6112
b34976b6 6113bfd_boolean
217aa764
AM
6114_bfd_elf_copy_private_section_data (bfd *ibfd,
6115 asection *isec,
6116 bfd *obfd,
6117 asection *osec)
252b5132
RH
6118{
6119 Elf_Internal_Shdr *ihdr, *ohdr;
6120
6121 if (ibfd->xvec->flavour != bfd_target_elf_flavour
6122 || obfd->xvec->flavour != bfd_target_elf_flavour)
b34976b6 6123 return TRUE;
252b5132 6124
252b5132
RH
6125 ihdr = &elf_section_data (isec)->this_hdr;
6126 ohdr = &elf_section_data (osec)->this_hdr;
6127
6128 ohdr->sh_entsize = ihdr->sh_entsize;
6129
6130 if (ihdr->sh_type == SHT_SYMTAB
6131 || ihdr->sh_type == SHT_DYNSYM
6132 || ihdr->sh_type == SHT_GNU_verneed
6133 || ihdr->sh_type == SHT_GNU_verdef)
6134 ohdr->sh_info = ihdr->sh_info;
6135
ccd2ec6a
L
6136 return _bfd_elf_init_private_section_data (ibfd, isec, obfd, osec,
6137 NULL);
252b5132
RH
6138}
6139
80fccad2
BW
6140/* Copy private header information. */
6141
6142bfd_boolean
6143_bfd_elf_copy_private_header_data (bfd *ibfd, bfd *obfd)
6144{
30288845
AM
6145 asection *isec;
6146
80fccad2
BW
6147 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
6148 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
6149 return TRUE;
6150
6151 /* Copy over private BFD data if it has not already been copied.
6152 This must be done here, rather than in the copy_private_bfd_data
6153 entry point, because the latter is called after the section
6154 contents have been set, which means that the program headers have
6155 already been worked out. */
6156 if (elf_tdata (obfd)->segment_map == NULL && elf_tdata (ibfd)->phdr != NULL)
6157 {
6158 if (! copy_private_bfd_data (ibfd, obfd))
6159 return FALSE;
6160 }
6161
30288845
AM
6162 /* _bfd_elf_copy_private_section_data copied over the SHF_GROUP flag
6163 but this might be wrong if we deleted the group section. */
6164 for (isec = ibfd->sections; isec != NULL; isec = isec->next)
6165 if (elf_section_type (isec) == SHT_GROUP
6166 && isec->output_section == NULL)
6167 {
6168 asection *first = elf_next_in_group (isec);
6169 asection *s = first;
6170 while (s != NULL)
6171 {
6172 if (s->output_section != NULL)
6173 {
6174 elf_section_flags (s->output_section) &= ~SHF_GROUP;
6175 elf_group_name (s->output_section) = NULL;
6176 }
6177 s = elf_next_in_group (s);
6178 if (s == first)
6179 break;
6180 }
6181 }
6182
80fccad2
BW
6183 return TRUE;
6184}
6185
252b5132
RH
6186/* Copy private symbol information. If this symbol is in a section
6187 which we did not map into a BFD section, try to map the section
6188 index correctly. We use special macro definitions for the mapped
6189 section indices; these definitions are interpreted by the
6190 swap_out_syms function. */
6191
9ad5cbcf
AM
6192#define MAP_ONESYMTAB (SHN_HIOS + 1)
6193#define MAP_DYNSYMTAB (SHN_HIOS + 2)
6194#define MAP_STRTAB (SHN_HIOS + 3)
6195#define MAP_SHSTRTAB (SHN_HIOS + 4)
6196#define MAP_SYM_SHNDX (SHN_HIOS + 5)
252b5132 6197
b34976b6 6198bfd_boolean
217aa764
AM
6199_bfd_elf_copy_private_symbol_data (bfd *ibfd,
6200 asymbol *isymarg,
6201 bfd *obfd,
6202 asymbol *osymarg)
252b5132
RH
6203{
6204 elf_symbol_type *isym, *osym;
6205
6206 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
6207 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
b34976b6 6208 return TRUE;
252b5132
RH
6209
6210 isym = elf_symbol_from (ibfd, isymarg);
6211 osym = elf_symbol_from (obfd, osymarg);
6212
6213 if (isym != NULL
6214 && osym != NULL
6215 && bfd_is_abs_section (isym->symbol.section))
6216 {
6217 unsigned int shndx;
6218
6219 shndx = isym->internal_elf_sym.st_shndx;
6220 if (shndx == elf_onesymtab (ibfd))
6221 shndx = MAP_ONESYMTAB;
6222 else if (shndx == elf_dynsymtab (ibfd))
6223 shndx = MAP_DYNSYMTAB;
6224 else if (shndx == elf_tdata (ibfd)->strtab_section)
6225 shndx = MAP_STRTAB;
6226 else if (shndx == elf_tdata (ibfd)->shstrtab_section)
6227 shndx = MAP_SHSTRTAB;
9ad5cbcf
AM
6228 else if (shndx == elf_tdata (ibfd)->symtab_shndx_section)
6229 shndx = MAP_SYM_SHNDX;
252b5132
RH
6230 osym->internal_elf_sym.st_shndx = shndx;
6231 }
6232
b34976b6 6233 return TRUE;
252b5132
RH
6234}
6235
6236/* Swap out the symbols. */
6237
b34976b6 6238static bfd_boolean
217aa764
AM
6239swap_out_syms (bfd *abfd,
6240 struct bfd_strtab_hash **sttp,
6241 int relocatable_p)
252b5132 6242{
9c5bfbb7 6243 const struct elf_backend_data *bed;
079e9a2f
AM
6244 int symcount;
6245 asymbol **syms;
6246 struct bfd_strtab_hash *stt;
6247 Elf_Internal_Shdr *symtab_hdr;
9ad5cbcf 6248 Elf_Internal_Shdr *symtab_shndx_hdr;
079e9a2f 6249 Elf_Internal_Shdr *symstrtab_hdr;
f075ee0c
AM
6250 bfd_byte *outbound_syms;
6251 bfd_byte *outbound_shndx;
079e9a2f
AM
6252 int idx;
6253 bfd_size_type amt;
174fd7f9 6254 bfd_boolean name_local_sections;
252b5132
RH
6255
6256 if (!elf_map_symbols (abfd))
b34976b6 6257 return FALSE;
252b5132 6258
c044fabd 6259 /* Dump out the symtabs. */
079e9a2f
AM
6260 stt = _bfd_elf_stringtab_init ();
6261 if (stt == NULL)
b34976b6 6262 return FALSE;
252b5132 6263
079e9a2f
AM
6264 bed = get_elf_backend_data (abfd);
6265 symcount = bfd_get_symcount (abfd);
6266 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6267 symtab_hdr->sh_type = SHT_SYMTAB;
6268 symtab_hdr->sh_entsize = bed->s->sizeof_sym;
6269 symtab_hdr->sh_size = symtab_hdr->sh_entsize * (symcount + 1);
6270 symtab_hdr->sh_info = elf_num_locals (abfd) + 1;
45d6a902 6271 symtab_hdr->sh_addralign = 1 << bed->s->log_file_align;
079e9a2f
AM
6272
6273 symstrtab_hdr = &elf_tdata (abfd)->strtab_hdr;
6274 symstrtab_hdr->sh_type = SHT_STRTAB;
6275
d0fb9a8d 6276 outbound_syms = bfd_alloc2 (abfd, 1 + symcount, bed->s->sizeof_sym);
079e9a2f 6277 if (outbound_syms == NULL)
5ed6aba4
NC
6278 {
6279 _bfd_stringtab_free (stt);
6280 return FALSE;
6281 }
217aa764 6282 symtab_hdr->contents = outbound_syms;
252b5132 6283
9ad5cbcf
AM
6284 outbound_shndx = NULL;
6285 symtab_shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
6286 if (symtab_shndx_hdr->sh_name != 0)
6287 {
6288 amt = (bfd_size_type) (1 + symcount) * sizeof (Elf_External_Sym_Shndx);
d0fb9a8d
JJ
6289 outbound_shndx = bfd_zalloc2 (abfd, 1 + symcount,
6290 sizeof (Elf_External_Sym_Shndx));
9ad5cbcf 6291 if (outbound_shndx == NULL)
5ed6aba4
NC
6292 {
6293 _bfd_stringtab_free (stt);
6294 return FALSE;
6295 }
6296
9ad5cbcf
AM
6297 symtab_shndx_hdr->contents = outbound_shndx;
6298 symtab_shndx_hdr->sh_type = SHT_SYMTAB_SHNDX;
6299 symtab_shndx_hdr->sh_size = amt;
6300 symtab_shndx_hdr->sh_addralign = sizeof (Elf_External_Sym_Shndx);
6301 symtab_shndx_hdr->sh_entsize = sizeof (Elf_External_Sym_Shndx);
6302 }
6303
589e6347 6304 /* Now generate the data (for "contents"). */
079e9a2f
AM
6305 {
6306 /* Fill in zeroth symbol and swap it out. */
6307 Elf_Internal_Sym sym;
6308 sym.st_name = 0;
6309 sym.st_value = 0;
6310 sym.st_size = 0;
6311 sym.st_info = 0;
6312 sym.st_other = 0;
6313 sym.st_shndx = SHN_UNDEF;
9ad5cbcf 6314 bed->s->swap_symbol_out (abfd, &sym, outbound_syms, outbound_shndx);
079e9a2f 6315 outbound_syms += bed->s->sizeof_sym;
9ad5cbcf
AM
6316 if (outbound_shndx != NULL)
6317 outbound_shndx += sizeof (Elf_External_Sym_Shndx);
079e9a2f 6318 }
252b5132 6319
174fd7f9
RS
6320 name_local_sections
6321 = (bed->elf_backend_name_local_section_symbols
6322 && bed->elf_backend_name_local_section_symbols (abfd));
6323
079e9a2f
AM
6324 syms = bfd_get_outsymbols (abfd);
6325 for (idx = 0; idx < symcount; idx++)
252b5132 6326 {
252b5132 6327 Elf_Internal_Sym sym;
079e9a2f
AM
6328 bfd_vma value = syms[idx]->value;
6329 elf_symbol_type *type_ptr;
6330 flagword flags = syms[idx]->flags;
6331 int type;
252b5132 6332
174fd7f9
RS
6333 if (!name_local_sections
6334 && (flags & (BSF_SECTION_SYM | BSF_GLOBAL)) == BSF_SECTION_SYM)
079e9a2f
AM
6335 {
6336 /* Local section symbols have no name. */
6337 sym.st_name = 0;
6338 }
6339 else
6340 {
6341 sym.st_name = (unsigned long) _bfd_stringtab_add (stt,
6342 syms[idx]->name,
b34976b6 6343 TRUE, FALSE);
079e9a2f 6344 if (sym.st_name == (unsigned long) -1)
5ed6aba4
NC
6345 {
6346 _bfd_stringtab_free (stt);
6347 return FALSE;
6348 }
079e9a2f 6349 }
252b5132 6350
079e9a2f 6351 type_ptr = elf_symbol_from (abfd, syms[idx]);
252b5132 6352
079e9a2f
AM
6353 if ((flags & BSF_SECTION_SYM) == 0
6354 && bfd_is_com_section (syms[idx]->section))
6355 {
6356 /* ELF common symbols put the alignment into the `value' field,
6357 and the size into the `size' field. This is backwards from
6358 how BFD handles it, so reverse it here. */
6359 sym.st_size = value;
6360 if (type_ptr == NULL
6361 || type_ptr->internal_elf_sym.st_value == 0)
6362 sym.st_value = value >= 16 ? 16 : (1 << bfd_log2 (value));
6363 else
6364 sym.st_value = type_ptr->internal_elf_sym.st_value;
6365 sym.st_shndx = _bfd_elf_section_from_bfd_section
6366 (abfd, syms[idx]->section);
6367 }
6368 else
6369 {
6370 asection *sec = syms[idx]->section;
6371 int shndx;
252b5132 6372
079e9a2f
AM
6373 if (sec->output_section)
6374 {
6375 value += sec->output_offset;
6376 sec = sec->output_section;
6377 }
589e6347 6378
079e9a2f
AM
6379 /* Don't add in the section vma for relocatable output. */
6380 if (! relocatable_p)
6381 value += sec->vma;
6382 sym.st_value = value;
6383 sym.st_size = type_ptr ? type_ptr->internal_elf_sym.st_size : 0;
6384
6385 if (bfd_is_abs_section (sec)
6386 && type_ptr != NULL
6387 && type_ptr->internal_elf_sym.st_shndx != 0)
6388 {
6389 /* This symbol is in a real ELF section which we did
6390 not create as a BFD section. Undo the mapping done
6391 by copy_private_symbol_data. */
6392 shndx = type_ptr->internal_elf_sym.st_shndx;
6393 switch (shndx)
6394 {
6395 case MAP_ONESYMTAB:
6396 shndx = elf_onesymtab (abfd);
6397 break;
6398 case MAP_DYNSYMTAB:
6399 shndx = elf_dynsymtab (abfd);
6400 break;
6401 case MAP_STRTAB:
6402 shndx = elf_tdata (abfd)->strtab_section;
6403 break;
6404 case MAP_SHSTRTAB:
6405 shndx = elf_tdata (abfd)->shstrtab_section;
6406 break;
9ad5cbcf
AM
6407 case MAP_SYM_SHNDX:
6408 shndx = elf_tdata (abfd)->symtab_shndx_section;
6409 break;
079e9a2f
AM
6410 default:
6411 break;
6412 }
6413 }
6414 else
6415 {
6416 shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
252b5132 6417
079e9a2f
AM
6418 if (shndx == -1)
6419 {
6420 asection *sec2;
6421
6422 /* Writing this would be a hell of a lot easier if
6423 we had some decent documentation on bfd, and
6424 knew what to expect of the library, and what to
6425 demand of applications. For example, it
6426 appears that `objcopy' might not set the
6427 section of a symbol to be a section that is
6428 actually in the output file. */
6429 sec2 = bfd_get_section_by_name (abfd, sec->name);
589e6347
NC
6430 if (sec2 == NULL)
6431 {
6432 _bfd_error_handler (_("\
6433Unable to find equivalent output section for symbol '%s' from section '%s'"),
6434 syms[idx]->name ? syms[idx]->name : "<Local sym>",
6435 sec->name);
811072d8 6436 bfd_set_error (bfd_error_invalid_operation);
5ed6aba4 6437 _bfd_stringtab_free (stt);
589e6347
NC
6438 return FALSE;
6439 }
811072d8 6440
079e9a2f
AM
6441 shndx = _bfd_elf_section_from_bfd_section (abfd, sec2);
6442 BFD_ASSERT (shndx != -1);
6443 }
6444 }
252b5132 6445
079e9a2f
AM
6446 sym.st_shndx = shndx;
6447 }
252b5132 6448
13ae64f3
JJ
6449 if ((flags & BSF_THREAD_LOCAL) != 0)
6450 type = STT_TLS;
6451 else if ((flags & BSF_FUNCTION) != 0)
079e9a2f
AM
6452 type = STT_FUNC;
6453 else if ((flags & BSF_OBJECT) != 0)
6454 type = STT_OBJECT;
d9352518
DB
6455 else if ((flags & BSF_RELC) != 0)
6456 type = STT_RELC;
6457 else if ((flags & BSF_SRELC) != 0)
6458 type = STT_SRELC;
079e9a2f
AM
6459 else
6460 type = STT_NOTYPE;
252b5132 6461
13ae64f3
JJ
6462 if (syms[idx]->section->flags & SEC_THREAD_LOCAL)
6463 type = STT_TLS;
6464
589e6347 6465 /* Processor-specific types. */
079e9a2f
AM
6466 if (type_ptr != NULL
6467 && bed->elf_backend_get_symbol_type)
6468 type = ((*bed->elf_backend_get_symbol_type)
6469 (&type_ptr->internal_elf_sym, type));
252b5132 6470
079e9a2f
AM
6471 if (flags & BSF_SECTION_SYM)
6472 {
6473 if (flags & BSF_GLOBAL)
6474 sym.st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
6475 else
6476 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION);
6477 }
6478 else if (bfd_is_com_section (syms[idx]->section))
6479 sym.st_info = ELF_ST_INFO (STB_GLOBAL, type);
6480 else if (bfd_is_und_section (syms[idx]->section))
6481 sym.st_info = ELF_ST_INFO (((flags & BSF_WEAK)
6482 ? STB_WEAK
6483 : STB_GLOBAL),
6484 type);
6485 else if (flags & BSF_FILE)
6486 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FILE);
6487 else
6488 {
6489 int bind = STB_LOCAL;
252b5132 6490
079e9a2f
AM
6491 if (flags & BSF_LOCAL)
6492 bind = STB_LOCAL;
6493 else if (flags & BSF_WEAK)
6494 bind = STB_WEAK;
6495 else if (flags & BSF_GLOBAL)
6496 bind = STB_GLOBAL;
252b5132 6497
079e9a2f
AM
6498 sym.st_info = ELF_ST_INFO (bind, type);
6499 }
252b5132 6500
079e9a2f
AM
6501 if (type_ptr != NULL)
6502 sym.st_other = type_ptr->internal_elf_sym.st_other;
6503 else
6504 sym.st_other = 0;
252b5132 6505
9ad5cbcf 6506 bed->s->swap_symbol_out (abfd, &sym, outbound_syms, outbound_shndx);
079e9a2f 6507 outbound_syms += bed->s->sizeof_sym;
9ad5cbcf
AM
6508 if (outbound_shndx != NULL)
6509 outbound_shndx += sizeof (Elf_External_Sym_Shndx);
079e9a2f 6510 }
252b5132 6511
079e9a2f
AM
6512 *sttp = stt;
6513 symstrtab_hdr->sh_size = _bfd_stringtab_size (stt);
6514 symstrtab_hdr->sh_type = SHT_STRTAB;
252b5132 6515
079e9a2f
AM
6516 symstrtab_hdr->sh_flags = 0;
6517 symstrtab_hdr->sh_addr = 0;
6518 symstrtab_hdr->sh_entsize = 0;
6519 symstrtab_hdr->sh_link = 0;
6520 symstrtab_hdr->sh_info = 0;
6521 symstrtab_hdr->sh_addralign = 1;
252b5132 6522
b34976b6 6523 return TRUE;
252b5132
RH
6524}
6525
6526/* Return the number of bytes required to hold the symtab vector.
6527
6528 Note that we base it on the count plus 1, since we will null terminate
6529 the vector allocated based on this size. However, the ELF symbol table
6530 always has a dummy entry as symbol #0, so it ends up even. */
6531
6532long
217aa764 6533_bfd_elf_get_symtab_upper_bound (bfd *abfd)
252b5132
RH
6534{
6535 long symcount;
6536 long symtab_size;
6537 Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->symtab_hdr;
6538
6539 symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
b99d1833
AM
6540 symtab_size = (symcount + 1) * (sizeof (asymbol *));
6541 if (symcount > 0)
6542 symtab_size -= sizeof (asymbol *);
252b5132
RH
6543
6544 return symtab_size;
6545}
6546
6547long
217aa764 6548_bfd_elf_get_dynamic_symtab_upper_bound (bfd *abfd)
252b5132
RH
6549{
6550 long symcount;
6551 long symtab_size;
6552 Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->dynsymtab_hdr;
6553
6554 if (elf_dynsymtab (abfd) == 0)
6555 {
6556 bfd_set_error (bfd_error_invalid_operation);
6557 return -1;
6558 }
6559
6560 symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
b99d1833
AM
6561 symtab_size = (symcount + 1) * (sizeof (asymbol *));
6562 if (symcount > 0)
6563 symtab_size -= sizeof (asymbol *);
252b5132
RH
6564
6565 return symtab_size;
6566}
6567
6568long
217aa764
AM
6569_bfd_elf_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
6570 sec_ptr asect)
252b5132
RH
6571{
6572 return (asect->reloc_count + 1) * sizeof (arelent *);
6573}
6574
6575/* Canonicalize the relocs. */
6576
6577long
217aa764
AM
6578_bfd_elf_canonicalize_reloc (bfd *abfd,
6579 sec_ptr section,
6580 arelent **relptr,
6581 asymbol **symbols)
252b5132
RH
6582{
6583 arelent *tblptr;
6584 unsigned int i;
9c5bfbb7 6585 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 6586
b34976b6 6587 if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
252b5132
RH
6588 return -1;
6589
6590 tblptr = section->relocation;
6591 for (i = 0; i < section->reloc_count; i++)
6592 *relptr++ = tblptr++;
6593
6594 *relptr = NULL;
6595
6596 return section->reloc_count;
6597}
6598
6599long
6cee3f79 6600_bfd_elf_canonicalize_symtab (bfd *abfd, asymbol **allocation)
252b5132 6601{
9c5bfbb7 6602 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
217aa764 6603 long symcount = bed->s->slurp_symbol_table (abfd, allocation, FALSE);
252b5132
RH
6604
6605 if (symcount >= 0)
6606 bfd_get_symcount (abfd) = symcount;
6607 return symcount;
6608}
6609
6610long
217aa764
AM
6611_bfd_elf_canonicalize_dynamic_symtab (bfd *abfd,
6612 asymbol **allocation)
252b5132 6613{
9c5bfbb7 6614 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
217aa764 6615 long symcount = bed->s->slurp_symbol_table (abfd, allocation, TRUE);
1f70368c
DJ
6616
6617 if (symcount >= 0)
6618 bfd_get_dynamic_symcount (abfd) = symcount;
6619 return symcount;
252b5132
RH
6620}
6621
8615f3f2
AM
6622/* Return the size required for the dynamic reloc entries. Any loadable
6623 section that was actually installed in the BFD, and has type SHT_REL
6624 or SHT_RELA, and uses the dynamic symbol table, is considered to be a
6625 dynamic reloc section. */
252b5132
RH
6626
6627long
217aa764 6628_bfd_elf_get_dynamic_reloc_upper_bound (bfd *abfd)
252b5132
RH
6629{
6630 long ret;
6631 asection *s;
6632
6633 if (elf_dynsymtab (abfd) == 0)
6634 {
6635 bfd_set_error (bfd_error_invalid_operation);
6636 return -1;
6637 }
6638
6639 ret = sizeof (arelent *);
6640 for (s = abfd->sections; s != NULL; s = s->next)
8615f3f2
AM
6641 if ((s->flags & SEC_LOAD) != 0
6642 && elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
252b5132
RH
6643 && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
6644 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
eea6121a 6645 ret += ((s->size / elf_section_data (s)->this_hdr.sh_entsize)
252b5132
RH
6646 * sizeof (arelent *));
6647
6648 return ret;
6649}
6650
8615f3f2
AM
6651/* Canonicalize the dynamic relocation entries. Note that we return the
6652 dynamic relocations as a single block, although they are actually
6653 associated with particular sections; the interface, which was
6654 designed for SunOS style shared libraries, expects that there is only
6655 one set of dynamic relocs. Any loadable section that was actually
6656 installed in the BFD, and has type SHT_REL or SHT_RELA, and uses the
6657 dynamic symbol table, is considered to be a dynamic reloc section. */
252b5132
RH
6658
6659long
217aa764
AM
6660_bfd_elf_canonicalize_dynamic_reloc (bfd *abfd,
6661 arelent **storage,
6662 asymbol **syms)
252b5132 6663{
217aa764 6664 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
252b5132
RH
6665 asection *s;
6666 long ret;
6667
6668 if (elf_dynsymtab (abfd) == 0)
6669 {
6670 bfd_set_error (bfd_error_invalid_operation);
6671 return -1;
6672 }
6673
6674 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
6675 ret = 0;
6676 for (s = abfd->sections; s != NULL; s = s->next)
6677 {
8615f3f2
AM
6678 if ((s->flags & SEC_LOAD) != 0
6679 && elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
252b5132
RH
6680 && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
6681 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
6682 {
6683 arelent *p;
6684 long count, i;
6685
b34976b6 6686 if (! (*slurp_relocs) (abfd, s, syms, TRUE))
252b5132 6687 return -1;
eea6121a 6688 count = s->size / elf_section_data (s)->this_hdr.sh_entsize;
252b5132
RH
6689 p = s->relocation;
6690 for (i = 0; i < count; i++)
6691 *storage++ = p++;
6692 ret += count;
6693 }
6694 }
6695
6696 *storage = NULL;
6697
6698 return ret;
6699}
6700\f
6701/* Read in the version information. */
6702
b34976b6 6703bfd_boolean
fc0e6df6 6704_bfd_elf_slurp_version_tables (bfd *abfd, bfd_boolean default_imported_symver)
252b5132
RH
6705{
6706 bfd_byte *contents = NULL;
fc0e6df6
PB
6707 unsigned int freeidx = 0;
6708
6709 if (elf_dynverref (abfd) != 0)
6710 {
6711 Elf_Internal_Shdr *hdr;
6712 Elf_External_Verneed *everneed;
6713 Elf_Internal_Verneed *iverneed;
6714 unsigned int i;
d0fb9a8d 6715 bfd_byte *contents_end;
fc0e6df6
PB
6716
6717 hdr = &elf_tdata (abfd)->dynverref_hdr;
6718
d0fb9a8d
JJ
6719 elf_tdata (abfd)->verref = bfd_zalloc2 (abfd, hdr->sh_info,
6720 sizeof (Elf_Internal_Verneed));
fc0e6df6
PB
6721 if (elf_tdata (abfd)->verref == NULL)
6722 goto error_return;
6723
6724 elf_tdata (abfd)->cverrefs = hdr->sh_info;
6725
6726 contents = bfd_malloc (hdr->sh_size);
6727 if (contents == NULL)
d0fb9a8d
JJ
6728 {
6729error_return_verref:
6730 elf_tdata (abfd)->verref = NULL;
6731 elf_tdata (abfd)->cverrefs = 0;
6732 goto error_return;
6733 }
fc0e6df6
PB
6734 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
6735 || bfd_bread (contents, hdr->sh_size, abfd) != hdr->sh_size)
d0fb9a8d 6736 goto error_return_verref;
fc0e6df6 6737
d0fb9a8d
JJ
6738 if (hdr->sh_info && hdr->sh_size < sizeof (Elf_External_Verneed))
6739 goto error_return_verref;
6740
6741 BFD_ASSERT (sizeof (Elf_External_Verneed)
6742 == sizeof (Elf_External_Vernaux));
6743 contents_end = contents + hdr->sh_size - sizeof (Elf_External_Verneed);
fc0e6df6
PB
6744 everneed = (Elf_External_Verneed *) contents;
6745 iverneed = elf_tdata (abfd)->verref;
6746 for (i = 0; i < hdr->sh_info; i++, iverneed++)
6747 {
6748 Elf_External_Vernaux *evernaux;
6749 Elf_Internal_Vernaux *ivernaux;
6750 unsigned int j;
6751
6752 _bfd_elf_swap_verneed_in (abfd, everneed, iverneed);
6753
6754 iverneed->vn_bfd = abfd;
6755
6756 iverneed->vn_filename =
6757 bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
6758 iverneed->vn_file);
6759 if (iverneed->vn_filename == NULL)
d0fb9a8d 6760 goto error_return_verref;
fc0e6df6 6761
d0fb9a8d
JJ
6762 if (iverneed->vn_cnt == 0)
6763 iverneed->vn_auxptr = NULL;
6764 else
6765 {
6766 iverneed->vn_auxptr = bfd_alloc2 (abfd, iverneed->vn_cnt,
6767 sizeof (Elf_Internal_Vernaux));
6768 if (iverneed->vn_auxptr == NULL)
6769 goto error_return_verref;
6770 }
6771
6772 if (iverneed->vn_aux
6773 > (size_t) (contents_end - (bfd_byte *) everneed))
6774 goto error_return_verref;
fc0e6df6
PB
6775
6776 evernaux = ((Elf_External_Vernaux *)
6777 ((bfd_byte *) everneed + iverneed->vn_aux));
6778 ivernaux = iverneed->vn_auxptr;
6779 for (j = 0; j < iverneed->vn_cnt; j++, ivernaux++)
6780 {
6781 _bfd_elf_swap_vernaux_in (abfd, evernaux, ivernaux);
6782
6783 ivernaux->vna_nodename =
6784 bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
6785 ivernaux->vna_name);
6786 if (ivernaux->vna_nodename == NULL)
d0fb9a8d 6787 goto error_return_verref;
fc0e6df6
PB
6788
6789 if (j + 1 < iverneed->vn_cnt)
6790 ivernaux->vna_nextptr = ivernaux + 1;
6791 else
6792 ivernaux->vna_nextptr = NULL;
6793
d0fb9a8d
JJ
6794 if (ivernaux->vna_next
6795 > (size_t) (contents_end - (bfd_byte *) evernaux))
6796 goto error_return_verref;
6797
fc0e6df6
PB
6798 evernaux = ((Elf_External_Vernaux *)
6799 ((bfd_byte *) evernaux + ivernaux->vna_next));
6800
6801 if (ivernaux->vna_other > freeidx)
6802 freeidx = ivernaux->vna_other;
6803 }
6804
6805 if (i + 1 < hdr->sh_info)
6806 iverneed->vn_nextref = iverneed + 1;
6807 else
6808 iverneed->vn_nextref = NULL;
6809
d0fb9a8d
JJ
6810 if (iverneed->vn_next
6811 > (size_t) (contents_end - (bfd_byte *) everneed))
6812 goto error_return_verref;
6813
fc0e6df6
PB
6814 everneed = ((Elf_External_Verneed *)
6815 ((bfd_byte *) everneed + iverneed->vn_next));
6816 }
6817
6818 free (contents);
6819 contents = NULL;
6820 }
252b5132
RH
6821
6822 if (elf_dynverdef (abfd) != 0)
6823 {
6824 Elf_Internal_Shdr *hdr;
6825 Elf_External_Verdef *everdef;
6826 Elf_Internal_Verdef *iverdef;
f631889e
UD
6827 Elf_Internal_Verdef *iverdefarr;
6828 Elf_Internal_Verdef iverdefmem;
252b5132 6829 unsigned int i;
062e2358 6830 unsigned int maxidx;
d0fb9a8d 6831 bfd_byte *contents_end_def, *contents_end_aux;
252b5132
RH
6832
6833 hdr = &elf_tdata (abfd)->dynverdef_hdr;
6834
217aa764 6835 contents = bfd_malloc (hdr->sh_size);
252b5132
RH
6836 if (contents == NULL)
6837 goto error_return;
6838 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
217aa764 6839 || bfd_bread (contents, hdr->sh_size, abfd) != hdr->sh_size)
252b5132
RH
6840 goto error_return;
6841
d0fb9a8d
JJ
6842 if (hdr->sh_info && hdr->sh_size < sizeof (Elf_External_Verdef))
6843 goto error_return;
6844
6845 BFD_ASSERT (sizeof (Elf_External_Verdef)
6846 >= sizeof (Elf_External_Verdaux));
6847 contents_end_def = contents + hdr->sh_size
6848 - sizeof (Elf_External_Verdef);
6849 contents_end_aux = contents + hdr->sh_size
6850 - sizeof (Elf_External_Verdaux);
6851
f631889e
UD
6852 /* We know the number of entries in the section but not the maximum
6853 index. Therefore we have to run through all entries and find
6854 the maximum. */
252b5132 6855 everdef = (Elf_External_Verdef *) contents;
f631889e
UD
6856 maxidx = 0;
6857 for (i = 0; i < hdr->sh_info; ++i)
6858 {
6859 _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
6860
062e2358
AM
6861 if ((iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION)) > maxidx)
6862 maxidx = iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION);
f631889e 6863
d0fb9a8d
JJ
6864 if (iverdefmem.vd_next
6865 > (size_t) (contents_end_def - (bfd_byte *) everdef))
6866 goto error_return;
6867
f631889e
UD
6868 everdef = ((Elf_External_Verdef *)
6869 ((bfd_byte *) everdef + iverdefmem.vd_next));
6870 }
6871
fc0e6df6
PB
6872 if (default_imported_symver)
6873 {
6874 if (freeidx > maxidx)
6875 maxidx = ++freeidx;
6876 else
6877 freeidx = ++maxidx;
6878 }
d0fb9a8d
JJ
6879 elf_tdata (abfd)->verdef = bfd_zalloc2 (abfd, maxidx,
6880 sizeof (Elf_Internal_Verdef));
f631889e
UD
6881 if (elf_tdata (abfd)->verdef == NULL)
6882 goto error_return;
6883
6884 elf_tdata (abfd)->cverdefs = maxidx;
6885
6886 everdef = (Elf_External_Verdef *) contents;
6887 iverdefarr = elf_tdata (abfd)->verdef;
6888 for (i = 0; i < hdr->sh_info; i++)
252b5132
RH
6889 {
6890 Elf_External_Verdaux *everdaux;
6891 Elf_Internal_Verdaux *iverdaux;
6892 unsigned int j;
6893
f631889e
UD
6894 _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
6895
d0fb9a8d
JJ
6896 if ((iverdefmem.vd_ndx & VERSYM_VERSION) == 0)
6897 {
6898error_return_verdef:
6899 elf_tdata (abfd)->verdef = NULL;
6900 elf_tdata (abfd)->cverdefs = 0;
6901 goto error_return;
6902 }
6903
f631889e
UD
6904 iverdef = &iverdefarr[(iverdefmem.vd_ndx & VERSYM_VERSION) - 1];
6905 memcpy (iverdef, &iverdefmem, sizeof (Elf_Internal_Verdef));
252b5132
RH
6906
6907 iverdef->vd_bfd = abfd;
6908
d0fb9a8d
JJ
6909 if (iverdef->vd_cnt == 0)
6910 iverdef->vd_auxptr = NULL;
6911 else
6912 {
6913 iverdef->vd_auxptr = bfd_alloc2 (abfd, iverdef->vd_cnt,
6914 sizeof (Elf_Internal_Verdaux));
6915 if (iverdef->vd_auxptr == NULL)
6916 goto error_return_verdef;
6917 }
6918
6919 if (iverdef->vd_aux
6920 > (size_t) (contents_end_aux - (bfd_byte *) everdef))
6921 goto error_return_verdef;
252b5132
RH
6922
6923 everdaux = ((Elf_External_Verdaux *)
6924 ((bfd_byte *) everdef + iverdef->vd_aux));
6925 iverdaux = iverdef->vd_auxptr;
6926 for (j = 0; j < iverdef->vd_cnt; j++, iverdaux++)
6927 {
6928 _bfd_elf_swap_verdaux_in (abfd, everdaux, iverdaux);
6929
6930 iverdaux->vda_nodename =
6931 bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
6932 iverdaux->vda_name);
6933 if (iverdaux->vda_nodename == NULL)
d0fb9a8d 6934 goto error_return_verdef;
252b5132
RH
6935
6936 if (j + 1 < iverdef->vd_cnt)
6937 iverdaux->vda_nextptr = iverdaux + 1;
6938 else
6939 iverdaux->vda_nextptr = NULL;
6940
d0fb9a8d
JJ
6941 if (iverdaux->vda_next
6942 > (size_t) (contents_end_aux - (bfd_byte *) everdaux))
6943 goto error_return_verdef;
6944
252b5132
RH
6945 everdaux = ((Elf_External_Verdaux *)
6946 ((bfd_byte *) everdaux + iverdaux->vda_next));
6947 }
6948
d0fb9a8d
JJ
6949 if (iverdef->vd_cnt)
6950 iverdef->vd_nodename = iverdef->vd_auxptr->vda_nodename;
252b5132 6951
d0fb9a8d 6952 if ((size_t) (iverdef - iverdefarr) + 1 < maxidx)
252b5132
RH
6953 iverdef->vd_nextdef = iverdef + 1;
6954 else
6955 iverdef->vd_nextdef = NULL;
6956
6957 everdef = ((Elf_External_Verdef *)
6958 ((bfd_byte *) everdef + iverdef->vd_next));
6959 }
6960
6961 free (contents);
6962 contents = NULL;
6963 }
fc0e6df6 6964 else if (default_imported_symver)
252b5132 6965 {
fc0e6df6
PB
6966 if (freeidx < 3)
6967 freeidx = 3;
6968 else
6969 freeidx++;
252b5132 6970
d0fb9a8d
JJ
6971 elf_tdata (abfd)->verdef = bfd_zalloc2 (abfd, freeidx,
6972 sizeof (Elf_Internal_Verdef));
fc0e6df6 6973 if (elf_tdata (abfd)->verdef == NULL)
252b5132
RH
6974 goto error_return;
6975
fc0e6df6
PB
6976 elf_tdata (abfd)->cverdefs = freeidx;
6977 }
252b5132 6978
fc0e6df6
PB
6979 /* Create a default version based on the soname. */
6980 if (default_imported_symver)
6981 {
6982 Elf_Internal_Verdef *iverdef;
6983 Elf_Internal_Verdaux *iverdaux;
252b5132 6984
fc0e6df6 6985 iverdef = &elf_tdata (abfd)->verdef[freeidx - 1];;
252b5132 6986
fc0e6df6
PB
6987 iverdef->vd_version = VER_DEF_CURRENT;
6988 iverdef->vd_flags = 0;
6989 iverdef->vd_ndx = freeidx;
6990 iverdef->vd_cnt = 1;
252b5132 6991
fc0e6df6 6992 iverdef->vd_bfd = abfd;
252b5132 6993
fc0e6df6
PB
6994 iverdef->vd_nodename = bfd_elf_get_dt_soname (abfd);
6995 if (iverdef->vd_nodename == NULL)
d0fb9a8d 6996 goto error_return_verdef;
fc0e6df6 6997 iverdef->vd_nextdef = NULL;
d0fb9a8d
JJ
6998 iverdef->vd_auxptr = bfd_alloc (abfd, sizeof (Elf_Internal_Verdaux));
6999 if (iverdef->vd_auxptr == NULL)
7000 goto error_return_verdef;
252b5132 7001
fc0e6df6
PB
7002 iverdaux = iverdef->vd_auxptr;
7003 iverdaux->vda_nodename = iverdef->vd_nodename;
7004 iverdaux->vda_nextptr = NULL;
252b5132
RH
7005 }
7006
b34976b6 7007 return TRUE;
252b5132
RH
7008
7009 error_return:
5ed6aba4 7010 if (contents != NULL)
252b5132 7011 free (contents);
b34976b6 7012 return FALSE;
252b5132
RH
7013}
7014\f
7015asymbol *
217aa764 7016_bfd_elf_make_empty_symbol (bfd *abfd)
252b5132
RH
7017{
7018 elf_symbol_type *newsym;
dc810e39 7019 bfd_size_type amt = sizeof (elf_symbol_type);
252b5132 7020
217aa764 7021 newsym = bfd_zalloc (abfd, amt);
252b5132
RH
7022 if (!newsym)
7023 return NULL;
7024 else
7025 {
7026 newsym->symbol.the_bfd = abfd;
7027 return &newsym->symbol;
7028 }
7029}
7030
7031void
217aa764
AM
7032_bfd_elf_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
7033 asymbol *symbol,
7034 symbol_info *ret)
252b5132
RH
7035{
7036 bfd_symbol_info (symbol, ret);
7037}
7038
7039/* Return whether a symbol name implies a local symbol. Most targets
7040 use this function for the is_local_label_name entry point, but some
7041 override it. */
7042
b34976b6 7043bfd_boolean
217aa764
AM
7044_bfd_elf_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
7045 const char *name)
252b5132
RH
7046{
7047 /* Normal local symbols start with ``.L''. */
7048 if (name[0] == '.' && name[1] == 'L')
b34976b6 7049 return TRUE;
252b5132
RH
7050
7051 /* At least some SVR4 compilers (e.g., UnixWare 2.1 cc) generate
7052 DWARF debugging symbols starting with ``..''. */
7053 if (name[0] == '.' && name[1] == '.')
b34976b6 7054 return TRUE;
252b5132
RH
7055
7056 /* gcc will sometimes generate symbols beginning with ``_.L_'' when
7057 emitting DWARF debugging output. I suspect this is actually a
7058 small bug in gcc (it calls ASM_OUTPUT_LABEL when it should call
7059 ASM_GENERATE_INTERNAL_LABEL, and this causes the leading
7060 underscore to be emitted on some ELF targets). For ease of use,
7061 we treat such symbols as local. */
7062 if (name[0] == '_' && name[1] == '.' && name[2] == 'L' && name[3] == '_')
b34976b6 7063 return TRUE;
252b5132 7064
b34976b6 7065 return FALSE;
252b5132
RH
7066}
7067
7068alent *
217aa764
AM
7069_bfd_elf_get_lineno (bfd *abfd ATTRIBUTE_UNUSED,
7070 asymbol *symbol ATTRIBUTE_UNUSED)
252b5132
RH
7071{
7072 abort ();
7073 return NULL;
7074}
7075
b34976b6 7076bfd_boolean
217aa764
AM
7077_bfd_elf_set_arch_mach (bfd *abfd,
7078 enum bfd_architecture arch,
7079 unsigned long machine)
252b5132
RH
7080{
7081 /* If this isn't the right architecture for this backend, and this
7082 isn't the generic backend, fail. */
7083 if (arch != get_elf_backend_data (abfd)->arch
7084 && arch != bfd_arch_unknown
7085 && get_elf_backend_data (abfd)->arch != bfd_arch_unknown)
b34976b6 7086 return FALSE;
252b5132
RH
7087
7088 return bfd_default_set_arch_mach (abfd, arch, machine);
7089}
7090
d1fad7c6
NC
7091/* Find the function to a particular section and offset,
7092 for error reporting. */
252b5132 7093
b34976b6 7094static bfd_boolean
217aa764
AM
7095elf_find_function (bfd *abfd ATTRIBUTE_UNUSED,
7096 asection *section,
7097 asymbol **symbols,
7098 bfd_vma offset,
7099 const char **filename_ptr,
7100 const char **functionname_ptr)
252b5132 7101{
252b5132 7102 const char *filename;
57426232 7103 asymbol *func, *file;
252b5132
RH
7104 bfd_vma low_func;
7105 asymbol **p;
57426232
JB
7106 /* ??? Given multiple file symbols, it is impossible to reliably
7107 choose the right file name for global symbols. File symbols are
7108 local symbols, and thus all file symbols must sort before any
7109 global symbols. The ELF spec may be interpreted to say that a
7110 file symbol must sort before other local symbols, but currently
7111 ld -r doesn't do this. So, for ld -r output, it is possible to
7112 make a better choice of file name for local symbols by ignoring
7113 file symbols appearing after a given local symbol. */
7114 enum { nothing_seen, symbol_seen, file_after_symbol_seen } state;
252b5132 7115
252b5132
RH
7116 filename = NULL;
7117 func = NULL;
57426232 7118 file = NULL;
252b5132 7119 low_func = 0;
57426232 7120 state = nothing_seen;
252b5132
RH
7121
7122 for (p = symbols; *p != NULL; p++)
7123 {
7124 elf_symbol_type *q;
7125
7126 q = (elf_symbol_type *) *p;
7127
252b5132
RH
7128 switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
7129 {
7130 default:
7131 break;
7132 case STT_FILE:
57426232
JB
7133 file = &q->symbol;
7134 if (state == symbol_seen)
7135 state = file_after_symbol_seen;
7136 continue;
252b5132
RH
7137 case STT_NOTYPE:
7138 case STT_FUNC:
6b40fcba 7139 if (bfd_get_section (&q->symbol) == section
252b5132
RH
7140 && q->symbol.value >= low_func
7141 && q->symbol.value <= offset)
7142 {
7143 func = (asymbol *) q;
7144 low_func = q->symbol.value;
a1923858
AM
7145 filename = NULL;
7146 if (file != NULL
7147 && (ELF_ST_BIND (q->internal_elf_sym.st_info) == STB_LOCAL
7148 || state != file_after_symbol_seen))
57426232 7149 filename = bfd_asymbol_name (file);
252b5132
RH
7150 }
7151 break;
7152 }
57426232
JB
7153 if (state == nothing_seen)
7154 state = symbol_seen;
252b5132
RH
7155 }
7156
7157 if (func == NULL)
b34976b6 7158 return FALSE;
252b5132 7159
d1fad7c6
NC
7160 if (filename_ptr)
7161 *filename_ptr = filename;
7162 if (functionname_ptr)
7163 *functionname_ptr = bfd_asymbol_name (func);
7164
b34976b6 7165 return TRUE;
d1fad7c6
NC
7166}
7167
7168/* Find the nearest line to a particular section and offset,
7169 for error reporting. */
7170
b34976b6 7171bfd_boolean
217aa764
AM
7172_bfd_elf_find_nearest_line (bfd *abfd,
7173 asection *section,
7174 asymbol **symbols,
7175 bfd_vma offset,
7176 const char **filename_ptr,
7177 const char **functionname_ptr,
7178 unsigned int *line_ptr)
d1fad7c6 7179{
b34976b6 7180 bfd_boolean found;
d1fad7c6
NC
7181
7182 if (_bfd_dwarf1_find_nearest_line (abfd, section, symbols, offset,
4e8a9624
AM
7183 filename_ptr, functionname_ptr,
7184 line_ptr))
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_dwarf2_find_nearest_line (abfd, section, symbols, offset,
4e8a9624
AM
7195 filename_ptr, functionname_ptr,
7196 line_ptr, 0,
7197 &elf_tdata (abfd)->dwarf2_find_line_info))
d1fad7c6
NC
7198 {
7199 if (!*functionname_ptr)
4e8a9624
AM
7200 elf_find_function (abfd, section, symbols, offset,
7201 *filename_ptr ? NULL : filename_ptr,
7202 functionname_ptr);
7203
b34976b6 7204 return TRUE;
d1fad7c6
NC
7205 }
7206
7207 if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
4e8a9624
AM
7208 &found, filename_ptr,
7209 functionname_ptr, line_ptr,
7210 &elf_tdata (abfd)->line_info))
b34976b6 7211 return FALSE;
dc43ada5 7212 if (found && (*functionname_ptr || *line_ptr))
b34976b6 7213 return TRUE;
d1fad7c6
NC
7214
7215 if (symbols == NULL)
b34976b6 7216 return FALSE;
d1fad7c6
NC
7217
7218 if (! elf_find_function (abfd, section, symbols, offset,
4e8a9624 7219 filename_ptr, functionname_ptr))
b34976b6 7220 return FALSE;
d1fad7c6 7221
252b5132 7222 *line_ptr = 0;
b34976b6 7223 return TRUE;
252b5132
RH
7224}
7225
5420f73d
L
7226/* Find the line for a symbol. */
7227
7228bfd_boolean
7229_bfd_elf_find_line (bfd *abfd, asymbol **symbols, asymbol *symbol,
7230 const char **filename_ptr, unsigned int *line_ptr)
7231{
7232 return _bfd_dwarf2_find_line (abfd, symbols, symbol,
7233 filename_ptr, line_ptr, 0,
7234 &elf_tdata (abfd)->dwarf2_find_line_info);
7235}
7236
4ab527b0
FF
7237/* After a call to bfd_find_nearest_line, successive calls to
7238 bfd_find_inliner_info can be used to get source information about
7239 each level of function inlining that terminated at the address
7240 passed to bfd_find_nearest_line. Currently this is only supported
7241 for DWARF2 with appropriate DWARF3 extensions. */
7242
7243bfd_boolean
7244_bfd_elf_find_inliner_info (bfd *abfd,
7245 const char **filename_ptr,
7246 const char **functionname_ptr,
7247 unsigned int *line_ptr)
7248{
7249 bfd_boolean found;
7250 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
7251 functionname_ptr, line_ptr,
7252 & elf_tdata (abfd)->dwarf2_find_line_info);
7253 return found;
7254}
7255
252b5132 7256int
a6b96beb 7257_bfd_elf_sizeof_headers (bfd *abfd, struct bfd_link_info *info)
252b5132 7258{
8ded5a0f
AM
7259 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7260 int ret = bed->s->sizeof_ehdr;
252b5132 7261
a6b96beb 7262 if (!info->relocatable)
8ded5a0f 7263 {
62d7a5f6 7264 bfd_size_type phdr_size = elf_tdata (abfd)->program_header_size;
8ded5a0f 7265
62d7a5f6
AM
7266 if (phdr_size == (bfd_size_type) -1)
7267 {
7268 struct elf_segment_map *m;
7269
7270 phdr_size = 0;
7271 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
7272 phdr_size += bed->s->sizeof_phdr;
8ded5a0f 7273
62d7a5f6
AM
7274 if (phdr_size == 0)
7275 phdr_size = get_program_header_size (abfd, info);
7276 }
8ded5a0f
AM
7277
7278 elf_tdata (abfd)->program_header_size = phdr_size;
7279 ret += phdr_size;
7280 }
7281
252b5132
RH
7282 return ret;
7283}
7284
b34976b6 7285bfd_boolean
217aa764
AM
7286_bfd_elf_set_section_contents (bfd *abfd,
7287 sec_ptr section,
0f867abe 7288 const void *location,
217aa764
AM
7289 file_ptr offset,
7290 bfd_size_type count)
252b5132
RH
7291{
7292 Elf_Internal_Shdr *hdr;
dc810e39 7293 bfd_signed_vma pos;
252b5132
RH
7294
7295 if (! abfd->output_has_begun
217aa764 7296 && ! _bfd_elf_compute_section_file_positions (abfd, NULL))
b34976b6 7297 return FALSE;
252b5132
RH
7298
7299 hdr = &elf_section_data (section)->this_hdr;
dc810e39
AM
7300 pos = hdr->sh_offset + offset;
7301 if (bfd_seek (abfd, pos, SEEK_SET) != 0
7302 || bfd_bwrite (location, count, abfd) != count)
b34976b6 7303 return FALSE;
252b5132 7304
b34976b6 7305 return TRUE;
252b5132
RH
7306}
7307
7308void
217aa764
AM
7309_bfd_elf_no_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
7310 arelent *cache_ptr ATTRIBUTE_UNUSED,
7311 Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
252b5132
RH
7312{
7313 abort ();
7314}
7315
252b5132
RH
7316/* Try to convert a non-ELF reloc into an ELF one. */
7317
b34976b6 7318bfd_boolean
217aa764 7319_bfd_elf_validate_reloc (bfd *abfd, arelent *areloc)
252b5132 7320{
c044fabd 7321 /* Check whether we really have an ELF howto. */
252b5132
RH
7322
7323 if ((*areloc->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec)
7324 {
7325 bfd_reloc_code_real_type code;
7326 reloc_howto_type *howto;
7327
7328 /* Alien reloc: Try to determine its type to replace it with an
c044fabd 7329 equivalent ELF reloc. */
252b5132
RH
7330
7331 if (areloc->howto->pc_relative)
7332 {
7333 switch (areloc->howto->bitsize)
7334 {
7335 case 8:
7336 code = BFD_RELOC_8_PCREL;
7337 break;
7338 case 12:
7339 code = BFD_RELOC_12_PCREL;
7340 break;
7341 case 16:
7342 code = BFD_RELOC_16_PCREL;
7343 break;
7344 case 24:
7345 code = BFD_RELOC_24_PCREL;
7346 break;
7347 case 32:
7348 code = BFD_RELOC_32_PCREL;
7349 break;
7350 case 64:
7351 code = BFD_RELOC_64_PCREL;
7352 break;
7353 default:
7354 goto fail;
7355 }
7356
7357 howto = bfd_reloc_type_lookup (abfd, code);
7358
7359 if (areloc->howto->pcrel_offset != howto->pcrel_offset)
7360 {
7361 if (howto->pcrel_offset)
7362 areloc->addend += areloc->address;
7363 else
7364 areloc->addend -= areloc->address; /* addend is unsigned!! */
7365 }
7366 }
7367 else
7368 {
7369 switch (areloc->howto->bitsize)
7370 {
7371 case 8:
7372 code = BFD_RELOC_8;
7373 break;
7374 case 14:
7375 code = BFD_RELOC_14;
7376 break;
7377 case 16:
7378 code = BFD_RELOC_16;
7379 break;
7380 case 26:
7381 code = BFD_RELOC_26;
7382 break;
7383 case 32:
7384 code = BFD_RELOC_32;
7385 break;
7386 case 64:
7387 code = BFD_RELOC_64;
7388 break;
7389 default:
7390 goto fail;
7391 }
7392
7393 howto = bfd_reloc_type_lookup (abfd, code);
7394 }
7395
7396 if (howto)
7397 areloc->howto = howto;
7398 else
7399 goto fail;
7400 }
7401
b34976b6 7402 return TRUE;
252b5132
RH
7403
7404 fail:
7405 (*_bfd_error_handler)
d003868e
AM
7406 (_("%B: unsupported relocation type %s"),
7407 abfd, areloc->howto->name);
252b5132 7408 bfd_set_error (bfd_error_bad_value);
b34976b6 7409 return FALSE;
252b5132
RH
7410}
7411
b34976b6 7412bfd_boolean
217aa764 7413_bfd_elf_close_and_cleanup (bfd *abfd)
252b5132
RH
7414{
7415 if (bfd_get_format (abfd) == bfd_object)
7416 {
b25e3d87 7417 if (elf_tdata (abfd) != NULL && elf_shstrtab (abfd) != NULL)
2b0f7ef9 7418 _bfd_elf_strtab_free (elf_shstrtab (abfd));
6f140a15 7419 _bfd_dwarf2_cleanup_debug_info (abfd);
252b5132
RH
7420 }
7421
7422 return _bfd_generic_close_and_cleanup (abfd);
7423}
7424
7425/* For Rel targets, we encode meaningful data for BFD_RELOC_VTABLE_ENTRY
7426 in the relocation's offset. Thus we cannot allow any sort of sanity
7427 range-checking to interfere. There is nothing else to do in processing
7428 this reloc. */
7429
7430bfd_reloc_status_type
217aa764
AM
7431_bfd_elf_rel_vtable_reloc_fn
7432 (bfd *abfd ATTRIBUTE_UNUSED, arelent *re ATTRIBUTE_UNUSED,
fc0a2244 7433 struct bfd_symbol *symbol ATTRIBUTE_UNUSED,
217aa764
AM
7434 void *data ATTRIBUTE_UNUSED, asection *is ATTRIBUTE_UNUSED,
7435 bfd *obfd ATTRIBUTE_UNUSED, char **errmsg ATTRIBUTE_UNUSED)
252b5132
RH
7436{
7437 return bfd_reloc_ok;
7438}
252b5132
RH
7439\f
7440/* Elf core file support. Much of this only works on native
7441 toolchains, since we rely on knowing the
7442 machine-dependent procfs structure in order to pick
c044fabd 7443 out details about the corefile. */
252b5132
RH
7444
7445#ifdef HAVE_SYS_PROCFS_H
7446# include <sys/procfs.h>
7447#endif
7448
c044fabd 7449/* FIXME: this is kinda wrong, but it's what gdb wants. */
252b5132
RH
7450
7451static int
217aa764 7452elfcore_make_pid (bfd *abfd)
252b5132
RH
7453{
7454 return ((elf_tdata (abfd)->core_lwpid << 16)
7455 + (elf_tdata (abfd)->core_pid));
7456}
7457
252b5132
RH
7458/* If there isn't a section called NAME, make one, using
7459 data from SECT. Note, this function will generate a
7460 reference to NAME, so you shouldn't deallocate or
c044fabd 7461 overwrite it. */
252b5132 7462
b34976b6 7463static bfd_boolean
217aa764 7464elfcore_maybe_make_sect (bfd *abfd, char *name, asection *sect)
252b5132 7465{
c044fabd 7466 asection *sect2;
252b5132
RH
7467
7468 if (bfd_get_section_by_name (abfd, name) != NULL)
b34976b6 7469 return TRUE;
252b5132 7470
117ed4f8 7471 sect2 = bfd_make_section_with_flags (abfd, name, sect->flags);
252b5132 7472 if (sect2 == NULL)
b34976b6 7473 return FALSE;
252b5132 7474
eea6121a 7475 sect2->size = sect->size;
252b5132 7476 sect2->filepos = sect->filepos;
252b5132 7477 sect2->alignment_power = sect->alignment_power;
b34976b6 7478 return TRUE;
252b5132
RH
7479}
7480
bb0082d6
AM
7481/* Create a pseudosection containing SIZE bytes at FILEPOS. This
7482 actually creates up to two pseudosections:
7483 - For the single-threaded case, a section named NAME, unless
7484 such a section already exists.
7485 - For the multi-threaded case, a section named "NAME/PID", where
7486 PID is elfcore_make_pid (abfd).
7487 Both pseudosections have identical contents. */
b34976b6 7488bfd_boolean
217aa764
AM
7489_bfd_elfcore_make_pseudosection (bfd *abfd,
7490 char *name,
7491 size_t size,
7492 ufile_ptr filepos)
bb0082d6
AM
7493{
7494 char buf[100];
7495 char *threaded_name;
d4c88bbb 7496 size_t len;
bb0082d6
AM
7497 asection *sect;
7498
7499 /* Build the section name. */
7500
7501 sprintf (buf, "%s/%d", name, elfcore_make_pid (abfd));
d4c88bbb 7502 len = strlen (buf) + 1;
217aa764 7503 threaded_name = bfd_alloc (abfd, len);
bb0082d6 7504 if (threaded_name == NULL)
b34976b6 7505 return FALSE;
d4c88bbb 7506 memcpy (threaded_name, buf, len);
bb0082d6 7507
117ed4f8
AM
7508 sect = bfd_make_section_anyway_with_flags (abfd, threaded_name,
7509 SEC_HAS_CONTENTS);
bb0082d6 7510 if (sect == NULL)
b34976b6 7511 return FALSE;
eea6121a 7512 sect->size = size;
bb0082d6 7513 sect->filepos = filepos;
bb0082d6
AM
7514 sect->alignment_power = 2;
7515
936e320b 7516 return elfcore_maybe_make_sect (abfd, name, sect);
bb0082d6
AM
7517}
7518
252b5132 7519/* prstatus_t exists on:
4a938328 7520 solaris 2.5+
252b5132
RH
7521 linux 2.[01] + glibc
7522 unixware 4.2
7523*/
7524
7525#if defined (HAVE_PRSTATUS_T)
a7b97311 7526
b34976b6 7527static bfd_boolean
217aa764 7528elfcore_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132 7529{
eea6121a 7530 size_t size;
7ee38065 7531 int offset;
252b5132 7532
4a938328
MS
7533 if (note->descsz == sizeof (prstatus_t))
7534 {
7535 prstatus_t prstat;
252b5132 7536
eea6121a 7537 size = sizeof (prstat.pr_reg);
7ee38065 7538 offset = offsetof (prstatus_t, pr_reg);
4a938328 7539 memcpy (&prstat, note->descdata, sizeof (prstat));
252b5132 7540
fa49d224
NC
7541 /* Do not overwrite the core signal if it
7542 has already been set by another thread. */
7543 if (elf_tdata (abfd)->core_signal == 0)
7544 elf_tdata (abfd)->core_signal = prstat.pr_cursig;
4a938328 7545 elf_tdata (abfd)->core_pid = prstat.pr_pid;
252b5132 7546
4a938328
MS
7547 /* pr_who exists on:
7548 solaris 2.5+
7549 unixware 4.2
7550 pr_who doesn't exist on:
7551 linux 2.[01]
7552 */
252b5132 7553#if defined (HAVE_PRSTATUS_T_PR_WHO)
4a938328 7554 elf_tdata (abfd)->core_lwpid = prstat.pr_who;
252b5132 7555#endif
4a938328 7556 }
7ee38065 7557#if defined (HAVE_PRSTATUS32_T)
4a938328
MS
7558 else if (note->descsz == sizeof (prstatus32_t))
7559 {
7560 /* 64-bit host, 32-bit corefile */
7561 prstatus32_t prstat;
7562
eea6121a 7563 size = sizeof (prstat.pr_reg);
7ee38065 7564 offset = offsetof (prstatus32_t, pr_reg);
4a938328
MS
7565 memcpy (&prstat, note->descdata, sizeof (prstat));
7566
fa49d224
NC
7567 /* Do not overwrite the core signal if it
7568 has already been set by another thread. */
7569 if (elf_tdata (abfd)->core_signal == 0)
7570 elf_tdata (abfd)->core_signal = prstat.pr_cursig;
4a938328
MS
7571 elf_tdata (abfd)->core_pid = prstat.pr_pid;
7572
7573 /* pr_who exists on:
7574 solaris 2.5+
7575 unixware 4.2
7576 pr_who doesn't exist on:
7577 linux 2.[01]
7578 */
7ee38065 7579#if defined (HAVE_PRSTATUS32_T_PR_WHO)
4a938328
MS
7580 elf_tdata (abfd)->core_lwpid = prstat.pr_who;
7581#endif
7582 }
7ee38065 7583#endif /* HAVE_PRSTATUS32_T */
4a938328
MS
7584 else
7585 {
7586 /* Fail - we don't know how to handle any other
7587 note size (ie. data object type). */
b34976b6 7588 return TRUE;
4a938328 7589 }
252b5132 7590
bb0082d6 7591 /* Make a ".reg/999" section and a ".reg" section. */
936e320b 7592 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 7593 size, note->descpos + offset);
252b5132
RH
7594}
7595#endif /* defined (HAVE_PRSTATUS_T) */
7596
bb0082d6 7597/* Create a pseudosection containing the exact contents of NOTE. */
b34976b6 7598static bfd_boolean
217aa764
AM
7599elfcore_make_note_pseudosection (bfd *abfd,
7600 char *name,
7601 Elf_Internal_Note *note)
252b5132 7602{
936e320b
AM
7603 return _bfd_elfcore_make_pseudosection (abfd, name,
7604 note->descsz, note->descpos);
252b5132
RH
7605}
7606
ff08c6bb
JB
7607/* There isn't a consistent prfpregset_t across platforms,
7608 but it doesn't matter, because we don't have to pick this
c044fabd
KH
7609 data structure apart. */
7610
b34976b6 7611static bfd_boolean
217aa764 7612elfcore_grok_prfpreg (bfd *abfd, Elf_Internal_Note *note)
ff08c6bb
JB
7613{
7614 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
7615}
7616
ff08c6bb
JB
7617/* Linux dumps the Intel SSE regs in a note named "LINUX" with a note
7618 type of 5 (NT_PRXFPREG). Just include the whole note's contents
7619 literally. */
c044fabd 7620
b34976b6 7621static bfd_boolean
217aa764 7622elfcore_grok_prxfpreg (bfd *abfd, Elf_Internal_Note *note)
ff08c6bb
JB
7623{
7624 return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
7625}
7626
252b5132 7627#if defined (HAVE_PRPSINFO_T)
4a938328 7628typedef prpsinfo_t elfcore_psinfo_t;
7ee38065 7629#if defined (HAVE_PRPSINFO32_T) /* Sparc64 cross Sparc32 */
4a938328
MS
7630typedef prpsinfo32_t elfcore_psinfo32_t;
7631#endif
252b5132
RH
7632#endif
7633
7634#if defined (HAVE_PSINFO_T)
4a938328 7635typedef psinfo_t elfcore_psinfo_t;
7ee38065 7636#if defined (HAVE_PSINFO32_T) /* Sparc64 cross Sparc32 */
4a938328
MS
7637typedef psinfo32_t elfcore_psinfo32_t;
7638#endif
252b5132
RH
7639#endif
7640
252b5132
RH
7641/* return a malloc'ed copy of a string at START which is at
7642 most MAX bytes long, possibly without a terminating '\0'.
c044fabd 7643 the copy will always have a terminating '\0'. */
252b5132 7644
936e320b 7645char *
217aa764 7646_bfd_elfcore_strndup (bfd *abfd, char *start, size_t max)
252b5132 7647{
dc810e39 7648 char *dups;
c044fabd 7649 char *end = memchr (start, '\0', max);
dc810e39 7650 size_t len;
252b5132
RH
7651
7652 if (end == NULL)
7653 len = max;
7654 else
7655 len = end - start;
7656
217aa764 7657 dups = bfd_alloc (abfd, len + 1);
dc810e39 7658 if (dups == NULL)
252b5132
RH
7659 return NULL;
7660
dc810e39
AM
7661 memcpy (dups, start, len);
7662 dups[len] = '\0';
252b5132 7663
dc810e39 7664 return dups;
252b5132
RH
7665}
7666
bb0082d6 7667#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
b34976b6 7668static bfd_boolean
217aa764 7669elfcore_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
252b5132 7670{
4a938328
MS
7671 if (note->descsz == sizeof (elfcore_psinfo_t))
7672 {
7673 elfcore_psinfo_t psinfo;
252b5132 7674
7ee38065 7675 memcpy (&psinfo, note->descdata, sizeof (psinfo));
252b5132 7676
4a938328 7677 elf_tdata (abfd)->core_program
936e320b
AM
7678 = _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
7679 sizeof (psinfo.pr_fname));
252b5132 7680
4a938328 7681 elf_tdata (abfd)->core_command
936e320b
AM
7682 = _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
7683 sizeof (psinfo.pr_psargs));
4a938328 7684 }
7ee38065 7685#if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
4a938328
MS
7686 else if (note->descsz == sizeof (elfcore_psinfo32_t))
7687 {
7688 /* 64-bit host, 32-bit corefile */
7689 elfcore_psinfo32_t psinfo;
7690
7ee38065 7691 memcpy (&psinfo, note->descdata, sizeof (psinfo));
252b5132 7692
4a938328 7693 elf_tdata (abfd)->core_program
936e320b
AM
7694 = _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
7695 sizeof (psinfo.pr_fname));
4a938328
MS
7696
7697 elf_tdata (abfd)->core_command
936e320b
AM
7698 = _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
7699 sizeof (psinfo.pr_psargs));
4a938328
MS
7700 }
7701#endif
7702
7703 else
7704 {
7705 /* Fail - we don't know how to handle any other
7706 note size (ie. data object type). */
b34976b6 7707 return TRUE;
4a938328 7708 }
252b5132
RH
7709
7710 /* Note that for some reason, a spurious space is tacked
7711 onto the end of the args in some (at least one anyway)
c044fabd 7712 implementations, so strip it off if it exists. */
252b5132
RH
7713
7714 {
c044fabd 7715 char *command = elf_tdata (abfd)->core_command;
252b5132
RH
7716 int n = strlen (command);
7717
7718 if (0 < n && command[n - 1] == ' ')
7719 command[n - 1] = '\0';
7720 }
7721
b34976b6 7722 return TRUE;
252b5132
RH
7723}
7724#endif /* defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T) */
7725
252b5132 7726#if defined (HAVE_PSTATUS_T)
b34976b6 7727static bfd_boolean
217aa764 7728elfcore_grok_pstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132 7729{
f572a39d
AM
7730 if (note->descsz == sizeof (pstatus_t)
7731#if defined (HAVE_PXSTATUS_T)
7732 || note->descsz == sizeof (pxstatus_t)
7733#endif
7734 )
4a938328
MS
7735 {
7736 pstatus_t pstat;
252b5132 7737
4a938328 7738 memcpy (&pstat, note->descdata, sizeof (pstat));
252b5132 7739
4a938328
MS
7740 elf_tdata (abfd)->core_pid = pstat.pr_pid;
7741 }
7ee38065 7742#if defined (HAVE_PSTATUS32_T)
4a938328
MS
7743 else if (note->descsz == sizeof (pstatus32_t))
7744 {
7745 /* 64-bit host, 32-bit corefile */
7746 pstatus32_t pstat;
252b5132 7747
4a938328 7748 memcpy (&pstat, note->descdata, sizeof (pstat));
252b5132 7749
4a938328
MS
7750 elf_tdata (abfd)->core_pid = pstat.pr_pid;
7751 }
7752#endif
252b5132
RH
7753 /* Could grab some more details from the "representative"
7754 lwpstatus_t in pstat.pr_lwp, but we'll catch it all in an
c044fabd 7755 NT_LWPSTATUS note, presumably. */
252b5132 7756
b34976b6 7757 return TRUE;
252b5132
RH
7758}
7759#endif /* defined (HAVE_PSTATUS_T) */
7760
252b5132 7761#if defined (HAVE_LWPSTATUS_T)
b34976b6 7762static bfd_boolean
217aa764 7763elfcore_grok_lwpstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132
RH
7764{
7765 lwpstatus_t lwpstat;
7766 char buf[100];
c044fabd 7767 char *name;
d4c88bbb 7768 size_t len;
c044fabd 7769 asection *sect;
252b5132 7770
f572a39d
AM
7771 if (note->descsz != sizeof (lwpstat)
7772#if defined (HAVE_LWPXSTATUS_T)
7773 && note->descsz != sizeof (lwpxstatus_t)
7774#endif
7775 )
b34976b6 7776 return TRUE;
252b5132
RH
7777
7778 memcpy (&lwpstat, note->descdata, sizeof (lwpstat));
7779
7780 elf_tdata (abfd)->core_lwpid = lwpstat.pr_lwpid;
7781 elf_tdata (abfd)->core_signal = lwpstat.pr_cursig;
7782
c044fabd 7783 /* Make a ".reg/999" section. */
252b5132
RH
7784
7785 sprintf (buf, ".reg/%d", elfcore_make_pid (abfd));
d4c88bbb 7786 len = strlen (buf) + 1;
217aa764 7787 name = bfd_alloc (abfd, len);
252b5132 7788 if (name == NULL)
b34976b6 7789 return FALSE;
d4c88bbb 7790 memcpy (name, buf, len);
252b5132 7791
117ed4f8 7792 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
252b5132 7793 if (sect == NULL)
b34976b6 7794 return FALSE;
252b5132
RH
7795
7796#if defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
eea6121a 7797 sect->size = sizeof (lwpstat.pr_context.uc_mcontext.gregs);
252b5132
RH
7798 sect->filepos = note->descpos
7799 + offsetof (lwpstatus_t, pr_context.uc_mcontext.gregs);
7800#endif
7801
7802#if defined (HAVE_LWPSTATUS_T_PR_REG)
eea6121a 7803 sect->size = sizeof (lwpstat.pr_reg);
252b5132
RH
7804 sect->filepos = note->descpos + offsetof (lwpstatus_t, pr_reg);
7805#endif
7806
252b5132
RH
7807 sect->alignment_power = 2;
7808
7809 if (!elfcore_maybe_make_sect (abfd, ".reg", sect))
b34976b6 7810 return FALSE;
252b5132
RH
7811
7812 /* Make a ".reg2/999" section */
7813
7814 sprintf (buf, ".reg2/%d", elfcore_make_pid (abfd));
d4c88bbb 7815 len = strlen (buf) + 1;
217aa764 7816 name = bfd_alloc (abfd, len);
252b5132 7817 if (name == NULL)
b34976b6 7818 return FALSE;
d4c88bbb 7819 memcpy (name, buf, len);
252b5132 7820
117ed4f8 7821 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
252b5132 7822 if (sect == NULL)
b34976b6 7823 return FALSE;
252b5132
RH
7824
7825#if defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
eea6121a 7826 sect->size = sizeof (lwpstat.pr_context.uc_mcontext.fpregs);
252b5132
RH
7827 sect->filepos = note->descpos
7828 + offsetof (lwpstatus_t, pr_context.uc_mcontext.fpregs);
7829#endif
7830
7831#if defined (HAVE_LWPSTATUS_T_PR_FPREG)
eea6121a 7832 sect->size = sizeof (lwpstat.pr_fpreg);
252b5132
RH
7833 sect->filepos = note->descpos + offsetof (lwpstatus_t, pr_fpreg);
7834#endif
7835
252b5132
RH
7836 sect->alignment_power = 2;
7837
936e320b 7838 return elfcore_maybe_make_sect (abfd, ".reg2", sect);
252b5132
RH
7839}
7840#endif /* defined (HAVE_LWPSTATUS_T) */
7841
16e9c715 7842#if defined (HAVE_WIN32_PSTATUS_T)
b34976b6 7843static bfd_boolean
217aa764 7844elfcore_grok_win32pstatus (bfd *abfd, Elf_Internal_Note *note)
16e9c715
NC
7845{
7846 char buf[30];
c044fabd 7847 char *name;
d4c88bbb 7848 size_t len;
c044fabd 7849 asection *sect;
16e9c715
NC
7850 win32_pstatus_t pstatus;
7851
7852 if (note->descsz < sizeof (pstatus))
b34976b6 7853 return TRUE;
16e9c715 7854
e8eab623 7855 memcpy (&pstatus, note->descdata, sizeof (pstatus));
c044fabd
KH
7856
7857 switch (pstatus.data_type)
16e9c715
NC
7858 {
7859 case NOTE_INFO_PROCESS:
7860 /* FIXME: need to add ->core_command. */
7861 elf_tdata (abfd)->core_signal = pstatus.data.process_info.signal;
7862 elf_tdata (abfd)->core_pid = pstatus.data.process_info.pid;
c044fabd 7863 break;
16e9c715
NC
7864
7865 case NOTE_INFO_THREAD:
7866 /* Make a ".reg/999" section. */
1f170678 7867 sprintf (buf, ".reg/%ld", (long) pstatus.data.thread_info.tid);
c044fabd 7868
d4c88bbb 7869 len = strlen (buf) + 1;
217aa764 7870 name = bfd_alloc (abfd, len);
16e9c715 7871 if (name == NULL)
b34976b6 7872 return FALSE;
c044fabd 7873
d4c88bbb 7874 memcpy (name, buf, len);
16e9c715 7875
117ed4f8 7876 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
16e9c715 7877 if (sect == NULL)
b34976b6 7878 return FALSE;
c044fabd 7879
eea6121a 7880 sect->size = sizeof (pstatus.data.thread_info.thread_context);
079e9a2f
AM
7881 sect->filepos = (note->descpos
7882 + offsetof (struct win32_pstatus,
7883 data.thread_info.thread_context));
16e9c715
NC
7884 sect->alignment_power = 2;
7885
7886 if (pstatus.data.thread_info.is_active_thread)
7887 if (! elfcore_maybe_make_sect (abfd, ".reg", sect))
b34976b6 7888 return FALSE;
16e9c715
NC
7889 break;
7890
7891 case NOTE_INFO_MODULE:
7892 /* Make a ".module/xxxxxxxx" section. */
1f170678
AM
7893 sprintf (buf, ".module/%08lx",
7894 (long) pstatus.data.module_info.base_address);
c044fabd 7895
d4c88bbb 7896 len = strlen (buf) + 1;
217aa764 7897 name = bfd_alloc (abfd, len);
16e9c715 7898 if (name == NULL)
b34976b6 7899 return FALSE;
c044fabd 7900
d4c88bbb 7901 memcpy (name, buf, len);
252b5132 7902
117ed4f8 7903 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
c044fabd 7904
16e9c715 7905 if (sect == NULL)
b34976b6 7906 return FALSE;
c044fabd 7907
eea6121a 7908 sect->size = note->descsz;
16e9c715 7909 sect->filepos = note->descpos;
16e9c715
NC
7910 sect->alignment_power = 2;
7911 break;
7912
7913 default:
b34976b6 7914 return TRUE;
16e9c715
NC
7915 }
7916
b34976b6 7917 return TRUE;
16e9c715
NC
7918}
7919#endif /* HAVE_WIN32_PSTATUS_T */
252b5132 7920
b34976b6 7921static bfd_boolean
217aa764 7922elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
252b5132 7923{
9c5bfbb7 7924 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
bb0082d6 7925
252b5132
RH
7926 switch (note->type)
7927 {
7928 default:
b34976b6 7929 return TRUE;
252b5132 7930
252b5132 7931 case NT_PRSTATUS:
bb0082d6
AM
7932 if (bed->elf_backend_grok_prstatus)
7933 if ((*bed->elf_backend_grok_prstatus) (abfd, note))
b34976b6 7934 return TRUE;
bb0082d6 7935#if defined (HAVE_PRSTATUS_T)
252b5132 7936 return elfcore_grok_prstatus (abfd, note);
bb0082d6 7937#else
b34976b6 7938 return TRUE;
252b5132
RH
7939#endif
7940
7941#if defined (HAVE_PSTATUS_T)
7942 case NT_PSTATUS:
7943 return elfcore_grok_pstatus (abfd, note);
7944#endif
7945
7946#if defined (HAVE_LWPSTATUS_T)
7947 case NT_LWPSTATUS:
7948 return elfcore_grok_lwpstatus (abfd, note);
7949#endif
7950
7951 case NT_FPREGSET: /* FIXME: rename to NT_PRFPREG */
7952 return elfcore_grok_prfpreg (abfd, note);
7953
16e9c715 7954#if defined (HAVE_WIN32_PSTATUS_T)
c044fabd 7955 case NT_WIN32PSTATUS:
16e9c715
NC
7956 return elfcore_grok_win32pstatus (abfd, note);
7957#endif
7958
c044fabd 7959 case NT_PRXFPREG: /* Linux SSE extension */
e377ab71
MK
7960 if (note->namesz == 6
7961 && strcmp (note->namedata, "LINUX") == 0)
ff08c6bb
JB
7962 return elfcore_grok_prxfpreg (abfd, note);
7963 else
b34976b6 7964 return TRUE;
ff08c6bb 7965
252b5132
RH
7966 case NT_PRPSINFO:
7967 case NT_PSINFO:
bb0082d6
AM
7968 if (bed->elf_backend_grok_psinfo)
7969 if ((*bed->elf_backend_grok_psinfo) (abfd, note))
b34976b6 7970 return TRUE;
bb0082d6 7971#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
252b5132 7972 return elfcore_grok_psinfo (abfd, note);
bb0082d6 7973#else
b34976b6 7974 return TRUE;
252b5132 7975#endif
3333a7c3
RM
7976
7977 case NT_AUXV:
7978 {
117ed4f8
AM
7979 asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
7980 SEC_HAS_CONTENTS);
3333a7c3
RM
7981
7982 if (sect == NULL)
7983 return FALSE;
eea6121a 7984 sect->size = note->descsz;
3333a7c3 7985 sect->filepos = note->descpos;
3333a7c3
RM
7986 sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
7987
7988 return TRUE;
7989 }
252b5132
RH
7990 }
7991}
7992
b34976b6 7993static bfd_boolean
217aa764 7994elfcore_netbsd_get_lwpid (Elf_Internal_Note *note, int *lwpidp)
50b2bdb7
AM
7995{
7996 char *cp;
7997
7998 cp = strchr (note->namedata, '@');
7999 if (cp != NULL)
8000 {
d2b64500 8001 *lwpidp = atoi(cp + 1);
b34976b6 8002 return TRUE;
50b2bdb7 8003 }
b34976b6 8004 return FALSE;
50b2bdb7
AM
8005}
8006
b34976b6 8007static bfd_boolean
217aa764 8008elfcore_grok_netbsd_procinfo (bfd *abfd, Elf_Internal_Note *note)
50b2bdb7
AM
8009{
8010
8011 /* Signal number at offset 0x08. */
8012 elf_tdata (abfd)->core_signal
8013 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x08);
8014
8015 /* Process ID at offset 0x50. */
8016 elf_tdata (abfd)->core_pid
8017 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x50);
8018
8019 /* Command name at 0x7c (max 32 bytes, including nul). */
8020 elf_tdata (abfd)->core_command
8021 = _bfd_elfcore_strndup (abfd, note->descdata + 0x7c, 31);
8022
7720ba9f
MK
8023 return elfcore_make_note_pseudosection (abfd, ".note.netbsdcore.procinfo",
8024 note);
50b2bdb7
AM
8025}
8026
b34976b6 8027static bfd_boolean
217aa764 8028elfcore_grok_netbsd_note (bfd *abfd, Elf_Internal_Note *note)
50b2bdb7
AM
8029{
8030 int lwp;
8031
8032 if (elfcore_netbsd_get_lwpid (note, &lwp))
8033 elf_tdata (abfd)->core_lwpid = lwp;
8034
b4db1224 8035 if (note->type == NT_NETBSDCORE_PROCINFO)
50b2bdb7
AM
8036 {
8037 /* NetBSD-specific core "procinfo". Note that we expect to
8038 find this note before any of the others, which is fine,
8039 since the kernel writes this note out first when it
8040 creates a core file. */
47d9a591 8041
50b2bdb7
AM
8042 return elfcore_grok_netbsd_procinfo (abfd, note);
8043 }
8044
b4db1224
JT
8045 /* As of Jan 2002 there are no other machine-independent notes
8046 defined for NetBSD core files. If the note type is less
8047 than the start of the machine-dependent note types, we don't
8048 understand it. */
47d9a591 8049
b4db1224 8050 if (note->type < NT_NETBSDCORE_FIRSTMACH)
b34976b6 8051 return TRUE;
50b2bdb7
AM
8052
8053
8054 switch (bfd_get_arch (abfd))
8055 {
8056 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0 and
8057 PT_GETFPREGS == mach+2. */
8058
8059 case bfd_arch_alpha:
8060 case bfd_arch_sparc:
8061 switch (note->type)
8062 {
b4db1224 8063 case NT_NETBSDCORE_FIRSTMACH+0:
50b2bdb7
AM
8064 return elfcore_make_note_pseudosection (abfd, ".reg", note);
8065
b4db1224 8066 case NT_NETBSDCORE_FIRSTMACH+2:
50b2bdb7
AM
8067 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
8068
8069 default:
b34976b6 8070 return TRUE;
50b2bdb7
AM
8071 }
8072
8073 /* On all other arch's, PT_GETREGS == mach+1 and
8074 PT_GETFPREGS == mach+3. */
8075
8076 default:
8077 switch (note->type)
8078 {
b4db1224 8079 case NT_NETBSDCORE_FIRSTMACH+1:
50b2bdb7
AM
8080 return elfcore_make_note_pseudosection (abfd, ".reg", note);
8081
b4db1224 8082 case NT_NETBSDCORE_FIRSTMACH+3:
50b2bdb7
AM
8083 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
8084
8085 default:
b34976b6 8086 return TRUE;
50b2bdb7
AM
8087 }
8088 }
8089 /* NOTREACHED */
8090}
8091
07c6e936 8092static bfd_boolean
d3fd4074 8093elfcore_grok_nto_status (bfd *abfd, Elf_Internal_Note *note, long *tid)
07c6e936
NC
8094{
8095 void *ddata = note->descdata;
8096 char buf[100];
8097 char *name;
8098 asection *sect;
f8843e87
AM
8099 short sig;
8100 unsigned flags;
07c6e936
NC
8101
8102 /* nto_procfs_status 'pid' field is at offset 0. */
8103 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, (bfd_byte *) ddata);
8104
f8843e87
AM
8105 /* nto_procfs_status 'tid' field is at offset 4. Pass it back. */
8106 *tid = bfd_get_32 (abfd, (bfd_byte *) ddata + 4);
8107
8108 /* nto_procfs_status 'flags' field is at offset 8. */
8109 flags = bfd_get_32 (abfd, (bfd_byte *) ddata + 8);
07c6e936
NC
8110
8111 /* nto_procfs_status 'what' field is at offset 14. */
f8843e87
AM
8112 if ((sig = bfd_get_16 (abfd, (bfd_byte *) ddata + 14)) > 0)
8113 {
8114 elf_tdata (abfd)->core_signal = sig;
8115 elf_tdata (abfd)->core_lwpid = *tid;
8116 }
07c6e936 8117
f8843e87
AM
8118 /* _DEBUG_FLAG_CURTID (current thread) is 0x80. Some cores
8119 do not come from signals so we make sure we set the current
8120 thread just in case. */
8121 if (flags & 0x00000080)
8122 elf_tdata (abfd)->core_lwpid = *tid;
07c6e936
NC
8123
8124 /* Make a ".qnx_core_status/%d" section. */
d3fd4074 8125 sprintf (buf, ".qnx_core_status/%ld", *tid);
07c6e936 8126
217aa764 8127 name = bfd_alloc (abfd, strlen (buf) + 1);
07c6e936
NC
8128 if (name == NULL)
8129 return FALSE;
8130 strcpy (name, buf);
8131
117ed4f8 8132 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
07c6e936
NC
8133 if (sect == NULL)
8134 return FALSE;
8135
eea6121a 8136 sect->size = note->descsz;
07c6e936 8137 sect->filepos = note->descpos;
07c6e936
NC
8138 sect->alignment_power = 2;
8139
8140 return (elfcore_maybe_make_sect (abfd, ".qnx_core_status", sect));
8141}
8142
8143static bfd_boolean
d69f560c
KW
8144elfcore_grok_nto_regs (bfd *abfd,
8145 Elf_Internal_Note *note,
d3fd4074 8146 long tid,
d69f560c 8147 char *base)
07c6e936
NC
8148{
8149 char buf[100];
8150 char *name;
8151 asection *sect;
8152
d69f560c 8153 /* Make a "(base)/%d" section. */
d3fd4074 8154 sprintf (buf, "%s/%ld", base, tid);
07c6e936 8155
217aa764 8156 name = bfd_alloc (abfd, strlen (buf) + 1);
07c6e936
NC
8157 if (name == NULL)
8158 return FALSE;
8159 strcpy (name, buf);
8160
117ed4f8 8161 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
07c6e936
NC
8162 if (sect == NULL)
8163 return FALSE;
8164
eea6121a 8165 sect->size = note->descsz;
07c6e936 8166 sect->filepos = note->descpos;
07c6e936
NC
8167 sect->alignment_power = 2;
8168
f8843e87
AM
8169 /* This is the current thread. */
8170 if (elf_tdata (abfd)->core_lwpid == tid)
d69f560c 8171 return elfcore_maybe_make_sect (abfd, base, sect);
f8843e87
AM
8172
8173 return TRUE;
07c6e936
NC
8174}
8175
8176#define BFD_QNT_CORE_INFO 7
8177#define BFD_QNT_CORE_STATUS 8
8178#define BFD_QNT_CORE_GREG 9
8179#define BFD_QNT_CORE_FPREG 10
8180
8181static bfd_boolean
217aa764 8182elfcore_grok_nto_note (bfd *abfd, Elf_Internal_Note *note)
07c6e936
NC
8183{
8184 /* Every GREG section has a STATUS section before it. Store the
811072d8 8185 tid from the previous call to pass down to the next gregs
07c6e936 8186 function. */
d3fd4074 8187 static long tid = 1;
07c6e936
NC
8188
8189 switch (note->type)
8190 {
d69f560c
KW
8191 case BFD_QNT_CORE_INFO:
8192 return elfcore_make_note_pseudosection (abfd, ".qnx_core_info", note);
8193 case BFD_QNT_CORE_STATUS:
8194 return elfcore_grok_nto_status (abfd, note, &tid);
8195 case BFD_QNT_CORE_GREG:
8196 return elfcore_grok_nto_regs (abfd, note, tid, ".reg");
8197 case BFD_QNT_CORE_FPREG:
8198 return elfcore_grok_nto_regs (abfd, note, tid, ".reg2");
8199 default:
8200 return TRUE;
07c6e936
NC
8201 }
8202}
8203
7c76fa91
MS
8204/* Function: elfcore_write_note
8205
47d9a591 8206 Inputs:
a39f3346 8207 buffer to hold note, and current size of buffer
7c76fa91
MS
8208 name of note
8209 type of note
8210 data for note
8211 size of data for note
8212
a39f3346
AM
8213 Writes note to end of buffer. ELF64 notes are written exactly as
8214 for ELF32, despite the current (as of 2006) ELF gabi specifying
8215 that they ought to have 8-byte namesz and descsz field, and have
8216 8-byte alignment. Other writers, eg. Linux kernel, do the same.
8217
7c76fa91 8218 Return:
a39f3346 8219 Pointer to realloc'd buffer, *BUFSIZ updated. */
7c76fa91
MS
8220
8221char *
a39f3346 8222elfcore_write_note (bfd *abfd,
217aa764 8223 char *buf,
a39f3346 8224 int *bufsiz,
217aa764 8225 const char *name,
a39f3346 8226 int type,
217aa764 8227 const void *input,
a39f3346 8228 int size)
7c76fa91
MS
8229{
8230 Elf_External_Note *xnp;
d4c88bbb 8231 size_t namesz;
d4c88bbb 8232 size_t newspace;
a39f3346 8233 char *dest;
7c76fa91 8234
d4c88bbb 8235 namesz = 0;
d4c88bbb 8236 if (name != NULL)
a39f3346 8237 namesz = strlen (name) + 1;
d4c88bbb 8238
a39f3346 8239 newspace = 12 + ((namesz + 3) & -4) + ((size + 3) & -4);
d4c88bbb 8240
a39f3346
AM
8241 buf = realloc (buf, *bufsiz + newspace);
8242 dest = buf + *bufsiz;
7c76fa91
MS
8243 *bufsiz += newspace;
8244 xnp = (Elf_External_Note *) dest;
8245 H_PUT_32 (abfd, namesz, xnp->namesz);
8246 H_PUT_32 (abfd, size, xnp->descsz);
8247 H_PUT_32 (abfd, type, xnp->type);
d4c88bbb
AM
8248 dest = xnp->name;
8249 if (name != NULL)
8250 {
8251 memcpy (dest, name, namesz);
8252 dest += namesz;
a39f3346 8253 while (namesz & 3)
d4c88bbb
AM
8254 {
8255 *dest++ = '\0';
a39f3346 8256 ++namesz;
d4c88bbb
AM
8257 }
8258 }
8259 memcpy (dest, input, size);
a39f3346
AM
8260 dest += size;
8261 while (size & 3)
8262 {
8263 *dest++ = '\0';
8264 ++size;
8265 }
8266 return buf;
7c76fa91
MS
8267}
8268
8269#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
8270char *
217aa764
AM
8271elfcore_write_prpsinfo (bfd *abfd,
8272 char *buf,
8273 int *bufsiz,
8274 const char *fname,
8275 const char *psargs)
7c76fa91 8276{
183e98be
AM
8277 const char *note_name = "CORE";
8278 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
8279
8280 if (bed->elf_backend_write_core_note != NULL)
8281 {
8282 char *ret;
8283 ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
8284 NT_PRPSINFO, fname, psargs);
8285 if (ret != NULL)
8286 return ret;
8287 }
7c76fa91 8288
183e98be
AM
8289#if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
8290 if (bed->s->elfclass == ELFCLASS32)
8291 {
8292#if defined (HAVE_PSINFO32_T)
8293 psinfo32_t data;
8294 int note_type = NT_PSINFO;
8295#else
8296 prpsinfo32_t data;
8297 int note_type = NT_PRPSINFO;
8298#endif
8299
8300 memset (&data, 0, sizeof (data));
8301 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
8302 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
8303 return elfcore_write_note (abfd, buf, bufsiz,
8304 note_name, note_type, &data, sizeof (data));
8305 }
8306 else
8307#endif
8308 {
7c76fa91 8309#if defined (HAVE_PSINFO_T)
183e98be
AM
8310 psinfo_t data;
8311 int note_type = NT_PSINFO;
7c76fa91 8312#else
183e98be
AM
8313 prpsinfo_t data;
8314 int note_type = NT_PRPSINFO;
7c76fa91
MS
8315#endif
8316
183e98be
AM
8317 memset (&data, 0, sizeof (data));
8318 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
8319 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
8320 return elfcore_write_note (abfd, buf, bufsiz,
8321 note_name, note_type, &data, sizeof (data));
8322 }
7c76fa91
MS
8323}
8324#endif /* PSINFO_T or PRPSINFO_T */
8325
8326#if defined (HAVE_PRSTATUS_T)
8327char *
217aa764
AM
8328elfcore_write_prstatus (bfd *abfd,
8329 char *buf,
8330 int *bufsiz,
8331 long pid,
8332 int cursig,
8333 const void *gregs)
7c76fa91 8334{
183e98be
AM
8335 const char *note_name = "CORE";
8336 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7c76fa91 8337
183e98be
AM
8338 if (bed->elf_backend_write_core_note != NULL)
8339 {
8340 char *ret;
8341 ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
8342 NT_PRSTATUS,
8343 pid, cursig, gregs);
8344 if (ret != NULL)
8345 return ret;
8346 }
8347
8348#if defined (HAVE_PRSTATUS32_T)
8349 if (bed->s->elfclass == ELFCLASS32)
8350 {
8351 prstatus32_t prstat;
8352
8353 memset (&prstat, 0, sizeof (prstat));
8354 prstat.pr_pid = pid;
8355 prstat.pr_cursig = cursig;
8356 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
8357 return elfcore_write_note (abfd, buf, bufsiz, note_name,
8358 NT_PRSTATUS, &prstat, sizeof (prstat));
8359 }
8360 else
8361#endif
8362 {
8363 prstatus_t prstat;
8364
8365 memset (&prstat, 0, sizeof (prstat));
8366 prstat.pr_pid = pid;
8367 prstat.pr_cursig = cursig;
8368 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
8369 return elfcore_write_note (abfd, buf, bufsiz, note_name,
8370 NT_PRSTATUS, &prstat, sizeof (prstat));
8371 }
7c76fa91
MS
8372}
8373#endif /* HAVE_PRSTATUS_T */
8374
51316059
MS
8375#if defined (HAVE_LWPSTATUS_T)
8376char *
217aa764
AM
8377elfcore_write_lwpstatus (bfd *abfd,
8378 char *buf,
8379 int *bufsiz,
8380 long pid,
8381 int cursig,
8382 const void *gregs)
51316059
MS
8383{
8384 lwpstatus_t lwpstat;
183e98be 8385 const char *note_name = "CORE";
51316059
MS
8386
8387 memset (&lwpstat, 0, sizeof (lwpstat));
8388 lwpstat.pr_lwpid = pid >> 16;
8389 lwpstat.pr_cursig = cursig;
8390#if defined (HAVE_LWPSTATUS_T_PR_REG)
8391 memcpy (lwpstat.pr_reg, gregs, sizeof (lwpstat.pr_reg));
8392#elif defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
8393#if !defined(gregs)
8394 memcpy (lwpstat.pr_context.uc_mcontext.gregs,
8395 gregs, sizeof (lwpstat.pr_context.uc_mcontext.gregs));
8396#else
8397 memcpy (lwpstat.pr_context.uc_mcontext.__gregs,
8398 gregs, sizeof (lwpstat.pr_context.uc_mcontext.__gregs));
8399#endif
8400#endif
47d9a591 8401 return elfcore_write_note (abfd, buf, bufsiz, note_name,
51316059
MS
8402 NT_LWPSTATUS, &lwpstat, sizeof (lwpstat));
8403}
8404#endif /* HAVE_LWPSTATUS_T */
8405
7c76fa91
MS
8406#if defined (HAVE_PSTATUS_T)
8407char *
217aa764
AM
8408elfcore_write_pstatus (bfd *abfd,
8409 char *buf,
8410 int *bufsiz,
8411 long pid,
6c10990d
NC
8412 int cursig ATTRIBUTE_UNUSED,
8413 const void *gregs ATTRIBUTE_UNUSED)
7c76fa91 8414{
183e98be
AM
8415 const char *note_name = "CORE";
8416#if defined (HAVE_PSTATUS32_T)
8417 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7c76fa91 8418
183e98be
AM
8419 if (bed->s->elfclass == ELFCLASS32)
8420 {
8421 pstatus32_t pstat;
8422
8423 memset (&pstat, 0, sizeof (pstat));
8424 pstat.pr_pid = pid & 0xffff;
8425 buf = elfcore_write_note (abfd, buf, bufsiz, note_name,
8426 NT_PSTATUS, &pstat, sizeof (pstat));
8427 return buf;
8428 }
8429 else
8430#endif
8431 {
8432 pstatus_t pstat;
8433
8434 memset (&pstat, 0, sizeof (pstat));
8435 pstat.pr_pid = pid & 0xffff;
8436 buf = elfcore_write_note (abfd, buf, bufsiz, note_name,
8437 NT_PSTATUS, &pstat, sizeof (pstat));
8438 return buf;
8439 }
7c76fa91
MS
8440}
8441#endif /* HAVE_PSTATUS_T */
8442
8443char *
217aa764
AM
8444elfcore_write_prfpreg (bfd *abfd,
8445 char *buf,
8446 int *bufsiz,
8447 const void *fpregs,
8448 int size)
7c76fa91 8449{
183e98be 8450 const char *note_name = "CORE";
47d9a591 8451 return elfcore_write_note (abfd, buf, bufsiz,
7c76fa91
MS
8452 note_name, NT_FPREGSET, fpregs, size);
8453}
8454
8455char *
217aa764
AM
8456elfcore_write_prxfpreg (bfd *abfd,
8457 char *buf,
8458 int *bufsiz,
8459 const void *xfpregs,
8460 int size)
7c76fa91
MS
8461{
8462 char *note_name = "LINUX";
47d9a591 8463 return elfcore_write_note (abfd, buf, bufsiz,
7c76fa91
MS
8464 note_name, NT_PRXFPREG, xfpregs, size);
8465}
8466
b34976b6 8467static bfd_boolean
217aa764 8468elfcore_read_notes (bfd *abfd, file_ptr offset, bfd_size_type size)
252b5132 8469{
c044fabd
KH
8470 char *buf;
8471 char *p;
252b5132
RH
8472
8473 if (size <= 0)
b34976b6 8474 return TRUE;
252b5132 8475
dc810e39 8476 if (bfd_seek (abfd, offset, SEEK_SET) != 0)
b34976b6 8477 return FALSE;
252b5132 8478
dc810e39 8479 buf = bfd_malloc (size);
252b5132 8480 if (buf == NULL)
b34976b6 8481 return FALSE;
252b5132 8482
dc810e39 8483 if (bfd_bread (buf, size, abfd) != size)
252b5132
RH
8484 {
8485 error:
8486 free (buf);
b34976b6 8487 return FALSE;
252b5132
RH
8488 }
8489
8490 p = buf;
8491 while (p < buf + size)
8492 {
c044fabd
KH
8493 /* FIXME: bad alignment assumption. */
8494 Elf_External_Note *xnp = (Elf_External_Note *) p;
252b5132
RH
8495 Elf_Internal_Note in;
8496
dc810e39 8497 in.type = H_GET_32 (abfd, xnp->type);
252b5132 8498
dc810e39 8499 in.namesz = H_GET_32 (abfd, xnp->namesz);
252b5132
RH
8500 in.namedata = xnp->name;
8501
dc810e39 8502 in.descsz = H_GET_32 (abfd, xnp->descsz);
252b5132
RH
8503 in.descdata = in.namedata + BFD_ALIGN (in.namesz, 4);
8504 in.descpos = offset + (in.descdata - buf);
8505
0112cd26 8506 if (CONST_STRNEQ (in.namedata, "NetBSD-CORE"))
50b2bdb7
AM
8507 {
8508 if (! elfcore_grok_netbsd_note (abfd, &in))
8509 goto error;
8510 }
0112cd26 8511 else if (CONST_STRNEQ (in.namedata, "QNX"))
07c6e936
NC
8512 {
8513 if (! elfcore_grok_nto_note (abfd, &in))
8514 goto error;
8515 }
50b2bdb7
AM
8516 else
8517 {
8518 if (! elfcore_grok_note (abfd, &in))
8519 goto error;
8520 }
252b5132
RH
8521
8522 p = in.descdata + BFD_ALIGN (in.descsz, 4);
8523 }
8524
8525 free (buf);
b34976b6 8526 return TRUE;
252b5132 8527}
98d8431c
JB
8528\f
8529/* Providing external access to the ELF program header table. */
8530
8531/* Return an upper bound on the number of bytes required to store a
8532 copy of ABFD's program header table entries. Return -1 if an error
8533 occurs; bfd_get_error will return an appropriate code. */
c044fabd 8534
98d8431c 8535long
217aa764 8536bfd_get_elf_phdr_upper_bound (bfd *abfd)
98d8431c
JB
8537{
8538 if (abfd->xvec->flavour != bfd_target_elf_flavour)
8539 {
8540 bfd_set_error (bfd_error_wrong_format);
8541 return -1;
8542 }
8543
936e320b 8544 return elf_elfheader (abfd)->e_phnum * sizeof (Elf_Internal_Phdr);
98d8431c
JB
8545}
8546
98d8431c
JB
8547/* Copy ABFD's program header table entries to *PHDRS. The entries
8548 will be stored as an array of Elf_Internal_Phdr structures, as
8549 defined in include/elf/internal.h. To find out how large the
8550 buffer needs to be, call bfd_get_elf_phdr_upper_bound.
8551
8552 Return the number of program header table entries read, or -1 if an
8553 error occurs; bfd_get_error will return an appropriate code. */
c044fabd 8554
98d8431c 8555int
217aa764 8556bfd_get_elf_phdrs (bfd *abfd, void *phdrs)
98d8431c
JB
8557{
8558 int num_phdrs;
8559
8560 if (abfd->xvec->flavour != bfd_target_elf_flavour)
8561 {
8562 bfd_set_error (bfd_error_wrong_format);
8563 return -1;
8564 }
8565
8566 num_phdrs = elf_elfheader (abfd)->e_phnum;
c044fabd 8567 memcpy (phdrs, elf_tdata (abfd)->phdr,
98d8431c
JB
8568 num_phdrs * sizeof (Elf_Internal_Phdr));
8569
8570 return num_phdrs;
8571}
ae4221d7
L
8572
8573void
217aa764 8574_bfd_elf_sprintf_vma (bfd *abfd ATTRIBUTE_UNUSED, char *buf, bfd_vma value)
ae4221d7 8575{
d3b05f8d 8576#ifdef BFD64
ae4221d7
L
8577 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
8578
8579 i_ehdrp = elf_elfheader (abfd);
8580 if (i_ehdrp == NULL)
8581 sprintf_vma (buf, value);
8582 else
8583 {
8584 if (i_ehdrp->e_ident[EI_CLASS] == ELFCLASS64)
cc55aec9 8585 {
ae4221d7 8586#if BFD_HOST_64BIT_LONG
cc55aec9 8587 sprintf (buf, "%016lx", value);
ae4221d7 8588#else
cc55aec9
AM
8589 sprintf (buf, "%08lx%08lx", _bfd_int64_high (value),
8590 _bfd_int64_low (value));
ae4221d7 8591#endif
cc55aec9 8592 }
ae4221d7
L
8593 else
8594 sprintf (buf, "%08lx", (unsigned long) (value & 0xffffffff));
8595 }
d3b05f8d
L
8596#else
8597 sprintf_vma (buf, value);
8598#endif
ae4221d7
L
8599}
8600
8601void
217aa764 8602_bfd_elf_fprintf_vma (bfd *abfd ATTRIBUTE_UNUSED, void *stream, bfd_vma value)
ae4221d7 8603{
d3b05f8d 8604#ifdef BFD64
ae4221d7
L
8605 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
8606
8607 i_ehdrp = elf_elfheader (abfd);
8608 if (i_ehdrp == NULL)
8609 fprintf_vma ((FILE *) stream, value);
8610 else
8611 {
8612 if (i_ehdrp->e_ident[EI_CLASS] == ELFCLASS64)
cc55aec9 8613 {
ae4221d7 8614#if BFD_HOST_64BIT_LONG
cc55aec9 8615 fprintf ((FILE *) stream, "%016lx", value);
ae4221d7 8616#else
cc55aec9
AM
8617 fprintf ((FILE *) stream, "%08lx%08lx",
8618 _bfd_int64_high (value), _bfd_int64_low (value));
ae4221d7 8619#endif
cc55aec9 8620 }
ae4221d7
L
8621 else
8622 fprintf ((FILE *) stream, "%08lx",
8623 (unsigned long) (value & 0xffffffff));
8624 }
d3b05f8d
L
8625#else
8626 fprintf_vma ((FILE *) stream, value);
8627#endif
ae4221d7 8628}
db6751f2
JJ
8629
8630enum elf_reloc_type_class
217aa764 8631_bfd_elf_reloc_type_class (const Elf_Internal_Rela *rela ATTRIBUTE_UNUSED)
db6751f2
JJ
8632{
8633 return reloc_class_normal;
8634}
f8df10f4 8635
47d9a591 8636/* For RELA architectures, return the relocation value for a
f8df10f4
JJ
8637 relocation against a local symbol. */
8638
8639bfd_vma
217aa764
AM
8640_bfd_elf_rela_local_sym (bfd *abfd,
8641 Elf_Internal_Sym *sym,
8517fae7 8642 asection **psec,
217aa764 8643 Elf_Internal_Rela *rel)
f8df10f4 8644{
8517fae7 8645 asection *sec = *psec;
f8df10f4
JJ
8646 bfd_vma relocation;
8647
8648 relocation = (sec->output_section->vma
8649 + sec->output_offset
8650 + sym->st_value);
8651 if ((sec->flags & SEC_MERGE)
c629eae0 8652 && ELF_ST_TYPE (sym->st_info) == STT_SECTION
68bfbfcc 8653 && sec->sec_info_type == ELF_INFO_TYPE_MERGE)
f8df10f4 8654 {
f8df10f4 8655 rel->r_addend =
8517fae7 8656 _bfd_merged_section_offset (abfd, psec,
65765700 8657 elf_section_data (sec)->sec_info,
753731ee
AM
8658 sym->st_value + rel->r_addend);
8659 if (sec != *psec)
8660 {
8661 /* If we have changed the section, and our original section is
8662 marked with SEC_EXCLUDE, it means that the original
8663 SEC_MERGE section has been completely subsumed in some
8664 other SEC_MERGE section. In this case, we need to leave
8665 some info around for --emit-relocs. */
8666 if ((sec->flags & SEC_EXCLUDE) != 0)
8667 sec->kept_section = *psec;
8668 sec = *psec;
8669 }
8517fae7
AM
8670 rel->r_addend -= relocation;
8671 rel->r_addend += sec->output_section->vma + sec->output_offset;
f8df10f4
JJ
8672 }
8673 return relocation;
8674}
c629eae0
JJ
8675
8676bfd_vma
217aa764
AM
8677_bfd_elf_rel_local_sym (bfd *abfd,
8678 Elf_Internal_Sym *sym,
8679 asection **psec,
8680 bfd_vma addend)
47d9a591 8681{
c629eae0
JJ
8682 asection *sec = *psec;
8683
68bfbfcc 8684 if (sec->sec_info_type != ELF_INFO_TYPE_MERGE)
c629eae0
JJ
8685 return sym->st_value + addend;
8686
8687 return _bfd_merged_section_offset (abfd, psec,
65765700 8688 elf_section_data (sec)->sec_info,
753731ee 8689 sym->st_value + addend);
c629eae0
JJ
8690}
8691
8692bfd_vma
217aa764 8693_bfd_elf_section_offset (bfd *abfd,
92e4ec35 8694 struct bfd_link_info *info,
217aa764
AM
8695 asection *sec,
8696 bfd_vma offset)
c629eae0 8697{
68bfbfcc 8698 switch (sec->sec_info_type)
65765700
JJ
8699 {
8700 case ELF_INFO_TYPE_STABS:
eea6121a
AM
8701 return _bfd_stab_section_offset (sec, elf_section_data (sec)->sec_info,
8702 offset);
65765700 8703 case ELF_INFO_TYPE_EH_FRAME:
92e4ec35 8704 return _bfd_elf_eh_frame_section_offset (abfd, info, sec, offset);
65765700
JJ
8705 default:
8706 return offset;
8707 }
c629eae0 8708}
3333a7c3
RM
8709\f
8710/* Create a new BFD as if by bfd_openr. Rather than opening a file,
8711 reconstruct an ELF file by reading the segments out of remote memory
8712 based on the ELF file header at EHDR_VMA and the ELF program headers it
8713 points to. If not null, *LOADBASEP is filled in with the difference
8714 between the VMAs from which the segments were read, and the VMAs the
8715 file headers (and hence BFD's idea of each section's VMA) put them at.
8716
8717 The function TARGET_READ_MEMORY is called to copy LEN bytes from the
8718 remote memory at target address VMA into the local buffer at MYADDR; it
8719 should return zero on success or an `errno' code on failure. TEMPL must
8720 be a BFD for an ELF target with the word size and byte order found in
8721 the remote memory. */
8722
8723bfd *
217aa764
AM
8724bfd_elf_bfd_from_remote_memory
8725 (bfd *templ,
8726 bfd_vma ehdr_vma,
8727 bfd_vma *loadbasep,
f075ee0c 8728 int (*target_read_memory) (bfd_vma, bfd_byte *, int))
3333a7c3
RM
8729{
8730 return (*get_elf_backend_data (templ)->elf_backend_bfd_from_remote_memory)
8731 (templ, ehdr_vma, loadbasep, target_read_memory);
8732}
4c45e5c9
JJ
8733\f
8734long
c9727e01
AM
8735_bfd_elf_get_synthetic_symtab (bfd *abfd,
8736 long symcount ATTRIBUTE_UNUSED,
8737 asymbol **syms ATTRIBUTE_UNUSED,
8615f3f2 8738 long dynsymcount,
c9727e01
AM
8739 asymbol **dynsyms,
8740 asymbol **ret)
4c45e5c9
JJ
8741{
8742 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
8743 asection *relplt;
8744 asymbol *s;
8745 const char *relplt_name;
8746 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
8747 arelent *p;
8748 long count, i, n;
8749 size_t size;
8750 Elf_Internal_Shdr *hdr;
8751 char *names;
8752 asection *plt;
8753
8615f3f2
AM
8754 *ret = NULL;
8755
90e3cdf2
JJ
8756 if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
8757 return 0;
8758
8615f3f2
AM
8759 if (dynsymcount <= 0)
8760 return 0;
8761
4c45e5c9
JJ
8762 if (!bed->plt_sym_val)
8763 return 0;
8764
8765 relplt_name = bed->relplt_name;
8766 if (relplt_name == NULL)
8767 relplt_name = bed->default_use_rela_p ? ".rela.plt" : ".rel.plt";
8768 relplt = bfd_get_section_by_name (abfd, relplt_name);
8769 if (relplt == NULL)
8770 return 0;
8771
8772 hdr = &elf_section_data (relplt)->this_hdr;
8773 if (hdr->sh_link != elf_dynsymtab (abfd)
8774 || (hdr->sh_type != SHT_REL && hdr->sh_type != SHT_RELA))
8775 return 0;
8776
8777 plt = bfd_get_section_by_name (abfd, ".plt");
8778 if (plt == NULL)
8779 return 0;
8780
8781 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
c9727e01 8782 if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
4c45e5c9
JJ
8783 return -1;
8784
eea6121a 8785 count = relplt->size / hdr->sh_entsize;
4c45e5c9
JJ
8786 size = count * sizeof (asymbol);
8787 p = relplt->relocation;
8788 for (i = 0; i < count; i++, s++, p++)
8789 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
8790
8791 s = *ret = bfd_malloc (size);
8792 if (s == NULL)
8793 return -1;
8794
8795 names = (char *) (s + count);
8796 p = relplt->relocation;
8797 n = 0;
8798 for (i = 0; i < count; i++, s++, p++)
8799 {
8800 size_t len;
8801 bfd_vma addr;
8802
8803 addr = bed->plt_sym_val (i, plt, p);
8804 if (addr == (bfd_vma) -1)
8805 continue;
8806
8807 *s = **p->sym_ptr_ptr;
65a7a66f
AM
8808 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
8809 we are defining a symbol, ensure one of them is set. */
8810 if ((s->flags & BSF_LOCAL) == 0)
8811 s->flags |= BSF_GLOBAL;
4c45e5c9
JJ
8812 s->section = plt;
8813 s->value = addr - plt->vma;
8814 s->name = names;
8815 len = strlen ((*p->sym_ptr_ptr)->name);
8816 memcpy (names, (*p->sym_ptr_ptr)->name, len);
8817 names += len;
8818 memcpy (names, "@plt", sizeof ("@plt"));
8819 names += sizeof ("@plt");
8820 ++n;
8821 }
8822
8823 return n;
8824}
3d7f7666 8825
c15f73f9 8826struct elf_symbuf_symbol
3d7f7666 8827{
c15f73f9
JJ
8828 unsigned long st_name; /* Symbol name, index in string tbl */
8829 unsigned char st_info; /* Type and binding attributes */
8830 unsigned char st_other; /* Visibilty, and target specific */
8831};
3d7f7666 8832
c15f73f9
JJ
8833struct elf_symbuf_head
8834{
8835 struct elf_symbuf_symbol *ssym;
8836 bfd_size_type count;
8837 unsigned int st_shndx;
8838};
3d7f7666
L
8839
8840struct elf_symbol
8841{
c15f73f9
JJ
8842 union
8843 {
8844 Elf_Internal_Sym *isym;
8845 struct elf_symbuf_symbol *ssym;
8846 } u;
3d7f7666
L
8847 const char *name;
8848};
8849
c15f73f9
JJ
8850/* Sort references to symbols by ascending section number. */
8851
8852static int
8853elf_sort_elf_symbol (const void *arg1, const void *arg2)
8854{
8855 const Elf_Internal_Sym *s1 = *(const Elf_Internal_Sym **) arg1;
8856 const Elf_Internal_Sym *s2 = *(const Elf_Internal_Sym **) arg2;
8857
8858 return s1->st_shndx - s2->st_shndx;
8859}
8860
3d7f7666
L
8861static int
8862elf_sym_name_compare (const void *arg1, const void *arg2)
8863{
8864 const struct elf_symbol *s1 = (const struct elf_symbol *) arg1;
8865 const struct elf_symbol *s2 = (const struct elf_symbol *) arg2;
8866 return strcmp (s1->name, s2->name);
8867}
8868
c15f73f9
JJ
8869static struct elf_symbuf_head *
8870elf_create_symbuf (bfd_size_type symcount, Elf_Internal_Sym *isymbuf)
8871{
8872 Elf_Internal_Sym **ind, **indbufend, **indbuf
8873 = bfd_malloc2 (symcount, sizeof (*indbuf));
8874 struct elf_symbuf_symbol *ssym;
8875 struct elf_symbuf_head *ssymbuf, *ssymhead;
8876 bfd_size_type i, shndx_count;
8877
8878 if (indbuf == NULL)
8879 return NULL;
8880
8881 for (ind = indbuf, i = 0; i < symcount; i++)
8882 if (isymbuf[i].st_shndx != SHN_UNDEF)
8883 *ind++ = &isymbuf[i];
8884 indbufend = ind;
8885
8886 qsort (indbuf, indbufend - indbuf, sizeof (Elf_Internal_Sym *),
8887 elf_sort_elf_symbol);
8888
8889 shndx_count = 0;
8890 if (indbufend > indbuf)
8891 for (ind = indbuf, shndx_count++; ind < indbufend - 1; ind++)
8892 if (ind[0]->st_shndx != ind[1]->st_shndx)
8893 shndx_count++;
8894
8895 ssymbuf = bfd_malloc ((shndx_count + 1) * sizeof (*ssymbuf)
8896 + (indbufend - indbuf) * sizeof (*ssymbuf));
8897 if (ssymbuf == NULL)
8898 {
8899 free (indbuf);
8900 return NULL;
8901 }
8902
8903 ssym = (struct elf_symbuf_symbol *) (ssymbuf + shndx_count);
8904 ssymbuf->ssym = NULL;
8905 ssymbuf->count = shndx_count;
8906 ssymbuf->st_shndx = 0;
8907 for (ssymhead = ssymbuf, ind = indbuf; ind < indbufend; ssym++, ind++)
8908 {
8909 if (ind == indbuf || ssymhead->st_shndx != (*ind)->st_shndx)
8910 {
8911 ssymhead++;
8912 ssymhead->ssym = ssym;
8913 ssymhead->count = 0;
8914 ssymhead->st_shndx = (*ind)->st_shndx;
8915 }
8916 ssym->st_name = (*ind)->st_name;
8917 ssym->st_info = (*ind)->st_info;
8918 ssym->st_other = (*ind)->st_other;
8919 ssymhead->count++;
8920 }
8921 BFD_ASSERT ((bfd_size_type) (ssymhead - ssymbuf) == shndx_count);
8922
8923 free (indbuf);
8924 return ssymbuf;
8925}
8926
3d7f7666
L
8927/* Check if 2 sections define the same set of local and global
8928 symbols. */
8929
8930bfd_boolean
c0f00686
L
8931bfd_elf_match_symbols_in_sections (asection *sec1, asection *sec2,
8932 struct bfd_link_info *info)
3d7f7666
L
8933{
8934 bfd *bfd1, *bfd2;
8935 const struct elf_backend_data *bed1, *bed2;
8936 Elf_Internal_Shdr *hdr1, *hdr2;
8937 bfd_size_type symcount1, symcount2;
8938 Elf_Internal_Sym *isymbuf1, *isymbuf2;
c15f73f9
JJ
8939 struct elf_symbuf_head *ssymbuf1, *ssymbuf2;
8940 Elf_Internal_Sym *isym, *isymend;
8941 struct elf_symbol *symtable1 = NULL, *symtable2 = NULL;
3d7f7666
L
8942 bfd_size_type count1, count2, i;
8943 int shndx1, shndx2;
8944 bfd_boolean result;
8945
8946 bfd1 = sec1->owner;
8947 bfd2 = sec2->owner;
8948
8949 /* If both are .gnu.linkonce sections, they have to have the same
8950 section name. */
0112cd26
NC
8951 if (CONST_STRNEQ (sec1->name, ".gnu.linkonce")
8952 && CONST_STRNEQ (sec2->name, ".gnu.linkonce"))
3d7f7666
L
8953 return strcmp (sec1->name + sizeof ".gnu.linkonce",
8954 sec2->name + sizeof ".gnu.linkonce") == 0;
8955
8956 /* Both sections have to be in ELF. */
8957 if (bfd_get_flavour (bfd1) != bfd_target_elf_flavour
8958 || bfd_get_flavour (bfd2) != bfd_target_elf_flavour)
8959 return FALSE;
8960
8961 if (elf_section_type (sec1) != elf_section_type (sec2))
8962 return FALSE;
8963
8964 if ((elf_section_flags (sec1) & SHF_GROUP) != 0
8965 && (elf_section_flags (sec2) & SHF_GROUP) != 0)
8966 {
8967 /* If both are members of section groups, they have to have the
8968 same group name. */
8969 if (strcmp (elf_group_name (sec1), elf_group_name (sec2)) != 0)
8970 return FALSE;
8971 }
8972
8973 shndx1 = _bfd_elf_section_from_bfd_section (bfd1, sec1);
8974 shndx2 = _bfd_elf_section_from_bfd_section (bfd2, sec2);
8975 if (shndx1 == -1 || shndx2 == -1)
8976 return FALSE;
8977
8978 bed1 = get_elf_backend_data (bfd1);
8979 bed2 = get_elf_backend_data (bfd2);
8980 hdr1 = &elf_tdata (bfd1)->symtab_hdr;
8981 symcount1 = hdr1->sh_size / bed1->s->sizeof_sym;
8982 hdr2 = &elf_tdata (bfd2)->symtab_hdr;
8983 symcount2 = hdr2->sh_size / bed2->s->sizeof_sym;
8984
8985 if (symcount1 == 0 || symcount2 == 0)
8986 return FALSE;
8987
3d7f7666 8988 result = FALSE;
c15f73f9
JJ
8989 isymbuf1 = NULL;
8990 isymbuf2 = NULL;
8991 ssymbuf1 = elf_tdata (bfd1)->symbuf;
8992 ssymbuf2 = elf_tdata (bfd2)->symbuf;
3d7f7666 8993
c15f73f9 8994 if (ssymbuf1 == NULL)
c0f00686
L
8995 {
8996 isymbuf1 = bfd_elf_get_elf_syms (bfd1, hdr1, symcount1, 0,
8997 NULL, NULL, NULL);
8998 if (isymbuf1 == NULL)
8999 goto done;
c15f73f9 9000
c0f00686 9001 if (!info->reduce_memory_overheads)
c15f73f9
JJ
9002 elf_tdata (bfd1)->symbuf = ssymbuf1
9003 = elf_create_symbuf (symcount1, isymbuf1);
c0f00686
L
9004 }
9005
c15f73f9 9006 if (ssymbuf1 == NULL || ssymbuf2 == NULL)
c0f00686
L
9007 {
9008 isymbuf2 = bfd_elf_get_elf_syms (bfd2, hdr2, symcount2, 0,
9009 NULL, NULL, NULL);
9010 if (isymbuf2 == NULL)
9011 goto done;
c15f73f9
JJ
9012
9013 if (ssymbuf1 != NULL && !info->reduce_memory_overheads)
9014 elf_tdata (bfd2)->symbuf = ssymbuf2
9015 = elf_create_symbuf (symcount2, isymbuf2);
c0f00686 9016 }
3d7f7666 9017
c15f73f9 9018 if (ssymbuf1 != NULL && ssymbuf2 != NULL)
3d7f7666 9019 {
c15f73f9
JJ
9020 /* Optimized faster version. */
9021 bfd_size_type lo, hi, mid;
9022 struct elf_symbol *symp;
9023 struct elf_symbuf_symbol *ssym, *ssymend;
9024
9025 lo = 0;
9026 hi = ssymbuf1->count;
9027 ssymbuf1++;
9028 count1 = 0;
9029 while (lo < hi)
3d7f7666 9030 {
c15f73f9
JJ
9031 mid = (lo + hi) / 2;
9032 if ((unsigned int) shndx1 < ssymbuf1[mid].st_shndx)
9033 hi = mid;
9034 else if ((unsigned int) shndx1 > ssymbuf1[mid].st_shndx)
9035 lo = mid + 1;
9036 else
9037 {
9038 count1 = ssymbuf1[mid].count;
9039 ssymbuf1 += mid;
9040 break;
9041 }
3d7f7666
L
9042 }
9043
c15f73f9
JJ
9044 lo = 0;
9045 hi = ssymbuf2->count;
9046 ssymbuf2++;
9047 count2 = 0;
9048 while (lo < hi)
9049 {
9050 mid = (lo + hi) / 2;
9051 if ((unsigned int) shndx2 < ssymbuf2[mid].st_shndx)
9052 hi = mid;
9053 else if ((unsigned int) shndx2 > ssymbuf2[mid].st_shndx)
9054 lo = mid + 1;
9055 else
9056 {
9057 count2 = ssymbuf2[mid].count;
9058 ssymbuf2 += mid;
9059 break;
9060 }
9061 }
3d7f7666 9062
c15f73f9
JJ
9063 if (count1 == 0 || count2 == 0 || count1 != count2)
9064 goto done;
9065
9066 symtable1 = bfd_malloc (count1 * sizeof (struct elf_symbol));
9067 symtable2 = bfd_malloc (count2 * sizeof (struct elf_symbol));
9068 if (symtable1 == NULL || symtable2 == NULL)
9069 goto done;
9070
9071 symp = symtable1;
9072 for (ssym = ssymbuf1->ssym, ssymend = ssym + count1;
9073 ssym < ssymend; ssym++, symp++)
3d7f7666 9074 {
c15f73f9
JJ
9075 symp->u.ssym = ssym;
9076 symp->name = bfd_elf_string_from_elf_section (bfd1,
9077 hdr1->sh_link,
9078 ssym->st_name);
3d7f7666
L
9079 }
9080
c15f73f9
JJ
9081 symp = symtable2;
9082 for (ssym = ssymbuf2->ssym, ssymend = ssym + count2;
9083 ssym < ssymend; ssym++, symp++)
9084 {
9085 symp->u.ssym = ssym;
9086 symp->name = bfd_elf_string_from_elf_section (bfd2,
9087 hdr2->sh_link,
9088 ssym->st_name);
9089 }
9090
9091 /* Sort symbol by name. */
9092 qsort (symtable1, count1, sizeof (struct elf_symbol),
9093 elf_sym_name_compare);
9094 qsort (symtable2, count1, sizeof (struct elf_symbol),
9095 elf_sym_name_compare);
9096
9097 for (i = 0; i < count1; i++)
9098 /* Two symbols must have the same binding, type and name. */
9099 if (symtable1 [i].u.ssym->st_info != symtable2 [i].u.ssym->st_info
9100 || symtable1 [i].u.ssym->st_other != symtable2 [i].u.ssym->st_other
9101 || strcmp (symtable1 [i].name, symtable2 [i].name) != 0)
9102 goto done;
9103
9104 result = TRUE;
9105 goto done;
3d7f7666
L
9106 }
9107
c15f73f9
JJ
9108 symtable1 = bfd_malloc (symcount1 * sizeof (struct elf_symbol));
9109 symtable2 = bfd_malloc (symcount2 * sizeof (struct elf_symbol));
9110 if (symtable1 == NULL || symtable2 == NULL)
3d7f7666
L
9111 goto done;
9112
c15f73f9
JJ
9113 /* Count definitions in the section. */
9114 count1 = 0;
9115 for (isym = isymbuf1, isymend = isym + symcount1; isym < isymend; isym++)
9116 if (isym->st_shndx == (unsigned int) shndx1)
9117 symtable1[count1++].u.isym = isym;
3d7f7666 9118
c15f73f9
JJ
9119 count2 = 0;
9120 for (isym = isymbuf2, isymend = isym + symcount2; isym < isymend; isym++)
9121 if (isym->st_shndx == (unsigned int) shndx2)
9122 symtable2[count2++].u.isym = isym;
9123
9124 if (count1 == 0 || count2 == 0 || count1 != count2)
3d7f7666
L
9125 goto done;
9126
c15f73f9
JJ
9127 for (i = 0; i < count1; i++)
9128 symtable1[i].name
9129 = bfd_elf_string_from_elf_section (bfd1, hdr1->sh_link,
9130 symtable1[i].u.isym->st_name);
9131
9132 for (i = 0; i < count2; i++)
9133 symtable2[i].name
9134 = bfd_elf_string_from_elf_section (bfd2, hdr2->sh_link,
9135 symtable2[i].u.isym->st_name);
9136
3d7f7666
L
9137 /* Sort symbol by name. */
9138 qsort (symtable1, count1, sizeof (struct elf_symbol),
9139 elf_sym_name_compare);
9140 qsort (symtable2, count1, sizeof (struct elf_symbol),
9141 elf_sym_name_compare);
9142
9143 for (i = 0; i < count1; i++)
9144 /* Two symbols must have the same binding, type and name. */
c15f73f9
JJ
9145 if (symtable1 [i].u.isym->st_info != symtable2 [i].u.isym->st_info
9146 || symtable1 [i].u.isym->st_other != symtable2 [i].u.isym->st_other
3d7f7666
L
9147 || strcmp (symtable1 [i].name, symtable2 [i].name) != 0)
9148 goto done;
9149
9150 result = TRUE;
9151
9152done:
9153 if (symtable1)
9154 free (symtable1);
9155 if (symtable2)
9156 free (symtable2);
c15f73f9
JJ
9157 if (isymbuf1)
9158 free (isymbuf1);
9159 if (isymbuf2)
9160 free (isymbuf2);
3d7f7666
L
9161
9162 return result;
9163}
3b22753a
L
9164
9165/* It is only used by x86-64 so far. */
9166asection _bfd_elf_large_com_section
9167 = BFD_FAKE_SECTION (_bfd_elf_large_com_section,
f592407e 9168 SEC_IS_COMMON, NULL, "LARGE_COMMON", 0);
ecca9871
L
9169
9170/* Return TRUE if 2 section types are compatible. */
9171
9172bfd_boolean
9173_bfd_elf_match_sections_by_type (bfd *abfd, const asection *asec,
9174 bfd *bbfd, const asection *bsec)
9175{
9176 if (asec == NULL
9177 || bsec == NULL
9178 || abfd->xvec->flavour != bfd_target_elf_flavour
9179 || bbfd->xvec->flavour != bfd_target_elf_flavour)
9180 return TRUE;
9181
9182 return elf_section_type (asec) == elf_section_type (bsec);
9183}
d1036acb
L
9184
9185void
9186_bfd_elf_set_osabi (bfd * abfd,
9187 struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
9188{
9189 Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form. */
9190
9191 i_ehdrp = elf_elfheader (abfd);
9192
9193 i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
9194}
fcb93ecf
PB
9195
9196
9197/* Return TRUE for ELF symbol types that represent functions.
9198 This is the default version of this function, which is sufficient for
9199 most targets. It returns true if TYPE is STT_FUNC. */
9200
9201bfd_boolean
9202_bfd_elf_is_function_type (unsigned int type)
9203{
9204 return (type == STT_FUNC);
9205}