elf.c revision 1.8 1 1.1 christos /* ELF executable support for BFD.
2 1.1 christos
3 1.8 christos Copyright (C) 1993-2016 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.8 christos #include "elf-linux-core.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.6 christos static bfd_boolean swap_out_syms (bfd *, struct elf_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.6 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.8 christos if (elf_symtab_shndx_list (ibfd) != NULL)
404 1.8 christos {
405 1.8 christos elf_section_list * entry;
406 1.8 christos Elf_Internal_Shdr **sections = elf_elfsections (ibfd);
407 1.8 christos
408 1.8 christos /* Find an index section that is linked to this symtab section. */
409 1.8 christos for (entry = elf_symtab_shndx_list (ibfd); entry != NULL; entry = entry->next)
410 1.8 christos {
411 1.8 christos /* PR 20063. */
412 1.8 christos if (entry->hdr.sh_link >= elf_numsections (ibfd))
413 1.8 christos continue;
414 1.8 christos
415 1.8 christos if (sections[entry->hdr.sh_link] == symtab_hdr)
416 1.8 christos {
417 1.8 christos shndx_hdr = & entry->hdr;
418 1.8 christos break;
419 1.8 christos };
420 1.8 christos }
421 1.8 christos
422 1.8 christos if (shndx_hdr == NULL)
423 1.8 christos {
424 1.8 christos if (symtab_hdr == & elf_symtab_hdr (ibfd))
425 1.8 christos /* Not really accurate, but this was how the old code used to work. */
426 1.8 christos shndx_hdr = & elf_symtab_shndx_list (ibfd)->hdr;
427 1.8 christos /* Otherwise we do nothing. The assumption is that
428 1.8 christos the index table will not be needed. */
429 1.8 christos }
430 1.8 christos }
431 1.1 christos
432 1.1 christos /* Read the symbols. */
433 1.1 christos alloc_ext = NULL;
434 1.1 christos alloc_extshndx = NULL;
435 1.1 christos alloc_intsym = NULL;
436 1.1 christos bed = get_elf_backend_data (ibfd);
437 1.1 christos extsym_size = bed->s->sizeof_sym;
438 1.8 christos amt = (bfd_size_type) symcount * extsym_size;
439 1.1 christos pos = symtab_hdr->sh_offset + symoffset * extsym_size;
440 1.1 christos if (extsym_buf == NULL)
441 1.1 christos {
442 1.1 christos alloc_ext = bfd_malloc2 (symcount, extsym_size);
443 1.1 christos extsym_buf = alloc_ext;
444 1.1 christos }
445 1.1 christos if (extsym_buf == NULL
446 1.1 christos || bfd_seek (ibfd, pos, SEEK_SET) != 0
447 1.1 christos || bfd_bread (extsym_buf, amt, ibfd) != amt)
448 1.1 christos {
449 1.1 christos intsym_buf = NULL;
450 1.1 christos goto out;
451 1.1 christos }
452 1.1 christos
453 1.1 christos if (shndx_hdr == NULL || shndx_hdr->sh_size == 0)
454 1.1 christos extshndx_buf = NULL;
455 1.1 christos else
456 1.1 christos {
457 1.8 christos amt = (bfd_size_type) symcount * sizeof (Elf_External_Sym_Shndx);
458 1.1 christos pos = shndx_hdr->sh_offset + symoffset * sizeof (Elf_External_Sym_Shndx);
459 1.1 christos if (extshndx_buf == NULL)
460 1.1 christos {
461 1.1 christos alloc_extshndx = (Elf_External_Sym_Shndx *)
462 1.1 christos bfd_malloc2 (symcount, sizeof (Elf_External_Sym_Shndx));
463 1.1 christos extshndx_buf = alloc_extshndx;
464 1.1 christos }
465 1.1 christos if (extshndx_buf == NULL
466 1.1 christos || bfd_seek (ibfd, pos, SEEK_SET) != 0
467 1.1 christos || bfd_bread (extshndx_buf, amt, ibfd) != amt)
468 1.1 christos {
469 1.1 christos intsym_buf = NULL;
470 1.1 christos goto out;
471 1.1 christos }
472 1.1 christos }
473 1.1 christos
474 1.1 christos if (intsym_buf == NULL)
475 1.1 christos {
476 1.1 christos alloc_intsym = (Elf_Internal_Sym *)
477 1.1 christos bfd_malloc2 (symcount, sizeof (Elf_Internal_Sym));
478 1.1 christos intsym_buf = alloc_intsym;
479 1.1 christos if (intsym_buf == NULL)
480 1.1 christos goto out;
481 1.1 christos }
482 1.1 christos
483 1.1 christos /* Convert the symbols to internal form. */
484 1.1 christos isymend = intsym_buf + symcount;
485 1.1 christos for (esym = (const bfd_byte *) extsym_buf, isym = intsym_buf,
486 1.1 christos shndx = extshndx_buf;
487 1.1 christos isym < isymend;
488 1.1 christos esym += extsym_size, isym++, shndx = shndx != NULL ? shndx + 1 : NULL)
489 1.1 christos if (!(*bed->s->swap_symbol_in) (ibfd, esym, shndx, isym))
490 1.1 christos {
491 1.1 christos symoffset += (esym - (bfd_byte *) extsym_buf) / extsym_size;
492 1.1 christos (*_bfd_error_handler) (_("%B symbol number %lu references "
493 1.1 christos "nonexistent SHT_SYMTAB_SHNDX section"),
494 1.1 christos ibfd, (unsigned long) symoffset);
495 1.1 christos if (alloc_intsym != NULL)
496 1.1 christos free (alloc_intsym);
497 1.1 christos intsym_buf = NULL;
498 1.1 christos goto out;
499 1.1 christos }
500 1.1 christos
501 1.1 christos out:
502 1.1 christos if (alloc_ext != NULL)
503 1.1 christos free (alloc_ext);
504 1.1 christos if (alloc_extshndx != NULL)
505 1.1 christos free (alloc_extshndx);
506 1.1 christos
507 1.1 christos return intsym_buf;
508 1.1 christos }
509 1.1 christos
510 1.1 christos /* Look up a symbol name. */
511 1.1 christos const char *
512 1.1 christos bfd_elf_sym_name (bfd *abfd,
513 1.1 christos Elf_Internal_Shdr *symtab_hdr,
514 1.1 christos Elf_Internal_Sym *isym,
515 1.1 christos asection *sym_sec)
516 1.1 christos {
517 1.1 christos const char *name;
518 1.1 christos unsigned int iname = isym->st_name;
519 1.1 christos unsigned int shindex = symtab_hdr->sh_link;
520 1.1 christos
521 1.1 christos if (iname == 0 && ELF_ST_TYPE (isym->st_info) == STT_SECTION
522 1.1 christos /* Check for a bogus st_shndx to avoid crashing. */
523 1.1 christos && isym->st_shndx < elf_numsections (abfd))
524 1.1 christos {
525 1.1 christos iname = elf_elfsections (abfd)[isym->st_shndx]->sh_name;
526 1.1 christos shindex = elf_elfheader (abfd)->e_shstrndx;
527 1.1 christos }
528 1.1 christos
529 1.1 christos name = bfd_elf_string_from_elf_section (abfd, shindex, iname);
530 1.1 christos if (name == NULL)
531 1.1 christos name = "(null)";
532 1.1 christos else if (sym_sec && *name == '\0')
533 1.1 christos name = bfd_section_name (abfd, sym_sec);
534 1.1 christos
535 1.1 christos return name;
536 1.1 christos }
537 1.1 christos
538 1.1 christos /* Elf_Internal_Shdr->contents is an array of these for SHT_GROUP
539 1.1 christos sections. The first element is the flags, the rest are section
540 1.1 christos pointers. */
541 1.1 christos
542 1.1 christos typedef union elf_internal_group {
543 1.1 christos Elf_Internal_Shdr *shdr;
544 1.1 christos unsigned int flags;
545 1.1 christos } Elf_Internal_Group;
546 1.1 christos
547 1.1 christos /* Return the name of the group signature symbol. Why isn't the
548 1.1 christos signature just a string? */
549 1.1 christos
550 1.1 christos static const char *
551 1.1 christos group_signature (bfd *abfd, Elf_Internal_Shdr *ghdr)
552 1.1 christos {
553 1.1 christos Elf_Internal_Shdr *hdr;
554 1.1 christos unsigned char esym[sizeof (Elf64_External_Sym)];
555 1.1 christos Elf_External_Sym_Shndx eshndx;
556 1.1 christos Elf_Internal_Sym isym;
557 1.1 christos
558 1.1 christos /* First we need to ensure the symbol table is available. Make sure
559 1.1 christos that it is a symbol table section. */
560 1.1 christos if (ghdr->sh_link >= elf_numsections (abfd))
561 1.1 christos return NULL;
562 1.1 christos hdr = elf_elfsections (abfd) [ghdr->sh_link];
563 1.1 christos if (hdr->sh_type != SHT_SYMTAB
564 1.1 christos || ! bfd_section_from_shdr (abfd, ghdr->sh_link))
565 1.1 christos return NULL;
566 1.1 christos
567 1.1 christos /* Go read the symbol. */
568 1.1 christos hdr = &elf_tdata (abfd)->symtab_hdr;
569 1.1 christos if (bfd_elf_get_elf_syms (abfd, hdr, 1, ghdr->sh_info,
570 1.1 christos &isym, esym, &eshndx) == NULL)
571 1.1 christos return NULL;
572 1.1 christos
573 1.1 christos return bfd_elf_sym_name (abfd, hdr, &isym, NULL);
574 1.1 christos }
575 1.1 christos
576 1.1 christos /* Set next_in_group list pointer, and group name for NEWSECT. */
577 1.1 christos
578 1.1 christos static bfd_boolean
579 1.1 christos setup_group (bfd *abfd, Elf_Internal_Shdr *hdr, asection *newsect)
580 1.1 christos {
581 1.1 christos unsigned int num_group = elf_tdata (abfd)->num_group;
582 1.1 christos
583 1.1 christos /* If num_group is zero, read in all SHT_GROUP sections. The count
584 1.1 christos is set to -1 if there are no SHT_GROUP sections. */
585 1.1 christos if (num_group == 0)
586 1.1 christos {
587 1.1 christos unsigned int i, shnum;
588 1.1 christos
589 1.1 christos /* First count the number of groups. If we have a SHT_GROUP
590 1.1 christos section with just a flag word (ie. sh_size is 4), ignore it. */
591 1.1 christos shnum = elf_numsections (abfd);
592 1.1 christos num_group = 0;
593 1.1 christos
594 1.3 christos #define IS_VALID_GROUP_SECTION_HEADER(shdr, minsize) \
595 1.1 christos ( (shdr)->sh_type == SHT_GROUP \
596 1.3 christos && (shdr)->sh_size >= minsize \
597 1.1 christos && (shdr)->sh_entsize == GRP_ENTRY_SIZE \
598 1.1 christos && ((shdr)->sh_size % GRP_ENTRY_SIZE) == 0)
599 1.1 christos
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 num_group += 1;
606 1.1 christos }
607 1.1 christos
608 1.1 christos if (num_group == 0)
609 1.1 christos {
610 1.1 christos num_group = (unsigned) -1;
611 1.1 christos elf_tdata (abfd)->num_group = num_group;
612 1.1 christos }
613 1.1 christos else
614 1.1 christos {
615 1.1 christos /* We keep a list of elf section headers for group sections,
616 1.1 christos so we can find them quickly. */
617 1.1 christos bfd_size_type amt;
618 1.1 christos
619 1.1 christos elf_tdata (abfd)->num_group = num_group;
620 1.1 christos elf_tdata (abfd)->group_sect_ptr = (Elf_Internal_Shdr **)
621 1.1 christos bfd_alloc2 (abfd, num_group, sizeof (Elf_Internal_Shdr *));
622 1.1 christos if (elf_tdata (abfd)->group_sect_ptr == NULL)
623 1.1 christos return FALSE;
624 1.1 christos
625 1.1 christos num_group = 0;
626 1.1 christos for (i = 0; i < shnum; i++)
627 1.1 christos {
628 1.1 christos Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[i];
629 1.1 christos
630 1.3 christos if (IS_VALID_GROUP_SECTION_HEADER (shdr, 2 * GRP_ENTRY_SIZE))
631 1.1 christos {
632 1.1 christos unsigned char *src;
633 1.1 christos Elf_Internal_Group *dest;
634 1.1 christos
635 1.1 christos /* Add to list of sections. */
636 1.1 christos elf_tdata (abfd)->group_sect_ptr[num_group] = shdr;
637 1.1 christos num_group += 1;
638 1.1 christos
639 1.1 christos /* Read the raw contents. */
640 1.1 christos BFD_ASSERT (sizeof (*dest) >= 4);
641 1.1 christos amt = shdr->sh_size * sizeof (*dest) / 4;
642 1.1 christos shdr->contents = (unsigned char *)
643 1.1 christos bfd_alloc2 (abfd, shdr->sh_size, sizeof (*dest) / 4);
644 1.1 christos /* PR binutils/4110: Handle corrupt group headers. */
645 1.1 christos if (shdr->contents == NULL)
646 1.1 christos {
647 1.1 christos _bfd_error_handler
648 1.5 christos (_("%B: corrupt size field in group section header: 0x%lx"), abfd, shdr->sh_size);
649 1.1 christos bfd_set_error (bfd_error_bad_value);
650 1.5 christos -- num_group;
651 1.5 christos continue;
652 1.1 christos }
653 1.1 christos
654 1.1 christos memset (shdr->contents, 0, amt);
655 1.1 christos
656 1.1 christos if (bfd_seek (abfd, shdr->sh_offset, SEEK_SET) != 0
657 1.1 christos || (bfd_bread (shdr->contents, shdr->sh_size, abfd)
658 1.1 christos != shdr->sh_size))
659 1.5 christos {
660 1.5 christos _bfd_error_handler
661 1.5 christos (_("%B: invalid size field in group section header: 0x%lx"), abfd, shdr->sh_size);
662 1.5 christos bfd_set_error (bfd_error_bad_value);
663 1.5 christos -- num_group;
664 1.5 christos /* PR 17510: If the group contents are even partially
665 1.5 christos corrupt, do not allow any of the contents to be used. */
666 1.5 christos memset (shdr->contents, 0, amt);
667 1.5 christos continue;
668 1.5 christos }
669 1.1 christos
670 1.1 christos /* Translate raw contents, a flag word followed by an
671 1.1 christos array of elf section indices all in target byte order,
672 1.1 christos to the flag word followed by an array of elf section
673 1.1 christos pointers. */
674 1.1 christos src = shdr->contents + shdr->sh_size;
675 1.1 christos dest = (Elf_Internal_Group *) (shdr->contents + amt);
676 1.5 christos
677 1.1 christos while (1)
678 1.1 christos {
679 1.1 christos unsigned int idx;
680 1.1 christos
681 1.1 christos src -= 4;
682 1.1 christos --dest;
683 1.1 christos idx = H_GET_32 (abfd, src);
684 1.1 christos if (src == shdr->contents)
685 1.1 christos {
686 1.1 christos dest->flags = idx;
687 1.1 christos if (shdr->bfd_section != NULL && (idx & GRP_COMDAT))
688 1.1 christos shdr->bfd_section->flags
689 1.1 christos |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
690 1.1 christos break;
691 1.1 christos }
692 1.1 christos if (idx >= shnum)
693 1.1 christos {
694 1.1 christos ((*_bfd_error_handler)
695 1.1 christos (_("%B: invalid SHT_GROUP entry"), abfd));
696 1.1 christos idx = 0;
697 1.1 christos }
698 1.1 christos dest->shdr = elf_elfsections (abfd)[idx];
699 1.1 christos }
700 1.1 christos }
701 1.1 christos }
702 1.5 christos
703 1.5 christos /* PR 17510: Corrupt binaries might contain invalid groups. */
704 1.5 christos if (num_group != (unsigned) elf_tdata (abfd)->num_group)
705 1.5 christos {
706 1.5 christos elf_tdata (abfd)->num_group = num_group;
707 1.5 christos
708 1.5 christos /* If all groups are invalid then fail. */
709 1.5 christos if (num_group == 0)
710 1.5 christos {
711 1.5 christos elf_tdata (abfd)->group_sect_ptr = NULL;
712 1.5 christos elf_tdata (abfd)->num_group = num_group = -1;
713 1.5 christos (*_bfd_error_handler) (_("%B: no valid group sections found"), abfd);
714 1.5 christos bfd_set_error (bfd_error_bad_value);
715 1.5 christos }
716 1.5 christos }
717 1.1 christos }
718 1.1 christos }
719 1.1 christos
720 1.1 christos if (num_group != (unsigned) -1)
721 1.1 christos {
722 1.1 christos unsigned int i;
723 1.1 christos
724 1.1 christos for (i = 0; i < num_group; i++)
725 1.1 christos {
726 1.1 christos Elf_Internal_Shdr *shdr = elf_tdata (abfd)->group_sect_ptr[i];
727 1.1 christos Elf_Internal_Group *idx = (Elf_Internal_Group *) shdr->contents;
728 1.1 christos unsigned int n_elt = shdr->sh_size / 4;
729 1.1 christos
730 1.1 christos /* Look through this group's sections to see if current
731 1.1 christos section is a member. */
732 1.1 christos while (--n_elt != 0)
733 1.1 christos if ((++idx)->shdr == hdr)
734 1.1 christos {
735 1.1 christos asection *s = NULL;
736 1.1 christos
737 1.1 christos /* We are a member of this group. Go looking through
738 1.1 christos other members to see if any others are linked via
739 1.1 christos next_in_group. */
740 1.1 christos idx = (Elf_Internal_Group *) shdr->contents;
741 1.1 christos n_elt = shdr->sh_size / 4;
742 1.1 christos while (--n_elt != 0)
743 1.1 christos if ((s = (++idx)->shdr->bfd_section) != NULL
744 1.1 christos && elf_next_in_group (s) != NULL)
745 1.1 christos break;
746 1.1 christos if (n_elt != 0)
747 1.1 christos {
748 1.1 christos /* Snarf the group name from other member, and
749 1.1 christos insert current section in circular list. */
750 1.1 christos elf_group_name (newsect) = elf_group_name (s);
751 1.1 christos elf_next_in_group (newsect) = elf_next_in_group (s);
752 1.1 christos elf_next_in_group (s) = newsect;
753 1.1 christos }
754 1.1 christos else
755 1.1 christos {
756 1.1 christos const char *gname;
757 1.1 christos
758 1.1 christos gname = group_signature (abfd, shdr);
759 1.1 christos if (gname == NULL)
760 1.1 christos return FALSE;
761 1.1 christos elf_group_name (newsect) = gname;
762 1.1 christos
763 1.1 christos /* Start a circular list with one element. */
764 1.1 christos elf_next_in_group (newsect) = newsect;
765 1.1 christos }
766 1.1 christos
767 1.1 christos /* If the group section has been created, point to the
768 1.1 christos new member. */
769 1.1 christos if (shdr->bfd_section != NULL)
770 1.1 christos elf_next_in_group (shdr->bfd_section) = newsect;
771 1.1 christos
772 1.1 christos i = num_group - 1;
773 1.1 christos break;
774 1.1 christos }
775 1.1 christos }
776 1.1 christos }
777 1.1 christos
778 1.1 christos if (elf_group_name (newsect) == NULL)
779 1.1 christos {
780 1.1 christos (*_bfd_error_handler) (_("%B: no group info for section %A"),
781 1.1 christos abfd, newsect);
782 1.5 christos return FALSE;
783 1.1 christos }
784 1.1 christos return TRUE;
785 1.1 christos }
786 1.1 christos
787 1.1 christos bfd_boolean
788 1.1 christos _bfd_elf_setup_sections (bfd *abfd)
789 1.1 christos {
790 1.1 christos unsigned int i;
791 1.1 christos unsigned int num_group = elf_tdata (abfd)->num_group;
792 1.1 christos bfd_boolean result = TRUE;
793 1.1 christos asection *s;
794 1.1 christos
795 1.1 christos /* Process SHF_LINK_ORDER. */
796 1.1 christos for (s = abfd->sections; s != NULL; s = s->next)
797 1.1 christos {
798 1.1 christos Elf_Internal_Shdr *this_hdr = &elf_section_data (s)->this_hdr;
799 1.1 christos if ((this_hdr->sh_flags & SHF_LINK_ORDER) != 0)
800 1.1 christos {
801 1.1 christos unsigned int elfsec = this_hdr->sh_link;
802 1.1 christos /* FIXME: The old Intel compiler and old strip/objcopy may
803 1.1 christos not set the sh_link or sh_info fields. Hence we could
804 1.1 christos get the situation where elfsec is 0. */
805 1.1 christos if (elfsec == 0)
806 1.1 christos {
807 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
808 1.1 christos if (bed->link_order_error_handler)
809 1.1 christos bed->link_order_error_handler
810 1.1 christos (_("%B: warning: sh_link not set for section `%A'"),
811 1.1 christos abfd, s);
812 1.1 christos }
813 1.1 christos else
814 1.1 christos {
815 1.1 christos asection *linksec = NULL;
816 1.1 christos
817 1.1 christos if (elfsec < elf_numsections (abfd))
818 1.1 christos {
819 1.1 christos this_hdr = elf_elfsections (abfd)[elfsec];
820 1.1 christos linksec = this_hdr->bfd_section;
821 1.1 christos }
822 1.1 christos
823 1.1 christos /* PR 1991, 2008:
824 1.1 christos Some strip/objcopy may leave an incorrect value in
825 1.1 christos sh_link. We don't want to proceed. */
826 1.1 christos if (linksec == NULL)
827 1.1 christos {
828 1.1 christos (*_bfd_error_handler)
829 1.1 christos (_("%B: sh_link [%d] in section `%A' is incorrect"),
830 1.1 christos s->owner, s, elfsec);
831 1.1 christos result = FALSE;
832 1.1 christos }
833 1.1 christos
834 1.1 christos elf_linked_to_section (s) = linksec;
835 1.1 christos }
836 1.1 christos }
837 1.1 christos }
838 1.1 christos
839 1.1 christos /* Process section groups. */
840 1.1 christos if (num_group == (unsigned) -1)
841 1.1 christos return result;
842 1.1 christos
843 1.1 christos for (i = 0; i < num_group; i++)
844 1.1 christos {
845 1.1 christos Elf_Internal_Shdr *shdr = elf_tdata (abfd)->group_sect_ptr[i];
846 1.8 christos Elf_Internal_Group *idx;
847 1.8 christos unsigned int n_elt;
848 1.8 christos
849 1.8 christos /* PR binutils/18758: Beware of corrupt binaries with invalid group data. */
850 1.8 christos if (shdr == NULL || shdr->bfd_section == NULL || shdr->contents == NULL)
851 1.8 christos {
852 1.8 christos (*_bfd_error_handler)
853 1.8 christos (_("%B: section group entry number %u is corrupt"),
854 1.8 christos abfd, i);
855 1.8 christos result = FALSE;
856 1.8 christos continue;
857 1.8 christos }
858 1.8 christos
859 1.8 christos idx = (Elf_Internal_Group *) shdr->contents;
860 1.8 christos n_elt = shdr->sh_size / 4;
861 1.1 christos
862 1.1 christos while (--n_elt != 0)
863 1.1 christos if ((++idx)->shdr->bfd_section)
864 1.1 christos elf_sec_group (idx->shdr->bfd_section) = shdr->bfd_section;
865 1.1 christos else if (idx->shdr->sh_type == SHT_RELA
866 1.1 christos || idx->shdr->sh_type == SHT_REL)
867 1.1 christos /* We won't include relocation sections in section groups in
868 1.1 christos output object files. We adjust the group section size here
869 1.1 christos so that relocatable link will work correctly when
870 1.1 christos relocation sections are in section group in input object
871 1.1 christos files. */
872 1.1 christos shdr->bfd_section->size -= 4;
873 1.1 christos else
874 1.1 christos {
875 1.1 christos /* There are some unknown sections in the group. */
876 1.1 christos (*_bfd_error_handler)
877 1.1 christos (_("%B: unknown [%d] section `%s' in group [%s]"),
878 1.1 christos abfd,
879 1.1 christos (unsigned int) idx->shdr->sh_type,
880 1.1 christos bfd_elf_string_from_elf_section (abfd,
881 1.1 christos (elf_elfheader (abfd)
882 1.1 christos ->e_shstrndx),
883 1.1 christos idx->shdr->sh_name),
884 1.1 christos shdr->bfd_section->name);
885 1.1 christos result = FALSE;
886 1.1 christos }
887 1.1 christos }
888 1.1 christos return result;
889 1.1 christos }
890 1.1 christos
891 1.1 christos bfd_boolean
892 1.1 christos bfd_elf_is_group_section (bfd *abfd ATTRIBUTE_UNUSED, const asection *sec)
893 1.1 christos {
894 1.1 christos return elf_next_in_group (sec) != NULL;
895 1.1 christos }
896 1.1 christos
897 1.6 christos static char *
898 1.6 christos convert_debug_to_zdebug (bfd *abfd, const char *name)
899 1.6 christos {
900 1.6 christos unsigned int len = strlen (name);
901 1.6 christos char *new_name = bfd_alloc (abfd, len + 2);
902 1.6 christos if (new_name == NULL)
903 1.6 christos return NULL;
904 1.6 christos new_name[0] = '.';
905 1.6 christos new_name[1] = 'z';
906 1.6 christos memcpy (new_name + 2, name + 1, len);
907 1.6 christos return new_name;
908 1.6 christos }
909 1.6 christos
910 1.6 christos static char *
911 1.6 christos convert_zdebug_to_debug (bfd *abfd, const char *name)
912 1.6 christos {
913 1.6 christos unsigned int len = strlen (name);
914 1.6 christos char *new_name = bfd_alloc (abfd, len);
915 1.6 christos if (new_name == NULL)
916 1.6 christos return NULL;
917 1.6 christos new_name[0] = '.';
918 1.6 christos memcpy (new_name + 1, name + 2, len - 1);
919 1.6 christos return new_name;
920 1.6 christos }
921 1.6 christos
922 1.1 christos /* Make a BFD section from an ELF section. We store a pointer to the
923 1.1 christos BFD section in the bfd_section field of the header. */
924 1.1 christos
925 1.1 christos bfd_boolean
926 1.1 christos _bfd_elf_make_section_from_shdr (bfd *abfd,
927 1.1 christos Elf_Internal_Shdr *hdr,
928 1.1 christos const char *name,
929 1.1 christos int shindex)
930 1.1 christos {
931 1.1 christos asection *newsect;
932 1.1 christos flagword flags;
933 1.1 christos const struct elf_backend_data *bed;
934 1.1 christos
935 1.1 christos if (hdr->bfd_section != NULL)
936 1.1 christos return TRUE;
937 1.1 christos
938 1.1 christos newsect = bfd_make_section_anyway (abfd, name);
939 1.1 christos if (newsect == NULL)
940 1.1 christos return FALSE;
941 1.1 christos
942 1.1 christos hdr->bfd_section = newsect;
943 1.1 christos elf_section_data (newsect)->this_hdr = *hdr;
944 1.1 christos elf_section_data (newsect)->this_idx = shindex;
945 1.1 christos
946 1.1 christos /* Always use the real type/flags. */
947 1.1 christos elf_section_type (newsect) = hdr->sh_type;
948 1.1 christos elf_section_flags (newsect) = hdr->sh_flags;
949 1.1 christos
950 1.1 christos newsect->filepos = hdr->sh_offset;
951 1.1 christos
952 1.1 christos if (! bfd_set_section_vma (abfd, newsect, hdr->sh_addr)
953 1.1 christos || ! bfd_set_section_size (abfd, newsect, hdr->sh_size)
954 1.1 christos || ! bfd_set_section_alignment (abfd, newsect,
955 1.1 christos bfd_log2 (hdr->sh_addralign)))
956 1.1 christos return FALSE;
957 1.1 christos
958 1.1 christos flags = SEC_NO_FLAGS;
959 1.1 christos if (hdr->sh_type != SHT_NOBITS)
960 1.1 christos flags |= SEC_HAS_CONTENTS;
961 1.1 christos if (hdr->sh_type == SHT_GROUP)
962 1.1 christos flags |= SEC_GROUP | SEC_EXCLUDE;
963 1.1 christos if ((hdr->sh_flags & SHF_ALLOC) != 0)
964 1.1 christos {
965 1.1 christos flags |= SEC_ALLOC;
966 1.1 christos if (hdr->sh_type != SHT_NOBITS)
967 1.1 christos flags |= SEC_LOAD;
968 1.1 christos }
969 1.1 christos if ((hdr->sh_flags & SHF_WRITE) == 0)
970 1.1 christos flags |= SEC_READONLY;
971 1.1 christos if ((hdr->sh_flags & SHF_EXECINSTR) != 0)
972 1.1 christos flags |= SEC_CODE;
973 1.1 christos else if ((flags & SEC_LOAD) != 0)
974 1.1 christos flags |= SEC_DATA;
975 1.1 christos if ((hdr->sh_flags & SHF_MERGE) != 0)
976 1.1 christos {
977 1.1 christos flags |= SEC_MERGE;
978 1.1 christos newsect->entsize = hdr->sh_entsize;
979 1.1 christos }
980 1.8 christos if ((hdr->sh_flags & SHF_STRINGS) != 0)
981 1.8 christos flags |= SEC_STRINGS;
982 1.1 christos if (hdr->sh_flags & SHF_GROUP)
983 1.1 christos if (!setup_group (abfd, hdr, newsect))
984 1.1 christos return FALSE;
985 1.1 christos if ((hdr->sh_flags & SHF_TLS) != 0)
986 1.1 christos flags |= SEC_THREAD_LOCAL;
987 1.1 christos if ((hdr->sh_flags & SHF_EXCLUDE) != 0)
988 1.1 christos flags |= SEC_EXCLUDE;
989 1.1 christos
990 1.1 christos if ((flags & SEC_ALLOC) == 0)
991 1.1 christos {
992 1.1 christos /* The debugging sections appear to be recognized only by name,
993 1.1 christos not any sort of flag. Their SEC_ALLOC bits are cleared. */
994 1.1 christos if (name [0] == '.')
995 1.1 christos {
996 1.3 christos const char *p;
997 1.3 christos int n;
998 1.3 christos if (name[1] == 'd')
999 1.3 christos p = ".debug", n = 6;
1000 1.3 christos else if (name[1] == 'g' && name[2] == 'n')
1001 1.3 christos p = ".gnu.linkonce.wi.", n = 17;
1002 1.3 christos else if (name[1] == 'g' && name[2] == 'd')
1003 1.3 christos p = ".gdb_index", n = 11; /* yes we really do mean 11. */
1004 1.3 christos else if (name[1] == 'l')
1005 1.3 christos p = ".line", n = 5;
1006 1.3 christos else if (name[1] == 's')
1007 1.3 christos p = ".stab", n = 5;
1008 1.3 christos else if (name[1] == 'z')
1009 1.3 christos p = ".zdebug", n = 7;
1010 1.3 christos else
1011 1.3 christos p = NULL, n = 0;
1012 1.3 christos if (p != NULL && strncmp (name, p, n) == 0)
1013 1.1 christos flags |= SEC_DEBUGGING;
1014 1.1 christos }
1015 1.1 christos }
1016 1.1 christos
1017 1.1 christos /* As a GNU extension, if the name begins with .gnu.linkonce, we
1018 1.1 christos only link a single copy of the section. This is used to support
1019 1.1 christos g++. g++ will emit each template expansion in its own section.
1020 1.1 christos The symbols will be defined as weak, so that multiple definitions
1021 1.1 christos are permitted. The GNU linker extension is to actually discard
1022 1.1 christos all but one of the sections. */
1023 1.1 christos if (CONST_STRNEQ (name, ".gnu.linkonce")
1024 1.1 christos && elf_next_in_group (newsect) == NULL)
1025 1.1 christos flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
1026 1.1 christos
1027 1.1 christos bed = get_elf_backend_data (abfd);
1028 1.1 christos if (bed->elf_backend_section_flags)
1029 1.1 christos if (! bed->elf_backend_section_flags (&flags, hdr))
1030 1.1 christos return FALSE;
1031 1.1 christos
1032 1.1 christos if (! bfd_set_section_flags (abfd, newsect, flags))
1033 1.1 christos return FALSE;
1034 1.1 christos
1035 1.1 christos /* We do not parse the PT_NOTE segments as we are interested even in the
1036 1.1 christos separate debug info files which may have the segments offsets corrupted.
1037 1.1 christos PT_NOTEs from the core files are currently not parsed using BFD. */
1038 1.1 christos if (hdr->sh_type == SHT_NOTE)
1039 1.1 christos {
1040 1.1 christos bfd_byte *contents;
1041 1.1 christos
1042 1.1 christos if (!bfd_malloc_and_get_section (abfd, newsect, &contents))
1043 1.1 christos return FALSE;
1044 1.1 christos
1045 1.1 christos elf_parse_notes (abfd, (char *) contents, hdr->sh_size, -1);
1046 1.1 christos free (contents);
1047 1.1 christos }
1048 1.1 christos
1049 1.1 christos if ((flags & SEC_ALLOC) != 0)
1050 1.1 christos {
1051 1.1 christos Elf_Internal_Phdr *phdr;
1052 1.1 christos unsigned int i, nload;
1053 1.1 christos
1054 1.1 christos /* Some ELF linkers produce binaries with all the program header
1055 1.1 christos p_paddr fields zero. If we have such a binary with more than
1056 1.1 christos one PT_LOAD header, then leave the section lma equal to vma
1057 1.1 christos so that we don't create sections with overlapping lma. */
1058 1.1 christos phdr = elf_tdata (abfd)->phdr;
1059 1.1 christos for (nload = 0, i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
1060 1.1 christos if (phdr->p_paddr != 0)
1061 1.1 christos break;
1062 1.1 christos else if (phdr->p_type == PT_LOAD && phdr->p_memsz != 0)
1063 1.1 christos ++nload;
1064 1.1 christos if (i >= elf_elfheader (abfd)->e_phnum && nload > 1)
1065 1.1 christos return TRUE;
1066 1.1 christos
1067 1.1 christos phdr = elf_tdata (abfd)->phdr;
1068 1.1 christos for (i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
1069 1.1 christos {
1070 1.3 christos if (((phdr->p_type == PT_LOAD
1071 1.3 christos && (hdr->sh_flags & SHF_TLS) == 0)
1072 1.3 christos || phdr->p_type == PT_TLS)
1073 1.1 christos && ELF_SECTION_IN_SEGMENT (hdr, phdr))
1074 1.1 christos {
1075 1.1 christos if ((flags & SEC_LOAD) == 0)
1076 1.1 christos newsect->lma = (phdr->p_paddr
1077 1.1 christos + hdr->sh_addr - phdr->p_vaddr);
1078 1.1 christos else
1079 1.1 christos /* We used to use the same adjustment for SEC_LOAD
1080 1.1 christos sections, but that doesn't work if the segment
1081 1.1 christos is packed with code from multiple VMAs.
1082 1.1 christos Instead we calculate the section LMA based on
1083 1.1 christos the segment LMA. It is assumed that the
1084 1.1 christos segment will contain sections with contiguous
1085 1.1 christos LMAs, even if the VMAs are not. */
1086 1.1 christos newsect->lma = (phdr->p_paddr
1087 1.1 christos + hdr->sh_offset - phdr->p_offset);
1088 1.1 christos
1089 1.1 christos /* With contiguous segments, we can't tell from file
1090 1.1 christos offsets whether a section with zero size should
1091 1.1 christos be placed at the end of one segment or the
1092 1.1 christos beginning of the next. Decide based on vaddr. */
1093 1.1 christos if (hdr->sh_addr >= phdr->p_vaddr
1094 1.1 christos && (hdr->sh_addr + hdr->sh_size
1095 1.1 christos <= phdr->p_vaddr + phdr->p_memsz))
1096 1.1 christos break;
1097 1.1 christos }
1098 1.1 christos }
1099 1.1 christos }
1100 1.1 christos
1101 1.1 christos /* Compress/decompress DWARF debug sections with names: .debug_* and
1102 1.1 christos .zdebug_*, after the section flags is set. */
1103 1.1 christos if ((flags & SEC_DEBUGGING)
1104 1.1 christos && ((name[1] == 'd' && name[6] == '_')
1105 1.1 christos || (name[1] == 'z' && name[7] == '_')))
1106 1.1 christos {
1107 1.1 christos enum { nothing, compress, decompress } action = nothing;
1108 1.6 christos int compression_header_size;
1109 1.6 christos bfd_size_type uncompressed_size;
1110 1.6 christos bfd_boolean compressed
1111 1.6 christos = bfd_is_section_compressed_with_header (abfd, newsect,
1112 1.6 christos &compression_header_size,
1113 1.6 christos &uncompressed_size);
1114 1.1 christos
1115 1.6 christos if (compressed)
1116 1.1 christos {
1117 1.1 christos /* Compressed section. Check if we should decompress. */
1118 1.1 christos if ((abfd->flags & BFD_DECOMPRESS))
1119 1.1 christos action = decompress;
1120 1.1 christos }
1121 1.6 christos
1122 1.6 christos /* Compress the uncompressed section or convert from/to .zdebug*
1123 1.6 christos section. Check if we should compress. */
1124 1.6 christos if (action == nothing)
1125 1.6 christos {
1126 1.6 christos if (newsect->size != 0
1127 1.6 christos && (abfd->flags & BFD_COMPRESS)
1128 1.6 christos && compression_header_size >= 0
1129 1.6 christos && uncompressed_size > 0
1130 1.6 christos && (!compressed
1131 1.6 christos || ((compression_header_size > 0)
1132 1.6 christos != ((abfd->flags & BFD_COMPRESS_GABI) != 0))))
1133 1.1 christos action = compress;
1134 1.6 christos else
1135 1.6 christos return TRUE;
1136 1.1 christos }
1137 1.1 christos
1138 1.6 christos if (action == compress)
1139 1.1 christos {
1140 1.1 christos if (!bfd_init_section_compress_status (abfd, newsect))
1141 1.1 christos {
1142 1.1 christos (*_bfd_error_handler)
1143 1.3 christos (_("%B: unable to initialize compress status for section %s"),
1144 1.1 christos abfd, name);
1145 1.1 christos return FALSE;
1146 1.1 christos }
1147 1.6 christos }
1148 1.6 christos else
1149 1.6 christos {
1150 1.1 christos if (!bfd_init_section_decompress_status (abfd, newsect))
1151 1.1 christos {
1152 1.1 christos (*_bfd_error_handler)
1153 1.3 christos (_("%B: unable to initialize decompress status for section %s"),
1154 1.1 christos abfd, name);
1155 1.1 christos return FALSE;
1156 1.1 christos }
1157 1.6 christos }
1158 1.1 christos
1159 1.6 christos if (abfd->is_linker_input)
1160 1.6 christos {
1161 1.6 christos if (name[1] == 'z'
1162 1.6 christos && (action == decompress
1163 1.6 christos || (action == compress
1164 1.6 christos && (abfd->flags & BFD_COMPRESS_GABI) != 0)))
1165 1.6 christos {
1166 1.6 christos /* Convert section name from .zdebug_* to .debug_* so
1167 1.6 christos that linker will consider this section as a debug
1168 1.6 christos section. */
1169 1.6 christos char *new_name = convert_zdebug_to_debug (abfd, name);
1170 1.1 christos if (new_name == NULL)
1171 1.1 christos return FALSE;
1172 1.6 christos bfd_rename_section (abfd, newsect, new_name);
1173 1.1 christos }
1174 1.1 christos }
1175 1.6 christos else
1176 1.6 christos /* For objdump, don't rename the section. For objcopy, delay
1177 1.6 christos section rename to elf_fake_sections. */
1178 1.6 christos newsect->flags |= SEC_ELF_RENAME;
1179 1.1 christos }
1180 1.1 christos
1181 1.1 christos return TRUE;
1182 1.1 christos }
1183 1.1 christos
1184 1.8 christos const char *const bfd_elf_section_type_names[] =
1185 1.8 christos {
1186 1.1 christos "SHT_NULL", "SHT_PROGBITS", "SHT_SYMTAB", "SHT_STRTAB",
1187 1.1 christos "SHT_RELA", "SHT_HASH", "SHT_DYNAMIC", "SHT_NOTE",
1188 1.1 christos "SHT_NOBITS", "SHT_REL", "SHT_SHLIB", "SHT_DYNSYM",
1189 1.1 christos };
1190 1.1 christos
1191 1.1 christos /* ELF relocs are against symbols. If we are producing relocatable
1192 1.1 christos output, and the reloc is against an external symbol, and nothing
1193 1.1 christos has given us any additional addend, the resulting reloc will also
1194 1.1 christos be against the same symbol. In such a case, we don't want to
1195 1.1 christos change anything about the way the reloc is handled, since it will
1196 1.1 christos all be done at final link time. Rather than put special case code
1197 1.1 christos into bfd_perform_relocation, all the reloc types use this howto
1198 1.1 christos function. It just short circuits the reloc if producing
1199 1.1 christos relocatable output against an external symbol. */
1200 1.1 christos
1201 1.1 christos bfd_reloc_status_type
1202 1.1 christos bfd_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED,
1203 1.1 christos arelent *reloc_entry,
1204 1.1 christos asymbol *symbol,
1205 1.1 christos void *data ATTRIBUTE_UNUSED,
1206 1.1 christos asection *input_section,
1207 1.1 christos bfd *output_bfd,
1208 1.1 christos char **error_message ATTRIBUTE_UNUSED)
1209 1.1 christos {
1210 1.1 christos if (output_bfd != NULL
1211 1.1 christos && (symbol->flags & BSF_SECTION_SYM) == 0
1212 1.1 christos && (! reloc_entry->howto->partial_inplace
1213 1.1 christos || reloc_entry->addend == 0))
1214 1.1 christos {
1215 1.1 christos reloc_entry->address += input_section->output_offset;
1216 1.1 christos return bfd_reloc_ok;
1217 1.1 christos }
1218 1.1 christos
1219 1.1 christos return bfd_reloc_continue;
1220 1.1 christos }
1221 1.1 christos
1222 1.8 christos /* Returns TRUE if section A matches section B.
1224 1.8 christos Names, addresses and links may be different, but everything else
1225 1.8 christos should be the same. */
1226 1.8 christos
1227 1.8 christos static bfd_boolean
1228 1.8 christos section_match (const Elf_Internal_Shdr * a,
1229 1.8 christos const Elf_Internal_Shdr * b)
1230 1.8 christos {
1231 1.8 christos return
1232 1.8 christos a->sh_type == b->sh_type
1233 1.8 christos && (a->sh_flags & ~ SHF_INFO_LINK)
1234 1.8 christos == (b->sh_flags & ~ SHF_INFO_LINK)
1235 1.8 christos && a->sh_addralign == b->sh_addralign
1236 1.8 christos && a->sh_size == b->sh_size
1237 1.8 christos && a->sh_entsize == b->sh_entsize
1238 1.8 christos /* FIXME: Check sh_addr ? */
1239 1.8 christos ;
1240 1.8 christos }
1241 1.8 christos
1242 1.8 christos /* Find a section in OBFD that has the same characteristics
1243 1.8 christos as IHEADER. Return the index of this section or SHN_UNDEF if
1244 1.8 christos none can be found. Check's section HINT first, as this is likely
1245 1.8 christos to be the correct section. */
1246 1.8 christos
1247 1.8 christos static unsigned int
1248 1.8 christos find_link (const bfd * obfd, const Elf_Internal_Shdr * iheader, const unsigned int hint)
1249 1.8 christos {
1250 1.8 christos Elf_Internal_Shdr ** oheaders = elf_elfsections (obfd);
1251 1.8 christos unsigned int i;
1252 1.8 christos
1253 1.8 christos if (section_match (oheaders[hint], iheader))
1254 1.8 christos return hint;
1255 1.8 christos
1256 1.8 christos for (i = 1; i < elf_numsections (obfd); i++)
1257 1.8 christos {
1258 1.8 christos Elf_Internal_Shdr * oheader = oheaders[i];
1259 1.8 christos
1260 1.8 christos if (section_match (oheader, iheader))
1261 1.8 christos /* FIXME: Do we care if there is a potential for
1262 1.8 christos multiple matches ? */
1263 1.8 christos return i;
1264 1.8 christos }
1265 1.8 christos
1266 1.8 christos return SHN_UNDEF;
1267 1.8 christos }
1268 1.8 christos
1269 1.8 christos /* PR 19938: Attempt to set the ELF section header fields of an OS or
1270 1.8 christos Processor specific section, based upon a matching input section.
1271 1.8 christos Returns TRUE upon success, FALSE otherwise. */
1272 1.8 christos
1273 1.8 christos static bfd_boolean
1274 1.8 christos copy_special_section_fields (const bfd *ibfd,
1275 1.8 christos bfd *obfd,
1276 1.8 christos const Elf_Internal_Shdr *iheader,
1277 1.8 christos Elf_Internal_Shdr *oheader,
1278 1.8 christos const unsigned int secnum)
1279 1.8 christos {
1280 1.8 christos const struct elf_backend_data *bed = get_elf_backend_data (obfd);
1281 1.8 christos const Elf_Internal_Shdr **iheaders = (const Elf_Internal_Shdr **) elf_elfsections (ibfd);
1282 1.8 christos bfd_boolean changed = FALSE;
1283 1.8 christos unsigned int sh_link;
1284 1.8 christos
1285 1.8 christos if (oheader->sh_type == SHT_NOBITS)
1286 1.8 christos {
1287 1.8 christos /* This is a feature for objcopy --only-keep-debug:
1288 1.8 christos When a section's type is changed to NOBITS, we preserve
1289 1.8 christos the sh_link and sh_info fields so that they can be
1290 1.8 christos matched up with the original.
1291 1.8 christos
1292 1.8 christos Note: Strictly speaking these assignments are wrong.
1293 1.8 christos The sh_link and sh_info fields should point to the
1294 1.8 christos relevent sections in the output BFD, which may not be in
1295 1.8 christos the same location as they were in the input BFD. But
1296 1.8 christos the whole point of this action is to preserve the
1297 1.8 christos original values of the sh_link and sh_info fields, so
1298 1.8 christos that they can be matched up with the section headers in
1299 1.8 christos the original file. So strictly speaking we may be
1300 1.8 christos creating an invalid ELF file, but it is only for a file
1301 1.8 christos that just contains debug info and only for sections
1302 1.8 christos without any contents. */
1303 1.8 christos if (oheader->sh_link == 0)
1304 1.8 christos oheader->sh_link = iheader->sh_link;
1305 1.8 christos if (oheader->sh_info == 0)
1306 1.8 christos oheader->sh_info = iheader->sh_info;
1307 1.8 christos return TRUE;
1308 1.8 christos }
1309 1.8 christos
1310 1.8 christos /* Allow the target a chance to decide how these fields should be set. */
1311 1.8 christos if (bed->elf_backend_copy_special_section_fields != NULL
1312 1.8 christos && bed->elf_backend_copy_special_section_fields
1313 1.8 christos (ibfd, obfd, iheader, oheader))
1314 1.8 christos return TRUE;
1315 1.8 christos
1316 1.8 christos /* We have an iheader which might match oheader, and which has non-zero
1317 1.8 christos sh_info and/or sh_link fields. Attempt to follow those links and find
1318 1.8 christos the section in the output bfd which corresponds to the linked section
1319 1.8 christos in the input bfd. */
1320 1.8 christos if (iheader->sh_link != SHN_UNDEF)
1321 1.8 christos {
1322 1.8 christos sh_link = find_link (obfd, iheaders[iheader->sh_link], iheader->sh_link);
1323 1.8 christos if (sh_link != SHN_UNDEF)
1324 1.8 christos {
1325 1.8 christos oheader->sh_link = sh_link;
1326 1.8 christos changed = TRUE;
1327 1.8 christos }
1328 1.8 christos else
1329 1.8 christos /* FIXME: Should we install iheader->sh_link
1330 1.8 christos if we could not find a match ? */
1331 1.8 christos (* _bfd_error_handler)
1332 1.8 christos (_("%B: Failed to find link section for section %d"), obfd, secnum);
1333 1.8 christos }
1334 1.8 christos
1335 1.8 christos if (iheader->sh_info)
1336 1.8 christos {
1337 1.8 christos /* The sh_info field can hold arbitrary information, but if the
1338 1.8 christos SHF_LINK_INFO flag is set then it should be interpreted as a
1339 1.8 christos section index. */
1340 1.8 christos if (iheader->sh_flags & SHF_INFO_LINK)
1341 1.8 christos {
1342 1.8 christos sh_link = find_link (obfd, iheaders[iheader->sh_info],
1343 1.8 christos iheader->sh_info);
1344 1.8 christos if (sh_link != SHN_UNDEF)
1345 1.8 christos oheader->sh_flags |= SHF_INFO_LINK;
1346 1.8 christos }
1347 1.8 christos else
1348 1.8 christos /* No idea what it means - just copy it. */
1349 1.8 christos sh_link = iheader->sh_info;
1350 1.8 christos
1351 1.8 christos if (sh_link != SHN_UNDEF)
1352 1.8 christos {
1353 1.8 christos oheader->sh_info = sh_link;
1354 1.8 christos changed = TRUE;
1355 1.8 christos }
1356 1.8 christos else
1357 1.8 christos (* _bfd_error_handler)
1358 1.8 christos (_("%B: Failed to find info section for section %d"), obfd, secnum);
1359 1.8 christos }
1360 1.8 christos
1361 1.8 christos return changed;
1362 1.8 christos }
1363 1.1 christos
1364 1.1 christos /* Copy the program header and other data from one object module to
1365 1.1 christos another. */
1366 1.1 christos
1367 1.1 christos bfd_boolean
1368 1.1 christos _bfd_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
1369 1.8 christos {
1370 1.8 christos const Elf_Internal_Shdr **iheaders = (const Elf_Internal_Shdr **) elf_elfsections (ibfd);
1371 1.8 christos Elf_Internal_Shdr **oheaders = elf_elfsections (obfd);
1372 1.8 christos const struct elf_backend_data *bed;
1373 1.8 christos unsigned int i;
1374 1.1 christos
1375 1.8 christos if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1376 1.1 christos || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1377 1.1 christos return TRUE;
1378 1.4 christos
1379 1.4 christos if (!elf_flags_init (obfd))
1380 1.4 christos {
1381 1.4 christos elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
1382 1.4 christos elf_flags_init (obfd) = TRUE;
1383 1.1 christos }
1384 1.1 christos
1385 1.4 christos elf_gp (obfd) = elf_gp (ibfd);
1386 1.4 christos
1387 1.4 christos /* Also copy the EI_OSABI field. */
1388 1.4 christos elf_elfheader (obfd)->e_ident[EI_OSABI] =
1389 1.1 christos elf_elfheader (ibfd)->e_ident[EI_OSABI];
1390 1.8 christos
1391 1.8 christos /* If set, copy the EI_ABIVERSION field. */
1392 1.8 christos if (elf_elfheader (ibfd)->e_ident[EI_ABIVERSION])
1393 1.8 christos elf_elfheader (obfd)->e_ident[EI_ABIVERSION]
1394 1.8 christos = elf_elfheader (ibfd)->e_ident[EI_ABIVERSION];
1395 1.1 christos
1396 1.1 christos /* Copy object attributes. */
1397 1.8 christos _bfd_elf_copy_obj_attributes (ibfd, obfd);
1398 1.8 christos
1399 1.8 christos if (iheaders == NULL || oheaders == NULL)
1400 1.8 christos return TRUE;
1401 1.8 christos
1402 1.8 christos bed = get_elf_backend_data (obfd);
1403 1.8 christos
1404 1.8 christos /* Possibly copy other fields in the section header. */
1405 1.8 christos for (i = 1; i < elf_numsections (obfd); i++)
1406 1.8 christos {
1407 1.8 christos unsigned int j;
1408 1.8 christos Elf_Internal_Shdr * oheader = oheaders[i];
1409 1.8 christos
1410 1.8 christos /* Ignore ordinary sections. SHT_NOBITS sections are considered however
1411 1.8 christos because of a special case need for generating separate debug info
1412 1.8 christos files. See below for more details. */
1413 1.8 christos if (oheader == NULL
1414 1.8 christos || (oheader->sh_type != SHT_NOBITS
1415 1.8 christos && oheader->sh_type < SHT_LOOS))
1416 1.8 christos continue;
1417 1.8 christos
1418 1.8 christos /* Ignore empty sections, and sections whose
1419 1.8 christos fields have already been initialised. */
1420 1.8 christos if (oheader->sh_size == 0
1421 1.8 christos || (oheader->sh_info != 0 && oheader->sh_link != 0))
1422 1.8 christos continue;
1423 1.8 christos
1424 1.8 christos /* Scan for the matching section in the input bfd.
1425 1.8 christos First we try for a direct mapping between the input and output sections. */
1426 1.8 christos for (j = 1; j < elf_numsections (ibfd); j++)
1427 1.8 christos {
1428 1.8 christos const Elf_Internal_Shdr * iheader = iheaders[j];
1429 1.8 christos
1430 1.8 christos if (iheader == NULL)
1431 1.8 christos continue;
1432 1.8 christos
1433 1.8 christos if (oheader->bfd_section != NULL
1434 1.8 christos && iheader->bfd_section != NULL
1435 1.8 christos && iheader->bfd_section->output_section != NULL
1436 1.8 christos && iheader->bfd_section->output_section == oheader->bfd_section)
1437 1.8 christos {
1438 1.8 christos /* We have found a connection from the input section to the
1439 1.8 christos output section. Attempt to copy the header fields. If
1440 1.8 christos this fails then do not try any further sections - there
1441 1.8 christos should only be a one-to-one mapping between input and output. */
1442 1.8 christos if (! copy_special_section_fields (ibfd, obfd, iheader, oheader, i))
1443 1.8 christos j = elf_numsections (ibfd);
1444 1.8 christos break;
1445 1.8 christos }
1446 1.8 christos }
1447 1.8 christos
1448 1.8 christos if (j < elf_numsections (ibfd))
1449 1.8 christos continue;
1450 1.8 christos
1451 1.8 christos /* That failed. So try to deduce the corresponding input section.
1452 1.8 christos Unfortunately we cannot compare names as the output string table
1453 1.8 christos is empty, so instead we check size, address and type. */
1454 1.8 christos for (j = 1; j < elf_numsections (ibfd); j++)
1455 1.8 christos {
1456 1.8 christos const Elf_Internal_Shdr * iheader = iheaders[j];
1457 1.8 christos
1458 1.8 christos if (iheader == NULL)
1459 1.8 christos continue;
1460 1.8 christos
1461 1.8 christos /* Try matching fields in the input section's header.
1462 1.8 christos Since --only-keep-debug turns all non-debug sections into
1463 1.8 christos SHT_NOBITS sections, the output SHT_NOBITS type matches any
1464 1.8 christos input type. */
1465 1.8 christos if ((oheader->sh_type == SHT_NOBITS
1466 1.8 christos || iheader->sh_type == oheader->sh_type)
1467 1.8 christos && (iheader->sh_flags & ~ SHF_INFO_LINK)
1468 1.8 christos == (oheader->sh_flags & ~ SHF_INFO_LINK)
1469 1.8 christos && iheader->sh_addralign == oheader->sh_addralign
1470 1.8 christos && iheader->sh_entsize == oheader->sh_entsize
1471 1.8 christos && iheader->sh_size == oheader->sh_size
1472 1.8 christos && iheader->sh_addr == oheader->sh_addr
1473 1.8 christos && (iheader->sh_info != oheader->sh_info
1474 1.8 christos || iheader->sh_link != oheader->sh_link))
1475 1.8 christos {
1476 1.8 christos if (copy_special_section_fields (ibfd, obfd, iheader, oheader, i))
1477 1.8 christos break;
1478 1.8 christos }
1479 1.8 christos }
1480 1.8 christos
1481 1.8 christos if (j == elf_numsections (ibfd) && oheader->sh_type >= SHT_LOOS)
1482 1.8 christos {
1483 1.8 christos /* Final attempt. Call the backend copy function
1484 1.8 christos with a NULL input section. */
1485 1.8 christos if (bed->elf_backend_copy_special_section_fields != NULL)
1486 1.8 christos bed->elf_backend_copy_special_section_fields (ibfd, obfd, NULL, oheader);
1487 1.8 christos }
1488 1.8 christos }
1489 1.1 christos
1490 1.1 christos return TRUE;
1491 1.1 christos }
1492 1.1 christos
1493 1.1 christos static const char *
1494 1.1 christos get_segment_type (unsigned int p_type)
1495 1.1 christos {
1496 1.1 christos const char *pt;
1497 1.1 christos switch (p_type)
1498 1.1 christos {
1499 1.1 christos case PT_NULL: pt = "NULL"; break;
1500 1.1 christos case PT_LOAD: pt = "LOAD"; break;
1501 1.1 christos case PT_DYNAMIC: pt = "DYNAMIC"; break;
1502 1.1 christos case PT_INTERP: pt = "INTERP"; break;
1503 1.1 christos case PT_NOTE: pt = "NOTE"; break;
1504 1.1 christos case PT_SHLIB: pt = "SHLIB"; break;
1505 1.1 christos case PT_PHDR: pt = "PHDR"; break;
1506 1.1 christos case PT_TLS: pt = "TLS"; break;
1507 1.1 christos case PT_GNU_EH_FRAME: pt = "EH_FRAME"; break;
1508 1.1 christos case PT_GNU_STACK: pt = "STACK"; break;
1509 1.1 christos case PT_GNU_RELRO: pt = "RELRO"; break;
1510 1.1 christos default: pt = NULL; break;
1511 1.1 christos }
1512 1.1 christos return pt;
1513 1.1 christos }
1514 1.1 christos
1515 1.1 christos /* Print out the program headers. */
1516 1.1 christos
1517 1.1 christos bfd_boolean
1518 1.1 christos _bfd_elf_print_private_bfd_data (bfd *abfd, void *farg)
1519 1.1 christos {
1520 1.1 christos FILE *f = (FILE *) farg;
1521 1.1 christos Elf_Internal_Phdr *p;
1522 1.1 christos asection *s;
1523 1.1 christos bfd_byte *dynbuf = NULL;
1524 1.1 christos
1525 1.1 christos p = elf_tdata (abfd)->phdr;
1526 1.1 christos if (p != NULL)
1527 1.1 christos {
1528 1.1 christos unsigned int i, c;
1529 1.1 christos
1530 1.1 christos fprintf (f, _("\nProgram Header:\n"));
1531 1.1 christos c = elf_elfheader (abfd)->e_phnum;
1532 1.1 christos for (i = 0; i < c; i++, p++)
1533 1.1 christos {
1534 1.1 christos const char *pt = get_segment_type (p->p_type);
1535 1.1 christos char buf[20];
1536 1.1 christos
1537 1.1 christos if (pt == NULL)
1538 1.1 christos {
1539 1.1 christos sprintf (buf, "0x%lx", p->p_type);
1540 1.1 christos pt = buf;
1541 1.1 christos }
1542 1.1 christos fprintf (f, "%8s off 0x", pt);
1543 1.1 christos bfd_fprintf_vma (abfd, f, p->p_offset);
1544 1.1 christos fprintf (f, " vaddr 0x");
1545 1.1 christos bfd_fprintf_vma (abfd, f, p->p_vaddr);
1546 1.1 christos fprintf (f, " paddr 0x");
1547 1.1 christos bfd_fprintf_vma (abfd, f, p->p_paddr);
1548 1.1 christos fprintf (f, " align 2**%u\n", bfd_log2 (p->p_align));
1549 1.1 christos fprintf (f, " filesz 0x");
1550 1.1 christos bfd_fprintf_vma (abfd, f, p->p_filesz);
1551 1.1 christos fprintf (f, " memsz 0x");
1552 1.1 christos bfd_fprintf_vma (abfd, f, p->p_memsz);
1553 1.1 christos fprintf (f, " flags %c%c%c",
1554 1.1 christos (p->p_flags & PF_R) != 0 ? 'r' : '-',
1555 1.1 christos (p->p_flags & PF_W) != 0 ? 'w' : '-',
1556 1.1 christos (p->p_flags & PF_X) != 0 ? 'x' : '-');
1557 1.1 christos if ((p->p_flags &~ (unsigned) (PF_R | PF_W | PF_X)) != 0)
1558 1.1 christos fprintf (f, " %lx", p->p_flags &~ (unsigned) (PF_R | PF_W | PF_X));
1559 1.1 christos fprintf (f, "\n");
1560 1.1 christos }
1561 1.1 christos }
1562 1.1 christos
1563 1.1 christos s = bfd_get_section_by_name (abfd, ".dynamic");
1564 1.1 christos if (s != NULL)
1565 1.1 christos {
1566 1.1 christos unsigned int elfsec;
1567 1.1 christos unsigned long shlink;
1568 1.1 christos bfd_byte *extdyn, *extdynend;
1569 1.1 christos size_t extdynsize;
1570 1.1 christos void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
1571 1.1 christos
1572 1.1 christos fprintf (f, _("\nDynamic Section:\n"));
1573 1.1 christos
1574 1.1 christos if (!bfd_malloc_and_get_section (abfd, s, &dynbuf))
1575 1.1 christos goto error_return;
1576 1.1 christos
1577 1.1 christos elfsec = _bfd_elf_section_from_bfd_section (abfd, s);
1578 1.1 christos if (elfsec == SHN_BAD)
1579 1.1 christos goto error_return;
1580 1.1 christos shlink = elf_elfsections (abfd)[elfsec]->sh_link;
1581 1.1 christos
1582 1.1 christos extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
1583 1.1 christos swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
1584 1.1 christos
1585 1.5 christos extdyn = dynbuf;
1586 1.5 christos /* PR 17512: file: 6f427532. */
1587 1.5 christos if (s->size < extdynsize)
1588 1.1 christos goto error_return;
1589 1.5 christos extdynend = extdyn + s->size;
1590 1.5 christos /* PR 17512: file: id:000006,sig:06,src:000000,op:flip4,pos:5664.
1591 1.5 christos Fix range check. */
1592 1.1 christos for (; extdyn <= (extdynend - extdynsize); extdyn += extdynsize)
1593 1.1 christos {
1594 1.1 christos Elf_Internal_Dyn dyn;
1595 1.1 christos const char *name = "";
1596 1.1 christos char ab[20];
1597 1.1 christos bfd_boolean stringp;
1598 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
1599 1.1 christos
1600 1.1 christos (*swap_dyn_in) (abfd, extdyn, &dyn);
1601 1.1 christos
1602 1.1 christos if (dyn.d_tag == DT_NULL)
1603 1.1 christos break;
1604 1.1 christos
1605 1.1 christos stringp = FALSE;
1606 1.1 christos switch (dyn.d_tag)
1607 1.1 christos {
1608 1.1 christos default:
1609 1.1 christos if (bed->elf_backend_get_target_dtag)
1610 1.1 christos name = (*bed->elf_backend_get_target_dtag) (dyn.d_tag);
1611 1.1 christos
1612 1.1 christos if (!strcmp (name, ""))
1613 1.1 christos {
1614 1.1 christos sprintf (ab, "0x%lx", (unsigned long) dyn.d_tag);
1615 1.1 christos name = ab;
1616 1.1 christos }
1617 1.1 christos break;
1618 1.1 christos
1619 1.1 christos case DT_NEEDED: name = "NEEDED"; stringp = TRUE; break;
1620 1.1 christos case DT_PLTRELSZ: name = "PLTRELSZ"; break;
1621 1.1 christos case DT_PLTGOT: name = "PLTGOT"; break;
1622 1.1 christos case DT_HASH: name = "HASH"; break;
1623 1.1 christos case DT_STRTAB: name = "STRTAB"; break;
1624 1.1 christos case DT_SYMTAB: name = "SYMTAB"; break;
1625 1.1 christos case DT_RELA: name = "RELA"; break;
1626 1.1 christos case DT_RELASZ: name = "RELASZ"; break;
1627 1.1 christos case DT_RELAENT: name = "RELAENT"; break;
1628 1.1 christos case DT_STRSZ: name = "STRSZ"; break;
1629 1.1 christos case DT_SYMENT: name = "SYMENT"; break;
1630 1.1 christos case DT_INIT: name = "INIT"; break;
1631 1.1 christos case DT_FINI: name = "FINI"; break;
1632 1.1 christos case DT_SONAME: name = "SONAME"; stringp = TRUE; break;
1633 1.1 christos case DT_RPATH: name = "RPATH"; stringp = TRUE; break;
1634 1.1 christos case DT_SYMBOLIC: name = "SYMBOLIC"; break;
1635 1.1 christos case DT_REL: name = "REL"; break;
1636 1.1 christos case DT_RELSZ: name = "RELSZ"; break;
1637 1.1 christos case DT_RELENT: name = "RELENT"; break;
1638 1.1 christos case DT_PLTREL: name = "PLTREL"; break;
1639 1.1 christos case DT_DEBUG: name = "DEBUG"; break;
1640 1.1 christos case DT_TEXTREL: name = "TEXTREL"; break;
1641 1.1 christos case DT_JMPREL: name = "JMPREL"; break;
1642 1.1 christos case DT_BIND_NOW: name = "BIND_NOW"; break;
1643 1.1 christos case DT_INIT_ARRAY: name = "INIT_ARRAY"; break;
1644 1.1 christos case DT_FINI_ARRAY: name = "FINI_ARRAY"; break;
1645 1.1 christos case DT_INIT_ARRAYSZ: name = "INIT_ARRAYSZ"; break;
1646 1.1 christos case DT_FINI_ARRAYSZ: name = "FINI_ARRAYSZ"; break;
1647 1.1 christos case DT_RUNPATH: name = "RUNPATH"; stringp = TRUE; break;
1648 1.1 christos case DT_FLAGS: name = "FLAGS"; break;
1649 1.1 christos case DT_PREINIT_ARRAY: name = "PREINIT_ARRAY"; break;
1650 1.1 christos case DT_PREINIT_ARRAYSZ: name = "PREINIT_ARRAYSZ"; break;
1651 1.1 christos case DT_CHECKSUM: name = "CHECKSUM"; break;
1652 1.1 christos case DT_PLTPADSZ: name = "PLTPADSZ"; break;
1653 1.1 christos case DT_MOVEENT: name = "MOVEENT"; break;
1654 1.1 christos case DT_MOVESZ: name = "MOVESZ"; break;
1655 1.1 christos case DT_FEATURE: name = "FEATURE"; break;
1656 1.1 christos case DT_POSFLAG_1: name = "POSFLAG_1"; break;
1657 1.1 christos case DT_SYMINSZ: name = "SYMINSZ"; break;
1658 1.1 christos case DT_SYMINENT: name = "SYMINENT"; break;
1659 1.1 christos case DT_CONFIG: name = "CONFIG"; stringp = TRUE; break;
1660 1.1 christos case DT_DEPAUDIT: name = "DEPAUDIT"; stringp = TRUE; break;
1661 1.1 christos case DT_AUDIT: name = "AUDIT"; stringp = TRUE; break;
1662 1.1 christos case DT_PLTPAD: name = "PLTPAD"; break;
1663 1.1 christos case DT_MOVETAB: name = "MOVETAB"; break;
1664 1.1 christos case DT_SYMINFO: name = "SYMINFO"; break;
1665 1.1 christos case DT_RELACOUNT: name = "RELACOUNT"; break;
1666 1.1 christos case DT_RELCOUNT: name = "RELCOUNT"; break;
1667 1.1 christos case DT_FLAGS_1: name = "FLAGS_1"; break;
1668 1.1 christos case DT_VERSYM: name = "VERSYM"; break;
1669 1.1 christos case DT_VERDEF: name = "VERDEF"; break;
1670 1.1 christos case DT_VERDEFNUM: name = "VERDEFNUM"; break;
1671 1.1 christos case DT_VERNEED: name = "VERNEED"; break;
1672 1.1 christos case DT_VERNEEDNUM: name = "VERNEEDNUM"; break;
1673 1.1 christos case DT_AUXILIARY: name = "AUXILIARY"; stringp = TRUE; break;
1674 1.1 christos case DT_USED: name = "USED"; break;
1675 1.1 christos case DT_FILTER: name = "FILTER"; stringp = TRUE; break;
1676 1.1 christos case DT_GNU_HASH: name = "GNU_HASH"; break;
1677 1.1 christos }
1678 1.1 christos
1679 1.1 christos fprintf (f, " %-20s ", name);
1680 1.1 christos if (! stringp)
1681 1.1 christos {
1682 1.1 christos fprintf (f, "0x");
1683 1.1 christos bfd_fprintf_vma (abfd, f, dyn.d_un.d_val);
1684 1.1 christos }
1685 1.1 christos else
1686 1.1 christos {
1687 1.1 christos const char *string;
1688 1.1 christos unsigned int tagv = dyn.d_un.d_val;
1689 1.1 christos
1690 1.1 christos string = bfd_elf_string_from_elf_section (abfd, shlink, tagv);
1691 1.1 christos if (string == NULL)
1692 1.1 christos goto error_return;
1693 1.1 christos fprintf (f, "%s", string);
1694 1.1 christos }
1695 1.1 christos fprintf (f, "\n");
1696 1.1 christos }
1697 1.1 christos
1698 1.1 christos free (dynbuf);
1699 1.1 christos dynbuf = NULL;
1700 1.1 christos }
1701 1.1 christos
1702 1.1 christos if ((elf_dynverdef (abfd) != 0 && elf_tdata (abfd)->verdef == NULL)
1703 1.1 christos || (elf_dynverref (abfd) != 0 && elf_tdata (abfd)->verref == NULL))
1704 1.1 christos {
1705 1.1 christos if (! _bfd_elf_slurp_version_tables (abfd, FALSE))
1706 1.1 christos return FALSE;
1707 1.1 christos }
1708 1.1 christos
1709 1.1 christos if (elf_dynverdef (abfd) != 0)
1710 1.1 christos {
1711 1.1 christos Elf_Internal_Verdef *t;
1712 1.1 christos
1713 1.1 christos fprintf (f, _("\nVersion definitions:\n"));
1714 1.1 christos for (t = elf_tdata (abfd)->verdef; t != NULL; t = t->vd_nextdef)
1715 1.1 christos {
1716 1.1 christos fprintf (f, "%d 0x%2.2x 0x%8.8lx %s\n", t->vd_ndx,
1717 1.1 christos t->vd_flags, t->vd_hash,
1718 1.1 christos t->vd_nodename ? t->vd_nodename : "<corrupt>");
1719 1.1 christos if (t->vd_auxptr != NULL && t->vd_auxptr->vda_nextptr != NULL)
1720 1.1 christos {
1721 1.1 christos Elf_Internal_Verdaux *a;
1722 1.1 christos
1723 1.1 christos fprintf (f, "\t");
1724 1.1 christos for (a = t->vd_auxptr->vda_nextptr;
1725 1.1 christos a != NULL;
1726 1.1 christos a = a->vda_nextptr)
1727 1.1 christos fprintf (f, "%s ",
1728 1.1 christos a->vda_nodename ? a->vda_nodename : "<corrupt>");
1729 1.1 christos fprintf (f, "\n");
1730 1.1 christos }
1731 1.1 christos }
1732 1.1 christos }
1733 1.1 christos
1734 1.1 christos if (elf_dynverref (abfd) != 0)
1735 1.1 christos {
1736 1.1 christos Elf_Internal_Verneed *t;
1737 1.1 christos
1738 1.1 christos fprintf (f, _("\nVersion References:\n"));
1739 1.1 christos for (t = elf_tdata (abfd)->verref; t != NULL; t = t->vn_nextref)
1740 1.1 christos {
1741 1.1 christos Elf_Internal_Vernaux *a;
1742 1.1 christos
1743 1.1 christos fprintf (f, _(" required from %s:\n"),
1744 1.1 christos t->vn_filename ? t->vn_filename : "<corrupt>");
1745 1.1 christos for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr)
1746 1.1 christos fprintf (f, " 0x%8.8lx 0x%2.2x %2.2d %s\n", a->vna_hash,
1747 1.1 christos a->vna_flags, a->vna_other,
1748 1.1 christos a->vna_nodename ? a->vna_nodename : "<corrupt>");
1749 1.1 christos }
1750 1.1 christos }
1751 1.1 christos
1752 1.1 christos return TRUE;
1753 1.1 christos
1754 1.1 christos error_return:
1755 1.1 christos if (dynbuf != NULL)
1756 1.1 christos free (dynbuf);
1757 1.1 christos return FALSE;
1758 1.1 christos }
1759 1.5 christos
1760 1.5 christos /* Get version string. */
1761 1.5 christos
1762 1.5 christos const char *
1763 1.5 christos _bfd_elf_get_symbol_version_string (bfd *abfd, asymbol *symbol,
1764 1.5 christos bfd_boolean *hidden)
1765 1.5 christos {
1766 1.5 christos const char *version_string = NULL;
1767 1.5 christos if (elf_dynversym (abfd) != 0
1768 1.5 christos && (elf_dynverdef (abfd) != 0 || elf_dynverref (abfd) != 0))
1769 1.5 christos {
1770 1.5 christos unsigned int vernum = ((elf_symbol_type *) symbol)->version;
1771 1.5 christos
1772 1.5 christos *hidden = (vernum & VERSYM_HIDDEN) != 0;
1773 1.5 christos vernum &= VERSYM_VERSION;
1774 1.5 christos
1775 1.5 christos if (vernum == 0)
1776 1.5 christos version_string = "";
1777 1.5 christos else if (vernum == 1)
1778 1.5 christos version_string = "Base";
1779 1.5 christos else if (vernum <= elf_tdata (abfd)->cverdefs)
1780 1.5 christos version_string =
1781 1.5 christos elf_tdata (abfd)->verdef[vernum - 1].vd_nodename;
1782 1.5 christos else
1783 1.5 christos {
1784 1.5 christos Elf_Internal_Verneed *t;
1785 1.5 christos
1786 1.5 christos version_string = "";
1787 1.5 christos for (t = elf_tdata (abfd)->verref;
1788 1.5 christos t != NULL;
1789 1.5 christos t = t->vn_nextref)
1790 1.5 christos {
1791 1.5 christos Elf_Internal_Vernaux *a;
1792 1.5 christos
1793 1.5 christos for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr)
1794 1.5 christos {
1795 1.5 christos if (a->vna_other == vernum)
1796 1.5 christos {
1797 1.5 christos version_string = a->vna_nodename;
1798 1.5 christos break;
1799 1.5 christos }
1800 1.5 christos }
1801 1.5 christos }
1802 1.5 christos }
1803 1.5 christos }
1804 1.5 christos return version_string;
1805 1.5 christos }
1806 1.1 christos
1807 1.1 christos /* Display ELF-specific fields of a symbol. */
1808 1.1 christos
1809 1.1 christos void
1810 1.1 christos bfd_elf_print_symbol (bfd *abfd,
1811 1.1 christos void *filep,
1812 1.1 christos asymbol *symbol,
1813 1.1 christos bfd_print_symbol_type how)
1814 1.1 christos {
1815 1.1 christos FILE *file = (FILE *) filep;
1816 1.1 christos switch (how)
1817 1.1 christos {
1818 1.1 christos case bfd_print_symbol_name:
1819 1.1 christos fprintf (file, "%s", symbol->name);
1820 1.1 christos break;
1821 1.1 christos case bfd_print_symbol_more:
1822 1.1 christos fprintf (file, "elf ");
1823 1.1 christos bfd_fprintf_vma (abfd, file, symbol->value);
1824 1.1 christos fprintf (file, " %lx", (unsigned long) symbol->flags);
1825 1.1 christos break;
1826 1.1 christos case bfd_print_symbol_all:
1827 1.1 christos {
1828 1.1 christos const char *section_name;
1829 1.1 christos const char *name = NULL;
1830 1.1 christos const struct elf_backend_data *bed;
1831 1.1 christos unsigned char st_other;
1832 1.5 christos bfd_vma val;
1833 1.5 christos const char *version_string;
1834 1.1 christos bfd_boolean hidden;
1835 1.1 christos
1836 1.1 christos section_name = symbol->section ? symbol->section->name : "(*none*)";
1837 1.1 christos
1838 1.1 christos bed = get_elf_backend_data (abfd);
1839 1.1 christos if (bed->elf_backend_print_symbol_all)
1840 1.1 christos name = (*bed->elf_backend_print_symbol_all) (abfd, filep, symbol);
1841 1.1 christos
1842 1.1 christos if (name == NULL)
1843 1.1 christos {
1844 1.1 christos name = symbol->name;
1845 1.1 christos bfd_print_symbol_vandf (abfd, file, symbol);
1846 1.1 christos }
1847 1.1 christos
1848 1.1 christos fprintf (file, " %s\t", section_name);
1849 1.1 christos /* Print the "other" value for a symbol. For common symbols,
1850 1.1 christos we've already printed the size; now print the alignment.
1851 1.1 christos For other symbols, we have no specified alignment, and
1852 1.1 christos we've printed the address; now print the size. */
1853 1.1 christos if (symbol->section && bfd_is_com_section (symbol->section))
1854 1.1 christos val = ((elf_symbol_type *) symbol)->internal_elf_sym.st_value;
1855 1.1 christos else
1856 1.1 christos val = ((elf_symbol_type *) symbol)->internal_elf_sym.st_size;
1857 1.1 christos bfd_fprintf_vma (abfd, file, val);
1858 1.1 christos
1859 1.5 christos /* If we have version information, print it. */
1860 1.5 christos version_string = _bfd_elf_get_symbol_version_string (abfd,
1861 1.5 christos symbol,
1862 1.5 christos &hidden);
1863 1.1 christos if (version_string)
1864 1.5 christos {
1865 1.1 christos if (!hidden)
1866 1.1 christos fprintf (file, " %-11s", version_string);
1867 1.1 christos else
1868 1.1 christos {
1869 1.1 christos int i;
1870 1.1 christos
1871 1.1 christos fprintf (file, " (%s)", version_string);
1872 1.1 christos for (i = 10 - strlen (version_string); i > 0; --i)
1873 1.1 christos putc (' ', file);
1874 1.1 christos }
1875 1.1 christos }
1876 1.1 christos
1877 1.1 christos /* If the st_other field is not zero, print it. */
1878 1.1 christos st_other = ((elf_symbol_type *) symbol)->internal_elf_sym.st_other;
1879 1.1 christos
1880 1.1 christos switch (st_other)
1881 1.1 christos {
1882 1.1 christos case 0: break;
1883 1.1 christos case STV_INTERNAL: fprintf (file, " .internal"); break;
1884 1.1 christos case STV_HIDDEN: fprintf (file, " .hidden"); break;
1885 1.1 christos case STV_PROTECTED: fprintf (file, " .protected"); break;
1886 1.1 christos default:
1887 1.1 christos /* Some other non-defined flags are also present, so print
1888 1.1 christos everything hex. */
1889 1.1 christos fprintf (file, " 0x%02x", (unsigned int) st_other);
1890 1.1 christos }
1891 1.1 christos
1892 1.1 christos fprintf (file, " %s", name);
1893 1.1 christos }
1894 1.1 christos break;
1895 1.1 christos }
1896 1.1 christos }
1897 1.1 christos
1898 1.1 christos /* ELF .o/exec file reading */
1900 1.1 christos
1901 1.1 christos /* Create a new bfd section from an ELF section header. */
1902 1.1 christos
1903 1.1 christos bfd_boolean
1904 1.1 christos bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
1905 1.1 christos {
1906 1.1 christos Elf_Internal_Shdr *hdr;
1907 1.1 christos Elf_Internal_Ehdr *ehdr;
1908 1.5 christos const struct elf_backend_data *bed;
1909 1.5 christos const char *name;
1910 1.5 christos bfd_boolean ret = TRUE;
1911 1.5 christos static bfd_boolean * sections_being_created = NULL;
1912 1.1 christos static bfd * sections_being_created_abfd = NULL;
1913 1.1 christos static unsigned int nesting = 0;
1914 1.1 christos
1915 1.1 christos if (shindex >= elf_numsections (abfd))
1916 1.5 christos return FALSE;
1917 1.5 christos
1918 1.5 christos if (++ nesting > 3)
1919 1.5 christos {
1920 1.5 christos /* PR17512: A corrupt ELF binary might contain a recursive group of
1921 1.5 christos sections, with each the string indicies pointing to the next in the
1922 1.5 christos loop. Detect this here, by refusing to load a section that we are
1923 1.5 christos already in the process of loading. We only trigger this test if
1924 1.5 christos we have nested at least three sections deep as normal ELF binaries
1925 1.5 christos can expect to recurse at least once.
1926 1.5 christos
1927 1.5 christos FIXME: It would be better if this array was attached to the bfd,
1928 1.5 christos rather than being held in a static pointer. */
1929 1.5 christos
1930 1.5 christos if (sections_being_created_abfd != abfd)
1931 1.5 christos sections_being_created = NULL;
1932 1.5 christos if (sections_being_created == NULL)
1933 1.5 christos {
1934 1.5 christos /* FIXME: It would be more efficient to attach this array to the bfd somehow. */
1935 1.5 christos sections_being_created = (bfd_boolean *)
1936 1.5 christos bfd_zalloc (abfd, elf_numsections (abfd) * sizeof (bfd_boolean));
1937 1.5 christos sections_being_created_abfd = abfd;
1938 1.5 christos }
1939 1.5 christos if (sections_being_created [shindex])
1940 1.5 christos {
1941 1.5 christos (*_bfd_error_handler)
1942 1.5 christos (_("%B: warning: loop in section dependencies detected"), abfd);
1943 1.5 christos return FALSE;
1944 1.5 christos }
1945 1.5 christos sections_being_created [shindex] = TRUE;
1946 1.1 christos }
1947 1.1 christos
1948 1.1 christos hdr = elf_elfsections (abfd)[shindex];
1949 1.1 christos ehdr = elf_elfheader (abfd);
1950 1.1 christos name = bfd_elf_string_from_elf_section (abfd, ehdr->e_shstrndx,
1951 1.5 christos hdr->sh_name);
1952 1.1 christos if (name == NULL)
1953 1.1 christos goto fail;
1954 1.1 christos
1955 1.1 christos bed = get_elf_backend_data (abfd);
1956 1.1 christos switch (hdr->sh_type)
1957 1.1 christos {
1958 1.5 christos case SHT_NULL:
1959 1.1 christos /* Inactive section. Throw it away. */
1960 1.5 christos goto success;
1961 1.5 christos
1962 1.5 christos case SHT_PROGBITS: /* Normal section with contents. */
1963 1.5 christos case SHT_NOBITS: /* .bss section. */
1964 1.1 christos case SHT_HASH: /* .hash section. */
1965 1.1 christos case SHT_NOTE: /* .note section. */
1966 1.1 christos case SHT_INIT_ARRAY: /* .init_array section. */
1967 1.1 christos case SHT_FINI_ARRAY: /* .fini_array section. */
1968 1.1 christos case SHT_PREINIT_ARRAY: /* .preinit_array section. */
1969 1.5 christos case SHT_GNU_LIBLIST: /* .gnu.liblist section. */
1970 1.5 christos case SHT_GNU_HASH: /* .gnu.hash section. */
1971 1.1 christos ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
1972 1.1 christos goto success;
1973 1.1 christos
1974 1.5 christos case SHT_DYNAMIC: /* Dynamic linking information. */
1975 1.5 christos if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
1976 1.1 christos goto fail;
1977 1.1 christos
1978 1.1 christos if (hdr->sh_link > elf_numsections (abfd))
1979 1.1 christos {
1980 1.1 christos /* PR 10478: Accept Solaris binaries with a sh_link
1981 1.1 christos field set to SHN_BEFORE or SHN_AFTER. */
1982 1.1 christos switch (bfd_get_arch (abfd))
1983 1.1 christos {
1984 1.1 christos case bfd_arch_i386:
1985 1.1 christos case bfd_arch_sparc:
1986 1.1 christos if (hdr->sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
1987 1.1 christos || hdr->sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
1988 1.1 christos break;
1989 1.5 christos /* Otherwise fall through. */
1990 1.1 christos default:
1991 1.1 christos goto fail;
1992 1.1 christos }
1993 1.5 christos }
1994 1.1 christos else if (elf_elfsections (abfd)[hdr->sh_link] == NULL)
1995 1.1 christos goto fail;
1996 1.1 christos else if (elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_STRTAB)
1997 1.1 christos {
1998 1.1 christos Elf_Internal_Shdr *dynsymhdr;
1999 1.1 christos
2000 1.1 christos /* The shared libraries distributed with hpux11 have a bogus
2001 1.1 christos sh_link field for the ".dynamic" section. Find the
2002 1.1 christos string table for the ".dynsym" section instead. */
2003 1.1 christos if (elf_dynsymtab (abfd) != 0)
2004 1.1 christos {
2005 1.1 christos dynsymhdr = elf_elfsections (abfd)[elf_dynsymtab (abfd)];
2006 1.1 christos hdr->sh_link = dynsymhdr->sh_link;
2007 1.1 christos }
2008 1.1 christos else
2009 1.1 christos {
2010 1.1 christos unsigned int i, num_sec;
2011 1.1 christos
2012 1.1 christos num_sec = elf_numsections (abfd);
2013 1.1 christos for (i = 1; i < num_sec; i++)
2014 1.1 christos {
2015 1.1 christos dynsymhdr = elf_elfsections (abfd)[i];
2016 1.1 christos if (dynsymhdr->sh_type == SHT_DYNSYM)
2017 1.1 christos {
2018 1.1 christos hdr->sh_link = dynsymhdr->sh_link;
2019 1.1 christos break;
2020 1.1 christos }
2021 1.1 christos }
2022 1.5 christos }
2023 1.1 christos }
2024 1.5 christos goto success;
2025 1.1 christos
2026 1.5 christos case SHT_SYMTAB: /* A symbol table. */
2027 1.1 christos if (elf_onesymtab (abfd) == shindex)
2028 1.1 christos goto success;
2029 1.5 christos
2030 1.5 christos if (hdr->sh_entsize != bed->s->sizeof_sym)
2031 1.1 christos goto fail;
2032 1.3 christos
2033 1.3 christos if (hdr->sh_info * hdr->sh_entsize > hdr->sh_size)
2034 1.5 christos {
2035 1.3 christos if (hdr->sh_size != 0)
2036 1.3 christos goto fail;
2037 1.3 christos /* Some assemblers erroneously set sh_info to one with a
2038 1.3 christos zero sh_size. ld sees this as a global symbol count
2039 1.5 christos of (unsigned) -1. Fix it here. */
2040 1.3 christos hdr->sh_info = 0;
2041 1.5 christos goto success;
2042 1.8 christos }
2043 1.8 christos
2044 1.8 christos /* PR 18854: A binary might contain more than one symbol table.
2045 1.8 christos Unusual, but possible. Warn, but continue. */
2046 1.8 christos if (elf_onesymtab (abfd) != 0)
2047 1.8 christos {
2048 1.8 christos (*_bfd_error_handler)
2049 1.8 christos (_("%B: warning: multiple symbol tables detected - ignoring the table in section %u"),
2050 1.8 christos abfd, shindex);
2051 1.1 christos goto success;
2052 1.8 christos }
2053 1.8 christos elf_onesymtab (abfd) = shindex;
2054 1.1 christos elf_symtab_hdr (abfd) = *hdr;
2055 1.1 christos elf_elfsections (abfd)[shindex] = hdr = & elf_symtab_hdr (abfd);
2056 1.1 christos abfd->flags |= HAS_SYMS;
2057 1.1 christos
2058 1.1 christos /* Sometimes a shared object will map in the symbol table. If
2059 1.1 christos SHF_ALLOC is set, and this is a shared object, then we also
2060 1.1 christos treat this section as a BFD section. We can not base the
2061 1.1 christos decision purely on SHF_ALLOC, because that flag is sometimes
2062 1.1 christos set in a relocatable object file, which would confuse the
2063 1.1 christos linker. */
2064 1.1 christos if ((hdr->sh_flags & SHF_ALLOC) != 0
2065 1.1 christos && (abfd->flags & DYNAMIC) != 0
2066 1.5 christos && ! _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2067 1.1 christos shindex))
2068 1.1 christos goto fail;
2069 1.1 christos
2070 1.1 christos /* Go looking for SHT_SYMTAB_SHNDX too, since if there is one we
2071 1.8 christos can't read symbols without that section loaded as well. It
2072 1.8 christos is most likely specified by the next section header. */
2073 1.8 christos {
2074 1.8 christos elf_section_list * entry;
2075 1.8 christos unsigned int i, num_sec;
2076 1.8 christos
2077 1.8 christos for (entry = elf_symtab_shndx_list (abfd); entry != NULL; entry = entry->next)
2078 1.8 christos if (entry->hdr.sh_link == shindex)
2079 1.8 christos goto success;
2080 1.8 christos
2081 1.8 christos num_sec = elf_numsections (abfd);
2082 1.8 christos for (i = shindex + 1; i < num_sec; i++)
2083 1.8 christos {
2084 1.8 christos Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
2085 1.8 christos
2086 1.8 christos if (hdr2->sh_type == SHT_SYMTAB_SHNDX
2087 1.8 christos && hdr2->sh_link == shindex)
2088 1.1 christos break;
2089 1.8 christos }
2090 1.8 christos
2091 1.1 christos if (i == num_sec)
2092 1.1 christos for (i = 1; i < shindex; i++)
2093 1.8 christos {
2094 1.1 christos Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
2095 1.1 christos
2096 1.1 christos if (hdr2->sh_type == SHT_SYMTAB_SHNDX
2097 1.1 christos && hdr2->sh_link == shindex)
2098 1.8 christos break;
2099 1.8 christos }
2100 1.8 christos
2101 1.8 christos if (i != shindex)
2102 1.8 christos ret = bfd_section_from_shdr (abfd, i);
2103 1.8 christos /* else FIXME: we have failed to find the symbol table - should we issue an error ? */
2104 1.1 christos goto success;
2105 1.5 christos }
2106 1.1 christos
2107 1.5 christos case SHT_DYNSYM: /* A dynamic symbol table. */
2108 1.1 christos if (elf_dynsymtab (abfd) == shindex)
2109 1.1 christos goto success;
2110 1.5 christos
2111 1.5 christos if (hdr->sh_entsize != bed->s->sizeof_sym)
2112 1.3 christos goto fail;
2113 1.3 christos
2114 1.3 christos if (hdr->sh_info * hdr->sh_entsize > hdr->sh_size)
2115 1.5 christos {
2116 1.5 christos if (hdr->sh_size != 0)
2117 1.3 christos goto fail;
2118 1.3 christos
2119 1.3 christos /* Some linkers erroneously set sh_info to one with a
2120 1.3 christos zero sh_size. ld sees this as a global symbol count
2121 1.5 christos of (unsigned) -1. Fix it here. */
2122 1.3 christos hdr->sh_info = 0;
2123 1.5 christos goto success;
2124 1.8 christos }
2125 1.8 christos
2126 1.8 christos /* PR 18854: A binary might contain more than one dynamic symbol table.
2127 1.8 christos Unusual, but possible. Warn, but continue. */
2128 1.8 christos if (elf_dynsymtab (abfd) != 0)
2129 1.8 christos {
2130 1.8 christos (*_bfd_error_handler)
2131 1.8 christos (_("%B: warning: multiple dynamic symbol tables detected - ignoring the table in section %u"),
2132 1.8 christos abfd, shindex);
2133 1.1 christos goto success;
2134 1.1 christos }
2135 1.1 christos elf_dynsymtab (abfd) = shindex;
2136 1.1 christos elf_tdata (abfd)->dynsymtab_hdr = *hdr;
2137 1.1 christos elf_elfsections (abfd)[shindex] = hdr = &elf_tdata (abfd)->dynsymtab_hdr;
2138 1.1 christos abfd->flags |= HAS_SYMS;
2139 1.1 christos
2140 1.5 christos /* Besides being a symbol table, we also treat this as a regular
2141 1.5 christos section, so that objcopy can handle it. */
2142 1.1 christos ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2143 1.5 christos goto success;
2144 1.8 christos
2145 1.8 christos case SHT_SYMTAB_SHNDX: /* Symbol section indices when >64k sections. */
2146 1.8 christos {
2147 1.8 christos elf_section_list * entry;
2148 1.8 christos
2149 1.8 christos for (entry = elf_symtab_shndx_list (abfd); entry != NULL; entry = entry->next)
2150 1.8 christos if (entry->ndx == shindex)
2151 1.8 christos goto success;
2152 1.8 christos
2153 1.8 christos entry = bfd_alloc (abfd, sizeof * entry);
2154 1.8 christos if (entry == NULL)
2155 1.8 christos goto fail;
2156 1.8 christos entry->ndx = shindex;
2157 1.8 christos entry->hdr = * hdr;
2158 1.8 christos entry->next = elf_symtab_shndx_list (abfd);
2159 1.5 christos elf_symtab_shndx_list (abfd) = entry;
2160 1.8 christos elf_elfsections (abfd)[shindex] = & entry->hdr;
2161 1.1 christos goto success;
2162 1.5 christos }
2163 1.1 christos
2164 1.5 christos case SHT_STRTAB: /* A string table. */
2165 1.5 christos if (hdr->bfd_section != NULL)
2166 1.1 christos goto success;
2167 1.1 christos
2168 1.1 christos if (ehdr->e_shstrndx == shindex)
2169 1.1 christos {
2170 1.5 christos elf_tdata (abfd)->shstrtab_hdr = *hdr;
2171 1.1 christos elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->shstrtab_hdr;
2172 1.5 christos goto success;
2173 1.1 christos }
2174 1.1 christos
2175 1.1 christos if (elf_elfsections (abfd)[elf_onesymtab (abfd)]->sh_link == shindex)
2176 1.1 christos {
2177 1.1 christos symtab_strtab:
2178 1.5 christos elf_tdata (abfd)->strtab_hdr = *hdr;
2179 1.1 christos elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->strtab_hdr;
2180 1.5 christos goto success;
2181 1.1 christos }
2182 1.1 christos
2183 1.1 christos if (elf_elfsections (abfd)[elf_dynsymtab (abfd)]->sh_link == shindex)
2184 1.1 christos {
2185 1.1 christos dynsymtab_strtab:
2186 1.1 christos elf_tdata (abfd)->dynstrtab_hdr = *hdr;
2187 1.1 christos hdr = &elf_tdata (abfd)->dynstrtab_hdr;
2188 1.1 christos elf_elfsections (abfd)[shindex] = hdr;
2189 1.5 christos /* We also treat this as a regular section, so that objcopy
2190 1.5 christos can handle it. */
2191 1.5 christos ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2192 1.1 christos shindex);
2193 1.1 christos goto success;
2194 1.1 christos }
2195 1.1 christos
2196 1.1 christos /* If the string table isn't one of the above, then treat it as a
2197 1.1 christos regular section. We need to scan all the headers to be sure,
2198 1.1 christos just in case this strtab section appeared before the above. */
2199 1.1 christos if (elf_onesymtab (abfd) == 0 || elf_dynsymtab (abfd) == 0)
2200 1.1 christos {
2201 1.1 christos unsigned int i, num_sec;
2202 1.1 christos
2203 1.1 christos num_sec = elf_numsections (abfd);
2204 1.1 christos for (i = 1; i < num_sec; i++)
2205 1.1 christos {
2206 1.1 christos Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
2207 1.1 christos if (hdr2->sh_link == shindex)
2208 1.1 christos {
2209 1.5 christos /* Prevent endless recursion on broken objects. */
2210 1.1 christos if (i == shindex)
2211 1.5 christos goto fail;
2212 1.1 christos if (! bfd_section_from_shdr (abfd, i))
2213 1.1 christos goto fail;
2214 1.1 christos if (elf_onesymtab (abfd) == i)
2215 1.1 christos goto symtab_strtab;
2216 1.1 christos if (elf_dynsymtab (abfd) == i)
2217 1.1 christos goto dynsymtab_strtab;
2218 1.1 christos }
2219 1.5 christos }
2220 1.5 christos }
2221 1.1 christos ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2222 1.1 christos goto success;
2223 1.1 christos
2224 1.1 christos case SHT_REL:
2225 1.1 christos case SHT_RELA:
2226 1.1 christos /* *These* do a lot of work -- but build no sections! */
2227 1.1 christos {
2228 1.1 christos asection *target_sect;
2229 1.1 christos Elf_Internal_Shdr *hdr2, **p_hdr;
2230 1.1 christos unsigned int num_sec = elf_numsections (abfd);
2231 1.1 christos struct bfd_elf_section_data *esdt;
2232 1.1 christos
2233 1.1 christos if (hdr->sh_entsize
2234 1.5 christos != (bfd_size_type) (hdr->sh_type == SHT_REL
2235 1.1 christos ? bed->s->sizeof_rel : bed->s->sizeof_rela))
2236 1.1 christos goto fail;
2237 1.1 christos
2238 1.1 christos /* Check for a bogus link to avoid crashing. */
2239 1.1 christos if (hdr->sh_link >= num_sec)
2240 1.1 christos {
2241 1.1 christos ((*_bfd_error_handler)
2242 1.5 christos (_("%B: invalid link %lu for reloc section %s (index %u)"),
2243 1.5 christos abfd, hdr->sh_link, name, shindex));
2244 1.5 christos ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2245 1.1 christos shindex);
2246 1.1 christos goto success;
2247 1.1 christos }
2248 1.1 christos
2249 1.1 christos /* For some incomprehensible reason Oracle distributes
2250 1.1 christos libraries for Solaris in which some of the objects have
2251 1.1 christos bogus sh_link fields. It would be nice if we could just
2252 1.1 christos reject them, but, unfortunately, some people need to use
2253 1.1 christos them. We scan through the section headers; if we find only
2254 1.1 christos one suitable symbol table, we clobber the sh_link to point
2255 1.1 christos to it. I hope this doesn't break anything.
2256 1.1 christos
2257 1.1 christos Don't do it on executable nor shared library. */
2258 1.1 christos if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0
2259 1.1 christos && elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_SYMTAB
2260 1.1 christos && elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_DYNSYM)
2261 1.1 christos {
2262 1.1 christos unsigned int scan;
2263 1.1 christos int found;
2264 1.1 christos
2265 1.1 christos found = 0;
2266 1.1 christos for (scan = 1; scan < num_sec; scan++)
2267 1.1 christos {
2268 1.1 christos if (elf_elfsections (abfd)[scan]->sh_type == SHT_SYMTAB
2269 1.1 christos || elf_elfsections (abfd)[scan]->sh_type == SHT_DYNSYM)
2270 1.1 christos {
2271 1.1 christos if (found != 0)
2272 1.1 christos {
2273 1.1 christos found = 0;
2274 1.1 christos break;
2275 1.1 christos }
2276 1.1 christos found = scan;
2277 1.1 christos }
2278 1.1 christos }
2279 1.1 christos if (found != 0)
2280 1.1 christos hdr->sh_link = found;
2281 1.1 christos }
2282 1.1 christos
2283 1.1 christos /* Get the symbol table. */
2284 1.1 christos if ((elf_elfsections (abfd)[hdr->sh_link]->sh_type == SHT_SYMTAB
2285 1.5 christos || elf_elfsections (abfd)[hdr->sh_link]->sh_type == SHT_DYNSYM)
2286 1.1 christos && ! bfd_section_from_shdr (abfd, hdr->sh_link))
2287 1.1 christos goto fail;
2288 1.1 christos
2289 1.1 christos /* If this reloc section does not use the main symbol table we
2290 1.1 christos don't treat it as a reloc section. BFD can't adequately
2291 1.1 christos represent such a section, so at least for now, we don't
2292 1.1 christos try. We just present it as a normal section. We also
2293 1.1 christos can't use it as a reloc section if it points to the null
2294 1.1 christos section, an invalid section, another reloc section, or its
2295 1.1 christos sh_link points to the null section. */
2296 1.1 christos if (hdr->sh_link != elf_onesymtab (abfd)
2297 1.1 christos || hdr->sh_link == SHN_UNDEF
2298 1.1 christos || hdr->sh_info == SHN_UNDEF
2299 1.1 christos || hdr->sh_info >= num_sec
2300 1.5 christos || elf_elfsections (abfd)[hdr->sh_info]->sh_type == SHT_REL
2301 1.5 christos || elf_elfsections (abfd)[hdr->sh_info]->sh_type == SHT_RELA)
2302 1.5 christos {
2303 1.5 christos ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2304 1.5 christos shindex);
2305 1.1 christos goto success;
2306 1.1 christos }
2307 1.5 christos
2308 1.5 christos if (! bfd_section_from_shdr (abfd, hdr->sh_info))
2309 1.1 christos goto fail;
2310 1.1 christos
2311 1.5 christos target_sect = bfd_section_from_elf_index (abfd, hdr->sh_info);
2312 1.1 christos if (target_sect == NULL)
2313 1.1 christos goto fail;
2314 1.1 christos
2315 1.1 christos esdt = elf_section_data (target_sect);
2316 1.1 christos if (hdr->sh_type == SHT_RELA)
2317 1.1 christos p_hdr = &esdt->rela.hdr;
2318 1.1 christos else
2319 1.5 christos p_hdr = &esdt->rel.hdr;
2320 1.5 christos
2321 1.5 christos /* PR 17512: file: 0b4f81b7. */
2322 1.8 christos if (*p_hdr != NULL)
2323 1.1 christos goto fail;
2324 1.5 christos hdr2 = (Elf_Internal_Shdr *) bfd_alloc (abfd, sizeof (*hdr2));
2325 1.1 christos if (hdr2 == NULL)
2326 1.1 christos goto fail;
2327 1.1 christos *hdr2 = *hdr;
2328 1.1 christos *p_hdr = hdr2;
2329 1.1 christos elf_elfsections (abfd)[shindex] = hdr2;
2330 1.1 christos target_sect->reloc_count += NUM_SHDR_ENTRIES (hdr);
2331 1.1 christos target_sect->flags |= SEC_RELOC;
2332 1.1 christos target_sect->relocation = NULL;
2333 1.1 christos target_sect->rel_filepos = hdr->sh_offset;
2334 1.1 christos /* In the section to which the relocations apply, mark whether
2335 1.1 christos its relocations are of the REL or RELA variety. */
2336 1.1 christos if (hdr->sh_size != 0)
2337 1.1 christos {
2338 1.1 christos if (hdr->sh_type == SHT_RELA)
2339 1.1 christos target_sect->use_rela_p = 1;
2340 1.5 christos }
2341 1.1 christos abfd->flags |= HAS_RELOC;
2342 1.1 christos goto success;
2343 1.1 christos }
2344 1.1 christos
2345 1.1 christos case SHT_GNU_verdef:
2346 1.5 christos elf_dynverdef (abfd) = shindex;
2347 1.5 christos elf_tdata (abfd)->dynverdef_hdr = *hdr;
2348 1.1 christos ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2349 1.1 christos goto success;
2350 1.1 christos
2351 1.5 christos case SHT_GNU_versym:
2352 1.5 christos if (hdr->sh_entsize != sizeof (Elf_External_Versym))
2353 1.1 christos goto fail;
2354 1.1 christos
2355 1.5 christos elf_dynversym (abfd) = shindex;
2356 1.5 christos elf_tdata (abfd)->dynversym_hdr = *hdr;
2357 1.1 christos ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2358 1.1 christos goto success;
2359 1.1 christos
2360 1.1 christos case SHT_GNU_verneed:
2361 1.5 christos elf_dynverref (abfd) = shindex;
2362 1.5 christos elf_tdata (abfd)->dynverref_hdr = *hdr;
2363 1.1 christos ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2364 1.1 christos goto success;
2365 1.5 christos
2366 1.1 christos case SHT_SHLIB:
2367 1.1 christos goto success;
2368 1.3 christos
2369 1.5 christos case SHT_GROUP:
2370 1.5 christos if (! IS_VALID_GROUP_SECTION_HEADER (hdr, GRP_ENTRY_SIZE))
2371 1.1 christos goto fail;
2372 1.5 christos
2373 1.5 christos if (!_bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
2374 1.1 christos goto fail;
2375 1.1 christos
2376 1.1 christos if (hdr->contents != NULL)
2377 1.5 christos {
2378 1.1 christos Elf_Internal_Group *idx = (Elf_Internal_Group *) hdr->contents;
2379 1.1 christos unsigned int n_elt = hdr->sh_size / sizeof (* idx);
2380 1.5 christos asection *s;
2381 1.5 christos
2382 1.1 christos if (n_elt == 0)
2383 1.1 christos goto fail;
2384 1.1 christos if (idx->flags & GRP_COMDAT)
2385 1.1 christos hdr->bfd_section->flags
2386 1.1 christos |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
2387 1.1 christos
2388 1.5 christos /* We try to keep the same section order as it comes in. */
2389 1.1 christos idx += n_elt;
2390 1.1 christos
2391 1.1 christos while (--n_elt != 0)
2392 1.1 christos {
2393 1.1 christos --idx;
2394 1.1 christos
2395 1.1 christos if (idx->shdr != NULL
2396 1.1 christos && (s = idx->shdr->bfd_section) != NULL
2397 1.1 christos && elf_next_in_group (s) != NULL)
2398 1.1 christos {
2399 1.1 christos elf_next_in_group (hdr->bfd_section) = s;
2400 1.1 christos break;
2401 1.1 christos }
2402 1.5 christos }
2403 1.1 christos }
2404 1.1 christos goto success;
2405 1.1 christos
2406 1.1 christos default:
2407 1.1 christos /* Possibly an attributes section. */
2408 1.1 christos if (hdr->sh_type == SHT_GNU_ATTRIBUTES
2409 1.1 christos || hdr->sh_type == bed->obj_attrs_section_type)
2410 1.5 christos {
2411 1.1 christos if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
2412 1.5 christos goto fail;
2413 1.1 christos _bfd_elf_parse_attributes (abfd, hdr);
2414 1.1 christos goto success;
2415 1.1 christos }
2416 1.1 christos
2417 1.5 christos /* Check for any processor-specific section types. */
2418 1.1 christos if (bed->elf_backend_section_from_shdr (abfd, hdr, name, shindex))
2419 1.1 christos goto success;
2420 1.1 christos
2421 1.1 christos if (hdr->sh_type >= SHT_LOUSER && hdr->sh_type <= SHT_HIUSER)
2422 1.1 christos {
2423 1.1 christos if ((hdr->sh_flags & SHF_ALLOC) != 0)
2424 1.1 christos /* FIXME: How to properly handle allocated section reserved
2425 1.1 christos for applications? */
2426 1.1 christos (*_bfd_error_handler)
2427 1.1 christos (_("%B: don't know how to handle allocated, application "
2428 1.1 christos "specific section `%s' [0x%8x]"),
2429 1.5 christos abfd, name, hdr->sh_type);
2430 1.5 christos else
2431 1.5 christos {
2432 1.5 christos /* Allow sections reserved for applications. */
2433 1.5 christos ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2434 1.5 christos shindex);
2435 1.1 christos goto success;
2436 1.1 christos }
2437 1.1 christos }
2438 1.1 christos else if (hdr->sh_type >= SHT_LOPROC
2439 1.1 christos && hdr->sh_type <= SHT_HIPROC)
2440 1.1 christos /* FIXME: We should handle this section. */
2441 1.1 christos (*_bfd_error_handler)
2442 1.1 christos (_("%B: don't know how to handle processor specific section "
2443 1.1 christos "`%s' [0x%8x]"),
2444 1.1 christos abfd, name, hdr->sh_type);
2445 1.1 christos else if (hdr->sh_type >= SHT_LOOS && hdr->sh_type <= SHT_HIOS)
2446 1.1 christos {
2447 1.1 christos /* Unrecognised OS-specific sections. */
2448 1.1 christos if ((hdr->sh_flags & SHF_OS_NONCONFORMING) != 0)
2449 1.1 christos /* SHF_OS_NONCONFORMING indicates that special knowledge is
2450 1.1 christos required to correctly process the section and the file should
2451 1.1 christos be rejected with an error message. */
2452 1.1 christos (*_bfd_error_handler)
2453 1.1 christos (_("%B: don't know how to handle OS specific section "
2454 1.1 christos "`%s' [0x%8x]"),
2455 1.5 christos abfd, name, hdr->sh_type);
2456 1.5 christos else
2457 1.5 christos {
2458 1.5 christos /* Otherwise it should be processed. */
2459 1.5 christos ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2460 1.1 christos goto success;
2461 1.1 christos }
2462 1.1 christos }
2463 1.1 christos else
2464 1.1 christos /* FIXME: We should handle this section. */
2465 1.1 christos (*_bfd_error_handler)
2466 1.1 christos (_("%B: don't know how to handle section `%s' [0x%8x]"),
2467 1.5 christos abfd, name, hdr->sh_type);
2468 1.1 christos
2469 1.1 christos goto fail;
2470 1.5 christos }
2471 1.5 christos
2472 1.5 christos fail:
2473 1.5 christos ret = FALSE;
2474 1.5 christos success:
2475 1.5 christos if (sections_being_created && sections_being_created_abfd == abfd)
2476 1.5 christos sections_being_created [shindex] = FALSE;
2477 1.5 christos if (-- nesting == 0)
2478 1.5 christos {
2479 1.5 christos sections_being_created = NULL;
2480 1.5 christos sections_being_created_abfd = abfd;
2481 1.1 christos }
2482 1.1 christos return ret;
2483 1.1 christos }
2484 1.1 christos
2485 1.1 christos /* Return the local symbol specified by ABFD, R_SYMNDX. */
2486 1.1 christos
2487 1.1 christos Elf_Internal_Sym *
2488 1.1 christos bfd_sym_from_r_symndx (struct sym_cache *cache,
2489 1.1 christos bfd *abfd,
2490 1.1 christos unsigned long r_symndx)
2491 1.1 christos {
2492 1.1 christos unsigned int ent = r_symndx % LOCAL_SYM_CACHE_SIZE;
2493 1.1 christos
2494 1.1 christos if (cache->abfd != abfd || cache->indx[ent] != r_symndx)
2495 1.1 christos {
2496 1.1 christos Elf_Internal_Shdr *symtab_hdr;
2497 1.1 christos unsigned char esym[sizeof (Elf64_External_Sym)];
2498 1.1 christos Elf_External_Sym_Shndx eshndx;
2499 1.1 christos
2500 1.1 christos symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2501 1.1 christos if (bfd_elf_get_elf_syms (abfd, symtab_hdr, 1, r_symndx,
2502 1.1 christos &cache->sym[ent], esym, &eshndx) == NULL)
2503 1.1 christos return NULL;
2504 1.1 christos
2505 1.1 christos if (cache->abfd != abfd)
2506 1.1 christos {
2507 1.1 christos memset (cache->indx, -1, sizeof (cache->indx));
2508 1.1 christos cache->abfd = abfd;
2509 1.1 christos }
2510 1.1 christos cache->indx[ent] = r_symndx;
2511 1.1 christos }
2512 1.1 christos
2513 1.1 christos return &cache->sym[ent];
2514 1.1 christos }
2515 1.1 christos
2516 1.1 christos /* Given an ELF section number, retrieve the corresponding BFD
2517 1.1 christos section. */
2518 1.1 christos
2519 1.1 christos asection *
2520 1.1 christos bfd_section_from_elf_index (bfd *abfd, unsigned int sec_index)
2521 1.1 christos {
2522 1.1 christos if (sec_index >= elf_numsections (abfd))
2523 1.1 christos return NULL;
2524 1.1 christos return elf_elfsections (abfd)[sec_index]->bfd_section;
2525 1.1 christos }
2526 1.1 christos
2527 1.1 christos static const struct bfd_elf_special_section special_sections_b[] =
2528 1.1 christos {
2529 1.1 christos { STRING_COMMA_LEN (".bss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2530 1.1 christos { NULL, 0, 0, 0, 0 }
2531 1.1 christos };
2532 1.1 christos
2533 1.1 christos static const struct bfd_elf_special_section special_sections_c[] =
2534 1.1 christos {
2535 1.1 christos { STRING_COMMA_LEN (".comment"), 0, SHT_PROGBITS, 0 },
2536 1.1 christos { NULL, 0, 0, 0, 0 }
2537 1.1 christos };
2538 1.1 christos
2539 1.1 christos static const struct bfd_elf_special_section special_sections_d[] =
2540 1.1 christos {
2541 1.3 christos { STRING_COMMA_LEN (".data"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2542 1.3 christos { STRING_COMMA_LEN (".data1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2543 1.3 christos /* There are more DWARF sections than these, but they needn't be added here
2544 1.1 christos unless you have to cope with broken compilers that don't emit section
2545 1.1 christos attributes or you want to help the user writing assembler. */
2546 1.1 christos { STRING_COMMA_LEN (".debug"), 0, SHT_PROGBITS, 0 },
2547 1.1 christos { STRING_COMMA_LEN (".debug_line"), 0, SHT_PROGBITS, 0 },
2548 1.1 christos { STRING_COMMA_LEN (".debug_info"), 0, SHT_PROGBITS, 0 },
2549 1.1 christos { STRING_COMMA_LEN (".debug_abbrev"), 0, SHT_PROGBITS, 0 },
2550 1.1 christos { STRING_COMMA_LEN (".debug_aranges"), 0, SHT_PROGBITS, 0 },
2551 1.1 christos { STRING_COMMA_LEN (".dynamic"), 0, SHT_DYNAMIC, SHF_ALLOC },
2552 1.1 christos { STRING_COMMA_LEN (".dynstr"), 0, SHT_STRTAB, SHF_ALLOC },
2553 1.1 christos { STRING_COMMA_LEN (".dynsym"), 0, SHT_DYNSYM, SHF_ALLOC },
2554 1.1 christos { NULL, 0, 0, 0, 0 }
2555 1.1 christos };
2556 1.1 christos
2557 1.1 christos static const struct bfd_elf_special_section special_sections_f[] =
2558 1.1 christos {
2559 1.1 christos { STRING_COMMA_LEN (".fini"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2560 1.1 christos { STRING_COMMA_LEN (".fini_array"), 0, SHT_FINI_ARRAY, SHF_ALLOC + SHF_WRITE },
2561 1.1 christos { NULL, 0, 0, 0, 0 }
2562 1.1 christos };
2563 1.1 christos
2564 1.1 christos static const struct bfd_elf_special_section special_sections_g[] =
2565 1.1 christos {
2566 1.1 christos { STRING_COMMA_LEN (".gnu.linkonce.b"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2567 1.1 christos { STRING_COMMA_LEN (".gnu.lto_"), -1, SHT_PROGBITS, SHF_EXCLUDE },
2568 1.1 christos { STRING_COMMA_LEN (".got"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2569 1.1 christos { STRING_COMMA_LEN (".gnu.version"), 0, SHT_GNU_versym, 0 },
2570 1.1 christos { STRING_COMMA_LEN (".gnu.version_d"), 0, SHT_GNU_verdef, 0 },
2571 1.1 christos { STRING_COMMA_LEN (".gnu.version_r"), 0, SHT_GNU_verneed, 0 },
2572 1.1 christos { STRING_COMMA_LEN (".gnu.liblist"), 0, SHT_GNU_LIBLIST, SHF_ALLOC },
2573 1.1 christos { STRING_COMMA_LEN (".gnu.conflict"), 0, SHT_RELA, SHF_ALLOC },
2574 1.1 christos { STRING_COMMA_LEN (".gnu.hash"), 0, SHT_GNU_HASH, SHF_ALLOC },
2575 1.1 christos { NULL, 0, 0, 0, 0 }
2576 1.1 christos };
2577 1.1 christos
2578 1.1 christos static const struct bfd_elf_special_section special_sections_h[] =
2579 1.1 christos {
2580 1.1 christos { STRING_COMMA_LEN (".hash"), 0, SHT_HASH, SHF_ALLOC },
2581 1.1 christos { NULL, 0, 0, 0, 0 }
2582 1.1 christos };
2583 1.1 christos
2584 1.1 christos static const struct bfd_elf_special_section special_sections_i[] =
2585 1.1 christos {
2586 1.1 christos { STRING_COMMA_LEN (".init"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2587 1.1 christos { STRING_COMMA_LEN (".init_array"), 0, SHT_INIT_ARRAY, SHF_ALLOC + SHF_WRITE },
2588 1.1 christos { STRING_COMMA_LEN (".interp"), 0, SHT_PROGBITS, 0 },
2589 1.1 christos { NULL, 0, 0, 0, 0 }
2590 1.1 christos };
2591 1.1 christos
2592 1.1 christos static const struct bfd_elf_special_section special_sections_l[] =
2593 1.1 christos {
2594 1.1 christos { STRING_COMMA_LEN (".line"), 0, SHT_PROGBITS, 0 },
2595 1.1 christos { NULL, 0, 0, 0, 0 }
2596 1.1 christos };
2597 1.1 christos
2598 1.1 christos static const struct bfd_elf_special_section special_sections_n[] =
2599 1.1 christos {
2600 1.1 christos { STRING_COMMA_LEN (".note.GNU-stack"), 0, SHT_PROGBITS, 0 },
2601 1.1 christos { STRING_COMMA_LEN (".note"), -1, SHT_NOTE, 0 },
2602 1.1 christos { NULL, 0, 0, 0, 0 }
2603 1.1 christos };
2604 1.1 christos
2605 1.1 christos static const struct bfd_elf_special_section special_sections_p[] =
2606 1.1 christos {
2607 1.1 christos { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_WRITE },
2608 1.1 christos { STRING_COMMA_LEN (".plt"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2609 1.1 christos { NULL, 0, 0, 0, 0 }
2610 1.1 christos };
2611 1.1 christos
2612 1.1 christos static const struct bfd_elf_special_section special_sections_r[] =
2613 1.1 christos {
2614 1.1 christos { STRING_COMMA_LEN (".rodata"), -2, SHT_PROGBITS, SHF_ALLOC },
2615 1.1 christos { STRING_COMMA_LEN (".rodata1"), 0, SHT_PROGBITS, SHF_ALLOC },
2616 1.1 christos { STRING_COMMA_LEN (".rela"), -1, SHT_RELA, 0 },
2617 1.1 christos { STRING_COMMA_LEN (".rel"), -1, SHT_REL, 0 },
2618 1.1 christos { NULL, 0, 0, 0, 0 }
2619 1.1 christos };
2620 1.1 christos
2621 1.1 christos static const struct bfd_elf_special_section special_sections_s[] =
2622 1.1 christos {
2623 1.1 christos { STRING_COMMA_LEN (".shstrtab"), 0, SHT_STRTAB, 0 },
2624 1.1 christos { STRING_COMMA_LEN (".strtab"), 0, SHT_STRTAB, 0 },
2625 1.1 christos { STRING_COMMA_LEN (".symtab"), 0, SHT_SYMTAB, 0 },
2626 1.1 christos /* See struct bfd_elf_special_section declaration for the semantics of
2627 1.1 christos this special case where .prefix_length != strlen (.prefix). */
2628 1.1 christos { ".stabstr", 5, 3, SHT_STRTAB, 0 },
2629 1.1 christos { NULL, 0, 0, 0, 0 }
2630 1.1 christos };
2631 1.1 christos
2632 1.1 christos static const struct bfd_elf_special_section special_sections_t[] =
2633 1.1 christos {
2634 1.1 christos { STRING_COMMA_LEN (".text"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2635 1.1 christos { STRING_COMMA_LEN (".tbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
2636 1.1 christos { STRING_COMMA_LEN (".tdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
2637 1.1 christos { NULL, 0, 0, 0, 0 }
2638 1.1 christos };
2639 1.1 christos
2640 1.1 christos static const struct bfd_elf_special_section special_sections_z[] =
2641 1.1 christos {
2642 1.1 christos { STRING_COMMA_LEN (".zdebug_line"), 0, SHT_PROGBITS, 0 },
2643 1.1 christos { STRING_COMMA_LEN (".zdebug_info"), 0, SHT_PROGBITS, 0 },
2644 1.1 christos { STRING_COMMA_LEN (".zdebug_abbrev"), 0, SHT_PROGBITS, 0 },
2645 1.1 christos { STRING_COMMA_LEN (".zdebug_aranges"), 0, SHT_PROGBITS, 0 },
2646 1.1 christos { NULL, 0, 0, 0, 0 }
2647 1.3 christos };
2648 1.1 christos
2649 1.1 christos static const struct bfd_elf_special_section * const special_sections[] =
2650 1.1 christos {
2651 1.1 christos special_sections_b, /* 'b' */
2652 1.1 christos special_sections_c, /* 'c' */
2653 1.1 christos special_sections_d, /* 'd' */
2654 1.1 christos NULL, /* 'e' */
2655 1.1 christos special_sections_f, /* 'f' */
2656 1.1 christos special_sections_g, /* 'g' */
2657 1.1 christos special_sections_h, /* 'h' */
2658 1.1 christos special_sections_i, /* 'i' */
2659 1.1 christos NULL, /* 'j' */
2660 1.1 christos NULL, /* 'k' */
2661 1.1 christos special_sections_l, /* 'l' */
2662 1.1 christos NULL, /* 'm' */
2663 1.1 christos special_sections_n, /* 'n' */
2664 1.1 christos NULL, /* 'o' */
2665 1.1 christos special_sections_p, /* 'p' */
2666 1.1 christos NULL, /* 'q' */
2667 1.1 christos special_sections_r, /* 'r' */
2668 1.1 christos special_sections_s, /* 's' */
2669 1.1 christos special_sections_t, /* 't' */
2670 1.1 christos NULL, /* 'u' */
2671 1.1 christos NULL, /* 'v' */
2672 1.1 christos NULL, /* 'w' */
2673 1.1 christos NULL, /* 'x' */
2674 1.1 christos NULL, /* 'y' */
2675 1.1 christos special_sections_z /* 'z' */
2676 1.1 christos };
2677 1.1 christos
2678 1.1 christos const struct bfd_elf_special_section *
2679 1.1 christos _bfd_elf_get_special_section (const char *name,
2680 1.1 christos const struct bfd_elf_special_section *spec,
2681 1.1 christos unsigned int rela)
2682 1.1 christos {
2683 1.1 christos int i;
2684 1.1 christos int len;
2685 1.1 christos
2686 1.1 christos len = strlen (name);
2687 1.1 christos
2688 1.1 christos for (i = 0; spec[i].prefix != NULL; i++)
2689 1.1 christos {
2690 1.1 christos int suffix_len;
2691 1.1 christos int prefix_len = spec[i].prefix_length;
2692 1.1 christos
2693 1.1 christos if (len < prefix_len)
2694 1.1 christos continue;
2695 1.1 christos if (memcmp (name, spec[i].prefix, prefix_len) != 0)
2696 1.1 christos continue;
2697 1.1 christos
2698 1.1 christos suffix_len = spec[i].suffix_length;
2699 1.1 christos if (suffix_len <= 0)
2700 1.1 christos {
2701 1.1 christos if (name[prefix_len] != 0)
2702 1.1 christos {
2703 1.1 christos if (suffix_len == 0)
2704 1.1 christos continue;
2705 1.1 christos if (name[prefix_len] != '.'
2706 1.1 christos && (suffix_len == -2
2707 1.1 christos || (rela && spec[i].type == SHT_REL)))
2708 1.1 christos continue;
2709 1.1 christos }
2710 1.1 christos }
2711 1.1 christos else
2712 1.1 christos {
2713 1.1 christos if (len < prefix_len + suffix_len)
2714 1.1 christos continue;
2715 1.1 christos if (memcmp (name + len - suffix_len,
2716 1.1 christos spec[i].prefix + prefix_len,
2717 1.1 christos suffix_len) != 0)
2718 1.1 christos continue;
2719 1.1 christos }
2720 1.1 christos return &spec[i];
2721 1.1 christos }
2722 1.1 christos
2723 1.1 christos return NULL;
2724 1.1 christos }
2725 1.1 christos
2726 1.1 christos const struct bfd_elf_special_section *
2727 1.1 christos _bfd_elf_get_sec_type_attr (bfd *abfd, asection *sec)
2728 1.1 christos {
2729 1.1 christos int i;
2730 1.1 christos const struct bfd_elf_special_section *spec;
2731 1.1 christos const struct elf_backend_data *bed;
2732 1.1 christos
2733 1.1 christos /* See if this is one of the special sections. */
2734 1.1 christos if (sec->name == NULL)
2735 1.1 christos return NULL;
2736 1.1 christos
2737 1.1 christos bed = get_elf_backend_data (abfd);
2738 1.1 christos spec = bed->special_sections;
2739 1.1 christos if (spec)
2740 1.1 christos {
2741 1.1 christos spec = _bfd_elf_get_special_section (sec->name,
2742 1.1 christos bed->special_sections,
2743 1.1 christos sec->use_rela_p);
2744 1.1 christos if (spec != NULL)
2745 1.1 christos return spec;
2746 1.1 christos }
2747 1.1 christos
2748 1.1 christos if (sec->name[0] != '.')
2749 1.1 christos return NULL;
2750 1.1 christos
2751 1.1 christos i = sec->name[1] - 'b';
2752 1.1 christos if (i < 0 || i > 'z' - 'b')
2753 1.1 christos return NULL;
2754 1.1 christos
2755 1.1 christos spec = special_sections[i];
2756 1.1 christos
2757 1.1 christos if (spec == NULL)
2758 1.1 christos return NULL;
2759 1.1 christos
2760 1.1 christos return _bfd_elf_get_special_section (sec->name, spec, sec->use_rela_p);
2761 1.1 christos }
2762 1.1 christos
2763 1.1 christos bfd_boolean
2764 1.1 christos _bfd_elf_new_section_hook (bfd *abfd, asection *sec)
2765 1.1 christos {
2766 1.1 christos struct bfd_elf_section_data *sdata;
2767 1.1 christos const struct elf_backend_data *bed;
2768 1.1 christos const struct bfd_elf_special_section *ssect;
2769 1.1 christos
2770 1.1 christos sdata = (struct bfd_elf_section_data *) sec->used_by_bfd;
2771 1.1 christos if (sdata == NULL)
2772 1.1 christos {
2773 1.1 christos sdata = (struct bfd_elf_section_data *) bfd_zalloc (abfd,
2774 1.1 christos sizeof (*sdata));
2775 1.1 christos if (sdata == NULL)
2776 1.1 christos return FALSE;
2777 1.1 christos sec->used_by_bfd = sdata;
2778 1.1 christos }
2779 1.1 christos
2780 1.1 christos /* Indicate whether or not this section should use RELA relocations. */
2781 1.1 christos bed = get_elf_backend_data (abfd);
2782 1.1 christos sec->use_rela_p = bed->default_use_rela_p;
2783 1.1 christos
2784 1.1 christos /* When we read a file, we don't need to set ELF section type and
2785 1.1 christos flags. They will be overridden in _bfd_elf_make_section_from_shdr
2786 1.1 christos anyway. We will set ELF section type and flags for all linker
2787 1.1 christos created sections. If user specifies BFD section flags, we will
2788 1.1 christos set ELF section type and flags based on BFD section flags in
2789 1.1 christos elf_fake_sections. Special handling for .init_array/.fini_array
2790 1.1 christos output sections since they may contain .ctors/.dtors input
2791 1.1 christos sections. We don't want _bfd_elf_init_private_section_data to
2792 1.1 christos copy ELF section type from .ctors/.dtors input sections. */
2793 1.1 christos if (abfd->direction != read_direction
2794 1.1 christos || (sec->flags & SEC_LINKER_CREATED) != 0)
2795 1.1 christos {
2796 1.1 christos ssect = (*bed->get_sec_type_attr) (abfd, sec);
2797 1.1 christos if (ssect != NULL
2798 1.1 christos && (!sec->flags
2799 1.1 christos || (sec->flags & SEC_LINKER_CREATED) != 0
2800 1.1 christos || ssect->type == SHT_INIT_ARRAY
2801 1.1 christos || ssect->type == SHT_FINI_ARRAY))
2802 1.1 christos {
2803 1.1 christos elf_section_type (sec) = ssect->type;
2804 1.1 christos elf_section_flags (sec) = ssect->attr;
2805 1.1 christos }
2806 1.1 christos }
2807 1.1 christos
2808 1.1 christos return _bfd_generic_new_section_hook (abfd, sec);
2809 1.1 christos }
2810 1.1 christos
2811 1.1 christos /* Create a new bfd section from an ELF program header.
2812 1.1 christos
2813 1.1 christos Since program segments have no names, we generate a synthetic name
2814 1.1 christos of the form segment<NUM>, where NUM is generally the index in the
2815 1.1 christos program header table. For segments that are split (see below) we
2816 1.1 christos generate the names segment<NUM>a and segment<NUM>b.
2817 1.1 christos
2818 1.1 christos Note that some program segments may have a file size that is different than
2819 1.1 christos (less than) the memory size. All this means is that at execution the
2820 1.1 christos system must allocate the amount of memory specified by the memory size,
2821 1.1 christos but only initialize it with the first "file size" bytes read from the
2822 1.1 christos file. This would occur for example, with program segments consisting
2823 1.1 christos of combined data+bss.
2824 1.1 christos
2825 1.1 christos To handle the above situation, this routine generates TWO bfd sections
2826 1.1 christos for the single program segment. The first has the length specified by
2827 1.1 christos the file size of the segment, and the second has the length specified
2828 1.1 christos by the difference between the two sizes. In effect, the segment is split
2829 1.1 christos into its initialized and uninitialized parts.
2830 1.1 christos
2831 1.1 christos */
2832 1.1 christos
2833 1.1 christos bfd_boolean
2834 1.1 christos _bfd_elf_make_section_from_phdr (bfd *abfd,
2835 1.1 christos Elf_Internal_Phdr *hdr,
2836 1.1 christos int hdr_index,
2837 1.1 christos const char *type_name)
2838 1.1 christos {
2839 1.1 christos asection *newsect;
2840 1.1 christos char *name;
2841 1.1 christos char namebuf[64];
2842 1.1 christos size_t len;
2843 1.1 christos int split;
2844 1.1 christos
2845 1.1 christos split = ((hdr->p_memsz > 0)
2846 1.1 christos && (hdr->p_filesz > 0)
2847 1.1 christos && (hdr->p_memsz > hdr->p_filesz));
2848 1.1 christos
2849 1.1 christos if (hdr->p_filesz > 0)
2850 1.1 christos {
2851 1.1 christos sprintf (namebuf, "%s%d%s", type_name, hdr_index, split ? "a" : "");
2852 1.1 christos len = strlen (namebuf) + 1;
2853 1.1 christos name = (char *) bfd_alloc (abfd, len);
2854 1.1 christos if (!name)
2855 1.1 christos return FALSE;
2856 1.1 christos memcpy (name, namebuf, len);
2857 1.1 christos newsect = bfd_make_section (abfd, name);
2858 1.1 christos if (newsect == NULL)
2859 1.1 christos return FALSE;
2860 1.1 christos newsect->vma = hdr->p_vaddr;
2861 1.1 christos newsect->lma = hdr->p_paddr;
2862 1.1 christos newsect->size = hdr->p_filesz;
2863 1.1 christos newsect->filepos = hdr->p_offset;
2864 1.1 christos newsect->flags |= SEC_HAS_CONTENTS;
2865 1.1 christos newsect->alignment_power = bfd_log2 (hdr->p_align);
2866 1.1 christos if (hdr->p_type == PT_LOAD)
2867 1.1 christos {
2868 1.1 christos newsect->flags |= SEC_ALLOC;
2869 1.1 christos newsect->flags |= SEC_LOAD;
2870 1.1 christos if (hdr->p_flags & PF_X)
2871 1.1 christos {
2872 1.1 christos /* FIXME: all we known is that it has execute PERMISSION,
2873 1.1 christos may be data. */
2874 1.1 christos newsect->flags |= SEC_CODE;
2875 1.1 christos }
2876 1.1 christos }
2877 1.1 christos if (!(hdr->p_flags & PF_W))
2878 1.1 christos {
2879 1.1 christos newsect->flags |= SEC_READONLY;
2880 1.1 christos }
2881 1.1 christos }
2882 1.1 christos
2883 1.1 christos if (hdr->p_memsz > hdr->p_filesz)
2884 1.1 christos {
2885 1.1 christos bfd_vma align;
2886 1.1 christos
2887 1.1 christos sprintf (namebuf, "%s%d%s", type_name, hdr_index, split ? "b" : "");
2888 1.1 christos len = strlen (namebuf) + 1;
2889 1.1 christos name = (char *) bfd_alloc (abfd, len);
2890 1.1 christos if (!name)
2891 1.1 christos return FALSE;
2892 1.1 christos memcpy (name, namebuf, len);
2893 1.1 christos newsect = bfd_make_section (abfd, name);
2894 1.1 christos if (newsect == NULL)
2895 1.1 christos return FALSE;
2896 1.1 christos newsect->vma = hdr->p_vaddr + hdr->p_filesz;
2897 1.1 christos newsect->lma = hdr->p_paddr + hdr->p_filesz;
2898 1.1 christos newsect->size = hdr->p_memsz - hdr->p_filesz;
2899 1.1 christos newsect->filepos = hdr->p_offset + hdr->p_filesz;
2900 1.1 christos align = newsect->vma & -newsect->vma;
2901 1.1 christos if (align == 0 || align > hdr->p_align)
2902 1.1 christos align = hdr->p_align;
2903 1.1 christos newsect->alignment_power = bfd_log2 (align);
2904 1.1 christos if (hdr->p_type == PT_LOAD)
2905 1.1 christos {
2906 1.1 christos /* Hack for gdb. Segments that have not been modified do
2907 1.1 christos not have their contents written to a core file, on the
2908 1.1 christos assumption that a debugger can find the contents in the
2909 1.1 christos executable. We flag this case by setting the fake
2910 1.1 christos section size to zero. Note that "real" bss sections will
2911 1.1 christos always have their contents dumped to the core file. */
2912 1.1 christos if (bfd_get_format (abfd) == bfd_core)
2913 1.1 christos newsect->size = 0;
2914 1.1 christos newsect->flags |= SEC_ALLOC;
2915 1.1 christos if (hdr->p_flags & PF_X)
2916 1.1 christos newsect->flags |= SEC_CODE;
2917 1.1 christos }
2918 1.1 christos if (!(hdr->p_flags & PF_W))
2919 1.1 christos newsect->flags |= SEC_READONLY;
2920 1.1 christos }
2921 1.1 christos
2922 1.1 christos return TRUE;
2923 1.1 christos }
2924 1.1 christos
2925 1.1 christos bfd_boolean
2926 1.1 christos bfd_section_from_phdr (bfd *abfd, Elf_Internal_Phdr *hdr, int hdr_index)
2927 1.1 christos {
2928 1.1 christos const struct elf_backend_data *bed;
2929 1.1 christos
2930 1.1 christos switch (hdr->p_type)
2931 1.1 christos {
2932 1.1 christos case PT_NULL:
2933 1.1 christos return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "null");
2934 1.1 christos
2935 1.1 christos case PT_LOAD:
2936 1.1 christos return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "load");
2937 1.1 christos
2938 1.1 christos case PT_DYNAMIC:
2939 1.1 christos return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "dynamic");
2940 1.1 christos
2941 1.1 christos case PT_INTERP:
2942 1.1 christos return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "interp");
2943 1.1 christos
2944 1.1 christos case PT_NOTE:
2945 1.1 christos if (! _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "note"))
2946 1.1 christos return FALSE;
2947 1.1 christos if (! elf_read_notes (abfd, hdr->p_offset, hdr->p_filesz))
2948 1.1 christos return FALSE;
2949 1.1 christos return TRUE;
2950 1.1 christos
2951 1.1 christos case PT_SHLIB:
2952 1.1 christos return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "shlib");
2953 1.1 christos
2954 1.1 christos case PT_PHDR:
2955 1.1 christos return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "phdr");
2956 1.1 christos
2957 1.1 christos case PT_GNU_EH_FRAME:
2958 1.1 christos return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index,
2959 1.1 christos "eh_frame_hdr");
2960 1.1 christos
2961 1.1 christos case PT_GNU_STACK:
2962 1.1 christos return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "stack");
2963 1.1 christos
2964 1.1 christos case PT_GNU_RELRO:
2965 1.1 christos return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "relro");
2966 1.1 christos
2967 1.1 christos default:
2968 1.1 christos /* Check for any processor-specific program segment types. */
2969 1.1 christos bed = get_elf_backend_data (abfd);
2970 1.1 christos return bed->elf_backend_section_from_phdr (abfd, hdr, hdr_index, "proc");
2971 1.1 christos }
2972 1.1 christos }
2973 1.1 christos
2974 1.1 christos /* Return the REL_HDR for SEC, assuming there is only a single one, either
2975 1.1 christos REL or RELA. */
2976 1.1 christos
2977 1.1 christos Elf_Internal_Shdr *
2978 1.1 christos _bfd_elf_single_rel_hdr (asection *sec)
2979 1.1 christos {
2980 1.1 christos if (elf_section_data (sec)->rel.hdr)
2981 1.1 christos {
2982 1.1 christos BFD_ASSERT (elf_section_data (sec)->rela.hdr == NULL);
2983 1.1 christos return elf_section_data (sec)->rel.hdr;
2984 1.1 christos }
2985 1.1 christos else
2986 1.1 christos return elf_section_data (sec)->rela.hdr;
2987 1.6 christos }
2988 1.6 christos
2989 1.6 christos static bfd_boolean
2990 1.6 christos _bfd_elf_set_reloc_sh_name (bfd *abfd,
2991 1.6 christos Elf_Internal_Shdr *rel_hdr,
2992 1.6 christos const char *sec_name,
2993 1.6 christos bfd_boolean use_rela_p)
2994 1.6 christos {
2995 1.6 christos char *name = (char *) bfd_alloc (abfd,
2996 1.6 christos sizeof ".rela" + strlen (sec_name));
2997 1.6 christos if (name == NULL)
2998 1.6 christos return FALSE;
2999 1.6 christos
3000 1.6 christos sprintf (name, "%s%s", use_rela_p ? ".rela" : ".rel", sec_name);
3001 1.6 christos rel_hdr->sh_name =
3002 1.6 christos (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd), name,
3003 1.6 christos FALSE);
3004 1.6 christos if (rel_hdr->sh_name == (unsigned int) -1)
3005 1.6 christos return FALSE;
3006 1.6 christos
3007 1.6 christos return TRUE;
3008 1.1 christos }
3009 1.1 christos
3010 1.1 christos /* Allocate and initialize a section-header for a new reloc section,
3011 1.1 christos containing relocations against ASECT. It is stored in RELDATA. If
3012 1.1 christos USE_RELA_P is TRUE, we use RELA relocations; otherwise, we use REL
3013 1.4 christos relocations. */
3014 1.1 christos
3015 1.1 christos static bfd_boolean
3016 1.6 christos _bfd_elf_init_reloc_shdr (bfd *abfd,
3017 1.6 christos struct bfd_elf_section_reloc_data *reldata,
3018 1.6 christos const char *sec_name,
3019 1.1 christos bfd_boolean use_rela_p,
3020 1.1 christos bfd_boolean delay_st_name_p)
3021 1.1 christos {
3022 1.1 christos Elf_Internal_Shdr *rel_hdr;
3023 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3024 1.8 christos
3025 1.1 christos BFD_ASSERT (reldata->hdr == NULL);
3026 1.1 christos rel_hdr = bfd_zalloc (abfd, sizeof (*rel_hdr));
3027 1.6 christos reldata->hdr = rel_hdr;
3028 1.6 christos
3029 1.6 christos if (delay_st_name_p)
3030 1.6 christos rel_hdr->sh_name = (unsigned int) -1;
3031 1.1 christos else if (!_bfd_elf_set_reloc_sh_name (abfd, rel_hdr, sec_name,
3032 1.1 christos use_rela_p))
3033 1.1 christos return FALSE;
3034 1.1 christos rel_hdr->sh_type = use_rela_p ? SHT_RELA : SHT_REL;
3035 1.1 christos rel_hdr->sh_entsize = (use_rela_p
3036 1.1 christos ? bed->s->sizeof_rela
3037 1.1 christos : bed->s->sizeof_rel);
3038 1.1 christos rel_hdr->sh_addralign = (bfd_vma) 1 << bed->s->log_file_align;
3039 1.1 christos rel_hdr->sh_flags = 0;
3040 1.1 christos rel_hdr->sh_addr = 0;
3041 1.1 christos rel_hdr->sh_size = 0;
3042 1.1 christos rel_hdr->sh_offset = 0;
3043 1.1 christos
3044 1.1 christos return TRUE;
3045 1.1 christos }
3046 1.1 christos
3047 1.1 christos /* Return the default section type based on the passed in section flags. */
3048 1.1 christos
3049 1.1 christos int
3050 1.1 christos bfd_elf_get_default_section_type (flagword flags)
3051 1.1 christos {
3052 1.1 christos if ((flags & SEC_ALLOC) != 0
3053 1.1 christos && (flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
3054 1.1 christos return SHT_NOBITS;
3055 1.1 christos return SHT_PROGBITS;
3056 1.1 christos }
3057 1.1 christos
3058 1.1 christos struct fake_section_arg
3059 1.1 christos {
3060 1.1 christos struct bfd_link_info *link_info;
3061 1.1 christos bfd_boolean failed;
3062 1.1 christos };
3063 1.1 christos
3064 1.1 christos /* Set up an ELF internal section header for a section. */
3065 1.1 christos
3066 1.1 christos static void
3067 1.1 christos elf_fake_sections (bfd *abfd, asection *asect, void *fsarg)
3068 1.1 christos {
3069 1.1 christos struct fake_section_arg *arg = (struct fake_section_arg *)fsarg;
3070 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3071 1.1 christos struct bfd_elf_section_data *esd = elf_section_data (asect);
3072 1.6 christos Elf_Internal_Shdr *this_hdr;
3073 1.6 christos unsigned int sh_type;
3074 1.1 christos const char *name = asect->name;
3075 1.1 christos bfd_boolean delay_st_name_p = FALSE;
3076 1.1 christos
3077 1.1 christos if (arg->failed)
3078 1.1 christos {
3079 1.1 christos /* We already failed; just get out of the bfd_map_over_sections
3080 1.1 christos loop. */
3081 1.1 christos return;
3082 1.1 christos }
3083 1.1 christos
3084 1.6 christos this_hdr = &esd->this_hdr;
3085 1.6 christos
3086 1.6 christos if (arg->link_info)
3087 1.6 christos {
3088 1.6 christos /* ld: compress DWARF debug sections with names: .debug_*. */
3089 1.6 christos if ((arg->link_info->compress_debug & COMPRESS_DEBUG)
3090 1.6 christos && (asect->flags & SEC_DEBUGGING)
3091 1.6 christos && name[1] == 'd'
3092 1.6 christos && name[6] == '_')
3093 1.6 christos {
3094 1.6 christos /* Set SEC_ELF_COMPRESS to indicate this section should be
3095 1.6 christos compressed. */
3096 1.6 christos asect->flags |= SEC_ELF_COMPRESS;
3097 1.6 christos
3098 1.6 christos /* If this section will be compressed, delay adding setion
3099 1.6 christos name to section name section after it is compressed in
3100 1.6 christos _bfd_elf_assign_file_positions_for_non_load. */
3101 1.6 christos delay_st_name_p = TRUE;
3102 1.6 christos }
3103 1.6 christos }
3104 1.6 christos else if ((asect->flags & SEC_ELF_RENAME))
3105 1.6 christos {
3106 1.6 christos /* objcopy: rename output DWARF debug section. */
3107 1.6 christos if ((abfd->flags & (BFD_DECOMPRESS | BFD_COMPRESS_GABI)))
3108 1.6 christos {
3109 1.6 christos /* When we decompress or compress with SHF_COMPRESSED,
3110 1.6 christos convert section name from .zdebug_* to .debug_* if
3111 1.6 christos needed. */
3112 1.6 christos if (name[1] == 'z')
3113 1.6 christos {
3114 1.6 christos char *new_name = convert_zdebug_to_debug (abfd, name);
3115 1.6 christos if (new_name == NULL)
3116 1.6 christos {
3117 1.6 christos arg->failed = TRUE;
3118 1.6 christos return;
3119 1.6 christos }
3120 1.6 christos name = new_name;
3121 1.6 christos }
3122 1.6 christos }
3123 1.6 christos else if (asect->compress_status == COMPRESS_SECTION_DONE)
3124 1.6 christos {
3125 1.6 christos /* PR binutils/18087: Compression does not always make a
3126 1.6 christos section smaller. So only rename the section when
3127 1.6 christos compression has actually taken place. If input section
3128 1.6 christos name is .zdebug_*, we should never compress it again. */
3129 1.6 christos char *new_name = convert_debug_to_zdebug (abfd, name);
3130 1.6 christos if (new_name == NULL)
3131 1.6 christos {
3132 1.6 christos arg->failed = TRUE;
3133 1.6 christos return;
3134 1.6 christos }
3135 1.6 christos BFD_ASSERT (name[1] != 'z');
3136 1.6 christos name = new_name;
3137 1.6 christos }
3138 1.6 christos }
3139 1.6 christos
3140 1.6 christos if (delay_st_name_p)
3141 1.1 christos this_hdr->sh_name = (unsigned int) -1;
3142 1.6 christos else
3143 1.6 christos {
3144 1.6 christos this_hdr->sh_name
3145 1.6 christos = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
3146 1.6 christos name, FALSE);
3147 1.6 christos if (this_hdr->sh_name == (unsigned int) -1)
3148 1.6 christos {
3149 1.6 christos arg->failed = TRUE;
3150 1.1 christos return;
3151 1.1 christos }
3152 1.1 christos }
3153 1.1 christos
3154 1.1 christos /* Don't clear sh_flags. Assembler may set additional bits. */
3155 1.1 christos
3156 1.1 christos if ((asect->flags & SEC_ALLOC) != 0
3157 1.1 christos || asect->user_set_vma)
3158 1.1 christos this_hdr->sh_addr = asect->vma;
3159 1.1 christos else
3160 1.1 christos this_hdr->sh_addr = 0;
3161 1.1 christos
3162 1.1 christos this_hdr->sh_offset = 0;
3163 1.6 christos this_hdr->sh_size = asect->size;
3164 1.6 christos this_hdr->sh_link = 0;
3165 1.6 christos /* PR 17512: file: 0eb809fe, 8b0535ee. */
3166 1.6 christos if (asect->alignment_power >= (sizeof (bfd_vma) * 8) - 1)
3167 1.6 christos {
3168 1.6 christos (*_bfd_error_handler)
3169 1.6 christos (_("%B: error: Alignment power %d of section `%A' is too big"),
3170 1.6 christos abfd, asect, asect->alignment_power);
3171 1.6 christos arg->failed = TRUE;
3172 1.1 christos return;
3173 1.1 christos }
3174 1.1 christos this_hdr->sh_addralign = (bfd_vma) 1 << asect->alignment_power;
3175 1.1 christos /* The sh_entsize and sh_info fields may have been set already by
3176 1.1 christos copy_private_section_data. */
3177 1.1 christos
3178 1.1 christos this_hdr->bfd_section = asect;
3179 1.1 christos this_hdr->contents = NULL;
3180 1.1 christos
3181 1.1 christos /* If the section type is unspecified, we set it based on
3182 1.1 christos asect->flags. */
3183 1.1 christos if ((asect->flags & SEC_GROUP) != 0)
3184 1.1 christos sh_type = SHT_GROUP;
3185 1.1 christos else
3186 1.1 christos sh_type = bfd_elf_get_default_section_type (asect->flags);
3187 1.1 christos
3188 1.1 christos if (this_hdr->sh_type == SHT_NULL)
3189 1.1 christos this_hdr->sh_type = sh_type;
3190 1.1 christos else if (this_hdr->sh_type == SHT_NOBITS
3191 1.1 christos && sh_type == SHT_PROGBITS
3192 1.1 christos && (asect->flags & SEC_ALLOC) != 0)
3193 1.1 christos {
3194 1.1 christos /* Warn if we are changing a NOBITS section to PROGBITS, but
3195 1.1 christos allow the link to proceed. This can happen when users link
3196 1.1 christos non-bss input sections to bss output sections, or emit data
3197 1.1 christos to a bss output section via a linker script. */
3198 1.1 christos (*_bfd_error_handler)
3199 1.1 christos (_("warning: section `%A' type changed to PROGBITS"), asect);
3200 1.1 christos this_hdr->sh_type = sh_type;
3201 1.1 christos }
3202 1.1 christos
3203 1.1 christos switch (this_hdr->sh_type)
3204 1.1 christos {
3205 1.1 christos default:
3206 1.1 christos break;
3207 1.8 christos
3208 1.8 christos case SHT_STRTAB:
3209 1.8 christos case SHT_NOTE:
3210 1.8 christos case SHT_NOBITS:
3211 1.8 christos case SHT_PROGBITS:
3212 1.1 christos break;
3213 1.1 christos
3214 1.1 christos case SHT_INIT_ARRAY:
3215 1.8 christos case SHT_FINI_ARRAY:
3216 1.1 christos case SHT_PREINIT_ARRAY:
3217 1.1 christos this_hdr->sh_entsize = bed->s->arch_size / 8;
3218 1.1 christos break;
3219 1.1 christos
3220 1.1 christos case SHT_HASH:
3221 1.1 christos this_hdr->sh_entsize = bed->s->sizeof_hash_entry;
3222 1.1 christos break;
3223 1.1 christos
3224 1.1 christos case SHT_DYNSYM:
3225 1.1 christos this_hdr->sh_entsize = bed->s->sizeof_sym;
3226 1.1 christos break;
3227 1.1 christos
3228 1.1 christos case SHT_DYNAMIC:
3229 1.1 christos this_hdr->sh_entsize = bed->s->sizeof_dyn;
3230 1.1 christos break;
3231 1.1 christos
3232 1.1 christos case SHT_RELA:
3233 1.1 christos if (get_elf_backend_data (abfd)->may_use_rela_p)
3234 1.1 christos this_hdr->sh_entsize = bed->s->sizeof_rela;
3235 1.1 christos break;
3236 1.1 christos
3237 1.1 christos case SHT_REL:
3238 1.1 christos if (get_elf_backend_data (abfd)->may_use_rel_p)
3239 1.1 christos this_hdr->sh_entsize = bed->s->sizeof_rel;
3240 1.1 christos break;
3241 1.1 christos
3242 1.1 christos case SHT_GNU_versym:
3243 1.1 christos this_hdr->sh_entsize = sizeof (Elf_External_Versym);
3244 1.1 christos break;
3245 1.1 christos
3246 1.1 christos case SHT_GNU_verdef:
3247 1.1 christos this_hdr->sh_entsize = 0;
3248 1.1 christos /* objcopy or strip will copy over sh_info, but may not set
3249 1.1 christos cverdefs. The linker will set cverdefs, but sh_info will be
3250 1.1 christos zero. */
3251 1.1 christos if (this_hdr->sh_info == 0)
3252 1.1 christos this_hdr->sh_info = elf_tdata (abfd)->cverdefs;
3253 1.1 christos else
3254 1.1 christos BFD_ASSERT (elf_tdata (abfd)->cverdefs == 0
3255 1.1 christos || this_hdr->sh_info == elf_tdata (abfd)->cverdefs);
3256 1.1 christos break;
3257 1.1 christos
3258 1.1 christos case SHT_GNU_verneed:
3259 1.1 christos this_hdr->sh_entsize = 0;
3260 1.1 christos /* objcopy or strip will copy over sh_info, but may not set
3261 1.1 christos cverrefs. The linker will set cverrefs, but sh_info will be
3262 1.1 christos zero. */
3263 1.1 christos if (this_hdr->sh_info == 0)
3264 1.1 christos this_hdr->sh_info = elf_tdata (abfd)->cverrefs;
3265 1.1 christos else
3266 1.1 christos BFD_ASSERT (elf_tdata (abfd)->cverrefs == 0
3267 1.1 christos || this_hdr->sh_info == elf_tdata (abfd)->cverrefs);
3268 1.1 christos break;
3269 1.1 christos
3270 1.1 christos case SHT_GROUP:
3271 1.1 christos this_hdr->sh_entsize = GRP_ENTRY_SIZE;
3272 1.1 christos break;
3273 1.1 christos
3274 1.1 christos case SHT_GNU_HASH:
3275 1.1 christos this_hdr->sh_entsize = bed->s->arch_size == 64 ? 0 : 4;
3276 1.1 christos break;
3277 1.1 christos }
3278 1.1 christos
3279 1.1 christos if ((asect->flags & SEC_ALLOC) != 0)
3280 1.1 christos this_hdr->sh_flags |= SHF_ALLOC;
3281 1.1 christos if ((asect->flags & SEC_READONLY) == 0)
3282 1.1 christos this_hdr->sh_flags |= SHF_WRITE;
3283 1.1 christos if ((asect->flags & SEC_CODE) != 0)
3284 1.1 christos this_hdr->sh_flags |= SHF_EXECINSTR;
3285 1.1 christos if ((asect->flags & SEC_MERGE) != 0)
3286 1.1 christos {
3287 1.1 christos this_hdr->sh_flags |= SHF_MERGE;
3288 1.8 christos this_hdr->sh_entsize = asect->entsize;
3289 1.8 christos }
3290 1.1 christos if ((asect->flags & SEC_STRINGS) != 0)
3291 1.1 christos this_hdr->sh_flags |= SHF_STRINGS;
3292 1.1 christos if ((asect->flags & SEC_GROUP) == 0 && elf_group_name (asect) != NULL)
3293 1.1 christos this_hdr->sh_flags |= SHF_GROUP;
3294 1.1 christos if ((asect->flags & SEC_THREAD_LOCAL) != 0)
3295 1.1 christos {
3296 1.1 christos this_hdr->sh_flags |= SHF_TLS;
3297 1.1 christos if (asect->size == 0
3298 1.1 christos && (asect->flags & SEC_HAS_CONTENTS) == 0)
3299 1.1 christos {
3300 1.1 christos struct bfd_link_order *o = asect->map_tail.link_order;
3301 1.1 christos
3302 1.1 christos this_hdr->sh_size = 0;
3303 1.1 christos if (o != NULL)
3304 1.1 christos {
3305 1.1 christos this_hdr->sh_size = o->offset + o->size;
3306 1.1 christos if (this_hdr->sh_size != 0)
3307 1.1 christos this_hdr->sh_type = SHT_NOBITS;
3308 1.1 christos }
3309 1.1 christos }
3310 1.1 christos }
3311 1.1 christos if ((asect->flags & (SEC_GROUP | SEC_EXCLUDE)) == SEC_EXCLUDE)
3312 1.1 christos this_hdr->sh_flags |= SHF_EXCLUDE;
3313 1.1 christos
3314 1.1 christos /* If the section has relocs, set up a section header for the
3315 1.1 christos SHT_REL[A] section. If two relocation sections are required for
3316 1.1 christos this section, it is up to the processor-specific back-end to
3317 1.1 christos create the other. */
3318 1.1 christos if ((asect->flags & SEC_RELOC) != 0)
3319 1.1 christos {
3320 1.1 christos /* When doing a relocatable link, create both REL and RELA sections if
3321 1.1 christos needed. */
3322 1.1 christos if (arg->link_info
3323 1.8 christos /* Do the normal setup if we wouldn't create any sections here. */
3324 1.8 christos && esd->rel.count + esd->rela.count > 0
3325 1.1 christos && (bfd_link_relocatable (arg->link_info)
3326 1.1 christos || arg->link_info->emitrelocations))
3327 1.6 christos {
3328 1.6 christos if (esd->rel.count && esd->rel.hdr == NULL
3329 1.1 christos && !_bfd_elf_init_reloc_shdr (abfd, &esd->rel, name, FALSE,
3330 1.1 christos delay_st_name_p))
3331 1.1 christos {
3332 1.1 christos arg->failed = TRUE;
3333 1.1 christos return;
3334 1.6 christos }
3335 1.6 christos if (esd->rela.count && esd->rela.hdr == NULL
3336 1.1 christos && !_bfd_elf_init_reloc_shdr (abfd, &esd->rela, name, TRUE,
3337 1.1 christos delay_st_name_p))
3338 1.1 christos {
3339 1.1 christos arg->failed = TRUE;
3340 1.1 christos return;
3341 1.1 christos }
3342 1.1 christos }
3343 1.1 christos else if (!_bfd_elf_init_reloc_shdr (abfd,
3344 1.6 christos (asect->use_rela_p
3345 1.6 christos ? &esd->rela : &esd->rel),
3346 1.6 christos name,
3347 1.1 christos asect->use_rela_p,
3348 1.1 christos delay_st_name_p))
3349 1.1 christos arg->failed = TRUE;
3350 1.1 christos }
3351 1.1 christos
3352 1.1 christos /* Check for processor-specific section types. */
3353 1.1 christos sh_type = this_hdr->sh_type;
3354 1.1 christos if (bed->elf_backend_fake_sections
3355 1.1 christos && !(*bed->elf_backend_fake_sections) (abfd, this_hdr, asect))
3356 1.1 christos arg->failed = TRUE;
3357 1.1 christos
3358 1.1 christos if (sh_type == SHT_NOBITS && asect->size != 0)
3359 1.1 christos {
3360 1.1 christos /* Don't change the header type from NOBITS if we are being
3361 1.1 christos called for objcopy --only-keep-debug. */
3362 1.1 christos this_hdr->sh_type = sh_type;
3363 1.1 christos }
3364 1.1 christos }
3365 1.1 christos
3366 1.1 christos /* Fill in the contents of a SHT_GROUP section. Called from
3367 1.1 christos _bfd_elf_compute_section_file_positions for gas, objcopy, and
3368 1.1 christos when ELF targets use the generic linker, ld. Called for ld -r
3369 1.1 christos from bfd_elf_final_link. */
3370 1.1 christos
3371 1.1 christos void
3372 1.1 christos bfd_elf_set_group_contents (bfd *abfd, asection *sec, void *failedptrarg)
3373 1.1 christos {
3374 1.1 christos bfd_boolean *failedptr = (bfd_boolean *) failedptrarg;
3375 1.1 christos asection *elt, *first;
3376 1.1 christos unsigned char *loc;
3377 1.1 christos bfd_boolean gas;
3378 1.1 christos
3379 1.1 christos /* Ignore linker created group section. See elfNN_ia64_object_p in
3380 1.1 christos elfxx-ia64.c. */
3381 1.1 christos if (((sec->flags & (SEC_GROUP | SEC_LINKER_CREATED)) != SEC_GROUP)
3382 1.1 christos || *failedptr)
3383 1.1 christos return;
3384 1.1 christos
3385 1.1 christos if (elf_section_data (sec)->this_hdr.sh_info == 0)
3386 1.1 christos {
3387 1.1 christos unsigned long symindx = 0;
3388 1.1 christos
3389 1.1 christos /* elf_group_id will have been set up by objcopy and the
3390 1.1 christos generic linker. */
3391 1.1 christos if (elf_group_id (sec) != NULL)
3392 1.1 christos symindx = elf_group_id (sec)->udata.i;
3393 1.1 christos
3394 1.1 christos if (symindx == 0)
3395 1.1 christos {
3396 1.1 christos /* If called from the assembler, swap_out_syms will have set up
3397 1.1 christos elf_section_syms. */
3398 1.1 christos BFD_ASSERT (elf_section_syms (abfd) != NULL);
3399 1.1 christos symindx = elf_section_syms (abfd)[sec->index]->udata.i;
3400 1.1 christos }
3401 1.1 christos elf_section_data (sec)->this_hdr.sh_info = symindx;
3402 1.1 christos }
3403 1.1 christos else if (elf_section_data (sec)->this_hdr.sh_info == (unsigned int) -2)
3404 1.1 christos {
3405 1.1 christos /* The ELF backend linker sets sh_info to -2 when the group
3406 1.1 christos signature symbol is global, and thus the index can't be
3407 1.1 christos set until all local symbols are output. */
3408 1.1 christos asection *igroup = elf_sec_group (elf_next_in_group (sec));
3409 1.1 christos struct bfd_elf_section_data *sec_data = elf_section_data (igroup);
3410 1.1 christos unsigned long symndx = sec_data->this_hdr.sh_info;
3411 1.1 christos unsigned long extsymoff = 0;
3412 1.1 christos struct elf_link_hash_entry *h;
3413 1.1 christos
3414 1.1 christos if (!elf_bad_symtab (igroup->owner))
3415 1.1 christos {
3416 1.1 christos Elf_Internal_Shdr *symtab_hdr;
3417 1.1 christos
3418 1.1 christos symtab_hdr = &elf_tdata (igroup->owner)->symtab_hdr;
3419 1.1 christos extsymoff = symtab_hdr->sh_info;
3420 1.1 christos }
3421 1.1 christos h = elf_sym_hashes (igroup->owner)[symndx - extsymoff];
3422 1.1 christos while (h->root.type == bfd_link_hash_indirect
3423 1.1 christos || h->root.type == bfd_link_hash_warning)
3424 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link;
3425 1.1 christos
3426 1.1 christos elf_section_data (sec)->this_hdr.sh_info = h->indx;
3427 1.1 christos }
3428 1.1 christos
3429 1.1 christos /* The contents won't be allocated for "ld -r" or objcopy. */
3430 1.1 christos gas = TRUE;
3431 1.1 christos if (sec->contents == NULL)
3432 1.1 christos {
3433 1.1 christos gas = FALSE;
3434 1.1 christos sec->contents = (unsigned char *) bfd_alloc (abfd, sec->size);
3435 1.1 christos
3436 1.1 christos /* Arrange for the section to be written out. */
3437 1.1 christos elf_section_data (sec)->this_hdr.contents = sec->contents;
3438 1.1 christos if (sec->contents == NULL)
3439 1.1 christos {
3440 1.1 christos *failedptr = TRUE;
3441 1.1 christos return;
3442 1.1 christos }
3443 1.1 christos }
3444 1.1 christos
3445 1.1 christos loc = sec->contents + sec->size;
3446 1.1 christos
3447 1.1 christos /* Get the pointer to the first section in the group that gas
3448 1.1 christos squirreled away here. objcopy arranges for this to be set to the
3449 1.1 christos start of the input section group. */
3450 1.1 christos first = elt = elf_next_in_group (sec);
3451 1.1 christos
3452 1.1 christos /* First element is a flag word. Rest of section is elf section
3453 1.1 christos indices for all the sections of the group. Write them backwards
3454 1.1 christos just to keep the group in the same order as given in .section
3455 1.1 christos directives, not that it matters. */
3456 1.1 christos while (elt != NULL)
3457 1.1 christos {
3458 1.1 christos asection *s;
3459 1.1 christos
3460 1.1 christos s = elt;
3461 1.1 christos if (!gas)
3462 1.1 christos s = s->output_section;
3463 1.1 christos if (s != NULL
3464 1.1 christos && !bfd_is_abs_section (s))
3465 1.1 christos {
3466 1.1 christos unsigned int idx = elf_section_data (s)->this_idx;
3467 1.1 christos
3468 1.1 christos loc -= 4;
3469 1.1 christos H_PUT_32 (abfd, idx, loc);
3470 1.1 christos }
3471 1.1 christos elt = elf_next_in_group (elt);
3472 1.1 christos if (elt == first)
3473 1.1 christos break;
3474 1.1 christos }
3475 1.1 christos
3476 1.1 christos if ((loc -= 4) != sec->contents)
3477 1.1 christos abort ();
3478 1.1 christos
3479 1.1 christos H_PUT_32 (abfd, sec->flags & SEC_LINK_ONCE ? GRP_COMDAT : 0, loc);
3480 1.6 christos }
3481 1.6 christos
3482 1.6 christos /* Return the section which RELOC_SEC applies to. */
3483 1.6 christos
3484 1.6 christos asection *
3485 1.6 christos _bfd_elf_get_reloc_section (asection *reloc_sec)
3486 1.6 christos {
3487 1.6 christos const char *name;
3488 1.6 christos unsigned int type;
3489 1.6 christos bfd *abfd;
3490 1.6 christos
3491 1.6 christos if (reloc_sec == NULL)
3492 1.6 christos return NULL;
3493 1.6 christos
3494 1.6 christos type = elf_section_data (reloc_sec)->this_hdr.sh_type;
3495 1.6 christos if (type != SHT_REL && type != SHT_RELA)
3496 1.6 christos return NULL;
3497 1.6 christos
3498 1.6 christos /* We look up the section the relocs apply to by name. */
3499 1.6 christos name = reloc_sec->name;
3500 1.6 christos if (type == SHT_REL)
3501 1.6 christos name += 4;
3502 1.6 christos else
3503 1.6 christos name += 5;
3504 1.6 christos
3505 1.6 christos /* If a target needs .got.plt section, relocations in rela.plt/rel.plt
3506 1.6 christos section apply to .got.plt section. */
3507 1.6 christos abfd = reloc_sec->owner;
3508 1.6 christos if (get_elf_backend_data (abfd)->want_got_plt
3509 1.6 christos && strcmp (name, ".plt") == 0)
3510 1.6 christos {
3511 1.6 christos /* .got.plt is a linker created input section. It may be mapped
3512 1.6 christos to some other output section. Try two likely sections. */
3513 1.6 christos name = ".got.plt";
3514 1.6 christos reloc_sec = bfd_get_section_by_name (abfd, name);
3515 1.6 christos if (reloc_sec != NULL)
3516 1.6 christos return reloc_sec;
3517 1.6 christos name = ".got";
3518 1.6 christos }
3519 1.6 christos
3520 1.6 christos reloc_sec = bfd_get_section_by_name (abfd, name);
3521 1.6 christos return reloc_sec;
3522 1.1 christos }
3523 1.1 christos
3524 1.1 christos /* Assign all ELF section numbers. The dummy first section is handled here
3525 1.1 christos too. The link/info pointers for the standard section types are filled
3526 1.1 christos in here too, while we're at it. */
3527 1.1 christos
3528 1.1 christos static bfd_boolean
3529 1.1 christos assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
3530 1.1 christos {
3531 1.6 christos struct elf_obj_tdata *t = elf_tdata (abfd);
3532 1.1 christos asection *sec;
3533 1.1 christos unsigned int section_number;
3534 1.1 christos Elf_Internal_Shdr **i_shdrp;
3535 1.1 christos struct bfd_elf_section_data *d;
3536 1.1 christos bfd_boolean need_symtab;
3537 1.1 christos
3538 1.1 christos section_number = 1;
3539 1.1 christos
3540 1.1 christos _bfd_elf_strtab_clear_all_refs (elf_shstrtab (abfd));
3541 1.8 christos
3542 1.1 christos /* SHT_GROUP sections are in relocatable files only. */
3543 1.8 christos if (link_info == NULL || bfd_link_relocatable (link_info))
3544 1.8 christos {
3545 1.1 christos size_t reloc_count = 0;
3546 1.1 christos
3547 1.1 christos /* Put SHT_GROUP sections first. */
3548 1.1 christos for (sec = abfd->sections; sec != NULL; sec = sec->next)
3549 1.1 christos {
3550 1.1 christos d = elf_section_data (sec);
3551 1.1 christos
3552 1.1 christos if (d->this_hdr.sh_type == SHT_GROUP)
3553 1.1 christos {
3554 1.1 christos if (sec->flags & SEC_LINKER_CREATED)
3555 1.1 christos {
3556 1.1 christos /* Remove the linker created SHT_GROUP sections. */
3557 1.1 christos bfd_section_list_remove (abfd, sec);
3558 1.1 christos abfd->section_count--;
3559 1.1 christos }
3560 1.1 christos else
3561 1.8 christos d->this_idx = section_number++;
3562 1.8 christos }
3563 1.8 christos
3564 1.1 christos /* Count relocations. */
3565 1.8 christos reloc_count += sec->reloc_count;
3566 1.8 christos }
3567 1.8 christos
3568 1.8 christos /* Clear HAS_RELOC if there are no relocations. */
3569 1.1 christos if (reloc_count == 0)
3570 1.1 christos abfd->flags &= ~HAS_RELOC;
3571 1.1 christos }
3572 1.1 christos
3573 1.1 christos for (sec = abfd->sections; sec; sec = sec->next)
3574 1.1 christos {
3575 1.1 christos d = elf_section_data (sec);
3576 1.1 christos
3577 1.6 christos if (d->this_hdr.sh_type != SHT_GROUP)
3578 1.6 christos d->this_idx = section_number++;
3579 1.1 christos if (d->this_hdr.sh_name != (unsigned int) -1)
3580 1.1 christos _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->this_hdr.sh_name);
3581 1.1 christos if (d->rel.hdr)
3582 1.6 christos {
3583 1.6 christos d->rel.idx = section_number++;
3584 1.1 christos if (d->rel.hdr->sh_name != (unsigned int) -1)
3585 1.1 christos _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->rel.hdr->sh_name);
3586 1.1 christos }
3587 1.1 christos else
3588 1.1 christos d->rel.idx = 0;
3589 1.1 christos
3590 1.1 christos if (d->rela.hdr)
3591 1.6 christos {
3592 1.6 christos d->rela.idx = section_number++;
3593 1.1 christos if (d->rela.hdr->sh_name != (unsigned int) -1)
3594 1.1 christos _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->rela.hdr->sh_name);
3595 1.1 christos }
3596 1.1 christos else
3597 1.1 christos d->rela.idx = 0;
3598 1.3 christos }
3599 1.1 christos
3600 1.3 christos elf_shstrtab_sec (abfd) = section_number++;
3601 1.1 christos _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->shstrtab_hdr.sh_name);
3602 1.1 christos elf_elfheader (abfd)->e_shstrndx = elf_shstrtab_sec (abfd);
3603 1.1 christos
3604 1.1 christos need_symtab = (bfd_get_symcount (abfd) > 0
3605 1.1 christos || (link_info == NULL
3606 1.1 christos && ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC))
3607 1.1 christos == HAS_RELOC)));
3608 1.3 christos if (need_symtab)
3609 1.1 christos {
3610 1.1 christos elf_onesymtab (abfd) = section_number++;
3611 1.1 christos _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->symtab_hdr.sh_name);
3612 1.8 christos if (section_number > ((SHN_LORESERVE - 2) & 0xFFFF))
3613 1.8 christos {
3614 1.8 christos elf_section_list * entry;
3615 1.8 christos
3616 1.8 christos BFD_ASSERT (elf_symtab_shndx_list (abfd) == NULL);
3617 1.8 christos
3618 1.8 christos entry = bfd_zalloc (abfd, sizeof * entry);
3619 1.8 christos entry->ndx = section_number++;
3620 1.1 christos elf_symtab_shndx_list (abfd) = entry;
3621 1.1 christos entry->hdr.sh_name
3622 1.8 christos = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
3623 1.1 christos ".symtab_shndx", FALSE);
3624 1.1 christos if (entry->hdr.sh_name == (unsigned int) -1)
3625 1.3 christos return FALSE;
3626 1.1 christos }
3627 1.1 christos elf_strtab_sec (abfd) = section_number++;
3628 1.1 christos _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->strtab_hdr.sh_name);
3629 1.3 christos }
3630 1.3 christos
3631 1.3 christos if (section_number >= SHN_LORESERVE)
3632 1.3 christos {
3633 1.3 christos _bfd_error_handler (_("%B: too many sections: %u"),
3634 1.3 christos abfd, section_number);
3635 1.3 christos return FALSE;
3636 1.1 christos }
3637 1.1 christos
3638 1.1 christos elf_numsections (abfd) = section_number;
3639 1.1 christos elf_elfheader (abfd)->e_shnum = section_number;
3640 1.1 christos
3641 1.1 christos /* Set up the list of section header pointers, in agreement with the
3642 1.1 christos indices. */
3643 1.1 christos i_shdrp = (Elf_Internal_Shdr **) bfd_zalloc2 (abfd, section_number,
3644 1.1 christos sizeof (Elf_Internal_Shdr *));
3645 1.1 christos if (i_shdrp == NULL)
3646 1.1 christos return FALSE;
3647 1.1 christos
3648 1.1 christos i_shdrp[0] = (Elf_Internal_Shdr *) bfd_zalloc (abfd,
3649 1.1 christos sizeof (Elf_Internal_Shdr));
3650 1.1 christos if (i_shdrp[0] == NULL)
3651 1.1 christos {
3652 1.1 christos bfd_release (abfd, i_shdrp);
3653 1.1 christos return FALSE;
3654 1.1 christos }
3655 1.1 christos
3656 1.3 christos elf_elfsections (abfd) = i_shdrp;
3657 1.1 christos
3658 1.1 christos i_shdrp[elf_shstrtab_sec (abfd)] = &t->shstrtab_hdr;
3659 1.3 christos if (need_symtab)
3660 1.1 christos {
3661 1.1 christos i_shdrp[elf_onesymtab (abfd)] = &t->symtab_hdr;
3662 1.8 christos if (elf_numsections (abfd) > (SHN_LORESERVE & 0xFFFF))
3663 1.8 christos {
3664 1.8 christos elf_section_list * entry = elf_symtab_shndx_list (abfd);
3665 1.8 christos BFD_ASSERT (entry != NULL);
3666 1.1 christos i_shdrp[entry->ndx] = & entry->hdr;
3667 1.3 christos entry->hdr.sh_link = elf_onesymtab (abfd);
3668 1.3 christos }
3669 1.1 christos i_shdrp[elf_strtab_sec (abfd)] = &t->strtab_hdr;
3670 1.1 christos t->symtab_hdr.sh_link = elf_strtab_sec (abfd);
3671 1.1 christos }
3672 1.1 christos
3673 1.1 christos for (sec = abfd->sections; sec; sec = sec->next)
3674 1.1 christos {
3675 1.1 christos asection *s;
3676 1.1 christos
3677 1.1 christos d = elf_section_data (sec);
3678 1.1 christos
3679 1.1 christos i_shdrp[d->this_idx] = &d->this_hdr;
3680 1.1 christos if (d->rel.idx != 0)
3681 1.1 christos i_shdrp[d->rel.idx] = d->rel.hdr;
3682 1.1 christos if (d->rela.idx != 0)
3683 1.1 christos i_shdrp[d->rela.idx] = d->rela.hdr;
3684 1.1 christos
3685 1.1 christos /* Fill in the sh_link and sh_info fields while we're at it. */
3686 1.1 christos
3687 1.1 christos /* sh_link of a reloc section is the section index of the symbol
3688 1.1 christos table. sh_info is the section index of the section to which
3689 1.1 christos the relocation entries apply. */
3690 1.3 christos if (d->rel.idx != 0)
3691 1.1 christos {
3692 1.4 christos d->rel.hdr->sh_link = elf_onesymtab (abfd);
3693 1.1 christos d->rel.hdr->sh_info = d->this_idx;
3694 1.1 christos d->rel.hdr->sh_flags |= SHF_INFO_LINK;
3695 1.1 christos }
3696 1.3 christos if (d->rela.idx != 0)
3697 1.1 christos {
3698 1.4 christos d->rela.hdr->sh_link = elf_onesymtab (abfd);
3699 1.1 christos d->rela.hdr->sh_info = d->this_idx;
3700 1.1 christos d->rela.hdr->sh_flags |= SHF_INFO_LINK;
3701 1.1 christos }
3702 1.1 christos
3703 1.1 christos /* We need to set up sh_link for SHF_LINK_ORDER. */
3704 1.1 christos if ((d->this_hdr.sh_flags & SHF_LINK_ORDER) != 0)
3705 1.1 christos {
3706 1.1 christos s = elf_linked_to_section (sec);
3707 1.1 christos if (s)
3708 1.1 christos {
3709 1.1 christos /* elf_linked_to_section points to the input section. */
3710 1.1 christos if (link_info != NULL)
3711 1.3 christos {
3712 1.1 christos /* Check discarded linkonce section. */
3713 1.1 christos if (discarded_section (s))
3714 1.1 christos {
3715 1.1 christos asection *kept;
3716 1.1 christos (*_bfd_error_handler)
3717 1.1 christos (_("%B: sh_link of section `%A' points to discarded section `%A' of `%B'"),
3718 1.1 christos abfd, d->this_hdr.bfd_section,
3719 1.1 christos s, s->owner);
3720 1.1 christos /* Point to the kept section if it has the same
3721 1.1 christos size as the discarded one. */
3722 1.1 christos kept = _bfd_elf_check_kept_section (s, link_info);
3723 1.1 christos if (kept == NULL)
3724 1.1 christos {
3725 1.1 christos bfd_set_error (bfd_error_bad_value);
3726 1.1 christos return FALSE;
3727 1.1 christos }
3728 1.1 christos s = kept;
3729 1.1 christos }
3730 1.1 christos
3731 1.1 christos s = s->output_section;
3732 1.1 christos BFD_ASSERT (s != NULL);
3733 1.1 christos }
3734 1.1 christos else
3735 1.1 christos {
3736 1.1 christos /* Handle objcopy. */
3737 1.1 christos if (s->output_section == NULL)
3738 1.1 christos {
3739 1.1 christos (*_bfd_error_handler)
3740 1.1 christos (_("%B: sh_link of section `%A' points to removed section `%A' of `%B'"),
3741 1.1 christos abfd, d->this_hdr.bfd_section, s, s->owner);
3742 1.1 christos bfd_set_error (bfd_error_bad_value);
3743 1.1 christos return FALSE;
3744 1.1 christos }
3745 1.1 christos s = s->output_section;
3746 1.1 christos }
3747 1.1 christos d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3748 1.1 christos }
3749 1.1 christos else
3750 1.1 christos {
3751 1.1 christos /* PR 290:
3752 1.1 christos The Intel C compiler generates SHT_IA_64_UNWIND with
3753 1.1 christos SHF_LINK_ORDER. But it doesn't set the sh_link or
3754 1.1 christos sh_info fields. Hence we could get the situation
3755 1.1 christos where s is NULL. */
3756 1.1 christos const struct elf_backend_data *bed
3757 1.1 christos = get_elf_backend_data (abfd);
3758 1.1 christos if (bed->link_order_error_handler)
3759 1.1 christos bed->link_order_error_handler
3760 1.1 christos (_("%B: warning: sh_link not set for section `%A'"),
3761 1.1 christos abfd, sec);
3762 1.1 christos }
3763 1.1 christos }
3764 1.1 christos
3765 1.1 christos switch (d->this_hdr.sh_type)
3766 1.1 christos {
3767 1.1 christos case SHT_REL:
3768 1.1 christos case SHT_RELA:
3769 1.1 christos /* A reloc section which we are treating as a normal BFD
3770 1.1 christos section. sh_link is the section index of the symbol
3771 1.1 christos table. sh_info is the section index of the section to
3772 1.1 christos which the relocation entries apply. We assume that an
3773 1.1 christos allocated reloc section uses the dynamic symbol table.
3774 1.1 christos FIXME: How can we be sure? */
3775 1.1 christos s = bfd_get_section_by_name (abfd, ".dynsym");
3776 1.1 christos if (s != NULL)
3777 1.6 christos d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3778 1.1 christos
3779 1.4 christos s = get_elf_backend_data (abfd)->get_reloc_section (sec);
3780 1.4 christos if (s != NULL)
3781 1.4 christos {
3782 1.4 christos d->this_hdr.sh_info = elf_section_data (s)->this_idx;
3783 1.1 christos d->this_hdr.sh_flags |= SHF_INFO_LINK;
3784 1.1 christos }
3785 1.1 christos break;
3786 1.1 christos
3787 1.1 christos case SHT_STRTAB:
3788 1.1 christos /* We assume that a section named .stab*str is a stabs
3789 1.1 christos string section. We look for a section with the same name
3790 1.1 christos but without the trailing ``str'', and set its sh_link
3791 1.1 christos field to point to this section. */
3792 1.1 christos if (CONST_STRNEQ (sec->name, ".stab")
3793 1.1 christos && strcmp (sec->name + strlen (sec->name) - 3, "str") == 0)
3794 1.1 christos {
3795 1.1 christos size_t len;
3796 1.1 christos char *alc;
3797 1.1 christos
3798 1.1 christos len = strlen (sec->name);
3799 1.1 christos alc = (char *) bfd_malloc (len - 2);
3800 1.1 christos if (alc == NULL)
3801 1.1 christos return FALSE;
3802 1.1 christos memcpy (alc, sec->name, len - 3);
3803 1.1 christos alc[len - 3] = '\0';
3804 1.1 christos s = bfd_get_section_by_name (abfd, alc);
3805 1.1 christos free (alc);
3806 1.1 christos if (s != NULL)
3807 1.1 christos {
3808 1.1 christos elf_section_data (s)->this_hdr.sh_link = d->this_idx;
3809 1.1 christos
3810 1.1 christos /* This is a .stab section. */
3811 1.1 christos if (elf_section_data (s)->this_hdr.sh_entsize == 0)
3812 1.1 christos elf_section_data (s)->this_hdr.sh_entsize
3813 1.1 christos = 4 + 2 * bfd_get_arch_size (abfd) / 8;
3814 1.1 christos }
3815 1.1 christos }
3816 1.1 christos break;
3817 1.1 christos
3818 1.1 christos case SHT_DYNAMIC:
3819 1.1 christos case SHT_DYNSYM:
3820 1.1 christos case SHT_GNU_verneed:
3821 1.1 christos case SHT_GNU_verdef:
3822 1.1 christos /* sh_link is the section header index of the string table
3823 1.1 christos used for the dynamic entries, or the symbol table, or the
3824 1.1 christos version strings. */
3825 1.1 christos s = bfd_get_section_by_name (abfd, ".dynstr");
3826 1.1 christos if (s != NULL)
3827 1.1 christos d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3828 1.1 christos break;
3829 1.1 christos
3830 1.1 christos case SHT_GNU_LIBLIST:
3831 1.1 christos /* sh_link is the section header index of the prelink library
3832 1.1 christos list used for the dynamic entries, or the symbol table, or
3833 1.1 christos the version strings. */
3834 1.1 christos s = bfd_get_section_by_name (abfd, (sec->flags & SEC_ALLOC)
3835 1.1 christos ? ".dynstr" : ".gnu.libstr");
3836 1.1 christos if (s != NULL)
3837 1.1 christos d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3838 1.1 christos break;
3839 1.1 christos
3840 1.1 christos case SHT_HASH:
3841 1.1 christos case SHT_GNU_HASH:
3842 1.1 christos case SHT_GNU_versym:
3843 1.1 christos /* sh_link is the section header index of the symbol table
3844 1.1 christos this hash table or version table is for. */
3845 1.1 christos s = bfd_get_section_by_name (abfd, ".dynsym");
3846 1.1 christos if (s != NULL)
3847 1.1 christos d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3848 1.1 christos break;
3849 1.3 christos
3850 1.1 christos case SHT_GROUP:
3851 1.1 christos d->this_hdr.sh_link = elf_onesymtab (abfd);
3852 1.1 christos }
3853 1.6 christos }
3854 1.6 christos
3855 1.6 christos /* Delay setting sh_name to _bfd_elf_write_object_contents so that
3856 1.6 christos _bfd_elf_assign_file_positions_for_non_load can convert DWARF
3857 1.1 christos debug section name from .debug_* to .zdebug_* if needed. */
3858 1.1 christos
3859 1.1 christos return TRUE;
3860 1.1 christos }
3861 1.1 christos
3862 1.1 christos static bfd_boolean
3863 1.1 christos sym_is_global (bfd *abfd, asymbol *sym)
3864 1.1 christos {
3865 1.1 christos /* If the backend has a special mapping, use it. */
3866 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3867 1.1 christos if (bed->elf_backend_sym_is_global)
3868 1.1 christos return (*bed->elf_backend_sym_is_global) (abfd, sym);
3869 1.1 christos
3870 1.1 christos return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
3871 1.1 christos || bfd_is_und_section (bfd_get_section (sym))
3872 1.1 christos || bfd_is_com_section (bfd_get_section (sym)));
3873 1.8 christos }
3874 1.8 christos
3875 1.8 christos /* Filter global symbols of ABFD to include in the import library. All
3876 1.8 christos SYMCOUNT symbols of ABFD can be examined from their pointers in
3877 1.8 christos SYMS. Pointers of symbols to keep should be stored contiguously at
3878 1.8 christos the beginning of that array.
3879 1.8 christos
3880 1.8 christos Returns the number of symbols to keep. */
3881 1.8 christos
3882 1.8 christos unsigned int
3883 1.8 christos _bfd_elf_filter_global_symbols (bfd *abfd, struct bfd_link_info *info,
3884 1.8 christos asymbol **syms, long symcount)
3885 1.8 christos {
3886 1.8 christos long src_count, dst_count = 0;
3887 1.8 christos
3888 1.8 christos for (src_count = 0; src_count < symcount; src_count++)
3889 1.8 christos {
3890 1.8 christos asymbol *sym = syms[src_count];
3891 1.8 christos char *name = (char *) bfd_asymbol_name (sym);
3892 1.8 christos struct bfd_link_hash_entry *h;
3893 1.8 christos
3894 1.8 christos if (!sym_is_global (abfd, sym))
3895 1.8 christos continue;
3896 1.8 christos
3897 1.8 christos h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, FALSE);
3898 1.8 christos if (h == NULL)
3899 1.8 christos continue;
3900 1.8 christos if (h->type != bfd_link_hash_defined && h->type != bfd_link_hash_defweak)
3901 1.8 christos continue;
3902 1.8 christos if (h->linker_def || h->ldscript_def)
3903 1.8 christos continue;
3904 1.8 christos
3905 1.8 christos syms[dst_count++] = sym;
3906 1.8 christos }
3907 1.8 christos
3908 1.8 christos syms[dst_count] = NULL;
3909 1.8 christos
3910 1.8 christos return dst_count;
3911 1.1 christos }
3912 1.3 christos
3913 1.1 christos /* Don't output section symbols for sections that are not going to be
3914 1.1 christos output, that are duplicates or there is no BFD section. */
3915 1.1 christos
3916 1.1 christos static bfd_boolean
3917 1.3 christos ignore_section_sym (bfd *abfd, asymbol *sym)
3918 1.3 christos {
3919 1.3 christos elf_symbol_type *type_ptr;
3920 1.3 christos
3921 1.3 christos if ((sym->flags & BSF_SECTION_SYM) == 0)
3922 1.3 christos return FALSE;
3923 1.3 christos
3924 1.3 christos type_ptr = elf_symbol_from (abfd, sym);
3925 1.3 christos return ((type_ptr != NULL
3926 1.3 christos && type_ptr->internal_elf_sym.st_shndx != 0
3927 1.1 christos && bfd_is_abs_section (sym->section))
3928 1.3 christos || !(sym->section->owner == abfd
3929 1.3 christos || (sym->section->output_section->owner == abfd
3930 1.1 christos && sym->section->output_offset == 0)
3931 1.1 christos || bfd_is_abs_section (sym->section)));
3932 1.3 christos }
3933 1.3 christos
3934 1.3 christos /* Map symbol from it's internal number to the external number, moving
3935 1.1 christos all local symbols to be at the head of the list. */
3936 1.3 christos
3937 1.1 christos static bfd_boolean
3938 1.1 christos elf_map_symbols (bfd *abfd, unsigned int *pnum_locals)
3939 1.1 christos {
3940 1.1 christos unsigned int symcount = bfd_get_symcount (abfd);
3941 1.1 christos asymbol **syms = bfd_get_outsymbols (abfd);
3942 1.1 christos asymbol **sect_syms;
3943 1.1 christos unsigned int num_locals = 0;
3944 1.1 christos unsigned int num_globals = 0;
3945 1.8 christos unsigned int num_locals2 = 0;
3946 1.1 christos unsigned int num_globals2 = 0;
3947 1.1 christos unsigned int max_index = 0;
3948 1.1 christos unsigned int idx;
3949 1.1 christos asection *asect;
3950 1.1 christos asymbol **new_syms;
3951 1.1 christos
3952 1.1 christos #ifdef DEBUG
3953 1.1 christos fprintf (stderr, "elf_map_symbols\n");
3954 1.1 christos fflush (stderr);
3955 1.1 christos #endif
3956 1.1 christos
3957 1.1 christos for (asect = abfd->sections; asect; asect = asect->next)
3958 1.1 christos {
3959 1.1 christos if (max_index < asect->index)
3960 1.1 christos max_index = asect->index;
3961 1.1 christos }
3962 1.1 christos
3963 1.1 christos max_index++;
3964 1.1 christos sect_syms = (asymbol **) bfd_zalloc2 (abfd, max_index, sizeof (asymbol *));
3965 1.1 christos if (sect_syms == NULL)
3966 1.1 christos return FALSE;
3967 1.1 christos elf_section_syms (abfd) = sect_syms;
3968 1.1 christos elf_num_section_syms (abfd) = max_index;
3969 1.1 christos
3970 1.1 christos /* Init sect_syms entries for any section symbols we have already
3971 1.1 christos decided to output. */
3972 1.1 christos for (idx = 0; idx < symcount; idx++)
3973 1.1 christos {
3974 1.1 christos asymbol *sym = syms[idx];
3975 1.1 christos
3976 1.3 christos if ((sym->flags & BSF_SECTION_SYM) != 0
3977 1.3 christos && sym->value == 0
3978 1.1 christos && !ignore_section_sym (abfd, sym)
3979 1.1 christos && !bfd_is_abs_section (sym->section))
3980 1.1 christos {
3981 1.1 christos asection *sec = sym->section;
3982 1.1 christos
3983 1.1 christos if (sec->owner != abfd)
3984 1.1 christos sec = sec->output_section;
3985 1.1 christos
3986 1.1 christos sect_syms[sec->index] = syms[idx];
3987 1.1 christos }
3988 1.1 christos }
3989 1.1 christos
3990 1.1 christos /* Classify all of the symbols. */
3991 1.3 christos for (idx = 0; idx < symcount; idx++)
3992 1.3 christos {
3993 1.3 christos if (sym_is_global (abfd, syms[idx]))
3994 1.1 christos num_globals++;
3995 1.1 christos else if (!ignore_section_sym (abfd, syms[idx]))
3996 1.1 christos num_locals++;
3997 1.1 christos }
3998 1.1 christos
3999 1.1 christos /* We will be adding a section symbol for each normal BFD section. Most
4000 1.1 christos sections will already have a section symbol in outsymbols, but
4001 1.1 christos eg. SHT_GROUP sections will not, and we need the section symbol mapped
4002 1.1 christos at least in that case. */
4003 1.1 christos for (asect = abfd->sections; asect; asect = asect->next)
4004 1.1 christos {
4005 1.1 christos if (sect_syms[asect->index] == NULL)
4006 1.1 christos {
4007 1.1 christos if (!sym_is_global (abfd, asect->symbol))
4008 1.1 christos num_locals++;
4009 1.1 christos else
4010 1.1 christos num_globals++;
4011 1.1 christos }
4012 1.1 christos }
4013 1.1 christos
4014 1.1 christos /* Now sort the symbols so the local symbols are first. */
4015 1.1 christos new_syms = (asymbol **) bfd_alloc2 (abfd, num_locals + num_globals,
4016 1.1 christos sizeof (asymbol *));
4017 1.1 christos
4018 1.1 christos if (new_syms == NULL)
4019 1.1 christos return FALSE;
4020 1.1 christos
4021 1.1 christos for (idx = 0; idx < symcount; idx++)
4022 1.1 christos {
4023 1.1 christos asymbol *sym = syms[idx];
4024 1.3 christos unsigned int i;
4025 1.3 christos
4026 1.3 christos if (sym_is_global (abfd, sym))
4027 1.1 christos i = num_locals + num_globals2++;
4028 1.1 christos else if (!ignore_section_sym (abfd, sym))
4029 1.3 christos i = num_locals2++;
4030 1.1 christos else
4031 1.1 christos continue;
4032 1.1 christos new_syms[i] = sym;
4033 1.1 christos sym->udata.i = i + 1;
4034 1.1 christos }
4035 1.1 christos for (asect = abfd->sections; asect; asect = asect->next)
4036 1.1 christos {
4037 1.1 christos if (sect_syms[asect->index] == NULL)
4038 1.1 christos {
4039 1.1 christos asymbol *sym = asect->symbol;
4040 1.1 christos unsigned int i;
4041 1.1 christos
4042 1.1 christos sect_syms[asect->index] = sym;
4043 1.1 christos if (!sym_is_global (abfd, sym))
4044 1.1 christos i = num_locals2++;
4045 1.1 christos else
4046 1.1 christos i = num_locals + num_globals2++;
4047 1.1 christos new_syms[i] = sym;
4048 1.1 christos sym->udata.i = i + 1;
4049 1.1 christos }
4050 1.1 christos }
4051 1.1 christos
4052 1.3 christos bfd_set_symtab (abfd, new_syms, num_locals + num_globals);
4053 1.1 christos
4054 1.1 christos *pnum_locals = num_locals;
4055 1.1 christos return TRUE;
4056 1.1 christos }
4057 1.1 christos
4058 1.1 christos /* Align to the maximum file alignment that could be required for any
4059 1.1 christos ELF data structure. */
4060 1.1 christos
4061 1.1 christos static inline file_ptr
4062 1.1 christos align_file_position (file_ptr off, int align)
4063 1.1 christos {
4064 1.1 christos return (off + align - 1) & ~(align - 1);
4065 1.1 christos }
4066 1.1 christos
4067 1.1 christos /* Assign a file position to a section, optionally aligning to the
4068 1.1 christos required section alignment. */
4069 1.1 christos
4070 1.1 christos file_ptr
4071 1.1 christos _bfd_elf_assign_file_position_for_section (Elf_Internal_Shdr *i_shdrp,
4072 1.1 christos file_ptr offset,
4073 1.1 christos bfd_boolean align)
4074 1.1 christos {
4075 1.1 christos if (align && i_shdrp->sh_addralign > 1)
4076 1.1 christos offset = BFD_ALIGN (offset, i_shdrp->sh_addralign);
4077 1.1 christos i_shdrp->sh_offset = offset;
4078 1.1 christos if (i_shdrp->bfd_section != NULL)
4079 1.1 christos i_shdrp->bfd_section->filepos = offset;
4080 1.1 christos if (i_shdrp->sh_type != SHT_NOBITS)
4081 1.1 christos offset += i_shdrp->sh_size;
4082 1.1 christos return offset;
4083 1.1 christos }
4084 1.1 christos
4085 1.1 christos /* Compute the file positions we are going to put the sections at, and
4086 1.1 christos otherwise prepare to begin writing out the ELF file. If LINK_INFO
4087 1.1 christos is not NULL, this is being called by the ELF backend linker. */
4088 1.1 christos
4089 1.1 christos bfd_boolean
4090 1.1 christos _bfd_elf_compute_section_file_positions (bfd *abfd,
4091 1.1 christos struct bfd_link_info *link_info)
4092 1.1 christos {
4093 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
4094 1.6 christos struct fake_section_arg fsargs;
4095 1.1 christos bfd_boolean failed;
4096 1.1 christos struct elf_strtab_hash *strtab = NULL;
4097 1.1 christos Elf_Internal_Shdr *shstrtab_hdr;
4098 1.1 christos bfd_boolean need_symtab;
4099 1.1 christos
4100 1.1 christos if (abfd->output_has_begun)
4101 1.1 christos return TRUE;
4102 1.1 christos
4103 1.1 christos /* Do any elf backend specific processing first. */
4104 1.1 christos if (bed->elf_backend_begin_write_processing)
4105 1.1 christos (*bed->elf_backend_begin_write_processing) (abfd, link_info);
4106 1.1 christos
4107 1.1 christos if (! prep_headers (abfd))
4108 1.1 christos return FALSE;
4109 1.4 christos
4110 1.1 christos /* Post process the headers if necessary. */
4111 1.1 christos (*bed->elf_backend_post_process_headers) (abfd, link_info);
4112 1.1 christos
4113 1.1 christos fsargs.failed = FALSE;
4114 1.1 christos fsargs.link_info = link_info;
4115 1.1 christos bfd_map_over_sections (abfd, elf_fake_sections, &fsargs);
4116 1.1 christos if (fsargs.failed)
4117 1.1 christos return FALSE;
4118 1.1 christos
4119 1.1 christos if (!assign_section_numbers (abfd, link_info))
4120 1.1 christos return FALSE;
4121 1.1 christos
4122 1.1 christos /* The backend linker builds symbol table information itself. */
4123 1.1 christos need_symtab = (link_info == NULL
4124 1.1 christos && (bfd_get_symcount (abfd) > 0
4125 1.1 christos || ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC))
4126 1.1 christos == HAS_RELOC)));
4127 1.1 christos if (need_symtab)
4128 1.1 christos {
4129 1.1 christos /* Non-zero if doing a relocatable link. */
4130 1.1 christos int relocatable_p = ! (abfd->flags & (EXEC_P | DYNAMIC));
4131 1.1 christos
4132 1.1 christos if (! swap_out_syms (abfd, &strtab, relocatable_p))
4133 1.1 christos return FALSE;
4134 1.1 christos }
4135 1.1 christos
4136 1.1 christos failed = FALSE;
4137 1.1 christos if (link_info == NULL)
4138 1.1 christos {
4139 1.1 christos bfd_map_over_sections (abfd, bfd_elf_set_group_contents, &failed);
4140 1.1 christos if (failed)
4141 1.1 christos return FALSE;
4142 1.1 christos }
4143 1.1 christos
4144 1.1 christos shstrtab_hdr = &elf_tdata (abfd)->shstrtab_hdr;
4145 1.8 christos /* sh_name was set in prep_headers. */
4146 1.1 christos shstrtab_hdr->sh_type = SHT_STRTAB;
4147 1.6 christos shstrtab_hdr->sh_flags = bed->elf_strtab_flags;
4148 1.1 christos shstrtab_hdr->sh_addr = 0;
4149 1.1 christos /* sh_size is set in _bfd_elf_assign_file_positions_for_non_load. */
4150 1.1 christos shstrtab_hdr->sh_entsize = 0;
4151 1.6 christos shstrtab_hdr->sh_link = 0;
4152 1.1 christos shstrtab_hdr->sh_info = 0;
4153 1.1 christos /* sh_offset is set in _bfd_elf_assign_file_positions_for_non_load. */
4154 1.1 christos shstrtab_hdr->sh_addralign = 1;
4155 1.1 christos
4156 1.1 christos if (!assign_file_positions_except_relocs (abfd, link_info))
4157 1.1 christos return FALSE;
4158 1.1 christos
4159 1.1 christos if (need_symtab)
4160 1.1 christos {
4161 1.1 christos file_ptr off;
4162 1.3 christos Elf_Internal_Shdr *hdr;
4163 1.1 christos
4164 1.8 christos off = elf_next_file_pos (abfd);
4165 1.1 christos
4166 1.1 christos hdr = & elf_symtab_hdr (abfd);
4167 1.8 christos off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
4168 1.8 christos
4169 1.8 christos if (elf_symtab_shndx_list (abfd) != NULL)
4170 1.8 christos {
4171 1.8 christos hdr = & elf_symtab_shndx_list (abfd)->hdr;
4172 1.8 christos if (hdr->sh_size != 0)
4173 1.8 christos off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
4174 1.1 christos /* FIXME: What about other symtab_shndx sections in the list ? */
4175 1.1 christos }
4176 1.1 christos
4177 1.1 christos hdr = &elf_tdata (abfd)->strtab_hdr;
4178 1.3 christos off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
4179 1.1 christos
4180 1.1 christos elf_next_file_pos (abfd) = off;
4181 1.1 christos
4182 1.1 christos /* Now that we know where the .strtab section goes, write it
4183 1.6 christos out. */
4184 1.1 christos if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
4185 1.6 christos || ! _bfd_elf_strtab_emit (abfd, strtab))
4186 1.1 christos return FALSE;
4187 1.1 christos _bfd_elf_strtab_free (strtab);
4188 1.1 christos }
4189 1.1 christos
4190 1.1 christos abfd->output_has_begun = TRUE;
4191 1.1 christos
4192 1.1 christos return TRUE;
4193 1.1 christos }
4194 1.1 christos
4195 1.1 christos /* Make an initial estimate of the size of the program header. If we
4196 1.1 christos get the number wrong here, we'll redo section placement. */
4197 1.1 christos
4198 1.1 christos static bfd_size_type
4199 1.1 christos get_program_header_size (bfd *abfd, struct bfd_link_info *info)
4200 1.1 christos {
4201 1.1 christos size_t segs;
4202 1.1 christos asection *s;
4203 1.1 christos const struct elf_backend_data *bed;
4204 1.1 christos
4205 1.1 christos /* Assume we will need exactly two PT_LOAD segments: one for text
4206 1.1 christos and one for data. */
4207 1.1 christos segs = 2;
4208 1.1 christos
4209 1.1 christos s = bfd_get_section_by_name (abfd, ".interp");
4210 1.1 christos if (s != NULL && (s->flags & SEC_LOAD) != 0)
4211 1.1 christos {
4212 1.1 christos /* If we have a loadable interpreter section, we need a
4213 1.1 christos PT_INTERP segment. In this case, assume we also need a
4214 1.1 christos PT_PHDR segment, although that may not be true for all
4215 1.1 christos targets. */
4216 1.1 christos segs += 2;
4217 1.1 christos }
4218 1.1 christos
4219 1.1 christos if (bfd_get_section_by_name (abfd, ".dynamic") != NULL)
4220 1.1 christos {
4221 1.1 christos /* We need a PT_DYNAMIC segment. */
4222 1.1 christos ++segs;
4223 1.1 christos }
4224 1.1 christos
4225 1.1 christos if (info != NULL && info->relro)
4226 1.1 christos {
4227 1.1 christos /* We need a PT_GNU_RELRO segment. */
4228 1.1 christos ++segs;
4229 1.3 christos }
4230 1.1 christos
4231 1.1 christos if (elf_eh_frame_hdr (abfd))
4232 1.1 christos {
4233 1.1 christos /* We need a PT_GNU_EH_FRAME segment. */
4234 1.1 christos ++segs;
4235 1.3 christos }
4236 1.1 christos
4237 1.1 christos if (elf_stack_flags (abfd))
4238 1.1 christos {
4239 1.1 christos /* We need a PT_GNU_STACK segment. */
4240 1.1 christos ++segs;
4241 1.1 christos }
4242 1.1 christos
4243 1.1 christos for (s = abfd->sections; s != NULL; s = s->next)
4244 1.1 christos {
4245 1.1 christos if ((s->flags & SEC_LOAD) != 0
4246 1.1 christos && CONST_STRNEQ (s->name, ".note"))
4247 1.1 christos {
4248 1.1 christos /* We need a PT_NOTE segment. */
4249 1.1 christos ++segs;
4250 1.1 christos /* Try to create just one PT_NOTE segment
4251 1.1 christos for all adjacent loadable .note* sections.
4252 1.1 christos gABI requires that within a PT_NOTE segment
4253 1.1 christos (and also inside of each SHT_NOTE section)
4254 1.1 christos each note is padded to a multiple of 4 size,
4255 1.1 christos so we check whether the sections are correctly
4256 1.1 christos aligned. */
4257 1.1 christos if (s->alignment_power == 2)
4258 1.1 christos while (s->next != NULL
4259 1.1 christos && s->next->alignment_power == 2
4260 1.1 christos && (s->next->flags & SEC_LOAD) != 0
4261 1.1 christos && CONST_STRNEQ (s->next->name, ".note"))
4262 1.1 christos s = s->next;
4263 1.1 christos }
4264 1.1 christos }
4265 1.1 christos
4266 1.1 christos for (s = abfd->sections; s != NULL; s = s->next)
4267 1.1 christos {
4268 1.1 christos if (s->flags & SEC_THREAD_LOCAL)
4269 1.1 christos {
4270 1.1 christos /* We need a PT_TLS segment. */
4271 1.1 christos ++segs;
4272 1.1 christos break;
4273 1.1 christos }
4274 1.1 christos }
4275 1.1 christos
4276 1.1 christos /* Let the backend count up any program headers it might need. */
4277 1.1 christos bed = get_elf_backend_data (abfd);
4278 1.1 christos if (bed->elf_backend_additional_program_headers)
4279 1.1 christos {
4280 1.1 christos int a;
4281 1.1 christos
4282 1.1 christos a = (*bed->elf_backend_additional_program_headers) (abfd, info);
4283 1.1 christos if (a == -1)
4284 1.1 christos abort ();
4285 1.1 christos segs += a;
4286 1.1 christos }
4287 1.1 christos
4288 1.1 christos return segs * bed->s->sizeof_phdr;
4289 1.1 christos }
4290 1.1 christos
4291 1.1 christos /* Find the segment that contains the output_section of section. */
4292 1.1 christos
4293 1.1 christos Elf_Internal_Phdr *
4294 1.1 christos _bfd_elf_find_segment_containing_section (bfd * abfd, asection * section)
4295 1.1 christos {
4296 1.1 christos struct elf_segment_map *m;
4297 1.3 christos Elf_Internal_Phdr *p;
4298 1.1 christos
4299 1.1 christos for (m = elf_seg_map (abfd), p = elf_tdata (abfd)->phdr;
4300 1.1 christos m != NULL;
4301 1.1 christos m = m->next, p++)
4302 1.1 christos {
4303 1.1 christos int i;
4304 1.1 christos
4305 1.1 christos for (i = m->count - 1; i >= 0; i--)
4306 1.1 christos if (m->sections[i] == section)
4307 1.1 christos return p;
4308 1.1 christos }
4309 1.1 christos
4310 1.1 christos return NULL;
4311 1.1 christos }
4312 1.1 christos
4313 1.1 christos /* Create a mapping from a set of sections to a program segment. */
4314 1.1 christos
4315 1.1 christos static struct elf_segment_map *
4316 1.1 christos make_mapping (bfd *abfd,
4317 1.1 christos asection **sections,
4318 1.1 christos unsigned int from,
4319 1.1 christos unsigned int to,
4320 1.1 christos bfd_boolean phdr)
4321 1.1 christos {
4322 1.1 christos struct elf_segment_map *m;
4323 1.1 christos unsigned int i;
4324 1.1 christos asection **hdrpp;
4325 1.1 christos bfd_size_type amt;
4326 1.1 christos
4327 1.1 christos amt = sizeof (struct elf_segment_map);
4328 1.1 christos amt += (to - from - 1) * sizeof (asection *);
4329 1.1 christos m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
4330 1.1 christos if (m == NULL)
4331 1.1 christos return NULL;
4332 1.1 christos m->next = NULL;
4333 1.1 christos m->p_type = PT_LOAD;
4334 1.1 christos for (i = from, hdrpp = sections + from; i < to; i++, hdrpp++)
4335 1.1 christos m->sections[i - from] = *hdrpp;
4336 1.1 christos m->count = to - from;
4337 1.1 christos
4338 1.1 christos if (from == 0 && phdr)
4339 1.1 christos {
4340 1.1 christos /* Include the headers in the first PT_LOAD segment. */
4341 1.1 christos m->includes_filehdr = 1;
4342 1.1 christos m->includes_phdrs = 1;
4343 1.1 christos }
4344 1.1 christos
4345 1.1 christos return m;
4346 1.1 christos }
4347 1.1 christos
4348 1.1 christos /* Create the PT_DYNAMIC segment, which includes DYNSEC. Returns NULL
4349 1.1 christos on failure. */
4350 1.1 christos
4351 1.1 christos struct elf_segment_map *
4352 1.1 christos _bfd_elf_make_dynamic_segment (bfd *abfd, asection *dynsec)
4353 1.1 christos {
4354 1.1 christos struct elf_segment_map *m;
4355 1.1 christos
4356 1.1 christos m = (struct elf_segment_map *) bfd_zalloc (abfd,
4357 1.1 christos sizeof (struct elf_segment_map));
4358 1.1 christos if (m == NULL)
4359 1.1 christos return NULL;
4360 1.1 christos m->next = NULL;
4361 1.1 christos m->p_type = PT_DYNAMIC;
4362 1.1 christos m->count = 1;
4363 1.1 christos m->sections[0] = dynsec;
4364 1.1 christos
4365 1.1 christos return m;
4366 1.1 christos }
4367 1.1 christos
4368 1.1 christos /* Possibly add or remove segments from the segment map. */
4369 1.1 christos
4370 1.1 christos static bfd_boolean
4371 1.1 christos elf_modify_segment_map (bfd *abfd,
4372 1.1 christos struct bfd_link_info *info,
4373 1.1 christos bfd_boolean remove_empty_load)
4374 1.1 christos {
4375 1.1 christos struct elf_segment_map **m;
4376 1.1 christos const struct elf_backend_data *bed;
4377 1.1 christos
4378 1.1 christos /* The placement algorithm assumes that non allocated sections are
4379 1.1 christos not in PT_LOAD segments. We ensure this here by removing such
4380 1.1 christos sections from the segment map. We also remove excluded
4381 1.3 christos sections. Finally, any PT_LOAD segment without sections is
4382 1.1 christos removed. */
4383 1.1 christos m = &elf_seg_map (abfd);
4384 1.1 christos while (*m)
4385 1.1 christos {
4386 1.1 christos unsigned int i, new_count;
4387 1.1 christos
4388 1.1 christos for (new_count = 0, i = 0; i < (*m)->count; i++)
4389 1.1 christos {
4390 1.1 christos if (((*m)->sections[i]->flags & SEC_EXCLUDE) == 0
4391 1.1 christos && (((*m)->sections[i]->flags & SEC_ALLOC) != 0
4392 1.1 christos || (*m)->p_type != PT_LOAD))
4393 1.1 christos {
4394 1.1 christos (*m)->sections[new_count] = (*m)->sections[i];
4395 1.1 christos new_count++;
4396 1.1 christos }
4397 1.1 christos }
4398 1.1 christos (*m)->count = new_count;
4399 1.1 christos
4400 1.1 christos if (remove_empty_load && (*m)->p_type == PT_LOAD && (*m)->count == 0)
4401 1.1 christos *m = (*m)->next;
4402 1.1 christos else
4403 1.1 christos m = &(*m)->next;
4404 1.1 christos }
4405 1.1 christos
4406 1.1 christos bed = get_elf_backend_data (abfd);
4407 1.1 christos if (bed->elf_backend_modify_segment_map != NULL)
4408 1.1 christos {
4409 1.1 christos if (!(*bed->elf_backend_modify_segment_map) (abfd, info))
4410 1.1 christos return FALSE;
4411 1.1 christos }
4412 1.1 christos
4413 1.1 christos return TRUE;
4414 1.1 christos }
4415 1.1 christos
4416 1.1 christos /* Set up a mapping from BFD sections to program segments. */
4417 1.1 christos
4418 1.1 christos bfd_boolean
4419 1.1 christos _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
4420 1.1 christos {
4421 1.1 christos unsigned int count;
4422 1.1 christos struct elf_segment_map *m;
4423 1.1 christos asection **sections = NULL;
4424 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
4425 1.3 christos bfd_boolean no_user_phdrs;
4426 1.3 christos
4427 1.3 christos no_user_phdrs = elf_seg_map (abfd) == NULL;
4428 1.3 christos
4429 1.3 christos if (info != NULL)
4430 1.1 christos info->user_phdrs = !no_user_phdrs;
4431 1.1 christos
4432 1.1 christos if (no_user_phdrs && bfd_count_sections (abfd) != 0)
4433 1.1 christos {
4434 1.1 christos asection *s;
4435 1.1 christos unsigned int i;
4436 1.1 christos struct elf_segment_map *mfirst;
4437 1.1 christos struct elf_segment_map **pm;
4438 1.1 christos asection *last_hdr;
4439 1.1 christos bfd_vma last_size;
4440 1.1 christos unsigned int phdr_index;
4441 1.1 christos bfd_vma maxpagesize;
4442 1.1 christos asection **hdrpp;
4443 1.1 christos bfd_boolean phdr_in_segment = TRUE;
4444 1.1 christos bfd_boolean writable;
4445 1.1 christos int tls_count = 0;
4446 1.1 christos asection *first_tls = NULL;
4447 1.1 christos asection *dynsec, *eh_frame_hdr;
4448 1.1 christos bfd_size_type amt;
4449 1.1 christos bfd_vma addr_mask, wrap_to = 0;
4450 1.1 christos
4451 1.1 christos /* Select the allocated sections, and sort them. */
4452 1.1 christos
4453 1.1 christos sections = (asection **) bfd_malloc2 (bfd_count_sections (abfd),
4454 1.1 christos sizeof (asection *));
4455 1.1 christos if (sections == NULL)
4456 1.1 christos goto error_return;
4457 1.1 christos
4458 1.1 christos /* Calculate top address, avoiding undefined behaviour of shift
4459 1.1 christos left operator when shift count is equal to size of type
4460 1.1 christos being shifted. */
4461 1.1 christos addr_mask = ((bfd_vma) 1 << (bfd_arch_bits_per_address (abfd) - 1)) - 1;
4462 1.1 christos addr_mask = (addr_mask << 1) + 1;
4463 1.1 christos
4464 1.1 christos i = 0;
4465 1.1 christos for (s = abfd->sections; s != NULL; s = s->next)
4466 1.1 christos {
4467 1.1 christos if ((s->flags & SEC_ALLOC) != 0)
4468 1.1 christos {
4469 1.1 christos sections[i] = s;
4470 1.1 christos ++i;
4471 1.1 christos /* A wrapping section potentially clashes with header. */
4472 1.1 christos if (((s->lma + s->size) & addr_mask) < (s->lma & addr_mask))
4473 1.1 christos wrap_to = (s->lma + s->size) & addr_mask;
4474 1.1 christos }
4475 1.1 christos }
4476 1.1 christos BFD_ASSERT (i <= bfd_count_sections (abfd));
4477 1.1 christos count = i;
4478 1.1 christos
4479 1.1 christos qsort (sections, (size_t) count, sizeof (asection *), elf_sort_sections);
4480 1.1 christos
4481 1.1 christos /* Build the mapping. */
4482 1.1 christos
4483 1.1 christos mfirst = NULL;
4484 1.1 christos pm = &mfirst;
4485 1.1 christos
4486 1.1 christos /* If we have a .interp section, then create a PT_PHDR segment for
4487 1.1 christos the program headers and a PT_INTERP segment for the .interp
4488 1.1 christos section. */
4489 1.1 christos s = bfd_get_section_by_name (abfd, ".interp");
4490 1.1 christos if (s != NULL && (s->flags & SEC_LOAD) != 0)
4491 1.1 christos {
4492 1.1 christos amt = sizeof (struct elf_segment_map);
4493 1.1 christos m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
4494 1.1 christos if (m == NULL)
4495 1.1 christos goto error_return;
4496 1.1 christos m->next = NULL;
4497 1.1 christos m->p_type = PT_PHDR;
4498 1.1 christos /* FIXME: UnixWare and Solaris set PF_X, Irix 5 does not. */
4499 1.1 christos m->p_flags = PF_R | PF_X;
4500 1.1 christos m->p_flags_valid = 1;
4501 1.1 christos m->includes_phdrs = 1;
4502 1.1 christos
4503 1.1 christos *pm = m;
4504 1.1 christos pm = &m->next;
4505 1.1 christos
4506 1.1 christos amt = sizeof (struct elf_segment_map);
4507 1.1 christos m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
4508 1.1 christos if (m == NULL)
4509 1.1 christos goto error_return;
4510 1.1 christos m->next = NULL;
4511 1.1 christos m->p_type = PT_INTERP;
4512 1.1 christos m->count = 1;
4513 1.1 christos m->sections[0] = s;
4514 1.1 christos
4515 1.1 christos *pm = m;
4516 1.1 christos pm = &m->next;
4517 1.1 christos }
4518 1.1 christos
4519 1.1 christos /* Look through the sections. We put sections in the same program
4520 1.1 christos segment when the start of the second section can be placed within
4521 1.1 christos a few bytes of the end of the first section. */
4522 1.1 christos last_hdr = NULL;
4523 1.1 christos last_size = 0;
4524 1.5 christos phdr_index = 0;
4525 1.5 christos maxpagesize = bed->maxpagesize;
4526 1.5 christos /* PR 17512: file: c8455299.
4527 1.5 christos Avoid divide-by-zero errors later on.
4528 1.5 christos FIXME: Should we abort if the maxpagesize is zero ? */
4529 1.1 christos if (maxpagesize == 0)
4530 1.1 christos maxpagesize = 1;
4531 1.1 christos writable = FALSE;
4532 1.1 christos dynsec = bfd_get_section_by_name (abfd, ".dynamic");
4533 1.1 christos if (dynsec != NULL
4534 1.1 christos && (dynsec->flags & SEC_LOAD) == 0)
4535 1.1 christos dynsec = NULL;
4536 1.1 christos
4537 1.1 christos /* Deal with -Ttext or something similar such that the first section
4538 1.1 christos is not adjacent to the program headers. This is an
4539 1.1 christos approximation, since at this point we don't know exactly how many
4540 1.1 christos program headers we will need. */
4541 1.3 christos if (count > 0)
4542 1.1 christos {
4543 1.1 christos bfd_size_type phdr_size = elf_program_header_size (abfd);
4544 1.1 christos
4545 1.3 christos if (phdr_size == (bfd_size_type) -1)
4546 1.1 christos phdr_size = get_program_header_size (abfd, info);
4547 1.1 christos phdr_size += bed->s->sizeof_ehdr;
4548 1.1 christos if ((abfd->flags & D_PAGED) == 0
4549 1.1 christos || (sections[0]->lma & addr_mask) < phdr_size
4550 1.1 christos || ((sections[0]->lma & addr_mask) % maxpagesize
4551 1.1 christos < phdr_size % maxpagesize)
4552 1.1 christos || (sections[0]->lma & addr_mask & -maxpagesize) < wrap_to)
4553 1.1 christos phdr_in_segment = FALSE;
4554 1.1 christos }
4555 1.1 christos
4556 1.1 christos for (i = 0, hdrpp = sections; i < count; i++, hdrpp++)
4557 1.1 christos {
4558 1.1 christos asection *hdr;
4559 1.1 christos bfd_boolean new_segment;
4560 1.1 christos
4561 1.1 christos hdr = *hdrpp;
4562 1.1 christos
4563 1.1 christos /* See if this section and the last one will fit in the same
4564 1.1 christos segment. */
4565 1.1 christos
4566 1.1 christos if (last_hdr == NULL)
4567 1.1 christos {
4568 1.1 christos /* If we don't have a segment yet, then we don't need a new
4569 1.1 christos one (we build the last one after this loop). */
4570 1.1 christos new_segment = FALSE;
4571 1.1 christos }
4572 1.1 christos else if (last_hdr->lma - last_hdr->vma != hdr->lma - hdr->vma)
4573 1.1 christos {
4574 1.1 christos /* If this section has a different relation between the
4575 1.1 christos virtual address and the load address, then we need a new
4576 1.1 christos segment. */
4577 1.1 christos new_segment = TRUE;
4578 1.1 christos }
4579 1.1 christos else if (hdr->lma < last_hdr->lma + last_size
4580 1.1 christos || last_hdr->lma + last_size < last_hdr->lma)
4581 1.1 christos {
4582 1.1 christos /* If this section has a load address that makes it overlap
4583 1.1 christos the previous section, then we need a new segment. */
4584 1.1 christos new_segment = TRUE;
4585 1.1 christos }
4586 1.1 christos /* In the next test we have to be careful when last_hdr->lma is close
4587 1.1 christos to the end of the address space. If the aligned address wraps
4588 1.1 christos around to the start of the address space, then there are no more
4589 1.1 christos pages left in memory and it is OK to assume that the current
4590 1.1 christos section can be included in the current segment. */
4591 1.1 christos else if ((BFD_ALIGN (last_hdr->lma + last_size, maxpagesize) + maxpagesize
4592 1.1 christos > last_hdr->lma)
4593 1.1 christos && (BFD_ALIGN (last_hdr->lma + last_size, maxpagesize) + maxpagesize
4594 1.1 christos <= hdr->lma))
4595 1.1 christos {
4596 1.1 christos /* If putting this section in this segment would force us to
4597 1.1 christos skip a page in the segment, then we need a new segment. */
4598 1.1 christos new_segment = TRUE;
4599 1.8 christos }
4600 1.8 christos else if ((last_hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0
4601 1.8 christos && (hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) != 0
4602 1.8 christos && ((abfd->flags & D_PAGED) == 0
4603 1.8 christos || (((last_hdr->lma + last_size - 1) & -maxpagesize)
4604 1.8 christos != (hdr->lma & -maxpagesize))))
4605 1.8 christos {
4606 1.8 christos /* We don't want to put a loaded section after a
4607 1.8 christos nonloaded (ie. bss style) section in the same segment
4608 1.8 christos as that will force the non-loaded section to be loaded.
4609 1.8 christos Consider .tbss sections as loaded for this purpose.
4610 1.8 christos However, like the writable/non-writable case below,
4611 1.1 christos if they are on the same page then they must be put
4612 1.1 christos in the same segment. */
4613 1.1 christos new_segment = TRUE;
4614 1.1 christos }
4615 1.1 christos else if ((abfd->flags & D_PAGED) == 0)
4616 1.1 christos {
4617 1.1 christos /* If the file is not demand paged, which means that we
4618 1.1 christos don't require the sections to be correctly aligned in the
4619 1.1 christos file, then there is no other reason for a new segment. */
4620 1.1 christos new_segment = FALSE;
4621 1.1 christos }
4622 1.1 christos else if (! writable
4623 1.1 christos && (hdr->flags & SEC_READONLY) == 0
4624 1.1 christos && (((last_hdr->lma + last_size - 1) & -maxpagesize)
4625 1.1 christos != (hdr->lma & -maxpagesize)))
4626 1.1 christos {
4627 1.1 christos /* We don't want to put a writable section in a read only
4628 1.1 christos segment, unless they are on the same page in memory
4629 1.1 christos anyhow. We already know that the last section does not
4630 1.1 christos bring us past the current section on the page, so the
4631 1.1 christos only case in which the new section is not on the same
4632 1.1 christos page as the previous section is when the previous section
4633 1.1 christos ends precisely on a page boundary. */
4634 1.1 christos new_segment = TRUE;
4635 1.1 christos }
4636 1.1 christos else
4637 1.1 christos {
4638 1.1 christos /* Otherwise, we can use the same segment. */
4639 1.1 christos new_segment = FALSE;
4640 1.1 christos }
4641 1.1 christos
4642 1.1 christos /* Allow interested parties a chance to override our decision. */
4643 1.1 christos if (last_hdr != NULL
4644 1.1 christos && info != NULL
4645 1.1 christos && info->callbacks->override_segment_assignment != NULL)
4646 1.1 christos new_segment
4647 1.1 christos = info->callbacks->override_segment_assignment (info, abfd, hdr,
4648 1.1 christos last_hdr,
4649 1.1 christos new_segment);
4650 1.1 christos
4651 1.1 christos if (! new_segment)
4652 1.1 christos {
4653 1.1 christos if ((hdr->flags & SEC_READONLY) == 0)
4654 1.1 christos writable = TRUE;
4655 1.1 christos last_hdr = hdr;
4656 1.1 christos /* .tbss sections effectively have zero size. */
4657 1.1 christos if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD))
4658 1.1 christos != SEC_THREAD_LOCAL)
4659 1.1 christos last_size = hdr->size;
4660 1.1 christos else
4661 1.1 christos last_size = 0;
4662 1.1 christos continue;
4663 1.1 christos }
4664 1.1 christos
4665 1.1 christos /* We need a new program segment. We must create a new program
4666 1.1 christos header holding all the sections from phdr_index until hdr. */
4667 1.1 christos
4668 1.1 christos m = make_mapping (abfd, sections, phdr_index, i, phdr_in_segment);
4669 1.1 christos if (m == NULL)
4670 1.1 christos goto error_return;
4671 1.1 christos
4672 1.1 christos *pm = m;
4673 1.1 christos pm = &m->next;
4674 1.1 christos
4675 1.1 christos if ((hdr->flags & SEC_READONLY) == 0)
4676 1.1 christos writable = TRUE;
4677 1.1 christos else
4678 1.1 christos writable = FALSE;
4679 1.1 christos
4680 1.1 christos last_hdr = hdr;
4681 1.1 christos /* .tbss sections effectively have zero size. */
4682 1.1 christos if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD)) != SEC_THREAD_LOCAL)
4683 1.1 christos last_size = hdr->size;
4684 1.1 christos else
4685 1.1 christos last_size = 0;
4686 1.1 christos phdr_index = i;
4687 1.1 christos phdr_in_segment = FALSE;
4688 1.3 christos }
4689 1.3 christos
4690 1.3 christos /* Create a final PT_LOAD program segment, but not if it's just
4691 1.3 christos for .tbss. */
4692 1.3 christos if (last_hdr != NULL
4693 1.3 christos && (i - phdr_index != 1
4694 1.1 christos || ((last_hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD))
4695 1.1 christos != SEC_THREAD_LOCAL)))
4696 1.1 christos {
4697 1.1 christos m = make_mapping (abfd, sections, phdr_index, i, phdr_in_segment);
4698 1.1 christos if (m == NULL)
4699 1.1 christos goto error_return;
4700 1.1 christos
4701 1.1 christos *pm = m;
4702 1.1 christos pm = &m->next;
4703 1.1 christos }
4704 1.1 christos
4705 1.1 christos /* If there is a .dynamic section, throw in a PT_DYNAMIC segment. */
4706 1.1 christos if (dynsec != NULL)
4707 1.1 christos {
4708 1.1 christos m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
4709 1.1 christos if (m == NULL)
4710 1.1 christos goto error_return;
4711 1.1 christos *pm = m;
4712 1.1 christos pm = &m->next;
4713 1.1 christos }
4714 1.1 christos
4715 1.1 christos /* For each batch of consecutive loadable .note sections,
4716 1.1 christos add a PT_NOTE segment. We don't use bfd_get_section_by_name,
4717 1.1 christos because if we link together nonloadable .note sections and
4718 1.1 christos loadable .note sections, we will generate two .note sections
4719 1.1 christos in the output file. FIXME: Using names for section types is
4720 1.1 christos bogus anyhow. */
4721 1.1 christos for (s = abfd->sections; s != NULL; s = s->next)
4722 1.1 christos {
4723 1.1 christos if ((s->flags & SEC_LOAD) != 0
4724 1.1 christos && CONST_STRNEQ (s->name, ".note"))
4725 1.1 christos {
4726 1.1 christos asection *s2;
4727 1.1 christos
4728 1.1 christos count = 1;
4729 1.1 christos amt = sizeof (struct elf_segment_map);
4730 1.1 christos if (s->alignment_power == 2)
4731 1.1 christos for (s2 = s; s2->next != NULL; s2 = s2->next)
4732 1.1 christos {
4733 1.1 christos if (s2->next->alignment_power == 2
4734 1.1 christos && (s2->next->flags & SEC_LOAD) != 0
4735 1.1 christos && CONST_STRNEQ (s2->next->name, ".note")
4736 1.1 christos && align_power (s2->lma + s2->size, 2)
4737 1.1 christos == s2->next->lma)
4738 1.1 christos count++;
4739 1.1 christos else
4740 1.1 christos break;
4741 1.1 christos }
4742 1.1 christos amt += (count - 1) * sizeof (asection *);
4743 1.1 christos m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
4744 1.1 christos if (m == NULL)
4745 1.1 christos goto error_return;
4746 1.1 christos m->next = NULL;
4747 1.1 christos m->p_type = PT_NOTE;
4748 1.1 christos m->count = count;
4749 1.1 christos while (count > 1)
4750 1.1 christos {
4751 1.1 christos m->sections[m->count - count--] = s;
4752 1.1 christos BFD_ASSERT ((s->flags & SEC_THREAD_LOCAL) == 0);
4753 1.1 christos s = s->next;
4754 1.1 christos }
4755 1.1 christos m->sections[m->count - 1] = s;
4756 1.1 christos BFD_ASSERT ((s->flags & SEC_THREAD_LOCAL) == 0);
4757 1.1 christos *pm = m;
4758 1.1 christos pm = &m->next;
4759 1.1 christos }
4760 1.1 christos if (s->flags & SEC_THREAD_LOCAL)
4761 1.1 christos {
4762 1.1 christos if (! tls_count)
4763 1.1 christos first_tls = s;
4764 1.1 christos tls_count++;
4765 1.1 christos }
4766 1.1 christos }
4767 1.1 christos
4768 1.1 christos /* If there are any SHF_TLS output sections, add PT_TLS segment. */
4769 1.1 christos if (tls_count > 0)
4770 1.1 christos {
4771 1.1 christos amt = sizeof (struct elf_segment_map);
4772 1.1 christos amt += (tls_count - 1) * sizeof (asection *);
4773 1.1 christos m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
4774 1.1 christos if (m == NULL)
4775 1.1 christos goto error_return;
4776 1.1 christos m->next = NULL;
4777 1.1 christos m->p_type = PT_TLS;
4778 1.1 christos m->count = tls_count;
4779 1.1 christos /* Mandated PF_R. */
4780 1.5 christos m->p_flags = PF_R;
4781 1.1 christos m->p_flags_valid = 1;
4782 1.1 christos s = first_tls;
4783 1.5 christos for (i = 0; i < (unsigned int) tls_count; ++i)
4784 1.5 christos {
4785 1.5 christos if ((s->flags & SEC_THREAD_LOCAL) == 0)
4786 1.5 christos {
4787 1.5 christos _bfd_error_handler
4788 1.5 christos (_("%B: TLS sections are not adjacent:"), abfd);
4789 1.5 christos s = first_tls;
4790 1.5 christos i = 0;
4791 1.5 christos while (i < (unsigned int) tls_count)
4792 1.5 christos {
4793 1.5 christos if ((s->flags & SEC_THREAD_LOCAL) != 0)
4794 1.5 christos {
4795 1.5 christos _bfd_error_handler (_(" TLS: %A"), s);
4796 1.5 christos i++;
4797 1.5 christos }
4798 1.5 christos else
4799 1.5 christos _bfd_error_handler (_(" non-TLS: %A"), s);
4800 1.5 christos s = s->next;
4801 1.5 christos }
4802 1.5 christos bfd_set_error (bfd_error_bad_value);
4803 1.5 christos goto error_return;
4804 1.5 christos }
4805 1.1 christos m->sections[i] = s;
4806 1.1 christos s = s->next;
4807 1.1 christos }
4808 1.1 christos
4809 1.1 christos *pm = m;
4810 1.1 christos pm = &m->next;
4811 1.1 christos }
4812 1.1 christos
4813 1.3 christos /* If there is a .eh_frame_hdr section, throw in a PT_GNU_EH_FRAME
4814 1.1 christos segment. */
4815 1.1 christos eh_frame_hdr = elf_eh_frame_hdr (abfd);
4816 1.1 christos if (eh_frame_hdr != NULL
4817 1.1 christos && (eh_frame_hdr->output_section->flags & SEC_LOAD) != 0)
4818 1.1 christos {
4819 1.1 christos amt = sizeof (struct elf_segment_map);
4820 1.1 christos m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
4821 1.1 christos if (m == NULL)
4822 1.1 christos goto error_return;
4823 1.1 christos m->next = NULL;
4824 1.1 christos m->p_type = PT_GNU_EH_FRAME;
4825 1.1 christos m->count = 1;
4826 1.1 christos m->sections[0] = eh_frame_hdr->output_section;
4827 1.1 christos
4828 1.1 christos *pm = m;
4829 1.1 christos pm = &m->next;
4830 1.3 christos }
4831 1.1 christos
4832 1.1 christos if (elf_stack_flags (abfd))
4833 1.1 christos {
4834 1.1 christos amt = sizeof (struct elf_segment_map);
4835 1.1 christos m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
4836 1.1 christos if (m == NULL)
4837 1.1 christos goto error_return;
4838 1.3 christos m->next = NULL;
4839 1.3 christos m->p_type = PT_GNU_STACK;
4840 1.1 christos m->p_flags = elf_stack_flags (abfd);
4841 1.3 christos m->p_align = bed->stack_align;
4842 1.3 christos m->p_flags_valid = 1;
4843 1.3 christos m->p_align_valid = m->p_align != 0;
4844 1.3 christos if (info->stacksize > 0)
4845 1.3 christos {
4846 1.3 christos m->p_size = info->stacksize;
4847 1.1 christos m->p_size_valid = 1;
4848 1.1 christos }
4849 1.1 christos
4850 1.1 christos *pm = m;
4851 1.1 christos pm = &m->next;
4852 1.1 christos }
4853 1.1 christos
4854 1.1 christos if (info != NULL && info->relro)
4855 1.1 christos {
4856 1.3 christos for (m = mfirst; m != NULL; m = m->next)
4857 1.3 christos {
4858 1.3 christos if (m->p_type == PT_LOAD
4859 1.3 christos && m->count != 0
4860 1.1 christos && m->sections[0]->vma >= info->relro_start
4861 1.3 christos && m->sections[0]->vma < info->relro_end)
4862 1.3 christos {
4863 1.3 christos i = m->count;
4864 1.3 christos while (--i != (unsigned) -1)
4865 1.3 christos if ((m->sections[i]->flags & (SEC_LOAD | SEC_HAS_CONTENTS))
4866 1.3 christos == (SEC_LOAD | SEC_HAS_CONTENTS))
4867 1.5 christos break;
4868 1.1 christos
4869 1.1 christos if (i != (unsigned) -1)
4870 1.3 christos break;
4871 1.1 christos }
4872 1.1 christos }
4873 1.1 christos
4874 1.1 christos /* Make a PT_GNU_RELRO segment only when it isn't empty. */
4875 1.1 christos if (m != NULL)
4876 1.1 christos {
4877 1.1 christos amt = sizeof (struct elf_segment_map);
4878 1.1 christos m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
4879 1.1 christos if (m == NULL)
4880 1.1 christos goto error_return;
4881 1.1 christos m->next = NULL;
4882 1.1 christos m->p_type = PT_GNU_RELRO;
4883 1.1 christos *pm = m;
4884 1.1 christos pm = &m->next;
4885 1.1 christos }
4886 1.1 christos }
4887 1.3 christos
4888 1.1 christos free (sections);
4889 1.1 christos elf_seg_map (abfd) = mfirst;
4890 1.1 christos }
4891 1.1 christos
4892 1.1 christos if (!elf_modify_segment_map (abfd, info, no_user_phdrs))
4893 1.3 christos return FALSE;
4894 1.1 christos
4895 1.3 christos for (count = 0, m = elf_seg_map (abfd); m != NULL; m = m->next)
4896 1.1 christos ++count;
4897 1.1 christos elf_program_header_size (abfd) = count * bed->s->sizeof_phdr;
4898 1.1 christos
4899 1.1 christos return TRUE;
4900 1.1 christos
4901 1.1 christos error_return:
4902 1.1 christos if (sections != NULL)
4903 1.1 christos free (sections);
4904 1.1 christos return FALSE;
4905 1.1 christos }
4906 1.1 christos
4907 1.1 christos /* Sort sections by address. */
4908 1.1 christos
4909 1.1 christos static int
4910 1.1 christos elf_sort_sections (const void *arg1, const void *arg2)
4911 1.1 christos {
4912 1.1 christos const asection *sec1 = *(const asection **) arg1;
4913 1.1 christos const asection *sec2 = *(const asection **) arg2;
4914 1.1 christos bfd_size_type size1, size2;
4915 1.1 christos
4916 1.1 christos /* Sort by LMA first, since this is the address used to
4917 1.1 christos place the section into a segment. */
4918 1.1 christos if (sec1->lma < sec2->lma)
4919 1.1 christos return -1;
4920 1.1 christos else if (sec1->lma > sec2->lma)
4921 1.1 christos return 1;
4922 1.1 christos
4923 1.1 christos /* Then sort by VMA. Normally the LMA and the VMA will be
4924 1.1 christos the same, and this will do nothing. */
4925 1.1 christos if (sec1->vma < sec2->vma)
4926 1.1 christos return -1;
4927 1.1 christos else if (sec1->vma > sec2->vma)
4928 1.1 christos return 1;
4929 1.1 christos
4930 1.1 christos /* Put !SEC_LOAD sections after SEC_LOAD ones. */
4931 1.1 christos
4932 1.1 christos #define TOEND(x) (((x)->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0)
4933 1.1 christos
4934 1.1 christos if (TOEND (sec1))
4935 1.1 christos {
4936 1.1 christos if (TOEND (sec2))
4937 1.1 christos {
4938 1.1 christos /* If the indicies are the same, do not return 0
4939 1.1 christos here, but continue to try the next comparison. */
4940 1.1 christos if (sec1->target_index - sec2->target_index != 0)
4941 1.1 christos return sec1->target_index - sec2->target_index;
4942 1.1 christos }
4943 1.1 christos else
4944 1.1 christos return 1;
4945 1.1 christos }
4946 1.1 christos else if (TOEND (sec2))
4947 1.1 christos return -1;
4948 1.1 christos
4949 1.1 christos #undef TOEND
4950 1.1 christos
4951 1.1 christos /* Sort by size, to put zero sized sections
4952 1.1 christos before others at the same address. */
4953 1.1 christos
4954 1.1 christos size1 = (sec1->flags & SEC_LOAD) ? sec1->size : 0;
4955 1.1 christos size2 = (sec2->flags & SEC_LOAD) ? sec2->size : 0;
4956 1.1 christos
4957 1.1 christos if (size1 < size2)
4958 1.1 christos return -1;
4959 1.1 christos if (size1 > size2)
4960 1.1 christos return 1;
4961 1.1 christos
4962 1.1 christos return sec1->target_index - sec2->target_index;
4963 1.1 christos }
4964 1.1 christos
4965 1.1 christos /* Ian Lance Taylor writes:
4966 1.1 christos
4967 1.1 christos We shouldn't be using % with a negative signed number. That's just
4968 1.1 christos not good. We have to make sure either that the number is not
4969 1.1 christos negative, or that the number has an unsigned type. When the types
4970 1.1 christos are all the same size they wind up as unsigned. When file_ptr is a
4971 1.1 christos larger signed type, the arithmetic winds up as signed long long,
4972 1.1 christos which is wrong.
4973 1.1 christos
4974 1.1 christos What we're trying to say here is something like ``increase OFF by
4975 1.1 christos the least amount that will cause it to be equal to the VMA modulo
4976 1.1 christos the page size.'' */
4977 1.1 christos /* In other words, something like:
4978 1.1 christos
4979 1.1 christos vma_offset = m->sections[0]->vma % bed->maxpagesize;
4980 1.1 christos off_offset = off % bed->maxpagesize;
4981 1.1 christos if (vma_offset < off_offset)
4982 1.1 christos adjustment = vma_offset + bed->maxpagesize - off_offset;
4983 1.1 christos else
4984 1.1 christos adjustment = vma_offset - off_offset;
4985 1.1 christos
4986 1.1 christos which can can be collapsed into the expression below. */
4987 1.1 christos
4988 1.1 christos static file_ptr
4989 1.4 christos vma_page_aligned_bias (bfd_vma vma, ufile_ptr off, bfd_vma maxpagesize)
4990 1.4 christos {
4991 1.4 christos /* PR binutils/16199: Handle an alignment of zero. */
4992 1.1 christos if (maxpagesize == 0)
4993 1.1 christos maxpagesize = 1;
4994 1.1 christos return ((vma - off) % maxpagesize);
4995 1.1 christos }
4996 1.1 christos
4997 1.1 christos static void
4998 1.1 christos print_segment_map (const struct elf_segment_map *m)
4999 1.1 christos {
5000 1.1 christos unsigned int j;
5001 1.1 christos const char *pt = get_segment_type (m->p_type);
5002 1.1 christos char buf[32];
5003 1.1 christos
5004 1.1 christos if (pt == NULL)
5005 1.1 christos {
5006 1.1 christos if (m->p_type >= PT_LOPROC && m->p_type <= PT_HIPROC)
5007 1.1 christos sprintf (buf, "LOPROC+%7.7x",
5008 1.1 christos (unsigned int) (m->p_type - PT_LOPROC));
5009 1.1 christos else if (m->p_type >= PT_LOOS && m->p_type <= PT_HIOS)
5010 1.1 christos sprintf (buf, "LOOS+%7.7x",
5011 1.1 christos (unsigned int) (m->p_type - PT_LOOS));
5012 1.1 christos else
5013 1.1 christos snprintf (buf, sizeof (buf), "%8.8x",
5014 1.1 christos (unsigned int) m->p_type);
5015 1.1 christos pt = buf;
5016 1.1 christos }
5017 1.1 christos fflush (stdout);
5018 1.1 christos fprintf (stderr, "%s:", pt);
5019 1.1 christos for (j = 0; j < m->count; j++)
5020 1.1 christos fprintf (stderr, " %s", m->sections [j]->name);
5021 1.1 christos putc ('\n',stderr);
5022 1.1 christos fflush (stderr);
5023 1.1 christos }
5024 1.1 christos
5025 1.1 christos static bfd_boolean
5026 1.1 christos write_zeros (bfd *abfd, file_ptr pos, bfd_size_type len)
5027 1.1 christos {
5028 1.1 christos void *buf;
5029 1.1 christos bfd_boolean ret;
5030 1.1 christos
5031 1.1 christos if (bfd_seek (abfd, pos, SEEK_SET) != 0)
5032 1.1 christos return FALSE;
5033 1.1 christos buf = bfd_zmalloc (len);
5034 1.1 christos if (buf == NULL)
5035 1.1 christos return FALSE;
5036 1.1 christos ret = bfd_bwrite (buf, len, abfd) == len;
5037 1.1 christos free (buf);
5038 1.1 christos return ret;
5039 1.1 christos }
5040 1.1 christos
5041 1.1 christos /* Assign file positions to the sections based on the mapping from
5042 1.1 christos sections to segments. This function also sets up some fields in
5043 1.1 christos the file header. */
5044 1.1 christos
5045 1.1 christos static bfd_boolean
5046 1.1 christos assign_file_positions_for_load_sections (bfd *abfd,
5047 1.1 christos struct bfd_link_info *link_info)
5048 1.1 christos {
5049 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5050 1.1 christos struct elf_segment_map *m;
5051 1.1 christos Elf_Internal_Phdr *phdrs;
5052 1.1 christos Elf_Internal_Phdr *p;
5053 1.1 christos file_ptr off;
5054 1.1 christos bfd_size_type maxpagesize;
5055 1.1 christos unsigned int alloc;
5056 1.1 christos unsigned int i, j;
5057 1.1 christos bfd_vma header_pad = 0;
5058 1.1 christos
5059 1.1 christos if (link_info == NULL
5060 1.1 christos && !_bfd_elf_map_sections_to_segments (abfd, link_info))
5061 1.1 christos return FALSE;
5062 1.3 christos
5063 1.1 christos alloc = 0;
5064 1.1 christos for (m = elf_seg_map (abfd); m != NULL; m = m->next)
5065 1.1 christos {
5066 1.1 christos ++alloc;
5067 1.1 christos if (m->header_size)
5068 1.1 christos header_pad = m->header_size;
5069 1.1 christos }
5070 1.1 christos
5071 1.1 christos if (alloc)
5072 1.1 christos {
5073 1.1 christos elf_elfheader (abfd)->e_phoff = bed->s->sizeof_ehdr;
5074 1.1 christos elf_elfheader (abfd)->e_phentsize = bed->s->sizeof_phdr;
5075 1.1 christos }
5076 1.1 christos else
5077 1.1 christos {
5078 1.1 christos /* PR binutils/12467. */
5079 1.1 christos elf_elfheader (abfd)->e_phoff = 0;
5080 1.3 christos elf_elfheader (abfd)->e_phentsize = 0;
5081 1.1 christos }
5082 1.1 christos
5083 1.3 christos elf_elfheader (abfd)->e_phnum = alloc;
5084 1.3 christos
5085 1.1 christos if (elf_program_header_size (abfd) == (bfd_size_type) -1)
5086 1.3 christos elf_program_header_size (abfd) = alloc * bed->s->sizeof_phdr;
5087 1.1 christos else
5088 1.1 christos BFD_ASSERT (elf_program_header_size (abfd)
5089 1.1 christos >= alloc * bed->s->sizeof_phdr);
5090 1.1 christos
5091 1.3 christos if (alloc == 0)
5092 1.1 christos {
5093 1.1 christos elf_next_file_pos (abfd) = bed->s->sizeof_ehdr;
5094 1.1 christos return TRUE;
5095 1.3 christos }
5096 1.1 christos
5097 1.1 christos /* We're writing the size in elf_program_header_size (abfd),
5098 1.3 christos see assign_file_positions_except_relocs, so make sure we have
5099 1.3 christos that amount allocated, with trailing space cleared.
5100 1.1 christos The variable alloc contains the computed need, while
5101 1.1 christos elf_program_header_size (abfd) contains the size used for the
5102 1.1 christos layout.
5103 1.1 christos See ld/emultempl/elf-generic.em:gld${EMULATION_NAME}_map_segments
5104 1.3 christos where the layout is forced to according to a larger size in the
5105 1.1 christos last iterations for the testcase ld-elf/header. */
5106 1.1 christos BFD_ASSERT (elf_program_header_size (abfd) % bed->s->sizeof_phdr
5107 1.1 christos == 0);
5108 1.3 christos phdrs = (Elf_Internal_Phdr *)
5109 1.1 christos bfd_zalloc2 (abfd,
5110 1.1 christos (elf_program_header_size (abfd) / bed->s->sizeof_phdr),
5111 1.1 christos sizeof (Elf_Internal_Phdr));
5112 1.1 christos elf_tdata (abfd)->phdr = phdrs;
5113 1.1 christos if (phdrs == NULL)
5114 1.1 christos return FALSE;
5115 1.1 christos
5116 1.1 christos maxpagesize = 1;
5117 1.1 christos if ((abfd->flags & D_PAGED) != 0)
5118 1.1 christos maxpagesize = bed->maxpagesize;
5119 1.1 christos
5120 1.1 christos off = bed->s->sizeof_ehdr;
5121 1.1 christos off += alloc * bed->s->sizeof_phdr;
5122 1.1 christos if (header_pad < (bfd_vma) off)
5123 1.1 christos header_pad = 0;
5124 1.1 christos else
5125 1.1 christos header_pad -= off;
5126 1.3 christos off += header_pad;
5127 1.1 christos
5128 1.1 christos for (m = elf_seg_map (abfd), p = phdrs, j = 0;
5129 1.1 christos m != NULL;
5130 1.1 christos m = m->next, p++, j++)
5131 1.1 christos {
5132 1.1 christos asection **secpp;
5133 1.1 christos bfd_vma off_adjust;
5134 1.1 christos bfd_boolean no_contents;
5135 1.1 christos
5136 1.1 christos /* If elf_segment_map is not from map_sections_to_segments, the
5137 1.1 christos sections may not be correctly ordered. NOTE: sorting should
5138 1.1 christos not be done to the PT_NOTE section of a corefile, which may
5139 1.1 christos contain several pseudo-sections artificially created by bfd.
5140 1.1 christos Sorting these pseudo-sections breaks things badly. */
5141 1.1 christos if (m->count > 1
5142 1.1 christos && !(elf_elfheader (abfd)->e_type == ET_CORE
5143 1.1 christos && m->p_type == PT_NOTE))
5144 1.1 christos qsort (m->sections, (size_t) m->count, sizeof (asection *),
5145 1.1 christos elf_sort_sections);
5146 1.1 christos
5147 1.1 christos /* An ELF segment (described by Elf_Internal_Phdr) may contain a
5148 1.1 christos number of sections with contents contributing to both p_filesz
5149 1.1 christos and p_memsz, followed by a number of sections with no contents
5150 1.1 christos that just contribute to p_memsz. In this loop, OFF tracks next
5151 1.1 christos available file offset for PT_LOAD and PT_NOTE segments. */
5152 1.1 christos p->p_type = m->p_type;
5153 1.1 christos p->p_flags = m->p_flags;
5154 1.1 christos
5155 1.1 christos if (m->count == 0)
5156 1.1 christos p->p_vaddr = 0;
5157 1.1 christos else
5158 1.1 christos p->p_vaddr = m->sections[0]->vma - m->p_vaddr_offset;
5159 1.1 christos
5160 1.1 christos if (m->p_paddr_valid)
5161 1.1 christos p->p_paddr = m->p_paddr;
5162 1.1 christos else if (m->count == 0)
5163 1.1 christos p->p_paddr = 0;
5164 1.1 christos else
5165 1.1 christos p->p_paddr = m->sections[0]->lma - m->p_vaddr_offset;
5166 1.1 christos
5167 1.1 christos if (p->p_type == PT_LOAD
5168 1.1 christos && (abfd->flags & D_PAGED) != 0)
5169 1.1 christos {
5170 1.1 christos /* p_align in demand paged PT_LOAD segments effectively stores
5171 1.1 christos the maximum page size. When copying an executable with
5172 1.1 christos objcopy, we set m->p_align from the input file. Use this
5173 1.1 christos value for maxpagesize rather than bed->maxpagesize, which
5174 1.1 christos may be different. Note that we use maxpagesize for PT_TLS
5175 1.1 christos segment alignment later in this function, so we are relying
5176 1.1 christos on at least one PT_LOAD segment appearing before a PT_TLS
5177 1.1 christos segment. */
5178 1.1 christos if (m->p_align_valid)
5179 1.1 christos maxpagesize = m->p_align;
5180 1.1 christos
5181 1.1 christos p->p_align = maxpagesize;
5182 1.1 christos }
5183 1.1 christos else if (m->p_align_valid)
5184 1.1 christos p->p_align = m->p_align;
5185 1.1 christos else if (m->count == 0)
5186 1.1 christos p->p_align = 1 << bed->s->log_file_align;
5187 1.1 christos else
5188 1.1 christos p->p_align = 0;
5189 1.1 christos
5190 1.1 christos no_contents = FALSE;
5191 1.1 christos off_adjust = 0;
5192 1.1 christos if (p->p_type == PT_LOAD
5193 1.1 christos && m->count > 0)
5194 1.1 christos {
5195 1.1 christos bfd_size_type align;
5196 1.1 christos unsigned int align_power = 0;
5197 1.1 christos
5198 1.1 christos if (m->p_align_valid)
5199 1.1 christos align = p->p_align;
5200 1.1 christos else
5201 1.1 christos {
5202 1.1 christos for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
5203 1.1 christos {
5204 1.1 christos unsigned int secalign;
5205 1.1 christos
5206 1.1 christos secalign = bfd_get_section_alignment (abfd, *secpp);
5207 1.1 christos if (secalign > align_power)
5208 1.1 christos align_power = secalign;
5209 1.1 christos }
5210 1.1 christos align = (bfd_size_type) 1 << align_power;
5211 1.1 christos if (align < maxpagesize)
5212 1.1 christos align = maxpagesize;
5213 1.1 christos }
5214 1.1 christos
5215 1.1 christos for (i = 0; i < m->count; i++)
5216 1.1 christos if ((m->sections[i]->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
5217 1.1 christos /* If we aren't making room for this section, then
5218 1.1 christos it must be SHT_NOBITS regardless of what we've
5219 1.1 christos set via struct bfd_elf_special_section. */
5220 1.1 christos elf_section_type (m->sections[i]) = SHT_NOBITS;
5221 1.1 christos
5222 1.1 christos /* Find out whether this segment contains any loadable
5223 1.1 christos sections. */
5224 1.1 christos no_contents = TRUE;
5225 1.1 christos for (i = 0; i < m->count; i++)
5226 1.1 christos if (elf_section_type (m->sections[i]) != SHT_NOBITS)
5227 1.1 christos {
5228 1.1 christos no_contents = FALSE;
5229 1.1 christos break;
5230 1.1 christos }
5231 1.1 christos
5232 1.1 christos off_adjust = vma_page_aligned_bias (p->p_vaddr, off, align);
5233 1.1 christos off += off_adjust;
5234 1.1 christos if (no_contents)
5235 1.1 christos {
5236 1.1 christos /* We shouldn't need to align the segment on disk since
5237 1.1 christos the segment doesn't need file space, but the gABI
5238 1.1 christos arguably requires the alignment and glibc ld.so
5239 1.1 christos checks it. So to comply with the alignment
5240 1.1 christos requirement but not waste file space, we adjust
5241 1.1 christos p_offset for just this segment. (OFF_ADJUST is
5242 1.1 christos subtracted from OFF later.) This may put p_offset
5243 1.1 christos past the end of file, but that shouldn't matter. */
5244 1.1 christos }
5245 1.1 christos else
5246 1.1 christos off_adjust = 0;
5247 1.1 christos }
5248 1.1 christos /* Make sure the .dynamic section is the first section in the
5249 1.1 christos PT_DYNAMIC segment. */
5250 1.1 christos else if (p->p_type == PT_DYNAMIC
5251 1.1 christos && m->count > 1
5252 1.1 christos && strcmp (m->sections[0]->name, ".dynamic") != 0)
5253 1.1 christos {
5254 1.1 christos _bfd_error_handler
5255 1.1 christos (_("%B: The first section in the PT_DYNAMIC segment is not the .dynamic section"),
5256 1.1 christos abfd);
5257 1.1 christos bfd_set_error (bfd_error_bad_value);
5258 1.1 christos return FALSE;
5259 1.1 christos }
5260 1.1 christos /* Set the note section type to SHT_NOTE. */
5261 1.1 christos else if (p->p_type == PT_NOTE)
5262 1.1 christos for (i = 0; i < m->count; i++)
5263 1.1 christos elf_section_type (m->sections[i]) = SHT_NOTE;
5264 1.1 christos
5265 1.1 christos p->p_offset = 0;
5266 1.1 christos p->p_filesz = 0;
5267 1.1 christos p->p_memsz = 0;
5268 1.1 christos
5269 1.1 christos if (m->includes_filehdr)
5270 1.1 christos {
5271 1.1 christos if (!m->p_flags_valid)
5272 1.1 christos p->p_flags |= PF_R;
5273 1.1 christos p->p_filesz = bed->s->sizeof_ehdr;
5274 1.1 christos p->p_memsz = bed->s->sizeof_ehdr;
5275 1.8 christos if (m->count > 0)
5276 1.8 christos {
5277 1.8 christos if (p->p_vaddr < (bfd_vma) off
5278 1.1 christos || (!m->p_paddr_valid
5279 1.1 christos && p->p_paddr < (bfd_vma) off))
5280 1.1 christos {
5281 1.1 christos (*_bfd_error_handler)
5282 1.1 christos (_("%B: Not enough room for program headers, try linking with -N"),
5283 1.1 christos abfd);
5284 1.1 christos bfd_set_error (bfd_error_bad_value);
5285 1.1 christos return FALSE;
5286 1.1 christos }
5287 1.1 christos
5288 1.1 christos p->p_vaddr -= off;
5289 1.1 christos if (!m->p_paddr_valid)
5290 1.1 christos p->p_paddr -= off;
5291 1.1 christos }
5292 1.1 christos }
5293 1.1 christos
5294 1.1 christos if (m->includes_phdrs)
5295 1.1 christos {
5296 1.1 christos if (!m->p_flags_valid)
5297 1.1 christos p->p_flags |= PF_R;
5298 1.1 christos
5299 1.1 christos if (!m->includes_filehdr)
5300 1.1 christos {
5301 1.1 christos p->p_offset = bed->s->sizeof_ehdr;
5302 1.1 christos
5303 1.1 christos if (m->count > 0)
5304 1.1 christos {
5305 1.1 christos p->p_vaddr -= off - p->p_offset;
5306 1.1 christos if (!m->p_paddr_valid)
5307 1.1 christos p->p_paddr -= off - p->p_offset;
5308 1.1 christos }
5309 1.1 christos }
5310 1.1 christos
5311 1.1 christos p->p_filesz += alloc * bed->s->sizeof_phdr;
5312 1.1 christos p->p_memsz += alloc * bed->s->sizeof_phdr;
5313 1.1 christos if (m->count)
5314 1.1 christos {
5315 1.1 christos p->p_filesz += header_pad;
5316 1.1 christos p->p_memsz += header_pad;
5317 1.1 christos }
5318 1.1 christos }
5319 1.1 christos
5320 1.1 christos if (p->p_type == PT_LOAD
5321 1.1 christos || (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core))
5322 1.1 christos {
5323 1.1 christos if (!m->includes_filehdr && !m->includes_phdrs)
5324 1.1 christos p->p_offset = off;
5325 1.1 christos else
5326 1.1 christos {
5327 1.1 christos file_ptr adjust;
5328 1.1 christos
5329 1.1 christos adjust = off - (p->p_offset + p->p_filesz);
5330 1.1 christos if (!no_contents)
5331 1.1 christos p->p_filesz += adjust;
5332 1.1 christos p->p_memsz += adjust;
5333 1.1 christos }
5334 1.1 christos }
5335 1.1 christos
5336 1.1 christos /* Set up p_filesz, p_memsz, p_align and p_flags from the section
5337 1.1 christos maps. Set filepos for sections in PT_LOAD segments, and in
5338 1.1 christos core files, for sections in PT_NOTE segments.
5339 1.1 christos assign_file_positions_for_non_load_sections will set filepos
5340 1.1 christos for other sections and update p_filesz for other segments. */
5341 1.1 christos for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
5342 1.1 christos {
5343 1.1 christos asection *sec;
5344 1.1 christos bfd_size_type align;
5345 1.1 christos Elf_Internal_Shdr *this_hdr;
5346 1.1 christos
5347 1.1 christos sec = *secpp;
5348 1.1 christos this_hdr = &elf_section_data (sec)->this_hdr;
5349 1.1 christos align = (bfd_size_type) 1 << bfd_get_section_alignment (abfd, sec);
5350 1.1 christos
5351 1.1 christos if ((p->p_type == PT_LOAD
5352 1.1 christos || p->p_type == PT_TLS)
5353 1.1 christos && (this_hdr->sh_type != SHT_NOBITS
5354 1.1 christos || ((this_hdr->sh_flags & SHF_ALLOC) != 0
5355 1.1 christos && ((this_hdr->sh_flags & SHF_TLS) == 0
5356 1.1 christos || p->p_type == PT_TLS))))
5357 1.1 christos {
5358 1.1 christos bfd_vma p_start = p->p_paddr;
5359 1.1 christos bfd_vma p_end = p_start + p->p_memsz;
5360 1.1 christos bfd_vma s_start = sec->lma;
5361 1.1 christos bfd_vma adjust = s_start - p_end;
5362 1.1 christos
5363 1.1 christos if (adjust != 0
5364 1.1 christos && (s_start < p_end
5365 1.1 christos || p_end < p_start))
5366 1.1 christos {
5367 1.1 christos (*_bfd_error_handler)
5368 1.1 christos (_("%B: section %A lma %#lx adjusted to %#lx"), abfd, sec,
5369 1.1 christos (unsigned long) s_start, (unsigned long) p_end);
5370 1.1 christos adjust = 0;
5371 1.1 christos sec->lma = p_end;
5372 1.1 christos }
5373 1.1 christos p->p_memsz += adjust;
5374 1.1 christos
5375 1.1 christos if (this_hdr->sh_type != SHT_NOBITS)
5376 1.1 christos {
5377 1.1 christos if (p->p_filesz + adjust < p->p_memsz)
5378 1.1 christos {
5379 1.1 christos /* We have a PROGBITS section following NOBITS ones.
5380 1.1 christos Allocate file space for the NOBITS section(s) and
5381 1.1 christos zero it. */
5382 1.1 christos adjust = p->p_memsz - p->p_filesz;
5383 1.1 christos if (!write_zeros (abfd, off, adjust))
5384 1.1 christos return FALSE;
5385 1.1 christos }
5386 1.1 christos off += adjust;
5387 1.1 christos p->p_filesz += adjust;
5388 1.1 christos }
5389 1.1 christos }
5390 1.1 christos
5391 1.1 christos if (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core)
5392 1.1 christos {
5393 1.1 christos /* The section at i == 0 is the one that actually contains
5394 1.1 christos everything. */
5395 1.1 christos if (i == 0)
5396 1.1 christos {
5397 1.1 christos this_hdr->sh_offset = sec->filepos = off;
5398 1.1 christos off += this_hdr->sh_size;
5399 1.1 christos p->p_filesz = this_hdr->sh_size;
5400 1.1 christos p->p_memsz = 0;
5401 1.1 christos p->p_align = 1;
5402 1.1 christos }
5403 1.1 christos else
5404 1.1 christos {
5405 1.1 christos /* The rest are fake sections that shouldn't be written. */
5406 1.1 christos sec->filepos = 0;
5407 1.1 christos sec->size = 0;
5408 1.1 christos sec->flags = 0;
5409 1.1 christos continue;
5410 1.1 christos }
5411 1.1 christos }
5412 1.1 christos else
5413 1.1 christos {
5414 1.1 christos if (p->p_type == PT_LOAD)
5415 1.1 christos {
5416 1.1 christos this_hdr->sh_offset = sec->filepos = off;
5417 1.1 christos if (this_hdr->sh_type != SHT_NOBITS)
5418 1.3 christos off += this_hdr->sh_size;
5419 1.3 christos }
5420 1.3 christos else if (this_hdr->sh_type == SHT_NOBITS
5421 1.3 christos && (this_hdr->sh_flags & SHF_TLS) != 0
5422 1.3 christos && this_hdr->sh_offset == 0)
5423 1.3 christos {
5424 1.3 christos /* This is a .tbss section that didn't get a PT_LOAD.
5425 1.3 christos (See _bfd_elf_map_sections_to_segments "Create a
5426 1.3 christos final PT_LOAD".) Set sh_offset to the value it
5427 1.3 christos would have if we had created a zero p_filesz and
5428 1.3 christos p_memsz PT_LOAD header for the section. This
5429 1.3 christos also makes the PT_TLS header have the same
5430 1.3 christos p_offset value. */
5431 1.3 christos bfd_vma adjust = vma_page_aligned_bias (this_hdr->sh_addr,
5432 1.3 christos off, align);
5433 1.1 christos this_hdr->sh_offset = sec->filepos = off + adjust;
5434 1.1 christos }
5435 1.1 christos
5436 1.1 christos if (this_hdr->sh_type != SHT_NOBITS)
5437 1.1 christos {
5438 1.1 christos p->p_filesz += this_hdr->sh_size;
5439 1.1 christos /* A load section without SHF_ALLOC is something like
5440 1.1 christos a note section in a PT_NOTE segment. These take
5441 1.1 christos file space but are not loaded into memory. */
5442 1.1 christos if ((this_hdr->sh_flags & SHF_ALLOC) != 0)
5443 1.1 christos p->p_memsz += this_hdr->sh_size;
5444 1.1 christos }
5445 1.1 christos else if ((this_hdr->sh_flags & SHF_ALLOC) != 0)
5446 1.1 christos {
5447 1.1 christos if (p->p_type == PT_TLS)
5448 1.1 christos p->p_memsz += this_hdr->sh_size;
5449 1.1 christos
5450 1.1 christos /* .tbss is special. It doesn't contribute to p_memsz of
5451 1.1 christos normal segments. */
5452 1.1 christos else if ((this_hdr->sh_flags & SHF_TLS) == 0)
5453 1.1 christos p->p_memsz += this_hdr->sh_size;
5454 1.1 christos }
5455 1.1 christos
5456 1.1 christos if (align > p->p_align
5457 1.1 christos && !m->p_align_valid
5458 1.1 christos && (p->p_type != PT_LOAD
5459 1.1 christos || (abfd->flags & D_PAGED) == 0))
5460 1.1 christos p->p_align = align;
5461 1.1 christos }
5462 1.1 christos
5463 1.1 christos if (!m->p_flags_valid)
5464 1.1 christos {
5465 1.1 christos p->p_flags |= PF_R;
5466 1.1 christos if ((this_hdr->sh_flags & SHF_EXECINSTR) != 0)
5467 1.1 christos p->p_flags |= PF_X;
5468 1.1 christos if ((this_hdr->sh_flags & SHF_WRITE) != 0)
5469 1.1 christos p->p_flags |= PF_W;
5470 1.5 christos }
5471 1.1 christos }
5472 1.1 christos
5473 1.1 christos off -= off_adjust;
5474 1.1 christos
5475 1.1 christos /* Check that all sections are in a PT_LOAD segment.
5476 1.1 christos Don't check funky gdb generated core files. */
5477 1.1 christos if (p->p_type == PT_LOAD && bfd_get_format (abfd) != bfd_core)
5478 1.1 christos {
5479 1.1 christos bfd_boolean check_vma = TRUE;
5480 1.1 christos
5481 1.1 christos for (i = 1; i < m->count; i++)
5482 1.1 christos if (m->sections[i]->vma == m->sections[i - 1]->vma
5483 1.1 christos && ELF_SECTION_SIZE (&(elf_section_data (m->sections[i])
5484 1.1 christos ->this_hdr), p) != 0
5485 1.1 christos && ELF_SECTION_SIZE (&(elf_section_data (m->sections[i - 1])
5486 1.1 christos ->this_hdr), p) != 0)
5487 1.1 christos {
5488 1.1 christos /* Looks like we have overlays packed into the segment. */
5489 1.1 christos check_vma = FALSE;
5490 1.1 christos break;
5491 1.1 christos }
5492 1.1 christos
5493 1.1 christos for (i = 0; i < m->count; i++)
5494 1.1 christos {
5495 1.1 christos Elf_Internal_Shdr *this_hdr;
5496 1.1 christos asection *sec;
5497 1.1 christos
5498 1.3 christos sec = m->sections[i];
5499 1.3 christos this_hdr = &(elf_section_data(sec)->this_hdr);
5500 1.1 christos if (!ELF_SECTION_IN_SEGMENT_1 (this_hdr, p, check_vma, 0)
5501 1.1 christos && !ELF_TBSS_SPECIAL (this_hdr, p))
5502 1.1 christos {
5503 1.1 christos (*_bfd_error_handler)
5504 1.1 christos (_("%B: section `%A' can't be allocated in segment %d"),
5505 1.1 christos abfd, sec, j);
5506 1.1 christos print_segment_map (m);
5507 1.1 christos }
5508 1.1 christos }
5509 1.1 christos }
5510 1.3 christos }
5511 1.1 christos
5512 1.1 christos elf_next_file_pos (abfd) = off;
5513 1.1 christos return TRUE;
5514 1.1 christos }
5515 1.1 christos
5516 1.1 christos /* Assign file positions for the other sections. */
5517 1.1 christos
5518 1.1 christos static bfd_boolean
5519 1.1 christos assign_file_positions_for_non_load_sections (bfd *abfd,
5520 1.1 christos struct bfd_link_info *link_info)
5521 1.1 christos {
5522 1.6 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5523 1.1 christos Elf_Internal_Shdr **i_shdrpp;
5524 1.1 christos Elf_Internal_Shdr **hdrpp, **end_hdrpp;
5525 1.1 christos Elf_Internal_Phdr *phdrs;
5526 1.3 christos Elf_Internal_Phdr *p;
5527 1.1 christos struct elf_segment_map *m;
5528 1.1 christos struct elf_segment_map *hdrs_segment;
5529 1.1 christos bfd_vma filehdr_vaddr, filehdr_paddr;
5530 1.1 christos bfd_vma phdrs_vaddr, phdrs_paddr;
5531 1.1 christos file_ptr off;
5532 1.1 christos unsigned int count;
5533 1.6 christos
5534 1.3 christos i_shdrpp = elf_elfsections (abfd);
5535 1.6 christos end_hdrpp = i_shdrpp + elf_numsections (abfd);
5536 1.1 christos off = elf_next_file_pos (abfd);
5537 1.1 christos for (hdrpp = i_shdrpp + 1; hdrpp < end_hdrpp; hdrpp++)
5538 1.1 christos {
5539 1.1 christos Elf_Internal_Shdr *hdr;
5540 1.1 christos
5541 1.1 christos hdr = *hdrpp;
5542 1.1 christos if (hdr->bfd_section != NULL
5543 1.1 christos && (hdr->bfd_section->filepos != 0
5544 1.1 christos || (hdr->sh_type == SHT_NOBITS
5545 1.1 christos && hdr->contents == NULL)))
5546 1.1 christos BFD_ASSERT (hdr->sh_offset == hdr->bfd_section->filepos);
5547 1.3 christos else if ((hdr->sh_flags & SHF_ALLOC) != 0)
5548 1.3 christos {
5549 1.3 christos if (hdr->sh_size != 0)
5550 1.3 christos (*_bfd_error_handler)
5551 1.3 christos (_("%B: warning: allocated section `%s' not in segment"),
5552 1.3 christos abfd,
5553 1.3 christos (hdr->bfd_section == NULL
5554 1.1 christos ? "*unknown*"
5555 1.1 christos : hdr->bfd_section->name));
5556 1.1 christos /* We don't need to page align empty sections. */
5557 1.1 christos if ((abfd->flags & D_PAGED) != 0 && hdr->sh_size != 0)
5558 1.1 christos off += vma_page_aligned_bias (hdr->sh_addr, off,
5559 1.1 christos bed->maxpagesize);
5560 1.1 christos else
5561 1.1 christos off += vma_page_aligned_bias (hdr->sh_addr, off,
5562 1.1 christos hdr->sh_addralign);
5563 1.1 christos off = _bfd_elf_assign_file_position_for_section (hdr, off,
5564 1.1 christos FALSE);
5565 1.1 christos }
5566 1.6 christos else if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
5567 1.6 christos && hdr->bfd_section == NULL)
5568 1.6 christos || (hdr->bfd_section != NULL
5569 1.3 christos && (hdr->bfd_section->flags & SEC_ELF_COMPRESS))
5570 1.8 christos /* Compress DWARF debug sections. */
5571 1.8 christos || hdr == i_shdrpp[elf_onesymtab (abfd)]
5572 1.6 christos || (elf_symtab_shndx_list (abfd) != NULL
5573 1.6 christos && hdr == i_shdrpp[elf_symtab_shndx_list (abfd)->ndx])
5574 1.1 christos || hdr == i_shdrpp[elf_strtab_sec (abfd)]
5575 1.1 christos || hdr == i_shdrpp[elf_shstrtab_sec (abfd)])
5576 1.1 christos hdr->sh_offset = -1;
5577 1.1 christos else
5578 1.1 christos off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
5579 1.1 christos }
5580 1.1 christos
5581 1.1 christos /* Now that we have set the section file positions, we can set up
5582 1.1 christos the file positions for the non PT_LOAD segments. */
5583 1.1 christos count = 0;
5584 1.1 christos filehdr_vaddr = 0;
5585 1.1 christos filehdr_paddr = 0;
5586 1.3 christos phdrs_vaddr = bed->maxpagesize + bed->s->sizeof_ehdr;
5587 1.1 christos phdrs_paddr = 0;
5588 1.3 christos hdrs_segment = NULL;
5589 1.1 christos phdrs = elf_tdata (abfd)->phdr;
5590 1.1 christos for (m = elf_seg_map (abfd), p = phdrs; m != NULL; m = m->next, p++)
5591 1.1 christos {
5592 1.1 christos ++count;
5593 1.1 christos if (p->p_type != PT_LOAD)
5594 1.1 christos continue;
5595 1.1 christos
5596 1.1 christos if (m->includes_filehdr)
5597 1.1 christos {
5598 1.1 christos filehdr_vaddr = p->p_vaddr;
5599 1.1 christos filehdr_paddr = p->p_paddr;
5600 1.1 christos }
5601 1.1 christos if (m->includes_phdrs)
5602 1.1 christos {
5603 1.1 christos phdrs_vaddr = p->p_vaddr;
5604 1.1 christos phdrs_paddr = p->p_paddr;
5605 1.3 christos if (m->includes_filehdr)
5606 1.1 christos {
5607 1.1 christos hdrs_segment = m;
5608 1.1 christos phdrs_vaddr += bed->s->sizeof_ehdr;
5609 1.1 christos phdrs_paddr += bed->s->sizeof_ehdr;
5610 1.1 christos }
5611 1.1 christos }
5612 1.3 christos }
5613 1.3 christos
5614 1.3 christos if (hdrs_segment != NULL && link_info != NULL)
5615 1.3 christos {
5616 1.3 christos /* There is a segment that contains both the file headers and the
5617 1.3 christos program headers, so provide a symbol __ehdr_start pointing there.
5618 1.3 christos A program can use this to examine itself robustly. */
5619 1.3 christos
5620 1.3 christos struct elf_link_hash_entry *hash
5621 1.3 christos = elf_link_hash_lookup (elf_hash_table (link_info), "__ehdr_start",
5622 1.3 christos FALSE, FALSE, TRUE);
5623 1.3 christos /* If the symbol was referenced and not defined, define it. */
5624 1.3 christos if (hash != NULL
5625 1.3 christos && (hash->root.type == bfd_link_hash_new
5626 1.3 christos || hash->root.type == bfd_link_hash_undefined
5627 1.3 christos || hash->root.type == bfd_link_hash_undefweak
5628 1.3 christos || hash->root.type == bfd_link_hash_common))
5629 1.3 christos {
5630 1.3 christos asection *s = NULL;
5631 1.3 christos if (hdrs_segment->count != 0)
5632 1.3 christos /* The segment contains sections, so use the first one. */
5633 1.3 christos s = hdrs_segment->sections[0];
5634 1.3 christos else
5635 1.3 christos /* Use the first (i.e. lowest-addressed) section in any segment. */
5636 1.3 christos for (m = elf_seg_map (abfd); m != NULL; m = m->next)
5637 1.3 christos if (m->count != 0)
5638 1.3 christos {
5639 1.3 christos s = m->sections[0];
5640 1.3 christos break;
5641 1.3 christos }
5642 1.3 christos
5643 1.3 christos if (s != NULL)
5644 1.3 christos {
5645 1.3 christos hash->root.u.def.value = filehdr_vaddr - s->vma;
5646 1.3 christos hash->root.u.def.section = s;
5647 1.3 christos }
5648 1.3 christos else
5649 1.3 christos {
5650 1.3 christos hash->root.u.def.value = filehdr_vaddr;
5651 1.3 christos hash->root.u.def.section = bfd_abs_section_ptr;
5652 1.3 christos }
5653 1.3 christos
5654 1.3 christos hash->root.type = bfd_link_hash_defined;
5655 1.3 christos hash->def_regular = 1;
5656 1.3 christos hash->non_elf = 0;
5657 1.3 christos }
5658 1.3 christos }
5659 1.1 christos
5660 1.1 christos for (m = elf_seg_map (abfd), p = phdrs; m != NULL; m = m->next, p++)
5661 1.1 christos {
5662 1.1 christos if (p->p_type == PT_GNU_RELRO)
5663 1.3 christos {
5664 1.1 christos const Elf_Internal_Phdr *lp;
5665 1.1 christos struct elf_segment_map *lm;
5666 1.1 christos
5667 1.1 christos if (link_info != NULL)
5668 1.1 christos {
5669 1.3 christos /* During linking the range of the RELRO segment is passed
5670 1.3 christos in link_info. */
5671 1.3 christos for (lm = elf_seg_map (abfd), lp = phdrs;
5672 1.1 christos lm != NULL;
5673 1.1 christos lm = lm->next, lp++)
5674 1.1 christos {
5675 1.3 christos if (lp->p_type == PT_LOAD
5676 1.3 christos && lp->p_vaddr < link_info->relro_end
5677 1.1 christos && lm->count != 0
5678 1.1 christos && lm->sections[0]->vma >= link_info->relro_start)
5679 1.3 christos break;
5680 1.3 christos }
5681 1.1 christos
5682 1.1 christos BFD_ASSERT (lm != NULL);
5683 1.1 christos }
5684 1.1 christos else
5685 1.1 christos {
5686 1.1 christos /* Otherwise we are copying an executable or shared
5687 1.1 christos library, but we need to use the same linker logic. */
5688 1.1 christos for (lp = phdrs; lp < phdrs + count; ++lp)
5689 1.1 christos {
5690 1.1 christos if (lp->p_type == PT_LOAD
5691 1.1 christos && lp->p_paddr == p->p_paddr)
5692 1.1 christos break;
5693 1.1 christos }
5694 1.1 christos }
5695 1.1 christos
5696 1.1 christos if (lp < phdrs + count)
5697 1.1 christos {
5698 1.1 christos p->p_vaddr = lp->p_vaddr;
5699 1.1 christos p->p_paddr = lp->p_paddr;
5700 1.1 christos p->p_offset = lp->p_offset;
5701 1.1 christos if (link_info != NULL)
5702 1.1 christos p->p_filesz = link_info->relro_end - lp->p_vaddr;
5703 1.1 christos else if (m->p_size_valid)
5704 1.1 christos p->p_filesz = m->p_size;
5705 1.1 christos else
5706 1.3 christos abort ();
5707 1.3 christos p->p_memsz = p->p_filesz;
5708 1.3 christos /* Preserve the alignment and flags if they are valid. The
5709 1.3 christos gold linker generates RW/4 for the PT_GNU_RELRO section.
5710 1.3 christos It is better for objcopy/strip to honor these attributes
5711 1.3 christos otherwise gdb will choke when using separate debug files.
5712 1.3 christos */
5713 1.3 christos if (!m->p_align_valid)
5714 1.8 christos p->p_align = 1;
5715 1.1 christos if (!m->p_flags_valid)
5716 1.1 christos p->p_flags = PF_R;
5717 1.1 christos }
5718 1.1 christos else
5719 1.1 christos {
5720 1.1 christos memset (p, 0, sizeof *p);
5721 1.1 christos p->p_type = PT_NULL;
5722 1.3 christos }
5723 1.3 christos }
5724 1.3 christos else if (p->p_type == PT_GNU_STACK)
5725 1.3 christos {
5726 1.3 christos if (m->p_size_valid)
5727 1.1 christos p->p_memsz = m->p_size;
5728 1.1 christos }
5729 1.6 christos else if (m->count != 0)
5730 1.1 christos {
5731 1.1 christos unsigned int i;
5732 1.1 christos if (p->p_type != PT_LOAD
5733 1.1 christos && (p->p_type != PT_NOTE
5734 1.6 christos || bfd_get_format (abfd) != bfd_core))
5735 1.6 christos {
5736 1.6 christos if (m->includes_filehdr || m->includes_phdrs)
5737 1.6 christos {
5738 1.6 christos /* PR 17512: file: 2195325e. */
5739 1.6 christos (*_bfd_error_handler)
5740 1.6 christos (_("%B: warning: non-load segment includes file header and/or program header"),
5741 1.6 christos abfd);
5742 1.1 christos return FALSE;
5743 1.3 christos }
5744 1.1 christos
5745 1.3 christos p->p_filesz = 0;
5746 1.3 christos p->p_offset = m->sections[0]->filepos;
5747 1.3 christos for (i = m->count; i-- != 0;)
5748 1.3 christos {
5749 1.3 christos asection *sect = m->sections[i];
5750 1.3 christos Elf_Internal_Shdr *hdr = &elf_section_data (sect)->this_hdr;
5751 1.3 christos if (hdr->sh_type != SHT_NOBITS)
5752 1.3 christos {
5753 1.3 christos p->p_filesz = (sect->filepos - m->sections[0]->filepos
5754 1.3 christos + hdr->sh_size);
5755 1.3 christos break;
5756 1.1 christos }
5757 1.1 christos }
5758 1.1 christos }
5759 1.1 christos }
5760 1.1 christos else if (m->includes_filehdr)
5761 1.1 christos {
5762 1.1 christos p->p_vaddr = filehdr_vaddr;
5763 1.1 christos if (! m->p_paddr_valid)
5764 1.1 christos p->p_paddr = filehdr_paddr;
5765 1.1 christos }
5766 1.1 christos else if (m->includes_phdrs)
5767 1.1 christos {
5768 1.1 christos p->p_vaddr = phdrs_vaddr;
5769 1.1 christos if (! m->p_paddr_valid)
5770 1.1 christos p->p_paddr = phdrs_paddr;
5771 1.1 christos }
5772 1.3 christos }
5773 1.1 christos
5774 1.1 christos elf_next_file_pos (abfd) = off;
5775 1.1 christos
5776 1.1 christos return TRUE;
5777 1.8 christos }
5778 1.8 christos
5779 1.8 christos static elf_section_list *
5780 1.8 christos find_section_in_list (unsigned int i, elf_section_list * list)
5781 1.8 christos {
5782 1.8 christos for (;list != NULL; list = list->next)
5783 1.8 christos if (list->ndx == i)
5784 1.8 christos break;
5785 1.8 christos return list;
5786 1.1 christos }
5787 1.1 christos
5788 1.1 christos /* Work out the file positions of all the sections. This is called by
5789 1.1 christos _bfd_elf_compute_section_file_positions. All the section sizes and
5790 1.1 christos VMAs must be known before this is called.
5791 1.1 christos
5792 1.1 christos Reloc sections come in two flavours: Those processed specially as
5793 1.1 christos "side-channel" data attached to a section to which they apply, and
5794 1.1 christos those that bfd doesn't process as relocations. The latter sort are
5795 1.1 christos stored in a normal bfd section by bfd_section_from_shdr. We don't
5796 1.1 christos consider the former sort here, unless they form part of the loadable
5797 1.1 christos image. Reloc sections not assigned here will be handled later by
5798 1.1 christos assign_file_positions_for_relocs.
5799 1.1 christos
5800 1.1 christos We also don't set the positions of the .symtab and .strtab here. */
5801 1.1 christos
5802 1.1 christos static bfd_boolean
5803 1.1 christos assign_file_positions_except_relocs (bfd *abfd,
5804 1.1 christos struct bfd_link_info *link_info)
5805 1.1 christos {
5806 1.1 christos struct elf_obj_tdata *tdata = elf_tdata (abfd);
5807 1.1 christos Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
5808 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5809 1.1 christos
5810 1.1 christos if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0
5811 1.1 christos && bfd_get_format (abfd) != bfd_core)
5812 1.1 christos {
5813 1.1 christos Elf_Internal_Shdr ** const i_shdrpp = elf_elfsections (abfd);
5814 1.1 christos unsigned int num_sec = elf_numsections (abfd);
5815 1.5 christos Elf_Internal_Shdr **hdrpp;
5816 1.1 christos unsigned int i;
5817 1.1 christos file_ptr off;
5818 1.1 christos
5819 1.1 christos /* Start after the ELF header. */
5820 1.1 christos off = i_ehdrp->e_ehsize;
5821 1.1 christos
5822 1.1 christos /* We are not creating an executable, which means that we are
5823 1.1 christos not creating a program header, and that the actual order of
5824 1.1 christos the sections in the file is unimportant. */
5825 1.1 christos for (i = 1, hdrpp = i_shdrpp + 1; i < num_sec; i++, hdrpp++)
5826 1.1 christos {
5827 1.1 christos Elf_Internal_Shdr *hdr;
5828 1.1 christos
5829 1.1 christos hdr = *hdrpp;
5830 1.6 christos if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
5831 1.6 christos && hdr->bfd_section == NULL)
5832 1.6 christos || (hdr->bfd_section != NULL
5833 1.3 christos && (hdr->bfd_section->flags & SEC_ELF_COMPRESS))
5834 1.8 christos /* Compress DWARF debug sections. */
5835 1.8 christos || i == elf_onesymtab (abfd)
5836 1.6 christos || (elf_symtab_shndx_list (abfd) != NULL
5837 1.6 christos && hdr == i_shdrpp[elf_symtab_shndx_list (abfd)->ndx])
5838 1.1 christos || i == elf_strtab_sec (abfd)
5839 1.1 christos || i == elf_shstrtab_sec (abfd))
5840 1.1 christos {
5841 1.1 christos hdr->sh_offset = -1;
5842 1.1 christos }
5843 1.1 christos else
5844 1.5 christos off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
5845 1.5 christos }
5846 1.1 christos
5847 1.1 christos elf_next_file_pos (abfd) = off;
5848 1.1 christos }
5849 1.1 christos else
5850 1.1 christos {
5851 1.1 christos unsigned int alloc;
5852 1.1 christos
5853 1.1 christos /* Assign file positions for the loaded sections based on the
5854 1.1 christos assignment of sections to segments. */
5855 1.1 christos if (!assign_file_positions_for_load_sections (abfd, link_info))
5856 1.1 christos return FALSE;
5857 1.1 christos
5858 1.1 christos /* And for non-load sections. */
5859 1.1 christos if (!assign_file_positions_for_non_load_sections (abfd, link_info))
5860 1.1 christos return FALSE;
5861 1.1 christos
5862 1.1 christos if (bed->elf_backend_modify_program_headers != NULL)
5863 1.1 christos {
5864 1.1 christos if (!(*bed->elf_backend_modify_program_headers) (abfd, link_info))
5865 1.1 christos return FALSE;
5866 1.4 christos }
5867 1.8 christos
5868 1.4 christos /* Set e_type in ELF header to ET_EXEC for -pie -Ttext-segment=. */
5869 1.4 christos if (link_info != NULL && bfd_link_pie (link_info))
5870 1.4 christos {
5871 1.4 christos unsigned int num_segments = elf_elfheader (abfd)->e_phnum;
5872 1.4 christos Elf_Internal_Phdr *segment = elf_tdata (abfd)->phdr;
5873 1.4 christos Elf_Internal_Phdr *end_segment = &segment[num_segments];
5874 1.4 christos
5875 1.4 christos /* Find the lowest p_vaddr in PT_LOAD segments. */
5876 1.4 christos bfd_vma p_vaddr = (bfd_vma) -1;
5877 1.4 christos for (; segment < end_segment; segment++)
5878 1.4 christos if (segment->p_type == PT_LOAD && p_vaddr > segment->p_vaddr)
5879 1.4 christos p_vaddr = segment->p_vaddr;
5880 1.4 christos
5881 1.4 christos /* Set e_type to ET_EXEC if the lowest p_vaddr in PT_LOAD
5882 1.4 christos segments is non-zero. */
5883 1.4 christos if (p_vaddr)
5884 1.4 christos i_ehdrp->e_type = ET_EXEC;
5885 1.1 christos }
5886 1.3 christos
5887 1.1 christos /* Write out the program headers. */
5888 1.1 christos alloc = elf_program_header_size (abfd) / bed->s->sizeof_phdr;
5889 1.1 christos if (bfd_seek (abfd, (bfd_signed_vma) bed->s->sizeof_ehdr, SEEK_SET) != 0
5890 1.1 christos || bed->s->write_out_phdrs (abfd, tdata->phdr, alloc) != 0)
5891 1.1 christos return FALSE;
5892 1.1 christos }
5893 1.1 christos
5894 1.1 christos return TRUE;
5895 1.1 christos }
5896 1.1 christos
5897 1.1 christos static bfd_boolean
5898 1.1 christos prep_headers (bfd *abfd)
5899 1.1 christos {
5900 1.1 christos Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form. */
5901 1.1 christos struct elf_strtab_hash *shstrtab;
5902 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5903 1.1 christos
5904 1.1 christos i_ehdrp = elf_elfheader (abfd);
5905 1.1 christos
5906 1.1 christos shstrtab = _bfd_elf_strtab_init ();
5907 1.1 christos if (shstrtab == NULL)
5908 1.1 christos return FALSE;
5909 1.1 christos
5910 1.1 christos elf_shstrtab (abfd) = shstrtab;
5911 1.1 christos
5912 1.1 christos i_ehdrp->e_ident[EI_MAG0] = ELFMAG0;
5913 1.1 christos i_ehdrp->e_ident[EI_MAG1] = ELFMAG1;
5914 1.1 christos i_ehdrp->e_ident[EI_MAG2] = ELFMAG2;
5915 1.1 christos i_ehdrp->e_ident[EI_MAG3] = ELFMAG3;
5916 1.1 christos
5917 1.1 christos i_ehdrp->e_ident[EI_CLASS] = bed->s->elfclass;
5918 1.1 christos i_ehdrp->e_ident[EI_DATA] =
5919 1.1 christos bfd_big_endian (abfd) ? ELFDATA2MSB : ELFDATA2LSB;
5920 1.1 christos i_ehdrp->e_ident[EI_VERSION] = bed->s->ev_current;
5921 1.1 christos
5922 1.1 christos if ((abfd->flags & DYNAMIC) != 0)
5923 1.1 christos i_ehdrp->e_type = ET_DYN;
5924 1.1 christos else if ((abfd->flags & EXEC_P) != 0)
5925 1.1 christos i_ehdrp->e_type = ET_EXEC;
5926 1.1 christos else if (bfd_get_format (abfd) == bfd_core)
5927 1.1 christos i_ehdrp->e_type = ET_CORE;
5928 1.1 christos else
5929 1.1 christos i_ehdrp->e_type = ET_REL;
5930 1.1 christos
5931 1.1 christos switch (bfd_get_arch (abfd))
5932 1.1 christos {
5933 1.1 christos case bfd_arch_unknown:
5934 1.1 christos i_ehdrp->e_machine = EM_NONE;
5935 1.1 christos break;
5936 1.1 christos
5937 1.1 christos /* There used to be a long list of cases here, each one setting
5938 1.1 christos e_machine to the same EM_* macro #defined as ELF_MACHINE_CODE
5939 1.1 christos in the corresponding bfd definition. To avoid duplication,
5940 1.1 christos the switch was removed. Machines that need special handling
5941 1.1 christos can generally do it in elf_backend_final_write_processing(),
5942 1.1 christos unless they need the information earlier than the final write.
5943 1.1 christos Such need can generally be supplied by replacing the tests for
5944 1.1 christos e_machine with the conditions used to determine it. */
5945 1.1 christos default:
5946 1.1 christos i_ehdrp->e_machine = bed->elf_machine_code;
5947 1.1 christos }
5948 1.1 christos
5949 1.1 christos i_ehdrp->e_version = bed->s->ev_current;
5950 1.1 christos i_ehdrp->e_ehsize = bed->s->sizeof_ehdr;
5951 1.1 christos
5952 1.1 christos /* No program header, for now. */
5953 1.1 christos i_ehdrp->e_phoff = 0;
5954 1.1 christos i_ehdrp->e_phentsize = 0;
5955 1.1 christos i_ehdrp->e_phnum = 0;
5956 1.1 christos
5957 1.1 christos /* Each bfd section is section header entry. */
5958 1.1 christos i_ehdrp->e_entry = bfd_get_start_address (abfd);
5959 1.1 christos i_ehdrp->e_shentsize = bed->s->sizeof_shdr;
5960 1.1 christos
5961 1.1 christos /* If we're building an executable, we'll need a program header table. */
5962 1.1 christos if (abfd->flags & EXEC_P)
5963 1.1 christos /* It all happens later. */
5964 1.1 christos ;
5965 1.1 christos else
5966 1.1 christos {
5967 1.1 christos i_ehdrp->e_phentsize = 0;
5968 1.1 christos i_ehdrp->e_phoff = 0;
5969 1.1 christos }
5970 1.1 christos
5971 1.1 christos elf_tdata (abfd)->symtab_hdr.sh_name =
5972 1.1 christos (unsigned int) _bfd_elf_strtab_add (shstrtab, ".symtab", FALSE);
5973 1.1 christos elf_tdata (abfd)->strtab_hdr.sh_name =
5974 1.1 christos (unsigned int) _bfd_elf_strtab_add (shstrtab, ".strtab", FALSE);
5975 1.1 christos elf_tdata (abfd)->shstrtab_hdr.sh_name =
5976 1.5 christos (unsigned int) _bfd_elf_strtab_add (shstrtab, ".shstrtab", FALSE);
5977 1.1 christos if (elf_tdata (abfd)->symtab_hdr.sh_name == (unsigned int) -1
5978 1.1 christos || elf_tdata (abfd)->strtab_hdr.sh_name == (unsigned int) -1
5979 1.1 christos || elf_tdata (abfd)->shstrtab_hdr.sh_name == (unsigned int) -1)
5980 1.1 christos return FALSE;
5981 1.1 christos
5982 1.1 christos return TRUE;
5983 1.1 christos }
5984 1.5 christos
5985 1.1 christos /* Assign file positions for all the reloc sections which are not part
5986 1.6 christos of the loadable file image, and the file position of section headers. */
5987 1.6 christos
5988 1.1 christos static bfd_boolean
5989 1.1 christos _bfd_elf_assign_file_positions_for_non_load (bfd *abfd)
5990 1.6 christos {
5991 1.6 christos file_ptr off;
5992 1.5 christos Elf_Internal_Shdr **shdrpp, **end_shdrpp;
5993 1.5 christos Elf_Internal_Shdr *shdrp;
5994 1.1 christos Elf_Internal_Ehdr *i_ehdrp;
5995 1.3 christos const struct elf_backend_data *bed;
5996 1.1 christos
5997 1.6 christos off = elf_next_file_pos (abfd);
5998 1.6 christos
5999 1.6 christos shdrpp = elf_elfsections (abfd);
6000 1.1 christos end_shdrpp = shdrpp + elf_numsections (abfd);
6001 1.6 christos for (shdrpp++; shdrpp < end_shdrpp; shdrpp++)
6002 1.6 christos {
6003 1.6 christos shdrp = *shdrpp;
6004 1.6 christos if (shdrp->sh_offset == -1)
6005 1.6 christos {
6006 1.6 christos asection *sec = shdrp->bfd_section;
6007 1.6 christos bfd_boolean is_rel = (shdrp->sh_type == SHT_REL
6008 1.6 christos || shdrp->sh_type == SHT_RELA);
6009 1.6 christos if (is_rel
6010 1.6 christos || (sec != NULL && (sec->flags & SEC_ELF_COMPRESS)))
6011 1.6 christos {
6012 1.6 christos if (!is_rel)
6013 1.6 christos {
6014 1.6 christos const char *name = sec->name;
6015 1.6 christos struct bfd_elf_section_data *d;
6016 1.6 christos
6017 1.6 christos /* Compress DWARF debug sections. */
6018 1.6 christos if (!bfd_compress_section (abfd, sec,
6019 1.1 christos shdrp->contents))
6020 1.6 christos return FALSE;
6021 1.6 christos
6022 1.6 christos if (sec->compress_status == COMPRESS_SECTION_DONE
6023 1.6 christos && (abfd->flags & BFD_COMPRESS_GABI) == 0)
6024 1.6 christos {
6025 1.6 christos /* If section is compressed with zlib-gnu, convert
6026 1.6 christos section name from .debug_* to .zdebug_*. */
6027 1.6 christos char *new_name
6028 1.6 christos = convert_debug_to_zdebug (abfd, name);
6029 1.6 christos if (new_name == NULL)
6030 1.6 christos return FALSE;
6031 1.6 christos name = new_name;
6032 1.6 christos }
6033 1.6 christos /* Add setion name to section name section. */
6034 1.6 christos if (shdrp->sh_name != (unsigned int) -1)
6035 1.6 christos abort ();
6036 1.6 christos shdrp->sh_name
6037 1.6 christos = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
6038 1.6 christos name, FALSE);
6039 1.6 christos d = elf_section_data (sec);
6040 1.6 christos
6041 1.6 christos /* Add reloc setion name to section name section. */
6042 1.6 christos if (d->rel.hdr
6043 1.6 christos && !_bfd_elf_set_reloc_sh_name (abfd,
6044 1.6 christos d->rel.hdr,
6045 1.6 christos name, FALSE))
6046 1.6 christos return FALSE;
6047 1.6 christos if (d->rela.hdr
6048 1.8 christos && !_bfd_elf_set_reloc_sh_name (abfd,
6049 1.6 christos d->rela.hdr,
6050 1.6 christos name, TRUE))
6051 1.6 christos return FALSE;
6052 1.6 christos
6053 1.6 christos /* Update section size and contents. */
6054 1.6 christos shdrp->sh_size = sec->size;
6055 1.6 christos shdrp->contents = sec->contents;
6056 1.6 christos shdrp->bfd_section->contents = NULL;
6057 1.6 christos }
6058 1.6 christos off = _bfd_elf_assign_file_position_for_section (shdrp,
6059 1.6 christos off,
6060 1.6 christos TRUE);
6061 1.1 christos }
6062 1.1 christos }
6063 1.6 christos }
6064 1.6 christos
6065 1.6 christos /* Place section name section after DWARF debug sections have been
6066 1.6 christos compressed. */
6067 1.6 christos _bfd_elf_strtab_finalize (elf_shstrtab (abfd));
6068 1.6 christos shdrp = &elf_tdata (abfd)->shstrtab_hdr;
6069 1.6 christos shdrp->sh_size = _bfd_elf_strtab_size (elf_shstrtab (abfd));
6070 1.6 christos off = _bfd_elf_assign_file_position_for_section (shdrp, off, TRUE);
6071 1.5 christos
6072 1.5 christos /* Place the section headers. */
6073 1.5 christos i_ehdrp = elf_elfheader (abfd);
6074 1.5 christos bed = get_elf_backend_data (abfd);
6075 1.5 christos off = align_file_position (off, 1 << bed->s->log_file_align);
6076 1.3 christos i_ehdrp->e_shoff = off;
6077 1.6 christos off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize;
6078 1.6 christos elf_next_file_pos (abfd) = off;
6079 1.1 christos
6080 1.1 christos return TRUE;
6081 1.1 christos }
6082 1.1 christos
6083 1.1 christos bfd_boolean
6084 1.1 christos _bfd_elf_write_object_contents (bfd *abfd)
6085 1.1 christos {
6086 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
6087 1.1 christos Elf_Internal_Shdr **i_shdrp;
6088 1.3 christos bfd_boolean failed;
6089 1.1 christos unsigned int count, num_sec;
6090 1.1 christos struct elf_obj_tdata *t;
6091 1.1 christos
6092 1.1 christos if (! abfd->output_has_begun
6093 1.1 christos && ! _bfd_elf_compute_section_file_positions (abfd, NULL))
6094 1.1 christos return FALSE;
6095 1.1 christos
6096 1.1 christos i_shdrp = elf_elfsections (abfd);
6097 1.1 christos
6098 1.1 christos failed = FALSE;
6099 1.1 christos bfd_map_over_sections (abfd, bed->s->write_relocs, &failed);
6100 1.1 christos if (failed)
6101 1.6 christos return FALSE;
6102 1.6 christos
6103 1.1 christos if (!_bfd_elf_assign_file_positions_for_non_load (abfd))
6104 1.1 christos return FALSE;
6105 1.1 christos
6106 1.1 christos /* After writing the headers, we need to write the sections too... */
6107 1.1 christos num_sec = elf_numsections (abfd);
6108 1.6 christos for (count = 1; count < num_sec; count++)
6109 1.6 christos {
6110 1.6 christos i_shdrp[count]->sh_name
6111 1.1 christos = _bfd_elf_strtab_offset (elf_shstrtab (abfd),
6112 1.1 christos i_shdrp[count]->sh_name);
6113 1.1 christos if (bed->elf_backend_section_processing)
6114 1.1 christos (*bed->elf_backend_section_processing) (abfd, i_shdrp[count]);
6115 1.1 christos if (i_shdrp[count]->contents)
6116 1.1 christos {
6117 1.1 christos bfd_size_type amt = i_shdrp[count]->sh_size;
6118 1.1 christos
6119 1.1 christos if (bfd_seek (abfd, i_shdrp[count]->sh_offset, SEEK_SET) != 0
6120 1.1 christos || bfd_bwrite (i_shdrp[count]->contents, amt, abfd) != amt)
6121 1.1 christos return FALSE;
6122 1.1 christos }
6123 1.1 christos }
6124 1.3 christos
6125 1.1 christos /* Write out the section header names. */
6126 1.3 christos t = elf_tdata (abfd);
6127 1.1 christos if (elf_shstrtab (abfd) != NULL
6128 1.1 christos && (bfd_seek (abfd, t->shstrtab_hdr.sh_offset, SEEK_SET) != 0
6129 1.1 christos || !_bfd_elf_strtab_emit (abfd, elf_shstrtab (abfd))))
6130 1.1 christos return FALSE;
6131 1.3 christos
6132 1.1 christos if (bed->elf_backend_final_write_processing)
6133 1.1 christos (*bed->elf_backend_final_write_processing) (abfd, elf_linker (abfd));
6134 1.1 christos
6135 1.1 christos if (!bed->s->write_shdrs_and_ehdr (abfd))
6136 1.1 christos return FALSE;
6137 1.3 christos
6138 1.3 christos /* This is last since write_shdrs_and_ehdr can touch i_shdrp[0]. */
6139 1.1 christos if (t->o->build_id.after_write_object_contents != NULL)
6140 1.1 christos return (*t->o->build_id.after_write_object_contents) (abfd);
6141 1.1 christos
6142 1.1 christos return TRUE;
6143 1.1 christos }
6144 1.1 christos
6145 1.1 christos bfd_boolean
6146 1.1 christos _bfd_elf_write_corefile_contents (bfd *abfd)
6147 1.1 christos {
6148 1.1 christos /* Hopefully this can be done just like an object file. */
6149 1.1 christos return _bfd_elf_write_object_contents (abfd);
6150 1.1 christos }
6151 1.1 christos
6152 1.1 christos /* Given a section, search the header to find them. */
6153 1.1 christos
6154 1.1 christos unsigned int
6155 1.1 christos _bfd_elf_section_from_bfd_section (bfd *abfd, struct bfd_section *asect)
6156 1.1 christos {
6157 1.1 christos const struct elf_backend_data *bed;
6158 1.1 christos unsigned int sec_index;
6159 1.1 christos
6160 1.1 christos if (elf_section_data (asect) != NULL
6161 1.1 christos && elf_section_data (asect)->this_idx != 0)
6162 1.1 christos return elf_section_data (asect)->this_idx;
6163 1.1 christos
6164 1.1 christos if (bfd_is_abs_section (asect))
6165 1.1 christos sec_index = SHN_ABS;
6166 1.1 christos else if (bfd_is_com_section (asect))
6167 1.1 christos sec_index = SHN_COMMON;
6168 1.1 christos else if (bfd_is_und_section (asect))
6169 1.1 christos sec_index = SHN_UNDEF;
6170 1.1 christos else
6171 1.1 christos sec_index = SHN_BAD;
6172 1.1 christos
6173 1.1 christos bed = get_elf_backend_data (abfd);
6174 1.1 christos if (bed->elf_backend_section_from_bfd_section)
6175 1.1 christos {
6176 1.1 christos int retval = sec_index;
6177 1.1 christos
6178 1.1 christos if ((*bed->elf_backend_section_from_bfd_section) (abfd, asect, &retval))
6179 1.1 christos return retval;
6180 1.1 christos }
6181 1.1 christos
6182 1.1 christos if (sec_index == SHN_BAD)
6183 1.1 christos bfd_set_error (bfd_error_nonrepresentable_section);
6184 1.1 christos
6185 1.1 christos return sec_index;
6186 1.1 christos }
6187 1.1 christos
6188 1.1 christos /* Given a BFD symbol, return the index in the ELF symbol table, or -1
6189 1.1 christos on error. */
6190 1.1 christos
6191 1.1 christos int
6192 1.1 christos _bfd_elf_symbol_from_bfd_symbol (bfd *abfd, asymbol **asym_ptr_ptr)
6193 1.1 christos {
6194 1.1 christos asymbol *asym_ptr = *asym_ptr_ptr;
6195 1.1 christos int idx;
6196 1.1 christos flagword flags = asym_ptr->flags;
6197 1.1 christos
6198 1.1 christos /* When gas creates relocations against local labels, it creates its
6199 1.1 christos own symbol for the section, but does put the symbol into the
6200 1.1 christos symbol chain, so udata is 0. When the linker is generating
6201 1.1 christos relocatable output, this section symbol may be for one of the
6202 1.1 christos input sections rather than the output section. */
6203 1.1 christos if (asym_ptr->udata.i == 0
6204 1.1 christos && (flags & BSF_SECTION_SYM)
6205 1.1 christos && asym_ptr->section)
6206 1.1 christos {
6207 1.1 christos asection *sec;
6208 1.1 christos int indx;
6209 1.1 christos
6210 1.1 christos sec = asym_ptr->section;
6211 1.1 christos if (sec->owner != abfd && sec->output_section != NULL)
6212 1.1 christos sec = sec->output_section;
6213 1.1 christos if (sec->owner == abfd
6214 1.1 christos && (indx = sec->index) < elf_num_section_syms (abfd)
6215 1.1 christos && elf_section_syms (abfd)[indx] != NULL)
6216 1.1 christos asym_ptr->udata.i = elf_section_syms (abfd)[indx]->udata.i;
6217 1.1 christos }
6218 1.1 christos
6219 1.1 christos idx = asym_ptr->udata.i;
6220 1.1 christos
6221 1.1 christos if (idx == 0)
6222 1.1 christos {
6223 1.1 christos /* This case can occur when using --strip-symbol on a symbol
6224 1.1 christos which is used in a relocation entry. */
6225 1.1 christos (*_bfd_error_handler)
6226 1.1 christos (_("%B: symbol `%s' required but not present"),
6227 1.1 christos abfd, bfd_asymbol_name (asym_ptr));
6228 1.1 christos bfd_set_error (bfd_error_no_symbols);
6229 1.1 christos return -1;
6230 1.1 christos }
6231 1.1 christos
6232 1.1 christos #if DEBUG & 4
6233 1.1 christos {
6234 1.1 christos fprintf (stderr,
6235 1.1 christos "elf_symbol_from_bfd_symbol 0x%.8lx, name = %s, sym num = %d, flags = 0x%.8lx\n",
6236 1.1 christos (long) asym_ptr, asym_ptr->name, idx, (long) flags);
6237 1.1 christos fflush (stderr);
6238 1.1 christos }
6239 1.1 christos #endif
6240 1.1 christos
6241 1.1 christos return idx;
6242 1.1 christos }
6243 1.1 christos
6244 1.1 christos /* Rewrite program header information. */
6245 1.1 christos
6246 1.1 christos static bfd_boolean
6247 1.1 christos rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
6248 1.1 christos {
6249 1.1 christos Elf_Internal_Ehdr *iehdr;
6250 1.1 christos struct elf_segment_map *map;
6251 1.1 christos struct elf_segment_map *map_first;
6252 1.1 christos struct elf_segment_map **pointer_to_map;
6253 1.1 christos Elf_Internal_Phdr *segment;
6254 1.1 christos asection *section;
6255 1.1 christos unsigned int i;
6256 1.1 christos unsigned int num_segments;
6257 1.1 christos bfd_boolean phdr_included = FALSE;
6258 1.1 christos bfd_boolean p_paddr_valid;
6259 1.1 christos bfd_vma maxpagesize;
6260 1.1 christos struct elf_segment_map *phdr_adjust_seg = NULL;
6261 1.1 christos unsigned int phdr_adjust_num = 0;
6262 1.1 christos const struct elf_backend_data *bed;
6263 1.1 christos
6264 1.1 christos bed = get_elf_backend_data (ibfd);
6265 1.1 christos iehdr = elf_elfheader (ibfd);
6266 1.1 christos
6267 1.1 christos map_first = NULL;
6268 1.1 christos pointer_to_map = &map_first;
6269 1.1 christos
6270 1.1 christos num_segments = elf_elfheader (ibfd)->e_phnum;
6271 1.1 christos maxpagesize = get_elf_backend_data (obfd)->maxpagesize;
6272 1.1 christos
6273 1.1 christos /* Returns the end address of the segment + 1. */
6274 1.1 christos #define SEGMENT_END(segment, start) \
6275 1.1 christos (start + (segment->p_memsz > segment->p_filesz \
6276 1.1 christos ? segment->p_memsz : segment->p_filesz))
6277 1.1 christos
6278 1.1 christos #define SECTION_SIZE(section, segment) \
6279 1.1 christos (((section->flags & (SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) \
6280 1.1 christos != SEC_THREAD_LOCAL || segment->p_type == PT_TLS) \
6281 1.1 christos ? section->size : 0)
6282 1.1 christos
6283 1.1 christos /* Returns TRUE if the given section is contained within
6284 1.1 christos the given segment. VMA addresses are compared. */
6285 1.1 christos #define IS_CONTAINED_BY_VMA(section, segment) \
6286 1.1 christos (section->vma >= segment->p_vaddr \
6287 1.1 christos && (section->vma + SECTION_SIZE (section, segment) \
6288 1.1 christos <= (SEGMENT_END (segment, segment->p_vaddr))))
6289 1.1 christos
6290 1.1 christos /* Returns TRUE if the given section is contained within
6291 1.1 christos the given segment. LMA addresses are compared. */
6292 1.1 christos #define IS_CONTAINED_BY_LMA(section, segment, base) \
6293 1.1 christos (section->lma >= base \
6294 1.1 christos && (section->lma + SECTION_SIZE (section, segment) \
6295 1.1 christos <= SEGMENT_END (segment, base)))
6296 1.1 christos
6297 1.1 christos /* Handle PT_NOTE segment. */
6298 1.1 christos #define IS_NOTE(p, s) \
6299 1.1 christos (p->p_type == PT_NOTE \
6300 1.1 christos && elf_section_type (s) == SHT_NOTE \
6301 1.1 christos && (bfd_vma) s->filepos >= p->p_offset \
6302 1.1 christos && ((bfd_vma) s->filepos + s->size \
6303 1.1 christos <= p->p_offset + p->p_filesz))
6304 1.1 christos
6305 1.1 christos /* Special case: corefile "NOTE" section containing regs, prpsinfo
6306 1.1 christos etc. */
6307 1.1 christos #define IS_COREFILE_NOTE(p, s) \
6308 1.1 christos (IS_NOTE (p, s) \
6309 1.1 christos && bfd_get_format (ibfd) == bfd_core \
6310 1.1 christos && s->vma == 0 \
6311 1.1 christos && s->lma == 0)
6312 1.1 christos
6313 1.1 christos /* The complicated case when p_vaddr is 0 is to handle the Solaris
6314 1.1 christos linker, which generates a PT_INTERP section with p_vaddr and
6315 1.1 christos p_memsz set to 0. */
6316 1.1 christos #define IS_SOLARIS_PT_INTERP(p, s) \
6317 1.1 christos (p->p_vaddr == 0 \
6318 1.1 christos && p->p_paddr == 0 \
6319 1.1 christos && p->p_memsz == 0 \
6320 1.1 christos && p->p_filesz > 0 \
6321 1.1 christos && (s->flags & SEC_HAS_CONTENTS) != 0 \
6322 1.1 christos && s->size > 0 \
6323 1.1 christos && (bfd_vma) s->filepos >= p->p_offset \
6324 1.1 christos && ((bfd_vma) s->filepos + s->size \
6325 1.1 christos <= p->p_offset + p->p_filesz))
6326 1.1 christos
6327 1.1 christos /* Decide if the given section should be included in the given segment.
6328 1.1 christos A section will be included if:
6329 1.1 christos 1. It is within the address space of the segment -- we use the LMA
6330 1.3 christos if that is set for the segment and the VMA otherwise,
6331 1.1 christos 2. It is an allocated section or a NOTE section in a PT_NOTE
6332 1.1 christos segment.
6333 1.1 christos 3. There is an output section associated with it,
6334 1.1 christos 4. The section has not already been allocated to a previous segment.
6335 1.1 christos 5. PT_GNU_STACK segments do not include any sections.
6336 1.1 christos 6. PT_TLS segment includes only SHF_TLS sections.
6337 1.1 christos 7. SHF_TLS sections are only in PT_TLS or PT_LOAD segments.
6338 1.1 christos 8. PT_DYNAMIC should not contain empty sections at the beginning
6339 1.1 christos (with the possible exception of .dynamic). */
6340 1.1 christos #define IS_SECTION_IN_INPUT_SEGMENT(section, segment, bed) \
6341 1.1 christos ((((segment->p_paddr \
6342 1.1 christos ? IS_CONTAINED_BY_LMA (section, segment, segment->p_paddr) \
6343 1.1 christos : IS_CONTAINED_BY_VMA (section, segment)) \
6344 1.1 christos && (section->flags & SEC_ALLOC) != 0) \
6345 1.1 christos || IS_NOTE (segment, section)) \
6346 1.1 christos && segment->p_type != PT_GNU_STACK \
6347 1.1 christos && (segment->p_type != PT_TLS \
6348 1.1 christos || (section->flags & SEC_THREAD_LOCAL)) \
6349 1.1 christos && (segment->p_type == PT_LOAD \
6350 1.1 christos || segment->p_type == PT_TLS \
6351 1.1 christos || (section->flags & SEC_THREAD_LOCAL) == 0) \
6352 1.1 christos && (segment->p_type != PT_DYNAMIC \
6353 1.1 christos || SECTION_SIZE (section, segment) > 0 \
6354 1.1 christos || (segment->p_paddr \
6355 1.1 christos ? segment->p_paddr != section->lma \
6356 1.1 christos : segment->p_vaddr != section->vma) \
6357 1.1 christos || (strcmp (bfd_get_section_name (ibfd, section), ".dynamic") \
6358 1.1 christos == 0)) \
6359 1.1 christos && !section->segment_mark)
6360 1.1 christos
6361 1.1 christos /* If the output section of a section in the input segment is NULL,
6362 1.1 christos it is removed from the corresponding output segment. */
6363 1.1 christos #define INCLUDE_SECTION_IN_SEGMENT(section, segment, bed) \
6364 1.1 christos (IS_SECTION_IN_INPUT_SEGMENT (section, segment, bed) \
6365 1.1 christos && section->output_section != NULL)
6366 1.1 christos
6367 1.1 christos /* Returns TRUE iff seg1 starts after the end of seg2. */
6368 1.1 christos #define SEGMENT_AFTER_SEGMENT(seg1, seg2, field) \
6369 1.1 christos (seg1->field >= SEGMENT_END (seg2, seg2->field))
6370 1.1 christos
6371 1.1 christos /* Returns TRUE iff seg1 and seg2 overlap. Segments overlap iff both
6372 1.1 christos their VMA address ranges and their LMA address ranges overlap.
6373 1.1 christos It is possible to have overlapping VMA ranges without overlapping LMA
6374 1.1 christos ranges. RedBoot images for example can have both .data and .bss mapped
6375 1.1 christos to the same VMA range, but with the .data section mapped to a different
6376 1.1 christos LMA. */
6377 1.1 christos #define SEGMENT_OVERLAPS(seg1, seg2) \
6378 1.1 christos ( !(SEGMENT_AFTER_SEGMENT (seg1, seg2, p_vaddr) \
6379 1.1 christos || SEGMENT_AFTER_SEGMENT (seg2, seg1, p_vaddr)) \
6380 1.1 christos && !(SEGMENT_AFTER_SEGMENT (seg1, seg2, p_paddr) \
6381 1.1 christos || SEGMENT_AFTER_SEGMENT (seg2, seg1, p_paddr)))
6382 1.1 christos
6383 1.1 christos /* Initialise the segment mark field. */
6384 1.1 christos for (section = ibfd->sections; section != NULL; section = section->next)
6385 1.1 christos section->segment_mark = FALSE;
6386 1.1 christos
6387 1.1 christos /* The Solaris linker creates program headers in which all the
6388 1.1 christos p_paddr fields are zero. When we try to objcopy or strip such a
6389 1.1 christos file, we get confused. Check for this case, and if we find it
6390 1.1 christos don't set the p_paddr_valid fields. */
6391 1.1 christos p_paddr_valid = FALSE;
6392 1.1 christos for (i = 0, segment = elf_tdata (ibfd)->phdr;
6393 1.1 christos i < num_segments;
6394 1.1 christos i++, segment++)
6395 1.1 christos if (segment->p_paddr != 0)
6396 1.1 christos {
6397 1.1 christos p_paddr_valid = TRUE;
6398 1.1 christos break;
6399 1.1 christos }
6400 1.1 christos
6401 1.1 christos /* Scan through the segments specified in the program header
6402 1.1 christos of the input BFD. For this first scan we look for overlaps
6403 1.1 christos in the loadable segments. These can be created by weird
6404 1.1 christos parameters to objcopy. Also, fix some solaris weirdness. */
6405 1.1 christos for (i = 0, segment = elf_tdata (ibfd)->phdr;
6406 1.1 christos i < num_segments;
6407 1.1 christos i++, segment++)
6408 1.1 christos {
6409 1.1 christos unsigned int j;
6410 1.1 christos Elf_Internal_Phdr *segment2;
6411 1.1 christos
6412 1.1 christos if (segment->p_type == PT_INTERP)
6413 1.1 christos for (section = ibfd->sections; section; section = section->next)
6414 1.1 christos if (IS_SOLARIS_PT_INTERP (segment, section))
6415 1.1 christos {
6416 1.1 christos /* Mininal change so that the normal section to segment
6417 1.1 christos assignment code will work. */
6418 1.1 christos segment->p_vaddr = section->vma;
6419 1.1 christos break;
6420 1.1 christos }
6421 1.1 christos
6422 1.1 christos if (segment->p_type != PT_LOAD)
6423 1.1 christos {
6424 1.1 christos /* Remove PT_GNU_RELRO segment. */
6425 1.1 christos if (segment->p_type == PT_GNU_RELRO)
6426 1.1 christos segment->p_type = PT_NULL;
6427 1.1 christos continue;
6428 1.1 christos }
6429 1.1 christos
6430 1.1 christos /* Determine if this segment overlaps any previous segments. */
6431 1.1 christos for (j = 0, segment2 = elf_tdata (ibfd)->phdr; j < i; j++, segment2++)
6432 1.1 christos {
6433 1.1 christos bfd_signed_vma extra_length;
6434 1.1 christos
6435 1.1 christos if (segment2->p_type != PT_LOAD
6436 1.1 christos || !SEGMENT_OVERLAPS (segment, segment2))
6437 1.1 christos continue;
6438 1.1 christos
6439 1.1 christos /* Merge the two segments together. */
6440 1.1 christos if (segment2->p_vaddr < segment->p_vaddr)
6441 1.1 christos {
6442 1.1 christos /* Extend SEGMENT2 to include SEGMENT and then delete
6443 1.1 christos SEGMENT. */
6444 1.1 christos extra_length = (SEGMENT_END (segment, segment->p_vaddr)
6445 1.1 christos - SEGMENT_END (segment2, segment2->p_vaddr));
6446 1.1 christos
6447 1.1 christos if (extra_length > 0)
6448 1.1 christos {
6449 1.1 christos segment2->p_memsz += extra_length;
6450 1.1 christos segment2->p_filesz += extra_length;
6451 1.1 christos }
6452 1.1 christos
6453 1.1 christos segment->p_type = PT_NULL;
6454 1.1 christos
6455 1.1 christos /* Since we have deleted P we must restart the outer loop. */
6456 1.1 christos i = 0;
6457 1.1 christos segment = elf_tdata (ibfd)->phdr;
6458 1.1 christos break;
6459 1.1 christos }
6460 1.1 christos else
6461 1.1 christos {
6462 1.1 christos /* Extend SEGMENT to include SEGMENT2 and then delete
6463 1.1 christos SEGMENT2. */
6464 1.1 christos extra_length = (SEGMENT_END (segment2, segment2->p_vaddr)
6465 1.1 christos - SEGMENT_END (segment, segment->p_vaddr));
6466 1.1 christos
6467 1.1 christos if (extra_length > 0)
6468 1.1 christos {
6469 1.1 christos segment->p_memsz += extra_length;
6470 1.1 christos segment->p_filesz += extra_length;
6471 1.1 christos }
6472 1.1 christos
6473 1.1 christos segment2->p_type = PT_NULL;
6474 1.1 christos }
6475 1.1 christos }
6476 1.1 christos }
6477 1.1 christos
6478 1.1 christos /* The second scan attempts to assign sections to segments. */
6479 1.1 christos for (i = 0, segment = elf_tdata (ibfd)->phdr;
6480 1.1 christos i < num_segments;
6481 1.1 christos i++, segment++)
6482 1.1 christos {
6483 1.1 christos unsigned int section_count;
6484 1.1 christos asection **sections;
6485 1.1 christos asection *output_section;
6486 1.1 christos unsigned int isec;
6487 1.1 christos bfd_vma matching_lma;
6488 1.1 christos bfd_vma suggested_lma;
6489 1.1 christos unsigned int j;
6490 1.1 christos bfd_size_type amt;
6491 1.1 christos asection *first_section;
6492 1.1 christos bfd_boolean first_matching_lma;
6493 1.1 christos bfd_boolean first_suggested_lma;
6494 1.1 christos
6495 1.1 christos if (segment->p_type == PT_NULL)
6496 1.1 christos continue;
6497 1.1 christos
6498 1.1 christos first_section = NULL;
6499 1.1 christos /* Compute how many sections might be placed into this segment. */
6500 1.1 christos for (section = ibfd->sections, section_count = 0;
6501 1.1 christos section != NULL;
6502 1.1 christos section = section->next)
6503 1.1 christos {
6504 1.1 christos /* Find the first section in the input segment, which may be
6505 1.1 christos removed from the corresponding output segment. */
6506 1.1 christos if (IS_SECTION_IN_INPUT_SEGMENT (section, segment, bed))
6507 1.1 christos {
6508 1.1 christos if (first_section == NULL)
6509 1.1 christos first_section = section;
6510 1.1 christos if (section->output_section != NULL)
6511 1.1 christos ++section_count;
6512 1.1 christos }
6513 1.1 christos }
6514 1.1 christos
6515 1.1 christos /* Allocate a segment map big enough to contain
6516 1.1 christos all of the sections we have selected. */
6517 1.1 christos amt = sizeof (struct elf_segment_map);
6518 1.1 christos amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
6519 1.1 christos map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
6520 1.1 christos if (map == NULL)
6521 1.1 christos return FALSE;
6522 1.1 christos
6523 1.1 christos /* Initialise the fields of the segment map. Default to
6524 1.1 christos using the physical address of the segment in the input BFD. */
6525 1.1 christos map->next = NULL;
6526 1.1 christos map->p_type = segment->p_type;
6527 1.1 christos map->p_flags = segment->p_flags;
6528 1.1 christos map->p_flags_valid = 1;
6529 1.1 christos
6530 1.1 christos /* If the first section in the input segment is removed, there is
6531 1.1 christos no need to preserve segment physical address in the corresponding
6532 1.1 christos output segment. */
6533 1.1 christos if (!first_section || first_section->output_section != NULL)
6534 1.1 christos {
6535 1.1 christos map->p_paddr = segment->p_paddr;
6536 1.1 christos map->p_paddr_valid = p_paddr_valid;
6537 1.1 christos }
6538 1.1 christos
6539 1.1 christos /* Determine if this segment contains the ELF file header
6540 1.1 christos and if it contains the program headers themselves. */
6541 1.1 christos map->includes_filehdr = (segment->p_offset == 0
6542 1.1 christos && segment->p_filesz >= iehdr->e_ehsize);
6543 1.1 christos map->includes_phdrs = 0;
6544 1.1 christos
6545 1.1 christos if (!phdr_included || segment->p_type != PT_LOAD)
6546 1.1 christos {
6547 1.1 christos map->includes_phdrs =
6548 1.1 christos (segment->p_offset <= (bfd_vma) iehdr->e_phoff
6549 1.1 christos && (segment->p_offset + segment->p_filesz
6550 1.1 christos >= ((bfd_vma) iehdr->e_phoff
6551 1.1 christos + iehdr->e_phnum * iehdr->e_phentsize)));
6552 1.1 christos
6553 1.1 christos if (segment->p_type == PT_LOAD && map->includes_phdrs)
6554 1.1 christos phdr_included = TRUE;
6555 1.1 christos }
6556 1.1 christos
6557 1.1 christos if (section_count == 0)
6558 1.1 christos {
6559 1.1 christos /* Special segments, such as the PT_PHDR segment, may contain
6560 1.1 christos no sections, but ordinary, loadable segments should contain
6561 1.1 christos something. They are allowed by the ELF spec however, so only
6562 1.6 christos a warning is produced. */
6563 1.6 christos if (segment->p_type == PT_LOAD)
6564 1.1 christos (*_bfd_error_handler) (_("\
6565 1.1 christos %B: warning: Empty loadable segment detected, is this intentional ?"),
6566 1.1 christos ibfd);
6567 1.1 christos
6568 1.1 christos map->count = 0;
6569 1.1 christos *pointer_to_map = map;
6570 1.1 christos pointer_to_map = &map->next;
6571 1.1 christos
6572 1.1 christos continue;
6573 1.1 christos }
6574 1.1 christos
6575 1.1 christos /* Now scan the sections in the input BFD again and attempt
6576 1.1 christos to add their corresponding output sections to the segment map.
6577 1.1 christos The problem here is how to handle an output section which has
6578 1.1 christos been moved (ie had its LMA changed). There are four possibilities:
6579 1.1 christos
6580 1.1 christos 1. None of the sections have been moved.
6581 1.1 christos In this case we can continue to use the segment LMA from the
6582 1.1 christos input BFD.
6583 1.1 christos
6584 1.1 christos 2. All of the sections have been moved by the same amount.
6585 1.1 christos In this case we can change the segment's LMA to match the LMA
6586 1.1 christos of the first section.
6587 1.1 christos
6588 1.1 christos 3. Some of the sections have been moved, others have not.
6589 1.1 christos In this case those sections which have not been moved can be
6590 1.1 christos placed in the current segment which will have to have its size,
6591 1.1 christos and possibly its LMA changed, and a new segment or segments will
6592 1.1 christos have to be created to contain the other sections.
6593 1.1 christos
6594 1.1 christos 4. The sections have been moved, but not by the same amount.
6595 1.1 christos In this case we can change the segment's LMA to match the LMA
6596 1.1 christos of the first section and we will have to create a new segment
6597 1.1 christos or segments to contain the other sections.
6598 1.1 christos
6599 1.1 christos In order to save time, we allocate an array to hold the section
6600 1.1 christos pointers that we are interested in. As these sections get assigned
6601 1.1 christos to a segment, they are removed from this array. */
6602 1.1 christos
6603 1.1 christos sections = (asection **) bfd_malloc2 (section_count, sizeof (asection *));
6604 1.1 christos if (sections == NULL)
6605 1.1 christos return FALSE;
6606 1.1 christos
6607 1.1 christos /* Step One: Scan for segment vs section LMA conflicts.
6608 1.1 christos Also add the sections to the section array allocated above.
6609 1.1 christos Also add the sections to the current segment. In the common
6610 1.1 christos case, where the sections have not been moved, this means that
6611 1.1 christos we have completely filled the segment, and there is nothing
6612 1.1 christos more to do. */
6613 1.1 christos isec = 0;
6614 1.1 christos matching_lma = 0;
6615 1.1 christos suggested_lma = 0;
6616 1.1 christos first_matching_lma = TRUE;
6617 1.8 christos first_suggested_lma = TRUE;
6618 1.1 christos
6619 1.1 christos for (section = first_section, j = 0;
6620 1.1 christos section != NULL;
6621 1.1 christos section = section->next)
6622 1.1 christos {
6623 1.1 christos if (INCLUDE_SECTION_IN_SEGMENT (section, segment, bed))
6624 1.1 christos {
6625 1.1 christos output_section = section->output_section;
6626 1.1 christos
6627 1.1 christos sections[j++] = section;
6628 1.1 christos
6629 1.1 christos /* The Solaris native linker always sets p_paddr to 0.
6630 1.1 christos We try to catch that case here, and set it to the
6631 1.1 christos correct value. Note - some backends require that
6632 1.1 christos p_paddr be left as zero. */
6633 1.1 christos if (!p_paddr_valid
6634 1.1 christos && segment->p_vaddr != 0
6635 1.1 christos && !bed->want_p_paddr_set_to_zero
6636 1.1 christos && isec == 0
6637 1.1 christos && output_section->lma != 0
6638 1.1 christos && output_section->vma == (segment->p_vaddr
6639 1.1 christos + (map->includes_filehdr
6640 1.1 christos ? iehdr->e_ehsize
6641 1.1 christos : 0)
6642 1.1 christos + (map->includes_phdrs
6643 1.1 christos ? (iehdr->e_phnum
6644 1.1 christos * iehdr->e_phentsize)
6645 1.1 christos : 0)))
6646 1.1 christos map->p_paddr = segment->p_vaddr;
6647 1.1 christos
6648 1.1 christos /* Match up the physical address of the segment with the
6649 1.1 christos LMA address of the output section. */
6650 1.1 christos if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr)
6651 1.1 christos || IS_COREFILE_NOTE (segment, section)
6652 1.1 christos || (bed->want_p_paddr_set_to_zero
6653 1.1 christos && IS_CONTAINED_BY_VMA (output_section, segment)))
6654 1.1 christos {
6655 1.1 christos if (first_matching_lma || output_section->lma < matching_lma)
6656 1.1 christos {
6657 1.1 christos matching_lma = output_section->lma;
6658 1.1 christos first_matching_lma = FALSE;
6659 1.1 christos }
6660 1.1 christos
6661 1.1 christos /* We assume that if the section fits within the segment
6662 1.1 christos then it does not overlap any other section within that
6663 1.1 christos segment. */
6664 1.1 christos map->sections[isec++] = output_section;
6665 1.1 christos }
6666 1.1 christos else if (first_suggested_lma)
6667 1.1 christos {
6668 1.1 christos suggested_lma = output_section->lma;
6669 1.1 christos first_suggested_lma = FALSE;
6670 1.1 christos }
6671 1.1 christos
6672 1.1 christos if (j == section_count)
6673 1.1 christos break;
6674 1.1 christos }
6675 1.1 christos }
6676 1.1 christos
6677 1.1 christos BFD_ASSERT (j == section_count);
6678 1.1 christos
6679 1.1 christos /* Step Two: Adjust the physical address of the current segment,
6680 1.1 christos if necessary. */
6681 1.1 christos if (isec == section_count)
6682 1.1 christos {
6683 1.1 christos /* All of the sections fitted within the segment as currently
6684 1.1 christos specified. This is the default case. Add the segment to
6685 1.1 christos the list of built segments and carry on to process the next
6686 1.1 christos program header in the input BFD. */
6687 1.1 christos map->count = section_count;
6688 1.1 christos *pointer_to_map = map;
6689 1.1 christos pointer_to_map = &map->next;
6690 1.1 christos
6691 1.1 christos if (p_paddr_valid
6692 1.1 christos && !bed->want_p_paddr_set_to_zero
6693 1.1 christos && matching_lma != map->p_paddr
6694 1.1 christos && !map->includes_filehdr
6695 1.1 christos && !map->includes_phdrs)
6696 1.1 christos /* There is some padding before the first section in the
6697 1.1 christos segment. So, we must account for that in the output
6698 1.1 christos segment's vma. */
6699 1.1 christos map->p_vaddr_offset = matching_lma - map->p_paddr;
6700 1.1 christos
6701 1.1 christos free (sections);
6702 1.1 christos continue;
6703 1.1 christos }
6704 1.1 christos else
6705 1.1 christos {
6706 1.1 christos if (!first_matching_lma)
6707 1.1 christos {
6708 1.1 christos /* At least one section fits inside the current segment.
6709 1.1 christos Keep it, but modify its physical address to match the
6710 1.1 christos LMA of the first section that fitted. */
6711 1.1 christos map->p_paddr = matching_lma;
6712 1.1 christos }
6713 1.1 christos else
6714 1.1 christos {
6715 1.1 christos /* None of the sections fitted inside the current segment.
6716 1.1 christos Change the current segment's physical address to match
6717 1.1 christos the LMA of the first section. */
6718 1.1 christos map->p_paddr = suggested_lma;
6719 1.1 christos }
6720 1.1 christos
6721 1.1 christos /* Offset the segment physical address from the lma
6722 1.1 christos to allow for space taken up by elf headers. */
6723 1.1 christos if (map->includes_filehdr)
6724 1.1 christos {
6725 1.1 christos if (map->p_paddr >= iehdr->e_ehsize)
6726 1.1 christos map->p_paddr -= iehdr->e_ehsize;
6727 1.1 christos else
6728 1.1 christos {
6729 1.1 christos map->includes_filehdr = FALSE;
6730 1.1 christos map->includes_phdrs = FALSE;
6731 1.1 christos }
6732 1.1 christos }
6733 1.1 christos
6734 1.1 christos if (map->includes_phdrs)
6735 1.1 christos {
6736 1.1 christos if (map->p_paddr >= iehdr->e_phnum * iehdr->e_phentsize)
6737 1.1 christos {
6738 1.1 christos map->p_paddr -= iehdr->e_phnum * iehdr->e_phentsize;
6739 1.1 christos
6740 1.1 christos /* iehdr->e_phnum is just an estimate of the number
6741 1.1 christos of program headers that we will need. Make a note
6742 1.1 christos here of the number we used and the segment we chose
6743 1.1 christos to hold these headers, so that we can adjust the
6744 1.1 christos offset when we know the correct value. */
6745 1.1 christos phdr_adjust_num = iehdr->e_phnum;
6746 1.1 christos phdr_adjust_seg = map;
6747 1.1 christos }
6748 1.1 christos else
6749 1.1 christos map->includes_phdrs = FALSE;
6750 1.1 christos }
6751 1.1 christos }
6752 1.1 christos
6753 1.1 christos /* Step Three: Loop over the sections again, this time assigning
6754 1.1 christos those that fit to the current segment and removing them from the
6755 1.1 christos sections array; but making sure not to leave large gaps. Once all
6756 1.1 christos possible sections have been assigned to the current segment it is
6757 1.1 christos added to the list of built segments and if sections still remain
6758 1.1 christos to be assigned, a new segment is constructed before repeating
6759 1.1 christos the loop. */
6760 1.1 christos isec = 0;
6761 1.1 christos do
6762 1.1 christos {
6763 1.1 christos map->count = 0;
6764 1.1 christos suggested_lma = 0;
6765 1.1 christos first_suggested_lma = TRUE;
6766 1.1 christos
6767 1.1 christos /* Fill the current segment with sections that fit. */
6768 1.1 christos for (j = 0; j < section_count; j++)
6769 1.1 christos {
6770 1.1 christos section = sections[j];
6771 1.1 christos
6772 1.1 christos if (section == NULL)
6773 1.1 christos continue;
6774 1.1 christos
6775 1.1 christos output_section = section->output_section;
6776 1.1 christos
6777 1.1 christos BFD_ASSERT (output_section != NULL);
6778 1.1 christos
6779 1.1 christos if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr)
6780 1.1 christos || IS_COREFILE_NOTE (segment, section))
6781 1.1 christos {
6782 1.1 christos if (map->count == 0)
6783 1.1 christos {
6784 1.1 christos /* If the first section in a segment does not start at
6785 1.1 christos the beginning of the segment, then something is
6786 1.1 christos wrong. */
6787 1.1 christos if (output_section->lma
6788 1.1 christos != (map->p_paddr
6789 1.1 christos + (map->includes_filehdr ? iehdr->e_ehsize : 0)
6790 1.1 christos + (map->includes_phdrs
6791 1.1 christos ? iehdr->e_phnum * iehdr->e_phentsize
6792 1.1 christos : 0)))
6793 1.1 christos abort ();
6794 1.1 christos }
6795 1.1 christos else
6796 1.1 christos {
6797 1.1 christos asection *prev_sec;
6798 1.1 christos
6799 1.1 christos prev_sec = map->sections[map->count - 1];
6800 1.1 christos
6801 1.1 christos /* If the gap between the end of the previous section
6802 1.1 christos and the start of this section is more than
6803 1.1 christos maxpagesize then we need to start a new segment. */
6804 1.1 christos if ((BFD_ALIGN (prev_sec->lma + prev_sec->size,
6805 1.1 christos maxpagesize)
6806 1.1 christos < BFD_ALIGN (output_section->lma, maxpagesize))
6807 1.1 christos || (prev_sec->lma + prev_sec->size
6808 1.1 christos > output_section->lma))
6809 1.1 christos {
6810 1.1 christos if (first_suggested_lma)
6811 1.1 christos {
6812 1.1 christos suggested_lma = output_section->lma;
6813 1.1 christos first_suggested_lma = FALSE;
6814 1.1 christos }
6815 1.1 christos
6816 1.1 christos continue;
6817 1.1 christos }
6818 1.1 christos }
6819 1.1 christos
6820 1.1 christos map->sections[map->count++] = output_section;
6821 1.1 christos ++isec;
6822 1.1 christos sections[j] = NULL;
6823 1.1 christos section->segment_mark = TRUE;
6824 1.1 christos }
6825 1.1 christos else if (first_suggested_lma)
6826 1.1 christos {
6827 1.1 christos suggested_lma = output_section->lma;
6828 1.1 christos first_suggested_lma = FALSE;
6829 1.1 christos }
6830 1.1 christos }
6831 1.1 christos
6832 1.1 christos BFD_ASSERT (map->count > 0);
6833 1.1 christos
6834 1.1 christos /* Add the current segment to the list of built segments. */
6835 1.1 christos *pointer_to_map = map;
6836 1.1 christos pointer_to_map = &map->next;
6837 1.1 christos
6838 1.1 christos if (isec < section_count)
6839 1.1 christos {
6840 1.1 christos /* We still have not allocated all of the sections to
6841 1.1 christos segments. Create a new segment here, initialise it
6842 1.1 christos and carry on looping. */
6843 1.3 christos amt = sizeof (struct elf_segment_map);
6844 1.1 christos amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
6845 1.1 christos map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
6846 1.1 christos if (map == NULL)
6847 1.1 christos {
6848 1.1 christos free (sections);
6849 1.1 christos return FALSE;
6850 1.1 christos }
6851 1.1 christos
6852 1.1 christos /* Initialise the fields of the segment map. Set the physical
6853 1.1 christos physical address to the LMA of the first section that has
6854 1.1 christos not yet been assigned. */
6855 1.1 christos map->next = NULL;
6856 1.1 christos map->p_type = segment->p_type;
6857 1.1 christos map->p_flags = segment->p_flags;
6858 1.1 christos map->p_flags_valid = 1;
6859 1.1 christos map->p_paddr = suggested_lma;
6860 1.1 christos map->p_paddr_valid = p_paddr_valid;
6861 1.1 christos map->includes_filehdr = 0;
6862 1.1 christos map->includes_phdrs = 0;
6863 1.1 christos }
6864 1.1 christos }
6865 1.1 christos while (isec < section_count);
6866 1.1 christos
6867 1.1 christos free (sections);
6868 1.3 christos }
6869 1.1 christos
6870 1.1 christos elf_seg_map (obfd) = map_first;
6871 1.1 christos
6872 1.1 christos /* If we had to estimate the number of program headers that were
6873 1.1 christos going to be needed, then check our estimate now and adjust
6874 1.1 christos the offset if necessary. */
6875 1.1 christos if (phdr_adjust_seg != NULL)
6876 1.1 christos {
6877 1.1 christos unsigned int count;
6878 1.1 christos
6879 1.1 christos for (count = 0, map = map_first; map != NULL; map = map->next)
6880 1.1 christos count++;
6881 1.1 christos
6882 1.1 christos if (count > phdr_adjust_num)
6883 1.1 christos phdr_adjust_seg->p_paddr
6884 1.1 christos -= (count - phdr_adjust_num) * iehdr->e_phentsize;
6885 1.1 christos }
6886 1.1 christos
6887 1.1 christos #undef SEGMENT_END
6888 1.1 christos #undef SECTION_SIZE
6889 1.1 christos #undef IS_CONTAINED_BY_VMA
6890 1.1 christos #undef IS_CONTAINED_BY_LMA
6891 1.1 christos #undef IS_NOTE
6892 1.1 christos #undef IS_COREFILE_NOTE
6893 1.1 christos #undef IS_SOLARIS_PT_INTERP
6894 1.1 christos #undef IS_SECTION_IN_INPUT_SEGMENT
6895 1.1 christos #undef INCLUDE_SECTION_IN_SEGMENT
6896 1.1 christos #undef SEGMENT_AFTER_SEGMENT
6897 1.1 christos #undef SEGMENT_OVERLAPS
6898 1.1 christos return TRUE;
6899 1.1 christos }
6900 1.1 christos
6901 1.1 christos /* Copy ELF program header information. */
6902 1.1 christos
6903 1.1 christos static bfd_boolean
6904 1.1 christos copy_elf_program_header (bfd *ibfd, bfd *obfd)
6905 1.1 christos {
6906 1.1 christos Elf_Internal_Ehdr *iehdr;
6907 1.1 christos struct elf_segment_map *map;
6908 1.1 christos struct elf_segment_map *map_first;
6909 1.1 christos struct elf_segment_map **pointer_to_map;
6910 1.1 christos Elf_Internal_Phdr *segment;
6911 1.1 christos unsigned int i;
6912 1.1 christos unsigned int num_segments;
6913 1.1 christos bfd_boolean phdr_included = FALSE;
6914 1.1 christos bfd_boolean p_paddr_valid;
6915 1.1 christos
6916 1.1 christos iehdr = elf_elfheader (ibfd);
6917 1.1 christos
6918 1.1 christos map_first = NULL;
6919 1.1 christos pointer_to_map = &map_first;
6920 1.1 christos
6921 1.1 christos /* If all the segment p_paddr fields are zero, don't set
6922 1.1 christos map->p_paddr_valid. */
6923 1.1 christos p_paddr_valid = FALSE;
6924 1.1 christos num_segments = elf_elfheader (ibfd)->e_phnum;
6925 1.1 christos for (i = 0, segment = elf_tdata (ibfd)->phdr;
6926 1.1 christos i < num_segments;
6927 1.1 christos i++, segment++)
6928 1.1 christos if (segment->p_paddr != 0)
6929 1.1 christos {
6930 1.1 christos p_paddr_valid = TRUE;
6931 1.1 christos break;
6932 1.1 christos }
6933 1.1 christos
6934 1.1 christos for (i = 0, segment = elf_tdata (ibfd)->phdr;
6935 1.1 christos i < num_segments;
6936 1.1 christos i++, segment++)
6937 1.1 christos {
6938 1.1 christos asection *section;
6939 1.1 christos unsigned int section_count;
6940 1.1 christos bfd_size_type amt;
6941 1.1 christos Elf_Internal_Shdr *this_hdr;
6942 1.1 christos asection *first_section = NULL;
6943 1.1 christos asection *lowest_section;
6944 1.1 christos
6945 1.1 christos /* Compute how many sections are in this segment. */
6946 1.1 christos for (section = ibfd->sections, section_count = 0;
6947 1.1 christos section != NULL;
6948 1.1 christos section = section->next)
6949 1.1 christos {
6950 1.1 christos this_hdr = &(elf_section_data(section)->this_hdr);
6951 1.1 christos if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
6952 1.1 christos {
6953 1.1 christos if (first_section == NULL)
6954 1.1 christos first_section = section;
6955 1.1 christos section_count++;
6956 1.1 christos }
6957 1.1 christos }
6958 1.1 christos
6959 1.1 christos /* Allocate a segment map big enough to contain
6960 1.1 christos all of the sections we have selected. */
6961 1.1 christos amt = sizeof (struct elf_segment_map);
6962 1.1 christos if (section_count != 0)
6963 1.1 christos amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
6964 1.1 christos map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
6965 1.1 christos if (map == NULL)
6966 1.1 christos return FALSE;
6967 1.1 christos
6968 1.1 christos /* Initialize the fields of the output segment map with the
6969 1.1 christos input segment. */
6970 1.1 christos map->next = NULL;
6971 1.1 christos map->p_type = segment->p_type;
6972 1.1 christos map->p_flags = segment->p_flags;
6973 1.1 christos map->p_flags_valid = 1;
6974 1.1 christos map->p_paddr = segment->p_paddr;
6975 1.1 christos map->p_paddr_valid = p_paddr_valid;
6976 1.1 christos map->p_align = segment->p_align;
6977 1.1 christos map->p_align_valid = 1;
6978 1.3 christos map->p_vaddr_offset = 0;
6979 1.3 christos
6980 1.1 christos if (map->p_type == PT_GNU_RELRO
6981 1.1 christos || map->p_type == PT_GNU_STACK)
6982 1.1 christos {
6983 1.1 christos /* The PT_GNU_RELRO segment may contain the first a few
6984 1.3 christos bytes in the .got.plt section even if the whole .got.plt
6985 1.3 christos section isn't in the PT_GNU_RELRO segment. We won't
6986 1.3 christos change the size of the PT_GNU_RELRO segment.
6987 1.1 christos Similarly, PT_GNU_STACK size is significant on uclinux
6988 1.1 christos systems. */
6989 1.1 christos map->p_size = segment->p_memsz;
6990 1.1 christos map->p_size_valid = 1;
6991 1.1 christos }
6992 1.1 christos
6993 1.1 christos /* Determine if this segment contains the ELF file header
6994 1.1 christos and if it contains the program headers themselves. */
6995 1.1 christos map->includes_filehdr = (segment->p_offset == 0
6996 1.1 christos && segment->p_filesz >= iehdr->e_ehsize);
6997 1.1 christos
6998 1.1 christos map->includes_phdrs = 0;
6999 1.1 christos if (! phdr_included || segment->p_type != PT_LOAD)
7000 1.1 christos {
7001 1.1 christos map->includes_phdrs =
7002 1.1 christos (segment->p_offset <= (bfd_vma) iehdr->e_phoff
7003 1.1 christos && (segment->p_offset + segment->p_filesz
7004 1.1 christos >= ((bfd_vma) iehdr->e_phoff
7005 1.1 christos + iehdr->e_phnum * iehdr->e_phentsize)));
7006 1.1 christos
7007 1.1 christos if (segment->p_type == PT_LOAD && map->includes_phdrs)
7008 1.1 christos phdr_included = TRUE;
7009 1.5 christos }
7010 1.1 christos
7011 1.1 christos lowest_section = NULL;
7012 1.1 christos if (section_count != 0)
7013 1.1 christos {
7014 1.1 christos unsigned int isec = 0;
7015 1.1 christos
7016 1.1 christos for (section = first_section;
7017 1.1 christos section != NULL;
7018 1.1 christos section = section->next)
7019 1.1 christos {
7020 1.1 christos this_hdr = &(elf_section_data(section)->this_hdr);
7021 1.1 christos if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
7022 1.1 christos {
7023 1.1 christos map->sections[isec++] = section->output_section;
7024 1.1 christos if ((section->flags & SEC_ALLOC) != 0)
7025 1.1 christos {
7026 1.5 christos bfd_vma seg_off;
7027 1.5 christos
7028 1.4 christos if (lowest_section == NULL
7029 1.4 christos || section->lma < lowest_section->lma)
7030 1.1 christos lowest_section = section;
7031 1.1 christos
7032 1.1 christos /* Section lmas are set up from PT_LOAD header
7033 1.1 christos p_paddr in _bfd_elf_make_section_from_shdr.
7034 1.1 christos If this header has a p_paddr that disagrees
7035 1.1 christos with the section lma, flag the p_paddr as
7036 1.1 christos invalid. */
7037 1.1 christos if ((section->flags & SEC_LOAD) != 0)
7038 1.1 christos seg_off = this_hdr->sh_offset - segment->p_offset;
7039 1.1 christos else
7040 1.1 christos seg_off = this_hdr->sh_addr - segment->p_vaddr;
7041 1.1 christos if (section->lma - segment->p_paddr != seg_off)
7042 1.1 christos map->p_paddr_valid = FALSE;
7043 1.1 christos }
7044 1.1 christos if (isec == section_count)
7045 1.1 christos break;
7046 1.1 christos }
7047 1.1 christos }
7048 1.1 christos }
7049 1.1 christos
7050 1.1 christos if (map->includes_filehdr && lowest_section != NULL)
7051 1.3 christos /* We need to keep the space used by the headers fixed. */
7052 1.1 christos map->header_size = lowest_section->vma - segment->p_vaddr;
7053 1.1 christos
7054 1.1 christos if (!map->includes_phdrs
7055 1.1 christos && !map->includes_filehdr
7056 1.1 christos && map->p_paddr_valid)
7057 1.1 christos /* There is some other padding before the first section. */
7058 1.1 christos map->p_vaddr_offset = ((lowest_section ? lowest_section->lma : 0)
7059 1.1 christos - segment->p_paddr);
7060 1.1 christos
7061 1.1 christos map->count = section_count;
7062 1.1 christos *pointer_to_map = map;
7063 1.1 christos pointer_to_map = &map->next;
7064 1.3 christos }
7065 1.1 christos
7066 1.1 christos elf_seg_map (obfd) = map_first;
7067 1.1 christos return TRUE;
7068 1.1 christos }
7069 1.1 christos
7070 1.1 christos /* Copy private BFD data. This copies or rewrites ELF program header
7071 1.1 christos information. */
7072 1.1 christos
7073 1.1 christos static bfd_boolean
7074 1.1 christos copy_private_bfd_data (bfd *ibfd, bfd *obfd)
7075 1.1 christos {
7076 1.1 christos if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
7077 1.1 christos || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
7078 1.1 christos return TRUE;
7079 1.1 christos
7080 1.1 christos if (elf_tdata (ibfd)->phdr == NULL)
7081 1.1 christos return TRUE;
7082 1.1 christos
7083 1.1 christos if (ibfd->xvec == obfd->xvec)
7084 1.1 christos {
7085 1.1 christos /* Check to see if any sections in the input BFD
7086 1.1 christos covered by ELF program header have changed. */
7087 1.1 christos Elf_Internal_Phdr *segment;
7088 1.1 christos asection *section, *osec;
7089 1.1 christos unsigned int i, num_segments;
7090 1.1 christos Elf_Internal_Shdr *this_hdr;
7091 1.1 christos const struct elf_backend_data *bed;
7092 1.1 christos
7093 1.1 christos bed = get_elf_backend_data (ibfd);
7094 1.1 christos
7095 1.1 christos /* Regenerate the segment map if p_paddr is set to 0. */
7096 1.1 christos if (bed->want_p_paddr_set_to_zero)
7097 1.1 christos goto rewrite;
7098 1.1 christos
7099 1.1 christos /* Initialize the segment mark field. */
7100 1.1 christos for (section = obfd->sections; section != NULL;
7101 1.1 christos section = section->next)
7102 1.1 christos section->segment_mark = FALSE;
7103 1.1 christos
7104 1.1 christos num_segments = elf_elfheader (ibfd)->e_phnum;
7105 1.1 christos for (i = 0, segment = elf_tdata (ibfd)->phdr;
7106 1.1 christos i < num_segments;
7107 1.1 christos i++, segment++)
7108 1.1 christos {
7109 1.1 christos /* PR binutils/3535. The Solaris linker always sets the p_paddr
7110 1.1 christos and p_memsz fields of special segments (DYNAMIC, INTERP) to 0
7111 1.1 christos which severly confuses things, so always regenerate the segment
7112 1.1 christos map in this case. */
7113 1.1 christos if (segment->p_paddr == 0
7114 1.1 christos && segment->p_memsz == 0
7115 1.1 christos && (segment->p_type == PT_INTERP || segment->p_type == PT_DYNAMIC))
7116 1.1 christos goto rewrite;
7117 1.1 christos
7118 1.1 christos for (section = ibfd->sections;
7119 1.1 christos section != NULL; section = section->next)
7120 1.1 christos {
7121 1.1 christos /* We mark the output section so that we know it comes
7122 1.1 christos from the input BFD. */
7123 1.1 christos osec = section->output_section;
7124 1.1 christos if (osec)
7125 1.1 christos osec->segment_mark = TRUE;
7126 1.1 christos
7127 1.1 christos /* Check if this section is covered by the segment. */
7128 1.1 christos this_hdr = &(elf_section_data(section)->this_hdr);
7129 1.1 christos if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
7130 1.1 christos {
7131 1.1 christos /* FIXME: Check if its output section is changed or
7132 1.1 christos removed. What else do we need to check? */
7133 1.1 christos if (osec == NULL
7134 1.1 christos || section->flags != osec->flags
7135 1.1 christos || section->lma != osec->lma
7136 1.1 christos || section->vma != osec->vma
7137 1.1 christos || section->size != osec->size
7138 1.1 christos || section->rawsize != osec->rawsize
7139 1.1 christos || section->alignment_power != osec->alignment_power)
7140 1.1 christos goto rewrite;
7141 1.1 christos }
7142 1.1 christos }
7143 1.1 christos }
7144 1.1 christos
7145 1.1 christos /* Check to see if any output section do not come from the
7146 1.1 christos input BFD. */
7147 1.1 christos for (section = obfd->sections; section != NULL;
7148 1.1 christos section = section->next)
7149 1.1 christos {
7150 1.1 christos if (section->segment_mark == FALSE)
7151 1.1 christos goto rewrite;
7152 1.1 christos else
7153 1.1 christos section->segment_mark = FALSE;
7154 1.1 christos }
7155 1.1 christos
7156 1.1 christos return copy_elf_program_header (ibfd, obfd);
7157 1.1 christos }
7158 1.3 christos
7159 1.3 christos rewrite:
7160 1.3 christos if (ibfd->xvec == obfd->xvec)
7161 1.3 christos {
7162 1.3 christos /* When rewriting program header, set the output maxpagesize to
7163 1.3 christos the maximum alignment of input PT_LOAD segments. */
7164 1.3 christos Elf_Internal_Phdr *segment;
7165 1.3 christos unsigned int i;
7166 1.3 christos unsigned int num_segments = elf_elfheader (ibfd)->e_phnum;
7167 1.3 christos bfd_vma maxpagesize = 0;
7168 1.3 christos
7169 1.3 christos for (i = 0, segment = elf_tdata (ibfd)->phdr;
7170 1.3 christos i < num_segments;
7171 1.3 christos i++, segment++)
7172 1.6 christos if (segment->p_type == PT_LOAD
7173 1.6 christos && maxpagesize < segment->p_align)
7174 1.6 christos {
7175 1.6 christos /* PR 17512: file: f17299af. */
7176 1.6 christos if (segment->p_align > (bfd_vma) 1 << ((sizeof (bfd_vma) * 8) - 2))
7177 1.6 christos (*_bfd_error_handler) (_("\
7178 1.6 christos %B: warning: segment alignment of 0x%llx is too large"),
7179 1.6 christos ibfd, (long long) segment->p_align);
7180 1.6 christos else
7181 1.3 christos maxpagesize = segment->p_align;
7182 1.3 christos }
7183 1.3 christos
7184 1.3 christos if (maxpagesize != get_elf_backend_data (obfd)->maxpagesize)
7185 1.3 christos bfd_emul_set_maxpagesize (bfd_get_target (obfd), maxpagesize);
7186 1.1 christos }
7187 1.1 christos
7188 1.1 christos return rewrite_elf_program_header (ibfd, obfd);
7189 1.1 christos }
7190 1.1 christos
7191 1.1 christos /* Initialize private output section information from input section. */
7192 1.1 christos
7193 1.1 christos bfd_boolean
7194 1.1 christos _bfd_elf_init_private_section_data (bfd *ibfd,
7195 1.1 christos asection *isec,
7196 1.1 christos bfd *obfd,
7197 1.1 christos asection *osec,
7198 1.1 christos struct bfd_link_info *link_info)
7199 1.1 christos
7200 1.8 christos {
7201 1.8 christos Elf_Internal_Shdr *ihdr, *ohdr;
7202 1.1 christos bfd_boolean final_link = (link_info != NULL
7203 1.1 christos && !bfd_link_relocatable (link_info));
7204 1.1 christos
7205 1.1 christos if (ibfd->xvec->flavour != bfd_target_elf_flavour
7206 1.1 christos || obfd->xvec->flavour != bfd_target_elf_flavour)
7207 1.3 christos return TRUE;
7208 1.3 christos
7209 1.1 christos BFD_ASSERT (elf_section_data (osec) != NULL);
7210 1.1 christos
7211 1.1 christos /* For objcopy and relocatable link, don't copy the output ELF
7212 1.1 christos section type from input if the output BFD section flags have been
7213 1.1 christos set to something different. For a final link allow some flags
7214 1.1 christos that the linker clears to differ. */
7215 1.1 christos if (elf_section_type (osec) == SHT_NULL
7216 1.1 christos && (osec->flags == isec->flags
7217 1.1 christos || (final_link
7218 1.1 christos && ((osec->flags ^ isec->flags)
7219 1.1 christos & ~(SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_RELOC)) == 0)))
7220 1.1 christos elf_section_type (osec) = elf_section_type (isec);
7221 1.1 christos
7222 1.1 christos /* FIXME: Is this correct for all OS/PROC specific flags? */
7223 1.1 christos elf_section_flags (osec) |= (elf_section_flags (isec)
7224 1.1 christos & (SHF_MASKOS | SHF_MASKPROC));
7225 1.1 christos
7226 1.1 christos /* Set things up for objcopy and relocatable link. The output
7227 1.1 christos SHT_GROUP section will have its elf_next_in_group pointing back
7228 1.1 christos to the input group members. Ignore linker created group section.
7229 1.1 christos See elfNN_ia64_object_p in elfxx-ia64.c. */
7230 1.1 christos if (!final_link)
7231 1.1 christos {
7232 1.1 christos if (elf_sec_group (isec) == NULL
7233 1.1 christos || (elf_sec_group (isec)->flags & SEC_LINKER_CREATED) == 0)
7234 1.1 christos {
7235 1.1 christos if (elf_section_flags (isec) & SHF_GROUP)
7236 1.1 christos elf_section_flags (osec) |= SHF_GROUP;
7237 1.1 christos elf_next_in_group (osec) = elf_next_in_group (isec);
7238 1.6 christos elf_section_data (osec)->group = elf_section_data (isec)->group;
7239 1.6 christos }
7240 1.6 christos
7241 1.6 christos /* If not decompress, preserve SHF_COMPRESSED. */
7242 1.6 christos if ((ibfd->flags & BFD_DECOMPRESS) == 0)
7243 1.1 christos elf_section_flags (osec) |= (elf_section_flags (isec)
7244 1.1 christos & SHF_COMPRESSED);
7245 1.1 christos }
7246 1.1 christos
7247 1.1 christos ihdr = &elf_section_data (isec)->this_hdr;
7248 1.1 christos
7249 1.1 christos /* We need to handle elf_linked_to_section for SHF_LINK_ORDER. We
7250 1.1 christos don't use the output section of the linked-to section since it
7251 1.1 christos may be NULL at this point. */
7252 1.1 christos if ((ihdr->sh_flags & SHF_LINK_ORDER) != 0)
7253 1.1 christos {
7254 1.1 christos ohdr = &elf_section_data (osec)->this_hdr;
7255 1.1 christos ohdr->sh_flags |= SHF_LINK_ORDER;
7256 1.1 christos elf_linked_to_section (osec) = elf_linked_to_section (isec);
7257 1.1 christos }
7258 1.1 christos
7259 1.1 christos osec->use_rela_p = isec->use_rela_p;
7260 1.1 christos
7261 1.1 christos return TRUE;
7262 1.1 christos }
7263 1.1 christos
7264 1.1 christos /* Copy private section information. This copies over the entsize
7265 1.1 christos field, and sometimes the info field. */
7266 1.1 christos
7267 1.1 christos bfd_boolean
7268 1.1 christos _bfd_elf_copy_private_section_data (bfd *ibfd,
7269 1.1 christos asection *isec,
7270 1.1 christos bfd *obfd,
7271 1.1 christos asection *osec)
7272 1.1 christos {
7273 1.1 christos Elf_Internal_Shdr *ihdr, *ohdr;
7274 1.1 christos
7275 1.1 christos if (ibfd->xvec->flavour != bfd_target_elf_flavour
7276 1.1 christos || obfd->xvec->flavour != bfd_target_elf_flavour)
7277 1.1 christos return TRUE;
7278 1.1 christos
7279 1.1 christos ihdr = &elf_section_data (isec)->this_hdr;
7280 1.1 christos ohdr = &elf_section_data (osec)->this_hdr;
7281 1.1 christos
7282 1.1 christos ohdr->sh_entsize = ihdr->sh_entsize;
7283 1.1 christos
7284 1.1 christos if (ihdr->sh_type == SHT_SYMTAB
7285 1.1 christos || ihdr->sh_type == SHT_DYNSYM
7286 1.1 christos || ihdr->sh_type == SHT_GNU_verneed
7287 1.1 christos || ihdr->sh_type == SHT_GNU_verdef)
7288 1.1 christos ohdr->sh_info = ihdr->sh_info;
7289 1.1 christos
7290 1.1 christos return _bfd_elf_init_private_section_data (ibfd, isec, obfd, osec,
7291 1.1 christos NULL);
7292 1.1 christos }
7293 1.1 christos
7294 1.1 christos /* Look at all the SHT_GROUP sections in IBFD, making any adjustments
7295 1.1 christos necessary if we are removing either the SHT_GROUP section or any of
7296 1.1 christos the group member sections. DISCARDED is the value that a section's
7297 1.1 christos output_section has if the section will be discarded, NULL when this
7298 1.1 christos function is called from objcopy, bfd_abs_section_ptr when called
7299 1.1 christos from the linker. */
7300 1.1 christos
7301 1.1 christos bfd_boolean
7302 1.1 christos _bfd_elf_fixup_group_sections (bfd *ibfd, asection *discarded)
7303 1.1 christos {
7304 1.1 christos asection *isec;
7305 1.1 christos
7306 1.1 christos for (isec = ibfd->sections; isec != NULL; isec = isec->next)
7307 1.1 christos if (elf_section_type (isec) == SHT_GROUP)
7308 1.1 christos {
7309 1.1 christos asection *first = elf_next_in_group (isec);
7310 1.1 christos asection *s = first;
7311 1.1 christos bfd_size_type removed = 0;
7312 1.1 christos
7313 1.1 christos while (s != NULL)
7314 1.1 christos {
7315 1.1 christos /* If this member section is being output but the
7316 1.1 christos SHT_GROUP section is not, then clear the group info
7317 1.1 christos set up by _bfd_elf_copy_private_section_data. */
7318 1.1 christos if (s->output_section != discarded
7319 1.1 christos && isec->output_section == discarded)
7320 1.1 christos {
7321 1.1 christos elf_section_flags (s->output_section) &= ~SHF_GROUP;
7322 1.1 christos elf_group_name (s->output_section) = NULL;
7323 1.1 christos }
7324 1.1 christos /* Conversely, if the member section is not being output
7325 1.1 christos but the SHT_GROUP section is, then adjust its size. */
7326 1.1 christos else if (s->output_section == discarded
7327 1.1 christos && isec->output_section != discarded)
7328 1.1 christos removed += 4;
7329 1.1 christos s = elf_next_in_group (s);
7330 1.1 christos if (s == first)
7331 1.1 christos break;
7332 1.1 christos }
7333 1.1 christos if (removed != 0)
7334 1.1 christos {
7335 1.1 christos if (discarded != NULL)
7336 1.1 christos {
7337 1.1 christos /* If we've been called for ld -r, then we need to
7338 1.1 christos adjust the input section size. This function may
7339 1.1 christos be called multiple times, so save the original
7340 1.1 christos size. */
7341 1.1 christos if (isec->rawsize == 0)
7342 1.1 christos isec->rawsize = isec->size;
7343 1.1 christos isec->size = isec->rawsize - removed;
7344 1.1 christos }
7345 1.1 christos else
7346 1.1 christos {
7347 1.1 christos /* Adjust the output section size when called from
7348 1.1 christos objcopy. */
7349 1.1 christos isec->output_section->size -= removed;
7350 1.1 christos }
7351 1.1 christos }
7352 1.1 christos }
7353 1.1 christos
7354 1.1 christos return TRUE;
7355 1.1 christos }
7356 1.1 christos
7357 1.1 christos /* Copy private header information. */
7358 1.1 christos
7359 1.1 christos bfd_boolean
7360 1.1 christos _bfd_elf_copy_private_header_data (bfd *ibfd, bfd *obfd)
7361 1.1 christos {
7362 1.1 christos if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
7363 1.1 christos || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
7364 1.1 christos return TRUE;
7365 1.1 christos
7366 1.1 christos /* Copy over private BFD data if it has not already been copied.
7367 1.1 christos This must be done here, rather than in the copy_private_bfd_data
7368 1.1 christos entry point, because the latter is called after the section
7369 1.3 christos contents have been set, which means that the program headers have
7370 1.1 christos already been worked out. */
7371 1.1 christos if (elf_seg_map (obfd) == NULL && elf_tdata (ibfd)->phdr != NULL)
7372 1.1 christos {
7373 1.1 christos if (! copy_private_bfd_data (ibfd, obfd))
7374 1.1 christos return FALSE;
7375 1.1 christos }
7376 1.1 christos
7377 1.1 christos return _bfd_elf_fixup_group_sections (ibfd, NULL);
7378 1.1 christos }
7379 1.1 christos
7380 1.1 christos /* Copy private symbol information. If this symbol is in a section
7381 1.1 christos which we did not map into a BFD section, try to map the section
7382 1.1 christos index correctly. We use special macro definitions for the mapped
7383 1.1 christos section indices; these definitions are interpreted by the
7384 1.1 christos swap_out_syms function. */
7385 1.1 christos
7386 1.1 christos #define MAP_ONESYMTAB (SHN_HIOS + 1)
7387 1.1 christos #define MAP_DYNSYMTAB (SHN_HIOS + 2)
7388 1.1 christos #define MAP_STRTAB (SHN_HIOS + 3)
7389 1.1 christos #define MAP_SHSTRTAB (SHN_HIOS + 4)
7390 1.1 christos #define MAP_SYM_SHNDX (SHN_HIOS + 5)
7391 1.1 christos
7392 1.1 christos bfd_boolean
7393 1.1 christos _bfd_elf_copy_private_symbol_data (bfd *ibfd,
7394 1.1 christos asymbol *isymarg,
7395 1.1 christos bfd *obfd,
7396 1.1 christos asymbol *osymarg)
7397 1.1 christos {
7398 1.1 christos elf_symbol_type *isym, *osym;
7399 1.1 christos
7400 1.1 christos if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
7401 1.1 christos || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
7402 1.1 christos return TRUE;
7403 1.1 christos
7404 1.1 christos isym = elf_symbol_from (ibfd, isymarg);
7405 1.1 christos osym = elf_symbol_from (obfd, osymarg);
7406 1.1 christos
7407 1.1 christos if (isym != NULL
7408 1.1 christos && isym->internal_elf_sym.st_shndx != 0
7409 1.1 christos && osym != NULL
7410 1.1 christos && bfd_is_abs_section (isym->symbol.section))
7411 1.1 christos {
7412 1.1 christos unsigned int shndx;
7413 1.1 christos
7414 1.1 christos shndx = isym->internal_elf_sym.st_shndx;
7415 1.1 christos if (shndx == elf_onesymtab (ibfd))
7416 1.1 christos shndx = MAP_ONESYMTAB;
7417 1.3 christos else if (shndx == elf_dynsymtab (ibfd))
7418 1.1 christos shndx = MAP_DYNSYMTAB;
7419 1.3 christos else if (shndx == elf_strtab_sec (ibfd))
7420 1.1 christos shndx = MAP_STRTAB;
7421 1.8 christos else if (shndx == elf_shstrtab_sec (ibfd))
7422 1.1 christos shndx = MAP_SHSTRTAB;
7423 1.1 christos else if (find_section_in_list (shndx, elf_symtab_shndx_list (ibfd)))
7424 1.1 christos shndx = MAP_SYM_SHNDX;
7425 1.1 christos osym->internal_elf_sym.st_shndx = shndx;
7426 1.1 christos }
7427 1.1 christos
7428 1.1 christos return TRUE;
7429 1.1 christos }
7430 1.1 christos
7431 1.1 christos /* Swap out the symbols. */
7432 1.1 christos
7433 1.6 christos static bfd_boolean
7434 1.1 christos swap_out_syms (bfd *abfd,
7435 1.1 christos struct elf_strtab_hash **sttp,
7436 1.1 christos int relocatable_p)
7437 1.1 christos {
7438 1.1 christos const struct elf_backend_data *bed;
7439 1.6 christos int symcount;
7440 1.1 christos asymbol **syms;
7441 1.1 christos struct elf_strtab_hash *stt;
7442 1.1 christos Elf_Internal_Shdr *symtab_hdr;
7443 1.6 christos Elf_Internal_Shdr *symtab_shndx_hdr;
7444 1.1 christos Elf_Internal_Shdr *symstrtab_hdr;
7445 1.1 christos struct elf_sym_strtab *symstrtab;
7446 1.6 christos bfd_byte *outbound_syms;
7447 1.6 christos bfd_byte *outbound_shndx;
7448 1.1 christos unsigned long outbound_syms_index;
7449 1.3 christos unsigned long outbound_shndx_index;
7450 1.1 christos int idx;
7451 1.1 christos unsigned int num_locals;
7452 1.1 christos bfd_size_type amt;
7453 1.3 christos bfd_boolean name_local_sections;
7454 1.1 christos
7455 1.1 christos if (!elf_map_symbols (abfd, &num_locals))
7456 1.1 christos return FALSE;
7457 1.6 christos
7458 1.1 christos /* Dump out the symtabs. */
7459 1.1 christos stt = _bfd_elf_strtab_init ();
7460 1.1 christos if (stt == NULL)
7461 1.1 christos return FALSE;
7462 1.1 christos
7463 1.1 christos bed = get_elf_backend_data (abfd);
7464 1.1 christos symcount = bfd_get_symcount (abfd);
7465 1.1 christos symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
7466 1.1 christos symtab_hdr->sh_type = SHT_SYMTAB;
7467 1.3 christos symtab_hdr->sh_entsize = bed->s->sizeof_sym;
7468 1.1 christos symtab_hdr->sh_size = symtab_hdr->sh_entsize * (symcount + 1);
7469 1.1 christos symtab_hdr->sh_info = num_locals + 1;
7470 1.1 christos symtab_hdr->sh_addralign = (bfd_vma) 1 << bed->s->log_file_align;
7471 1.1 christos
7472 1.1 christos symstrtab_hdr = &elf_tdata (abfd)->strtab_hdr;
7473 1.6 christos symstrtab_hdr->sh_type = SHT_STRTAB;
7474 1.6 christos
7475 1.6 christos /* Allocate buffer to swap out the .strtab section. */
7476 1.6 christos symstrtab = (struct elf_sym_strtab *) bfd_malloc ((symcount + 1)
7477 1.6 christos * sizeof (*symstrtab));
7478 1.6 christos if (symstrtab == NULL)
7479 1.6 christos {
7480 1.6 christos _bfd_elf_strtab_free (stt);
7481 1.6 christos return FALSE;
7482 1.1 christos }
7483 1.1 christos
7484 1.1 christos outbound_syms = (bfd_byte *) bfd_alloc2 (abfd, 1 + symcount,
7485 1.1 christos bed->s->sizeof_sym);
7486 1.6 christos if (outbound_syms == NULL)
7487 1.6 christos {
7488 1.6 christos error_return:
7489 1.1 christos _bfd_elf_strtab_free (stt);
7490 1.1 christos free (symstrtab);
7491 1.1 christos return FALSE;
7492 1.6 christos }
7493 1.1 christos symtab_hdr->contents = outbound_syms;
7494 1.1 christos outbound_syms_index = 0;
7495 1.6 christos
7496 1.8 christos outbound_shndx = NULL;
7497 1.8 christos outbound_shndx_index = 0;
7498 1.1 christos
7499 1.8 christos if (elf_symtab_shndx_list (abfd))
7500 1.8 christos {
7501 1.8 christos symtab_shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
7502 1.8 christos if (symtab_shndx_hdr->sh_name != 0)
7503 1.8 christos {
7504 1.8 christos amt = (bfd_size_type) (1 + symcount) * sizeof (Elf_External_Sym_Shndx);
7505 1.8 christos outbound_shndx = (bfd_byte *)
7506 1.8 christos bfd_zalloc2 (abfd, 1 + symcount, sizeof (Elf_External_Sym_Shndx));
7507 1.1 christos if (outbound_shndx == NULL)
7508 1.8 christos goto error_return;
7509 1.8 christos
7510 1.8 christos symtab_shndx_hdr->contents = outbound_shndx;
7511 1.8 christos symtab_shndx_hdr->sh_type = SHT_SYMTAB_SHNDX;
7512 1.8 christos symtab_shndx_hdr->sh_size = amt;
7513 1.8 christos symtab_shndx_hdr->sh_addralign = sizeof (Elf_External_Sym_Shndx);
7514 1.8 christos symtab_shndx_hdr->sh_entsize = sizeof (Elf_External_Sym_Shndx);
7515 1.1 christos }
7516 1.1 christos /* FIXME: What about any other headers in the list ? */
7517 1.1 christos }
7518 1.1 christos
7519 1.1 christos /* Now generate the data (for "contents"). */
7520 1.1 christos {
7521 1.1 christos /* Fill in zeroth symbol and swap it out. */
7522 1.1 christos Elf_Internal_Sym sym;
7523 1.1 christos sym.st_name = 0;
7524 1.1 christos sym.st_value = 0;
7525 1.1 christos sym.st_size = 0;
7526 1.1 christos sym.st_info = 0;
7527 1.1 christos sym.st_other = 0;
7528 1.6 christos sym.st_shndx = SHN_UNDEF;
7529 1.6 christos sym.st_target_internal = 0;
7530 1.6 christos symstrtab[0].sym = sym;
7531 1.6 christos symstrtab[0].dest_index = outbound_syms_index;
7532 1.1 christos symstrtab[0].destshndx_index = outbound_shndx_index;
7533 1.6 christos outbound_syms_index++;
7534 1.1 christos if (outbound_shndx != NULL)
7535 1.1 christos outbound_shndx_index++;
7536 1.1 christos }
7537 1.1 christos
7538 1.1 christos name_local_sections
7539 1.1 christos = (bed->elf_backend_name_local_section_symbols
7540 1.1 christos && bed->elf_backend_name_local_section_symbols (abfd));
7541 1.6 christos
7542 1.1 christos syms = bfd_get_outsymbols (abfd);
7543 1.1 christos for (idx = 0; idx < symcount;)
7544 1.1 christos {
7545 1.1 christos Elf_Internal_Sym sym;
7546 1.1 christos bfd_vma value = syms[idx]->value;
7547 1.1 christos elf_symbol_type *type_ptr;
7548 1.1 christos flagword flags = syms[idx]->flags;
7549 1.1 christos int type;
7550 1.1 christos
7551 1.1 christos if (!name_local_sections
7552 1.1 christos && (flags & (BSF_SECTION_SYM | BSF_GLOBAL)) == BSF_SECTION_SYM)
7553 1.6 christos {
7554 1.1 christos /* Local section symbols have no name. */
7555 1.1 christos sym.st_name = (unsigned long) -1;
7556 1.1 christos }
7557 1.6 christos else
7558 1.6 christos {
7559 1.6 christos /* Call _bfd_elf_strtab_offset after _bfd_elf_strtab_finalize
7560 1.6 christos to get the final offset for st_name. */
7561 1.6 christos sym.st_name
7562 1.1 christos = (unsigned long) _bfd_elf_strtab_add (stt, syms[idx]->name,
7563 1.6 christos FALSE);
7564 1.1 christos if (sym.st_name == (unsigned long) -1)
7565 1.1 christos goto error_return;
7566 1.1 christos }
7567 1.1 christos
7568 1.1 christos type_ptr = elf_symbol_from (abfd, syms[idx]);
7569 1.1 christos
7570 1.1 christos if ((flags & BSF_SECTION_SYM) == 0
7571 1.1 christos && bfd_is_com_section (syms[idx]->section))
7572 1.1 christos {
7573 1.1 christos /* ELF common symbols put the alignment into the `value' field,
7574 1.1 christos and the size into the `size' field. This is backwards from
7575 1.1 christos how BFD handles it, so reverse it here. */
7576 1.1 christos sym.st_size = value;
7577 1.1 christos if (type_ptr == NULL
7578 1.1 christos || type_ptr->internal_elf_sym.st_value == 0)
7579 1.1 christos sym.st_value = value >= 16 ? 16 : (1 << bfd_log2 (value));
7580 1.1 christos else
7581 1.1 christos sym.st_value = type_ptr->internal_elf_sym.st_value;
7582 1.1 christos sym.st_shndx = _bfd_elf_section_from_bfd_section
7583 1.1 christos (abfd, syms[idx]->section);
7584 1.1 christos }
7585 1.1 christos else
7586 1.1 christos {
7587 1.1 christos asection *sec = syms[idx]->section;
7588 1.1 christos unsigned int shndx;
7589 1.1 christos
7590 1.1 christos if (sec->output_section)
7591 1.1 christos {
7592 1.1 christos value += sec->output_offset;
7593 1.1 christos sec = sec->output_section;
7594 1.1 christos }
7595 1.1 christos
7596 1.1 christos /* Don't add in the section vma for relocatable output. */
7597 1.1 christos if (! relocatable_p)
7598 1.1 christos value += sec->vma;
7599 1.1 christos sym.st_value = value;
7600 1.1 christos sym.st_size = type_ptr ? type_ptr->internal_elf_sym.st_size : 0;
7601 1.1 christos
7602 1.1 christos if (bfd_is_abs_section (sec)
7603 1.1 christos && type_ptr != NULL
7604 1.1 christos && type_ptr->internal_elf_sym.st_shndx != 0)
7605 1.1 christos {
7606 1.1 christos /* This symbol is in a real ELF section which we did
7607 1.1 christos not create as a BFD section. Undo the mapping done
7608 1.1 christos by copy_private_symbol_data. */
7609 1.1 christos shndx = type_ptr->internal_elf_sym.st_shndx;
7610 1.1 christos switch (shndx)
7611 1.1 christos {
7612 1.1 christos case MAP_ONESYMTAB:
7613 1.1 christos shndx = elf_onesymtab (abfd);
7614 1.1 christos break;
7615 1.1 christos case MAP_DYNSYMTAB:
7616 1.1 christos shndx = elf_dynsymtab (abfd);
7617 1.3 christos break;
7618 1.1 christos case MAP_STRTAB:
7619 1.1 christos shndx = elf_strtab_sec (abfd);
7620 1.3 christos break;
7621 1.1 christos case MAP_SHSTRTAB:
7622 1.1 christos shndx = elf_shstrtab_sec (abfd);
7623 1.8 christos break;
7624 1.8 christos case MAP_SYM_SHNDX:
7625 1.1 christos if (elf_symtab_shndx_list (abfd))
7626 1.1 christos shndx = elf_symtab_shndx_list (abfd)->ndx;
7627 1.3 christos break;
7628 1.1 christos default:
7629 1.1 christos shndx = SHN_ABS;
7630 1.1 christos break;
7631 1.1 christos }
7632 1.1 christos }
7633 1.1 christos else
7634 1.1 christos {
7635 1.1 christos shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
7636 1.1 christos
7637 1.1 christos if (shndx == SHN_BAD)
7638 1.1 christos {
7639 1.1 christos asection *sec2;
7640 1.1 christos
7641 1.1 christos /* Writing this would be a hell of a lot easier if
7642 1.1 christos we had some decent documentation on bfd, and
7643 1.1 christos knew what to expect of the library, and what to
7644 1.1 christos demand of applications. For example, it
7645 1.1 christos appears that `objcopy' might not set the
7646 1.1 christos section of a symbol to be a section that is
7647 1.8 christos actually in the output file. */
7648 1.8 christos sec2 = bfd_get_section_by_name (abfd, sec->name);
7649 1.8 christos if (sec2 != NULL)
7650 1.1 christos shndx = _bfd_elf_section_from_bfd_section (abfd, sec2);
7651 1.1 christos if (shndx == SHN_BAD)
7652 1.1 christos {
7653 1.1 christos _bfd_error_handler (_("\
7654 1.1 christos Unable to find equivalent output section for symbol '%s' from section '%s'"),
7655 1.1 christos syms[idx]->name ? syms[idx]->name : "<Local sym>",
7656 1.6 christos sec->name);
7657 1.1 christos bfd_set_error (bfd_error_invalid_operation);
7658 1.1 christos goto error_return;
7659 1.1 christos }
7660 1.1 christos }
7661 1.1 christos }
7662 1.1 christos
7663 1.1 christos sym.st_shndx = shndx;
7664 1.1 christos }
7665 1.1 christos
7666 1.1 christos if ((flags & BSF_THREAD_LOCAL) != 0)
7667 1.1 christos type = STT_TLS;
7668 1.1 christos else if ((flags & BSF_GNU_INDIRECT_FUNCTION) != 0)
7669 1.1 christos type = STT_GNU_IFUNC;
7670 1.1 christos else if ((flags & BSF_FUNCTION) != 0)
7671 1.1 christos type = STT_FUNC;
7672 1.1 christos else if ((flags & BSF_OBJECT) != 0)
7673 1.1 christos type = STT_OBJECT;
7674 1.1 christos else if ((flags & BSF_RELC) != 0)
7675 1.1 christos type = STT_RELC;
7676 1.1 christos else if ((flags & BSF_SRELC) != 0)
7677 1.1 christos type = STT_SRELC;
7678 1.1 christos else
7679 1.1 christos type = STT_NOTYPE;
7680 1.1 christos
7681 1.1 christos if (syms[idx]->section->flags & SEC_THREAD_LOCAL)
7682 1.1 christos type = STT_TLS;
7683 1.1 christos
7684 1.1 christos /* Processor-specific types. */
7685 1.1 christos if (type_ptr != NULL
7686 1.1 christos && bed->elf_backend_get_symbol_type)
7687 1.1 christos type = ((*bed->elf_backend_get_symbol_type)
7688 1.1 christos (&type_ptr->internal_elf_sym, type));
7689 1.1 christos
7690 1.1 christos if (flags & BSF_SECTION_SYM)
7691 1.1 christos {
7692 1.1 christos if (flags & BSF_GLOBAL)
7693 1.1 christos sym.st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
7694 1.1 christos else
7695 1.1 christos sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION);
7696 1.1 christos }
7697 1.8 christos else if (bfd_is_com_section (syms[idx]->section))
7698 1.8 christos {
7699 1.8 christos if (type != STT_TLS)
7700 1.8 christos {
7701 1.8 christos if ((abfd->flags & BFD_CONVERT_ELF_COMMON))
7702 1.8 christos type = ((abfd->flags & BFD_USE_ELF_STT_COMMON)
7703 1.8 christos ? STT_COMMON : STT_OBJECT);
7704 1.8 christos else
7705 1.8 christos type = ((flags & BSF_ELF_COMMON) != 0
7706 1.8 christos ? STT_COMMON : STT_OBJECT);
7707 1.1 christos }
7708 1.1 christos sym.st_info = ELF_ST_INFO (STB_GLOBAL, type);
7709 1.1 christos }
7710 1.1 christos else if (bfd_is_und_section (syms[idx]->section))
7711 1.1 christos sym.st_info = ELF_ST_INFO (((flags & BSF_WEAK)
7712 1.1 christos ? STB_WEAK
7713 1.1 christos : STB_GLOBAL),
7714 1.1 christos type);
7715 1.1 christos else if (flags & BSF_FILE)
7716 1.1 christos sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FILE);
7717 1.1 christos else
7718 1.1 christos {
7719 1.1 christos int bind = STB_LOCAL;
7720 1.1 christos
7721 1.1 christos if (flags & BSF_LOCAL)
7722 1.1 christos bind = STB_LOCAL;
7723 1.1 christos else if (flags & BSF_GNU_UNIQUE)
7724 1.1 christos bind = STB_GNU_UNIQUE;
7725 1.1 christos else if (flags & BSF_WEAK)
7726 1.1 christos bind = STB_WEAK;
7727 1.1 christos else if (flags & BSF_GLOBAL)
7728 1.1 christos bind = STB_GLOBAL;
7729 1.1 christos
7730 1.1 christos sym.st_info = ELF_ST_INFO (bind, type);
7731 1.1 christos }
7732 1.1 christos
7733 1.1 christos if (type_ptr != NULL)
7734 1.1 christos {
7735 1.1 christos sym.st_other = type_ptr->internal_elf_sym.st_other;
7736 1.1 christos sym.st_target_internal
7737 1.1 christos = type_ptr->internal_elf_sym.st_target_internal;
7738 1.1 christos }
7739 1.1 christos else
7740 1.1 christos {
7741 1.1 christos sym.st_other = 0;
7742 1.1 christos sym.st_target_internal = 0;
7743 1.6 christos }
7744 1.6 christos
7745 1.6 christos idx++;
7746 1.6 christos symstrtab[idx].sym = sym;
7747 1.6 christos symstrtab[idx].dest_index = outbound_syms_index;
7748 1.6 christos symstrtab[idx].destshndx_index = outbound_shndx_index;
7749 1.1 christos
7750 1.6 christos outbound_syms_index++;
7751 1.6 christos if (outbound_shndx != NULL)
7752 1.6 christos outbound_shndx_index++;
7753 1.6 christos }
7754 1.6 christos
7755 1.6 christos /* Finalize the .strtab section. */
7756 1.6 christos _bfd_elf_strtab_finalize (stt);
7757 1.6 christos
7758 1.6 christos /* Swap out the .strtab section. */
7759 1.6 christos for (idx = 0; idx <= symcount; idx++)
7760 1.6 christos {
7761 1.6 christos struct elf_sym_strtab *elfsym = &symstrtab[idx];
7762 1.6 christos if (elfsym->sym.st_name == (unsigned long) -1)
7763 1.6 christos elfsym->sym.st_name = 0;
7764 1.6 christos else
7765 1.6 christos elfsym->sym.st_name = _bfd_elf_strtab_offset (stt,
7766 1.6 christos elfsym->sym.st_name);
7767 1.6 christos bed->s->swap_symbol_out (abfd, &elfsym->sym,
7768 1.6 christos (outbound_syms
7769 1.6 christos + (elfsym->dest_index
7770 1.6 christos * bed->s->sizeof_sym)),
7771 1.6 christos (outbound_shndx
7772 1.1 christos + (elfsym->destshndx_index
7773 1.6 christos * sizeof (Elf_External_Sym_Shndx))));
7774 1.1 christos }
7775 1.1 christos free (symstrtab);
7776 1.6 christos
7777 1.1 christos *sttp = stt;
7778 1.8 christos symstrtab_hdr->sh_size = _bfd_elf_strtab_size (stt);
7779 1.1 christos symstrtab_hdr->sh_type = SHT_STRTAB;
7780 1.1 christos symstrtab_hdr->sh_flags = bed->elf_strtab_flags;
7781 1.1 christos symstrtab_hdr->sh_addr = 0;
7782 1.1 christos symstrtab_hdr->sh_entsize = 0;
7783 1.1 christos symstrtab_hdr->sh_link = 0;
7784 1.1 christos symstrtab_hdr->sh_info = 0;
7785 1.1 christos symstrtab_hdr->sh_addralign = 1;
7786 1.1 christos
7787 1.1 christos return TRUE;
7788 1.1 christos }
7789 1.1 christos
7790 1.1 christos /* Return the number of bytes required to hold the symtab vector.
7791 1.1 christos
7792 1.1 christos Note that we base it on the count plus 1, since we will null terminate
7793 1.1 christos the vector allocated based on this size. However, the ELF symbol table
7794 1.1 christos always has a dummy entry as symbol #0, so it ends up even. */
7795 1.1 christos
7796 1.1 christos long
7797 1.1 christos _bfd_elf_get_symtab_upper_bound (bfd *abfd)
7798 1.1 christos {
7799 1.1 christos long symcount;
7800 1.1 christos long symtab_size;
7801 1.1 christos Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->symtab_hdr;
7802 1.1 christos
7803 1.1 christos symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
7804 1.1 christos symtab_size = (symcount + 1) * (sizeof (asymbol *));
7805 1.1 christos if (symcount > 0)
7806 1.1 christos symtab_size -= sizeof (asymbol *);
7807 1.1 christos
7808 1.1 christos return symtab_size;
7809 1.1 christos }
7810 1.1 christos
7811 1.1 christos long
7812 1.1 christos _bfd_elf_get_dynamic_symtab_upper_bound (bfd *abfd)
7813 1.1 christos {
7814 1.1 christos long symcount;
7815 1.1 christos long symtab_size;
7816 1.1 christos Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->dynsymtab_hdr;
7817 1.1 christos
7818 1.1 christos if (elf_dynsymtab (abfd) == 0)
7819 1.1 christos {
7820 1.1 christos bfd_set_error (bfd_error_invalid_operation);
7821 1.1 christos return -1;
7822 1.1 christos }
7823 1.1 christos
7824 1.1 christos symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
7825 1.1 christos symtab_size = (symcount + 1) * (sizeof (asymbol *));
7826 1.1 christos if (symcount > 0)
7827 1.1 christos symtab_size -= sizeof (asymbol *);
7828 1.1 christos
7829 1.1 christos return symtab_size;
7830 1.1 christos }
7831 1.1 christos
7832 1.1 christos long
7833 1.1 christos _bfd_elf_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
7834 1.1 christos sec_ptr asect)
7835 1.1 christos {
7836 1.1 christos return (asect->reloc_count + 1) * sizeof (arelent *);
7837 1.1 christos }
7838 1.1 christos
7839 1.1 christos /* Canonicalize the relocs. */
7840 1.1 christos
7841 1.1 christos long
7842 1.1 christos _bfd_elf_canonicalize_reloc (bfd *abfd,
7843 1.1 christos sec_ptr section,
7844 1.1 christos arelent **relptr,
7845 1.1 christos asymbol **symbols)
7846 1.1 christos {
7847 1.1 christos arelent *tblptr;
7848 1.1 christos unsigned int i;
7849 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7850 1.1 christos
7851 1.1 christos if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
7852 1.1 christos return -1;
7853 1.1 christos
7854 1.1 christos tblptr = section->relocation;
7855 1.1 christos for (i = 0; i < section->reloc_count; i++)
7856 1.1 christos *relptr++ = tblptr++;
7857 1.1 christos
7858 1.1 christos *relptr = NULL;
7859 1.1 christos
7860 1.1 christos return section->reloc_count;
7861 1.1 christos }
7862 1.1 christos
7863 1.1 christos long
7864 1.1 christos _bfd_elf_canonicalize_symtab (bfd *abfd, asymbol **allocation)
7865 1.1 christos {
7866 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7867 1.1 christos long symcount = bed->s->slurp_symbol_table (abfd, allocation, FALSE);
7868 1.1 christos
7869 1.1 christos if (symcount >= 0)
7870 1.1 christos bfd_get_symcount (abfd) = symcount;
7871 1.1 christos return symcount;
7872 1.1 christos }
7873 1.1 christos
7874 1.1 christos long
7875 1.1 christos _bfd_elf_canonicalize_dynamic_symtab (bfd *abfd,
7876 1.1 christos asymbol **allocation)
7877 1.1 christos {
7878 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7879 1.1 christos long symcount = bed->s->slurp_symbol_table (abfd, allocation, TRUE);
7880 1.1 christos
7881 1.1 christos if (symcount >= 0)
7882 1.1 christos bfd_get_dynamic_symcount (abfd) = symcount;
7883 1.1 christos return symcount;
7884 1.1 christos }
7885 1.1 christos
7886 1.1 christos /* Return the size required for the dynamic reloc entries. Any loadable
7887 1.1 christos section that was actually installed in the BFD, and has type SHT_REL
7888 1.1 christos or SHT_RELA, and uses the dynamic symbol table, is considered to be a
7889 1.1 christos dynamic reloc section. */
7890 1.1 christos
7891 1.1 christos long
7892 1.1 christos _bfd_elf_get_dynamic_reloc_upper_bound (bfd *abfd)
7893 1.1 christos {
7894 1.1 christos long ret;
7895 1.1 christos asection *s;
7896 1.1 christos
7897 1.1 christos if (elf_dynsymtab (abfd) == 0)
7898 1.1 christos {
7899 1.1 christos bfd_set_error (bfd_error_invalid_operation);
7900 1.1 christos return -1;
7901 1.1 christos }
7902 1.1 christos
7903 1.1 christos ret = sizeof (arelent *);
7904 1.1 christos for (s = abfd->sections; s != NULL; s = s->next)
7905 1.1 christos if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
7906 1.1 christos && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
7907 1.1 christos || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
7908 1.1 christos ret += ((s->size / elf_section_data (s)->this_hdr.sh_entsize)
7909 1.1 christos * sizeof (arelent *));
7910 1.1 christos
7911 1.1 christos return ret;
7912 1.1 christos }
7913 1.1 christos
7914 1.1 christos /* Canonicalize the dynamic relocation entries. Note that we return the
7915 1.1 christos dynamic relocations as a single block, although they are actually
7916 1.1 christos associated with particular sections; the interface, which was
7917 1.1 christos designed for SunOS style shared libraries, expects that there is only
7918 1.1 christos one set of dynamic relocs. Any loadable section that was actually
7919 1.1 christos installed in the BFD, and has type SHT_REL or SHT_RELA, and uses the
7920 1.1 christos dynamic symbol table, is considered to be a dynamic reloc section. */
7921 1.1 christos
7922 1.1 christos long
7923 1.1 christos _bfd_elf_canonicalize_dynamic_reloc (bfd *abfd,
7924 1.1 christos arelent **storage,
7925 1.1 christos asymbol **syms)
7926 1.1 christos {
7927 1.1 christos bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
7928 1.1 christos asection *s;
7929 1.1 christos long ret;
7930 1.1 christos
7931 1.1 christos if (elf_dynsymtab (abfd) == 0)
7932 1.1 christos {
7933 1.1 christos bfd_set_error (bfd_error_invalid_operation);
7934 1.1 christos return -1;
7935 1.1 christos }
7936 1.1 christos
7937 1.1 christos slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
7938 1.1 christos ret = 0;
7939 1.1 christos for (s = abfd->sections; s != NULL; s = s->next)
7940 1.1 christos {
7941 1.1 christos if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
7942 1.1 christos && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
7943 1.1 christos || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
7944 1.1 christos {
7945 1.1 christos arelent *p;
7946 1.1 christos long count, i;
7947 1.1 christos
7948 1.1 christos if (! (*slurp_relocs) (abfd, s, syms, TRUE))
7949 1.1 christos return -1;
7950 1.1 christos count = s->size / elf_section_data (s)->this_hdr.sh_entsize;
7951 1.1 christos p = s->relocation;
7952 1.1 christos for (i = 0; i < count; i++)
7953 1.1 christos *storage++ = p++;
7954 1.1 christos ret += count;
7955 1.1 christos }
7956 1.1 christos }
7957 1.1 christos
7958 1.1 christos *storage = NULL;
7959 1.1 christos
7960 1.1 christos return ret;
7961 1.1 christos }
7962 1.1 christos
7963 1.1 christos /* Read in the version information. */
7965 1.1 christos
7966 1.1 christos bfd_boolean
7967 1.1 christos _bfd_elf_slurp_version_tables (bfd *abfd, bfd_boolean default_imported_symver)
7968 1.1 christos {
7969 1.1 christos bfd_byte *contents = NULL;
7970 1.1 christos unsigned int freeidx = 0;
7971 1.1 christos
7972 1.1 christos if (elf_dynverref (abfd) != 0)
7973 1.1 christos {
7974 1.1 christos Elf_Internal_Shdr *hdr;
7975 1.1 christos Elf_External_Verneed *everneed;
7976 1.1 christos Elf_Internal_Verneed *iverneed;
7977 1.1 christos unsigned int i;
7978 1.1 christos bfd_byte *contents_end;
7979 1.5 christos
7980 1.1 christos hdr = &elf_tdata (abfd)->dynverref_hdr;
7981 1.5 christos
7982 1.5 christos if (hdr->sh_info == 0 || hdr->sh_size < sizeof (Elf_External_Verneed))
7983 1.5 christos {
7984 1.5 christos error_return_bad_verref:
7985 1.1 christos (*_bfd_error_handler)
7986 1.1 christos (_("%B: .gnu.version_r invalid entry"), abfd);
7987 1.1 christos bfd_set_error (bfd_error_bad_value);
7988 1.1 christos error_return_verref:
7989 1.1 christos elf_tdata (abfd)->verref = NULL;
7990 1.5 christos elf_tdata (abfd)->cverrefs = 0;
7991 1.5 christos goto error_return;
7992 1.5 christos }
7993 1.5 christos
7994 1.5 christos contents = (bfd_byte *) bfd_malloc (hdr->sh_size);
7995 1.1 christos if (contents == NULL)
7996 1.1 christos goto error_return_verref;
7997 1.1 christos
7998 1.1 christos if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
7999 1.5 christos || bfd_bread (contents, hdr->sh_size, abfd) != hdr->sh_size)
8000 1.5 christos goto error_return_verref;
8001 1.5 christos
8002 1.5 christos elf_tdata (abfd)->verref = (Elf_Internal_Verneed *)
8003 1.1 christos bfd_zalloc2 (abfd, hdr->sh_info, sizeof (Elf_Internal_Verneed));
8004 1.1 christos
8005 1.1 christos if (elf_tdata (abfd)->verref == NULL)
8006 1.1 christos goto error_return_verref;
8007 1.1 christos
8008 1.1 christos BFD_ASSERT (sizeof (Elf_External_Verneed)
8009 1.1 christos == sizeof (Elf_External_Vernaux));
8010 1.1 christos contents_end = contents + hdr->sh_size - sizeof (Elf_External_Verneed);
8011 1.1 christos everneed = (Elf_External_Verneed *) contents;
8012 1.1 christos iverneed = elf_tdata (abfd)->verref;
8013 1.1 christos for (i = 0; i < hdr->sh_info; i++, iverneed++)
8014 1.1 christos {
8015 1.1 christos Elf_External_Vernaux *evernaux;
8016 1.1 christos Elf_Internal_Vernaux *ivernaux;
8017 1.1 christos unsigned int j;
8018 1.1 christos
8019 1.1 christos _bfd_elf_swap_verneed_in (abfd, everneed, iverneed);
8020 1.1 christos
8021 1.1 christos iverneed->vn_bfd = abfd;
8022 1.1 christos
8023 1.1 christos iverneed->vn_filename =
8024 1.5 christos bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
8025 1.1 christos iverneed->vn_file);
8026 1.1 christos if (iverneed->vn_filename == NULL)
8027 1.1 christos goto error_return_bad_verref;
8028 1.1 christos
8029 1.1 christos if (iverneed->vn_cnt == 0)
8030 1.1 christos iverneed->vn_auxptr = NULL;
8031 1.1 christos else
8032 1.1 christos {
8033 1.1 christos iverneed->vn_auxptr = (struct elf_internal_vernaux *)
8034 1.1 christos bfd_alloc2 (abfd, iverneed->vn_cnt,
8035 1.1 christos sizeof (Elf_Internal_Vernaux));
8036 1.1 christos if (iverneed->vn_auxptr == NULL)
8037 1.1 christos goto error_return_verref;
8038 1.1 christos }
8039 1.5 christos
8040 1.1 christos if (iverneed->vn_aux
8041 1.1 christos > (size_t) (contents_end - (bfd_byte *) everneed))
8042 1.1 christos goto error_return_bad_verref;
8043 1.1 christos
8044 1.1 christos evernaux = ((Elf_External_Vernaux *)
8045 1.1 christos ((bfd_byte *) everneed + iverneed->vn_aux));
8046 1.1 christos ivernaux = iverneed->vn_auxptr;
8047 1.1 christos for (j = 0; j < iverneed->vn_cnt; j++, ivernaux++)
8048 1.1 christos {
8049 1.1 christos _bfd_elf_swap_vernaux_in (abfd, evernaux, ivernaux);
8050 1.1 christos
8051 1.1 christos ivernaux->vna_nodename =
8052 1.5 christos bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
8053 1.5 christos ivernaux->vna_name);
8054 1.5 christos if (ivernaux->vna_nodename == NULL)
8055 1.5 christos goto error_return_bad_verref;
8056 1.1 christos
8057 1.5 christos if (ivernaux->vna_other > freeidx)
8058 1.5 christos freeidx = ivernaux->vna_other;
8059 1.5 christos
8060 1.5 christos ivernaux->vna_nextptr = NULL;
8061 1.5 christos if (ivernaux->vna_next == 0)
8062 1.5 christos {
8063 1.1 christos iverneed->vn_cnt = j + 1;
8064 1.1 christos break;
8065 1.1 christos }
8066 1.1 christos if (j + 1 < iverneed->vn_cnt)
8067 1.1 christos ivernaux->vna_nextptr = ivernaux + 1;
8068 1.5 christos
8069 1.1 christos if (ivernaux->vna_next
8070 1.1 christos > (size_t) (contents_end - (bfd_byte *) evernaux))
8071 1.1 christos goto error_return_bad_verref;
8072 1.1 christos
8073 1.1 christos evernaux = ((Elf_External_Vernaux *)
8074 1.5 christos ((bfd_byte *) evernaux + ivernaux->vna_next));
8075 1.5 christos }
8076 1.5 christos
8077 1.1 christos iverneed->vn_nextref = NULL;
8078 1.1 christos if (iverneed->vn_next == 0)
8079 1.1 christos break;
8080 1.1 christos if (i + 1 < hdr->sh_info)
8081 1.1 christos iverneed->vn_nextref = iverneed + 1;
8082 1.5 christos
8083 1.1 christos if (iverneed->vn_next
8084 1.1 christos > (size_t) (contents_end - (bfd_byte *) everneed))
8085 1.1 christos goto error_return_bad_verref;
8086 1.1 christos
8087 1.5 christos everneed = ((Elf_External_Verneed *)
8088 1.1 christos ((bfd_byte *) everneed + iverneed->vn_next));
8089 1.1 christos }
8090 1.1 christos elf_tdata (abfd)->cverrefs = i;
8091 1.1 christos
8092 1.1 christos free (contents);
8093 1.1 christos contents = NULL;
8094 1.1 christos }
8095 1.1 christos
8096 1.1 christos if (elf_dynverdef (abfd) != 0)
8097 1.1 christos {
8098 1.1 christos Elf_Internal_Shdr *hdr;
8099 1.1 christos Elf_External_Verdef *everdef;
8100 1.1 christos Elf_Internal_Verdef *iverdef;
8101 1.1 christos Elf_Internal_Verdef *iverdefarr;
8102 1.1 christos Elf_Internal_Verdef iverdefmem;
8103 1.1 christos unsigned int i;
8104 1.1 christos unsigned int maxidx;
8105 1.1 christos bfd_byte *contents_end_def, *contents_end_aux;
8106 1.5 christos
8107 1.5 christos hdr = &elf_tdata (abfd)->dynverdef_hdr;
8108 1.5 christos
8109 1.5 christos if (hdr->sh_info == 0 || hdr->sh_size < sizeof (Elf_External_Verdef))
8110 1.5 christos {
8111 1.5 christos error_return_bad_verdef:
8112 1.5 christos (*_bfd_error_handler)
8113 1.5 christos (_("%B: .gnu.version_d invalid entry"), abfd);
8114 1.5 christos bfd_set_error (bfd_error_bad_value);
8115 1.5 christos error_return_verdef:
8116 1.5 christos elf_tdata (abfd)->verdef = NULL;
8117 1.5 christos elf_tdata (abfd)->cverdefs = 0;
8118 1.1 christos goto error_return;
8119 1.1 christos }
8120 1.5 christos
8121 1.1 christos contents = (bfd_byte *) bfd_malloc (hdr->sh_size);
8122 1.1 christos if (contents == NULL)
8123 1.5 christos goto error_return_verdef;
8124 1.1 christos if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
8125 1.1 christos || bfd_bread (contents, hdr->sh_size, abfd) != hdr->sh_size)
8126 1.1 christos goto error_return_verdef;
8127 1.1 christos
8128 1.1 christos BFD_ASSERT (sizeof (Elf_External_Verdef)
8129 1.1 christos >= sizeof (Elf_External_Verdaux));
8130 1.1 christos contents_end_def = contents + hdr->sh_size
8131 1.1 christos - sizeof (Elf_External_Verdef);
8132 1.1 christos contents_end_aux = contents + hdr->sh_size
8133 1.1 christos - sizeof (Elf_External_Verdaux);
8134 1.1 christos
8135 1.1 christos /* We know the number of entries in the section but not the maximum
8136 1.1 christos index. Therefore we have to run through all entries and find
8137 1.1 christos the maximum. */
8138 1.1 christos everdef = (Elf_External_Verdef *) contents;
8139 1.1 christos maxidx = 0;
8140 1.1 christos for (i = 0; i < hdr->sh_info; ++i)
8141 1.5 christos {
8142 1.5 christos _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
8143 1.1 christos
8144 1.1 christos if ((iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION)) == 0)
8145 1.1 christos goto error_return_bad_verdef;
8146 1.5 christos if ((iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION)) > maxidx)
8147 1.5 christos maxidx = iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION);
8148 1.5 christos
8149 1.1 christos if (iverdefmem.vd_next == 0)
8150 1.1 christos break;
8151 1.5 christos
8152 1.1 christos if (iverdefmem.vd_next
8153 1.1 christos > (size_t) (contents_end_def - (bfd_byte *) everdef))
8154 1.1 christos goto error_return_bad_verdef;
8155 1.1 christos
8156 1.1 christos everdef = ((Elf_External_Verdef *)
8157 1.1 christos ((bfd_byte *) everdef + iverdefmem.vd_next));
8158 1.1 christos }
8159 1.1 christos
8160 1.1 christos if (default_imported_symver)
8161 1.1 christos {
8162 1.1 christos if (freeidx > maxidx)
8163 1.1 christos maxidx = ++freeidx;
8164 1.5 christos else
8165 1.1 christos freeidx = ++maxidx;
8166 1.5 christos }
8167 1.1 christos
8168 1.5 christos elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *)
8169 1.1 christos bfd_zalloc2 (abfd, maxidx, sizeof (Elf_Internal_Verdef));
8170 1.1 christos if (elf_tdata (abfd)->verdef == NULL)
8171 1.1 christos goto error_return_verdef;
8172 1.1 christos
8173 1.1 christos elf_tdata (abfd)->cverdefs = maxidx;
8174 1.1 christos
8175 1.1 christos everdef = (Elf_External_Verdef *) contents;
8176 1.1 christos iverdefarr = elf_tdata (abfd)->verdef;
8177 1.1 christos for (i = 0; i < hdr->sh_info; i++)
8178 1.1 christos {
8179 1.1 christos Elf_External_Verdaux *everdaux;
8180 1.1 christos Elf_Internal_Verdaux *iverdaux;
8181 1.1 christos unsigned int j;
8182 1.1 christos
8183 1.5 christos _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
8184 1.1 christos
8185 1.1 christos if ((iverdefmem.vd_ndx & VERSYM_VERSION) == 0)
8186 1.8 christos goto error_return_bad_verdef;
8187 1.1 christos
8188 1.1 christos iverdef = &iverdefarr[(iverdefmem.vd_ndx & VERSYM_VERSION) - 1];
8189 1.1 christos memcpy (iverdef, &iverdefmem, offsetof (Elf_Internal_Verdef, vd_bfd));
8190 1.1 christos
8191 1.1 christos iverdef->vd_bfd = abfd;
8192 1.1 christos
8193 1.1 christos if (iverdef->vd_cnt == 0)
8194 1.1 christos iverdef->vd_auxptr = NULL;
8195 1.1 christos else
8196 1.1 christos {
8197 1.1 christos iverdef->vd_auxptr = (struct elf_internal_verdaux *)
8198 1.1 christos bfd_alloc2 (abfd, iverdef->vd_cnt,
8199 1.1 christos sizeof (Elf_Internal_Verdaux));
8200 1.1 christos if (iverdef->vd_auxptr == NULL)
8201 1.1 christos goto error_return_verdef;
8202 1.1 christos }
8203 1.5 christos
8204 1.1 christos if (iverdef->vd_aux
8205 1.1 christos > (size_t) (contents_end_aux - (bfd_byte *) everdef))
8206 1.1 christos goto error_return_bad_verdef;
8207 1.1 christos
8208 1.1 christos everdaux = ((Elf_External_Verdaux *)
8209 1.1 christos ((bfd_byte *) everdef + iverdef->vd_aux));
8210 1.1 christos iverdaux = iverdef->vd_auxptr;
8211 1.1 christos for (j = 0; j < iverdef->vd_cnt; j++, iverdaux++)
8212 1.1 christos {
8213 1.1 christos _bfd_elf_swap_verdaux_in (abfd, everdaux, iverdaux);
8214 1.1 christos
8215 1.1 christos iverdaux->vda_nodename =
8216 1.5 christos bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
8217 1.1 christos iverdaux->vda_name);
8218 1.5 christos if (iverdaux->vda_nodename == NULL)
8219 1.5 christos goto error_return_bad_verdef;
8220 1.5 christos
8221 1.5 christos iverdaux->vda_nextptr = NULL;
8222 1.5 christos if (iverdaux->vda_next == 0)
8223 1.5 christos {
8224 1.1 christos iverdef->vd_cnt = j + 1;
8225 1.1 christos break;
8226 1.1 christos }
8227 1.1 christos if (j + 1 < iverdef->vd_cnt)
8228 1.1 christos iverdaux->vda_nextptr = iverdaux + 1;
8229 1.5 christos
8230 1.1 christos if (iverdaux->vda_next
8231 1.1 christos > (size_t) (contents_end_aux - (bfd_byte *) everdaux))
8232 1.1 christos goto error_return_bad_verdef;
8233 1.1 christos
8234 1.1 christos everdaux = ((Elf_External_Verdaux *)
8235 1.8 christos ((bfd_byte *) everdaux + iverdaux->vda_next));
8236 1.1 christos }
8237 1.1 christos
8238 1.1 christos iverdef->vd_nodename = NULL;
8239 1.5 christos if (iverdef->vd_cnt)
8240 1.5 christos iverdef->vd_nodename = iverdef->vd_auxptr->vda_nodename;
8241 1.5 christos
8242 1.1 christos iverdef->vd_nextdef = NULL;
8243 1.1 christos if (iverdef->vd_next == 0)
8244 1.1 christos break;
8245 1.1 christos if ((size_t) (iverdef - iverdefarr) + 1 < maxidx)
8246 1.1 christos iverdef->vd_nextdef = iverdef + 1;
8247 1.1 christos
8248 1.1 christos everdef = ((Elf_External_Verdef *)
8249 1.1 christos ((bfd_byte *) everdef + iverdef->vd_next));
8250 1.1 christos }
8251 1.1 christos
8252 1.1 christos free (contents);
8253 1.1 christos contents = NULL;
8254 1.1 christos }
8255 1.1 christos else if (default_imported_symver)
8256 1.1 christos {
8257 1.1 christos if (freeidx < 3)
8258 1.1 christos freeidx = 3;
8259 1.1 christos else
8260 1.1 christos freeidx++;
8261 1.1 christos
8262 1.1 christos elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *)
8263 1.1 christos bfd_zalloc2 (abfd, freeidx, sizeof (Elf_Internal_Verdef));
8264 1.1 christos if (elf_tdata (abfd)->verdef == NULL)
8265 1.1 christos goto error_return;
8266 1.1 christos
8267 1.1 christos elf_tdata (abfd)->cverdefs = freeidx;
8268 1.1 christos }
8269 1.1 christos
8270 1.1 christos /* Create a default version based on the soname. */
8271 1.1 christos if (default_imported_symver)
8272 1.1 christos {
8273 1.3 christos Elf_Internal_Verdef *iverdef;
8274 1.1 christos Elf_Internal_Verdaux *iverdaux;
8275 1.1 christos
8276 1.1 christos iverdef = &elf_tdata (abfd)->verdef[freeidx - 1];
8277 1.1 christos
8278 1.1 christos iverdef->vd_version = VER_DEF_CURRENT;
8279 1.1 christos iverdef->vd_flags = 0;
8280 1.1 christos iverdef->vd_ndx = freeidx;
8281 1.1 christos iverdef->vd_cnt = 1;
8282 1.1 christos
8283 1.1 christos iverdef->vd_bfd = abfd;
8284 1.1 christos
8285 1.1 christos iverdef->vd_nodename = bfd_elf_get_dt_soname (abfd);
8286 1.5 christos if (iverdef->vd_nodename == NULL)
8287 1.5 christos goto error_return_verdef;
8288 1.1 christos iverdef->vd_nextdef = NULL;
8289 1.1 christos iverdef->vd_auxptr = ((struct elf_internal_verdaux *)
8290 1.1 christos bfd_zalloc (abfd, sizeof (Elf_Internal_Verdaux)));
8291 1.1 christos if (iverdef->vd_auxptr == NULL)
8292 1.1 christos goto error_return_verdef;
8293 1.1 christos
8294 1.1 christos iverdaux = iverdef->vd_auxptr;
8295 1.1 christos iverdaux->vda_nodename = iverdef->vd_nodename;
8296 1.1 christos }
8297 1.1 christos
8298 1.1 christos return TRUE;
8299 1.1 christos
8300 1.1 christos error_return:
8301 1.1 christos if (contents != NULL)
8302 1.1 christos free (contents);
8303 1.1 christos return FALSE;
8304 1.1 christos }
8305 1.1 christos
8306 1.1 christos asymbol *
8308 1.5 christos _bfd_elf_make_empty_symbol (bfd *abfd)
8309 1.1 christos {
8310 1.1 christos elf_symbol_type *newsym;
8311 1.5 christos
8312 1.5 christos newsym = (elf_symbol_type *) bfd_zalloc (abfd, sizeof * newsym);
8313 1.1 christos if (!newsym)
8314 1.1 christos return NULL;
8315 1.1 christos newsym->symbol.the_bfd = abfd;
8316 1.1 christos return &newsym->symbol;
8317 1.1 christos }
8318 1.1 christos
8319 1.1 christos void
8320 1.1 christos _bfd_elf_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
8321 1.1 christos asymbol *symbol,
8322 1.1 christos symbol_info *ret)
8323 1.1 christos {
8324 1.1 christos bfd_symbol_info (symbol, ret);
8325 1.1 christos }
8326 1.1 christos
8327 1.1 christos /* Return whether a symbol name implies a local symbol. Most targets
8328 1.1 christos use this function for the is_local_label_name entry point, but some
8329 1.1 christos override it. */
8330 1.1 christos
8331 1.1 christos bfd_boolean
8332 1.1 christos _bfd_elf_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
8333 1.1 christos const char *name)
8334 1.1 christos {
8335 1.1 christos /* Normal local symbols start with ``.L''. */
8336 1.1 christos if (name[0] == '.' && name[1] == 'L')
8337 1.1 christos return TRUE;
8338 1.1 christos
8339 1.1 christos /* At least some SVR4 compilers (e.g., UnixWare 2.1 cc) generate
8340 1.1 christos DWARF debugging symbols starting with ``..''. */
8341 1.1 christos if (name[0] == '.' && name[1] == '.')
8342 1.1 christos return TRUE;
8343 1.1 christos
8344 1.1 christos /* gcc will sometimes generate symbols beginning with ``_.L_'' when
8345 1.1 christos emitting DWARF debugging output. I suspect this is actually a
8346 1.1 christos small bug in gcc (it calls ASM_OUTPUT_LABEL when it should call
8347 1.1 christos ASM_GENERATE_INTERNAL_LABEL, and this causes the leading
8348 1.1 christos underscore to be emitted on some ELF targets). For ease of use,
8349 1.6 christos we treat such symbols as local. */
8350 1.6 christos if (name[0] == '_' && name[1] == '.' && name[2] == 'L' && name[3] == '_')
8351 1.6 christos return TRUE;
8352 1.6 christos
8353 1.6 christos /* Treat assembler generated fake symbols, dollar local labels and
8354 1.6 christos forward-backward labels (aka local labels) as locals.
8355 1.6 christos These labels have the form:
8356 1.6 christos
8357 1.6 christos L0^A.* (fake symbols)
8358 1.6 christos
8359 1.6 christos [.]?L[0123456789]+{^A|^B}[0123456789]* (local labels)
8360 1.6 christos
8361 1.6 christos Versions which start with .L will have already been matched above,
8362 1.6 christos so we only need to match the rest. */
8363 1.6 christos if (name[0] == 'L' && ISDIGIT (name[1]))
8364 1.6 christos {
8365 1.6 christos bfd_boolean ret = FALSE;
8366 1.6 christos const char * p;
8367 1.6 christos char c;
8368 1.6 christos
8369 1.6 christos for (p = name + 2; (c = *p); p++)
8370 1.6 christos {
8371 1.6 christos if (c == 1 || c == 2)
8372 1.6 christos {
8373 1.6 christos if (c == 1 && p == name + 2)
8374 1.6 christos /* A fake symbol. */
8375 1.6 christos return TRUE;
8376 1.6 christos
8377 1.6 christos /* FIXME: We are being paranoid here and treating symbols like
8378 1.6 christos L0^Bfoo as if there were non-local, on the grounds that the
8379 1.6 christos assembler will never generate them. But can any symbol
8380 1.6 christos containing an ASCII value in the range 1-31 ever be anything
8381 1.6 christos other than some kind of local ? */
8382 1.6 christos ret = TRUE;
8383 1.6 christos }
8384 1.6 christos
8385 1.6 christos if (! ISDIGIT (c))
8386 1.6 christos {
8387 1.6 christos ret = FALSE;
8388 1.6 christos break;
8389 1.6 christos }
8390 1.1 christos }
8391 1.1 christos return ret;
8392 1.1 christos }
8393 1.1 christos
8394 1.1 christos return FALSE;
8395 1.1 christos }
8396 1.1 christos
8397 1.1 christos alent *
8398 1.1 christos _bfd_elf_get_lineno (bfd *abfd ATTRIBUTE_UNUSED,
8399 1.1 christos asymbol *symbol ATTRIBUTE_UNUSED)
8400 1.1 christos {
8401 1.1 christos abort ();
8402 1.1 christos return NULL;
8403 1.1 christos }
8404 1.1 christos
8405 1.1 christos bfd_boolean
8406 1.1 christos _bfd_elf_set_arch_mach (bfd *abfd,
8407 1.1 christos enum bfd_architecture arch,
8408 1.1 christos unsigned long machine)
8409 1.1 christos {
8410 1.1 christos /* If this isn't the right architecture for this backend, and this
8411 1.1 christos isn't the generic backend, fail. */
8412 1.1 christos if (arch != get_elf_backend_data (abfd)->arch
8413 1.1 christos && arch != bfd_arch_unknown
8414 1.1 christos && get_elf_backend_data (abfd)->arch != bfd_arch_unknown)
8415 1.1 christos return FALSE;
8416 1.1 christos
8417 1.1 christos return bfd_default_set_arch_mach (abfd, arch, machine);
8418 1.1 christos }
8419 1.1 christos
8420 1.1 christos /* Find the nearest line to a particular section and offset,
8421 1.5 christos for error reporting. */
8422 1.1 christos
8423 1.1 christos bfd_boolean
8424 1.1 christos _bfd_elf_find_nearest_line (bfd *abfd,
8425 1.1 christos asymbol **symbols,
8426 1.5 christos asection *section,
8427 1.5 christos bfd_vma offset,
8428 1.3 christos const char **filename_ptr,
8429 1.1 christos const char **functionname_ptr,
8430 1.1 christos unsigned int *line_ptr,
8431 1.5 christos unsigned int *discriminator_ptr)
8432 1.1 christos {
8433 1.5 christos bfd_boolean found;
8434 1.5 christos
8435 1.5 christos if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
8436 1.5 christos filename_ptr, functionname_ptr,
8437 1.5 christos line_ptr, discriminator_ptr,
8438 1.5 christos dwarf_debug_sections, 0,
8439 1.1 christos &elf_tdata (abfd)->dwarf2_find_line_info)
8440 1.1 christos || _bfd_dwarf1_find_nearest_line (abfd, symbols, section, offset,
8441 1.5 christos filename_ptr, functionname_ptr,
8442 1.5 christos line_ptr))
8443 1.5 christos {
8444 1.1 christos if (!*functionname_ptr)
8445 1.1 christos _bfd_elf_find_function (abfd, symbols, section, offset,
8446 1.1 christos *filename_ptr ? NULL : filename_ptr,
8447 1.1 christos functionname_ptr);
8448 1.1 christos return TRUE;
8449 1.1 christos }
8450 1.1 christos
8451 1.1 christos if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
8452 1.1 christos &found, filename_ptr,
8453 1.1 christos functionname_ptr, line_ptr,
8454 1.1 christos &elf_tdata (abfd)->line_info))
8455 1.1 christos return FALSE;
8456 1.1 christos if (found && (*functionname_ptr || *line_ptr))
8457 1.1 christos return TRUE;
8458 1.5 christos
8459 1.5 christos if (symbols == NULL)
8460 1.1 christos return FALSE;
8461 1.1 christos
8462 1.1 christos if (! _bfd_elf_find_function (abfd, symbols, section, offset,
8463 1.1 christos filename_ptr, functionname_ptr))
8464 1.1 christos return FALSE;
8465 1.1 christos
8466 1.1 christos *line_ptr = 0;
8467 1.1 christos return TRUE;
8468 1.1 christos }
8469 1.1 christos
8470 1.1 christos /* Find the line for a symbol. */
8471 1.1 christos
8472 1.5 christos bfd_boolean
8473 1.5 christos _bfd_elf_find_line (bfd *abfd, asymbol **symbols, asymbol *symbol,
8474 1.5 christos const char **filename_ptr, unsigned int *line_ptr)
8475 1.5 christos {
8476 1.1 christos return _bfd_dwarf2_find_nearest_line (abfd, symbols, symbol, NULL, 0,
8477 1.1 christos filename_ptr, NULL, line_ptr, NULL,
8478 1.1 christos dwarf_debug_sections, 0,
8479 1.1 christos &elf_tdata (abfd)->dwarf2_find_line_info);
8480 1.1 christos }
8481 1.1 christos
8482 1.1 christos /* After a call to bfd_find_nearest_line, successive calls to
8483 1.1 christos bfd_find_inliner_info can be used to get source information about
8484 1.1 christos each level of function inlining that terminated at the address
8485 1.1 christos passed to bfd_find_nearest_line. Currently this is only supported
8486 1.1 christos for DWARF2 with appropriate DWARF3 extensions. */
8487 1.1 christos
8488 1.1 christos bfd_boolean
8489 1.1 christos _bfd_elf_find_inliner_info (bfd *abfd,
8490 1.1 christos const char **filename_ptr,
8491 1.1 christos const char **functionname_ptr,
8492 1.1 christos unsigned int *line_ptr)
8493 1.1 christos {
8494 1.1 christos bfd_boolean found;
8495 1.1 christos found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
8496 1.1 christos functionname_ptr, line_ptr,
8497 1.1 christos & elf_tdata (abfd)->dwarf2_find_line_info);
8498 1.1 christos return found;
8499 1.1 christos }
8500 1.1 christos
8501 1.1 christos int
8502 1.1 christos _bfd_elf_sizeof_headers (bfd *abfd, struct bfd_link_info *info)
8503 1.8 christos {
8504 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
8505 1.3 christos int ret = bed->s->sizeof_ehdr;
8506 1.1 christos
8507 1.1 christos if (!bfd_link_relocatable (info))
8508 1.1 christos {
8509 1.1 christos bfd_size_type phdr_size = elf_program_header_size (abfd);
8510 1.1 christos
8511 1.1 christos if (phdr_size == (bfd_size_type) -1)
8512 1.3 christos {
8513 1.1 christos struct elf_segment_map *m;
8514 1.1 christos
8515 1.1 christos phdr_size = 0;
8516 1.1 christos for (m = elf_seg_map (abfd); m != NULL; m = m->next)
8517 1.1 christos phdr_size += bed->s->sizeof_phdr;
8518 1.1 christos
8519 1.3 christos if (phdr_size == 0)
8520 1.1 christos phdr_size = get_program_header_size (abfd, info);
8521 1.1 christos }
8522 1.1 christos
8523 1.1 christos elf_program_header_size (abfd) = phdr_size;
8524 1.1 christos ret += phdr_size;
8525 1.1 christos }
8526 1.1 christos
8527 1.1 christos return ret;
8528 1.1 christos }
8529 1.1 christos
8530 1.1 christos bfd_boolean
8531 1.1 christos _bfd_elf_set_section_contents (bfd *abfd,
8532 1.1 christos sec_ptr section,
8533 1.1 christos const void *location,
8534 1.5 christos file_ptr offset,
8535 1.1 christos bfd_size_type count)
8536 1.1 christos {
8537 1.1 christos Elf_Internal_Shdr *hdr;
8538 1.1 christos file_ptr pos;
8539 1.1 christos
8540 1.6 christos if (! abfd->output_has_begun
8541 1.6 christos && ! _bfd_elf_compute_section_file_positions (abfd, NULL))
8542 1.6 christos return FALSE;
8543 1.1 christos
8544 1.6 christos if (!count)
8545 1.6 christos return TRUE;
8546 1.6 christos
8547 1.6 christos hdr = &elf_section_data (section)->this_hdr;
8548 1.6 christos if (hdr->sh_offset == (file_ptr) -1)
8549 1.6 christos {
8550 1.6 christos /* We must compress this section. Write output to the buffer. */
8551 1.6 christos unsigned char *contents = hdr->contents;
8552 1.6 christos if ((offset + count) > hdr->sh_size
8553 1.6 christos || (section->flags & SEC_ELF_COMPRESS) == 0
8554 1.6 christos || contents == NULL)
8555 1.1 christos abort ();
8556 1.1 christos memcpy (contents + offset, location, count);
8557 1.1 christos return TRUE;
8558 1.1 christos }
8559 1.1 christos pos = hdr->sh_offset + offset;
8560 1.1 christos if (bfd_seek (abfd, pos, SEEK_SET) != 0
8561 1.1 christos || bfd_bwrite (location, count, abfd) != count)
8562 1.1 christos return FALSE;
8563 1.1 christos
8564 1.1 christos return TRUE;
8565 1.1 christos }
8566 1.1 christos
8567 1.1 christos void
8568 1.1 christos _bfd_elf_no_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
8569 1.1 christos arelent *cache_ptr ATTRIBUTE_UNUSED,
8570 1.1 christos Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
8571 1.1 christos {
8572 1.1 christos abort ();
8573 1.1 christos }
8574 1.1 christos
8575 1.1 christos /* Try to convert a non-ELF reloc into an ELF one. */
8576 1.1 christos
8577 1.1 christos bfd_boolean
8578 1.1 christos _bfd_elf_validate_reloc (bfd *abfd, arelent *areloc)
8579 1.1 christos {
8580 1.1 christos /* Check whether we really have an ELF howto. */
8581 1.1 christos
8582 1.1 christos if ((*areloc->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec)
8583 1.1 christos {
8584 1.1 christos bfd_reloc_code_real_type code;
8585 1.1 christos reloc_howto_type *howto;
8586 1.1 christos
8587 1.1 christos /* Alien reloc: Try to determine its type to replace it with an
8588 1.1 christos equivalent ELF reloc. */
8589 1.1 christos
8590 1.1 christos if (areloc->howto->pc_relative)
8591 1.1 christos {
8592 1.1 christos switch (areloc->howto->bitsize)
8593 1.1 christos {
8594 1.1 christos case 8:
8595 1.1 christos code = BFD_RELOC_8_PCREL;
8596 1.1 christos break;
8597 1.1 christos case 12:
8598 1.1 christos code = BFD_RELOC_12_PCREL;
8599 1.1 christos break;
8600 1.1 christos case 16:
8601 1.1 christos code = BFD_RELOC_16_PCREL;
8602 1.1 christos break;
8603 1.1 christos case 24:
8604 1.1 christos code = BFD_RELOC_24_PCREL;
8605 1.1 christos break;
8606 1.1 christos case 32:
8607 1.1 christos code = BFD_RELOC_32_PCREL;
8608 1.1 christos break;
8609 1.1 christos case 64:
8610 1.1 christos code = BFD_RELOC_64_PCREL;
8611 1.1 christos break;
8612 1.1 christos default:
8613 1.1 christos goto fail;
8614 1.1 christos }
8615 1.1 christos
8616 1.1 christos howto = bfd_reloc_type_lookup (abfd, code);
8617 1.1 christos
8618 1.1 christos if (areloc->howto->pcrel_offset != howto->pcrel_offset)
8619 1.1 christos {
8620 1.1 christos if (howto->pcrel_offset)
8621 1.1 christos areloc->addend += areloc->address;
8622 1.1 christos else
8623 1.1 christos areloc->addend -= areloc->address; /* addend is unsigned!! */
8624 1.1 christos }
8625 1.1 christos }
8626 1.1 christos else
8627 1.1 christos {
8628 1.1 christos switch (areloc->howto->bitsize)
8629 1.1 christos {
8630 1.1 christos case 8:
8631 1.1 christos code = BFD_RELOC_8;
8632 1.1 christos break;
8633 1.1 christos case 14:
8634 1.1 christos code = BFD_RELOC_14;
8635 1.1 christos break;
8636 1.1 christos case 16:
8637 1.1 christos code = BFD_RELOC_16;
8638 1.1 christos break;
8639 1.1 christos case 26:
8640 1.1 christos code = BFD_RELOC_26;
8641 1.1 christos break;
8642 1.1 christos case 32:
8643 1.1 christos code = BFD_RELOC_32;
8644 1.1 christos break;
8645 1.1 christos case 64:
8646 1.1 christos code = BFD_RELOC_64;
8647 1.1 christos break;
8648 1.1 christos default:
8649 1.1 christos goto fail;
8650 1.1 christos }
8651 1.1 christos
8652 1.1 christos howto = bfd_reloc_type_lookup (abfd, code);
8653 1.1 christos }
8654 1.1 christos
8655 1.1 christos if (howto)
8656 1.1 christos areloc->howto = howto;
8657 1.1 christos else
8658 1.1 christos goto fail;
8659 1.1 christos }
8660 1.1 christos
8661 1.1 christos return TRUE;
8662 1.1 christos
8663 1.1 christos fail:
8664 1.1 christos (*_bfd_error_handler)
8665 1.1 christos (_("%B: unsupported relocation type %s"),
8666 1.1 christos abfd, areloc->howto->name);
8667 1.1 christos bfd_set_error (bfd_error_bad_value);
8668 1.1 christos return FALSE;
8669 1.1 christos }
8670 1.3 christos
8671 1.3 christos bfd_boolean
8672 1.1 christos _bfd_elf_close_and_cleanup (bfd *abfd)
8673 1.3 christos {
8674 1.1 christos struct elf_obj_tdata *tdata = elf_tdata (abfd);
8675 1.3 christos if (bfd_get_format (abfd) == bfd_object && tdata != NULL)
8676 1.1 christos {
8677 1.1 christos if (elf_tdata (abfd)->o != NULL && elf_shstrtab (abfd) != NULL)
8678 1.1 christos _bfd_elf_strtab_free (elf_shstrtab (abfd));
8679 1.1 christos _bfd_dwarf2_cleanup_debug_info (abfd, &tdata->dwarf2_find_line_info);
8680 1.1 christos }
8681 1.1 christos
8682 1.1 christos return _bfd_generic_close_and_cleanup (abfd);
8683 1.1 christos }
8684 1.1 christos
8685 1.1 christos /* For Rel targets, we encode meaningful data for BFD_RELOC_VTABLE_ENTRY
8686 1.1 christos in the relocation's offset. Thus we cannot allow any sort of sanity
8687 1.1 christos range-checking to interfere. There is nothing else to do in processing
8688 1.1 christos this reloc. */
8689 1.1 christos
8690 1.1 christos bfd_reloc_status_type
8691 1.1 christos _bfd_elf_rel_vtable_reloc_fn
8692 1.1 christos (bfd *abfd ATTRIBUTE_UNUSED, arelent *re ATTRIBUTE_UNUSED,
8693 1.1 christos struct bfd_symbol *symbol ATTRIBUTE_UNUSED,
8694 1.1 christos void *data ATTRIBUTE_UNUSED, asection *is ATTRIBUTE_UNUSED,
8695 1.1 christos bfd *obfd ATTRIBUTE_UNUSED, char **errmsg ATTRIBUTE_UNUSED)
8696 1.1 christos {
8697 1.1 christos return bfd_reloc_ok;
8698 1.1 christos }
8699 1.1 christos
8700 1.1 christos /* Elf core file support. Much of this only works on native
8702 1.1 christos toolchains, since we rely on knowing the
8703 1.1 christos machine-dependent procfs structure in order to pick
8704 1.1 christos out details about the corefile. */
8705 1.1 christos
8706 1.1 christos #ifdef HAVE_SYS_PROCFS_H
8707 1.1 christos /* Needed for new procfs interface on sparc-solaris. */
8708 1.1 christos # define _STRUCTURED_PROC 1
8709 1.1 christos # include <sys/procfs.h>
8710 1.1 christos #endif
8711 1.1 christos
8712 1.1 christos /* Return a PID that identifies a "thread" for threaded cores, or the
8713 1.1 christos PID of the main process for non-threaded cores. */
8714 1.1 christos
8715 1.3 christos static int
8716 1.1 christos elfcore_make_pid (bfd *abfd)
8717 1.3 christos {
8718 1.1 christos int pid;
8719 1.1 christos
8720 1.1 christos pid = elf_tdata (abfd)->core->lwpid;
8721 1.1 christos if (pid == 0)
8722 1.1 christos pid = elf_tdata (abfd)->core->pid;
8723 1.1 christos
8724 1.1 christos return pid;
8725 1.1 christos }
8726 1.1 christos
8727 1.1 christos /* If there isn't a section called NAME, make one, using
8728 1.1 christos data from SECT. Note, this function will generate a
8729 1.1 christos reference to NAME, so you shouldn't deallocate or
8730 1.1 christos overwrite it. */
8731 1.1 christos
8732 1.1 christos static bfd_boolean
8733 1.1 christos elfcore_maybe_make_sect (bfd *abfd, char *name, asection *sect)
8734 1.1 christos {
8735 1.1 christos asection *sect2;
8736 1.1 christos
8737 1.1 christos if (bfd_get_section_by_name (abfd, name) != NULL)
8738 1.1 christos return TRUE;
8739 1.1 christos
8740 1.1 christos sect2 = bfd_make_section_with_flags (abfd, name, sect->flags);
8741 1.1 christos if (sect2 == NULL)
8742 1.1 christos return FALSE;
8743 1.1 christos
8744 1.1 christos sect2->size = sect->size;
8745 1.1 christos sect2->filepos = sect->filepos;
8746 1.1 christos sect2->alignment_power = sect->alignment_power;
8747 1.1 christos return TRUE;
8748 1.1 christos }
8749 1.1 christos
8750 1.1 christos /* Create a pseudosection containing SIZE bytes at FILEPOS. This
8751 1.1 christos actually creates up to two pseudosections:
8752 1.1 christos - For the single-threaded case, a section named NAME, unless
8753 1.1 christos such a section already exists.
8754 1.1 christos - For the multi-threaded case, a section named "NAME/PID", where
8755 1.1 christos PID is elfcore_make_pid (abfd).
8756 1.1 christos Both pseudosections have identical contents. */
8757 1.1 christos bfd_boolean
8758 1.1 christos _bfd_elfcore_make_pseudosection (bfd *abfd,
8759 1.1 christos char *name,
8760 1.1 christos size_t size,
8761 1.1 christos ufile_ptr filepos)
8762 1.1 christos {
8763 1.1 christos char buf[100];
8764 1.1 christos char *threaded_name;
8765 1.1 christos size_t len;
8766 1.1 christos asection *sect;
8767 1.1 christos
8768 1.1 christos /* Build the section name. */
8769 1.1 christos
8770 1.1 christos sprintf (buf, "%s/%d", name, elfcore_make_pid (abfd));
8771 1.1 christos len = strlen (buf) + 1;
8772 1.1 christos threaded_name = (char *) bfd_alloc (abfd, len);
8773 1.1 christos if (threaded_name == NULL)
8774 1.1 christos return FALSE;
8775 1.1 christos memcpy (threaded_name, buf, len);
8776 1.1 christos
8777 1.1 christos sect = bfd_make_section_anyway_with_flags (abfd, threaded_name,
8778 1.1 christos SEC_HAS_CONTENTS);
8779 1.1 christos if (sect == NULL)
8780 1.1 christos return FALSE;
8781 1.1 christos sect->size = size;
8782 1.1 christos sect->filepos = filepos;
8783 1.1 christos sect->alignment_power = 2;
8784 1.1 christos
8785 1.1 christos return elfcore_maybe_make_sect (abfd, name, sect);
8786 1.1 christos }
8787 1.1 christos
8788 1.1 christos /* prstatus_t exists on:
8789 1.1 christos solaris 2.5+
8790 1.1 christos linux 2.[01] + glibc
8791 1.1 christos unixware 4.2
8792 1.1 christos */
8793 1.1 christos
8794 1.1 christos #if defined (HAVE_PRSTATUS_T)
8795 1.1 christos
8796 1.1 christos static bfd_boolean
8797 1.1 christos elfcore_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
8798 1.1 christos {
8799 1.1 christos size_t size;
8800 1.1 christos int offset;
8801 1.1 christos
8802 1.1 christos if (note->descsz == sizeof (prstatus_t))
8803 1.1 christos {
8804 1.1 christos prstatus_t prstat;
8805 1.1 christos
8806 1.1 christos size = sizeof (prstat.pr_reg);
8807 1.3 christos offset = offsetof (prstatus_t, pr_reg);
8808 1.3 christos memcpy (&prstat, note->descdata, sizeof (prstat));
8809 1.3 christos
8810 1.3 christos /* Do not overwrite the core signal if it
8811 1.1 christos has already been set by another thread. */
8812 1.1 christos if (elf_tdata (abfd)->core->signal == 0)
8813 1.1 christos elf_tdata (abfd)->core->signal = prstat.pr_cursig;
8814 1.1 christos if (elf_tdata (abfd)->core->pid == 0)
8815 1.1 christos elf_tdata (abfd)->core->pid = prstat.pr_pid;
8816 1.1 christos
8817 1.1 christos /* pr_who exists on:
8818 1.1 christos solaris 2.5+
8819 1.3 christos unixware 4.2
8820 1.1 christos pr_who doesn't exist on:
8821 1.3 christos linux 2.[01]
8822 1.1 christos */
8823 1.1 christos #if defined (HAVE_PRSTATUS_T_PR_WHO)
8824 1.1 christos elf_tdata (abfd)->core->lwpid = prstat.pr_who;
8825 1.1 christos #else
8826 1.1 christos elf_tdata (abfd)->core->lwpid = prstat.pr_pid;
8827 1.1 christos #endif
8828 1.1 christos }
8829 1.1 christos #if defined (HAVE_PRSTATUS32_T)
8830 1.1 christos else if (note->descsz == sizeof (prstatus32_t))
8831 1.1 christos {
8832 1.1 christos /* 64-bit host, 32-bit corefile */
8833 1.1 christos prstatus32_t prstat;
8834 1.1 christos
8835 1.1 christos size = sizeof (prstat.pr_reg);
8836 1.3 christos offset = offsetof (prstatus32_t, pr_reg);
8837 1.3 christos memcpy (&prstat, note->descdata, sizeof (prstat));
8838 1.3 christos
8839 1.3 christos /* Do not overwrite the core signal if it
8840 1.1 christos has already been set by another thread. */
8841 1.1 christos if (elf_tdata (abfd)->core->signal == 0)
8842 1.1 christos elf_tdata (abfd)->core->signal = prstat.pr_cursig;
8843 1.1 christos if (elf_tdata (abfd)->core->pid == 0)
8844 1.1 christos elf_tdata (abfd)->core->pid = prstat.pr_pid;
8845 1.1 christos
8846 1.1 christos /* pr_who exists on:
8847 1.1 christos solaris 2.5+
8848 1.3 christos unixware 4.2
8849 1.1 christos pr_who doesn't exist on:
8850 1.3 christos linux 2.[01]
8851 1.1 christos */
8852 1.1 christos #if defined (HAVE_PRSTATUS32_T_PR_WHO)
8853 1.1 christos elf_tdata (abfd)->core->lwpid = prstat.pr_who;
8854 1.1 christos #else
8855 1.1 christos elf_tdata (abfd)->core->lwpid = prstat.pr_pid;
8856 1.1 christos #endif
8857 1.1 christos }
8858 1.1 christos #endif /* HAVE_PRSTATUS32_T */
8859 1.1 christos else
8860 1.1 christos {
8861 1.1 christos /* Fail - we don't know how to handle any other
8862 1.1 christos note size (ie. data object type). */
8863 1.1 christos return TRUE;
8864 1.1 christos }
8865 1.1 christos
8866 1.1 christos /* Make a ".reg/999" section and a ".reg" section. */
8867 1.1 christos return _bfd_elfcore_make_pseudosection (abfd, ".reg",
8868 1.1 christos size, note->descpos + offset);
8869 1.1 christos }
8870 1.1 christos #endif /* defined (HAVE_PRSTATUS_T) */
8871 1.1 christos
8872 1.1 christos /* Create a pseudosection containing the exact contents of NOTE. */
8873 1.1 christos static bfd_boolean
8874 1.1 christos elfcore_make_note_pseudosection (bfd *abfd,
8875 1.1 christos char *name,
8876 1.1 christos Elf_Internal_Note *note)
8877 1.1 christos {
8878 1.1 christos return _bfd_elfcore_make_pseudosection (abfd, name,
8879 1.1 christos note->descsz, note->descpos);
8880 1.1 christos }
8881 1.1 christos
8882 1.1 christos /* There isn't a consistent prfpregset_t across platforms,
8883 1.1 christos but it doesn't matter, because we don't have to pick this
8884 1.1 christos data structure apart. */
8885 1.1 christos
8886 1.1 christos static bfd_boolean
8887 1.1 christos elfcore_grok_prfpreg (bfd *abfd, Elf_Internal_Note *note)
8888 1.1 christos {
8889 1.1 christos return elfcore_make_note_pseudosection (abfd, ".reg2", note);
8890 1.1 christos }
8891 1.1 christos
8892 1.1 christos /* Linux dumps the Intel SSE regs in a note named "LINUX" with a note
8893 1.1 christos type of NT_PRXFPREG. Just include the whole note's contents
8894 1.1 christos literally. */
8895 1.1 christos
8896 1.1 christos static bfd_boolean
8897 1.1 christos elfcore_grok_prxfpreg (bfd *abfd, Elf_Internal_Note *note)
8898 1.1 christos {
8899 1.1 christos return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
8900 1.1 christos }
8901 1.1 christos
8902 1.1 christos /* Linux dumps the Intel XSAVE extended state in a note named "LINUX"
8903 1.1 christos with a note type of NT_X86_XSTATE. Just include the whole note's
8904 1.1 christos contents literally. */
8905 1.1 christos
8906 1.1 christos static bfd_boolean
8907 1.1 christos elfcore_grok_xstatereg (bfd *abfd, Elf_Internal_Note *note)
8908 1.1 christos {
8909 1.1 christos return elfcore_make_note_pseudosection (abfd, ".reg-xstate", note);
8910 1.1 christos }
8911 1.1 christos
8912 1.1 christos static bfd_boolean
8913 1.1 christos elfcore_grok_ppc_vmx (bfd *abfd, Elf_Internal_Note *note)
8914 1.1 christos {
8915 1.1 christos return elfcore_make_note_pseudosection (abfd, ".reg-ppc-vmx", note);
8916 1.1 christos }
8917 1.1 christos
8918 1.1 christos static bfd_boolean
8919 1.1 christos elfcore_grok_ppc_vsx (bfd *abfd, Elf_Internal_Note *note)
8920 1.1 christos {
8921 1.1 christos return elfcore_make_note_pseudosection (abfd, ".reg-ppc-vsx", note);
8922 1.1 christos }
8923 1.1 christos
8924 1.1 christos static bfd_boolean
8925 1.1 christos elfcore_grok_s390_high_gprs (bfd *abfd, Elf_Internal_Note *note)
8926 1.1 christos {
8927 1.1 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-high-gprs", note);
8928 1.1 christos }
8929 1.1 christos
8930 1.1 christos static bfd_boolean
8931 1.1 christos elfcore_grok_s390_timer (bfd *abfd, Elf_Internal_Note *note)
8932 1.1 christos {
8933 1.1 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-timer", note);
8934 1.1 christos }
8935 1.1 christos
8936 1.1 christos static bfd_boolean
8937 1.1 christos elfcore_grok_s390_todcmp (bfd *abfd, Elf_Internal_Note *note)
8938 1.1 christos {
8939 1.1 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-todcmp", note);
8940 1.1 christos }
8941 1.1 christos
8942 1.1 christos static bfd_boolean
8943 1.1 christos elfcore_grok_s390_todpreg (bfd *abfd, Elf_Internal_Note *note)
8944 1.1 christos {
8945 1.1 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-todpreg", note);
8946 1.1 christos }
8947 1.1 christos
8948 1.1 christos static bfd_boolean
8949 1.1 christos elfcore_grok_s390_ctrs (bfd *abfd, Elf_Internal_Note *note)
8950 1.1 christos {
8951 1.1 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-ctrs", note);
8952 1.1 christos }
8953 1.1 christos
8954 1.1 christos static bfd_boolean
8955 1.3 christos elfcore_grok_s390_prefix (bfd *abfd, Elf_Internal_Note *note)
8956 1.3 christos {
8957 1.3 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-prefix", note);
8958 1.3 christos }
8959 1.3 christos
8960 1.3 christos static bfd_boolean
8961 1.3 christos elfcore_grok_s390_last_break (bfd *abfd, Elf_Internal_Note *note)
8962 1.3 christos {
8963 1.3 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-last-break", note);
8964 1.3 christos }
8965 1.3 christos
8966 1.3 christos static bfd_boolean
8967 1.3 christos elfcore_grok_s390_system_call (bfd *abfd, Elf_Internal_Note *note)
8968 1.3 christos {
8969 1.3 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-system-call", note);
8970 1.3 christos }
8971 1.3 christos
8972 1.3 christos static bfd_boolean
8973 1.3 christos elfcore_grok_s390_tdb (bfd *abfd, Elf_Internal_Note *note)
8974 1.6 christos {
8975 1.6 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-tdb", note);
8976 1.6 christos }
8977 1.6 christos
8978 1.6 christos static bfd_boolean
8979 1.6 christos elfcore_grok_s390_vxrs_low (bfd *abfd, Elf_Internal_Note *note)
8980 1.6 christos {
8981 1.6 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-vxrs-low", note);
8982 1.6 christos }
8983 1.6 christos
8984 1.6 christos static bfd_boolean
8985 1.6 christos elfcore_grok_s390_vxrs_high (bfd *abfd, Elf_Internal_Note *note)
8986 1.3 christos {
8987 1.3 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-vxrs-high", note);
8988 1.3 christos }
8989 1.3 christos
8990 1.3 christos static bfd_boolean
8991 1.3 christos elfcore_grok_arm_vfp (bfd *abfd, Elf_Internal_Note *note)
8992 1.3 christos {
8993 1.3 christos return elfcore_make_note_pseudosection (abfd, ".reg-arm-vfp", note);
8994 1.3 christos }
8995 1.3 christos
8996 1.3 christos static bfd_boolean
8997 1.3 christos elfcore_grok_aarch_tls (bfd *abfd, Elf_Internal_Note *note)
8998 1.3 christos {
8999 1.3 christos return elfcore_make_note_pseudosection (abfd, ".reg-aarch-tls", note);
9000 1.3 christos }
9001 1.3 christos
9002 1.3 christos static bfd_boolean
9003 1.3 christos elfcore_grok_aarch_hw_break (bfd *abfd, Elf_Internal_Note *note)
9004 1.3 christos {
9005 1.3 christos return elfcore_make_note_pseudosection (abfd, ".reg-aarch-hw-break", note);
9006 1.3 christos }
9007 1.3 christos
9008 1.3 christos static bfd_boolean
9009 1.1 christos elfcore_grok_aarch_hw_watch (bfd *abfd, Elf_Internal_Note *note)
9010 1.1 christos {
9011 1.1 christos return elfcore_make_note_pseudosection (abfd, ".reg-aarch-hw-watch", note);
9012 1.1 christos }
9013 1.1 christos
9014 1.1 christos #if defined (HAVE_PRPSINFO_T)
9015 1.1 christos typedef prpsinfo_t elfcore_psinfo_t;
9016 1.1 christos #if defined (HAVE_PRPSINFO32_T) /* Sparc64 cross Sparc32 */
9017 1.1 christos typedef prpsinfo32_t elfcore_psinfo32_t;
9018 1.1 christos #endif
9019 1.1 christos #endif
9020 1.1 christos
9021 1.1 christos #if defined (HAVE_PSINFO_T)
9022 1.1 christos typedef psinfo_t elfcore_psinfo_t;
9023 1.1 christos #if defined (HAVE_PSINFO32_T) /* Sparc64 cross Sparc32 */
9024 1.1 christos typedef psinfo32_t elfcore_psinfo32_t;
9025 1.1 christos #endif
9026 1.1 christos #endif
9027 1.1 christos
9028 1.1 christos /* return a malloc'ed copy of a string at START which is at
9029 1.1 christos most MAX bytes long, possibly without a terminating '\0'.
9030 1.1 christos the copy will always have a terminating '\0'. */
9031 1.1 christos
9032 1.1 christos char *
9033 1.1 christos _bfd_elfcore_strndup (bfd *abfd, char *start, size_t max)
9034 1.1 christos {
9035 1.1 christos char *dups;
9036 1.1 christos char *end = (char *) memchr (start, '\0', max);
9037 1.1 christos size_t len;
9038 1.1 christos
9039 1.1 christos if (end == NULL)
9040 1.1 christos len = max;
9041 1.1 christos else
9042 1.1 christos len = end - start;
9043 1.1 christos
9044 1.1 christos dups = (char *) bfd_alloc (abfd, len + 1);
9045 1.1 christos if (dups == NULL)
9046 1.1 christos return NULL;
9047 1.1 christos
9048 1.1 christos memcpy (dups, start, len);
9049 1.1 christos dups[len] = '\0';
9050 1.1 christos
9051 1.1 christos return dups;
9052 1.1 christos }
9053 1.1 christos
9054 1.1 christos #if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
9055 1.1 christos static bfd_boolean
9056 1.1 christos elfcore_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
9057 1.1 christos {
9058 1.1 christos if (note->descsz == sizeof (elfcore_psinfo_t))
9059 1.3 christos {
9060 1.3 christos elfcore_psinfo_t psinfo;
9061 1.3 christos
9062 1.3 christos memcpy (&psinfo, note->descdata, sizeof (psinfo));
9063 1.1 christos
9064 1.1 christos #if defined (HAVE_PSINFO_T_PR_PID) || defined (HAVE_PRPSINFO_T_PR_PID)
9065 1.1 christos elf_tdata (abfd)->core->pid = psinfo.pr_pid;
9066 1.3 christos #endif
9067 1.1 christos elf_tdata (abfd)->core->program
9068 1.1 christos = _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
9069 1.1 christos sizeof (psinfo.pr_fname));
9070 1.1 christos
9071 1.1 christos elf_tdata (abfd)->core->command
9072 1.1 christos = _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
9073 1.1 christos sizeof (psinfo.pr_psargs));
9074 1.1 christos }
9075 1.1 christos #if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
9076 1.1 christos else if (note->descsz == sizeof (elfcore_psinfo32_t))
9077 1.1 christos {
9078 1.3 christos /* 64-bit host, 32-bit corefile */
9079 1.3 christos elfcore_psinfo32_t psinfo;
9080 1.3 christos
9081 1.3 christos memcpy (&psinfo, note->descdata, sizeof (psinfo));
9082 1.1 christos
9083 1.1 christos #if defined (HAVE_PSINFO32_T_PR_PID) || defined (HAVE_PRPSINFO32_T_PR_PID)
9084 1.1 christos elf_tdata (abfd)->core->pid = psinfo.pr_pid;
9085 1.3 christos #endif
9086 1.1 christos elf_tdata (abfd)->core->program
9087 1.1 christos = _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
9088 1.1 christos sizeof (psinfo.pr_fname));
9089 1.1 christos
9090 1.1 christos elf_tdata (abfd)->core->command
9091 1.1 christos = _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
9092 1.1 christos sizeof (psinfo.pr_psargs));
9093 1.1 christos }
9094 1.1 christos #endif
9095 1.1 christos
9096 1.1 christos else
9097 1.1 christos {
9098 1.1 christos /* Fail - we don't know how to handle any other
9099 1.1 christos note size (ie. data object type). */
9100 1.1 christos return TRUE;
9101 1.1 christos }
9102 1.1 christos
9103 1.3 christos /* Note that for some reason, a spurious space is tacked
9104 1.1 christos onto the end of the args in some (at least one anyway)
9105 1.1 christos implementations, so strip it off if it exists. */
9106 1.1 christos
9107 1.1 christos {
9108 1.1 christos char *command = elf_tdata (abfd)->core->command;
9109 1.1 christos int n = strlen (command);
9110 1.1 christos
9111 1.1 christos if (0 < n && command[n - 1] == ' ')
9112 1.1 christos command[n - 1] = '\0';
9113 1.1 christos }
9114 1.1 christos
9115 1.1 christos return TRUE;
9116 1.1 christos }
9117 1.1 christos #endif /* defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T) */
9118 1.1 christos
9119 1.1 christos #if defined (HAVE_PSTATUS_T)
9120 1.1 christos static bfd_boolean
9121 1.1 christos elfcore_grok_pstatus (bfd *abfd, Elf_Internal_Note *note)
9122 1.1 christos {
9123 1.1 christos if (note->descsz == sizeof (pstatus_t)
9124 1.1 christos #if defined (HAVE_PXSTATUS_T)
9125 1.1 christos || note->descsz == sizeof (pxstatus_t)
9126 1.1 christos #endif
9127 1.1 christos )
9128 1.3 christos {
9129 1.1 christos pstatus_t pstat;
9130 1.1 christos
9131 1.1 christos memcpy (&pstat, note->descdata, sizeof (pstat));
9132 1.1 christos
9133 1.1 christos elf_tdata (abfd)->core->pid = pstat.pr_pid;
9134 1.1 christos }
9135 1.1 christos #if defined (HAVE_PSTATUS32_T)
9136 1.1 christos else if (note->descsz == sizeof (pstatus32_t))
9137 1.1 christos {
9138 1.3 christos /* 64-bit host, 32-bit corefile */
9139 1.1 christos pstatus32_t pstat;
9140 1.1 christos
9141 1.1 christos memcpy (&pstat, note->descdata, sizeof (pstat));
9142 1.1 christos
9143 1.1 christos elf_tdata (abfd)->core->pid = pstat.pr_pid;
9144 1.1 christos }
9145 1.1 christos #endif
9146 1.1 christos /* Could grab some more details from the "representative"
9147 1.1 christos lwpstatus_t in pstat.pr_lwp, but we'll catch it all in an
9148 1.1 christos NT_LWPSTATUS note, presumably. */
9149 1.1 christos
9150 1.1 christos return TRUE;
9151 1.1 christos }
9152 1.1 christos #endif /* defined (HAVE_PSTATUS_T) */
9153 1.1 christos
9154 1.1 christos #if defined (HAVE_LWPSTATUS_T)
9155 1.1 christos static bfd_boolean
9156 1.1 christos elfcore_grok_lwpstatus (bfd *abfd, Elf_Internal_Note *note)
9157 1.1 christos {
9158 1.1 christos lwpstatus_t lwpstat;
9159 1.1 christos char buf[100];
9160 1.1 christos char *name;
9161 1.1 christos size_t len;
9162 1.1 christos asection *sect;
9163 1.1 christos
9164 1.1 christos if (note->descsz != sizeof (lwpstat)
9165 1.1 christos #if defined (HAVE_LWPXSTATUS_T)
9166 1.1 christos && note->descsz != sizeof (lwpxstatus_t)
9167 1.1 christos #endif
9168 1.3 christos )
9169 1.1 christos return TRUE;
9170 1.1 christos
9171 1.3 christos memcpy (&lwpstat, note->descdata, sizeof (lwpstat));
9172 1.3 christos
9173 1.1 christos elf_tdata (abfd)->core->lwpid = lwpstat.pr_lwpid;
9174 1.1 christos /* Do not overwrite the core signal if it has already been set by
9175 1.1 christos another thread. */
9176 1.1 christos if (elf_tdata (abfd)->core->signal == 0)
9177 1.1 christos elf_tdata (abfd)->core->signal = lwpstat.pr_cursig;
9178 1.1 christos
9179 1.1 christos /* Make a ".reg/999" section. */
9180 1.1 christos
9181 1.1 christos sprintf (buf, ".reg/%d", elfcore_make_pid (abfd));
9182 1.1 christos len = strlen (buf) + 1;
9183 1.1 christos name = bfd_alloc (abfd, len);
9184 1.1 christos if (name == NULL)
9185 1.1 christos return FALSE;
9186 1.1 christos memcpy (name, buf, len);
9187 1.1 christos
9188 1.1 christos sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
9189 1.1 christos if (sect == NULL)
9190 1.1 christos return FALSE;
9191 1.1 christos
9192 1.1 christos #if defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
9193 1.1 christos sect->size = sizeof (lwpstat.pr_context.uc_mcontext.gregs);
9194 1.1 christos sect->filepos = note->descpos
9195 1.1 christos + offsetof (lwpstatus_t, pr_context.uc_mcontext.gregs);
9196 1.1 christos #endif
9197 1.1 christos
9198 1.1 christos #if defined (HAVE_LWPSTATUS_T_PR_REG)
9199 1.1 christos sect->size = sizeof (lwpstat.pr_reg);
9200 1.1 christos sect->filepos = note->descpos + offsetof (lwpstatus_t, pr_reg);
9201 1.1 christos #endif
9202 1.1 christos
9203 1.1 christos sect->alignment_power = 2;
9204 1.1 christos
9205 1.1 christos if (!elfcore_maybe_make_sect (abfd, ".reg", sect))
9206 1.1 christos return FALSE;
9207 1.1 christos
9208 1.1 christos /* Make a ".reg2/999" section */
9209 1.1 christos
9210 1.1 christos sprintf (buf, ".reg2/%d", elfcore_make_pid (abfd));
9211 1.1 christos len = strlen (buf) + 1;
9212 1.1 christos name = bfd_alloc (abfd, len);
9213 1.1 christos if (name == NULL)
9214 1.1 christos return FALSE;
9215 1.1 christos memcpy (name, buf, len);
9216 1.1 christos
9217 1.1 christos sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
9218 1.1 christos if (sect == NULL)
9219 1.1 christos return FALSE;
9220 1.1 christos
9221 1.1 christos #if defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
9222 1.1 christos sect->size = sizeof (lwpstat.pr_context.uc_mcontext.fpregs);
9223 1.1 christos sect->filepos = note->descpos
9224 1.1 christos + offsetof (lwpstatus_t, pr_context.uc_mcontext.fpregs);
9225 1.1 christos #endif
9226 1.1 christos
9227 1.1 christos #if defined (HAVE_LWPSTATUS_T_PR_FPREG)
9228 1.1 christos sect->size = sizeof (lwpstat.pr_fpreg);
9229 1.1 christos sect->filepos = note->descpos + offsetof (lwpstatus_t, pr_fpreg);
9230 1.1 christos #endif
9231 1.1 christos
9232 1.1 christos sect->alignment_power = 2;
9233 1.1 christos
9234 1.1 christos return elfcore_maybe_make_sect (abfd, ".reg2", sect);
9235 1.1 christos }
9236 1.1 christos #endif /* defined (HAVE_LWPSTATUS_T) */
9237 1.1 christos
9238 1.1 christos static bfd_boolean
9239 1.1 christos elfcore_grok_win32pstatus (bfd *abfd, Elf_Internal_Note *note)
9240 1.1 christos {
9241 1.1 christos char buf[30];
9242 1.1 christos char *name;
9243 1.1 christos size_t len;
9244 1.1 christos asection *sect;
9245 1.1 christos int type;
9246 1.1 christos int is_active_thread;
9247 1.1 christos bfd_vma base_addr;
9248 1.1 christos
9249 1.1 christos if (note->descsz < 728)
9250 1.1 christos return TRUE;
9251 1.1 christos
9252 1.1 christos if (! CONST_STRNEQ (note->namedata, "win32"))
9253 1.1 christos return TRUE;
9254 1.1 christos
9255 1.3 christos type = bfd_get_32 (abfd, note->descdata);
9256 1.1 christos
9257 1.3 christos switch (type)
9258 1.1 christos {
9259 1.3 christos case 1 /* NOTE_INFO_PROCESS */:
9260 1.1 christos /* FIXME: need to add ->core->command. */
9261 1.1 christos /* process_info.pid */
9262 1.1 christos elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 8);
9263 1.1 christos /* process_info.signal */
9264 1.1 christos elf_tdata (abfd)->core->signal = bfd_get_32 (abfd, note->descdata + 12);
9265 1.1 christos break;
9266 1.1 christos
9267 1.1 christos case 2 /* NOTE_INFO_THREAD */:
9268 1.1 christos /* Make a ".reg/999" section. */
9269 1.1 christos /* thread_info.tid */
9270 1.1 christos sprintf (buf, ".reg/%ld", (long) bfd_get_32 (abfd, note->descdata + 8));
9271 1.1 christos
9272 1.1 christos len = strlen (buf) + 1;
9273 1.1 christos name = (char *) bfd_alloc (abfd, len);
9274 1.1 christos if (name == NULL)
9275 1.1 christos return FALSE;
9276 1.1 christos
9277 1.1 christos memcpy (name, buf, len);
9278 1.1 christos
9279 1.1 christos sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
9280 1.1 christos if (sect == NULL)
9281 1.1 christos return FALSE;
9282 1.1 christos
9283 1.1 christos /* sizeof (thread_info.thread_context) */
9284 1.1 christos sect->size = 716;
9285 1.1 christos /* offsetof (thread_info.thread_context) */
9286 1.1 christos sect->filepos = note->descpos + 12;
9287 1.1 christos sect->alignment_power = 2;
9288 1.1 christos
9289 1.1 christos /* thread_info.is_active_thread */
9290 1.1 christos is_active_thread = bfd_get_32 (abfd, note->descdata + 8);
9291 1.1 christos
9292 1.1 christos if (is_active_thread)
9293 1.1 christos if (! elfcore_maybe_make_sect (abfd, ".reg", sect))
9294 1.1 christos return FALSE;
9295 1.1 christos break;
9296 1.1 christos
9297 1.1 christos case 3 /* NOTE_INFO_MODULE */:
9298 1.1 christos /* Make a ".module/xxxxxxxx" section. */
9299 1.1 christos /* module_info.base_address */
9300 1.1 christos base_addr = bfd_get_32 (abfd, note->descdata + 4);
9301 1.1 christos sprintf (buf, ".module/%08lx", (unsigned long) base_addr);
9302 1.1 christos
9303 1.1 christos len = strlen (buf) + 1;
9304 1.1 christos name = (char *) bfd_alloc (abfd, len);
9305 1.1 christos if (name == NULL)
9306 1.1 christos return FALSE;
9307 1.1 christos
9308 1.1 christos memcpy (name, buf, len);
9309 1.1 christos
9310 1.1 christos sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
9311 1.1 christos
9312 1.1 christos if (sect == NULL)
9313 1.1 christos return FALSE;
9314 1.1 christos
9315 1.1 christos sect->size = note->descsz;
9316 1.1 christos sect->filepos = note->descpos;
9317 1.1 christos sect->alignment_power = 2;
9318 1.1 christos break;
9319 1.1 christos
9320 1.1 christos default:
9321 1.1 christos return TRUE;
9322 1.1 christos }
9323 1.1 christos
9324 1.1 christos return TRUE;
9325 1.1 christos }
9326 1.1 christos
9327 1.1 christos static bfd_boolean
9328 1.1 christos elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
9329 1.1 christos {
9330 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
9331 1.1 christos
9332 1.1 christos switch (note->type)
9333 1.1 christos {
9334 1.1 christos default:
9335 1.1 christos return TRUE;
9336 1.1 christos
9337 1.1 christos case NT_PRSTATUS:
9338 1.1 christos if (bed->elf_backend_grok_prstatus)
9339 1.1 christos if ((*bed->elf_backend_grok_prstatus) (abfd, note))
9340 1.1 christos return TRUE;
9341 1.1 christos #if defined (HAVE_PRSTATUS_T)
9342 1.1 christos return elfcore_grok_prstatus (abfd, note);
9343 1.1 christos #else
9344 1.1 christos return TRUE;
9345 1.1 christos #endif
9346 1.1 christos
9347 1.1 christos #if defined (HAVE_PSTATUS_T)
9348 1.1 christos case NT_PSTATUS:
9349 1.1 christos return elfcore_grok_pstatus (abfd, note);
9350 1.1 christos #endif
9351 1.1 christos
9352 1.1 christos #if defined (HAVE_LWPSTATUS_T)
9353 1.1 christos case NT_LWPSTATUS:
9354 1.1 christos return elfcore_grok_lwpstatus (abfd, note);
9355 1.1 christos #endif
9356 1.1 christos
9357 1.1 christos case NT_FPREGSET: /* FIXME: rename to NT_PRFPREG */
9358 1.1 christos return elfcore_grok_prfpreg (abfd, note);
9359 1.1 christos
9360 1.1 christos case NT_WIN32PSTATUS:
9361 1.1 christos return elfcore_grok_win32pstatus (abfd, note);
9362 1.1 christos
9363 1.1 christos case NT_PRXFPREG: /* Linux SSE extension */
9364 1.1 christos if (note->namesz == 6
9365 1.1 christos && strcmp (note->namedata, "LINUX") == 0)
9366 1.1 christos return elfcore_grok_prxfpreg (abfd, note);
9367 1.1 christos else
9368 1.1 christos return TRUE;
9369 1.1 christos
9370 1.1 christos case NT_X86_XSTATE: /* Linux XSAVE extension */
9371 1.1 christos if (note->namesz == 6
9372 1.1 christos && strcmp (note->namedata, "LINUX") == 0)
9373 1.1 christos return elfcore_grok_xstatereg (abfd, note);
9374 1.1 christos else
9375 1.1 christos return TRUE;
9376 1.1 christos
9377 1.1 christos case NT_PPC_VMX:
9378 1.1 christos if (note->namesz == 6
9379 1.1 christos && strcmp (note->namedata, "LINUX") == 0)
9380 1.1 christos return elfcore_grok_ppc_vmx (abfd, note);
9381 1.1 christos else
9382 1.1 christos return TRUE;
9383 1.1 christos
9384 1.1 christos case NT_PPC_VSX:
9385 1.1 christos if (note->namesz == 6
9386 1.1 christos && strcmp (note->namedata, "LINUX") == 0)
9387 1.1 christos return elfcore_grok_ppc_vsx (abfd, note);
9388 1.1 christos else
9389 1.1 christos return TRUE;
9390 1.1 christos
9391 1.1 christos case NT_S390_HIGH_GPRS:
9392 1.1 christos if (note->namesz == 6
9393 1.1 christos && strcmp (note->namedata, "LINUX") == 0)
9394 1.1 christos return elfcore_grok_s390_high_gprs (abfd, note);
9395 1.1 christos else
9396 1.1 christos return TRUE;
9397 1.1 christos
9398 1.1 christos case NT_S390_TIMER:
9399 1.1 christos if (note->namesz == 6
9400 1.1 christos && strcmp (note->namedata, "LINUX") == 0)
9401 1.1 christos return elfcore_grok_s390_timer (abfd, note);
9402 1.1 christos else
9403 1.1 christos return TRUE;
9404 1.1 christos
9405 1.1 christos case NT_S390_TODCMP:
9406 1.1 christos if (note->namesz == 6
9407 1.1 christos && strcmp (note->namedata, "LINUX") == 0)
9408 1.1 christos return elfcore_grok_s390_todcmp (abfd, note);
9409 1.1 christos else
9410 1.1 christos return TRUE;
9411 1.1 christos
9412 1.1 christos case NT_S390_TODPREG:
9413 1.1 christos if (note->namesz == 6
9414 1.1 christos && strcmp (note->namedata, "LINUX") == 0)
9415 1.1 christos return elfcore_grok_s390_todpreg (abfd, note);
9416 1.1 christos else
9417 1.1 christos return TRUE;
9418 1.1 christos
9419 1.1 christos case NT_S390_CTRS:
9420 1.1 christos if (note->namesz == 6
9421 1.1 christos && strcmp (note->namedata, "LINUX") == 0)
9422 1.1 christos return elfcore_grok_s390_ctrs (abfd, note);
9423 1.1 christos else
9424 1.1 christos return TRUE;
9425 1.1 christos
9426 1.1 christos case NT_S390_PREFIX:
9427 1.1 christos if (note->namesz == 6
9428 1.3 christos && strcmp (note->namedata, "LINUX") == 0)
9429 1.3 christos return elfcore_grok_s390_prefix (abfd, note);
9430 1.3 christos else
9431 1.3 christos return TRUE;
9432 1.3 christos
9433 1.3 christos case NT_S390_LAST_BREAK:
9434 1.3 christos if (note->namesz == 6
9435 1.3 christos && strcmp (note->namedata, "LINUX") == 0)
9436 1.3 christos return elfcore_grok_s390_last_break (abfd, note);
9437 1.3 christos else
9438 1.3 christos return TRUE;
9439 1.3 christos
9440 1.3 christos case NT_S390_SYSTEM_CALL:
9441 1.3 christos if (note->namesz == 6
9442 1.3 christos && strcmp (note->namedata, "LINUX") == 0)
9443 1.3 christos return elfcore_grok_s390_system_call (abfd, note);
9444 1.3 christos else
9445 1.3 christos return TRUE;
9446 1.3 christos
9447 1.3 christos case NT_S390_TDB:
9448 1.3 christos if (note->namesz == 6
9449 1.6 christos && strcmp (note->namedata, "LINUX") == 0)
9450 1.6 christos return elfcore_grok_s390_tdb (abfd, note);
9451 1.6 christos else
9452 1.6 christos return TRUE;
9453 1.6 christos
9454 1.6 christos case NT_S390_VXRS_LOW:
9455 1.6 christos if (note->namesz == 6
9456 1.6 christos && strcmp (note->namedata, "LINUX") == 0)
9457 1.6 christos return elfcore_grok_s390_vxrs_low (abfd, note);
9458 1.6 christos else
9459 1.6 christos return TRUE;
9460 1.6 christos
9461 1.6 christos case NT_S390_VXRS_HIGH:
9462 1.6 christos if (note->namesz == 6
9463 1.3 christos && strcmp (note->namedata, "LINUX") == 0)
9464 1.3 christos return elfcore_grok_s390_vxrs_high (abfd, note);
9465 1.3 christos else
9466 1.3 christos return TRUE;
9467 1.3 christos
9468 1.3 christos case NT_ARM_VFP:
9469 1.3 christos if (note->namesz == 6
9470 1.3 christos && strcmp (note->namedata, "LINUX") == 0)
9471 1.3 christos return elfcore_grok_arm_vfp (abfd, note);
9472 1.3 christos else
9473 1.3 christos return TRUE;
9474 1.3 christos
9475 1.3 christos case NT_ARM_TLS:
9476 1.3 christos if (note->namesz == 6
9477 1.3 christos && strcmp (note->namedata, "LINUX") == 0)
9478 1.3 christos return elfcore_grok_aarch_tls (abfd, note);
9479 1.3 christos else
9480 1.3 christos return TRUE;
9481 1.3 christos
9482 1.3 christos case NT_ARM_HW_BREAK:
9483 1.3 christos if (note->namesz == 6
9484 1.3 christos && strcmp (note->namedata, "LINUX") == 0)
9485 1.3 christos return elfcore_grok_aarch_hw_break (abfd, note);
9486 1.3 christos else
9487 1.3 christos return TRUE;
9488 1.3 christos
9489 1.3 christos case NT_ARM_HW_WATCH:
9490 1.3 christos if (note->namesz == 6
9491 1.1 christos && strcmp (note->namedata, "LINUX") == 0)
9492 1.1 christos return elfcore_grok_aarch_hw_watch (abfd, note);
9493 1.1 christos else
9494 1.1 christos return TRUE;
9495 1.1 christos
9496 1.1 christos case NT_PRPSINFO:
9497 1.1 christos case NT_PSINFO:
9498 1.1 christos if (bed->elf_backend_grok_psinfo)
9499 1.1 christos if ((*bed->elf_backend_grok_psinfo) (abfd, note))
9500 1.1 christos return TRUE;
9501 1.1 christos #if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
9502 1.1 christos return elfcore_grok_psinfo (abfd, note);
9503 1.1 christos #else
9504 1.1 christos return TRUE;
9505 1.1 christos #endif
9506 1.1 christos
9507 1.1 christos case NT_AUXV:
9508 1.1 christos {
9509 1.1 christos asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
9510 1.1 christos SEC_HAS_CONTENTS);
9511 1.1 christos
9512 1.1 christos if (sect == NULL)
9513 1.1 christos return FALSE;
9514 1.1 christos sect->size = note->descsz;
9515 1.3 christos sect->filepos = note->descpos;
9516 1.3 christos sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
9517 1.3 christos
9518 1.3 christos return TRUE;
9519 1.3 christos }
9520 1.3 christos
9521 1.3 christos case NT_FILE:
9522 1.3 christos return elfcore_make_note_pseudosection (abfd, ".note.linuxcore.file",
9523 1.8 christos note);
9524 1.1 christos
9525 1.1 christos case NT_SIGINFO:
9526 1.1 christos return elfcore_make_note_pseudosection (abfd, ".note.linuxcore.siginfo",
9527 1.1 christos note);
9528 1.1 christos
9529 1.1 christos }
9530 1.6 christos }
9531 1.3 christos
9532 1.3 christos static bfd_boolean
9533 1.1 christos elfobj_grok_gnu_build_id (bfd *abfd, Elf_Internal_Note *note)
9534 1.1 christos {
9535 1.6 christos struct bfd_build_id* build_id;
9536 1.6 christos
9537 1.3 christos if (note->descsz == 0)
9538 1.3 christos return FALSE;
9539 1.6 christos
9540 1.6 christos build_id = bfd_alloc (abfd, sizeof (struct bfd_build_id) - 1 + note->descsz);
9541 1.6 christos if (build_id == NULL)
9542 1.1 christos return FALSE;
9543 1.1 christos
9544 1.1 christos build_id->size = note->descsz;
9545 1.1 christos memcpy (build_id->data, note->descdata, note->descsz);
9546 1.1 christos abfd->build_id = build_id;
9547 1.1 christos
9548 1.1 christos return TRUE;
9549 1.1 christos }
9550 1.1 christos
9551 1.1 christos static bfd_boolean
9552 1.1 christos elfobj_grok_gnu_note (bfd *abfd, Elf_Internal_Note *note)
9553 1.1 christos {
9554 1.1 christos switch (note->type)
9555 1.1 christos {
9556 1.1 christos default:
9557 1.1 christos return TRUE;
9558 1.1 christos
9559 1.1 christos case NT_GNU_BUILD_ID:
9560 1.3 christos return elfobj_grok_gnu_build_id (abfd, note);
9561 1.3 christos }
9562 1.3 christos }
9563 1.3 christos
9564 1.3 christos static bfd_boolean
9565 1.3 christos elfobj_grok_stapsdt_note_1 (bfd *abfd, Elf_Internal_Note *note)
9566 1.3 christos {
9567 1.3 christos struct sdt_note *cur =
9568 1.3 christos (struct sdt_note *) bfd_alloc (abfd, sizeof (struct sdt_note)
9569 1.3 christos + note->descsz);
9570 1.3 christos
9571 1.3 christos cur->next = (struct sdt_note *) (elf_tdata (abfd))->sdt_note_head;
9572 1.3 christos cur->size = (bfd_size_type) note->descsz;
9573 1.3 christos memcpy (cur->data, note->descdata, note->descsz);
9574 1.3 christos
9575 1.3 christos elf_tdata (abfd)->sdt_note_head = cur;
9576 1.3 christos
9577 1.3 christos return TRUE;
9578 1.3 christos }
9579 1.3 christos
9580 1.3 christos static bfd_boolean
9581 1.3 christos elfobj_grok_stapsdt_note (bfd *abfd, Elf_Internal_Note *note)
9582 1.3 christos {
9583 1.3 christos switch (note->type)
9584 1.3 christos {
9585 1.3 christos case NT_STAPSDT:
9586 1.3 christos return elfobj_grok_stapsdt_note_1 (abfd, note);
9587 1.3 christos
9588 1.3 christos default:
9589 1.8 christos return TRUE;
9590 1.8 christos }
9591 1.8 christos }
9592 1.8 christos
9593 1.8 christos static bfd_boolean
9594 1.8 christos elfcore_grok_freebsd_psinfo (bfd *abfd, Elf_Internal_Note *note)
9595 1.8 christos {
9596 1.8 christos size_t offset;
9597 1.8 christos
9598 1.8 christos switch (abfd->arch_info->bits_per_word)
9599 1.8 christos {
9600 1.8 christos case 32:
9601 1.8 christos if (note->descsz < 108)
9602 1.8 christos return FALSE;
9603 1.8 christos break;
9604 1.8 christos
9605 1.8 christos case 64:
9606 1.8 christos if (note->descsz < 120)
9607 1.8 christos return FALSE;
9608 1.8 christos break;
9609 1.8 christos
9610 1.8 christos default:
9611 1.8 christos return FALSE;
9612 1.8 christos }
9613 1.8 christos
9614 1.8 christos /* Check for version 1 in pr_version. */
9615 1.8 christos if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
9616 1.8 christos return FALSE;
9617 1.8 christos offset = 4;
9618 1.8 christos
9619 1.8 christos /* Skip over pr_psinfosz. */
9620 1.8 christos if (abfd->arch_info->bits_per_word == 32)
9621 1.8 christos offset += 4;
9622 1.8 christos else
9623 1.8 christos {
9624 1.8 christos offset += 4; /* Padding before pr_psinfosz. */
9625 1.8 christos offset += 8;
9626 1.8 christos }
9627 1.8 christos
9628 1.8 christos /* pr_fname is PRFNAMESZ (16) + 1 bytes in size. */
9629 1.8 christos elf_tdata (abfd)->core->program
9630 1.8 christos = _bfd_elfcore_strndup (abfd, note->descdata + offset, 17);
9631 1.8 christos offset += 17;
9632 1.8 christos
9633 1.8 christos /* pr_psargs is PRARGSZ (80) + 1 bytes in size. */
9634 1.8 christos elf_tdata (abfd)->core->command
9635 1.8 christos = _bfd_elfcore_strndup (abfd, note->descdata + offset, 81);
9636 1.8 christos offset += 81;
9637 1.8 christos
9638 1.8 christos /* Padding before pr_pid. */
9639 1.8 christos offset += 2;
9640 1.8 christos
9641 1.8 christos /* The pr_pid field was added in version "1a". */
9642 1.8 christos if (note->descsz < offset + 4)
9643 1.8 christos return TRUE;
9644 1.8 christos
9645 1.8 christos elf_tdata (abfd)->core->pid
9646 1.8 christos = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
9647 1.8 christos
9648 1.8 christos return TRUE;
9649 1.8 christos }
9650 1.8 christos
9651 1.8 christos static bfd_boolean
9652 1.8 christos elfcore_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note)
9653 1.8 christos {
9654 1.8 christos size_t offset;
9655 1.8 christos size_t size;
9656 1.8 christos
9657 1.8 christos /* Check for version 1 in pr_version. */
9658 1.8 christos if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
9659 1.8 christos return FALSE;
9660 1.8 christos offset = 4;
9661 1.8 christos
9662 1.8 christos /* Skip over pr_statussz. */
9663 1.8 christos switch (abfd->arch_info->bits_per_word)
9664 1.8 christos {
9665 1.8 christos case 32:
9666 1.8 christos offset += 4;
9667 1.8 christos break;
9668 1.8 christos
9669 1.8 christos case 64:
9670 1.8 christos offset += 4; /* Padding before pr_statussz. */
9671 1.8 christos offset += 8;
9672 1.8 christos break;
9673 1.8 christos
9674 1.8 christos default:
9675 1.8 christos return FALSE;
9676 1.8 christos }
9677 1.8 christos
9678 1.8 christos /* Extract size of pr_reg from pr_gregsetsz. */
9679 1.8 christos if (abfd->arch_info->bits_per_word == 32)
9680 1.8 christos size = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
9681 1.8 christos else
9682 1.8 christos size = bfd_h_get_64 (abfd, (bfd_byte *) note->descdata + offset);
9683 1.8 christos
9684 1.8 christos /* Skip over pr_gregsetsz and pr_fpregsetsz. */
9685 1.8 christos offset += (abfd->arch_info->bits_per_word / 8) * 2;
9686 1.8 christos
9687 1.8 christos /* Skip over pr_osreldate. */
9688 1.8 christos offset += 4;
9689 1.8 christos
9690 1.8 christos /* Read signal from pr_cursig. */
9691 1.8 christos if (elf_tdata (abfd)->core->signal == 0)
9692 1.8 christos elf_tdata (abfd)->core->signal
9693 1.8 christos = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
9694 1.8 christos offset += 4;
9695 1.8 christos
9696 1.8 christos /* Read TID from pr_pid. */
9697 1.8 christos elf_tdata (abfd)->core->lwpid
9698 1.8 christos = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
9699 1.8 christos offset += 4;
9700 1.8 christos
9701 1.8 christos /* Padding before pr_reg. */
9702 1.8 christos if (abfd->arch_info->bits_per_word == 64)
9703 1.8 christos offset += 4;
9704 1.8 christos
9705 1.8 christos /* Make a ".reg/999" section and a ".reg" section. */
9706 1.8 christos return _bfd_elfcore_make_pseudosection (abfd, ".reg",
9707 1.8 christos size, note->descpos + offset);
9708 1.8 christos }
9709 1.8 christos
9710 1.8 christos static bfd_boolean
9711 1.8 christos elfcore_grok_freebsd_note (bfd *abfd, Elf_Internal_Note *note)
9712 1.8 christos {
9713 1.8 christos switch (note->type)
9714 1.8 christos {
9715 1.8 christos case NT_PRSTATUS:
9716 1.8 christos return elfcore_grok_freebsd_prstatus (abfd, note);
9717 1.8 christos
9718 1.8 christos case NT_FPREGSET:
9719 1.8 christos return elfcore_grok_prfpreg (abfd, note);
9720 1.8 christos
9721 1.8 christos case NT_PRPSINFO:
9722 1.8 christos return elfcore_grok_freebsd_psinfo (abfd, note);
9723 1.8 christos
9724 1.8 christos case NT_FREEBSD_THRMISC:
9725 1.8 christos if (note->namesz == 8)
9726 1.8 christos return elfcore_make_note_pseudosection (abfd, ".thrmisc", note);
9727 1.8 christos else
9728 1.8 christos return TRUE;
9729 1.8 christos
9730 1.8 christos case NT_FREEBSD_PROCSTAT_AUXV:
9731 1.8 christos {
9732 1.8 christos asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
9733 1.8 christos SEC_HAS_CONTENTS);
9734 1.8 christos
9735 1.8 christos if (sect == NULL)
9736 1.8 christos return FALSE;
9737 1.8 christos sect->size = note->descsz - 4;
9738 1.8 christos sect->filepos = note->descpos + 4;
9739 1.8 christos sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
9740 1.8 christos
9741 1.8 christos return TRUE;
9742 1.8 christos }
9743 1.8 christos
9744 1.8 christos case NT_X86_XSTATE:
9745 1.8 christos if (note->namesz == 8)
9746 1.8 christos return elfcore_grok_xstatereg (abfd, note);
9747 1.8 christos else
9748 1.8 christos return TRUE;
9749 1.8 christos
9750 1.8 christos default:
9751 1.1 christos return TRUE;
9752 1.1 christos }
9753 1.1 christos }
9754 1.1 christos
9755 1.1 christos static bfd_boolean
9756 1.1 christos elfcore_netbsd_get_lwpid (Elf_Internal_Note *note, int *lwpidp)
9757 1.1 christos {
9758 1.1 christos char *cp;
9759 1.1 christos
9760 1.1 christos cp = strchr (note->namedata, '@');
9761 1.1 christos if (cp != NULL)
9762 1.1 christos {
9763 1.1 christos *lwpidp = atoi(cp + 1);
9764 1.1 christos return TRUE;
9765 1.1 christos }
9766 1.1 christos return FALSE;
9767 1.1 christos }
9768 1.3 christos
9769 1.1 christos static bfd_boolean
9770 1.1 christos elfcore_grok_netbsd_procinfo (bfd *abfd, Elf_Internal_Note *note)
9771 1.1 christos {
9772 1.3 christos /* Signal number at offset 0x08. */
9773 1.1 christos elf_tdata (abfd)->core->signal
9774 1.1 christos = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x08);
9775 1.1 christos
9776 1.3 christos /* Process ID at offset 0x50. */
9777 1.1 christos elf_tdata (abfd)->core->pid
9778 1.1 christos = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x50);
9779 1.1 christos
9780 1.1 christos /* Command name at 0x7c (max 32 bytes, including nul). */
9781 1.1 christos elf_tdata (abfd)->core->command
9782 1.1 christos = _bfd_elfcore_strndup (abfd, note->descdata + 0x7c, 31);
9783 1.1 christos
9784 1.1 christos return elfcore_make_note_pseudosection (abfd, ".note.netbsdcore.procinfo",
9785 1.1 christos note);
9786 1.1 christos }
9787 1.1 christos
9788 1.1 christos static bfd_boolean
9789 1.3 christos elfcore_grok_netbsd_note (bfd *abfd, Elf_Internal_Note *note)
9790 1.1 christos {
9791 1.1 christos int lwp;
9792 1.1 christos
9793 1.1 christos if (elfcore_netbsd_get_lwpid (note, &lwp))
9794 1.1 christos elf_tdata (abfd)->core->lwpid = lwp;
9795 1.1 christos
9796 1.1 christos if (note->type == NT_NETBSDCORE_PROCINFO)
9797 1.1 christos {
9798 1.1 christos /* NetBSD-specific core "procinfo". Note that we expect to
9799 1.1 christos find this note before any of the others, which is fine,
9800 1.1 christos since the kernel writes this note out first when it
9801 1.7 christos creates a core file. */
9802 1.7 christos
9803 1.7 christos return elfcore_grok_netbsd_procinfo (abfd, note);
9804 1.7 christos }
9805 1.7 christos
9806 1.7 christos if (note->type == NT_NETBSDCORE_AUXV)
9807 1.7 christos {
9808 1.7 christos asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
9809 1.7 christos SEC_HAS_CONTENTS);
9810 1.7 christos
9811 1.7 christos if (sect == NULL)
9812 1.7 christos return FALSE;
9813 1.7 christos sect->size = note->descsz;
9814 1.7 christos sect->filepos = note->descpos;
9815 1.1 christos sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
9816 1.1 christos
9817 1.1 christos return TRUE;
9818 1.1 christos }
9819 1.1 christos
9820 1.1 christos /* As of Jan 2002 there are no other machine-independent notes
9821 1.1 christos defined for NetBSD core files. If the note type is less
9822 1.1 christos than the start of the machine-dependent note types, we don't
9823 1.1 christos understand it. */
9824 1.1 christos
9825 1.1 christos if (note->type < NT_NETBSDCORE_FIRSTMACH)
9826 1.1 christos return TRUE;
9827 1.1 christos
9828 1.1 christos
9829 1.1 christos switch (bfd_get_arch (abfd))
9830 1.1 christos {
9831 1.1 christos /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0 and
9832 1.1 christos PT_GETFPREGS == mach+2. */
9833 1.1 christos
9834 1.1 christos case bfd_arch_alpha:
9835 1.1 christos case bfd_arch_sparc:
9836 1.1 christos switch (note->type)
9837 1.1 christos {
9838 1.1 christos case NT_NETBSDCORE_FIRSTMACH+0:
9839 1.1 christos return elfcore_make_note_pseudosection (abfd, ".reg", note);
9840 1.1 christos
9841 1.1 christos case NT_NETBSDCORE_FIRSTMACH+2:
9842 1.1 christos return elfcore_make_note_pseudosection (abfd, ".reg2", note);
9843 1.2 uwe
9844 1.2 uwe default:
9845 1.2 uwe return TRUE;
9846 1.2 uwe }
9847 1.2 uwe
9848 1.2 uwe /* On SuperH, PT_GETREGS == mach+3 and PT_GETFPREGS == mach+5.
9849 1.2 uwe There's also old PT___GETREGS40 == mach + 1 for old reg
9850 1.2 uwe structure which lacks GBR. */
9851 1.2 uwe
9852 1.2 uwe case bfd_arch_sh:
9853 1.2 uwe switch (note->type)
9854 1.2 uwe {
9855 1.2 uwe case NT_NETBSDCORE_FIRSTMACH+3:
9856 1.2 uwe return elfcore_make_note_pseudosection (abfd, ".reg", note);
9857 1.2 uwe
9858 1.2 uwe case NT_NETBSDCORE_FIRSTMACH+5:
9859 1.2 uwe return elfcore_make_note_pseudosection (abfd, ".reg2", note);
9860 1.1 christos
9861 1.1 christos default:
9862 1.1 christos return TRUE;
9863 1.1 christos }
9864 1.1 christos
9865 1.1 christos /* On all other arch's, PT_GETREGS == mach+1 and
9866 1.1 christos PT_GETFPREGS == mach+3. */
9867 1.1 christos
9868 1.1 christos default:
9869 1.1 christos switch (note->type)
9870 1.1 christos {
9871 1.1 christos case NT_NETBSDCORE_FIRSTMACH+1:
9872 1.1 christos return elfcore_make_note_pseudosection (abfd, ".reg", note);
9873 1.1 christos
9874 1.1 christos case NT_NETBSDCORE_FIRSTMACH+3:
9875 1.1 christos return elfcore_make_note_pseudosection (abfd, ".reg2", note);
9876 1.1 christos
9877 1.1 christos default:
9878 1.1 christos return TRUE;
9879 1.1 christos }
9880 1.1 christos }
9881 1.1 christos /* NOTREACHED */
9882 1.1 christos }
9883 1.3 christos
9884 1.1 christos static bfd_boolean
9885 1.1 christos elfcore_grok_openbsd_procinfo (bfd *abfd, Elf_Internal_Note *note)
9886 1.1 christos {
9887 1.3 christos /* Signal number at offset 0x08. */
9888 1.1 christos elf_tdata (abfd)->core->signal
9889 1.1 christos = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x08);
9890 1.1 christos
9891 1.3 christos /* Process ID at offset 0x20. */
9892 1.1 christos elf_tdata (abfd)->core->pid
9893 1.1 christos = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x20);
9894 1.1 christos
9895 1.1 christos /* Command name at 0x48 (max 32 bytes, including nul). */
9896 1.1 christos elf_tdata (abfd)->core->command
9897 1.1 christos = _bfd_elfcore_strndup (abfd, note->descdata + 0x48, 31);
9898 1.1 christos
9899 1.1 christos return TRUE;
9900 1.1 christos }
9901 1.1 christos
9902 1.1 christos static bfd_boolean
9903 1.1 christos elfcore_grok_openbsd_note (bfd *abfd, Elf_Internal_Note *note)
9904 1.1 christos {
9905 1.1 christos if (note->type == NT_OPENBSD_PROCINFO)
9906 1.1 christos return elfcore_grok_openbsd_procinfo (abfd, note);
9907 1.1 christos
9908 1.1 christos if (note->type == NT_OPENBSD_REGS)
9909 1.1 christos return elfcore_make_note_pseudosection (abfd, ".reg", note);
9910 1.1 christos
9911 1.1 christos if (note->type == NT_OPENBSD_FPREGS)
9912 1.1 christos return elfcore_make_note_pseudosection (abfd, ".reg2", note);
9913 1.1 christos
9914 1.1 christos if (note->type == NT_OPENBSD_XFPREGS)
9915 1.1 christos return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
9916 1.1 christos
9917 1.1 christos if (note->type == NT_OPENBSD_AUXV)
9918 1.1 christos {
9919 1.1 christos asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
9920 1.1 christos SEC_HAS_CONTENTS);
9921 1.1 christos
9922 1.1 christos if (sect == NULL)
9923 1.1 christos return FALSE;
9924 1.1 christos sect->size = note->descsz;
9925 1.1 christos sect->filepos = note->descpos;
9926 1.1 christos sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
9927 1.1 christos
9928 1.1 christos return TRUE;
9929 1.1 christos }
9930 1.1 christos
9931 1.1 christos if (note->type == NT_OPENBSD_WCOOKIE)
9932 1.1 christos {
9933 1.1 christos asection *sect = bfd_make_section_anyway_with_flags (abfd, ".wcookie",
9934 1.1 christos SEC_HAS_CONTENTS);
9935 1.1 christos
9936 1.1 christos if (sect == NULL)
9937 1.1 christos return FALSE;
9938 1.1 christos sect->size = note->descsz;
9939 1.1 christos sect->filepos = note->descpos;
9940 1.1 christos sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
9941 1.1 christos
9942 1.1 christos return TRUE;
9943 1.1 christos }
9944 1.1 christos
9945 1.1 christos return TRUE;
9946 1.1 christos }
9947 1.1 christos
9948 1.1 christos static bfd_boolean
9949 1.1 christos elfcore_grok_nto_status (bfd *abfd, Elf_Internal_Note *note, long *tid)
9950 1.1 christos {
9951 1.1 christos void *ddata = note->descdata;
9952 1.1 christos char buf[100];
9953 1.1 christos char *name;
9954 1.3 christos asection *sect;
9955 1.1 christos short sig;
9956 1.1 christos unsigned flags;
9957 1.1 christos
9958 1.1 christos /* nto_procfs_status 'pid' field is at offset 0. */
9959 1.1 christos elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, (bfd_byte *) ddata);
9960 1.1 christos
9961 1.1 christos /* nto_procfs_status 'tid' field is at offset 4. Pass it back. */
9962 1.1 christos *tid = bfd_get_32 (abfd, (bfd_byte *) ddata + 4);
9963 1.1 christos
9964 1.1 christos /* nto_procfs_status 'flags' field is at offset 8. */
9965 1.3 christos flags = bfd_get_32 (abfd, (bfd_byte *) ddata + 8);
9966 1.3 christos
9967 1.1 christos /* nto_procfs_status 'what' field is at offset 14. */
9968 1.1 christos if ((sig = bfd_get_16 (abfd, (bfd_byte *) ddata + 14)) > 0)
9969 1.1 christos {
9970 1.1 christos elf_tdata (abfd)->core->signal = sig;
9971 1.1 christos elf_tdata (abfd)->core->lwpid = *tid;
9972 1.1 christos }
9973 1.3 christos
9974 1.1 christos /* _DEBUG_FLAG_CURTID (current thread) is 0x80. Some cores
9975 1.1 christos do not come from signals so we make sure we set the current
9976 1.1 christos thread just in case. */
9977 1.1 christos if (flags & 0x00000080)
9978 1.1 christos elf_tdata (abfd)->core->lwpid = *tid;
9979 1.1 christos
9980 1.1 christos /* Make a ".qnx_core_status/%d" section. */
9981 1.1 christos sprintf (buf, ".qnx_core_status/%ld", *tid);
9982 1.1 christos
9983 1.1 christos name = (char *) bfd_alloc (abfd, strlen (buf) + 1);
9984 1.1 christos if (name == NULL)
9985 1.1 christos return FALSE;
9986 1.1 christos strcpy (name, buf);
9987 1.1 christos
9988 1.1 christos sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
9989 1.1 christos if (sect == NULL)
9990 1.1 christos return FALSE;
9991 1.1 christos
9992 1.1 christos sect->size = note->descsz;
9993 1.1 christos sect->filepos = note->descpos;
9994 1.1 christos sect->alignment_power = 2;
9995 1.1 christos
9996 1.1 christos return (elfcore_maybe_make_sect (abfd, ".qnx_core_status", sect));
9997 1.1 christos }
9998 1.1 christos
9999 1.1 christos static bfd_boolean
10000 1.1 christos elfcore_grok_nto_regs (bfd *abfd,
10001 1.1 christos Elf_Internal_Note *note,
10002 1.1 christos long tid,
10003 1.1 christos char *base)
10004 1.1 christos {
10005 1.1 christos char buf[100];
10006 1.1 christos char *name;
10007 1.1 christos asection *sect;
10008 1.1 christos
10009 1.1 christos /* Make a "(base)/%d" section. */
10010 1.1 christos sprintf (buf, "%s/%ld", base, tid);
10011 1.1 christos
10012 1.1 christos name = (char *) bfd_alloc (abfd, strlen (buf) + 1);
10013 1.1 christos if (name == NULL)
10014 1.1 christos return FALSE;
10015 1.1 christos strcpy (name, buf);
10016 1.1 christos
10017 1.1 christos sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
10018 1.1 christos if (sect == NULL)
10019 1.1 christos return FALSE;
10020 1.1 christos
10021 1.3 christos sect->size = note->descsz;
10022 1.1 christos sect->filepos = note->descpos;
10023 1.1 christos sect->alignment_power = 2;
10024 1.1 christos
10025 1.1 christos /* This is the current thread. */
10026 1.1 christos if (elf_tdata (abfd)->core->lwpid == tid)
10027 1.1 christos return elfcore_maybe_make_sect (abfd, base, sect);
10028 1.1 christos
10029 1.1 christos return TRUE;
10030 1.1 christos }
10031 1.1 christos
10032 1.1 christos #define BFD_QNT_CORE_INFO 7
10033 1.1 christos #define BFD_QNT_CORE_STATUS 8
10034 1.1 christos #define BFD_QNT_CORE_GREG 9
10035 1.1 christos #define BFD_QNT_CORE_FPREG 10
10036 1.1 christos
10037 1.1 christos static bfd_boolean
10038 1.1 christos elfcore_grok_nto_note (bfd *abfd, Elf_Internal_Note *note)
10039 1.1 christos {
10040 1.1 christos /* Every GREG section has a STATUS section before it. Store the
10041 1.1 christos tid from the previous call to pass down to the next gregs
10042 1.1 christos function. */
10043 1.1 christos static long tid = 1;
10044 1.1 christos
10045 1.1 christos switch (note->type)
10046 1.1 christos {
10047 1.1 christos case BFD_QNT_CORE_INFO:
10048 1.1 christos return elfcore_make_note_pseudosection (abfd, ".qnx_core_info", note);
10049 1.1 christos case BFD_QNT_CORE_STATUS:
10050 1.1 christos return elfcore_grok_nto_status (abfd, note, &tid);
10051 1.1 christos case BFD_QNT_CORE_GREG:
10052 1.1 christos return elfcore_grok_nto_regs (abfd, note, tid, ".reg");
10053 1.1 christos case BFD_QNT_CORE_FPREG:
10054 1.1 christos return elfcore_grok_nto_regs (abfd, note, tid, ".reg2");
10055 1.1 christos default:
10056 1.1 christos return TRUE;
10057 1.1 christos }
10058 1.1 christos }
10059 1.1 christos
10060 1.1 christos static bfd_boolean
10061 1.1 christos elfcore_grok_spu_note (bfd *abfd, Elf_Internal_Note *note)
10062 1.1 christos {
10063 1.1 christos char *name;
10064 1.1 christos asection *sect;
10065 1.1 christos size_t len;
10066 1.1 christos
10067 1.1 christos /* Use note name as section name. */
10068 1.1 christos len = note->namesz;
10069 1.1 christos name = (char *) bfd_alloc (abfd, len);
10070 1.1 christos if (name == NULL)
10071 1.1 christos return FALSE;
10072 1.1 christos memcpy (name, note->namedata, len);
10073 1.1 christos name[len - 1] = '\0';
10074 1.1 christos
10075 1.1 christos sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
10076 1.1 christos if (sect == NULL)
10077 1.1 christos return FALSE;
10078 1.1 christos
10079 1.1 christos sect->size = note->descsz;
10080 1.1 christos sect->filepos = note->descpos;
10081 1.1 christos sect->alignment_power = 1;
10082 1.1 christos
10083 1.1 christos return TRUE;
10084 1.1 christos }
10085 1.1 christos
10086 1.1 christos /* Function: elfcore_write_note
10087 1.1 christos
10088 1.1 christos Inputs:
10089 1.1 christos buffer to hold note, and current size of buffer
10090 1.1 christos name of note
10091 1.1 christos type of note
10092 1.1 christos data for note
10093 1.1 christos size of data for note
10094 1.1 christos
10095 1.1 christos Writes note to end of buffer. ELF64 notes are written exactly as
10096 1.1 christos for ELF32, despite the current (as of 2006) ELF gabi specifying
10097 1.1 christos that they ought to have 8-byte namesz and descsz field, and have
10098 1.1 christos 8-byte alignment. Other writers, eg. Linux kernel, do the same.
10099 1.1 christos
10100 1.1 christos Return:
10101 1.1 christos Pointer to realloc'd buffer, *BUFSIZ updated. */
10102 1.1 christos
10103 1.1 christos char *
10104 1.1 christos elfcore_write_note (bfd *abfd,
10105 1.1 christos char *buf,
10106 1.1 christos int *bufsiz,
10107 1.1 christos const char *name,
10108 1.1 christos int type,
10109 1.1 christos const void *input,
10110 1.1 christos int size)
10111 1.1 christos {
10112 1.1 christos Elf_External_Note *xnp;
10113 1.1 christos size_t namesz;
10114 1.1 christos size_t newspace;
10115 1.1 christos char *dest;
10116 1.1 christos
10117 1.1 christos namesz = 0;
10118 1.1 christos if (name != NULL)
10119 1.1 christos namesz = strlen (name) + 1;
10120 1.1 christos
10121 1.1 christos newspace = 12 + ((namesz + 3) & -4) + ((size + 3) & -4);
10122 1.1 christos
10123 1.1 christos buf = (char *) realloc (buf, *bufsiz + newspace);
10124 1.1 christos if (buf == NULL)
10125 1.1 christos return buf;
10126 1.1 christos dest = buf + *bufsiz;
10127 1.1 christos *bufsiz += newspace;
10128 1.1 christos xnp = (Elf_External_Note *) dest;
10129 1.1 christos H_PUT_32 (abfd, namesz, xnp->namesz);
10130 1.1 christos H_PUT_32 (abfd, size, xnp->descsz);
10131 1.1 christos H_PUT_32 (abfd, type, xnp->type);
10132 1.1 christos dest = xnp->name;
10133 1.1 christos if (name != NULL)
10134 1.1 christos {
10135 1.1 christos memcpy (dest, name, namesz);
10136 1.1 christos dest += namesz;
10137 1.1 christos while (namesz & 3)
10138 1.1 christos {
10139 1.1 christos *dest++ = '\0';
10140 1.1 christos ++namesz;
10141 1.1 christos }
10142 1.1 christos }
10143 1.1 christos memcpy (dest, input, size);
10144 1.1 christos dest += size;
10145 1.1 christos while (size & 3)
10146 1.1 christos {
10147 1.1 christos *dest++ = '\0';
10148 1.1 christos ++size;
10149 1.1 christos }
10150 1.1 christos return buf;
10151 1.1 christos }
10152 1.1 christos
10153 1.1 christos char *
10154 1.1 christos elfcore_write_prpsinfo (bfd *abfd,
10155 1.1 christos char *buf,
10156 1.1 christos int *bufsiz,
10157 1.1 christos const char *fname,
10158 1.1 christos const char *psargs)
10159 1.1 christos {
10160 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
10161 1.1 christos
10162 1.1 christos if (bed->elf_backend_write_core_note != NULL)
10163 1.1 christos {
10164 1.1 christos char *ret;
10165 1.1 christos ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
10166 1.3 christos NT_PRPSINFO, fname, psargs);
10167 1.1 christos if (ret != NULL)
10168 1.1 christos return ret;
10169 1.1 christos }
10170 1.1 christos
10171 1.1 christos #if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
10172 1.1 christos #if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
10173 1.1 christos if (bed->s->elfclass == ELFCLASS32)
10174 1.1 christos {
10175 1.1 christos #if defined (HAVE_PSINFO32_T)
10176 1.1 christos psinfo32_t data;
10177 1.1 christos int note_type = NT_PSINFO;
10178 1.1 christos #else
10179 1.1 christos prpsinfo32_t data;
10180 1.1 christos int note_type = NT_PRPSINFO;
10181 1.1 christos #endif
10182 1.3 christos
10183 1.1 christos memset (&data, 0, sizeof (data));
10184 1.1 christos strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
10185 1.1 christos strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
10186 1.1 christos return elfcore_write_note (abfd, buf, bufsiz,
10187 1.1 christos "CORE", note_type, &data, sizeof (data));
10188 1.1 christos }
10189 1.1 christos else
10190 1.1 christos #endif
10191 1.1 christos {
10192 1.1 christos #if defined (HAVE_PSINFO_T)
10193 1.1 christos psinfo_t data;
10194 1.1 christos int note_type = NT_PSINFO;
10195 1.1 christos #else
10196 1.1 christos prpsinfo_t data;
10197 1.1 christos int note_type = NT_PRPSINFO;
10198 1.1 christos #endif
10199 1.3 christos
10200 1.1 christos memset (&data, 0, sizeof (data));
10201 1.3 christos strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
10202 1.3 christos strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
10203 1.3 christos return elfcore_write_note (abfd, buf, bufsiz,
10204 1.3 christos "CORE", note_type, &data, sizeof (data));
10205 1.3 christos }
10206 1.3 christos #endif /* PSINFO_T or PRPSINFO_T */
10207 1.3 christos
10208 1.3 christos free (buf);
10209 1.3 christos return NULL;
10210 1.3 christos }
10211 1.3 christos
10212 1.3 christos char *
10213 1.3 christos elfcore_write_linux_prpsinfo32
10214 1.8 christos (bfd *abfd, char *buf, int *bufsiz,
10215 1.3 christos const struct elf_internal_linux_prpsinfo *prpsinfo)
10216 1.3 christos {
10217 1.3 christos struct elf_external_linux_prpsinfo32 data;
10218 1.3 christos
10219 1.3 christos swap_linux_prpsinfo32_out (abfd, prpsinfo, &data);
10220 1.3 christos return elfcore_write_note (abfd, buf, bufsiz, "CORE", NT_PRPSINFO,
10221 1.3 christos &data, sizeof (data));
10222 1.3 christos }
10223 1.3 christos
10224 1.3 christos char *
10225 1.3 christos elfcore_write_linux_prpsinfo64
10226 1.8 christos (bfd *abfd, char *buf, int *bufsiz,
10227 1.3 christos const struct elf_internal_linux_prpsinfo *prpsinfo)
10228 1.3 christos {
10229 1.1 christos struct elf_external_linux_prpsinfo64 data;
10230 1.1 christos
10231 1.1 christos swap_linux_prpsinfo64_out (abfd, prpsinfo, &data);
10232 1.1 christos return elfcore_write_note (abfd, buf, bufsiz,
10233 1.1 christos "CORE", NT_PRPSINFO, &data, sizeof (data));
10234 1.1 christos }
10235 1.1 christos
10236 1.1 christos char *
10237 1.1 christos elfcore_write_prstatus (bfd *abfd,
10238 1.1 christos char *buf,
10239 1.1 christos int *bufsiz,
10240 1.1 christos long pid,
10241 1.1 christos int cursig,
10242 1.1 christos const void *gregs)
10243 1.1 christos {
10244 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
10245 1.1 christos
10246 1.1 christos if (bed->elf_backend_write_core_note != NULL)
10247 1.1 christos {
10248 1.1 christos char *ret;
10249 1.1 christos ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
10250 1.1 christos NT_PRSTATUS,
10251 1.3 christos pid, cursig, gregs);
10252 1.1 christos if (ret != NULL)
10253 1.1 christos return ret;
10254 1.1 christos }
10255 1.1 christos
10256 1.1 christos #if defined (HAVE_PRSTATUS_T)
10257 1.1 christos #if defined (HAVE_PRSTATUS32_T)
10258 1.1 christos if (bed->s->elfclass == ELFCLASS32)
10259 1.1 christos {
10260 1.1 christos prstatus32_t prstat;
10261 1.3 christos
10262 1.1 christos memset (&prstat, 0, sizeof (prstat));
10263 1.1 christos prstat.pr_pid = pid;
10264 1.1 christos prstat.pr_cursig = cursig;
10265 1.1 christos memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
10266 1.1 christos return elfcore_write_note (abfd, buf, bufsiz, "CORE",
10267 1.1 christos NT_PRSTATUS, &prstat, sizeof (prstat));
10268 1.1 christos }
10269 1.1 christos else
10270 1.1 christos #endif
10271 1.1 christos {
10272 1.1 christos prstatus_t prstat;
10273 1.3 christos
10274 1.1 christos memset (&prstat, 0, sizeof (prstat));
10275 1.1 christos prstat.pr_pid = pid;
10276 1.3 christos prstat.pr_cursig = cursig;
10277 1.3 christos memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
10278 1.3 christos return elfcore_write_note (abfd, buf, bufsiz, "CORE",
10279 1.3 christos NT_PRSTATUS, &prstat, sizeof (prstat));
10280 1.1 christos }
10281 1.1 christos #endif /* HAVE_PRSTATUS_T */
10282 1.1 christos
10283 1.1 christos free (buf);
10284 1.1 christos return NULL;
10285 1.1 christos }
10286 1.1 christos
10287 1.1 christos #if defined (HAVE_LWPSTATUS_T)
10288 1.1 christos char *
10289 1.1 christos elfcore_write_lwpstatus (bfd *abfd,
10290 1.1 christos char *buf,
10291 1.1 christos int *bufsiz,
10292 1.1 christos long pid,
10293 1.1 christos int cursig,
10294 1.1 christos const void *gregs)
10295 1.1 christos {
10296 1.1 christos lwpstatus_t lwpstat;
10297 1.1 christos const char *note_name = "CORE";
10298 1.5 christos
10299 1.1 christos memset (&lwpstat, 0, sizeof (lwpstat));
10300 1.1 christos lwpstat.pr_lwpid = pid >> 16;
10301 1.1 christos lwpstat.pr_cursig = cursig;
10302 1.1 christos #if defined (HAVE_LWPSTATUS_T_PR_REG)
10303 1.1 christos memcpy (&lwpstat.pr_reg, gregs, sizeof (lwpstat.pr_reg));
10304 1.1 christos #elif defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
10305 1.1 christos #if !defined(gregs)
10306 1.1 christos memcpy (lwpstat.pr_context.uc_mcontext.gregs,
10307 1.1 christos gregs, sizeof (lwpstat.pr_context.uc_mcontext.gregs));
10308 1.1 christos #else
10309 1.1 christos memcpy (lwpstat.pr_context.uc_mcontext.__gregs,
10310 1.1 christos gregs, sizeof (lwpstat.pr_context.uc_mcontext.__gregs));
10311 1.1 christos #endif
10312 1.1 christos #endif
10313 1.1 christos return elfcore_write_note (abfd, buf, bufsiz, note_name,
10314 1.1 christos NT_LWPSTATUS, &lwpstat, sizeof (lwpstat));
10315 1.1 christos }
10316 1.1 christos #endif /* HAVE_LWPSTATUS_T */
10317 1.1 christos
10318 1.1 christos #if defined (HAVE_PSTATUS_T)
10319 1.1 christos char *
10320 1.1 christos elfcore_write_pstatus (bfd *abfd,
10321 1.1 christos char *buf,
10322 1.1 christos int *bufsiz,
10323 1.1 christos long pid,
10324 1.1 christos int cursig ATTRIBUTE_UNUSED,
10325 1.1 christos const void *gregs ATTRIBUTE_UNUSED)
10326 1.1 christos {
10327 1.1 christos const char *note_name = "CORE";
10328 1.1 christos #if defined (HAVE_PSTATUS32_T)
10329 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
10330 1.1 christos
10331 1.1 christos if (bed->s->elfclass == ELFCLASS32)
10332 1.1 christos {
10333 1.1 christos pstatus32_t pstat;
10334 1.1 christos
10335 1.1 christos memset (&pstat, 0, sizeof (pstat));
10336 1.1 christos pstat.pr_pid = pid & 0xffff;
10337 1.1 christos buf = elfcore_write_note (abfd, buf, bufsiz, note_name,
10338 1.1 christos NT_PSTATUS, &pstat, sizeof (pstat));
10339 1.1 christos return buf;
10340 1.1 christos }
10341 1.1 christos else
10342 1.1 christos #endif
10343 1.1 christos {
10344 1.1 christos pstatus_t pstat;
10345 1.1 christos
10346 1.1 christos memset (&pstat, 0, sizeof (pstat));
10347 1.1 christos pstat.pr_pid = pid & 0xffff;
10348 1.1 christos buf = elfcore_write_note (abfd, buf, bufsiz, note_name,
10349 1.1 christos NT_PSTATUS, &pstat, sizeof (pstat));
10350 1.1 christos return buf;
10351 1.1 christos }
10352 1.1 christos }
10353 1.1 christos #endif /* HAVE_PSTATUS_T */
10354 1.1 christos
10355 1.1 christos char *
10356 1.1 christos elfcore_write_prfpreg (bfd *abfd,
10357 1.1 christos char *buf,
10358 1.1 christos int *bufsiz,
10359 1.1 christos const void *fpregs,
10360 1.1 christos int size)
10361 1.1 christos {
10362 1.1 christos const char *note_name = "CORE";
10363 1.1 christos return elfcore_write_note (abfd, buf, bufsiz,
10364 1.1 christos note_name, NT_FPREGSET, fpregs, size);
10365 1.1 christos }
10366 1.1 christos
10367 1.1 christos char *
10368 1.1 christos elfcore_write_prxfpreg (bfd *abfd,
10369 1.1 christos char *buf,
10370 1.1 christos int *bufsiz,
10371 1.1 christos const void *xfpregs,
10372 1.1 christos int size)
10373 1.1 christos {
10374 1.1 christos char *note_name = "LINUX";
10375 1.1 christos return elfcore_write_note (abfd, buf, bufsiz,
10376 1.1 christos note_name, NT_PRXFPREG, xfpregs, size);
10377 1.1 christos }
10378 1.6 christos
10379 1.6 christos char *
10380 1.6 christos elfcore_write_xstatereg (bfd *abfd, char *buf, int *bufsiz,
10381 1.6 christos const void *xfpregs, int size)
10382 1.6 christos {
10383 1.1 christos char *note_name;
10384 1.1 christos if (get_elf_backend_data (abfd)->elf_osabi == ELFOSABI_FREEBSD)
10385 1.1 christos note_name = "FreeBSD";
10386 1.1 christos else
10387 1.1 christos note_name = "LINUX";
10388 1.1 christos return elfcore_write_note (abfd, buf, bufsiz,
10389 1.1 christos note_name, NT_X86_XSTATE, xfpregs, size);
10390 1.1 christos }
10391 1.1 christos
10392 1.1 christos char *
10393 1.1 christos elfcore_write_ppc_vmx (bfd *abfd,
10394 1.1 christos char *buf,
10395 1.1 christos int *bufsiz,
10396 1.1 christos const void *ppc_vmx,
10397 1.1 christos int size)
10398 1.1 christos {
10399 1.1 christos char *note_name = "LINUX";
10400 1.1 christos return elfcore_write_note (abfd, buf, bufsiz,
10401 1.1 christos note_name, NT_PPC_VMX, ppc_vmx, size);
10402 1.1 christos }
10403 1.1 christos
10404 1.1 christos char *
10405 1.1 christos elfcore_write_ppc_vsx (bfd *abfd,
10406 1.1 christos char *buf,
10407 1.1 christos int *bufsiz,
10408 1.1 christos const void *ppc_vsx,
10409 1.1 christos int size)
10410 1.1 christos {
10411 1.1 christos char *note_name = "LINUX";
10412 1.1 christos return elfcore_write_note (abfd, buf, bufsiz,
10413 1.1 christos note_name, NT_PPC_VSX, ppc_vsx, size);
10414 1.1 christos }
10415 1.1 christos
10416 1.1 christos static char *
10417 1.1 christos elfcore_write_s390_high_gprs (bfd *abfd,
10418 1.1 christos char *buf,
10419 1.1 christos int *bufsiz,
10420 1.1 christos const void *s390_high_gprs,
10421 1.1 christos int size)
10422 1.1 christos {
10423 1.1 christos char *note_name = "LINUX";
10424 1.1 christos return elfcore_write_note (abfd, buf, bufsiz,
10425 1.1 christos note_name, NT_S390_HIGH_GPRS,
10426 1.1 christos s390_high_gprs, size);
10427 1.1 christos }
10428 1.1 christos
10429 1.1 christos char *
10430 1.1 christos elfcore_write_s390_timer (bfd *abfd,
10431 1.1 christos char *buf,
10432 1.1 christos int *bufsiz,
10433 1.1 christos const void *s390_timer,
10434 1.1 christos int size)
10435 1.1 christos {
10436 1.1 christos char *note_name = "LINUX";
10437 1.1 christos return elfcore_write_note (abfd, buf, bufsiz,
10438 1.1 christos note_name, NT_S390_TIMER, s390_timer, size);
10439 1.1 christos }
10440 1.1 christos
10441 1.1 christos char *
10442 1.1 christos elfcore_write_s390_todcmp (bfd *abfd,
10443 1.1 christos char *buf,
10444 1.1 christos int *bufsiz,
10445 1.1 christos const void *s390_todcmp,
10446 1.1 christos int size)
10447 1.1 christos {
10448 1.1 christos char *note_name = "LINUX";
10449 1.1 christos return elfcore_write_note (abfd, buf, bufsiz,
10450 1.1 christos note_name, NT_S390_TODCMP, s390_todcmp, size);
10451 1.1 christos }
10452 1.1 christos
10453 1.1 christos char *
10454 1.1 christos elfcore_write_s390_todpreg (bfd *abfd,
10455 1.1 christos char *buf,
10456 1.1 christos int *bufsiz,
10457 1.1 christos const void *s390_todpreg,
10458 1.1 christos int size)
10459 1.1 christos {
10460 1.1 christos char *note_name = "LINUX";
10461 1.1 christos return elfcore_write_note (abfd, buf, bufsiz,
10462 1.1 christos note_name, NT_S390_TODPREG, s390_todpreg, size);
10463 1.1 christos }
10464 1.1 christos
10465 1.1 christos char *
10466 1.1 christos elfcore_write_s390_ctrs (bfd *abfd,
10467 1.1 christos char *buf,
10468 1.1 christos int *bufsiz,
10469 1.1 christos const void *s390_ctrs,
10470 1.1 christos int size)
10471 1.1 christos {
10472 1.1 christos char *note_name = "LINUX";
10473 1.1 christos return elfcore_write_note (abfd, buf, bufsiz,
10474 1.1 christos note_name, NT_S390_CTRS, s390_ctrs, size);
10475 1.1 christos }
10476 1.1 christos
10477 1.1 christos char *
10478 1.1 christos elfcore_write_s390_prefix (bfd *abfd,
10479 1.1 christos char *buf,
10480 1.1 christos int *bufsiz,
10481 1.1 christos const void *s390_prefix,
10482 1.1 christos int size)
10483 1.1 christos {
10484 1.1 christos char *note_name = "LINUX";
10485 1.3 christos return elfcore_write_note (abfd, buf, bufsiz,
10486 1.3 christos note_name, NT_S390_PREFIX, s390_prefix, size);
10487 1.3 christos }
10488 1.3 christos
10489 1.3 christos char *
10490 1.3 christos elfcore_write_s390_last_break (bfd *abfd,
10491 1.3 christos char *buf,
10492 1.3 christos int *bufsiz,
10493 1.3 christos const void *s390_last_break,
10494 1.3 christos int size)
10495 1.3 christos {
10496 1.3 christos char *note_name = "LINUX";
10497 1.3 christos return elfcore_write_note (abfd, buf, bufsiz,
10498 1.3 christos note_name, NT_S390_LAST_BREAK,
10499 1.3 christos s390_last_break, size);
10500 1.3 christos }
10501 1.3 christos
10502 1.3 christos char *
10503 1.3 christos elfcore_write_s390_system_call (bfd *abfd,
10504 1.3 christos char *buf,
10505 1.3 christos int *bufsiz,
10506 1.3 christos const void *s390_system_call,
10507 1.3 christos int size)
10508 1.3 christos {
10509 1.3 christos char *note_name = "LINUX";
10510 1.3 christos return elfcore_write_note (abfd, buf, bufsiz,
10511 1.3 christos note_name, NT_S390_SYSTEM_CALL,
10512 1.3 christos s390_system_call, size);
10513 1.3 christos }
10514 1.3 christos
10515 1.3 christos char *
10516 1.3 christos elfcore_write_s390_tdb (bfd *abfd,
10517 1.3 christos char *buf,
10518 1.3 christos int *bufsiz,
10519 1.3 christos const void *s390_tdb,
10520 1.3 christos int size)
10521 1.3 christos {
10522 1.3 christos char *note_name = "LINUX";
10523 1.6 christos return elfcore_write_note (abfd, buf, bufsiz,
10524 1.6 christos note_name, NT_S390_TDB, s390_tdb, size);
10525 1.6 christos }
10526 1.6 christos
10527 1.6 christos char *
10528 1.6 christos elfcore_write_s390_vxrs_low (bfd *abfd,
10529 1.6 christos char *buf,
10530 1.6 christos int *bufsiz,
10531 1.6 christos const void *s390_vxrs_low,
10532 1.6 christos int size)
10533 1.6 christos {
10534 1.6 christos char *note_name = "LINUX";
10535 1.6 christos return elfcore_write_note (abfd, buf, bufsiz,
10536 1.6 christos note_name, NT_S390_VXRS_LOW, s390_vxrs_low, size);
10537 1.6 christos }
10538 1.6 christos
10539 1.6 christos char *
10540 1.6 christos elfcore_write_s390_vxrs_high (bfd *abfd,
10541 1.6 christos char *buf,
10542 1.6 christos int *bufsiz,
10543 1.6 christos const void *s390_vxrs_high,
10544 1.6 christos int size)
10545 1.6 christos {
10546 1.6 christos char *note_name = "LINUX";
10547 1.6 christos return elfcore_write_note (abfd, buf, bufsiz,
10548 1.3 christos note_name, NT_S390_VXRS_HIGH,
10549 1.3 christos s390_vxrs_high, size);
10550 1.3 christos }
10551 1.3 christos
10552 1.3 christos char *
10553 1.3 christos elfcore_write_arm_vfp (bfd *abfd,
10554 1.3 christos char *buf,
10555 1.3 christos int *bufsiz,
10556 1.3 christos const void *arm_vfp,
10557 1.3 christos int size)
10558 1.3 christos {
10559 1.3 christos char *note_name = "LINUX";
10560 1.3 christos return elfcore_write_note (abfd, buf, bufsiz,
10561 1.3 christos note_name, NT_ARM_VFP, arm_vfp, size);
10562 1.3 christos }
10563 1.3 christos
10564 1.3 christos char *
10565 1.3 christos elfcore_write_aarch_tls (bfd *abfd,
10566 1.3 christos char *buf,
10567 1.3 christos int *bufsiz,
10568 1.3 christos const void *aarch_tls,
10569 1.3 christos int size)
10570 1.3 christos {
10571 1.3 christos char *note_name = "LINUX";
10572 1.3 christos return elfcore_write_note (abfd, buf, bufsiz,
10573 1.3 christos note_name, NT_ARM_TLS, aarch_tls, size);
10574 1.3 christos }
10575 1.3 christos
10576 1.3 christos char *
10577 1.3 christos elfcore_write_aarch_hw_break (bfd *abfd,
10578 1.3 christos char *buf,
10579 1.3 christos int *bufsiz,
10580 1.3 christos const void *aarch_hw_break,
10581 1.3 christos int size)
10582 1.3 christos {
10583 1.3 christos char *note_name = "LINUX";
10584 1.3 christos return elfcore_write_note (abfd, buf, bufsiz,
10585 1.3 christos note_name, NT_ARM_HW_BREAK, aarch_hw_break, size);
10586 1.3 christos }
10587 1.3 christos
10588 1.3 christos char *
10589 1.3 christos elfcore_write_aarch_hw_watch (bfd *abfd,
10590 1.3 christos char *buf,
10591 1.3 christos int *bufsiz,
10592 1.3 christos const void *aarch_hw_watch,
10593 1.3 christos int size)
10594 1.3 christos {
10595 1.3 christos char *note_name = "LINUX";
10596 1.1 christos return elfcore_write_note (abfd, buf, bufsiz,
10597 1.1 christos note_name, NT_ARM_HW_WATCH, aarch_hw_watch, size);
10598 1.1 christos }
10599 1.1 christos
10600 1.1 christos char *
10601 1.1 christos elfcore_write_register_note (bfd *abfd,
10602 1.1 christos char *buf,
10603 1.1 christos int *bufsiz,
10604 1.1 christos const char *section,
10605 1.1 christos const void *data,
10606 1.1 christos int size)
10607 1.1 christos {
10608 1.1 christos if (strcmp (section, ".reg2") == 0)
10609 1.1 christos return elfcore_write_prfpreg (abfd, buf, bufsiz, data, size);
10610 1.1 christos if (strcmp (section, ".reg-xfp") == 0)
10611 1.1 christos return elfcore_write_prxfpreg (abfd, buf, bufsiz, data, size);
10612 1.1 christos if (strcmp (section, ".reg-xstate") == 0)
10613 1.1 christos return elfcore_write_xstatereg (abfd, buf, bufsiz, data, size);
10614 1.1 christos if (strcmp (section, ".reg-ppc-vmx") == 0)
10615 1.1 christos return elfcore_write_ppc_vmx (abfd, buf, bufsiz, data, size);
10616 1.1 christos if (strcmp (section, ".reg-ppc-vsx") == 0)
10617 1.1 christos return elfcore_write_ppc_vsx (abfd, buf, bufsiz, data, size);
10618 1.1 christos if (strcmp (section, ".reg-s390-high-gprs") == 0)
10619 1.1 christos return elfcore_write_s390_high_gprs (abfd, buf, bufsiz, data, size);
10620 1.1 christos if (strcmp (section, ".reg-s390-timer") == 0)
10621 1.1 christos return elfcore_write_s390_timer (abfd, buf, bufsiz, data, size);
10622 1.1 christos if (strcmp (section, ".reg-s390-todcmp") == 0)
10623 1.1 christos return elfcore_write_s390_todcmp (abfd, buf, bufsiz, data, size);
10624 1.1 christos if (strcmp (section, ".reg-s390-todpreg") == 0)
10625 1.3 christos return elfcore_write_s390_todpreg (abfd, buf, bufsiz, data, size);
10626 1.3 christos if (strcmp (section, ".reg-s390-ctrs") == 0)
10627 1.3 christos return elfcore_write_s390_ctrs (abfd, buf, bufsiz, data, size);
10628 1.3 christos if (strcmp (section, ".reg-s390-prefix") == 0)
10629 1.3 christos return elfcore_write_s390_prefix (abfd, buf, bufsiz, data, size);
10630 1.3 christos if (strcmp (section, ".reg-s390-last-break") == 0)
10631 1.6 christos return elfcore_write_s390_last_break (abfd, buf, bufsiz, data, size);
10632 1.6 christos if (strcmp (section, ".reg-s390-system-call") == 0)
10633 1.6 christos return elfcore_write_s390_system_call (abfd, buf, bufsiz, data, size);
10634 1.6 christos if (strcmp (section, ".reg-s390-tdb") == 0)
10635 1.3 christos return elfcore_write_s390_tdb (abfd, buf, bufsiz, data, size);
10636 1.3 christos if (strcmp (section, ".reg-s390-vxrs-low") == 0)
10637 1.3 christos return elfcore_write_s390_vxrs_low (abfd, buf, bufsiz, data, size);
10638 1.3 christos if (strcmp (section, ".reg-s390-vxrs-high") == 0)
10639 1.3 christos return elfcore_write_s390_vxrs_high (abfd, buf, bufsiz, data, size);
10640 1.3 christos if (strcmp (section, ".reg-arm-vfp") == 0)
10641 1.3 christos return elfcore_write_arm_vfp (abfd, buf, bufsiz, data, size);
10642 1.3 christos if (strcmp (section, ".reg-aarch-tls") == 0)
10643 1.1 christos return elfcore_write_aarch_tls (abfd, buf, bufsiz, data, size);
10644 1.1 christos if (strcmp (section, ".reg-aarch-hw-break") == 0)
10645 1.1 christos return elfcore_write_aarch_hw_break (abfd, buf, bufsiz, data, size);
10646 1.1 christos if (strcmp (section, ".reg-aarch-hw-watch") == 0)
10647 1.1 christos return elfcore_write_aarch_hw_watch (abfd, buf, bufsiz, data, size);
10648 1.1 christos return NULL;
10649 1.1 christos }
10650 1.1 christos
10651 1.1 christos static bfd_boolean
10652 1.1 christos elf_parse_notes (bfd *abfd, char *buf, size_t size, file_ptr offset)
10653 1.1 christos {
10654 1.1 christos char *p;
10655 1.1 christos
10656 1.1 christos p = buf;
10657 1.1 christos while (p < buf + size)
10658 1.1 christos {
10659 1.1 christos /* FIXME: bad alignment assumption. */
10660 1.1 christos Elf_External_Note *xnp = (Elf_External_Note *) p;
10661 1.1 christos Elf_Internal_Note in;
10662 1.1 christos
10663 1.1 christos if (offsetof (Elf_External_Note, name) > buf - p + size)
10664 1.1 christos return FALSE;
10665 1.1 christos
10666 1.1 christos in.type = H_GET_32 (abfd, xnp->type);
10667 1.1 christos
10668 1.1 christos in.namesz = H_GET_32 (abfd, xnp->namesz);
10669 1.1 christos in.namedata = xnp->name;
10670 1.1 christos if (in.namesz > buf - in.namedata + size)
10671 1.1 christos return FALSE;
10672 1.1 christos
10673 1.1 christos in.descsz = H_GET_32 (abfd, xnp->descsz);
10674 1.1 christos in.descdata = in.namedata + BFD_ALIGN (in.namesz, 4);
10675 1.1 christos in.descpos = offset + (in.descdata - buf);
10676 1.1 christos if (in.descsz != 0
10677 1.1 christos && (in.descdata >= buf + size
10678 1.1 christos || in.descsz > buf - in.descdata + size))
10679 1.1 christos return FALSE;
10680 1.1 christos
10681 1.1 christos switch (bfd_get_format (abfd))
10682 1.5 christos {
10683 1.5 christos default:
10684 1.5 christos return TRUE;
10685 1.1 christos
10686 1.5 christos case bfd_core:
10687 1.5 christos {
10688 1.5 christos #define GROKER_ELEMENT(S,F) {S, sizeof (S) - 1, F}
10689 1.1 christos struct
10690 1.5 christos {
10691 1.1 christos const char * string;
10692 1.5 christos size_t len;
10693 1.8 christos bfd_boolean (* func)(bfd *, Elf_Internal_Note *);
10694 1.5 christos }
10695 1.5 christos grokers[] =
10696 1.5 christos {
10697 1.5 christos GROKER_ELEMENT ("", elfcore_grok_note),
10698 1.5 christos GROKER_ELEMENT ("FreeBSD", elfcore_grok_freebsd_note),
10699 1.5 christos GROKER_ELEMENT ("NetBSD-CORE", elfcore_grok_netbsd_note),
10700 1.5 christos GROKER_ELEMENT ( "OpenBSD", elfcore_grok_openbsd_note),
10701 1.5 christos GROKER_ELEMENT ("QNX", elfcore_grok_nto_note),
10702 1.5 christos GROKER_ELEMENT ("SPU/", elfcore_grok_spu_note)
10703 1.5 christos };
10704 1.5 christos #undef GROKER_ELEMENT
10705 1.5 christos int i;
10706 1.5 christos
10707 1.5 christos for (i = ARRAY_SIZE (grokers); i--;)
10708 1.5 christos {
10709 1.5 christos if (in.namesz >= grokers[i].len
10710 1.5 christos && strncmp (in.namedata, grokers[i].string,
10711 1.5 christos grokers[i].len) == 0)
10712 1.5 christos {
10713 1.5 christos if (! grokers[i].func (abfd, & in))
10714 1.5 christos return FALSE;
10715 1.1 christos break;
10716 1.1 christos }
10717 1.1 christos }
10718 1.1 christos break;
10719 1.1 christos }
10720 1.1 christos
10721 1.1 christos case bfd_object:
10722 1.3 christos if (in.namesz == sizeof "GNU" && strcmp (in.namedata, "GNU") == 0)
10723 1.3 christos {
10724 1.3 christos if (! elfobj_grok_gnu_note (abfd, &in))
10725 1.3 christos return FALSE;
10726 1.3 christos }
10727 1.3 christos else if (in.namesz == sizeof "stapsdt"
10728 1.1 christos && strcmp (in.namedata, "stapsdt") == 0)
10729 1.1 christos {
10730 1.1 christos if (! elfobj_grok_stapsdt_note (abfd, &in))
10731 1.1 christos return FALSE;
10732 1.1 christos }
10733 1.1 christos break;
10734 1.1 christos }
10735 1.1 christos
10736 1.1 christos p = in.descdata + BFD_ALIGN (in.descsz, 4);
10737 1.1 christos }
10738 1.1 christos
10739 1.1 christos return TRUE;
10740 1.1 christos }
10741 1.1 christos
10742 1.1 christos static bfd_boolean
10743 1.1 christos elf_read_notes (bfd *abfd, file_ptr offset, bfd_size_type size)
10744 1.1 christos {
10745 1.1 christos char *buf;
10746 1.1 christos
10747 1.1 christos if (size <= 0)
10748 1.5 christos return TRUE;
10749 1.1 christos
10750 1.1 christos if (bfd_seek (abfd, offset, SEEK_SET) != 0)
10751 1.1 christos return FALSE;
10752 1.5 christos
10753 1.5 christos buf = (char *) bfd_malloc (size + 1);
10754 1.5 christos if (buf == NULL)
10755 1.5 christos return FALSE;
10756 1.1 christos
10757 1.1 christos /* PR 17512: file: ec08f814
10758 1.1 christos 0-termintate the buffer so that string searches will not overflow. */
10759 1.1 christos buf[size] = 0;
10760 1.1 christos
10761 1.1 christos if (bfd_bread (buf, size, abfd) != size
10762 1.1 christos || !elf_parse_notes (abfd, buf, size, offset))
10763 1.1 christos {
10764 1.1 christos free (buf);
10765 1.1 christos return FALSE;
10766 1.1 christos }
10767 1.1 christos
10768 1.1 christos free (buf);
10769 1.1 christos return TRUE;
10770 1.1 christos }
10771 1.1 christos
10772 1.1 christos /* Providing external access to the ELF program header table. */
10774 1.1 christos
10775 1.1 christos /* Return an upper bound on the number of bytes required to store a
10776 1.1 christos copy of ABFD's program header table entries. Return -1 if an error
10777 1.1 christos occurs; bfd_get_error will return an appropriate code. */
10778 1.1 christos
10779 1.1 christos long
10780 1.1 christos bfd_get_elf_phdr_upper_bound (bfd *abfd)
10781 1.1 christos {
10782 1.1 christos if (abfd->xvec->flavour != bfd_target_elf_flavour)
10783 1.1 christos {
10784 1.1 christos bfd_set_error (bfd_error_wrong_format);
10785 1.1 christos return -1;
10786 1.1 christos }
10787 1.1 christos
10788 1.1 christos return elf_elfheader (abfd)->e_phnum * sizeof (Elf_Internal_Phdr);
10789 1.1 christos }
10790 1.1 christos
10791 1.1 christos /* Copy ABFD's program header table entries to *PHDRS. The entries
10792 1.1 christos will be stored as an array of Elf_Internal_Phdr structures, as
10793 1.1 christos defined in include/elf/internal.h. To find out how large the
10794 1.1 christos buffer needs to be, call bfd_get_elf_phdr_upper_bound.
10795 1.1 christos
10796 1.1 christos Return the number of program header table entries read, or -1 if an
10797 1.1 christos error occurs; bfd_get_error will return an appropriate code. */
10798 1.1 christos
10799 1.1 christos int
10800 1.1 christos bfd_get_elf_phdrs (bfd *abfd, void *phdrs)
10801 1.1 christos {
10802 1.1 christos int num_phdrs;
10803 1.1 christos
10804 1.1 christos if (abfd->xvec->flavour != bfd_target_elf_flavour)
10805 1.1 christos {
10806 1.1 christos bfd_set_error (bfd_error_wrong_format);
10807 1.1 christos return -1;
10808 1.1 christos }
10809 1.1 christos
10810 1.1 christos num_phdrs = elf_elfheader (abfd)->e_phnum;
10811 1.1 christos memcpy (phdrs, elf_tdata (abfd)->phdr,
10812 1.4 christos num_phdrs * sizeof (Elf_Internal_Phdr));
10813 1.4 christos
10814 1.4 christos return num_phdrs;
10815 1.1 christos }
10816 1.1 christos
10817 1.1 christos enum elf_reloc_type_class
10818 1.1 christos _bfd_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
10819 1.1 christos const asection *rel_sec ATTRIBUTE_UNUSED,
10820 1.1 christos const Elf_Internal_Rela *rela ATTRIBUTE_UNUSED)
10821 1.1 christos {
10822 1.1 christos return reloc_class_normal;
10823 1.1 christos }
10824 1.1 christos
10825 1.1 christos /* For RELA architectures, return the relocation value for a
10826 1.1 christos relocation against a local symbol. */
10827 1.1 christos
10828 1.1 christos bfd_vma
10829 1.1 christos _bfd_elf_rela_local_sym (bfd *abfd,
10830 1.1 christos Elf_Internal_Sym *sym,
10831 1.1 christos asection **psec,
10832 1.1 christos Elf_Internal_Rela *rel)
10833 1.1 christos {
10834 1.1 christos asection *sec = *psec;
10835 1.1 christos bfd_vma relocation;
10836 1.3 christos
10837 1.1 christos relocation = (sec->output_section->vma
10838 1.1 christos + sec->output_offset
10839 1.1 christos + sym->st_value);
10840 1.1 christos if ((sec->flags & SEC_MERGE)
10841 1.1 christos && ELF_ST_TYPE (sym->st_info) == STT_SECTION
10842 1.1 christos && sec->sec_info_type == SEC_INFO_TYPE_MERGE)
10843 1.1 christos {
10844 1.1 christos rel->r_addend =
10845 1.1 christos _bfd_merged_section_offset (abfd, psec,
10846 1.1 christos elf_section_data (sec)->sec_info,
10847 1.1 christos sym->st_value + rel->r_addend);
10848 1.1 christos if (sec != *psec)
10849 1.1 christos {
10850 1.1 christos /* If we have changed the section, and our original section is
10851 1.1 christos marked with SEC_EXCLUDE, it means that the original
10852 1.1 christos SEC_MERGE section has been completely subsumed in some
10853 1.1 christos other SEC_MERGE section. In this case, we need to leave
10854 1.1 christos some info around for --emit-relocs. */
10855 1.1 christos if ((sec->flags & SEC_EXCLUDE) != 0)
10856 1.1 christos sec->kept_section = *psec;
10857 1.1 christos sec = *psec;
10858 1.1 christos }
10859 1.1 christos rel->r_addend -= relocation;
10860 1.1 christos rel->r_addend += sec->output_section->vma + sec->output_offset;
10861 1.1 christos }
10862 1.1 christos return relocation;
10863 1.1 christos }
10864 1.1 christos
10865 1.1 christos bfd_vma
10866 1.1 christos _bfd_elf_rel_local_sym (bfd *abfd,
10867 1.3 christos Elf_Internal_Sym *sym,
10868 1.1 christos asection **psec,
10869 1.1 christos bfd_vma addend)
10870 1.1 christos {
10871 1.1 christos asection *sec = *psec;
10872 1.1 christos
10873 1.1 christos if (sec->sec_info_type != SEC_INFO_TYPE_MERGE)
10874 1.1 christos return sym->st_value + addend;
10875 1.8 christos
10876 1.8 christos return _bfd_merged_section_offset (abfd, psec,
10877 1.8 christos elf_section_data (sec)->sec_info,
10878 1.8 christos sym->st_value + addend);
10879 1.8 christos }
10880 1.8 christos
10881 1.1 christos /* Adjust an address within a section. Given OFFSET within SEC, return
10882 1.1 christos the new offset within the section, based upon changes made to the
10883 1.1 christos section. Returns -1 if the offset is now invalid.
10884 1.1 christos The offset (in abnd out) is in target sized bytes, however big a
10885 1.1 christos byte may be. */
10886 1.1 christos
10887 1.1 christos bfd_vma
10888 1.1 christos _bfd_elf_section_offset (bfd *abfd,
10889 1.3 christos struct bfd_link_info *info,
10890 1.1 christos asection *sec,
10891 1.1 christos bfd_vma offset)
10892 1.3 christos {
10893 1.1 christos switch (sec->sec_info_type)
10894 1.8 christos {
10895 1.1 christos case SEC_INFO_TYPE_STABS:
10896 1.3 christos return _bfd_stab_section_offset (sec, elf_section_data (sec)->sec_info,
10897 1.3 christos offset);
10898 1.8 christos case SEC_INFO_TYPE_EH_FRAME:
10899 1.3 christos return _bfd_elf_eh_frame_section_offset (abfd, info, sec, offset);
10900 1.3 christos
10901 1.8 christos default:
10902 1.8 christos if ((sec->flags & SEC_ELF_REVERSE_COPY) != 0)
10903 1.8 christos {
10904 1.8 christos /* Reverse the offset. */
10905 1.3 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
10906 1.1 christos bfd_size_type address_size = bed->s->arch_size / 8;
10907 1.1 christos
10908 1.1 christos /* address_size and sec->size are in octets. Convert
10909 1.1 christos to bytes before subtracting the original offset. */
10910 1.1 christos offset = (sec->size - address_size) / bfd_octets_per_byte (abfd) - offset;
10911 1.1 christos }
10912 1.1 christos return offset;
10913 1.1 christos }
10914 1.1 christos }
10915 1.1 christos
10916 1.1 christos /* Create a new BFD as if by bfd_openr. Rather than opening a file,
10918 1.1 christos reconstruct an ELF file by reading the segments out of remote memory
10919 1.1 christos based on the ELF file header at EHDR_VMA and the ELF program headers it
10920 1.1 christos points to. If not null, *LOADBASEP is filled in with the difference
10921 1.1 christos between the VMAs from which the segments were read, and the VMAs the
10922 1.1 christos file headers (and hence BFD's idea of each section's VMA) put them at.
10923 1.1 christos
10924 1.1 christos The function TARGET_READ_MEMORY is called to copy LEN bytes from the
10925 1.1 christos remote memory at target address VMA into the local buffer at MYADDR; it
10926 1.1 christos should return zero on success or an `errno' code on failure. TEMPL must
10927 1.5 christos be a BFD for an ELF target with the word size and byte order found in
10928 1.1 christos the remote memory. */
10929 1.3 christos
10930 1.1 christos bfd *
10931 1.1 christos bfd_elf_bfd_from_remote_memory
10932 1.5 christos (bfd *templ,
10933 1.1 christos bfd_vma ehdr_vma,
10934 1.1 christos bfd_size_type size,
10935 1.1 christos bfd_vma *loadbasep,
10936 1.1 christos int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
10937 1.1 christos {
10938 1.1 christos return (*get_elf_backend_data (templ)->elf_backend_bfd_from_remote_memory)
10939 1.1 christos (templ, ehdr_vma, size, loadbasep, target_read_memory);
10940 1.1 christos }
10941 1.1 christos
10942 1.1 christos long
10944 1.1 christos _bfd_elf_get_synthetic_symtab (bfd *abfd,
10945 1.1 christos long symcount ATTRIBUTE_UNUSED,
10946 1.1 christos asymbol **syms ATTRIBUTE_UNUSED,
10947 1.1 christos long dynsymcount,
10948 1.1 christos asymbol **dynsyms,
10949 1.1 christos asymbol **ret)
10950 1.1 christos {
10951 1.1 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
10952 1.1 christos asection *relplt;
10953 1.1 christos asymbol *s;
10954 1.1 christos const char *relplt_name;
10955 1.1 christos bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
10956 1.1 christos arelent *p;
10957 1.1 christos long count, i, n;
10958 1.1 christos size_t size;
10959 1.1 christos Elf_Internal_Shdr *hdr;
10960 1.1 christos char *names;
10961 1.1 christos asection *plt;
10962 1.1 christos
10963 1.1 christos *ret = NULL;
10964 1.1 christos
10965 1.1 christos if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
10966 1.1 christos return 0;
10967 1.1 christos
10968 1.1 christos if (dynsymcount <= 0)
10969 1.1 christos return 0;
10970 1.1 christos
10971 1.1 christos if (!bed->plt_sym_val)
10972 1.1 christos return 0;
10973 1.1 christos
10974 1.1 christos relplt_name = bed->relplt_name;
10975 1.1 christos if (relplt_name == NULL)
10976 1.1 christos relplt_name = bed->rela_plts_and_copies_p ? ".rela.plt" : ".rel.plt";
10977 1.1 christos relplt = bfd_get_section_by_name (abfd, relplt_name);
10978 1.1 christos if (relplt == NULL)
10979 1.1 christos return 0;
10980 1.1 christos
10981 1.1 christos hdr = &elf_section_data (relplt)->this_hdr;
10982 1.1 christos if (hdr->sh_link != elf_dynsymtab (abfd)
10983 1.1 christos || (hdr->sh_type != SHT_REL && hdr->sh_type != SHT_RELA))
10984 1.1 christos return 0;
10985 1.1 christos
10986 1.1 christos plt = bfd_get_section_by_name (abfd, ".plt");
10987 1.1 christos if (plt == NULL)
10988 1.1 christos return 0;
10989 1.1 christos
10990 1.1 christos slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
10991 1.1 christos if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
10992 1.1 christos return -1;
10993 1.1 christos
10994 1.1 christos count = relplt->size / hdr->sh_entsize;
10995 1.1 christos size = count * sizeof (asymbol);
10996 1.1 christos p = relplt->relocation;
10997 1.1 christos for (i = 0; i < count; i++, p += bed->s->int_rels_per_ext_rel)
10998 1.1 christos {
10999 1.1 christos size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
11000 1.1 christos if (p->addend != 0)
11001 1.1 christos {
11002 1.1 christos #ifdef BFD64
11003 1.1 christos size += sizeof ("+0x") - 1 + 8 + 8 * (bed->s->elfclass == ELFCLASS64);
11004 1.1 christos #else
11005 1.1 christos size += sizeof ("+0x") - 1 + 8;
11006 1.1 christos #endif
11007 1.1 christos }
11008 1.1 christos }
11009 1.1 christos
11010 1.1 christos s = *ret = (asymbol *) bfd_malloc (size);
11011 1.1 christos if (s == NULL)
11012 1.1 christos return -1;
11013 1.1 christos
11014 1.1 christos names = (char *) (s + count);
11015 1.1 christos p = relplt->relocation;
11016 1.1 christos n = 0;
11017 1.1 christos for (i = 0; i < count; i++, p += bed->s->int_rels_per_ext_rel)
11018 1.1 christos {
11019 1.1 christos size_t len;
11020 1.1 christos bfd_vma addr;
11021 1.1 christos
11022 1.1 christos addr = bed->plt_sym_val (i, plt, p);
11023 1.1 christos if (addr == (bfd_vma) -1)
11024 1.1 christos continue;
11025 1.1 christos
11026 1.1 christos *s = **p->sym_ptr_ptr;
11027 1.1 christos /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
11028 1.1 christos we are defining a symbol, ensure one of them is set. */
11029 1.1 christos if ((s->flags & BSF_LOCAL) == 0)
11030 1.1 christos s->flags |= BSF_GLOBAL;
11031 1.1 christos s->flags |= BSF_SYNTHETIC;
11032 1.1 christos s->section = plt;
11033 1.1 christos s->value = addr - plt->vma;
11034 1.3 christos s->name = names;
11035 1.1 christos s->udata.p = NULL;
11036 1.1 christos len = strlen ((*p->sym_ptr_ptr)->name);
11037 1.1 christos memcpy (names, (*p->sym_ptr_ptr)->name, len);
11038 1.1 christos names += len;
11039 1.1 christos if (p->addend != 0)
11040 1.1 christos {
11041 1.1 christos char buf[30], *a;
11042 1.1 christos
11043 1.1 christos memcpy (names, "+0x", sizeof ("+0x") - 1);
11044 1.1 christos names += sizeof ("+0x") - 1;
11045 1.1 christos bfd_sprintf_vma (abfd, buf, p->addend);
11046 1.1 christos for (a = buf; *a == '0'; ++a)
11047 1.1 christos ;
11048 1.1 christos len = strlen (a);
11049 1.1 christos memcpy (names, a, len);
11050 1.1 christos names += len;
11051 1.1 christos }
11052 1.1 christos memcpy (names, "@plt", sizeof ("@plt"));
11053 1.1 christos names += sizeof ("@plt");
11054 1.1 christos ++s, ++n;
11055 1.1 christos }
11056 1.1 christos
11057 1.1 christos return n;
11058 1.4 christos }
11059 1.4 christos
11060 1.1 christos /* It is only used by x86-64 so far. */
11061 1.1 christos asection _bfd_elf_large_com_section
11062 1.1 christos = BFD_FAKE_SECTION (_bfd_elf_large_com_section,
11063 1.1 christos SEC_IS_COMMON, NULL, "LARGE_COMMON", 0);
11064 1.1 christos
11065 1.1 christos void
11066 1.1 christos _bfd_elf_post_process_headers (bfd * abfd,
11067 1.1 christos struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
11068 1.3 christos {
11069 1.3 christos Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form. */
11070 1.1 christos
11071 1.3 christos i_ehdrp = elf_elfheader (abfd);
11072 1.3 christos
11073 1.1 christos i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
11074 1.1 christos
11075 1.1 christos /* To make things simpler for the loader on Linux systems we set the
11076 1.1 christos osabi field to ELFOSABI_GNU if the binary contains symbols of
11077 1.1 christos the STT_GNU_IFUNC type or STB_GNU_UNIQUE binding. */
11078 1.1 christos if (i_ehdrp->e_ident[EI_OSABI] == ELFOSABI_NONE
11079 1.1 christos && elf_tdata (abfd)->has_gnu_symbols)
11080 1.1 christos i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_GNU;
11081 1.1 christos }
11082 1.1 christos
11083 1.1 christos
11084 1.1 christos /* Return TRUE for ELF symbol types that represent functions.
11085 1.1 christos This is the default version of this function, which is sufficient for
11086 1.3 christos most targets. It returns true if TYPE is STT_FUNC or STT_GNU_IFUNC. */
11087 1.3 christos
11088 1.3 christos bfd_boolean
11089 1.3 christos _bfd_elf_is_function_type (unsigned int type)
11090 1.3 christos {
11091 1.3 christos return (type == STT_FUNC
11092 1.3 christos || type == STT_GNU_IFUNC);
11093 1.3 christos }
11094 1.3 christos
11095 1.3 christos /* If the ELF symbol SYM might be a function in SEC, return the
11096 1.3 christos function size and set *CODE_OFF to the function's entry point,
11097 1.3 christos otherwise return zero. */
11098 1.3 christos
11099 1.3 christos bfd_size_type
11100 1.3 christos _bfd_elf_maybe_function_sym (const asymbol *sym, asection *sec,
11101 1.3 christos bfd_vma *code_off)
11102 1.3 christos {
11103 1.3 christos bfd_size_type size;
11104 1.3 christos
11105 1.3 christos if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
11106 1.3 christos | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0
11107 1.3 christos || sym->section != sec)
11108 1.3 christos return 0;
11109 1.3 christos
11110 *code_off = sym->value;
11111 size = 0;
11112 if (!(sym->flags & BSF_SYNTHETIC))
11113 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
11114 if (size == 0)
11115 size = 1;
11116 return size;
11117 }
11118