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