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