elf.c revision 1.6.2.1 1 1.1 skrll /* ELF executable support for BFD.
2 1.1 skrll
3 1.6.2.1 pgoyette Copyright (C) 1993-2016 Free Software Foundation, Inc.
4 1.1 skrll
5 1.1 skrll This file is part of BFD, the Binary File Descriptor library.
6 1.1 skrll
7 1.1 skrll This program is free software; you can redistribute it and/or modify
8 1.1 skrll it under the terms of the GNU General Public License as published by
9 1.1 skrll the Free Software Foundation; either version 3 of the License, or
10 1.1 skrll (at your option) any later version.
11 1.1 skrll
12 1.1 skrll This program is distributed in the hope that it will be useful,
13 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 skrll GNU General Public License for more details.
16 1.1 skrll
17 1.1 skrll You should have received a copy of the GNU General Public License
18 1.1 skrll along with this program; if not, write to the Free Software
19 1.1 skrll Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 1.1 skrll MA 02110-1301, USA. */
21 1.1 skrll
22 1.1 skrll
23 1.1 skrll /*
24 1.1 skrll SECTION
25 1.1 skrll ELF backends
26 1.1 skrll
27 1.1 skrll BFD support for ELF formats is being worked on.
28 1.1 skrll Currently, the best supported back ends are for sparc and i386
29 1.1 skrll (running svr4 or Solaris 2).
30 1.1 skrll
31 1.1 skrll Documentation of the internals of the support code still needs
32 1.1 skrll to be written. The code is changing quickly enough that we
33 1.1 skrll haven't bothered yet. */
34 1.1 skrll
35 1.1 skrll /* For sparc64-cross-sparc32. */
36 1.1 skrll #define _SYSCALL32
37 1.1 skrll #include "sysdep.h"
38 1.1 skrll #include "bfd.h"
39 1.1 skrll #include "bfdlink.h"
40 1.1 skrll #include "libbfd.h"
41 1.1 skrll #define ARCH_SIZE 0
42 1.1 skrll #include "elf-bfd.h"
43 1.1 skrll #include "libiberty.h"
44 1.1 skrll #include "safe-ctype.h"
45 1.6.2.1 pgoyette #include "elf-linux-core.h"
46 1.1 skrll
47 1.3 christos #ifdef CORE_HEADER
48 1.3 christos #include CORE_HEADER
49 1.3 christos #endif
50 1.3 christos
51 1.1 skrll static int elf_sort_sections (const void *, const void *);
52 1.1 skrll static bfd_boolean assign_file_positions_except_relocs (bfd *, struct bfd_link_info *);
53 1.1 skrll 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 skrll static bfd_boolean elf_read_notes (bfd *, file_ptr, bfd_size_type) ;
56 1.1 skrll static bfd_boolean elf_parse_notes (bfd *abfd, char *buf, size_t size,
57 1.1 skrll file_ptr offset);
58 1.1 skrll
59 1.1 skrll /* Swap version information in and out. The version information is
60 1.1 skrll currently size independent. If that ever changes, this code will
61 1.1 skrll need to move into elfcode.h. */
62 1.1 skrll
63 1.1 skrll /* Swap in a Verdef structure. */
64 1.1 skrll
65 1.1 skrll void
66 1.1 skrll _bfd_elf_swap_verdef_in (bfd *abfd,
67 1.1 skrll const Elf_External_Verdef *src,
68 1.1 skrll Elf_Internal_Verdef *dst)
69 1.1 skrll {
70 1.1 skrll dst->vd_version = H_GET_16 (abfd, src->vd_version);
71 1.1 skrll dst->vd_flags = H_GET_16 (abfd, src->vd_flags);
72 1.1 skrll dst->vd_ndx = H_GET_16 (abfd, src->vd_ndx);
73 1.1 skrll dst->vd_cnt = H_GET_16 (abfd, src->vd_cnt);
74 1.1 skrll dst->vd_hash = H_GET_32 (abfd, src->vd_hash);
75 1.1 skrll dst->vd_aux = H_GET_32 (abfd, src->vd_aux);
76 1.1 skrll dst->vd_next = H_GET_32 (abfd, src->vd_next);
77 1.1 skrll }
78 1.1 skrll
79 1.1 skrll /* Swap out a Verdef structure. */
80 1.1 skrll
81 1.1 skrll void
82 1.1 skrll _bfd_elf_swap_verdef_out (bfd *abfd,
83 1.1 skrll const Elf_Internal_Verdef *src,
84 1.1 skrll Elf_External_Verdef *dst)
85 1.1 skrll {
86 1.1 skrll H_PUT_16 (abfd, src->vd_version, dst->vd_version);
87 1.1 skrll H_PUT_16 (abfd, src->vd_flags, dst->vd_flags);
88 1.1 skrll H_PUT_16 (abfd, src->vd_ndx, dst->vd_ndx);
89 1.1 skrll H_PUT_16 (abfd, src->vd_cnt, dst->vd_cnt);
90 1.1 skrll H_PUT_32 (abfd, src->vd_hash, dst->vd_hash);
91 1.1 skrll H_PUT_32 (abfd, src->vd_aux, dst->vd_aux);
92 1.1 skrll H_PUT_32 (abfd, src->vd_next, dst->vd_next);
93 1.1 skrll }
94 1.1 skrll
95 1.1 skrll /* Swap in a Verdaux structure. */
96 1.1 skrll
97 1.1 skrll void
98 1.1 skrll _bfd_elf_swap_verdaux_in (bfd *abfd,
99 1.1 skrll const Elf_External_Verdaux *src,
100 1.1 skrll Elf_Internal_Verdaux *dst)
101 1.1 skrll {
102 1.1 skrll dst->vda_name = H_GET_32 (abfd, src->vda_name);
103 1.1 skrll dst->vda_next = H_GET_32 (abfd, src->vda_next);
104 1.1 skrll }
105 1.1 skrll
106 1.1 skrll /* Swap out a Verdaux structure. */
107 1.1 skrll
108 1.1 skrll void
109 1.1 skrll _bfd_elf_swap_verdaux_out (bfd *abfd,
110 1.1 skrll const Elf_Internal_Verdaux *src,
111 1.1 skrll Elf_External_Verdaux *dst)
112 1.1 skrll {
113 1.1 skrll H_PUT_32 (abfd, src->vda_name, dst->vda_name);
114 1.1 skrll H_PUT_32 (abfd, src->vda_next, dst->vda_next);
115 1.1 skrll }
116 1.1 skrll
117 1.1 skrll /* Swap in a Verneed structure. */
118 1.1 skrll
119 1.1 skrll void
120 1.1 skrll _bfd_elf_swap_verneed_in (bfd *abfd,
121 1.1 skrll const Elf_External_Verneed *src,
122 1.1 skrll Elf_Internal_Verneed *dst)
123 1.1 skrll {
124 1.1 skrll dst->vn_version = H_GET_16 (abfd, src->vn_version);
125 1.1 skrll dst->vn_cnt = H_GET_16 (abfd, src->vn_cnt);
126 1.1 skrll dst->vn_file = H_GET_32 (abfd, src->vn_file);
127 1.1 skrll dst->vn_aux = H_GET_32 (abfd, src->vn_aux);
128 1.1 skrll dst->vn_next = H_GET_32 (abfd, src->vn_next);
129 1.1 skrll }
130 1.1 skrll
131 1.1 skrll /* Swap out a Verneed structure. */
132 1.1 skrll
133 1.1 skrll void
134 1.1 skrll _bfd_elf_swap_verneed_out (bfd *abfd,
135 1.1 skrll const Elf_Internal_Verneed *src,
136 1.1 skrll Elf_External_Verneed *dst)
137 1.1 skrll {
138 1.1 skrll H_PUT_16 (abfd, src->vn_version, dst->vn_version);
139 1.1 skrll H_PUT_16 (abfd, src->vn_cnt, dst->vn_cnt);
140 1.1 skrll H_PUT_32 (abfd, src->vn_file, dst->vn_file);
141 1.1 skrll H_PUT_32 (abfd, src->vn_aux, dst->vn_aux);
142 1.1 skrll H_PUT_32 (abfd, src->vn_next, dst->vn_next);
143 1.1 skrll }
144 1.1 skrll
145 1.1 skrll /* Swap in a Vernaux structure. */
146 1.1 skrll
147 1.1 skrll void
148 1.1 skrll _bfd_elf_swap_vernaux_in (bfd *abfd,
149 1.1 skrll const Elf_External_Vernaux *src,
150 1.1 skrll Elf_Internal_Vernaux *dst)
151 1.1 skrll {
152 1.1 skrll dst->vna_hash = H_GET_32 (abfd, src->vna_hash);
153 1.1 skrll dst->vna_flags = H_GET_16 (abfd, src->vna_flags);
154 1.1 skrll dst->vna_other = H_GET_16 (abfd, src->vna_other);
155 1.1 skrll dst->vna_name = H_GET_32 (abfd, src->vna_name);
156 1.1 skrll dst->vna_next = H_GET_32 (abfd, src->vna_next);
157 1.1 skrll }
158 1.1 skrll
159 1.1 skrll /* Swap out a Vernaux structure. */
160 1.1 skrll
161 1.1 skrll void
162 1.1 skrll _bfd_elf_swap_vernaux_out (bfd *abfd,
163 1.1 skrll const Elf_Internal_Vernaux *src,
164 1.1 skrll Elf_External_Vernaux *dst)
165 1.1 skrll {
166 1.1 skrll H_PUT_32 (abfd, src->vna_hash, dst->vna_hash);
167 1.1 skrll H_PUT_16 (abfd, src->vna_flags, dst->vna_flags);
168 1.1 skrll H_PUT_16 (abfd, src->vna_other, dst->vna_other);
169 1.1 skrll H_PUT_32 (abfd, src->vna_name, dst->vna_name);
170 1.1 skrll H_PUT_32 (abfd, src->vna_next, dst->vna_next);
171 1.1 skrll }
172 1.1 skrll
173 1.1 skrll /* Swap in a Versym structure. */
174 1.1 skrll
175 1.1 skrll void
176 1.1 skrll _bfd_elf_swap_versym_in (bfd *abfd,
177 1.1 skrll const Elf_External_Versym *src,
178 1.1 skrll Elf_Internal_Versym *dst)
179 1.1 skrll {
180 1.1 skrll dst->vs_vers = H_GET_16 (abfd, src->vs_vers);
181 1.1 skrll }
182 1.1 skrll
183 1.1 skrll /* Swap out a Versym structure. */
184 1.1 skrll
185 1.1 skrll void
186 1.1 skrll _bfd_elf_swap_versym_out (bfd *abfd,
187 1.1 skrll const Elf_Internal_Versym *src,
188 1.1 skrll Elf_External_Versym *dst)
189 1.1 skrll {
190 1.1 skrll H_PUT_16 (abfd, src->vs_vers, dst->vs_vers);
191 1.1 skrll }
192 1.1 skrll
193 1.1 skrll /* Standard ELF hash function. Do not change this function; you will
194 1.1 skrll cause invalid hash tables to be generated. */
195 1.1 skrll
196 1.1 skrll unsigned long
197 1.1 skrll bfd_elf_hash (const char *namearg)
198 1.1 skrll {
199 1.1 skrll const unsigned char *name = (const unsigned char *) namearg;
200 1.1 skrll unsigned long h = 0;
201 1.1 skrll unsigned long g;
202 1.1 skrll int ch;
203 1.1 skrll
204 1.1 skrll while ((ch = *name++) != '\0')
205 1.1 skrll {
206 1.1 skrll h = (h << 4) + ch;
207 1.1 skrll if ((g = (h & 0xf0000000)) != 0)
208 1.1 skrll {
209 1.1 skrll h ^= g >> 24;
210 1.1 skrll /* The ELF ABI says `h &= ~g', but this is equivalent in
211 1.1 skrll this case and on some machines one insn instead of two. */
212 1.1 skrll h ^= g;
213 1.1 skrll }
214 1.1 skrll }
215 1.1 skrll return h & 0xffffffff;
216 1.1 skrll }
217 1.1 skrll
218 1.1 skrll /* DT_GNU_HASH hash function. Do not change this function; you will
219 1.1 skrll cause invalid hash tables to be generated. */
220 1.1 skrll
221 1.1 skrll unsigned long
222 1.1 skrll bfd_elf_gnu_hash (const char *namearg)
223 1.1 skrll {
224 1.1 skrll const unsigned char *name = (const unsigned char *) namearg;
225 1.1 skrll unsigned long h = 5381;
226 1.1 skrll unsigned char ch;
227 1.1 skrll
228 1.1 skrll while ((ch = *name++) != '\0')
229 1.1 skrll h = (h << 5) + h + ch;
230 1.1 skrll return h & 0xffffffff;
231 1.1 skrll }
232 1.1 skrll
233 1.1 skrll /* Create a tdata field OBJECT_SIZE bytes in length, zeroed out and with
234 1.1 skrll the object_id field of an elf_obj_tdata field set to OBJECT_ID. */
235 1.1 skrll bfd_boolean
236 1.1 skrll bfd_elf_allocate_object (bfd *abfd,
237 1.1 skrll size_t object_size,
238 1.3 christos enum elf_target_id object_id)
239 1.1 skrll {
240 1.1 skrll BFD_ASSERT (object_size >= sizeof (struct elf_obj_tdata));
241 1.1 skrll abfd->tdata.any = bfd_zalloc (abfd, object_size);
242 1.1 skrll if (abfd->tdata.any == NULL)
243 1.1 skrll return FALSE;
244 1.1 skrll
245 1.1 skrll elf_object_id (abfd) = object_id;
246 1.6 christos if (abfd->direction != read_direction)
247 1.6 christos {
248 1.6 christos struct output_elf_obj_tdata *o = bfd_zalloc (abfd, sizeof *o);
249 1.6 christos if (o == NULL)
250 1.6 christos return FALSE;
251 1.6 christos elf_tdata (abfd)->o = o;
252 1.6 christos elf_program_header_size (abfd) = (bfd_size_type) -1;
253 1.6 christos }
254 1.1 skrll return TRUE;
255 1.1 skrll }
256 1.1 skrll
257 1.1 skrll
258 1.1 skrll bfd_boolean
259 1.3 christos bfd_elf_make_object (bfd *abfd)
260 1.1 skrll {
261 1.3 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
262 1.1 skrll return bfd_elf_allocate_object (abfd, sizeof (struct elf_obj_tdata),
263 1.3 christos bed->target_id);
264 1.1 skrll }
265 1.1 skrll
266 1.1 skrll bfd_boolean
267 1.1 skrll bfd_elf_mkcorefile (bfd *abfd)
268 1.1 skrll {
269 1.1 skrll /* I think this can be done just like an object file. */
270 1.6 christos if (!abfd->xvec->_bfd_set_format[(int) bfd_object] (abfd))
271 1.6 christos return FALSE;
272 1.6 christos elf_tdata (abfd)->core = bfd_zalloc (abfd, sizeof (*elf_tdata (abfd)->core));
273 1.6 christos return elf_tdata (abfd)->core != NULL;
274 1.1 skrll }
275 1.1 skrll
276 1.3 christos static char *
277 1.1 skrll bfd_elf_get_str_section (bfd *abfd, unsigned int shindex)
278 1.1 skrll {
279 1.1 skrll Elf_Internal_Shdr **i_shdrp;
280 1.1 skrll bfd_byte *shstrtab = NULL;
281 1.1 skrll file_ptr offset;
282 1.1 skrll bfd_size_type shstrtabsize;
283 1.1 skrll
284 1.1 skrll i_shdrp = elf_elfsections (abfd);
285 1.1 skrll if (i_shdrp == 0
286 1.1 skrll || shindex >= elf_numsections (abfd)
287 1.1 skrll || i_shdrp[shindex] == 0)
288 1.1 skrll return NULL;
289 1.1 skrll
290 1.1 skrll shstrtab = i_shdrp[shindex]->contents;
291 1.1 skrll if (shstrtab == NULL)
292 1.1 skrll {
293 1.1 skrll /* No cached one, attempt to read, and cache what we read. */
294 1.1 skrll offset = i_shdrp[shindex]->sh_offset;
295 1.1 skrll shstrtabsize = i_shdrp[shindex]->sh_size;
296 1.1 skrll
297 1.1 skrll /* Allocate and clear an extra byte at the end, to prevent crashes
298 1.1 skrll in case the string table is not terminated. */
299 1.1 skrll if (shstrtabsize + 1 <= 1
300 1.6 christos || bfd_seek (abfd, offset, SEEK_SET) != 0
301 1.6 christos || (shstrtab = (bfd_byte *) bfd_alloc (abfd, shstrtabsize + 1)) == NULL)
302 1.1 skrll shstrtab = NULL;
303 1.1 skrll else if (bfd_bread (shstrtab, shstrtabsize, abfd) != shstrtabsize)
304 1.1 skrll {
305 1.1 skrll if (bfd_get_error () != bfd_error_system_call)
306 1.1 skrll bfd_set_error (bfd_error_file_truncated);
307 1.6 christos bfd_release (abfd, shstrtab);
308 1.1 skrll shstrtab = NULL;
309 1.1 skrll /* Once we've failed to read it, make sure we don't keep
310 1.1 skrll trying. Otherwise, we'll keep allocating space for
311 1.1 skrll the string table over and over. */
312 1.1 skrll i_shdrp[shindex]->sh_size = 0;
313 1.1 skrll }
314 1.1 skrll else
315 1.1 skrll shstrtab[shstrtabsize] = '\0';
316 1.1 skrll i_shdrp[shindex]->contents = shstrtab;
317 1.1 skrll }
318 1.1 skrll return (char *) shstrtab;
319 1.1 skrll }
320 1.1 skrll
321 1.1 skrll char *
322 1.1 skrll bfd_elf_string_from_elf_section (bfd *abfd,
323 1.1 skrll unsigned int shindex,
324 1.1 skrll unsigned int strindex)
325 1.1 skrll {
326 1.1 skrll Elf_Internal_Shdr *hdr;
327 1.1 skrll
328 1.1 skrll if (strindex == 0)
329 1.1 skrll return "";
330 1.1 skrll
331 1.1 skrll if (elf_elfsections (abfd) == NULL || shindex >= elf_numsections (abfd))
332 1.1 skrll return NULL;
333 1.1 skrll
334 1.1 skrll hdr = elf_elfsections (abfd)[shindex];
335 1.1 skrll
336 1.6 christos if (hdr->contents == NULL)
337 1.6 christos {
338 1.6 christos if (hdr->sh_type != SHT_STRTAB && hdr->sh_type < SHT_LOOS)
339 1.6 christos {
340 1.6 christos /* PR 17512: file: f057ec89. */
341 1.6 christos _bfd_error_handler (_("%B: attempt to load strings from a non-string section (number %d)"),
342 1.6 christos abfd, shindex);
343 1.6 christos return NULL;
344 1.6 christos }
345 1.6 christos
346 1.6 christos if (bfd_elf_get_str_section (abfd, shindex) == NULL)
347 1.6 christos return NULL;
348 1.6 christos }
349 1.1 skrll
350 1.1 skrll if (strindex >= hdr->sh_size)
351 1.1 skrll {
352 1.1 skrll unsigned int shstrndx = elf_elfheader(abfd)->e_shstrndx;
353 1.1 skrll (*_bfd_error_handler)
354 1.1 skrll (_("%B: invalid string offset %u >= %lu for section `%s'"),
355 1.1 skrll abfd, strindex, (unsigned long) hdr->sh_size,
356 1.1 skrll (shindex == shstrndx && strindex == hdr->sh_name
357 1.1 skrll ? ".shstrtab"
358 1.1 skrll : bfd_elf_string_from_elf_section (abfd, shstrndx, hdr->sh_name)));
359 1.3 christos return NULL;
360 1.1 skrll }
361 1.1 skrll
362 1.1 skrll return ((char *) hdr->contents) + strindex;
363 1.1 skrll }
364 1.1 skrll
365 1.1 skrll /* Read and convert symbols to internal format.
366 1.1 skrll SYMCOUNT specifies the number of symbols to read, starting from
367 1.1 skrll symbol SYMOFFSET. If any of INTSYM_BUF, EXTSYM_BUF or EXTSHNDX_BUF
368 1.1 skrll are non-NULL, they are used to store the internal symbols, external
369 1.1 skrll symbols, and symbol section index extensions, respectively.
370 1.1 skrll Returns a pointer to the internal symbol buffer (malloced if necessary)
371 1.1 skrll or NULL if there were no symbols or some kind of problem. */
372 1.1 skrll
373 1.1 skrll Elf_Internal_Sym *
374 1.1 skrll bfd_elf_get_elf_syms (bfd *ibfd,
375 1.1 skrll Elf_Internal_Shdr *symtab_hdr,
376 1.1 skrll size_t symcount,
377 1.1 skrll size_t symoffset,
378 1.1 skrll Elf_Internal_Sym *intsym_buf,
379 1.1 skrll void *extsym_buf,
380 1.1 skrll Elf_External_Sym_Shndx *extshndx_buf)
381 1.1 skrll {
382 1.1 skrll Elf_Internal_Shdr *shndx_hdr;
383 1.1 skrll void *alloc_ext;
384 1.1 skrll const bfd_byte *esym;
385 1.1 skrll Elf_External_Sym_Shndx *alloc_extshndx;
386 1.1 skrll Elf_External_Sym_Shndx *shndx;
387 1.1 skrll Elf_Internal_Sym *alloc_intsym;
388 1.1 skrll Elf_Internal_Sym *isym;
389 1.1 skrll Elf_Internal_Sym *isymend;
390 1.1 skrll const struct elf_backend_data *bed;
391 1.1 skrll size_t extsym_size;
392 1.1 skrll bfd_size_type amt;
393 1.1 skrll file_ptr pos;
394 1.1 skrll
395 1.1 skrll if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
396 1.1 skrll abort ();
397 1.1 skrll
398 1.1 skrll if (symcount == 0)
399 1.1 skrll return intsym_buf;
400 1.1 skrll
401 1.1 skrll /* Normal syms might have section extension entries. */
402 1.1 skrll shndx_hdr = NULL;
403 1.6 christos if (elf_symtab_shndx_list (ibfd) != NULL)
404 1.6 christos {
405 1.6 christos elf_section_list * entry;
406 1.6 christos Elf_Internal_Shdr **sections = elf_elfsections (ibfd);
407 1.6 christos
408 1.6 christos /* Find an index section that is linked to this symtab section. */
409 1.6 christos for (entry = elf_symtab_shndx_list (ibfd); entry != NULL; entry = entry->next)
410 1.6.2.1 pgoyette {
411 1.6.2.1 pgoyette /* PR 20063. */
412 1.6.2.1 pgoyette if (entry->hdr.sh_link >= elf_numsections (ibfd))
413 1.6.2.1 pgoyette continue;
414 1.6.2.1 pgoyette
415 1.6.2.1 pgoyette if (sections[entry->hdr.sh_link] == symtab_hdr)
416 1.6.2.1 pgoyette {
417 1.6.2.1 pgoyette shndx_hdr = & entry->hdr;
418 1.6.2.1 pgoyette break;
419 1.6.2.1 pgoyette };
420 1.6.2.1 pgoyette }
421 1.6 christos
422 1.6 christos if (shndx_hdr == NULL)
423 1.6 christos {
424 1.6 christos if (symtab_hdr == & elf_symtab_hdr (ibfd))
425 1.6 christos /* Not really accurate, but this was how the old code used to work. */
426 1.6 christos shndx_hdr = & elf_symtab_shndx_list (ibfd)->hdr;
427 1.6 christos /* Otherwise we do nothing. The assumption is that
428 1.6 christos the index table will not be needed. */
429 1.6 christos }
430 1.6 christos }
431 1.1 skrll
432 1.1 skrll /* Read the symbols. */
433 1.1 skrll alloc_ext = NULL;
434 1.1 skrll alloc_extshndx = NULL;
435 1.1 skrll alloc_intsym = NULL;
436 1.1 skrll bed = get_elf_backend_data (ibfd);
437 1.1 skrll extsym_size = bed->s->sizeof_sym;
438 1.6.2.1 pgoyette amt = (bfd_size_type) symcount * extsym_size;
439 1.1 skrll pos = symtab_hdr->sh_offset + symoffset * extsym_size;
440 1.1 skrll if (extsym_buf == NULL)
441 1.1 skrll {
442 1.1 skrll alloc_ext = bfd_malloc2 (symcount, extsym_size);
443 1.1 skrll extsym_buf = alloc_ext;
444 1.1 skrll }
445 1.1 skrll if (extsym_buf == NULL
446 1.1 skrll || bfd_seek (ibfd, pos, SEEK_SET) != 0
447 1.1 skrll || bfd_bread (extsym_buf, amt, ibfd) != amt)
448 1.1 skrll {
449 1.1 skrll intsym_buf = NULL;
450 1.1 skrll goto out;
451 1.1 skrll }
452 1.1 skrll
453 1.1 skrll if (shndx_hdr == NULL || shndx_hdr->sh_size == 0)
454 1.1 skrll extshndx_buf = NULL;
455 1.1 skrll else
456 1.1 skrll {
457 1.6.2.1 pgoyette amt = (bfd_size_type) symcount * sizeof (Elf_External_Sym_Shndx);
458 1.1 skrll pos = shndx_hdr->sh_offset + symoffset * sizeof (Elf_External_Sym_Shndx);
459 1.1 skrll if (extshndx_buf == NULL)
460 1.1 skrll {
461 1.3 christos alloc_extshndx = (Elf_External_Sym_Shndx *)
462 1.3 christos bfd_malloc2 (symcount, sizeof (Elf_External_Sym_Shndx));
463 1.1 skrll extshndx_buf = alloc_extshndx;
464 1.1 skrll }
465 1.1 skrll if (extshndx_buf == NULL
466 1.1 skrll || bfd_seek (ibfd, pos, SEEK_SET) != 0
467 1.1 skrll || bfd_bread (extshndx_buf, amt, ibfd) != amt)
468 1.1 skrll {
469 1.1 skrll intsym_buf = NULL;
470 1.1 skrll goto out;
471 1.1 skrll }
472 1.1 skrll }
473 1.1 skrll
474 1.1 skrll if (intsym_buf == NULL)
475 1.1 skrll {
476 1.3 christos alloc_intsym = (Elf_Internal_Sym *)
477 1.3 christos bfd_malloc2 (symcount, sizeof (Elf_Internal_Sym));
478 1.1 skrll intsym_buf = alloc_intsym;
479 1.1 skrll if (intsym_buf == NULL)
480 1.1 skrll goto out;
481 1.1 skrll }
482 1.1 skrll
483 1.1 skrll /* Convert the symbols to internal form. */
484 1.1 skrll isymend = intsym_buf + symcount;
485 1.3 christos for (esym = (const bfd_byte *) extsym_buf, isym = intsym_buf,
486 1.3 christos shndx = extshndx_buf;
487 1.1 skrll isym < isymend;
488 1.1 skrll esym += extsym_size, isym++, shndx = shndx != NULL ? shndx + 1 : NULL)
489 1.1 skrll if (!(*bed->s->swap_symbol_in) (ibfd, esym, shndx, isym))
490 1.1 skrll {
491 1.1 skrll symoffset += (esym - (bfd_byte *) extsym_buf) / extsym_size;
492 1.1 skrll (*_bfd_error_handler) (_("%B symbol number %lu references "
493 1.1 skrll "nonexistent SHT_SYMTAB_SHNDX section"),
494 1.1 skrll ibfd, (unsigned long) symoffset);
495 1.1 skrll if (alloc_intsym != NULL)
496 1.1 skrll free (alloc_intsym);
497 1.1 skrll intsym_buf = NULL;
498 1.1 skrll goto out;
499 1.1 skrll }
500 1.1 skrll
501 1.1 skrll out:
502 1.1 skrll if (alloc_ext != NULL)
503 1.1 skrll free (alloc_ext);
504 1.1 skrll if (alloc_extshndx != NULL)
505 1.1 skrll free (alloc_extshndx);
506 1.1 skrll
507 1.1 skrll return intsym_buf;
508 1.1 skrll }
509 1.1 skrll
510 1.1 skrll /* Look up a symbol name. */
511 1.1 skrll const char *
512 1.1 skrll bfd_elf_sym_name (bfd *abfd,
513 1.1 skrll Elf_Internal_Shdr *symtab_hdr,
514 1.1 skrll Elf_Internal_Sym *isym,
515 1.1 skrll asection *sym_sec)
516 1.1 skrll {
517 1.1 skrll const char *name;
518 1.1 skrll unsigned int iname = isym->st_name;
519 1.1 skrll unsigned int shindex = symtab_hdr->sh_link;
520 1.1 skrll
521 1.1 skrll if (iname == 0 && ELF_ST_TYPE (isym->st_info) == STT_SECTION
522 1.1 skrll /* Check for a bogus st_shndx to avoid crashing. */
523 1.1 skrll && isym->st_shndx < elf_numsections (abfd))
524 1.1 skrll {
525 1.1 skrll iname = elf_elfsections (abfd)[isym->st_shndx]->sh_name;
526 1.1 skrll shindex = elf_elfheader (abfd)->e_shstrndx;
527 1.1 skrll }
528 1.1 skrll
529 1.1 skrll name = bfd_elf_string_from_elf_section (abfd, shindex, iname);
530 1.1 skrll if (name == NULL)
531 1.1 skrll name = "(null)";
532 1.1 skrll else if (sym_sec && *name == '\0')
533 1.1 skrll name = bfd_section_name (abfd, sym_sec);
534 1.1 skrll
535 1.1 skrll return name;
536 1.1 skrll }
537 1.1 skrll
538 1.1 skrll /* Elf_Internal_Shdr->contents is an array of these for SHT_GROUP
539 1.1 skrll sections. The first element is the flags, the rest are section
540 1.1 skrll pointers. */
541 1.1 skrll
542 1.1 skrll typedef union elf_internal_group {
543 1.1 skrll Elf_Internal_Shdr *shdr;
544 1.1 skrll unsigned int flags;
545 1.1 skrll } Elf_Internal_Group;
546 1.1 skrll
547 1.1 skrll /* Return the name of the group signature symbol. Why isn't the
548 1.1 skrll signature just a string? */
549 1.1 skrll
550 1.1 skrll static const char *
551 1.1 skrll group_signature (bfd *abfd, Elf_Internal_Shdr *ghdr)
552 1.1 skrll {
553 1.1 skrll Elf_Internal_Shdr *hdr;
554 1.1 skrll unsigned char esym[sizeof (Elf64_External_Sym)];
555 1.1 skrll Elf_External_Sym_Shndx eshndx;
556 1.1 skrll Elf_Internal_Sym isym;
557 1.1 skrll
558 1.1 skrll /* First we need to ensure the symbol table is available. Make sure
559 1.1 skrll that it is a symbol table section. */
560 1.1 skrll if (ghdr->sh_link >= elf_numsections (abfd))
561 1.1 skrll return NULL;
562 1.1 skrll hdr = elf_elfsections (abfd) [ghdr->sh_link];
563 1.1 skrll if (hdr->sh_type != SHT_SYMTAB
564 1.1 skrll || ! bfd_section_from_shdr (abfd, ghdr->sh_link))
565 1.1 skrll return NULL;
566 1.1 skrll
567 1.1 skrll /* Go read the symbol. */
568 1.1 skrll hdr = &elf_tdata (abfd)->symtab_hdr;
569 1.1 skrll if (bfd_elf_get_elf_syms (abfd, hdr, 1, ghdr->sh_info,
570 1.1 skrll &isym, esym, &eshndx) == NULL)
571 1.1 skrll return NULL;
572 1.1 skrll
573 1.1 skrll return bfd_elf_sym_name (abfd, hdr, &isym, NULL);
574 1.1 skrll }
575 1.1 skrll
576 1.1 skrll /* Set next_in_group list pointer, and group name for NEWSECT. */
577 1.1 skrll
578 1.1 skrll static bfd_boolean
579 1.1 skrll setup_group (bfd *abfd, Elf_Internal_Shdr *hdr, asection *newsect)
580 1.1 skrll {
581 1.1 skrll unsigned int num_group = elf_tdata (abfd)->num_group;
582 1.1 skrll
583 1.1 skrll /* If num_group is zero, read in all SHT_GROUP sections. The count
584 1.1 skrll is set to -1 if there are no SHT_GROUP sections. */
585 1.1 skrll if (num_group == 0)
586 1.1 skrll {
587 1.1 skrll unsigned int i, shnum;
588 1.1 skrll
589 1.1 skrll /* First count the number of groups. If we have a SHT_GROUP
590 1.1 skrll section with just a flag word (ie. sh_size is 4), ignore it. */
591 1.1 skrll shnum = elf_numsections (abfd);
592 1.1 skrll num_group = 0;
593 1.1 skrll
594 1.6 christos #define IS_VALID_GROUP_SECTION_HEADER(shdr, minsize) \
595 1.1 skrll ( (shdr)->sh_type == SHT_GROUP \
596 1.6 christos && (shdr)->sh_size >= minsize \
597 1.1 skrll && (shdr)->sh_entsize == GRP_ENTRY_SIZE \
598 1.1 skrll && ((shdr)->sh_size % GRP_ENTRY_SIZE) == 0)
599 1.1 skrll
600 1.1 skrll for (i = 0; i < shnum; i++)
601 1.1 skrll {
602 1.1 skrll Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[i];
603 1.1 skrll
604 1.6 christos if (IS_VALID_GROUP_SECTION_HEADER (shdr, 2 * GRP_ENTRY_SIZE))
605 1.1 skrll num_group += 1;
606 1.1 skrll }
607 1.1 skrll
608 1.1 skrll if (num_group == 0)
609 1.1 skrll {
610 1.1 skrll num_group = (unsigned) -1;
611 1.1 skrll elf_tdata (abfd)->num_group = num_group;
612 1.1 skrll }
613 1.1 skrll else
614 1.1 skrll {
615 1.1 skrll /* We keep a list of elf section headers for group sections,
616 1.1 skrll so we can find them quickly. */
617 1.1 skrll bfd_size_type amt;
618 1.1 skrll
619 1.1 skrll elf_tdata (abfd)->num_group = num_group;
620 1.3 christos elf_tdata (abfd)->group_sect_ptr = (Elf_Internal_Shdr **)
621 1.3 christos bfd_alloc2 (abfd, num_group, sizeof (Elf_Internal_Shdr *));
622 1.1 skrll if (elf_tdata (abfd)->group_sect_ptr == NULL)
623 1.1 skrll return FALSE;
624 1.1 skrll
625 1.1 skrll num_group = 0;
626 1.1 skrll for (i = 0; i < shnum; i++)
627 1.1 skrll {
628 1.1 skrll Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[i];
629 1.1 skrll
630 1.6 christos if (IS_VALID_GROUP_SECTION_HEADER (shdr, 2 * GRP_ENTRY_SIZE))
631 1.1 skrll {
632 1.1 skrll unsigned char *src;
633 1.1 skrll Elf_Internal_Group *dest;
634 1.1 skrll
635 1.1 skrll /* Add to list of sections. */
636 1.1 skrll elf_tdata (abfd)->group_sect_ptr[num_group] = shdr;
637 1.1 skrll num_group += 1;
638 1.1 skrll
639 1.1 skrll /* Read the raw contents. */
640 1.1 skrll BFD_ASSERT (sizeof (*dest) >= 4);
641 1.1 skrll amt = shdr->sh_size * sizeof (*dest) / 4;
642 1.3 christos shdr->contents = (unsigned char *)
643 1.3 christos bfd_alloc2 (abfd, shdr->sh_size, sizeof (*dest) / 4);
644 1.1 skrll /* PR binutils/4110: Handle corrupt group headers. */
645 1.1 skrll if (shdr->contents == NULL)
646 1.1 skrll {
647 1.1 skrll _bfd_error_handler
648 1.6 christos (_("%B: corrupt size field in group section header: 0x%lx"), abfd, shdr->sh_size);
649 1.1 skrll bfd_set_error (bfd_error_bad_value);
650 1.6 christos -- num_group;
651 1.6 christos continue;
652 1.1 skrll }
653 1.1 skrll
654 1.1 skrll memset (shdr->contents, 0, amt);
655 1.1 skrll
656 1.1 skrll if (bfd_seek (abfd, shdr->sh_offset, SEEK_SET) != 0
657 1.1 skrll || (bfd_bread (shdr->contents, shdr->sh_size, abfd)
658 1.1 skrll != shdr->sh_size))
659 1.6 christos {
660 1.6 christos _bfd_error_handler
661 1.6 christos (_("%B: invalid size field in group section header: 0x%lx"), abfd, shdr->sh_size);
662 1.6 christos bfd_set_error (bfd_error_bad_value);
663 1.6 christos -- num_group;
664 1.6 christos /* PR 17510: If the group contents are even partially
665 1.6 christos corrupt, do not allow any of the contents to be used. */
666 1.6 christos memset (shdr->contents, 0, amt);
667 1.6 christos continue;
668 1.6 christos }
669 1.1 skrll
670 1.1 skrll /* Translate raw contents, a flag word followed by an
671 1.1 skrll array of elf section indices all in target byte order,
672 1.1 skrll to the flag word followed by an array of elf section
673 1.1 skrll pointers. */
674 1.1 skrll src = shdr->contents + shdr->sh_size;
675 1.1 skrll dest = (Elf_Internal_Group *) (shdr->contents + amt);
676 1.6 christos
677 1.1 skrll while (1)
678 1.1 skrll {
679 1.1 skrll unsigned int idx;
680 1.1 skrll
681 1.1 skrll src -= 4;
682 1.1 skrll --dest;
683 1.1 skrll idx = H_GET_32 (abfd, src);
684 1.1 skrll if (src == shdr->contents)
685 1.1 skrll {
686 1.1 skrll dest->flags = idx;
687 1.1 skrll if (shdr->bfd_section != NULL && (idx & GRP_COMDAT))
688 1.1 skrll shdr->bfd_section->flags
689 1.1 skrll |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
690 1.1 skrll break;
691 1.1 skrll }
692 1.1 skrll if (idx >= shnum)
693 1.1 skrll {
694 1.1 skrll ((*_bfd_error_handler)
695 1.1 skrll (_("%B: invalid SHT_GROUP entry"), abfd));
696 1.1 skrll idx = 0;
697 1.1 skrll }
698 1.1 skrll dest->shdr = elf_elfsections (abfd)[idx];
699 1.1 skrll }
700 1.1 skrll }
701 1.1 skrll }
702 1.6 christos
703 1.6 christos /* PR 17510: Corrupt binaries might contain invalid groups. */
704 1.6 christos if (num_group != (unsigned) elf_tdata (abfd)->num_group)
705 1.6 christos {
706 1.6 christos elf_tdata (abfd)->num_group = num_group;
707 1.6 christos
708 1.6 christos /* If all groups are invalid then fail. */
709 1.6 christos if (num_group == 0)
710 1.6 christos {
711 1.6 christos elf_tdata (abfd)->group_sect_ptr = NULL;
712 1.6 christos elf_tdata (abfd)->num_group = num_group = -1;
713 1.6 christos (*_bfd_error_handler) (_("%B: no valid group sections found"), abfd);
714 1.6 christos bfd_set_error (bfd_error_bad_value);
715 1.6 christos }
716 1.6 christos }
717 1.1 skrll }
718 1.1 skrll }
719 1.1 skrll
720 1.1 skrll if (num_group != (unsigned) -1)
721 1.1 skrll {
722 1.1 skrll unsigned int i;
723 1.1 skrll
724 1.1 skrll for (i = 0; i < num_group; i++)
725 1.1 skrll {
726 1.1 skrll Elf_Internal_Shdr *shdr = elf_tdata (abfd)->group_sect_ptr[i];
727 1.1 skrll Elf_Internal_Group *idx = (Elf_Internal_Group *) shdr->contents;
728 1.1 skrll unsigned int n_elt = shdr->sh_size / 4;
729 1.1 skrll
730 1.1 skrll /* Look through this group's sections to see if current
731 1.1 skrll section is a member. */
732 1.1 skrll while (--n_elt != 0)
733 1.1 skrll if ((++idx)->shdr == hdr)
734 1.1 skrll {
735 1.1 skrll asection *s = NULL;
736 1.1 skrll
737 1.1 skrll /* We are a member of this group. Go looking through
738 1.1 skrll other members to see if any others are linked via
739 1.1 skrll next_in_group. */
740 1.1 skrll idx = (Elf_Internal_Group *) shdr->contents;
741 1.1 skrll n_elt = shdr->sh_size / 4;
742 1.1 skrll while (--n_elt != 0)
743 1.1 skrll if ((s = (++idx)->shdr->bfd_section) != NULL
744 1.1 skrll && elf_next_in_group (s) != NULL)
745 1.1 skrll break;
746 1.1 skrll if (n_elt != 0)
747 1.1 skrll {
748 1.1 skrll /* Snarf the group name from other member, and
749 1.1 skrll insert current section in circular list. */
750 1.1 skrll elf_group_name (newsect) = elf_group_name (s);
751 1.1 skrll elf_next_in_group (newsect) = elf_next_in_group (s);
752 1.1 skrll elf_next_in_group (s) = newsect;
753 1.1 skrll }
754 1.1 skrll else
755 1.1 skrll {
756 1.1 skrll const char *gname;
757 1.1 skrll
758 1.1 skrll gname = group_signature (abfd, shdr);
759 1.1 skrll if (gname == NULL)
760 1.1 skrll return FALSE;
761 1.1 skrll elf_group_name (newsect) = gname;
762 1.1 skrll
763 1.1 skrll /* Start a circular list with one element. */
764 1.1 skrll elf_next_in_group (newsect) = newsect;
765 1.1 skrll }
766 1.1 skrll
767 1.1 skrll /* If the group section has been created, point to the
768 1.1 skrll new member. */
769 1.1 skrll if (shdr->bfd_section != NULL)
770 1.1 skrll elf_next_in_group (shdr->bfd_section) = newsect;
771 1.1 skrll
772 1.1 skrll i = num_group - 1;
773 1.1 skrll break;
774 1.1 skrll }
775 1.1 skrll }
776 1.1 skrll }
777 1.1 skrll
778 1.1 skrll if (elf_group_name (newsect) == NULL)
779 1.1 skrll {
780 1.1 skrll (*_bfd_error_handler) (_("%B: no group info for section %A"),
781 1.1 skrll abfd, newsect);
782 1.6 christos return FALSE;
783 1.1 skrll }
784 1.1 skrll return TRUE;
785 1.1 skrll }
786 1.1 skrll
787 1.1 skrll bfd_boolean
788 1.1 skrll _bfd_elf_setup_sections (bfd *abfd)
789 1.1 skrll {
790 1.1 skrll unsigned int i;
791 1.1 skrll unsigned int num_group = elf_tdata (abfd)->num_group;
792 1.1 skrll bfd_boolean result = TRUE;
793 1.1 skrll asection *s;
794 1.1 skrll
795 1.1 skrll /* Process SHF_LINK_ORDER. */
796 1.1 skrll for (s = abfd->sections; s != NULL; s = s->next)
797 1.1 skrll {
798 1.1 skrll Elf_Internal_Shdr *this_hdr = &elf_section_data (s)->this_hdr;
799 1.1 skrll if ((this_hdr->sh_flags & SHF_LINK_ORDER) != 0)
800 1.1 skrll {
801 1.1 skrll unsigned int elfsec = this_hdr->sh_link;
802 1.1 skrll /* FIXME: The old Intel compiler and old strip/objcopy may
803 1.1 skrll not set the sh_link or sh_info fields. Hence we could
804 1.1 skrll get the situation where elfsec is 0. */
805 1.1 skrll if (elfsec == 0)
806 1.1 skrll {
807 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
808 1.1 skrll if (bed->link_order_error_handler)
809 1.1 skrll bed->link_order_error_handler
810 1.1 skrll (_("%B: warning: sh_link not set for section `%A'"),
811 1.1 skrll abfd, s);
812 1.1 skrll }
813 1.1 skrll else
814 1.1 skrll {
815 1.3 christos asection *linksec = NULL;
816 1.1 skrll
817 1.1 skrll if (elfsec < elf_numsections (abfd))
818 1.1 skrll {
819 1.1 skrll this_hdr = elf_elfsections (abfd)[elfsec];
820 1.3 christos linksec = this_hdr->bfd_section;
821 1.1 skrll }
822 1.1 skrll
823 1.1 skrll /* PR 1991, 2008:
824 1.1 skrll Some strip/objcopy may leave an incorrect value in
825 1.1 skrll sh_link. We don't want to proceed. */
826 1.3 christos if (linksec == NULL)
827 1.1 skrll {
828 1.1 skrll (*_bfd_error_handler)
829 1.1 skrll (_("%B: sh_link [%d] in section `%A' is incorrect"),
830 1.1 skrll s->owner, s, elfsec);
831 1.1 skrll result = FALSE;
832 1.1 skrll }
833 1.1 skrll
834 1.3 christos elf_linked_to_section (s) = linksec;
835 1.1 skrll }
836 1.1 skrll }
837 1.1 skrll }
838 1.1 skrll
839 1.1 skrll /* Process section groups. */
840 1.1 skrll if (num_group == (unsigned) -1)
841 1.1 skrll return result;
842 1.1 skrll
843 1.1 skrll for (i = 0; i < num_group; i++)
844 1.1 skrll {
845 1.1 skrll Elf_Internal_Shdr *shdr = elf_tdata (abfd)->group_sect_ptr[i];
846 1.6 christos Elf_Internal_Group *idx;
847 1.6 christos unsigned int n_elt;
848 1.6 christos
849 1.6 christos /* PR binutils/18758: Beware of corrupt binaries with invalid group data. */
850 1.6 christos if (shdr == NULL || shdr->bfd_section == NULL || shdr->contents == NULL)
851 1.6 christos {
852 1.6 christos (*_bfd_error_handler)
853 1.6 christos (_("%B: section group entry number %u is corrupt"),
854 1.6 christos abfd, i);
855 1.6 christos result = FALSE;
856 1.6 christos continue;
857 1.6 christos }
858 1.6 christos
859 1.6 christos idx = (Elf_Internal_Group *) shdr->contents;
860 1.6 christos n_elt = shdr->sh_size / 4;
861 1.1 skrll
862 1.1 skrll while (--n_elt != 0)
863 1.1 skrll if ((++idx)->shdr->bfd_section)
864 1.1 skrll elf_sec_group (idx->shdr->bfd_section) = shdr->bfd_section;
865 1.1 skrll else if (idx->shdr->sh_type == SHT_RELA
866 1.1 skrll || idx->shdr->sh_type == SHT_REL)
867 1.1 skrll /* We won't include relocation sections in section groups in
868 1.1 skrll output object files. We adjust the group section size here
869 1.1 skrll so that relocatable link will work correctly when
870 1.1 skrll relocation sections are in section group in input object
871 1.1 skrll files. */
872 1.1 skrll shdr->bfd_section->size -= 4;
873 1.1 skrll else
874 1.1 skrll {
875 1.1 skrll /* There are some unknown sections in the group. */
876 1.1 skrll (*_bfd_error_handler)
877 1.1 skrll (_("%B: unknown [%d] section `%s' in group [%s]"),
878 1.1 skrll abfd,
879 1.1 skrll (unsigned int) idx->shdr->sh_type,
880 1.1 skrll bfd_elf_string_from_elf_section (abfd,
881 1.1 skrll (elf_elfheader (abfd)
882 1.1 skrll ->e_shstrndx),
883 1.1 skrll idx->shdr->sh_name),
884 1.1 skrll shdr->bfd_section->name);
885 1.1 skrll result = FALSE;
886 1.1 skrll }
887 1.1 skrll }
888 1.1 skrll return result;
889 1.1 skrll }
890 1.1 skrll
891 1.1 skrll bfd_boolean
892 1.1 skrll bfd_elf_is_group_section (bfd *abfd ATTRIBUTE_UNUSED, const asection *sec)
893 1.1 skrll {
894 1.1 skrll return elf_next_in_group (sec) != NULL;
895 1.1 skrll }
896 1.1 skrll
897 1.6 christos static char *
898 1.6 christos convert_debug_to_zdebug (bfd *abfd, const char *name)
899 1.6 christos {
900 1.6 christos unsigned int len = strlen (name);
901 1.6 christos char *new_name = bfd_alloc (abfd, len + 2);
902 1.6 christos if (new_name == NULL)
903 1.6 christos return NULL;
904 1.6 christos new_name[0] = '.';
905 1.6 christos new_name[1] = 'z';
906 1.6 christos memcpy (new_name + 2, name + 1, len);
907 1.6 christos return new_name;
908 1.6 christos }
909 1.6 christos
910 1.6 christos static char *
911 1.6 christos convert_zdebug_to_debug (bfd *abfd, const char *name)
912 1.6 christos {
913 1.6 christos unsigned int len = strlen (name);
914 1.6 christos char *new_name = bfd_alloc (abfd, len);
915 1.6 christos if (new_name == NULL)
916 1.6 christos return NULL;
917 1.6 christos new_name[0] = '.';
918 1.6 christos memcpy (new_name + 1, name + 2, len - 1);
919 1.6 christos return new_name;
920 1.6 christos }
921 1.6 christos
922 1.1 skrll /* Make a BFD section from an ELF section. We store a pointer to the
923 1.1 skrll BFD section in the bfd_section field of the header. */
924 1.1 skrll
925 1.1 skrll bfd_boolean
926 1.1 skrll _bfd_elf_make_section_from_shdr (bfd *abfd,
927 1.1 skrll Elf_Internal_Shdr *hdr,
928 1.1 skrll const char *name,
929 1.1 skrll int shindex)
930 1.1 skrll {
931 1.1 skrll asection *newsect;
932 1.1 skrll flagword flags;
933 1.1 skrll const struct elf_backend_data *bed;
934 1.1 skrll
935 1.1 skrll if (hdr->bfd_section != NULL)
936 1.3 christos return TRUE;
937 1.1 skrll
938 1.1 skrll newsect = bfd_make_section_anyway (abfd, name);
939 1.1 skrll if (newsect == NULL)
940 1.1 skrll return FALSE;
941 1.1 skrll
942 1.1 skrll hdr->bfd_section = newsect;
943 1.1 skrll elf_section_data (newsect)->this_hdr = *hdr;
944 1.1 skrll elf_section_data (newsect)->this_idx = shindex;
945 1.1 skrll
946 1.1 skrll /* Always use the real type/flags. */
947 1.1 skrll elf_section_type (newsect) = hdr->sh_type;
948 1.1 skrll elf_section_flags (newsect) = hdr->sh_flags;
949 1.1 skrll
950 1.1 skrll newsect->filepos = hdr->sh_offset;
951 1.1 skrll
952 1.1 skrll if (! bfd_set_section_vma (abfd, newsect, hdr->sh_addr)
953 1.1 skrll || ! bfd_set_section_size (abfd, newsect, hdr->sh_size)
954 1.1 skrll || ! bfd_set_section_alignment (abfd, newsect,
955 1.1 skrll bfd_log2 (hdr->sh_addralign)))
956 1.1 skrll return FALSE;
957 1.1 skrll
958 1.1 skrll flags = SEC_NO_FLAGS;
959 1.1 skrll if (hdr->sh_type != SHT_NOBITS)
960 1.1 skrll flags |= SEC_HAS_CONTENTS;
961 1.1 skrll if (hdr->sh_type == SHT_GROUP)
962 1.1 skrll flags |= SEC_GROUP | SEC_EXCLUDE;
963 1.1 skrll if ((hdr->sh_flags & SHF_ALLOC) != 0)
964 1.1 skrll {
965 1.1 skrll flags |= SEC_ALLOC;
966 1.1 skrll if (hdr->sh_type != SHT_NOBITS)
967 1.1 skrll flags |= SEC_LOAD;
968 1.1 skrll }
969 1.1 skrll if ((hdr->sh_flags & SHF_WRITE) == 0)
970 1.1 skrll flags |= SEC_READONLY;
971 1.1 skrll if ((hdr->sh_flags & SHF_EXECINSTR) != 0)
972 1.1 skrll flags |= SEC_CODE;
973 1.1 skrll else if ((flags & SEC_LOAD) != 0)
974 1.1 skrll flags |= SEC_DATA;
975 1.1 skrll if ((hdr->sh_flags & SHF_MERGE) != 0)
976 1.1 skrll {
977 1.1 skrll flags |= SEC_MERGE;
978 1.1 skrll newsect->entsize = hdr->sh_entsize;
979 1.1 skrll }
980 1.6.2.1 pgoyette if ((hdr->sh_flags & SHF_STRINGS) != 0)
981 1.6.2.1 pgoyette flags |= SEC_STRINGS;
982 1.1 skrll if (hdr->sh_flags & SHF_GROUP)
983 1.1 skrll if (!setup_group (abfd, hdr, newsect))
984 1.1 skrll return FALSE;
985 1.1 skrll if ((hdr->sh_flags & SHF_TLS) != 0)
986 1.1 skrll flags |= SEC_THREAD_LOCAL;
987 1.3 christos if ((hdr->sh_flags & SHF_EXCLUDE) != 0)
988 1.3 christos flags |= SEC_EXCLUDE;
989 1.1 skrll
990 1.1 skrll if ((flags & SEC_ALLOC) == 0)
991 1.1 skrll {
992 1.1 skrll /* The debugging sections appear to be recognized only by name,
993 1.1 skrll not any sort of flag. Their SEC_ALLOC bits are cleared. */
994 1.1 skrll if (name [0] == '.')
995 1.1 skrll {
996 1.5 christos const char *p;
997 1.5 christos int n;
998 1.5 christos if (name[1] == 'd')
999 1.5 christos p = ".debug", n = 6;
1000 1.5 christos else if (name[1] == 'g' && name[2] == 'n')
1001 1.5 christos p = ".gnu.linkonce.wi.", n = 17;
1002 1.5 christos else if (name[1] == 'g' && name[2] == 'd')
1003 1.5 christos p = ".gdb_index", n = 11; /* yes we really do mean 11. */
1004 1.5 christos else if (name[1] == 'l')
1005 1.5 christos p = ".line", n = 5;
1006 1.5 christos else if (name[1] == 's')
1007 1.5 christos p = ".stab", n = 5;
1008 1.5 christos else if (name[1] == 'z')
1009 1.5 christos p = ".zdebug", n = 7;
1010 1.5 christos else
1011 1.5 christos p = NULL, n = 0;
1012 1.5 christos if (p != NULL && strncmp (name, p, n) == 0)
1013 1.1 skrll flags |= SEC_DEBUGGING;
1014 1.1 skrll }
1015 1.1 skrll }
1016 1.1 skrll
1017 1.1 skrll /* As a GNU extension, if the name begins with .gnu.linkonce, we
1018 1.1 skrll only link a single copy of the section. This is used to support
1019 1.1 skrll g++. g++ will emit each template expansion in its own section.
1020 1.1 skrll The symbols will be defined as weak, so that multiple definitions
1021 1.1 skrll are permitted. The GNU linker extension is to actually discard
1022 1.1 skrll all but one of the sections. */
1023 1.1 skrll if (CONST_STRNEQ (name, ".gnu.linkonce")
1024 1.1 skrll && elf_next_in_group (newsect) == NULL)
1025 1.1 skrll flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
1026 1.1 skrll
1027 1.1 skrll bed = get_elf_backend_data (abfd);
1028 1.1 skrll if (bed->elf_backend_section_flags)
1029 1.1 skrll if (! bed->elf_backend_section_flags (&flags, hdr))
1030 1.1 skrll return FALSE;
1031 1.1 skrll
1032 1.1 skrll if (! bfd_set_section_flags (abfd, newsect, flags))
1033 1.1 skrll return FALSE;
1034 1.1 skrll
1035 1.1 skrll /* We do not parse the PT_NOTE segments as we are interested even in the
1036 1.1 skrll separate debug info files which may have the segments offsets corrupted.
1037 1.1 skrll PT_NOTEs from the core files are currently not parsed using BFD. */
1038 1.1 skrll if (hdr->sh_type == SHT_NOTE)
1039 1.1 skrll {
1040 1.1 skrll bfd_byte *contents;
1041 1.1 skrll
1042 1.1 skrll if (!bfd_malloc_and_get_section (abfd, newsect, &contents))
1043 1.1 skrll return FALSE;
1044 1.1 skrll
1045 1.1 skrll elf_parse_notes (abfd, (char *) contents, hdr->sh_size, -1);
1046 1.1 skrll free (contents);
1047 1.1 skrll }
1048 1.1 skrll
1049 1.1 skrll if ((flags & SEC_ALLOC) != 0)
1050 1.1 skrll {
1051 1.1 skrll Elf_Internal_Phdr *phdr;
1052 1.1 skrll unsigned int i, nload;
1053 1.1 skrll
1054 1.1 skrll /* Some ELF linkers produce binaries with all the program header
1055 1.1 skrll p_paddr fields zero. If we have such a binary with more than
1056 1.1 skrll one PT_LOAD header, then leave the section lma equal to vma
1057 1.1 skrll so that we don't create sections with overlapping lma. */
1058 1.1 skrll phdr = elf_tdata (abfd)->phdr;
1059 1.1 skrll for (nload = 0, i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
1060 1.1 skrll if (phdr->p_paddr != 0)
1061 1.1 skrll break;
1062 1.1 skrll else if (phdr->p_type == PT_LOAD && phdr->p_memsz != 0)
1063 1.1 skrll ++nload;
1064 1.1 skrll if (i >= elf_elfheader (abfd)->e_phnum && nload > 1)
1065 1.1 skrll return TRUE;
1066 1.1 skrll
1067 1.1 skrll phdr = elf_tdata (abfd)->phdr;
1068 1.1 skrll for (i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
1069 1.1 skrll {
1070 1.3 christos if (((phdr->p_type == PT_LOAD
1071 1.3 christos && (hdr->sh_flags & SHF_TLS) == 0)
1072 1.3 christos || phdr->p_type == PT_TLS)
1073 1.3 christos && ELF_SECTION_IN_SEGMENT (hdr, phdr))
1074 1.1 skrll {
1075 1.1 skrll if ((flags & SEC_LOAD) == 0)
1076 1.1 skrll newsect->lma = (phdr->p_paddr
1077 1.1 skrll + hdr->sh_addr - phdr->p_vaddr);
1078 1.1 skrll else
1079 1.1 skrll /* We used to use the same adjustment for SEC_LOAD
1080 1.1 skrll sections, but that doesn't work if the segment
1081 1.1 skrll is packed with code from multiple VMAs.
1082 1.1 skrll Instead we calculate the section LMA based on
1083 1.1 skrll the segment LMA. It is assumed that the
1084 1.1 skrll segment will contain sections with contiguous
1085 1.1 skrll LMAs, even if the VMAs are not. */
1086 1.1 skrll newsect->lma = (phdr->p_paddr
1087 1.1 skrll + hdr->sh_offset - phdr->p_offset);
1088 1.1 skrll
1089 1.1 skrll /* With contiguous segments, we can't tell from file
1090 1.1 skrll offsets whether a section with zero size should
1091 1.1 skrll be placed at the end of one segment or the
1092 1.1 skrll beginning of the next. Decide based on vaddr. */
1093 1.1 skrll if (hdr->sh_addr >= phdr->p_vaddr
1094 1.1 skrll && (hdr->sh_addr + hdr->sh_size
1095 1.1 skrll <= phdr->p_vaddr + phdr->p_memsz))
1096 1.1 skrll break;
1097 1.1 skrll }
1098 1.1 skrll }
1099 1.1 skrll }
1100 1.1 skrll
1101 1.3 christos /* Compress/decompress DWARF debug sections with names: .debug_* and
1102 1.3 christos .zdebug_*, after the section flags is set. */
1103 1.3 christos if ((flags & SEC_DEBUGGING)
1104 1.3 christos && ((name[1] == 'd' && name[6] == '_')
1105 1.3 christos || (name[1] == 'z' && name[7] == '_')))
1106 1.3 christos {
1107 1.3 christos enum { nothing, compress, decompress } action = nothing;
1108 1.6 christos int compression_header_size;
1109 1.6 christos bfd_size_type uncompressed_size;
1110 1.6 christos bfd_boolean compressed
1111 1.6 christos = bfd_is_section_compressed_with_header (abfd, newsect,
1112 1.6 christos &compression_header_size,
1113 1.6 christos &uncompressed_size);
1114 1.3 christos
1115 1.6 christos if (compressed)
1116 1.3 christos {
1117 1.3 christos /* Compressed section. Check if we should decompress. */
1118 1.3 christos if ((abfd->flags & BFD_DECOMPRESS))
1119 1.3 christos action = decompress;
1120 1.3 christos }
1121 1.6 christos
1122 1.6 christos /* Compress the uncompressed section or convert from/to .zdebug*
1123 1.6 christos section. Check if we should compress. */
1124 1.6 christos if (action == nothing)
1125 1.6 christos {
1126 1.6 christos if (newsect->size != 0
1127 1.6 christos && (abfd->flags & BFD_COMPRESS)
1128 1.6 christos && compression_header_size >= 0
1129 1.6 christos && uncompressed_size > 0
1130 1.6 christos && (!compressed
1131 1.6 christos || ((compression_header_size > 0)
1132 1.6 christos != ((abfd->flags & BFD_COMPRESS_GABI) != 0))))
1133 1.3 christos action = compress;
1134 1.6 christos else
1135 1.6 christos return TRUE;
1136 1.3 christos }
1137 1.1 skrll
1138 1.6 christos if (action == compress)
1139 1.3 christos {
1140 1.3 christos if (!bfd_init_section_compress_status (abfd, newsect))
1141 1.3 christos {
1142 1.3 christos (*_bfd_error_handler)
1143 1.5 christos (_("%B: unable to initialize compress status for section %s"),
1144 1.3 christos abfd, name);
1145 1.3 christos return FALSE;
1146 1.3 christos }
1147 1.6 christos }
1148 1.6 christos else
1149 1.6 christos {
1150 1.3 christos if (!bfd_init_section_decompress_status (abfd, newsect))
1151 1.3 christos {
1152 1.3 christos (*_bfd_error_handler)
1153 1.5 christos (_("%B: unable to initialize decompress status for section %s"),
1154 1.3 christos abfd, name);
1155 1.3 christos return FALSE;
1156 1.3 christos }
1157 1.6 christos }
1158 1.1 skrll
1159 1.6 christos if (abfd->is_linker_input)
1160 1.6 christos {
1161 1.6 christos if (name[1] == 'z'
1162 1.6 christos && (action == decompress
1163 1.6 christos || (action == compress
1164 1.6 christos && (abfd->flags & BFD_COMPRESS_GABI) != 0)))
1165 1.6 christos {
1166 1.6 christos /* Convert section name from .zdebug_* to .debug_* so
1167 1.6 christos that linker will consider this section as a debug
1168 1.6 christos section. */
1169 1.6 christos char *new_name = convert_zdebug_to_debug (abfd, name);
1170 1.3 christos if (new_name == NULL)
1171 1.3 christos return FALSE;
1172 1.6 christos bfd_rename_section (abfd, newsect, new_name);
1173 1.3 christos }
1174 1.1 skrll }
1175 1.6 christos else
1176 1.6 christos /* For objdump, don't rename the section. For objcopy, delay
1177 1.6 christos section rename to elf_fake_sections. */
1178 1.6 christos newsect->flags |= SEC_ELF_RENAME;
1179 1.1 skrll }
1180 1.3 christos
1181 1.3 christos return TRUE;
1182 1.1 skrll }
1183 1.1 skrll
1184 1.6.2.1 pgoyette const char *const bfd_elf_section_type_names[] =
1185 1.6.2.1 pgoyette {
1186 1.1 skrll "SHT_NULL", "SHT_PROGBITS", "SHT_SYMTAB", "SHT_STRTAB",
1187 1.1 skrll "SHT_RELA", "SHT_HASH", "SHT_DYNAMIC", "SHT_NOTE",
1188 1.1 skrll "SHT_NOBITS", "SHT_REL", "SHT_SHLIB", "SHT_DYNSYM",
1189 1.1 skrll };
1190 1.1 skrll
1191 1.1 skrll /* ELF relocs are against symbols. If we are producing relocatable
1192 1.1 skrll output, and the reloc is against an external symbol, and nothing
1193 1.1 skrll has given us any additional addend, the resulting reloc will also
1194 1.1 skrll be against the same symbol. In such a case, we don't want to
1195 1.1 skrll change anything about the way the reloc is handled, since it will
1196 1.1 skrll all be done at final link time. Rather than put special case code
1197 1.1 skrll into bfd_perform_relocation, all the reloc types use this howto
1198 1.1 skrll function. It just short circuits the reloc if producing
1199 1.1 skrll relocatable output against an external symbol. */
1200 1.1 skrll
1201 1.1 skrll bfd_reloc_status_type
1202 1.1 skrll bfd_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED,
1203 1.1 skrll arelent *reloc_entry,
1204 1.1 skrll asymbol *symbol,
1205 1.1 skrll void *data ATTRIBUTE_UNUSED,
1206 1.1 skrll asection *input_section,
1207 1.1 skrll bfd *output_bfd,
1208 1.1 skrll char **error_message ATTRIBUTE_UNUSED)
1209 1.1 skrll {
1210 1.1 skrll if (output_bfd != NULL
1211 1.1 skrll && (symbol->flags & BSF_SECTION_SYM) == 0
1212 1.1 skrll && (! reloc_entry->howto->partial_inplace
1213 1.1 skrll || reloc_entry->addend == 0))
1214 1.1 skrll {
1215 1.1 skrll reloc_entry->address += input_section->output_offset;
1216 1.1 skrll return bfd_reloc_ok;
1217 1.1 skrll }
1218 1.1 skrll
1219 1.1 skrll return bfd_reloc_continue;
1220 1.1 skrll }
1221 1.1 skrll
1222 1.6.2.1 pgoyette /* Returns TRUE if section A matches section B.
1224 1.6.2.1 pgoyette Names, addresses and links may be different, but everything else
1225 1.6.2.1 pgoyette should be the same. */
1226 1.6.2.1 pgoyette
1227 1.6.2.1 pgoyette static bfd_boolean
1228 1.6.2.1 pgoyette section_match (const Elf_Internal_Shdr * a,
1229 1.6.2.1 pgoyette const Elf_Internal_Shdr * b)
1230 1.6.2.1 pgoyette {
1231 1.6.2.1 pgoyette return
1232 1.6.2.1 pgoyette a->sh_type == b->sh_type
1233 1.6.2.1 pgoyette && (a->sh_flags & ~ SHF_INFO_LINK)
1234 1.6.2.1 pgoyette == (b->sh_flags & ~ SHF_INFO_LINK)
1235 1.6.2.1 pgoyette && a->sh_addralign == b->sh_addralign
1236 1.6.2.1 pgoyette && a->sh_size == b->sh_size
1237 1.6.2.1 pgoyette && a->sh_entsize == b->sh_entsize
1238 1.6.2.1 pgoyette /* FIXME: Check sh_addr ? */
1239 1.6.2.1 pgoyette ;
1240 1.6.2.1 pgoyette }
1241 1.6.2.1 pgoyette
1242 1.6.2.1 pgoyette /* Find a section in OBFD that has the same characteristics
1243 1.6.2.1 pgoyette as IHEADER. Return the index of this section or SHN_UNDEF if
1244 1.6.2.1 pgoyette none can be found. Check's section HINT first, as this is likely
1245 1.6.2.1 pgoyette to be the correct section. */
1246 1.6.2.1 pgoyette
1247 1.6.2.1 pgoyette static unsigned int
1248 1.6.2.1 pgoyette find_link (const bfd * obfd, const Elf_Internal_Shdr * iheader, const unsigned int hint)
1249 1.6.2.1 pgoyette {
1250 1.6.2.1 pgoyette Elf_Internal_Shdr ** oheaders = elf_elfsections (obfd);
1251 1.6.2.1 pgoyette unsigned int i;
1252 1.6.2.1 pgoyette
1253 1.6.2.1 pgoyette if (section_match (oheaders[hint], iheader))
1254 1.6.2.1 pgoyette return hint;
1255 1.6.2.1 pgoyette
1256 1.6.2.1 pgoyette for (i = 1; i < elf_numsections (obfd); i++)
1257 1.6.2.1 pgoyette {
1258 1.6.2.1 pgoyette Elf_Internal_Shdr * oheader = oheaders[i];
1259 1.6.2.1 pgoyette
1260 1.6.2.1 pgoyette if (section_match (oheader, iheader))
1261 1.6.2.1 pgoyette /* FIXME: Do we care if there is a potential for
1262 1.6.2.1 pgoyette multiple matches ? */
1263 1.6.2.1 pgoyette return i;
1264 1.6.2.1 pgoyette }
1265 1.6.2.1 pgoyette
1266 1.6.2.1 pgoyette return SHN_UNDEF;
1267 1.6.2.1 pgoyette }
1268 1.6.2.1 pgoyette
1269 1.6.2.1 pgoyette /* PR 19938: Attempt to set the ELF section header fields of an OS or
1270 1.6.2.1 pgoyette Processor specific section, based upon a matching input section.
1271 1.6.2.1 pgoyette Returns TRUE upon success, FALSE otherwise. */
1272 1.6.2.1 pgoyette
1273 1.6.2.1 pgoyette static bfd_boolean
1274 1.6.2.1 pgoyette copy_special_section_fields (const bfd *ibfd,
1275 1.6.2.1 pgoyette bfd *obfd,
1276 1.6.2.1 pgoyette const Elf_Internal_Shdr *iheader,
1277 1.6.2.1 pgoyette Elf_Internal_Shdr *oheader,
1278 1.6.2.1 pgoyette const unsigned int secnum)
1279 1.6.2.1 pgoyette {
1280 1.6.2.1 pgoyette const struct elf_backend_data *bed = get_elf_backend_data (obfd);
1281 1.6.2.1 pgoyette const Elf_Internal_Shdr **iheaders = (const Elf_Internal_Shdr **) elf_elfsections (ibfd);
1282 1.6.2.1 pgoyette bfd_boolean changed = FALSE;
1283 1.6.2.1 pgoyette unsigned int sh_link;
1284 1.6.2.1 pgoyette
1285 1.6.2.1 pgoyette if (oheader->sh_type == SHT_NOBITS)
1286 1.6.2.1 pgoyette {
1287 1.6.2.1 pgoyette /* This is a feature for objcopy --only-keep-debug:
1288 1.6.2.1 pgoyette When a section's type is changed to NOBITS, we preserve
1289 1.6.2.1 pgoyette the sh_link and sh_info fields so that they can be
1290 1.6.2.1 pgoyette matched up with the original.
1291 1.6.2.1 pgoyette
1292 1.6.2.1 pgoyette Note: Strictly speaking these assignments are wrong.
1293 1.6.2.1 pgoyette The sh_link and sh_info fields should point to the
1294 1.6.2.1 pgoyette relevent sections in the output BFD, which may not be in
1295 1.6.2.1 pgoyette the same location as they were in the input BFD. But
1296 1.6.2.1 pgoyette the whole point of this action is to preserve the
1297 1.6.2.1 pgoyette original values of the sh_link and sh_info fields, so
1298 1.6.2.1 pgoyette that they can be matched up with the section headers in
1299 1.6.2.1 pgoyette the original file. So strictly speaking we may be
1300 1.6.2.1 pgoyette creating an invalid ELF file, but it is only for a file
1301 1.6.2.1 pgoyette that just contains debug info and only for sections
1302 1.6.2.1 pgoyette without any contents. */
1303 1.6.2.1 pgoyette if (oheader->sh_link == 0)
1304 1.6.2.1 pgoyette oheader->sh_link = iheader->sh_link;
1305 1.6.2.1 pgoyette if (oheader->sh_info == 0)
1306 1.6.2.1 pgoyette oheader->sh_info = iheader->sh_info;
1307 1.6.2.1 pgoyette return TRUE;
1308 1.6.2.1 pgoyette }
1309 1.6.2.1 pgoyette
1310 1.6.2.1 pgoyette /* Allow the target a chance to decide how these fields should be set. */
1311 1.6.2.1 pgoyette if (bed->elf_backend_copy_special_section_fields != NULL
1312 1.6.2.1 pgoyette && bed->elf_backend_copy_special_section_fields
1313 1.6.2.1 pgoyette (ibfd, obfd, iheader, oheader))
1314 1.6.2.1 pgoyette return TRUE;
1315 1.6.2.1 pgoyette
1316 1.6.2.1 pgoyette /* We have an iheader which might match oheader, and which has non-zero
1317 1.6.2.1 pgoyette sh_info and/or sh_link fields. Attempt to follow those links and find
1318 1.6.2.1 pgoyette the section in the output bfd which corresponds to the linked section
1319 1.6.2.1 pgoyette in the input bfd. */
1320 1.6.2.1 pgoyette if (iheader->sh_link != SHN_UNDEF)
1321 1.6.2.1 pgoyette {
1322 1.6.2.1 pgoyette sh_link = find_link (obfd, iheaders[iheader->sh_link], iheader->sh_link);
1323 1.6.2.1 pgoyette if (sh_link != SHN_UNDEF)
1324 1.6.2.1 pgoyette {
1325 1.6.2.1 pgoyette oheader->sh_link = sh_link;
1326 1.6.2.1 pgoyette changed = TRUE;
1327 1.6.2.1 pgoyette }
1328 1.6.2.1 pgoyette else
1329 1.6.2.1 pgoyette /* FIXME: Should we install iheader->sh_link
1330 1.6.2.1 pgoyette if we could not find a match ? */
1331 1.6.2.1 pgoyette (* _bfd_error_handler)
1332 1.6.2.1 pgoyette (_("%B: Failed to find link section for section %d"), obfd, secnum);
1333 1.6.2.1 pgoyette }
1334 1.6.2.1 pgoyette
1335 1.6.2.1 pgoyette if (iheader->sh_info)
1336 1.6.2.1 pgoyette {
1337 1.6.2.1 pgoyette /* The sh_info field can hold arbitrary information, but if the
1338 1.6.2.1 pgoyette SHF_LINK_INFO flag is set then it should be interpreted as a
1339 1.6.2.1 pgoyette section index. */
1340 1.6.2.1 pgoyette if (iheader->sh_flags & SHF_INFO_LINK)
1341 1.6.2.1 pgoyette {
1342 1.6.2.1 pgoyette sh_link = find_link (obfd, iheaders[iheader->sh_info],
1343 1.6.2.1 pgoyette iheader->sh_info);
1344 1.6.2.1 pgoyette if (sh_link != SHN_UNDEF)
1345 1.6.2.1 pgoyette oheader->sh_flags |= SHF_INFO_LINK;
1346 1.6.2.1 pgoyette }
1347 1.6.2.1 pgoyette else
1348 1.6.2.1 pgoyette /* No idea what it means - just copy it. */
1349 1.6.2.1 pgoyette sh_link = iheader->sh_info;
1350 1.6.2.1 pgoyette
1351 1.6.2.1 pgoyette if (sh_link != SHN_UNDEF)
1352 1.6.2.1 pgoyette {
1353 1.6.2.1 pgoyette oheader->sh_info = sh_link;
1354 1.6.2.1 pgoyette changed = TRUE;
1355 1.6.2.1 pgoyette }
1356 1.6.2.1 pgoyette else
1357 1.6.2.1 pgoyette (* _bfd_error_handler)
1358 1.6.2.1 pgoyette (_("%B: Failed to find info section for section %d"), obfd, secnum);
1359 1.6.2.1 pgoyette }
1360 1.6.2.1 pgoyette
1361 1.6.2.1 pgoyette return changed;
1362 1.6.2.1 pgoyette }
1363 1.1 skrll
1364 1.1 skrll /* Copy the program header and other data from one object module to
1365 1.1 skrll another. */
1366 1.1 skrll
1367 1.1 skrll bfd_boolean
1368 1.1 skrll _bfd_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
1369 1.6.2.1 pgoyette {
1370 1.6.2.1 pgoyette const Elf_Internal_Shdr **iheaders = (const Elf_Internal_Shdr **) elf_elfsections (ibfd);
1371 1.6.2.1 pgoyette Elf_Internal_Shdr **oheaders = elf_elfsections (obfd);
1372 1.6.2.1 pgoyette const struct elf_backend_data *bed;
1373 1.6.2.1 pgoyette unsigned int i;
1374 1.1 skrll
1375 1.6.2.1 pgoyette if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1376 1.1 skrll || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1377 1.1 skrll return TRUE;
1378 1.6 christos
1379 1.6 christos if (!elf_flags_init (obfd))
1380 1.6 christos {
1381 1.6 christos elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
1382 1.6 christos elf_flags_init (obfd) = TRUE;
1383 1.1 skrll }
1384 1.1 skrll
1385 1.6 christos elf_gp (obfd) = elf_gp (ibfd);
1386 1.6 christos
1387 1.6 christos /* Also copy the EI_OSABI field. */
1388 1.6 christos elf_elfheader (obfd)->e_ident[EI_OSABI] =
1389 1.1 skrll elf_elfheader (ibfd)->e_ident[EI_OSABI];
1390 1.6.2.1 pgoyette
1391 1.6.2.1 pgoyette /* If set, copy the EI_ABIVERSION field. */
1392 1.6.2.1 pgoyette if (elf_elfheader (ibfd)->e_ident[EI_ABIVERSION])
1393 1.6.2.1 pgoyette elf_elfheader (obfd)->e_ident[EI_ABIVERSION]
1394 1.6.2.1 pgoyette = elf_elfheader (ibfd)->e_ident[EI_ABIVERSION];
1395 1.1 skrll
1396 1.1 skrll /* Copy object attributes. */
1397 1.6 christos _bfd_elf_copy_obj_attributes (ibfd, obfd);
1398 1.6.2.1 pgoyette
1399 1.6.2.1 pgoyette if (iheaders == NULL || oheaders == NULL)
1400 1.6.2.1 pgoyette return TRUE;
1401 1.6.2.1 pgoyette
1402 1.6 christos bed = get_elf_backend_data (obfd);
1403 1.6.2.1 pgoyette
1404 1.6.2.1 pgoyette /* Possibly copy other fields in the section header. */
1405 1.6 christos for (i = 1; i < elf_numsections (obfd); i++)
1406 1.6.2.1 pgoyette {
1407 1.6.2.1 pgoyette unsigned int j;
1408 1.6.2.1 pgoyette Elf_Internal_Shdr * oheader = oheaders[i];
1409 1.6.2.1 pgoyette
1410 1.6.2.1 pgoyette /* Ignore ordinary sections. SHT_NOBITS sections are considered however
1411 1.6.2.1 pgoyette because of a special case need for generating separate debug info
1412 1.6.2.1 pgoyette files. See below for more details. */
1413 1.6.2.1 pgoyette if (oheader == NULL
1414 1.6.2.1 pgoyette || (oheader->sh_type != SHT_NOBITS
1415 1.6.2.1 pgoyette && oheader->sh_type < SHT_LOOS))
1416 1.6 christos continue;
1417 1.6.2.1 pgoyette
1418 1.6.2.1 pgoyette /* Ignore empty sections, and sections whose
1419 1.6.2.1 pgoyette fields have already been initialised. */
1420 1.6.2.1 pgoyette if (oheader->sh_size == 0
1421 1.6.2.1 pgoyette || (oheader->sh_info != 0 && oheader->sh_link != 0))
1422 1.6.2.1 pgoyette continue;
1423 1.6.2.1 pgoyette
1424 1.6.2.1 pgoyette /* Scan for the matching section in the input bfd.
1425 1.6.2.1 pgoyette First we try for a direct mapping between the input and output sections. */
1426 1.6 christos for (j = 1; j < elf_numsections (ibfd); j++)
1427 1.6.2.1 pgoyette {
1428 1.6 christos const Elf_Internal_Shdr * iheader = iheaders[j];
1429 1.6.2.1 pgoyette
1430 1.6 christos if (iheader == NULL)
1431 1.6 christos continue;
1432 1.6.2.1 pgoyette
1433 1.6.2.1 pgoyette if (oheader->bfd_section != NULL
1434 1.6.2.1 pgoyette && iheader->bfd_section != NULL
1435 1.6.2.1 pgoyette && iheader->bfd_section->output_section != NULL
1436 1.6.2.1 pgoyette && iheader->bfd_section->output_section == oheader->bfd_section)
1437 1.6.2.1 pgoyette {
1438 1.6.2.1 pgoyette /* We have found a connection from the input section to the
1439 1.6.2.1 pgoyette output section. Attempt to copy the header fields. If
1440 1.6.2.1 pgoyette this fails then do not try any further sections - there
1441 1.6.2.1 pgoyette should only be a one-to-one mapping between input and output. */
1442 1.6.2.1 pgoyette if (! copy_special_section_fields (ibfd, obfd, iheader, oheader, i))
1443 1.6.2.1 pgoyette j = elf_numsections (ibfd);
1444 1.6 christos break;
1445 1.6 christos }
1446 1.6.2.1 pgoyette }
1447 1.6.2.1 pgoyette
1448 1.6.2.1 pgoyette if (j < elf_numsections (ibfd))
1449 1.6.2.1 pgoyette continue;
1450 1.6.2.1 pgoyette
1451 1.6.2.1 pgoyette /* That failed. So try to deduce the corresponding input section.
1452 1.6.2.1 pgoyette Unfortunately we cannot compare names as the output string table
1453 1.6.2.1 pgoyette is empty, so instead we check size, address and type. */
1454 1.6.2.1 pgoyette for (j = 1; j < elf_numsections (ibfd); j++)
1455 1.6.2.1 pgoyette {
1456 1.6.2.1 pgoyette const Elf_Internal_Shdr * iheader = iheaders[j];
1457 1.6.2.1 pgoyette
1458 1.6.2.1 pgoyette if (iheader == NULL)
1459 1.6.2.1 pgoyette continue;
1460 1.6.2.1 pgoyette
1461 1.6.2.1 pgoyette /* Try matching fields in the input section's header.
1462 1.6.2.1 pgoyette Since --only-keep-debug turns all non-debug sections into
1463 1.6.2.1 pgoyette SHT_NOBITS sections, the output SHT_NOBITS type matches any
1464 1.6.2.1 pgoyette input type. */
1465 1.6.2.1 pgoyette if ((oheader->sh_type == SHT_NOBITS
1466 1.6.2.1 pgoyette || iheader->sh_type == oheader->sh_type)
1467 1.6.2.1 pgoyette && (iheader->sh_flags & ~ SHF_INFO_LINK)
1468 1.6.2.1 pgoyette == (oheader->sh_flags & ~ SHF_INFO_LINK)
1469 1.6.2.1 pgoyette && iheader->sh_addralign == oheader->sh_addralign
1470 1.6.2.1 pgoyette && iheader->sh_entsize == oheader->sh_entsize
1471 1.6.2.1 pgoyette && iheader->sh_size == oheader->sh_size
1472 1.6.2.1 pgoyette && iheader->sh_addr == oheader->sh_addr
1473 1.6.2.1 pgoyette && (iheader->sh_info != oheader->sh_info
1474 1.6.2.1 pgoyette || iheader->sh_link != oheader->sh_link))
1475 1.6.2.1 pgoyette {
1476 1.6.2.1 pgoyette if (copy_special_section_fields (ibfd, obfd, iheader, oheader, i))
1477 1.6.2.1 pgoyette break;
1478 1.6.2.1 pgoyette }
1479 1.6.2.1 pgoyette }
1480 1.6.2.1 pgoyette
1481 1.6.2.1 pgoyette if (j == elf_numsections (ibfd) && oheader->sh_type >= SHT_LOOS)
1482 1.6.2.1 pgoyette {
1483 1.6.2.1 pgoyette /* Final attempt. Call the backend copy function
1484 1.6.2.1 pgoyette with a NULL input section. */
1485 1.6.2.1 pgoyette if (bed->elf_backend_copy_special_section_fields != NULL)
1486 1.6.2.1 pgoyette bed->elf_backend_copy_special_section_fields (ibfd, obfd, NULL, oheader);
1487 1.6 christos }
1488 1.6 christos }
1489 1.1 skrll
1490 1.1 skrll return TRUE;
1491 1.1 skrll }
1492 1.1 skrll
1493 1.1 skrll static const char *
1494 1.1 skrll get_segment_type (unsigned int p_type)
1495 1.1 skrll {
1496 1.1 skrll const char *pt;
1497 1.1 skrll switch (p_type)
1498 1.1 skrll {
1499 1.1 skrll case PT_NULL: pt = "NULL"; break;
1500 1.1 skrll case PT_LOAD: pt = "LOAD"; break;
1501 1.1 skrll case PT_DYNAMIC: pt = "DYNAMIC"; break;
1502 1.1 skrll case PT_INTERP: pt = "INTERP"; break;
1503 1.1 skrll case PT_NOTE: pt = "NOTE"; break;
1504 1.1 skrll case PT_SHLIB: pt = "SHLIB"; break;
1505 1.1 skrll case PT_PHDR: pt = "PHDR"; break;
1506 1.1 skrll case PT_TLS: pt = "TLS"; break;
1507 1.1 skrll case PT_GNU_EH_FRAME: pt = "EH_FRAME"; break;
1508 1.1 skrll case PT_GNU_STACK: pt = "STACK"; break;
1509 1.1 skrll case PT_GNU_RELRO: pt = "RELRO"; break;
1510 1.1 skrll default: pt = NULL; break;
1511 1.1 skrll }
1512 1.1 skrll return pt;
1513 1.1 skrll }
1514 1.1 skrll
1515 1.1 skrll /* Print out the program headers. */
1516 1.1 skrll
1517 1.1 skrll bfd_boolean
1518 1.1 skrll _bfd_elf_print_private_bfd_data (bfd *abfd, void *farg)
1519 1.3 christos {
1520 1.1 skrll FILE *f = (FILE *) farg;
1521 1.1 skrll Elf_Internal_Phdr *p;
1522 1.1 skrll asection *s;
1523 1.1 skrll bfd_byte *dynbuf = NULL;
1524 1.1 skrll
1525 1.1 skrll p = elf_tdata (abfd)->phdr;
1526 1.1 skrll if (p != NULL)
1527 1.1 skrll {
1528 1.1 skrll unsigned int i, c;
1529 1.1 skrll
1530 1.1 skrll fprintf (f, _("\nProgram Header:\n"));
1531 1.1 skrll c = elf_elfheader (abfd)->e_phnum;
1532 1.1 skrll for (i = 0; i < c; i++, p++)
1533 1.1 skrll {
1534 1.1 skrll const char *pt = get_segment_type (p->p_type);
1535 1.1 skrll char buf[20];
1536 1.1 skrll
1537 1.1 skrll if (pt == NULL)
1538 1.1 skrll {
1539 1.1 skrll sprintf (buf, "0x%lx", p->p_type);
1540 1.1 skrll pt = buf;
1541 1.1 skrll }
1542 1.1 skrll fprintf (f, "%8s off 0x", pt);
1543 1.1 skrll bfd_fprintf_vma (abfd, f, p->p_offset);
1544 1.1 skrll fprintf (f, " vaddr 0x");
1545 1.1 skrll bfd_fprintf_vma (abfd, f, p->p_vaddr);
1546 1.1 skrll fprintf (f, " paddr 0x");
1547 1.1 skrll bfd_fprintf_vma (abfd, f, p->p_paddr);
1548 1.1 skrll fprintf (f, " align 2**%u\n", bfd_log2 (p->p_align));
1549 1.1 skrll fprintf (f, " filesz 0x");
1550 1.1 skrll bfd_fprintf_vma (abfd, f, p->p_filesz);
1551 1.1 skrll fprintf (f, " memsz 0x");
1552 1.1 skrll bfd_fprintf_vma (abfd, f, p->p_memsz);
1553 1.1 skrll fprintf (f, " flags %c%c%c",
1554 1.1 skrll (p->p_flags & PF_R) != 0 ? 'r' : '-',
1555 1.1 skrll (p->p_flags & PF_W) != 0 ? 'w' : '-',
1556 1.1 skrll (p->p_flags & PF_X) != 0 ? 'x' : '-');
1557 1.1 skrll if ((p->p_flags &~ (unsigned) (PF_R | PF_W | PF_X)) != 0)
1558 1.1 skrll fprintf (f, " %lx", p->p_flags &~ (unsigned) (PF_R | PF_W | PF_X));
1559 1.1 skrll fprintf (f, "\n");
1560 1.1 skrll }
1561 1.1 skrll }
1562 1.1 skrll
1563 1.1 skrll s = bfd_get_section_by_name (abfd, ".dynamic");
1564 1.1 skrll if (s != NULL)
1565 1.1 skrll {
1566 1.1 skrll unsigned int elfsec;
1567 1.1 skrll unsigned long shlink;
1568 1.1 skrll bfd_byte *extdyn, *extdynend;
1569 1.1 skrll size_t extdynsize;
1570 1.1 skrll void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
1571 1.1 skrll
1572 1.1 skrll fprintf (f, _("\nDynamic Section:\n"));
1573 1.1 skrll
1574 1.1 skrll if (!bfd_malloc_and_get_section (abfd, s, &dynbuf))
1575 1.1 skrll goto error_return;
1576 1.1 skrll
1577 1.1 skrll elfsec = _bfd_elf_section_from_bfd_section (abfd, s);
1578 1.1 skrll if (elfsec == SHN_BAD)
1579 1.1 skrll goto error_return;
1580 1.1 skrll shlink = elf_elfsections (abfd)[elfsec]->sh_link;
1581 1.1 skrll
1582 1.1 skrll extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
1583 1.1 skrll swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
1584 1.1 skrll
1585 1.6 christos extdyn = dynbuf;
1586 1.6 christos /* PR 17512: file: 6f427532. */
1587 1.6 christos if (s->size < extdynsize)
1588 1.1 skrll goto error_return;
1589 1.6 christos extdynend = extdyn + s->size;
1590 1.6 christos /* PR 17512: file: id:000006,sig:06,src:000000,op:flip4,pos:5664.
1591 1.6 christos Fix range check. */
1592 1.1 skrll for (; extdyn <= (extdynend - extdynsize); extdyn += extdynsize)
1593 1.1 skrll {
1594 1.1 skrll Elf_Internal_Dyn dyn;
1595 1.1 skrll const char *name = "";
1596 1.1 skrll char ab[20];
1597 1.1 skrll bfd_boolean stringp;
1598 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
1599 1.1 skrll
1600 1.1 skrll (*swap_dyn_in) (abfd, extdyn, &dyn);
1601 1.1 skrll
1602 1.1 skrll if (dyn.d_tag == DT_NULL)
1603 1.1 skrll break;
1604 1.1 skrll
1605 1.1 skrll stringp = FALSE;
1606 1.1 skrll switch (dyn.d_tag)
1607 1.1 skrll {
1608 1.1 skrll default:
1609 1.1 skrll if (bed->elf_backend_get_target_dtag)
1610 1.1 skrll name = (*bed->elf_backend_get_target_dtag) (dyn.d_tag);
1611 1.1 skrll
1612 1.1 skrll if (!strcmp (name, ""))
1613 1.1 skrll {
1614 1.1 skrll sprintf (ab, "0x%lx", (unsigned long) dyn.d_tag);
1615 1.1 skrll name = ab;
1616 1.1 skrll }
1617 1.1 skrll break;
1618 1.1 skrll
1619 1.1 skrll case DT_NEEDED: name = "NEEDED"; stringp = TRUE; break;
1620 1.1 skrll case DT_PLTRELSZ: name = "PLTRELSZ"; break;
1621 1.1 skrll case DT_PLTGOT: name = "PLTGOT"; break;
1622 1.1 skrll case DT_HASH: name = "HASH"; break;
1623 1.1 skrll case DT_STRTAB: name = "STRTAB"; break;
1624 1.1 skrll case DT_SYMTAB: name = "SYMTAB"; break;
1625 1.1 skrll case DT_RELA: name = "RELA"; break;
1626 1.1 skrll case DT_RELASZ: name = "RELASZ"; break;
1627 1.1 skrll case DT_RELAENT: name = "RELAENT"; break;
1628 1.1 skrll case DT_STRSZ: name = "STRSZ"; break;
1629 1.1 skrll case DT_SYMENT: name = "SYMENT"; break;
1630 1.1 skrll case DT_INIT: name = "INIT"; break;
1631 1.1 skrll case DT_FINI: name = "FINI"; break;
1632 1.1 skrll case DT_SONAME: name = "SONAME"; stringp = TRUE; break;
1633 1.1 skrll case DT_RPATH: name = "RPATH"; stringp = TRUE; break;
1634 1.1 skrll case DT_SYMBOLIC: name = "SYMBOLIC"; break;
1635 1.1 skrll case DT_REL: name = "REL"; break;
1636 1.1 skrll case DT_RELSZ: name = "RELSZ"; break;
1637 1.1 skrll case DT_RELENT: name = "RELENT"; break;
1638 1.1 skrll case DT_PLTREL: name = "PLTREL"; break;
1639 1.1 skrll case DT_DEBUG: name = "DEBUG"; break;
1640 1.1 skrll case DT_TEXTREL: name = "TEXTREL"; break;
1641 1.1 skrll case DT_JMPREL: name = "JMPREL"; break;
1642 1.1 skrll case DT_BIND_NOW: name = "BIND_NOW"; break;
1643 1.1 skrll case DT_INIT_ARRAY: name = "INIT_ARRAY"; break;
1644 1.1 skrll case DT_FINI_ARRAY: name = "FINI_ARRAY"; break;
1645 1.1 skrll case DT_INIT_ARRAYSZ: name = "INIT_ARRAYSZ"; break;
1646 1.1 skrll case DT_FINI_ARRAYSZ: name = "FINI_ARRAYSZ"; break;
1647 1.1 skrll case DT_RUNPATH: name = "RUNPATH"; stringp = TRUE; break;
1648 1.1 skrll case DT_FLAGS: name = "FLAGS"; break;
1649 1.1 skrll case DT_PREINIT_ARRAY: name = "PREINIT_ARRAY"; break;
1650 1.1 skrll case DT_PREINIT_ARRAYSZ: name = "PREINIT_ARRAYSZ"; break;
1651 1.1 skrll case DT_CHECKSUM: name = "CHECKSUM"; break;
1652 1.1 skrll case DT_PLTPADSZ: name = "PLTPADSZ"; break;
1653 1.1 skrll case DT_MOVEENT: name = "MOVEENT"; break;
1654 1.1 skrll case DT_MOVESZ: name = "MOVESZ"; break;
1655 1.1 skrll case DT_FEATURE: name = "FEATURE"; break;
1656 1.1 skrll case DT_POSFLAG_1: name = "POSFLAG_1"; break;
1657 1.1 skrll case DT_SYMINSZ: name = "SYMINSZ"; break;
1658 1.1 skrll case DT_SYMINENT: name = "SYMINENT"; break;
1659 1.1 skrll case DT_CONFIG: name = "CONFIG"; stringp = TRUE; break;
1660 1.1 skrll case DT_DEPAUDIT: name = "DEPAUDIT"; stringp = TRUE; break;
1661 1.1 skrll case DT_AUDIT: name = "AUDIT"; stringp = TRUE; break;
1662 1.1 skrll case DT_PLTPAD: name = "PLTPAD"; break;
1663 1.1 skrll case DT_MOVETAB: name = "MOVETAB"; break;
1664 1.1 skrll case DT_SYMINFO: name = "SYMINFO"; break;
1665 1.1 skrll case DT_RELACOUNT: name = "RELACOUNT"; break;
1666 1.1 skrll case DT_RELCOUNT: name = "RELCOUNT"; break;
1667 1.1 skrll case DT_FLAGS_1: name = "FLAGS_1"; break;
1668 1.1 skrll case DT_VERSYM: name = "VERSYM"; break;
1669 1.1 skrll case DT_VERDEF: name = "VERDEF"; break;
1670 1.1 skrll case DT_VERDEFNUM: name = "VERDEFNUM"; break;
1671 1.1 skrll case DT_VERNEED: name = "VERNEED"; break;
1672 1.1 skrll case DT_VERNEEDNUM: name = "VERNEEDNUM"; break;
1673 1.1 skrll case DT_AUXILIARY: name = "AUXILIARY"; stringp = TRUE; break;
1674 1.1 skrll case DT_USED: name = "USED"; break;
1675 1.1 skrll case DT_FILTER: name = "FILTER"; stringp = TRUE; break;
1676 1.1 skrll case DT_GNU_HASH: name = "GNU_HASH"; break;
1677 1.1 skrll }
1678 1.1 skrll
1679 1.1 skrll fprintf (f, " %-20s ", name);
1680 1.1 skrll if (! stringp)
1681 1.1 skrll {
1682 1.1 skrll fprintf (f, "0x");
1683 1.1 skrll bfd_fprintf_vma (abfd, f, dyn.d_un.d_val);
1684 1.1 skrll }
1685 1.1 skrll else
1686 1.1 skrll {
1687 1.1 skrll const char *string;
1688 1.1 skrll unsigned int tagv = dyn.d_un.d_val;
1689 1.1 skrll
1690 1.1 skrll string = bfd_elf_string_from_elf_section (abfd, shlink, tagv);
1691 1.1 skrll if (string == NULL)
1692 1.1 skrll goto error_return;
1693 1.1 skrll fprintf (f, "%s", string);
1694 1.1 skrll }
1695 1.1 skrll fprintf (f, "\n");
1696 1.1 skrll }
1697 1.1 skrll
1698 1.1 skrll free (dynbuf);
1699 1.1 skrll dynbuf = NULL;
1700 1.1 skrll }
1701 1.1 skrll
1702 1.1 skrll if ((elf_dynverdef (abfd) != 0 && elf_tdata (abfd)->verdef == NULL)
1703 1.1 skrll || (elf_dynverref (abfd) != 0 && elf_tdata (abfd)->verref == NULL))
1704 1.1 skrll {
1705 1.1 skrll if (! _bfd_elf_slurp_version_tables (abfd, FALSE))
1706 1.1 skrll return FALSE;
1707 1.1 skrll }
1708 1.1 skrll
1709 1.1 skrll if (elf_dynverdef (abfd) != 0)
1710 1.1 skrll {
1711 1.1 skrll Elf_Internal_Verdef *t;
1712 1.1 skrll
1713 1.1 skrll fprintf (f, _("\nVersion definitions:\n"));
1714 1.1 skrll for (t = elf_tdata (abfd)->verdef; t != NULL; t = t->vd_nextdef)
1715 1.1 skrll {
1716 1.1 skrll fprintf (f, "%d 0x%2.2x 0x%8.8lx %s\n", t->vd_ndx,
1717 1.1 skrll t->vd_flags, t->vd_hash,
1718 1.1 skrll t->vd_nodename ? t->vd_nodename : "<corrupt>");
1719 1.1 skrll if (t->vd_auxptr != NULL && t->vd_auxptr->vda_nextptr != NULL)
1720 1.1 skrll {
1721 1.1 skrll Elf_Internal_Verdaux *a;
1722 1.1 skrll
1723 1.1 skrll fprintf (f, "\t");
1724 1.1 skrll for (a = t->vd_auxptr->vda_nextptr;
1725 1.1 skrll a != NULL;
1726 1.1 skrll a = a->vda_nextptr)
1727 1.1 skrll fprintf (f, "%s ",
1728 1.1 skrll a->vda_nodename ? a->vda_nodename : "<corrupt>");
1729 1.1 skrll fprintf (f, "\n");
1730 1.1 skrll }
1731 1.1 skrll }
1732 1.1 skrll }
1733 1.1 skrll
1734 1.1 skrll if (elf_dynverref (abfd) != 0)
1735 1.1 skrll {
1736 1.1 skrll Elf_Internal_Verneed *t;
1737 1.1 skrll
1738 1.1 skrll fprintf (f, _("\nVersion References:\n"));
1739 1.1 skrll for (t = elf_tdata (abfd)->verref; t != NULL; t = t->vn_nextref)
1740 1.1 skrll {
1741 1.1 skrll Elf_Internal_Vernaux *a;
1742 1.1 skrll
1743 1.1 skrll fprintf (f, _(" required from %s:\n"),
1744 1.1 skrll t->vn_filename ? t->vn_filename : "<corrupt>");
1745 1.1 skrll for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr)
1746 1.1 skrll fprintf (f, " 0x%8.8lx 0x%2.2x %2.2d %s\n", a->vna_hash,
1747 1.1 skrll a->vna_flags, a->vna_other,
1748 1.1 skrll a->vna_nodename ? a->vna_nodename : "<corrupt>");
1749 1.1 skrll }
1750 1.1 skrll }
1751 1.1 skrll
1752 1.1 skrll return TRUE;
1753 1.1 skrll
1754 1.1 skrll error_return:
1755 1.1 skrll if (dynbuf != NULL)
1756 1.1 skrll free (dynbuf);
1757 1.1 skrll return FALSE;
1758 1.1 skrll }
1759 1.6 christos
1760 1.6 christos /* Get version string. */
1761 1.6 christos
1762 1.6 christos const char *
1763 1.6 christos _bfd_elf_get_symbol_version_string (bfd *abfd, asymbol *symbol,
1764 1.6 christos bfd_boolean *hidden)
1765 1.6 christos {
1766 1.6 christos const char *version_string = NULL;
1767 1.6 christos if (elf_dynversym (abfd) != 0
1768 1.6 christos && (elf_dynverdef (abfd) != 0 || elf_dynverref (abfd) != 0))
1769 1.6 christos {
1770 1.6 christos unsigned int vernum = ((elf_symbol_type *) symbol)->version;
1771 1.6 christos
1772 1.6 christos *hidden = (vernum & VERSYM_HIDDEN) != 0;
1773 1.6 christos vernum &= VERSYM_VERSION;
1774 1.6 christos
1775 1.6 christos if (vernum == 0)
1776 1.6 christos version_string = "";
1777 1.6 christos else if (vernum == 1)
1778 1.6 christos version_string = "Base";
1779 1.6 christos else if (vernum <= elf_tdata (abfd)->cverdefs)
1780 1.6 christos version_string =
1781 1.6 christos elf_tdata (abfd)->verdef[vernum - 1].vd_nodename;
1782 1.6 christos else
1783 1.6 christos {
1784 1.6 christos Elf_Internal_Verneed *t;
1785 1.6 christos
1786 1.6 christos version_string = "";
1787 1.6 christos for (t = elf_tdata (abfd)->verref;
1788 1.6 christos t != NULL;
1789 1.6 christos t = t->vn_nextref)
1790 1.6 christos {
1791 1.6 christos Elf_Internal_Vernaux *a;
1792 1.6 christos
1793 1.6 christos for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr)
1794 1.6 christos {
1795 1.6 christos if (a->vna_other == vernum)
1796 1.6 christos {
1797 1.6 christos version_string = a->vna_nodename;
1798 1.6 christos break;
1799 1.6 christos }
1800 1.6 christos }
1801 1.6 christos }
1802 1.6 christos }
1803 1.6 christos }
1804 1.6 christos return version_string;
1805 1.6 christos }
1806 1.1 skrll
1807 1.1 skrll /* Display ELF-specific fields of a symbol. */
1808 1.1 skrll
1809 1.1 skrll void
1810 1.1 skrll bfd_elf_print_symbol (bfd *abfd,
1811 1.1 skrll void *filep,
1812 1.1 skrll asymbol *symbol,
1813 1.1 skrll bfd_print_symbol_type how)
1814 1.3 christos {
1815 1.1 skrll FILE *file = (FILE *) filep;
1816 1.1 skrll switch (how)
1817 1.1 skrll {
1818 1.1 skrll case bfd_print_symbol_name:
1819 1.1 skrll fprintf (file, "%s", symbol->name);
1820 1.1 skrll break;
1821 1.1 skrll case bfd_print_symbol_more:
1822 1.1 skrll fprintf (file, "elf ");
1823 1.1 skrll bfd_fprintf_vma (abfd, file, symbol->value);
1824 1.1 skrll fprintf (file, " %lx", (unsigned long) symbol->flags);
1825 1.1 skrll break;
1826 1.1 skrll case bfd_print_symbol_all:
1827 1.1 skrll {
1828 1.1 skrll const char *section_name;
1829 1.1 skrll const char *name = NULL;
1830 1.1 skrll const struct elf_backend_data *bed;
1831 1.1 skrll unsigned char st_other;
1832 1.6 christos bfd_vma val;
1833 1.6 christos const char *version_string;
1834 1.1 skrll bfd_boolean hidden;
1835 1.1 skrll
1836 1.1 skrll section_name = symbol->section ? symbol->section->name : "(*none*)";
1837 1.1 skrll
1838 1.1 skrll bed = get_elf_backend_data (abfd);
1839 1.1 skrll if (bed->elf_backend_print_symbol_all)
1840 1.1 skrll name = (*bed->elf_backend_print_symbol_all) (abfd, filep, symbol);
1841 1.1 skrll
1842 1.1 skrll if (name == NULL)
1843 1.1 skrll {
1844 1.1 skrll name = symbol->name;
1845 1.1 skrll bfd_print_symbol_vandf (abfd, file, symbol);
1846 1.1 skrll }
1847 1.1 skrll
1848 1.1 skrll fprintf (file, " %s\t", section_name);
1849 1.1 skrll /* Print the "other" value for a symbol. For common symbols,
1850 1.1 skrll we've already printed the size; now print the alignment.
1851 1.1 skrll For other symbols, we have no specified alignment, and
1852 1.1 skrll we've printed the address; now print the size. */
1853 1.1 skrll if (symbol->section && bfd_is_com_section (symbol->section))
1854 1.1 skrll val = ((elf_symbol_type *) symbol)->internal_elf_sym.st_value;
1855 1.1 skrll else
1856 1.1 skrll val = ((elf_symbol_type *) symbol)->internal_elf_sym.st_size;
1857 1.1 skrll bfd_fprintf_vma (abfd, file, val);
1858 1.1 skrll
1859 1.6 christos /* If we have version information, print it. */
1860 1.6 christos version_string = _bfd_elf_get_symbol_version_string (abfd,
1861 1.6 christos symbol,
1862 1.6 christos &hidden);
1863 1.1 skrll if (version_string)
1864 1.6 christos {
1865 1.1 skrll if (!hidden)
1866 1.1 skrll fprintf (file, " %-11s", version_string);
1867 1.1 skrll else
1868 1.1 skrll {
1869 1.1 skrll int i;
1870 1.1 skrll
1871 1.1 skrll fprintf (file, " (%s)", version_string);
1872 1.1 skrll for (i = 10 - strlen (version_string); i > 0; --i)
1873 1.1 skrll putc (' ', file);
1874 1.1 skrll }
1875 1.1 skrll }
1876 1.1 skrll
1877 1.1 skrll /* If the st_other field is not zero, print it. */
1878 1.1 skrll st_other = ((elf_symbol_type *) symbol)->internal_elf_sym.st_other;
1879 1.1 skrll
1880 1.1 skrll switch (st_other)
1881 1.1 skrll {
1882 1.1 skrll case 0: break;
1883 1.1 skrll case STV_INTERNAL: fprintf (file, " .internal"); break;
1884 1.1 skrll case STV_HIDDEN: fprintf (file, " .hidden"); break;
1885 1.1 skrll case STV_PROTECTED: fprintf (file, " .protected"); break;
1886 1.1 skrll default:
1887 1.1 skrll /* Some other non-defined flags are also present, so print
1888 1.1 skrll everything hex. */
1889 1.1 skrll fprintf (file, " 0x%02x", (unsigned int) st_other);
1890 1.1 skrll }
1891 1.1 skrll
1892 1.1 skrll fprintf (file, " %s", name);
1893 1.1 skrll }
1894 1.1 skrll break;
1895 1.1 skrll }
1896 1.1 skrll }
1897 1.1 skrll
1898 1.1 skrll /* ELF .o/exec file reading */
1900 1.1 skrll
1901 1.1 skrll /* Create a new bfd section from an ELF section header. */
1902 1.1 skrll
1903 1.1 skrll bfd_boolean
1904 1.1 skrll bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
1905 1.1 skrll {
1906 1.1 skrll Elf_Internal_Shdr *hdr;
1907 1.1 skrll Elf_Internal_Ehdr *ehdr;
1908 1.6 christos const struct elf_backend_data *bed;
1909 1.6 christos const char *name;
1910 1.6 christos bfd_boolean ret = TRUE;
1911 1.6 christos static bfd_boolean * sections_being_created = NULL;
1912 1.1 skrll static bfd * sections_being_created_abfd = NULL;
1913 1.1 skrll static unsigned int nesting = 0;
1914 1.1 skrll
1915 1.1 skrll if (shindex >= elf_numsections (abfd))
1916 1.6 christos return FALSE;
1917 1.6 christos
1918 1.6 christos if (++ nesting > 3)
1919 1.6 christos {
1920 1.6 christos /* PR17512: A corrupt ELF binary might contain a recursive group of
1921 1.6 christos sections, with each the string indicies pointing to the next in the
1922 1.6 christos loop. Detect this here, by refusing to load a section that we are
1923 1.6 christos already in the process of loading. We only trigger this test if
1924 1.6 christos we have nested at least three sections deep as normal ELF binaries
1925 1.6 christos can expect to recurse at least once.
1926 1.6 christos
1927 1.6 christos FIXME: It would be better if this array was attached to the bfd,
1928 1.6 christos rather than being held in a static pointer. */
1929 1.6 christos
1930 1.6 christos if (sections_being_created_abfd != abfd)
1931 1.6 christos sections_being_created = NULL;
1932 1.6 christos if (sections_being_created == NULL)
1933 1.6 christos {
1934 1.6 christos /* FIXME: It would be more efficient to attach this array to the bfd somehow. */
1935 1.6 christos sections_being_created = (bfd_boolean *)
1936 1.6 christos bfd_zalloc (abfd, elf_numsections (abfd) * sizeof (bfd_boolean));
1937 1.6 christos sections_being_created_abfd = abfd;
1938 1.6 christos }
1939 1.6 christos if (sections_being_created [shindex])
1940 1.6 christos {
1941 1.6 christos (*_bfd_error_handler)
1942 1.6 christos (_("%B: warning: loop in section dependencies detected"), abfd);
1943 1.6 christos return FALSE;
1944 1.6 christos }
1945 1.6 christos sections_being_created [shindex] = TRUE;
1946 1.1 skrll }
1947 1.1 skrll
1948 1.1 skrll hdr = elf_elfsections (abfd)[shindex];
1949 1.1 skrll ehdr = elf_elfheader (abfd);
1950 1.1 skrll name = bfd_elf_string_from_elf_section (abfd, ehdr->e_shstrndx,
1951 1.6 christos hdr->sh_name);
1952 1.1 skrll if (name == NULL)
1953 1.1 skrll goto fail;
1954 1.1 skrll
1955 1.1 skrll bed = get_elf_backend_data (abfd);
1956 1.1 skrll switch (hdr->sh_type)
1957 1.1 skrll {
1958 1.6 christos case SHT_NULL:
1959 1.1 skrll /* Inactive section. Throw it away. */
1960 1.6 christos goto success;
1961 1.6 christos
1962 1.6 christos case SHT_PROGBITS: /* Normal section with contents. */
1963 1.6 christos case SHT_NOBITS: /* .bss section. */
1964 1.1 skrll case SHT_HASH: /* .hash section. */
1965 1.1 skrll case SHT_NOTE: /* .note section. */
1966 1.1 skrll case SHT_INIT_ARRAY: /* .init_array section. */
1967 1.1 skrll case SHT_FINI_ARRAY: /* .fini_array section. */
1968 1.1 skrll case SHT_PREINIT_ARRAY: /* .preinit_array section. */
1969 1.6 christos case SHT_GNU_LIBLIST: /* .gnu.liblist section. */
1970 1.6 christos case SHT_GNU_HASH: /* .gnu.hash section. */
1971 1.1 skrll ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
1972 1.1 skrll goto success;
1973 1.1 skrll
1974 1.6 christos case SHT_DYNAMIC: /* Dynamic linking information. */
1975 1.6 christos if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
1976 1.3 christos goto fail;
1977 1.3 christos
1978 1.3 christos if (hdr->sh_link > elf_numsections (abfd))
1979 1.3 christos {
1980 1.3 christos /* PR 10478: Accept Solaris binaries with a sh_link
1981 1.3 christos field set to SHN_BEFORE or SHN_AFTER. */
1982 1.3 christos switch (bfd_get_arch (abfd))
1983 1.3 christos {
1984 1.3 christos case bfd_arch_i386:
1985 1.3 christos case bfd_arch_sparc:
1986 1.3 christos if (hdr->sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
1987 1.3 christos || hdr->sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
1988 1.3 christos break;
1989 1.6 christos /* Otherwise fall through. */
1990 1.3 christos default:
1991 1.3 christos goto fail;
1992 1.3 christos }
1993 1.6 christos }
1994 1.3 christos else if (elf_elfsections (abfd)[hdr->sh_link] == NULL)
1995 1.1 skrll goto fail;
1996 1.1 skrll else if (elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_STRTAB)
1997 1.1 skrll {
1998 1.1 skrll Elf_Internal_Shdr *dynsymhdr;
1999 1.1 skrll
2000 1.1 skrll /* The shared libraries distributed with hpux11 have a bogus
2001 1.1 skrll sh_link field for the ".dynamic" section. Find the
2002 1.1 skrll string table for the ".dynsym" section instead. */
2003 1.1 skrll if (elf_dynsymtab (abfd) != 0)
2004 1.1 skrll {
2005 1.1 skrll dynsymhdr = elf_elfsections (abfd)[elf_dynsymtab (abfd)];
2006 1.1 skrll hdr->sh_link = dynsymhdr->sh_link;
2007 1.1 skrll }
2008 1.1 skrll else
2009 1.1 skrll {
2010 1.1 skrll unsigned int i, num_sec;
2011 1.1 skrll
2012 1.1 skrll num_sec = elf_numsections (abfd);
2013 1.1 skrll for (i = 1; i < num_sec; i++)
2014 1.1 skrll {
2015 1.1 skrll dynsymhdr = elf_elfsections (abfd)[i];
2016 1.1 skrll if (dynsymhdr->sh_type == SHT_DYNSYM)
2017 1.1 skrll {
2018 1.1 skrll hdr->sh_link = dynsymhdr->sh_link;
2019 1.1 skrll break;
2020 1.1 skrll }
2021 1.1 skrll }
2022 1.6 christos }
2023 1.1 skrll }
2024 1.6 christos goto success;
2025 1.1 skrll
2026 1.6 christos case SHT_SYMTAB: /* A symbol table. */
2027 1.1 skrll if (elf_onesymtab (abfd) == shindex)
2028 1.1 skrll goto success;
2029 1.6 christos
2030 1.6 christos if (hdr->sh_entsize != bed->s->sizeof_sym)
2031 1.2 skrll goto fail;
2032 1.5 christos
2033 1.5 christos if (hdr->sh_info * hdr->sh_entsize > hdr->sh_size)
2034 1.6 christos {
2035 1.5 christos if (hdr->sh_size != 0)
2036 1.5 christos goto fail;
2037 1.5 christos /* Some assemblers erroneously set sh_info to one with a
2038 1.5 christos zero sh_size. ld sees this as a global symbol count
2039 1.6 christos of (unsigned) -1. Fix it here. */
2040 1.6 christos hdr->sh_info = 0;
2041 1.6 christos goto success;
2042 1.6 christos }
2043 1.6 christos
2044 1.6 christos /* PR 18854: A binary might contain more than one symbol table.
2045 1.6 christos Unusual, but possible. Warn, but continue. */
2046 1.6 christos if (elf_onesymtab (abfd) != 0)
2047 1.6 christos {
2048 1.6 christos (*_bfd_error_handler)
2049 1.6 christos (_("%B: warning: multiple symbol tables detected - ignoring the table in section %u"),
2050 1.5 christos abfd, shindex);
2051 1.1 skrll goto success;
2052 1.6 christos }
2053 1.6 christos elf_onesymtab (abfd) = shindex;
2054 1.1 skrll elf_symtab_hdr (abfd) = *hdr;
2055 1.1 skrll elf_elfsections (abfd)[shindex] = hdr = & elf_symtab_hdr (abfd);
2056 1.1 skrll abfd->flags |= HAS_SYMS;
2057 1.1 skrll
2058 1.1 skrll /* Sometimes a shared object will map in the symbol table. If
2059 1.1 skrll SHF_ALLOC is set, and this is a shared object, then we also
2060 1.1 skrll treat this section as a BFD section. We can not base the
2061 1.1 skrll decision purely on SHF_ALLOC, because that flag is sometimes
2062 1.1 skrll set in a relocatable object file, which would confuse the
2063 1.1 skrll linker. */
2064 1.1 skrll if ((hdr->sh_flags & SHF_ALLOC) != 0
2065 1.1 skrll && (abfd->flags & DYNAMIC) != 0
2066 1.6 christos && ! _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2067 1.1 skrll shindex))
2068 1.1 skrll goto fail;
2069 1.1 skrll
2070 1.1 skrll /* Go looking for SHT_SYMTAB_SHNDX too, since if there is one we
2071 1.6 christos can't read symbols without that section loaded as well. It
2072 1.6 christos is most likely specified by the next section header. */
2073 1.6 christos {
2074 1.6 christos elf_section_list * entry;
2075 1.6 christos unsigned int i, num_sec;
2076 1.6 christos
2077 1.6 christos for (entry = elf_symtab_shndx_list (abfd); entry != NULL; entry = entry->next)
2078 1.6 christos if (entry->hdr.sh_link == shindex)
2079 1.6 christos goto success;
2080 1.6 christos
2081 1.6 christos num_sec = elf_numsections (abfd);
2082 1.6 christos for (i = shindex + 1; i < num_sec; i++)
2083 1.6 christos {
2084 1.6 christos Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
2085 1.6 christos
2086 1.6 christos if (hdr2->sh_type == SHT_SYMTAB_SHNDX
2087 1.6 christos && hdr2->sh_link == shindex)
2088 1.1 skrll break;
2089 1.6 christos }
2090 1.6 christos
2091 1.1 skrll if (i == num_sec)
2092 1.1 skrll for (i = 1; i < shindex; i++)
2093 1.6 christos {
2094 1.1 skrll Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
2095 1.1 skrll
2096 1.1 skrll if (hdr2->sh_type == SHT_SYMTAB_SHNDX
2097 1.1 skrll && hdr2->sh_link == shindex)
2098 1.1 skrll break;
2099 1.6 christos }
2100 1.6 christos
2101 1.6 christos if (i != shindex)
2102 1.6 christos ret = bfd_section_from_shdr (abfd, i);
2103 1.6 christos /* else FIXME: we have failed to find the symbol table - should we issue an error ? */
2104 1.6 christos goto success;
2105 1.6 christos }
2106 1.1 skrll
2107 1.6 christos case SHT_DYNSYM: /* A dynamic symbol table. */
2108 1.1 skrll if (elf_dynsymtab (abfd) == shindex)
2109 1.1 skrll goto success;
2110 1.6 christos
2111 1.6 christos if (hdr->sh_entsize != bed->s->sizeof_sym)
2112 1.5 christos goto fail;
2113 1.5 christos
2114 1.5 christos if (hdr->sh_info * hdr->sh_entsize > hdr->sh_size)
2115 1.6 christos {
2116 1.6 christos if (hdr->sh_size != 0)
2117 1.5 christos goto fail;
2118 1.5 christos
2119 1.5 christos /* Some linkers erroneously set sh_info to one with a
2120 1.5 christos zero sh_size. ld sees this as a global symbol count
2121 1.6 christos of (unsigned) -1. Fix it here. */
2122 1.6 christos hdr->sh_info = 0;
2123 1.6 christos goto success;
2124 1.6 christos }
2125 1.6 christos
2126 1.6 christos /* PR 18854: A binary might contain more than one dynamic symbol table.
2127 1.6 christos Unusual, but possible. Warn, but continue. */
2128 1.6 christos if (elf_dynsymtab (abfd) != 0)
2129 1.6 christos {
2130 1.6 christos (*_bfd_error_handler)
2131 1.6 christos (_("%B: warning: multiple dynamic symbol tables detected - ignoring the table in section %u"),
2132 1.5 christos abfd, shindex);
2133 1.1 skrll goto success;
2134 1.1 skrll }
2135 1.1 skrll elf_dynsymtab (abfd) = shindex;
2136 1.1 skrll elf_tdata (abfd)->dynsymtab_hdr = *hdr;
2137 1.1 skrll elf_elfsections (abfd)[shindex] = hdr = &elf_tdata (abfd)->dynsymtab_hdr;
2138 1.1 skrll abfd->flags |= HAS_SYMS;
2139 1.1 skrll
2140 1.6 christos /* Besides being a symbol table, we also treat this as a regular
2141 1.6 christos section, so that objcopy can handle it. */
2142 1.1 skrll ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2143 1.6 christos goto success;
2144 1.6 christos
2145 1.6 christos case SHT_SYMTAB_SHNDX: /* Symbol section indices when >64k sections. */
2146 1.1 skrll {
2147 1.6 christos elf_section_list * entry;
2148 1.6 christos
2149 1.6 christos for (entry = elf_symtab_shndx_list (abfd); entry != NULL; entry = entry->next)
2150 1.6 christos if (entry->ndx == shindex)
2151 1.6 christos goto success;
2152 1.6 christos
2153 1.6 christos entry = bfd_alloc (abfd, sizeof * entry);
2154 1.6 christos if (entry == NULL)
2155 1.6 christos goto fail;
2156 1.6 christos entry->ndx = shindex;
2157 1.6 christos entry->hdr = * hdr;
2158 1.6 christos entry->next = elf_symtab_shndx_list (abfd);
2159 1.6 christos elf_symtab_shndx_list (abfd) = entry;
2160 1.6 christos elf_elfsections (abfd)[shindex] = & entry->hdr;
2161 1.1 skrll goto success;
2162 1.6 christos }
2163 1.1 skrll
2164 1.6 christos case SHT_STRTAB: /* A string table. */
2165 1.6 christos if (hdr->bfd_section != NULL)
2166 1.1 skrll goto success;
2167 1.1 skrll
2168 1.1 skrll if (ehdr->e_shstrndx == shindex)
2169 1.1 skrll {
2170 1.6 christos elf_tdata (abfd)->shstrtab_hdr = *hdr;
2171 1.1 skrll elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->shstrtab_hdr;
2172 1.6 christos goto success;
2173 1.1 skrll }
2174 1.1 skrll
2175 1.1 skrll if (elf_elfsections (abfd)[elf_onesymtab (abfd)]->sh_link == shindex)
2176 1.1 skrll {
2177 1.1 skrll symtab_strtab:
2178 1.6 christos elf_tdata (abfd)->strtab_hdr = *hdr;
2179 1.1 skrll elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->strtab_hdr;
2180 1.6 christos goto success;
2181 1.1 skrll }
2182 1.1 skrll
2183 1.1 skrll if (elf_elfsections (abfd)[elf_dynsymtab (abfd)]->sh_link == shindex)
2184 1.1 skrll {
2185 1.1 skrll dynsymtab_strtab:
2186 1.1 skrll elf_tdata (abfd)->dynstrtab_hdr = *hdr;
2187 1.1 skrll hdr = &elf_tdata (abfd)->dynstrtab_hdr;
2188 1.1 skrll elf_elfsections (abfd)[shindex] = hdr;
2189 1.6 christos /* We also treat this as a regular section, so that objcopy
2190 1.6 christos can handle it. */
2191 1.6 christos ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2192 1.1 skrll shindex);
2193 1.1 skrll goto success;
2194 1.1 skrll }
2195 1.1 skrll
2196 1.1 skrll /* If the string table isn't one of the above, then treat it as a
2197 1.1 skrll regular section. We need to scan all the headers to be sure,
2198 1.1 skrll just in case this strtab section appeared before the above. */
2199 1.1 skrll if (elf_onesymtab (abfd) == 0 || elf_dynsymtab (abfd) == 0)
2200 1.1 skrll {
2201 1.1 skrll unsigned int i, num_sec;
2202 1.1 skrll
2203 1.1 skrll num_sec = elf_numsections (abfd);
2204 1.1 skrll for (i = 1; i < num_sec; i++)
2205 1.1 skrll {
2206 1.1 skrll Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
2207 1.1 skrll if (hdr2->sh_link == shindex)
2208 1.1 skrll {
2209 1.6 christos /* Prevent endless recursion on broken objects. */
2210 1.1 skrll if (i == shindex)
2211 1.6 christos goto fail;
2212 1.1 skrll if (! bfd_section_from_shdr (abfd, i))
2213 1.1 skrll goto fail;
2214 1.1 skrll if (elf_onesymtab (abfd) == i)
2215 1.1 skrll goto symtab_strtab;
2216 1.1 skrll if (elf_dynsymtab (abfd) == i)
2217 1.1 skrll goto dynsymtab_strtab;
2218 1.1 skrll }
2219 1.6 christos }
2220 1.6 christos }
2221 1.1 skrll ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2222 1.1 skrll goto success;
2223 1.1 skrll
2224 1.1 skrll case SHT_REL:
2225 1.1 skrll case SHT_RELA:
2226 1.1 skrll /* *These* do a lot of work -- but build no sections! */
2227 1.3 christos {
2228 1.1 skrll asection *target_sect;
2229 1.3 christos Elf_Internal_Shdr *hdr2, **p_hdr;
2230 1.1 skrll unsigned int num_sec = elf_numsections (abfd);
2231 1.1 skrll struct bfd_elf_section_data *esdt;
2232 1.1 skrll
2233 1.1 skrll if (hdr->sh_entsize
2234 1.6 christos != (bfd_size_type) (hdr->sh_type == SHT_REL
2235 1.1 skrll ? bed->s->sizeof_rel : bed->s->sizeof_rela))
2236 1.1 skrll goto fail;
2237 1.1 skrll
2238 1.1 skrll /* Check for a bogus link to avoid crashing. */
2239 1.1 skrll if (hdr->sh_link >= num_sec)
2240 1.1 skrll {
2241 1.1 skrll ((*_bfd_error_handler)
2242 1.6 christos (_("%B: invalid link %lu for reloc section %s (index %u)"),
2243 1.6 christos abfd, hdr->sh_link, name, shindex));
2244 1.6 christos ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2245 1.1 skrll shindex);
2246 1.1 skrll goto success;
2247 1.1 skrll }
2248 1.1 skrll
2249 1.1 skrll /* For some incomprehensible reason Oracle distributes
2250 1.1 skrll libraries for Solaris in which some of the objects have
2251 1.1 skrll bogus sh_link fields. It would be nice if we could just
2252 1.1 skrll reject them, but, unfortunately, some people need to use
2253 1.3 christos them. We scan through the section headers; if we find only
2254 1.3 christos one suitable symbol table, we clobber the sh_link to point
2255 1.3 christos to it. I hope this doesn't break anything.
2256 1.3 christos
2257 1.3 christos Don't do it on executable nor shared library. */
2258 1.1 skrll if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0
2259 1.1 skrll && elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_SYMTAB
2260 1.1 skrll && elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_DYNSYM)
2261 1.1 skrll {
2262 1.1 skrll unsigned int scan;
2263 1.1 skrll int found;
2264 1.1 skrll
2265 1.1 skrll found = 0;
2266 1.1 skrll for (scan = 1; scan < num_sec; scan++)
2267 1.1 skrll {
2268 1.1 skrll if (elf_elfsections (abfd)[scan]->sh_type == SHT_SYMTAB
2269 1.1 skrll || elf_elfsections (abfd)[scan]->sh_type == SHT_DYNSYM)
2270 1.1 skrll {
2271 1.1 skrll if (found != 0)
2272 1.1 skrll {
2273 1.1 skrll found = 0;
2274 1.1 skrll break;
2275 1.1 skrll }
2276 1.1 skrll found = scan;
2277 1.1 skrll }
2278 1.1 skrll }
2279 1.1 skrll if (found != 0)
2280 1.1 skrll hdr->sh_link = found;
2281 1.1 skrll }
2282 1.1 skrll
2283 1.1 skrll /* Get the symbol table. */
2284 1.1 skrll if ((elf_elfsections (abfd)[hdr->sh_link]->sh_type == SHT_SYMTAB
2285 1.6 christos || elf_elfsections (abfd)[hdr->sh_link]->sh_type == SHT_DYNSYM)
2286 1.1 skrll && ! bfd_section_from_shdr (abfd, hdr->sh_link))
2287 1.1 skrll goto fail;
2288 1.1 skrll
2289 1.1 skrll /* If this reloc section does not use the main symbol table we
2290 1.1 skrll don't treat it as a reloc section. BFD can't adequately
2291 1.1 skrll represent such a section, so at least for now, we don't
2292 1.3 christos try. We just present it as a normal section. We also
2293 1.3 christos can't use it as a reloc section if it points to the null
2294 1.1 skrll section, an invalid section, another reloc section, or its
2295 1.3 christos sh_link points to the null section. */
2296 1.1 skrll if (hdr->sh_link != elf_onesymtab (abfd)
2297 1.1 skrll || hdr->sh_link == SHN_UNDEF
2298 1.1 skrll || hdr->sh_info == SHN_UNDEF
2299 1.1 skrll || hdr->sh_info >= num_sec
2300 1.6 christos || elf_elfsections (abfd)[hdr->sh_info]->sh_type == SHT_REL
2301 1.6 christos || elf_elfsections (abfd)[hdr->sh_info]->sh_type == SHT_RELA)
2302 1.6 christos {
2303 1.6 christos ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2304 1.6 christos shindex);
2305 1.1 skrll goto success;
2306 1.1 skrll }
2307 1.6 christos
2308 1.6 christos if (! bfd_section_from_shdr (abfd, hdr->sh_info))
2309 1.1 skrll goto fail;
2310 1.1 skrll
2311 1.6 christos target_sect = bfd_section_from_elf_index (abfd, hdr->sh_info);
2312 1.1 skrll if (target_sect == NULL)
2313 1.3 christos goto fail;
2314 1.3 christos
2315 1.3 christos esdt = elf_section_data (target_sect);
2316 1.1 skrll if (hdr->sh_type == SHT_RELA)
2317 1.3 christos p_hdr = &esdt->rela.hdr;
2318 1.3 christos else
2319 1.6 christos p_hdr = &esdt->rel.hdr;
2320 1.6 christos
2321 1.6 christos /* PR 17512: file: 0b4f81b7. */
2322 1.6.2.1 pgoyette if (*p_hdr != NULL)
2323 1.3 christos goto fail;
2324 1.6 christos hdr2 = (Elf_Internal_Shdr *) bfd_alloc (abfd, sizeof (*hdr2));
2325 1.1 skrll if (hdr2 == NULL)
2326 1.3 christos goto fail;
2327 1.1 skrll *hdr2 = *hdr;
2328 1.1 skrll *p_hdr = hdr2;
2329 1.1 skrll elf_elfsections (abfd)[shindex] = hdr2;
2330 1.1 skrll target_sect->reloc_count += NUM_SHDR_ENTRIES (hdr);
2331 1.1 skrll target_sect->flags |= SEC_RELOC;
2332 1.1 skrll target_sect->relocation = NULL;
2333 1.1 skrll target_sect->rel_filepos = hdr->sh_offset;
2334 1.1 skrll /* In the section to which the relocations apply, mark whether
2335 1.3 christos its relocations are of the REL or RELA variety. */
2336 1.3 christos if (hdr->sh_size != 0)
2337 1.3 christos {
2338 1.3 christos if (hdr->sh_type == SHT_RELA)
2339 1.1 skrll target_sect->use_rela_p = 1;
2340 1.6 christos }
2341 1.1 skrll abfd->flags |= HAS_RELOC;
2342 1.1 skrll goto success;
2343 1.1 skrll }
2344 1.1 skrll
2345 1.1 skrll case SHT_GNU_verdef:
2346 1.6 christos elf_dynverdef (abfd) = shindex;
2347 1.6 christos elf_tdata (abfd)->dynverdef_hdr = *hdr;
2348 1.1 skrll ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2349 1.1 skrll goto success;
2350 1.1 skrll
2351 1.6 christos case SHT_GNU_versym:
2352 1.6 christos if (hdr->sh_entsize != sizeof (Elf_External_Versym))
2353 1.1 skrll goto fail;
2354 1.1 skrll
2355 1.6 christos elf_dynversym (abfd) = shindex;
2356 1.6 christos elf_tdata (abfd)->dynversym_hdr = *hdr;
2357 1.1 skrll ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2358 1.1 skrll goto success;
2359 1.1 skrll
2360 1.1 skrll case SHT_GNU_verneed:
2361 1.6 christos elf_dynverref (abfd) = shindex;
2362 1.6 christos elf_tdata (abfd)->dynverref_hdr = *hdr;
2363 1.1 skrll ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2364 1.1 skrll goto success;
2365 1.6 christos
2366 1.1 skrll case SHT_SHLIB:
2367 1.1 skrll goto success;
2368 1.6 christos
2369 1.6 christos case SHT_GROUP:
2370 1.6 christos if (! IS_VALID_GROUP_SECTION_HEADER (hdr, GRP_ENTRY_SIZE))
2371 1.1 skrll goto fail;
2372 1.6 christos
2373 1.6 christos if (!_bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
2374 1.1 skrll goto fail;
2375 1.1 skrll
2376 1.1 skrll if (hdr->contents != NULL)
2377 1.6 christos {
2378 1.1 skrll Elf_Internal_Group *idx = (Elf_Internal_Group *) hdr->contents;
2379 1.1 skrll unsigned int n_elt = hdr->sh_size / sizeof (* idx);
2380 1.6 christos asection *s;
2381 1.6 christos
2382 1.1 skrll if (n_elt == 0)
2383 1.1 skrll goto fail;
2384 1.1 skrll if (idx->flags & GRP_COMDAT)
2385 1.1 skrll hdr->bfd_section->flags
2386 1.1 skrll |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
2387 1.1 skrll
2388 1.6 christos /* We try to keep the same section order as it comes in. */
2389 1.1 skrll idx += n_elt;
2390 1.1 skrll
2391 1.1 skrll while (--n_elt != 0)
2392 1.1 skrll {
2393 1.1 skrll --idx;
2394 1.1 skrll
2395 1.1 skrll if (idx->shdr != NULL
2396 1.1 skrll && (s = idx->shdr->bfd_section) != NULL
2397 1.1 skrll && elf_next_in_group (s) != NULL)
2398 1.1 skrll {
2399 1.1 skrll elf_next_in_group (hdr->bfd_section) = s;
2400 1.1 skrll break;
2401 1.1 skrll }
2402 1.6 christos }
2403 1.1 skrll }
2404 1.1 skrll goto success;
2405 1.1 skrll
2406 1.1 skrll default:
2407 1.1 skrll /* Possibly an attributes section. */
2408 1.1 skrll if (hdr->sh_type == SHT_GNU_ATTRIBUTES
2409 1.1 skrll || hdr->sh_type == bed->obj_attrs_section_type)
2410 1.6 christos {
2411 1.1 skrll if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
2412 1.6 christos goto fail;
2413 1.1 skrll _bfd_elf_parse_attributes (abfd, hdr);
2414 1.1 skrll goto success;
2415 1.1 skrll }
2416 1.1 skrll
2417 1.6 christos /* Check for any processor-specific section types. */
2418 1.1 skrll if (bed->elf_backend_section_from_shdr (abfd, hdr, name, shindex))
2419 1.1 skrll goto success;
2420 1.1 skrll
2421 1.1 skrll if (hdr->sh_type >= SHT_LOUSER && hdr->sh_type <= SHT_HIUSER)
2422 1.1 skrll {
2423 1.1 skrll if ((hdr->sh_flags & SHF_ALLOC) != 0)
2424 1.1 skrll /* FIXME: How to properly handle allocated section reserved
2425 1.1 skrll for applications? */
2426 1.1 skrll (*_bfd_error_handler)
2427 1.1 skrll (_("%B: don't know how to handle allocated, application "
2428 1.1 skrll "specific section `%s' [0x%8x]"),
2429 1.6 christos abfd, name, hdr->sh_type);
2430 1.6 christos else
2431 1.6 christos {
2432 1.6 christos /* Allow sections reserved for applications. */
2433 1.6 christos ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
2434 1.6 christos shindex);
2435 1.1 skrll goto success;
2436 1.1 skrll }
2437 1.1 skrll }
2438 1.1 skrll else if (hdr->sh_type >= SHT_LOPROC
2439 1.1 skrll && hdr->sh_type <= SHT_HIPROC)
2440 1.1 skrll /* FIXME: We should handle this section. */
2441 1.1 skrll (*_bfd_error_handler)
2442 1.1 skrll (_("%B: don't know how to handle processor specific section "
2443 1.1 skrll "`%s' [0x%8x]"),
2444 1.1 skrll abfd, name, hdr->sh_type);
2445 1.1 skrll else if (hdr->sh_type >= SHT_LOOS && hdr->sh_type <= SHT_HIOS)
2446 1.1 skrll {
2447 1.1 skrll /* Unrecognised OS-specific sections. */
2448 1.1 skrll if ((hdr->sh_flags & SHF_OS_NONCONFORMING) != 0)
2449 1.1 skrll /* SHF_OS_NONCONFORMING indicates that special knowledge is
2450 1.1 skrll required to correctly process the section and the file should
2451 1.1 skrll be rejected with an error message. */
2452 1.1 skrll (*_bfd_error_handler)
2453 1.1 skrll (_("%B: don't know how to handle OS specific section "
2454 1.1 skrll "`%s' [0x%8x]"),
2455 1.6 christos abfd, name, hdr->sh_type);
2456 1.6 christos else
2457 1.6 christos {
2458 1.6 christos /* Otherwise it should be processed. */
2459 1.6 christos ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2460 1.1 skrll goto success;
2461 1.1 skrll }
2462 1.1 skrll }
2463 1.1 skrll else
2464 1.1 skrll /* FIXME: We should handle this section. */
2465 1.1 skrll (*_bfd_error_handler)
2466 1.1 skrll (_("%B: don't know how to handle section `%s' [0x%8x]"),
2467 1.6 christos abfd, name, hdr->sh_type);
2468 1.1 skrll
2469 1.1 skrll goto fail;
2470 1.6 christos }
2471 1.6 christos
2472 1.6 christos fail:
2473 1.6 christos ret = FALSE;
2474 1.6 christos success:
2475 1.6 christos if (sections_being_created && sections_being_created_abfd == abfd)
2476 1.6 christos sections_being_created [shindex] = FALSE;
2477 1.6 christos if (-- nesting == 0)
2478 1.6 christos {
2479 1.6 christos sections_being_created = NULL;
2480 1.6 christos sections_being_created_abfd = abfd;
2481 1.1 skrll }
2482 1.1 skrll return ret;
2483 1.3 christos }
2484 1.1 skrll
2485 1.3 christos /* Return the local symbol specified by ABFD, R_SYMNDX. */
2486 1.3 christos
2487 1.3 christos Elf_Internal_Sym *
2488 1.3 christos bfd_sym_from_r_symndx (struct sym_cache *cache,
2489 1.1 skrll bfd *abfd,
2490 1.1 skrll unsigned long r_symndx)
2491 1.1 skrll {
2492 1.1 skrll unsigned int ent = r_symndx % LOCAL_SYM_CACHE_SIZE;
2493 1.1 skrll
2494 1.1 skrll if (cache->abfd != abfd || cache->indx[ent] != r_symndx)
2495 1.1 skrll {
2496 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
2497 1.1 skrll unsigned char esym[sizeof (Elf64_External_Sym)];
2498 1.1 skrll Elf_External_Sym_Shndx eshndx;
2499 1.1 skrll
2500 1.3 christos symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2501 1.1 skrll if (bfd_elf_get_elf_syms (abfd, symtab_hdr, 1, r_symndx,
2502 1.1 skrll &cache->sym[ent], esym, &eshndx) == NULL)
2503 1.1 skrll return NULL;
2504 1.1 skrll
2505 1.1 skrll if (cache->abfd != abfd)
2506 1.1 skrll {
2507 1.1 skrll memset (cache->indx, -1, sizeof (cache->indx));
2508 1.1 skrll cache->abfd = abfd;
2509 1.1 skrll }
2510 1.1 skrll cache->indx[ent] = r_symndx;
2511 1.3 christos }
2512 1.1 skrll
2513 1.1 skrll return &cache->sym[ent];
2514 1.1 skrll }
2515 1.1 skrll
2516 1.1 skrll /* Given an ELF section number, retrieve the corresponding BFD
2517 1.1 skrll section. */
2518 1.3 christos
2519 1.1 skrll asection *
2520 1.3 christos bfd_section_from_elf_index (bfd *abfd, unsigned int sec_index)
2521 1.1 skrll {
2522 1.3 christos if (sec_index >= elf_numsections (abfd))
2523 1.1 skrll return NULL;
2524 1.1 skrll return elf_elfsections (abfd)[sec_index]->bfd_section;
2525 1.1 skrll }
2526 1.1 skrll
2527 1.1 skrll static const struct bfd_elf_special_section special_sections_b[] =
2528 1.1 skrll {
2529 1.1 skrll { STRING_COMMA_LEN (".bss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2530 1.1 skrll { NULL, 0, 0, 0, 0 }
2531 1.1 skrll };
2532 1.1 skrll
2533 1.1 skrll static const struct bfd_elf_special_section special_sections_c[] =
2534 1.1 skrll {
2535 1.1 skrll { STRING_COMMA_LEN (".comment"), 0, SHT_PROGBITS, 0 },
2536 1.1 skrll { NULL, 0, 0, 0, 0 }
2537 1.1 skrll };
2538 1.1 skrll
2539 1.1 skrll static const struct bfd_elf_special_section special_sections_d[] =
2540 1.1 skrll {
2541 1.6 christos { STRING_COMMA_LEN (".data"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2542 1.6 christos { STRING_COMMA_LEN (".data1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2543 1.6 christos /* There are more DWARF sections than these, but they needn't be added here
2544 1.1 skrll unless you have to cope with broken compilers that don't emit section
2545 1.1 skrll attributes or you want to help the user writing assembler. */
2546 1.1 skrll { STRING_COMMA_LEN (".debug"), 0, SHT_PROGBITS, 0 },
2547 1.1 skrll { STRING_COMMA_LEN (".debug_line"), 0, SHT_PROGBITS, 0 },
2548 1.1 skrll { STRING_COMMA_LEN (".debug_info"), 0, SHT_PROGBITS, 0 },
2549 1.1 skrll { STRING_COMMA_LEN (".debug_abbrev"), 0, SHT_PROGBITS, 0 },
2550 1.1 skrll { STRING_COMMA_LEN (".debug_aranges"), 0, SHT_PROGBITS, 0 },
2551 1.1 skrll { STRING_COMMA_LEN (".dynamic"), 0, SHT_DYNAMIC, SHF_ALLOC },
2552 1.1 skrll { STRING_COMMA_LEN (".dynstr"), 0, SHT_STRTAB, SHF_ALLOC },
2553 1.1 skrll { STRING_COMMA_LEN (".dynsym"), 0, SHT_DYNSYM, SHF_ALLOC },
2554 1.1 skrll { NULL, 0, 0, 0, 0 }
2555 1.1 skrll };
2556 1.1 skrll
2557 1.1 skrll static const struct bfd_elf_special_section special_sections_f[] =
2558 1.1 skrll {
2559 1.1 skrll { STRING_COMMA_LEN (".fini"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2560 1.1 skrll { STRING_COMMA_LEN (".fini_array"), 0, SHT_FINI_ARRAY, SHF_ALLOC + SHF_WRITE },
2561 1.1 skrll { NULL, 0, 0, 0, 0 }
2562 1.1 skrll };
2563 1.1 skrll
2564 1.1 skrll static const struct bfd_elf_special_section special_sections_g[] =
2565 1.3 christos {
2566 1.1 skrll { STRING_COMMA_LEN (".gnu.linkonce.b"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2567 1.1 skrll { STRING_COMMA_LEN (".gnu.lto_"), -1, SHT_PROGBITS, SHF_EXCLUDE },
2568 1.1 skrll { STRING_COMMA_LEN (".got"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2569 1.1 skrll { STRING_COMMA_LEN (".gnu.version"), 0, SHT_GNU_versym, 0 },
2570 1.1 skrll { STRING_COMMA_LEN (".gnu.version_d"), 0, SHT_GNU_verdef, 0 },
2571 1.1 skrll { STRING_COMMA_LEN (".gnu.version_r"), 0, SHT_GNU_verneed, 0 },
2572 1.1 skrll { STRING_COMMA_LEN (".gnu.liblist"), 0, SHT_GNU_LIBLIST, SHF_ALLOC },
2573 1.1 skrll { STRING_COMMA_LEN (".gnu.conflict"), 0, SHT_RELA, SHF_ALLOC },
2574 1.1 skrll { STRING_COMMA_LEN (".gnu.hash"), 0, SHT_GNU_HASH, SHF_ALLOC },
2575 1.1 skrll { NULL, 0, 0, 0, 0 }
2576 1.1 skrll };
2577 1.1 skrll
2578 1.1 skrll static const struct bfd_elf_special_section special_sections_h[] =
2579 1.1 skrll {
2580 1.1 skrll { STRING_COMMA_LEN (".hash"), 0, SHT_HASH, SHF_ALLOC },
2581 1.1 skrll { NULL, 0, 0, 0, 0 }
2582 1.1 skrll };
2583 1.1 skrll
2584 1.1 skrll static const struct bfd_elf_special_section special_sections_i[] =
2585 1.1 skrll {
2586 1.1 skrll { STRING_COMMA_LEN (".init"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2587 1.1 skrll { STRING_COMMA_LEN (".init_array"), 0, SHT_INIT_ARRAY, SHF_ALLOC + SHF_WRITE },
2588 1.1 skrll { STRING_COMMA_LEN (".interp"), 0, SHT_PROGBITS, 0 },
2589 1.1 skrll { NULL, 0, 0, 0, 0 }
2590 1.1 skrll };
2591 1.1 skrll
2592 1.1 skrll static const struct bfd_elf_special_section special_sections_l[] =
2593 1.1 skrll {
2594 1.1 skrll { STRING_COMMA_LEN (".line"), 0, SHT_PROGBITS, 0 },
2595 1.1 skrll { NULL, 0, 0, 0, 0 }
2596 1.1 skrll };
2597 1.1 skrll
2598 1.1 skrll static const struct bfd_elf_special_section special_sections_n[] =
2599 1.1 skrll {
2600 1.1 skrll { STRING_COMMA_LEN (".note.GNU-stack"), 0, SHT_PROGBITS, 0 },
2601 1.1 skrll { STRING_COMMA_LEN (".note"), -1, SHT_NOTE, 0 },
2602 1.1 skrll { NULL, 0, 0, 0, 0 }
2603 1.1 skrll };
2604 1.1 skrll
2605 1.1 skrll static const struct bfd_elf_special_section special_sections_p[] =
2606 1.1 skrll {
2607 1.1 skrll { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_WRITE },
2608 1.1 skrll { STRING_COMMA_LEN (".plt"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2609 1.1 skrll { NULL, 0, 0, 0, 0 }
2610 1.1 skrll };
2611 1.1 skrll
2612 1.1 skrll static const struct bfd_elf_special_section special_sections_r[] =
2613 1.1 skrll {
2614 1.1 skrll { STRING_COMMA_LEN (".rodata"), -2, SHT_PROGBITS, SHF_ALLOC },
2615 1.1 skrll { STRING_COMMA_LEN (".rodata1"), 0, SHT_PROGBITS, SHF_ALLOC },
2616 1.1 skrll { STRING_COMMA_LEN (".rela"), -1, SHT_RELA, 0 },
2617 1.1 skrll { STRING_COMMA_LEN (".rel"), -1, SHT_REL, 0 },
2618 1.1 skrll { NULL, 0, 0, 0, 0 }
2619 1.1 skrll };
2620 1.1 skrll
2621 1.1 skrll static const struct bfd_elf_special_section special_sections_s[] =
2622 1.1 skrll {
2623 1.1 skrll { STRING_COMMA_LEN (".shstrtab"), 0, SHT_STRTAB, 0 },
2624 1.1 skrll { STRING_COMMA_LEN (".strtab"), 0, SHT_STRTAB, 0 },
2625 1.1 skrll { STRING_COMMA_LEN (".symtab"), 0, SHT_SYMTAB, 0 },
2626 1.1 skrll /* See struct bfd_elf_special_section declaration for the semantics of
2627 1.1 skrll this special case where .prefix_length != strlen (.prefix). */
2628 1.1 skrll { ".stabstr", 5, 3, SHT_STRTAB, 0 },
2629 1.1 skrll { NULL, 0, 0, 0, 0 }
2630 1.1 skrll };
2631 1.1 skrll
2632 1.1 skrll static const struct bfd_elf_special_section special_sections_t[] =
2633 1.1 skrll {
2634 1.1 skrll { STRING_COMMA_LEN (".text"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2635 1.1 skrll { STRING_COMMA_LEN (".tbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
2636 1.1 skrll { STRING_COMMA_LEN (".tdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
2637 1.1 skrll { NULL, 0, 0, 0, 0 }
2638 1.1 skrll };
2639 1.1 skrll
2640 1.1 skrll static const struct bfd_elf_special_section special_sections_z[] =
2641 1.1 skrll {
2642 1.1 skrll { STRING_COMMA_LEN (".zdebug_line"), 0, SHT_PROGBITS, 0 },
2643 1.1 skrll { STRING_COMMA_LEN (".zdebug_info"), 0, SHT_PROGBITS, 0 },
2644 1.1 skrll { STRING_COMMA_LEN (".zdebug_abbrev"), 0, SHT_PROGBITS, 0 },
2645 1.1 skrll { STRING_COMMA_LEN (".zdebug_aranges"), 0, SHT_PROGBITS, 0 },
2646 1.1 skrll { NULL, 0, 0, 0, 0 }
2647 1.5 christos };
2648 1.1 skrll
2649 1.1 skrll static const struct bfd_elf_special_section * const special_sections[] =
2650 1.1 skrll {
2651 1.1 skrll special_sections_b, /* 'b' */
2652 1.1 skrll special_sections_c, /* 'c' */
2653 1.1 skrll special_sections_d, /* 'd' */
2654 1.1 skrll NULL, /* 'e' */
2655 1.1 skrll special_sections_f, /* 'f' */
2656 1.1 skrll special_sections_g, /* 'g' */
2657 1.1 skrll special_sections_h, /* 'h' */
2658 1.1 skrll special_sections_i, /* 'i' */
2659 1.1 skrll NULL, /* 'j' */
2660 1.1 skrll NULL, /* 'k' */
2661 1.1 skrll special_sections_l, /* 'l' */
2662 1.1 skrll NULL, /* 'm' */
2663 1.1 skrll special_sections_n, /* 'n' */
2664 1.1 skrll NULL, /* 'o' */
2665 1.1 skrll special_sections_p, /* 'p' */
2666 1.1 skrll NULL, /* 'q' */
2667 1.1 skrll special_sections_r, /* 'r' */
2668 1.1 skrll special_sections_s, /* 's' */
2669 1.1 skrll special_sections_t, /* 't' */
2670 1.1 skrll NULL, /* 'u' */
2671 1.1 skrll NULL, /* 'v' */
2672 1.1 skrll NULL, /* 'w' */
2673 1.1 skrll NULL, /* 'x' */
2674 1.1 skrll NULL, /* 'y' */
2675 1.1 skrll special_sections_z /* 'z' */
2676 1.1 skrll };
2677 1.1 skrll
2678 1.1 skrll const struct bfd_elf_special_section *
2679 1.1 skrll _bfd_elf_get_special_section (const char *name,
2680 1.1 skrll const struct bfd_elf_special_section *spec,
2681 1.1 skrll unsigned int rela)
2682 1.1 skrll {
2683 1.1 skrll int i;
2684 1.1 skrll int len;
2685 1.1 skrll
2686 1.1 skrll len = strlen (name);
2687 1.1 skrll
2688 1.1 skrll for (i = 0; spec[i].prefix != NULL; i++)
2689 1.1 skrll {
2690 1.1 skrll int suffix_len;
2691 1.1 skrll int prefix_len = spec[i].prefix_length;
2692 1.1 skrll
2693 1.1 skrll if (len < prefix_len)
2694 1.1 skrll continue;
2695 1.1 skrll if (memcmp (name, spec[i].prefix, prefix_len) != 0)
2696 1.1 skrll continue;
2697 1.1 skrll
2698 1.1 skrll suffix_len = spec[i].suffix_length;
2699 1.1 skrll if (suffix_len <= 0)
2700 1.1 skrll {
2701 1.1 skrll if (name[prefix_len] != 0)
2702 1.1 skrll {
2703 1.1 skrll if (suffix_len == 0)
2704 1.1 skrll continue;
2705 1.1 skrll if (name[prefix_len] != '.'
2706 1.1 skrll && (suffix_len == -2
2707 1.1 skrll || (rela && spec[i].type == SHT_REL)))
2708 1.1 skrll continue;
2709 1.1 skrll }
2710 1.1 skrll }
2711 1.1 skrll else
2712 1.1 skrll {
2713 1.1 skrll if (len < prefix_len + suffix_len)
2714 1.1 skrll continue;
2715 1.1 skrll if (memcmp (name + len - suffix_len,
2716 1.1 skrll spec[i].prefix + prefix_len,
2717 1.1 skrll suffix_len) != 0)
2718 1.1 skrll continue;
2719 1.1 skrll }
2720 1.1 skrll return &spec[i];
2721 1.1 skrll }
2722 1.1 skrll
2723 1.1 skrll return NULL;
2724 1.1 skrll }
2725 1.1 skrll
2726 1.1 skrll const struct bfd_elf_special_section *
2727 1.1 skrll _bfd_elf_get_sec_type_attr (bfd *abfd, asection *sec)
2728 1.1 skrll {
2729 1.1 skrll int i;
2730 1.1 skrll const struct bfd_elf_special_section *spec;
2731 1.1 skrll const struct elf_backend_data *bed;
2732 1.1 skrll
2733 1.1 skrll /* See if this is one of the special sections. */
2734 1.1 skrll if (sec->name == NULL)
2735 1.1 skrll return NULL;
2736 1.1 skrll
2737 1.1 skrll bed = get_elf_backend_data (abfd);
2738 1.1 skrll spec = bed->special_sections;
2739 1.1 skrll if (spec)
2740 1.1 skrll {
2741 1.1 skrll spec = _bfd_elf_get_special_section (sec->name,
2742 1.1 skrll bed->special_sections,
2743 1.1 skrll sec->use_rela_p);
2744 1.1 skrll if (spec != NULL)
2745 1.1 skrll return spec;
2746 1.1 skrll }
2747 1.1 skrll
2748 1.1 skrll if (sec->name[0] != '.')
2749 1.1 skrll return NULL;
2750 1.1 skrll
2751 1.1 skrll i = sec->name[1] - 'b';
2752 1.1 skrll if (i < 0 || i > 'z' - 'b')
2753 1.1 skrll return NULL;
2754 1.1 skrll
2755 1.1 skrll spec = special_sections[i];
2756 1.1 skrll
2757 1.1 skrll if (spec == NULL)
2758 1.1 skrll return NULL;
2759 1.1 skrll
2760 1.1 skrll return _bfd_elf_get_special_section (sec->name, spec, sec->use_rela_p);
2761 1.1 skrll }
2762 1.1 skrll
2763 1.1 skrll bfd_boolean
2764 1.1 skrll _bfd_elf_new_section_hook (bfd *abfd, asection *sec)
2765 1.1 skrll {
2766 1.1 skrll struct bfd_elf_section_data *sdata;
2767 1.1 skrll const struct elf_backend_data *bed;
2768 1.1 skrll const struct bfd_elf_special_section *ssect;
2769 1.1 skrll
2770 1.1 skrll sdata = (struct bfd_elf_section_data *) sec->used_by_bfd;
2771 1.3 christos if (sdata == NULL)
2772 1.3 christos {
2773 1.1 skrll sdata = (struct bfd_elf_section_data *) bfd_zalloc (abfd,
2774 1.1 skrll sizeof (*sdata));
2775 1.1 skrll if (sdata == NULL)
2776 1.1 skrll return FALSE;
2777 1.1 skrll sec->used_by_bfd = sdata;
2778 1.1 skrll }
2779 1.1 skrll
2780 1.1 skrll /* Indicate whether or not this section should use RELA relocations. */
2781 1.1 skrll bed = get_elf_backend_data (abfd);
2782 1.1 skrll sec->use_rela_p = bed->default_use_rela_p;
2783 1.1 skrll
2784 1.1 skrll /* When we read a file, we don't need to set ELF section type and
2785 1.1 skrll flags. They will be overridden in _bfd_elf_make_section_from_shdr
2786 1.1 skrll anyway. We will set ELF section type and flags for all linker
2787 1.5 christos created sections. If user specifies BFD section flags, we will
2788 1.5 christos set ELF section type and flags based on BFD section flags in
2789 1.5 christos elf_fake_sections. Special handling for .init_array/.fini_array
2790 1.5 christos output sections since they may contain .ctors/.dtors input
2791 1.5 christos sections. We don't want _bfd_elf_init_private_section_data to
2792 1.1 skrll copy ELF section type from .ctors/.dtors input sections. */
2793 1.1 skrll if (abfd->direction != read_direction
2794 1.1 skrll || (sec->flags & SEC_LINKER_CREATED) != 0)
2795 1.5 christos {
2796 1.5 christos ssect = (*bed->get_sec_type_attr) (abfd, sec);
2797 1.5 christos if (ssect != NULL
2798 1.5 christos && (!sec->flags
2799 1.5 christos || (sec->flags & SEC_LINKER_CREATED) != 0
2800 1.1 skrll || ssect->type == SHT_INIT_ARRAY
2801 1.1 skrll || ssect->type == SHT_FINI_ARRAY))
2802 1.1 skrll {
2803 1.1 skrll elf_section_type (sec) = ssect->type;
2804 1.1 skrll elf_section_flags (sec) = ssect->attr;
2805 1.1 skrll }
2806 1.1 skrll }
2807 1.1 skrll
2808 1.1 skrll return _bfd_generic_new_section_hook (abfd, sec);
2809 1.1 skrll }
2810 1.1 skrll
2811 1.1 skrll /* Create a new bfd section from an ELF program header.
2812 1.1 skrll
2813 1.1 skrll Since program segments have no names, we generate a synthetic name
2814 1.1 skrll of the form segment<NUM>, where NUM is generally the index in the
2815 1.1 skrll program header table. For segments that are split (see below) we
2816 1.1 skrll generate the names segment<NUM>a and segment<NUM>b.
2817 1.1 skrll
2818 1.1 skrll Note that some program segments may have a file size that is different than
2819 1.1 skrll (less than) the memory size. All this means is that at execution the
2820 1.1 skrll system must allocate the amount of memory specified by the memory size,
2821 1.1 skrll but only initialize it with the first "file size" bytes read from the
2822 1.1 skrll file. This would occur for example, with program segments consisting
2823 1.1 skrll of combined data+bss.
2824 1.1 skrll
2825 1.1 skrll To handle the above situation, this routine generates TWO bfd sections
2826 1.1 skrll for the single program segment. The first has the length specified by
2827 1.1 skrll the file size of the segment, and the second has the length specified
2828 1.1 skrll by the difference between the two sizes. In effect, the segment is split
2829 1.1 skrll into its initialized and uninitialized parts.
2830 1.1 skrll
2831 1.1 skrll */
2832 1.1 skrll
2833 1.1 skrll bfd_boolean
2834 1.3 christos _bfd_elf_make_section_from_phdr (bfd *abfd,
2835 1.3 christos Elf_Internal_Phdr *hdr,
2836 1.1 skrll int hdr_index,
2837 1.1 skrll const char *type_name)
2838 1.1 skrll {
2839 1.1 skrll asection *newsect;
2840 1.1 skrll char *name;
2841 1.1 skrll char namebuf[64];
2842 1.1 skrll size_t len;
2843 1.1 skrll int split;
2844 1.1 skrll
2845 1.1 skrll split = ((hdr->p_memsz > 0)
2846 1.1 skrll && (hdr->p_filesz > 0)
2847 1.1 skrll && (hdr->p_memsz > hdr->p_filesz));
2848 1.1 skrll
2849 1.3 christos if (hdr->p_filesz > 0)
2850 1.1 skrll {
2851 1.3 christos sprintf (namebuf, "%s%d%s", type_name, hdr_index, split ? "a" : "");
2852 1.1 skrll len = strlen (namebuf) + 1;
2853 1.1 skrll name = (char *) bfd_alloc (abfd, len);
2854 1.1 skrll if (!name)
2855 1.1 skrll return FALSE;
2856 1.1 skrll memcpy (name, namebuf, len);
2857 1.1 skrll newsect = bfd_make_section (abfd, name);
2858 1.1 skrll if (newsect == NULL)
2859 1.1 skrll return FALSE;
2860 1.1 skrll newsect->vma = hdr->p_vaddr;
2861 1.1 skrll newsect->lma = hdr->p_paddr;
2862 1.1 skrll newsect->size = hdr->p_filesz;
2863 1.1 skrll newsect->filepos = hdr->p_offset;
2864 1.1 skrll newsect->flags |= SEC_HAS_CONTENTS;
2865 1.1 skrll newsect->alignment_power = bfd_log2 (hdr->p_align);
2866 1.1 skrll if (hdr->p_type == PT_LOAD)
2867 1.1 skrll {
2868 1.1 skrll newsect->flags |= SEC_ALLOC;
2869 1.1 skrll newsect->flags |= SEC_LOAD;
2870 1.1 skrll if (hdr->p_flags & PF_X)
2871 1.1 skrll {
2872 1.1 skrll /* FIXME: all we known is that it has execute PERMISSION,
2873 1.1 skrll may be data. */
2874 1.1 skrll newsect->flags |= SEC_CODE;
2875 1.1 skrll }
2876 1.1 skrll }
2877 1.1 skrll if (!(hdr->p_flags & PF_W))
2878 1.1 skrll {
2879 1.1 skrll newsect->flags |= SEC_READONLY;
2880 1.1 skrll }
2881 1.1 skrll }
2882 1.1 skrll
2883 1.1 skrll if (hdr->p_memsz > hdr->p_filesz)
2884 1.1 skrll {
2885 1.3 christos bfd_vma align;
2886 1.1 skrll
2887 1.3 christos sprintf (namebuf, "%s%d%s", type_name, hdr_index, split ? "b" : "");
2888 1.1 skrll len = strlen (namebuf) + 1;
2889 1.1 skrll name = (char *) bfd_alloc (abfd, len);
2890 1.1 skrll if (!name)
2891 1.1 skrll return FALSE;
2892 1.1 skrll memcpy (name, namebuf, len);
2893 1.1 skrll newsect = bfd_make_section (abfd, name);
2894 1.1 skrll if (newsect == NULL)
2895 1.1 skrll return FALSE;
2896 1.1 skrll newsect->vma = hdr->p_vaddr + hdr->p_filesz;
2897 1.1 skrll newsect->lma = hdr->p_paddr + hdr->p_filesz;
2898 1.1 skrll newsect->size = hdr->p_memsz - hdr->p_filesz;
2899 1.1 skrll newsect->filepos = hdr->p_offset + hdr->p_filesz;
2900 1.1 skrll align = newsect->vma & -newsect->vma;
2901 1.1 skrll if (align == 0 || align > hdr->p_align)
2902 1.1 skrll align = hdr->p_align;
2903 1.1 skrll newsect->alignment_power = bfd_log2 (align);
2904 1.1 skrll if (hdr->p_type == PT_LOAD)
2905 1.1 skrll {
2906 1.1 skrll /* Hack for gdb. Segments that have not been modified do
2907 1.1 skrll not have their contents written to a core file, on the
2908 1.1 skrll assumption that a debugger can find the contents in the
2909 1.1 skrll executable. We flag this case by setting the fake
2910 1.1 skrll section size to zero. Note that "real" bss sections will
2911 1.1 skrll always have their contents dumped to the core file. */
2912 1.1 skrll if (bfd_get_format (abfd) == bfd_core)
2913 1.1 skrll newsect->size = 0;
2914 1.1 skrll newsect->flags |= SEC_ALLOC;
2915 1.1 skrll if (hdr->p_flags & PF_X)
2916 1.1 skrll newsect->flags |= SEC_CODE;
2917 1.1 skrll }
2918 1.1 skrll if (!(hdr->p_flags & PF_W))
2919 1.1 skrll newsect->flags |= SEC_READONLY;
2920 1.1 skrll }
2921 1.1 skrll
2922 1.1 skrll return TRUE;
2923 1.1 skrll }
2924 1.3 christos
2925 1.1 skrll bfd_boolean
2926 1.1 skrll bfd_section_from_phdr (bfd *abfd, Elf_Internal_Phdr *hdr, int hdr_index)
2927 1.1 skrll {
2928 1.1 skrll const struct elf_backend_data *bed;
2929 1.1 skrll
2930 1.1 skrll switch (hdr->p_type)
2931 1.3 christos {
2932 1.1 skrll case PT_NULL:
2933 1.1 skrll return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "null");
2934 1.3 christos
2935 1.1 skrll case PT_LOAD:
2936 1.1 skrll return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "load");
2937 1.3 christos
2938 1.1 skrll case PT_DYNAMIC:
2939 1.1 skrll return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "dynamic");
2940 1.3 christos
2941 1.1 skrll case PT_INTERP:
2942 1.1 skrll return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "interp");
2943 1.3 christos
2944 1.1 skrll case PT_NOTE:
2945 1.1 skrll if (! _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "note"))
2946 1.1 skrll return FALSE;
2947 1.1 skrll if (! elf_read_notes (abfd, hdr->p_offset, hdr->p_filesz))
2948 1.1 skrll return FALSE;
2949 1.1 skrll return TRUE;
2950 1.3 christos
2951 1.1 skrll case PT_SHLIB:
2952 1.1 skrll return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "shlib");
2953 1.3 christos
2954 1.1 skrll case PT_PHDR:
2955 1.1 skrll return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "phdr");
2956 1.3 christos
2957 1.1 skrll case PT_GNU_EH_FRAME:
2958 1.1 skrll return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index,
2959 1.1 skrll "eh_frame_hdr");
2960 1.3 christos
2961 1.1 skrll case PT_GNU_STACK:
2962 1.1 skrll return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "stack");
2963 1.3 christos
2964 1.1 skrll case PT_GNU_RELRO:
2965 1.1 skrll return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "relro");
2966 1.1 skrll
2967 1.1 skrll default:
2968 1.3 christos /* Check for any processor-specific program segment types. */
2969 1.1 skrll bed = get_elf_backend_data (abfd);
2970 1.1 skrll return bed->elf_backend_section_from_phdr (abfd, hdr, hdr_index, "proc");
2971 1.1 skrll }
2972 1.3 christos }
2973 1.3 christos
2974 1.3 christos /* Return the REL_HDR for SEC, assuming there is only a single one, either
2975 1.3 christos REL or RELA. */
2976 1.3 christos
2977 1.3 christos Elf_Internal_Shdr *
2978 1.3 christos _bfd_elf_single_rel_hdr (asection *sec)
2979 1.3 christos {
2980 1.3 christos if (elf_section_data (sec)->rel.hdr)
2981 1.3 christos {
2982 1.3 christos BFD_ASSERT (elf_section_data (sec)->rela.hdr == NULL);
2983 1.3 christos return elf_section_data (sec)->rel.hdr;
2984 1.3 christos }
2985 1.3 christos else
2986 1.3 christos return elf_section_data (sec)->rela.hdr;
2987 1.6 christos }
2988 1.6 christos
2989 1.6 christos static bfd_boolean
2990 1.6 christos _bfd_elf_set_reloc_sh_name (bfd *abfd,
2991 1.6 christos Elf_Internal_Shdr *rel_hdr,
2992 1.6 christos const char *sec_name,
2993 1.6 christos bfd_boolean use_rela_p)
2994 1.6 christos {
2995 1.6 christos char *name = (char *) bfd_alloc (abfd,
2996 1.6 christos sizeof ".rela" + strlen (sec_name));
2997 1.6 christos if (name == NULL)
2998 1.6 christos return FALSE;
2999 1.6 christos
3000 1.6 christos sprintf (name, "%s%s", use_rela_p ? ".rela" : ".rel", sec_name);
3001 1.6 christos rel_hdr->sh_name =
3002 1.6 christos (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd), name,
3003 1.6 christos FALSE);
3004 1.6 christos if (rel_hdr->sh_name == (unsigned int) -1)
3005 1.6 christos return FALSE;
3006 1.6 christos
3007 1.6 christos return TRUE;
3008 1.3 christos }
3009 1.3 christos
3010 1.3 christos /* Allocate and initialize a section-header for a new reloc section,
3011 1.3 christos containing relocations against ASECT. It is stored in RELDATA. If
3012 1.1 skrll USE_RELA_P is TRUE, we use RELA relocations; otherwise, we use REL
3013 1.6 christos relocations. */
3014 1.1 skrll
3015 1.3 christos static bfd_boolean
3016 1.6 christos _bfd_elf_init_reloc_shdr (bfd *abfd,
3017 1.6 christos struct bfd_elf_section_reloc_data *reldata,
3018 1.6 christos const char *sec_name,
3019 1.1 skrll bfd_boolean use_rela_p,
3020 1.3 christos bfd_boolean delay_st_name_p)
3021 1.1 skrll {
3022 1.3 christos Elf_Internal_Shdr *rel_hdr;
3023 1.3 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3024 1.6.2.1 pgoyette
3025 1.3 christos BFD_ASSERT (reldata->hdr == NULL);
3026 1.1 skrll rel_hdr = bfd_zalloc (abfd, sizeof (*rel_hdr));
3027 1.6 christos reldata->hdr = rel_hdr;
3028 1.6 christos
3029 1.6 christos if (delay_st_name_p)
3030 1.6 christos rel_hdr->sh_name = (unsigned int) -1;
3031 1.1 skrll else if (!_bfd_elf_set_reloc_sh_name (abfd, rel_hdr, sec_name,
3032 1.1 skrll use_rela_p))
3033 1.1 skrll return FALSE;
3034 1.1 skrll rel_hdr->sh_type = use_rela_p ? SHT_RELA : SHT_REL;
3035 1.1 skrll rel_hdr->sh_entsize = (use_rela_p
3036 1.1 skrll ? bed->s->sizeof_rela
3037 1.1 skrll : bed->s->sizeof_rel);
3038 1.1 skrll rel_hdr->sh_addralign = (bfd_vma) 1 << bed->s->log_file_align;
3039 1.1 skrll rel_hdr->sh_flags = 0;
3040 1.1 skrll rel_hdr->sh_addr = 0;
3041 1.1 skrll rel_hdr->sh_size = 0;
3042 1.1 skrll rel_hdr->sh_offset = 0;
3043 1.1 skrll
3044 1.1 skrll return TRUE;
3045 1.3 christos }
3046 1.3 christos
3047 1.3 christos /* Return the default section type based on the passed in section flags. */
3048 1.3 christos
3049 1.3 christos int
3050 1.3 christos bfd_elf_get_default_section_type (flagword flags)
3051 1.3 christos {
3052 1.3 christos if ((flags & SEC_ALLOC) != 0
3053 1.3 christos && (flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
3054 1.3 christos return SHT_NOBITS;
3055 1.3 christos return SHT_PROGBITS;
3056 1.3 christos }
3057 1.3 christos
3058 1.3 christos struct fake_section_arg
3059 1.3 christos {
3060 1.3 christos struct bfd_link_info *link_info;
3061 1.3 christos bfd_boolean failed;
3062 1.1 skrll };
3063 1.1 skrll
3064 1.1 skrll /* Set up an ELF internal section header for a section. */
3065 1.3 christos
3066 1.1 skrll static void
3067 1.3 christos elf_fake_sections (bfd *abfd, asection *asect, void *fsarg)
3068 1.1 skrll {
3069 1.3 christos struct fake_section_arg *arg = (struct fake_section_arg *)fsarg;
3070 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3071 1.1 skrll struct bfd_elf_section_data *esd = elf_section_data (asect);
3072 1.6 christos Elf_Internal_Shdr *this_hdr;
3073 1.6 christos unsigned int sh_type;
3074 1.1 skrll const char *name = asect->name;
3075 1.3 christos bfd_boolean delay_st_name_p = FALSE;
3076 1.1 skrll
3077 1.1 skrll if (arg->failed)
3078 1.1 skrll {
3079 1.1 skrll /* We already failed; just get out of the bfd_map_over_sections
3080 1.1 skrll loop. */
3081 1.1 skrll return;
3082 1.3 christos }
3083 1.1 skrll
3084 1.6 christos this_hdr = &esd->this_hdr;
3085 1.6 christos
3086 1.6 christos if (arg->link_info)
3087 1.6 christos {
3088 1.6 christos /* ld: compress DWARF debug sections with names: .debug_*. */
3089 1.6 christos if ((arg->link_info->compress_debug & COMPRESS_DEBUG)
3090 1.6 christos && (asect->flags & SEC_DEBUGGING)
3091 1.6 christos && name[1] == 'd'
3092 1.6 christos && name[6] == '_')
3093 1.6 christos {
3094 1.6 christos /* Set SEC_ELF_COMPRESS to indicate this section should be
3095 1.6 christos compressed. */
3096 1.6 christos asect->flags |= SEC_ELF_COMPRESS;
3097 1.6 christos
3098 1.6 christos /* If this section will be compressed, delay adding setion
3099 1.6 christos name to section name section after it is compressed in
3100 1.6 christos _bfd_elf_assign_file_positions_for_non_load. */
3101 1.6 christos delay_st_name_p = TRUE;
3102 1.6 christos }
3103 1.6 christos }
3104 1.6 christos else if ((asect->flags & SEC_ELF_RENAME))
3105 1.6 christos {
3106 1.6 christos /* objcopy: rename output DWARF debug section. */
3107 1.6 christos if ((abfd->flags & (BFD_DECOMPRESS | BFD_COMPRESS_GABI)))
3108 1.6 christos {
3109 1.6 christos /* When we decompress or compress with SHF_COMPRESSED,
3110 1.6 christos convert section name from .zdebug_* to .debug_* if
3111 1.6 christos needed. */
3112 1.6 christos if (name[1] == 'z')
3113 1.6 christos {
3114 1.6 christos char *new_name = convert_zdebug_to_debug (abfd, name);
3115 1.6 christos if (new_name == NULL)
3116 1.6 christos {
3117 1.6 christos arg->failed = TRUE;
3118 1.6 christos return;
3119 1.6 christos }
3120 1.6 christos name = new_name;
3121 1.6 christos }
3122 1.6 christos }
3123 1.6 christos else if (asect->compress_status == COMPRESS_SECTION_DONE)
3124 1.6 christos {
3125 1.6 christos /* PR binutils/18087: Compression does not always make a
3126 1.6 christos section smaller. So only rename the section when
3127 1.6 christos compression has actually taken place. If input section
3128 1.6 christos name is .zdebug_*, we should never compress it again. */
3129 1.6 christos char *new_name = convert_debug_to_zdebug (abfd, name);
3130 1.6 christos if (new_name == NULL)
3131 1.6 christos {
3132 1.6 christos arg->failed = TRUE;
3133 1.6 christos return;
3134 1.6 christos }
3135 1.6 christos BFD_ASSERT (name[1] != 'z');
3136 1.6 christos name = new_name;
3137 1.6 christos }
3138 1.6 christos }
3139 1.6 christos
3140 1.6 christos if (delay_st_name_p)
3141 1.1 skrll this_hdr->sh_name = (unsigned int) -1;
3142 1.6 christos else
3143 1.6 christos {
3144 1.6 christos this_hdr->sh_name
3145 1.6 christos = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
3146 1.6 christos name, FALSE);
3147 1.6 christos if (this_hdr->sh_name == (unsigned int) -1)
3148 1.6 christos {
3149 1.6 christos arg->failed = TRUE;
3150 1.1 skrll return;
3151 1.1 skrll }
3152 1.1 skrll }
3153 1.1 skrll
3154 1.1 skrll /* Don't clear sh_flags. Assembler may set additional bits. */
3155 1.1 skrll
3156 1.1 skrll if ((asect->flags & SEC_ALLOC) != 0
3157 1.1 skrll || asect->user_set_vma)
3158 1.1 skrll this_hdr->sh_addr = asect->vma;
3159 1.1 skrll else
3160 1.1 skrll this_hdr->sh_addr = 0;
3161 1.1 skrll
3162 1.1 skrll this_hdr->sh_offset = 0;
3163 1.6 christos this_hdr->sh_size = asect->size;
3164 1.6 christos this_hdr->sh_link = 0;
3165 1.6 christos /* PR 17512: file: 0eb809fe, 8b0535ee. */
3166 1.6 christos if (asect->alignment_power >= (sizeof (bfd_vma) * 8) - 1)
3167 1.6 christos {
3168 1.6 christos (*_bfd_error_handler)
3169 1.6 christos (_("%B: error: Alignment power %d of section `%A' is too big"),
3170 1.6 christos abfd, asect, asect->alignment_power);
3171 1.6 christos arg->failed = TRUE;
3172 1.1 skrll return;
3173 1.1 skrll }
3174 1.1 skrll this_hdr->sh_addralign = (bfd_vma) 1 << asect->alignment_power;
3175 1.1 skrll /* The sh_entsize and sh_info fields may have been set already by
3176 1.1 skrll copy_private_section_data. */
3177 1.1 skrll
3178 1.1 skrll this_hdr->bfd_section = asect;
3179 1.1 skrll this_hdr->contents = NULL;
3180 1.1 skrll
3181 1.1 skrll /* If the section type is unspecified, we set it based on
3182 1.1 skrll asect->flags. */
3183 1.1 skrll if ((asect->flags & SEC_GROUP) != 0)
3184 1.3 christos sh_type = SHT_GROUP;
3185 1.1 skrll else
3186 1.1 skrll sh_type = bfd_elf_get_default_section_type (asect->flags);
3187 1.1 skrll
3188 1.1 skrll if (this_hdr->sh_type == SHT_NULL)
3189 1.1 skrll this_hdr->sh_type = sh_type;
3190 1.1 skrll else if (this_hdr->sh_type == SHT_NOBITS
3191 1.1 skrll && sh_type == SHT_PROGBITS
3192 1.1 skrll && (asect->flags & SEC_ALLOC) != 0)
3193 1.1 skrll {
3194 1.1 skrll /* Warn if we are changing a NOBITS section to PROGBITS, but
3195 1.1 skrll allow the link to proceed. This can happen when users link
3196 1.1 skrll non-bss input sections to bss output sections, or emit data
3197 1.1 skrll to a bss output section via a linker script. */
3198 1.1 skrll (*_bfd_error_handler)
3199 1.1 skrll (_("warning: section `%A' type changed to PROGBITS"), asect);
3200 1.1 skrll this_hdr->sh_type = sh_type;
3201 1.1 skrll }
3202 1.1 skrll
3203 1.1 skrll switch (this_hdr->sh_type)
3204 1.1 skrll {
3205 1.1 skrll default:
3206 1.1 skrll break;
3207 1.1 skrll
3208 1.1 skrll case SHT_STRTAB:
3209 1.1 skrll case SHT_NOTE:
3210 1.1 skrll case SHT_NOBITS:
3211 1.1 skrll case SHT_PROGBITS:
3212 1.6.2.1 pgoyette break;
3213 1.6.2.1 pgoyette
3214 1.6.2.1 pgoyette case SHT_INIT_ARRAY:
3215 1.6.2.1 pgoyette case SHT_FINI_ARRAY:
3216 1.6.2.1 pgoyette case SHT_PREINIT_ARRAY:
3217 1.6.2.1 pgoyette this_hdr->sh_entsize = bed->s->arch_size / 8;
3218 1.1 skrll break;
3219 1.1 skrll
3220 1.1 skrll case SHT_HASH:
3221 1.1 skrll this_hdr->sh_entsize = bed->s->sizeof_hash_entry;
3222 1.1 skrll break;
3223 1.1 skrll
3224 1.1 skrll case SHT_DYNSYM:
3225 1.1 skrll this_hdr->sh_entsize = bed->s->sizeof_sym;
3226 1.1 skrll break;
3227 1.1 skrll
3228 1.1 skrll case SHT_DYNAMIC:
3229 1.1 skrll this_hdr->sh_entsize = bed->s->sizeof_dyn;
3230 1.1 skrll break;
3231 1.1 skrll
3232 1.1 skrll case SHT_RELA:
3233 1.1 skrll if (get_elf_backend_data (abfd)->may_use_rela_p)
3234 1.1 skrll this_hdr->sh_entsize = bed->s->sizeof_rela;
3235 1.1 skrll break;
3236 1.1 skrll
3237 1.1 skrll case SHT_REL:
3238 1.1 skrll if (get_elf_backend_data (abfd)->may_use_rel_p)
3239 1.1 skrll this_hdr->sh_entsize = bed->s->sizeof_rel;
3240 1.1 skrll break;
3241 1.1 skrll
3242 1.1 skrll case SHT_GNU_versym:
3243 1.1 skrll this_hdr->sh_entsize = sizeof (Elf_External_Versym);
3244 1.1 skrll break;
3245 1.1 skrll
3246 1.1 skrll case SHT_GNU_verdef:
3247 1.1 skrll this_hdr->sh_entsize = 0;
3248 1.1 skrll /* objcopy or strip will copy over sh_info, but may not set
3249 1.1 skrll cverdefs. The linker will set cverdefs, but sh_info will be
3250 1.1 skrll zero. */
3251 1.1 skrll if (this_hdr->sh_info == 0)
3252 1.1 skrll this_hdr->sh_info = elf_tdata (abfd)->cverdefs;
3253 1.1 skrll else
3254 1.1 skrll BFD_ASSERT (elf_tdata (abfd)->cverdefs == 0
3255 1.1 skrll || this_hdr->sh_info == elf_tdata (abfd)->cverdefs);
3256 1.1 skrll break;
3257 1.1 skrll
3258 1.1 skrll case SHT_GNU_verneed:
3259 1.1 skrll this_hdr->sh_entsize = 0;
3260 1.1 skrll /* objcopy or strip will copy over sh_info, but may not set
3261 1.1 skrll cverrefs. The linker will set cverrefs, but sh_info will be
3262 1.1 skrll zero. */
3263 1.1 skrll if (this_hdr->sh_info == 0)
3264 1.1 skrll this_hdr->sh_info = elf_tdata (abfd)->cverrefs;
3265 1.1 skrll else
3266 1.1 skrll BFD_ASSERT (elf_tdata (abfd)->cverrefs == 0
3267 1.1 skrll || this_hdr->sh_info == elf_tdata (abfd)->cverrefs);
3268 1.1 skrll break;
3269 1.1 skrll
3270 1.1 skrll case SHT_GROUP:
3271 1.1 skrll this_hdr->sh_entsize = GRP_ENTRY_SIZE;
3272 1.1 skrll break;
3273 1.1 skrll
3274 1.1 skrll case SHT_GNU_HASH:
3275 1.1 skrll this_hdr->sh_entsize = bed->s->arch_size == 64 ? 0 : 4;
3276 1.1 skrll break;
3277 1.1 skrll }
3278 1.1 skrll
3279 1.1 skrll if ((asect->flags & SEC_ALLOC) != 0)
3280 1.1 skrll this_hdr->sh_flags |= SHF_ALLOC;
3281 1.1 skrll if ((asect->flags & SEC_READONLY) == 0)
3282 1.1 skrll this_hdr->sh_flags |= SHF_WRITE;
3283 1.1 skrll if ((asect->flags & SEC_CODE) != 0)
3284 1.1 skrll this_hdr->sh_flags |= SHF_EXECINSTR;
3285 1.1 skrll if ((asect->flags & SEC_MERGE) != 0)
3286 1.1 skrll {
3287 1.1 skrll this_hdr->sh_flags |= SHF_MERGE;
3288 1.6.2.1 pgoyette this_hdr->sh_entsize = asect->entsize;
3289 1.6.2.1 pgoyette }
3290 1.1 skrll if ((asect->flags & SEC_STRINGS) != 0)
3291 1.1 skrll this_hdr->sh_flags |= SHF_STRINGS;
3292 1.1 skrll if ((asect->flags & SEC_GROUP) == 0 && elf_group_name (asect) != NULL)
3293 1.1 skrll this_hdr->sh_flags |= SHF_GROUP;
3294 1.1 skrll if ((asect->flags & SEC_THREAD_LOCAL) != 0)
3295 1.1 skrll {
3296 1.1 skrll this_hdr->sh_flags |= SHF_TLS;
3297 1.1 skrll if (asect->size == 0
3298 1.1 skrll && (asect->flags & SEC_HAS_CONTENTS) == 0)
3299 1.1 skrll {
3300 1.1 skrll struct bfd_link_order *o = asect->map_tail.link_order;
3301 1.1 skrll
3302 1.1 skrll this_hdr->sh_size = 0;
3303 1.1 skrll if (o != NULL)
3304 1.1 skrll {
3305 1.1 skrll this_hdr->sh_size = o->offset + o->size;
3306 1.1 skrll if (this_hdr->sh_size != 0)
3307 1.1 skrll this_hdr->sh_type = SHT_NOBITS;
3308 1.1 skrll }
3309 1.3 christos }
3310 1.3 christos }
3311 1.3 christos if ((asect->flags & (SEC_GROUP | SEC_EXCLUDE)) == SEC_EXCLUDE)
3312 1.3 christos this_hdr->sh_flags |= SHF_EXCLUDE;
3313 1.3 christos
3314 1.3 christos /* If the section has relocs, set up a section header for the
3315 1.3 christos SHT_REL[A] section. If two relocation sections are required for
3316 1.3 christos this section, it is up to the processor-specific back-end to
3317 1.3 christos create the other. */
3318 1.3 christos if ((asect->flags & SEC_RELOC) != 0)
3319 1.3 christos {
3320 1.3 christos /* When doing a relocatable link, create both REL and RELA sections if
3321 1.3 christos needed. */
3322 1.3 christos if (arg->link_info
3323 1.6 christos /* Do the normal setup if we wouldn't create any sections here. */
3324 1.6 christos && esd->rel.count + esd->rela.count > 0
3325 1.3 christos && (bfd_link_relocatable (arg->link_info)
3326 1.3 christos || arg->link_info->emitrelocations))
3327 1.6 christos {
3328 1.6 christos if (esd->rel.count && esd->rel.hdr == NULL
3329 1.3 christos && !_bfd_elf_init_reloc_shdr (abfd, &esd->rel, name, FALSE,
3330 1.3 christos delay_st_name_p))
3331 1.3 christos {
3332 1.3 christos arg->failed = TRUE;
3333 1.3 christos return;
3334 1.6 christos }
3335 1.6 christos if (esd->rela.count && esd->rela.hdr == NULL
3336 1.3 christos && !_bfd_elf_init_reloc_shdr (abfd, &esd->rela, name, TRUE,
3337 1.3 christos delay_st_name_p))
3338 1.3 christos {
3339 1.3 christos arg->failed = TRUE;
3340 1.3 christos return;
3341 1.3 christos }
3342 1.3 christos }
3343 1.3 christos else if (!_bfd_elf_init_reloc_shdr (abfd,
3344 1.6 christos (asect->use_rela_p
3345 1.6 christos ? &esd->rela : &esd->rel),
3346 1.6 christos name,
3347 1.3 christos asect->use_rela_p,
3348 1.3 christos delay_st_name_p))
3349 1.1 skrll arg->failed = TRUE;
3350 1.1 skrll }
3351 1.1 skrll
3352 1.1 skrll /* Check for processor-specific section types. */
3353 1.1 skrll sh_type = this_hdr->sh_type;
3354 1.3 christos if (bed->elf_backend_fake_sections
3355 1.1 skrll && !(*bed->elf_backend_fake_sections) (abfd, this_hdr, asect))
3356 1.1 skrll arg->failed = TRUE;
3357 1.1 skrll
3358 1.1 skrll if (sh_type == SHT_NOBITS && asect->size != 0)
3359 1.1 skrll {
3360 1.1 skrll /* Don't change the header type from NOBITS if we are being
3361 1.1 skrll called for objcopy --only-keep-debug. */
3362 1.1 skrll this_hdr->sh_type = sh_type;
3363 1.1 skrll }
3364 1.2 skrll }
3365 1.2 skrll
3366 1.2 skrll /* Fill in the contents of a SHT_GROUP section. Called from
3367 1.2 skrll _bfd_elf_compute_section_file_positions for gas, objcopy, and
3368 1.1 skrll when ELF targets use the generic linker, ld. Called for ld -r
3369 1.1 skrll from bfd_elf_final_link. */
3370 1.1 skrll
3371 1.1 skrll void
3372 1.3 christos bfd_elf_set_group_contents (bfd *abfd, asection *sec, void *failedptrarg)
3373 1.1 skrll {
3374 1.1 skrll bfd_boolean *failedptr = (bfd_boolean *) failedptrarg;
3375 1.1 skrll asection *elt, *first;
3376 1.1 skrll unsigned char *loc;
3377 1.1 skrll bfd_boolean gas;
3378 1.1 skrll
3379 1.1 skrll /* Ignore linker created group section. See elfNN_ia64_object_p in
3380 1.1 skrll elfxx-ia64.c. */
3381 1.1 skrll if (((sec->flags & (SEC_GROUP | SEC_LINKER_CREATED)) != SEC_GROUP)
3382 1.1 skrll || *failedptr)
3383 1.2 skrll return;
3384 1.2 skrll
3385 1.2 skrll if (elf_section_data (sec)->this_hdr.sh_info == 0)
3386 1.2 skrll {
3387 1.2 skrll unsigned long symindx = 0;
3388 1.2 skrll
3389 1.2 skrll /* elf_group_id will have been set up by objcopy and the
3390 1.2 skrll generic linker. */
3391 1.2 skrll if (elf_group_id (sec) != NULL)
3392 1.2 skrll symindx = elf_group_id (sec)->udata.i;
3393 1.2 skrll
3394 1.2 skrll if (symindx == 0)
3395 1.2 skrll {
3396 1.2 skrll /* If called from the assembler, swap_out_syms will have set up
3397 1.2 skrll elf_section_syms. */
3398 1.2 skrll BFD_ASSERT (elf_section_syms (abfd) != NULL);
3399 1.2 skrll symindx = elf_section_syms (abfd)[sec->index]->udata.i;
3400 1.2 skrll }
3401 1.2 skrll elf_section_data (sec)->this_hdr.sh_info = symindx;
3402 1.2 skrll }
3403 1.2 skrll else if (elf_section_data (sec)->this_hdr.sh_info == (unsigned int) -2)
3404 1.2 skrll {
3405 1.2 skrll /* The ELF backend linker sets sh_info to -2 when the group
3406 1.2 skrll signature symbol is global, and thus the index can't be
3407 1.2 skrll set until all local symbols are output. */
3408 1.2 skrll asection *igroup = elf_sec_group (elf_next_in_group (sec));
3409 1.2 skrll struct bfd_elf_section_data *sec_data = elf_section_data (igroup);
3410 1.2 skrll unsigned long symndx = sec_data->this_hdr.sh_info;
3411 1.2 skrll unsigned long extsymoff = 0;
3412 1.2 skrll struct elf_link_hash_entry *h;
3413 1.2 skrll
3414 1.2 skrll if (!elf_bad_symtab (igroup->owner))
3415 1.2 skrll {
3416 1.2 skrll Elf_Internal_Shdr *symtab_hdr;
3417 1.2 skrll
3418 1.2 skrll symtab_hdr = &elf_tdata (igroup->owner)->symtab_hdr;
3419 1.2 skrll extsymoff = symtab_hdr->sh_info;
3420 1.2 skrll }
3421 1.2 skrll h = elf_sym_hashes (igroup->owner)[symndx - extsymoff];
3422 1.2 skrll while (h->root.type == bfd_link_hash_indirect
3423 1.2 skrll || h->root.type == bfd_link_hash_warning)
3424 1.2 skrll h = (struct elf_link_hash_entry *) h->root.u.i.link;
3425 1.1 skrll
3426 1.1 skrll elf_section_data (sec)->this_hdr.sh_info = h->indx;
3427 1.1 skrll }
3428 1.1 skrll
3429 1.1 skrll /* The contents won't be allocated for "ld -r" or objcopy. */
3430 1.1 skrll gas = TRUE;
3431 1.1 skrll if (sec->contents == NULL)
3432 1.3 christos {
3433 1.1 skrll gas = FALSE;
3434 1.1 skrll sec->contents = (unsigned char *) bfd_alloc (abfd, sec->size);
3435 1.1 skrll
3436 1.1 skrll /* Arrange for the section to be written out. */
3437 1.1 skrll elf_section_data (sec)->this_hdr.contents = sec->contents;
3438 1.1 skrll if (sec->contents == NULL)
3439 1.1 skrll {
3440 1.1 skrll *failedptr = TRUE;
3441 1.1 skrll return;
3442 1.1 skrll }
3443 1.1 skrll }
3444 1.1 skrll
3445 1.1 skrll loc = sec->contents + sec->size;
3446 1.1 skrll
3447 1.1 skrll /* Get the pointer to the first section in the group that gas
3448 1.1 skrll squirreled away here. objcopy arranges for this to be set to the
3449 1.1 skrll start of the input section group. */
3450 1.1 skrll first = elt = elf_next_in_group (sec);
3451 1.1 skrll
3452 1.1 skrll /* First element is a flag word. Rest of section is elf section
3453 1.1 skrll indices for all the sections of the group. Write them backwards
3454 1.1 skrll just to keep the group in the same order as given in .section
3455 1.1 skrll directives, not that it matters. */
3456 1.1 skrll while (elt != NULL)
3457 1.1 skrll {
3458 1.1 skrll asection *s;
3459 1.1 skrll
3460 1.1 skrll s = elt;
3461 1.3 christos if (!gas)
3462 1.3 christos s = s->output_section;
3463 1.3 christos if (s != NULL
3464 1.3 christos && !bfd_is_abs_section (s))
3465 1.3 christos {
3466 1.3 christos unsigned int idx = elf_section_data (s)->this_idx;
3467 1.3 christos
3468 1.3 christos loc -= 4;
3469 1.1 skrll H_PUT_32 (abfd, idx, loc);
3470 1.1 skrll }
3471 1.1 skrll elt = elf_next_in_group (elt);
3472 1.1 skrll if (elt == first)
3473 1.1 skrll break;
3474 1.1 skrll }
3475 1.1 skrll
3476 1.1 skrll if ((loc -= 4) != sec->contents)
3477 1.1 skrll abort ();
3478 1.1 skrll
3479 1.1 skrll H_PUT_32 (abfd, sec->flags & SEC_LINK_ONCE ? GRP_COMDAT : 0, loc);
3480 1.6 christos }
3481 1.6 christos
3482 1.6 christos /* Return the section which RELOC_SEC applies to. */
3483 1.6 christos
3484 1.6 christos asection *
3485 1.6 christos _bfd_elf_get_reloc_section (asection *reloc_sec)
3486 1.6 christos {
3487 1.6 christos const char *name;
3488 1.6 christos unsigned int type;
3489 1.6 christos bfd *abfd;
3490 1.6 christos
3491 1.6 christos if (reloc_sec == NULL)
3492 1.6 christos return NULL;
3493 1.6 christos
3494 1.6 christos type = elf_section_data (reloc_sec)->this_hdr.sh_type;
3495 1.6 christos if (type != SHT_REL && type != SHT_RELA)
3496 1.6 christos return NULL;
3497 1.6 christos
3498 1.6 christos /* We look up the section the relocs apply to by name. */
3499 1.6 christos name = reloc_sec->name;
3500 1.6 christos if (type == SHT_REL)
3501 1.6 christos name += 4;
3502 1.6 christos else
3503 1.6 christos name += 5;
3504 1.6 christos
3505 1.6 christos /* If a target needs .got.plt section, relocations in rela.plt/rel.plt
3506 1.6 christos section apply to .got.plt section. */
3507 1.6 christos abfd = reloc_sec->owner;
3508 1.6 christos if (get_elf_backend_data (abfd)->want_got_plt
3509 1.6 christos && strcmp (name, ".plt") == 0)
3510 1.6 christos {
3511 1.6 christos /* .got.plt is a linker created input section. It may be mapped
3512 1.6 christos to some other output section. Try two likely sections. */
3513 1.6 christos name = ".got.plt";
3514 1.6 christos reloc_sec = bfd_get_section_by_name (abfd, name);
3515 1.6 christos if (reloc_sec != NULL)
3516 1.6 christos return reloc_sec;
3517 1.6 christos name = ".got";
3518 1.6 christos }
3519 1.6 christos
3520 1.6 christos reloc_sec = bfd_get_section_by_name (abfd, name);
3521 1.6 christos return reloc_sec;
3522 1.1 skrll }
3523 1.1 skrll
3524 1.1 skrll /* Assign all ELF section numbers. The dummy first section is handled here
3525 1.1 skrll too. The link/info pointers for the standard section types are filled
3526 1.1 skrll in here too, while we're at it. */
3527 1.1 skrll
3528 1.1 skrll static bfd_boolean
3529 1.1 skrll assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
3530 1.1 skrll {
3531 1.6 christos struct elf_obj_tdata *t = elf_tdata (abfd);
3532 1.1 skrll asection *sec;
3533 1.1 skrll unsigned int section_number;
3534 1.3 christos Elf_Internal_Shdr **i_shdrp;
3535 1.1 skrll struct bfd_elf_section_data *d;
3536 1.1 skrll bfd_boolean need_symtab;
3537 1.1 skrll
3538 1.1 skrll section_number = 1;
3539 1.1 skrll
3540 1.1 skrll _bfd_elf_strtab_clear_all_refs (elf_shstrtab (abfd));
3541 1.6 christos
3542 1.1 skrll /* SHT_GROUP sections are in relocatable files only. */
3543 1.6.2.1 pgoyette if (link_info == NULL || bfd_link_relocatable (link_info))
3544 1.6.2.1 pgoyette {
3545 1.1 skrll size_t reloc_count = 0;
3546 1.1 skrll
3547 1.1 skrll /* Put SHT_GROUP sections first. */
3548 1.1 skrll for (sec = abfd->sections; sec != NULL; sec = sec->next)
3549 1.1 skrll {
3550 1.1 skrll d = elf_section_data (sec);
3551 1.1 skrll
3552 1.1 skrll if (d->this_hdr.sh_type == SHT_GROUP)
3553 1.1 skrll {
3554 1.1 skrll if (sec->flags & SEC_LINKER_CREATED)
3555 1.1 skrll {
3556 1.1 skrll /* Remove the linker created SHT_GROUP sections. */
3557 1.1 skrll bfd_section_list_remove (abfd, sec);
3558 1.1 skrll abfd->section_count--;
3559 1.1 skrll }
3560 1.1 skrll else
3561 1.6.2.1 pgoyette d->this_idx = section_number++;
3562 1.6.2.1 pgoyette }
3563 1.6.2.1 pgoyette
3564 1.1 skrll /* Count relocations. */
3565 1.6.2.1 pgoyette reloc_count += sec->reloc_count;
3566 1.6.2.1 pgoyette }
3567 1.6.2.1 pgoyette
3568 1.6.2.1 pgoyette /* Clear HAS_RELOC if there are no relocations. */
3569 1.1 skrll if (reloc_count == 0)
3570 1.1 skrll abfd->flags &= ~HAS_RELOC;
3571 1.1 skrll }
3572 1.1 skrll
3573 1.1 skrll for (sec = abfd->sections; sec; sec = sec->next)
3574 1.1 skrll {
3575 1.1 skrll d = elf_section_data (sec);
3576 1.1 skrll
3577 1.6 christos if (d->this_hdr.sh_type != SHT_GROUP)
3578 1.6 christos d->this_idx = section_number++;
3579 1.3 christos if (d->this_hdr.sh_name != (unsigned int) -1)
3580 1.1 skrll _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->this_hdr.sh_name);
3581 1.3 christos if (d->rel.hdr)
3582 1.6 christos {
3583 1.6 christos d->rel.idx = section_number++;
3584 1.1 skrll if (d->rel.hdr->sh_name != (unsigned int) -1)
3585 1.3 christos _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->rel.hdr->sh_name);
3586 1.3 christos }
3587 1.1 skrll else
3588 1.3 christos d->rel.idx = 0;
3589 1.1 skrll
3590 1.3 christos if (d->rela.hdr)
3591 1.6 christos {
3592 1.6 christos d->rela.idx = section_number++;
3593 1.1 skrll if (d->rela.hdr->sh_name != (unsigned int) -1)
3594 1.1 skrll _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->rela.hdr->sh_name);
3595 1.3 christos }
3596 1.1 skrll else
3597 1.1 skrll d->rela.idx = 0;
3598 1.6 christos }
3599 1.1 skrll
3600 1.6 christos elf_shstrtab_sec (abfd) = section_number++;
3601 1.1 skrll _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->shstrtab_hdr.sh_name);
3602 1.3 christos elf_elfheader (abfd)->e_shstrndx = elf_shstrtab_sec (abfd);
3603 1.3 christos
3604 1.3 christos need_symtab = (bfd_get_symcount (abfd) > 0
3605 1.3 christos || (link_info == NULL
3606 1.3 christos && ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC))
3607 1.1 skrll == HAS_RELOC)));
3608 1.6 christos if (need_symtab)
3609 1.1 skrll {
3610 1.1 skrll elf_onesymtab (abfd) = section_number++;
3611 1.1 skrll _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->symtab_hdr.sh_name);
3612 1.6 christos if (section_number > ((SHN_LORESERVE - 2) & 0xFFFF))
3613 1.6 christos {
3614 1.6 christos elf_section_list * entry;
3615 1.6 christos
3616 1.6 christos BFD_ASSERT (elf_symtab_shndx_list (abfd) == NULL);
3617 1.6 christos
3618 1.6 christos entry = bfd_zalloc (abfd, sizeof * entry);
3619 1.6 christos entry->ndx = section_number++;
3620 1.1 skrll elf_symtab_shndx_list (abfd) = entry;
3621 1.1 skrll entry->hdr.sh_name
3622 1.6 christos = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
3623 1.1 skrll ".symtab_shndx", FALSE);
3624 1.1 skrll if (entry->hdr.sh_name == (unsigned int) -1)
3625 1.6 christos return FALSE;
3626 1.1 skrll }
3627 1.1 skrll elf_strtab_sec (abfd) = section_number++;
3628 1.1 skrll _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->strtab_hdr.sh_name);
3629 1.5 christos }
3630 1.5 christos
3631 1.5 christos if (section_number >= SHN_LORESERVE)
3632 1.5 christos {
3633 1.5 christos _bfd_error_handler (_("%B: too many sections: %u"),
3634 1.5 christos abfd, section_number);
3635 1.5 christos return FALSE;
3636 1.1 skrll }
3637 1.1 skrll
3638 1.1 skrll elf_numsections (abfd) = section_number;
3639 1.1 skrll elf_elfheader (abfd)->e_shnum = section_number;
3640 1.1 skrll
3641 1.3 christos /* Set up the list of section header pointers, in agreement with the
3642 1.3 christos indices. */
3643 1.1 skrll i_shdrp = (Elf_Internal_Shdr **) bfd_zalloc2 (abfd, section_number,
3644 1.1 skrll sizeof (Elf_Internal_Shdr *));
3645 1.1 skrll if (i_shdrp == NULL)
3646 1.3 christos return FALSE;
3647 1.3 christos
3648 1.1 skrll i_shdrp[0] = (Elf_Internal_Shdr *) bfd_zalloc (abfd,
3649 1.1 skrll sizeof (Elf_Internal_Shdr));
3650 1.1 skrll if (i_shdrp[0] == NULL)
3651 1.1 skrll {
3652 1.1 skrll bfd_release (abfd, i_shdrp);
3653 1.1 skrll return FALSE;
3654 1.1 skrll }
3655 1.1 skrll
3656 1.6 christos elf_elfsections (abfd) = i_shdrp;
3657 1.3 christos
3658 1.1 skrll i_shdrp[elf_shstrtab_sec (abfd)] = &t->shstrtab_hdr;
3659 1.6 christos if (need_symtab)
3660 1.1 skrll {
3661 1.1 skrll i_shdrp[elf_onesymtab (abfd)] = &t->symtab_hdr;
3662 1.6 christos if (elf_numsections (abfd) > (SHN_LORESERVE & 0xFFFF))
3663 1.6 christos {
3664 1.6 christos elf_section_list * entry = elf_symtab_shndx_list (abfd);
3665 1.6 christos BFD_ASSERT (entry != NULL);
3666 1.1 skrll i_shdrp[entry->ndx] = & entry->hdr;
3667 1.6 christos entry->hdr.sh_link = elf_onesymtab (abfd);
3668 1.6 christos }
3669 1.1 skrll i_shdrp[elf_strtab_sec (abfd)] = &t->strtab_hdr;
3670 1.1 skrll t->symtab_hdr.sh_link = elf_strtab_sec (abfd);
3671 1.1 skrll }
3672 1.1 skrll
3673 1.1 skrll for (sec = abfd->sections; sec; sec = sec->next)
3674 1.1 skrll {
3675 1.3 christos asection *s;
3676 1.3 christos
3677 1.1 skrll d = elf_section_data (sec);
3678 1.3 christos
3679 1.3 christos i_shdrp[d->this_idx] = &d->this_hdr;
3680 1.3 christos if (d->rel.idx != 0)
3681 1.3 christos i_shdrp[d->rel.idx] = d->rel.hdr;
3682 1.1 skrll if (d->rela.idx != 0)
3683 1.1 skrll i_shdrp[d->rela.idx] = d->rela.hdr;
3684 1.1 skrll
3685 1.1 skrll /* Fill in the sh_link and sh_info fields while we're at it. */
3686 1.1 skrll
3687 1.1 skrll /* sh_link of a reloc section is the section index of the symbol
3688 1.3 christos table. sh_info is the section index of the section to which
3689 1.1 skrll the relocation entries apply. */
3690 1.6 christos if (d->rel.idx != 0)
3691 1.3 christos {
3692 1.6 christos d->rel.hdr->sh_link = elf_onesymtab (abfd);
3693 1.1 skrll d->rel.hdr->sh_info = d->this_idx;
3694 1.3 christos d->rel.hdr->sh_flags |= SHF_INFO_LINK;
3695 1.1 skrll }
3696 1.6 christos if (d->rela.idx != 0)
3697 1.3 christos {
3698 1.6 christos d->rela.hdr->sh_link = elf_onesymtab (abfd);
3699 1.1 skrll d->rela.hdr->sh_info = d->this_idx;
3700 1.1 skrll d->rela.hdr->sh_flags |= SHF_INFO_LINK;
3701 1.1 skrll }
3702 1.1 skrll
3703 1.1 skrll /* We need to set up sh_link for SHF_LINK_ORDER. */
3704 1.1 skrll if ((d->this_hdr.sh_flags & SHF_LINK_ORDER) != 0)
3705 1.1 skrll {
3706 1.1 skrll s = elf_linked_to_section (sec);
3707 1.1 skrll if (s)
3708 1.1 skrll {
3709 1.1 skrll /* elf_linked_to_section points to the input section. */
3710 1.1 skrll if (link_info != NULL)
3711 1.5 christos {
3712 1.1 skrll /* Check discarded linkonce section. */
3713 1.1 skrll if (discarded_section (s))
3714 1.1 skrll {
3715 1.1 skrll asection *kept;
3716 1.1 skrll (*_bfd_error_handler)
3717 1.1 skrll (_("%B: sh_link of section `%A' points to discarded section `%A' of `%B'"),
3718 1.1 skrll abfd, d->this_hdr.bfd_section,
3719 1.1 skrll s, s->owner);
3720 1.1 skrll /* Point to the kept section if it has the same
3721 1.1 skrll size as the discarded one. */
3722 1.1 skrll kept = _bfd_elf_check_kept_section (s, link_info);
3723 1.1 skrll if (kept == NULL)
3724 1.1 skrll {
3725 1.1 skrll bfd_set_error (bfd_error_bad_value);
3726 1.1 skrll return FALSE;
3727 1.1 skrll }
3728 1.1 skrll s = kept;
3729 1.1 skrll }
3730 1.1 skrll
3731 1.1 skrll s = s->output_section;
3732 1.1 skrll BFD_ASSERT (s != NULL);
3733 1.1 skrll }
3734 1.1 skrll else
3735 1.1 skrll {
3736 1.1 skrll /* Handle objcopy. */
3737 1.1 skrll if (s->output_section == NULL)
3738 1.1 skrll {
3739 1.1 skrll (*_bfd_error_handler)
3740 1.1 skrll (_("%B: sh_link of section `%A' points to removed section `%A' of `%B'"),
3741 1.1 skrll abfd, d->this_hdr.bfd_section, s, s->owner);
3742 1.1 skrll bfd_set_error (bfd_error_bad_value);
3743 1.1 skrll return FALSE;
3744 1.1 skrll }
3745 1.1 skrll s = s->output_section;
3746 1.1 skrll }
3747 1.1 skrll d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3748 1.1 skrll }
3749 1.1 skrll else
3750 1.1 skrll {
3751 1.1 skrll /* PR 290:
3752 1.1 skrll The Intel C compiler generates SHT_IA_64_UNWIND with
3753 1.1 skrll SHF_LINK_ORDER. But it doesn't set the sh_link or
3754 1.1 skrll sh_info fields. Hence we could get the situation
3755 1.1 skrll where s is NULL. */
3756 1.1 skrll const struct elf_backend_data *bed
3757 1.1 skrll = get_elf_backend_data (abfd);
3758 1.1 skrll if (bed->link_order_error_handler)
3759 1.1 skrll bed->link_order_error_handler
3760 1.1 skrll (_("%B: warning: sh_link not set for section `%A'"),
3761 1.1 skrll abfd, sec);
3762 1.1 skrll }
3763 1.1 skrll }
3764 1.1 skrll
3765 1.1 skrll switch (d->this_hdr.sh_type)
3766 1.1 skrll {
3767 1.1 skrll case SHT_REL:
3768 1.1 skrll case SHT_RELA:
3769 1.1 skrll /* A reloc section which we are treating as a normal BFD
3770 1.1 skrll section. sh_link is the section index of the symbol
3771 1.1 skrll table. sh_info is the section index of the section to
3772 1.1 skrll which the relocation entries apply. We assume that an
3773 1.1 skrll allocated reloc section uses the dynamic symbol table.
3774 1.1 skrll FIXME: How can we be sure? */
3775 1.1 skrll s = bfd_get_section_by_name (abfd, ".dynsym");
3776 1.1 skrll if (s != NULL)
3777 1.6 christos d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3778 1.1 skrll
3779 1.6 christos s = get_elf_backend_data (abfd)->get_reloc_section (sec);
3780 1.6 christos if (s != NULL)
3781 1.6 christos {
3782 1.6 christos d->this_hdr.sh_info = elf_section_data (s)->this_idx;
3783 1.1 skrll d->this_hdr.sh_flags |= SHF_INFO_LINK;
3784 1.1 skrll }
3785 1.1 skrll break;
3786 1.1 skrll
3787 1.1 skrll case SHT_STRTAB:
3788 1.1 skrll /* We assume that a section named .stab*str is a stabs
3789 1.1 skrll string section. We look for a section with the same name
3790 1.1 skrll but without the trailing ``str'', and set its sh_link
3791 1.1 skrll field to point to this section. */
3792 1.1 skrll if (CONST_STRNEQ (sec->name, ".stab")
3793 1.1 skrll && strcmp (sec->name + strlen (sec->name) - 3, "str") == 0)
3794 1.1 skrll {
3795 1.1 skrll size_t len;
3796 1.1 skrll char *alc;
3797 1.3 christos
3798 1.1 skrll len = strlen (sec->name);
3799 1.1 skrll alc = (char *) bfd_malloc (len - 2);
3800 1.1 skrll if (alc == NULL)
3801 1.1 skrll return FALSE;
3802 1.1 skrll memcpy (alc, sec->name, len - 3);
3803 1.1 skrll alc[len - 3] = '\0';
3804 1.1 skrll s = bfd_get_section_by_name (abfd, alc);
3805 1.1 skrll free (alc);
3806 1.1 skrll if (s != NULL)
3807 1.1 skrll {
3808 1.1 skrll elf_section_data (s)->this_hdr.sh_link = d->this_idx;
3809 1.1 skrll
3810 1.1 skrll /* This is a .stab section. */
3811 1.1 skrll if (elf_section_data (s)->this_hdr.sh_entsize == 0)
3812 1.1 skrll elf_section_data (s)->this_hdr.sh_entsize
3813 1.1 skrll = 4 + 2 * bfd_get_arch_size (abfd) / 8;
3814 1.1 skrll }
3815 1.1 skrll }
3816 1.1 skrll break;
3817 1.1 skrll
3818 1.1 skrll case SHT_DYNAMIC:
3819 1.1 skrll case SHT_DYNSYM:
3820 1.1 skrll case SHT_GNU_verneed:
3821 1.1 skrll case SHT_GNU_verdef:
3822 1.1 skrll /* sh_link is the section header index of the string table
3823 1.1 skrll used for the dynamic entries, or the symbol table, or the
3824 1.1 skrll version strings. */
3825 1.1 skrll s = bfd_get_section_by_name (abfd, ".dynstr");
3826 1.1 skrll if (s != NULL)
3827 1.1 skrll d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3828 1.1 skrll break;
3829 1.1 skrll
3830 1.1 skrll case SHT_GNU_LIBLIST:
3831 1.1 skrll /* sh_link is the section header index of the prelink library
3832 1.1 skrll list used for the dynamic entries, or the symbol table, or
3833 1.1 skrll the version strings. */
3834 1.1 skrll s = bfd_get_section_by_name (abfd, (sec->flags & SEC_ALLOC)
3835 1.1 skrll ? ".dynstr" : ".gnu.libstr");
3836 1.1 skrll if (s != NULL)
3837 1.1 skrll d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3838 1.1 skrll break;
3839 1.1 skrll
3840 1.1 skrll case SHT_HASH:
3841 1.1 skrll case SHT_GNU_HASH:
3842 1.1 skrll case SHT_GNU_versym:
3843 1.1 skrll /* sh_link is the section header index of the symbol table
3844 1.1 skrll this hash table or version table is for. */
3845 1.1 skrll s = bfd_get_section_by_name (abfd, ".dynsym");
3846 1.1 skrll if (s != NULL)
3847 1.1 skrll d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3848 1.1 skrll break;
3849 1.6 christos
3850 1.1 skrll case SHT_GROUP:
3851 1.1 skrll d->this_hdr.sh_link = elf_onesymtab (abfd);
3852 1.1 skrll }
3853 1.6 christos }
3854 1.6 christos
3855 1.6 christos /* Delay setting sh_name to _bfd_elf_write_object_contents so that
3856 1.6 christos _bfd_elf_assign_file_positions_for_non_load can convert DWARF
3857 1.1 skrll debug section name from .debug_* to .zdebug_* if needed. */
3858 1.1 skrll
3859 1.1 skrll return TRUE;
3860 1.1 skrll }
3861 1.1 skrll
3862 1.1 skrll static bfd_boolean
3863 1.1 skrll sym_is_global (bfd *abfd, asymbol *sym)
3864 1.1 skrll {
3865 1.1 skrll /* If the backend has a special mapping, use it. */
3866 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3867 1.1 skrll if (bed->elf_backend_sym_is_global)
3868 1.3 christos return (*bed->elf_backend_sym_is_global) (abfd, sym);
3869 1.1 skrll
3870 1.1 skrll return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
3871 1.1 skrll || bfd_is_und_section (bfd_get_section (sym))
3872 1.1 skrll || bfd_is_com_section (bfd_get_section (sym)));
3873 1.1 skrll }
3874 1.5 christos
3875 1.1 skrll /* Don't output section symbols for sections that are not going to be
3876 1.1 skrll output, that are duplicates or there is no BFD section. */
3877 1.1 skrll
3878 1.1 skrll static bfd_boolean
3879 1.5 christos ignore_section_sym (bfd *abfd, asymbol *sym)
3880 1.5 christos {
3881 1.5 christos elf_symbol_type *type_ptr;
3882 1.5 christos
3883 1.5 christos if ((sym->flags & BSF_SECTION_SYM) == 0)
3884 1.5 christos return FALSE;
3885 1.5 christos
3886 1.5 christos type_ptr = elf_symbol_from (abfd, sym);
3887 1.5 christos return ((type_ptr != NULL
3888 1.5 christos && type_ptr->internal_elf_sym.st_shndx != 0
3889 1.1 skrll && bfd_is_abs_section (sym->section))
3890 1.5 christos || !(sym->section->owner == abfd
3891 1.5 christos || (sym->section->output_section->owner == abfd
3892 1.1 skrll && sym->section->output_offset == 0)
3893 1.1 skrll || bfd_is_abs_section (sym->section)));
3894 1.5 christos }
3895 1.5 christos
3896 1.5 christos /* Map symbol from it's internal number to the external number, moving
3897 1.1 skrll all local symbols to be at the head of the list. */
3898 1.6 christos
3899 1.1 skrll static bfd_boolean
3900 1.1 skrll elf_map_symbols (bfd *abfd, unsigned int *pnum_locals)
3901 1.1 skrll {
3902 1.1 skrll unsigned int symcount = bfd_get_symcount (abfd);
3903 1.1 skrll asymbol **syms = bfd_get_outsymbols (abfd);
3904 1.1 skrll asymbol **sect_syms;
3905 1.1 skrll unsigned int num_locals = 0;
3906 1.1 skrll unsigned int num_globals = 0;
3907 1.6 christos unsigned int num_locals2 = 0;
3908 1.1 skrll unsigned int num_globals2 = 0;
3909 1.1 skrll unsigned int max_index = 0;
3910 1.1 skrll unsigned int idx;
3911 1.1 skrll asection *asect;
3912 1.1 skrll asymbol **new_syms;
3913 1.1 skrll
3914 1.1 skrll #ifdef DEBUG
3915 1.1 skrll fprintf (stderr, "elf_map_symbols\n");
3916 1.1 skrll fflush (stderr);
3917 1.1 skrll #endif
3918 1.1 skrll
3919 1.1 skrll for (asect = abfd->sections; asect; asect = asect->next)
3920 1.1 skrll {
3921 1.1 skrll if (max_index < asect->index)
3922 1.1 skrll max_index = asect->index;
3923 1.1 skrll }
3924 1.3 christos
3925 1.1 skrll max_index++;
3926 1.1 skrll sect_syms = (asymbol **) bfd_zalloc2 (abfd, max_index, sizeof (asymbol *));
3927 1.1 skrll if (sect_syms == NULL)
3928 1.1 skrll return FALSE;
3929 1.1 skrll elf_section_syms (abfd) = sect_syms;
3930 1.1 skrll elf_num_section_syms (abfd) = max_index;
3931 1.1 skrll
3932 1.1 skrll /* Init sect_syms entries for any section symbols we have already
3933 1.1 skrll decided to output. */
3934 1.1 skrll for (idx = 0; idx < symcount; idx++)
3935 1.1 skrll {
3936 1.1 skrll asymbol *sym = syms[idx];
3937 1.1 skrll
3938 1.5 christos if ((sym->flags & BSF_SECTION_SYM) != 0
3939 1.5 christos && sym->value == 0
3940 1.1 skrll && !ignore_section_sym (abfd, sym)
3941 1.1 skrll && !bfd_is_abs_section (sym->section))
3942 1.1 skrll {
3943 1.1 skrll asection *sec = sym->section;
3944 1.1 skrll
3945 1.1 skrll if (sec->owner != abfd)
3946 1.1 skrll sec = sec->output_section;
3947 1.1 skrll
3948 1.1 skrll sect_syms[sec->index] = syms[idx];
3949 1.1 skrll }
3950 1.1 skrll }
3951 1.1 skrll
3952 1.1 skrll /* Classify all of the symbols. */
3953 1.5 christos for (idx = 0; idx < symcount; idx++)
3954 1.5 christos {
3955 1.5 christos if (sym_is_global (abfd, syms[idx]))
3956 1.1 skrll num_globals++;
3957 1.1 skrll else if (!ignore_section_sym (abfd, syms[idx]))
3958 1.1 skrll num_locals++;
3959 1.1 skrll }
3960 1.1 skrll
3961 1.1 skrll /* We will be adding a section symbol for each normal BFD section. Most
3962 1.1 skrll sections will already have a section symbol in outsymbols, but
3963 1.1 skrll eg. SHT_GROUP sections will not, and we need the section symbol mapped
3964 1.1 skrll at least in that case. */
3965 1.1 skrll for (asect = abfd->sections; asect; asect = asect->next)
3966 1.1 skrll {
3967 1.1 skrll if (sect_syms[asect->index] == NULL)
3968 1.1 skrll {
3969 1.1 skrll if (!sym_is_global (abfd, asect->symbol))
3970 1.1 skrll num_locals++;
3971 1.1 skrll else
3972 1.1 skrll num_globals++;
3973 1.1 skrll }
3974 1.1 skrll }
3975 1.3 christos
3976 1.3 christos /* Now sort the symbols so the local symbols are first. */
3977 1.1 skrll new_syms = (asymbol **) bfd_alloc2 (abfd, num_locals + num_globals,
3978 1.1 skrll sizeof (asymbol *));
3979 1.1 skrll
3980 1.1 skrll if (new_syms == NULL)
3981 1.1 skrll return FALSE;
3982 1.1 skrll
3983 1.1 skrll for (idx = 0; idx < symcount; idx++)
3984 1.1 skrll {
3985 1.1 skrll asymbol *sym = syms[idx];
3986 1.5 christos unsigned int i;
3987 1.5 christos
3988 1.5 christos if (sym_is_global (abfd, sym))
3989 1.1 skrll i = num_locals + num_globals2++;
3990 1.1 skrll else if (!ignore_section_sym (abfd, sym))
3991 1.5 christos i = num_locals2++;
3992 1.1 skrll else
3993 1.1 skrll continue;
3994 1.1 skrll new_syms[i] = sym;
3995 1.1 skrll sym->udata.i = i + 1;
3996 1.1 skrll }
3997 1.1 skrll for (asect = abfd->sections; asect; asect = asect->next)
3998 1.1 skrll {
3999 1.1 skrll if (sect_syms[asect->index] == NULL)
4000 1.1 skrll {
4001 1.1 skrll asymbol *sym = asect->symbol;
4002 1.1 skrll unsigned int i;
4003 1.1 skrll
4004 1.1 skrll sect_syms[asect->index] = sym;
4005 1.1 skrll if (!sym_is_global (abfd, sym))
4006 1.1 skrll i = num_locals2++;
4007 1.1 skrll else
4008 1.1 skrll i = num_locals + num_globals2++;
4009 1.1 skrll new_syms[i] = sym;
4010 1.1 skrll sym->udata.i = i + 1;
4011 1.1 skrll }
4012 1.1 skrll }
4013 1.1 skrll
4014 1.6 christos bfd_set_symtab (abfd, new_syms, num_locals + num_globals);
4015 1.1 skrll
4016 1.1 skrll *pnum_locals = num_locals;
4017 1.1 skrll return TRUE;
4018 1.1 skrll }
4019 1.1 skrll
4020 1.1 skrll /* Align to the maximum file alignment that could be required for any
4021 1.1 skrll ELF data structure. */
4022 1.1 skrll
4023 1.1 skrll static inline file_ptr
4024 1.1 skrll align_file_position (file_ptr off, int align)
4025 1.1 skrll {
4026 1.1 skrll return (off + align - 1) & ~(align - 1);
4027 1.1 skrll }
4028 1.1 skrll
4029 1.1 skrll /* Assign a file position to a section, optionally aligning to the
4030 1.1 skrll required section alignment. */
4031 1.1 skrll
4032 1.1 skrll file_ptr
4033 1.1 skrll _bfd_elf_assign_file_position_for_section (Elf_Internal_Shdr *i_shdrp,
4034 1.1 skrll file_ptr offset,
4035 1.1 skrll bfd_boolean align)
4036 1.1 skrll {
4037 1.1 skrll if (align && i_shdrp->sh_addralign > 1)
4038 1.1 skrll offset = BFD_ALIGN (offset, i_shdrp->sh_addralign);
4039 1.1 skrll i_shdrp->sh_offset = offset;
4040 1.1 skrll if (i_shdrp->bfd_section != NULL)
4041 1.1 skrll i_shdrp->bfd_section->filepos = offset;
4042 1.1 skrll if (i_shdrp->sh_type != SHT_NOBITS)
4043 1.1 skrll offset += i_shdrp->sh_size;
4044 1.1 skrll return offset;
4045 1.1 skrll }
4046 1.1 skrll
4047 1.1 skrll /* Compute the file positions we are going to put the sections at, and
4048 1.1 skrll otherwise prepare to begin writing out the ELF file. If LINK_INFO
4049 1.1 skrll is not NULL, this is being called by the ELF backend linker. */
4050 1.1 skrll
4051 1.1 skrll bfd_boolean
4052 1.1 skrll _bfd_elf_compute_section_file_positions (bfd *abfd,
4053 1.1 skrll struct bfd_link_info *link_info)
4054 1.3 christos {
4055 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
4056 1.6 christos struct fake_section_arg fsargs;
4057 1.1 skrll bfd_boolean failed;
4058 1.3 christos struct elf_strtab_hash *strtab = NULL;
4059 1.1 skrll Elf_Internal_Shdr *shstrtab_hdr;
4060 1.1 skrll bfd_boolean need_symtab;
4061 1.1 skrll
4062 1.1 skrll if (abfd->output_has_begun)
4063 1.1 skrll return TRUE;
4064 1.1 skrll
4065 1.1 skrll /* Do any elf backend specific processing first. */
4066 1.1 skrll if (bed->elf_backend_begin_write_processing)
4067 1.1 skrll (*bed->elf_backend_begin_write_processing) (abfd, link_info);
4068 1.1 skrll
4069 1.1 skrll if (! prep_headers (abfd))
4070 1.1 skrll return FALSE;
4071 1.6 christos
4072 1.1 skrll /* Post process the headers if necessary. */
4073 1.3 christos (*bed->elf_backend_post_process_headers) (abfd, link_info);
4074 1.3 christos
4075 1.3 christos fsargs.failed = FALSE;
4076 1.3 christos fsargs.link_info = link_info;
4077 1.1 skrll bfd_map_over_sections (abfd, elf_fake_sections, &fsargs);
4078 1.1 skrll if (fsargs.failed)
4079 1.1 skrll return FALSE;
4080 1.1 skrll
4081 1.1 skrll if (!assign_section_numbers (abfd, link_info))
4082 1.1 skrll return FALSE;
4083 1.3 christos
4084 1.3 christos /* The backend linker builds symbol table information itself. */
4085 1.3 christos need_symtab = (link_info == NULL
4086 1.3 christos && (bfd_get_symcount (abfd) > 0
4087 1.3 christos || ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC))
4088 1.1 skrll == HAS_RELOC)));
4089 1.1 skrll if (need_symtab)
4090 1.1 skrll {
4091 1.1 skrll /* Non-zero if doing a relocatable link. */
4092 1.1 skrll int relocatable_p = ! (abfd->flags & (EXEC_P | DYNAMIC));
4093 1.1 skrll
4094 1.1 skrll if (! swap_out_syms (abfd, &strtab, relocatable_p))
4095 1.1 skrll return FALSE;
4096 1.3 christos }
4097 1.1 skrll
4098 1.1 skrll failed = FALSE;
4099 1.1 skrll if (link_info == NULL)
4100 1.1 skrll {
4101 1.1 skrll bfd_map_over_sections (abfd, bfd_elf_set_group_contents, &failed);
4102 1.1 skrll if (failed)
4103 1.1 skrll return FALSE;
4104 1.1 skrll }
4105 1.1 skrll
4106 1.1 skrll shstrtab_hdr = &elf_tdata (abfd)->shstrtab_hdr;
4107 1.6.2.1 pgoyette /* sh_name was set in prep_headers. */
4108 1.1 skrll shstrtab_hdr->sh_type = SHT_STRTAB;
4109 1.6 christos shstrtab_hdr->sh_flags = bed->elf_strtab_flags;
4110 1.1 skrll shstrtab_hdr->sh_addr = 0;
4111 1.1 skrll /* sh_size is set in _bfd_elf_assign_file_positions_for_non_load. */
4112 1.1 skrll shstrtab_hdr->sh_entsize = 0;
4113 1.6 christos shstrtab_hdr->sh_link = 0;
4114 1.1 skrll shstrtab_hdr->sh_info = 0;
4115 1.1 skrll /* sh_offset is set in _bfd_elf_assign_file_positions_for_non_load. */
4116 1.1 skrll shstrtab_hdr->sh_addralign = 1;
4117 1.1 skrll
4118 1.1 skrll if (!assign_file_positions_except_relocs (abfd, link_info))
4119 1.3 christos return FALSE;
4120 1.1 skrll
4121 1.1 skrll if (need_symtab)
4122 1.1 skrll {
4123 1.1 skrll file_ptr off;
4124 1.6 christos Elf_Internal_Shdr *hdr;
4125 1.1 skrll
4126 1.6 christos off = elf_next_file_pos (abfd);
4127 1.1 skrll
4128 1.1 skrll hdr = & elf_symtab_hdr (abfd);
4129 1.6 christos off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
4130 1.6 christos
4131 1.6 christos if (elf_symtab_shndx_list (abfd) != NULL)
4132 1.6 christos {
4133 1.6 christos hdr = & elf_symtab_shndx_list (abfd)->hdr;
4134 1.6 christos if (hdr->sh_size != 0)
4135 1.6 christos off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
4136 1.1 skrll /* FIXME: What about other symtab_shndx sections in the list ? */
4137 1.1 skrll }
4138 1.1 skrll
4139 1.1 skrll hdr = &elf_tdata (abfd)->strtab_hdr;
4140 1.6 christos off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
4141 1.1 skrll
4142 1.1 skrll elf_next_file_pos (abfd) = off;
4143 1.1 skrll
4144 1.1 skrll /* Now that we know where the .strtab section goes, write it
4145 1.6 christos out. */
4146 1.1 skrll if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
4147 1.6 christos || ! _bfd_elf_strtab_emit (abfd, strtab))
4148 1.1 skrll return FALSE;
4149 1.1 skrll _bfd_elf_strtab_free (strtab);
4150 1.1 skrll }
4151 1.1 skrll
4152 1.1 skrll abfd->output_has_begun = TRUE;
4153 1.1 skrll
4154 1.1 skrll return TRUE;
4155 1.1 skrll }
4156 1.1 skrll
4157 1.1 skrll /* Make an initial estimate of the size of the program header. If we
4158 1.1 skrll get the number wrong here, we'll redo section placement. */
4159 1.1 skrll
4160 1.1 skrll static bfd_size_type
4161 1.1 skrll get_program_header_size (bfd *abfd, struct bfd_link_info *info)
4162 1.1 skrll {
4163 1.1 skrll size_t segs;
4164 1.1 skrll asection *s;
4165 1.1 skrll const struct elf_backend_data *bed;
4166 1.1 skrll
4167 1.1 skrll /* Assume we will need exactly two PT_LOAD segments: one for text
4168 1.1 skrll and one for data. */
4169 1.1 skrll segs = 2;
4170 1.1 skrll
4171 1.1 skrll s = bfd_get_section_by_name (abfd, ".interp");
4172 1.1 skrll if (s != NULL && (s->flags & SEC_LOAD) != 0)
4173 1.1 skrll {
4174 1.1 skrll /* If we have a loadable interpreter section, we need a
4175 1.1 skrll PT_INTERP segment. In this case, assume we also need a
4176 1.1 skrll PT_PHDR segment, although that may not be true for all
4177 1.1 skrll targets. */
4178 1.1 skrll segs += 2;
4179 1.1 skrll }
4180 1.1 skrll
4181 1.1 skrll if (bfd_get_section_by_name (abfd, ".dynamic") != NULL)
4182 1.1 skrll {
4183 1.1 skrll /* We need a PT_DYNAMIC segment. */
4184 1.1 skrll ++segs;
4185 1.1 skrll }
4186 1.1 skrll
4187 1.1 skrll if (info != NULL && info->relro)
4188 1.1 skrll {
4189 1.1 skrll /* We need a PT_GNU_RELRO segment. */
4190 1.1 skrll ++segs;
4191 1.6 christos }
4192 1.1 skrll
4193 1.1 skrll if (elf_eh_frame_hdr (abfd))
4194 1.1 skrll {
4195 1.1 skrll /* We need a PT_GNU_EH_FRAME segment. */
4196 1.1 skrll ++segs;
4197 1.6 christos }
4198 1.1 skrll
4199 1.1 skrll if (elf_stack_flags (abfd))
4200 1.1 skrll {
4201 1.1 skrll /* We need a PT_GNU_STACK segment. */
4202 1.1 skrll ++segs;
4203 1.1 skrll }
4204 1.1 skrll
4205 1.1 skrll for (s = abfd->sections; s != NULL; s = s->next)
4206 1.1 skrll {
4207 1.1 skrll if ((s->flags & SEC_LOAD) != 0
4208 1.1 skrll && CONST_STRNEQ (s->name, ".note"))
4209 1.1 skrll {
4210 1.1 skrll /* We need a PT_NOTE segment. */
4211 1.1 skrll ++segs;
4212 1.1 skrll /* Try to create just one PT_NOTE segment
4213 1.1 skrll for all adjacent loadable .note* sections.
4214 1.1 skrll gABI requires that within a PT_NOTE segment
4215 1.1 skrll (and also inside of each SHT_NOTE section)
4216 1.1 skrll each note is padded to a multiple of 4 size,
4217 1.1 skrll so we check whether the sections are correctly
4218 1.1 skrll aligned. */
4219 1.1 skrll if (s->alignment_power == 2)
4220 1.1 skrll while (s->next != NULL
4221 1.1 skrll && s->next->alignment_power == 2
4222 1.1 skrll && (s->next->flags & SEC_LOAD) != 0
4223 1.1 skrll && CONST_STRNEQ (s->next->name, ".note"))
4224 1.1 skrll s = s->next;
4225 1.1 skrll }
4226 1.1 skrll }
4227 1.1 skrll
4228 1.1 skrll for (s = abfd->sections; s != NULL; s = s->next)
4229 1.1 skrll {
4230 1.1 skrll if (s->flags & SEC_THREAD_LOCAL)
4231 1.1 skrll {
4232 1.1 skrll /* We need a PT_TLS segment. */
4233 1.1 skrll ++segs;
4234 1.1 skrll break;
4235 1.1 skrll }
4236 1.1 skrll }
4237 1.1 skrll
4238 1.1 skrll /* Let the backend count up any program headers it might need. */
4239 1.1 skrll bed = get_elf_backend_data (abfd);
4240 1.1 skrll if (bed->elf_backend_additional_program_headers)
4241 1.1 skrll {
4242 1.1 skrll int a;
4243 1.1 skrll
4244 1.1 skrll a = (*bed->elf_backend_additional_program_headers) (abfd, info);
4245 1.1 skrll if (a == -1)
4246 1.1 skrll abort ();
4247 1.1 skrll segs += a;
4248 1.1 skrll }
4249 1.1 skrll
4250 1.1 skrll return segs * bed->s->sizeof_phdr;
4251 1.1 skrll }
4252 1.1 skrll
4253 1.1 skrll /* Find the segment that contains the output_section of section. */
4254 1.1 skrll
4255 1.1 skrll Elf_Internal_Phdr *
4256 1.1 skrll _bfd_elf_find_segment_containing_section (bfd * abfd, asection * section)
4257 1.1 skrll {
4258 1.1 skrll struct elf_segment_map *m;
4259 1.6 christos Elf_Internal_Phdr *p;
4260 1.1 skrll
4261 1.1 skrll for (m = elf_seg_map (abfd), p = elf_tdata (abfd)->phdr;
4262 1.1 skrll m != NULL;
4263 1.1 skrll m = m->next, p++)
4264 1.1 skrll {
4265 1.1 skrll int i;
4266 1.1 skrll
4267 1.1 skrll for (i = m->count - 1; i >= 0; i--)
4268 1.1 skrll if (m->sections[i] == section)
4269 1.1 skrll return p;
4270 1.1 skrll }
4271 1.1 skrll
4272 1.1 skrll return NULL;
4273 1.1 skrll }
4274 1.1 skrll
4275 1.1 skrll /* Create a mapping from a set of sections to a program segment. */
4276 1.1 skrll
4277 1.1 skrll static struct elf_segment_map *
4278 1.1 skrll make_mapping (bfd *abfd,
4279 1.1 skrll asection **sections,
4280 1.1 skrll unsigned int from,
4281 1.1 skrll unsigned int to,
4282 1.1 skrll bfd_boolean phdr)
4283 1.1 skrll {
4284 1.1 skrll struct elf_segment_map *m;
4285 1.1 skrll unsigned int i;
4286 1.1 skrll asection **hdrpp;
4287 1.1 skrll bfd_size_type amt;
4288 1.1 skrll
4289 1.3 christos amt = sizeof (struct elf_segment_map);
4290 1.1 skrll amt += (to - from - 1) * sizeof (asection *);
4291 1.1 skrll m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
4292 1.1 skrll if (m == NULL)
4293 1.1 skrll return NULL;
4294 1.1 skrll m->next = NULL;
4295 1.1 skrll m->p_type = PT_LOAD;
4296 1.1 skrll for (i = from, hdrpp = sections + from; i < to; i++, hdrpp++)
4297 1.1 skrll m->sections[i - from] = *hdrpp;
4298 1.1 skrll m->count = to - from;
4299 1.1 skrll
4300 1.1 skrll if (from == 0 && phdr)
4301 1.1 skrll {
4302 1.1 skrll /* Include the headers in the first PT_LOAD segment. */
4303 1.1 skrll m->includes_filehdr = 1;
4304 1.1 skrll m->includes_phdrs = 1;
4305 1.1 skrll }
4306 1.1 skrll
4307 1.1 skrll return m;
4308 1.1 skrll }
4309 1.1 skrll
4310 1.1 skrll /* Create the PT_DYNAMIC segment, which includes DYNSEC. Returns NULL
4311 1.1 skrll on failure. */
4312 1.1 skrll
4313 1.1 skrll struct elf_segment_map *
4314 1.1 skrll _bfd_elf_make_dynamic_segment (bfd *abfd, asection *dynsec)
4315 1.1 skrll {
4316 1.3 christos struct elf_segment_map *m;
4317 1.3 christos
4318 1.1 skrll m = (struct elf_segment_map *) bfd_zalloc (abfd,
4319 1.1 skrll sizeof (struct elf_segment_map));
4320 1.1 skrll if (m == NULL)
4321 1.1 skrll return NULL;
4322 1.1 skrll m->next = NULL;
4323 1.1 skrll m->p_type = PT_DYNAMIC;
4324 1.1 skrll m->count = 1;
4325 1.1 skrll m->sections[0] = dynsec;
4326 1.1 skrll
4327 1.1 skrll return m;
4328 1.1 skrll }
4329 1.1 skrll
4330 1.1 skrll /* Possibly add or remove segments from the segment map. */
4331 1.1 skrll
4332 1.1 skrll static bfd_boolean
4333 1.1 skrll elf_modify_segment_map (bfd *abfd,
4334 1.1 skrll struct bfd_link_info *info,
4335 1.1 skrll bfd_boolean remove_empty_load)
4336 1.1 skrll {
4337 1.1 skrll struct elf_segment_map **m;
4338 1.1 skrll const struct elf_backend_data *bed;
4339 1.1 skrll
4340 1.1 skrll /* The placement algorithm assumes that non allocated sections are
4341 1.1 skrll not in PT_LOAD segments. We ensure this here by removing such
4342 1.1 skrll sections from the segment map. We also remove excluded
4343 1.6 christos sections. Finally, any PT_LOAD segment without sections is
4344 1.1 skrll removed. */
4345 1.1 skrll m = &elf_seg_map (abfd);
4346 1.1 skrll while (*m)
4347 1.1 skrll {
4348 1.1 skrll unsigned int i, new_count;
4349 1.1 skrll
4350 1.1 skrll for (new_count = 0, i = 0; i < (*m)->count; i++)
4351 1.1 skrll {
4352 1.1 skrll if (((*m)->sections[i]->flags & SEC_EXCLUDE) == 0
4353 1.1 skrll && (((*m)->sections[i]->flags & SEC_ALLOC) != 0
4354 1.1 skrll || (*m)->p_type != PT_LOAD))
4355 1.1 skrll {
4356 1.1 skrll (*m)->sections[new_count] = (*m)->sections[i];
4357 1.1 skrll new_count++;
4358 1.1 skrll }
4359 1.1 skrll }
4360 1.1 skrll (*m)->count = new_count;
4361 1.1 skrll
4362 1.1 skrll if (remove_empty_load && (*m)->p_type == PT_LOAD && (*m)->count == 0)
4363 1.1 skrll *m = (*m)->next;
4364 1.1 skrll else
4365 1.1 skrll m = &(*m)->next;
4366 1.1 skrll }
4367 1.1 skrll
4368 1.1 skrll bed = get_elf_backend_data (abfd);
4369 1.1 skrll if (bed->elf_backend_modify_segment_map != NULL)
4370 1.1 skrll {
4371 1.1 skrll if (!(*bed->elf_backend_modify_segment_map) (abfd, info))
4372 1.1 skrll return FALSE;
4373 1.1 skrll }
4374 1.1 skrll
4375 1.1 skrll return TRUE;
4376 1.1 skrll }
4377 1.1 skrll
4378 1.1 skrll /* Set up a mapping from BFD sections to program segments. */
4379 1.1 skrll
4380 1.1 skrll bfd_boolean
4381 1.1 skrll _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
4382 1.1 skrll {
4383 1.1 skrll unsigned int count;
4384 1.1 skrll struct elf_segment_map *m;
4385 1.1 skrll asection **sections = NULL;
4386 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
4387 1.6 christos bfd_boolean no_user_phdrs;
4388 1.5 christos
4389 1.5 christos no_user_phdrs = elf_seg_map (abfd) == NULL;
4390 1.5 christos
4391 1.5 christos if (info != NULL)
4392 1.1 skrll info->user_phdrs = !no_user_phdrs;
4393 1.1 skrll
4394 1.1 skrll if (no_user_phdrs && bfd_count_sections (abfd) != 0)
4395 1.1 skrll {
4396 1.1 skrll asection *s;
4397 1.1 skrll unsigned int i;
4398 1.1 skrll struct elf_segment_map *mfirst;
4399 1.1 skrll struct elf_segment_map **pm;
4400 1.1 skrll asection *last_hdr;
4401 1.1 skrll bfd_vma last_size;
4402 1.1 skrll unsigned int phdr_index;
4403 1.1 skrll bfd_vma maxpagesize;
4404 1.1 skrll asection **hdrpp;
4405 1.1 skrll bfd_boolean phdr_in_segment = TRUE;
4406 1.1 skrll bfd_boolean writable;
4407 1.1 skrll int tls_count = 0;
4408 1.1 skrll asection *first_tls = NULL;
4409 1.3 christos asection *dynsec, *eh_frame_hdr;
4410 1.1 skrll bfd_size_type amt;
4411 1.1 skrll bfd_vma addr_mask, wrap_to = 0;
4412 1.1 skrll
4413 1.3 christos /* Select the allocated sections, and sort them. */
4414 1.3 christos
4415 1.1 skrll sections = (asection **) bfd_malloc2 (bfd_count_sections (abfd),
4416 1.1 skrll sizeof (asection *));
4417 1.1 skrll if (sections == NULL)
4418 1.3 christos goto error_return;
4419 1.3 christos
4420 1.3 christos /* Calculate top address, avoiding undefined behaviour of shift
4421 1.3 christos left operator when shift count is equal to size of type
4422 1.3 christos being shifted. */
4423 1.3 christos addr_mask = ((bfd_vma) 1 << (bfd_arch_bits_per_address (abfd) - 1)) - 1;
4424 1.1 skrll addr_mask = (addr_mask << 1) + 1;
4425 1.1 skrll
4426 1.1 skrll i = 0;
4427 1.1 skrll for (s = abfd->sections; s != NULL; s = s->next)
4428 1.1 skrll {
4429 1.1 skrll if ((s->flags & SEC_ALLOC) != 0)
4430 1.1 skrll {
4431 1.3 christos sections[i] = s;
4432 1.3 christos ++i;
4433 1.3 christos /* A wrapping section potentially clashes with header. */
4434 1.1 skrll if (((s->lma + s->size) & addr_mask) < (s->lma & addr_mask))
4435 1.1 skrll wrap_to = (s->lma + s->size) & addr_mask;
4436 1.1 skrll }
4437 1.1 skrll }
4438 1.1 skrll BFD_ASSERT (i <= bfd_count_sections (abfd));
4439 1.1 skrll count = i;
4440 1.1 skrll
4441 1.1 skrll qsort (sections, (size_t) count, sizeof (asection *), elf_sort_sections);
4442 1.1 skrll
4443 1.1 skrll /* Build the mapping. */
4444 1.1 skrll
4445 1.1 skrll mfirst = NULL;
4446 1.1 skrll pm = &mfirst;
4447 1.1 skrll
4448 1.1 skrll /* If we have a .interp section, then create a PT_PHDR segment for
4449 1.1 skrll the program headers and a PT_INTERP segment for the .interp
4450 1.1 skrll section. */
4451 1.1 skrll s = bfd_get_section_by_name (abfd, ".interp");
4452 1.1 skrll if (s != NULL && (s->flags & SEC_LOAD) != 0)
4453 1.3 christos {
4454 1.1 skrll amt = sizeof (struct elf_segment_map);
4455 1.1 skrll m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
4456 1.1 skrll if (m == NULL)
4457 1.1 skrll goto error_return;
4458 1.1 skrll m->next = NULL;
4459 1.1 skrll m->p_type = PT_PHDR;
4460 1.1 skrll /* FIXME: UnixWare and Solaris set PF_X, Irix 5 does not. */
4461 1.1 skrll m->p_flags = PF_R | PF_X;
4462 1.1 skrll m->p_flags_valid = 1;
4463 1.1 skrll m->includes_phdrs = 1;
4464 1.1 skrll
4465 1.1 skrll *pm = m;
4466 1.1 skrll pm = &m->next;
4467 1.3 christos
4468 1.1 skrll amt = sizeof (struct elf_segment_map);
4469 1.1 skrll m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
4470 1.1 skrll if (m == NULL)
4471 1.1 skrll goto error_return;
4472 1.1 skrll m->next = NULL;
4473 1.1 skrll m->p_type = PT_INTERP;
4474 1.1 skrll m->count = 1;
4475 1.1 skrll m->sections[0] = s;
4476 1.1 skrll
4477 1.1 skrll *pm = m;
4478 1.1 skrll pm = &m->next;
4479 1.1 skrll }
4480 1.1 skrll
4481 1.1 skrll /* Look through the sections. We put sections in the same program
4482 1.1 skrll segment when the start of the second section can be placed within
4483 1.1 skrll a few bytes of the end of the first section. */
4484 1.1 skrll last_hdr = NULL;
4485 1.1 skrll last_size = 0;
4486 1.6 christos phdr_index = 0;
4487 1.6 christos maxpagesize = bed->maxpagesize;
4488 1.6 christos /* PR 17512: file: c8455299.
4489 1.6 christos Avoid divide-by-zero errors later on.
4490 1.6 christos FIXME: Should we abort if the maxpagesize is zero ? */
4491 1.1 skrll if (maxpagesize == 0)
4492 1.1 skrll maxpagesize = 1;
4493 1.1 skrll writable = FALSE;
4494 1.1 skrll dynsec = bfd_get_section_by_name (abfd, ".dynamic");
4495 1.1 skrll if (dynsec != NULL
4496 1.1 skrll && (dynsec->flags & SEC_LOAD) == 0)
4497 1.1 skrll dynsec = NULL;
4498 1.1 skrll
4499 1.1 skrll /* Deal with -Ttext or something similar such that the first section
4500 1.1 skrll is not adjacent to the program headers. This is an
4501 1.1 skrll approximation, since at this point we don't know exactly how many
4502 1.1 skrll program headers we will need. */
4503 1.6 christos if (count > 0)
4504 1.1 skrll {
4505 1.1 skrll bfd_size_type phdr_size = elf_program_header_size (abfd);
4506 1.1 skrll
4507 1.5 christos if (phdr_size == (bfd_size_type) -1)
4508 1.1 skrll phdr_size = get_program_header_size (abfd, info);
4509 1.3 christos phdr_size += bed->s->sizeof_ehdr;
4510 1.3 christos if ((abfd->flags & D_PAGED) == 0
4511 1.3 christos || (sections[0]->lma & addr_mask) < phdr_size
4512 1.3 christos || ((sections[0]->lma & addr_mask) % maxpagesize
4513 1.1 skrll < phdr_size % maxpagesize)
4514 1.1 skrll || (sections[0]->lma & addr_mask & -maxpagesize) < wrap_to)
4515 1.1 skrll phdr_in_segment = FALSE;
4516 1.1 skrll }
4517 1.1 skrll
4518 1.1 skrll for (i = 0, hdrpp = sections; i < count; i++, hdrpp++)
4519 1.1 skrll {
4520 1.1 skrll asection *hdr;
4521 1.1 skrll bfd_boolean new_segment;
4522 1.1 skrll
4523 1.1 skrll hdr = *hdrpp;
4524 1.1 skrll
4525 1.1 skrll /* See if this section and the last one will fit in the same
4526 1.1 skrll segment. */
4527 1.1 skrll
4528 1.1 skrll if (last_hdr == NULL)
4529 1.1 skrll {
4530 1.1 skrll /* If we don't have a segment yet, then we don't need a new
4531 1.1 skrll one (we build the last one after this loop). */
4532 1.1 skrll new_segment = FALSE;
4533 1.1 skrll }
4534 1.1 skrll else if (last_hdr->lma - last_hdr->vma != hdr->lma - hdr->vma)
4535 1.1 skrll {
4536 1.1 skrll /* If this section has a different relation between the
4537 1.1 skrll virtual address and the load address, then we need a new
4538 1.1 skrll segment. */
4539 1.3 christos new_segment = TRUE;
4540 1.3 christos }
4541 1.3 christos else if (hdr->lma < last_hdr->lma + last_size
4542 1.3 christos || last_hdr->lma + last_size < last_hdr->lma)
4543 1.3 christos {
4544 1.3 christos /* If this section has a load address that makes it overlap
4545 1.3 christos the previous section, then we need a new segment. */
4546 1.1 skrll new_segment = TRUE;
4547 1.1 skrll }
4548 1.1 skrll /* In the next test we have to be careful when last_hdr->lma is close
4549 1.1 skrll to the end of the address space. If the aligned address wraps
4550 1.1 skrll around to the start of the address space, then there are no more
4551 1.1 skrll pages left in memory and it is OK to assume that the current
4552 1.1 skrll section can be included in the current segment. */
4553 1.1 skrll else if ((BFD_ALIGN (last_hdr->lma + last_size, maxpagesize) + maxpagesize
4554 1.1 skrll > last_hdr->lma)
4555 1.1 skrll && (BFD_ALIGN (last_hdr->lma + last_size, maxpagesize) + maxpagesize
4556 1.1 skrll <= hdr->lma))
4557 1.1 skrll {
4558 1.1 skrll /* If putting this section in this segment would force us to
4559 1.1 skrll skip a page in the segment, then we need a new segment. */
4560 1.1 skrll new_segment = TRUE;
4561 1.6 christos }
4562 1.6 christos else if ((last_hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0
4563 1.6 christos && (hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) != 0
4564 1.6 christos && ((abfd->flags & D_PAGED) == 0
4565 1.6 christos || (((last_hdr->lma + last_size - 1) & -maxpagesize)
4566 1.6 christos != (hdr->lma & -maxpagesize))))
4567 1.6 christos {
4568 1.6 christos /* We don't want to put a loaded section after a
4569 1.6 christos nonloaded (ie. bss style) section in the same segment
4570 1.6 christos as that will force the non-loaded section to be loaded.
4571 1.6 christos Consider .tbss sections as loaded for this purpose.
4572 1.6 christos However, like the writable/non-writable case below,
4573 1.1 skrll if they are on the same page then they must be put
4574 1.1 skrll in the same segment. */
4575 1.1 skrll new_segment = TRUE;
4576 1.1 skrll }
4577 1.1 skrll else if ((abfd->flags & D_PAGED) == 0)
4578 1.1 skrll {
4579 1.1 skrll /* If the file is not demand paged, which means that we
4580 1.1 skrll don't require the sections to be correctly aligned in the
4581 1.1 skrll file, then there is no other reason for a new segment. */
4582 1.1 skrll new_segment = FALSE;
4583 1.1 skrll }
4584 1.3 christos else if (! writable
4585 1.3 christos && (hdr->flags & SEC_READONLY) == 0
4586 1.1 skrll && (((last_hdr->lma + last_size - 1) & -maxpagesize)
4587 1.1 skrll != (hdr->lma & -maxpagesize)))
4588 1.1 skrll {
4589 1.1 skrll /* We don't want to put a writable section in a read only
4590 1.1 skrll segment, unless they are on the same page in memory
4591 1.1 skrll anyhow. We already know that the last section does not
4592 1.1 skrll bring us past the current section on the page, so the
4593 1.1 skrll only case in which the new section is not on the same
4594 1.1 skrll page as the previous section is when the previous section
4595 1.1 skrll ends precisely on a page boundary. */
4596 1.1 skrll new_segment = TRUE;
4597 1.1 skrll }
4598 1.1 skrll else
4599 1.1 skrll {
4600 1.1 skrll /* Otherwise, we can use the same segment. */
4601 1.1 skrll new_segment = FALSE;
4602 1.1 skrll }
4603 1.1 skrll
4604 1.1 skrll /* Allow interested parties a chance to override our decision. */
4605 1.1 skrll if (last_hdr != NULL
4606 1.1 skrll && info != NULL
4607 1.1 skrll && info->callbacks->override_segment_assignment != NULL)
4608 1.1 skrll new_segment
4609 1.1 skrll = info->callbacks->override_segment_assignment (info, abfd, hdr,
4610 1.1 skrll last_hdr,
4611 1.1 skrll new_segment);
4612 1.1 skrll
4613 1.1 skrll if (! new_segment)
4614 1.1 skrll {
4615 1.1 skrll if ((hdr->flags & SEC_READONLY) == 0)
4616 1.1 skrll writable = TRUE;
4617 1.1 skrll last_hdr = hdr;
4618 1.1 skrll /* .tbss sections effectively have zero size. */
4619 1.1 skrll if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD))
4620 1.1 skrll != SEC_THREAD_LOCAL)
4621 1.1 skrll last_size = hdr->size;
4622 1.1 skrll else
4623 1.1 skrll last_size = 0;
4624 1.1 skrll continue;
4625 1.1 skrll }
4626 1.1 skrll
4627 1.1 skrll /* We need a new program segment. We must create a new program
4628 1.1 skrll header holding all the sections from phdr_index until hdr. */
4629 1.1 skrll
4630 1.1 skrll m = make_mapping (abfd, sections, phdr_index, i, phdr_in_segment);
4631 1.1 skrll if (m == NULL)
4632 1.1 skrll goto error_return;
4633 1.1 skrll
4634 1.1 skrll *pm = m;
4635 1.1 skrll pm = &m->next;
4636 1.1 skrll
4637 1.1 skrll if ((hdr->flags & SEC_READONLY) == 0)
4638 1.1 skrll writable = TRUE;
4639 1.1 skrll else
4640 1.1 skrll writable = FALSE;
4641 1.1 skrll
4642 1.1 skrll last_hdr = hdr;
4643 1.1 skrll /* .tbss sections effectively have zero size. */
4644 1.1 skrll if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD)) != SEC_THREAD_LOCAL)
4645 1.1 skrll last_size = hdr->size;
4646 1.1 skrll else
4647 1.1 skrll last_size = 0;
4648 1.1 skrll phdr_index = i;
4649 1.1 skrll phdr_in_segment = FALSE;
4650 1.3 christos }
4651 1.3 christos
4652 1.3 christos /* Create a final PT_LOAD program segment, but not if it's just
4653 1.3 christos for .tbss. */
4654 1.3 christos if (last_hdr != NULL
4655 1.3 christos && (i - phdr_index != 1
4656 1.1 skrll || ((last_hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD))
4657 1.1 skrll != SEC_THREAD_LOCAL)))
4658 1.1 skrll {
4659 1.1 skrll m = make_mapping (abfd, sections, phdr_index, i, phdr_in_segment);
4660 1.1 skrll if (m == NULL)
4661 1.1 skrll goto error_return;
4662 1.1 skrll
4663 1.1 skrll *pm = m;
4664 1.1 skrll pm = &m->next;
4665 1.1 skrll }
4666 1.1 skrll
4667 1.1 skrll /* If there is a .dynamic section, throw in a PT_DYNAMIC segment. */
4668 1.1 skrll if (dynsec != NULL)
4669 1.1 skrll {
4670 1.1 skrll m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
4671 1.1 skrll if (m == NULL)
4672 1.1 skrll goto error_return;
4673 1.1 skrll *pm = m;
4674 1.1 skrll pm = &m->next;
4675 1.1 skrll }
4676 1.1 skrll
4677 1.1 skrll /* For each batch of consecutive loadable .note sections,
4678 1.1 skrll add a PT_NOTE segment. We don't use bfd_get_section_by_name,
4679 1.1 skrll because if we link together nonloadable .note sections and
4680 1.1 skrll loadable .note sections, we will generate two .note sections
4681 1.1 skrll in the output file. FIXME: Using names for section types is
4682 1.1 skrll bogus anyhow. */
4683 1.1 skrll for (s = abfd->sections; s != NULL; s = s->next)
4684 1.1 skrll {
4685 1.1 skrll if ((s->flags & SEC_LOAD) != 0
4686 1.1 skrll && CONST_STRNEQ (s->name, ".note"))
4687 1.3 christos {
4688 1.3 christos asection *s2;
4689 1.1 skrll
4690 1.1 skrll count = 1;
4691 1.1 skrll amt = sizeof (struct elf_segment_map);
4692 1.1 skrll if (s->alignment_power == 2)
4693 1.1 skrll for (s2 = s; s2->next != NULL; s2 = s2->next)
4694 1.1 skrll {
4695 1.1 skrll if (s2->next->alignment_power == 2
4696 1.3 christos && (s2->next->flags & SEC_LOAD) != 0
4697 1.3 christos && CONST_STRNEQ (s2->next->name, ".note")
4698 1.1 skrll && align_power (s2->lma + s2->size, 2)
4699 1.1 skrll == s2->next->lma)
4700 1.1 skrll count++;
4701 1.1 skrll else
4702 1.1 skrll break;
4703 1.3 christos }
4704 1.1 skrll amt += (count - 1) * sizeof (asection *);
4705 1.1 skrll m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
4706 1.1 skrll if (m == NULL)
4707 1.1 skrll goto error_return;
4708 1.1 skrll m->next = NULL;
4709 1.1 skrll m->p_type = PT_NOTE;
4710 1.1 skrll m->count = count;
4711 1.1 skrll while (count > 1)
4712 1.1 skrll {
4713 1.1 skrll m->sections[m->count - count--] = s;
4714 1.1 skrll BFD_ASSERT ((s->flags & SEC_THREAD_LOCAL) == 0);
4715 1.1 skrll s = s->next;
4716 1.1 skrll }
4717 1.1 skrll m->sections[m->count - 1] = s;
4718 1.1 skrll BFD_ASSERT ((s->flags & SEC_THREAD_LOCAL) == 0);
4719 1.1 skrll *pm = m;
4720 1.1 skrll pm = &m->next;
4721 1.1 skrll }
4722 1.1 skrll if (s->flags & SEC_THREAD_LOCAL)
4723 1.1 skrll {
4724 1.1 skrll if (! tls_count)
4725 1.1 skrll first_tls = s;
4726 1.1 skrll tls_count++;
4727 1.1 skrll }
4728 1.1 skrll }
4729 1.1 skrll
4730 1.1 skrll /* If there are any SHF_TLS output sections, add PT_TLS segment. */
4731 1.1 skrll if (tls_count > 0)
4732 1.1 skrll {
4733 1.3 christos amt = sizeof (struct elf_segment_map);
4734 1.1 skrll amt += (tls_count - 1) * sizeof (asection *);
4735 1.1 skrll m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
4736 1.1 skrll if (m == NULL)
4737 1.1 skrll goto error_return;
4738 1.1 skrll m->next = NULL;
4739 1.1 skrll m->p_type = PT_TLS;
4740 1.1 skrll m->count = tls_count;
4741 1.1 skrll /* Mandated PF_R. */
4742 1.6 christos m->p_flags = PF_R;
4743 1.3 christos m->p_flags_valid = 1;
4744 1.1 skrll s = first_tls;
4745 1.6 christos for (i = 0; i < (unsigned int) tls_count; ++i)
4746 1.6 christos {
4747 1.6 christos if ((s->flags & SEC_THREAD_LOCAL) == 0)
4748 1.6 christos {
4749 1.6 christos _bfd_error_handler
4750 1.6 christos (_("%B: TLS sections are not adjacent:"), abfd);
4751 1.6 christos s = first_tls;
4752 1.6 christos i = 0;
4753 1.6 christos while (i < (unsigned int) tls_count)
4754 1.6 christos {
4755 1.6 christos if ((s->flags & SEC_THREAD_LOCAL) != 0)
4756 1.6 christos {
4757 1.6 christos _bfd_error_handler (_(" TLS: %A"), s);
4758 1.6 christos i++;
4759 1.6 christos }
4760 1.6 christos else
4761 1.6 christos _bfd_error_handler (_(" non-TLS: %A"), s);
4762 1.6 christos s = s->next;
4763 1.6 christos }
4764 1.6 christos bfd_set_error (bfd_error_bad_value);
4765 1.6 christos goto error_return;
4766 1.6 christos }
4767 1.1 skrll m->sections[i] = s;
4768 1.1 skrll s = s->next;
4769 1.1 skrll }
4770 1.1 skrll
4771 1.1 skrll *pm = m;
4772 1.1 skrll pm = &m->next;
4773 1.1 skrll }
4774 1.1 skrll
4775 1.6 christos /* If there is a .eh_frame_hdr section, throw in a PT_GNU_EH_FRAME
4776 1.1 skrll segment. */
4777 1.1 skrll eh_frame_hdr = elf_eh_frame_hdr (abfd);
4778 1.1 skrll if (eh_frame_hdr != NULL
4779 1.1 skrll && (eh_frame_hdr->output_section->flags & SEC_LOAD) != 0)
4780 1.3 christos {
4781 1.1 skrll amt = sizeof (struct elf_segment_map);
4782 1.1 skrll m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
4783 1.1 skrll if (m == NULL)
4784 1.1 skrll goto error_return;
4785 1.1 skrll m->next = NULL;
4786 1.1 skrll m->p_type = PT_GNU_EH_FRAME;
4787 1.1 skrll m->count = 1;
4788 1.1 skrll m->sections[0] = eh_frame_hdr->output_section;
4789 1.1 skrll
4790 1.1 skrll *pm = m;
4791 1.1 skrll pm = &m->next;
4792 1.6 christos }
4793 1.1 skrll
4794 1.1 skrll if (elf_stack_flags (abfd))
4795 1.3 christos {
4796 1.1 skrll amt = sizeof (struct elf_segment_map);
4797 1.1 skrll m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
4798 1.1 skrll if (m == NULL)
4799 1.1 skrll goto error_return;
4800 1.6 christos m->next = NULL;
4801 1.6 christos m->p_type = PT_GNU_STACK;
4802 1.1 skrll m->p_flags = elf_stack_flags (abfd);
4803 1.6 christos m->p_align = bed->stack_align;
4804 1.6 christos m->p_flags_valid = 1;
4805 1.6 christos m->p_align_valid = m->p_align != 0;
4806 1.6 christos if (info->stacksize > 0)
4807 1.6 christos {
4808 1.6 christos m->p_size = info->stacksize;
4809 1.1 skrll m->p_size_valid = 1;
4810 1.1 skrll }
4811 1.1 skrll
4812 1.1 skrll *pm = m;
4813 1.1 skrll pm = &m->next;
4814 1.1 skrll }
4815 1.1 skrll
4816 1.1 skrll if (info != NULL && info->relro)
4817 1.1 skrll {
4818 1.5 christos for (m = mfirst; m != NULL; m = m->next)
4819 1.5 christos {
4820 1.5 christos if (m->p_type == PT_LOAD
4821 1.5 christos && m->count != 0
4822 1.5 christos && m->sections[0]->vma >= info->relro_start
4823 1.5 christos && m->sections[0]->vma < info->relro_end)
4824 1.5 christos {
4825 1.5 christos i = m->count;
4826 1.5 christos while (--i != (unsigned) -1)
4827 1.5 christos if ((m->sections[i]->flags & (SEC_LOAD | SEC_HAS_CONTENTS))
4828 1.5 christos == (SEC_LOAD | SEC_HAS_CONTENTS))
4829 1.6 christos break;
4830 1.1 skrll
4831 1.1 skrll if (i != (unsigned) -1)
4832 1.5 christos break;
4833 1.1 skrll }
4834 1.1 skrll }
4835 1.1 skrll
4836 1.1 skrll /* Make a PT_GNU_RELRO segment only when it isn't empty. */
4837 1.1 skrll if (m != NULL)
4838 1.3 christos {
4839 1.1 skrll amt = sizeof (struct elf_segment_map);
4840 1.1 skrll m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
4841 1.1 skrll if (m == NULL)
4842 1.1 skrll goto error_return;
4843 1.1 skrll m->next = NULL;
4844 1.1 skrll m->p_type = PT_GNU_RELRO;
4845 1.1 skrll *pm = m;
4846 1.1 skrll pm = &m->next;
4847 1.1 skrll }
4848 1.1 skrll }
4849 1.6 christos
4850 1.1 skrll free (sections);
4851 1.1 skrll elf_seg_map (abfd) = mfirst;
4852 1.1 skrll }
4853 1.1 skrll
4854 1.1 skrll if (!elf_modify_segment_map (abfd, info, no_user_phdrs))
4855 1.6 christos return FALSE;
4856 1.1 skrll
4857 1.6 christos for (count = 0, m = elf_seg_map (abfd); m != NULL; m = m->next)
4858 1.1 skrll ++count;
4859 1.1 skrll elf_program_header_size (abfd) = count * bed->s->sizeof_phdr;
4860 1.1 skrll
4861 1.1 skrll return TRUE;
4862 1.1 skrll
4863 1.1 skrll error_return:
4864 1.1 skrll if (sections != NULL)
4865 1.1 skrll free (sections);
4866 1.1 skrll return FALSE;
4867 1.1 skrll }
4868 1.1 skrll
4869 1.1 skrll /* Sort sections by address. */
4870 1.1 skrll
4871 1.1 skrll static int
4872 1.1 skrll elf_sort_sections (const void *arg1, const void *arg2)
4873 1.1 skrll {
4874 1.1 skrll const asection *sec1 = *(const asection **) arg1;
4875 1.1 skrll const asection *sec2 = *(const asection **) arg2;
4876 1.1 skrll bfd_size_type size1, size2;
4877 1.1 skrll
4878 1.1 skrll /* Sort by LMA first, since this is the address used to
4879 1.1 skrll place the section into a segment. */
4880 1.1 skrll if (sec1->lma < sec2->lma)
4881 1.1 skrll return -1;
4882 1.1 skrll else if (sec1->lma > sec2->lma)
4883 1.1 skrll return 1;
4884 1.1 skrll
4885 1.1 skrll /* Then sort by VMA. Normally the LMA and the VMA will be
4886 1.1 skrll the same, and this will do nothing. */
4887 1.1 skrll if (sec1->vma < sec2->vma)
4888 1.1 skrll return -1;
4889 1.1 skrll else if (sec1->vma > sec2->vma)
4890 1.1 skrll return 1;
4891 1.1 skrll
4892 1.1 skrll /* Put !SEC_LOAD sections after SEC_LOAD ones. */
4893 1.1 skrll
4894 1.1 skrll #define TOEND(x) (((x)->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0)
4895 1.1 skrll
4896 1.1 skrll if (TOEND (sec1))
4897 1.1 skrll {
4898 1.1 skrll if (TOEND (sec2))
4899 1.1 skrll {
4900 1.1 skrll /* If the indicies are the same, do not return 0
4901 1.1 skrll here, but continue to try the next comparison. */
4902 1.1 skrll if (sec1->target_index - sec2->target_index != 0)
4903 1.1 skrll return sec1->target_index - sec2->target_index;
4904 1.1 skrll }
4905 1.1 skrll else
4906 1.1 skrll return 1;
4907 1.1 skrll }
4908 1.1 skrll else if (TOEND (sec2))
4909 1.1 skrll return -1;
4910 1.1 skrll
4911 1.1 skrll #undef TOEND
4912 1.1 skrll
4913 1.1 skrll /* Sort by size, to put zero sized sections
4914 1.1 skrll before others at the same address. */
4915 1.1 skrll
4916 1.1 skrll size1 = (sec1->flags & SEC_LOAD) ? sec1->size : 0;
4917 1.1 skrll size2 = (sec2->flags & SEC_LOAD) ? sec2->size : 0;
4918 1.1 skrll
4919 1.1 skrll if (size1 < size2)
4920 1.1 skrll return -1;
4921 1.1 skrll if (size1 > size2)
4922 1.1 skrll return 1;
4923 1.1 skrll
4924 1.1 skrll return sec1->target_index - sec2->target_index;
4925 1.1 skrll }
4926 1.1 skrll
4927 1.1 skrll /* Ian Lance Taylor writes:
4928 1.1 skrll
4929 1.1 skrll We shouldn't be using % with a negative signed number. That's just
4930 1.1 skrll not good. We have to make sure either that the number is not
4931 1.1 skrll negative, or that the number has an unsigned type. When the types
4932 1.1 skrll are all the same size they wind up as unsigned. When file_ptr is a
4933 1.1 skrll larger signed type, the arithmetic winds up as signed long long,
4934 1.1 skrll which is wrong.
4935 1.1 skrll
4936 1.1 skrll What we're trying to say here is something like ``increase OFF by
4937 1.1 skrll the least amount that will cause it to be equal to the VMA modulo
4938 1.1 skrll the page size.'' */
4939 1.1 skrll /* In other words, something like:
4940 1.1 skrll
4941 1.1 skrll vma_offset = m->sections[0]->vma % bed->maxpagesize;
4942 1.1 skrll off_offset = off % bed->maxpagesize;
4943 1.1 skrll if (vma_offset < off_offset)
4944 1.1 skrll adjustment = vma_offset + bed->maxpagesize - off_offset;
4945 1.1 skrll else
4946 1.1 skrll adjustment = vma_offset - off_offset;
4947 1.1 skrll
4948 1.1 skrll which can can be collapsed into the expression below. */
4949 1.1 skrll
4950 1.1 skrll static file_ptr
4951 1.6 christos vma_page_aligned_bias (bfd_vma vma, ufile_ptr off, bfd_vma maxpagesize)
4952 1.6 christos {
4953 1.6 christos /* PR binutils/16199: Handle an alignment of zero. */
4954 1.1 skrll if (maxpagesize == 0)
4955 1.1 skrll maxpagesize = 1;
4956 1.1 skrll return ((vma - off) % maxpagesize);
4957 1.1 skrll }
4958 1.1 skrll
4959 1.1 skrll static void
4960 1.1 skrll print_segment_map (const struct elf_segment_map *m)
4961 1.1 skrll {
4962 1.1 skrll unsigned int j;
4963 1.1 skrll const char *pt = get_segment_type (m->p_type);
4964 1.1 skrll char buf[32];
4965 1.1 skrll
4966 1.1 skrll if (pt == NULL)
4967 1.1 skrll {
4968 1.1 skrll if (m->p_type >= PT_LOPROC && m->p_type <= PT_HIPROC)
4969 1.1 skrll sprintf (buf, "LOPROC+%7.7x",
4970 1.1 skrll (unsigned int) (m->p_type - PT_LOPROC));
4971 1.1 skrll else if (m->p_type >= PT_LOOS && m->p_type <= PT_HIOS)
4972 1.1 skrll sprintf (buf, "LOOS+%7.7x",
4973 1.1 skrll (unsigned int) (m->p_type - PT_LOOS));
4974 1.1 skrll else
4975 1.1 skrll snprintf (buf, sizeof (buf), "%8.8x",
4976 1.1 skrll (unsigned int) m->p_type);
4977 1.3 christos pt = buf;
4978 1.1 skrll }
4979 1.1 skrll fflush (stdout);
4980 1.1 skrll fprintf (stderr, "%s:", pt);
4981 1.1 skrll for (j = 0; j < m->count; j++)
4982 1.3 christos fprintf (stderr, " %s", m->sections [j]->name);
4983 1.3 christos putc ('\n',stderr);
4984 1.3 christos fflush (stderr);
4985 1.3 christos }
4986 1.3 christos
4987 1.3 christos static bfd_boolean
4988 1.3 christos write_zeros (bfd *abfd, file_ptr pos, bfd_size_type len)
4989 1.3 christos {
4990 1.3 christos void *buf;
4991 1.3 christos bfd_boolean ret;
4992 1.3 christos
4993 1.3 christos if (bfd_seek (abfd, pos, SEEK_SET) != 0)
4994 1.3 christos return FALSE;
4995 1.3 christos buf = bfd_zmalloc (len);
4996 1.3 christos if (buf == NULL)
4997 1.3 christos return FALSE;
4998 1.3 christos ret = bfd_bwrite (buf, len, abfd) == len;
4999 1.1 skrll free (buf);
5000 1.1 skrll return ret;
5001 1.1 skrll }
5002 1.1 skrll
5003 1.1 skrll /* Assign file positions to the sections based on the mapping from
5004 1.1 skrll sections to segments. This function also sets up some fields in
5005 1.1 skrll the file header. */
5006 1.1 skrll
5007 1.1 skrll static bfd_boolean
5008 1.1 skrll assign_file_positions_for_load_sections (bfd *abfd,
5009 1.1 skrll struct bfd_link_info *link_info)
5010 1.1 skrll {
5011 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5012 1.1 skrll struct elf_segment_map *m;
5013 1.1 skrll Elf_Internal_Phdr *phdrs;
5014 1.1 skrll Elf_Internal_Phdr *p;
5015 1.1 skrll file_ptr off;
5016 1.1 skrll bfd_size_type maxpagesize;
5017 1.2 skrll unsigned int alloc;
5018 1.1 skrll unsigned int i, j;
5019 1.1 skrll bfd_vma header_pad = 0;
5020 1.1 skrll
5021 1.1 skrll if (link_info == NULL
5022 1.1 skrll && !_bfd_elf_map_sections_to_segments (abfd, link_info))
5023 1.1 skrll return FALSE;
5024 1.6 christos
5025 1.2 skrll alloc = 0;
5026 1.2 skrll for (m = elf_seg_map (abfd); m != NULL; m = m->next)
5027 1.2 skrll {
5028 1.2 skrll ++alloc;
5029 1.2 skrll if (m->header_size)
5030 1.1 skrll header_pad = m->header_size;
5031 1.5 christos }
5032 1.5 christos
5033 1.5 christos if (alloc)
5034 1.5 christos {
5035 1.5 christos elf_elfheader (abfd)->e_phoff = bed->s->sizeof_ehdr;
5036 1.5 christos elf_elfheader (abfd)->e_phentsize = bed->s->sizeof_phdr;
5037 1.5 christos }
5038 1.5 christos else
5039 1.5 christos {
5040 1.5 christos /* PR binutils/12467. */
5041 1.5 christos elf_elfheader (abfd)->e_phoff = 0;
5042 1.5 christos elf_elfheader (abfd)->e_phentsize = 0;
5043 1.1 skrll }
5044 1.1 skrll
5045 1.6 christos elf_elfheader (abfd)->e_phnum = alloc;
5046 1.6 christos
5047 1.1 skrll if (elf_program_header_size (abfd) == (bfd_size_type) -1)
5048 1.6 christos elf_program_header_size (abfd) = alloc * bed->s->sizeof_phdr;
5049 1.1 skrll else
5050 1.1 skrll BFD_ASSERT (elf_program_header_size (abfd)
5051 1.1 skrll >= alloc * bed->s->sizeof_phdr);
5052 1.1 skrll
5053 1.6 christos if (alloc == 0)
5054 1.1 skrll {
5055 1.1 skrll elf_next_file_pos (abfd) = bed->s->sizeof_ehdr;
5056 1.1 skrll return TRUE;
5057 1.6 christos }
5058 1.2 skrll
5059 1.2 skrll /* We're writing the size in elf_program_header_size (abfd),
5060 1.6 christos see assign_file_positions_except_relocs, so make sure we have
5061 1.6 christos that amount allocated, with trailing space cleared.
5062 1.2 skrll The variable alloc contains the computed need, while
5063 1.2 skrll elf_program_header_size (abfd) contains the size used for the
5064 1.2 skrll layout.
5065 1.2 skrll See ld/emultempl/elf-generic.em:gld${EMULATION_NAME}_map_segments
5066 1.6 christos where the layout is forced to according to a larger size in the
5067 1.2 skrll last iterations for the testcase ld-elf/header. */
5068 1.3 christos BFD_ASSERT (elf_program_header_size (abfd) % bed->s->sizeof_phdr
5069 1.3 christos == 0);
5070 1.6 christos phdrs = (Elf_Internal_Phdr *)
5071 1.3 christos bfd_zalloc2 (abfd,
5072 1.1 skrll (elf_program_header_size (abfd) / bed->s->sizeof_phdr),
5073 1.1 skrll sizeof (Elf_Internal_Phdr));
5074 1.1 skrll elf_tdata (abfd)->phdr = phdrs;
5075 1.1 skrll if (phdrs == NULL)
5076 1.1 skrll return FALSE;
5077 1.1 skrll
5078 1.1 skrll maxpagesize = 1;
5079 1.1 skrll if ((abfd->flags & D_PAGED) != 0)
5080 1.1 skrll maxpagesize = bed->maxpagesize;
5081 1.1 skrll
5082 1.2 skrll off = bed->s->sizeof_ehdr;
5083 1.2 skrll off += alloc * bed->s->sizeof_phdr;
5084 1.2 skrll if (header_pad < (bfd_vma) off)
5085 1.2 skrll header_pad = 0;
5086 1.2 skrll else
5087 1.1 skrll header_pad -= off;
5088 1.6 christos off += header_pad;
5089 1.1 skrll
5090 1.1 skrll for (m = elf_seg_map (abfd), p = phdrs, j = 0;
5091 1.1 skrll m != NULL;
5092 1.1 skrll m = m->next, p++, j++)
5093 1.1 skrll {
5094 1.1 skrll asection **secpp;
5095 1.1 skrll bfd_vma off_adjust;
5096 1.1 skrll bfd_boolean no_contents;
5097 1.1 skrll
5098 1.1 skrll /* If elf_segment_map is not from map_sections_to_segments, the
5099 1.1 skrll sections may not be correctly ordered. NOTE: sorting should
5100 1.1 skrll not be done to the PT_NOTE section of a corefile, which may
5101 1.1 skrll contain several pseudo-sections artificially created by bfd.
5102 1.1 skrll Sorting these pseudo-sections breaks things badly. */
5103 1.1 skrll if (m->count > 1
5104 1.1 skrll && !(elf_elfheader (abfd)->e_type == ET_CORE
5105 1.1 skrll && m->p_type == PT_NOTE))
5106 1.1 skrll qsort (m->sections, (size_t) m->count, sizeof (asection *),
5107 1.1 skrll elf_sort_sections);
5108 1.1 skrll
5109 1.1 skrll /* An ELF segment (described by Elf_Internal_Phdr) may contain a
5110 1.1 skrll number of sections with contents contributing to both p_filesz
5111 1.1 skrll and p_memsz, followed by a number of sections with no contents
5112 1.1 skrll that just contribute to p_memsz. In this loop, OFF tracks next
5113 1.1 skrll available file offset for PT_LOAD and PT_NOTE segments. */
5114 1.1 skrll p->p_type = m->p_type;
5115 1.1 skrll p->p_flags = m->p_flags;
5116 1.1 skrll
5117 1.1 skrll if (m->count == 0)
5118 1.1 skrll p->p_vaddr = 0;
5119 1.1 skrll else
5120 1.1 skrll p->p_vaddr = m->sections[0]->vma - m->p_vaddr_offset;
5121 1.1 skrll
5122 1.1 skrll if (m->p_paddr_valid)
5123 1.1 skrll p->p_paddr = m->p_paddr;
5124 1.1 skrll else if (m->count == 0)
5125 1.1 skrll p->p_paddr = 0;
5126 1.1 skrll else
5127 1.1 skrll p->p_paddr = m->sections[0]->lma - m->p_vaddr_offset;
5128 1.1 skrll
5129 1.1 skrll if (p->p_type == PT_LOAD
5130 1.1 skrll && (abfd->flags & D_PAGED) != 0)
5131 1.1 skrll {
5132 1.1 skrll /* p_align in demand paged PT_LOAD segments effectively stores
5133 1.1 skrll the maximum page size. When copying an executable with
5134 1.1 skrll objcopy, we set m->p_align from the input file. Use this
5135 1.1 skrll value for maxpagesize rather than bed->maxpagesize, which
5136 1.1 skrll may be different. Note that we use maxpagesize for PT_TLS
5137 1.1 skrll segment alignment later in this function, so we are relying
5138 1.1 skrll on at least one PT_LOAD segment appearing before a PT_TLS
5139 1.1 skrll segment. */
5140 1.1 skrll if (m->p_align_valid)
5141 1.1 skrll maxpagesize = m->p_align;
5142 1.1 skrll
5143 1.1 skrll p->p_align = maxpagesize;
5144 1.1 skrll }
5145 1.1 skrll else if (m->p_align_valid)
5146 1.1 skrll p->p_align = m->p_align;
5147 1.1 skrll else if (m->count == 0)
5148 1.1 skrll p->p_align = 1 << bed->s->log_file_align;
5149 1.1 skrll else
5150 1.1 skrll p->p_align = 0;
5151 1.1 skrll
5152 1.1 skrll no_contents = FALSE;
5153 1.1 skrll off_adjust = 0;
5154 1.1 skrll if (p->p_type == PT_LOAD
5155 1.1 skrll && m->count > 0)
5156 1.1 skrll {
5157 1.1 skrll bfd_size_type align;
5158 1.1 skrll unsigned int align_power = 0;
5159 1.1 skrll
5160 1.1 skrll if (m->p_align_valid)
5161 1.1 skrll align = p->p_align;
5162 1.1 skrll else
5163 1.1 skrll {
5164 1.1 skrll for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
5165 1.1 skrll {
5166 1.1 skrll unsigned int secalign;
5167 1.1 skrll
5168 1.1 skrll secalign = bfd_get_section_alignment (abfd, *secpp);
5169 1.1 skrll if (secalign > align_power)
5170 1.1 skrll align_power = secalign;
5171 1.1 skrll }
5172 1.1 skrll align = (bfd_size_type) 1 << align_power;
5173 1.1 skrll if (align < maxpagesize)
5174 1.1 skrll align = maxpagesize;
5175 1.1 skrll }
5176 1.1 skrll
5177 1.1 skrll for (i = 0; i < m->count; i++)
5178 1.1 skrll if ((m->sections[i]->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
5179 1.1 skrll /* If we aren't making room for this section, then
5180 1.1 skrll it must be SHT_NOBITS regardless of what we've
5181 1.1 skrll set via struct bfd_elf_special_section. */
5182 1.1 skrll elf_section_type (m->sections[i]) = SHT_NOBITS;
5183 1.1 skrll
5184 1.1 skrll /* Find out whether this segment contains any loadable
5185 1.1 skrll sections. */
5186 1.1 skrll no_contents = TRUE;
5187 1.1 skrll for (i = 0; i < m->count; i++)
5188 1.1 skrll if (elf_section_type (m->sections[i]) != SHT_NOBITS)
5189 1.1 skrll {
5190 1.1 skrll no_contents = FALSE;
5191 1.1 skrll break;
5192 1.3 christos }
5193 1.1 skrll
5194 1.1 skrll off_adjust = vma_page_aligned_bias (p->p_vaddr, off, align);
5195 1.1 skrll off += off_adjust;
5196 1.1 skrll if (no_contents)
5197 1.1 skrll {
5198 1.1 skrll /* We shouldn't need to align the segment on disk since
5199 1.1 skrll the segment doesn't need file space, but the gABI
5200 1.1 skrll arguably requires the alignment and glibc ld.so
5201 1.1 skrll checks it. So to comply with the alignment
5202 1.1 skrll requirement but not waste file space, we adjust
5203 1.1 skrll p_offset for just this segment. (OFF_ADJUST is
5204 1.1 skrll subtracted from OFF later.) This may put p_offset
5205 1.1 skrll past the end of file, but that shouldn't matter. */
5206 1.1 skrll }
5207 1.1 skrll else
5208 1.1 skrll off_adjust = 0;
5209 1.1 skrll }
5210 1.1 skrll /* Make sure the .dynamic section is the first section in the
5211 1.1 skrll PT_DYNAMIC segment. */
5212 1.1 skrll else if (p->p_type == PT_DYNAMIC
5213 1.1 skrll && m->count > 1
5214 1.1 skrll && strcmp (m->sections[0]->name, ".dynamic") != 0)
5215 1.1 skrll {
5216 1.1 skrll _bfd_error_handler
5217 1.1 skrll (_("%B: The first section in the PT_DYNAMIC segment is not the .dynamic section"),
5218 1.1 skrll abfd);
5219 1.1 skrll bfd_set_error (bfd_error_bad_value);
5220 1.1 skrll return FALSE;
5221 1.1 skrll }
5222 1.1 skrll /* Set the note section type to SHT_NOTE. */
5223 1.1 skrll else if (p->p_type == PT_NOTE)
5224 1.1 skrll for (i = 0; i < m->count; i++)
5225 1.1 skrll elf_section_type (m->sections[i]) = SHT_NOTE;
5226 1.1 skrll
5227 1.1 skrll p->p_offset = 0;
5228 1.1 skrll p->p_filesz = 0;
5229 1.1 skrll p->p_memsz = 0;
5230 1.1 skrll
5231 1.1 skrll if (m->includes_filehdr)
5232 1.1 skrll {
5233 1.1 skrll if (!m->p_flags_valid)
5234 1.1 skrll p->p_flags |= PF_R;
5235 1.1 skrll p->p_filesz = bed->s->sizeof_ehdr;
5236 1.1 skrll p->p_memsz = bed->s->sizeof_ehdr;
5237 1.1 skrll if (m->count > 0)
5238 1.1 skrll {
5239 1.1 skrll if (p->p_vaddr < (bfd_vma) off)
5240 1.1 skrll {
5241 1.1 skrll (*_bfd_error_handler)
5242 1.1 skrll (_("%B: Not enough room for program headers, try linking with -N"),
5243 1.1 skrll abfd);
5244 1.1 skrll bfd_set_error (bfd_error_bad_value);
5245 1.1 skrll return FALSE;
5246 1.1 skrll }
5247 1.1 skrll
5248 1.1 skrll p->p_vaddr -= off;
5249 1.1 skrll if (!m->p_paddr_valid)
5250 1.1 skrll p->p_paddr -= off;
5251 1.1 skrll }
5252 1.1 skrll }
5253 1.1 skrll
5254 1.1 skrll if (m->includes_phdrs)
5255 1.1 skrll {
5256 1.1 skrll if (!m->p_flags_valid)
5257 1.1 skrll p->p_flags |= PF_R;
5258 1.1 skrll
5259 1.1 skrll if (!m->includes_filehdr)
5260 1.1 skrll {
5261 1.1 skrll p->p_offset = bed->s->sizeof_ehdr;
5262 1.1 skrll
5263 1.1 skrll if (m->count > 0)
5264 1.1 skrll {
5265 1.1 skrll p->p_vaddr -= off - p->p_offset;
5266 1.1 skrll if (!m->p_paddr_valid)
5267 1.1 skrll p->p_paddr -= off - p->p_offset;
5268 1.1 skrll }
5269 1.1 skrll }
5270 1.1 skrll
5271 1.2 skrll p->p_filesz += alloc * bed->s->sizeof_phdr;
5272 1.2 skrll p->p_memsz += alloc * bed->s->sizeof_phdr;
5273 1.2 skrll if (m->count)
5274 1.2 skrll {
5275 1.2 skrll p->p_filesz += header_pad;
5276 1.1 skrll p->p_memsz += header_pad;
5277 1.1 skrll }
5278 1.1 skrll }
5279 1.1 skrll
5280 1.1 skrll if (p->p_type == PT_LOAD
5281 1.1 skrll || (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core))
5282 1.1 skrll {
5283 1.1 skrll if (!m->includes_filehdr && !m->includes_phdrs)
5284 1.1 skrll p->p_offset = off;
5285 1.1 skrll else
5286 1.1 skrll {
5287 1.1 skrll file_ptr adjust;
5288 1.1 skrll
5289 1.1 skrll adjust = off - (p->p_offset + p->p_filesz);
5290 1.1 skrll if (!no_contents)
5291 1.1 skrll p->p_filesz += adjust;
5292 1.1 skrll p->p_memsz += adjust;
5293 1.1 skrll }
5294 1.1 skrll }
5295 1.1 skrll
5296 1.1 skrll /* Set up p_filesz, p_memsz, p_align and p_flags from the section
5297 1.1 skrll maps. Set filepos for sections in PT_LOAD segments, and in
5298 1.1 skrll core files, for sections in PT_NOTE segments.
5299 1.1 skrll assign_file_positions_for_non_load_sections will set filepos
5300 1.1 skrll for other sections and update p_filesz for other segments. */
5301 1.1 skrll for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
5302 1.1 skrll {
5303 1.1 skrll asection *sec;
5304 1.1 skrll bfd_size_type align;
5305 1.1 skrll Elf_Internal_Shdr *this_hdr;
5306 1.1 skrll
5307 1.1 skrll sec = *secpp;
5308 1.1 skrll this_hdr = &elf_section_data (sec)->this_hdr;
5309 1.1 skrll align = (bfd_size_type) 1 << bfd_get_section_alignment (abfd, sec);
5310 1.1 skrll
5311 1.1 skrll if ((p->p_type == PT_LOAD
5312 1.1 skrll || p->p_type == PT_TLS)
5313 1.1 skrll && (this_hdr->sh_type != SHT_NOBITS
5314 1.1 skrll || ((this_hdr->sh_flags & SHF_ALLOC) != 0
5315 1.1 skrll && ((this_hdr->sh_flags & SHF_TLS) == 0
5316 1.3 christos || p->p_type == PT_TLS))))
5317 1.3 christos {
5318 1.3 christos bfd_vma p_start = p->p_paddr;
5319 1.3 christos bfd_vma p_end = p_start + p->p_memsz;
5320 1.3 christos bfd_vma s_start = sec->lma;
5321 1.3 christos bfd_vma adjust = s_start - p_end;
5322 1.3 christos
5323 1.3 christos if (adjust != 0
5324 1.1 skrll && (s_start < p_end
5325 1.1 skrll || p_end < p_start))
5326 1.3 christos {
5327 1.3 christos (*_bfd_error_handler)
5328 1.1 skrll (_("%B: section %A lma %#lx adjusted to %#lx"), abfd, sec,
5329 1.3 christos (unsigned long) s_start, (unsigned long) p_end);
5330 1.1 skrll adjust = 0;
5331 1.1 skrll sec->lma = p_end;
5332 1.1 skrll }
5333 1.1 skrll p->p_memsz += adjust;
5334 1.1 skrll
5335 1.3 christos if (this_hdr->sh_type != SHT_NOBITS)
5336 1.3 christos {
5337 1.3 christos if (p->p_filesz + adjust < p->p_memsz)
5338 1.3 christos {
5339 1.3 christos /* We have a PROGBITS section following NOBITS ones.
5340 1.3 christos Allocate file space for the NOBITS section(s) and
5341 1.3 christos zero it. */
5342 1.3 christos adjust = p->p_memsz - p->p_filesz;
5343 1.3 christos if (!write_zeros (abfd, off, adjust))
5344 1.1 skrll return FALSE;
5345 1.1 skrll }
5346 1.1 skrll off += adjust;
5347 1.1 skrll p->p_filesz += adjust;
5348 1.1 skrll }
5349 1.1 skrll }
5350 1.1 skrll
5351 1.1 skrll if (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core)
5352 1.1 skrll {
5353 1.1 skrll /* The section at i == 0 is the one that actually contains
5354 1.1 skrll everything. */
5355 1.1 skrll if (i == 0)
5356 1.1 skrll {
5357 1.1 skrll this_hdr->sh_offset = sec->filepos = off;
5358 1.1 skrll off += this_hdr->sh_size;
5359 1.1 skrll p->p_filesz = this_hdr->sh_size;
5360 1.1 skrll p->p_memsz = 0;
5361 1.1 skrll p->p_align = 1;
5362 1.1 skrll }
5363 1.1 skrll else
5364 1.1 skrll {
5365 1.1 skrll /* The rest are fake sections that shouldn't be written. */
5366 1.1 skrll sec->filepos = 0;
5367 1.1 skrll sec->size = 0;
5368 1.1 skrll sec->flags = 0;
5369 1.1 skrll continue;
5370 1.1 skrll }
5371 1.1 skrll }
5372 1.1 skrll else
5373 1.1 skrll {
5374 1.1 skrll if (p->p_type == PT_LOAD)
5375 1.1 skrll {
5376 1.1 skrll this_hdr->sh_offset = sec->filepos = off;
5377 1.1 skrll if (this_hdr->sh_type != SHT_NOBITS)
5378 1.3 christos off += this_hdr->sh_size;
5379 1.3 christos }
5380 1.3 christos else if (this_hdr->sh_type == SHT_NOBITS
5381 1.3 christos && (this_hdr->sh_flags & SHF_TLS) != 0
5382 1.3 christos && this_hdr->sh_offset == 0)
5383 1.3 christos {
5384 1.3 christos /* This is a .tbss section that didn't get a PT_LOAD.
5385 1.3 christos (See _bfd_elf_map_sections_to_segments "Create a
5386 1.3 christos final PT_LOAD".) Set sh_offset to the value it
5387 1.3 christos would have if we had created a zero p_filesz and
5388 1.3 christos p_memsz PT_LOAD header for the section. This
5389 1.3 christos also makes the PT_TLS header have the same
5390 1.3 christos p_offset value. */
5391 1.3 christos bfd_vma adjust = vma_page_aligned_bias (this_hdr->sh_addr,
5392 1.3 christos off, align);
5393 1.1 skrll this_hdr->sh_offset = sec->filepos = off + adjust;
5394 1.1 skrll }
5395 1.1 skrll
5396 1.1 skrll if (this_hdr->sh_type != SHT_NOBITS)
5397 1.1 skrll {
5398 1.1 skrll p->p_filesz += this_hdr->sh_size;
5399 1.1 skrll /* A load section without SHF_ALLOC is something like
5400 1.1 skrll a note section in a PT_NOTE segment. These take
5401 1.1 skrll file space but are not loaded into memory. */
5402 1.1 skrll if ((this_hdr->sh_flags & SHF_ALLOC) != 0)
5403 1.1 skrll p->p_memsz += this_hdr->sh_size;
5404 1.1 skrll }
5405 1.1 skrll else if ((this_hdr->sh_flags & SHF_ALLOC) != 0)
5406 1.1 skrll {
5407 1.1 skrll if (p->p_type == PT_TLS)
5408 1.1 skrll p->p_memsz += this_hdr->sh_size;
5409 1.1 skrll
5410 1.1 skrll /* .tbss is special. It doesn't contribute to p_memsz of
5411 1.1 skrll normal segments. */
5412 1.1 skrll else if ((this_hdr->sh_flags & SHF_TLS) == 0)
5413 1.1 skrll p->p_memsz += this_hdr->sh_size;
5414 1.1 skrll }
5415 1.1 skrll
5416 1.1 skrll if (align > p->p_align
5417 1.1 skrll && !m->p_align_valid
5418 1.1 skrll && (p->p_type != PT_LOAD
5419 1.1 skrll || (abfd->flags & D_PAGED) == 0))
5420 1.1 skrll p->p_align = align;
5421 1.1 skrll }
5422 1.1 skrll
5423 1.1 skrll if (!m->p_flags_valid)
5424 1.1 skrll {
5425 1.1 skrll p->p_flags |= PF_R;
5426 1.1 skrll if ((this_hdr->sh_flags & SHF_EXECINSTR) != 0)
5427 1.1 skrll p->p_flags |= PF_X;
5428 1.1 skrll if ((this_hdr->sh_flags & SHF_WRITE) != 0)
5429 1.1 skrll p->p_flags |= PF_W;
5430 1.6 christos }
5431 1.1 skrll }
5432 1.1 skrll
5433 1.1 skrll off -= off_adjust;
5434 1.1 skrll
5435 1.1 skrll /* Check that all sections are in a PT_LOAD segment.
5436 1.3 christos Don't check funky gdb generated core files. */
5437 1.3 christos if (p->p_type == PT_LOAD && bfd_get_format (abfd) != bfd_core)
5438 1.1 skrll {
5439 1.3 christos bfd_boolean check_vma = TRUE;
5440 1.3 christos
5441 1.3 christos for (i = 1; i < m->count; i++)
5442 1.3 christos if (m->sections[i]->vma == m->sections[i - 1]->vma
5443 1.3 christos && ELF_SECTION_SIZE (&(elf_section_data (m->sections[i])
5444 1.3 christos ->this_hdr), p) != 0
5445 1.1 skrll && ELF_SECTION_SIZE (&(elf_section_data (m->sections[i - 1])
5446 1.3 christos ->this_hdr), p) != 0)
5447 1.3 christos {
5448 1.3 christos /* Looks like we have overlays packed into the segment. */
5449 1.1 skrll check_vma = FALSE;
5450 1.3 christos break;
5451 1.3 christos }
5452 1.3 christos
5453 1.3 christos for (i = 0; i < m->count; i++)
5454 1.3 christos {
5455 1.3 christos Elf_Internal_Shdr *this_hdr;
5456 1.3 christos asection *sec;
5457 1.3 christos
5458 1.3 christos sec = m->sections[i];
5459 1.3 christos this_hdr = &(elf_section_data(sec)->this_hdr);
5460 1.3 christos if (!ELF_SECTION_IN_SEGMENT_1 (this_hdr, p, check_vma, 0)
5461 1.3 christos && !ELF_TBSS_SPECIAL (this_hdr, p))
5462 1.3 christos {
5463 1.3 christos (*_bfd_error_handler)
5464 1.3 christos (_("%B: section `%A' can't be allocated in segment %d"),
5465 1.3 christos abfd, sec, j);
5466 1.3 christos print_segment_map (m);
5467 1.3 christos }
5468 1.1 skrll }
5469 1.1 skrll }
5470 1.6 christos }
5471 1.1 skrll
5472 1.1 skrll elf_next_file_pos (abfd) = off;
5473 1.1 skrll return TRUE;
5474 1.1 skrll }
5475 1.1 skrll
5476 1.1 skrll /* Assign file positions for the other sections. */
5477 1.1 skrll
5478 1.1 skrll static bfd_boolean
5479 1.1 skrll assign_file_positions_for_non_load_sections (bfd *abfd,
5480 1.1 skrll struct bfd_link_info *link_info)
5481 1.1 skrll {
5482 1.6 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5483 1.1 skrll Elf_Internal_Shdr **i_shdrpp;
5484 1.1 skrll Elf_Internal_Shdr **hdrpp, **end_hdrpp;
5485 1.1 skrll Elf_Internal_Phdr *phdrs;
5486 1.5 christos Elf_Internal_Phdr *p;
5487 1.1 skrll struct elf_segment_map *m;
5488 1.1 skrll struct elf_segment_map *hdrs_segment;
5489 1.1 skrll bfd_vma filehdr_vaddr, filehdr_paddr;
5490 1.1 skrll bfd_vma phdrs_vaddr, phdrs_paddr;
5491 1.1 skrll file_ptr off;
5492 1.1 skrll unsigned int count;
5493 1.6 christos
5494 1.6 christos i_shdrpp = elf_elfsections (abfd);
5495 1.6 christos end_hdrpp = i_shdrpp + elf_numsections (abfd);
5496 1.1 skrll off = elf_next_file_pos (abfd);
5497 1.1 skrll for (hdrpp = i_shdrpp + 1; hdrpp < end_hdrpp; hdrpp++)
5498 1.1 skrll {
5499 1.1 skrll Elf_Internal_Shdr *hdr;
5500 1.1 skrll
5501 1.1 skrll hdr = *hdrpp;
5502 1.1 skrll if (hdr->bfd_section != NULL
5503 1.1 skrll && (hdr->bfd_section->filepos != 0
5504 1.1 skrll || (hdr->sh_type == SHT_NOBITS
5505 1.1 skrll && hdr->contents == NULL)))
5506 1.1 skrll BFD_ASSERT (hdr->sh_offset == hdr->bfd_section->filepos);
5507 1.5 christos else if ((hdr->sh_flags & SHF_ALLOC) != 0)
5508 1.5 christos {
5509 1.5 christos if (hdr->sh_size != 0)
5510 1.5 christos (*_bfd_error_handler)
5511 1.5 christos (_("%B: warning: allocated section `%s' not in segment"),
5512 1.5 christos abfd,
5513 1.5 christos (hdr->bfd_section == NULL
5514 1.1 skrll ? "*unknown*"
5515 1.1 skrll : hdr->bfd_section->name));
5516 1.1 skrll /* We don't need to page align empty sections. */
5517 1.1 skrll if ((abfd->flags & D_PAGED) != 0 && hdr->sh_size != 0)
5518 1.1 skrll off += vma_page_aligned_bias (hdr->sh_addr, off,
5519 1.1 skrll bed->maxpagesize);
5520 1.1 skrll else
5521 1.1 skrll off += vma_page_aligned_bias (hdr->sh_addr, off,
5522 1.1 skrll hdr->sh_addralign);
5523 1.1 skrll off = _bfd_elf_assign_file_position_for_section (hdr, off,
5524 1.1 skrll FALSE);
5525 1.1 skrll }
5526 1.6 christos else if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
5527 1.6 christos && hdr->bfd_section == NULL)
5528 1.6 christos || (hdr->bfd_section != NULL
5529 1.6 christos && (hdr->bfd_section->flags & SEC_ELF_COMPRESS))
5530 1.6 christos /* Compress DWARF debug sections. */
5531 1.6 christos || hdr == i_shdrpp[elf_onesymtab (abfd)]
5532 1.6 christos || (elf_symtab_shndx_list (abfd) != NULL
5533 1.6 christos && hdr == i_shdrpp[elf_symtab_shndx_list (abfd)->ndx])
5534 1.1 skrll || hdr == i_shdrpp[elf_strtab_sec (abfd)]
5535 1.1 skrll || hdr == i_shdrpp[elf_shstrtab_sec (abfd)])
5536 1.1 skrll hdr->sh_offset = -1;
5537 1.1 skrll else
5538 1.1 skrll off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
5539 1.1 skrll }
5540 1.1 skrll
5541 1.1 skrll /* Now that we have set the section file positions, we can set up
5542 1.1 skrll the file positions for the non PT_LOAD segments. */
5543 1.1 skrll count = 0;
5544 1.1 skrll filehdr_vaddr = 0;
5545 1.1 skrll filehdr_paddr = 0;
5546 1.5 christos phdrs_vaddr = bed->maxpagesize + bed->s->sizeof_ehdr;
5547 1.1 skrll phdrs_paddr = 0;
5548 1.6 christos hdrs_segment = NULL;
5549 1.1 skrll phdrs = elf_tdata (abfd)->phdr;
5550 1.1 skrll for (m = elf_seg_map (abfd), p = phdrs; m != NULL; m = m->next, p++)
5551 1.1 skrll {
5552 1.1 skrll ++count;
5553 1.1 skrll if (p->p_type != PT_LOAD)
5554 1.1 skrll continue;
5555 1.1 skrll
5556 1.1 skrll if (m->includes_filehdr)
5557 1.1 skrll {
5558 1.1 skrll filehdr_vaddr = p->p_vaddr;
5559 1.1 skrll filehdr_paddr = p->p_paddr;
5560 1.1 skrll }
5561 1.1 skrll if (m->includes_phdrs)
5562 1.1 skrll {
5563 1.1 skrll phdrs_vaddr = p->p_vaddr;
5564 1.1 skrll phdrs_paddr = p->p_paddr;
5565 1.5 christos if (m->includes_filehdr)
5566 1.1 skrll {
5567 1.1 skrll hdrs_segment = m;
5568 1.1 skrll phdrs_vaddr += bed->s->sizeof_ehdr;
5569 1.1 skrll phdrs_paddr += bed->s->sizeof_ehdr;
5570 1.1 skrll }
5571 1.1 skrll }
5572 1.5 christos }
5573 1.5 christos
5574 1.5 christos if (hdrs_segment != NULL && link_info != NULL)
5575 1.5 christos {
5576 1.5 christos /* There is a segment that contains both the file headers and the
5577 1.5 christos program headers, so provide a symbol __ehdr_start pointing there.
5578 1.5 christos A program can use this to examine itself robustly. */
5579 1.5 christos
5580 1.5 christos struct elf_link_hash_entry *hash
5581 1.5 christos = elf_link_hash_lookup (elf_hash_table (link_info), "__ehdr_start",
5582 1.5 christos FALSE, FALSE, TRUE);
5583 1.5 christos /* If the symbol was referenced and not defined, define it. */
5584 1.5 christos if (hash != NULL
5585 1.5 christos && (hash->root.type == bfd_link_hash_new
5586 1.5 christos || hash->root.type == bfd_link_hash_undefined
5587 1.5 christos || hash->root.type == bfd_link_hash_undefweak
5588 1.5 christos || hash->root.type == bfd_link_hash_common))
5589 1.5 christos {
5590 1.5 christos asection *s = NULL;
5591 1.5 christos if (hdrs_segment->count != 0)
5592 1.5 christos /* The segment contains sections, so use the first one. */
5593 1.5 christos s = hdrs_segment->sections[0];
5594 1.6 christos else
5595 1.5 christos /* Use the first (i.e. lowest-addressed) section in any segment. */
5596 1.5 christos for (m = elf_seg_map (abfd); m != NULL; m = m->next)
5597 1.5 christos if (m->count != 0)
5598 1.5 christos {
5599 1.5 christos s = m->sections[0];
5600 1.5 christos break;
5601 1.5 christos }
5602 1.5 christos
5603 1.5 christos if (s != NULL)
5604 1.5 christos {
5605 1.5 christos hash->root.u.def.value = filehdr_vaddr - s->vma;
5606 1.5 christos hash->root.u.def.section = s;
5607 1.5 christos }
5608 1.5 christos else
5609 1.5 christos {
5610 1.5 christos hash->root.u.def.value = filehdr_vaddr;
5611 1.5 christos hash->root.u.def.section = bfd_abs_section_ptr;
5612 1.5 christos }
5613 1.5 christos
5614 1.5 christos hash->root.type = bfd_link_hash_defined;
5615 1.5 christos hash->def_regular = 1;
5616 1.5 christos hash->non_elf = 0;
5617 1.5 christos }
5618 1.6 christos }
5619 1.1 skrll
5620 1.1 skrll for (m = elf_seg_map (abfd), p = phdrs; m != NULL; m = m->next, p++)
5621 1.1 skrll {
5622 1.1 skrll if (p->p_type == PT_GNU_RELRO)
5623 1.5 christos {
5624 1.1 skrll const Elf_Internal_Phdr *lp;
5625 1.1 skrll struct elf_segment_map *lm;
5626 1.1 skrll
5627 1.1 skrll if (link_info != NULL)
5628 1.1 skrll {
5629 1.6 christos /* During linking the range of the RELRO segment is passed
5630 1.5 christos in link_info. */
5631 1.5 christos for (lm = elf_seg_map (abfd), lp = phdrs;
5632 1.1 skrll lm != NULL;
5633 1.1 skrll lm = lm->next, lp++)
5634 1.1 skrll {
5635 1.5 christos if (lp->p_type == PT_LOAD
5636 1.5 christos && lp->p_vaddr < link_info->relro_end
5637 1.1 skrll && lm->count != 0
5638 1.1 skrll && lm->sections[0]->vma >= link_info->relro_start)
5639 1.5 christos break;
5640 1.5 christos }
5641 1.1 skrll
5642 1.1 skrll BFD_ASSERT (lm != NULL);
5643 1.1 skrll }
5644 1.1 skrll else
5645 1.1 skrll {
5646 1.1 skrll /* Otherwise we are copying an executable or shared
5647 1.1 skrll library, but we need to use the same linker logic. */
5648 1.1 skrll for (lp = phdrs; lp < phdrs + count; ++lp)
5649 1.1 skrll {
5650 1.1 skrll if (lp->p_type == PT_LOAD
5651 1.1 skrll && lp->p_paddr == p->p_paddr)
5652 1.1 skrll break;
5653 1.1 skrll }
5654 1.1 skrll }
5655 1.1 skrll
5656 1.1 skrll if (lp < phdrs + count)
5657 1.1 skrll {
5658 1.1 skrll p->p_vaddr = lp->p_vaddr;
5659 1.1 skrll p->p_paddr = lp->p_paddr;
5660 1.1 skrll p->p_offset = lp->p_offset;
5661 1.1 skrll if (link_info != NULL)
5662 1.1 skrll p->p_filesz = link_info->relro_end - lp->p_vaddr;
5663 1.1 skrll else if (m->p_size_valid)
5664 1.1 skrll p->p_filesz = m->p_size;
5665 1.1 skrll else
5666 1.5 christos abort ();
5667 1.5 christos p->p_memsz = p->p_filesz;
5668 1.5 christos /* Preserve the alignment and flags if they are valid. The
5669 1.5 christos gold linker generates RW/4 for the PT_GNU_RELRO section.
5670 1.5 christos It is better for objcopy/strip to honor these attributes
5671 1.5 christos otherwise gdb will choke when using separate debug files.
5672 1.5 christos */
5673 1.5 christos if (!m->p_align_valid)
5674 1.6 christos p->p_align = 1;
5675 1.1 skrll if (!m->p_flags_valid)
5676 1.3 christos p->p_flags = PF_R;
5677 1.1 skrll }
5678 1.1 skrll else
5679 1.1 skrll {
5680 1.1 skrll memset (p, 0, sizeof *p);
5681 1.1 skrll p->p_type = PT_NULL;
5682 1.6 christos }
5683 1.6 christos }
5684 1.6 christos else if (p->p_type == PT_GNU_STACK)
5685 1.6 christos {
5686 1.6 christos if (m->p_size_valid)
5687 1.1 skrll p->p_memsz = m->p_size;
5688 1.1 skrll }
5689 1.6 christos else if (m->count != 0)
5690 1.1 skrll {
5691 1.1 skrll unsigned int i;
5692 1.1 skrll if (p->p_type != PT_LOAD
5693 1.1 skrll && (p->p_type != PT_NOTE
5694 1.6 christos || bfd_get_format (abfd) != bfd_core))
5695 1.6 christos {
5696 1.6 christos if (m->includes_filehdr || m->includes_phdrs)
5697 1.6 christos {
5698 1.6 christos /* PR 17512: file: 2195325e. */
5699 1.6 christos (*_bfd_error_handler)
5700 1.6 christos (_("%B: warning: non-load segment includes file header and/or program header"),
5701 1.6 christos abfd);
5702 1.1 skrll return FALSE;
5703 1.3 christos }
5704 1.1 skrll
5705 1.3 christos p->p_filesz = 0;
5706 1.3 christos p->p_offset = m->sections[0]->filepos;
5707 1.3 christos for (i = m->count; i-- != 0;)
5708 1.3 christos {
5709 1.3 christos asection *sect = m->sections[i];
5710 1.3 christos Elf_Internal_Shdr *hdr = &elf_section_data (sect)->this_hdr;
5711 1.3 christos if (hdr->sh_type != SHT_NOBITS)
5712 1.3 christos {
5713 1.3 christos p->p_filesz = (sect->filepos - m->sections[0]->filepos
5714 1.3 christos + hdr->sh_size);
5715 1.3 christos break;
5716 1.1 skrll }
5717 1.1 skrll }
5718 1.1 skrll }
5719 1.1 skrll }
5720 1.1 skrll else if (m->includes_filehdr)
5721 1.1 skrll {
5722 1.1 skrll p->p_vaddr = filehdr_vaddr;
5723 1.1 skrll if (! m->p_paddr_valid)
5724 1.1 skrll p->p_paddr = filehdr_paddr;
5725 1.1 skrll }
5726 1.1 skrll else if (m->includes_phdrs)
5727 1.1 skrll {
5728 1.1 skrll p->p_vaddr = phdrs_vaddr;
5729 1.1 skrll if (! m->p_paddr_valid)
5730 1.1 skrll p->p_paddr = phdrs_paddr;
5731 1.1 skrll }
5732 1.6 christos }
5733 1.1 skrll
5734 1.1 skrll elf_next_file_pos (abfd) = off;
5735 1.1 skrll
5736 1.1 skrll return TRUE;
5737 1.6 christos }
5738 1.6 christos
5739 1.6 christos static elf_section_list *
5740 1.6 christos find_section_in_list (unsigned int i, elf_section_list * list)
5741 1.6 christos {
5742 1.6 christos for (;list != NULL; list = list->next)
5743 1.6 christos if (list->ndx == i)
5744 1.6 christos break;
5745 1.6 christos return list;
5746 1.1 skrll }
5747 1.1 skrll
5748 1.1 skrll /* Work out the file positions of all the sections. This is called by
5749 1.1 skrll _bfd_elf_compute_section_file_positions. All the section sizes and
5750 1.1 skrll VMAs must be known before this is called.
5751 1.1 skrll
5752 1.1 skrll Reloc sections come in two flavours: Those processed specially as
5753 1.1 skrll "side-channel" data attached to a section to which they apply, and
5754 1.1 skrll those that bfd doesn't process as relocations. The latter sort are
5755 1.1 skrll stored in a normal bfd section by bfd_section_from_shdr. We don't
5756 1.1 skrll consider the former sort here, unless they form part of the loadable
5757 1.1 skrll image. Reloc sections not assigned here will be handled later by
5758 1.1 skrll assign_file_positions_for_relocs.
5759 1.1 skrll
5760 1.1 skrll We also don't set the positions of the .symtab and .strtab here. */
5761 1.1 skrll
5762 1.1 skrll static bfd_boolean
5763 1.1 skrll assign_file_positions_except_relocs (bfd *abfd,
5764 1.1 skrll struct bfd_link_info *link_info)
5765 1.1 skrll {
5766 1.1 skrll struct elf_obj_tdata *tdata = elf_tdata (abfd);
5767 1.1 skrll Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
5768 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5769 1.1 skrll
5770 1.1 skrll if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0
5771 1.1 skrll && bfd_get_format (abfd) != bfd_core)
5772 1.1 skrll {
5773 1.1 skrll Elf_Internal_Shdr ** const i_shdrpp = elf_elfsections (abfd);
5774 1.1 skrll unsigned int num_sec = elf_numsections (abfd);
5775 1.6 christos Elf_Internal_Shdr **hdrpp;
5776 1.1 skrll unsigned int i;
5777 1.1 skrll file_ptr off;
5778 1.1 skrll
5779 1.1 skrll /* Start after the ELF header. */
5780 1.1 skrll off = i_ehdrp->e_ehsize;
5781 1.1 skrll
5782 1.1 skrll /* We are not creating an executable, which means that we are
5783 1.1 skrll not creating a program header, and that the actual order of
5784 1.1 skrll the sections in the file is unimportant. */
5785 1.1 skrll for (i = 1, hdrpp = i_shdrpp + 1; i < num_sec; i++, hdrpp++)
5786 1.1 skrll {
5787 1.1 skrll Elf_Internal_Shdr *hdr;
5788 1.1 skrll
5789 1.1 skrll hdr = *hdrpp;
5790 1.6 christos if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
5791 1.6 christos && hdr->bfd_section == NULL)
5792 1.6 christos || (hdr->bfd_section != NULL
5793 1.6 christos && (hdr->bfd_section->flags & SEC_ELF_COMPRESS))
5794 1.6 christos /* Compress DWARF debug sections. */
5795 1.6 christos || i == elf_onesymtab (abfd)
5796 1.6 christos || (elf_symtab_shndx_list (abfd) != NULL
5797 1.6 christos && hdr == i_shdrpp[elf_symtab_shndx_list (abfd)->ndx])
5798 1.1 skrll || i == elf_strtab_sec (abfd)
5799 1.1 skrll || i == elf_shstrtab_sec (abfd))
5800 1.1 skrll {
5801 1.1 skrll hdr->sh_offset = -1;
5802 1.1 skrll }
5803 1.1 skrll else
5804 1.6 christos off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
5805 1.6 christos }
5806 1.1 skrll
5807 1.1 skrll elf_next_file_pos (abfd) = off;
5808 1.1 skrll }
5809 1.1 skrll else
5810 1.1 skrll {
5811 1.1 skrll unsigned int alloc;
5812 1.1 skrll
5813 1.1 skrll /* Assign file positions for the loaded sections based on the
5814 1.1 skrll assignment of sections to segments. */
5815 1.1 skrll if (!assign_file_positions_for_load_sections (abfd, link_info))
5816 1.1 skrll return FALSE;
5817 1.1 skrll
5818 1.1 skrll /* And for non-load sections. */
5819 1.1 skrll if (!assign_file_positions_for_non_load_sections (abfd, link_info))
5820 1.1 skrll return FALSE;
5821 1.1 skrll
5822 1.1 skrll if (bed->elf_backend_modify_program_headers != NULL)
5823 1.1 skrll {
5824 1.1 skrll if (!(*bed->elf_backend_modify_program_headers) (abfd, link_info))
5825 1.1 skrll return FALSE;
5826 1.6 christos }
5827 1.6 christos
5828 1.6 christos /* Set e_type in ELF header to ET_EXEC for -pie -Ttext-segment=. */
5829 1.6 christos if (link_info != NULL && bfd_link_pie (link_info))
5830 1.6 christos {
5831 1.6 christos unsigned int num_segments = elf_elfheader (abfd)->e_phnum;
5832 1.6 christos Elf_Internal_Phdr *segment = elf_tdata (abfd)->phdr;
5833 1.6 christos Elf_Internal_Phdr *end_segment = &segment[num_segments];
5834 1.6 christos
5835 1.6 christos /* Find the lowest p_vaddr in PT_LOAD segments. */
5836 1.6 christos bfd_vma p_vaddr = (bfd_vma) -1;
5837 1.6 christos for (; segment < end_segment; segment++)
5838 1.6 christos if (segment->p_type == PT_LOAD && p_vaddr > segment->p_vaddr)
5839 1.6 christos p_vaddr = segment->p_vaddr;
5840 1.6 christos
5841 1.6 christos /* Set e_type to ET_EXEC if the lowest p_vaddr in PT_LOAD
5842 1.6 christos segments is non-zero. */
5843 1.6 christos if (p_vaddr)
5844 1.6 christos i_ehdrp->e_type = ET_EXEC;
5845 1.1 skrll }
5846 1.6 christos
5847 1.1 skrll /* Write out the program headers. */
5848 1.1 skrll alloc = elf_program_header_size (abfd) / bed->s->sizeof_phdr;
5849 1.1 skrll if (bfd_seek (abfd, (bfd_signed_vma) bed->s->sizeof_ehdr, SEEK_SET) != 0
5850 1.1 skrll || bed->s->write_out_phdrs (abfd, tdata->phdr, alloc) != 0)
5851 1.1 skrll return FALSE;
5852 1.1 skrll }
5853 1.1 skrll
5854 1.1 skrll return TRUE;
5855 1.1 skrll }
5856 1.1 skrll
5857 1.1 skrll static bfd_boolean
5858 1.3 christos prep_headers (bfd *abfd)
5859 1.1 skrll {
5860 1.1 skrll Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form. */
5861 1.1 skrll struct elf_strtab_hash *shstrtab;
5862 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5863 1.1 skrll
5864 1.1 skrll i_ehdrp = elf_elfheader (abfd);
5865 1.1 skrll
5866 1.1 skrll shstrtab = _bfd_elf_strtab_init ();
5867 1.1 skrll if (shstrtab == NULL)
5868 1.1 skrll return FALSE;
5869 1.1 skrll
5870 1.1 skrll elf_shstrtab (abfd) = shstrtab;
5871 1.1 skrll
5872 1.1 skrll i_ehdrp->e_ident[EI_MAG0] = ELFMAG0;
5873 1.1 skrll i_ehdrp->e_ident[EI_MAG1] = ELFMAG1;
5874 1.1 skrll i_ehdrp->e_ident[EI_MAG2] = ELFMAG2;
5875 1.1 skrll i_ehdrp->e_ident[EI_MAG3] = ELFMAG3;
5876 1.1 skrll
5877 1.1 skrll i_ehdrp->e_ident[EI_CLASS] = bed->s->elfclass;
5878 1.1 skrll i_ehdrp->e_ident[EI_DATA] =
5879 1.1 skrll bfd_big_endian (abfd) ? ELFDATA2MSB : ELFDATA2LSB;
5880 1.1 skrll i_ehdrp->e_ident[EI_VERSION] = bed->s->ev_current;
5881 1.1 skrll
5882 1.1 skrll if ((abfd->flags & DYNAMIC) != 0)
5883 1.1 skrll i_ehdrp->e_type = ET_DYN;
5884 1.1 skrll else if ((abfd->flags & EXEC_P) != 0)
5885 1.1 skrll i_ehdrp->e_type = ET_EXEC;
5886 1.1 skrll else if (bfd_get_format (abfd) == bfd_core)
5887 1.1 skrll i_ehdrp->e_type = ET_CORE;
5888 1.1 skrll else
5889 1.1 skrll i_ehdrp->e_type = ET_REL;
5890 1.1 skrll
5891 1.1 skrll switch (bfd_get_arch (abfd))
5892 1.1 skrll {
5893 1.1 skrll case bfd_arch_unknown:
5894 1.1 skrll i_ehdrp->e_machine = EM_NONE;
5895 1.1 skrll break;
5896 1.1 skrll
5897 1.1 skrll /* There used to be a long list of cases here, each one setting
5898 1.1 skrll e_machine to the same EM_* macro #defined as ELF_MACHINE_CODE
5899 1.1 skrll in the corresponding bfd definition. To avoid duplication,
5900 1.1 skrll the switch was removed. Machines that need special handling
5901 1.1 skrll can generally do it in elf_backend_final_write_processing(),
5902 1.1 skrll unless they need the information earlier than the final write.
5903 1.1 skrll Such need can generally be supplied by replacing the tests for
5904 1.1 skrll e_machine with the conditions used to determine it. */
5905 1.1 skrll default:
5906 1.1 skrll i_ehdrp->e_machine = bed->elf_machine_code;
5907 1.1 skrll }
5908 1.1 skrll
5909 1.1 skrll i_ehdrp->e_version = bed->s->ev_current;
5910 1.1 skrll i_ehdrp->e_ehsize = bed->s->sizeof_ehdr;
5911 1.1 skrll
5912 1.1 skrll /* No program header, for now. */
5913 1.1 skrll i_ehdrp->e_phoff = 0;
5914 1.1 skrll i_ehdrp->e_phentsize = 0;
5915 1.1 skrll i_ehdrp->e_phnum = 0;
5916 1.1 skrll
5917 1.1 skrll /* Each bfd section is section header entry. */
5918 1.1 skrll i_ehdrp->e_entry = bfd_get_start_address (abfd);
5919 1.1 skrll i_ehdrp->e_shentsize = bed->s->sizeof_shdr;
5920 1.1 skrll
5921 1.1 skrll /* If we're building an executable, we'll need a program header table. */
5922 1.1 skrll if (abfd->flags & EXEC_P)
5923 1.1 skrll /* It all happens later. */
5924 1.1 skrll ;
5925 1.1 skrll else
5926 1.1 skrll {
5927 1.1 skrll i_ehdrp->e_phentsize = 0;
5928 1.1 skrll i_ehdrp->e_phoff = 0;
5929 1.1 skrll }
5930 1.1 skrll
5931 1.1 skrll elf_tdata (abfd)->symtab_hdr.sh_name =
5932 1.1 skrll (unsigned int) _bfd_elf_strtab_add (shstrtab, ".symtab", FALSE);
5933 1.1 skrll elf_tdata (abfd)->strtab_hdr.sh_name =
5934 1.1 skrll (unsigned int) _bfd_elf_strtab_add (shstrtab, ".strtab", FALSE);
5935 1.1 skrll elf_tdata (abfd)->shstrtab_hdr.sh_name =
5936 1.6 christos (unsigned int) _bfd_elf_strtab_add (shstrtab, ".shstrtab", FALSE);
5937 1.1 skrll if (elf_tdata (abfd)->symtab_hdr.sh_name == (unsigned int) -1
5938 1.1 skrll || elf_tdata (abfd)->strtab_hdr.sh_name == (unsigned int) -1
5939 1.1 skrll || elf_tdata (abfd)->shstrtab_hdr.sh_name == (unsigned int) -1)
5940 1.1 skrll return FALSE;
5941 1.1 skrll
5942 1.1 skrll return TRUE;
5943 1.1 skrll }
5944 1.6 christos
5945 1.1 skrll /* Assign file positions for all the reloc sections which are not part
5946 1.6 christos of the loadable file image, and the file position of section headers. */
5947 1.6 christos
5948 1.1 skrll static bfd_boolean
5949 1.1 skrll _bfd_elf_assign_file_positions_for_non_load (bfd *abfd)
5950 1.6 christos {
5951 1.6 christos file_ptr off;
5952 1.6 christos Elf_Internal_Shdr **shdrpp, **end_shdrpp;
5953 1.6 christos Elf_Internal_Shdr *shdrp;
5954 1.1 skrll Elf_Internal_Ehdr *i_ehdrp;
5955 1.6 christos const struct elf_backend_data *bed;
5956 1.1 skrll
5957 1.6 christos off = elf_next_file_pos (abfd);
5958 1.6 christos
5959 1.6 christos shdrpp = elf_elfsections (abfd);
5960 1.1 skrll end_shdrpp = shdrpp + elf_numsections (abfd);
5961 1.6 christos for (shdrpp++; shdrpp < end_shdrpp; shdrpp++)
5962 1.6 christos {
5963 1.6 christos shdrp = *shdrpp;
5964 1.6 christos if (shdrp->sh_offset == -1)
5965 1.6 christos {
5966 1.6 christos asection *sec = shdrp->bfd_section;
5967 1.6 christos bfd_boolean is_rel = (shdrp->sh_type == SHT_REL
5968 1.6 christos || shdrp->sh_type == SHT_RELA);
5969 1.6 christos if (is_rel
5970 1.6 christos || (sec != NULL && (sec->flags & SEC_ELF_COMPRESS)))
5971 1.6 christos {
5972 1.6 christos if (!is_rel)
5973 1.6 christos {
5974 1.6 christos const char *name = sec->name;
5975 1.6 christos struct bfd_elf_section_data *d;
5976 1.6 christos
5977 1.6 christos /* Compress DWARF debug sections. */
5978 1.6 christos if (!bfd_compress_section (abfd, sec,
5979 1.1 skrll shdrp->contents))
5980 1.6 christos return FALSE;
5981 1.6 christos
5982 1.6 christos if (sec->compress_status == COMPRESS_SECTION_DONE
5983 1.6 christos && (abfd->flags & BFD_COMPRESS_GABI) == 0)
5984 1.6 christos {
5985 1.6 christos /* If section is compressed with zlib-gnu, convert
5986 1.6 christos section name from .debug_* to .zdebug_*. */
5987 1.6 christos char *new_name
5988 1.6 christos = convert_debug_to_zdebug (abfd, name);
5989 1.6 christos if (new_name == NULL)
5990 1.6 christos return FALSE;
5991 1.6 christos name = new_name;
5992 1.6 christos }
5993 1.6 christos /* Add setion name to section name section. */
5994 1.6 christos if (shdrp->sh_name != (unsigned int) -1)
5995 1.6 christos abort ();
5996 1.6 christos shdrp->sh_name
5997 1.6 christos = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
5998 1.6 christos name, FALSE);
5999 1.6 christos d = elf_section_data (sec);
6000 1.6 christos
6001 1.6 christos /* Add reloc setion name to section name section. */
6002 1.6 christos if (d->rel.hdr
6003 1.6 christos && !_bfd_elf_set_reloc_sh_name (abfd,
6004 1.6 christos d->rel.hdr,
6005 1.6 christos name, FALSE))
6006 1.6 christos return FALSE;
6007 1.6 christos if (d->rela.hdr
6008 1.6 christos && !_bfd_elf_set_reloc_sh_name (abfd,
6009 1.6 christos d->rela.hdr,
6010 1.6 christos name, TRUE))
6011 1.6 christos return FALSE;
6012 1.6 christos
6013 1.6 christos /* Update section size and contents. */
6014 1.6 christos shdrp->sh_size = sec->size;
6015 1.6 christos shdrp->contents = sec->contents;
6016 1.6 christos shdrp->bfd_section->contents = NULL;
6017 1.6 christos }
6018 1.6 christos off = _bfd_elf_assign_file_position_for_section (shdrp,
6019 1.6 christos off,
6020 1.6 christos TRUE);
6021 1.1 skrll }
6022 1.1 skrll }
6023 1.6 christos }
6024 1.6 christos
6025 1.6 christos /* Place section name section after DWARF debug sections have been
6026 1.6 christos compressed. */
6027 1.6 christos _bfd_elf_strtab_finalize (elf_shstrtab (abfd));
6028 1.6 christos shdrp = &elf_tdata (abfd)->shstrtab_hdr;
6029 1.6 christos shdrp->sh_size = _bfd_elf_strtab_size (elf_shstrtab (abfd));
6030 1.6 christos off = _bfd_elf_assign_file_position_for_section (shdrp, off, TRUE);
6031 1.6 christos
6032 1.6 christos /* Place the section headers. */
6033 1.6 christos i_ehdrp = elf_elfheader (abfd);
6034 1.6 christos bed = get_elf_backend_data (abfd);
6035 1.6 christos off = align_file_position (off, 1 << bed->s->log_file_align);
6036 1.6 christos i_ehdrp->e_shoff = off;
6037 1.6 christos off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize;
6038 1.6 christos elf_next_file_pos (abfd) = off;
6039 1.1 skrll
6040 1.1 skrll return TRUE;
6041 1.1 skrll }
6042 1.1 skrll
6043 1.1 skrll bfd_boolean
6044 1.1 skrll _bfd_elf_write_object_contents (bfd *abfd)
6045 1.1 skrll {
6046 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
6047 1.1 skrll Elf_Internal_Shdr **i_shdrp;
6048 1.6 christos bfd_boolean failed;
6049 1.1 skrll unsigned int count, num_sec;
6050 1.1 skrll struct elf_obj_tdata *t;
6051 1.1 skrll
6052 1.1 skrll if (! abfd->output_has_begun
6053 1.1 skrll && ! _bfd_elf_compute_section_file_positions (abfd, NULL))
6054 1.1 skrll return FALSE;
6055 1.1 skrll
6056 1.1 skrll i_shdrp = elf_elfsections (abfd);
6057 1.1 skrll
6058 1.1 skrll failed = FALSE;
6059 1.1 skrll bfd_map_over_sections (abfd, bed->s->write_relocs, &failed);
6060 1.1 skrll if (failed)
6061 1.6 christos return FALSE;
6062 1.6 christos
6063 1.1 skrll if (!_bfd_elf_assign_file_positions_for_non_load (abfd))
6064 1.1 skrll return FALSE;
6065 1.1 skrll
6066 1.1 skrll /* After writing the headers, we need to write the sections too... */
6067 1.1 skrll num_sec = elf_numsections (abfd);
6068 1.6 christos for (count = 1; count < num_sec; count++)
6069 1.6 christos {
6070 1.6 christos i_shdrp[count]->sh_name
6071 1.1 skrll = _bfd_elf_strtab_offset (elf_shstrtab (abfd),
6072 1.1 skrll i_shdrp[count]->sh_name);
6073 1.1 skrll if (bed->elf_backend_section_processing)
6074 1.1 skrll (*bed->elf_backend_section_processing) (abfd, i_shdrp[count]);
6075 1.1 skrll if (i_shdrp[count]->contents)
6076 1.1 skrll {
6077 1.1 skrll bfd_size_type amt = i_shdrp[count]->sh_size;
6078 1.1 skrll
6079 1.1 skrll if (bfd_seek (abfd, i_shdrp[count]->sh_offset, SEEK_SET) != 0
6080 1.1 skrll || bfd_bwrite (i_shdrp[count]->contents, amt, abfd) != amt)
6081 1.1 skrll return FALSE;
6082 1.1 skrll }
6083 1.1 skrll }
6084 1.6 christos
6085 1.1 skrll /* Write out the section header names. */
6086 1.6 christos t = elf_tdata (abfd);
6087 1.1 skrll if (elf_shstrtab (abfd) != NULL
6088 1.1 skrll && (bfd_seek (abfd, t->shstrtab_hdr.sh_offset, SEEK_SET) != 0
6089 1.1 skrll || !_bfd_elf_strtab_emit (abfd, elf_shstrtab (abfd))))
6090 1.1 skrll return FALSE;
6091 1.6 christos
6092 1.1 skrll if (bed->elf_backend_final_write_processing)
6093 1.1 skrll (*bed->elf_backend_final_write_processing) (abfd, elf_linker (abfd));
6094 1.1 skrll
6095 1.1 skrll if (!bed->s->write_shdrs_and_ehdr (abfd))
6096 1.1 skrll return FALSE;
6097 1.6 christos
6098 1.6 christos /* This is last since write_shdrs_and_ehdr can touch i_shdrp[0]. */
6099 1.1 skrll if (t->o->build_id.after_write_object_contents != NULL)
6100 1.1 skrll return (*t->o->build_id.after_write_object_contents) (abfd);
6101 1.1 skrll
6102 1.1 skrll return TRUE;
6103 1.1 skrll }
6104 1.1 skrll
6105 1.1 skrll bfd_boolean
6106 1.1 skrll _bfd_elf_write_corefile_contents (bfd *abfd)
6107 1.1 skrll {
6108 1.1 skrll /* Hopefully this can be done just like an object file. */
6109 1.1 skrll return _bfd_elf_write_object_contents (abfd);
6110 1.1 skrll }
6111 1.1 skrll
6112 1.1 skrll /* Given a section, search the header to find them. */
6113 1.1 skrll
6114 1.1 skrll unsigned int
6115 1.1 skrll _bfd_elf_section_from_bfd_section (bfd *abfd, struct bfd_section *asect)
6116 1.3 christos {
6117 1.1 skrll const struct elf_backend_data *bed;
6118 1.1 skrll unsigned int sec_index;
6119 1.1 skrll
6120 1.1 skrll if (elf_section_data (asect) != NULL
6121 1.1 skrll && elf_section_data (asect)->this_idx != 0)
6122 1.1 skrll return elf_section_data (asect)->this_idx;
6123 1.3 christos
6124 1.1 skrll if (bfd_is_abs_section (asect))
6125 1.3 christos sec_index = SHN_ABS;
6126 1.1 skrll else if (bfd_is_com_section (asect))
6127 1.3 christos sec_index = SHN_COMMON;
6128 1.1 skrll else if (bfd_is_und_section (asect))
6129 1.3 christos sec_index = SHN_UNDEF;
6130 1.1 skrll else
6131 1.1 skrll sec_index = SHN_BAD;
6132 1.1 skrll
6133 1.1 skrll bed = get_elf_backend_data (abfd);
6134 1.3 christos if (bed->elf_backend_section_from_bfd_section)
6135 1.1 skrll {
6136 1.1 skrll int retval = sec_index;
6137 1.1 skrll
6138 1.1 skrll if ((*bed->elf_backend_section_from_bfd_section) (abfd, asect, &retval))
6139 1.1 skrll return retval;
6140 1.3 christos }
6141 1.1 skrll
6142 1.1 skrll if (sec_index == SHN_BAD)
6143 1.3 christos bfd_set_error (bfd_error_nonrepresentable_section);
6144 1.1 skrll
6145 1.1 skrll return sec_index;
6146 1.1 skrll }
6147 1.1 skrll
6148 1.1 skrll /* Given a BFD symbol, return the index in the ELF symbol table, or -1
6149 1.1 skrll on error. */
6150 1.1 skrll
6151 1.1 skrll int
6152 1.1 skrll _bfd_elf_symbol_from_bfd_symbol (bfd *abfd, asymbol **asym_ptr_ptr)
6153 1.1 skrll {
6154 1.1 skrll asymbol *asym_ptr = *asym_ptr_ptr;
6155 1.1 skrll int idx;
6156 1.1 skrll flagword flags = asym_ptr->flags;
6157 1.1 skrll
6158 1.1 skrll /* When gas creates relocations against local labels, it creates its
6159 1.1 skrll own symbol for the section, but does put the symbol into the
6160 1.1 skrll symbol chain, so udata is 0. When the linker is generating
6161 1.1 skrll relocatable output, this section symbol may be for one of the
6162 1.1 skrll input sections rather than the output section. */
6163 1.1 skrll if (asym_ptr->udata.i == 0
6164 1.1 skrll && (flags & BSF_SECTION_SYM)
6165 1.1 skrll && asym_ptr->section)
6166 1.1 skrll {
6167 1.1 skrll asection *sec;
6168 1.1 skrll int indx;
6169 1.1 skrll
6170 1.1 skrll sec = asym_ptr->section;
6171 1.1 skrll if (sec->owner != abfd && sec->output_section != NULL)
6172 1.1 skrll sec = sec->output_section;
6173 1.1 skrll if (sec->owner == abfd
6174 1.1 skrll && (indx = sec->index) < elf_num_section_syms (abfd)
6175 1.1 skrll && elf_section_syms (abfd)[indx] != NULL)
6176 1.1 skrll asym_ptr->udata.i = elf_section_syms (abfd)[indx]->udata.i;
6177 1.1 skrll }
6178 1.1 skrll
6179 1.1 skrll idx = asym_ptr->udata.i;
6180 1.1 skrll
6181 1.1 skrll if (idx == 0)
6182 1.1 skrll {
6183 1.1 skrll /* This case can occur when using --strip-symbol on a symbol
6184 1.1 skrll which is used in a relocation entry. */
6185 1.1 skrll (*_bfd_error_handler)
6186 1.1 skrll (_("%B: symbol `%s' required but not present"),
6187 1.1 skrll abfd, bfd_asymbol_name (asym_ptr));
6188 1.1 skrll bfd_set_error (bfd_error_no_symbols);
6189 1.1 skrll return -1;
6190 1.1 skrll }
6191 1.1 skrll
6192 1.1 skrll #if DEBUG & 4
6193 1.3 christos {
6194 1.3 christos fprintf (stderr,
6195 1.1 skrll "elf_symbol_from_bfd_symbol 0x%.8lx, name = %s, sym num = %d, flags = 0x%.8lx\n",
6196 1.1 skrll (long) asym_ptr, asym_ptr->name, idx, (long) flags);
6197 1.1 skrll fflush (stderr);
6198 1.1 skrll }
6199 1.1 skrll #endif
6200 1.1 skrll
6201 1.1 skrll return idx;
6202 1.1 skrll }
6203 1.1 skrll
6204 1.1 skrll /* Rewrite program header information. */
6205 1.1 skrll
6206 1.1 skrll static bfd_boolean
6207 1.1 skrll rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
6208 1.1 skrll {
6209 1.1 skrll Elf_Internal_Ehdr *iehdr;
6210 1.1 skrll struct elf_segment_map *map;
6211 1.1 skrll struct elf_segment_map *map_first;
6212 1.1 skrll struct elf_segment_map **pointer_to_map;
6213 1.1 skrll Elf_Internal_Phdr *segment;
6214 1.1 skrll asection *section;
6215 1.1 skrll unsigned int i;
6216 1.1 skrll unsigned int num_segments;
6217 1.1 skrll bfd_boolean phdr_included = FALSE;
6218 1.1 skrll bfd_boolean p_paddr_valid;
6219 1.1 skrll bfd_vma maxpagesize;
6220 1.1 skrll struct elf_segment_map *phdr_adjust_seg = NULL;
6221 1.1 skrll unsigned int phdr_adjust_num = 0;
6222 1.1 skrll const struct elf_backend_data *bed;
6223 1.1 skrll
6224 1.1 skrll bed = get_elf_backend_data (ibfd);
6225 1.1 skrll iehdr = elf_elfheader (ibfd);
6226 1.1 skrll
6227 1.1 skrll map_first = NULL;
6228 1.1 skrll pointer_to_map = &map_first;
6229 1.1 skrll
6230 1.1 skrll num_segments = elf_elfheader (ibfd)->e_phnum;
6231 1.1 skrll maxpagesize = get_elf_backend_data (obfd)->maxpagesize;
6232 1.1 skrll
6233 1.1 skrll /* Returns the end address of the segment + 1. */
6234 1.1 skrll #define SEGMENT_END(segment, start) \
6235 1.1 skrll (start + (segment->p_memsz > segment->p_filesz \
6236 1.1 skrll ? segment->p_memsz : segment->p_filesz))
6237 1.1 skrll
6238 1.1 skrll #define SECTION_SIZE(section, segment) \
6239 1.1 skrll (((section->flags & (SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) \
6240 1.1 skrll != SEC_THREAD_LOCAL || segment->p_type == PT_TLS) \
6241 1.1 skrll ? section->size : 0)
6242 1.1 skrll
6243 1.1 skrll /* Returns TRUE if the given section is contained within
6244 1.1 skrll the given segment. VMA addresses are compared. */
6245 1.1 skrll #define IS_CONTAINED_BY_VMA(section, segment) \
6246 1.1 skrll (section->vma >= segment->p_vaddr \
6247 1.1 skrll && (section->vma + SECTION_SIZE (section, segment) \
6248 1.1 skrll <= (SEGMENT_END (segment, segment->p_vaddr))))
6249 1.1 skrll
6250 1.1 skrll /* Returns TRUE if the given section is contained within
6251 1.1 skrll the given segment. LMA addresses are compared. */
6252 1.1 skrll #define IS_CONTAINED_BY_LMA(section, segment, base) \
6253 1.1 skrll (section->lma >= base \
6254 1.1 skrll && (section->lma + SECTION_SIZE (section, segment) \
6255 1.1 skrll <= SEGMENT_END (segment, base)))
6256 1.1 skrll
6257 1.1 skrll /* Handle PT_NOTE segment. */
6258 1.1 skrll #define IS_NOTE(p, s) \
6259 1.1 skrll (p->p_type == PT_NOTE \
6260 1.1 skrll && elf_section_type (s) == SHT_NOTE \
6261 1.1 skrll && (bfd_vma) s->filepos >= p->p_offset \
6262 1.1 skrll && ((bfd_vma) s->filepos + s->size \
6263 1.1 skrll <= p->p_offset + p->p_filesz))
6264 1.1 skrll
6265 1.1 skrll /* Special case: corefile "NOTE" section containing regs, prpsinfo
6266 1.1 skrll etc. */
6267 1.1 skrll #define IS_COREFILE_NOTE(p, s) \
6268 1.1 skrll (IS_NOTE (p, s) \
6269 1.1 skrll && bfd_get_format (ibfd) == bfd_core \
6270 1.1 skrll && s->vma == 0 \
6271 1.1 skrll && s->lma == 0)
6272 1.1 skrll
6273 1.1 skrll /* The complicated case when p_vaddr is 0 is to handle the Solaris
6274 1.1 skrll linker, which generates a PT_INTERP section with p_vaddr and
6275 1.1 skrll p_memsz set to 0. */
6276 1.1 skrll #define IS_SOLARIS_PT_INTERP(p, s) \
6277 1.1 skrll (p->p_vaddr == 0 \
6278 1.1 skrll && p->p_paddr == 0 \
6279 1.1 skrll && p->p_memsz == 0 \
6280 1.1 skrll && p->p_filesz > 0 \
6281 1.1 skrll && (s->flags & SEC_HAS_CONTENTS) != 0 \
6282 1.1 skrll && s->size > 0 \
6283 1.1 skrll && (bfd_vma) s->filepos >= p->p_offset \
6284 1.1 skrll && ((bfd_vma) s->filepos + s->size \
6285 1.1 skrll <= p->p_offset + p->p_filesz))
6286 1.1 skrll
6287 1.1 skrll /* Decide if the given section should be included in the given segment.
6288 1.1 skrll A section will be included if:
6289 1.1 skrll 1. It is within the address space of the segment -- we use the LMA
6290 1.5 christos if that is set for the segment and the VMA otherwise,
6291 1.1 skrll 2. It is an allocated section or a NOTE section in a PT_NOTE
6292 1.1 skrll segment.
6293 1.1 skrll 3. There is an output section associated with it,
6294 1.1 skrll 4. The section has not already been allocated to a previous segment.
6295 1.1 skrll 5. PT_GNU_STACK segments do not include any sections.
6296 1.1 skrll 6. PT_TLS segment includes only SHF_TLS sections.
6297 1.1 skrll 7. SHF_TLS sections are only in PT_TLS or PT_LOAD segments.
6298 1.1 skrll 8. PT_DYNAMIC should not contain empty sections at the beginning
6299 1.1 skrll (with the possible exception of .dynamic). */
6300 1.1 skrll #define IS_SECTION_IN_INPUT_SEGMENT(section, segment, bed) \
6301 1.1 skrll ((((segment->p_paddr \
6302 1.1 skrll ? IS_CONTAINED_BY_LMA (section, segment, segment->p_paddr) \
6303 1.1 skrll : IS_CONTAINED_BY_VMA (section, segment)) \
6304 1.1 skrll && (section->flags & SEC_ALLOC) != 0) \
6305 1.1 skrll || IS_NOTE (segment, section)) \
6306 1.1 skrll && segment->p_type != PT_GNU_STACK \
6307 1.1 skrll && (segment->p_type != PT_TLS \
6308 1.1 skrll || (section->flags & SEC_THREAD_LOCAL)) \
6309 1.1 skrll && (segment->p_type == PT_LOAD \
6310 1.1 skrll || segment->p_type == PT_TLS \
6311 1.1 skrll || (section->flags & SEC_THREAD_LOCAL) == 0) \
6312 1.1 skrll && (segment->p_type != PT_DYNAMIC \
6313 1.1 skrll || SECTION_SIZE (section, segment) > 0 \
6314 1.1 skrll || (segment->p_paddr \
6315 1.1 skrll ? segment->p_paddr != section->lma \
6316 1.1 skrll : segment->p_vaddr != section->vma) \
6317 1.1 skrll || (strcmp (bfd_get_section_name (ibfd, section), ".dynamic") \
6318 1.1 skrll == 0)) \
6319 1.1 skrll && !section->segment_mark)
6320 1.1 skrll
6321 1.1 skrll /* If the output section of a section in the input segment is NULL,
6322 1.1 skrll it is removed from the corresponding output segment. */
6323 1.1 skrll #define INCLUDE_SECTION_IN_SEGMENT(section, segment, bed) \
6324 1.1 skrll (IS_SECTION_IN_INPUT_SEGMENT (section, segment, bed) \
6325 1.1 skrll && section->output_section != NULL)
6326 1.1 skrll
6327 1.1 skrll /* Returns TRUE iff seg1 starts after the end of seg2. */
6328 1.1 skrll #define SEGMENT_AFTER_SEGMENT(seg1, seg2, field) \
6329 1.1 skrll (seg1->field >= SEGMENT_END (seg2, seg2->field))
6330 1.1 skrll
6331 1.1 skrll /* Returns TRUE iff seg1 and seg2 overlap. Segments overlap iff both
6332 1.1 skrll their VMA address ranges and their LMA address ranges overlap.
6333 1.1 skrll It is possible to have overlapping VMA ranges without overlapping LMA
6334 1.1 skrll ranges. RedBoot images for example can have both .data and .bss mapped
6335 1.1 skrll to the same VMA range, but with the .data section mapped to a different
6336 1.1 skrll LMA. */
6337 1.1 skrll #define SEGMENT_OVERLAPS(seg1, seg2) \
6338 1.1 skrll ( !(SEGMENT_AFTER_SEGMENT (seg1, seg2, p_vaddr) \
6339 1.1 skrll || SEGMENT_AFTER_SEGMENT (seg2, seg1, p_vaddr)) \
6340 1.1 skrll && !(SEGMENT_AFTER_SEGMENT (seg1, seg2, p_paddr) \
6341 1.1 skrll || SEGMENT_AFTER_SEGMENT (seg2, seg1, p_paddr)))
6342 1.1 skrll
6343 1.1 skrll /* Initialise the segment mark field. */
6344 1.1 skrll for (section = ibfd->sections; section != NULL; section = section->next)
6345 1.1 skrll section->segment_mark = FALSE;
6346 1.1 skrll
6347 1.1 skrll /* The Solaris linker creates program headers in which all the
6348 1.1 skrll p_paddr fields are zero. When we try to objcopy or strip such a
6349 1.1 skrll file, we get confused. Check for this case, and if we find it
6350 1.1 skrll don't set the p_paddr_valid fields. */
6351 1.1 skrll p_paddr_valid = FALSE;
6352 1.1 skrll for (i = 0, segment = elf_tdata (ibfd)->phdr;
6353 1.1 skrll i < num_segments;
6354 1.1 skrll i++, segment++)
6355 1.1 skrll if (segment->p_paddr != 0)
6356 1.1 skrll {
6357 1.1 skrll p_paddr_valid = TRUE;
6358 1.1 skrll break;
6359 1.1 skrll }
6360 1.1 skrll
6361 1.1 skrll /* Scan through the segments specified in the program header
6362 1.1 skrll of the input BFD. For this first scan we look for overlaps
6363 1.1 skrll in the loadable segments. These can be created by weird
6364 1.1 skrll parameters to objcopy. Also, fix some solaris weirdness. */
6365 1.1 skrll for (i = 0, segment = elf_tdata (ibfd)->phdr;
6366 1.1 skrll i < num_segments;
6367 1.1 skrll i++, segment++)
6368 1.1 skrll {
6369 1.1 skrll unsigned int j;
6370 1.1 skrll Elf_Internal_Phdr *segment2;
6371 1.1 skrll
6372 1.1 skrll if (segment->p_type == PT_INTERP)
6373 1.1 skrll for (section = ibfd->sections; section; section = section->next)
6374 1.1 skrll if (IS_SOLARIS_PT_INTERP (segment, section))
6375 1.1 skrll {
6376 1.1 skrll /* Mininal change so that the normal section to segment
6377 1.1 skrll assignment code will work. */
6378 1.1 skrll segment->p_vaddr = section->vma;
6379 1.1 skrll break;
6380 1.1 skrll }
6381 1.1 skrll
6382 1.1 skrll if (segment->p_type != PT_LOAD)
6383 1.1 skrll {
6384 1.1 skrll /* Remove PT_GNU_RELRO segment. */
6385 1.1 skrll if (segment->p_type == PT_GNU_RELRO)
6386 1.1 skrll segment->p_type = PT_NULL;
6387 1.1 skrll continue;
6388 1.1 skrll }
6389 1.1 skrll
6390 1.1 skrll /* Determine if this segment overlaps any previous segments. */
6391 1.1 skrll for (j = 0, segment2 = elf_tdata (ibfd)->phdr; j < i; j++, segment2++)
6392 1.1 skrll {
6393 1.1 skrll bfd_signed_vma extra_length;
6394 1.1 skrll
6395 1.1 skrll if (segment2->p_type != PT_LOAD
6396 1.1 skrll || !SEGMENT_OVERLAPS (segment, segment2))
6397 1.1 skrll continue;
6398 1.1 skrll
6399 1.1 skrll /* Merge the two segments together. */
6400 1.1 skrll if (segment2->p_vaddr < segment->p_vaddr)
6401 1.1 skrll {
6402 1.1 skrll /* Extend SEGMENT2 to include SEGMENT and then delete
6403 1.1 skrll SEGMENT. */
6404 1.1 skrll extra_length = (SEGMENT_END (segment, segment->p_vaddr)
6405 1.1 skrll - SEGMENT_END (segment2, segment2->p_vaddr));
6406 1.1 skrll
6407 1.1 skrll if (extra_length > 0)
6408 1.1 skrll {
6409 1.1 skrll segment2->p_memsz += extra_length;
6410 1.1 skrll segment2->p_filesz += extra_length;
6411 1.1 skrll }
6412 1.1 skrll
6413 1.1 skrll segment->p_type = PT_NULL;
6414 1.1 skrll
6415 1.1 skrll /* Since we have deleted P we must restart the outer loop. */
6416 1.1 skrll i = 0;
6417 1.1 skrll segment = elf_tdata (ibfd)->phdr;
6418 1.1 skrll break;
6419 1.1 skrll }
6420 1.1 skrll else
6421 1.1 skrll {
6422 1.1 skrll /* Extend SEGMENT to include SEGMENT2 and then delete
6423 1.1 skrll SEGMENT2. */
6424 1.1 skrll extra_length = (SEGMENT_END (segment2, segment2->p_vaddr)
6425 1.1 skrll - SEGMENT_END (segment, segment->p_vaddr));
6426 1.1 skrll
6427 1.1 skrll if (extra_length > 0)
6428 1.1 skrll {
6429 1.1 skrll segment->p_memsz += extra_length;
6430 1.1 skrll segment->p_filesz += extra_length;
6431 1.1 skrll }
6432 1.1 skrll
6433 1.1 skrll segment2->p_type = PT_NULL;
6434 1.1 skrll }
6435 1.1 skrll }
6436 1.1 skrll }
6437 1.1 skrll
6438 1.1 skrll /* The second scan attempts to assign sections to segments. */
6439 1.1 skrll for (i = 0, segment = elf_tdata (ibfd)->phdr;
6440 1.1 skrll i < num_segments;
6441 1.1 skrll i++, segment++)
6442 1.1 skrll {
6443 1.1 skrll unsigned int section_count;
6444 1.1 skrll asection **sections;
6445 1.1 skrll asection *output_section;
6446 1.1 skrll unsigned int isec;
6447 1.1 skrll bfd_vma matching_lma;
6448 1.1 skrll bfd_vma suggested_lma;
6449 1.1 skrll unsigned int j;
6450 1.1 skrll bfd_size_type amt;
6451 1.1 skrll asection *first_section;
6452 1.1 skrll bfd_boolean first_matching_lma;
6453 1.1 skrll bfd_boolean first_suggested_lma;
6454 1.1 skrll
6455 1.1 skrll if (segment->p_type == PT_NULL)
6456 1.1 skrll continue;
6457 1.1 skrll
6458 1.1 skrll first_section = NULL;
6459 1.1 skrll /* Compute how many sections might be placed into this segment. */
6460 1.1 skrll for (section = ibfd->sections, section_count = 0;
6461 1.1 skrll section != NULL;
6462 1.1 skrll section = section->next)
6463 1.1 skrll {
6464 1.1 skrll /* Find the first section in the input segment, which may be
6465 1.1 skrll removed from the corresponding output segment. */
6466 1.1 skrll if (IS_SECTION_IN_INPUT_SEGMENT (section, segment, bed))
6467 1.1 skrll {
6468 1.1 skrll if (first_section == NULL)
6469 1.1 skrll first_section = section;
6470 1.1 skrll if (section->output_section != NULL)
6471 1.1 skrll ++section_count;
6472 1.1 skrll }
6473 1.1 skrll }
6474 1.1 skrll
6475 1.1 skrll /* Allocate a segment map big enough to contain
6476 1.1 skrll all of the sections we have selected. */
6477 1.3 christos amt = sizeof (struct elf_segment_map);
6478 1.1 skrll amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
6479 1.1 skrll map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
6480 1.1 skrll if (map == NULL)
6481 1.1 skrll return FALSE;
6482 1.1 skrll
6483 1.1 skrll /* Initialise the fields of the segment map. Default to
6484 1.1 skrll using the physical address of the segment in the input BFD. */
6485 1.1 skrll map->next = NULL;
6486 1.1 skrll map->p_type = segment->p_type;
6487 1.1 skrll map->p_flags = segment->p_flags;
6488 1.1 skrll map->p_flags_valid = 1;
6489 1.1 skrll
6490 1.1 skrll /* If the first section in the input segment is removed, there is
6491 1.1 skrll no need to preserve segment physical address in the corresponding
6492 1.1 skrll output segment. */
6493 1.1 skrll if (!first_section || first_section->output_section != NULL)
6494 1.1 skrll {
6495 1.1 skrll map->p_paddr = segment->p_paddr;
6496 1.1 skrll map->p_paddr_valid = p_paddr_valid;
6497 1.1 skrll }
6498 1.1 skrll
6499 1.1 skrll /* Determine if this segment contains the ELF file header
6500 1.1 skrll and if it contains the program headers themselves. */
6501 1.1 skrll map->includes_filehdr = (segment->p_offset == 0
6502 1.1 skrll && segment->p_filesz >= iehdr->e_ehsize);
6503 1.1 skrll map->includes_phdrs = 0;
6504 1.1 skrll
6505 1.1 skrll if (!phdr_included || segment->p_type != PT_LOAD)
6506 1.1 skrll {
6507 1.1 skrll map->includes_phdrs =
6508 1.1 skrll (segment->p_offset <= (bfd_vma) iehdr->e_phoff
6509 1.1 skrll && (segment->p_offset + segment->p_filesz
6510 1.1 skrll >= ((bfd_vma) iehdr->e_phoff
6511 1.1 skrll + iehdr->e_phnum * iehdr->e_phentsize)));
6512 1.1 skrll
6513 1.1 skrll if (segment->p_type == PT_LOAD && map->includes_phdrs)
6514 1.1 skrll phdr_included = TRUE;
6515 1.1 skrll }
6516 1.1 skrll
6517 1.1 skrll if (section_count == 0)
6518 1.1 skrll {
6519 1.1 skrll /* Special segments, such as the PT_PHDR segment, may contain
6520 1.1 skrll no sections, but ordinary, loadable segments should contain
6521 1.1 skrll something. They are allowed by the ELF spec however, so only
6522 1.6 christos a warning is produced. */
6523 1.6 christos if (segment->p_type == PT_LOAD)
6524 1.1 skrll (*_bfd_error_handler) (_("\
6525 1.1 skrll %B: warning: Empty loadable segment detected, is this intentional ?"),
6526 1.1 skrll ibfd);
6527 1.1 skrll
6528 1.1 skrll map->count = 0;
6529 1.1 skrll *pointer_to_map = map;
6530 1.1 skrll pointer_to_map = &map->next;
6531 1.1 skrll
6532 1.1 skrll continue;
6533 1.1 skrll }
6534 1.1 skrll
6535 1.1 skrll /* Now scan the sections in the input BFD again and attempt
6536 1.1 skrll to add their corresponding output sections to the segment map.
6537 1.1 skrll The problem here is how to handle an output section which has
6538 1.1 skrll been moved (ie had its LMA changed). There are four possibilities:
6539 1.1 skrll
6540 1.1 skrll 1. None of the sections have been moved.
6541 1.1 skrll In this case we can continue to use the segment LMA from the
6542 1.1 skrll input BFD.
6543 1.1 skrll
6544 1.1 skrll 2. All of the sections have been moved by the same amount.
6545 1.1 skrll In this case we can change the segment's LMA to match the LMA
6546 1.1 skrll of the first section.
6547 1.1 skrll
6548 1.1 skrll 3. Some of the sections have been moved, others have not.
6549 1.1 skrll In this case those sections which have not been moved can be
6550 1.1 skrll placed in the current segment which will have to have its size,
6551 1.1 skrll and possibly its LMA changed, and a new segment or segments will
6552 1.1 skrll have to be created to contain the other sections.
6553 1.1 skrll
6554 1.1 skrll 4. The sections have been moved, but not by the same amount.
6555 1.1 skrll In this case we can change the segment's LMA to match the LMA
6556 1.1 skrll of the first section and we will have to create a new segment
6557 1.1 skrll or segments to contain the other sections.
6558 1.1 skrll
6559 1.1 skrll In order to save time, we allocate an array to hold the section
6560 1.1 skrll pointers that we are interested in. As these sections get assigned
6561 1.3 christos to a segment, they are removed from this array. */
6562 1.1 skrll
6563 1.1 skrll sections = (asection **) bfd_malloc2 (section_count, sizeof (asection *));
6564 1.1 skrll if (sections == NULL)
6565 1.1 skrll return FALSE;
6566 1.1 skrll
6567 1.1 skrll /* Step One: Scan for segment vs section LMA conflicts.
6568 1.1 skrll Also add the sections to the section array allocated above.
6569 1.1 skrll Also add the sections to the current segment. In the common
6570 1.1 skrll case, where the sections have not been moved, this means that
6571 1.1 skrll we have completely filled the segment, and there is nothing
6572 1.1 skrll more to do. */
6573 1.1 skrll isec = 0;
6574 1.1 skrll matching_lma = 0;
6575 1.1 skrll suggested_lma = 0;
6576 1.1 skrll first_matching_lma = TRUE;
6577 1.6.2.1 pgoyette first_suggested_lma = TRUE;
6578 1.1 skrll
6579 1.1 skrll for (section = first_section, j = 0;
6580 1.1 skrll section != NULL;
6581 1.1 skrll section = section->next)
6582 1.1 skrll {
6583 1.1 skrll if (INCLUDE_SECTION_IN_SEGMENT (section, segment, bed))
6584 1.1 skrll {
6585 1.1 skrll output_section = section->output_section;
6586 1.1 skrll
6587 1.1 skrll sections[j++] = section;
6588 1.1 skrll
6589 1.1 skrll /* The Solaris native linker always sets p_paddr to 0.
6590 1.1 skrll We try to catch that case here, and set it to the
6591 1.1 skrll correct value. Note - some backends require that
6592 1.1 skrll p_paddr be left as zero. */
6593 1.1 skrll if (!p_paddr_valid
6594 1.1 skrll && segment->p_vaddr != 0
6595 1.1 skrll && !bed->want_p_paddr_set_to_zero
6596 1.1 skrll && isec == 0
6597 1.1 skrll && output_section->lma != 0
6598 1.1 skrll && output_section->vma == (segment->p_vaddr
6599 1.1 skrll + (map->includes_filehdr
6600 1.1 skrll ? iehdr->e_ehsize
6601 1.1 skrll : 0)
6602 1.1 skrll + (map->includes_phdrs
6603 1.1 skrll ? (iehdr->e_phnum
6604 1.1 skrll * iehdr->e_phentsize)
6605 1.1 skrll : 0)))
6606 1.1 skrll map->p_paddr = segment->p_vaddr;
6607 1.1 skrll
6608 1.1 skrll /* Match up the physical address of the segment with the
6609 1.1 skrll LMA address of the output section. */
6610 1.1 skrll if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr)
6611 1.1 skrll || IS_COREFILE_NOTE (segment, section)
6612 1.1 skrll || (bed->want_p_paddr_set_to_zero
6613 1.1 skrll && IS_CONTAINED_BY_VMA (output_section, segment)))
6614 1.1 skrll {
6615 1.1 skrll if (first_matching_lma || output_section->lma < matching_lma)
6616 1.1 skrll {
6617 1.1 skrll matching_lma = output_section->lma;
6618 1.1 skrll first_matching_lma = FALSE;
6619 1.1 skrll }
6620 1.1 skrll
6621 1.1 skrll /* We assume that if the section fits within the segment
6622 1.1 skrll then it does not overlap any other section within that
6623 1.1 skrll segment. */
6624 1.1 skrll map->sections[isec++] = output_section;
6625 1.1 skrll }
6626 1.1 skrll else if (first_suggested_lma)
6627 1.1 skrll {
6628 1.1 skrll suggested_lma = output_section->lma;
6629 1.1 skrll first_suggested_lma = FALSE;
6630 1.1 skrll }
6631 1.1 skrll
6632 1.1 skrll if (j == section_count)
6633 1.1 skrll break;
6634 1.1 skrll }
6635 1.1 skrll }
6636 1.1 skrll
6637 1.1 skrll BFD_ASSERT (j == section_count);
6638 1.1 skrll
6639 1.1 skrll /* Step Two: Adjust the physical address of the current segment,
6640 1.1 skrll if necessary. */
6641 1.1 skrll if (isec == section_count)
6642 1.1 skrll {
6643 1.1 skrll /* All of the sections fitted within the segment as currently
6644 1.1 skrll specified. This is the default case. Add the segment to
6645 1.1 skrll the list of built segments and carry on to process the next
6646 1.1 skrll program header in the input BFD. */
6647 1.1 skrll map->count = section_count;
6648 1.1 skrll *pointer_to_map = map;
6649 1.1 skrll pointer_to_map = &map->next;
6650 1.1 skrll
6651 1.1 skrll if (p_paddr_valid
6652 1.1 skrll && !bed->want_p_paddr_set_to_zero
6653 1.1 skrll && matching_lma != map->p_paddr
6654 1.1 skrll && !map->includes_filehdr
6655 1.1 skrll && !map->includes_phdrs)
6656 1.1 skrll /* There is some padding before the first section in the
6657 1.1 skrll segment. So, we must account for that in the output
6658 1.1 skrll segment's vma. */
6659 1.1 skrll map->p_vaddr_offset = matching_lma - map->p_paddr;
6660 1.1 skrll
6661 1.1 skrll free (sections);
6662 1.1 skrll continue;
6663 1.1 skrll }
6664 1.1 skrll else
6665 1.1 skrll {
6666 1.1 skrll if (!first_matching_lma)
6667 1.1 skrll {
6668 1.1 skrll /* At least one section fits inside the current segment.
6669 1.1 skrll Keep it, but modify its physical address to match the
6670 1.1 skrll LMA of the first section that fitted. */
6671 1.1 skrll map->p_paddr = matching_lma;
6672 1.1 skrll }
6673 1.1 skrll else
6674 1.1 skrll {
6675 1.1 skrll /* None of the sections fitted inside the current segment.
6676 1.1 skrll Change the current segment's physical address to match
6677 1.1 skrll the LMA of the first section. */
6678 1.1 skrll map->p_paddr = suggested_lma;
6679 1.1 skrll }
6680 1.1 skrll
6681 1.1 skrll /* Offset the segment physical address from the lma
6682 1.1 skrll to allow for space taken up by elf headers. */
6683 1.1 skrll if (map->includes_filehdr)
6684 1.1 skrll {
6685 1.1 skrll if (map->p_paddr >= iehdr->e_ehsize)
6686 1.1 skrll map->p_paddr -= iehdr->e_ehsize;
6687 1.1 skrll else
6688 1.1 skrll {
6689 1.1 skrll map->includes_filehdr = FALSE;
6690 1.1 skrll map->includes_phdrs = FALSE;
6691 1.1 skrll }
6692 1.1 skrll }
6693 1.1 skrll
6694 1.1 skrll if (map->includes_phdrs)
6695 1.1 skrll {
6696 1.1 skrll if (map->p_paddr >= iehdr->e_phnum * iehdr->e_phentsize)
6697 1.1 skrll {
6698 1.1 skrll map->p_paddr -= iehdr->e_phnum * iehdr->e_phentsize;
6699 1.1 skrll
6700 1.1 skrll /* iehdr->e_phnum is just an estimate of the number
6701 1.1 skrll of program headers that we will need. Make a note
6702 1.1 skrll here of the number we used and the segment we chose
6703 1.1 skrll to hold these headers, so that we can adjust the
6704 1.1 skrll offset when we know the correct value. */
6705 1.1 skrll phdr_adjust_num = iehdr->e_phnum;
6706 1.1 skrll phdr_adjust_seg = map;
6707 1.1 skrll }
6708 1.1 skrll else
6709 1.1 skrll map->includes_phdrs = FALSE;
6710 1.1 skrll }
6711 1.1 skrll }
6712 1.1 skrll
6713 1.1 skrll /* Step Three: Loop over the sections again, this time assigning
6714 1.1 skrll those that fit to the current segment and removing them from the
6715 1.1 skrll sections array; but making sure not to leave large gaps. Once all
6716 1.1 skrll possible sections have been assigned to the current segment it is
6717 1.1 skrll added to the list of built segments and if sections still remain
6718 1.1 skrll to be assigned, a new segment is constructed before repeating
6719 1.1 skrll the loop. */
6720 1.1 skrll isec = 0;
6721 1.1 skrll do
6722 1.1 skrll {
6723 1.1 skrll map->count = 0;
6724 1.1 skrll suggested_lma = 0;
6725 1.1 skrll first_suggested_lma = TRUE;
6726 1.1 skrll
6727 1.1 skrll /* Fill the current segment with sections that fit. */
6728 1.1 skrll for (j = 0; j < section_count; j++)
6729 1.1 skrll {
6730 1.1 skrll section = sections[j];
6731 1.1 skrll
6732 1.1 skrll if (section == NULL)
6733 1.1 skrll continue;
6734 1.1 skrll
6735 1.1 skrll output_section = section->output_section;
6736 1.1 skrll
6737 1.1 skrll BFD_ASSERT (output_section != NULL);
6738 1.1 skrll
6739 1.1 skrll if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr)
6740 1.1 skrll || IS_COREFILE_NOTE (segment, section))
6741 1.1 skrll {
6742 1.1 skrll if (map->count == 0)
6743 1.1 skrll {
6744 1.1 skrll /* If the first section in a segment does not start at
6745 1.1 skrll the beginning of the segment, then something is
6746 1.1 skrll wrong. */
6747 1.1 skrll if (output_section->lma
6748 1.1 skrll != (map->p_paddr
6749 1.1 skrll + (map->includes_filehdr ? iehdr->e_ehsize : 0)
6750 1.1 skrll + (map->includes_phdrs
6751 1.1 skrll ? iehdr->e_phnum * iehdr->e_phentsize
6752 1.1 skrll : 0)))
6753 1.1 skrll abort ();
6754 1.1 skrll }
6755 1.1 skrll else
6756 1.1 skrll {
6757 1.1 skrll asection *prev_sec;
6758 1.1 skrll
6759 1.1 skrll prev_sec = map->sections[map->count - 1];
6760 1.1 skrll
6761 1.1 skrll /* If the gap between the end of the previous section
6762 1.1 skrll and the start of this section is more than
6763 1.1 skrll maxpagesize then we need to start a new segment. */
6764 1.1 skrll if ((BFD_ALIGN (prev_sec->lma + prev_sec->size,
6765 1.1 skrll maxpagesize)
6766 1.1 skrll < BFD_ALIGN (output_section->lma, maxpagesize))
6767 1.1 skrll || (prev_sec->lma + prev_sec->size
6768 1.1 skrll > output_section->lma))
6769 1.1 skrll {
6770 1.1 skrll if (first_suggested_lma)
6771 1.1 skrll {
6772 1.1 skrll suggested_lma = output_section->lma;
6773 1.1 skrll first_suggested_lma = FALSE;
6774 1.1 skrll }
6775 1.1 skrll
6776 1.1 skrll continue;
6777 1.1 skrll }
6778 1.1 skrll }
6779 1.1 skrll
6780 1.1 skrll map->sections[map->count++] = output_section;
6781 1.1 skrll ++isec;
6782 1.1 skrll sections[j] = NULL;
6783 1.1 skrll section->segment_mark = TRUE;
6784 1.1 skrll }
6785 1.1 skrll else if (first_suggested_lma)
6786 1.1 skrll {
6787 1.1 skrll suggested_lma = output_section->lma;
6788 1.1 skrll first_suggested_lma = FALSE;
6789 1.1 skrll }
6790 1.1 skrll }
6791 1.1 skrll
6792 1.1 skrll BFD_ASSERT (map->count > 0);
6793 1.1 skrll
6794 1.1 skrll /* Add the current segment to the list of built segments. */
6795 1.1 skrll *pointer_to_map = map;
6796 1.1 skrll pointer_to_map = &map->next;
6797 1.1 skrll
6798 1.1 skrll if (isec < section_count)
6799 1.1 skrll {
6800 1.1 skrll /* We still have not allocated all of the sections to
6801 1.1 skrll segments. Create a new segment here, initialise it
6802 1.1 skrll and carry on looping. */
6803 1.5 christos amt = sizeof (struct elf_segment_map);
6804 1.1 skrll amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
6805 1.1 skrll map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
6806 1.1 skrll if (map == NULL)
6807 1.1 skrll {
6808 1.1 skrll free (sections);
6809 1.1 skrll return FALSE;
6810 1.1 skrll }
6811 1.1 skrll
6812 1.1 skrll /* Initialise the fields of the segment map. Set the physical
6813 1.1 skrll physical address to the LMA of the first section that has
6814 1.1 skrll not yet been assigned. */
6815 1.1 skrll map->next = NULL;
6816 1.1 skrll map->p_type = segment->p_type;
6817 1.1 skrll map->p_flags = segment->p_flags;
6818 1.1 skrll map->p_flags_valid = 1;
6819 1.1 skrll map->p_paddr = suggested_lma;
6820 1.1 skrll map->p_paddr_valid = p_paddr_valid;
6821 1.1 skrll map->includes_filehdr = 0;
6822 1.1 skrll map->includes_phdrs = 0;
6823 1.1 skrll }
6824 1.1 skrll }
6825 1.1 skrll while (isec < section_count);
6826 1.1 skrll
6827 1.1 skrll free (sections);
6828 1.6 christos }
6829 1.1 skrll
6830 1.1 skrll elf_seg_map (obfd) = map_first;
6831 1.1 skrll
6832 1.1 skrll /* If we had to estimate the number of program headers that were
6833 1.1 skrll going to be needed, then check our estimate now and adjust
6834 1.1 skrll the offset if necessary. */
6835 1.1 skrll if (phdr_adjust_seg != NULL)
6836 1.1 skrll {
6837 1.1 skrll unsigned int count;
6838 1.1 skrll
6839 1.1 skrll for (count = 0, map = map_first; map != NULL; map = map->next)
6840 1.1 skrll count++;
6841 1.1 skrll
6842 1.1 skrll if (count > phdr_adjust_num)
6843 1.1 skrll phdr_adjust_seg->p_paddr
6844 1.1 skrll -= (count - phdr_adjust_num) * iehdr->e_phentsize;
6845 1.1 skrll }
6846 1.1 skrll
6847 1.1 skrll #undef SEGMENT_END
6848 1.1 skrll #undef SECTION_SIZE
6849 1.1 skrll #undef IS_CONTAINED_BY_VMA
6850 1.1 skrll #undef IS_CONTAINED_BY_LMA
6851 1.1 skrll #undef IS_NOTE
6852 1.1 skrll #undef IS_COREFILE_NOTE
6853 1.1 skrll #undef IS_SOLARIS_PT_INTERP
6854 1.1 skrll #undef IS_SECTION_IN_INPUT_SEGMENT
6855 1.1 skrll #undef INCLUDE_SECTION_IN_SEGMENT
6856 1.1 skrll #undef SEGMENT_AFTER_SEGMENT
6857 1.1 skrll #undef SEGMENT_OVERLAPS
6858 1.1 skrll return TRUE;
6859 1.1 skrll }
6860 1.1 skrll
6861 1.1 skrll /* Copy ELF program header information. */
6862 1.1 skrll
6863 1.1 skrll static bfd_boolean
6864 1.1 skrll copy_elf_program_header (bfd *ibfd, bfd *obfd)
6865 1.1 skrll {
6866 1.1 skrll Elf_Internal_Ehdr *iehdr;
6867 1.1 skrll struct elf_segment_map *map;
6868 1.1 skrll struct elf_segment_map *map_first;
6869 1.1 skrll struct elf_segment_map **pointer_to_map;
6870 1.1 skrll Elf_Internal_Phdr *segment;
6871 1.1 skrll unsigned int i;
6872 1.1 skrll unsigned int num_segments;
6873 1.1 skrll bfd_boolean phdr_included = FALSE;
6874 1.1 skrll bfd_boolean p_paddr_valid;
6875 1.1 skrll
6876 1.1 skrll iehdr = elf_elfheader (ibfd);
6877 1.1 skrll
6878 1.1 skrll map_first = NULL;
6879 1.1 skrll pointer_to_map = &map_first;
6880 1.1 skrll
6881 1.1 skrll /* If all the segment p_paddr fields are zero, don't set
6882 1.1 skrll map->p_paddr_valid. */
6883 1.1 skrll p_paddr_valid = FALSE;
6884 1.1 skrll num_segments = elf_elfheader (ibfd)->e_phnum;
6885 1.1 skrll for (i = 0, segment = elf_tdata (ibfd)->phdr;
6886 1.1 skrll i < num_segments;
6887 1.1 skrll i++, segment++)
6888 1.1 skrll if (segment->p_paddr != 0)
6889 1.1 skrll {
6890 1.1 skrll p_paddr_valid = TRUE;
6891 1.1 skrll break;
6892 1.1 skrll }
6893 1.1 skrll
6894 1.1 skrll for (i = 0, segment = elf_tdata (ibfd)->phdr;
6895 1.1 skrll i < num_segments;
6896 1.1 skrll i++, segment++)
6897 1.1 skrll {
6898 1.1 skrll asection *section;
6899 1.1 skrll unsigned int section_count;
6900 1.1 skrll bfd_size_type amt;
6901 1.3 christos Elf_Internal_Shdr *this_hdr;
6902 1.1 skrll asection *first_section = NULL;
6903 1.1 skrll asection *lowest_section;
6904 1.1 skrll
6905 1.1 skrll /* Compute how many sections are in this segment. */
6906 1.1 skrll for (section = ibfd->sections, section_count = 0;
6907 1.1 skrll section != NULL;
6908 1.1 skrll section = section->next)
6909 1.3 christos {
6910 1.1 skrll this_hdr = &(elf_section_data(section)->this_hdr);
6911 1.3 christos if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
6912 1.3 christos {
6913 1.1 skrll if (first_section == NULL)
6914 1.1 skrll first_section = section;
6915 1.1 skrll section_count++;
6916 1.1 skrll }
6917 1.1 skrll }
6918 1.1 skrll
6919 1.1 skrll /* Allocate a segment map big enough to contain
6920 1.1 skrll all of the sections we have selected. */
6921 1.1 skrll amt = sizeof (struct elf_segment_map);
6922 1.3 christos if (section_count != 0)
6923 1.1 skrll amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
6924 1.1 skrll map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
6925 1.1 skrll if (map == NULL)
6926 1.1 skrll return FALSE;
6927 1.1 skrll
6928 1.1 skrll /* Initialize the fields of the output segment map with the
6929 1.1 skrll input segment. */
6930 1.1 skrll map->next = NULL;
6931 1.1 skrll map->p_type = segment->p_type;
6932 1.1 skrll map->p_flags = segment->p_flags;
6933 1.1 skrll map->p_flags_valid = 1;
6934 1.1 skrll map->p_paddr = segment->p_paddr;
6935 1.1 skrll map->p_paddr_valid = p_paddr_valid;
6936 1.1 skrll map->p_align = segment->p_align;
6937 1.1 skrll map->p_align_valid = 1;
6938 1.6 christos map->p_vaddr_offset = 0;
6939 1.6 christos
6940 1.1 skrll if (map->p_type == PT_GNU_RELRO
6941 1.1 skrll || map->p_type == PT_GNU_STACK)
6942 1.1 skrll {
6943 1.1 skrll /* The PT_GNU_RELRO segment may contain the first a few
6944 1.6 christos bytes in the .got.plt section even if the whole .got.plt
6945 1.6 christos section isn't in the PT_GNU_RELRO segment. We won't
6946 1.6 christos change the size of the PT_GNU_RELRO segment.
6947 1.3 christos Similarly, PT_GNU_STACK size is significant on uclinux
6948 1.1 skrll systems. */
6949 1.1 skrll map->p_size = segment->p_memsz;
6950 1.1 skrll map->p_size_valid = 1;
6951 1.1 skrll }
6952 1.1 skrll
6953 1.1 skrll /* Determine if this segment contains the ELF file header
6954 1.1 skrll and if it contains the program headers themselves. */
6955 1.1 skrll map->includes_filehdr = (segment->p_offset == 0
6956 1.1 skrll && segment->p_filesz >= iehdr->e_ehsize);
6957 1.1 skrll
6958 1.1 skrll map->includes_phdrs = 0;
6959 1.1 skrll if (! phdr_included || segment->p_type != PT_LOAD)
6960 1.1 skrll {
6961 1.1 skrll map->includes_phdrs =
6962 1.1 skrll (segment->p_offset <= (bfd_vma) iehdr->e_phoff
6963 1.1 skrll && (segment->p_offset + segment->p_filesz
6964 1.1 skrll >= ((bfd_vma) iehdr->e_phoff
6965 1.1 skrll + iehdr->e_phnum * iehdr->e_phentsize)));
6966 1.1 skrll
6967 1.1 skrll if (segment->p_type == PT_LOAD && map->includes_phdrs)
6968 1.1 skrll phdr_included = TRUE;
6969 1.6 christos }
6970 1.1 skrll
6971 1.1 skrll lowest_section = NULL;
6972 1.1 skrll if (section_count != 0)
6973 1.1 skrll {
6974 1.1 skrll unsigned int isec = 0;
6975 1.1 skrll
6976 1.1 skrll for (section = first_section;
6977 1.1 skrll section != NULL;
6978 1.1 skrll section = section->next)
6979 1.3 christos {
6980 1.1 skrll this_hdr = &(elf_section_data(section)->this_hdr);
6981 1.1 skrll if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
6982 1.3 christos {
6983 1.3 christos map->sections[isec++] = section->output_section;
6984 1.3 christos if ((section->flags & SEC_ALLOC) != 0)
6985 1.3 christos {
6986 1.6 christos bfd_vma seg_off;
6987 1.6 christos
6988 1.6 christos if (lowest_section == NULL
6989 1.6 christos || section->lma < lowest_section->lma)
6990 1.3 christos lowest_section = section;
6991 1.3 christos
6992 1.3 christos /* Section lmas are set up from PT_LOAD header
6993 1.3 christos p_paddr in _bfd_elf_make_section_from_shdr.
6994 1.3 christos If this header has a p_paddr that disagrees
6995 1.3 christos with the section lma, flag the p_paddr as
6996 1.3 christos invalid. */
6997 1.3 christos if ((section->flags & SEC_LOAD) != 0)
6998 1.3 christos seg_off = this_hdr->sh_offset - segment->p_offset;
6999 1.3 christos else
7000 1.3 christos seg_off = this_hdr->sh_addr - segment->p_vaddr;
7001 1.3 christos if (section->lma - segment->p_paddr != seg_off)
7002 1.1 skrll map->p_paddr_valid = FALSE;
7003 1.1 skrll }
7004 1.1 skrll if (isec == section_count)
7005 1.1 skrll break;
7006 1.1 skrll }
7007 1.1 skrll }
7008 1.3 christos }
7009 1.3 christos
7010 1.3 christos if (map->includes_filehdr && lowest_section != NULL)
7011 1.5 christos /* We need to keep the space used by the headers fixed. */
7012 1.3 christos map->header_size = lowest_section->vma - segment->p_vaddr;
7013 1.3 christos
7014 1.3 christos if (!map->includes_phdrs
7015 1.3 christos && !map->includes_filehdr
7016 1.3 christos && map->p_paddr_valid)
7017 1.3 christos /* There is some other padding before the first section. */
7018 1.3 christos map->p_vaddr_offset = ((lowest_section ? lowest_section->lma : 0)
7019 1.1 skrll - segment->p_paddr);
7020 1.1 skrll
7021 1.1 skrll map->count = section_count;
7022 1.1 skrll *pointer_to_map = map;
7023 1.1 skrll pointer_to_map = &map->next;
7024 1.6 christos }
7025 1.1 skrll
7026 1.1 skrll elf_seg_map (obfd) = map_first;
7027 1.1 skrll return TRUE;
7028 1.1 skrll }
7029 1.1 skrll
7030 1.1 skrll /* Copy private BFD data. This copies or rewrites ELF program header
7031 1.1 skrll information. */
7032 1.1 skrll
7033 1.1 skrll static bfd_boolean
7034 1.1 skrll copy_private_bfd_data (bfd *ibfd, bfd *obfd)
7035 1.1 skrll {
7036 1.1 skrll if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
7037 1.1 skrll || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
7038 1.1 skrll return TRUE;
7039 1.1 skrll
7040 1.1 skrll if (elf_tdata (ibfd)->phdr == NULL)
7041 1.1 skrll return TRUE;
7042 1.1 skrll
7043 1.1 skrll if (ibfd->xvec == obfd->xvec)
7044 1.1 skrll {
7045 1.1 skrll /* Check to see if any sections in the input BFD
7046 1.1 skrll covered by ELF program header have changed. */
7047 1.1 skrll Elf_Internal_Phdr *segment;
7048 1.1 skrll asection *section, *osec;
7049 1.1 skrll unsigned int i, num_segments;
7050 1.1 skrll Elf_Internal_Shdr *this_hdr;
7051 1.1 skrll const struct elf_backend_data *bed;
7052 1.1 skrll
7053 1.1 skrll bed = get_elf_backend_data (ibfd);
7054 1.1 skrll
7055 1.1 skrll /* Regenerate the segment map if p_paddr is set to 0. */
7056 1.1 skrll if (bed->want_p_paddr_set_to_zero)
7057 1.1 skrll goto rewrite;
7058 1.1 skrll
7059 1.1 skrll /* Initialize the segment mark field. */
7060 1.1 skrll for (section = obfd->sections; section != NULL;
7061 1.1 skrll section = section->next)
7062 1.1 skrll section->segment_mark = FALSE;
7063 1.1 skrll
7064 1.1 skrll num_segments = elf_elfheader (ibfd)->e_phnum;
7065 1.1 skrll for (i = 0, segment = elf_tdata (ibfd)->phdr;
7066 1.1 skrll i < num_segments;
7067 1.1 skrll i++, segment++)
7068 1.1 skrll {
7069 1.1 skrll /* PR binutils/3535. The Solaris linker always sets the p_paddr
7070 1.1 skrll and p_memsz fields of special segments (DYNAMIC, INTERP) to 0
7071 1.1 skrll which severly confuses things, so always regenerate the segment
7072 1.1 skrll map in this case. */
7073 1.1 skrll if (segment->p_paddr == 0
7074 1.1 skrll && segment->p_memsz == 0
7075 1.1 skrll && (segment->p_type == PT_INTERP || segment->p_type == PT_DYNAMIC))
7076 1.1 skrll goto rewrite;
7077 1.1 skrll
7078 1.1 skrll for (section = ibfd->sections;
7079 1.1 skrll section != NULL; section = section->next)
7080 1.1 skrll {
7081 1.1 skrll /* We mark the output section so that we know it comes
7082 1.1 skrll from the input BFD. */
7083 1.1 skrll osec = section->output_section;
7084 1.1 skrll if (osec)
7085 1.1 skrll osec->segment_mark = TRUE;
7086 1.1 skrll
7087 1.3 christos /* Check if this section is covered by the segment. */
7088 1.1 skrll this_hdr = &(elf_section_data(section)->this_hdr);
7089 1.1 skrll if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
7090 1.1 skrll {
7091 1.1 skrll /* FIXME: Check if its output section is changed or
7092 1.1 skrll removed. What else do we need to check? */
7093 1.1 skrll if (osec == NULL
7094 1.1 skrll || section->flags != osec->flags
7095 1.1 skrll || section->lma != osec->lma
7096 1.1 skrll || section->vma != osec->vma
7097 1.1 skrll || section->size != osec->size
7098 1.1 skrll || section->rawsize != osec->rawsize
7099 1.1 skrll || section->alignment_power != osec->alignment_power)
7100 1.1 skrll goto rewrite;
7101 1.1 skrll }
7102 1.1 skrll }
7103 1.1 skrll }
7104 1.1 skrll
7105 1.1 skrll /* Check to see if any output section do not come from the
7106 1.1 skrll input BFD. */
7107 1.1 skrll for (section = obfd->sections; section != NULL;
7108 1.1 skrll section = section->next)
7109 1.1 skrll {
7110 1.1 skrll if (section->segment_mark == FALSE)
7111 1.1 skrll goto rewrite;
7112 1.1 skrll else
7113 1.1 skrll section->segment_mark = FALSE;
7114 1.1 skrll }
7115 1.1 skrll
7116 1.1 skrll return copy_elf_program_header (ibfd, obfd);
7117 1.1 skrll }
7118 1.5 christos
7119 1.5 christos rewrite:
7120 1.5 christos if (ibfd->xvec == obfd->xvec)
7121 1.5 christos {
7122 1.5 christos /* When rewriting program header, set the output maxpagesize to
7123 1.5 christos the maximum alignment of input PT_LOAD segments. */
7124 1.5 christos Elf_Internal_Phdr *segment;
7125 1.5 christos unsigned int i;
7126 1.5 christos unsigned int num_segments = elf_elfheader (ibfd)->e_phnum;
7127 1.5 christos bfd_vma maxpagesize = 0;
7128 1.5 christos
7129 1.5 christos for (i = 0, segment = elf_tdata (ibfd)->phdr;
7130 1.5 christos i < num_segments;
7131 1.5 christos i++, segment++)
7132 1.6 christos if (segment->p_type == PT_LOAD
7133 1.6 christos && maxpagesize < segment->p_align)
7134 1.6 christos {
7135 1.6 christos /* PR 17512: file: f17299af. */
7136 1.6 christos if (segment->p_align > (bfd_vma) 1 << ((sizeof (bfd_vma) * 8) - 2))
7137 1.6 christos (*_bfd_error_handler) (_("\
7138 1.6 christos %B: warning: segment alignment of 0x%llx is too large"),
7139 1.6 christos ibfd, (long long) segment->p_align);
7140 1.6 christos else
7141 1.5 christos maxpagesize = segment->p_align;
7142 1.5 christos }
7143 1.5 christos
7144 1.5 christos if (maxpagesize != get_elf_backend_data (obfd)->maxpagesize)
7145 1.5 christos bfd_emul_set_maxpagesize (bfd_get_target (obfd), maxpagesize);
7146 1.1 skrll }
7147 1.1 skrll
7148 1.1 skrll return rewrite_elf_program_header (ibfd, obfd);
7149 1.1 skrll }
7150 1.1 skrll
7151 1.1 skrll /* Initialize private output section information from input section. */
7152 1.1 skrll
7153 1.1 skrll bfd_boolean
7154 1.1 skrll _bfd_elf_init_private_section_data (bfd *ibfd,
7155 1.1 skrll asection *isec,
7156 1.1 skrll bfd *obfd,
7157 1.1 skrll asection *osec,
7158 1.1 skrll struct bfd_link_info *link_info)
7159 1.1 skrll
7160 1.6 christos {
7161 1.6 christos Elf_Internal_Shdr *ihdr, *ohdr;
7162 1.1 skrll bfd_boolean final_link = (link_info != NULL
7163 1.1 skrll && !bfd_link_relocatable (link_info));
7164 1.1 skrll
7165 1.1 skrll if (ibfd->xvec->flavour != bfd_target_elf_flavour
7166 1.1 skrll || obfd->xvec->flavour != bfd_target_elf_flavour)
7167 1.5 christos return TRUE;
7168 1.5 christos
7169 1.3 christos BFD_ASSERT (elf_section_data (osec) != NULL);
7170 1.3 christos
7171 1.3 christos /* For objcopy and relocatable link, don't copy the output ELF
7172 1.3 christos section type from input if the output BFD section flags have been
7173 1.1 skrll set to something different. For a final link allow some flags
7174 1.3 christos that the linker clears to differ. */
7175 1.3 christos if (elf_section_type (osec) == SHT_NULL
7176 1.3 christos && (osec->flags == isec->flags
7177 1.3 christos || (final_link
7178 1.1 skrll && ((osec->flags ^ isec->flags)
7179 1.1 skrll & ~(SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_RELOC)) == 0)))
7180 1.1 skrll elf_section_type (osec) = elf_section_type (isec);
7181 1.1 skrll
7182 1.1 skrll /* FIXME: Is this correct for all OS/PROC specific flags? */
7183 1.1 skrll elf_section_flags (osec) |= (elf_section_flags (isec)
7184 1.1 skrll & (SHF_MASKOS | SHF_MASKPROC));
7185 1.1 skrll
7186 1.1 skrll /* Set things up for objcopy and relocatable link. The output
7187 1.1 skrll SHT_GROUP section will have its elf_next_in_group pointing back
7188 1.3 christos to the input group members. Ignore linker created group section.
7189 1.1 skrll See elfNN_ia64_object_p in elfxx-ia64.c. */
7190 1.1 skrll if (!final_link)
7191 1.1 skrll {
7192 1.1 skrll if (elf_sec_group (isec) == NULL
7193 1.1 skrll || (elf_sec_group (isec)->flags & SEC_LINKER_CREATED) == 0)
7194 1.1 skrll {
7195 1.1 skrll if (elf_section_flags (isec) & SHF_GROUP)
7196 1.2 skrll elf_section_flags (osec) |= SHF_GROUP;
7197 1.1 skrll elf_next_in_group (osec) = elf_next_in_group (isec);
7198 1.6 christos elf_section_data (osec)->group = elf_section_data (isec)->group;
7199 1.6 christos }
7200 1.6 christos
7201 1.6 christos /* If not decompress, preserve SHF_COMPRESSED. */
7202 1.6 christos if ((ibfd->flags & BFD_DECOMPRESS) == 0)
7203 1.1 skrll elf_section_flags (osec) |= (elf_section_flags (isec)
7204 1.1 skrll & SHF_COMPRESSED);
7205 1.1 skrll }
7206 1.1 skrll
7207 1.1 skrll ihdr = &elf_section_data (isec)->this_hdr;
7208 1.1 skrll
7209 1.1 skrll /* We need to handle elf_linked_to_section for SHF_LINK_ORDER. We
7210 1.1 skrll don't use the output section of the linked-to section since it
7211 1.1 skrll may be NULL at this point. */
7212 1.1 skrll if ((ihdr->sh_flags & SHF_LINK_ORDER) != 0)
7213 1.1 skrll {
7214 1.1 skrll ohdr = &elf_section_data (osec)->this_hdr;
7215 1.1 skrll ohdr->sh_flags |= SHF_LINK_ORDER;
7216 1.1 skrll elf_linked_to_section (osec) = elf_linked_to_section (isec);
7217 1.1 skrll }
7218 1.1 skrll
7219 1.1 skrll osec->use_rela_p = isec->use_rela_p;
7220 1.1 skrll
7221 1.1 skrll return TRUE;
7222 1.1 skrll }
7223 1.1 skrll
7224 1.1 skrll /* Copy private section information. This copies over the entsize
7225 1.1 skrll field, and sometimes the info field. */
7226 1.1 skrll
7227 1.1 skrll bfd_boolean
7228 1.1 skrll _bfd_elf_copy_private_section_data (bfd *ibfd,
7229 1.1 skrll asection *isec,
7230 1.1 skrll bfd *obfd,
7231 1.1 skrll asection *osec)
7232 1.1 skrll {
7233 1.1 skrll Elf_Internal_Shdr *ihdr, *ohdr;
7234 1.1 skrll
7235 1.1 skrll if (ibfd->xvec->flavour != bfd_target_elf_flavour
7236 1.1 skrll || obfd->xvec->flavour != bfd_target_elf_flavour)
7237 1.1 skrll return TRUE;
7238 1.1 skrll
7239 1.1 skrll ihdr = &elf_section_data (isec)->this_hdr;
7240 1.1 skrll ohdr = &elf_section_data (osec)->this_hdr;
7241 1.1 skrll
7242 1.1 skrll ohdr->sh_entsize = ihdr->sh_entsize;
7243 1.1 skrll
7244 1.1 skrll if (ihdr->sh_type == SHT_SYMTAB
7245 1.1 skrll || ihdr->sh_type == SHT_DYNSYM
7246 1.1 skrll || ihdr->sh_type == SHT_GNU_verneed
7247 1.1 skrll || ihdr->sh_type == SHT_GNU_verdef)
7248 1.1 skrll ohdr->sh_info = ihdr->sh_info;
7249 1.1 skrll
7250 1.1 skrll return _bfd_elf_init_private_section_data (ibfd, isec, obfd, osec,
7251 1.1 skrll NULL);
7252 1.3 christos }
7253 1.3 christos
7254 1.3 christos /* Look at all the SHT_GROUP sections in IBFD, making any adjustments
7255 1.3 christos necessary if we are removing either the SHT_GROUP section or any of
7256 1.3 christos the group member sections. DISCARDED is the value that a section's
7257 1.3 christos output_section has if the section will be discarded, NULL when this
7258 1.1 skrll function is called from objcopy, bfd_abs_section_ptr when called
7259 1.1 skrll from the linker. */
7260 1.3 christos
7261 1.1 skrll bfd_boolean
7262 1.1 skrll _bfd_elf_fixup_group_sections (bfd *ibfd, asection *discarded)
7263 1.1 skrll {
7264 1.1 skrll asection *isec;
7265 1.3 christos
7266 1.1 skrll for (isec = ibfd->sections; isec != NULL; isec = isec->next)
7267 1.1 skrll if (elf_section_type (isec) == SHT_GROUP)
7268 1.1 skrll {
7269 1.3 christos asection *first = elf_next_in_group (isec);
7270 1.3 christos asection *s = first;
7271 1.1 skrll bfd_size_type removed = 0;
7272 1.1 skrll
7273 1.3 christos while (s != NULL)
7274 1.3 christos {
7275 1.3 christos /* If this member section is being output but the
7276 1.3 christos SHT_GROUP section is not, then clear the group info
7277 1.3 christos set up by _bfd_elf_copy_private_section_data. */
7278 1.1 skrll if (s->output_section != discarded
7279 1.1 skrll && isec->output_section == discarded)
7280 1.1 skrll {
7281 1.1 skrll elf_section_flags (s->output_section) &= ~SHF_GROUP;
7282 1.3 christos elf_group_name (s->output_section) = NULL;
7283 1.3 christos }
7284 1.3 christos /* Conversely, if the member section is not being output
7285 1.3 christos but the SHT_GROUP section is, then adjust its size. */
7286 1.3 christos else if (s->output_section == discarded
7287 1.1 skrll && isec->output_section != discarded)
7288 1.1 skrll removed += 4;
7289 1.1 skrll s = elf_next_in_group (s);
7290 1.1 skrll if (s == first)
7291 1.3 christos break;
7292 1.3 christos }
7293 1.3 christos if (removed != 0)
7294 1.3 christos {
7295 1.3 christos if (discarded != NULL)
7296 1.3 christos {
7297 1.3 christos /* If we've been called for ld -r, then we need to
7298 1.3 christos adjust the input section size. This function may
7299 1.3 christos be called multiple times, so save the original
7300 1.3 christos size. */
7301 1.3 christos if (isec->rawsize == 0)
7302 1.3 christos isec->rawsize = isec->size;
7303 1.3 christos isec->size = isec->rawsize - removed;
7304 1.3 christos }
7305 1.3 christos else
7306 1.3 christos {
7307 1.3 christos /* Adjust the output section size when called from
7308 1.3 christos objcopy. */
7309 1.3 christos isec->output_section->size -= removed;
7310 1.1 skrll }
7311 1.1 skrll }
7312 1.1 skrll }
7313 1.1 skrll
7314 1.1 skrll return TRUE;
7315 1.3 christos }
7316 1.3 christos
7317 1.3 christos /* Copy private header information. */
7318 1.3 christos
7319 1.3 christos bfd_boolean
7320 1.3 christos _bfd_elf_copy_private_header_data (bfd *ibfd, bfd *obfd)
7321 1.3 christos {
7322 1.3 christos if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
7323 1.3 christos || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
7324 1.3 christos return TRUE;
7325 1.3 christos
7326 1.3 christos /* Copy over private BFD data if it has not already been copied.
7327 1.3 christos This must be done here, rather than in the copy_private_bfd_data
7328 1.3 christos entry point, because the latter is called after the section
7329 1.6 christos contents have been set, which means that the program headers have
7330 1.3 christos already been worked out. */
7331 1.3 christos if (elf_seg_map (obfd) == NULL && elf_tdata (ibfd)->phdr != NULL)
7332 1.3 christos {
7333 1.3 christos if (! copy_private_bfd_data (ibfd, obfd))
7334 1.3 christos return FALSE;
7335 1.3 christos }
7336 1.3 christos
7337 1.3 christos return _bfd_elf_fixup_group_sections (ibfd, NULL);
7338 1.1 skrll }
7339 1.1 skrll
7340 1.1 skrll /* Copy private symbol information. If this symbol is in a section
7341 1.1 skrll which we did not map into a BFD section, try to map the section
7342 1.1 skrll index correctly. We use special macro definitions for the mapped
7343 1.1 skrll section indices; these definitions are interpreted by the
7344 1.1 skrll swap_out_syms function. */
7345 1.1 skrll
7346 1.1 skrll #define MAP_ONESYMTAB (SHN_HIOS + 1)
7347 1.1 skrll #define MAP_DYNSYMTAB (SHN_HIOS + 2)
7348 1.1 skrll #define MAP_STRTAB (SHN_HIOS + 3)
7349 1.1 skrll #define MAP_SHSTRTAB (SHN_HIOS + 4)
7350 1.1 skrll #define MAP_SYM_SHNDX (SHN_HIOS + 5)
7351 1.1 skrll
7352 1.1 skrll bfd_boolean
7353 1.1 skrll _bfd_elf_copy_private_symbol_data (bfd *ibfd,
7354 1.1 skrll asymbol *isymarg,
7355 1.1 skrll bfd *obfd,
7356 1.1 skrll asymbol *osymarg)
7357 1.1 skrll {
7358 1.1 skrll elf_symbol_type *isym, *osym;
7359 1.1 skrll
7360 1.1 skrll if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
7361 1.1 skrll || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
7362 1.1 skrll return TRUE;
7363 1.1 skrll
7364 1.1 skrll isym = elf_symbol_from (ibfd, isymarg);
7365 1.1 skrll osym = elf_symbol_from (obfd, osymarg);
7366 1.1 skrll
7367 1.1 skrll if (isym != NULL
7368 1.1 skrll && isym->internal_elf_sym.st_shndx != 0
7369 1.1 skrll && osym != NULL
7370 1.1 skrll && bfd_is_abs_section (isym->symbol.section))
7371 1.1 skrll {
7372 1.1 skrll unsigned int shndx;
7373 1.1 skrll
7374 1.1 skrll shndx = isym->internal_elf_sym.st_shndx;
7375 1.1 skrll if (shndx == elf_onesymtab (ibfd))
7376 1.1 skrll shndx = MAP_ONESYMTAB;
7377 1.6 christos else if (shndx == elf_dynsymtab (ibfd))
7378 1.1 skrll shndx = MAP_DYNSYMTAB;
7379 1.6 christos else if (shndx == elf_strtab_sec (ibfd))
7380 1.1 skrll shndx = MAP_STRTAB;
7381 1.6 christos else if (shndx == elf_shstrtab_sec (ibfd))
7382 1.1 skrll shndx = MAP_SHSTRTAB;
7383 1.1 skrll else if (find_section_in_list (shndx, elf_symtab_shndx_list (ibfd)))
7384 1.1 skrll shndx = MAP_SYM_SHNDX;
7385 1.1 skrll osym->internal_elf_sym.st_shndx = shndx;
7386 1.1 skrll }
7387 1.1 skrll
7388 1.1 skrll return TRUE;
7389 1.1 skrll }
7390 1.1 skrll
7391 1.1 skrll /* Swap out the symbols. */
7392 1.1 skrll
7393 1.6 christos static bfd_boolean
7394 1.1 skrll swap_out_syms (bfd *abfd,
7395 1.1 skrll struct elf_strtab_hash **sttp,
7396 1.1 skrll int relocatable_p)
7397 1.1 skrll {
7398 1.1 skrll const struct elf_backend_data *bed;
7399 1.6 christos int symcount;
7400 1.1 skrll asymbol **syms;
7401 1.1 skrll struct elf_strtab_hash *stt;
7402 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
7403 1.6 christos Elf_Internal_Shdr *symtab_shndx_hdr;
7404 1.1 skrll Elf_Internal_Shdr *symstrtab_hdr;
7405 1.1 skrll struct elf_sym_strtab *symstrtab;
7406 1.6 christos bfd_byte *outbound_syms;
7407 1.6 christos bfd_byte *outbound_shndx;
7408 1.1 skrll unsigned long outbound_syms_index;
7409 1.6 christos unsigned long outbound_shndx_index;
7410 1.1 skrll int idx;
7411 1.1 skrll unsigned int num_locals;
7412 1.1 skrll bfd_size_type amt;
7413 1.6 christos bfd_boolean name_local_sections;
7414 1.1 skrll
7415 1.1 skrll if (!elf_map_symbols (abfd, &num_locals))
7416 1.1 skrll return FALSE;
7417 1.6 christos
7418 1.1 skrll /* Dump out the symtabs. */
7419 1.1 skrll stt = _bfd_elf_strtab_init ();
7420 1.1 skrll if (stt == NULL)
7421 1.1 skrll return FALSE;
7422 1.1 skrll
7423 1.1 skrll bed = get_elf_backend_data (abfd);
7424 1.1 skrll symcount = bfd_get_symcount (abfd);
7425 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
7426 1.1 skrll symtab_hdr->sh_type = SHT_SYMTAB;
7427 1.6 christos symtab_hdr->sh_entsize = bed->s->sizeof_sym;
7428 1.1 skrll symtab_hdr->sh_size = symtab_hdr->sh_entsize * (symcount + 1);
7429 1.1 skrll symtab_hdr->sh_info = num_locals + 1;
7430 1.1 skrll symtab_hdr->sh_addralign = (bfd_vma) 1 << bed->s->log_file_align;
7431 1.1 skrll
7432 1.1 skrll symstrtab_hdr = &elf_tdata (abfd)->strtab_hdr;
7433 1.6 christos symstrtab_hdr->sh_type = SHT_STRTAB;
7434 1.6 christos
7435 1.6 christos /* Allocate buffer to swap out the .strtab section. */
7436 1.6 christos symstrtab = (struct elf_sym_strtab *) bfd_malloc ((symcount + 1)
7437 1.6 christos * sizeof (*symstrtab));
7438 1.6 christos if (symstrtab == NULL)
7439 1.6 christos {
7440 1.6 christos _bfd_elf_strtab_free (stt);
7441 1.6 christos return FALSE;
7442 1.3 christos }
7443 1.3 christos
7444 1.1 skrll outbound_syms = (bfd_byte *) bfd_alloc2 (abfd, 1 + symcount,
7445 1.1 skrll bed->s->sizeof_sym);
7446 1.6 christos if (outbound_syms == NULL)
7447 1.6 christos {
7448 1.6 christos error_return:
7449 1.1 skrll _bfd_elf_strtab_free (stt);
7450 1.1 skrll free (symstrtab);
7451 1.1 skrll return FALSE;
7452 1.6 christos }
7453 1.1 skrll symtab_hdr->contents = outbound_syms;
7454 1.1 skrll outbound_syms_index = 0;
7455 1.6 christos
7456 1.6 christos outbound_shndx = NULL;
7457 1.6 christos outbound_shndx_index = 0;
7458 1.1 skrll
7459 1.6 christos if (elf_symtab_shndx_list (abfd))
7460 1.6 christos {
7461 1.1 skrll symtab_shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
7462 1.6 christos if (symtab_shndx_hdr->sh_name != 0)
7463 1.6 christos {
7464 1.6 christos amt = (bfd_size_type) (1 + symcount) * sizeof (Elf_External_Sym_Shndx);
7465 1.6 christos outbound_shndx = (bfd_byte *)
7466 1.6 christos bfd_zalloc2 (abfd, 1 + symcount, sizeof (Elf_External_Sym_Shndx));
7467 1.6 christos if (outbound_shndx == NULL)
7468 1.6 christos goto error_return;
7469 1.6 christos
7470 1.6 christos symtab_shndx_hdr->contents = outbound_shndx;
7471 1.6 christos symtab_shndx_hdr->sh_type = SHT_SYMTAB_SHNDX;
7472 1.6 christos symtab_shndx_hdr->sh_size = amt;
7473 1.1 skrll symtab_shndx_hdr->sh_addralign = sizeof (Elf_External_Sym_Shndx);
7474 1.6 christos symtab_shndx_hdr->sh_entsize = sizeof (Elf_External_Sym_Shndx);
7475 1.1 skrll }
7476 1.1 skrll /* FIXME: What about any other headers in the list ? */
7477 1.1 skrll }
7478 1.1 skrll
7479 1.1 skrll /* Now generate the data (for "contents"). */
7480 1.1 skrll {
7481 1.1 skrll /* Fill in zeroth symbol and swap it out. */
7482 1.1 skrll Elf_Internal_Sym sym;
7483 1.1 skrll sym.st_name = 0;
7484 1.1 skrll sym.st_value = 0;
7485 1.1 skrll sym.st_size = 0;
7486 1.1 skrll sym.st_info = 0;
7487 1.5 christos sym.st_other = 0;
7488 1.6 christos sym.st_shndx = SHN_UNDEF;
7489 1.6 christos sym.st_target_internal = 0;
7490 1.6 christos symstrtab[0].sym = sym;
7491 1.6 christos symstrtab[0].dest_index = outbound_syms_index;
7492 1.1 skrll symstrtab[0].destshndx_index = outbound_shndx_index;
7493 1.6 christos outbound_syms_index++;
7494 1.1 skrll if (outbound_shndx != NULL)
7495 1.1 skrll outbound_shndx_index++;
7496 1.1 skrll }
7497 1.1 skrll
7498 1.1 skrll name_local_sections
7499 1.1 skrll = (bed->elf_backend_name_local_section_symbols
7500 1.1 skrll && bed->elf_backend_name_local_section_symbols (abfd));
7501 1.6 christos
7502 1.1 skrll syms = bfd_get_outsymbols (abfd);
7503 1.1 skrll for (idx = 0; idx < symcount;)
7504 1.1 skrll {
7505 1.1 skrll Elf_Internal_Sym sym;
7506 1.1 skrll bfd_vma value = syms[idx]->value;
7507 1.1 skrll elf_symbol_type *type_ptr;
7508 1.1 skrll flagword flags = syms[idx]->flags;
7509 1.1 skrll int type;
7510 1.1 skrll
7511 1.1 skrll if (!name_local_sections
7512 1.1 skrll && (flags & (BSF_SECTION_SYM | BSF_GLOBAL)) == BSF_SECTION_SYM)
7513 1.6 christos {
7514 1.1 skrll /* Local section symbols have no name. */
7515 1.1 skrll sym.st_name = (unsigned long) -1;
7516 1.1 skrll }
7517 1.6 christos else
7518 1.6 christos {
7519 1.6 christos /* Call _bfd_elf_strtab_offset after _bfd_elf_strtab_finalize
7520 1.6 christos to get the final offset for st_name. */
7521 1.6 christos sym.st_name
7522 1.1 skrll = (unsigned long) _bfd_elf_strtab_add (stt, syms[idx]->name,
7523 1.6 christos FALSE);
7524 1.1 skrll if (sym.st_name == (unsigned long) -1)
7525 1.1 skrll goto error_return;
7526 1.1 skrll }
7527 1.1 skrll
7528 1.1 skrll type_ptr = elf_symbol_from (abfd, syms[idx]);
7529 1.1 skrll
7530 1.1 skrll if ((flags & BSF_SECTION_SYM) == 0
7531 1.1 skrll && bfd_is_com_section (syms[idx]->section))
7532 1.1 skrll {
7533 1.1 skrll /* ELF common symbols put the alignment into the `value' field,
7534 1.1 skrll and the size into the `size' field. This is backwards from
7535 1.1 skrll how BFD handles it, so reverse it here. */
7536 1.1 skrll sym.st_size = value;
7537 1.1 skrll if (type_ptr == NULL
7538 1.1 skrll || type_ptr->internal_elf_sym.st_value == 0)
7539 1.1 skrll sym.st_value = value >= 16 ? 16 : (1 << bfd_log2 (value));
7540 1.1 skrll else
7541 1.1 skrll sym.st_value = type_ptr->internal_elf_sym.st_value;
7542 1.1 skrll sym.st_shndx = _bfd_elf_section_from_bfd_section
7543 1.1 skrll (abfd, syms[idx]->section);
7544 1.1 skrll }
7545 1.1 skrll else
7546 1.1 skrll {
7547 1.1 skrll asection *sec = syms[idx]->section;
7548 1.1 skrll unsigned int shndx;
7549 1.1 skrll
7550 1.1 skrll if (sec->output_section)
7551 1.1 skrll {
7552 1.1 skrll value += sec->output_offset;
7553 1.1 skrll sec = sec->output_section;
7554 1.1 skrll }
7555 1.1 skrll
7556 1.1 skrll /* Don't add in the section vma for relocatable output. */
7557 1.1 skrll if (! relocatable_p)
7558 1.1 skrll value += sec->vma;
7559 1.1 skrll sym.st_value = value;
7560 1.1 skrll sym.st_size = type_ptr ? type_ptr->internal_elf_sym.st_size : 0;
7561 1.1 skrll
7562 1.1 skrll if (bfd_is_abs_section (sec)
7563 1.1 skrll && type_ptr != NULL
7564 1.1 skrll && type_ptr->internal_elf_sym.st_shndx != 0)
7565 1.1 skrll {
7566 1.1 skrll /* This symbol is in a real ELF section which we did
7567 1.1 skrll not create as a BFD section. Undo the mapping done
7568 1.1 skrll by copy_private_symbol_data. */
7569 1.1 skrll shndx = type_ptr->internal_elf_sym.st_shndx;
7570 1.1 skrll switch (shndx)
7571 1.1 skrll {
7572 1.1 skrll case MAP_ONESYMTAB:
7573 1.1 skrll shndx = elf_onesymtab (abfd);
7574 1.1 skrll break;
7575 1.1 skrll case MAP_DYNSYMTAB:
7576 1.1 skrll shndx = elf_dynsymtab (abfd);
7577 1.6 christos break;
7578 1.1 skrll case MAP_STRTAB:
7579 1.1 skrll shndx = elf_strtab_sec (abfd);
7580 1.6 christos break;
7581 1.1 skrll case MAP_SHSTRTAB:
7582 1.1 skrll shndx = elf_shstrtab_sec (abfd);
7583 1.6 christos break;
7584 1.6 christos case MAP_SYM_SHNDX:
7585 1.1 skrll if (elf_symtab_shndx_list (abfd))
7586 1.1 skrll shndx = elf_symtab_shndx_list (abfd)->ndx;
7587 1.5 christos break;
7588 1.1 skrll default:
7589 1.1 skrll shndx = SHN_ABS;
7590 1.1 skrll break;
7591 1.1 skrll }
7592 1.1 skrll }
7593 1.1 skrll else
7594 1.1 skrll {
7595 1.1 skrll shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
7596 1.1 skrll
7597 1.1 skrll if (shndx == SHN_BAD)
7598 1.1 skrll {
7599 1.1 skrll asection *sec2;
7600 1.1 skrll
7601 1.1 skrll /* Writing this would be a hell of a lot easier if
7602 1.1 skrll we had some decent documentation on bfd, and
7603 1.1 skrll knew what to expect of the library, and what to
7604 1.1 skrll demand of applications. For example, it
7605 1.1 skrll appears that `objcopy' might not set the
7606 1.1 skrll section of a symbol to be a section that is
7607 1.1 skrll actually in the output file. */
7608 1.1 skrll sec2 = bfd_get_section_by_name (abfd, sec->name);
7609 1.1 skrll if (sec2 == NULL)
7610 1.1 skrll {
7611 1.1 skrll _bfd_error_handler (_("\
7612 1.1 skrll Unable to find equivalent output section for symbol '%s' from section '%s'"),
7613 1.1 skrll syms[idx]->name ? syms[idx]->name : "<Local sym>",
7614 1.6 christos sec->name);
7615 1.1 skrll bfd_set_error (bfd_error_invalid_operation);
7616 1.1 skrll goto error_return;
7617 1.1 skrll }
7618 1.1 skrll
7619 1.1 skrll shndx = _bfd_elf_section_from_bfd_section (abfd, sec2);
7620 1.1 skrll BFD_ASSERT (shndx != SHN_BAD);
7621 1.1 skrll }
7622 1.1 skrll }
7623 1.1 skrll
7624 1.1 skrll sym.st_shndx = shndx;
7625 1.1 skrll }
7626 1.1 skrll
7627 1.3 christos if ((flags & BSF_THREAD_LOCAL) != 0)
7628 1.3 christos type = STT_TLS;
7629 1.1 skrll else if ((flags & BSF_GNU_INDIRECT_FUNCTION) != 0)
7630 1.1 skrll type = STT_GNU_IFUNC;
7631 1.1 skrll else if ((flags & BSF_FUNCTION) != 0)
7632 1.1 skrll type = STT_FUNC;
7633 1.1 skrll else if ((flags & BSF_OBJECT) != 0)
7634 1.1 skrll type = STT_OBJECT;
7635 1.1 skrll else if ((flags & BSF_RELC) != 0)
7636 1.1 skrll type = STT_RELC;
7637 1.1 skrll else if ((flags & BSF_SRELC) != 0)
7638 1.1 skrll type = STT_SRELC;
7639 1.1 skrll else
7640 1.1 skrll type = STT_NOTYPE;
7641 1.1 skrll
7642 1.1 skrll if (syms[idx]->section->flags & SEC_THREAD_LOCAL)
7643 1.1 skrll type = STT_TLS;
7644 1.1 skrll
7645 1.1 skrll /* Processor-specific types. */
7646 1.1 skrll if (type_ptr != NULL
7647 1.1 skrll && bed->elf_backend_get_symbol_type)
7648 1.1 skrll type = ((*bed->elf_backend_get_symbol_type)
7649 1.1 skrll (&type_ptr->internal_elf_sym, type));
7650 1.1 skrll
7651 1.1 skrll if (flags & BSF_SECTION_SYM)
7652 1.1 skrll {
7653 1.1 skrll if (flags & BSF_GLOBAL)
7654 1.1 skrll sym.st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
7655 1.1 skrll else
7656 1.1 skrll sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION);
7657 1.1 skrll }
7658 1.6.2.1 pgoyette else if (bfd_is_com_section (syms[idx]->section))
7659 1.6.2.1 pgoyette {
7660 1.6.2.1 pgoyette if (type != STT_TLS)
7661 1.6.2.1 pgoyette {
7662 1.6.2.1 pgoyette if ((abfd->flags & BFD_CONVERT_ELF_COMMON))
7663 1.6.2.1 pgoyette type = ((abfd->flags & BFD_USE_ELF_STT_COMMON)
7664 1.6.2.1 pgoyette ? STT_COMMON : STT_OBJECT);
7665 1.6.2.1 pgoyette else
7666 1.6.2.1 pgoyette type = ((flags & BSF_ELF_COMMON) != 0
7667 1.6.2.1 pgoyette ? STT_COMMON : STT_OBJECT);
7668 1.1 skrll }
7669 1.1 skrll sym.st_info = ELF_ST_INFO (STB_GLOBAL, type);
7670 1.1 skrll }
7671 1.1 skrll else if (bfd_is_und_section (syms[idx]->section))
7672 1.1 skrll sym.st_info = ELF_ST_INFO (((flags & BSF_WEAK)
7673 1.1 skrll ? STB_WEAK
7674 1.1 skrll : STB_GLOBAL),
7675 1.1 skrll type);
7676 1.1 skrll else if (flags & BSF_FILE)
7677 1.1 skrll sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FILE);
7678 1.1 skrll else
7679 1.1 skrll {
7680 1.1 skrll int bind = STB_LOCAL;
7681 1.1 skrll
7682 1.3 christos if (flags & BSF_LOCAL)
7683 1.3 christos bind = STB_LOCAL;
7684 1.1 skrll else if (flags & BSF_GNU_UNIQUE)
7685 1.1 skrll bind = STB_GNU_UNIQUE;
7686 1.1 skrll else if (flags & BSF_WEAK)
7687 1.1 skrll bind = STB_WEAK;
7688 1.1 skrll else if (flags & BSF_GLOBAL)
7689 1.1 skrll bind = STB_GLOBAL;
7690 1.1 skrll
7691 1.1 skrll sym.st_info = ELF_ST_INFO (bind, type);
7692 1.1 skrll }
7693 1.5 christos
7694 1.5 christos if (type_ptr != NULL)
7695 1.5 christos {
7696 1.5 christos sym.st_other = type_ptr->internal_elf_sym.st_other;
7697 1.5 christos sym.st_target_internal
7698 1.1 skrll = type_ptr->internal_elf_sym.st_target_internal;
7699 1.5 christos }
7700 1.5 christos else
7701 1.5 christos {
7702 1.5 christos sym.st_other = 0;
7703 1.1 skrll sym.st_target_internal = 0;
7704 1.6 christos }
7705 1.6 christos
7706 1.6 christos idx++;
7707 1.6 christos symstrtab[idx].sym = sym;
7708 1.6 christos symstrtab[idx].dest_index = outbound_syms_index;
7709 1.6 christos symstrtab[idx].destshndx_index = outbound_shndx_index;
7710 1.1 skrll
7711 1.6 christos outbound_syms_index++;
7712 1.1 skrll if (outbound_shndx != NULL)
7713 1.1 skrll outbound_shndx_index++;
7714 1.6 christos }
7715 1.6 christos
7716 1.6 christos /* Finalize the .strtab section. */
7717 1.6 christos _bfd_elf_strtab_finalize (stt);
7718 1.6 christos
7719 1.6 christos /* Swap out the .strtab section. */
7720 1.6 christos for (idx = 0; idx <= symcount; idx++)
7721 1.6 christos {
7722 1.6 christos struct elf_sym_strtab *elfsym = &symstrtab[idx];
7723 1.6 christos if (elfsym->sym.st_name == (unsigned long) -1)
7724 1.6 christos elfsym->sym.st_name = 0;
7725 1.6 christos else
7726 1.6 christos elfsym->sym.st_name = _bfd_elf_strtab_offset (stt,
7727 1.6 christos elfsym->sym.st_name);
7728 1.6 christos bed->s->swap_symbol_out (abfd, &elfsym->sym,
7729 1.6 christos (outbound_syms
7730 1.6 christos + (elfsym->dest_index
7731 1.6 christos * bed->s->sizeof_sym)),
7732 1.6 christos (outbound_shndx
7733 1.6 christos + (elfsym->destshndx_index
7734 1.6 christos * sizeof (Elf_External_Sym_Shndx))));
7735 1.6 christos }
7736 1.1 skrll free (symstrtab);
7737 1.6 christos
7738 1.1 skrll *sttp = stt;
7739 1.6.2.1 pgoyette symstrtab_hdr->sh_size = _bfd_elf_strtab_size (stt);
7740 1.1 skrll symstrtab_hdr->sh_type = SHT_STRTAB;
7741 1.1 skrll symstrtab_hdr->sh_flags = bed->elf_strtab_flags;
7742 1.1 skrll symstrtab_hdr->sh_addr = 0;
7743 1.1 skrll symstrtab_hdr->sh_entsize = 0;
7744 1.1 skrll symstrtab_hdr->sh_link = 0;
7745 1.1 skrll symstrtab_hdr->sh_info = 0;
7746 1.1 skrll symstrtab_hdr->sh_addralign = 1;
7747 1.1 skrll
7748 1.1 skrll return TRUE;
7749 1.1 skrll }
7750 1.1 skrll
7751 1.1 skrll /* Return the number of bytes required to hold the symtab vector.
7752 1.1 skrll
7753 1.1 skrll Note that we base it on the count plus 1, since we will null terminate
7754 1.1 skrll the vector allocated based on this size. However, the ELF symbol table
7755 1.1 skrll always has a dummy entry as symbol #0, so it ends up even. */
7756 1.1 skrll
7757 1.1 skrll long
7758 1.1 skrll _bfd_elf_get_symtab_upper_bound (bfd *abfd)
7759 1.1 skrll {
7760 1.1 skrll long symcount;
7761 1.1 skrll long symtab_size;
7762 1.1 skrll Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->symtab_hdr;
7763 1.1 skrll
7764 1.1 skrll symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
7765 1.1 skrll symtab_size = (symcount + 1) * (sizeof (asymbol *));
7766 1.1 skrll if (symcount > 0)
7767 1.1 skrll symtab_size -= sizeof (asymbol *);
7768 1.1 skrll
7769 1.1 skrll return symtab_size;
7770 1.1 skrll }
7771 1.1 skrll
7772 1.1 skrll long
7773 1.1 skrll _bfd_elf_get_dynamic_symtab_upper_bound (bfd *abfd)
7774 1.1 skrll {
7775 1.1 skrll long symcount;
7776 1.1 skrll long symtab_size;
7777 1.1 skrll Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->dynsymtab_hdr;
7778 1.1 skrll
7779 1.1 skrll if (elf_dynsymtab (abfd) == 0)
7780 1.1 skrll {
7781 1.1 skrll bfd_set_error (bfd_error_invalid_operation);
7782 1.1 skrll return -1;
7783 1.1 skrll }
7784 1.1 skrll
7785 1.1 skrll symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
7786 1.1 skrll symtab_size = (symcount + 1) * (sizeof (asymbol *));
7787 1.1 skrll if (symcount > 0)
7788 1.1 skrll symtab_size -= sizeof (asymbol *);
7789 1.1 skrll
7790 1.1 skrll return symtab_size;
7791 1.1 skrll }
7792 1.1 skrll
7793 1.1 skrll long
7794 1.1 skrll _bfd_elf_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
7795 1.1 skrll sec_ptr asect)
7796 1.1 skrll {
7797 1.1 skrll return (asect->reloc_count + 1) * sizeof (arelent *);
7798 1.1 skrll }
7799 1.1 skrll
7800 1.1 skrll /* Canonicalize the relocs. */
7801 1.1 skrll
7802 1.1 skrll long
7803 1.1 skrll _bfd_elf_canonicalize_reloc (bfd *abfd,
7804 1.1 skrll sec_ptr section,
7805 1.1 skrll arelent **relptr,
7806 1.1 skrll asymbol **symbols)
7807 1.1 skrll {
7808 1.1 skrll arelent *tblptr;
7809 1.1 skrll unsigned int i;
7810 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7811 1.1 skrll
7812 1.1 skrll if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
7813 1.1 skrll return -1;
7814 1.1 skrll
7815 1.1 skrll tblptr = section->relocation;
7816 1.1 skrll for (i = 0; i < section->reloc_count; i++)
7817 1.1 skrll *relptr++ = tblptr++;
7818 1.1 skrll
7819 1.1 skrll *relptr = NULL;
7820 1.1 skrll
7821 1.1 skrll return section->reloc_count;
7822 1.1 skrll }
7823 1.1 skrll
7824 1.1 skrll long
7825 1.1 skrll _bfd_elf_canonicalize_symtab (bfd *abfd, asymbol **allocation)
7826 1.1 skrll {
7827 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7828 1.1 skrll long symcount = bed->s->slurp_symbol_table (abfd, allocation, FALSE);
7829 1.1 skrll
7830 1.1 skrll if (symcount >= 0)
7831 1.1 skrll bfd_get_symcount (abfd) = symcount;
7832 1.1 skrll return symcount;
7833 1.1 skrll }
7834 1.1 skrll
7835 1.1 skrll long
7836 1.1 skrll _bfd_elf_canonicalize_dynamic_symtab (bfd *abfd,
7837 1.1 skrll asymbol **allocation)
7838 1.1 skrll {
7839 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7840 1.1 skrll long symcount = bed->s->slurp_symbol_table (abfd, allocation, TRUE);
7841 1.1 skrll
7842 1.1 skrll if (symcount >= 0)
7843 1.1 skrll bfd_get_dynamic_symcount (abfd) = symcount;
7844 1.1 skrll return symcount;
7845 1.1 skrll }
7846 1.1 skrll
7847 1.1 skrll /* Return the size required for the dynamic reloc entries. Any loadable
7848 1.1 skrll section that was actually installed in the BFD, and has type SHT_REL
7849 1.1 skrll or SHT_RELA, and uses the dynamic symbol table, is considered to be a
7850 1.1 skrll dynamic reloc section. */
7851 1.1 skrll
7852 1.1 skrll long
7853 1.1 skrll _bfd_elf_get_dynamic_reloc_upper_bound (bfd *abfd)
7854 1.1 skrll {
7855 1.1 skrll long ret;
7856 1.1 skrll asection *s;
7857 1.1 skrll
7858 1.1 skrll if (elf_dynsymtab (abfd) == 0)
7859 1.1 skrll {
7860 1.1 skrll bfd_set_error (bfd_error_invalid_operation);
7861 1.1 skrll return -1;
7862 1.1 skrll }
7863 1.1 skrll
7864 1.1 skrll ret = sizeof (arelent *);
7865 1.1 skrll for (s = abfd->sections; s != NULL; s = s->next)
7866 1.1 skrll if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
7867 1.1 skrll && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
7868 1.1 skrll || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
7869 1.1 skrll ret += ((s->size / elf_section_data (s)->this_hdr.sh_entsize)
7870 1.1 skrll * sizeof (arelent *));
7871 1.1 skrll
7872 1.1 skrll return ret;
7873 1.1 skrll }
7874 1.1 skrll
7875 1.1 skrll /* Canonicalize the dynamic relocation entries. Note that we return the
7876 1.1 skrll dynamic relocations as a single block, although they are actually
7877 1.1 skrll associated with particular sections; the interface, which was
7878 1.1 skrll designed for SunOS style shared libraries, expects that there is only
7879 1.1 skrll one set of dynamic relocs. Any loadable section that was actually
7880 1.1 skrll installed in the BFD, and has type SHT_REL or SHT_RELA, and uses the
7881 1.1 skrll dynamic symbol table, is considered to be a dynamic reloc section. */
7882 1.1 skrll
7883 1.1 skrll long
7884 1.1 skrll _bfd_elf_canonicalize_dynamic_reloc (bfd *abfd,
7885 1.1 skrll arelent **storage,
7886 1.1 skrll asymbol **syms)
7887 1.1 skrll {
7888 1.1 skrll bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
7889 1.1 skrll asection *s;
7890 1.1 skrll long ret;
7891 1.1 skrll
7892 1.1 skrll if (elf_dynsymtab (abfd) == 0)
7893 1.1 skrll {
7894 1.1 skrll bfd_set_error (bfd_error_invalid_operation);
7895 1.1 skrll return -1;
7896 1.1 skrll }
7897 1.1 skrll
7898 1.1 skrll slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
7899 1.1 skrll ret = 0;
7900 1.1 skrll for (s = abfd->sections; s != NULL; s = s->next)
7901 1.1 skrll {
7902 1.1 skrll if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
7903 1.1 skrll && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
7904 1.1 skrll || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
7905 1.1 skrll {
7906 1.1 skrll arelent *p;
7907 1.1 skrll long count, i;
7908 1.1 skrll
7909 1.1 skrll if (! (*slurp_relocs) (abfd, s, syms, TRUE))
7910 1.1 skrll return -1;
7911 1.1 skrll count = s->size / elf_section_data (s)->this_hdr.sh_entsize;
7912 1.1 skrll p = s->relocation;
7913 1.1 skrll for (i = 0; i < count; i++)
7914 1.1 skrll *storage++ = p++;
7915 1.1 skrll ret += count;
7916 1.1 skrll }
7917 1.1 skrll }
7918 1.1 skrll
7919 1.1 skrll *storage = NULL;
7920 1.1 skrll
7921 1.1 skrll return ret;
7922 1.1 skrll }
7923 1.1 skrll
7924 1.1 skrll /* Read in the version information. */
7926 1.1 skrll
7927 1.1 skrll bfd_boolean
7928 1.1 skrll _bfd_elf_slurp_version_tables (bfd *abfd, bfd_boolean default_imported_symver)
7929 1.1 skrll {
7930 1.1 skrll bfd_byte *contents = NULL;
7931 1.1 skrll unsigned int freeidx = 0;
7932 1.1 skrll
7933 1.1 skrll if (elf_dynverref (abfd) != 0)
7934 1.1 skrll {
7935 1.1 skrll Elf_Internal_Shdr *hdr;
7936 1.1 skrll Elf_External_Verneed *everneed;
7937 1.1 skrll Elf_Internal_Verneed *iverneed;
7938 1.1 skrll unsigned int i;
7939 1.1 skrll bfd_byte *contents_end;
7940 1.6 christos
7941 1.1 skrll hdr = &elf_tdata (abfd)->dynverref_hdr;
7942 1.6 christos
7943 1.6 christos if (hdr->sh_info == 0 || hdr->sh_size < sizeof (Elf_External_Verneed))
7944 1.6 christos {
7945 1.6 christos error_return_bad_verref:
7946 1.1 skrll (*_bfd_error_handler)
7947 1.1 skrll (_("%B: .gnu.version_r invalid entry"), abfd);
7948 1.1 skrll bfd_set_error (bfd_error_bad_value);
7949 1.1 skrll error_return_verref:
7950 1.1 skrll elf_tdata (abfd)->verref = NULL;
7951 1.6 christos elf_tdata (abfd)->cverrefs = 0;
7952 1.6 christos goto error_return;
7953 1.6 christos }
7954 1.6 christos
7955 1.6 christos contents = (bfd_byte *) bfd_malloc (hdr->sh_size);
7956 1.1 skrll if (contents == NULL)
7957 1.1 skrll goto error_return_verref;
7958 1.1 skrll
7959 1.1 skrll if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
7960 1.6 christos || bfd_bread (contents, hdr->sh_size, abfd) != hdr->sh_size)
7961 1.6 christos goto error_return_verref;
7962 1.6 christos
7963 1.6 christos elf_tdata (abfd)->verref = (Elf_Internal_Verneed *)
7964 1.1 skrll bfd_zalloc2 (abfd, hdr->sh_info, sizeof (Elf_Internal_Verneed));
7965 1.1 skrll
7966 1.1 skrll if (elf_tdata (abfd)->verref == NULL)
7967 1.1 skrll goto error_return_verref;
7968 1.1 skrll
7969 1.1 skrll BFD_ASSERT (sizeof (Elf_External_Verneed)
7970 1.1 skrll == sizeof (Elf_External_Vernaux));
7971 1.1 skrll contents_end = contents + hdr->sh_size - sizeof (Elf_External_Verneed);
7972 1.1 skrll everneed = (Elf_External_Verneed *) contents;
7973 1.1 skrll iverneed = elf_tdata (abfd)->verref;
7974 1.1 skrll for (i = 0; i < hdr->sh_info; i++, iverneed++)
7975 1.1 skrll {
7976 1.1 skrll Elf_External_Vernaux *evernaux;
7977 1.1 skrll Elf_Internal_Vernaux *ivernaux;
7978 1.1 skrll unsigned int j;
7979 1.1 skrll
7980 1.1 skrll _bfd_elf_swap_verneed_in (abfd, everneed, iverneed);
7981 1.1 skrll
7982 1.1 skrll iverneed->vn_bfd = abfd;
7983 1.1 skrll
7984 1.1 skrll iverneed->vn_filename =
7985 1.6 christos bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
7986 1.1 skrll iverneed->vn_file);
7987 1.1 skrll if (iverneed->vn_filename == NULL)
7988 1.1 skrll goto error_return_bad_verref;
7989 1.1 skrll
7990 1.1 skrll if (iverneed->vn_cnt == 0)
7991 1.3 christos iverneed->vn_auxptr = NULL;
7992 1.3 christos else
7993 1.3 christos {
7994 1.1 skrll iverneed->vn_auxptr = (struct elf_internal_vernaux *)
7995 1.1 skrll bfd_alloc2 (abfd, iverneed->vn_cnt,
7996 1.1 skrll sizeof (Elf_Internal_Vernaux));
7997 1.1 skrll if (iverneed->vn_auxptr == NULL)
7998 1.1 skrll goto error_return_verref;
7999 1.1 skrll }
8000 1.6 christos
8001 1.1 skrll if (iverneed->vn_aux
8002 1.1 skrll > (size_t) (contents_end - (bfd_byte *) everneed))
8003 1.1 skrll goto error_return_bad_verref;
8004 1.1 skrll
8005 1.1 skrll evernaux = ((Elf_External_Vernaux *)
8006 1.1 skrll ((bfd_byte *) everneed + iverneed->vn_aux));
8007 1.1 skrll ivernaux = iverneed->vn_auxptr;
8008 1.1 skrll for (j = 0; j < iverneed->vn_cnt; j++, ivernaux++)
8009 1.1 skrll {
8010 1.1 skrll _bfd_elf_swap_vernaux_in (abfd, evernaux, ivernaux);
8011 1.1 skrll
8012 1.1 skrll ivernaux->vna_nodename =
8013 1.6 christos bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
8014 1.6 christos ivernaux->vna_name);
8015 1.6 christos if (ivernaux->vna_nodename == NULL)
8016 1.6 christos goto error_return_bad_verref;
8017 1.1 skrll
8018 1.6 christos if (ivernaux->vna_other > freeidx)
8019 1.6 christos freeidx = ivernaux->vna_other;
8020 1.6 christos
8021 1.6 christos ivernaux->vna_nextptr = NULL;
8022 1.6 christos if (ivernaux->vna_next == 0)
8023 1.6 christos {
8024 1.1 skrll iverneed->vn_cnt = j + 1;
8025 1.1 skrll break;
8026 1.1 skrll }
8027 1.1 skrll if (j + 1 < iverneed->vn_cnt)
8028 1.1 skrll ivernaux->vna_nextptr = ivernaux + 1;
8029 1.6 christos
8030 1.1 skrll if (ivernaux->vna_next
8031 1.1 skrll > (size_t) (contents_end - (bfd_byte *) evernaux))
8032 1.1 skrll goto error_return_bad_verref;
8033 1.1 skrll
8034 1.1 skrll evernaux = ((Elf_External_Vernaux *)
8035 1.6 christos ((bfd_byte *) evernaux + ivernaux->vna_next));
8036 1.6 christos }
8037 1.6 christos
8038 1.1 skrll iverneed->vn_nextref = NULL;
8039 1.1 skrll if (iverneed->vn_next == 0)
8040 1.1 skrll break;
8041 1.1 skrll if (i + 1 < hdr->sh_info)
8042 1.1 skrll iverneed->vn_nextref = iverneed + 1;
8043 1.6 christos
8044 1.1 skrll if (iverneed->vn_next
8045 1.1 skrll > (size_t) (contents_end - (bfd_byte *) everneed))
8046 1.1 skrll goto error_return_bad_verref;
8047 1.1 skrll
8048 1.6 christos everneed = ((Elf_External_Verneed *)
8049 1.1 skrll ((bfd_byte *) everneed + iverneed->vn_next));
8050 1.1 skrll }
8051 1.1 skrll elf_tdata (abfd)->cverrefs = i;
8052 1.1 skrll
8053 1.1 skrll free (contents);
8054 1.1 skrll contents = NULL;
8055 1.1 skrll }
8056 1.1 skrll
8057 1.1 skrll if (elf_dynverdef (abfd) != 0)
8058 1.1 skrll {
8059 1.1 skrll Elf_Internal_Shdr *hdr;
8060 1.1 skrll Elf_External_Verdef *everdef;
8061 1.1 skrll Elf_Internal_Verdef *iverdef;
8062 1.1 skrll Elf_Internal_Verdef *iverdefarr;
8063 1.1 skrll Elf_Internal_Verdef iverdefmem;
8064 1.1 skrll unsigned int i;
8065 1.1 skrll unsigned int maxidx;
8066 1.1 skrll bfd_byte *contents_end_def, *contents_end_aux;
8067 1.6 christos
8068 1.6 christos hdr = &elf_tdata (abfd)->dynverdef_hdr;
8069 1.6 christos
8070 1.6 christos if (hdr->sh_info == 0 || hdr->sh_size < sizeof (Elf_External_Verdef))
8071 1.6 christos {
8072 1.6 christos error_return_bad_verdef:
8073 1.6 christos (*_bfd_error_handler)
8074 1.6 christos (_("%B: .gnu.version_d invalid entry"), abfd);
8075 1.6 christos bfd_set_error (bfd_error_bad_value);
8076 1.6 christos error_return_verdef:
8077 1.6 christos elf_tdata (abfd)->verdef = NULL;
8078 1.6 christos elf_tdata (abfd)->cverdefs = 0;
8079 1.3 christos goto error_return;
8080 1.1 skrll }
8081 1.6 christos
8082 1.1 skrll contents = (bfd_byte *) bfd_malloc (hdr->sh_size);
8083 1.1 skrll if (contents == NULL)
8084 1.6 christos goto error_return_verdef;
8085 1.1 skrll if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
8086 1.1 skrll || bfd_bread (contents, hdr->sh_size, abfd) != hdr->sh_size)
8087 1.1 skrll goto error_return_verdef;
8088 1.1 skrll
8089 1.1 skrll BFD_ASSERT (sizeof (Elf_External_Verdef)
8090 1.1 skrll >= sizeof (Elf_External_Verdaux));
8091 1.1 skrll contents_end_def = contents + hdr->sh_size
8092 1.1 skrll - sizeof (Elf_External_Verdef);
8093 1.1 skrll contents_end_aux = contents + hdr->sh_size
8094 1.1 skrll - sizeof (Elf_External_Verdaux);
8095 1.1 skrll
8096 1.1 skrll /* We know the number of entries in the section but not the maximum
8097 1.1 skrll index. Therefore we have to run through all entries and find
8098 1.1 skrll the maximum. */
8099 1.1 skrll everdef = (Elf_External_Verdef *) contents;
8100 1.1 skrll maxidx = 0;
8101 1.1 skrll for (i = 0; i < hdr->sh_info; ++i)
8102 1.6 christos {
8103 1.6 christos _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
8104 1.1 skrll
8105 1.1 skrll if ((iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION)) == 0)
8106 1.1 skrll goto error_return_bad_verdef;
8107 1.6 christos if ((iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION)) > maxidx)
8108 1.6 christos maxidx = iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION);
8109 1.6 christos
8110 1.1 skrll if (iverdefmem.vd_next == 0)
8111 1.1 skrll break;
8112 1.6 christos
8113 1.1 skrll if (iverdefmem.vd_next
8114 1.1 skrll > (size_t) (contents_end_def - (bfd_byte *) everdef))
8115 1.1 skrll goto error_return_bad_verdef;
8116 1.1 skrll
8117 1.1 skrll everdef = ((Elf_External_Verdef *)
8118 1.1 skrll ((bfd_byte *) everdef + iverdefmem.vd_next));
8119 1.1 skrll }
8120 1.1 skrll
8121 1.1 skrll if (default_imported_symver)
8122 1.1 skrll {
8123 1.1 skrll if (freeidx > maxidx)
8124 1.1 skrll maxidx = ++freeidx;
8125 1.6 christos else
8126 1.3 christos freeidx = ++maxidx;
8127 1.6 christos }
8128 1.1 skrll
8129 1.6 christos elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *)
8130 1.1 skrll bfd_zalloc2 (abfd, maxidx, sizeof (Elf_Internal_Verdef));
8131 1.1 skrll if (elf_tdata (abfd)->verdef == NULL)
8132 1.1 skrll goto error_return_verdef;
8133 1.1 skrll
8134 1.1 skrll elf_tdata (abfd)->cverdefs = maxidx;
8135 1.1 skrll
8136 1.1 skrll everdef = (Elf_External_Verdef *) contents;
8137 1.1 skrll iverdefarr = elf_tdata (abfd)->verdef;
8138 1.1 skrll for (i = 0; i < hdr->sh_info; i++)
8139 1.1 skrll {
8140 1.1 skrll Elf_External_Verdaux *everdaux;
8141 1.1 skrll Elf_Internal_Verdaux *iverdaux;
8142 1.1 skrll unsigned int j;
8143 1.1 skrll
8144 1.6 christos _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
8145 1.1 skrll
8146 1.1 skrll if ((iverdefmem.vd_ndx & VERSYM_VERSION) == 0)
8147 1.6 christos goto error_return_bad_verdef;
8148 1.1 skrll
8149 1.1 skrll iverdef = &iverdefarr[(iverdefmem.vd_ndx & VERSYM_VERSION) - 1];
8150 1.1 skrll memcpy (iverdef, &iverdefmem, offsetof (Elf_Internal_Verdef, vd_bfd));
8151 1.1 skrll
8152 1.1 skrll iverdef->vd_bfd = abfd;
8153 1.1 skrll
8154 1.1 skrll if (iverdef->vd_cnt == 0)
8155 1.3 christos iverdef->vd_auxptr = NULL;
8156 1.3 christos else
8157 1.3 christos {
8158 1.1 skrll iverdef->vd_auxptr = (struct elf_internal_verdaux *)
8159 1.1 skrll bfd_alloc2 (abfd, iverdef->vd_cnt,
8160 1.1 skrll sizeof (Elf_Internal_Verdaux));
8161 1.1 skrll if (iverdef->vd_auxptr == NULL)
8162 1.1 skrll goto error_return_verdef;
8163 1.1 skrll }
8164 1.6 christos
8165 1.1 skrll if (iverdef->vd_aux
8166 1.1 skrll > (size_t) (contents_end_aux - (bfd_byte *) everdef))
8167 1.1 skrll goto error_return_bad_verdef;
8168 1.1 skrll
8169 1.1 skrll everdaux = ((Elf_External_Verdaux *)
8170 1.1 skrll ((bfd_byte *) everdef + iverdef->vd_aux));
8171 1.1 skrll iverdaux = iverdef->vd_auxptr;
8172 1.1 skrll for (j = 0; j < iverdef->vd_cnt; j++, iverdaux++)
8173 1.1 skrll {
8174 1.1 skrll _bfd_elf_swap_verdaux_in (abfd, everdaux, iverdaux);
8175 1.1 skrll
8176 1.1 skrll iverdaux->vda_nodename =
8177 1.6 christos bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
8178 1.1 skrll iverdaux->vda_name);
8179 1.6 christos if (iverdaux->vda_nodename == NULL)
8180 1.6 christos goto error_return_bad_verdef;
8181 1.6 christos
8182 1.6 christos iverdaux->vda_nextptr = NULL;
8183 1.6 christos if (iverdaux->vda_next == 0)
8184 1.6 christos {
8185 1.1 skrll iverdef->vd_cnt = j + 1;
8186 1.1 skrll break;
8187 1.1 skrll }
8188 1.1 skrll if (j + 1 < iverdef->vd_cnt)
8189 1.1 skrll iverdaux->vda_nextptr = iverdaux + 1;
8190 1.6 christos
8191 1.1 skrll if (iverdaux->vda_next
8192 1.1 skrll > (size_t) (contents_end_aux - (bfd_byte *) everdaux))
8193 1.1 skrll goto error_return_bad_verdef;
8194 1.1 skrll
8195 1.1 skrll everdaux = ((Elf_External_Verdaux *)
8196 1.6 christos ((bfd_byte *) everdaux + iverdaux->vda_next));
8197 1.1 skrll }
8198 1.1 skrll
8199 1.1 skrll iverdef->vd_nodename = NULL;
8200 1.6 christos if (iverdef->vd_cnt)
8201 1.6 christos iverdef->vd_nodename = iverdef->vd_auxptr->vda_nodename;
8202 1.6 christos
8203 1.1 skrll iverdef->vd_nextdef = NULL;
8204 1.1 skrll if (iverdef->vd_next == 0)
8205 1.1 skrll break;
8206 1.1 skrll if ((size_t) (iverdef - iverdefarr) + 1 < maxidx)
8207 1.1 skrll iverdef->vd_nextdef = iverdef + 1;
8208 1.1 skrll
8209 1.1 skrll everdef = ((Elf_External_Verdef *)
8210 1.1 skrll ((bfd_byte *) everdef + iverdef->vd_next));
8211 1.1 skrll }
8212 1.1 skrll
8213 1.1 skrll free (contents);
8214 1.1 skrll contents = NULL;
8215 1.1 skrll }
8216 1.1 skrll else if (default_imported_symver)
8217 1.1 skrll {
8218 1.1 skrll if (freeidx < 3)
8219 1.1 skrll freeidx = 3;
8220 1.3 christos else
8221 1.3 christos freeidx++;
8222 1.1 skrll
8223 1.1 skrll elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *)
8224 1.1 skrll bfd_zalloc2 (abfd, freeidx, sizeof (Elf_Internal_Verdef));
8225 1.1 skrll if (elf_tdata (abfd)->verdef == NULL)
8226 1.1 skrll goto error_return;
8227 1.1 skrll
8228 1.1 skrll elf_tdata (abfd)->cverdefs = freeidx;
8229 1.1 skrll }
8230 1.1 skrll
8231 1.1 skrll /* Create a default version based on the soname. */
8232 1.1 skrll if (default_imported_symver)
8233 1.1 skrll {
8234 1.6 christos Elf_Internal_Verdef *iverdef;
8235 1.1 skrll Elf_Internal_Verdaux *iverdaux;
8236 1.1 skrll
8237 1.1 skrll iverdef = &elf_tdata (abfd)->verdef[freeidx - 1];
8238 1.1 skrll
8239 1.1 skrll iverdef->vd_version = VER_DEF_CURRENT;
8240 1.1 skrll iverdef->vd_flags = 0;
8241 1.1 skrll iverdef->vd_ndx = freeidx;
8242 1.1 skrll iverdef->vd_cnt = 1;
8243 1.1 skrll
8244 1.1 skrll iverdef->vd_bfd = abfd;
8245 1.1 skrll
8246 1.1 skrll iverdef->vd_nodename = bfd_elf_get_dt_soname (abfd);
8247 1.6 christos if (iverdef->vd_nodename == NULL)
8248 1.6 christos goto error_return_verdef;
8249 1.1 skrll iverdef->vd_nextdef = NULL;
8250 1.1 skrll iverdef->vd_auxptr = ((struct elf_internal_verdaux *)
8251 1.1 skrll bfd_zalloc (abfd, sizeof (Elf_Internal_Verdaux)));
8252 1.1 skrll if (iverdef->vd_auxptr == NULL)
8253 1.1 skrll goto error_return_verdef;
8254 1.1 skrll
8255 1.1 skrll iverdaux = iverdef->vd_auxptr;
8256 1.1 skrll iverdaux->vda_nodename = iverdef->vd_nodename;
8257 1.1 skrll }
8258 1.1 skrll
8259 1.1 skrll return TRUE;
8260 1.1 skrll
8261 1.1 skrll error_return:
8262 1.1 skrll if (contents != NULL)
8263 1.1 skrll free (contents);
8264 1.1 skrll return FALSE;
8265 1.1 skrll }
8266 1.1 skrll
8267 1.1 skrll asymbol *
8269 1.6 christos _bfd_elf_make_empty_symbol (bfd *abfd)
8270 1.1 skrll {
8271 1.1 skrll elf_symbol_type *newsym;
8272 1.6 christos
8273 1.6 christos newsym = (elf_symbol_type *) bfd_zalloc (abfd, sizeof * newsym);
8274 1.1 skrll if (!newsym)
8275 1.1 skrll return NULL;
8276 1.1 skrll newsym->symbol.the_bfd = abfd;
8277 1.1 skrll return &newsym->symbol;
8278 1.1 skrll }
8279 1.1 skrll
8280 1.1 skrll void
8281 1.1 skrll _bfd_elf_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
8282 1.1 skrll asymbol *symbol,
8283 1.1 skrll symbol_info *ret)
8284 1.1 skrll {
8285 1.1 skrll bfd_symbol_info (symbol, ret);
8286 1.1 skrll }
8287 1.1 skrll
8288 1.1 skrll /* Return whether a symbol name implies a local symbol. Most targets
8289 1.1 skrll use this function for the is_local_label_name entry point, but some
8290 1.1 skrll override it. */
8291 1.1 skrll
8292 1.1 skrll bfd_boolean
8293 1.1 skrll _bfd_elf_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
8294 1.1 skrll const char *name)
8295 1.1 skrll {
8296 1.1 skrll /* Normal local symbols start with ``.L''. */
8297 1.1 skrll if (name[0] == '.' && name[1] == 'L')
8298 1.1 skrll return TRUE;
8299 1.1 skrll
8300 1.1 skrll /* At least some SVR4 compilers (e.g., UnixWare 2.1 cc) generate
8301 1.1 skrll DWARF debugging symbols starting with ``..''. */
8302 1.1 skrll if (name[0] == '.' && name[1] == '.')
8303 1.1 skrll return TRUE;
8304 1.1 skrll
8305 1.1 skrll /* gcc will sometimes generate symbols beginning with ``_.L_'' when
8306 1.1 skrll emitting DWARF debugging output. I suspect this is actually a
8307 1.1 skrll small bug in gcc (it calls ASM_OUTPUT_LABEL when it should call
8308 1.1 skrll ASM_GENERATE_INTERNAL_LABEL, and this causes the leading
8309 1.1 skrll underscore to be emitted on some ELF targets). For ease of use,
8310 1.6 christos we treat such symbols as local. */
8311 1.6 christos if (name[0] == '_' && name[1] == '.' && name[2] == 'L' && name[3] == '_')
8312 1.6 christos return TRUE;
8313 1.6 christos
8314 1.6 christos /* Treat assembler generated fake symbols, dollar local labels and
8315 1.6 christos forward-backward labels (aka local labels) as locals.
8316 1.6 christos These labels have the form:
8317 1.6 christos
8318 1.6 christos L0^A.* (fake symbols)
8319 1.6 christos
8320 1.6 christos [.]?L[0123456789]+{^A|^B}[0123456789]* (local labels)
8321 1.6 christos
8322 1.6 christos Versions which start with .L will have already been matched above,
8323 1.6 christos so we only need to match the rest. */
8324 1.6 christos if (name[0] == 'L' && ISDIGIT (name[1]))
8325 1.6 christos {
8326 1.6 christos bfd_boolean ret = FALSE;
8327 1.6 christos const char * p;
8328 1.6 christos char c;
8329 1.6 christos
8330 1.6 christos for (p = name + 2; (c = *p); p++)
8331 1.6 christos {
8332 1.6 christos if (c == 1 || c == 2)
8333 1.6 christos {
8334 1.6 christos if (c == 1 && p == name + 2)
8335 1.6 christos /* A fake symbol. */
8336 1.6 christos return TRUE;
8337 1.6 christos
8338 1.6 christos /* FIXME: We are being paranoid here and treating symbols like
8339 1.6 christos L0^Bfoo as if there were non-local, on the grounds that the
8340 1.6 christos assembler will never generate them. But can any symbol
8341 1.6 christos containing an ASCII value in the range 1-31 ever be anything
8342 1.6 christos other than some kind of local ? */
8343 1.6 christos ret = TRUE;
8344 1.6 christos }
8345 1.6 christos
8346 1.6 christos if (! ISDIGIT (c))
8347 1.6 christos {
8348 1.6 christos ret = FALSE;
8349 1.6 christos break;
8350 1.6 christos }
8351 1.1 skrll }
8352 1.1 skrll return ret;
8353 1.1 skrll }
8354 1.1 skrll
8355 1.1 skrll return FALSE;
8356 1.1 skrll }
8357 1.1 skrll
8358 1.1 skrll alent *
8359 1.1 skrll _bfd_elf_get_lineno (bfd *abfd ATTRIBUTE_UNUSED,
8360 1.1 skrll asymbol *symbol ATTRIBUTE_UNUSED)
8361 1.1 skrll {
8362 1.1 skrll abort ();
8363 1.1 skrll return NULL;
8364 1.1 skrll }
8365 1.1 skrll
8366 1.1 skrll bfd_boolean
8367 1.1 skrll _bfd_elf_set_arch_mach (bfd *abfd,
8368 1.1 skrll enum bfd_architecture arch,
8369 1.1 skrll unsigned long machine)
8370 1.1 skrll {
8371 1.1 skrll /* If this isn't the right architecture for this backend, and this
8372 1.1 skrll isn't the generic backend, fail. */
8373 1.1 skrll if (arch != get_elf_backend_data (abfd)->arch
8374 1.1 skrll && arch != bfd_arch_unknown
8375 1.1 skrll && get_elf_backend_data (abfd)->arch != bfd_arch_unknown)
8376 1.1 skrll return FALSE;
8377 1.1 skrll
8378 1.1 skrll return bfd_default_set_arch_mach (abfd, arch, machine);
8379 1.1 skrll }
8380 1.1 skrll
8381 1.1 skrll /* Find the nearest line to a particular section and offset,
8382 1.6 christos for error reporting. */
8383 1.1 skrll
8384 1.1 skrll bfd_boolean
8385 1.1 skrll _bfd_elf_find_nearest_line (bfd *abfd,
8386 1.1 skrll asymbol **symbols,
8387 1.6 christos asection *section,
8388 1.6 christos bfd_vma offset,
8389 1.5 christos const char **filename_ptr,
8390 1.1 skrll const char **functionname_ptr,
8391 1.1 skrll unsigned int *line_ptr,
8392 1.6 christos unsigned int *discriminator_ptr)
8393 1.1 skrll {
8394 1.6 christos bfd_boolean found;
8395 1.6 christos
8396 1.6 christos if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
8397 1.6 christos filename_ptr, functionname_ptr,
8398 1.6 christos line_ptr, discriminator_ptr,
8399 1.6 christos dwarf_debug_sections, 0,
8400 1.1 skrll &elf_tdata (abfd)->dwarf2_find_line_info)
8401 1.1 skrll || _bfd_dwarf1_find_nearest_line (abfd, symbols, section, offset,
8402 1.6 christos filename_ptr, functionname_ptr,
8403 1.6 christos line_ptr))
8404 1.6 christos {
8405 1.1 skrll if (!*functionname_ptr)
8406 1.1 skrll _bfd_elf_find_function (abfd, symbols, section, offset,
8407 1.1 skrll *filename_ptr ? NULL : filename_ptr,
8408 1.1 skrll functionname_ptr);
8409 1.1 skrll return TRUE;
8410 1.1 skrll }
8411 1.1 skrll
8412 1.1 skrll if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
8413 1.1 skrll &found, filename_ptr,
8414 1.1 skrll functionname_ptr, line_ptr,
8415 1.1 skrll &elf_tdata (abfd)->line_info))
8416 1.1 skrll return FALSE;
8417 1.1 skrll if (found && (*functionname_ptr || *line_ptr))
8418 1.1 skrll return TRUE;
8419 1.6 christos
8420 1.6 christos if (symbols == NULL)
8421 1.1 skrll return FALSE;
8422 1.1 skrll
8423 1.1 skrll if (! _bfd_elf_find_function (abfd, symbols, section, offset,
8424 1.1 skrll filename_ptr, functionname_ptr))
8425 1.1 skrll return FALSE;
8426 1.1 skrll
8427 1.1 skrll *line_ptr = 0;
8428 1.1 skrll return TRUE;
8429 1.1 skrll }
8430 1.1 skrll
8431 1.1 skrll /* Find the line for a symbol. */
8432 1.1 skrll
8433 1.6 christos bfd_boolean
8434 1.6 christos _bfd_elf_find_line (bfd *abfd, asymbol **symbols, asymbol *symbol,
8435 1.6 christos const char **filename_ptr, unsigned int *line_ptr)
8436 1.6 christos {
8437 1.1 skrll return _bfd_dwarf2_find_nearest_line (abfd, symbols, symbol, NULL, 0,
8438 1.1 skrll filename_ptr, NULL, line_ptr, NULL,
8439 1.1 skrll dwarf_debug_sections, 0,
8440 1.1 skrll &elf_tdata (abfd)->dwarf2_find_line_info);
8441 1.1 skrll }
8442 1.1 skrll
8443 1.1 skrll /* After a call to bfd_find_nearest_line, successive calls to
8444 1.1 skrll bfd_find_inliner_info can be used to get source information about
8445 1.1 skrll each level of function inlining that terminated at the address
8446 1.1 skrll passed to bfd_find_nearest_line. Currently this is only supported
8447 1.1 skrll for DWARF2 with appropriate DWARF3 extensions. */
8448 1.1 skrll
8449 1.1 skrll bfd_boolean
8450 1.1 skrll _bfd_elf_find_inliner_info (bfd *abfd,
8451 1.1 skrll const char **filename_ptr,
8452 1.1 skrll const char **functionname_ptr,
8453 1.1 skrll unsigned int *line_ptr)
8454 1.1 skrll {
8455 1.1 skrll bfd_boolean found;
8456 1.1 skrll found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
8457 1.1 skrll functionname_ptr, line_ptr,
8458 1.1 skrll & elf_tdata (abfd)->dwarf2_find_line_info);
8459 1.1 skrll return found;
8460 1.1 skrll }
8461 1.1 skrll
8462 1.1 skrll int
8463 1.1 skrll _bfd_elf_sizeof_headers (bfd *abfd, struct bfd_link_info *info)
8464 1.6 christos {
8465 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
8466 1.6 christos int ret = bed->s->sizeof_ehdr;
8467 1.1 skrll
8468 1.1 skrll if (!bfd_link_relocatable (info))
8469 1.1 skrll {
8470 1.1 skrll bfd_size_type phdr_size = elf_program_header_size (abfd);
8471 1.1 skrll
8472 1.1 skrll if (phdr_size == (bfd_size_type) -1)
8473 1.6 christos {
8474 1.1 skrll struct elf_segment_map *m;
8475 1.1 skrll
8476 1.1 skrll phdr_size = 0;
8477 1.1 skrll for (m = elf_seg_map (abfd); m != NULL; m = m->next)
8478 1.1 skrll phdr_size += bed->s->sizeof_phdr;
8479 1.1 skrll
8480 1.6 christos if (phdr_size == 0)
8481 1.1 skrll phdr_size = get_program_header_size (abfd, info);
8482 1.1 skrll }
8483 1.1 skrll
8484 1.1 skrll elf_program_header_size (abfd) = phdr_size;
8485 1.1 skrll ret += phdr_size;
8486 1.1 skrll }
8487 1.1 skrll
8488 1.1 skrll return ret;
8489 1.1 skrll }
8490 1.1 skrll
8491 1.1 skrll bfd_boolean
8492 1.1 skrll _bfd_elf_set_section_contents (bfd *abfd,
8493 1.1 skrll sec_ptr section,
8494 1.1 skrll const void *location,
8495 1.6 christos file_ptr offset,
8496 1.1 skrll bfd_size_type count)
8497 1.1 skrll {
8498 1.1 skrll Elf_Internal_Shdr *hdr;
8499 1.1 skrll file_ptr pos;
8500 1.1 skrll
8501 1.6 christos if (! abfd->output_has_begun
8502 1.6 christos && ! _bfd_elf_compute_section_file_positions (abfd, NULL))
8503 1.6 christos return FALSE;
8504 1.1 skrll
8505 1.6 christos if (!count)
8506 1.6 christos return TRUE;
8507 1.6 christos
8508 1.6 christos hdr = &elf_section_data (section)->this_hdr;
8509 1.6 christos if (hdr->sh_offset == (file_ptr) -1)
8510 1.6 christos {
8511 1.6 christos /* We must compress this section. Write output to the buffer. */
8512 1.6 christos unsigned char *contents = hdr->contents;
8513 1.6 christos if ((offset + count) > hdr->sh_size
8514 1.6 christos || (section->flags & SEC_ELF_COMPRESS) == 0
8515 1.6 christos || contents == NULL)
8516 1.1 skrll abort ();
8517 1.1 skrll memcpy (contents + offset, location, count);
8518 1.1 skrll return TRUE;
8519 1.1 skrll }
8520 1.1 skrll pos = hdr->sh_offset + offset;
8521 1.1 skrll if (bfd_seek (abfd, pos, SEEK_SET) != 0
8522 1.1 skrll || bfd_bwrite (location, count, abfd) != count)
8523 1.1 skrll return FALSE;
8524 1.1 skrll
8525 1.1 skrll return TRUE;
8526 1.1 skrll }
8527 1.1 skrll
8528 1.1 skrll void
8529 1.1 skrll _bfd_elf_no_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
8530 1.1 skrll arelent *cache_ptr ATTRIBUTE_UNUSED,
8531 1.1 skrll Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
8532 1.1 skrll {
8533 1.1 skrll abort ();
8534 1.1 skrll }
8535 1.1 skrll
8536 1.1 skrll /* Try to convert a non-ELF reloc into an ELF one. */
8537 1.1 skrll
8538 1.1 skrll bfd_boolean
8539 1.1 skrll _bfd_elf_validate_reloc (bfd *abfd, arelent *areloc)
8540 1.1 skrll {
8541 1.1 skrll /* Check whether we really have an ELF howto. */
8542 1.1 skrll
8543 1.1 skrll if ((*areloc->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec)
8544 1.1 skrll {
8545 1.1 skrll bfd_reloc_code_real_type code;
8546 1.1 skrll reloc_howto_type *howto;
8547 1.1 skrll
8548 1.1 skrll /* Alien reloc: Try to determine its type to replace it with an
8549 1.1 skrll equivalent ELF reloc. */
8550 1.1 skrll
8551 1.1 skrll if (areloc->howto->pc_relative)
8552 1.1 skrll {
8553 1.1 skrll switch (areloc->howto->bitsize)
8554 1.1 skrll {
8555 1.1 skrll case 8:
8556 1.1 skrll code = BFD_RELOC_8_PCREL;
8557 1.1 skrll break;
8558 1.1 skrll case 12:
8559 1.1 skrll code = BFD_RELOC_12_PCREL;
8560 1.1 skrll break;
8561 1.1 skrll case 16:
8562 1.1 skrll code = BFD_RELOC_16_PCREL;
8563 1.1 skrll break;
8564 1.1 skrll case 24:
8565 1.1 skrll code = BFD_RELOC_24_PCREL;
8566 1.1 skrll break;
8567 1.1 skrll case 32:
8568 1.1 skrll code = BFD_RELOC_32_PCREL;
8569 1.1 skrll break;
8570 1.1 skrll case 64:
8571 1.1 skrll code = BFD_RELOC_64_PCREL;
8572 1.1 skrll break;
8573 1.1 skrll default:
8574 1.1 skrll goto fail;
8575 1.1 skrll }
8576 1.1 skrll
8577 1.1 skrll howto = bfd_reloc_type_lookup (abfd, code);
8578 1.1 skrll
8579 1.1 skrll if (areloc->howto->pcrel_offset != howto->pcrel_offset)
8580 1.1 skrll {
8581 1.1 skrll if (howto->pcrel_offset)
8582 1.1 skrll areloc->addend += areloc->address;
8583 1.1 skrll else
8584 1.1 skrll areloc->addend -= areloc->address; /* addend is unsigned!! */
8585 1.1 skrll }
8586 1.1 skrll }
8587 1.1 skrll else
8588 1.1 skrll {
8589 1.1 skrll switch (areloc->howto->bitsize)
8590 1.1 skrll {
8591 1.1 skrll case 8:
8592 1.1 skrll code = BFD_RELOC_8;
8593 1.1 skrll break;
8594 1.1 skrll case 14:
8595 1.1 skrll code = BFD_RELOC_14;
8596 1.1 skrll break;
8597 1.1 skrll case 16:
8598 1.1 skrll code = BFD_RELOC_16;
8599 1.1 skrll break;
8600 1.1 skrll case 26:
8601 1.1 skrll code = BFD_RELOC_26;
8602 1.1 skrll break;
8603 1.1 skrll case 32:
8604 1.1 skrll code = BFD_RELOC_32;
8605 1.1 skrll break;
8606 1.1 skrll case 64:
8607 1.1 skrll code = BFD_RELOC_64;
8608 1.1 skrll break;
8609 1.1 skrll default:
8610 1.1 skrll goto fail;
8611 1.1 skrll }
8612 1.1 skrll
8613 1.1 skrll howto = bfd_reloc_type_lookup (abfd, code);
8614 1.1 skrll }
8615 1.1 skrll
8616 1.1 skrll if (howto)
8617 1.1 skrll areloc->howto = howto;
8618 1.1 skrll else
8619 1.1 skrll goto fail;
8620 1.1 skrll }
8621 1.1 skrll
8622 1.1 skrll return TRUE;
8623 1.1 skrll
8624 1.1 skrll fail:
8625 1.1 skrll (*_bfd_error_handler)
8626 1.1 skrll (_("%B: unsupported relocation type %s"),
8627 1.1 skrll abfd, areloc->howto->name);
8628 1.1 skrll bfd_set_error (bfd_error_bad_value);
8629 1.1 skrll return FALSE;
8630 1.1 skrll }
8631 1.5 christos
8632 1.5 christos bfd_boolean
8633 1.1 skrll _bfd_elf_close_and_cleanup (bfd *abfd)
8634 1.6 christos {
8635 1.1 skrll struct elf_obj_tdata *tdata = elf_tdata (abfd);
8636 1.5 christos if (bfd_get_format (abfd) == bfd_object && tdata != NULL)
8637 1.1 skrll {
8638 1.1 skrll if (elf_tdata (abfd)->o != NULL && elf_shstrtab (abfd) != NULL)
8639 1.1 skrll _bfd_elf_strtab_free (elf_shstrtab (abfd));
8640 1.1 skrll _bfd_dwarf2_cleanup_debug_info (abfd, &tdata->dwarf2_find_line_info);
8641 1.1 skrll }
8642 1.1 skrll
8643 1.1 skrll return _bfd_generic_close_and_cleanup (abfd);
8644 1.1 skrll }
8645 1.1 skrll
8646 1.1 skrll /* For Rel targets, we encode meaningful data for BFD_RELOC_VTABLE_ENTRY
8647 1.1 skrll in the relocation's offset. Thus we cannot allow any sort of sanity
8648 1.1 skrll range-checking to interfere. There is nothing else to do in processing
8649 1.1 skrll this reloc. */
8650 1.1 skrll
8651 1.1 skrll bfd_reloc_status_type
8652 1.1 skrll _bfd_elf_rel_vtable_reloc_fn
8653 1.1 skrll (bfd *abfd ATTRIBUTE_UNUSED, arelent *re ATTRIBUTE_UNUSED,
8654 1.1 skrll struct bfd_symbol *symbol ATTRIBUTE_UNUSED,
8655 1.1 skrll void *data ATTRIBUTE_UNUSED, asection *is ATTRIBUTE_UNUSED,
8656 1.1 skrll bfd *obfd ATTRIBUTE_UNUSED, char **errmsg ATTRIBUTE_UNUSED)
8657 1.1 skrll {
8658 1.1 skrll return bfd_reloc_ok;
8659 1.1 skrll }
8660 1.1 skrll
8661 1.1 skrll /* Elf core file support. Much of this only works on native
8663 1.3 christos toolchains, since we rely on knowing the
8664 1.3 christos machine-dependent procfs structure in order to pick
8665 1.1 skrll out details about the corefile. */
8666 1.1 skrll
8667 1.1 skrll #ifdef HAVE_SYS_PROCFS_H
8668 1.3 christos /* Needed for new procfs interface on sparc-solaris. */
8669 1.3 christos # define _STRUCTURED_PROC 1
8670 1.1 skrll # include <sys/procfs.h>
8671 1.1 skrll #endif
8672 1.1 skrll
8673 1.1 skrll /* Return a PID that identifies a "thread" for threaded cores, or the
8674 1.3 christos PID of the main process for non-threaded cores. */
8675 1.3 christos
8676 1.6 christos static int
8677 1.3 christos elfcore_make_pid (bfd *abfd)
8678 1.6 christos {
8679 1.3 christos int pid;
8680 1.3 christos
8681 1.1 skrll pid = elf_tdata (abfd)->core->lwpid;
8682 1.1 skrll if (pid == 0)
8683 1.1 skrll pid = elf_tdata (abfd)->core->pid;
8684 1.1 skrll
8685 1.1 skrll return pid;
8686 1.1 skrll }
8687 1.1 skrll
8688 1.1 skrll /* If there isn't a section called NAME, make one, using
8689 1.1 skrll data from SECT. Note, this function will generate a
8690 1.1 skrll reference to NAME, so you shouldn't deallocate or
8691 1.1 skrll overwrite it. */
8692 1.1 skrll
8693 1.1 skrll static bfd_boolean
8694 1.1 skrll elfcore_maybe_make_sect (bfd *abfd, char *name, asection *sect)
8695 1.1 skrll {
8696 1.1 skrll asection *sect2;
8697 1.1 skrll
8698 1.1 skrll if (bfd_get_section_by_name (abfd, name) != NULL)
8699 1.1 skrll return TRUE;
8700 1.1 skrll
8701 1.1 skrll sect2 = bfd_make_section_with_flags (abfd, name, sect->flags);
8702 1.1 skrll if (sect2 == NULL)
8703 1.1 skrll return FALSE;
8704 1.1 skrll
8705 1.1 skrll sect2->size = sect->size;
8706 1.1 skrll sect2->filepos = sect->filepos;
8707 1.1 skrll sect2->alignment_power = sect->alignment_power;
8708 1.1 skrll return TRUE;
8709 1.1 skrll }
8710 1.1 skrll
8711 1.1 skrll /* Create a pseudosection containing SIZE bytes at FILEPOS. This
8712 1.1 skrll actually creates up to two pseudosections:
8713 1.1 skrll - For the single-threaded case, a section named NAME, unless
8714 1.1 skrll such a section already exists.
8715 1.1 skrll - For the multi-threaded case, a section named "NAME/PID", where
8716 1.1 skrll PID is elfcore_make_pid (abfd).
8717 1.1 skrll Both pseudosections have identical contents. */
8718 1.1 skrll bfd_boolean
8719 1.1 skrll _bfd_elfcore_make_pseudosection (bfd *abfd,
8720 1.1 skrll char *name,
8721 1.1 skrll size_t size,
8722 1.1 skrll ufile_ptr filepos)
8723 1.1 skrll {
8724 1.1 skrll char buf[100];
8725 1.1 skrll char *threaded_name;
8726 1.1 skrll size_t len;
8727 1.1 skrll asection *sect;
8728 1.3 christos
8729 1.1 skrll /* Build the section name. */
8730 1.1 skrll
8731 1.1 skrll sprintf (buf, "%s/%d", name, elfcore_make_pid (abfd));
8732 1.1 skrll len = strlen (buf) + 1;
8733 1.1 skrll threaded_name = (char *) bfd_alloc (abfd, len);
8734 1.1 skrll if (threaded_name == NULL)
8735 1.1 skrll return FALSE;
8736 1.1 skrll memcpy (threaded_name, buf, len);
8737 1.1 skrll
8738 1.1 skrll sect = bfd_make_section_anyway_with_flags (abfd, threaded_name,
8739 1.1 skrll SEC_HAS_CONTENTS);
8740 1.1 skrll if (sect == NULL)
8741 1.1 skrll return FALSE;
8742 1.1 skrll sect->size = size;
8743 1.1 skrll sect->filepos = filepos;
8744 1.1 skrll sect->alignment_power = 2;
8745 1.1 skrll
8746 1.1 skrll return elfcore_maybe_make_sect (abfd, name, sect);
8747 1.1 skrll }
8748 1.1 skrll
8749 1.1 skrll /* prstatus_t exists on:
8750 1.1 skrll solaris 2.5+
8751 1.1 skrll linux 2.[01] + glibc
8752 1.1 skrll unixware 4.2
8753 1.1 skrll */
8754 1.1 skrll
8755 1.1 skrll #if defined (HAVE_PRSTATUS_T)
8756 1.1 skrll
8757 1.1 skrll static bfd_boolean
8758 1.1 skrll elfcore_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
8759 1.1 skrll {
8760 1.1 skrll size_t size;
8761 1.1 skrll int offset;
8762 1.1 skrll
8763 1.1 skrll if (note->descsz == sizeof (prstatus_t))
8764 1.1 skrll {
8765 1.1 skrll prstatus_t prstat;
8766 1.1 skrll
8767 1.1 skrll size = sizeof (prstat.pr_reg);
8768 1.6 christos offset = offsetof (prstatus_t, pr_reg);
8769 1.6 christos memcpy (&prstat, note->descdata, sizeof (prstat));
8770 1.6 christos
8771 1.6 christos /* Do not overwrite the core signal if it
8772 1.1 skrll has already been set by another thread. */
8773 1.1 skrll if (elf_tdata (abfd)->core->signal == 0)
8774 1.1 skrll elf_tdata (abfd)->core->signal = prstat.pr_cursig;
8775 1.1 skrll if (elf_tdata (abfd)->core->pid == 0)
8776 1.1 skrll elf_tdata (abfd)->core->pid = prstat.pr_pid;
8777 1.1 skrll
8778 1.1 skrll /* pr_who exists on:
8779 1.1 skrll solaris 2.5+
8780 1.6 christos unixware 4.2
8781 1.3 christos pr_who doesn't exist on:
8782 1.6 christos linux 2.[01]
8783 1.1 skrll */
8784 1.1 skrll #if defined (HAVE_PRSTATUS_T_PR_WHO)
8785 1.1 skrll elf_tdata (abfd)->core->lwpid = prstat.pr_who;
8786 1.1 skrll #else
8787 1.1 skrll elf_tdata (abfd)->core->lwpid = prstat.pr_pid;
8788 1.1 skrll #endif
8789 1.1 skrll }
8790 1.1 skrll #if defined (HAVE_PRSTATUS32_T)
8791 1.1 skrll else if (note->descsz == sizeof (prstatus32_t))
8792 1.1 skrll {
8793 1.1 skrll /* 64-bit host, 32-bit corefile */
8794 1.1 skrll prstatus32_t prstat;
8795 1.1 skrll
8796 1.1 skrll size = sizeof (prstat.pr_reg);
8797 1.6 christos offset = offsetof (prstatus32_t, pr_reg);
8798 1.6 christos memcpy (&prstat, note->descdata, sizeof (prstat));
8799 1.6 christos
8800 1.6 christos /* Do not overwrite the core signal if it
8801 1.1 skrll has already been set by another thread. */
8802 1.1 skrll if (elf_tdata (abfd)->core->signal == 0)
8803 1.1 skrll elf_tdata (abfd)->core->signal = prstat.pr_cursig;
8804 1.1 skrll if (elf_tdata (abfd)->core->pid == 0)
8805 1.1 skrll elf_tdata (abfd)->core->pid = prstat.pr_pid;
8806 1.1 skrll
8807 1.1 skrll /* pr_who exists on:
8808 1.1 skrll solaris 2.5+
8809 1.6 christos unixware 4.2
8810 1.3 christos pr_who doesn't exist on:
8811 1.6 christos linux 2.[01]
8812 1.1 skrll */
8813 1.1 skrll #if defined (HAVE_PRSTATUS32_T_PR_WHO)
8814 1.1 skrll elf_tdata (abfd)->core->lwpid = prstat.pr_who;
8815 1.1 skrll #else
8816 1.1 skrll elf_tdata (abfd)->core->lwpid = prstat.pr_pid;
8817 1.1 skrll #endif
8818 1.1 skrll }
8819 1.1 skrll #endif /* HAVE_PRSTATUS32_T */
8820 1.1 skrll else
8821 1.1 skrll {
8822 1.1 skrll /* Fail - we don't know how to handle any other
8823 1.1 skrll note size (ie. data object type). */
8824 1.1 skrll return TRUE;
8825 1.1 skrll }
8826 1.1 skrll
8827 1.1 skrll /* Make a ".reg/999" section and a ".reg" section. */
8828 1.1 skrll return _bfd_elfcore_make_pseudosection (abfd, ".reg",
8829 1.1 skrll size, note->descpos + offset);
8830 1.1 skrll }
8831 1.1 skrll #endif /* defined (HAVE_PRSTATUS_T) */
8832 1.1 skrll
8833 1.1 skrll /* Create a pseudosection containing the exact contents of NOTE. */
8834 1.1 skrll static bfd_boolean
8835 1.1 skrll elfcore_make_note_pseudosection (bfd *abfd,
8836 1.1 skrll char *name,
8837 1.1 skrll Elf_Internal_Note *note)
8838 1.1 skrll {
8839 1.1 skrll return _bfd_elfcore_make_pseudosection (abfd, name,
8840 1.1 skrll note->descsz, note->descpos);
8841 1.1 skrll }
8842 1.1 skrll
8843 1.1 skrll /* There isn't a consistent prfpregset_t across platforms,
8844 1.1 skrll but it doesn't matter, because we don't have to pick this
8845 1.1 skrll data structure apart. */
8846 1.1 skrll
8847 1.1 skrll static bfd_boolean
8848 1.1 skrll elfcore_grok_prfpreg (bfd *abfd, Elf_Internal_Note *note)
8849 1.1 skrll {
8850 1.1 skrll return elfcore_make_note_pseudosection (abfd, ".reg2", note);
8851 1.1 skrll }
8852 1.1 skrll
8853 1.1 skrll /* Linux dumps the Intel SSE regs in a note named "LINUX" with a note
8854 1.1 skrll type of NT_PRXFPREG. Just include the whole note's contents
8855 1.1 skrll literally. */
8856 1.1 skrll
8857 1.1 skrll static bfd_boolean
8858 1.3 christos elfcore_grok_prxfpreg (bfd *abfd, Elf_Internal_Note *note)
8859 1.3 christos {
8860 1.3 christos return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
8861 1.3 christos }
8862 1.3 christos
8863 1.3 christos /* Linux dumps the Intel XSAVE extended state in a note named "LINUX"
8864 1.3 christos with a note type of NT_X86_XSTATE. Just include the whole note's
8865 1.3 christos contents literally. */
8866 1.3 christos
8867 1.3 christos static bfd_boolean
8868 1.1 skrll elfcore_grok_xstatereg (bfd *abfd, Elf_Internal_Note *note)
8869 1.1 skrll {
8870 1.1 skrll return elfcore_make_note_pseudosection (abfd, ".reg-xstate", note);
8871 1.1 skrll }
8872 1.1 skrll
8873 1.1 skrll static bfd_boolean
8874 1.1 skrll elfcore_grok_ppc_vmx (bfd *abfd, Elf_Internal_Note *note)
8875 1.1 skrll {
8876 1.1 skrll return elfcore_make_note_pseudosection (abfd, ".reg-ppc-vmx", note);
8877 1.1 skrll }
8878 1.1 skrll
8879 1.1 skrll static bfd_boolean
8880 1.3 christos elfcore_grok_ppc_vsx (bfd *abfd, Elf_Internal_Note *note)
8881 1.3 christos {
8882 1.3 christos return elfcore_make_note_pseudosection (abfd, ".reg-ppc-vsx", note);
8883 1.3 christos }
8884 1.3 christos
8885 1.3 christos static bfd_boolean
8886 1.3 christos elfcore_grok_s390_high_gprs (bfd *abfd, Elf_Internal_Note *note)
8887 1.3 christos {
8888 1.3 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-high-gprs", note);
8889 1.3 christos }
8890 1.3 christos
8891 1.3 christos static bfd_boolean
8892 1.3 christos elfcore_grok_s390_timer (bfd *abfd, Elf_Internal_Note *note)
8893 1.3 christos {
8894 1.3 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-timer", note);
8895 1.3 christos }
8896 1.3 christos
8897 1.3 christos static bfd_boolean
8898 1.3 christos elfcore_grok_s390_todcmp (bfd *abfd, Elf_Internal_Note *note)
8899 1.3 christos {
8900 1.3 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-todcmp", note);
8901 1.3 christos }
8902 1.3 christos
8903 1.3 christos static bfd_boolean
8904 1.3 christos elfcore_grok_s390_todpreg (bfd *abfd, Elf_Internal_Note *note)
8905 1.3 christos {
8906 1.3 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-todpreg", note);
8907 1.3 christos }
8908 1.3 christos
8909 1.3 christos static bfd_boolean
8910 1.3 christos elfcore_grok_s390_ctrs (bfd *abfd, Elf_Internal_Note *note)
8911 1.3 christos {
8912 1.3 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-ctrs", note);
8913 1.3 christos }
8914 1.3 christos
8915 1.3 christos static bfd_boolean
8916 1.5 christos elfcore_grok_s390_prefix (bfd *abfd, Elf_Internal_Note *note)
8917 1.5 christos {
8918 1.5 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-prefix", note);
8919 1.5 christos }
8920 1.5 christos
8921 1.5 christos static bfd_boolean
8922 1.5 christos elfcore_grok_s390_last_break (bfd *abfd, Elf_Internal_Note *note)
8923 1.5 christos {
8924 1.5 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-last-break", note);
8925 1.5 christos }
8926 1.5 christos
8927 1.5 christos static bfd_boolean
8928 1.5 christos elfcore_grok_s390_system_call (bfd *abfd, Elf_Internal_Note *note)
8929 1.6 christos {
8930 1.6 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-system-call", note);
8931 1.6 christos }
8932 1.6 christos
8933 1.6 christos static bfd_boolean
8934 1.6 christos elfcore_grok_s390_tdb (bfd *abfd, Elf_Internal_Note *note)
8935 1.6 christos {
8936 1.6 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-tdb", note);
8937 1.6 christos }
8938 1.6 christos
8939 1.6 christos static bfd_boolean
8940 1.6 christos elfcore_grok_s390_vxrs_low (bfd *abfd, Elf_Internal_Note *note)
8941 1.6 christos {
8942 1.6 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-vxrs-low", note);
8943 1.6 christos }
8944 1.6 christos
8945 1.6 christos static bfd_boolean
8946 1.6 christos elfcore_grok_s390_vxrs_high (bfd *abfd, Elf_Internal_Note *note)
8947 1.5 christos {
8948 1.5 christos return elfcore_make_note_pseudosection (abfd, ".reg-s390-vxrs-high", note);
8949 1.5 christos }
8950 1.5 christos
8951 1.5 christos static bfd_boolean
8952 1.6 christos elfcore_grok_arm_vfp (bfd *abfd, Elf_Internal_Note *note)
8953 1.6 christos {
8954 1.6 christos return elfcore_make_note_pseudosection (abfd, ".reg-arm-vfp", note);
8955 1.6 christos }
8956 1.6 christos
8957 1.6 christos static bfd_boolean
8958 1.6 christos elfcore_grok_aarch_tls (bfd *abfd, Elf_Internal_Note *note)
8959 1.6 christos {
8960 1.6 christos return elfcore_make_note_pseudosection (abfd, ".reg-aarch-tls", note);
8961 1.6 christos }
8962 1.6 christos
8963 1.6 christos static bfd_boolean
8964 1.6 christos elfcore_grok_aarch_hw_break (bfd *abfd, Elf_Internal_Note *note)
8965 1.6 christos {
8966 1.6 christos return elfcore_make_note_pseudosection (abfd, ".reg-aarch-hw-break", note);
8967 1.6 christos }
8968 1.6 christos
8969 1.6 christos static bfd_boolean
8970 1.1 skrll elfcore_grok_aarch_hw_watch (bfd *abfd, Elf_Internal_Note *note)
8971 1.1 skrll {
8972 1.1 skrll return elfcore_make_note_pseudosection (abfd, ".reg-aarch-hw-watch", note);
8973 1.1 skrll }
8974 1.1 skrll
8975 1.1 skrll #if defined (HAVE_PRPSINFO_T)
8976 1.1 skrll typedef prpsinfo_t elfcore_psinfo_t;
8977 1.1 skrll #if defined (HAVE_PRPSINFO32_T) /* Sparc64 cross Sparc32 */
8978 1.1 skrll typedef prpsinfo32_t elfcore_psinfo32_t;
8979 1.1 skrll #endif
8980 1.1 skrll #endif
8981 1.1 skrll
8982 1.1 skrll #if defined (HAVE_PSINFO_T)
8983 1.1 skrll typedef psinfo_t elfcore_psinfo_t;
8984 1.1 skrll #if defined (HAVE_PSINFO32_T) /* Sparc64 cross Sparc32 */
8985 1.1 skrll typedef psinfo32_t elfcore_psinfo32_t;
8986 1.1 skrll #endif
8987 1.1 skrll #endif
8988 1.1 skrll
8989 1.1 skrll /* return a malloc'ed copy of a string at START which is at
8990 1.1 skrll most MAX bytes long, possibly without a terminating '\0'.
8991 1.1 skrll the copy will always have a terminating '\0'. */
8992 1.3 christos
8993 1.1 skrll char *
8994 1.1 skrll _bfd_elfcore_strndup (bfd *abfd, char *start, size_t max)
8995 1.1 skrll {
8996 1.1 skrll char *dups;
8997 1.1 skrll char *end = (char *) memchr (start, '\0', max);
8998 1.1 skrll size_t len;
8999 1.1 skrll
9000 1.3 christos if (end == NULL)
9001 1.1 skrll len = max;
9002 1.1 skrll else
9003 1.1 skrll len = end - start;
9004 1.1 skrll
9005 1.1 skrll dups = (char *) bfd_alloc (abfd, len + 1);
9006 1.1 skrll if (dups == NULL)
9007 1.1 skrll return NULL;
9008 1.1 skrll
9009 1.1 skrll memcpy (dups, start, len);
9010 1.1 skrll dups[len] = '\0';
9011 1.1 skrll
9012 1.1 skrll return dups;
9013 1.1 skrll }
9014 1.1 skrll
9015 1.1 skrll #if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
9016 1.1 skrll static bfd_boolean
9017 1.1 skrll elfcore_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
9018 1.1 skrll {
9019 1.1 skrll if (note->descsz == sizeof (elfcore_psinfo_t))
9020 1.3 christos {
9021 1.6 christos elfcore_psinfo_t psinfo;
9022 1.3 christos
9023 1.6 christos memcpy (&psinfo, note->descdata, sizeof (psinfo));
9024 1.1 skrll
9025 1.1 skrll #if defined (HAVE_PSINFO_T_PR_PID) || defined (HAVE_PRPSINFO_T_PR_PID)
9026 1.1 skrll elf_tdata (abfd)->core->pid = psinfo.pr_pid;
9027 1.6 christos #endif
9028 1.1 skrll elf_tdata (abfd)->core->program
9029 1.1 skrll = _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
9030 1.1 skrll sizeof (psinfo.pr_fname));
9031 1.1 skrll
9032 1.1 skrll elf_tdata (abfd)->core->command
9033 1.1 skrll = _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
9034 1.1 skrll sizeof (psinfo.pr_psargs));
9035 1.1 skrll }
9036 1.1 skrll #if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
9037 1.1 skrll else if (note->descsz == sizeof (elfcore_psinfo32_t))
9038 1.1 skrll {
9039 1.3 christos /* 64-bit host, 32-bit corefile */
9040 1.6 christos elfcore_psinfo32_t psinfo;
9041 1.3 christos
9042 1.6 christos memcpy (&psinfo, note->descdata, sizeof (psinfo));
9043 1.1 skrll
9044 1.1 skrll #if defined (HAVE_PSINFO32_T_PR_PID) || defined (HAVE_PRPSINFO32_T_PR_PID)
9045 1.1 skrll elf_tdata (abfd)->core->pid = psinfo.pr_pid;
9046 1.6 christos #endif
9047 1.1 skrll elf_tdata (abfd)->core->program
9048 1.1 skrll = _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
9049 1.1 skrll sizeof (psinfo.pr_fname));
9050 1.1 skrll
9051 1.1 skrll elf_tdata (abfd)->core->command
9052 1.1 skrll = _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
9053 1.1 skrll sizeof (psinfo.pr_psargs));
9054 1.1 skrll }
9055 1.1 skrll #endif
9056 1.1 skrll
9057 1.1 skrll else
9058 1.1 skrll {
9059 1.1 skrll /* Fail - we don't know how to handle any other
9060 1.1 skrll note size (ie. data object type). */
9061 1.1 skrll return TRUE;
9062 1.1 skrll }
9063 1.1 skrll
9064 1.6 christos /* Note that for some reason, a spurious space is tacked
9065 1.1 skrll onto the end of the args in some (at least one anyway)
9066 1.1 skrll implementations, so strip it off if it exists. */
9067 1.1 skrll
9068 1.1 skrll {
9069 1.1 skrll char *command = elf_tdata (abfd)->core->command;
9070 1.1 skrll int n = strlen (command);
9071 1.1 skrll
9072 1.1 skrll if (0 < n && command[n - 1] == ' ')
9073 1.1 skrll command[n - 1] = '\0';
9074 1.1 skrll }
9075 1.1 skrll
9076 1.1 skrll return TRUE;
9077 1.1 skrll }
9078 1.1 skrll #endif /* defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T) */
9079 1.1 skrll
9080 1.1 skrll #if defined (HAVE_PSTATUS_T)
9081 1.1 skrll static bfd_boolean
9082 1.1 skrll elfcore_grok_pstatus (bfd *abfd, Elf_Internal_Note *note)
9083 1.1 skrll {
9084 1.1 skrll if (note->descsz == sizeof (pstatus_t)
9085 1.1 skrll #if defined (HAVE_PXSTATUS_T)
9086 1.1 skrll || note->descsz == sizeof (pxstatus_t)
9087 1.1 skrll #endif
9088 1.1 skrll )
9089 1.6 christos {
9090 1.1 skrll pstatus_t pstat;
9091 1.1 skrll
9092 1.1 skrll memcpy (&pstat, note->descdata, sizeof (pstat));
9093 1.1 skrll
9094 1.1 skrll elf_tdata (abfd)->core->pid = pstat.pr_pid;
9095 1.1 skrll }
9096 1.1 skrll #if defined (HAVE_PSTATUS32_T)
9097 1.1 skrll else if (note->descsz == sizeof (pstatus32_t))
9098 1.1 skrll {
9099 1.6 christos /* 64-bit host, 32-bit corefile */
9100 1.1 skrll pstatus32_t pstat;
9101 1.1 skrll
9102 1.1 skrll memcpy (&pstat, note->descdata, sizeof (pstat));
9103 1.1 skrll
9104 1.1 skrll elf_tdata (abfd)->core->pid = pstat.pr_pid;
9105 1.1 skrll }
9106 1.1 skrll #endif
9107 1.1 skrll /* Could grab some more details from the "representative"
9108 1.1 skrll lwpstatus_t in pstat.pr_lwp, but we'll catch it all in an
9109 1.1 skrll NT_LWPSTATUS note, presumably. */
9110 1.1 skrll
9111 1.1 skrll return TRUE;
9112 1.1 skrll }
9113 1.1 skrll #endif /* defined (HAVE_PSTATUS_T) */
9114 1.1 skrll
9115 1.1 skrll #if defined (HAVE_LWPSTATUS_T)
9116 1.1 skrll static bfd_boolean
9117 1.1 skrll elfcore_grok_lwpstatus (bfd *abfd, Elf_Internal_Note *note)
9118 1.1 skrll {
9119 1.1 skrll lwpstatus_t lwpstat;
9120 1.1 skrll char buf[100];
9121 1.1 skrll char *name;
9122 1.1 skrll size_t len;
9123 1.1 skrll asection *sect;
9124 1.1 skrll
9125 1.1 skrll if (note->descsz != sizeof (lwpstat)
9126 1.1 skrll #if defined (HAVE_LWPXSTATUS_T)
9127 1.1 skrll && note->descsz != sizeof (lwpxstatus_t)
9128 1.1 skrll #endif
9129 1.6 christos )
9130 1.3 christos return TRUE;
9131 1.3 christos
9132 1.6 christos memcpy (&lwpstat, note->descdata, sizeof (lwpstat));
9133 1.6 christos
9134 1.1 skrll elf_tdata (abfd)->core->lwpid = lwpstat.pr_lwpid;
9135 1.1 skrll /* Do not overwrite the core signal if it has already been set by
9136 1.1 skrll another thread. */
9137 1.1 skrll if (elf_tdata (abfd)->core->signal == 0)
9138 1.1 skrll elf_tdata (abfd)->core->signal = lwpstat.pr_cursig;
9139 1.1 skrll
9140 1.1 skrll /* Make a ".reg/999" section. */
9141 1.1 skrll
9142 1.1 skrll sprintf (buf, ".reg/%d", elfcore_make_pid (abfd));
9143 1.1 skrll len = strlen (buf) + 1;
9144 1.1 skrll name = bfd_alloc (abfd, len);
9145 1.1 skrll if (name == NULL)
9146 1.1 skrll return FALSE;
9147 1.1 skrll memcpy (name, buf, len);
9148 1.1 skrll
9149 1.1 skrll sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
9150 1.1 skrll if (sect == NULL)
9151 1.1 skrll return FALSE;
9152 1.1 skrll
9153 1.1 skrll #if defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
9154 1.1 skrll sect->size = sizeof (lwpstat.pr_context.uc_mcontext.gregs);
9155 1.1 skrll sect->filepos = note->descpos
9156 1.1 skrll + offsetof (lwpstatus_t, pr_context.uc_mcontext.gregs);
9157 1.1 skrll #endif
9158 1.1 skrll
9159 1.1 skrll #if defined (HAVE_LWPSTATUS_T_PR_REG)
9160 1.1 skrll sect->size = sizeof (lwpstat.pr_reg);
9161 1.1 skrll sect->filepos = note->descpos + offsetof (lwpstatus_t, pr_reg);
9162 1.1 skrll #endif
9163 1.1 skrll
9164 1.1 skrll sect->alignment_power = 2;
9165 1.1 skrll
9166 1.1 skrll if (!elfcore_maybe_make_sect (abfd, ".reg", sect))
9167 1.1 skrll return FALSE;
9168 1.1 skrll
9169 1.1 skrll /* Make a ".reg2/999" section */
9170 1.1 skrll
9171 1.1 skrll sprintf (buf, ".reg2/%d", elfcore_make_pid (abfd));
9172 1.1 skrll len = strlen (buf) + 1;
9173 1.1 skrll name = bfd_alloc (abfd, len);
9174 1.1 skrll if (name == NULL)
9175 1.1 skrll return FALSE;
9176 1.1 skrll memcpy (name, buf, len);
9177 1.1 skrll
9178 1.1 skrll sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
9179 1.1 skrll if (sect == NULL)
9180 1.1 skrll return FALSE;
9181 1.1 skrll
9182 1.1 skrll #if defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
9183 1.1 skrll sect->size = sizeof (lwpstat.pr_context.uc_mcontext.fpregs);
9184 1.1 skrll sect->filepos = note->descpos
9185 1.1 skrll + offsetof (lwpstatus_t, pr_context.uc_mcontext.fpregs);
9186 1.1 skrll #endif
9187 1.1 skrll
9188 1.1 skrll #if defined (HAVE_LWPSTATUS_T_PR_FPREG)
9189 1.1 skrll sect->size = sizeof (lwpstat.pr_fpreg);
9190 1.1 skrll sect->filepos = note->descpos + offsetof (lwpstatus_t, pr_fpreg);
9191 1.1 skrll #endif
9192 1.1 skrll
9193 1.1 skrll sect->alignment_power = 2;
9194 1.1 skrll
9195 1.1 skrll return elfcore_maybe_make_sect (abfd, ".reg2", sect);
9196 1.1 skrll }
9197 1.1 skrll #endif /* defined (HAVE_LWPSTATUS_T) */
9198 1.1 skrll
9199 1.1 skrll static bfd_boolean
9200 1.1 skrll elfcore_grok_win32pstatus (bfd *abfd, Elf_Internal_Note *note)
9201 1.1 skrll {
9202 1.1 skrll char buf[30];
9203 1.1 skrll char *name;
9204 1.1 skrll size_t len;
9205 1.1 skrll asection *sect;
9206 1.1 skrll int type;
9207 1.1 skrll int is_active_thread;
9208 1.1 skrll bfd_vma base_addr;
9209 1.1 skrll
9210 1.1 skrll if (note->descsz < 728)
9211 1.1 skrll return TRUE;
9212 1.1 skrll
9213 1.1 skrll if (! CONST_STRNEQ (note->namedata, "win32"))
9214 1.1 skrll return TRUE;
9215 1.1 skrll
9216 1.6 christos type = bfd_get_32 (abfd, note->descdata);
9217 1.1 skrll
9218 1.6 christos switch (type)
9219 1.1 skrll {
9220 1.6 christos case 1 /* NOTE_INFO_PROCESS */:
9221 1.1 skrll /* FIXME: need to add ->core->command. */
9222 1.1 skrll /* process_info.pid */
9223 1.1 skrll elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 8);
9224 1.1 skrll /* process_info.signal */
9225 1.1 skrll elf_tdata (abfd)->core->signal = bfd_get_32 (abfd, note->descdata + 12);
9226 1.1 skrll break;
9227 1.1 skrll
9228 1.1 skrll case 2 /* NOTE_INFO_THREAD */:
9229 1.3 christos /* Make a ".reg/999" section. */
9230 1.1 skrll /* thread_info.tid */
9231 1.1 skrll sprintf (buf, ".reg/%ld", (long) bfd_get_32 (abfd, note->descdata + 8));
9232 1.1 skrll
9233 1.1 skrll len = strlen (buf) + 1;
9234 1.1 skrll name = (char *) bfd_alloc (abfd, len);
9235 1.1 skrll if (name == NULL)
9236 1.1 skrll return FALSE;
9237 1.1 skrll
9238 1.1 skrll memcpy (name, buf, len);
9239 1.1 skrll
9240 1.1 skrll sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
9241 1.1 skrll if (sect == NULL)
9242 1.1 skrll return FALSE;
9243 1.1 skrll
9244 1.1 skrll /* sizeof (thread_info.thread_context) */
9245 1.1 skrll sect->size = 716;
9246 1.1 skrll /* offsetof (thread_info.thread_context) */
9247 1.1 skrll sect->filepos = note->descpos + 12;
9248 1.1 skrll sect->alignment_power = 2;
9249 1.1 skrll
9250 1.1 skrll /* thread_info.is_active_thread */
9251 1.1 skrll is_active_thread = bfd_get_32 (abfd, note->descdata + 8);
9252 1.1 skrll
9253 1.1 skrll if (is_active_thread)
9254 1.1 skrll if (! elfcore_maybe_make_sect (abfd, ".reg", sect))
9255 1.1 skrll return FALSE;
9256 1.1 skrll break;
9257 1.1 skrll
9258 1.1 skrll case 3 /* NOTE_INFO_MODULE */:
9259 1.1 skrll /* Make a ".module/xxxxxxxx" section. */
9260 1.3 christos /* module_info.base_address */
9261 1.1 skrll base_addr = bfd_get_32 (abfd, note->descdata + 4);
9262 1.1 skrll sprintf (buf, ".module/%08lx", (unsigned long) base_addr);
9263 1.1 skrll
9264 1.1 skrll len = strlen (buf) + 1;
9265 1.1 skrll name = (char *) bfd_alloc (abfd, len);
9266 1.1 skrll if (name == NULL)
9267 1.1 skrll return FALSE;
9268 1.1 skrll
9269 1.1 skrll memcpy (name, buf, len);
9270 1.1 skrll
9271 1.1 skrll sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
9272 1.1 skrll
9273 1.1 skrll if (sect == NULL)
9274 1.1 skrll return FALSE;
9275 1.1 skrll
9276 1.1 skrll sect->size = note->descsz;
9277 1.1 skrll sect->filepos = note->descpos;
9278 1.1 skrll sect->alignment_power = 2;
9279 1.1 skrll break;
9280 1.1 skrll
9281 1.1 skrll default:
9282 1.1 skrll return TRUE;
9283 1.1 skrll }
9284 1.1 skrll
9285 1.1 skrll return TRUE;
9286 1.1 skrll }
9287 1.1 skrll
9288 1.1 skrll static bfd_boolean
9289 1.1 skrll elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
9290 1.1 skrll {
9291 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
9292 1.1 skrll
9293 1.1 skrll switch (note->type)
9294 1.1 skrll {
9295 1.1 skrll default:
9296 1.1 skrll return TRUE;
9297 1.1 skrll
9298 1.1 skrll case NT_PRSTATUS:
9299 1.1 skrll if (bed->elf_backend_grok_prstatus)
9300 1.1 skrll if ((*bed->elf_backend_grok_prstatus) (abfd, note))
9301 1.1 skrll return TRUE;
9302 1.1 skrll #if defined (HAVE_PRSTATUS_T)
9303 1.1 skrll return elfcore_grok_prstatus (abfd, note);
9304 1.1 skrll #else
9305 1.1 skrll return TRUE;
9306 1.1 skrll #endif
9307 1.1 skrll
9308 1.1 skrll #if defined (HAVE_PSTATUS_T)
9309 1.1 skrll case NT_PSTATUS:
9310 1.1 skrll return elfcore_grok_pstatus (abfd, note);
9311 1.1 skrll #endif
9312 1.1 skrll
9313 1.1 skrll #if defined (HAVE_LWPSTATUS_T)
9314 1.1 skrll case NT_LWPSTATUS:
9315 1.1 skrll return elfcore_grok_lwpstatus (abfd, note);
9316 1.1 skrll #endif
9317 1.1 skrll
9318 1.1 skrll case NT_FPREGSET: /* FIXME: rename to NT_PRFPREG */
9319 1.1 skrll return elfcore_grok_prfpreg (abfd, note);
9320 1.1 skrll
9321 1.1 skrll case NT_WIN32PSTATUS:
9322 1.1 skrll return elfcore_grok_win32pstatus (abfd, note);
9323 1.1 skrll
9324 1.1 skrll case NT_PRXFPREG: /* Linux SSE extension */
9325 1.1 skrll if (note->namesz == 6
9326 1.3 christos && strcmp (note->namedata, "LINUX") == 0)
9327 1.3 christos return elfcore_grok_prxfpreg (abfd, note);
9328 1.3 christos else
9329 1.3 christos return TRUE;
9330 1.3 christos
9331 1.3 christos case NT_X86_XSTATE: /* Linux XSAVE extension */
9332 1.3 christos if (note->namesz == 6
9333 1.1 skrll && strcmp (note->namedata, "LINUX") == 0)
9334 1.1 skrll return elfcore_grok_xstatereg (abfd, note);
9335 1.1 skrll else
9336 1.1 skrll return TRUE;
9337 1.1 skrll
9338 1.1 skrll case NT_PPC_VMX:
9339 1.1 skrll if (note->namesz == 6
9340 1.1 skrll && strcmp (note->namedata, "LINUX") == 0)
9341 1.1 skrll return elfcore_grok_ppc_vmx (abfd, note);
9342 1.1 skrll else
9343 1.1 skrll return TRUE;
9344 1.1 skrll
9345 1.1 skrll case NT_PPC_VSX:
9346 1.1 skrll if (note->namesz == 6
9347 1.3 christos && strcmp (note->namedata, "LINUX") == 0)
9348 1.3 christos return elfcore_grok_ppc_vsx (abfd, note);
9349 1.3 christos else
9350 1.3 christos return TRUE;
9351 1.3 christos
9352 1.3 christos case NT_S390_HIGH_GPRS:
9353 1.3 christos if (note->namesz == 6
9354 1.3 christos && strcmp (note->namedata, "LINUX") == 0)
9355 1.3 christos return elfcore_grok_s390_high_gprs (abfd, note);
9356 1.3 christos else
9357 1.3 christos return TRUE;
9358 1.3 christos
9359 1.3 christos case NT_S390_TIMER:
9360 1.3 christos if (note->namesz == 6
9361 1.3 christos && strcmp (note->namedata, "LINUX") == 0)
9362 1.3 christos return elfcore_grok_s390_timer (abfd, note);
9363 1.3 christos else
9364 1.3 christos return TRUE;
9365 1.3 christos
9366 1.3 christos case NT_S390_TODCMP:
9367 1.3 christos if (note->namesz == 6
9368 1.3 christos && strcmp (note->namedata, "LINUX") == 0)
9369 1.3 christos return elfcore_grok_s390_todcmp (abfd, note);
9370 1.3 christos else
9371 1.3 christos return TRUE;
9372 1.3 christos
9373 1.3 christos case NT_S390_TODPREG:
9374 1.3 christos if (note->namesz == 6
9375 1.3 christos && strcmp (note->namedata, "LINUX") == 0)
9376 1.3 christos return elfcore_grok_s390_todpreg (abfd, note);
9377 1.3 christos else
9378 1.3 christos return TRUE;
9379 1.3 christos
9380 1.3 christos case NT_S390_CTRS:
9381 1.3 christos if (note->namesz == 6
9382 1.3 christos && strcmp (note->namedata, "LINUX") == 0)
9383 1.3 christos return elfcore_grok_s390_ctrs (abfd, note);
9384 1.3 christos else
9385 1.3 christos return TRUE;
9386 1.3 christos
9387 1.3 christos case NT_S390_PREFIX:
9388 1.3 christos if (note->namesz == 6
9389 1.5 christos && strcmp (note->namedata, "LINUX") == 0)
9390 1.5 christos return elfcore_grok_s390_prefix (abfd, note);
9391 1.5 christos else
9392 1.5 christos return TRUE;
9393 1.5 christos
9394 1.5 christos case NT_S390_LAST_BREAK:
9395 1.5 christos if (note->namesz == 6
9396 1.5 christos && strcmp (note->namedata, "LINUX") == 0)
9397 1.5 christos return elfcore_grok_s390_last_break (abfd, note);
9398 1.5 christos else
9399 1.5 christos return TRUE;
9400 1.5 christos
9401 1.5 christos case NT_S390_SYSTEM_CALL:
9402 1.5 christos if (note->namesz == 6
9403 1.6 christos && strcmp (note->namedata, "LINUX") == 0)
9404 1.6 christos return elfcore_grok_s390_system_call (abfd, note);
9405 1.6 christos else
9406 1.6 christos return TRUE;
9407 1.6 christos
9408 1.6 christos case NT_S390_TDB:
9409 1.6 christos if (note->namesz == 6
9410 1.6 christos && strcmp (note->namedata, "LINUX") == 0)
9411 1.6 christos return elfcore_grok_s390_tdb (abfd, note);
9412 1.6 christos else
9413 1.6 christos return TRUE;
9414 1.6 christos
9415 1.6 christos case NT_S390_VXRS_LOW:
9416 1.6 christos if (note->namesz == 6
9417 1.6 christos && strcmp (note->namedata, "LINUX") == 0)
9418 1.6 christos return elfcore_grok_s390_vxrs_low (abfd, note);
9419 1.6 christos else
9420 1.6 christos return TRUE;
9421 1.6 christos
9422 1.6 christos case NT_S390_VXRS_HIGH:
9423 1.6 christos if (note->namesz == 6
9424 1.5 christos && strcmp (note->namedata, "LINUX") == 0)
9425 1.5 christos return elfcore_grok_s390_vxrs_high (abfd, note);
9426 1.5 christos else
9427 1.5 christos return TRUE;
9428 1.5 christos
9429 1.5 christos case NT_ARM_VFP:
9430 1.5 christos if (note->namesz == 6
9431 1.6 christos && strcmp (note->namedata, "LINUX") == 0)
9432 1.6 christos return elfcore_grok_arm_vfp (abfd, note);
9433 1.6 christos else
9434 1.6 christos return TRUE;
9435 1.6 christos
9436 1.6 christos case NT_ARM_TLS:
9437 1.6 christos if (note->namesz == 6
9438 1.6 christos && strcmp (note->namedata, "LINUX") == 0)
9439 1.6 christos return elfcore_grok_aarch_tls (abfd, note);
9440 1.6 christos else
9441 1.6 christos return TRUE;
9442 1.6 christos
9443 1.6 christos case NT_ARM_HW_BREAK:
9444 1.6 christos if (note->namesz == 6
9445 1.6 christos && strcmp (note->namedata, "LINUX") == 0)
9446 1.6 christos return elfcore_grok_aarch_hw_break (abfd, note);
9447 1.6 christos else
9448 1.6 christos return TRUE;
9449 1.6 christos
9450 1.6 christos case NT_ARM_HW_WATCH:
9451 1.6 christos if (note->namesz == 6
9452 1.1 skrll && strcmp (note->namedata, "LINUX") == 0)
9453 1.1 skrll return elfcore_grok_aarch_hw_watch (abfd, note);
9454 1.1 skrll else
9455 1.1 skrll return TRUE;
9456 1.1 skrll
9457 1.1 skrll case NT_PRPSINFO:
9458 1.1 skrll case NT_PSINFO:
9459 1.1 skrll if (bed->elf_backend_grok_psinfo)
9460 1.1 skrll if ((*bed->elf_backend_grok_psinfo) (abfd, note))
9461 1.1 skrll return TRUE;
9462 1.1 skrll #if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
9463 1.1 skrll return elfcore_grok_psinfo (abfd, note);
9464 1.1 skrll #else
9465 1.1 skrll return TRUE;
9466 1.1 skrll #endif
9467 1.1 skrll
9468 1.1 skrll case NT_AUXV:
9469 1.1 skrll {
9470 1.1 skrll asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
9471 1.1 skrll SEC_HAS_CONTENTS);
9472 1.1 skrll
9473 1.1 skrll if (sect == NULL)
9474 1.1 skrll return FALSE;
9475 1.1 skrll sect->size = note->descsz;
9476 1.6 christos sect->filepos = note->descpos;
9477 1.6 christos sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
9478 1.6 christos
9479 1.6 christos return TRUE;
9480 1.6 christos }
9481 1.6 christos
9482 1.6 christos case NT_FILE:
9483 1.6 christos return elfcore_make_note_pseudosection (abfd, ".note.linuxcore.file",
9484 1.6.2.1 pgoyette note);
9485 1.1 skrll
9486 1.1 skrll case NT_SIGINFO:
9487 1.1 skrll return elfcore_make_note_pseudosection (abfd, ".note.linuxcore.siginfo",
9488 1.1 skrll note);
9489 1.1 skrll
9490 1.1 skrll }
9491 1.6 christos }
9492 1.6 christos
9493 1.6 christos static bfd_boolean
9494 1.6 christos elfobj_grok_gnu_build_id (bfd *abfd, Elf_Internal_Note *note)
9495 1.6 christos {
9496 1.6 christos struct bfd_build_id* build_id;
9497 1.6 christos
9498 1.1 skrll if (note->descsz == 0)
9499 1.1 skrll return FALSE;
9500 1.6 christos
9501 1.6 christos build_id = bfd_alloc (abfd, sizeof (struct bfd_build_id) - 1 + note->descsz);
9502 1.6 christos if (build_id == NULL)
9503 1.1 skrll return FALSE;
9504 1.1 skrll
9505 1.1 skrll build_id->size = note->descsz;
9506 1.1 skrll memcpy (build_id->data, note->descdata, note->descsz);
9507 1.1 skrll abfd->build_id = build_id;
9508 1.1 skrll
9509 1.1 skrll return TRUE;
9510 1.1 skrll }
9511 1.1 skrll
9512 1.1 skrll static bfd_boolean
9513 1.1 skrll elfobj_grok_gnu_note (bfd *abfd, Elf_Internal_Note *note)
9514 1.1 skrll {
9515 1.1 skrll switch (note->type)
9516 1.1 skrll {
9517 1.1 skrll default:
9518 1.1 skrll return TRUE;
9519 1.1 skrll
9520 1.1 skrll case NT_GNU_BUILD_ID:
9521 1.5 christos return elfobj_grok_gnu_build_id (abfd, note);
9522 1.5 christos }
9523 1.5 christos }
9524 1.5 christos
9525 1.5 christos static bfd_boolean
9526 1.5 christos elfobj_grok_stapsdt_note_1 (bfd *abfd, Elf_Internal_Note *note)
9527 1.5 christos {
9528 1.5 christos struct sdt_note *cur =
9529 1.5 christos (struct sdt_note *) bfd_alloc (abfd, sizeof (struct sdt_note)
9530 1.5 christos + note->descsz);
9531 1.5 christos
9532 1.5 christos cur->next = (struct sdt_note *) (elf_tdata (abfd))->sdt_note_head;
9533 1.5 christos cur->size = (bfd_size_type) note->descsz;
9534 1.5 christos memcpy (cur->data, note->descdata, note->descsz);
9535 1.5 christos
9536 1.5 christos elf_tdata (abfd)->sdt_note_head = cur;
9537 1.5 christos
9538 1.5 christos return TRUE;
9539 1.5 christos }
9540 1.5 christos
9541 1.5 christos static bfd_boolean
9542 1.5 christos elfobj_grok_stapsdt_note (bfd *abfd, Elf_Internal_Note *note)
9543 1.5 christos {
9544 1.5 christos switch (note->type)
9545 1.5 christos {
9546 1.5 christos case NT_STAPSDT:
9547 1.5 christos return elfobj_grok_stapsdt_note_1 (abfd, note);
9548 1.5 christos
9549 1.5 christos default:
9550 1.6.2.1 pgoyette return TRUE;
9551 1.6.2.1 pgoyette }
9552 1.6.2.1 pgoyette }
9553 1.6.2.1 pgoyette
9554 1.6.2.1 pgoyette static bfd_boolean
9555 1.6.2.1 pgoyette elfcore_grok_freebsd_psinfo (bfd *abfd, Elf_Internal_Note *note)
9556 1.6.2.1 pgoyette {
9557 1.6.2.1 pgoyette size_t offset;
9558 1.6.2.1 pgoyette
9559 1.6.2.1 pgoyette /* Check for version 1 in pr_version. */
9560 1.6.2.1 pgoyette if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
9561 1.6.2.1 pgoyette return FALSE;
9562 1.6.2.1 pgoyette offset = 4;
9563 1.6.2.1 pgoyette
9564 1.6.2.1 pgoyette /* Skip over pr_psinfosz. */
9565 1.6.2.1 pgoyette switch (abfd->arch_info->bits_per_word)
9566 1.6.2.1 pgoyette {
9567 1.6.2.1 pgoyette case 32:
9568 1.6.2.1 pgoyette offset += 4;
9569 1.6.2.1 pgoyette break;
9570 1.6.2.1 pgoyette
9571 1.6.2.1 pgoyette case 64:
9572 1.6.2.1 pgoyette offset += 4; /* Padding before pr_psinfosz. */
9573 1.6.2.1 pgoyette offset += 8;
9574 1.6.2.1 pgoyette break;
9575 1.6.2.1 pgoyette
9576 1.6.2.1 pgoyette default:
9577 1.6.2.1 pgoyette return FALSE;
9578 1.6.2.1 pgoyette }
9579 1.6.2.1 pgoyette
9580 1.6.2.1 pgoyette /* pr_fname is PRFNAMESZ (16) + 1 bytes in size. */
9581 1.6.2.1 pgoyette elf_tdata (abfd)->core->program
9582 1.6.2.1 pgoyette = _bfd_elfcore_strndup (abfd, note->descdata + offset, 17);
9583 1.6.2.1 pgoyette offset += 17;
9584 1.6.2.1 pgoyette
9585 1.6.2.1 pgoyette /* pr_psargs is PRARGSZ (80) + 1 bytes in size. */
9586 1.6.2.1 pgoyette elf_tdata (abfd)->core->command
9587 1.6.2.1 pgoyette = _bfd_elfcore_strndup (abfd, note->descdata + offset, 81);
9588 1.6.2.1 pgoyette
9589 1.6.2.1 pgoyette return TRUE;
9590 1.6.2.1 pgoyette }
9591 1.6.2.1 pgoyette
9592 1.6.2.1 pgoyette static bfd_boolean
9593 1.6.2.1 pgoyette elfcore_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note)
9594 1.6.2.1 pgoyette {
9595 1.6.2.1 pgoyette size_t offset;
9596 1.6.2.1 pgoyette size_t size;
9597 1.6.2.1 pgoyette
9598 1.6.2.1 pgoyette /* Check for version 1 in pr_version. */
9599 1.6.2.1 pgoyette if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
9600 1.6.2.1 pgoyette return FALSE;
9601 1.6.2.1 pgoyette offset = 4;
9602 1.6.2.1 pgoyette
9603 1.6.2.1 pgoyette /* Skip over pr_statussz. */
9604 1.6.2.1 pgoyette switch (abfd->arch_info->bits_per_word)
9605 1.6.2.1 pgoyette {
9606 1.6.2.1 pgoyette case 32:
9607 1.6.2.1 pgoyette offset += 4;
9608 1.6.2.1 pgoyette break;
9609 1.6.2.1 pgoyette
9610 1.6.2.1 pgoyette case 64:
9611 1.6.2.1 pgoyette offset += 4; /* Padding before pr_statussz. */
9612 1.6.2.1 pgoyette offset += 8;
9613 1.6.2.1 pgoyette break;
9614 1.6.2.1 pgoyette
9615 1.6.2.1 pgoyette default:
9616 1.6.2.1 pgoyette return FALSE;
9617 1.6.2.1 pgoyette }
9618 1.6.2.1 pgoyette
9619 1.6.2.1 pgoyette /* Extract size of pr_reg from pr_gregsetsz. */
9620 1.6.2.1 pgoyette if (abfd->arch_info->bits_per_word == 32)
9621 1.6.2.1 pgoyette size = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
9622 1.6.2.1 pgoyette else
9623 1.6.2.1 pgoyette size = bfd_h_get_64 (abfd, (bfd_byte *) note->descdata + offset);
9624 1.6.2.1 pgoyette
9625 1.6.2.1 pgoyette /* Skip over pr_gregsetsz and pr_fpregsetsz. */
9626 1.6.2.1 pgoyette offset += (abfd->arch_info->bits_per_word / 8) * 2;
9627 1.6.2.1 pgoyette
9628 1.6.2.1 pgoyette /* Skip over pr_osreldate. */
9629 1.6.2.1 pgoyette offset += 4;
9630 1.6.2.1 pgoyette
9631 1.6.2.1 pgoyette /* Read signal from pr_cursig. */
9632 1.6.2.1 pgoyette if (elf_tdata (abfd)->core->signal == 0)
9633 1.6.2.1 pgoyette elf_tdata (abfd)->core->signal
9634 1.6.2.1 pgoyette = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
9635 1.6.2.1 pgoyette offset += 4;
9636 1.6.2.1 pgoyette
9637 1.6.2.1 pgoyette /* Read TID from pr_pid. */
9638 1.6.2.1 pgoyette elf_tdata (abfd)->core->lwpid
9639 1.6.2.1 pgoyette = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
9640 1.6.2.1 pgoyette offset += 4;
9641 1.6.2.1 pgoyette
9642 1.6.2.1 pgoyette /* Padding before pr_reg. */
9643 1.6.2.1 pgoyette if (abfd->arch_info->bits_per_word == 64)
9644 1.6.2.1 pgoyette offset += 4;
9645 1.6.2.1 pgoyette
9646 1.6.2.1 pgoyette /* Make a ".reg/999" section and a ".reg" section. */
9647 1.6.2.1 pgoyette return _bfd_elfcore_make_pseudosection (abfd, ".reg",
9648 1.6.2.1 pgoyette size, note->descpos + offset);
9649 1.6.2.1 pgoyette }
9650 1.6.2.1 pgoyette
9651 1.6.2.1 pgoyette static bfd_boolean
9652 1.6.2.1 pgoyette elfcore_grok_freebsd_note (bfd *abfd, Elf_Internal_Note *note)
9653 1.6.2.1 pgoyette {
9654 1.6.2.1 pgoyette switch (note->type)
9655 1.6.2.1 pgoyette {
9656 1.6.2.1 pgoyette case NT_PRSTATUS:
9657 1.6.2.1 pgoyette return elfcore_grok_freebsd_prstatus (abfd, note);
9658 1.6.2.1 pgoyette
9659 1.6.2.1 pgoyette case NT_FPREGSET:
9660 1.6.2.1 pgoyette return elfcore_grok_prfpreg (abfd, note);
9661 1.6.2.1 pgoyette
9662 1.6.2.1 pgoyette case NT_PRPSINFO:
9663 1.6.2.1 pgoyette return elfcore_grok_freebsd_psinfo (abfd, note);
9664 1.6.2.1 pgoyette
9665 1.6.2.1 pgoyette case NT_FREEBSD_THRMISC:
9666 1.6.2.1 pgoyette if (note->namesz == 8)
9667 1.6.2.1 pgoyette return elfcore_make_note_pseudosection (abfd, ".thrmisc", note);
9668 1.6.2.1 pgoyette else
9669 1.6.2.1 pgoyette return TRUE;
9670 1.6.2.1 pgoyette
9671 1.6.2.1 pgoyette case NT_FREEBSD_PROCSTAT_AUXV:
9672 1.6.2.1 pgoyette {
9673 1.6.2.1 pgoyette asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
9674 1.6.2.1 pgoyette SEC_HAS_CONTENTS);
9675 1.6.2.1 pgoyette
9676 1.6.2.1 pgoyette if (sect == NULL)
9677 1.6.2.1 pgoyette return FALSE;
9678 1.6.2.1 pgoyette sect->size = note->descsz - 4;
9679 1.6.2.1 pgoyette sect->filepos = note->descpos + 4;
9680 1.6.2.1 pgoyette sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
9681 1.6.2.1 pgoyette
9682 1.6.2.1 pgoyette return TRUE;
9683 1.6.2.1 pgoyette }
9684 1.6.2.1 pgoyette
9685 1.6.2.1 pgoyette case NT_X86_XSTATE:
9686 1.6.2.1 pgoyette if (note->namesz == 8)
9687 1.6.2.1 pgoyette return elfcore_grok_xstatereg (abfd, note);
9688 1.6.2.1 pgoyette else
9689 1.6.2.1 pgoyette return TRUE;
9690 1.6.2.1 pgoyette
9691 1.6.2.1 pgoyette default:
9692 1.1 skrll return TRUE;
9693 1.1 skrll }
9694 1.1 skrll }
9695 1.1 skrll
9696 1.1 skrll static bfd_boolean
9697 1.1 skrll elfcore_netbsd_get_lwpid (Elf_Internal_Note *note, int *lwpidp)
9698 1.1 skrll {
9699 1.1 skrll char *cp;
9700 1.1 skrll
9701 1.1 skrll cp = strchr (note->namedata, '@');
9702 1.1 skrll if (cp != NULL)
9703 1.1 skrll {
9704 1.1 skrll *lwpidp = atoi(cp + 1);
9705 1.1 skrll return TRUE;
9706 1.1 skrll }
9707 1.1 skrll return FALSE;
9708 1.1 skrll }
9709 1.6 christos
9710 1.1 skrll static bfd_boolean
9711 1.1 skrll elfcore_grok_netbsd_procinfo (bfd *abfd, Elf_Internal_Note *note)
9712 1.1 skrll {
9713 1.6 christos /* Signal number at offset 0x08. */
9714 1.1 skrll elf_tdata (abfd)->core->signal
9715 1.1 skrll = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x08);
9716 1.1 skrll
9717 1.6 christos /* Process ID at offset 0x50. */
9718 1.1 skrll elf_tdata (abfd)->core->pid
9719 1.1 skrll = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x50);
9720 1.1 skrll
9721 1.1 skrll /* Command name at 0x7c (max 32 bytes, including nul). */
9722 1.1 skrll elf_tdata (abfd)->core->command
9723 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 0x7c, 31);
9724 1.1 skrll
9725 1.1 skrll return elfcore_make_note_pseudosection (abfd, ".note.netbsdcore.procinfo",
9726 1.1 skrll note);
9727 1.1 skrll }
9728 1.1 skrll
9729 1.1 skrll static bfd_boolean
9730 1.6 christos elfcore_grok_netbsd_note (bfd *abfd, Elf_Internal_Note *note)
9731 1.1 skrll {
9732 1.1 skrll int lwp;
9733 1.1 skrll
9734 1.1 skrll if (elfcore_netbsd_get_lwpid (note, &lwp))
9735 1.1 skrll elf_tdata (abfd)->core->lwpid = lwp;
9736 1.1 skrll
9737 1.1 skrll if (note->type == NT_NETBSDCORE_PROCINFO)
9738 1.1 skrll {
9739 1.1 skrll /* NetBSD-specific core "procinfo". Note that we expect to
9740 1.1 skrll find this note before any of the others, which is fine,
9741 1.1 skrll since the kernel writes this note out first when it
9742 1.1 skrll creates a core file. */
9743 1.1 skrll
9744 1.1 skrll return elfcore_grok_netbsd_procinfo (abfd, note);
9745 1.1 skrll }
9746 1.1 skrll
9747 1.1 skrll /* As of Jan 2002 there are no other machine-independent notes
9748 1.1 skrll defined for NetBSD core files. If the note type is less
9749 1.1 skrll than the start of the machine-dependent note types, we don't
9750 1.1 skrll understand it. */
9751 1.1 skrll
9752 1.1 skrll if (note->type < NT_NETBSDCORE_FIRSTMACH)
9753 1.1 skrll return TRUE;
9754 1.1 skrll
9755 1.1 skrll
9756 1.1 skrll switch (bfd_get_arch (abfd))
9757 1.1 skrll {
9758 1.1 skrll /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0 and
9759 1.1 skrll PT_GETFPREGS == mach+2. */
9760 1.1 skrll
9761 1.1 skrll case bfd_arch_alpha:
9762 1.1 skrll case bfd_arch_sparc:
9763 1.1 skrll switch (note->type)
9764 1.1 skrll {
9765 1.1 skrll case NT_NETBSDCORE_FIRSTMACH+0:
9766 1.1 skrll return elfcore_make_note_pseudosection (abfd, ".reg", note);
9767 1.1 skrll
9768 1.1 skrll case NT_NETBSDCORE_FIRSTMACH+2:
9769 1.1 skrll return elfcore_make_note_pseudosection (abfd, ".reg2", note);
9770 1.4 uwe
9771 1.4 uwe default:
9772 1.4 uwe return TRUE;
9773 1.4 uwe }
9774 1.4 uwe
9775 1.4 uwe /* On SuperH, PT_GETREGS == mach+3 and PT_GETFPREGS == mach+5.
9776 1.4 uwe There's also old PT___GETREGS40 == mach + 1 for old reg
9777 1.4 uwe structure which lacks GBR. */
9778 1.4 uwe
9779 1.4 uwe case bfd_arch_sh:
9780 1.4 uwe switch (note->type)
9781 1.4 uwe {
9782 1.4 uwe case NT_NETBSDCORE_FIRSTMACH+3:
9783 1.4 uwe return elfcore_make_note_pseudosection (abfd, ".reg", note);
9784 1.4 uwe
9785 1.4 uwe case NT_NETBSDCORE_FIRSTMACH+5:
9786 1.4 uwe return elfcore_make_note_pseudosection (abfd, ".reg2", note);
9787 1.1 skrll
9788 1.1 skrll default:
9789 1.1 skrll return TRUE;
9790 1.1 skrll }
9791 1.1 skrll
9792 1.1 skrll /* On all other arch's, PT_GETREGS == mach+1 and
9793 1.1 skrll PT_GETFPREGS == mach+3. */
9794 1.1 skrll
9795 1.1 skrll default:
9796 1.1 skrll switch (note->type)
9797 1.1 skrll {
9798 1.1 skrll case NT_NETBSDCORE_FIRSTMACH+1:
9799 1.1 skrll return elfcore_make_note_pseudosection (abfd, ".reg", note);
9800 1.1 skrll
9801 1.1 skrll case NT_NETBSDCORE_FIRSTMACH+3:
9802 1.1 skrll return elfcore_make_note_pseudosection (abfd, ".reg2", note);
9803 1.1 skrll
9804 1.1 skrll default:
9805 1.1 skrll return TRUE;
9806 1.1 skrll }
9807 1.3 christos }
9808 1.3 christos /* NOTREACHED */
9809 1.3 christos }
9810 1.6 christos
9811 1.3 christos static bfd_boolean
9812 1.3 christos elfcore_grok_openbsd_procinfo (bfd *abfd, Elf_Internal_Note *note)
9813 1.3 christos {
9814 1.6 christos /* Signal number at offset 0x08. */
9815 1.3 christos elf_tdata (abfd)->core->signal
9816 1.3 christos = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x08);
9817 1.3 christos
9818 1.6 christos /* Process ID at offset 0x20. */
9819 1.3 christos elf_tdata (abfd)->core->pid
9820 1.3 christos = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x20);
9821 1.3 christos
9822 1.3 christos /* Command name at 0x48 (max 32 bytes, including nul). */
9823 1.3 christos elf_tdata (abfd)->core->command
9824 1.3 christos = _bfd_elfcore_strndup (abfd, note->descdata + 0x48, 31);
9825 1.3 christos
9826 1.3 christos return TRUE;
9827 1.3 christos }
9828 1.3 christos
9829 1.3 christos static bfd_boolean
9830 1.3 christos elfcore_grok_openbsd_note (bfd *abfd, Elf_Internal_Note *note)
9831 1.3 christos {
9832 1.3 christos if (note->type == NT_OPENBSD_PROCINFO)
9833 1.3 christos return elfcore_grok_openbsd_procinfo (abfd, note);
9834 1.3 christos
9835 1.3 christos if (note->type == NT_OPENBSD_REGS)
9836 1.3 christos return elfcore_make_note_pseudosection (abfd, ".reg", note);
9837 1.3 christos
9838 1.3 christos if (note->type == NT_OPENBSD_FPREGS)
9839 1.3 christos return elfcore_make_note_pseudosection (abfd, ".reg2", note);
9840 1.3 christos
9841 1.3 christos if (note->type == NT_OPENBSD_XFPREGS)
9842 1.3 christos return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
9843 1.3 christos
9844 1.3 christos if (note->type == NT_OPENBSD_AUXV)
9845 1.3 christos {
9846 1.3 christos asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
9847 1.3 christos SEC_HAS_CONTENTS);
9848 1.3 christos
9849 1.3 christos if (sect == NULL)
9850 1.3 christos return FALSE;
9851 1.3 christos sect->size = note->descsz;
9852 1.3 christos sect->filepos = note->descpos;
9853 1.3 christos sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
9854 1.3 christos
9855 1.3 christos return TRUE;
9856 1.3 christos }
9857 1.3 christos
9858 1.3 christos if (note->type == NT_OPENBSD_WCOOKIE)
9859 1.3 christos {
9860 1.3 christos asection *sect = bfd_make_section_anyway_with_flags (abfd, ".wcookie",
9861 1.3 christos SEC_HAS_CONTENTS);
9862 1.3 christos
9863 1.3 christos if (sect == NULL)
9864 1.3 christos return FALSE;
9865 1.3 christos sect->size = note->descsz;
9866 1.3 christos sect->filepos = note->descpos;
9867 1.3 christos sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
9868 1.3 christos
9869 1.3 christos return TRUE;
9870 1.3 christos }
9871 1.1 skrll
9872 1.1 skrll return TRUE;
9873 1.1 skrll }
9874 1.1 skrll
9875 1.1 skrll static bfd_boolean
9876 1.1 skrll elfcore_grok_nto_status (bfd *abfd, Elf_Internal_Note *note, long *tid)
9877 1.1 skrll {
9878 1.1 skrll void *ddata = note->descdata;
9879 1.1 skrll char buf[100];
9880 1.1 skrll char *name;
9881 1.6 christos asection *sect;
9882 1.1 skrll short sig;
9883 1.1 skrll unsigned flags;
9884 1.1 skrll
9885 1.1 skrll /* nto_procfs_status 'pid' field is at offset 0. */
9886 1.1 skrll elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, (bfd_byte *) ddata);
9887 1.1 skrll
9888 1.1 skrll /* nto_procfs_status 'tid' field is at offset 4. Pass it back. */
9889 1.1 skrll *tid = bfd_get_32 (abfd, (bfd_byte *) ddata + 4);
9890 1.1 skrll
9891 1.1 skrll /* nto_procfs_status 'flags' field is at offset 8. */
9892 1.6 christos flags = bfd_get_32 (abfd, (bfd_byte *) ddata + 8);
9893 1.6 christos
9894 1.1 skrll /* nto_procfs_status 'what' field is at offset 14. */
9895 1.1 skrll if ((sig = bfd_get_16 (abfd, (bfd_byte *) ddata + 14)) > 0)
9896 1.1 skrll {
9897 1.1 skrll elf_tdata (abfd)->core->signal = sig;
9898 1.1 skrll elf_tdata (abfd)->core->lwpid = *tid;
9899 1.1 skrll }
9900 1.6 christos
9901 1.1 skrll /* _DEBUG_FLAG_CURTID (current thread) is 0x80. Some cores
9902 1.1 skrll do not come from signals so we make sure we set the current
9903 1.1 skrll thread just in case. */
9904 1.1 skrll if (flags & 0x00000080)
9905 1.3 christos elf_tdata (abfd)->core->lwpid = *tid;
9906 1.1 skrll
9907 1.1 skrll /* Make a ".qnx_core_status/%d" section. */
9908 1.1 skrll sprintf (buf, ".qnx_core_status/%ld", *tid);
9909 1.1 skrll
9910 1.1 skrll name = (char *) bfd_alloc (abfd, strlen (buf) + 1);
9911 1.1 skrll if (name == NULL)
9912 1.1 skrll return FALSE;
9913 1.1 skrll strcpy (name, buf);
9914 1.1 skrll
9915 1.1 skrll sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
9916 1.1 skrll if (sect == NULL)
9917 1.1 skrll return FALSE;
9918 1.1 skrll
9919 1.1 skrll sect->size = note->descsz;
9920 1.1 skrll sect->filepos = note->descpos;
9921 1.1 skrll sect->alignment_power = 2;
9922 1.1 skrll
9923 1.1 skrll return (elfcore_maybe_make_sect (abfd, ".qnx_core_status", sect));
9924 1.1 skrll }
9925 1.1 skrll
9926 1.1 skrll static bfd_boolean
9927 1.1 skrll elfcore_grok_nto_regs (bfd *abfd,
9928 1.1 skrll Elf_Internal_Note *note,
9929 1.1 skrll long tid,
9930 1.1 skrll char *base)
9931 1.1 skrll {
9932 1.1 skrll char buf[100];
9933 1.1 skrll char *name;
9934 1.3 christos asection *sect;
9935 1.1 skrll
9936 1.1 skrll /* Make a "(base)/%d" section. */
9937 1.1 skrll sprintf (buf, "%s/%ld", base, tid);
9938 1.1 skrll
9939 1.1 skrll name = (char *) bfd_alloc (abfd, strlen (buf) + 1);
9940 1.1 skrll if (name == NULL)
9941 1.1 skrll return FALSE;
9942 1.1 skrll strcpy (name, buf);
9943 1.1 skrll
9944 1.1 skrll sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
9945 1.1 skrll if (sect == NULL)
9946 1.1 skrll return FALSE;
9947 1.1 skrll
9948 1.6 christos sect->size = note->descsz;
9949 1.1 skrll sect->filepos = note->descpos;
9950 1.1 skrll sect->alignment_power = 2;
9951 1.1 skrll
9952 1.1 skrll /* This is the current thread. */
9953 1.1 skrll if (elf_tdata (abfd)->core->lwpid == tid)
9954 1.1 skrll return elfcore_maybe_make_sect (abfd, base, sect);
9955 1.1 skrll
9956 1.1 skrll return TRUE;
9957 1.1 skrll }
9958 1.1 skrll
9959 1.1 skrll #define BFD_QNT_CORE_INFO 7
9960 1.1 skrll #define BFD_QNT_CORE_STATUS 8
9961 1.1 skrll #define BFD_QNT_CORE_GREG 9
9962 1.1 skrll #define BFD_QNT_CORE_FPREG 10
9963 1.1 skrll
9964 1.1 skrll static bfd_boolean
9965 1.1 skrll elfcore_grok_nto_note (bfd *abfd, Elf_Internal_Note *note)
9966 1.1 skrll {
9967 1.1 skrll /* Every GREG section has a STATUS section before it. Store the
9968 1.1 skrll tid from the previous call to pass down to the next gregs
9969 1.1 skrll function. */
9970 1.1 skrll static long tid = 1;
9971 1.1 skrll
9972 1.1 skrll switch (note->type)
9973 1.1 skrll {
9974 1.1 skrll case BFD_QNT_CORE_INFO:
9975 1.1 skrll return elfcore_make_note_pseudosection (abfd, ".qnx_core_info", note);
9976 1.1 skrll case BFD_QNT_CORE_STATUS:
9977 1.1 skrll return elfcore_grok_nto_status (abfd, note, &tid);
9978 1.1 skrll case BFD_QNT_CORE_GREG:
9979 1.1 skrll return elfcore_grok_nto_regs (abfd, note, tid, ".reg");
9980 1.1 skrll case BFD_QNT_CORE_FPREG:
9981 1.1 skrll return elfcore_grok_nto_regs (abfd, note, tid, ".reg2");
9982 1.1 skrll default:
9983 1.1 skrll return TRUE;
9984 1.1 skrll }
9985 1.1 skrll }
9986 1.1 skrll
9987 1.1 skrll static bfd_boolean
9988 1.1 skrll elfcore_grok_spu_note (bfd *abfd, Elf_Internal_Note *note)
9989 1.1 skrll {
9990 1.1 skrll char *name;
9991 1.3 christos asection *sect;
9992 1.1 skrll size_t len;
9993 1.1 skrll
9994 1.1 skrll /* Use note name as section name. */
9995 1.1 skrll len = note->namesz;
9996 1.1 skrll name = (char *) bfd_alloc (abfd, len);
9997 1.1 skrll if (name == NULL)
9998 1.1 skrll return FALSE;
9999 1.1 skrll memcpy (name, note->namedata, len);
10000 1.1 skrll name[len - 1] = '\0';
10001 1.1 skrll
10002 1.1 skrll sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
10003 1.1 skrll if (sect == NULL)
10004 1.1 skrll return FALSE;
10005 1.1 skrll
10006 1.1 skrll sect->size = note->descsz;
10007 1.1 skrll sect->filepos = note->descpos;
10008 1.1 skrll sect->alignment_power = 1;
10009 1.1 skrll
10010 1.1 skrll return TRUE;
10011 1.1 skrll }
10012 1.1 skrll
10013 1.1 skrll /* Function: elfcore_write_note
10014 1.1 skrll
10015 1.1 skrll Inputs:
10016 1.1 skrll buffer to hold note, and current size of buffer
10017 1.1 skrll name of note
10018 1.1 skrll type of note
10019 1.1 skrll data for note
10020 1.1 skrll size of data for note
10021 1.1 skrll
10022 1.1 skrll Writes note to end of buffer. ELF64 notes are written exactly as
10023 1.1 skrll for ELF32, despite the current (as of 2006) ELF gabi specifying
10024 1.1 skrll that they ought to have 8-byte namesz and descsz field, and have
10025 1.1 skrll 8-byte alignment. Other writers, eg. Linux kernel, do the same.
10026 1.1 skrll
10027 1.1 skrll Return:
10028 1.1 skrll Pointer to realloc'd buffer, *BUFSIZ updated. */
10029 1.1 skrll
10030 1.1 skrll char *
10031 1.1 skrll elfcore_write_note (bfd *abfd,
10032 1.1 skrll char *buf,
10033 1.1 skrll int *bufsiz,
10034 1.1 skrll const char *name,
10035 1.1 skrll int type,
10036 1.1 skrll const void *input,
10037 1.1 skrll int size)
10038 1.1 skrll {
10039 1.1 skrll Elf_External_Note *xnp;
10040 1.1 skrll size_t namesz;
10041 1.1 skrll size_t newspace;
10042 1.1 skrll char *dest;
10043 1.1 skrll
10044 1.1 skrll namesz = 0;
10045 1.3 christos if (name != NULL)
10046 1.1 skrll namesz = strlen (name) + 1;
10047 1.1 skrll
10048 1.1 skrll newspace = 12 + ((namesz + 3) & -4) + ((size + 3) & -4);
10049 1.1 skrll
10050 1.1 skrll buf = (char *) realloc (buf, *bufsiz + newspace);
10051 1.1 skrll if (buf == NULL)
10052 1.1 skrll return buf;
10053 1.1 skrll dest = buf + *bufsiz;
10054 1.1 skrll *bufsiz += newspace;
10055 1.1 skrll xnp = (Elf_External_Note *) dest;
10056 1.1 skrll H_PUT_32 (abfd, namesz, xnp->namesz);
10057 1.1 skrll H_PUT_32 (abfd, size, xnp->descsz);
10058 1.1 skrll H_PUT_32 (abfd, type, xnp->type);
10059 1.1 skrll dest = xnp->name;
10060 1.1 skrll if (name != NULL)
10061 1.1 skrll {
10062 1.1 skrll memcpy (dest, name, namesz);
10063 1.1 skrll dest += namesz;
10064 1.1 skrll while (namesz & 3)
10065 1.1 skrll {
10066 1.1 skrll *dest++ = '\0';
10067 1.1 skrll ++namesz;
10068 1.1 skrll }
10069 1.1 skrll }
10070 1.1 skrll memcpy (dest, input, size);
10071 1.1 skrll dest += size;
10072 1.1 skrll while (size & 3)
10073 1.1 skrll {
10074 1.1 skrll *dest++ = '\0';
10075 1.1 skrll ++size;
10076 1.1 skrll }
10077 1.1 skrll return buf;
10078 1.1 skrll }
10079 1.1 skrll
10080 1.1 skrll char *
10081 1.1 skrll elfcore_write_prpsinfo (bfd *abfd,
10082 1.1 skrll char *buf,
10083 1.1 skrll int *bufsiz,
10084 1.1 skrll const char *fname,
10085 1.1 skrll const char *psargs)
10086 1.1 skrll {
10087 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
10088 1.1 skrll
10089 1.1 skrll if (bed->elf_backend_write_core_note != NULL)
10090 1.1 skrll {
10091 1.1 skrll char *ret;
10092 1.1 skrll ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
10093 1.5 christos NT_PRPSINFO, fname, psargs);
10094 1.1 skrll if (ret != NULL)
10095 1.1 skrll return ret;
10096 1.1 skrll }
10097 1.1 skrll
10098 1.1 skrll #if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
10099 1.1 skrll #if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
10100 1.1 skrll if (bed->s->elfclass == ELFCLASS32)
10101 1.1 skrll {
10102 1.1 skrll #if defined (HAVE_PSINFO32_T)
10103 1.1 skrll psinfo32_t data;
10104 1.1 skrll int note_type = NT_PSINFO;
10105 1.1 skrll #else
10106 1.1 skrll prpsinfo32_t data;
10107 1.1 skrll int note_type = NT_PRPSINFO;
10108 1.1 skrll #endif
10109 1.5 christos
10110 1.1 skrll memset (&data, 0, sizeof (data));
10111 1.1 skrll strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
10112 1.1 skrll strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
10113 1.1 skrll return elfcore_write_note (abfd, buf, bufsiz,
10114 1.1 skrll "CORE", note_type, &data, sizeof (data));
10115 1.1 skrll }
10116 1.1 skrll else
10117 1.1 skrll #endif
10118 1.1 skrll {
10119 1.1 skrll #if defined (HAVE_PSINFO_T)
10120 1.1 skrll psinfo_t data;
10121 1.1 skrll int note_type = NT_PSINFO;
10122 1.1 skrll #else
10123 1.1 skrll prpsinfo_t data;
10124 1.1 skrll int note_type = NT_PRPSINFO;
10125 1.1 skrll #endif
10126 1.5 christos
10127 1.1 skrll memset (&data, 0, sizeof (data));
10128 1.5 christos strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
10129 1.5 christos strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
10130 1.5 christos return elfcore_write_note (abfd, buf, bufsiz,
10131 1.5 christos "CORE", note_type, &data, sizeof (data));
10132 1.1 skrll }
10133 1.1 skrll #endif /* PSINFO_T or PRPSINFO_T */
10134 1.1 skrll
10135 1.6 christos free (buf);
10136 1.6 christos return NULL;
10137 1.6 christos }
10138 1.6 christos
10139 1.6 christos char *
10140 1.6 christos elfcore_write_linux_prpsinfo32
10141 1.6.2.1 pgoyette (bfd *abfd, char *buf, int *bufsiz,
10142 1.6 christos const struct elf_internal_linux_prpsinfo *prpsinfo)
10143 1.6 christos {
10144 1.6 christos struct elf_external_linux_prpsinfo32 data;
10145 1.6 christos
10146 1.6 christos swap_linux_prpsinfo32_out (abfd, prpsinfo, &data);
10147 1.6 christos return elfcore_write_note (abfd, buf, bufsiz, "CORE", NT_PRPSINFO,
10148 1.6 christos &data, sizeof (data));
10149 1.6 christos }
10150 1.6 christos
10151 1.6 christos char *
10152 1.6 christos elfcore_write_linux_prpsinfo64
10153 1.6.2.1 pgoyette (bfd *abfd, char *buf, int *bufsiz,
10154 1.6 christos const struct elf_internal_linux_prpsinfo *prpsinfo)
10155 1.6 christos {
10156 1.6 christos struct elf_external_linux_prpsinfo64 data;
10157 1.6 christos
10158 1.6 christos swap_linux_prpsinfo64_out (abfd, prpsinfo, &data);
10159 1.1 skrll return elfcore_write_note (abfd, buf, bufsiz,
10160 1.1 skrll "CORE", NT_PRPSINFO, &data, sizeof (data));
10161 1.1 skrll }
10162 1.1 skrll
10163 1.1 skrll char *
10164 1.1 skrll elfcore_write_prstatus (bfd *abfd,
10165 1.1 skrll char *buf,
10166 1.1 skrll int *bufsiz,
10167 1.1 skrll long pid,
10168 1.1 skrll int cursig,
10169 1.1 skrll const void *gregs)
10170 1.1 skrll {
10171 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
10172 1.1 skrll
10173 1.1 skrll if (bed->elf_backend_write_core_note != NULL)
10174 1.1 skrll {
10175 1.1 skrll char *ret;
10176 1.1 skrll ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
10177 1.1 skrll NT_PRSTATUS,
10178 1.5 christos pid, cursig, gregs);
10179 1.1 skrll if (ret != NULL)
10180 1.1 skrll return ret;
10181 1.1 skrll }
10182 1.1 skrll
10183 1.1 skrll #if defined (HAVE_PRSTATUS_T)
10184 1.1 skrll #if defined (HAVE_PRSTATUS32_T)
10185 1.1 skrll if (bed->s->elfclass == ELFCLASS32)
10186 1.1 skrll {
10187 1.1 skrll prstatus32_t prstat;
10188 1.5 christos
10189 1.1 skrll memset (&prstat, 0, sizeof (prstat));
10190 1.1 skrll prstat.pr_pid = pid;
10191 1.1 skrll prstat.pr_cursig = cursig;
10192 1.1 skrll memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
10193 1.1 skrll return elfcore_write_note (abfd, buf, bufsiz, "CORE",
10194 1.1 skrll NT_PRSTATUS, &prstat, sizeof (prstat));
10195 1.1 skrll }
10196 1.1 skrll else
10197 1.1 skrll #endif
10198 1.1 skrll {
10199 1.1 skrll prstatus_t prstat;
10200 1.5 christos
10201 1.1 skrll memset (&prstat, 0, sizeof (prstat));
10202 1.1 skrll prstat.pr_pid = pid;
10203 1.5 christos prstat.pr_cursig = cursig;
10204 1.5 christos memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
10205 1.5 christos return elfcore_write_note (abfd, buf, bufsiz, "CORE",
10206 1.5 christos NT_PRSTATUS, &prstat, sizeof (prstat));
10207 1.1 skrll }
10208 1.1 skrll #endif /* HAVE_PRSTATUS_T */
10209 1.1 skrll
10210 1.1 skrll free (buf);
10211 1.1 skrll return NULL;
10212 1.1 skrll }
10213 1.1 skrll
10214 1.1 skrll #if defined (HAVE_LWPSTATUS_T)
10215 1.1 skrll char *
10216 1.1 skrll elfcore_write_lwpstatus (bfd *abfd,
10217 1.1 skrll char *buf,
10218 1.1 skrll int *bufsiz,
10219 1.1 skrll long pid,
10220 1.1 skrll int cursig,
10221 1.1 skrll const void *gregs)
10222 1.1 skrll {
10223 1.1 skrll lwpstatus_t lwpstat;
10224 1.1 skrll const char *note_name = "CORE";
10225 1.6 christos
10226 1.1 skrll memset (&lwpstat, 0, sizeof (lwpstat));
10227 1.1 skrll lwpstat.pr_lwpid = pid >> 16;
10228 1.1 skrll lwpstat.pr_cursig = cursig;
10229 1.1 skrll #if defined (HAVE_LWPSTATUS_T_PR_REG)
10230 1.1 skrll memcpy (&lwpstat.pr_reg, gregs, sizeof (lwpstat.pr_reg));
10231 1.1 skrll #elif defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
10232 1.1 skrll #if !defined(gregs)
10233 1.1 skrll memcpy (lwpstat.pr_context.uc_mcontext.gregs,
10234 1.1 skrll gregs, sizeof (lwpstat.pr_context.uc_mcontext.gregs));
10235 1.1 skrll #else
10236 1.1 skrll memcpy (lwpstat.pr_context.uc_mcontext.__gregs,
10237 1.1 skrll gregs, sizeof (lwpstat.pr_context.uc_mcontext.__gregs));
10238 1.1 skrll #endif
10239 1.1 skrll #endif
10240 1.1 skrll return elfcore_write_note (abfd, buf, bufsiz, note_name,
10241 1.1 skrll NT_LWPSTATUS, &lwpstat, sizeof (lwpstat));
10242 1.1 skrll }
10243 1.1 skrll #endif /* HAVE_LWPSTATUS_T */
10244 1.1 skrll
10245 1.1 skrll #if defined (HAVE_PSTATUS_T)
10246 1.1 skrll char *
10247 1.1 skrll elfcore_write_pstatus (bfd *abfd,
10248 1.1 skrll char *buf,
10249 1.1 skrll int *bufsiz,
10250 1.1 skrll long pid,
10251 1.1 skrll int cursig ATTRIBUTE_UNUSED,
10252 1.1 skrll const void *gregs ATTRIBUTE_UNUSED)
10253 1.1 skrll {
10254 1.1 skrll const char *note_name = "CORE";
10255 1.1 skrll #if defined (HAVE_PSTATUS32_T)
10256 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
10257 1.1 skrll
10258 1.1 skrll if (bed->s->elfclass == ELFCLASS32)
10259 1.1 skrll {
10260 1.1 skrll pstatus32_t pstat;
10261 1.1 skrll
10262 1.1 skrll memset (&pstat, 0, sizeof (pstat));
10263 1.1 skrll pstat.pr_pid = pid & 0xffff;
10264 1.1 skrll buf = elfcore_write_note (abfd, buf, bufsiz, note_name,
10265 1.1 skrll NT_PSTATUS, &pstat, sizeof (pstat));
10266 1.1 skrll return buf;
10267 1.1 skrll }
10268 1.1 skrll else
10269 1.1 skrll #endif
10270 1.1 skrll {
10271 1.1 skrll pstatus_t pstat;
10272 1.1 skrll
10273 1.1 skrll memset (&pstat, 0, sizeof (pstat));
10274 1.1 skrll pstat.pr_pid = pid & 0xffff;
10275 1.1 skrll buf = elfcore_write_note (abfd, buf, bufsiz, note_name,
10276 1.1 skrll NT_PSTATUS, &pstat, sizeof (pstat));
10277 1.1 skrll return buf;
10278 1.1 skrll }
10279 1.1 skrll }
10280 1.1 skrll #endif /* HAVE_PSTATUS_T */
10281 1.1 skrll
10282 1.1 skrll char *
10283 1.1 skrll elfcore_write_prfpreg (bfd *abfd,
10284 1.1 skrll char *buf,
10285 1.1 skrll int *bufsiz,
10286 1.1 skrll const void *fpregs,
10287 1.1 skrll int size)
10288 1.1 skrll {
10289 1.1 skrll const char *note_name = "CORE";
10290 1.1 skrll return elfcore_write_note (abfd, buf, bufsiz,
10291 1.1 skrll note_name, NT_FPREGSET, fpregs, size);
10292 1.1 skrll }
10293 1.1 skrll
10294 1.1 skrll char *
10295 1.1 skrll elfcore_write_prxfpreg (bfd *abfd,
10296 1.1 skrll char *buf,
10297 1.1 skrll int *bufsiz,
10298 1.1 skrll const void *xfpregs,
10299 1.1 skrll int size)
10300 1.1 skrll {
10301 1.1 skrll char *note_name = "LINUX";
10302 1.3 christos return elfcore_write_note (abfd, buf, bufsiz,
10303 1.3 christos note_name, NT_PRXFPREG, xfpregs, size);
10304 1.3 christos }
10305 1.6 christos
10306 1.6 christos char *
10307 1.6 christos elfcore_write_xstatereg (bfd *abfd, char *buf, int *bufsiz,
10308 1.6 christos const void *xfpregs, int size)
10309 1.6 christos {
10310 1.3 christos char *note_name;
10311 1.3 christos if (get_elf_backend_data (abfd)->elf_osabi == ELFOSABI_FREEBSD)
10312 1.3 christos note_name = "FreeBSD";
10313 1.3 christos else
10314 1.3 christos note_name = "LINUX";
10315 1.1 skrll return elfcore_write_note (abfd, buf, bufsiz,
10316 1.1 skrll note_name, NT_X86_XSTATE, xfpregs, size);
10317 1.1 skrll }
10318 1.1 skrll
10319 1.1 skrll char *
10320 1.1 skrll elfcore_write_ppc_vmx (bfd *abfd,
10321 1.1 skrll char *buf,
10322 1.1 skrll int *bufsiz,
10323 1.1 skrll const void *ppc_vmx,
10324 1.1 skrll int size)
10325 1.1 skrll {
10326 1.1 skrll char *note_name = "LINUX";
10327 1.1 skrll return elfcore_write_note (abfd, buf, bufsiz,
10328 1.1 skrll note_name, NT_PPC_VMX, ppc_vmx, size);
10329 1.1 skrll }
10330 1.1 skrll
10331 1.1 skrll char *
10332 1.1 skrll elfcore_write_ppc_vsx (bfd *abfd,
10333 1.1 skrll char *buf,
10334 1.1 skrll int *bufsiz,
10335 1.1 skrll const void *ppc_vsx,
10336 1.1 skrll int size)
10337 1.1 skrll {
10338 1.3 christos char *note_name = "LINUX";
10339 1.3 christos return elfcore_write_note (abfd, buf, bufsiz,
10340 1.3 christos note_name, NT_PPC_VSX, ppc_vsx, size);
10341 1.3 christos }
10342 1.3 christos
10343 1.3 christos static char *
10344 1.3 christos elfcore_write_s390_high_gprs (bfd *abfd,
10345 1.3 christos char *buf,
10346 1.3 christos int *bufsiz,
10347 1.3 christos const void *s390_high_gprs,
10348 1.3 christos int size)
10349 1.3 christos {
10350 1.3 christos char *note_name = "LINUX";
10351 1.3 christos return elfcore_write_note (abfd, buf, bufsiz,
10352 1.3 christos note_name, NT_S390_HIGH_GPRS,
10353 1.3 christos s390_high_gprs, size);
10354 1.3 christos }
10355 1.3 christos
10356 1.3 christos char *
10357 1.3 christos elfcore_write_s390_timer (bfd *abfd,
10358 1.3 christos char *buf,
10359 1.3 christos int *bufsiz,
10360 1.3 christos const void *s390_timer,
10361 1.3 christos int size)
10362 1.3 christos {
10363 1.3 christos char *note_name = "LINUX";
10364 1.3 christos return elfcore_write_note (abfd, buf, bufsiz,
10365 1.3 christos note_name, NT_S390_TIMER, s390_timer, size);
10366 1.3 christos }
10367 1.3 christos
10368 1.3 christos char *
10369 1.3 christos elfcore_write_s390_todcmp (bfd *abfd,
10370 1.3 christos char *buf,
10371 1.3 christos int *bufsiz,
10372 1.3 christos const void *s390_todcmp,
10373 1.3 christos int size)
10374 1.3 christos {
10375 1.3 christos char *note_name = "LINUX";
10376 1.3 christos return elfcore_write_note (abfd, buf, bufsiz,
10377 1.3 christos note_name, NT_S390_TODCMP, s390_todcmp, size);
10378 1.3 christos }
10379 1.3 christos
10380 1.3 christos char *
10381 1.3 christos elfcore_write_s390_todpreg (bfd *abfd,
10382 1.3 christos char *buf,
10383 1.3 christos int *bufsiz,
10384 1.3 christos const void *s390_todpreg,
10385 1.3 christos int size)
10386 1.3 christos {
10387 1.3 christos char *note_name = "LINUX";
10388 1.3 christos return elfcore_write_note (abfd, buf, bufsiz,
10389 1.3 christos note_name, NT_S390_TODPREG, s390_todpreg, size);
10390 1.3 christos }
10391 1.3 christos
10392 1.3 christos char *
10393 1.3 christos elfcore_write_s390_ctrs (bfd *abfd,
10394 1.3 christos char *buf,
10395 1.3 christos int *bufsiz,
10396 1.3 christos const void *s390_ctrs,
10397 1.3 christos int size)
10398 1.3 christos {
10399 1.3 christos char *note_name = "LINUX";
10400 1.3 christos return elfcore_write_note (abfd, buf, bufsiz,
10401 1.3 christos note_name, NT_S390_CTRS, s390_ctrs, size);
10402 1.3 christos }
10403 1.3 christos
10404 1.3 christos char *
10405 1.3 christos elfcore_write_s390_prefix (bfd *abfd,
10406 1.3 christos char *buf,
10407 1.3 christos int *bufsiz,
10408 1.3 christos const void *s390_prefix,
10409 1.3 christos int size)
10410 1.3 christos {
10411 1.1 skrll char *note_name = "LINUX";
10412 1.5 christos return elfcore_write_note (abfd, buf, bufsiz,
10413 1.5 christos note_name, NT_S390_PREFIX, s390_prefix, size);
10414 1.5 christos }
10415 1.5 christos
10416 1.5 christos char *
10417 1.5 christos elfcore_write_s390_last_break (bfd *abfd,
10418 1.5 christos char *buf,
10419 1.5 christos int *bufsiz,
10420 1.5 christos const void *s390_last_break,
10421 1.5 christos int size)
10422 1.5 christos {
10423 1.5 christos char *note_name = "LINUX";
10424 1.5 christos return elfcore_write_note (abfd, buf, bufsiz,
10425 1.5 christos note_name, NT_S390_LAST_BREAK,
10426 1.5 christos s390_last_break, size);
10427 1.5 christos }
10428 1.5 christos
10429 1.5 christos char *
10430 1.5 christos elfcore_write_s390_system_call (bfd *abfd,
10431 1.5 christos char *buf,
10432 1.5 christos int *bufsiz,
10433 1.5 christos const void *s390_system_call,
10434 1.5 christos int size)
10435 1.5 christos {
10436 1.5 christos char *note_name = "LINUX";
10437 1.5 christos return elfcore_write_note (abfd, buf, bufsiz,
10438 1.6 christos note_name, NT_S390_SYSTEM_CALL,
10439 1.6 christos s390_system_call, size);
10440 1.6 christos }
10441 1.6 christos
10442 1.6 christos char *
10443 1.6 christos elfcore_write_s390_tdb (bfd *abfd,
10444 1.6 christos char *buf,
10445 1.6 christos int *bufsiz,
10446 1.6 christos const void *s390_tdb,
10447 1.6 christos int size)
10448 1.6 christos {
10449 1.6 christos char *note_name = "LINUX";
10450 1.6 christos return elfcore_write_note (abfd, buf, bufsiz,
10451 1.6 christos note_name, NT_S390_TDB, s390_tdb, size);
10452 1.6 christos }
10453 1.6 christos
10454 1.6 christos char *
10455 1.6 christos elfcore_write_s390_vxrs_low (bfd *abfd,
10456 1.6 christos char *buf,
10457 1.6 christos int *bufsiz,
10458 1.6 christos const void *s390_vxrs_low,
10459 1.6 christos int size)
10460 1.6 christos {
10461 1.6 christos char *note_name = "LINUX";
10462 1.6 christos return elfcore_write_note (abfd, buf, bufsiz,
10463 1.6 christos note_name, NT_S390_VXRS_LOW, s390_vxrs_low, size);
10464 1.6 christos }
10465 1.6 christos
10466 1.6 christos char *
10467 1.6 christos elfcore_write_s390_vxrs_high (bfd *abfd,
10468 1.6 christos char *buf,
10469 1.6 christos int *bufsiz,
10470 1.6 christos const void *s390_vxrs_high,
10471 1.6 christos int size)
10472 1.6 christos {
10473 1.6 christos char *note_name = "LINUX";
10474 1.6 christos return elfcore_write_note (abfd, buf, bufsiz,
10475 1.5 christos note_name, NT_S390_VXRS_HIGH,
10476 1.5 christos s390_vxrs_high, size);
10477 1.5 christos }
10478 1.5 christos
10479 1.5 christos char *
10480 1.5 christos elfcore_write_arm_vfp (bfd *abfd,
10481 1.5 christos char *buf,
10482 1.5 christos int *bufsiz,
10483 1.5 christos const void *arm_vfp,
10484 1.5 christos int size)
10485 1.5 christos {
10486 1.5 christos char *note_name = "LINUX";
10487 1.6 christos return elfcore_write_note (abfd, buf, bufsiz,
10488 1.6 christos note_name, NT_ARM_VFP, arm_vfp, size);
10489 1.6 christos }
10490 1.6 christos
10491 1.6 christos char *
10492 1.6 christos elfcore_write_aarch_tls (bfd *abfd,
10493 1.6 christos char *buf,
10494 1.6 christos int *bufsiz,
10495 1.6 christos const void *aarch_tls,
10496 1.6 christos int size)
10497 1.6 christos {
10498 1.6 christos char *note_name = "LINUX";
10499 1.6 christos return elfcore_write_note (abfd, buf, bufsiz,
10500 1.6 christos note_name, NT_ARM_TLS, aarch_tls, size);
10501 1.6 christos }
10502 1.6 christos
10503 1.6 christos char *
10504 1.6 christos elfcore_write_aarch_hw_break (bfd *abfd,
10505 1.6 christos char *buf,
10506 1.6 christos int *bufsiz,
10507 1.6 christos const void *aarch_hw_break,
10508 1.6 christos int size)
10509 1.6 christos {
10510 1.6 christos char *note_name = "LINUX";
10511 1.6 christos return elfcore_write_note (abfd, buf, bufsiz,
10512 1.6 christos note_name, NT_ARM_HW_BREAK, aarch_hw_break, size);
10513 1.6 christos }
10514 1.6 christos
10515 1.6 christos char *
10516 1.6 christos elfcore_write_aarch_hw_watch (bfd *abfd,
10517 1.6 christos char *buf,
10518 1.6 christos int *bufsiz,
10519 1.6 christos const void *aarch_hw_watch,
10520 1.6 christos int size)
10521 1.6 christos {
10522 1.6 christos char *note_name = "LINUX";
10523 1.1 skrll return elfcore_write_note (abfd, buf, bufsiz,
10524 1.1 skrll note_name, NT_ARM_HW_WATCH, aarch_hw_watch, size);
10525 1.1 skrll }
10526 1.1 skrll
10527 1.1 skrll char *
10528 1.1 skrll elfcore_write_register_note (bfd *abfd,
10529 1.1 skrll char *buf,
10530 1.1 skrll int *bufsiz,
10531 1.1 skrll const char *section,
10532 1.1 skrll const void *data,
10533 1.1 skrll int size)
10534 1.3 christos {
10535 1.3 christos if (strcmp (section, ".reg2") == 0)
10536 1.1 skrll return elfcore_write_prfpreg (abfd, buf, bufsiz, data, size);
10537 1.1 skrll if (strcmp (section, ".reg-xfp") == 0)
10538 1.1 skrll return elfcore_write_prxfpreg (abfd, buf, bufsiz, data, size);
10539 1.1 skrll if (strcmp (section, ".reg-xstate") == 0)
10540 1.3 christos return elfcore_write_xstatereg (abfd, buf, bufsiz, data, size);
10541 1.3 christos if (strcmp (section, ".reg-ppc-vmx") == 0)
10542 1.3 christos return elfcore_write_ppc_vmx (abfd, buf, bufsiz, data, size);
10543 1.3 christos if (strcmp (section, ".reg-ppc-vsx") == 0)
10544 1.3 christos return elfcore_write_ppc_vsx (abfd, buf, bufsiz, data, size);
10545 1.3 christos if (strcmp (section, ".reg-s390-high-gprs") == 0)
10546 1.3 christos return elfcore_write_s390_high_gprs (abfd, buf, bufsiz, data, size);
10547 1.3 christos if (strcmp (section, ".reg-s390-timer") == 0)
10548 1.3 christos return elfcore_write_s390_timer (abfd, buf, bufsiz, data, size);
10549 1.3 christos if (strcmp (section, ".reg-s390-todcmp") == 0)
10550 1.3 christos return elfcore_write_s390_todcmp (abfd, buf, bufsiz, data, size);
10551 1.3 christos if (strcmp (section, ".reg-s390-todpreg") == 0)
10552 1.5 christos return elfcore_write_s390_todpreg (abfd, buf, bufsiz, data, size);
10553 1.5 christos if (strcmp (section, ".reg-s390-ctrs") == 0)
10554 1.5 christos return elfcore_write_s390_ctrs (abfd, buf, bufsiz, data, size);
10555 1.5 christos if (strcmp (section, ".reg-s390-prefix") == 0)
10556 1.6 christos return elfcore_write_s390_prefix (abfd, buf, bufsiz, data, size);
10557 1.6 christos if (strcmp (section, ".reg-s390-last-break") == 0)
10558 1.6 christos return elfcore_write_s390_last_break (abfd, buf, bufsiz, data, size);
10559 1.6 christos if (strcmp (section, ".reg-s390-system-call") == 0)
10560 1.6 christos return elfcore_write_s390_system_call (abfd, buf, bufsiz, data, size);
10561 1.6 christos if (strcmp (section, ".reg-s390-tdb") == 0)
10562 1.5 christos return elfcore_write_s390_tdb (abfd, buf, bufsiz, data, size);
10563 1.5 christos if (strcmp (section, ".reg-s390-vxrs-low") == 0)
10564 1.6 christos return elfcore_write_s390_vxrs_low (abfd, buf, bufsiz, data, size);
10565 1.6 christos if (strcmp (section, ".reg-s390-vxrs-high") == 0)
10566 1.6 christos return elfcore_write_s390_vxrs_high (abfd, buf, bufsiz, data, size);
10567 1.6 christos if (strcmp (section, ".reg-arm-vfp") == 0)
10568 1.6 christos return elfcore_write_arm_vfp (abfd, buf, bufsiz, data, size);
10569 1.6 christos if (strcmp (section, ".reg-aarch-tls") == 0)
10570 1.1 skrll return elfcore_write_aarch_tls (abfd, buf, bufsiz, data, size);
10571 1.1 skrll if (strcmp (section, ".reg-aarch-hw-break") == 0)
10572 1.1 skrll return elfcore_write_aarch_hw_break (abfd, buf, bufsiz, data, size);
10573 1.1 skrll if (strcmp (section, ".reg-aarch-hw-watch") == 0)
10574 1.1 skrll return elfcore_write_aarch_hw_watch (abfd, buf, bufsiz, data, size);
10575 1.1 skrll return NULL;
10576 1.1 skrll }
10577 1.1 skrll
10578 1.1 skrll static bfd_boolean
10579 1.1 skrll elf_parse_notes (bfd *abfd, char *buf, size_t size, file_ptr offset)
10580 1.1 skrll {
10581 1.1 skrll char *p;
10582 1.1 skrll
10583 1.1 skrll p = buf;
10584 1.1 skrll while (p < buf + size)
10585 1.1 skrll {
10586 1.1 skrll /* FIXME: bad alignment assumption. */
10587 1.1 skrll Elf_External_Note *xnp = (Elf_External_Note *) p;
10588 1.1 skrll Elf_Internal_Note in;
10589 1.1 skrll
10590 1.1 skrll if (offsetof (Elf_External_Note, name) > buf - p + size)
10591 1.1 skrll return FALSE;
10592 1.1 skrll
10593 1.1 skrll in.type = H_GET_32 (abfd, xnp->type);
10594 1.1 skrll
10595 1.1 skrll in.namesz = H_GET_32 (abfd, xnp->namesz);
10596 1.1 skrll in.namedata = xnp->name;
10597 1.1 skrll if (in.namesz > buf - in.namedata + size)
10598 1.1 skrll return FALSE;
10599 1.1 skrll
10600 1.1 skrll in.descsz = H_GET_32 (abfd, xnp->descsz);
10601 1.1 skrll in.descdata = in.namedata + BFD_ALIGN (in.namesz, 4);
10602 1.1 skrll in.descpos = offset + (in.descdata - buf);
10603 1.1 skrll if (in.descsz != 0
10604 1.1 skrll && (in.descdata >= buf + size
10605 1.1 skrll || in.descsz > buf - in.descdata + size))
10606 1.1 skrll return FALSE;
10607 1.1 skrll
10608 1.1 skrll switch (bfd_get_format (abfd))
10609 1.6 christos {
10610 1.6 christos default:
10611 1.6 christos return TRUE;
10612 1.1 skrll
10613 1.6 christos case bfd_core:
10614 1.6 christos {
10615 1.6 christos #define GROKER_ELEMENT(S,F) {S, sizeof (S) - 1, F}
10616 1.1 skrll struct
10617 1.6 christos {
10618 1.3 christos const char * string;
10619 1.6 christos size_t len;
10620 1.6.2.1 pgoyette bfd_boolean (* func)(bfd *, Elf_Internal_Note *);
10621 1.6 christos }
10622 1.6 christos grokers[] =
10623 1.6 christos {
10624 1.6 christos GROKER_ELEMENT ("", elfcore_grok_note),
10625 1.6 christos GROKER_ELEMENT ("FreeBSD", elfcore_grok_freebsd_note),
10626 1.6 christos GROKER_ELEMENT ("NetBSD-CORE", elfcore_grok_netbsd_note),
10627 1.6 christos GROKER_ELEMENT ( "OpenBSD", elfcore_grok_openbsd_note),
10628 1.6 christos GROKER_ELEMENT ("QNX", elfcore_grok_nto_note),
10629 1.6 christos GROKER_ELEMENT ("SPU/", elfcore_grok_spu_note)
10630 1.6 christos };
10631 1.6 christos #undef GROKER_ELEMENT
10632 1.6 christos int i;
10633 1.6 christos
10634 1.6 christos for (i = ARRAY_SIZE (grokers); i--;)
10635 1.6 christos {
10636 1.6 christos if (in.namesz >= grokers[i].len
10637 1.6 christos && strncmp (in.namedata, grokers[i].string,
10638 1.6 christos grokers[i].len) == 0)
10639 1.6 christos {
10640 1.6 christos if (! grokers[i].func (abfd, & in))
10641 1.6 christos return FALSE;
10642 1.1 skrll break;
10643 1.1 skrll }
10644 1.1 skrll }
10645 1.1 skrll break;
10646 1.1 skrll }
10647 1.1 skrll
10648 1.1 skrll case bfd_object:
10649 1.5 christos if (in.namesz == sizeof "GNU" && strcmp (in.namedata, "GNU") == 0)
10650 1.5 christos {
10651 1.5 christos if (! elfobj_grok_gnu_note (abfd, &in))
10652 1.5 christos return FALSE;
10653 1.5 christos }
10654 1.5 christos else if (in.namesz == sizeof "stapsdt"
10655 1.1 skrll && strcmp (in.namedata, "stapsdt") == 0)
10656 1.1 skrll {
10657 1.1 skrll if (! elfobj_grok_stapsdt_note (abfd, &in))
10658 1.1 skrll return FALSE;
10659 1.1 skrll }
10660 1.1 skrll break;
10661 1.1 skrll }
10662 1.1 skrll
10663 1.1 skrll p = in.descdata + BFD_ALIGN (in.descsz, 4);
10664 1.1 skrll }
10665 1.1 skrll
10666 1.1 skrll return TRUE;
10667 1.1 skrll }
10668 1.1 skrll
10669 1.1 skrll static bfd_boolean
10670 1.1 skrll elf_read_notes (bfd *abfd, file_ptr offset, bfd_size_type size)
10671 1.1 skrll {
10672 1.1 skrll char *buf;
10673 1.1 skrll
10674 1.1 skrll if (size <= 0)
10675 1.6 christos return TRUE;
10676 1.1 skrll
10677 1.1 skrll if (bfd_seek (abfd, offset, SEEK_SET) != 0)
10678 1.1 skrll return FALSE;
10679 1.6 christos
10680 1.6 christos buf = (char *) bfd_malloc (size + 1);
10681 1.6 christos if (buf == NULL)
10682 1.6 christos return FALSE;
10683 1.1 skrll
10684 1.1 skrll /* PR 17512: file: ec08f814
10685 1.1 skrll 0-termintate the buffer so that string searches will not overflow. */
10686 1.1 skrll buf[size] = 0;
10687 1.1 skrll
10688 1.1 skrll if (bfd_bread (buf, size, abfd) != size
10689 1.1 skrll || !elf_parse_notes (abfd, buf, size, offset))
10690 1.1 skrll {
10691 1.1 skrll free (buf);
10692 1.1 skrll return FALSE;
10693 1.1 skrll }
10694 1.1 skrll
10695 1.1 skrll free (buf);
10696 1.1 skrll return TRUE;
10697 1.1 skrll }
10698 1.1 skrll
10699 1.1 skrll /* Providing external access to the ELF program header table. */
10701 1.1 skrll
10702 1.1 skrll /* Return an upper bound on the number of bytes required to store a
10703 1.1 skrll copy of ABFD's program header table entries. Return -1 if an error
10704 1.1 skrll occurs; bfd_get_error will return an appropriate code. */
10705 1.1 skrll
10706 1.1 skrll long
10707 1.1 skrll bfd_get_elf_phdr_upper_bound (bfd *abfd)
10708 1.1 skrll {
10709 1.1 skrll if (abfd->xvec->flavour != bfd_target_elf_flavour)
10710 1.1 skrll {
10711 1.1 skrll bfd_set_error (bfd_error_wrong_format);
10712 1.1 skrll return -1;
10713 1.1 skrll }
10714 1.1 skrll
10715 1.1 skrll return elf_elfheader (abfd)->e_phnum * sizeof (Elf_Internal_Phdr);
10716 1.1 skrll }
10717 1.1 skrll
10718 1.1 skrll /* Copy ABFD's program header table entries to *PHDRS. The entries
10719 1.1 skrll will be stored as an array of Elf_Internal_Phdr structures, as
10720 1.1 skrll defined in include/elf/internal.h. To find out how large the
10721 1.1 skrll buffer needs to be, call bfd_get_elf_phdr_upper_bound.
10722 1.1 skrll
10723 1.1 skrll Return the number of program header table entries read, or -1 if an
10724 1.1 skrll error occurs; bfd_get_error will return an appropriate code. */
10725 1.1 skrll
10726 1.1 skrll int
10727 1.1 skrll bfd_get_elf_phdrs (bfd *abfd, void *phdrs)
10728 1.1 skrll {
10729 1.1 skrll int num_phdrs;
10730 1.1 skrll
10731 1.1 skrll if (abfd->xvec->flavour != bfd_target_elf_flavour)
10732 1.1 skrll {
10733 1.1 skrll bfd_set_error (bfd_error_wrong_format);
10734 1.1 skrll return -1;
10735 1.1 skrll }
10736 1.1 skrll
10737 1.1 skrll num_phdrs = elf_elfheader (abfd)->e_phnum;
10738 1.1 skrll memcpy (phdrs, elf_tdata (abfd)->phdr,
10739 1.6 christos num_phdrs * sizeof (Elf_Internal_Phdr));
10740 1.6 christos
10741 1.6 christos return num_phdrs;
10742 1.1 skrll }
10743 1.1 skrll
10744 1.1 skrll enum elf_reloc_type_class
10745 1.1 skrll _bfd_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
10746 1.1 skrll const asection *rel_sec ATTRIBUTE_UNUSED,
10747 1.1 skrll const Elf_Internal_Rela *rela ATTRIBUTE_UNUSED)
10748 1.1 skrll {
10749 1.1 skrll return reloc_class_normal;
10750 1.1 skrll }
10751 1.1 skrll
10752 1.1 skrll /* For RELA architectures, return the relocation value for a
10753 1.1 skrll relocation against a local symbol. */
10754 1.1 skrll
10755 1.1 skrll bfd_vma
10756 1.1 skrll _bfd_elf_rela_local_sym (bfd *abfd,
10757 1.1 skrll Elf_Internal_Sym *sym,
10758 1.1 skrll asection **psec,
10759 1.1 skrll Elf_Internal_Rela *rel)
10760 1.1 skrll {
10761 1.1 skrll asection *sec = *psec;
10762 1.1 skrll bfd_vma relocation;
10763 1.5 christos
10764 1.1 skrll relocation = (sec->output_section->vma
10765 1.1 skrll + sec->output_offset
10766 1.1 skrll + sym->st_value);
10767 1.1 skrll if ((sec->flags & SEC_MERGE)
10768 1.1 skrll && ELF_ST_TYPE (sym->st_info) == STT_SECTION
10769 1.1 skrll && sec->sec_info_type == SEC_INFO_TYPE_MERGE)
10770 1.1 skrll {
10771 1.1 skrll rel->r_addend =
10772 1.1 skrll _bfd_merged_section_offset (abfd, psec,
10773 1.1 skrll elf_section_data (sec)->sec_info,
10774 1.1 skrll sym->st_value + rel->r_addend);
10775 1.1 skrll if (sec != *psec)
10776 1.1 skrll {
10777 1.1 skrll /* If we have changed the section, and our original section is
10778 1.1 skrll marked with SEC_EXCLUDE, it means that the original
10779 1.1 skrll SEC_MERGE section has been completely subsumed in some
10780 1.1 skrll other SEC_MERGE section. In this case, we need to leave
10781 1.1 skrll some info around for --emit-relocs. */
10782 1.1 skrll if ((sec->flags & SEC_EXCLUDE) != 0)
10783 1.1 skrll sec->kept_section = *psec;
10784 1.1 skrll sec = *psec;
10785 1.1 skrll }
10786 1.1 skrll rel->r_addend -= relocation;
10787 1.1 skrll rel->r_addend += sec->output_section->vma + sec->output_offset;
10788 1.1 skrll }
10789 1.1 skrll return relocation;
10790 1.1 skrll }
10791 1.1 skrll
10792 1.1 skrll bfd_vma
10793 1.1 skrll _bfd_elf_rel_local_sym (bfd *abfd,
10794 1.5 christos Elf_Internal_Sym *sym,
10795 1.1 skrll asection **psec,
10796 1.1 skrll bfd_vma addend)
10797 1.1 skrll {
10798 1.1 skrll asection *sec = *psec;
10799 1.1 skrll
10800 1.1 skrll if (sec->sec_info_type != SEC_INFO_TYPE_MERGE)
10801 1.1 skrll return sym->st_value + addend;
10802 1.6.2.1 pgoyette
10803 1.6.2.1 pgoyette return _bfd_merged_section_offset (abfd, psec,
10804 1.6.2.1 pgoyette elf_section_data (sec)->sec_info,
10805 1.6.2.1 pgoyette sym->st_value + addend);
10806 1.6.2.1 pgoyette }
10807 1.6.2.1 pgoyette
10808 1.1 skrll /* Adjust an address within a section. Given OFFSET within SEC, return
10809 1.1 skrll the new offset within the section, based upon changes made to the
10810 1.1 skrll section. Returns -1 if the offset is now invalid.
10811 1.1 skrll The offset (in abnd out) is in target sized bytes, however big a
10812 1.1 skrll byte may be. */
10813 1.1 skrll
10814 1.1 skrll bfd_vma
10815 1.1 skrll _bfd_elf_section_offset (bfd *abfd,
10816 1.5 christos struct bfd_link_info *info,
10817 1.1 skrll asection *sec,
10818 1.1 skrll bfd_vma offset)
10819 1.5 christos {
10820 1.1 skrll switch (sec->sec_info_type)
10821 1.6.2.1 pgoyette {
10822 1.1 skrll case SEC_INFO_TYPE_STABS:
10823 1.5 christos return _bfd_stab_section_offset (sec, elf_section_data (sec)->sec_info,
10824 1.5 christos offset);
10825 1.6.2.1 pgoyette case SEC_INFO_TYPE_EH_FRAME:
10826 1.5 christos return _bfd_elf_eh_frame_section_offset (abfd, info, sec, offset);
10827 1.5 christos
10828 1.6.2.1 pgoyette default:
10829 1.6.2.1 pgoyette if ((sec->flags & SEC_ELF_REVERSE_COPY) != 0)
10830 1.6.2.1 pgoyette {
10831 1.6.2.1 pgoyette /* Reverse the offset. */
10832 1.5 christos const struct elf_backend_data *bed = get_elf_backend_data (abfd);
10833 1.1 skrll bfd_size_type address_size = bed->s->arch_size / 8;
10834 1.1 skrll
10835 1.1 skrll /* address_size and sec->size are in octets. Convert
10836 1.1 skrll to bytes before subtracting the original offset. */
10837 1.1 skrll offset = (sec->size - address_size) / bfd_octets_per_byte (abfd) - offset;
10838 1.1 skrll }
10839 1.1 skrll return offset;
10840 1.1 skrll }
10841 1.1 skrll }
10842 1.1 skrll
10843 1.1 skrll /* Create a new BFD as if by bfd_openr. Rather than opening a file,
10845 1.1 skrll reconstruct an ELF file by reading the segments out of remote memory
10846 1.1 skrll based on the ELF file header at EHDR_VMA and the ELF program headers it
10847 1.1 skrll points to. If not null, *LOADBASEP is filled in with the difference
10848 1.1 skrll between the VMAs from which the segments were read, and the VMAs the
10849 1.1 skrll file headers (and hence BFD's idea of each section's VMA) put them at.
10850 1.1 skrll
10851 1.1 skrll The function TARGET_READ_MEMORY is called to copy LEN bytes from the
10852 1.1 skrll remote memory at target address VMA into the local buffer at MYADDR; it
10853 1.1 skrll should return zero on success or an `errno' code on failure. TEMPL must
10854 1.6 christos be a BFD for an ELF target with the word size and byte order found in
10855 1.1 skrll the remote memory. */
10856 1.5 christos
10857 1.1 skrll bfd *
10858 1.1 skrll bfd_elf_bfd_from_remote_memory
10859 1.6 christos (bfd *templ,
10860 1.1 skrll bfd_vma ehdr_vma,
10861 1.1 skrll bfd_size_type size,
10862 1.1 skrll bfd_vma *loadbasep,
10863 1.1 skrll int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
10864 1.1 skrll {
10865 1.1 skrll return (*get_elf_backend_data (templ)->elf_backend_bfd_from_remote_memory)
10866 1.1 skrll (templ, ehdr_vma, size, loadbasep, target_read_memory);
10867 1.1 skrll }
10868 1.1 skrll
10869 1.1 skrll long
10871 1.1 skrll _bfd_elf_get_synthetic_symtab (bfd *abfd,
10872 1.1 skrll long symcount ATTRIBUTE_UNUSED,
10873 1.1 skrll asymbol **syms ATTRIBUTE_UNUSED,
10874 1.1 skrll long dynsymcount,
10875 1.1 skrll asymbol **dynsyms,
10876 1.1 skrll asymbol **ret)
10877 1.1 skrll {
10878 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
10879 1.1 skrll asection *relplt;
10880 1.1 skrll asymbol *s;
10881 1.1 skrll const char *relplt_name;
10882 1.1 skrll bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
10883 1.1 skrll arelent *p;
10884 1.1 skrll long count, i, n;
10885 1.1 skrll size_t size;
10886 1.1 skrll Elf_Internal_Shdr *hdr;
10887 1.1 skrll char *names;
10888 1.1 skrll asection *plt;
10889 1.1 skrll
10890 1.1 skrll *ret = NULL;
10891 1.1 skrll
10892 1.1 skrll if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
10893 1.1 skrll return 0;
10894 1.1 skrll
10895 1.1 skrll if (dynsymcount <= 0)
10896 1.1 skrll return 0;
10897 1.1 skrll
10898 1.1 skrll if (!bed->plt_sym_val)
10899 1.1 skrll return 0;
10900 1.1 skrll
10901 1.1 skrll relplt_name = bed->relplt_name;
10902 1.1 skrll if (relplt_name == NULL)
10903 1.1 skrll relplt_name = bed->rela_plts_and_copies_p ? ".rela.plt" : ".rel.plt";
10904 1.1 skrll relplt = bfd_get_section_by_name (abfd, relplt_name);
10905 1.1 skrll if (relplt == NULL)
10906 1.1 skrll return 0;
10907 1.1 skrll
10908 1.1 skrll hdr = &elf_section_data (relplt)->this_hdr;
10909 1.1 skrll if (hdr->sh_link != elf_dynsymtab (abfd)
10910 1.1 skrll || (hdr->sh_type != SHT_REL && hdr->sh_type != SHT_RELA))
10911 1.1 skrll return 0;
10912 1.1 skrll
10913 1.1 skrll plt = bfd_get_section_by_name (abfd, ".plt");
10914 1.1 skrll if (plt == NULL)
10915 1.1 skrll return 0;
10916 1.1 skrll
10917 1.3 christos slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
10918 1.3 christos if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
10919 1.3 christos return -1;
10920 1.3 christos
10921 1.3 christos count = relplt->size / hdr->sh_entsize;
10922 1.3 christos size = count * sizeof (asymbol);
10923 1.3 christos p = relplt->relocation;
10924 1.3 christos for (i = 0; i < count; i++, p += bed->s->int_rels_per_ext_rel)
10925 1.3 christos {
10926 1.3 christos size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
10927 1.3 christos if (p->addend != 0)
10928 1.1 skrll {
10929 1.3 christos #ifdef BFD64
10930 1.1 skrll size += sizeof ("+0x") - 1 + 8 + 8 * (bed->s->elfclass == ELFCLASS64);
10931 1.1 skrll #else
10932 1.1 skrll size += sizeof ("+0x") - 1 + 8;
10933 1.1 skrll #endif
10934 1.1 skrll }
10935 1.1 skrll }
10936 1.1 skrll
10937 1.1 skrll s = *ret = (asymbol *) bfd_malloc (size);
10938 1.1 skrll if (s == NULL)
10939 1.1 skrll return -1;
10940 1.1 skrll
10941 1.1 skrll names = (char *) (s + count);
10942 1.1 skrll p = relplt->relocation;
10943 1.1 skrll n = 0;
10944 1.1 skrll for (i = 0; i < count; i++, p += bed->s->int_rels_per_ext_rel)
10945 1.1 skrll {
10946 1.1 skrll size_t len;
10947 1.1 skrll bfd_vma addr;
10948 1.1 skrll
10949 1.1 skrll addr = bed->plt_sym_val (i, plt, p);
10950 1.1 skrll if (addr == (bfd_vma) -1)
10951 1.1 skrll continue;
10952 1.1 skrll
10953 1.1 skrll *s = **p->sym_ptr_ptr;
10954 1.1 skrll /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
10955 1.1 skrll we are defining a symbol, ensure one of them is set. */
10956 1.1 skrll if ((s->flags & BSF_LOCAL) == 0)
10957 1.1 skrll s->flags |= BSF_GLOBAL;
10958 1.3 christos s->flags |= BSF_SYNTHETIC;
10959 1.3 christos s->section = plt;
10960 1.3 christos s->value = addr - plt->vma;
10961 1.5 christos s->name = names;
10962 1.3 christos s->udata.p = NULL;
10963 1.3 christos len = strlen ((*p->sym_ptr_ptr)->name);
10964 1.3 christos memcpy (names, (*p->sym_ptr_ptr)->name, len);
10965 1.3 christos names += len;
10966 1.3 christos if (p->addend != 0)
10967 1.3 christos {
10968 1.3 christos char buf[30], *a;
10969 1.3 christos
10970 1.3 christos memcpy (names, "+0x", sizeof ("+0x") - 1);
10971 1.1 skrll names += sizeof ("+0x") - 1;
10972 1.1 skrll bfd_sprintf_vma (abfd, buf, p->addend);
10973 1.1 skrll for (a = buf; *a == '0'; ++a)
10974 1.1 skrll ;
10975 1.1 skrll len = strlen (a);
10976 1.1 skrll memcpy (names, a, len);
10977 1.1 skrll names += len;
10978 1.1 skrll }
10979 1.1 skrll memcpy (names, "@plt", sizeof ("@plt"));
10980 1.1 skrll names += sizeof ("@plt");
10981 1.1 skrll ++s, ++n;
10982 1.1 skrll }
10983 1.1 skrll
10984 1.1 skrll return n;
10985 1.6 christos }
10986 1.6 christos
10987 1.1 skrll /* It is only used by x86-64 so far. */
10988 1.1 skrll asection _bfd_elf_large_com_section
10989 1.1 skrll = BFD_FAKE_SECTION (_bfd_elf_large_com_section,
10990 1.1 skrll SEC_IS_COMMON, NULL, "LARGE_COMMON", 0);
10991 1.1 skrll
10992 1.1 skrll void
10993 1.3 christos _bfd_elf_post_process_headers (bfd * abfd,
10994 1.3 christos struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
10995 1.5 christos {
10996 1.3 christos Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form. */
10997 1.3 christos
10998 1.3 christos i_ehdrp = elf_elfheader (abfd);
10999 1.5 christos
11000 1.1 skrll i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
11001 1.1 skrll
11002 1.1 skrll /* To make things simpler for the loader on Linux systems we set the
11003 1.1 skrll osabi field to ELFOSABI_GNU if the binary contains symbols of
11004 1.1 skrll the STT_GNU_IFUNC type or STB_GNU_UNIQUE binding. */
11005 1.3 christos if (i_ehdrp->e_ident[EI_OSABI] == ELFOSABI_NONE
11006 1.1 skrll && elf_tdata (abfd)->has_gnu_symbols)
11007 1.1 skrll i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_GNU;
11008 1.1 skrll }
11009 1.1 skrll
11010 1.3 christos
11011 1.3 christos /* Return TRUE for ELF symbol types that represent functions.
11012 1.1 skrll This is the default version of this function, which is sufficient for
11013 1.5 christos most targets. It returns true if TYPE is STT_FUNC or STT_GNU_IFUNC. */
11014 1.5 christos
11015 1.5 christos bfd_boolean
11016 1.5 christos _bfd_elf_is_function_type (unsigned int type)
11017 1.5 christos {
11018 1.5 christos return (type == STT_FUNC
11019 1.5 christos || type == STT_GNU_IFUNC);
11020 1.5 christos }
11021 1.5 christos
11022 1.5 christos /* If the ELF symbol SYM might be a function in SEC, return the
11023 1.5 christos function size and set *CODE_OFF to the function's entry point,
11024 1.5 christos otherwise return zero. */
11025 1.5 christos
11026 1.5 christos bfd_size_type
11027 1.5 christos _bfd_elf_maybe_function_sym (const asymbol *sym, asection *sec,
11028 1.5 christos bfd_vma *code_off)
11029 1.5 christos {
11030 1.5 christos bfd_size_type size;
11031 1.5 christos
11032 1.5 christos if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
11033 1.5 christos | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0
11034 1.5 christos || sym->section != sec)
11035 1.5 christos return 0;
11036 1.5 christos
11037 *code_off = sym->value;
11038 size = 0;
11039 if (!(sym->flags & BSF_SYNTHETIC))
11040 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
11041 if (size == 0)
11042 size = 1;
11043 return size;
11044 }
11045