[MIPS] Implement O32 FPXX, FP64 and FP64A ABI extensions
[platform/upstream/binutils.git] / bfd / elf-eh-frame.c
1 /* .eh_frame section optimization.
2    Copyright (C) 2001-2014 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   asection *output_sec;
50   struct eh_cie_fde *cie_inf;
51   unsigned char per_encoding;
52   unsigned char lsda_encoding;
53   unsigned char fde_encoding;
54   unsigned char initial_insn_length;
55   unsigned char can_make_lsda_relative;
56   unsigned char initial_instructions[50];
57 };
58
59
60
61 /* If *ITER hasn't reached END yet, read the next byte into *RESULT and
62    move onto the next byte.  Return true on success.  */
63
64 static inline bfd_boolean
65 read_byte (bfd_byte **iter, bfd_byte *end, unsigned char *result)
66 {
67   if (*iter >= end)
68     return FALSE;
69   *result = *((*iter)++);
70   return TRUE;
71 }
72
73 /* Move *ITER over LENGTH bytes, or up to END, whichever is closer.
74    Return true it was possible to move LENGTH bytes.  */
75
76 static inline bfd_boolean
77 skip_bytes (bfd_byte **iter, bfd_byte *end, bfd_size_type length)
78 {
79   if ((bfd_size_type) (end - *iter) < length)
80     {
81       *iter = end;
82       return FALSE;
83     }
84   *iter += length;
85   return TRUE;
86 }
87
88 /* Move *ITER over an leb128, stopping at END.  Return true if the end
89    of the leb128 was found.  */
90
91 static bfd_boolean
92 skip_leb128 (bfd_byte **iter, bfd_byte *end)
93 {
94   unsigned char byte;
95   do
96     if (!read_byte (iter, end, &byte))
97       return FALSE;
98   while (byte & 0x80);
99   return TRUE;
100 }
101
102 /* Like skip_leb128, but treat the leb128 as an unsigned value and
103    store it in *VALUE.  */
104
105 static bfd_boolean
106 read_uleb128 (bfd_byte **iter, bfd_byte *end, bfd_vma *value)
107 {
108   bfd_byte *start, *p;
109
110   start = *iter;
111   if (!skip_leb128 (iter, end))
112     return FALSE;
113
114   p = *iter;
115   *value = *--p;
116   while (p > start)
117     *value = (*value << 7) | (*--p & 0x7f);
118
119   return TRUE;
120 }
121
122 /* Like read_uleb128, but for signed values.  */
123
124 static bfd_boolean
125 read_sleb128 (bfd_byte **iter, bfd_byte *end, bfd_signed_vma *value)
126 {
127   bfd_byte *start, *p;
128
129   start = *iter;
130   if (!skip_leb128 (iter, end))
131     return FALSE;
132
133   p = *iter;
134   *value = ((*--p & 0x7f) ^ 0x40) - 0x40;
135   while (p > start)
136     *value = (*value << 7) | (*--p & 0x7f);
137
138   return TRUE;
139 }
140
141 /* Return 0 if either encoding is variable width, or not yet known to bfd.  */
142
143 static
144 int get_DW_EH_PE_width (int encoding, int ptr_size)
145 {
146   /* DW_EH_PE_ values of 0x60 and 0x70 weren't defined at the time .eh_frame
147      was added to bfd.  */
148   if ((encoding & 0x60) == 0x60)
149     return 0;
150
151   switch (encoding & 7)
152     {
153     case DW_EH_PE_udata2: return 2;
154     case DW_EH_PE_udata4: return 4;
155     case DW_EH_PE_udata8: return 8;
156     case DW_EH_PE_absptr: return ptr_size;
157     default:
158       break;
159     }
160
161   return 0;
162 }
163
164 #define get_DW_EH_PE_signed(encoding) (((encoding) & DW_EH_PE_signed) != 0)
165
166 /* Read a width sized value from memory.  */
167
168 static bfd_vma
169 read_value (bfd *abfd, bfd_byte *buf, int width, int is_signed)
170 {
171   bfd_vma value;
172
173   switch (width)
174     {
175     case 2:
176       if (is_signed)
177         value = bfd_get_signed_16 (abfd, buf);
178       else
179         value = bfd_get_16 (abfd, buf);
180       break;
181     case 4:
182       if (is_signed)
183         value = bfd_get_signed_32 (abfd, buf);
184       else
185         value = bfd_get_32 (abfd, buf);
186       break;
187     case 8:
188       if (is_signed)
189         value = bfd_get_signed_64 (abfd, buf);
190       else
191         value = bfd_get_64 (abfd, buf);
192       break;
193     default:
194       BFD_FAIL ();
195       return 0;
196     }
197
198   return value;
199 }
200
201 /* Store a width sized value to memory.  */
202
203 static void
204 write_value (bfd *abfd, bfd_byte *buf, bfd_vma value, int width)
205 {
206   switch (width)
207     {
208     case 2: bfd_put_16 (abfd, value, buf); break;
209     case 4: bfd_put_32 (abfd, value, buf); break;
210     case 8: bfd_put_64 (abfd, value, buf); break;
211     default: BFD_FAIL ();
212     }
213 }
214
215 /* Return one if C1 and C2 CIEs can be merged.  */
216
217 static int
218 cie_eq (const void *e1, const void *e2)
219 {
220   const struct cie *c1 = (const struct cie *) e1;
221   const struct cie *c2 = (const struct cie *) e2;
222
223   if (c1->hash == c2->hash
224       && c1->length == c2->length
225       && c1->version == c2->version
226       && c1->local_personality == c2->local_personality
227       && strcmp (c1->augmentation, c2->augmentation) == 0
228       && strcmp (c1->augmentation, "eh") != 0
229       && c1->code_align == c2->code_align
230       && c1->data_align == c2->data_align
231       && c1->ra_column == c2->ra_column
232       && c1->augmentation_size == c2->augmentation_size
233       && memcmp (&c1->personality, &c2->personality,
234                  sizeof (c1->personality)) == 0
235       && c1->output_sec == c2->output_sec
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->output_sec, 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 /* Called before calling _bfd_elf_parse_eh_frame on every input bfd's
456    .eh_frame section.  */
457
458 void
459 _bfd_elf_begin_eh_frame_parsing (struct bfd_link_info *info)
460 {
461   struct eh_frame_hdr_info *hdr_info;
462
463   hdr_info = &elf_hash_table (info)->eh_info;
464   hdr_info->merge_cies = !info->relocatable;
465 }
466
467 /* Try to parse .eh_frame section SEC, which belongs to ABFD.  Store the
468    information in the section's sec_info field on success.  COOKIE
469    describes the relocations in SEC.  */
470
471 void
472 _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
473                          asection *sec, struct elf_reloc_cookie *cookie)
474 {
475 #define REQUIRE(COND)                                   \
476   do                                                    \
477     if (!(COND))                                        \
478       goto free_no_table;                               \
479   while (0)
480
481   bfd_byte *ehbuf = NULL, *buf, *end;
482   bfd_byte *last_fde;
483   struct eh_cie_fde *this_inf;
484   unsigned int hdr_length, hdr_id;
485   unsigned int cie_count;
486   struct cie *cie, *local_cies = NULL;
487   struct elf_link_hash_table *htab;
488   struct eh_frame_hdr_info *hdr_info;
489   struct eh_frame_sec_info *sec_info = NULL;
490   unsigned int ptr_size;
491   unsigned int num_cies;
492   unsigned int num_entries;
493   elf_gc_mark_hook_fn gc_mark_hook;
494
495   htab = elf_hash_table (info);
496   hdr_info = &htab->eh_info;
497   if (hdr_info->parsed_eh_frames)
498     return;
499
500   if (sec->size == 0
501       || sec->sec_info_type != SEC_INFO_TYPE_NONE)
502     {
503       /* This file does not contain .eh_frame information.  */
504       return;
505     }
506
507   if (bfd_is_abs_section (sec->output_section))
508     {
509       /* At least one of the sections is being discarded from the
510          link, so we should just ignore them.  */
511       return;
512     }
513
514   /* Read the frame unwind information from abfd.  */
515
516   REQUIRE (bfd_malloc_and_get_section (abfd, sec, &ehbuf));
517
518   if (sec->size >= 4
519       && bfd_get_32 (abfd, ehbuf) == 0
520       && cookie->rel == cookie->relend)
521     {
522       /* Empty .eh_frame section.  */
523       free (ehbuf);
524       return;
525     }
526
527   /* If .eh_frame section size doesn't fit into int, we cannot handle
528      it (it would need to use 64-bit .eh_frame format anyway).  */
529   REQUIRE (sec->size == (unsigned int) sec->size);
530
531   ptr_size = (get_elf_backend_data (abfd)
532               ->elf_backend_eh_frame_address_size (abfd, sec));
533   REQUIRE (ptr_size != 0);
534
535   /* Go through the section contents and work out how many FDEs and
536      CIEs there are.  */
537   buf = ehbuf;
538   end = ehbuf + sec->size;
539   num_cies = 0;
540   num_entries = 0;
541   while (buf != end)
542     {
543       num_entries++;
544
545       /* Read the length of the entry.  */
546       REQUIRE (skip_bytes (&buf, end, 4));
547       hdr_length = bfd_get_32 (abfd, buf - 4);
548
549       /* 64-bit .eh_frame is not supported.  */
550       REQUIRE (hdr_length != 0xffffffff);
551       if (hdr_length == 0)
552         break;
553
554       REQUIRE (skip_bytes (&buf, end, 4));
555       hdr_id = bfd_get_32 (abfd, buf - 4);
556       if (hdr_id == 0)
557         num_cies++;
558
559       REQUIRE (skip_bytes (&buf, end, hdr_length - 4));
560     }
561
562   sec_info = (struct eh_frame_sec_info *)
563       bfd_zmalloc (sizeof (struct eh_frame_sec_info)
564                    + (num_entries - 1) * sizeof (struct eh_cie_fde));
565   REQUIRE (sec_info);
566
567   /* We need to have a "struct cie" for each CIE in this section.  */
568   local_cies = (struct cie *) bfd_zmalloc (num_cies * sizeof (*local_cies));
569   REQUIRE (local_cies);
570
571   /* FIXME: octets_per_byte.  */
572 #define ENSURE_NO_RELOCS(buf)                           \
573   REQUIRE (!(cookie->rel < cookie->relend               \
574              && (cookie->rel->r_offset                  \
575                  < (bfd_size_type) ((buf) - ehbuf))     \
576              && cookie->rel->r_info != 0))
577
578   /* FIXME: octets_per_byte.  */
579 #define SKIP_RELOCS(buf)                                \
580   while (cookie->rel < cookie->relend                   \
581          && (cookie->rel->r_offset                      \
582              < (bfd_size_type) ((buf) - ehbuf)))        \
583     cookie->rel++
584
585   /* FIXME: octets_per_byte.  */
586 #define GET_RELOC(buf)                                  \
587   ((cookie->rel < cookie->relend                        \
588     && (cookie->rel->r_offset                           \
589         == (bfd_size_type) ((buf) - ehbuf)))            \
590    ? cookie->rel : NULL)
591
592   buf = ehbuf;
593   cie_count = 0;
594   gc_mark_hook = get_elf_backend_data (abfd)->gc_mark_hook;
595   while ((bfd_size_type) (buf - ehbuf) != sec->size)
596     {
597       char *aug;
598       bfd_byte *start, *insns, *insns_end;
599       bfd_size_type length;
600       unsigned int set_loc_count;
601
602       this_inf = sec_info->entry + sec_info->count;
603       last_fde = buf;
604
605       /* Read the length of the entry.  */
606       REQUIRE (skip_bytes (&buf, ehbuf + sec->size, 4));
607       hdr_length = bfd_get_32 (abfd, buf - 4);
608
609       /* The CIE/FDE must be fully contained in this input section.  */
610       REQUIRE ((bfd_size_type) (buf - ehbuf) + hdr_length <= sec->size);
611       end = buf + hdr_length;
612
613       this_inf->offset = last_fde - ehbuf;
614       this_inf->size = 4 + hdr_length;
615       this_inf->reloc_index = cookie->rel - cookie->rels;
616
617       if (hdr_length == 0)
618         {
619           /* A zero-length CIE should only be found at the end of
620              the section.  */
621           REQUIRE ((bfd_size_type) (buf - ehbuf) == sec->size);
622           ENSURE_NO_RELOCS (buf);
623           sec_info->count++;
624           break;
625         }
626
627       REQUIRE (skip_bytes (&buf, end, 4));
628       hdr_id = bfd_get_32 (abfd, buf - 4);
629
630       if (hdr_id == 0)
631         {
632           unsigned int initial_insn_length;
633
634           /* CIE  */
635           this_inf->cie = 1;
636
637           /* Point CIE to one of the section-local cie structures.  */
638           cie = local_cies + cie_count++;
639
640           cie->cie_inf = this_inf;
641           cie->length = hdr_length;
642           cie->output_sec = sec->output_section;
643           start = buf;
644           REQUIRE (read_byte (&buf, end, &cie->version));
645
646           /* Cannot handle unknown versions.  */
647           REQUIRE (cie->version == 1
648                    || cie->version == 3
649                    || cie->version == 4);
650           REQUIRE (strlen ((char *) buf) < sizeof (cie->augmentation));
651
652           strcpy (cie->augmentation, (char *) buf);
653           buf = (bfd_byte *) strchr ((char *) buf, '\0') + 1;
654           ENSURE_NO_RELOCS (buf);
655           if (buf[0] == 'e' && buf[1] == 'h')
656             {
657               /* GCC < 3.0 .eh_frame CIE */
658               /* We cannot merge "eh" CIEs because __EXCEPTION_TABLE__
659                  is private to each CIE, so we don't need it for anything.
660                  Just skip it.  */
661               REQUIRE (skip_bytes (&buf, end, ptr_size));
662               SKIP_RELOCS (buf);
663             }
664           if (cie->version >= 4)
665             {
666               REQUIRE (buf + 1 < end);
667               REQUIRE (buf[0] == ptr_size);
668               REQUIRE (buf[1] == 0);
669               buf += 2;
670             }
671           REQUIRE (read_uleb128 (&buf, end, &cie->code_align));
672           REQUIRE (read_sleb128 (&buf, end, &cie->data_align));
673           if (cie->version == 1)
674             {
675               REQUIRE (buf < end);
676               cie->ra_column = *buf++;
677             }
678           else
679             REQUIRE (read_uleb128 (&buf, end, &cie->ra_column));
680           ENSURE_NO_RELOCS (buf);
681           cie->lsda_encoding = DW_EH_PE_omit;
682           cie->fde_encoding = DW_EH_PE_omit;
683           cie->per_encoding = DW_EH_PE_omit;
684           aug = cie->augmentation;
685           if (aug[0] != 'e' || aug[1] != 'h')
686             {
687               if (*aug == 'z')
688                 {
689                   aug++;
690                   REQUIRE (read_uleb128 (&buf, end, &cie->augmentation_size));
691                   ENSURE_NO_RELOCS (buf);
692                 }
693
694               while (*aug != '\0')
695                 switch (*aug++)
696                   {
697                   case 'L':
698                     REQUIRE (read_byte (&buf, end, &cie->lsda_encoding));
699                     ENSURE_NO_RELOCS (buf);
700                     REQUIRE (get_DW_EH_PE_width (cie->lsda_encoding, ptr_size));
701                     break;
702                   case 'R':
703                     REQUIRE (read_byte (&buf, end, &cie->fde_encoding));
704                     ENSURE_NO_RELOCS (buf);
705                     REQUIRE (get_DW_EH_PE_width (cie->fde_encoding, ptr_size));
706                     break;
707                   case 'S':
708                     break;
709                   case 'P':
710                     {
711                       int per_width;
712
713                       REQUIRE (read_byte (&buf, end, &cie->per_encoding));
714                       per_width = get_DW_EH_PE_width (cie->per_encoding,
715                                                       ptr_size);
716                       REQUIRE (per_width);
717                       if ((cie->per_encoding & 0x70) == DW_EH_PE_aligned)
718                         {
719                           length = -(buf - ehbuf) & (per_width - 1);
720                           REQUIRE (skip_bytes (&buf, end, length));
721                         }
722                       this_inf->u.cie.personality_offset = buf - start;
723                       ENSURE_NO_RELOCS (buf);
724                       /* Ensure we have a reloc here.  */
725                       REQUIRE (GET_RELOC (buf));
726                       cie->personality.reloc_index
727                         = cookie->rel - cookie->rels;
728                       /* Cope with MIPS-style composite relocations.  */
729                       do
730                         cookie->rel++;
731                       while (GET_RELOC (buf) != NULL);
732                       REQUIRE (skip_bytes (&buf, end, per_width));
733                     }
734                     break;
735                   default:
736                     /* Unrecognized augmentation. Better bail out.  */
737                     goto free_no_table;
738                   }
739             }
740
741           /* For shared libraries, try to get rid of as many RELATIVE relocs
742              as possible.  */
743           if (info->shared
744               && (get_elf_backend_data (abfd)
745                   ->elf_backend_can_make_relative_eh_frame
746                   (abfd, info, sec)))
747             {
748               if ((cie->fde_encoding & 0x70) == DW_EH_PE_absptr)
749                 this_inf->make_relative = 1;
750               /* If the CIE doesn't already have an 'R' entry, it's fairly
751                  easy to add one, provided that there's no aligned data
752                  after the augmentation string.  */
753               else if (cie->fde_encoding == DW_EH_PE_omit
754                        && (cie->per_encoding & 0x70) != DW_EH_PE_aligned)
755                 {
756                   if (*cie->augmentation == 0)
757                     this_inf->add_augmentation_size = 1;
758                   this_inf->u.cie.add_fde_encoding = 1;
759                   this_inf->make_relative = 1;
760                 }
761
762               if ((cie->lsda_encoding & 0x70) == DW_EH_PE_absptr)
763                 cie->can_make_lsda_relative = 1;
764             }
765
766           /* If FDE encoding was not specified, it defaults to
767              DW_EH_absptr.  */
768           if (cie->fde_encoding == DW_EH_PE_omit)
769             cie->fde_encoding = DW_EH_PE_absptr;
770
771           initial_insn_length = end - buf;
772           cie->initial_insn_length = initial_insn_length;
773           memcpy (cie->initial_instructions, buf,
774                   initial_insn_length <= sizeof (cie->initial_instructions)
775                   ? initial_insn_length : sizeof (cie->initial_instructions));
776           insns = buf;
777           buf += initial_insn_length;
778           ENSURE_NO_RELOCS (buf);
779
780           if (hdr_info->merge_cies)
781             this_inf->u.cie.u.full_cie = cie;
782           this_inf->u.cie.per_encoding_relative
783             = (cie->per_encoding & 0x70) == DW_EH_PE_pcrel;
784         }
785       else
786         {
787           /* Find the corresponding CIE.  */
788           unsigned int cie_offset = this_inf->offset + 4 - hdr_id;
789           for (cie = local_cies; cie < local_cies + cie_count; cie++)
790             if (cie_offset == cie->cie_inf->offset)
791               break;
792
793           /* Ensure this FDE references one of the CIEs in this input
794              section.  */
795           REQUIRE (cie != local_cies + cie_count);
796           this_inf->u.fde.cie_inf = cie->cie_inf;
797           this_inf->make_relative = cie->cie_inf->make_relative;
798           this_inf->add_augmentation_size
799             = cie->cie_inf->add_augmentation_size;
800
801           ENSURE_NO_RELOCS (buf);
802           if ((sec->flags & SEC_LINKER_CREATED) == 0 || cookie->rels != NULL)
803             {
804               asection *rsec;
805
806               REQUIRE (GET_RELOC (buf));
807
808               /* Chain together the FDEs for each section.  */
809               rsec = _bfd_elf_gc_mark_rsec (info, sec, gc_mark_hook, cookie);
810               /* RSEC will be NULL if FDE was cleared out as it was belonging to
811                  a discarded SHT_GROUP.  */
812               if (rsec)
813                 {
814                   REQUIRE (rsec->owner == abfd);
815                   this_inf->u.fde.next_for_section = elf_fde_list (rsec);
816                   elf_fde_list (rsec) = this_inf;
817                 }
818             }
819
820           /* Skip the initial location and address range.  */
821           start = buf;
822           length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
823           REQUIRE (skip_bytes (&buf, end, 2 * length));
824
825           /* Skip the augmentation size, if present.  */
826           if (cie->augmentation[0] == 'z')
827             REQUIRE (read_uleb128 (&buf, end, &length));
828           else
829             length = 0;
830
831           /* Of the supported augmentation characters above, only 'L'
832              adds augmentation data to the FDE.  This code would need to
833              be adjusted if any future augmentations do the same thing.  */
834           if (cie->lsda_encoding != DW_EH_PE_omit)
835             {
836               SKIP_RELOCS (buf);
837               if (cie->can_make_lsda_relative && GET_RELOC (buf))
838                 cie->cie_inf->u.cie.make_lsda_relative = 1;
839               this_inf->lsda_offset = buf - start;
840               /* If there's no 'z' augmentation, we don't know where the
841                  CFA insns begin.  Assume no padding.  */
842               if (cie->augmentation[0] != 'z')
843                 length = end - buf;
844             }
845
846           /* Skip over the augmentation data.  */
847           REQUIRE (skip_bytes (&buf, end, length));
848           insns = buf;
849
850           buf = last_fde + 4 + hdr_length;
851
852           /* For NULL RSEC (cleared FDE belonging to a discarded section)
853              the relocations are commonly cleared.  We do not sanity check if
854              all these relocations are cleared as (1) relocations to
855              .gcc_except_table will remain uncleared (they will get dropped
856              with the drop of this unused FDE) and (2) BFD already safely drops
857              relocations of any type to .eh_frame by
858              elf_section_ignore_discarded_relocs.
859              TODO: The .gcc_except_table entries should be also filtered as
860              .eh_frame entries; or GCC could rather use COMDAT for them.  */
861           SKIP_RELOCS (buf);
862         }
863
864       /* Try to interpret the CFA instructions and find the first
865          padding nop.  Shrink this_inf's size so that it doesn't
866          include the padding.  */
867       length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
868       set_loc_count = 0;
869       insns_end = skip_non_nops (insns, end, length, &set_loc_count);
870       /* If we don't understand the CFA instructions, we can't know
871          what needs to be adjusted there.  */
872       if (insns_end == NULL
873           /* For the time being we don't support DW_CFA_set_loc in
874              CIE instructions.  */
875           || (set_loc_count && this_inf->cie))
876         goto free_no_table;
877       this_inf->size -= end - insns_end;
878       if (insns_end != end && this_inf->cie)
879         {
880           cie->initial_insn_length -= end - insns_end;
881           cie->length -= end - insns_end;
882         }
883       if (set_loc_count
884           && ((cie->fde_encoding & 0x70) == DW_EH_PE_pcrel
885               || this_inf->make_relative))
886         {
887           unsigned int cnt;
888           bfd_byte *p;
889
890           this_inf->set_loc = (unsigned int *)
891               bfd_malloc ((set_loc_count + 1) * sizeof (unsigned int));
892           REQUIRE (this_inf->set_loc);
893           this_inf->set_loc[0] = set_loc_count;
894           p = insns;
895           cnt = 0;
896           while (p < end)
897             {
898               if (*p == DW_CFA_set_loc)
899                 this_inf->set_loc[++cnt] = p + 1 - start;
900               REQUIRE (skip_cfa_op (&p, end, length));
901             }
902         }
903
904       this_inf->removed = 1;
905       this_inf->fde_encoding = cie->fde_encoding;
906       this_inf->lsda_encoding = cie->lsda_encoding;
907       sec_info->count++;
908     }
909   BFD_ASSERT (sec_info->count == num_entries);
910   BFD_ASSERT (cie_count == num_cies);
911
912   elf_section_data (sec)->sec_info = sec_info;
913   sec->sec_info_type = SEC_INFO_TYPE_EH_FRAME;
914   if (hdr_info->merge_cies)
915     {
916       sec_info->cies = local_cies;
917       local_cies = NULL;
918     }
919   goto success;
920
921  free_no_table:
922   (*info->callbacks->einfo)
923     (_("%P: error in %B(%A); no .eh_frame_hdr table will be created.\n"),
924      abfd, sec);
925   hdr_info->table = FALSE;
926   if (sec_info)
927     free (sec_info);
928  success:
929   if (ehbuf)
930     free (ehbuf);
931   if (local_cies)
932     free (local_cies);
933 #undef REQUIRE
934 }
935
936 /* Finish a pass over all .eh_frame sections.  */
937
938 void
939 _bfd_elf_end_eh_frame_parsing (struct bfd_link_info *info)
940 {
941   struct eh_frame_hdr_info *hdr_info;
942
943   hdr_info = &elf_hash_table (info)->eh_info;
944   hdr_info->parsed_eh_frames = TRUE;
945 }
946
947 /* Mark all relocations against CIE or FDE ENT, which occurs in
948    .eh_frame section SEC.  COOKIE describes the relocations in SEC;
949    its "rel" field can be changed freely.  */
950
951 static bfd_boolean
952 mark_entry (struct bfd_link_info *info, asection *sec,
953             struct eh_cie_fde *ent, elf_gc_mark_hook_fn gc_mark_hook,
954             struct elf_reloc_cookie *cookie)
955 {
956   /* FIXME: octets_per_byte.  */
957   for (cookie->rel = cookie->rels + ent->reloc_index;
958        cookie->rel < cookie->relend
959          && cookie->rel->r_offset < ent->offset + ent->size;
960        cookie->rel++)
961     if (!_bfd_elf_gc_mark_reloc (info, sec, gc_mark_hook, cookie))
962       return FALSE;
963
964   return TRUE;
965 }
966
967 /* Mark all the relocations against FDEs that relate to code in input
968    section SEC.  The FDEs belong to .eh_frame section EH_FRAME, whose
969    relocations are described by COOKIE.  */
970
971 bfd_boolean
972 _bfd_elf_gc_mark_fdes (struct bfd_link_info *info, asection *sec,
973                        asection *eh_frame, elf_gc_mark_hook_fn gc_mark_hook,
974                        struct elf_reloc_cookie *cookie)
975 {
976   struct eh_cie_fde *fde, *cie;
977
978   for (fde = elf_fde_list (sec); fde; fde = fde->u.fde.next_for_section)
979     {
980       if (!mark_entry (info, eh_frame, fde, gc_mark_hook, cookie))
981         return FALSE;
982
983       /* At this stage, all cie_inf fields point to local CIEs, so we
984          can use the same cookie to refer to them.  */
985       cie = fde->u.fde.cie_inf;
986       if (!cie->u.cie.gc_mark)
987         {
988           cie->u.cie.gc_mark = 1;
989           if (!mark_entry (info, eh_frame, cie, gc_mark_hook, cookie))
990             return FALSE;
991         }
992     }
993   return TRUE;
994 }
995
996 /* Input section SEC of ABFD is an .eh_frame section that contains the
997    CIE described by CIE_INF.  Return a version of CIE_INF that is going
998    to be kept in the output, adding CIE_INF to the output if necessary.
999
1000    HDR_INFO is the .eh_frame_hdr information and COOKIE describes the
1001    relocations in REL.  */
1002
1003 static struct eh_cie_fde *
1004 find_merged_cie (bfd *abfd, struct bfd_link_info *info, asection *sec,
1005                  struct eh_frame_hdr_info *hdr_info,
1006                  struct elf_reloc_cookie *cookie,
1007                  struct eh_cie_fde *cie_inf)
1008 {
1009   unsigned long r_symndx;
1010   struct cie *cie, *new_cie;
1011   Elf_Internal_Rela *rel;
1012   void **loc;
1013
1014   /* Use CIE_INF if we have already decided to keep it.  */
1015   if (!cie_inf->removed)
1016     return cie_inf;
1017
1018   /* If we have merged CIE_INF with another CIE, use that CIE instead.  */
1019   if (cie_inf->u.cie.merged)
1020     return cie_inf->u.cie.u.merged_with;
1021
1022   cie = cie_inf->u.cie.u.full_cie;
1023
1024   /* Assume we will need to keep CIE_INF.  */
1025   cie_inf->removed = 0;
1026   cie_inf->u.cie.u.sec = sec;
1027
1028   /* If we are not merging CIEs, use CIE_INF.  */
1029   if (cie == NULL)
1030     return cie_inf;
1031
1032   if (cie->per_encoding != DW_EH_PE_omit)
1033     {
1034       bfd_boolean per_binds_local;
1035
1036       /* Work out the address of personality routine, or at least
1037          enough info that we could calculate the address had we made a
1038          final section layout.  The symbol on the reloc is enough,
1039          either the hash for a global, or (bfd id, index) pair for a
1040          local.  The assumption here is that no one uses addends on
1041          the reloc.  */
1042       rel = cookie->rels + cie->personality.reloc_index;
1043       memset (&cie->personality, 0, sizeof (cie->personality));
1044 #ifdef BFD64
1045       if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64)
1046         r_symndx = ELF64_R_SYM (rel->r_info);
1047       else
1048 #endif
1049         r_symndx = ELF32_R_SYM (rel->r_info);
1050       if (r_symndx >= cookie->locsymcount
1051           || ELF_ST_BIND (cookie->locsyms[r_symndx].st_info) != STB_LOCAL)
1052         {
1053           struct elf_link_hash_entry *h;
1054
1055           r_symndx -= cookie->extsymoff;
1056           h = cookie->sym_hashes[r_symndx];
1057
1058           while (h->root.type == bfd_link_hash_indirect
1059                  || h->root.type == bfd_link_hash_warning)
1060             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1061
1062           cie->personality.h = h;
1063           per_binds_local = SYMBOL_REFERENCES_LOCAL (info, h);
1064         }
1065       else
1066         {
1067           Elf_Internal_Sym *sym;
1068           asection *sym_sec;
1069
1070           sym = &cookie->locsyms[r_symndx];
1071           sym_sec = bfd_section_from_elf_index (abfd, sym->st_shndx);
1072           if (sym_sec == NULL)
1073             return cie_inf;
1074
1075           if (sym_sec->kept_section != NULL)
1076             sym_sec = sym_sec->kept_section;
1077           if (sym_sec->output_section == NULL)
1078             return cie_inf;
1079
1080           cie->local_personality = 1;
1081           cie->personality.sym.bfd_id = abfd->id;
1082           cie->personality.sym.index = r_symndx;
1083           per_binds_local = TRUE;
1084         }
1085
1086       if (per_binds_local
1087           && info->shared
1088           && (cie->per_encoding & 0x70) == DW_EH_PE_absptr
1089           && (get_elf_backend_data (abfd)
1090               ->elf_backend_can_make_relative_eh_frame (abfd, info, sec)))
1091         {
1092           cie_inf->u.cie.make_per_encoding_relative = 1;
1093           cie_inf->u.cie.per_encoding_relative = 1;
1094         }
1095     }
1096
1097   /* See if we can merge this CIE with an earlier one.  */
1098   cie->output_sec = sec->output_section;
1099   cie_compute_hash (cie);
1100   if (hdr_info->cies == NULL)
1101     {
1102       hdr_info->cies = htab_try_create (1, cie_hash, cie_eq, free);
1103       if (hdr_info->cies == NULL)
1104         return cie_inf;
1105     }
1106   loc = htab_find_slot_with_hash (hdr_info->cies, cie, cie->hash, INSERT);
1107   if (loc == NULL)
1108     return cie_inf;
1109
1110   new_cie = (struct cie *) *loc;
1111   if (new_cie == NULL)
1112     {
1113       /* Keep CIE_INF and record it in the hash table.  */
1114       new_cie = (struct cie *) malloc (sizeof (struct cie));
1115       if (new_cie == NULL)
1116         return cie_inf;
1117
1118       memcpy (new_cie, cie, sizeof (struct cie));
1119       *loc = new_cie;
1120     }
1121   else
1122     {
1123       /* Merge CIE_INF with NEW_CIE->CIE_INF.  */
1124       cie_inf->removed = 1;
1125       cie_inf->u.cie.merged = 1;
1126       cie_inf->u.cie.u.merged_with = new_cie->cie_inf;
1127       if (cie_inf->u.cie.make_lsda_relative)
1128         new_cie->cie_inf->u.cie.make_lsda_relative = 1;
1129     }
1130   return new_cie->cie_inf;
1131 }
1132
1133 /* This function is called for each input file before the .eh_frame
1134    section is relocated.  It discards duplicate CIEs and FDEs for discarded
1135    functions.  The function returns TRUE iff any entries have been
1136    deleted.  */
1137
1138 bfd_boolean
1139 _bfd_elf_discard_section_eh_frame
1140    (bfd *abfd, struct bfd_link_info *info, asection *sec,
1141     bfd_boolean (*reloc_symbol_deleted_p) (bfd_vma, void *),
1142     struct elf_reloc_cookie *cookie)
1143 {
1144   struct eh_cie_fde *ent;
1145   struct eh_frame_sec_info *sec_info;
1146   struct eh_frame_hdr_info *hdr_info;
1147   unsigned int ptr_size, offset;
1148
1149   if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
1150     return FALSE;
1151
1152   sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
1153   if (sec_info == NULL)
1154     return FALSE;
1155
1156   ptr_size = (get_elf_backend_data (sec->owner)
1157               ->elf_backend_eh_frame_address_size (sec->owner, sec));
1158
1159   hdr_info = &elf_hash_table (info)->eh_info;
1160   for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1161     if (ent->size == 4)
1162       /* There should only be one zero terminator, on the last input
1163          file supplying .eh_frame (crtend.o).  Remove any others.  */
1164       ent->removed = sec->map_head.s != NULL;
1165     else if (!ent->cie)
1166       {
1167         bfd_boolean keep;
1168         if ((sec->flags & SEC_LINKER_CREATED) != 0 && cookie->rels == NULL)
1169           {
1170             unsigned int width
1171               = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1172             bfd_vma value
1173               = read_value (abfd, sec->contents + ent->offset + 8 + width,
1174                             width, get_DW_EH_PE_signed (ent->fde_encoding));
1175             keep = value != 0;
1176           }
1177         else
1178           {
1179             cookie->rel = cookie->rels + ent->reloc_index;
1180             /* FIXME: octets_per_byte.  */
1181             BFD_ASSERT (cookie->rel < cookie->relend
1182                         && cookie->rel->r_offset == ent->offset + 8);
1183             keep = !(*reloc_symbol_deleted_p) (ent->offset + 8, cookie);
1184           }
1185         if (keep)
1186           {
1187             if (info->shared
1188                 && (((ent->fde_encoding & 0x70) == DW_EH_PE_absptr
1189                      && ent->make_relative == 0)
1190                     || (ent->fde_encoding & 0x70) == DW_EH_PE_aligned))
1191               {
1192                 /* If a shared library uses absolute pointers
1193                    which we cannot turn into PC relative,
1194                    don't create the binary search table,
1195                    since it is affected by runtime relocations.  */
1196                 hdr_info->table = FALSE;
1197                 (*info->callbacks->einfo)
1198                   (_("%P: fde encoding in %B(%A) prevents .eh_frame_hdr"
1199                      " table being created.\n"), abfd, sec);
1200               }
1201             ent->removed = 0;
1202             hdr_info->fde_count++;
1203             ent->u.fde.cie_inf = find_merged_cie (abfd, info, sec, hdr_info,
1204                                                   cookie, ent->u.fde.cie_inf);
1205           }
1206       }
1207
1208   if (sec_info->cies)
1209     {
1210       free (sec_info->cies);
1211       sec_info->cies = NULL;
1212     }
1213
1214   offset = 0;
1215   for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1216     if (!ent->removed)
1217       {
1218         ent->new_offset = offset;
1219         offset += size_of_output_cie_fde (ent, ptr_size);
1220       }
1221
1222   sec->rawsize = sec->size;
1223   sec->size = offset;
1224   return offset != sec->rawsize;
1225 }
1226
1227 /* This function is called for .eh_frame_hdr section after
1228    _bfd_elf_discard_section_eh_frame has been called on all .eh_frame
1229    input sections.  It finalizes the size of .eh_frame_hdr section.  */
1230
1231 bfd_boolean
1232 _bfd_elf_discard_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
1233 {
1234   struct elf_link_hash_table *htab;
1235   struct eh_frame_hdr_info *hdr_info;
1236   asection *sec;
1237
1238   htab = elf_hash_table (info);
1239   hdr_info = &htab->eh_info;
1240
1241   if (hdr_info->cies != NULL)
1242     {
1243       htab_delete (hdr_info->cies);
1244       hdr_info->cies = NULL;
1245     }
1246
1247   sec = hdr_info->hdr_sec;
1248   if (sec == NULL)
1249     return FALSE;
1250
1251   sec->size = EH_FRAME_HDR_SIZE;
1252   if (hdr_info->table)
1253     sec->size += 4 + hdr_info->fde_count * 8;
1254
1255   elf_eh_frame_hdr (abfd) = sec;
1256   return TRUE;
1257 }
1258
1259 /* Return true if there is at least one non-empty .eh_frame section in
1260    input files.  Can only be called after ld has mapped input to
1261    output sections, and before sections are stripped.  */
1262 bfd_boolean
1263 _bfd_elf_eh_frame_present (struct bfd_link_info *info)
1264 {
1265   asection *eh = bfd_get_section_by_name (info->output_bfd, ".eh_frame");
1266
1267   if (eh == NULL)
1268     return FALSE;
1269
1270   /* Count only sections which have at least a single CIE or FDE.
1271      There cannot be any CIE or FDE <= 8 bytes.  */
1272   for (eh = eh->map_head.s; eh != NULL; eh = eh->map_head.s)
1273     if (eh->size > 8)
1274       return TRUE;
1275
1276   return FALSE;
1277 }
1278
1279 /* This function is called from size_dynamic_sections.
1280    It needs to decide whether .eh_frame_hdr should be output or not,
1281    because when the dynamic symbol table has been sized it is too late
1282    to strip sections.  */
1283
1284 bfd_boolean
1285 _bfd_elf_maybe_strip_eh_frame_hdr (struct bfd_link_info *info)
1286 {
1287   struct elf_link_hash_table *htab;
1288   struct eh_frame_hdr_info *hdr_info;
1289
1290   htab = elf_hash_table (info);
1291   hdr_info = &htab->eh_info;
1292   if (hdr_info->hdr_sec == NULL)
1293     return TRUE;
1294
1295   if (bfd_is_abs_section (hdr_info->hdr_sec->output_section)
1296       || !info->eh_frame_hdr
1297       || !_bfd_elf_eh_frame_present (info))
1298     {
1299       hdr_info->hdr_sec->flags |= SEC_EXCLUDE;
1300       hdr_info->hdr_sec = NULL;
1301       return TRUE;
1302     }
1303
1304   hdr_info->table = TRUE;
1305   return TRUE;
1306 }
1307
1308 /* Adjust an address in the .eh_frame section.  Given OFFSET within
1309    SEC, this returns the new offset in the adjusted .eh_frame section,
1310    or -1 if the address refers to a CIE/FDE which has been removed
1311    or to offset with dynamic relocation which is no longer needed.  */
1312
1313 bfd_vma
1314 _bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED,
1315                                   struct bfd_link_info *info ATTRIBUTE_UNUSED,
1316                                   asection *sec,
1317                                   bfd_vma offset)
1318 {
1319   struct eh_frame_sec_info *sec_info;
1320   unsigned int lo, hi, mid;
1321
1322   if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
1323     return offset;
1324   sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
1325
1326   if (offset >= sec->rawsize)
1327     return offset - sec->rawsize + sec->size;
1328
1329   lo = 0;
1330   hi = sec_info->count;
1331   mid = 0;
1332   while (lo < hi)
1333     {
1334       mid = (lo + hi) / 2;
1335       if (offset < sec_info->entry[mid].offset)
1336         hi = mid;
1337       else if (offset
1338                >= sec_info->entry[mid].offset + sec_info->entry[mid].size)
1339         lo = mid + 1;
1340       else
1341         break;
1342     }
1343
1344   BFD_ASSERT (lo < hi);
1345
1346   /* FDE or CIE was removed.  */
1347   if (sec_info->entry[mid].removed)
1348     return (bfd_vma) -1;
1349
1350   /* If converting personality pointers to DW_EH_PE_pcrel, there will be
1351      no need for run-time relocation against the personality field.  */
1352   if (sec_info->entry[mid].cie
1353       && sec_info->entry[mid].u.cie.make_per_encoding_relative
1354       && offset == (sec_info->entry[mid].offset + 8
1355                     + sec_info->entry[mid].u.cie.personality_offset))
1356     return (bfd_vma) -2;
1357
1358   /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
1359      relocation against FDE's initial_location field.  */
1360   if (!sec_info->entry[mid].cie
1361       && sec_info->entry[mid].make_relative
1362       && offset == sec_info->entry[mid].offset + 8)
1363     return (bfd_vma) -2;
1364
1365   /* If converting LSDA pointers to DW_EH_PE_pcrel, there will be no need
1366      for run-time relocation against LSDA field.  */
1367   if (!sec_info->entry[mid].cie
1368       && sec_info->entry[mid].u.fde.cie_inf->u.cie.make_lsda_relative
1369       && offset == (sec_info->entry[mid].offset + 8
1370                     + sec_info->entry[mid].lsda_offset))
1371     return (bfd_vma) -2;
1372
1373   /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
1374      relocation against DW_CFA_set_loc's arguments.  */
1375   if (sec_info->entry[mid].set_loc
1376       && sec_info->entry[mid].make_relative
1377       && (offset >= sec_info->entry[mid].offset + 8
1378                     + sec_info->entry[mid].set_loc[1]))
1379     {
1380       unsigned int cnt;
1381
1382       for (cnt = 1; cnt <= sec_info->entry[mid].set_loc[0]; cnt++)
1383         if (offset == sec_info->entry[mid].offset + 8
1384                       + sec_info->entry[mid].set_loc[cnt])
1385           return (bfd_vma) -2;
1386     }
1387
1388   /* Any new augmentation bytes go before the first relocation.  */
1389   return (offset + sec_info->entry[mid].new_offset
1390           - sec_info->entry[mid].offset
1391           + extra_augmentation_string_bytes (sec_info->entry + mid)
1392           + extra_augmentation_data_bytes (sec_info->entry + mid));
1393 }
1394
1395 /* Write out .eh_frame section.  This is called with the relocated
1396    contents.  */
1397
1398 bfd_boolean
1399 _bfd_elf_write_section_eh_frame (bfd *abfd,
1400                                  struct bfd_link_info *info,
1401                                  asection *sec,
1402                                  bfd_byte *contents)
1403 {
1404   struct eh_frame_sec_info *sec_info;
1405   struct elf_link_hash_table *htab;
1406   struct eh_frame_hdr_info *hdr_info;
1407   unsigned int ptr_size;
1408   struct eh_cie_fde *ent;
1409
1410   if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
1411     /* FIXME: octets_per_byte.  */
1412     return bfd_set_section_contents (abfd, sec->output_section, contents,
1413                                      sec->output_offset, sec->size);
1414
1415   ptr_size = (get_elf_backend_data (abfd)
1416               ->elf_backend_eh_frame_address_size (abfd, sec));
1417   BFD_ASSERT (ptr_size != 0);
1418
1419   sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
1420   htab = elf_hash_table (info);
1421   hdr_info = &htab->eh_info;
1422
1423   if (hdr_info->table && hdr_info->array == NULL)
1424     hdr_info->array = (struct eh_frame_array_ent *)
1425         bfd_malloc (hdr_info->fde_count * sizeof(*hdr_info->array));
1426   if (hdr_info->array == NULL)
1427     hdr_info = NULL;
1428
1429   /* The new offsets can be bigger or smaller than the original offsets.
1430      We therefore need to make two passes over the section: one backward
1431      pass to move entries up and one forward pass to move entries down.
1432      The two passes won't interfere with each other because entries are
1433      not reordered  */
1434   for (ent = sec_info->entry + sec_info->count; ent-- != sec_info->entry;)
1435     if (!ent->removed && ent->new_offset > ent->offset)
1436       memmove (contents + ent->new_offset, contents + ent->offset, ent->size);
1437
1438   for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1439     if (!ent->removed && ent->new_offset < ent->offset)
1440       memmove (contents + ent->new_offset, contents + ent->offset, ent->size);
1441
1442   for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1443     {
1444       unsigned char *buf, *end;
1445       unsigned int new_size;
1446
1447       if (ent->removed)
1448         continue;
1449
1450       if (ent->size == 4)
1451         {
1452           /* Any terminating FDE must be at the end of the section.  */
1453           BFD_ASSERT (ent == sec_info->entry + sec_info->count - 1);
1454           continue;
1455         }
1456
1457       buf = contents + ent->new_offset;
1458       end = buf + ent->size;
1459       new_size = size_of_output_cie_fde (ent, ptr_size);
1460
1461       /* Update the size.  It may be shrinked.  */
1462       bfd_put_32 (abfd, new_size - 4, buf);
1463
1464       /* Filling the extra bytes with DW_CFA_nops.  */
1465       if (new_size != ent->size)
1466         memset (end, 0, new_size - ent->size);
1467
1468       if (ent->cie)
1469         {
1470           /* CIE */
1471           if (ent->make_relative
1472               || ent->u.cie.make_lsda_relative
1473               || ent->u.cie.per_encoding_relative)
1474             {
1475               char *aug;
1476               unsigned int action, extra_string, extra_data;
1477               unsigned int per_width, per_encoding;
1478
1479               /* Need to find 'R' or 'L' augmentation's argument and modify
1480                  DW_EH_PE_* value.  */
1481               action = ((ent->make_relative ? 1 : 0)
1482                         | (ent->u.cie.make_lsda_relative ? 2 : 0)
1483                         | (ent->u.cie.per_encoding_relative ? 4 : 0));
1484               extra_string = extra_augmentation_string_bytes (ent);
1485               extra_data = extra_augmentation_data_bytes (ent);
1486
1487               /* Skip length, id and version.  */
1488               buf += 9;
1489               aug = (char *) buf;
1490               buf += strlen (aug) + 1;
1491               skip_leb128 (&buf, end);
1492               skip_leb128 (&buf, end);
1493               skip_leb128 (&buf, end);
1494               if (*aug == 'z')
1495                 {
1496                   /* The uleb128 will always be a single byte for the kind
1497                      of augmentation strings that we're prepared to handle.  */
1498                   *buf++ += extra_data;
1499                   aug++;
1500                 }
1501
1502               /* Make room for the new augmentation string and data bytes.  */
1503               memmove (buf + extra_string + extra_data, buf, end - buf);
1504               memmove (aug + extra_string, aug, buf - (bfd_byte *) aug);
1505               buf += extra_string;
1506               end += extra_string + extra_data;
1507
1508               if (ent->add_augmentation_size)
1509                 {
1510                   *aug++ = 'z';
1511                   *buf++ = extra_data - 1;
1512                 }
1513               if (ent->u.cie.add_fde_encoding)
1514                 {
1515                   BFD_ASSERT (action & 1);
1516                   *aug++ = 'R';
1517                   *buf++ = make_pc_relative (DW_EH_PE_absptr, ptr_size);
1518                   action &= ~1;
1519                 }
1520
1521               while (action)
1522                 switch (*aug++)
1523                   {
1524                   case 'L':
1525                     if (action & 2)
1526                       {
1527                         BFD_ASSERT (*buf == ent->lsda_encoding);
1528                         *buf = make_pc_relative (*buf, ptr_size);
1529                         action &= ~2;
1530                       }
1531                     buf++;
1532                     break;
1533                   case 'P':
1534                     if (ent->u.cie.make_per_encoding_relative)
1535                       *buf = make_pc_relative (*buf, ptr_size);
1536                     per_encoding = *buf++;
1537                     per_width = get_DW_EH_PE_width (per_encoding, ptr_size);
1538                     BFD_ASSERT (per_width != 0);
1539                     BFD_ASSERT (((per_encoding & 0x70) == DW_EH_PE_pcrel)
1540                                 == ent->u.cie.per_encoding_relative);
1541                     if ((per_encoding & 0x70) == DW_EH_PE_aligned)
1542                       buf = (contents
1543                              + ((buf - contents + per_width - 1)
1544                                 & ~((bfd_size_type) per_width - 1)));
1545                     if (action & 4)
1546                       {
1547                         bfd_vma val;
1548
1549                         val = read_value (abfd, buf, per_width,
1550                                           get_DW_EH_PE_signed (per_encoding));
1551                         if (ent->u.cie.make_per_encoding_relative)
1552                           val -= (sec->output_section->vma
1553                                   + sec->output_offset
1554                                   + (buf - contents));
1555                         else
1556                           {
1557                             val += (bfd_vma) ent->offset - ent->new_offset;
1558                             val -= extra_string + extra_data;
1559                           }
1560                         write_value (abfd, buf, val, per_width);
1561                         action &= ~4;
1562                       }
1563                     buf += per_width;
1564                     break;
1565                   case 'R':
1566                     if (action & 1)
1567                       {
1568                         BFD_ASSERT (*buf == ent->fde_encoding);
1569                         *buf = make_pc_relative (*buf, ptr_size);
1570                         action &= ~1;
1571                       }
1572                     buf++;
1573                     break;
1574                   case 'S':
1575                     break;
1576                   default:
1577                     BFD_FAIL ();
1578                   }
1579             }
1580         }
1581       else
1582         {
1583           /* FDE */
1584           bfd_vma value, address;
1585           unsigned int width;
1586           bfd_byte *start;
1587           struct eh_cie_fde *cie;
1588
1589           /* Skip length.  */
1590           cie = ent->u.fde.cie_inf;
1591           buf += 4;
1592           value = ((ent->new_offset + sec->output_offset + 4)
1593                    - (cie->new_offset + cie->u.cie.u.sec->output_offset));
1594           bfd_put_32 (abfd, value, buf);
1595           buf += 4;
1596           width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1597           value = read_value (abfd, buf, width,
1598                               get_DW_EH_PE_signed (ent->fde_encoding));
1599           address = value;
1600           if (value)
1601             {
1602               switch (ent->fde_encoding & 0x70)
1603                 {
1604                 case DW_EH_PE_textrel:
1605                   BFD_ASSERT (hdr_info == NULL);
1606                   break;
1607                 case DW_EH_PE_datarel:
1608                   {
1609                     switch (abfd->arch_info->arch)
1610                       {
1611                       case bfd_arch_ia64:
1612                         BFD_ASSERT (elf_gp (abfd) != 0);
1613                         address += elf_gp (abfd);
1614                         break;
1615                       default:
1616                         (*info->callbacks->einfo)
1617                           (_("%P: DW_EH_PE_datarel unspecified"
1618                              " for this architecture.\n"));
1619                         /* Fall thru */
1620                       case bfd_arch_frv:
1621                       case bfd_arch_i386:
1622                         BFD_ASSERT (htab->hgot != NULL
1623                                     && ((htab->hgot->root.type
1624                                          == bfd_link_hash_defined)
1625                                         || (htab->hgot->root.type
1626                                             == bfd_link_hash_defweak)));
1627                         address
1628                           += (htab->hgot->root.u.def.value
1629                               + htab->hgot->root.u.def.section->output_offset
1630                               + (htab->hgot->root.u.def.section->output_section
1631                                  ->vma));
1632                         break;
1633                       }
1634                   }
1635                   break;
1636                 case DW_EH_PE_pcrel:
1637                   value += (bfd_vma) ent->offset - ent->new_offset;
1638                   address += (sec->output_section->vma
1639                               + sec->output_offset
1640                               + ent->offset + 8);
1641                   break;
1642                 }
1643               if (ent->make_relative)
1644                 value -= (sec->output_section->vma
1645                           + sec->output_offset
1646                           + ent->new_offset + 8);
1647               write_value (abfd, buf, value, width);
1648             }
1649
1650           start = buf;
1651
1652           if (hdr_info)
1653             {
1654               /* The address calculation may overflow, giving us a
1655                  value greater than 4G on a 32-bit target when
1656                  dwarf_vma is 64-bit.  */
1657               if (sizeof (address) > 4 && ptr_size == 4)
1658                 address &= 0xffffffff;
1659               hdr_info->array[hdr_info->array_count].initial_loc = address;
1660               hdr_info->array[hdr_info->array_count++].fde
1661                 = (sec->output_section->vma
1662                    + sec->output_offset
1663                    + ent->new_offset);
1664             }
1665
1666           if ((ent->lsda_encoding & 0x70) == DW_EH_PE_pcrel
1667               || cie->u.cie.make_lsda_relative)
1668             {
1669               buf += ent->lsda_offset;
1670               width = get_DW_EH_PE_width (ent->lsda_encoding, ptr_size);
1671               value = read_value (abfd, buf, width,
1672                                   get_DW_EH_PE_signed (ent->lsda_encoding));
1673               if (value)
1674                 {
1675                   if ((ent->lsda_encoding & 0x70) == DW_EH_PE_pcrel)
1676                     value += (bfd_vma) ent->offset - ent->new_offset;
1677                   else if (cie->u.cie.make_lsda_relative)
1678                     value -= (sec->output_section->vma
1679                               + sec->output_offset
1680                               + ent->new_offset + 8 + ent->lsda_offset);
1681                   write_value (abfd, buf, value, width);
1682                 }
1683             }
1684           else if (ent->add_augmentation_size)
1685             {
1686               /* Skip the PC and length and insert a zero byte for the
1687                  augmentation size.  */
1688               buf += width * 2;
1689               memmove (buf + 1, buf, end - buf);
1690               *buf = 0;
1691             }
1692
1693           if (ent->set_loc)
1694             {
1695               /* Adjust DW_CFA_set_loc.  */
1696               unsigned int cnt;
1697               bfd_vma new_offset;
1698
1699               width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1700               new_offset = ent->new_offset + 8
1701                            + extra_augmentation_string_bytes (ent)
1702                            + extra_augmentation_data_bytes (ent);
1703
1704               for (cnt = 1; cnt <= ent->set_loc[0]; cnt++)
1705                 {
1706                   buf = start + ent->set_loc[cnt];
1707
1708                   value = read_value (abfd, buf, width,
1709                                       get_DW_EH_PE_signed (ent->fde_encoding));
1710                   if (!value)
1711                     continue;
1712
1713                   if ((ent->fde_encoding & 0x70) == DW_EH_PE_pcrel)
1714                     value += (bfd_vma) ent->offset + 8 - new_offset;
1715                   if (ent->make_relative)
1716                     value -= (sec->output_section->vma
1717                               + sec->output_offset
1718                               + new_offset + ent->set_loc[cnt]);
1719                   write_value (abfd, buf, value, width);
1720                 }
1721             }
1722         }
1723     }
1724
1725   /* We don't align the section to its section alignment since the
1726      runtime library only expects all CIE/FDE records aligned at
1727      the pointer size. _bfd_elf_discard_section_eh_frame should
1728      have padded CIE/FDE records to multiple of pointer size with
1729      size_of_output_cie_fde.  */
1730   if ((sec->size % ptr_size) != 0)
1731     abort ();
1732
1733   /* FIXME: octets_per_byte.  */
1734   return bfd_set_section_contents (abfd, sec->output_section,
1735                                    contents, (file_ptr) sec->output_offset,
1736                                    sec->size);
1737 }
1738
1739 /* Helper function used to sort .eh_frame_hdr search table by increasing
1740    VMA of FDE initial location.  */
1741
1742 static int
1743 vma_compare (const void *a, const void *b)
1744 {
1745   const struct eh_frame_array_ent *p = (const struct eh_frame_array_ent *) a;
1746   const struct eh_frame_array_ent *q = (const struct eh_frame_array_ent *) b;
1747   if (p->initial_loc > q->initial_loc)
1748     return 1;
1749   if (p->initial_loc < q->initial_loc)
1750     return -1;
1751   return 0;
1752 }
1753
1754 /* Write out .eh_frame_hdr section.  This must be called after
1755    _bfd_elf_write_section_eh_frame has been called on all input
1756    .eh_frame sections.
1757    .eh_frame_hdr format:
1758    ubyte version                (currently 1)
1759    ubyte eh_frame_ptr_enc       (DW_EH_PE_* encoding of pointer to start of
1760                                  .eh_frame section)
1761    ubyte fde_count_enc          (DW_EH_PE_* encoding of total FDE count
1762                                  number (or DW_EH_PE_omit if there is no
1763                                  binary search table computed))
1764    ubyte table_enc              (DW_EH_PE_* encoding of binary search table,
1765                                  or DW_EH_PE_omit if not present.
1766                                  DW_EH_PE_datarel is using address of
1767                                  .eh_frame_hdr section start as base)
1768    [encoded] eh_frame_ptr       (pointer to start of .eh_frame section)
1769    optionally followed by:
1770    [encoded] fde_count          (total number of FDEs in .eh_frame section)
1771    fde_count x [encoded] initial_loc, fde
1772                                 (array of encoded pairs containing
1773                                  FDE initial_location field and FDE address,
1774                                  sorted by increasing initial_loc).  */
1775
1776 bfd_boolean
1777 _bfd_elf_write_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
1778 {
1779   struct elf_link_hash_table *htab;
1780   struct eh_frame_hdr_info *hdr_info;
1781   asection *sec;
1782   bfd_boolean retval = TRUE;
1783
1784   htab = elf_hash_table (info);
1785   hdr_info = &htab->eh_info;
1786   sec = hdr_info->hdr_sec;
1787
1788   if (info->eh_frame_hdr && sec != NULL)
1789     {
1790       bfd_byte *contents;
1791       asection *eh_frame_sec;
1792       bfd_size_type size;
1793       bfd_vma encoded_eh_frame;
1794
1795       size = EH_FRAME_HDR_SIZE;
1796       if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
1797         size += 4 + hdr_info->fde_count * 8;
1798       contents = (bfd_byte *) bfd_malloc (size);
1799       if (contents == NULL)
1800         return FALSE;
1801
1802       eh_frame_sec = bfd_get_section_by_name (abfd, ".eh_frame");
1803       if (eh_frame_sec == NULL)
1804         {
1805           free (contents);
1806           return FALSE;
1807         }
1808
1809       memset (contents, 0, EH_FRAME_HDR_SIZE);
1810       /* Version.  */
1811       contents[0] = 1;
1812       /* .eh_frame offset.  */
1813       contents[1] = get_elf_backend_data (abfd)->elf_backend_encode_eh_address
1814         (abfd, info, eh_frame_sec, 0, sec, 4, &encoded_eh_frame);
1815
1816       if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
1817         {
1818           /* FDE count encoding.  */
1819           contents[2] = DW_EH_PE_udata4;
1820           /* Search table encoding.  */
1821           contents[3] = DW_EH_PE_datarel | DW_EH_PE_sdata4;
1822         }
1823       else
1824         {
1825           contents[2] = DW_EH_PE_omit;
1826           contents[3] = DW_EH_PE_omit;
1827         }
1828       bfd_put_32 (abfd, encoded_eh_frame, contents + 4);
1829
1830       if (contents[2] != DW_EH_PE_omit)
1831         {
1832           unsigned int i;
1833
1834           bfd_put_32 (abfd, hdr_info->fde_count, contents + EH_FRAME_HDR_SIZE);
1835           qsort (hdr_info->array, hdr_info->fde_count,
1836                  sizeof (*hdr_info->array), vma_compare);
1837           for (i = 0; i < hdr_info->fde_count; i++)
1838             {
1839               bfd_put_32 (abfd,
1840                           hdr_info->array[i].initial_loc
1841                           - sec->output_section->vma,
1842                           contents + EH_FRAME_HDR_SIZE + i * 8 + 4);
1843               bfd_put_32 (abfd,
1844                           hdr_info->array[i].fde - sec->output_section->vma,
1845                           contents + EH_FRAME_HDR_SIZE + i * 8 + 8);
1846             }
1847         }
1848
1849       /* FIXME: octets_per_byte.  */
1850       retval = bfd_set_section_contents (abfd, sec->output_section, contents,
1851                                          (file_ptr) sec->output_offset,
1852                                          sec->size);
1853       free (contents);
1854     }
1855   if (hdr_info->array != NULL)
1856     free (hdr_info->array);
1857   return retval;
1858 }
1859
1860 /* Return the width of FDE addresses.  This is the default implementation.  */
1861
1862 unsigned int
1863 _bfd_elf_eh_frame_address_size (bfd *abfd, asection *sec ATTRIBUTE_UNUSED)
1864 {
1865   return elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64 ? 8 : 4;
1866 }
1867
1868 /* Decide whether we can use a PC-relative encoding within the given
1869    EH frame section.  This is the default implementation.  */
1870
1871 bfd_boolean
1872 _bfd_elf_can_make_relative (bfd *input_bfd ATTRIBUTE_UNUSED,
1873                             struct bfd_link_info *info ATTRIBUTE_UNUSED,
1874                             asection *eh_frame_section ATTRIBUTE_UNUSED)
1875 {
1876   return TRUE;
1877 }
1878
1879 /* Select an encoding for the given address.  Preference is given to
1880    PC-relative addressing modes.  */
1881
1882 bfd_byte
1883 _bfd_elf_encode_eh_address (bfd *abfd ATTRIBUTE_UNUSED,
1884                             struct bfd_link_info *info ATTRIBUTE_UNUSED,
1885                             asection *osec, bfd_vma offset,
1886                             asection *loc_sec, bfd_vma loc_offset,
1887                             bfd_vma *encoded)
1888 {
1889   *encoded = osec->vma + offset -
1890     (loc_sec->output_section->vma + loc_sec->output_offset + loc_offset);
1891   return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
1892 }