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