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