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