elf-eh-frame.c revision 1.11 1 1.1 skrll /* .eh_frame section optimization.
2 1.11 christos Copyright (C) 2001-2024 Free Software Foundation, Inc.
3 1.1 skrll Written by Jakub Jelinek <jakub (at) redhat.com>.
4 1.1 skrll
5 1.1 skrll This file is part of BFD, the Binary File Descriptor library.
6 1.1 skrll
7 1.1 skrll This program is free software; you can redistribute it and/or modify
8 1.1 skrll it under the terms of the GNU General Public License as published by
9 1.1 skrll the Free Software Foundation; either version 3 of the License, or
10 1.1 skrll (at your option) any later version.
11 1.1 skrll
12 1.1 skrll This program is distributed in the hope that it will be useful,
13 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 skrll GNU General Public License for more details.
16 1.1 skrll
17 1.1 skrll You should have received a copy of the GNU General Public License
18 1.1 skrll along with this program; if not, write to the Free Software
19 1.1 skrll Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 1.1 skrll MA 02110-1301, USA. */
21 1.1 skrll
22 1.1 skrll #include "sysdep.h"
23 1.1 skrll #include "bfd.h"
24 1.1 skrll #include "libbfd.h"
25 1.1 skrll #include "elf-bfd.h"
26 1.3 christos #include "dwarf2.h"
27 1.1 skrll
28 1.1 skrll #define EH_FRAME_HDR_SIZE 8
29 1.1 skrll
30 1.1 skrll struct cie
31 1.1 skrll {
32 1.1 skrll unsigned int length;
33 1.1 skrll unsigned int hash;
34 1.1 skrll unsigned char version;
35 1.1 skrll unsigned char local_personality;
36 1.1 skrll char augmentation[20];
37 1.1 skrll bfd_vma code_align;
38 1.1 skrll bfd_signed_vma data_align;
39 1.1 skrll bfd_vma ra_column;
40 1.1 skrll bfd_vma augmentation_size;
41 1.1 skrll union {
42 1.1 skrll struct elf_link_hash_entry *h;
43 1.5 christos struct {
44 1.5 christos unsigned int bfd_id;
45 1.5 christos unsigned int index;
46 1.5 christos } sym;
47 1.1 skrll unsigned int reloc_index;
48 1.1 skrll } personality;
49 1.1 skrll struct eh_cie_fde *cie_inf;
50 1.1 skrll unsigned char per_encoding;
51 1.1 skrll unsigned char lsda_encoding;
52 1.1 skrll unsigned char fde_encoding;
53 1.1 skrll unsigned char initial_insn_length;
54 1.1 skrll unsigned char can_make_lsda_relative;
55 1.1 skrll unsigned char initial_instructions[50];
56 1.1 skrll };
57 1.1 skrll
58 1.1 skrll
59 1.1 skrll
60 1.1 skrll /* If *ITER hasn't reached END yet, read the next byte into *RESULT and
61 1.1 skrll move onto the next byte. Return true on success. */
62 1.1 skrll
63 1.10 christos static inline bool
64 1.1 skrll read_byte (bfd_byte **iter, bfd_byte *end, unsigned char *result)
65 1.1 skrll {
66 1.1 skrll if (*iter >= end)
67 1.10 christos return false;
68 1.1 skrll *result = *((*iter)++);
69 1.10 christos return true;
70 1.1 skrll }
71 1.1 skrll
72 1.1 skrll /* Move *ITER over LENGTH bytes, or up to END, whichever is closer.
73 1.1 skrll Return true it was possible to move LENGTH bytes. */
74 1.1 skrll
75 1.10 christos static inline bool
76 1.1 skrll skip_bytes (bfd_byte **iter, bfd_byte *end, bfd_size_type length)
77 1.1 skrll {
78 1.1 skrll if ((bfd_size_type) (end - *iter) < length)
79 1.1 skrll {
80 1.1 skrll *iter = end;
81 1.10 christos return false;
82 1.1 skrll }
83 1.1 skrll *iter += length;
84 1.10 christos return true;
85 1.1 skrll }
86 1.1 skrll
87 1.1 skrll /* Move *ITER over an leb128, stopping at END. Return true if the end
88 1.1 skrll of the leb128 was found. */
89 1.1 skrll
90 1.10 christos static bool
91 1.1 skrll skip_leb128 (bfd_byte **iter, bfd_byte *end)
92 1.1 skrll {
93 1.1 skrll unsigned char byte;
94 1.1 skrll do
95 1.1 skrll if (!read_byte (iter, end, &byte))
96 1.10 christos return false;
97 1.1 skrll while (byte & 0x80);
98 1.10 christos return true;
99 1.1 skrll }
100 1.1 skrll
101 1.1 skrll /* Like skip_leb128, but treat the leb128 as an unsigned value and
102 1.1 skrll store it in *VALUE. */
103 1.1 skrll
104 1.10 christos static bool
105 1.1 skrll read_uleb128 (bfd_byte **iter, bfd_byte *end, bfd_vma *value)
106 1.1 skrll {
107 1.1 skrll bfd_byte *start, *p;
108 1.1 skrll
109 1.1 skrll start = *iter;
110 1.1 skrll if (!skip_leb128 (iter, end))
111 1.10 christos return false;
112 1.1 skrll
113 1.1 skrll p = *iter;
114 1.1 skrll *value = *--p;
115 1.1 skrll while (p > start)
116 1.1 skrll *value = (*value << 7) | (*--p & 0x7f);
117 1.1 skrll
118 1.10 christos return true;
119 1.1 skrll }
120 1.1 skrll
121 1.1 skrll /* Like read_uleb128, but for signed values. */
122 1.1 skrll
123 1.10 christos static bool
124 1.1 skrll read_sleb128 (bfd_byte **iter, bfd_byte *end, bfd_signed_vma *value)
125 1.1 skrll {
126 1.1 skrll bfd_byte *start, *p;
127 1.1 skrll
128 1.1 skrll start = *iter;
129 1.1 skrll if (!skip_leb128 (iter, end))
130 1.10 christos return false;
131 1.1 skrll
132 1.1 skrll p = *iter;
133 1.1 skrll *value = ((*--p & 0x7f) ^ 0x40) - 0x40;
134 1.1 skrll while (p > start)
135 1.1 skrll *value = (*value << 7) | (*--p & 0x7f);
136 1.1 skrll
137 1.10 christos return true;
138 1.1 skrll }
139 1.1 skrll
140 1.1 skrll /* Return 0 if either encoding is variable width, or not yet known to bfd. */
141 1.1 skrll
142 1.1 skrll static
143 1.1 skrll int get_DW_EH_PE_width (int encoding, int ptr_size)
144 1.1 skrll {
145 1.1 skrll /* DW_EH_PE_ values of 0x60 and 0x70 weren't defined at the time .eh_frame
146 1.1 skrll was added to bfd. */
147 1.1 skrll if ((encoding & 0x60) == 0x60)
148 1.1 skrll return 0;
149 1.1 skrll
150 1.1 skrll switch (encoding & 7)
151 1.1 skrll {
152 1.1 skrll case DW_EH_PE_udata2: return 2;
153 1.1 skrll case DW_EH_PE_udata4: return 4;
154 1.1 skrll case DW_EH_PE_udata8: return 8;
155 1.1 skrll case DW_EH_PE_absptr: return ptr_size;
156 1.1 skrll default:
157 1.1 skrll break;
158 1.1 skrll }
159 1.1 skrll
160 1.1 skrll return 0;
161 1.1 skrll }
162 1.1 skrll
163 1.1 skrll #define get_DW_EH_PE_signed(encoding) (((encoding) & DW_EH_PE_signed) != 0)
164 1.1 skrll
165 1.1 skrll /* Read a width sized value from memory. */
166 1.1 skrll
167 1.1 skrll static bfd_vma
168 1.1 skrll read_value (bfd *abfd, bfd_byte *buf, int width, int is_signed)
169 1.1 skrll {
170 1.1 skrll bfd_vma value;
171 1.1 skrll
172 1.1 skrll switch (width)
173 1.1 skrll {
174 1.1 skrll case 2:
175 1.1 skrll if (is_signed)
176 1.1 skrll value = bfd_get_signed_16 (abfd, buf);
177 1.1 skrll else
178 1.1 skrll value = bfd_get_16 (abfd, buf);
179 1.1 skrll break;
180 1.1 skrll case 4:
181 1.1 skrll if (is_signed)
182 1.1 skrll value = bfd_get_signed_32 (abfd, buf);
183 1.1 skrll else
184 1.1 skrll value = bfd_get_32 (abfd, buf);
185 1.1 skrll break;
186 1.1 skrll case 8:
187 1.1 skrll if (is_signed)
188 1.1 skrll value = bfd_get_signed_64 (abfd, buf);
189 1.1 skrll else
190 1.1 skrll value = bfd_get_64 (abfd, buf);
191 1.1 skrll break;
192 1.1 skrll default:
193 1.1 skrll BFD_FAIL ();
194 1.1 skrll return 0;
195 1.1 skrll }
196 1.1 skrll
197 1.1 skrll return value;
198 1.1 skrll }
199 1.1 skrll
200 1.1 skrll /* Store a width sized value to memory. */
201 1.1 skrll
202 1.1 skrll static void
203 1.1 skrll write_value (bfd *abfd, bfd_byte *buf, bfd_vma value, int width)
204 1.1 skrll {
205 1.1 skrll switch (width)
206 1.1 skrll {
207 1.1 skrll case 2: bfd_put_16 (abfd, value, buf); break;
208 1.1 skrll case 4: bfd_put_32 (abfd, value, buf); break;
209 1.1 skrll case 8: bfd_put_64 (abfd, value, buf); break;
210 1.1 skrll default: BFD_FAIL ();
211 1.1 skrll }
212 1.1 skrll }
213 1.1 skrll
214 1.1 skrll /* Return one if C1 and C2 CIEs can be merged. */
215 1.1 skrll
216 1.1 skrll static int
217 1.1 skrll cie_eq (const void *e1, const void *e2)
218 1.1 skrll {
219 1.3 christos const struct cie *c1 = (const struct cie *) e1;
220 1.3 christos const struct cie *c2 = (const struct cie *) e2;
221 1.1 skrll
222 1.1 skrll if (c1->hash == c2->hash
223 1.1 skrll && c1->length == c2->length
224 1.1 skrll && c1->version == c2->version
225 1.1 skrll && c1->local_personality == c2->local_personality
226 1.1 skrll && strcmp (c1->augmentation, c2->augmentation) == 0
227 1.1 skrll && strcmp (c1->augmentation, "eh") != 0
228 1.1 skrll && c1->code_align == c2->code_align
229 1.1 skrll && c1->data_align == c2->data_align
230 1.1 skrll && c1->ra_column == c2->ra_column
231 1.1 skrll && c1->augmentation_size == c2->augmentation_size
232 1.1 skrll && memcmp (&c1->personality, &c2->personality,
233 1.1 skrll sizeof (c1->personality)) == 0
234 1.5 christos && (c1->cie_inf->u.cie.u.sec->output_section
235 1.5 christos == c2->cie_inf->u.cie.u.sec->output_section)
236 1.1 skrll && c1->per_encoding == c2->per_encoding
237 1.1 skrll && c1->lsda_encoding == c2->lsda_encoding
238 1.1 skrll && c1->fde_encoding == c2->fde_encoding
239 1.1 skrll && c1->initial_insn_length == c2->initial_insn_length
240 1.5 christos && c1->initial_insn_length <= sizeof (c1->initial_instructions)
241 1.1 skrll && memcmp (c1->initial_instructions,
242 1.1 skrll c2->initial_instructions,
243 1.1 skrll c1->initial_insn_length) == 0)
244 1.1 skrll return 1;
245 1.1 skrll
246 1.1 skrll return 0;
247 1.1 skrll }
248 1.1 skrll
249 1.1 skrll static hashval_t
250 1.1 skrll cie_hash (const void *e)
251 1.1 skrll {
252 1.3 christos const struct cie *c = (const struct cie *) e;
253 1.1 skrll return c->hash;
254 1.1 skrll }
255 1.1 skrll
256 1.1 skrll static hashval_t
257 1.1 skrll cie_compute_hash (struct cie *c)
258 1.1 skrll {
259 1.1 skrll hashval_t h = 0;
260 1.5 christos size_t len;
261 1.1 skrll h = iterative_hash_object (c->length, h);
262 1.1 skrll h = iterative_hash_object (c->version, h);
263 1.1 skrll h = iterative_hash (c->augmentation, strlen (c->augmentation) + 1, h);
264 1.1 skrll h = iterative_hash_object (c->code_align, h);
265 1.1 skrll h = iterative_hash_object (c->data_align, h);
266 1.1 skrll h = iterative_hash_object (c->ra_column, h);
267 1.1 skrll h = iterative_hash_object (c->augmentation_size, h);
268 1.1 skrll h = iterative_hash_object (c->personality, h);
269 1.5 christos h = iterative_hash_object (c->cie_inf->u.cie.u.sec->output_section, h);
270 1.1 skrll h = iterative_hash_object (c->per_encoding, h);
271 1.1 skrll h = iterative_hash_object (c->lsda_encoding, h);
272 1.1 skrll h = iterative_hash_object (c->fde_encoding, h);
273 1.1 skrll h = iterative_hash_object (c->initial_insn_length, h);
274 1.5 christos len = c->initial_insn_length;
275 1.5 christos if (len > sizeof (c->initial_instructions))
276 1.5 christos len = sizeof (c->initial_instructions);
277 1.5 christos h = iterative_hash (c->initial_instructions, len, h);
278 1.1 skrll c->hash = h;
279 1.1 skrll return h;
280 1.1 skrll }
281 1.1 skrll
282 1.1 skrll /* Return the number of extra bytes that we'll be inserting into
283 1.1 skrll ENTRY's augmentation string. */
284 1.1 skrll
285 1.10 christos static inline unsigned int
286 1.1 skrll extra_augmentation_string_bytes (struct eh_cie_fde *entry)
287 1.1 skrll {
288 1.1 skrll unsigned int size = 0;
289 1.1 skrll if (entry->cie)
290 1.1 skrll {
291 1.1 skrll if (entry->add_augmentation_size)
292 1.1 skrll size++;
293 1.1 skrll if (entry->u.cie.add_fde_encoding)
294 1.1 skrll size++;
295 1.1 skrll }
296 1.1 skrll return size;
297 1.1 skrll }
298 1.1 skrll
299 1.1 skrll /* Likewise ENTRY's augmentation data. */
300 1.1 skrll
301 1.10 christos static inline unsigned int
302 1.1 skrll extra_augmentation_data_bytes (struct eh_cie_fde *entry)
303 1.1 skrll {
304 1.1 skrll unsigned int size = 0;
305 1.1 skrll if (entry->add_augmentation_size)
306 1.1 skrll size++;
307 1.1 skrll if (entry->cie && entry->u.cie.add_fde_encoding)
308 1.1 skrll size++;
309 1.1 skrll return size;
310 1.1 skrll }
311 1.1 skrll
312 1.7 christos /* Return the size that ENTRY will have in the output. */
313 1.1 skrll
314 1.1 skrll static unsigned int
315 1.7 christos size_of_output_cie_fde (struct eh_cie_fde *entry)
316 1.1 skrll {
317 1.1 skrll if (entry->removed)
318 1.1 skrll return 0;
319 1.1 skrll if (entry->size == 4)
320 1.1 skrll return 4;
321 1.1 skrll return (entry->size
322 1.1 skrll + extra_augmentation_string_bytes (entry)
323 1.7 christos + extra_augmentation_data_bytes (entry));
324 1.7 christos }
325 1.7 christos
326 1.7 christos /* Return the offset of the FDE or CIE after ENT. */
327 1.7 christos
328 1.7 christos static unsigned int
329 1.7 christos next_cie_fde_offset (const struct eh_cie_fde *ent,
330 1.7 christos const struct eh_cie_fde *last,
331 1.7 christos const asection *sec)
332 1.7 christos {
333 1.7 christos while (++ent < last)
334 1.7 christos {
335 1.7 christos if (!ent->removed)
336 1.7 christos return ent->new_offset;
337 1.7 christos }
338 1.7 christos return sec->size;
339 1.1 skrll }
340 1.1 skrll
341 1.1 skrll /* Assume that the bytes between *ITER and END are CFA instructions.
342 1.1 skrll Try to move *ITER past the first instruction and return true on
343 1.1 skrll success. ENCODED_PTR_WIDTH gives the width of pointer entries. */
344 1.1 skrll
345 1.10 christos static bool
346 1.1 skrll skip_cfa_op (bfd_byte **iter, bfd_byte *end, unsigned int encoded_ptr_width)
347 1.1 skrll {
348 1.1 skrll bfd_byte op;
349 1.1 skrll bfd_vma length;
350 1.1 skrll
351 1.1 skrll if (!read_byte (iter, end, &op))
352 1.10 christos return false;
353 1.1 skrll
354 1.1 skrll switch (op & 0xc0 ? op & 0xc0 : op)
355 1.1 skrll {
356 1.1 skrll case DW_CFA_nop:
357 1.1 skrll case DW_CFA_advance_loc:
358 1.1 skrll case DW_CFA_restore:
359 1.1 skrll case DW_CFA_remember_state:
360 1.1 skrll case DW_CFA_restore_state:
361 1.1 skrll case DW_CFA_GNU_window_save:
362 1.1 skrll /* No arguments. */
363 1.10 christos return true;
364 1.1 skrll
365 1.1 skrll case DW_CFA_offset:
366 1.1 skrll case DW_CFA_restore_extended:
367 1.1 skrll case DW_CFA_undefined:
368 1.1 skrll case DW_CFA_same_value:
369 1.1 skrll case DW_CFA_def_cfa_register:
370 1.1 skrll case DW_CFA_def_cfa_offset:
371 1.1 skrll case DW_CFA_def_cfa_offset_sf:
372 1.1 skrll case DW_CFA_GNU_args_size:
373 1.1 skrll /* One leb128 argument. */
374 1.1 skrll return skip_leb128 (iter, end);
375 1.1 skrll
376 1.1 skrll case DW_CFA_val_offset:
377 1.1 skrll case DW_CFA_val_offset_sf:
378 1.1 skrll case DW_CFA_offset_extended:
379 1.1 skrll case DW_CFA_register:
380 1.1 skrll case DW_CFA_def_cfa:
381 1.1 skrll case DW_CFA_offset_extended_sf:
382 1.1 skrll case DW_CFA_GNU_negative_offset_extended:
383 1.1 skrll case DW_CFA_def_cfa_sf:
384 1.1 skrll /* Two leb128 arguments. */
385 1.1 skrll return (skip_leb128 (iter, end)
386 1.1 skrll && skip_leb128 (iter, end));
387 1.1 skrll
388 1.1 skrll case DW_CFA_def_cfa_expression:
389 1.1 skrll /* A variable-length argument. */
390 1.1 skrll return (read_uleb128 (iter, end, &length)
391 1.1 skrll && skip_bytes (iter, end, length));
392 1.1 skrll
393 1.1 skrll case DW_CFA_expression:
394 1.1 skrll case DW_CFA_val_expression:
395 1.1 skrll /* A leb128 followed by a variable-length argument. */
396 1.1 skrll return (skip_leb128 (iter, end)
397 1.1 skrll && read_uleb128 (iter, end, &length)
398 1.1 skrll && skip_bytes (iter, end, length));
399 1.1 skrll
400 1.1 skrll case DW_CFA_set_loc:
401 1.1 skrll return skip_bytes (iter, end, encoded_ptr_width);
402 1.1 skrll
403 1.1 skrll case DW_CFA_advance_loc1:
404 1.1 skrll return skip_bytes (iter, end, 1);
405 1.1 skrll
406 1.1 skrll case DW_CFA_advance_loc2:
407 1.1 skrll return skip_bytes (iter, end, 2);
408 1.1 skrll
409 1.1 skrll case DW_CFA_advance_loc4:
410 1.1 skrll return skip_bytes (iter, end, 4);
411 1.1 skrll
412 1.1 skrll case DW_CFA_MIPS_advance_loc8:
413 1.1 skrll return skip_bytes (iter, end, 8);
414 1.1 skrll
415 1.1 skrll default:
416 1.10 christos return false;
417 1.1 skrll }
418 1.1 skrll }
419 1.1 skrll
420 1.1 skrll /* Try to interpret the bytes between BUF and END as CFA instructions.
421 1.1 skrll If every byte makes sense, return a pointer to the first DW_CFA_nop
422 1.1 skrll padding byte, or END if there is no padding. Return null otherwise.
423 1.1 skrll ENCODED_PTR_WIDTH is as for skip_cfa_op. */
424 1.1 skrll
425 1.1 skrll static bfd_byte *
426 1.1 skrll skip_non_nops (bfd_byte *buf, bfd_byte *end, unsigned int encoded_ptr_width,
427 1.1 skrll unsigned int *set_loc_count)
428 1.1 skrll {
429 1.1 skrll bfd_byte *last;
430 1.1 skrll
431 1.1 skrll last = buf;
432 1.1 skrll while (buf < end)
433 1.1 skrll if (*buf == DW_CFA_nop)
434 1.1 skrll buf++;
435 1.1 skrll else
436 1.1 skrll {
437 1.1 skrll if (*buf == DW_CFA_set_loc)
438 1.1 skrll ++*set_loc_count;
439 1.1 skrll if (!skip_cfa_op (&buf, end, encoded_ptr_width))
440 1.1 skrll return 0;
441 1.1 skrll last = buf;
442 1.1 skrll }
443 1.1 skrll return last;
444 1.1 skrll }
445 1.1 skrll
446 1.3 christos /* Convert absolute encoding ENCODING into PC-relative form.
447 1.3 christos SIZE is the size of a pointer. */
448 1.3 christos
449 1.3 christos static unsigned char
450 1.3 christos make_pc_relative (unsigned char encoding, unsigned int ptr_size)
451 1.3 christos {
452 1.3 christos if ((encoding & 0x7f) == DW_EH_PE_absptr)
453 1.3 christos switch (ptr_size)
454 1.3 christos {
455 1.3 christos case 2:
456 1.3 christos encoding |= DW_EH_PE_sdata2;
457 1.3 christos break;
458 1.3 christos case 4:
459 1.3 christos encoding |= DW_EH_PE_sdata4;
460 1.3 christos break;
461 1.3 christos case 8:
462 1.3 christos encoding |= DW_EH_PE_sdata8;
463 1.3 christos break;
464 1.3 christos }
465 1.3 christos return encoding | DW_EH_PE_pcrel;
466 1.3 christos }
467 1.3 christos
468 1.5 christos /* Examine each .eh_frame_entry section and discard those
469 1.5 christos those that are marked SEC_EXCLUDE. */
470 1.1 skrll
471 1.5 christos static void
472 1.5 christos bfd_elf_discard_eh_frame_entry (struct eh_frame_hdr_info *hdr_info)
473 1.5 christos {
474 1.5 christos unsigned int i;
475 1.5 christos for (i = 0; i < hdr_info->array_count; i++)
476 1.5 christos {
477 1.5 christos if (hdr_info->u.compact.entries[i]->flags & SEC_EXCLUDE)
478 1.5 christos {
479 1.5 christos unsigned int j;
480 1.5 christos for (j = i + 1; j < hdr_info->array_count; j++)
481 1.5 christos hdr_info->u.compact.entries[j-1] = hdr_info->u.compact.entries[j];
482 1.5 christos
483 1.5 christos hdr_info->array_count--;
484 1.5 christos hdr_info->u.compact.entries[hdr_info->array_count] = NULL;
485 1.5 christos i--;
486 1.7 christos }
487 1.5 christos }
488 1.5 christos }
489 1.5 christos
490 1.5 christos /* Add a .eh_frame_entry section. */
491 1.5 christos
492 1.5 christos static void
493 1.5 christos bfd_elf_record_eh_frame_entry (struct eh_frame_hdr_info *hdr_info,
494 1.5 christos asection *sec)
495 1.5 christos {
496 1.5 christos if (hdr_info->array_count == hdr_info->u.compact.allocated_entries)
497 1.5 christos {
498 1.5 christos if (hdr_info->u.compact.allocated_entries == 0)
499 1.5 christos {
500 1.10 christos hdr_info->frame_hdr_is_compact = true;
501 1.5 christos hdr_info->u.compact.allocated_entries = 2;
502 1.5 christos hdr_info->u.compact.entries =
503 1.5 christos bfd_malloc (hdr_info->u.compact.allocated_entries
504 1.5 christos * sizeof (hdr_info->u.compact.entries[0]));
505 1.5 christos }
506 1.5 christos else
507 1.5 christos {
508 1.5 christos hdr_info->u.compact.allocated_entries *= 2;
509 1.5 christos hdr_info->u.compact.entries =
510 1.5 christos bfd_realloc (hdr_info->u.compact.entries,
511 1.5 christos hdr_info->u.compact.allocated_entries
512 1.5 christos * sizeof (hdr_info->u.compact.entries[0]));
513 1.5 christos }
514 1.5 christos
515 1.5 christos BFD_ASSERT (hdr_info->u.compact.entries);
516 1.5 christos }
517 1.5 christos
518 1.5 christos hdr_info->u.compact.entries[hdr_info->array_count++] = sec;
519 1.5 christos }
520 1.5 christos
521 1.5 christos /* Parse a .eh_frame_entry section. Figure out which text section it
522 1.5 christos references. */
523 1.5 christos
524 1.10 christos bool
525 1.5 christos _bfd_elf_parse_eh_frame_entry (struct bfd_link_info *info,
526 1.5 christos asection *sec, struct elf_reloc_cookie *cookie)
527 1.1 skrll {
528 1.5 christos struct elf_link_hash_table *htab;
529 1.1 skrll struct eh_frame_hdr_info *hdr_info;
530 1.5 christos unsigned long r_symndx;
531 1.5 christos asection *text_sec;
532 1.5 christos
533 1.5 christos htab = elf_hash_table (info);
534 1.5 christos hdr_info = &htab->eh_info;
535 1.5 christos
536 1.5 christos if (sec->size == 0
537 1.5 christos || sec->sec_info_type != SEC_INFO_TYPE_NONE)
538 1.5 christos {
539 1.10 christos return true;
540 1.5 christos }
541 1.5 christos
542 1.5 christos if (sec->output_section && bfd_is_abs_section (sec->output_section))
543 1.5 christos {
544 1.5 christos /* At least one of the sections is being discarded from the
545 1.5 christos link, so we should just ignore them. */
546 1.10 christos return true;
547 1.5 christos }
548 1.1 skrll
549 1.5 christos if (cookie->rel == cookie->relend)
550 1.10 christos return false;
551 1.5 christos
552 1.5 christos /* The first relocation is the function start. */
553 1.5 christos r_symndx = cookie->rel->r_info >> cookie->r_sym_shift;
554 1.5 christos if (r_symndx == STN_UNDEF)
555 1.10 christos return false;
556 1.5 christos
557 1.10 christos text_sec = _bfd_elf_section_for_symbol (cookie, r_symndx, false);
558 1.5 christos
559 1.5 christos if (text_sec == NULL)
560 1.10 christos return false;
561 1.5 christos
562 1.5 christos elf_section_eh_frame_entry (text_sec) = sec;
563 1.5 christos if (text_sec->output_section
564 1.5 christos && bfd_is_abs_section (text_sec->output_section))
565 1.5 christos sec->flags |= SEC_EXCLUDE;
566 1.5 christos
567 1.5 christos sec->sec_info_type = SEC_INFO_TYPE_EH_FRAME_ENTRY;
568 1.5 christos elf_section_data (sec)->sec_info = text_sec;
569 1.5 christos bfd_elf_record_eh_frame_entry (hdr_info, sec);
570 1.10 christos return true;
571 1.1 skrll }
572 1.1 skrll
573 1.1 skrll /* Try to parse .eh_frame section SEC, which belongs to ABFD. Store the
574 1.1 skrll information in the section's sec_info field on success. COOKIE
575 1.1 skrll describes the relocations in SEC. */
576 1.1 skrll
577 1.1 skrll void
578 1.1 skrll _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
579 1.1 skrll asection *sec, struct elf_reloc_cookie *cookie)
580 1.1 skrll {
581 1.1 skrll #define REQUIRE(COND) \
582 1.1 skrll do \
583 1.1 skrll if (!(COND)) \
584 1.1 skrll goto free_no_table; \
585 1.1 skrll while (0)
586 1.1 skrll
587 1.1 skrll bfd_byte *ehbuf = NULL, *buf, *end;
588 1.1 skrll bfd_byte *last_fde;
589 1.1 skrll struct eh_cie_fde *this_inf;
590 1.1 skrll unsigned int hdr_length, hdr_id;
591 1.1 skrll unsigned int cie_count;
592 1.1 skrll struct cie *cie, *local_cies = NULL;
593 1.1 skrll struct elf_link_hash_table *htab;
594 1.1 skrll struct eh_frame_hdr_info *hdr_info;
595 1.1 skrll struct eh_frame_sec_info *sec_info = NULL;
596 1.1 skrll unsigned int ptr_size;
597 1.1 skrll unsigned int num_cies;
598 1.1 skrll unsigned int num_entries;
599 1.1 skrll elf_gc_mark_hook_fn gc_mark_hook;
600 1.1 skrll
601 1.1 skrll htab = elf_hash_table (info);
602 1.1 skrll hdr_info = &htab->eh_info;
603 1.1 skrll
604 1.4 christos if (sec->size == 0
605 1.11 christos || (sec->flags & SEC_HAS_CONTENTS) == 0
606 1.4 christos || sec->sec_info_type != SEC_INFO_TYPE_NONE)
607 1.1 skrll {
608 1.1 skrll /* This file does not contain .eh_frame information. */
609 1.1 skrll return;
610 1.1 skrll }
611 1.1 skrll
612 1.1 skrll if (bfd_is_abs_section (sec->output_section))
613 1.1 skrll {
614 1.1 skrll /* At least one of the sections is being discarded from the
615 1.1 skrll link, so we should just ignore them. */
616 1.1 skrll return;
617 1.1 skrll }
618 1.1 skrll
619 1.1 skrll /* Read the frame unwind information from abfd. */
620 1.1 skrll
621 1.1 skrll REQUIRE (bfd_malloc_and_get_section (abfd, sec, &ehbuf));
622 1.1 skrll
623 1.1 skrll /* If .eh_frame section size doesn't fit into int, we cannot handle
624 1.1 skrll it (it would need to use 64-bit .eh_frame format anyway). */
625 1.1 skrll REQUIRE (sec->size == (unsigned int) sec->size);
626 1.1 skrll
627 1.1 skrll ptr_size = (get_elf_backend_data (abfd)
628 1.1 skrll ->elf_backend_eh_frame_address_size (abfd, sec));
629 1.1 skrll REQUIRE (ptr_size != 0);
630 1.1 skrll
631 1.1 skrll /* Go through the section contents and work out how many FDEs and
632 1.1 skrll CIEs there are. */
633 1.1 skrll buf = ehbuf;
634 1.1 skrll end = ehbuf + sec->size;
635 1.1 skrll num_cies = 0;
636 1.1 skrll num_entries = 0;
637 1.1 skrll while (buf != end)
638 1.1 skrll {
639 1.1 skrll num_entries++;
640 1.1 skrll
641 1.1 skrll /* Read the length of the entry. */
642 1.1 skrll REQUIRE (skip_bytes (&buf, end, 4));
643 1.1 skrll hdr_length = bfd_get_32 (abfd, buf - 4);
644 1.1 skrll
645 1.1 skrll /* 64-bit .eh_frame is not supported. */
646 1.1 skrll REQUIRE (hdr_length != 0xffffffff);
647 1.1 skrll if (hdr_length == 0)
648 1.1 skrll break;
649 1.1 skrll
650 1.1 skrll REQUIRE (skip_bytes (&buf, end, 4));
651 1.1 skrll hdr_id = bfd_get_32 (abfd, buf - 4);
652 1.1 skrll if (hdr_id == 0)
653 1.1 skrll num_cies++;
654 1.1 skrll
655 1.1 skrll REQUIRE (skip_bytes (&buf, end, hdr_length - 4));
656 1.1 skrll }
657 1.1 skrll
658 1.3 christos sec_info = (struct eh_frame_sec_info *)
659 1.3 christos bfd_zmalloc (sizeof (struct eh_frame_sec_info)
660 1.7 christos + (num_entries - 1) * sizeof (struct eh_cie_fde));
661 1.1 skrll REQUIRE (sec_info);
662 1.1 skrll
663 1.1 skrll /* We need to have a "struct cie" for each CIE in this section. */
664 1.7 christos if (num_cies)
665 1.7 christos {
666 1.7 christos local_cies = (struct cie *) bfd_zmalloc (num_cies * sizeof (*local_cies));
667 1.7 christos REQUIRE (local_cies);
668 1.7 christos }
669 1.1 skrll
670 1.3 christos /* FIXME: octets_per_byte. */
671 1.1 skrll #define ENSURE_NO_RELOCS(buf) \
672 1.5 christos while (cookie->rel < cookie->relend \
673 1.5 christos && (cookie->rel->r_offset \
674 1.5 christos < (bfd_size_type) ((buf) - ehbuf))) \
675 1.5 christos { \
676 1.5 christos REQUIRE (cookie->rel->r_info == 0); \
677 1.5 christos cookie->rel++; \
678 1.5 christos }
679 1.1 skrll
680 1.3 christos /* FIXME: octets_per_byte. */
681 1.1 skrll #define SKIP_RELOCS(buf) \
682 1.1 skrll while (cookie->rel < cookie->relend \
683 1.1 skrll && (cookie->rel->r_offset \
684 1.1 skrll < (bfd_size_type) ((buf) - ehbuf))) \
685 1.1 skrll cookie->rel++
686 1.1 skrll
687 1.3 christos /* FIXME: octets_per_byte. */
688 1.1 skrll #define GET_RELOC(buf) \
689 1.1 skrll ((cookie->rel < cookie->relend \
690 1.1 skrll && (cookie->rel->r_offset \
691 1.1 skrll == (bfd_size_type) ((buf) - ehbuf))) \
692 1.1 skrll ? cookie->rel : NULL)
693 1.1 skrll
694 1.1 skrll buf = ehbuf;
695 1.1 skrll cie_count = 0;
696 1.1 skrll gc_mark_hook = get_elf_backend_data (abfd)->gc_mark_hook;
697 1.1 skrll while ((bfd_size_type) (buf - ehbuf) != sec->size)
698 1.1 skrll {
699 1.1 skrll char *aug;
700 1.1 skrll bfd_byte *start, *insns, *insns_end;
701 1.1 skrll bfd_size_type length;
702 1.1 skrll unsigned int set_loc_count;
703 1.1 skrll
704 1.1 skrll this_inf = sec_info->entry + sec_info->count;
705 1.1 skrll last_fde = buf;
706 1.1 skrll
707 1.1 skrll /* Read the length of the entry. */
708 1.1 skrll REQUIRE (skip_bytes (&buf, ehbuf + sec->size, 4));
709 1.1 skrll hdr_length = bfd_get_32 (abfd, buf - 4);
710 1.1 skrll
711 1.1 skrll /* The CIE/FDE must be fully contained in this input section. */
712 1.1 skrll REQUIRE ((bfd_size_type) (buf - ehbuf) + hdr_length <= sec->size);
713 1.1 skrll end = buf + hdr_length;
714 1.1 skrll
715 1.1 skrll this_inf->offset = last_fde - ehbuf;
716 1.1 skrll this_inf->size = 4 + hdr_length;
717 1.1 skrll this_inf->reloc_index = cookie->rel - cookie->rels;
718 1.1 skrll
719 1.1 skrll if (hdr_length == 0)
720 1.1 skrll {
721 1.1 skrll /* A zero-length CIE should only be found at the end of
722 1.7 christos the section, but allow multiple terminators. */
723 1.7 christos while (skip_bytes (&buf, ehbuf + sec->size, 4))
724 1.7 christos REQUIRE (bfd_get_32 (abfd, buf - 4) == 0);
725 1.1 skrll REQUIRE ((bfd_size_type) (buf - ehbuf) == sec->size);
726 1.1 skrll ENSURE_NO_RELOCS (buf);
727 1.1 skrll sec_info->count++;
728 1.1 skrll break;
729 1.1 skrll }
730 1.1 skrll
731 1.1 skrll REQUIRE (skip_bytes (&buf, end, 4));
732 1.1 skrll hdr_id = bfd_get_32 (abfd, buf - 4);
733 1.1 skrll
734 1.1 skrll if (hdr_id == 0)
735 1.1 skrll {
736 1.1 skrll unsigned int initial_insn_length;
737 1.1 skrll
738 1.1 skrll /* CIE */
739 1.1 skrll this_inf->cie = 1;
740 1.1 skrll
741 1.1 skrll /* Point CIE to one of the section-local cie structures. */
742 1.1 skrll cie = local_cies + cie_count++;
743 1.1 skrll
744 1.1 skrll cie->cie_inf = this_inf;
745 1.1 skrll cie->length = hdr_length;
746 1.1 skrll start = buf;
747 1.1 skrll REQUIRE (read_byte (&buf, end, &cie->version));
748 1.1 skrll
749 1.1 skrll /* Cannot handle unknown versions. */
750 1.3 christos REQUIRE (cie->version == 1
751 1.3 christos || cie->version == 3
752 1.3 christos || cie->version == 4);
753 1.1 skrll REQUIRE (strlen ((char *) buf) < sizeof (cie->augmentation));
754 1.1 skrll
755 1.1 skrll strcpy (cie->augmentation, (char *) buf);
756 1.1 skrll buf = (bfd_byte *) strchr ((char *) buf, '\0') + 1;
757 1.7 christos this_inf->u.cie.aug_str_len = buf - start - 1;
758 1.1 skrll ENSURE_NO_RELOCS (buf);
759 1.1 skrll if (buf[0] == 'e' && buf[1] == 'h')
760 1.1 skrll {
761 1.1 skrll /* GCC < 3.0 .eh_frame CIE */
762 1.1 skrll /* We cannot merge "eh" CIEs because __EXCEPTION_TABLE__
763 1.1 skrll is private to each CIE, so we don't need it for anything.
764 1.1 skrll Just skip it. */
765 1.1 skrll REQUIRE (skip_bytes (&buf, end, ptr_size));
766 1.1 skrll SKIP_RELOCS (buf);
767 1.1 skrll }
768 1.3 christos if (cie->version >= 4)
769 1.3 christos {
770 1.3 christos REQUIRE (buf + 1 < end);
771 1.3 christos REQUIRE (buf[0] == ptr_size);
772 1.3 christos REQUIRE (buf[1] == 0);
773 1.3 christos buf += 2;
774 1.3 christos }
775 1.1 skrll REQUIRE (read_uleb128 (&buf, end, &cie->code_align));
776 1.1 skrll REQUIRE (read_sleb128 (&buf, end, &cie->data_align));
777 1.1 skrll if (cie->version == 1)
778 1.1 skrll {
779 1.1 skrll REQUIRE (buf < end);
780 1.1 skrll cie->ra_column = *buf++;
781 1.1 skrll }
782 1.1 skrll else
783 1.1 skrll REQUIRE (read_uleb128 (&buf, end, &cie->ra_column));
784 1.1 skrll ENSURE_NO_RELOCS (buf);
785 1.1 skrll cie->lsda_encoding = DW_EH_PE_omit;
786 1.1 skrll cie->fde_encoding = DW_EH_PE_omit;
787 1.1 skrll cie->per_encoding = DW_EH_PE_omit;
788 1.1 skrll aug = cie->augmentation;
789 1.1 skrll if (aug[0] != 'e' || aug[1] != 'h')
790 1.1 skrll {
791 1.1 skrll if (*aug == 'z')
792 1.1 skrll {
793 1.1 skrll aug++;
794 1.1 skrll REQUIRE (read_uleb128 (&buf, end, &cie->augmentation_size));
795 1.7 christos ENSURE_NO_RELOCS (buf);
796 1.1 skrll }
797 1.1 skrll
798 1.1 skrll while (*aug != '\0')
799 1.1 skrll switch (*aug++)
800 1.1 skrll {
801 1.9 christos case 'B':
802 1.9 christos break;
803 1.1 skrll case 'L':
804 1.1 skrll REQUIRE (read_byte (&buf, end, &cie->lsda_encoding));
805 1.1 skrll ENSURE_NO_RELOCS (buf);
806 1.1 skrll REQUIRE (get_DW_EH_PE_width (cie->lsda_encoding, ptr_size));
807 1.1 skrll break;
808 1.1 skrll case 'R':
809 1.1 skrll REQUIRE (read_byte (&buf, end, &cie->fde_encoding));
810 1.1 skrll ENSURE_NO_RELOCS (buf);
811 1.1 skrll REQUIRE (get_DW_EH_PE_width (cie->fde_encoding, ptr_size));
812 1.1 skrll break;
813 1.1 skrll case 'S':
814 1.1 skrll break;
815 1.1 skrll case 'P':
816 1.1 skrll {
817 1.1 skrll int per_width;
818 1.1 skrll
819 1.1 skrll REQUIRE (read_byte (&buf, end, &cie->per_encoding));
820 1.1 skrll per_width = get_DW_EH_PE_width (cie->per_encoding,
821 1.1 skrll ptr_size);
822 1.1 skrll REQUIRE (per_width);
823 1.3 christos if ((cie->per_encoding & 0x70) == DW_EH_PE_aligned)
824 1.1 skrll {
825 1.1 skrll length = -(buf - ehbuf) & (per_width - 1);
826 1.1 skrll REQUIRE (skip_bytes (&buf, end, length));
827 1.7 christos if (per_width == 8)
828 1.7 christos this_inf->u.cie.per_encoding_aligned8 = 1;
829 1.1 skrll }
830 1.3 christos this_inf->u.cie.personality_offset = buf - start;
831 1.1 skrll ENSURE_NO_RELOCS (buf);
832 1.1 skrll /* Ensure we have a reloc here. */
833 1.1 skrll REQUIRE (GET_RELOC (buf));
834 1.1 skrll cie->personality.reloc_index
835 1.1 skrll = cookie->rel - cookie->rels;
836 1.1 skrll /* Cope with MIPS-style composite relocations. */
837 1.1 skrll do
838 1.1 skrll cookie->rel++;
839 1.1 skrll while (GET_RELOC (buf) != NULL);
840 1.1 skrll REQUIRE (skip_bytes (&buf, end, per_width));
841 1.1 skrll }
842 1.1 skrll break;
843 1.1 skrll default:
844 1.1 skrll /* Unrecognized augmentation. Better bail out. */
845 1.1 skrll goto free_no_table;
846 1.1 skrll }
847 1.1 skrll }
848 1.7 christos this_inf->u.cie.aug_data_len
849 1.7 christos = buf - start - 1 - this_inf->u.cie.aug_str_len;
850 1.1 skrll
851 1.1 skrll /* For shared libraries, try to get rid of as many RELATIVE relocs
852 1.1 skrll as possible. */
853 1.5 christos if (bfd_link_pic (info)
854 1.1 skrll && (get_elf_backend_data (abfd)
855 1.1 skrll ->elf_backend_can_make_relative_eh_frame
856 1.1 skrll (abfd, info, sec)))
857 1.1 skrll {
858 1.3 christos if ((cie->fde_encoding & 0x70) == DW_EH_PE_absptr)
859 1.1 skrll this_inf->make_relative = 1;
860 1.1 skrll /* If the CIE doesn't already have an 'R' entry, it's fairly
861 1.1 skrll easy to add one, provided that there's no aligned data
862 1.1 skrll after the augmentation string. */
863 1.1 skrll else if (cie->fde_encoding == DW_EH_PE_omit
864 1.3 christos && (cie->per_encoding & 0x70) != DW_EH_PE_aligned)
865 1.1 skrll {
866 1.1 skrll if (*cie->augmentation == 0)
867 1.1 skrll this_inf->add_augmentation_size = 1;
868 1.1 skrll this_inf->u.cie.add_fde_encoding = 1;
869 1.1 skrll this_inf->make_relative = 1;
870 1.1 skrll }
871 1.3 christos
872 1.3 christos if ((cie->lsda_encoding & 0x70) == DW_EH_PE_absptr)
873 1.3 christos cie->can_make_lsda_relative = 1;
874 1.1 skrll }
875 1.1 skrll
876 1.1 skrll /* If FDE encoding was not specified, it defaults to
877 1.1 skrll DW_EH_absptr. */
878 1.1 skrll if (cie->fde_encoding == DW_EH_PE_omit)
879 1.1 skrll cie->fde_encoding = DW_EH_PE_absptr;
880 1.1 skrll
881 1.1 skrll initial_insn_length = end - buf;
882 1.5 christos cie->initial_insn_length = initial_insn_length;
883 1.5 christos memcpy (cie->initial_instructions, buf,
884 1.5 christos initial_insn_length <= sizeof (cie->initial_instructions)
885 1.5 christos ? initial_insn_length : sizeof (cie->initial_instructions));
886 1.1 skrll insns = buf;
887 1.1 skrll buf += initial_insn_length;
888 1.1 skrll ENSURE_NO_RELOCS (buf);
889 1.1 skrll
890 1.5 christos if (!bfd_link_relocatable (info))
891 1.5 christos {
892 1.5 christos /* Keep info for merging cies. */
893 1.5 christos this_inf->u.cie.u.full_cie = cie;
894 1.5 christos this_inf->u.cie.per_encoding_relative
895 1.5 christos = (cie->per_encoding & 0x70) == DW_EH_PE_pcrel;
896 1.5 christos }
897 1.1 skrll }
898 1.1 skrll else
899 1.1 skrll {
900 1.1 skrll /* Find the corresponding CIE. */
901 1.1 skrll unsigned int cie_offset = this_inf->offset + 4 - hdr_id;
902 1.1 skrll for (cie = local_cies; cie < local_cies + cie_count; cie++)
903 1.1 skrll if (cie_offset == cie->cie_inf->offset)
904 1.1 skrll break;
905 1.1 skrll
906 1.1 skrll /* Ensure this FDE references one of the CIEs in this input
907 1.1 skrll section. */
908 1.1 skrll REQUIRE (cie != local_cies + cie_count);
909 1.1 skrll this_inf->u.fde.cie_inf = cie->cie_inf;
910 1.1 skrll this_inf->make_relative = cie->cie_inf->make_relative;
911 1.1 skrll this_inf->add_augmentation_size
912 1.1 skrll = cie->cie_inf->add_augmentation_size;
913 1.1 skrll
914 1.1 skrll ENSURE_NO_RELOCS (buf);
915 1.4 christos if ((sec->flags & SEC_LINKER_CREATED) == 0 || cookie->rels != NULL)
916 1.4 christos {
917 1.4 christos asection *rsec;
918 1.4 christos
919 1.4 christos REQUIRE (GET_RELOC (buf));
920 1.1 skrll
921 1.4 christos /* Chain together the FDEs for each section. */
922 1.5 christos rsec = _bfd_elf_gc_mark_rsec (info, sec, gc_mark_hook,
923 1.5 christos cookie, NULL);
924 1.4 christos /* RSEC will be NULL if FDE was cleared out as it was belonging to
925 1.4 christos a discarded SHT_GROUP. */
926 1.4 christos if (rsec)
927 1.4 christos {
928 1.4 christos REQUIRE (rsec->owner == abfd);
929 1.4 christos this_inf->u.fde.next_for_section = elf_fde_list (rsec);
930 1.4 christos elf_fde_list (rsec) = this_inf;
931 1.4 christos }
932 1.1 skrll }
933 1.1 skrll
934 1.1 skrll /* Skip the initial location and address range. */
935 1.1 skrll start = buf;
936 1.1 skrll length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
937 1.1 skrll REQUIRE (skip_bytes (&buf, end, 2 * length));
938 1.1 skrll
939 1.5 christos SKIP_RELOCS (buf - length);
940 1.5 christos if (!GET_RELOC (buf - length)
941 1.10 christos && read_value (abfd, buf - length, length, false) == 0)
942 1.5 christos {
943 1.5 christos (*info->callbacks->minfo)
944 1.7 christos /* xgettext:c-format */
945 1.8 christos (_("discarding zero address range FDE in %pB(%pA).\n"),
946 1.5 christos abfd, sec);
947 1.5 christos this_inf->u.fde.cie_inf = NULL;
948 1.5 christos }
949 1.5 christos
950 1.1 skrll /* Skip the augmentation size, if present. */
951 1.1 skrll if (cie->augmentation[0] == 'z')
952 1.1 skrll REQUIRE (read_uleb128 (&buf, end, &length));
953 1.1 skrll else
954 1.1 skrll length = 0;
955 1.1 skrll
956 1.1 skrll /* Of the supported augmentation characters above, only 'L'
957 1.1 skrll adds augmentation data to the FDE. This code would need to
958 1.1 skrll be adjusted if any future augmentations do the same thing. */
959 1.1 skrll if (cie->lsda_encoding != DW_EH_PE_omit)
960 1.1 skrll {
961 1.1 skrll SKIP_RELOCS (buf);
962 1.1 skrll if (cie->can_make_lsda_relative && GET_RELOC (buf))
963 1.1 skrll cie->cie_inf->u.cie.make_lsda_relative = 1;
964 1.1 skrll this_inf->lsda_offset = buf - start;
965 1.1 skrll /* If there's no 'z' augmentation, we don't know where the
966 1.1 skrll CFA insns begin. Assume no padding. */
967 1.1 skrll if (cie->augmentation[0] != 'z')
968 1.1 skrll length = end - buf;
969 1.1 skrll }
970 1.1 skrll
971 1.1 skrll /* Skip over the augmentation data. */
972 1.1 skrll REQUIRE (skip_bytes (&buf, end, length));
973 1.1 skrll insns = buf;
974 1.1 skrll
975 1.1 skrll buf = last_fde + 4 + hdr_length;
976 1.1 skrll
977 1.2 skrll /* For NULL RSEC (cleared FDE belonging to a discarded section)
978 1.2 skrll the relocations are commonly cleared. We do not sanity check if
979 1.2 skrll all these relocations are cleared as (1) relocations to
980 1.2 skrll .gcc_except_table will remain uncleared (they will get dropped
981 1.2 skrll with the drop of this unused FDE) and (2) BFD already safely drops
982 1.2 skrll relocations of any type to .eh_frame by
983 1.2 skrll elf_section_ignore_discarded_relocs.
984 1.2 skrll TODO: The .gcc_except_table entries should be also filtered as
985 1.2 skrll .eh_frame entries; or GCC could rather use COMDAT for them. */
986 1.2 skrll SKIP_RELOCS (buf);
987 1.1 skrll }
988 1.1 skrll
989 1.1 skrll /* Try to interpret the CFA instructions and find the first
990 1.1 skrll padding nop. Shrink this_inf's size so that it doesn't
991 1.1 skrll include the padding. */
992 1.1 skrll length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
993 1.1 skrll set_loc_count = 0;
994 1.1 skrll insns_end = skip_non_nops (insns, end, length, &set_loc_count);
995 1.1 skrll /* If we don't understand the CFA instructions, we can't know
996 1.1 skrll what needs to be adjusted there. */
997 1.1 skrll if (insns_end == NULL
998 1.1 skrll /* For the time being we don't support DW_CFA_set_loc in
999 1.1 skrll CIE instructions. */
1000 1.1 skrll || (set_loc_count && this_inf->cie))
1001 1.1 skrll goto free_no_table;
1002 1.1 skrll this_inf->size -= end - insns_end;
1003 1.1 skrll if (insns_end != end && this_inf->cie)
1004 1.1 skrll {
1005 1.1 skrll cie->initial_insn_length -= end - insns_end;
1006 1.1 skrll cie->length -= end - insns_end;
1007 1.1 skrll }
1008 1.1 skrll if (set_loc_count
1009 1.3 christos && ((cie->fde_encoding & 0x70) == DW_EH_PE_pcrel
1010 1.1 skrll || this_inf->make_relative))
1011 1.1 skrll {
1012 1.1 skrll unsigned int cnt;
1013 1.1 skrll bfd_byte *p;
1014 1.1 skrll
1015 1.3 christos this_inf->set_loc = (unsigned int *)
1016 1.7 christos bfd_malloc ((set_loc_count + 1) * sizeof (unsigned int));
1017 1.1 skrll REQUIRE (this_inf->set_loc);
1018 1.1 skrll this_inf->set_loc[0] = set_loc_count;
1019 1.1 skrll p = insns;
1020 1.1 skrll cnt = 0;
1021 1.1 skrll while (p < end)
1022 1.1 skrll {
1023 1.1 skrll if (*p == DW_CFA_set_loc)
1024 1.1 skrll this_inf->set_loc[++cnt] = p + 1 - start;
1025 1.1 skrll REQUIRE (skip_cfa_op (&p, end, length));
1026 1.1 skrll }
1027 1.1 skrll }
1028 1.1 skrll
1029 1.1 skrll this_inf->removed = 1;
1030 1.1 skrll this_inf->fde_encoding = cie->fde_encoding;
1031 1.1 skrll this_inf->lsda_encoding = cie->lsda_encoding;
1032 1.1 skrll sec_info->count++;
1033 1.1 skrll }
1034 1.1 skrll BFD_ASSERT (sec_info->count == num_entries);
1035 1.1 skrll BFD_ASSERT (cie_count == num_cies);
1036 1.1 skrll
1037 1.1 skrll elf_section_data (sec)->sec_info = sec_info;
1038 1.4 christos sec->sec_info_type = SEC_INFO_TYPE_EH_FRAME;
1039 1.5 christos if (!bfd_link_relocatable (info))
1040 1.1 skrll {
1041 1.5 christos /* Keep info for merging cies. */
1042 1.1 skrll sec_info->cies = local_cies;
1043 1.1 skrll local_cies = NULL;
1044 1.1 skrll }
1045 1.1 skrll goto success;
1046 1.1 skrll
1047 1.1 skrll free_no_table:
1048 1.8 christos _bfd_error_handler
1049 1.7 christos /* xgettext:c-format */
1050 1.8 christos (_("error in %pB(%pA); no .eh_frame_hdr table will be created"),
1051 1.1 skrll abfd, sec);
1052 1.10 christos hdr_info->u.dwarf.table = false;
1053 1.10 christos free (sec_info);
1054 1.1 skrll success:
1055 1.10 christos free (ehbuf);
1056 1.10 christos free (local_cies);
1057 1.1 skrll #undef REQUIRE
1058 1.1 skrll }
1059 1.1 skrll
1060 1.5 christos /* Order eh_frame_hdr entries by the VMA of their text section. */
1061 1.5 christos
1062 1.5 christos static int
1063 1.5 christos cmp_eh_frame_hdr (const void *a, const void *b)
1064 1.5 christos {
1065 1.5 christos bfd_vma text_a;
1066 1.5 christos bfd_vma text_b;
1067 1.5 christos asection *sec;
1068 1.5 christos
1069 1.5 christos sec = *(asection *const *)a;
1070 1.5 christos sec = (asection *) elf_section_data (sec)->sec_info;
1071 1.5 christos text_a = sec->output_section->vma + sec->output_offset;
1072 1.5 christos sec = *(asection *const *)b;
1073 1.5 christos sec = (asection *) elf_section_data (sec)->sec_info;
1074 1.5 christos text_b = sec->output_section->vma + sec->output_offset;
1075 1.5 christos
1076 1.5 christos if (text_a < text_b)
1077 1.5 christos return -1;
1078 1.5 christos return text_a > text_b;
1079 1.5 christos
1080 1.5 christos }
1081 1.5 christos
1082 1.5 christos /* Add space for a CANTUNWIND terminator to SEC if the text sections
1083 1.5 christos referenced by it and NEXT are not contiguous, or NEXT is NULL. */
1084 1.5 christos
1085 1.5 christos static void
1086 1.5 christos add_eh_frame_hdr_terminator (asection *sec,
1087 1.5 christos asection *next)
1088 1.5 christos {
1089 1.5 christos bfd_vma end;
1090 1.5 christos bfd_vma next_start;
1091 1.5 christos asection *text_sec;
1092 1.5 christos
1093 1.5 christos if (next)
1094 1.5 christos {
1095 1.5 christos /* See if there is a gap (presumably a text section without unwind info)
1096 1.5 christos between these two entries. */
1097 1.5 christos text_sec = (asection *) elf_section_data (sec)->sec_info;
1098 1.5 christos end = text_sec->output_section->vma + text_sec->output_offset
1099 1.5 christos + text_sec->size;
1100 1.5 christos text_sec = (asection *) elf_section_data (next)->sec_info;
1101 1.5 christos next_start = text_sec->output_section->vma + text_sec->output_offset;
1102 1.5 christos if (end == next_start)
1103 1.5 christos return;
1104 1.5 christos }
1105 1.5 christos
1106 1.5 christos /* Add space for a CANTUNWIND terminator. */
1107 1.5 christos if (!sec->rawsize)
1108 1.5 christos sec->rawsize = sec->size;
1109 1.5 christos
1110 1.9 christos bfd_set_section_size (sec, sec->size + 8);
1111 1.5 christos }
1112 1.5 christos
1113 1.5 christos /* Finish a pass over all .eh_frame_entry sections. */
1114 1.1 skrll
1115 1.10 christos bool
1116 1.1 skrll _bfd_elf_end_eh_frame_parsing (struct bfd_link_info *info)
1117 1.1 skrll {
1118 1.1 skrll struct eh_frame_hdr_info *hdr_info;
1119 1.5 christos unsigned int i;
1120 1.1 skrll
1121 1.1 skrll hdr_info = &elf_hash_table (info)->eh_info;
1122 1.5 christos
1123 1.5 christos if (info->eh_frame_hdr_type != COMPACT_EH_HDR
1124 1.5 christos || hdr_info->array_count == 0)
1125 1.10 christos return false;
1126 1.5 christos
1127 1.5 christos bfd_elf_discard_eh_frame_entry (hdr_info);
1128 1.5 christos
1129 1.5 christos qsort (hdr_info->u.compact.entries, hdr_info->array_count,
1130 1.5 christos sizeof (asection *), cmp_eh_frame_hdr);
1131 1.5 christos
1132 1.5 christos for (i = 0; i < hdr_info->array_count - 1; i++)
1133 1.5 christos {
1134 1.5 christos add_eh_frame_hdr_terminator (hdr_info->u.compact.entries[i],
1135 1.5 christos hdr_info->u.compact.entries[i + 1]);
1136 1.5 christos }
1137 1.5 christos
1138 1.5 christos /* Add a CANTUNWIND terminator after the last entry. */
1139 1.5 christos add_eh_frame_hdr_terminator (hdr_info->u.compact.entries[i], NULL);
1140 1.10 christos return true;
1141 1.1 skrll }
1142 1.1 skrll
1143 1.1 skrll /* Mark all relocations against CIE or FDE ENT, which occurs in
1144 1.1 skrll .eh_frame section SEC. COOKIE describes the relocations in SEC;
1145 1.1 skrll its "rel" field can be changed freely. */
1146 1.1 skrll
1147 1.10 christos static bool
1148 1.1 skrll mark_entry (struct bfd_link_info *info, asection *sec,
1149 1.1 skrll struct eh_cie_fde *ent, elf_gc_mark_hook_fn gc_mark_hook,
1150 1.1 skrll struct elf_reloc_cookie *cookie)
1151 1.1 skrll {
1152 1.3 christos /* FIXME: octets_per_byte. */
1153 1.1 skrll for (cookie->rel = cookie->rels + ent->reloc_index;
1154 1.1 skrll cookie->rel < cookie->relend
1155 1.1 skrll && cookie->rel->r_offset < ent->offset + ent->size;
1156 1.1 skrll cookie->rel++)
1157 1.1 skrll if (!_bfd_elf_gc_mark_reloc (info, sec, gc_mark_hook, cookie))
1158 1.10 christos return false;
1159 1.1 skrll
1160 1.10 christos return true;
1161 1.1 skrll }
1162 1.1 skrll
1163 1.1 skrll /* Mark all the relocations against FDEs that relate to code in input
1164 1.1 skrll section SEC. The FDEs belong to .eh_frame section EH_FRAME, whose
1165 1.1 skrll relocations are described by COOKIE. */
1166 1.1 skrll
1167 1.10 christos bool
1168 1.1 skrll _bfd_elf_gc_mark_fdes (struct bfd_link_info *info, asection *sec,
1169 1.1 skrll asection *eh_frame, elf_gc_mark_hook_fn gc_mark_hook,
1170 1.1 skrll struct elf_reloc_cookie *cookie)
1171 1.1 skrll {
1172 1.1 skrll struct eh_cie_fde *fde, *cie;
1173 1.1 skrll
1174 1.1 skrll for (fde = elf_fde_list (sec); fde; fde = fde->u.fde.next_for_section)
1175 1.1 skrll {
1176 1.1 skrll if (!mark_entry (info, eh_frame, fde, gc_mark_hook, cookie))
1177 1.10 christos return false;
1178 1.1 skrll
1179 1.1 skrll /* At this stage, all cie_inf fields point to local CIEs, so we
1180 1.1 skrll can use the same cookie to refer to them. */
1181 1.1 skrll cie = fde->u.fde.cie_inf;
1182 1.5 christos if (cie != NULL && !cie->u.cie.gc_mark)
1183 1.1 skrll {
1184 1.1 skrll cie->u.cie.gc_mark = 1;
1185 1.1 skrll if (!mark_entry (info, eh_frame, cie, gc_mark_hook, cookie))
1186 1.10 christos return false;
1187 1.1 skrll }
1188 1.1 skrll }
1189 1.10 christos return true;
1190 1.1 skrll }
1191 1.1 skrll
1192 1.1 skrll /* Input section SEC of ABFD is an .eh_frame section that contains the
1193 1.1 skrll CIE described by CIE_INF. Return a version of CIE_INF that is going
1194 1.1 skrll to be kept in the output, adding CIE_INF to the output if necessary.
1195 1.1 skrll
1196 1.1 skrll HDR_INFO is the .eh_frame_hdr information and COOKIE describes the
1197 1.1 skrll relocations in REL. */
1198 1.1 skrll
1199 1.1 skrll static struct eh_cie_fde *
1200 1.3 christos find_merged_cie (bfd *abfd, struct bfd_link_info *info, asection *sec,
1201 1.1 skrll struct eh_frame_hdr_info *hdr_info,
1202 1.1 skrll struct elf_reloc_cookie *cookie,
1203 1.1 skrll struct eh_cie_fde *cie_inf)
1204 1.1 skrll {
1205 1.1 skrll unsigned long r_symndx;
1206 1.1 skrll struct cie *cie, *new_cie;
1207 1.1 skrll Elf_Internal_Rela *rel;
1208 1.1 skrll void **loc;
1209 1.1 skrll
1210 1.1 skrll /* Use CIE_INF if we have already decided to keep it. */
1211 1.1 skrll if (!cie_inf->removed)
1212 1.1 skrll return cie_inf;
1213 1.1 skrll
1214 1.1 skrll /* If we have merged CIE_INF with another CIE, use that CIE instead. */
1215 1.1 skrll if (cie_inf->u.cie.merged)
1216 1.1 skrll return cie_inf->u.cie.u.merged_with;
1217 1.1 skrll
1218 1.1 skrll cie = cie_inf->u.cie.u.full_cie;
1219 1.1 skrll
1220 1.1 skrll /* Assume we will need to keep CIE_INF. */
1221 1.1 skrll cie_inf->removed = 0;
1222 1.1 skrll cie_inf->u.cie.u.sec = sec;
1223 1.1 skrll
1224 1.1 skrll /* If we are not merging CIEs, use CIE_INF. */
1225 1.1 skrll if (cie == NULL)
1226 1.1 skrll return cie_inf;
1227 1.1 skrll
1228 1.1 skrll if (cie->per_encoding != DW_EH_PE_omit)
1229 1.1 skrll {
1230 1.10 christos bool per_binds_local;
1231 1.3 christos
1232 1.5 christos /* Work out the address of personality routine, or at least
1233 1.5 christos enough info that we could calculate the address had we made a
1234 1.5 christos final section layout. The symbol on the reloc is enough,
1235 1.5 christos either the hash for a global, or (bfd id, index) pair for a
1236 1.5 christos local. The assumption here is that no one uses addends on
1237 1.5 christos the reloc. */
1238 1.1 skrll rel = cookie->rels + cie->personality.reloc_index;
1239 1.1 skrll memset (&cie->personality, 0, sizeof (cie->personality));
1240 1.1 skrll #ifdef BFD64
1241 1.1 skrll if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64)
1242 1.1 skrll r_symndx = ELF64_R_SYM (rel->r_info);
1243 1.1 skrll else
1244 1.1 skrll #endif
1245 1.1 skrll r_symndx = ELF32_R_SYM (rel->r_info);
1246 1.1 skrll if (r_symndx >= cookie->locsymcount
1247 1.1 skrll || ELF_ST_BIND (cookie->locsyms[r_symndx].st_info) != STB_LOCAL)
1248 1.1 skrll {
1249 1.1 skrll struct elf_link_hash_entry *h;
1250 1.1 skrll
1251 1.1 skrll r_symndx -= cookie->extsymoff;
1252 1.1 skrll h = cookie->sym_hashes[r_symndx];
1253 1.1 skrll
1254 1.1 skrll while (h->root.type == bfd_link_hash_indirect
1255 1.1 skrll || h->root.type == bfd_link_hash_warning)
1256 1.1 skrll h = (struct elf_link_hash_entry *) h->root.u.i.link;
1257 1.1 skrll
1258 1.1 skrll cie->personality.h = h;
1259 1.3 christos per_binds_local = SYMBOL_REFERENCES_LOCAL (info, h);
1260 1.1 skrll }
1261 1.1 skrll else
1262 1.1 skrll {
1263 1.1 skrll Elf_Internal_Sym *sym;
1264 1.1 skrll asection *sym_sec;
1265 1.1 skrll
1266 1.1 skrll sym = &cookie->locsyms[r_symndx];
1267 1.1 skrll sym_sec = bfd_section_from_elf_index (abfd, sym->st_shndx);
1268 1.1 skrll if (sym_sec == NULL)
1269 1.1 skrll return cie_inf;
1270 1.1 skrll
1271 1.1 skrll if (sym_sec->kept_section != NULL)
1272 1.1 skrll sym_sec = sym_sec->kept_section;
1273 1.1 skrll if (sym_sec->output_section == NULL)
1274 1.1 skrll return cie_inf;
1275 1.1 skrll
1276 1.1 skrll cie->local_personality = 1;
1277 1.5 christos cie->personality.sym.bfd_id = abfd->id;
1278 1.5 christos cie->personality.sym.index = r_symndx;
1279 1.10 christos per_binds_local = true;
1280 1.3 christos }
1281 1.3 christos
1282 1.3 christos if (per_binds_local
1283 1.5 christos && bfd_link_pic (info)
1284 1.3 christos && (cie->per_encoding & 0x70) == DW_EH_PE_absptr
1285 1.3 christos && (get_elf_backend_data (abfd)
1286 1.3 christos ->elf_backend_can_make_relative_eh_frame (abfd, info, sec)))
1287 1.3 christos {
1288 1.3 christos cie_inf->u.cie.make_per_encoding_relative = 1;
1289 1.3 christos cie_inf->u.cie.per_encoding_relative = 1;
1290 1.1 skrll }
1291 1.1 skrll }
1292 1.1 skrll
1293 1.1 skrll /* See if we can merge this CIE with an earlier one. */
1294 1.1 skrll cie_compute_hash (cie);
1295 1.5 christos if (hdr_info->u.dwarf.cies == NULL)
1296 1.1 skrll {
1297 1.5 christos hdr_info->u.dwarf.cies = htab_try_create (1, cie_hash, cie_eq, free);
1298 1.5 christos if (hdr_info->u.dwarf.cies == NULL)
1299 1.1 skrll return cie_inf;
1300 1.1 skrll }
1301 1.5 christos loc = htab_find_slot_with_hash (hdr_info->u.dwarf.cies, cie,
1302 1.5 christos cie->hash, INSERT);
1303 1.1 skrll if (loc == NULL)
1304 1.1 skrll return cie_inf;
1305 1.1 skrll
1306 1.1 skrll new_cie = (struct cie *) *loc;
1307 1.1 skrll if (new_cie == NULL)
1308 1.1 skrll {
1309 1.1 skrll /* Keep CIE_INF and record it in the hash table. */
1310 1.3 christos new_cie = (struct cie *) malloc (sizeof (struct cie));
1311 1.1 skrll if (new_cie == NULL)
1312 1.1 skrll return cie_inf;
1313 1.1 skrll
1314 1.1 skrll memcpy (new_cie, cie, sizeof (struct cie));
1315 1.1 skrll *loc = new_cie;
1316 1.1 skrll }
1317 1.1 skrll else
1318 1.1 skrll {
1319 1.1 skrll /* Merge CIE_INF with NEW_CIE->CIE_INF. */
1320 1.1 skrll cie_inf->removed = 1;
1321 1.1 skrll cie_inf->u.cie.merged = 1;
1322 1.1 skrll cie_inf->u.cie.u.merged_with = new_cie->cie_inf;
1323 1.1 skrll if (cie_inf->u.cie.make_lsda_relative)
1324 1.1 skrll new_cie->cie_inf->u.cie.make_lsda_relative = 1;
1325 1.1 skrll }
1326 1.1 skrll return new_cie->cie_inf;
1327 1.1 skrll }
1328 1.1 skrll
1329 1.7 christos /* For a given OFFSET in SEC, return the delta to the new location
1330 1.7 christos after .eh_frame editing. */
1331 1.7 christos
1332 1.7 christos static bfd_signed_vma
1333 1.7 christos offset_adjust (bfd_vma offset, const asection *sec)
1334 1.7 christos {
1335 1.7 christos struct eh_frame_sec_info *sec_info
1336 1.7 christos = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
1337 1.7 christos unsigned int lo, hi, mid;
1338 1.7 christos struct eh_cie_fde *ent = NULL;
1339 1.7 christos bfd_signed_vma delta;
1340 1.7 christos
1341 1.7 christos lo = 0;
1342 1.7 christos hi = sec_info->count;
1343 1.7 christos if (hi == 0)
1344 1.7 christos return 0;
1345 1.7 christos
1346 1.7 christos while (lo < hi)
1347 1.7 christos {
1348 1.7 christos mid = (lo + hi) / 2;
1349 1.7 christos ent = &sec_info->entry[mid];
1350 1.7 christos if (offset < ent->offset)
1351 1.7 christos hi = mid;
1352 1.7 christos else if (mid + 1 >= hi)
1353 1.7 christos break;
1354 1.7 christos else if (offset >= ent[1].offset)
1355 1.7 christos lo = mid + 1;
1356 1.7 christos else
1357 1.7 christos break;
1358 1.7 christos }
1359 1.7 christos
1360 1.7 christos if (!ent->removed)
1361 1.7 christos delta = (bfd_vma) ent->new_offset - (bfd_vma) ent->offset;
1362 1.7 christos else if (ent->cie && ent->u.cie.merged)
1363 1.7 christos {
1364 1.7 christos struct eh_cie_fde *cie = ent->u.cie.u.merged_with;
1365 1.7 christos delta = ((bfd_vma) cie->new_offset + cie->u.cie.u.sec->output_offset
1366 1.7 christos - (bfd_vma) ent->offset - sec->output_offset);
1367 1.7 christos }
1368 1.7 christos else
1369 1.7 christos {
1370 1.7 christos /* Is putting the symbol on the next entry best for a deleted
1371 1.7 christos CIE/FDE? */
1372 1.7 christos struct eh_cie_fde *last = sec_info->entry + sec_info->count;
1373 1.7 christos delta = ((bfd_vma) next_cie_fde_offset (ent, last, sec)
1374 1.7 christos - (bfd_vma) ent->offset);
1375 1.7 christos return delta;
1376 1.7 christos }
1377 1.7 christos
1378 1.7 christos /* Account for editing within this CIE/FDE. */
1379 1.7 christos offset -= ent->offset;
1380 1.7 christos if (ent->cie)
1381 1.7 christos {
1382 1.7 christos unsigned int extra
1383 1.7 christos = ent->add_augmentation_size + ent->u.cie.add_fde_encoding;
1384 1.7 christos if (extra == 0
1385 1.7 christos || offset <= 9u + ent->u.cie.aug_str_len)
1386 1.7 christos return delta;
1387 1.7 christos delta += extra;
1388 1.7 christos if (offset <= 9u + ent->u.cie.aug_str_len + ent->u.cie.aug_data_len)
1389 1.7 christos return delta;
1390 1.7 christos delta += extra;
1391 1.7 christos }
1392 1.7 christos else
1393 1.7 christos {
1394 1.7 christos unsigned int ptr_size, width, extra = ent->add_augmentation_size;
1395 1.7 christos if (offset <= 12 || extra == 0)
1396 1.7 christos return delta;
1397 1.7 christos ptr_size = (get_elf_backend_data (sec->owner)
1398 1.7 christos ->elf_backend_eh_frame_address_size (sec->owner, sec));
1399 1.7 christos width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1400 1.7 christos if (offset <= 8 + 2 * width)
1401 1.7 christos return delta;
1402 1.7 christos delta += extra;
1403 1.7 christos }
1404 1.7 christos
1405 1.7 christos return delta;
1406 1.7 christos }
1407 1.7 christos
1408 1.7 christos /* Adjust a global symbol defined in .eh_frame, so that it stays
1409 1.7 christos relative to its original CIE/FDE. It is assumed that a symbol
1410 1.7 christos defined at the beginning of a CIE/FDE belongs to that CIE/FDE
1411 1.7 christos rather than marking the end of the previous CIE/FDE. This matters
1412 1.7 christos when a CIE is merged with a previous CIE, since the symbol is
1413 1.7 christos moved to the merged CIE. */
1414 1.7 christos
1415 1.10 christos bool
1416 1.7 christos _bfd_elf_adjust_eh_frame_global_symbol (struct elf_link_hash_entry *h,
1417 1.7 christos void *arg ATTRIBUTE_UNUSED)
1418 1.7 christos {
1419 1.7 christos asection *sym_sec;
1420 1.7 christos bfd_signed_vma delta;
1421 1.7 christos
1422 1.7 christos if (h->root.type != bfd_link_hash_defined
1423 1.7 christos && h->root.type != bfd_link_hash_defweak)
1424 1.10 christos return true;
1425 1.7 christos
1426 1.7 christos sym_sec = h->root.u.def.section;
1427 1.7 christos if (sym_sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME
1428 1.7 christos || elf_section_data (sym_sec)->sec_info == NULL)
1429 1.10 christos return true;
1430 1.7 christos
1431 1.7 christos delta = offset_adjust (h->root.u.def.value, sym_sec);
1432 1.7 christos h->root.u.def.value += delta;
1433 1.7 christos
1434 1.10 christos return true;
1435 1.7 christos }
1436 1.7 christos
1437 1.7 christos /* The same for all local symbols defined in .eh_frame. Returns true
1438 1.7 christos if any symbol was changed. */
1439 1.7 christos
1440 1.7 christos static int
1441 1.7 christos adjust_eh_frame_local_symbols (const asection *sec,
1442 1.7 christos struct elf_reloc_cookie *cookie)
1443 1.7 christos {
1444 1.7 christos int adjusted = 0;
1445 1.7 christos
1446 1.10 christos if (cookie->locsymcount > 1)
1447 1.10 christos {
1448 1.10 christos unsigned int shndx = elf_section_data (sec)->this_idx;
1449 1.10 christos Elf_Internal_Sym *end_sym = cookie->locsyms + cookie->locsymcount;
1450 1.10 christos Elf_Internal_Sym *sym;
1451 1.10 christos
1452 1.10 christos for (sym = cookie->locsyms + 1; sym < end_sym; ++sym)
1453 1.10 christos if (sym->st_info <= ELF_ST_INFO (STB_LOCAL, STT_OBJECT)
1454 1.10 christos && sym->st_shndx == shndx)
1455 1.10 christos {
1456 1.10 christos bfd_signed_vma delta = offset_adjust (sym->st_value, sec);
1457 1.7 christos
1458 1.10 christos if (delta != 0)
1459 1.10 christos {
1460 1.10 christos adjusted = 1;
1461 1.10 christos sym->st_value += delta;
1462 1.10 christos }
1463 1.7 christos }
1464 1.10 christos }
1465 1.7 christos return adjusted;
1466 1.7 christos }
1467 1.7 christos
1468 1.1 skrll /* This function is called for each input file before the .eh_frame
1469 1.1 skrll section is relocated. It discards duplicate CIEs and FDEs for discarded
1470 1.1 skrll functions. The function returns TRUE iff any entries have been
1471 1.1 skrll deleted. */
1472 1.1 skrll
1473 1.10 christos bool
1474 1.1 skrll _bfd_elf_discard_section_eh_frame
1475 1.1 skrll (bfd *abfd, struct bfd_link_info *info, asection *sec,
1476 1.10 christos bool (*reloc_symbol_deleted_p) (bfd_vma, void *),
1477 1.1 skrll struct elf_reloc_cookie *cookie)
1478 1.1 skrll {
1479 1.1 skrll struct eh_cie_fde *ent;
1480 1.1 skrll struct eh_frame_sec_info *sec_info;
1481 1.1 skrll struct eh_frame_hdr_info *hdr_info;
1482 1.7 christos unsigned int ptr_size, offset, eh_alignment;
1483 1.7 christos int changed;
1484 1.1 skrll
1485 1.4 christos if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
1486 1.10 christos return false;
1487 1.4 christos
1488 1.1 skrll sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
1489 1.1 skrll if (sec_info == NULL)
1490 1.10 christos return false;
1491 1.1 skrll
1492 1.4 christos ptr_size = (get_elf_backend_data (sec->owner)
1493 1.4 christos ->elf_backend_eh_frame_address_size (sec->owner, sec));
1494 1.4 christos
1495 1.1 skrll hdr_info = &elf_hash_table (info)->eh_info;
1496 1.1 skrll for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1497 1.1 skrll if (ent->size == 4)
1498 1.1 skrll /* There should only be one zero terminator, on the last input
1499 1.1 skrll file supplying .eh_frame (crtend.o). Remove any others. */
1500 1.1 skrll ent->removed = sec->map_head.s != NULL;
1501 1.5 christos else if (!ent->cie && ent->u.fde.cie_inf != NULL)
1502 1.1 skrll {
1503 1.10 christos bool keep;
1504 1.4 christos if ((sec->flags & SEC_LINKER_CREATED) != 0 && cookie->rels == NULL)
1505 1.4 christos {
1506 1.4 christos unsigned int width
1507 1.4 christos = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1508 1.4 christos bfd_vma value
1509 1.4 christos = read_value (abfd, sec->contents + ent->offset + 8 + width,
1510 1.4 christos width, get_DW_EH_PE_signed (ent->fde_encoding));
1511 1.4 christos keep = value != 0;
1512 1.4 christos }
1513 1.4 christos else
1514 1.4 christos {
1515 1.4 christos cookie->rel = cookie->rels + ent->reloc_index;
1516 1.4 christos /* FIXME: octets_per_byte. */
1517 1.4 christos BFD_ASSERT (cookie->rel < cookie->relend
1518 1.4 christos && cookie->rel->r_offset == ent->offset + 8);
1519 1.4 christos keep = !(*reloc_symbol_deleted_p) (ent->offset + 8, cookie);
1520 1.4 christos }
1521 1.4 christos if (keep)
1522 1.1 skrll {
1523 1.5 christos if (bfd_link_pic (info)
1524 1.3 christos && (((ent->fde_encoding & 0x70) == DW_EH_PE_absptr
1525 1.1 skrll && ent->make_relative == 0)
1526 1.3 christos || (ent->fde_encoding & 0x70) == DW_EH_PE_aligned))
1527 1.1 skrll {
1528 1.6 christos static int num_warnings_issued = 0;
1529 1.6 christos
1530 1.1 skrll /* If a shared library uses absolute pointers
1531 1.1 skrll which we cannot turn into PC relative,
1532 1.1 skrll don't create the binary search table,
1533 1.1 skrll since it is affected by runtime relocations. */
1534 1.10 christos hdr_info->u.dwarf.table = false;
1535 1.9 christos /* Only warn if --eh-frame-hdr was specified. */
1536 1.9 christos if (info->eh_frame_hdr_type != 0)
1537 1.6 christos {
1538 1.9 christos if (num_warnings_issued < 10)
1539 1.9 christos {
1540 1.9 christos _bfd_error_handler
1541 1.9 christos /* xgettext:c-format */
1542 1.9 christos (_("FDE encoding in %pB(%pA) prevents .eh_frame_hdr"
1543 1.9 christos " table being created"), abfd, sec);
1544 1.9 christos num_warnings_issued ++;
1545 1.9 christos }
1546 1.9 christos else if (num_warnings_issued == 10)
1547 1.9 christos {
1548 1.9 christos _bfd_error_handler
1549 1.9 christos (_("further warnings about FDE encoding preventing .eh_frame_hdr generation dropped"));
1550 1.9 christos num_warnings_issued ++;
1551 1.9 christos }
1552 1.6 christos }
1553 1.1 skrll }
1554 1.1 skrll ent->removed = 0;
1555 1.5 christos hdr_info->u.dwarf.fde_count++;
1556 1.3 christos ent->u.fde.cie_inf = find_merged_cie (abfd, info, sec, hdr_info,
1557 1.3 christos cookie, ent->u.fde.cie_inf);
1558 1.1 skrll }
1559 1.1 skrll }
1560 1.1 skrll
1561 1.10 christos free (sec_info->cies);
1562 1.10 christos sec_info->cies = NULL;
1563 1.1 skrll
1564 1.7 christos /* It may be that some .eh_frame input section has greater alignment
1565 1.7 christos than other .eh_frame sections. In that case we run the risk of
1566 1.7 christos padding with zeros before that section, which would be seen as a
1567 1.7 christos zero terminator. Alignment padding must be added *inside* the
1568 1.7 christos last FDE instead. For other FDEs we align according to their
1569 1.7 christos encoding, in order to align FDE address range entries naturally. */
1570 1.1 skrll offset = 0;
1571 1.7 christos changed = 0;
1572 1.1 skrll for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1573 1.1 skrll if (!ent->removed)
1574 1.1 skrll {
1575 1.7 christos eh_alignment = 4;
1576 1.7 christos if (ent->size == 4)
1577 1.7 christos ;
1578 1.7 christos else if (ent->cie)
1579 1.7 christos {
1580 1.7 christos if (ent->u.cie.per_encoding_aligned8)
1581 1.7 christos eh_alignment = 8;
1582 1.7 christos }
1583 1.7 christos else
1584 1.7 christos {
1585 1.7 christos eh_alignment = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1586 1.7 christos if (eh_alignment < 4)
1587 1.7 christos eh_alignment = 4;
1588 1.7 christos }
1589 1.7 christos offset = (offset + eh_alignment - 1) & -eh_alignment;
1590 1.1 skrll ent->new_offset = offset;
1591 1.7 christos if (ent->new_offset != ent->offset)
1592 1.7 christos changed = 1;
1593 1.7 christos offset += size_of_output_cie_fde (ent);
1594 1.1 skrll }
1595 1.1 skrll
1596 1.7 christos eh_alignment = 4;
1597 1.7 christos offset = (offset + eh_alignment - 1) & -eh_alignment;
1598 1.1 skrll sec->rawsize = sec->size;
1599 1.1 skrll sec->size = offset;
1600 1.7 christos if (sec->size != sec->rawsize)
1601 1.7 christos changed = 1;
1602 1.7 christos
1603 1.7 christos if (changed && adjust_eh_frame_local_symbols (sec, cookie))
1604 1.7 christos {
1605 1.7 christos Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1606 1.7 christos symtab_hdr->contents = (unsigned char *) cookie->locsyms;
1607 1.7 christos }
1608 1.7 christos return changed;
1609 1.1 skrll }
1610 1.1 skrll
1611 1.1 skrll /* This function is called for .eh_frame_hdr section after
1612 1.1 skrll _bfd_elf_discard_section_eh_frame has been called on all .eh_frame
1613 1.1 skrll input sections. It finalizes the size of .eh_frame_hdr section. */
1614 1.1 skrll
1615 1.10 christos bool
1616 1.10 christos _bfd_elf_discard_section_eh_frame_hdr (struct bfd_link_info *info)
1617 1.1 skrll {
1618 1.1 skrll struct elf_link_hash_table *htab;
1619 1.1 skrll struct eh_frame_hdr_info *hdr_info;
1620 1.1 skrll asection *sec;
1621 1.1 skrll
1622 1.1 skrll htab = elf_hash_table (info);
1623 1.1 skrll hdr_info = &htab->eh_info;
1624 1.1 skrll
1625 1.5 christos if (!hdr_info->frame_hdr_is_compact && hdr_info->u.dwarf.cies != NULL)
1626 1.1 skrll {
1627 1.5 christos htab_delete (hdr_info->u.dwarf.cies);
1628 1.5 christos hdr_info->u.dwarf.cies = NULL;
1629 1.1 skrll }
1630 1.1 skrll
1631 1.1 skrll sec = hdr_info->hdr_sec;
1632 1.1 skrll if (sec == NULL)
1633 1.10 christos return false;
1634 1.1 skrll
1635 1.5 christos if (info->eh_frame_hdr_type == COMPACT_EH_HDR)
1636 1.5 christos {
1637 1.5 christos /* For compact frames we only add the header. The actual table comes
1638 1.7 christos from the .eh_frame_entry sections. */
1639 1.5 christos sec->size = 8;
1640 1.5 christos }
1641 1.5 christos else
1642 1.5 christos {
1643 1.5 christos sec->size = EH_FRAME_HDR_SIZE;
1644 1.5 christos if (hdr_info->u.dwarf.table)
1645 1.5 christos sec->size += 4 + hdr_info->u.dwarf.fde_count * 8;
1646 1.5 christos }
1647 1.1 skrll
1648 1.10 christos return true;
1649 1.1 skrll }
1650 1.1 skrll
1651 1.4 christos /* Return true if there is at least one non-empty .eh_frame section in
1652 1.4 christos input files. Can only be called after ld has mapped input to
1653 1.4 christos output sections, and before sections are stripped. */
1654 1.5 christos
1655 1.10 christos bool
1656 1.4 christos _bfd_elf_eh_frame_present (struct bfd_link_info *info)
1657 1.4 christos {
1658 1.4 christos asection *eh = bfd_get_section_by_name (info->output_bfd, ".eh_frame");
1659 1.4 christos
1660 1.4 christos if (eh == NULL)
1661 1.10 christos return false;
1662 1.4 christos
1663 1.4 christos /* Count only sections which have at least a single CIE or FDE.
1664 1.4 christos There cannot be any CIE or FDE <= 8 bytes. */
1665 1.4 christos for (eh = eh->map_head.s; eh != NULL; eh = eh->map_head.s)
1666 1.4 christos if (eh->size > 8)
1667 1.10 christos return true;
1668 1.4 christos
1669 1.10 christos return false;
1670 1.4 christos }
1671 1.4 christos
1672 1.5 christos /* Return true if there is at least one .eh_frame_entry section in
1673 1.5 christos input files. */
1674 1.5 christos
1675 1.10 christos bool
1676 1.5 christos _bfd_elf_eh_frame_entry_present (struct bfd_link_info *info)
1677 1.5 christos {
1678 1.5 christos asection *o;
1679 1.5 christos bfd *abfd;
1680 1.5 christos
1681 1.5 christos for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next)
1682 1.5 christos {
1683 1.5 christos for (o = abfd->sections; o; o = o->next)
1684 1.5 christos {
1685 1.9 christos const char *name = bfd_section_name (o);
1686 1.5 christos
1687 1.5 christos if (strcmp (name, ".eh_frame_entry")
1688 1.5 christos && !bfd_is_abs_section (o->output_section))
1689 1.10 christos return true;
1690 1.5 christos }
1691 1.5 christos }
1692 1.10 christos return false;
1693 1.5 christos }
1694 1.5 christos
1695 1.1 skrll /* This function is called from size_dynamic_sections.
1696 1.1 skrll It needs to decide whether .eh_frame_hdr should be output or not,
1697 1.1 skrll because when the dynamic symbol table has been sized it is too late
1698 1.1 skrll to strip sections. */
1699 1.1 skrll
1700 1.10 christos bool
1701 1.1 skrll _bfd_elf_maybe_strip_eh_frame_hdr (struct bfd_link_info *info)
1702 1.1 skrll {
1703 1.1 skrll struct elf_link_hash_table *htab;
1704 1.1 skrll struct eh_frame_hdr_info *hdr_info;
1705 1.5 christos struct bfd_link_hash_entry *bh = NULL;
1706 1.5 christos struct elf_link_hash_entry *h;
1707 1.1 skrll
1708 1.1 skrll htab = elf_hash_table (info);
1709 1.1 skrll hdr_info = &htab->eh_info;
1710 1.1 skrll if (hdr_info->hdr_sec == NULL)
1711 1.10 christos return true;
1712 1.1 skrll
1713 1.4 christos if (bfd_is_abs_section (hdr_info->hdr_sec->output_section)
1714 1.5 christos || info->eh_frame_hdr_type == 0
1715 1.5 christos || (info->eh_frame_hdr_type == DWARF2_EH_HDR
1716 1.5 christos && !_bfd_elf_eh_frame_present (info))
1717 1.5 christos || (info->eh_frame_hdr_type == COMPACT_EH_HDR
1718 1.5 christos && !_bfd_elf_eh_frame_entry_present (info)))
1719 1.1 skrll {
1720 1.1 skrll hdr_info->hdr_sec->flags |= SEC_EXCLUDE;
1721 1.1 skrll hdr_info->hdr_sec = NULL;
1722 1.10 christos return true;
1723 1.1 skrll }
1724 1.1 skrll
1725 1.5 christos /* Add a hidden symbol so that systems without access to PHDRs can
1726 1.5 christos find the table. */
1727 1.5 christos if (! (_bfd_generic_link_add_one_symbol
1728 1.5 christos (info, info->output_bfd, "__GNU_EH_FRAME_HDR", BSF_LOCAL,
1729 1.10 christos hdr_info->hdr_sec, 0, NULL, false, false, &bh)))
1730 1.10 christos return false;
1731 1.5 christos
1732 1.5 christos h = (struct elf_link_hash_entry *) bh;
1733 1.5 christos h->def_regular = 1;
1734 1.5 christos h->other = STV_HIDDEN;
1735 1.5 christos get_elf_backend_data
1736 1.10 christos (info->output_bfd)->elf_backend_hide_symbol (info, h, true);
1737 1.5 christos
1738 1.5 christos if (!hdr_info->frame_hdr_is_compact)
1739 1.10 christos hdr_info->u.dwarf.table = true;
1740 1.10 christos return true;
1741 1.1 skrll }
1742 1.1 skrll
1743 1.1 skrll /* Adjust an address in the .eh_frame section. Given OFFSET within
1744 1.1 skrll SEC, this returns the new offset in the adjusted .eh_frame section,
1745 1.1 skrll or -1 if the address refers to a CIE/FDE which has been removed
1746 1.1 skrll or to offset with dynamic relocation which is no longer needed. */
1747 1.1 skrll
1748 1.1 skrll bfd_vma
1749 1.1 skrll _bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED,
1750 1.3 christos struct bfd_link_info *info ATTRIBUTE_UNUSED,
1751 1.1 skrll asection *sec,
1752 1.1 skrll bfd_vma offset)
1753 1.1 skrll {
1754 1.1 skrll struct eh_frame_sec_info *sec_info;
1755 1.1 skrll unsigned int lo, hi, mid;
1756 1.1 skrll
1757 1.4 christos if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
1758 1.1 skrll return offset;
1759 1.3 christos sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
1760 1.1 skrll
1761 1.1 skrll if (offset >= sec->rawsize)
1762 1.1 skrll return offset - sec->rawsize + sec->size;
1763 1.1 skrll
1764 1.1 skrll lo = 0;
1765 1.1 skrll hi = sec_info->count;
1766 1.1 skrll mid = 0;
1767 1.1 skrll while (lo < hi)
1768 1.1 skrll {
1769 1.1 skrll mid = (lo + hi) / 2;
1770 1.1 skrll if (offset < sec_info->entry[mid].offset)
1771 1.1 skrll hi = mid;
1772 1.1 skrll else if (offset
1773 1.1 skrll >= sec_info->entry[mid].offset + sec_info->entry[mid].size)
1774 1.1 skrll lo = mid + 1;
1775 1.1 skrll else
1776 1.1 skrll break;
1777 1.1 skrll }
1778 1.1 skrll
1779 1.1 skrll BFD_ASSERT (lo < hi);
1780 1.1 skrll
1781 1.1 skrll /* FDE or CIE was removed. */
1782 1.1 skrll if (sec_info->entry[mid].removed)
1783 1.1 skrll return (bfd_vma) -1;
1784 1.1 skrll
1785 1.3 christos /* If converting personality pointers to DW_EH_PE_pcrel, there will be
1786 1.3 christos no need for run-time relocation against the personality field. */
1787 1.3 christos if (sec_info->entry[mid].cie
1788 1.3 christos && sec_info->entry[mid].u.cie.make_per_encoding_relative
1789 1.3 christos && offset == (sec_info->entry[mid].offset + 8
1790 1.3 christos + sec_info->entry[mid].u.cie.personality_offset))
1791 1.3 christos return (bfd_vma) -2;
1792 1.3 christos
1793 1.1 skrll /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
1794 1.1 skrll relocation against FDE's initial_location field. */
1795 1.1 skrll if (!sec_info->entry[mid].cie
1796 1.1 skrll && sec_info->entry[mid].make_relative
1797 1.1 skrll && offset == sec_info->entry[mid].offset + 8)
1798 1.1 skrll return (bfd_vma) -2;
1799 1.1 skrll
1800 1.1 skrll /* If converting LSDA pointers to DW_EH_PE_pcrel, there will be no need
1801 1.1 skrll for run-time relocation against LSDA field. */
1802 1.1 skrll if (!sec_info->entry[mid].cie
1803 1.1 skrll && sec_info->entry[mid].u.fde.cie_inf->u.cie.make_lsda_relative
1804 1.1 skrll && offset == (sec_info->entry[mid].offset + 8
1805 1.1 skrll + sec_info->entry[mid].lsda_offset))
1806 1.1 skrll return (bfd_vma) -2;
1807 1.1 skrll
1808 1.1 skrll /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
1809 1.1 skrll relocation against DW_CFA_set_loc's arguments. */
1810 1.1 skrll if (sec_info->entry[mid].set_loc
1811 1.1 skrll && sec_info->entry[mid].make_relative
1812 1.1 skrll && (offset >= sec_info->entry[mid].offset + 8
1813 1.1 skrll + sec_info->entry[mid].set_loc[1]))
1814 1.1 skrll {
1815 1.1 skrll unsigned int cnt;
1816 1.1 skrll
1817 1.1 skrll for (cnt = 1; cnt <= sec_info->entry[mid].set_loc[0]; cnt++)
1818 1.1 skrll if (offset == sec_info->entry[mid].offset + 8
1819 1.1 skrll + sec_info->entry[mid].set_loc[cnt])
1820 1.1 skrll return (bfd_vma) -2;
1821 1.1 skrll }
1822 1.1 skrll
1823 1.1 skrll /* Any new augmentation bytes go before the first relocation. */
1824 1.1 skrll return (offset + sec_info->entry[mid].new_offset
1825 1.1 skrll - sec_info->entry[mid].offset
1826 1.1 skrll + extra_augmentation_string_bytes (sec_info->entry + mid)
1827 1.1 skrll + extra_augmentation_data_bytes (sec_info->entry + mid));
1828 1.1 skrll }
1829 1.1 skrll
1830 1.5 christos /* Write out .eh_frame_entry section. Add CANTUNWIND terminator if needed.
1831 1.5 christos Also check that the contents look sane. */
1832 1.5 christos
1833 1.10 christos bool
1834 1.5 christos _bfd_elf_write_section_eh_frame_entry (bfd *abfd, struct bfd_link_info *info,
1835 1.5 christos asection *sec, bfd_byte *contents)
1836 1.5 christos {
1837 1.5 christos const struct elf_backend_data *bed;
1838 1.5 christos bfd_byte cantunwind[8];
1839 1.5 christos bfd_vma addr;
1840 1.5 christos bfd_vma last_addr;
1841 1.5 christos bfd_vma offset;
1842 1.5 christos asection *text_sec = (asection *) elf_section_data (sec)->sec_info;
1843 1.5 christos
1844 1.5 christos if (!sec->rawsize)
1845 1.5 christos sec->rawsize = sec->size;
1846 1.5 christos
1847 1.5 christos BFD_ASSERT (sec->sec_info_type == SEC_INFO_TYPE_EH_FRAME_ENTRY);
1848 1.5 christos
1849 1.5 christos /* Check to make sure that the text section corresponding to this eh_frame_entry
1850 1.5 christos section has not been excluded. In particular, mips16 stub entries will be
1851 1.5 christos excluded outside of the normal process. */
1852 1.5 christos if (sec->flags & SEC_EXCLUDE
1853 1.5 christos || text_sec->flags & SEC_EXCLUDE)
1854 1.10 christos return true;
1855 1.5 christos
1856 1.5 christos if (!bfd_set_section_contents (abfd, sec->output_section, contents,
1857 1.5 christos sec->output_offset, sec->rawsize))
1858 1.10 christos return false;
1859 1.5 christos
1860 1.5 christos last_addr = bfd_get_signed_32 (abfd, contents);
1861 1.5 christos /* Check that all the entries are in order. */
1862 1.5 christos for (offset = 8; offset < sec->rawsize; offset += 8)
1863 1.5 christos {
1864 1.5 christos addr = bfd_get_signed_32 (abfd, contents + offset) + offset;
1865 1.5 christos if (addr <= last_addr)
1866 1.5 christos {
1867 1.7 christos /* xgettext:c-format */
1868 1.8 christos _bfd_error_handler (_("%pB: %pA not in order"), sec->owner, sec);
1869 1.10 christos return false;
1870 1.5 christos }
1871 1.5 christos
1872 1.5 christos last_addr = addr;
1873 1.5 christos }
1874 1.5 christos
1875 1.5 christos addr = text_sec->output_section->vma + text_sec->output_offset
1876 1.5 christos + text_sec->size;
1877 1.5 christos addr &= ~1;
1878 1.5 christos addr -= (sec->output_section->vma + sec->output_offset + sec->rawsize);
1879 1.5 christos if (addr & 1)
1880 1.5 christos {
1881 1.7 christos /* xgettext:c-format */
1882 1.8 christos _bfd_error_handler (_("%pB: %pA invalid input section size"),
1883 1.7 christos sec->owner, sec);
1884 1.5 christos bfd_set_error (bfd_error_bad_value);
1885 1.10 christos return false;
1886 1.5 christos }
1887 1.5 christos if (last_addr >= addr + sec->rawsize)
1888 1.5 christos {
1889 1.7 christos /* xgettext:c-format */
1890 1.8 christos _bfd_error_handler (_("%pB: %pA points past end of text section"),
1891 1.7 christos sec->owner, sec);
1892 1.5 christos bfd_set_error (bfd_error_bad_value);
1893 1.10 christos return false;
1894 1.5 christos }
1895 1.5 christos
1896 1.5 christos if (sec->size == sec->rawsize)
1897 1.10 christos return true;
1898 1.5 christos
1899 1.5 christos bed = get_elf_backend_data (abfd);
1900 1.5 christos BFD_ASSERT (sec->size == sec->rawsize + 8);
1901 1.5 christos BFD_ASSERT ((addr & 1) == 0);
1902 1.5 christos BFD_ASSERT (bed->cant_unwind_opcode);
1903 1.5 christos
1904 1.5 christos bfd_put_32 (abfd, addr, cantunwind);
1905 1.5 christos bfd_put_32 (abfd, (*bed->cant_unwind_opcode) (info), cantunwind + 4);
1906 1.5 christos return bfd_set_section_contents (abfd, sec->output_section, cantunwind,
1907 1.5 christos sec->output_offset + sec->rawsize, 8);
1908 1.5 christos }
1909 1.5 christos
1910 1.1 skrll /* Write out .eh_frame section. This is called with the relocated
1911 1.1 skrll contents. */
1912 1.1 skrll
1913 1.10 christos bool
1914 1.1 skrll _bfd_elf_write_section_eh_frame (bfd *abfd,
1915 1.1 skrll struct bfd_link_info *info,
1916 1.1 skrll asection *sec,
1917 1.1 skrll bfd_byte *contents)
1918 1.1 skrll {
1919 1.1 skrll struct eh_frame_sec_info *sec_info;
1920 1.1 skrll struct elf_link_hash_table *htab;
1921 1.1 skrll struct eh_frame_hdr_info *hdr_info;
1922 1.1 skrll unsigned int ptr_size;
1923 1.7 christos struct eh_cie_fde *ent, *last_ent;
1924 1.1 skrll
1925 1.4 christos if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
1926 1.3 christos /* FIXME: octets_per_byte. */
1927 1.1 skrll return bfd_set_section_contents (abfd, sec->output_section, contents,
1928 1.1 skrll sec->output_offset, sec->size);
1929 1.1 skrll
1930 1.1 skrll ptr_size = (get_elf_backend_data (abfd)
1931 1.1 skrll ->elf_backend_eh_frame_address_size (abfd, sec));
1932 1.1 skrll BFD_ASSERT (ptr_size != 0);
1933 1.1 skrll
1934 1.3 christos sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
1935 1.1 skrll htab = elf_hash_table (info);
1936 1.1 skrll hdr_info = &htab->eh_info;
1937 1.1 skrll
1938 1.5 christos if (hdr_info->u.dwarf.table && hdr_info->u.dwarf.array == NULL)
1939 1.5 christos {
1940 1.10 christos hdr_info->frame_hdr_is_compact = false;
1941 1.5 christos hdr_info->u.dwarf.array = (struct eh_frame_array_ent *)
1942 1.7 christos bfd_malloc (hdr_info->u.dwarf.fde_count
1943 1.5 christos * sizeof (*hdr_info->u.dwarf.array));
1944 1.5 christos }
1945 1.5 christos if (hdr_info->u.dwarf.array == NULL)
1946 1.1 skrll hdr_info = NULL;
1947 1.1 skrll
1948 1.1 skrll /* The new offsets can be bigger or smaller than the original offsets.
1949 1.1 skrll We therefore need to make two passes over the section: one backward
1950 1.1 skrll pass to move entries up and one forward pass to move entries down.
1951 1.1 skrll The two passes won't interfere with each other because entries are
1952 1.1 skrll not reordered */
1953 1.1 skrll for (ent = sec_info->entry + sec_info->count; ent-- != sec_info->entry;)
1954 1.1 skrll if (!ent->removed && ent->new_offset > ent->offset)
1955 1.1 skrll memmove (contents + ent->new_offset, contents + ent->offset, ent->size);
1956 1.1 skrll
1957 1.1 skrll for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1958 1.1 skrll if (!ent->removed && ent->new_offset < ent->offset)
1959 1.1 skrll memmove (contents + ent->new_offset, contents + ent->offset, ent->size);
1960 1.1 skrll
1961 1.7 christos last_ent = sec_info->entry + sec_info->count;
1962 1.7 christos for (ent = sec_info->entry; ent < last_ent; ++ent)
1963 1.1 skrll {
1964 1.1 skrll unsigned char *buf, *end;
1965 1.1 skrll unsigned int new_size;
1966 1.1 skrll
1967 1.1 skrll if (ent->removed)
1968 1.1 skrll continue;
1969 1.1 skrll
1970 1.1 skrll if (ent->size == 4)
1971 1.1 skrll {
1972 1.1 skrll /* Any terminating FDE must be at the end of the section. */
1973 1.7 christos BFD_ASSERT (ent == last_ent - 1);
1974 1.1 skrll continue;
1975 1.1 skrll }
1976 1.1 skrll
1977 1.1 skrll buf = contents + ent->new_offset;
1978 1.1 skrll end = buf + ent->size;
1979 1.7 christos new_size = next_cie_fde_offset (ent, last_ent, sec) - ent->new_offset;
1980 1.1 skrll
1981 1.1 skrll /* Update the size. It may be shrinked. */
1982 1.1 skrll bfd_put_32 (abfd, new_size - 4, buf);
1983 1.1 skrll
1984 1.1 skrll /* Filling the extra bytes with DW_CFA_nops. */
1985 1.1 skrll if (new_size != ent->size)
1986 1.1 skrll memset (end, 0, new_size - ent->size);
1987 1.1 skrll
1988 1.1 skrll if (ent->cie)
1989 1.1 skrll {
1990 1.1 skrll /* CIE */
1991 1.1 skrll if (ent->make_relative
1992 1.1 skrll || ent->u.cie.make_lsda_relative
1993 1.1 skrll || ent->u.cie.per_encoding_relative)
1994 1.1 skrll {
1995 1.1 skrll char *aug;
1996 1.9 christos unsigned int version, action, extra_string, extra_data;
1997 1.1 skrll unsigned int per_width, per_encoding;
1998 1.1 skrll
1999 1.1 skrll /* Need to find 'R' or 'L' augmentation's argument and modify
2000 1.1 skrll DW_EH_PE_* value. */
2001 1.1 skrll action = ((ent->make_relative ? 1 : 0)
2002 1.1 skrll | (ent->u.cie.make_lsda_relative ? 2 : 0)
2003 1.1 skrll | (ent->u.cie.per_encoding_relative ? 4 : 0));
2004 1.1 skrll extra_string = extra_augmentation_string_bytes (ent);
2005 1.1 skrll extra_data = extra_augmentation_data_bytes (ent);
2006 1.1 skrll
2007 1.9 christos /* Skip length, id. */
2008 1.9 christos buf += 8;
2009 1.9 christos version = *buf++;
2010 1.1 skrll aug = (char *) buf;
2011 1.1 skrll buf += strlen (aug) + 1;
2012 1.1 skrll skip_leb128 (&buf, end);
2013 1.1 skrll skip_leb128 (&buf, end);
2014 1.9 christos if (version == 1)
2015 1.9 christos skip_bytes (&buf, end, 1);
2016 1.9 christos else
2017 1.9 christos skip_leb128 (&buf, end);
2018 1.1 skrll if (*aug == 'z')
2019 1.1 skrll {
2020 1.1 skrll /* The uleb128 will always be a single byte for the kind
2021 1.1 skrll of augmentation strings that we're prepared to handle. */
2022 1.1 skrll *buf++ += extra_data;
2023 1.1 skrll aug++;
2024 1.1 skrll }
2025 1.1 skrll
2026 1.1 skrll /* Make room for the new augmentation string and data bytes. */
2027 1.1 skrll memmove (buf + extra_string + extra_data, buf, end - buf);
2028 1.1 skrll memmove (aug + extra_string, aug, buf - (bfd_byte *) aug);
2029 1.1 skrll buf += extra_string;
2030 1.1 skrll end += extra_string + extra_data;
2031 1.1 skrll
2032 1.1 skrll if (ent->add_augmentation_size)
2033 1.1 skrll {
2034 1.1 skrll *aug++ = 'z';
2035 1.1 skrll *buf++ = extra_data - 1;
2036 1.1 skrll }
2037 1.1 skrll if (ent->u.cie.add_fde_encoding)
2038 1.1 skrll {
2039 1.1 skrll BFD_ASSERT (action & 1);
2040 1.1 skrll *aug++ = 'R';
2041 1.3 christos *buf++ = make_pc_relative (DW_EH_PE_absptr, ptr_size);
2042 1.1 skrll action &= ~1;
2043 1.1 skrll }
2044 1.1 skrll
2045 1.1 skrll while (action)
2046 1.1 skrll switch (*aug++)
2047 1.1 skrll {
2048 1.1 skrll case 'L':
2049 1.1 skrll if (action & 2)
2050 1.1 skrll {
2051 1.1 skrll BFD_ASSERT (*buf == ent->lsda_encoding);
2052 1.3 christos *buf = make_pc_relative (*buf, ptr_size);
2053 1.1 skrll action &= ~2;
2054 1.1 skrll }
2055 1.1 skrll buf++;
2056 1.1 skrll break;
2057 1.1 skrll case 'P':
2058 1.3 christos if (ent->u.cie.make_per_encoding_relative)
2059 1.3 christos *buf = make_pc_relative (*buf, ptr_size);
2060 1.1 skrll per_encoding = *buf++;
2061 1.1 skrll per_width = get_DW_EH_PE_width (per_encoding, ptr_size);
2062 1.1 skrll BFD_ASSERT (per_width != 0);
2063 1.1 skrll BFD_ASSERT (((per_encoding & 0x70) == DW_EH_PE_pcrel)
2064 1.1 skrll == ent->u.cie.per_encoding_relative);
2065 1.3 christos if ((per_encoding & 0x70) == DW_EH_PE_aligned)
2066 1.1 skrll buf = (contents
2067 1.1 skrll + ((buf - contents + per_width - 1)
2068 1.1 skrll & ~((bfd_size_type) per_width - 1)));
2069 1.1 skrll if (action & 4)
2070 1.1 skrll {
2071 1.1 skrll bfd_vma val;
2072 1.1 skrll
2073 1.1 skrll val = read_value (abfd, buf, per_width,
2074 1.1 skrll get_DW_EH_PE_signed (per_encoding));
2075 1.3 christos if (ent->u.cie.make_per_encoding_relative)
2076 1.3 christos val -= (sec->output_section->vma
2077 1.3 christos + sec->output_offset
2078 1.3 christos + (buf - contents));
2079 1.3 christos else
2080 1.3 christos {
2081 1.3 christos val += (bfd_vma) ent->offset - ent->new_offset;
2082 1.3 christos val -= extra_string + extra_data;
2083 1.3 christos }
2084 1.1 skrll write_value (abfd, buf, val, per_width);
2085 1.1 skrll action &= ~4;
2086 1.1 skrll }
2087 1.1 skrll buf += per_width;
2088 1.1 skrll break;
2089 1.1 skrll case 'R':
2090 1.1 skrll if (action & 1)
2091 1.1 skrll {
2092 1.1 skrll BFD_ASSERT (*buf == ent->fde_encoding);
2093 1.3 christos *buf = make_pc_relative (*buf, ptr_size);
2094 1.1 skrll action &= ~1;
2095 1.1 skrll }
2096 1.1 skrll buf++;
2097 1.1 skrll break;
2098 1.1 skrll case 'S':
2099 1.1 skrll break;
2100 1.1 skrll default:
2101 1.1 skrll BFD_FAIL ();
2102 1.1 skrll }
2103 1.1 skrll }
2104 1.1 skrll }
2105 1.1 skrll else
2106 1.1 skrll {
2107 1.1 skrll /* FDE */
2108 1.1 skrll bfd_vma value, address;
2109 1.1 skrll unsigned int width;
2110 1.1 skrll bfd_byte *start;
2111 1.1 skrll struct eh_cie_fde *cie;
2112 1.1 skrll
2113 1.1 skrll /* Skip length. */
2114 1.1 skrll cie = ent->u.fde.cie_inf;
2115 1.1 skrll buf += 4;
2116 1.1 skrll value = ((ent->new_offset + sec->output_offset + 4)
2117 1.1 skrll - (cie->new_offset + cie->u.cie.u.sec->output_offset));
2118 1.1 skrll bfd_put_32 (abfd, value, buf);
2119 1.5 christos if (bfd_link_relocatable (info))
2120 1.5 christos continue;
2121 1.1 skrll buf += 4;
2122 1.1 skrll width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
2123 1.1 skrll value = read_value (abfd, buf, width,
2124 1.1 skrll get_DW_EH_PE_signed (ent->fde_encoding));
2125 1.1 skrll address = value;
2126 1.1 skrll if (value)
2127 1.1 skrll {
2128 1.3 christos switch (ent->fde_encoding & 0x70)
2129 1.1 skrll {
2130 1.1 skrll case DW_EH_PE_textrel:
2131 1.1 skrll BFD_ASSERT (hdr_info == NULL);
2132 1.1 skrll break;
2133 1.1 skrll case DW_EH_PE_datarel:
2134 1.1 skrll {
2135 1.3 christos switch (abfd->arch_info->arch)
2136 1.3 christos {
2137 1.3 christos case bfd_arch_ia64:
2138 1.3 christos BFD_ASSERT (elf_gp (abfd) != 0);
2139 1.3 christos address += elf_gp (abfd);
2140 1.3 christos break;
2141 1.3 christos default:
2142 1.8 christos _bfd_error_handler
2143 1.8 christos (_("DW_EH_PE_datarel unspecified"
2144 1.8 christos " for this architecture"));
2145 1.3 christos /* Fall thru */
2146 1.3 christos case bfd_arch_frv:
2147 1.3 christos case bfd_arch_i386:
2148 1.10 christos case bfd_arch_nios2:
2149 1.3 christos BFD_ASSERT (htab->hgot != NULL
2150 1.3 christos && ((htab->hgot->root.type
2151 1.3 christos == bfd_link_hash_defined)
2152 1.3 christos || (htab->hgot->root.type
2153 1.3 christos == bfd_link_hash_defweak)));
2154 1.3 christos address
2155 1.3 christos += (htab->hgot->root.u.def.value
2156 1.3 christos + htab->hgot->root.u.def.section->output_offset
2157 1.3 christos + (htab->hgot->root.u.def.section->output_section
2158 1.3 christos ->vma));
2159 1.3 christos break;
2160 1.3 christos }
2161 1.1 skrll }
2162 1.1 skrll break;
2163 1.1 skrll case DW_EH_PE_pcrel:
2164 1.1 skrll value += (bfd_vma) ent->offset - ent->new_offset;
2165 1.1 skrll address += (sec->output_section->vma
2166 1.1 skrll + sec->output_offset
2167 1.1 skrll + ent->offset + 8);
2168 1.1 skrll break;
2169 1.1 skrll }
2170 1.1 skrll if (ent->make_relative)
2171 1.1 skrll value -= (sec->output_section->vma
2172 1.1 skrll + sec->output_offset
2173 1.1 skrll + ent->new_offset + 8);
2174 1.1 skrll write_value (abfd, buf, value, width);
2175 1.1 skrll }
2176 1.1 skrll
2177 1.1 skrll start = buf;
2178 1.1 skrll
2179 1.1 skrll if (hdr_info)
2180 1.1 skrll {
2181 1.3 christos /* The address calculation may overflow, giving us a
2182 1.3 christos value greater than 4G on a 32-bit target when
2183 1.3 christos dwarf_vma is 64-bit. */
2184 1.3 christos if (sizeof (address) > 4 && ptr_size == 4)
2185 1.3 christos address &= 0xffffffff;
2186 1.5 christos hdr_info->u.dwarf.array[hdr_info->array_count].initial_loc
2187 1.5 christos = address;
2188 1.5 christos hdr_info->u.dwarf.array[hdr_info->array_count].range
2189 1.10 christos = read_value (abfd, buf + width, width, false);
2190 1.5 christos hdr_info->u.dwarf.array[hdr_info->array_count++].fde
2191 1.1 skrll = (sec->output_section->vma
2192 1.1 skrll + sec->output_offset
2193 1.1 skrll + ent->new_offset);
2194 1.1 skrll }
2195 1.1 skrll
2196 1.3 christos if ((ent->lsda_encoding & 0x70) == DW_EH_PE_pcrel
2197 1.1 skrll || cie->u.cie.make_lsda_relative)
2198 1.1 skrll {
2199 1.1 skrll buf += ent->lsda_offset;
2200 1.1 skrll width = get_DW_EH_PE_width (ent->lsda_encoding, ptr_size);
2201 1.1 skrll value = read_value (abfd, buf, width,
2202 1.1 skrll get_DW_EH_PE_signed (ent->lsda_encoding));
2203 1.1 skrll if (value)
2204 1.1 skrll {
2205 1.3 christos if ((ent->lsda_encoding & 0x70) == DW_EH_PE_pcrel)
2206 1.1 skrll value += (bfd_vma) ent->offset - ent->new_offset;
2207 1.1 skrll else if (cie->u.cie.make_lsda_relative)
2208 1.1 skrll value -= (sec->output_section->vma
2209 1.1 skrll + sec->output_offset
2210 1.1 skrll + ent->new_offset + 8 + ent->lsda_offset);
2211 1.1 skrll write_value (abfd, buf, value, width);
2212 1.1 skrll }
2213 1.1 skrll }
2214 1.1 skrll else if (ent->add_augmentation_size)
2215 1.1 skrll {
2216 1.1 skrll /* Skip the PC and length and insert a zero byte for the
2217 1.1 skrll augmentation size. */
2218 1.1 skrll buf += width * 2;
2219 1.1 skrll memmove (buf + 1, buf, end - buf);
2220 1.1 skrll *buf = 0;
2221 1.1 skrll }
2222 1.1 skrll
2223 1.1 skrll if (ent->set_loc)
2224 1.1 skrll {
2225 1.1 skrll /* Adjust DW_CFA_set_loc. */
2226 1.3 christos unsigned int cnt;
2227 1.1 skrll bfd_vma new_offset;
2228 1.1 skrll
2229 1.1 skrll width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
2230 1.1 skrll new_offset = ent->new_offset + 8
2231 1.1 skrll + extra_augmentation_string_bytes (ent)
2232 1.1 skrll + extra_augmentation_data_bytes (ent);
2233 1.1 skrll
2234 1.1 skrll for (cnt = 1; cnt <= ent->set_loc[0]; cnt++)
2235 1.1 skrll {
2236 1.1 skrll buf = start + ent->set_loc[cnt];
2237 1.1 skrll
2238 1.1 skrll value = read_value (abfd, buf, width,
2239 1.1 skrll get_DW_EH_PE_signed (ent->fde_encoding));
2240 1.1 skrll if (!value)
2241 1.1 skrll continue;
2242 1.1 skrll
2243 1.3 christos if ((ent->fde_encoding & 0x70) == DW_EH_PE_pcrel)
2244 1.1 skrll value += (bfd_vma) ent->offset + 8 - new_offset;
2245 1.1 skrll if (ent->make_relative)
2246 1.1 skrll value -= (sec->output_section->vma
2247 1.1 skrll + sec->output_offset
2248 1.1 skrll + new_offset + ent->set_loc[cnt]);
2249 1.1 skrll write_value (abfd, buf, value, width);
2250 1.1 skrll }
2251 1.1 skrll }
2252 1.1 skrll }
2253 1.1 skrll }
2254 1.1 skrll
2255 1.3 christos /* FIXME: octets_per_byte. */
2256 1.1 skrll return bfd_set_section_contents (abfd, sec->output_section,
2257 1.1 skrll contents, (file_ptr) sec->output_offset,
2258 1.1 skrll sec->size);
2259 1.1 skrll }
2260 1.1 skrll
2261 1.1 skrll /* Helper function used to sort .eh_frame_hdr search table by increasing
2262 1.1 skrll VMA of FDE initial location. */
2263 1.1 skrll
2264 1.1 skrll static int
2265 1.1 skrll vma_compare (const void *a, const void *b)
2266 1.1 skrll {
2267 1.3 christos const struct eh_frame_array_ent *p = (const struct eh_frame_array_ent *) a;
2268 1.3 christos const struct eh_frame_array_ent *q = (const struct eh_frame_array_ent *) b;
2269 1.1 skrll if (p->initial_loc > q->initial_loc)
2270 1.1 skrll return 1;
2271 1.1 skrll if (p->initial_loc < q->initial_loc)
2272 1.1 skrll return -1;
2273 1.5 christos if (p->range > q->range)
2274 1.5 christos return 1;
2275 1.5 christos if (p->range < q->range)
2276 1.5 christos return -1;
2277 1.1 skrll return 0;
2278 1.1 skrll }
2279 1.1 skrll
2280 1.5 christos /* Reorder .eh_frame_entry sections to match the associated text sections.
2281 1.5 christos This routine is called during the final linking step, just before writing
2282 1.5 christos the contents. At this stage, sections in the eh_frame_hdr_info are already
2283 1.5 christos sorted in order of increasing text section address and so we simply need
2284 1.5 christos to make the .eh_frame_entrys follow that same order. Note that it is
2285 1.5 christos invalid for a linker script to try to force a particular order of
2286 1.5 christos .eh_frame_entry sections. */
2287 1.5 christos
2288 1.10 christos bool
2289 1.5 christos _bfd_elf_fixup_eh_frame_hdr (struct bfd_link_info *info)
2290 1.5 christos {
2291 1.5 christos asection *sec = NULL;
2292 1.5 christos asection *osec;
2293 1.5 christos struct eh_frame_hdr_info *hdr_info;
2294 1.5 christos unsigned int i;
2295 1.5 christos bfd_vma offset;
2296 1.5 christos struct bfd_link_order *p;
2297 1.5 christos
2298 1.5 christos hdr_info = &elf_hash_table (info)->eh_info;
2299 1.5 christos
2300 1.5 christos if (hdr_info->hdr_sec == NULL
2301 1.5 christos || info->eh_frame_hdr_type != COMPACT_EH_HDR
2302 1.5 christos || hdr_info->array_count == 0)
2303 1.10 christos return true;
2304 1.5 christos
2305 1.5 christos /* Change section output offsets to be in text section order. */
2306 1.5 christos offset = 8;
2307 1.5 christos osec = hdr_info->u.compact.entries[0]->output_section;
2308 1.5 christos for (i = 0; i < hdr_info->array_count; i++)
2309 1.5 christos {
2310 1.5 christos sec = hdr_info->u.compact.entries[i];
2311 1.5 christos if (sec->output_section != osec)
2312 1.5 christos {
2313 1.7 christos _bfd_error_handler
2314 1.8 christos (_("invalid output section for .eh_frame_entry: %pA"),
2315 1.7 christos sec->output_section);
2316 1.10 christos return false;
2317 1.5 christos }
2318 1.5 christos sec->output_offset = offset;
2319 1.5 christos offset += sec->size;
2320 1.5 christos }
2321 1.5 christos
2322 1.5 christos
2323 1.5 christos /* Fix the link_order to match. */
2324 1.5 christos for (p = sec->output_section->map_head.link_order; p != NULL; p = p->next)
2325 1.5 christos {
2326 1.5 christos if (p->type != bfd_indirect_link_order)
2327 1.5 christos abort();
2328 1.5 christos
2329 1.5 christos p->offset = p->u.indirect.section->output_offset;
2330 1.5 christos if (p->next != NULL)
2331 1.7 christos i--;
2332 1.5 christos }
2333 1.5 christos
2334 1.5 christos if (i != 0)
2335 1.5 christos {
2336 1.7 christos _bfd_error_handler
2337 1.8 christos (_("invalid contents in %pA section"), osec);
2338 1.10 christos return false;
2339 1.5 christos }
2340 1.5 christos
2341 1.10 christos return true;
2342 1.5 christos }
2343 1.5 christos
2344 1.5 christos /* The .eh_frame_hdr format for Compact EH frames:
2345 1.5 christos ubyte version (2)
2346 1.5 christos ubyte eh_ref_enc (DW_EH_PE_* encoding of typinfo references)
2347 1.5 christos uint32_t count (Number of entries in table)
2348 1.5 christos [array from .eh_frame_entry sections] */
2349 1.5 christos
2350 1.10 christos static bool
2351 1.5 christos write_compact_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
2352 1.5 christos {
2353 1.5 christos struct elf_link_hash_table *htab;
2354 1.5 christos struct eh_frame_hdr_info *hdr_info;
2355 1.5 christos asection *sec;
2356 1.5 christos const struct elf_backend_data *bed;
2357 1.5 christos bfd_vma count;
2358 1.5 christos bfd_byte contents[8];
2359 1.5 christos unsigned int i;
2360 1.5 christos
2361 1.5 christos htab = elf_hash_table (info);
2362 1.5 christos hdr_info = &htab->eh_info;
2363 1.5 christos sec = hdr_info->hdr_sec;
2364 1.5 christos
2365 1.5 christos if (sec->size != 8)
2366 1.5 christos abort();
2367 1.5 christos
2368 1.5 christos for (i = 0; i < sizeof (contents); i++)
2369 1.5 christos contents[i] = 0;
2370 1.5 christos
2371 1.5 christos contents[0] = COMPACT_EH_HDR;
2372 1.5 christos bed = get_elf_backend_data (abfd);
2373 1.5 christos
2374 1.5 christos BFD_ASSERT (bed->compact_eh_encoding);
2375 1.5 christos contents[1] = (*bed->compact_eh_encoding) (info);
2376 1.5 christos
2377 1.5 christos count = (sec->output_section->size - 8) / 8;
2378 1.5 christos bfd_put_32 (abfd, count, contents + 4);
2379 1.5 christos return bfd_set_section_contents (abfd, sec->output_section, contents,
2380 1.5 christos (file_ptr) sec->output_offset, sec->size);
2381 1.5 christos }
2382 1.5 christos
2383 1.5 christos /* The .eh_frame_hdr format for DWARF frames:
2384 1.5 christos
2385 1.1 skrll ubyte version (currently 1)
2386 1.7 christos ubyte eh_frame_ptr_enc (DW_EH_PE_* encoding of pointer to start of
2387 1.1 skrll .eh_frame section)
2388 1.1 skrll ubyte fde_count_enc (DW_EH_PE_* encoding of total FDE count
2389 1.1 skrll number (or DW_EH_PE_omit if there is no
2390 1.1 skrll binary search table computed))
2391 1.1 skrll ubyte table_enc (DW_EH_PE_* encoding of binary search table,
2392 1.1 skrll or DW_EH_PE_omit if not present.
2393 1.1 skrll DW_EH_PE_datarel is using address of
2394 1.1 skrll .eh_frame_hdr section start as base)
2395 1.1 skrll [encoded] eh_frame_ptr (pointer to start of .eh_frame section)
2396 1.1 skrll optionally followed by:
2397 1.1 skrll [encoded] fde_count (total number of FDEs in .eh_frame section)
2398 1.1 skrll fde_count x [encoded] initial_loc, fde
2399 1.1 skrll (array of encoded pairs containing
2400 1.1 skrll FDE initial_location field and FDE address,
2401 1.1 skrll sorted by increasing initial_loc). */
2402 1.1 skrll
2403 1.10 christos static bool
2404 1.5 christos write_dwarf_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
2405 1.1 skrll {
2406 1.1 skrll struct elf_link_hash_table *htab;
2407 1.1 skrll struct eh_frame_hdr_info *hdr_info;
2408 1.1 skrll asection *sec;
2409 1.10 christos bool retval = true;
2410 1.5 christos
2411 1.5 christos htab = elf_hash_table (info);
2412 1.5 christos hdr_info = &htab->eh_info;
2413 1.5 christos sec = hdr_info->hdr_sec;
2414 1.1 skrll bfd_byte *contents;
2415 1.1 skrll asection *eh_frame_sec;
2416 1.1 skrll bfd_size_type size;
2417 1.1 skrll bfd_vma encoded_eh_frame;
2418 1.1 skrll
2419 1.1 skrll size = EH_FRAME_HDR_SIZE;
2420 1.5 christos if (hdr_info->u.dwarf.array
2421 1.5 christos && hdr_info->array_count == hdr_info->u.dwarf.fde_count)
2422 1.5 christos size += 4 + hdr_info->u.dwarf.fde_count * 8;
2423 1.3 christos contents = (bfd_byte *) bfd_malloc (size);
2424 1.1 skrll if (contents == NULL)
2425 1.10 christos return false;
2426 1.1 skrll
2427 1.1 skrll eh_frame_sec = bfd_get_section_by_name (abfd, ".eh_frame");
2428 1.1 skrll if (eh_frame_sec == NULL)
2429 1.1 skrll {
2430 1.1 skrll free (contents);
2431 1.10 christos return false;
2432 1.1 skrll }
2433 1.1 skrll
2434 1.1 skrll memset (contents, 0, EH_FRAME_HDR_SIZE);
2435 1.5 christos /* Version. */
2436 1.5 christos contents[0] = 1;
2437 1.5 christos /* .eh_frame offset. */
2438 1.1 skrll contents[1] = get_elf_backend_data (abfd)->elf_backend_encode_eh_address
2439 1.5 christos (abfd, info, eh_frame_sec, 0, sec, 4, &encoded_eh_frame);
2440 1.1 skrll
2441 1.5 christos if (hdr_info->u.dwarf.array
2442 1.5 christos && hdr_info->array_count == hdr_info->u.dwarf.fde_count)
2443 1.1 skrll {
2444 1.5 christos /* FDE count encoding. */
2445 1.5 christos contents[2] = DW_EH_PE_udata4;
2446 1.5 christos /* Search table encoding. */
2447 1.5 christos contents[3] = DW_EH_PE_datarel | DW_EH_PE_sdata4;
2448 1.1 skrll }
2449 1.1 skrll else
2450 1.1 skrll {
2451 1.1 skrll contents[2] = DW_EH_PE_omit;
2452 1.1 skrll contents[3] = DW_EH_PE_omit;
2453 1.1 skrll }
2454 1.1 skrll bfd_put_32 (abfd, encoded_eh_frame, contents + 4);
2455 1.1 skrll
2456 1.1 skrll if (contents[2] != DW_EH_PE_omit)
2457 1.1 skrll {
2458 1.1 skrll unsigned int i;
2459 1.10 christos bool overlap, overflow;
2460 1.1 skrll
2461 1.5 christos bfd_put_32 (abfd, hdr_info->u.dwarf.fde_count,
2462 1.5 christos contents + EH_FRAME_HDR_SIZE);
2463 1.5 christos qsort (hdr_info->u.dwarf.array, hdr_info->u.dwarf.fde_count,
2464 1.5 christos sizeof (*hdr_info->u.dwarf.array), vma_compare);
2465 1.10 christos overlap = false;
2466 1.10 christos overflow = false;
2467 1.5 christos for (i = 0; i < hdr_info->u.dwarf.fde_count; i++)
2468 1.5 christos {
2469 1.5 christos bfd_vma val;
2470 1.5 christos
2471 1.5 christos val = hdr_info->u.dwarf.array[i].initial_loc
2472 1.5 christos - sec->output_section->vma;
2473 1.5 christos val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000;
2474 1.5 christos if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64
2475 1.5 christos && (hdr_info->u.dwarf.array[i].initial_loc
2476 1.5 christos != sec->output_section->vma + val))
2477 1.10 christos overflow = true;
2478 1.5 christos bfd_put_32 (abfd, val, contents + EH_FRAME_HDR_SIZE + i * 8 + 4);
2479 1.5 christos val = hdr_info->u.dwarf.array[i].fde - sec->output_section->vma;
2480 1.5 christos val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000;
2481 1.5 christos if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64
2482 1.5 christos && (hdr_info->u.dwarf.array[i].fde
2483 1.5 christos != sec->output_section->vma + val))
2484 1.10 christos overflow = true;
2485 1.5 christos bfd_put_32 (abfd, val, contents + EH_FRAME_HDR_SIZE + i * 8 + 8);
2486 1.5 christos if (i != 0
2487 1.5 christos && (hdr_info->u.dwarf.array[i].initial_loc
2488 1.5 christos < (hdr_info->u.dwarf.array[i - 1].initial_loc
2489 1.5 christos + hdr_info->u.dwarf.array[i - 1].range)))
2490 1.10 christos overlap = true;
2491 1.5 christos }
2492 1.5 christos if (overflow)
2493 1.8 christos _bfd_error_handler (_(".eh_frame_hdr entry overflow"));
2494 1.5 christos if (overlap)
2495 1.8 christos _bfd_error_handler (_(".eh_frame_hdr refers to overlapping FDEs"));
2496 1.5 christos if (overflow || overlap)
2497 1.1 skrll {
2498 1.5 christos bfd_set_error (bfd_error_bad_value);
2499 1.10 christos retval = false;
2500 1.1 skrll }
2501 1.1 skrll }
2502 1.1 skrll
2503 1.3 christos /* FIXME: octets_per_byte. */
2504 1.5 christos if (!bfd_set_section_contents (abfd, sec->output_section, contents,
2505 1.5 christos (file_ptr) sec->output_offset,
2506 1.5 christos sec->size))
2507 1.10 christos retval = false;
2508 1.1 skrll free (contents);
2509 1.5 christos
2510 1.10 christos free (hdr_info->u.dwarf.array);
2511 1.1 skrll return retval;
2512 1.1 skrll }
2513 1.1 skrll
2514 1.5 christos /* Write out .eh_frame_hdr section. This must be called after
2515 1.5 christos _bfd_elf_write_section_eh_frame has been called on all input
2516 1.5 christos .eh_frame sections. */
2517 1.5 christos
2518 1.10 christos bool
2519 1.5 christos _bfd_elf_write_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
2520 1.5 christos {
2521 1.5 christos struct elf_link_hash_table *htab;
2522 1.5 christos struct eh_frame_hdr_info *hdr_info;
2523 1.5 christos asection *sec;
2524 1.5 christos
2525 1.5 christos htab = elf_hash_table (info);
2526 1.5 christos hdr_info = &htab->eh_info;
2527 1.5 christos sec = hdr_info->hdr_sec;
2528 1.5 christos
2529 1.5 christos if (info->eh_frame_hdr_type == 0 || sec == NULL)
2530 1.10 christos return true;
2531 1.5 christos
2532 1.5 christos if (info->eh_frame_hdr_type == COMPACT_EH_HDR)
2533 1.5 christos return write_compact_eh_frame_hdr (abfd, info);
2534 1.5 christos else
2535 1.5 christos return write_dwarf_eh_frame_hdr (abfd, info);
2536 1.5 christos }
2537 1.5 christos
2538 1.1 skrll /* Return the width of FDE addresses. This is the default implementation. */
2539 1.1 skrll
2540 1.1 skrll unsigned int
2541 1.7 christos _bfd_elf_eh_frame_address_size (bfd *abfd, const asection *sec ATTRIBUTE_UNUSED)
2542 1.1 skrll {
2543 1.1 skrll return elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64 ? 8 : 4;
2544 1.1 skrll }
2545 1.1 skrll
2546 1.1 skrll /* Decide whether we can use a PC-relative encoding within the given
2547 1.1 skrll EH frame section. This is the default implementation. */
2548 1.1 skrll
2549 1.10 christos bool
2550 1.1 skrll _bfd_elf_can_make_relative (bfd *input_bfd ATTRIBUTE_UNUSED,
2551 1.1 skrll struct bfd_link_info *info ATTRIBUTE_UNUSED,
2552 1.1 skrll asection *eh_frame_section ATTRIBUTE_UNUSED)
2553 1.1 skrll {
2554 1.10 christos return true;
2555 1.1 skrll }
2556 1.1 skrll
2557 1.1 skrll /* Select an encoding for the given address. Preference is given to
2558 1.1 skrll PC-relative addressing modes. */
2559 1.1 skrll
2560 1.1 skrll bfd_byte
2561 1.1 skrll _bfd_elf_encode_eh_address (bfd *abfd ATTRIBUTE_UNUSED,
2562 1.1 skrll struct bfd_link_info *info ATTRIBUTE_UNUSED,
2563 1.1 skrll asection *osec, bfd_vma offset,
2564 1.1 skrll asection *loc_sec, bfd_vma loc_offset,
2565 1.1 skrll bfd_vma *encoded)
2566 1.1 skrll {
2567 1.1 skrll *encoded = osec->vma + offset -
2568 1.1 skrll (loc_sec->output_section->vma + loc_sec->output_offset + loc_offset);
2569 1.1 skrll return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
2570 1.1 skrll }
2571