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