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