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