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