OSDN Git Service

bfd/
[pf3gnuchains/pf3gnuchains4x.git] / bfd / elf-eh-frame.c
1 /* .eh_frame section optimization.
2    Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007
3    Free Software Foundation, Inc.
4    Written by Jakub Jelinek <jakub@redhat.com>.
5
6    This file is part of BFD, the Binary File Descriptor library.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21    MA 02110-1301, USA.  */
22
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "libbfd.h"
26 #include "elf-bfd.h"
27 #include "elf/dwarf2.h"
28
29 #define EH_FRAME_HDR_SIZE 8
30
31 struct cie
32 {
33   unsigned int length;
34   unsigned int hash;
35   unsigned char version;
36   unsigned char local_personality;
37   char augmentation[20];
38   bfd_vma code_align;
39   bfd_signed_vma data_align;
40   bfd_vma ra_column;
41   bfd_vma augmentation_size;
42   union {
43     struct elf_link_hash_entry *h;
44     bfd_vma val;
45   } personality;
46   asection *output_sec;
47   struct eh_cie_fde *cie_inf;
48   unsigned char per_encoding;
49   unsigned char lsda_encoding;
50   unsigned char fde_encoding;
51   unsigned char initial_insn_length;
52   unsigned char make_relative;
53   unsigned char make_lsda_relative;
54   unsigned char initial_instructions[50];
55 };
56
57
58
59 /* If *ITER hasn't reached END yet, read the next byte into *RESULT and
60    move onto the next byte.  Return true on success.  */
61
62 static inline bfd_boolean
63 read_byte (bfd_byte **iter, bfd_byte *end, unsigned char *result)
64 {
65   if (*iter >= end)
66     return FALSE;
67   *result = *((*iter)++);
68   return TRUE;
69 }
70
71 /* Move *ITER over LENGTH bytes, or up to END, whichever is closer.
72    Return true it was possible to move LENGTH bytes.  */
73
74 static inline bfd_boolean
75 skip_bytes (bfd_byte **iter, bfd_byte *end, bfd_size_type length)
76 {
77   if ((bfd_size_type) (end - *iter) < length)
78     {
79       *iter = end;
80       return FALSE;
81     }
82   *iter += length;
83   return TRUE;
84 }
85
86 /* Move *ITER over an leb128, stopping at END.  Return true if the end
87    of the leb128 was found.  */
88
89 static bfd_boolean
90 skip_leb128 (bfd_byte **iter, bfd_byte *end)
91 {
92   unsigned char byte;
93   do
94     if (!read_byte (iter, end, &byte))
95       return FALSE;
96   while (byte & 0x80);
97   return TRUE;
98 }
99
100 /* Like skip_leb128, but treat the leb128 as an unsigned value and
101    store it in *VALUE.  */
102
103 static bfd_boolean
104 read_uleb128 (bfd_byte **iter, bfd_byte *end, bfd_vma *value)
105 {
106   bfd_byte *start, *p;
107
108   start = *iter;
109   if (!skip_leb128 (iter, end))
110     return FALSE;
111
112   p = *iter;
113   *value = *--p;
114   while (p > start)
115     *value = (*value << 7) | (*--p & 0x7f);
116
117   return TRUE;
118 }
119
120 /* Like read_uleb128, but for signed values.  */
121
122 static bfd_boolean
123 read_sleb128 (bfd_byte **iter, bfd_byte *end, bfd_signed_vma *value)
124 {
125   bfd_byte *start, *p;
126
127   start = *iter;
128   if (!skip_leb128 (iter, end))
129     return FALSE;
130
131   p = *iter;
132   *value = ((*--p & 0x7f) ^ 0x40) - 0x40;
133   while (p > start)
134     *value = (*value << 7) | (*--p & 0x7f);
135
136   return TRUE;
137 }
138
139 /* Return 0 if either encoding is variable width, or not yet known to bfd.  */
140
141 static
142 int get_DW_EH_PE_width (int encoding, int ptr_size)
143 {
144   /* DW_EH_PE_ values of 0x60 and 0x70 weren't defined at the time .eh_frame
145      was added to bfd.  */
146   if ((encoding & 0x60) == 0x60)
147     return 0;
148
149   switch (encoding & 7)
150     {
151     case DW_EH_PE_udata2: return 2;
152     case DW_EH_PE_udata4: return 4;
153     case DW_EH_PE_udata8: return 8;
154     case DW_EH_PE_absptr: return ptr_size;
155     default:
156       break;
157     }
158
159   return 0;
160 }
161
162 #define get_DW_EH_PE_signed(encoding) (((encoding) & DW_EH_PE_signed) != 0)
163
164 /* Read a width sized value from memory.  */
165
166 static bfd_vma
167 read_value (bfd *abfd, bfd_byte *buf, int width, int is_signed)
168 {
169   bfd_vma value;
170
171   switch (width)
172     {
173     case 2:
174       if (is_signed)
175         value = bfd_get_signed_16 (abfd, buf);
176       else
177         value = bfd_get_16 (abfd, buf);
178       break;
179     case 4:
180       if (is_signed)
181         value = bfd_get_signed_32 (abfd, buf);
182       else
183         value = bfd_get_32 (abfd, buf);
184       break;
185     case 8:
186       if (is_signed)
187         value = bfd_get_signed_64 (abfd, buf);
188       else
189         value = bfd_get_64 (abfd, buf);
190       break;
191     default:
192       BFD_FAIL ();
193       return 0;
194     }
195
196   return value;
197 }
198
199 /* Store a width sized value to memory.  */
200
201 static void
202 write_value (bfd *abfd, bfd_byte *buf, bfd_vma value, int width)
203 {
204   switch (width)
205     {
206     case 2: bfd_put_16 (abfd, value, buf); break;
207     case 4: bfd_put_32 (abfd, value, buf); break;
208     case 8: bfd_put_64 (abfd, value, buf); break;
209     default: BFD_FAIL ();
210     }
211 }
212
213 /* Return one if C1 and C2 CIEs can be merged.  */
214
215 static int
216 cie_eq (const void *e1, const void *e2)
217 {
218   const struct cie *c1 = e1;
219   const struct cie *c2 = e2;
220
221   if (c1->hash == c2->hash
222       && c1->length == c2->length
223       && c1->version == c2->version
224       && c1->local_personality == c2->local_personality
225       && strcmp (c1->augmentation, c2->augmentation) == 0
226       && strcmp (c1->augmentation, "eh") != 0
227       && c1->code_align == c2->code_align
228       && c1->data_align == c2->data_align
229       && c1->ra_column == c2->ra_column
230       && c1->augmentation_size == c2->augmentation_size
231       && memcmp (&c1->personality, &c2->personality,
232                  sizeof (c1->personality)) == 0
233       && c1->output_sec == c2->output_sec
234       && c1->per_encoding == c2->per_encoding
235       && c1->lsda_encoding == c2->lsda_encoding
236       && c1->fde_encoding == c2->fde_encoding
237       && c1->initial_insn_length == c2->initial_insn_length
238       && memcmp (c1->initial_instructions,
239                  c2->initial_instructions,
240                  c1->initial_insn_length) == 0)
241     return 1;
242
243   return 0;
244 }
245
246 static hashval_t
247 cie_hash (const void *e)
248 {
249   const struct cie *c = e;
250   return c->hash;
251 }
252
253 static hashval_t
254 cie_compute_hash (struct cie *c)
255 {
256   hashval_t h = 0;
257   h = iterative_hash_object (c->length, h);
258   h = iterative_hash_object (c->version, h);
259   h = iterative_hash (c->augmentation, strlen (c->augmentation) + 1, h);
260   h = iterative_hash_object (c->code_align, h);
261   h = iterative_hash_object (c->data_align, h);
262   h = iterative_hash_object (c->ra_column, h);
263   h = iterative_hash_object (c->augmentation_size, h);
264   h = iterative_hash_object (c->personality, h);
265   h = iterative_hash_object (c->output_sec, h);
266   h = iterative_hash_object (c->per_encoding, h);
267   h = iterative_hash_object (c->lsda_encoding, h);
268   h = iterative_hash_object (c->fde_encoding, h);
269   h = iterative_hash_object (c->initial_insn_length, h);
270   h = iterative_hash (c->initial_instructions, c->initial_insn_length, h);
271   c->hash = h;
272   return h;
273 }
274
275 /* Return the number of extra bytes that we'll be inserting into
276    ENTRY's augmentation string.  */
277
278 static INLINE unsigned int
279 extra_augmentation_string_bytes (struct eh_cie_fde *entry)
280 {
281   unsigned int size = 0;
282   if (entry->cie)
283     {
284       if (entry->add_augmentation_size)
285         size++;
286       if (entry->add_fde_encoding)
287         size++;
288     }
289   return size;
290 }
291
292 /* Likewise ENTRY's augmentation data.  */
293
294 static INLINE unsigned int
295 extra_augmentation_data_bytes (struct eh_cie_fde *entry)
296 {
297   unsigned int size = 0;
298   if (entry->cie)
299     {
300       if (entry->add_augmentation_size)
301         size++;
302       if (entry->add_fde_encoding)
303         size++;
304     }
305   else
306     {
307       if (entry->u.fde.cie_inf->add_augmentation_size)
308         size++;
309     }
310   return size;
311 }
312
313 /* Return the size that ENTRY will have in the output.  ALIGNMENT is the
314    required alignment of ENTRY in bytes.  */
315
316 static unsigned int
317 size_of_output_cie_fde (struct eh_cie_fde *entry, unsigned int alignment)
318 {
319   if (entry->removed)
320     return 0;
321   if (entry->size == 4)
322     return 4;
323   return (entry->size
324           + extra_augmentation_string_bytes (entry)
325           + extra_augmentation_data_bytes (entry)
326           + alignment - 1) & -alignment;
327 }
328
329 /* Assume that the bytes between *ITER and END are CFA instructions.
330    Try to move *ITER past the first instruction and return true on
331    success.  ENCODED_PTR_WIDTH gives the width of pointer entries.  */
332
333 static bfd_boolean
334 skip_cfa_op (bfd_byte **iter, bfd_byte *end, unsigned int encoded_ptr_width)
335 {
336   bfd_byte op;
337   bfd_vma length;
338
339   if (!read_byte (iter, end, &op))
340     return FALSE;
341
342   switch (op & 0xc0 ? op & 0xc0 : op)
343     {
344     case DW_CFA_nop:
345     case DW_CFA_advance_loc:
346     case DW_CFA_restore:
347     case DW_CFA_remember_state:
348     case DW_CFA_restore_state:
349     case DW_CFA_GNU_window_save:
350       /* No arguments.  */
351       return TRUE;
352
353     case DW_CFA_offset:
354     case DW_CFA_restore_extended:
355     case DW_CFA_undefined:
356     case DW_CFA_same_value:
357     case DW_CFA_def_cfa_register:
358     case DW_CFA_def_cfa_offset:
359     case DW_CFA_def_cfa_offset_sf:
360     case DW_CFA_GNU_args_size:
361       /* One leb128 argument.  */
362       return skip_leb128 (iter, end);
363
364     case DW_CFA_val_offset:
365     case DW_CFA_val_offset_sf:
366     case DW_CFA_offset_extended:
367     case DW_CFA_register:
368     case DW_CFA_def_cfa:
369     case DW_CFA_offset_extended_sf:
370     case DW_CFA_GNU_negative_offset_extended:
371     case DW_CFA_def_cfa_sf:
372       /* Two leb128 arguments.  */
373       return (skip_leb128 (iter, end)
374               && skip_leb128 (iter, end));
375
376     case DW_CFA_def_cfa_expression:
377       /* A variable-length argument.  */
378       return (read_uleb128 (iter, end, &length)
379               && skip_bytes (iter, end, length));
380
381     case DW_CFA_expression:
382     case DW_CFA_val_expression:
383       /* A leb128 followed by a variable-length argument.  */
384       return (skip_leb128 (iter, end)
385               && read_uleb128 (iter, end, &length)
386               && skip_bytes (iter, end, length));
387
388     case DW_CFA_set_loc:
389       return skip_bytes (iter, end, encoded_ptr_width);
390
391     case DW_CFA_advance_loc1:
392       return skip_bytes (iter, end, 1);
393
394     case DW_CFA_advance_loc2:
395       return skip_bytes (iter, end, 2);
396
397     case DW_CFA_advance_loc4:
398       return skip_bytes (iter, end, 4);
399
400     case DW_CFA_MIPS_advance_loc8:
401       return skip_bytes (iter, end, 8);
402
403     default:
404       return FALSE;
405     }
406 }
407
408 /* Try to interpret the bytes between BUF and END as CFA instructions.
409    If every byte makes sense, return a pointer to the first DW_CFA_nop
410    padding byte, or END if there is no padding.  Return null otherwise.
411    ENCODED_PTR_WIDTH is as for skip_cfa_op.  */
412
413 static bfd_byte *
414 skip_non_nops (bfd_byte *buf, bfd_byte *end, unsigned int encoded_ptr_width,
415                unsigned int *set_loc_count)
416 {
417   bfd_byte *last;
418
419   last = buf;
420   while (buf < end)
421     if (*buf == DW_CFA_nop)
422       buf++;
423     else
424       {
425         if (*buf == DW_CFA_set_loc)
426           ++*set_loc_count;
427         if (!skip_cfa_op (&buf, end, encoded_ptr_width))
428           return 0;
429         last = buf;
430       }
431   return last;
432 }
433
434 /* Called before calling _bfd_elf_parse_eh_frame on every input bfd's
435    .eh_frame section.  */
436
437 void
438 _bfd_elf_begin_eh_frame_parsing (struct bfd_link_info *info)
439 {
440   struct eh_frame_hdr_info *hdr_info;
441
442   hdr_info = &elf_hash_table (info)->eh_info;
443   if (!hdr_info->parsed_eh_frames && !info->relocatable)
444     hdr_info->cies = htab_try_create (1, cie_hash, cie_eq, free);
445 }
446
447 /* Try to parse .eh_frame section SEC, which belongs to ABFD.  Store the
448    information in the section's sec_info field on success.  COOKIE
449    describes the relocations in SEC.  */
450
451 void
452 _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
453                          asection *sec, struct elf_reloc_cookie *cookie)
454 {
455 #define REQUIRE(COND)                                   \
456   do                                                    \
457     if (!(COND))                                        \
458       goto free_no_table;                               \
459   while (0)
460
461   bfd_byte *ehbuf = NULL, *buf, *end;
462   bfd_byte *last_fde;
463   struct eh_cie_fde *this_inf;
464   unsigned int hdr_length, hdr_id;
465   struct extended_cie
466     {
467       struct cie *cie;
468       struct eh_cie_fde *local_cie;
469     } *ecies = NULL, *ecie;
470   unsigned int ecie_count;
471   struct cie *cie, *local_cies = NULL, tmp_cie;
472   struct elf_link_hash_table *htab;
473   struct eh_frame_hdr_info *hdr_info;
474   struct eh_frame_sec_info *sec_info = NULL;
475   unsigned int ptr_size;
476   unsigned int num_cies;
477   unsigned int num_entries;
478   elf_gc_mark_hook_fn gc_mark_hook;
479
480   htab = elf_hash_table (info);
481   hdr_info = &htab->eh_info;
482   if (hdr_info->parsed_eh_frames)
483     return;
484
485   if (sec->size == 0)
486     {
487       /* This file does not contain .eh_frame information.  */
488       return;
489     }
490
491   if (bfd_is_abs_section (sec->output_section))
492     {
493       /* At least one of the sections is being discarded from the
494          link, so we should just ignore them.  */
495       return;
496     }
497
498   /* Read the frame unwind information from abfd.  */
499
500   REQUIRE (bfd_malloc_and_get_section (abfd, sec, &ehbuf));
501
502   if (sec->size >= 4
503       && bfd_get_32 (abfd, ehbuf) == 0
504       && cookie->rel == cookie->relend)
505     {
506       /* Empty .eh_frame section.  */
507       free (ehbuf);
508       return;
509     }
510
511   /* If .eh_frame section size doesn't fit into int, we cannot handle
512      it (it would need to use 64-bit .eh_frame format anyway).  */
513   REQUIRE (sec->size == (unsigned int) sec->size);
514
515   ptr_size = (get_elf_backend_data (abfd)
516               ->elf_backend_eh_frame_address_size (abfd, sec));
517   REQUIRE (ptr_size != 0);
518
519   /* Go through the section contents and work out how many FDEs and
520      CIEs there are.  */
521   buf = ehbuf;
522   end = ehbuf + sec->size;
523   num_cies = 0;
524   num_entries = 0;
525   while (buf != end)
526     {
527       num_entries++;
528
529       /* Read the length of the entry.  */
530       REQUIRE (skip_bytes (&buf, end, 4));
531       hdr_length = bfd_get_32 (abfd, buf - 4);
532
533       /* 64-bit .eh_frame is not supported.  */
534       REQUIRE (hdr_length != 0xffffffff);
535       if (hdr_length == 0)
536         break;
537
538       REQUIRE (skip_bytes (&buf, end, 4));
539       hdr_id = bfd_get_32 (abfd, buf - 4);
540       if (hdr_id == 0)
541         num_cies++;
542
543       REQUIRE (skip_bytes (&buf, end, hdr_length - 4));
544     }
545
546   sec_info = bfd_zmalloc (sizeof (struct eh_frame_sec_info)
547                           + (num_entries - 1) * sizeof (struct eh_cie_fde));
548   REQUIRE (sec_info);
549
550   ecies = bfd_zmalloc (num_cies * sizeof (*ecies));
551   REQUIRE (ecies);
552
553   /* If we're not merging CIE entries (such as for a relocatable link),
554      we need to have a "struct cie" for each CIE in this section.  */
555   if (hdr_info->cies == NULL)
556     {
557       local_cies = bfd_zmalloc (num_cies * sizeof (*local_cies));
558       REQUIRE (local_cies);
559     }
560
561 #define ENSURE_NO_RELOCS(buf)                           \
562   REQUIRE (!(cookie->rel < cookie->relend               \
563              && (cookie->rel->r_offset                  \
564                  < (bfd_size_type) ((buf) - ehbuf))     \
565              && cookie->rel->r_info != 0))
566
567 #define SKIP_RELOCS(buf)                                \
568   while (cookie->rel < cookie->relend                   \
569          && (cookie->rel->r_offset                      \
570              < (bfd_size_type) ((buf) - ehbuf)))        \
571     cookie->rel++
572
573 #define GET_RELOC(buf)                                  \
574   ((cookie->rel < cookie->relend                        \
575     && (cookie->rel->r_offset                           \
576         == (bfd_size_type) ((buf) - ehbuf)))            \
577    ? cookie->rel : NULL)
578
579   buf = ehbuf;
580   ecie_count = 0;
581   gc_mark_hook = get_elf_backend_data (abfd)->gc_mark_hook;
582   while ((bfd_size_type) (buf - ehbuf) != sec->size)
583     {
584       char *aug;
585       bfd_byte *start, *insns, *insns_end;
586       bfd_size_type length;
587       unsigned int set_loc_count;
588
589       this_inf = sec_info->entry + sec_info->count;
590       last_fde = buf;
591
592       /* Read the length of the entry.  */
593       REQUIRE (skip_bytes (&buf, ehbuf + sec->size, 4));
594       hdr_length = bfd_get_32 (abfd, buf - 4);
595
596       /* The CIE/FDE must be fully contained in this input section.  */
597       REQUIRE ((bfd_size_type) (buf - ehbuf) + hdr_length <= sec->size);
598       end = buf + hdr_length;
599
600       this_inf->offset = last_fde - ehbuf;
601       this_inf->size = 4 + hdr_length;
602       this_inf->reloc_index = cookie->rel - cookie->rels;
603
604       if (hdr_length == 0)
605         {
606           /* A zero-length CIE should only be found at the end of
607              the section.  */
608           REQUIRE ((bfd_size_type) (buf - ehbuf) == sec->size);
609           ENSURE_NO_RELOCS (buf);
610           sec_info->count++;
611           break;
612         }
613
614       REQUIRE (skip_bytes (&buf, end, 4));
615       hdr_id = bfd_get_32 (abfd, buf - 4);
616
617       if (hdr_id == 0)
618         {
619           unsigned int initial_insn_length;
620
621           /* CIE  */
622           this_inf->cie = 1;
623
624           /* If we're merging CIEs, construct the struct cie in TMP_CIE;
625              we'll enter it into the global pool later.  Otherwise point
626              CIE to one of the section-local cie structures.  */
627           if (local_cies)
628             cie = local_cies + ecie_count;
629           else
630             {
631               cie = &tmp_cie;
632               memset (cie, 0, sizeof (*cie));
633             }
634           cie->cie_inf = this_inf;
635           cie->length = hdr_length;
636           cie->output_sec = sec->output_section;
637           start = buf;
638           REQUIRE (read_byte (&buf, end, &cie->version));
639
640           /* Cannot handle unknown versions.  */
641           REQUIRE (cie->version == 1 || cie->version == 3);
642           REQUIRE (strlen ((char *) buf) < sizeof (cie->augmentation));
643
644           strcpy (cie->augmentation, (char *) buf);
645           buf = (bfd_byte *) strchr ((char *) buf, '\0') + 1;
646           ENSURE_NO_RELOCS (buf);
647           if (buf[0] == 'e' && buf[1] == 'h')
648             {
649               /* GCC < 3.0 .eh_frame CIE */
650               /* We cannot merge "eh" CIEs because __EXCEPTION_TABLE__
651                  is private to each CIE, so we don't need it for anything.
652                  Just skip it.  */
653               REQUIRE (skip_bytes (&buf, end, ptr_size));
654               SKIP_RELOCS (buf);
655             }
656           REQUIRE (read_uleb128 (&buf, end, &cie->code_align));
657           REQUIRE (read_sleb128 (&buf, end, &cie->data_align));
658           if (cie->version == 1)
659             {
660               REQUIRE (buf < end);
661               cie->ra_column = *buf++;
662             }
663           else
664             REQUIRE (read_uleb128 (&buf, end, &cie->ra_column));
665           ENSURE_NO_RELOCS (buf);
666           cie->lsda_encoding = DW_EH_PE_omit;
667           cie->fde_encoding = DW_EH_PE_omit;
668           cie->per_encoding = DW_EH_PE_omit;
669           aug = cie->augmentation;
670           if (aug[0] != 'e' || aug[1] != 'h')
671             {
672               if (*aug == 'z')
673                 {
674                   aug++;
675                   REQUIRE (read_uleb128 (&buf, end, &cie->augmentation_size));
676                   ENSURE_NO_RELOCS (buf);
677                 }
678
679               while (*aug != '\0')
680                 switch (*aug++)
681                   {
682                   case 'L':
683                     REQUIRE (read_byte (&buf, end, &cie->lsda_encoding));
684                     ENSURE_NO_RELOCS (buf);
685                     REQUIRE (get_DW_EH_PE_width (cie->lsda_encoding, ptr_size));
686                     break;
687                   case 'R':
688                     REQUIRE (read_byte (&buf, end, &cie->fde_encoding));
689                     ENSURE_NO_RELOCS (buf);
690                     REQUIRE (get_DW_EH_PE_width (cie->fde_encoding, ptr_size));
691                     break;
692                   case 'S':
693                     break;
694                   case 'P':
695                     {
696                       int per_width;
697
698                       REQUIRE (read_byte (&buf, end, &cie->per_encoding));
699                       per_width = get_DW_EH_PE_width (cie->per_encoding,
700                                                       ptr_size);
701                       REQUIRE (per_width);
702                       if ((cie->per_encoding & 0xf0) == DW_EH_PE_aligned)
703                         {
704                           length = -(buf - ehbuf) & (per_width - 1);
705                           REQUIRE (skip_bytes (&buf, end, length));
706                         }
707                       ENSURE_NO_RELOCS (buf);
708                       /* Ensure we have a reloc here.  */
709                       if (GET_RELOC (buf) != NULL)
710                         {
711                           unsigned long r_symndx;
712
713 #ifdef BFD64
714                           if (elf_elfheader (abfd)->e_ident[EI_CLASS]
715                               == ELFCLASS64)
716                             r_symndx = ELF64_R_SYM (cookie->rel->r_info);
717                           else
718 #endif
719                             r_symndx = ELF32_R_SYM (cookie->rel->r_info);
720                           if (r_symndx >= cookie->locsymcount
721                               || ELF_ST_BIND (cookie->locsyms[r_symndx]
722                                               .st_info) != STB_LOCAL)
723                             {
724                               struct elf_link_hash_entry *h;
725
726                               r_symndx -= cookie->extsymoff;
727                               h = cookie->sym_hashes[r_symndx];
728
729                               while (h->root.type == bfd_link_hash_indirect
730                                      || h->root.type == bfd_link_hash_warning)
731                                 h = (struct elf_link_hash_entry *)
732                                     h->root.u.i.link;
733
734                               cie->personality.h = h;
735                             }
736                           else
737                             {
738                               Elf_Internal_Sym *sym;
739                               asection *sym_sec;
740                               bfd_vma val;
741
742                               sym = &cookie->locsyms[r_symndx];
743                               sym_sec = (bfd_section_from_elf_index
744                                          (abfd, sym->st_shndx));
745                               if (sym_sec != NULL)
746                                 {
747                                   if (sym_sec->kept_section != NULL)
748                                     sym_sec = sym_sec->kept_section;
749                                   if (sym_sec->output_section != NULL)
750                                     {
751                                       val = (sym->st_value
752                                              + sym_sec->output_offset
753                                              + sym_sec->output_section->vma);
754                                       cie->personality.val = val;
755                                       cie->local_personality = 1;
756                                     }
757                                 }
758                             }
759
760                           /* Cope with MIPS-style composite relocations.  */
761                           do
762                             cookie->rel++;
763                           while (GET_RELOC (buf) != NULL);
764                         }
765                       REQUIRE (skip_bytes (&buf, end, per_width));
766                       REQUIRE (cie->local_personality || cie->personality.h);
767                     }
768                     break;
769                   default:
770                     /* Unrecognized augmentation. Better bail out.  */
771                     goto free_no_table;
772                   }
773             }
774
775           /* For shared libraries, try to get rid of as many RELATIVE relocs
776              as possible.  */
777           if (info->shared
778               && (get_elf_backend_data (abfd)
779                   ->elf_backend_can_make_relative_eh_frame
780                   (abfd, info, sec)))
781             {
782               if ((cie->fde_encoding & 0xf0) == DW_EH_PE_absptr)
783                 cie->make_relative = 1;
784               /* If the CIE doesn't already have an 'R' entry, it's fairly
785                  easy to add one, provided that there's no aligned data
786                  after the augmentation string.  */
787               else if (cie->fde_encoding == DW_EH_PE_omit
788                        && (cie->per_encoding & 0xf0) != DW_EH_PE_aligned)
789                 {
790                   if (*cie->augmentation == 0)
791                     this_inf->add_augmentation_size = 1;
792                   this_inf->add_fde_encoding = 1;
793                   cie->make_relative = 1;
794                 }
795             }
796
797           if (info->shared
798               && (get_elf_backend_data (abfd)
799                   ->elf_backend_can_make_lsda_relative_eh_frame
800                   (abfd, info, sec))
801               && (cie->lsda_encoding & 0xf0) == DW_EH_PE_absptr)
802             cie->make_lsda_relative = 1;
803
804           /* If FDE encoding was not specified, it defaults to
805              DW_EH_absptr.  */
806           if (cie->fde_encoding == DW_EH_PE_omit)
807             cie->fde_encoding = DW_EH_PE_absptr;
808
809           initial_insn_length = end - buf;
810           if (initial_insn_length <= sizeof (cie->initial_instructions))
811             {
812               cie->initial_insn_length = initial_insn_length;
813               memcpy (cie->initial_instructions, buf, initial_insn_length);
814             }
815           insns = buf;
816           buf += initial_insn_length;
817           ENSURE_NO_RELOCS (buf);
818
819           this_inf->make_relative = cie->make_relative;
820           this_inf->make_lsda_relative = cie->make_lsda_relative;
821           this_inf->per_encoding_relative
822             = (cie->per_encoding & 0x70) == DW_EH_PE_pcrel;
823         }
824       else
825         {
826           asection *rsec;
827
828           /* Find the corresponding CIE.  */
829           unsigned int cie_offset = this_inf->offset + 4 - hdr_id;
830           for (ecie = ecies; ecie < ecies + ecie_count; ++ecie)
831             if (cie_offset == ecie->local_cie->offset)
832               break;
833
834           /* Ensure this FDE references one of the CIEs in this input
835              section.  */
836           REQUIRE (ecie != ecies + ecie_count);
837           cie = ecie->cie;
838           this_inf->u.fde.cie_inf = ecie->local_cie;
839
840           ENSURE_NO_RELOCS (buf);
841           REQUIRE (GET_RELOC (buf));
842
843           /* Chain together the FDEs for each section.  */
844           rsec = _bfd_elf_gc_mark_rsec (info, sec, gc_mark_hook, cookie);
845           REQUIRE (rsec && rsec->owner == abfd);
846           this_inf->u.fde.next_for_section = elf_fde_list (rsec);
847           elf_fde_list (rsec) = this_inf;
848
849           /* Skip the initial location and address range.  */
850           start = buf;
851           length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
852           REQUIRE (skip_bytes (&buf, end, 2 * length));
853
854           /* Skip the augmentation size, if present.  */
855           if (cie->augmentation[0] == 'z')
856             REQUIRE (read_uleb128 (&buf, end, &length));
857           else
858             length = 0;
859
860           /* Of the supported augmentation characters above, only 'L'
861              adds augmentation data to the FDE.  This code would need to
862              be adjusted if any future augmentations do the same thing.  */
863           if (cie->lsda_encoding != DW_EH_PE_omit)
864             {
865               this_inf->lsda_offset = buf - start;
866               /* If there's no 'z' augmentation, we don't know where the
867                  CFA insns begin.  Assume no padding.  */
868               if (cie->augmentation[0] != 'z')
869                 length = end - buf;
870             }
871
872           /* Skip over the augmentation data.  */
873           REQUIRE (skip_bytes (&buf, end, length));
874           insns = buf;
875
876           buf = last_fde + 4 + hdr_length;
877           SKIP_RELOCS (buf);
878         }
879
880       /* Try to interpret the CFA instructions and find the first
881          padding nop.  Shrink this_inf's size so that it doesn't
882          include the padding.  */
883       length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
884       set_loc_count = 0;
885       insns_end = skip_non_nops (insns, end, length, &set_loc_count);
886       /* If we don't understand the CFA instructions, we can't know
887          what needs to be adjusted there.  */
888       if (insns_end == NULL
889           /* For the time being we don't support DW_CFA_set_loc in
890              CIE instructions.  */
891           || (set_loc_count && this_inf->cie))
892         goto free_no_table;
893       this_inf->size -= end - insns_end;
894       if (insns_end != end && this_inf->cie)
895         {
896           cie->initial_insn_length -= end - insns_end;
897           cie->length -= end - insns_end;
898         }
899       if (set_loc_count
900           && ((cie->fde_encoding & 0xf0) == DW_EH_PE_pcrel
901               || cie->make_relative))
902         {
903           unsigned int cnt;
904           bfd_byte *p;
905
906           this_inf->set_loc = bfd_malloc ((set_loc_count + 1)
907                                           * sizeof (unsigned int));
908           REQUIRE (this_inf->set_loc);
909           this_inf->set_loc[0] = set_loc_count;
910           p = insns;
911           cnt = 0;
912           while (p < end)
913             {
914               if (*p == DW_CFA_set_loc)
915                 this_inf->set_loc[++cnt] = p + 1 - start;
916               REQUIRE (skip_cfa_op (&p, end, length));
917             }
918         }
919
920       this_inf->removed = 1;
921       this_inf->fde_encoding = cie->fde_encoding;
922       this_inf->lsda_encoding = cie->lsda_encoding;
923       if (this_inf->cie)
924         {
925           /* We have now finished constructing the struct cie.  */
926           if (hdr_info->cies != NULL)
927             {
928               /* See if we can merge this CIE with an earlier one.  */
929               void **loc;
930
931               cie_compute_hash (cie);
932               loc = htab_find_slot_with_hash (hdr_info->cies, cie,
933                                               cie->hash, INSERT);
934               REQUIRE (loc);
935               if (*loc == HTAB_EMPTY_ENTRY)
936                 {
937                   *loc = malloc (sizeof (struct cie));
938                   REQUIRE (*loc);
939                   memcpy (*loc, cie, sizeof (struct cie));
940                 }
941               cie = (struct cie *) *loc;
942             }
943           this_inf->u.cie.merged = cie->cie_inf;
944           ecies[ecie_count].cie = cie;
945           ecies[ecie_count++].local_cie = this_inf;
946         }
947       sec_info->count++;
948     }
949   BFD_ASSERT (sec_info->count == num_entries);
950   BFD_ASSERT (ecie_count == num_cies);
951
952   elf_section_data (sec)->sec_info = sec_info;
953   sec->sec_info_type = ELF_INFO_TYPE_EH_FRAME;
954   goto success;
955
956  free_no_table:
957   (*info->callbacks->einfo)
958     (_("%P: error in %B(%A); no .eh_frame_hdr table will be created.\n"),
959      abfd, sec);
960   hdr_info->table = FALSE;
961   if (sec_info)
962     free (sec_info);
963  success:
964   if (ehbuf)
965     free (ehbuf);
966   if (ecies)
967     free (ecies);
968   if (local_cies)
969     free (local_cies);
970 #undef REQUIRE
971 }
972
973 /* Finish a pass over all .eh_frame sections.  */
974
975 void
976 _bfd_elf_end_eh_frame_parsing (struct bfd_link_info *info)
977 {
978   struct eh_frame_hdr_info *hdr_info;
979
980   hdr_info = &elf_hash_table (info)->eh_info;
981   if (hdr_info->cies != NULL)
982     {
983       htab_delete (hdr_info->cies);
984       hdr_info->cies = NULL;
985     }
986   hdr_info->parsed_eh_frames = TRUE;
987 }
988
989 /* Mark all relocations against CIE or FDE ENT, which occurs in
990    .eh_frame section SEC.  COOKIE describes the relocations in SEC;
991    its "rel" field can be changed freely.  */
992
993 static bfd_boolean
994 mark_entry (struct bfd_link_info *info, asection *sec,
995             struct eh_cie_fde *ent, elf_gc_mark_hook_fn gc_mark_hook,
996             struct elf_reloc_cookie *cookie)
997 {
998   for (cookie->rel = cookie->rels + ent->reloc_index;
999        cookie->rel < cookie->relend
1000          && cookie->rel->r_offset < ent->offset + ent->size;
1001        cookie->rel++)
1002     if (!_bfd_elf_gc_mark_reloc (info, sec, gc_mark_hook, cookie))
1003       return FALSE;
1004
1005   return TRUE;
1006 }
1007
1008 /* Mark all the relocations against FDEs that relate to code in input
1009    section SEC.  The FDEs belong to .eh_frame section EH_FRAME, whose
1010    relocations are described by COOKIE.  */
1011
1012 bfd_boolean
1013 _bfd_elf_gc_mark_fdes (struct bfd_link_info *info, asection *sec,
1014                        asection *eh_frame, elf_gc_mark_hook_fn gc_mark_hook,
1015                        struct elf_reloc_cookie *cookie)
1016 {
1017   struct eh_cie_fde *fde, *cie, *merged;
1018
1019   for (fde = elf_fde_list (sec); fde; fde = fde->u.fde.next_for_section)
1020     {
1021       if (!mark_entry (info, eh_frame, fde, gc_mark_hook, cookie))
1022         return FALSE;
1023
1024       /* At this stage, all cie_inf fields point to local CIEs, so we
1025          can use the same cookie to refer to them.  */
1026       cie = fde->u.fde.cie_inf;
1027       merged = cie->u.cie.merged;
1028       if (!merged->u.cie.gc_mark)
1029         {
1030           merged->u.cie.gc_mark = 1;
1031           if (!mark_entry (info, eh_frame, cie, gc_mark_hook, cookie))
1032             return FALSE;
1033         }
1034     }
1035   return TRUE;
1036 }
1037
1038 /* This function is called for each input file before the .eh_frame
1039    section is relocated.  It discards duplicate CIEs and FDEs for discarded
1040    functions.  The function returns TRUE iff any entries have been
1041    deleted.  */
1042
1043 bfd_boolean
1044 _bfd_elf_discard_section_eh_frame
1045    (bfd *abfd, struct bfd_link_info *info, asection *sec,
1046     bfd_boolean (*reloc_symbol_deleted_p) (bfd_vma, void *),
1047     struct elf_reloc_cookie *cookie)
1048 {
1049   struct eh_cie_fde *ent, *cie, *merged;
1050   struct eh_frame_sec_info *sec_info;
1051   struct eh_frame_hdr_info *hdr_info;
1052   unsigned int ptr_size, offset;
1053
1054   sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
1055   if (sec_info == NULL)
1056     return FALSE;
1057
1058   hdr_info = &elf_hash_table (info)->eh_info;
1059   for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1060     if (!ent->cie)
1061       {
1062         cookie->rel = cookie->rels + ent->reloc_index;
1063         BFD_ASSERT (cookie->rel < cookie->relend
1064                     && cookie->rel->r_offset == ent->offset + 8);
1065         if (!(*reloc_symbol_deleted_p) (ent->offset + 8, cookie))
1066           {
1067             if (info->shared
1068                 && (((ent->fde_encoding & 0xf0) == DW_EH_PE_absptr
1069                      && ent->u.fde.cie_inf->make_relative == 0)
1070                     || (ent->fde_encoding & 0xf0) == DW_EH_PE_aligned))
1071               {
1072                 /* If a shared library uses absolute pointers
1073                    which we cannot turn into PC relative,
1074                    don't create the binary search table,
1075                    since it is affected by runtime relocations.  */
1076                 hdr_info->table = FALSE;
1077                 (*info->callbacks->einfo)
1078                   (_("%P: fde encoding in %B(%A) prevents .eh_frame_hdr"
1079                      " table being created.\n"), abfd, sec);
1080               }
1081             ent->removed = 0;
1082             hdr_info->fde_count++;
1083
1084             cie = ent->u.fde.cie_inf;
1085             if (cie->removed)
1086               {
1087                 merged = cie->u.cie.merged;
1088                 if (!merged->removed)
1089                   /* We have decided to keep the group representative.  */
1090                   ent->u.fde.cie_inf = merged;
1091                 else if (merged->u.cie.merged != merged)
1092                   /* We didn't keep the original group representative,
1093                      but we did keep an alternative.  */
1094                   ent->u.fde.cie_inf = merged->u.cie.merged;
1095                 else
1096                   {
1097                     /* Make the local CIE represent the merged group.  */
1098                     merged->u.cie.merged = cie;
1099                     cie->removed = 0;
1100                   }
1101               }
1102           }
1103       }
1104
1105   ptr_size = (get_elf_backend_data (sec->owner)
1106               ->elf_backend_eh_frame_address_size (sec->owner, sec));
1107   offset = 0;
1108   for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1109     if (!ent->removed)
1110       {
1111         ent->new_offset = offset;
1112         offset += size_of_output_cie_fde (ent, ptr_size);
1113       }
1114
1115   sec->rawsize = sec->size;
1116   sec->size = offset;
1117   return offset != sec->rawsize;
1118 }
1119
1120 /* This function is called for .eh_frame_hdr section after
1121    _bfd_elf_discard_section_eh_frame has been called on all .eh_frame
1122    input sections.  It finalizes the size of .eh_frame_hdr section.  */
1123
1124 bfd_boolean
1125 _bfd_elf_discard_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
1126 {
1127   struct elf_link_hash_table *htab;
1128   struct eh_frame_hdr_info *hdr_info;
1129   asection *sec;
1130
1131   htab = elf_hash_table (info);
1132   hdr_info = &htab->eh_info;
1133
1134   sec = hdr_info->hdr_sec;
1135   if (sec == NULL)
1136     return FALSE;
1137
1138   sec->size = EH_FRAME_HDR_SIZE;
1139   if (hdr_info->table)
1140     sec->size += 4 + hdr_info->fde_count * 8;
1141
1142   elf_tdata (abfd)->eh_frame_hdr = sec;
1143   return TRUE;
1144 }
1145
1146 /* This function is called from size_dynamic_sections.
1147    It needs to decide whether .eh_frame_hdr should be output or not,
1148    because when the dynamic symbol table has been sized it is too late
1149    to strip sections.  */
1150
1151 bfd_boolean
1152 _bfd_elf_maybe_strip_eh_frame_hdr (struct bfd_link_info *info)
1153 {
1154   asection *o;
1155   bfd *abfd;
1156   struct elf_link_hash_table *htab;
1157   struct eh_frame_hdr_info *hdr_info;
1158
1159   htab = elf_hash_table (info);
1160   hdr_info = &htab->eh_info;
1161   if (hdr_info->hdr_sec == NULL)
1162     return TRUE;
1163
1164   if (bfd_is_abs_section (hdr_info->hdr_sec->output_section))
1165     {
1166       hdr_info->hdr_sec = NULL;
1167       return TRUE;
1168     }
1169
1170   abfd = NULL;
1171   if (info->eh_frame_hdr)
1172     for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link_next)
1173       {
1174         /* Count only sections which have at least a single CIE or FDE.
1175            There cannot be any CIE or FDE <= 8 bytes.  */
1176         o = bfd_get_section_by_name (abfd, ".eh_frame");
1177         if (o && o->size > 8 && !bfd_is_abs_section (o->output_section))
1178           break;
1179       }
1180
1181   if (abfd == NULL)
1182     {
1183       hdr_info->hdr_sec->flags |= SEC_EXCLUDE;
1184       hdr_info->hdr_sec = NULL;
1185       return TRUE;
1186     }
1187
1188   hdr_info->table = TRUE;
1189   return TRUE;
1190 }
1191
1192 /* Adjust an address in the .eh_frame section.  Given OFFSET within
1193    SEC, this returns the new offset in the adjusted .eh_frame section,
1194    or -1 if the address refers to a CIE/FDE which has been removed
1195    or to offset with dynamic relocation which is no longer needed.  */
1196
1197 bfd_vma
1198 _bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED,
1199                                   struct bfd_link_info *info,
1200                                   asection *sec,
1201                                   bfd_vma offset)
1202 {
1203   struct eh_frame_sec_info *sec_info;
1204   struct elf_link_hash_table *htab;
1205   struct eh_frame_hdr_info *hdr_info;
1206   unsigned int lo, hi, mid;
1207
1208   if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
1209     return offset;
1210   sec_info = elf_section_data (sec)->sec_info;
1211
1212   if (offset >= sec->rawsize)
1213     return offset - sec->rawsize + sec->size;
1214
1215   htab = elf_hash_table (info);
1216   hdr_info = &htab->eh_info;
1217   if (hdr_info->offsets_adjusted)
1218     offset += sec->output_offset;
1219
1220   lo = 0;
1221   hi = sec_info->count;
1222   mid = 0;
1223   while (lo < hi)
1224     {
1225       mid = (lo + hi) / 2;
1226       if (offset < sec_info->entry[mid].offset)
1227         hi = mid;
1228       else if (offset
1229                >= sec_info->entry[mid].offset + sec_info->entry[mid].size)
1230         lo = mid + 1;
1231       else
1232         break;
1233     }
1234
1235   BFD_ASSERT (lo < hi);
1236
1237   /* FDE or CIE was removed.  */
1238   if (sec_info->entry[mid].removed)
1239     return (bfd_vma) -1;
1240
1241   /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
1242      relocation against FDE's initial_location field.  */
1243   if (!sec_info->entry[mid].cie
1244       && sec_info->entry[mid].u.fde.cie_inf->make_relative
1245       && offset == sec_info->entry[mid].offset + 8)
1246     return (bfd_vma) -2;
1247
1248   /* If converting LSDA pointers to DW_EH_PE_pcrel, there will be no need
1249      for run-time relocation against LSDA field.  */
1250   if (!sec_info->entry[mid].cie
1251       && sec_info->entry[mid].u.fde.cie_inf->make_lsda_relative
1252       && (offset == (sec_info->entry[mid].offset + 8
1253                      + sec_info->entry[mid].lsda_offset))
1254       && (sec_info->entry[mid].u.fde.cie_inf->need_lsda_relative
1255           || !hdr_info->offsets_adjusted))
1256     {
1257       sec_info->entry[mid].u.fde.cie_inf->need_lsda_relative = 1;
1258       return (bfd_vma) -2;
1259     }
1260
1261   /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
1262      relocation against DW_CFA_set_loc's arguments.  */
1263   if (sec_info->entry[mid].set_loc
1264       && (sec_info->entry[mid].cie
1265           ? sec_info->entry[mid].make_relative
1266           : sec_info->entry[mid].u.fde.cie_inf->make_relative)
1267       && (offset >= sec_info->entry[mid].offset + 8
1268                     + sec_info->entry[mid].set_loc[1]))
1269     {
1270       unsigned int cnt;
1271
1272       for (cnt = 1; cnt <= sec_info->entry[mid].set_loc[0]; cnt++)
1273         if (offset == sec_info->entry[mid].offset + 8
1274                       + sec_info->entry[mid].set_loc[cnt])
1275           return (bfd_vma) -2;
1276     }
1277
1278   if (hdr_info->offsets_adjusted)
1279     offset -= sec->output_offset;
1280   /* Any new augmentation bytes go before the first relocation.  */
1281   return (offset + sec_info->entry[mid].new_offset
1282           - sec_info->entry[mid].offset
1283           + extra_augmentation_string_bytes (sec_info->entry + mid)
1284           + extra_augmentation_data_bytes (sec_info->entry + mid));
1285 }
1286
1287 /* Write out .eh_frame section.  This is called with the relocated
1288    contents.  */
1289
1290 bfd_boolean
1291 _bfd_elf_write_section_eh_frame (bfd *abfd,
1292                                  struct bfd_link_info *info,
1293                                  asection *sec,
1294                                  bfd_byte *contents)
1295 {
1296   struct eh_frame_sec_info *sec_info;
1297   struct elf_link_hash_table *htab;
1298   struct eh_frame_hdr_info *hdr_info;
1299   unsigned int ptr_size;
1300   struct eh_cie_fde *ent;
1301
1302   if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
1303     return bfd_set_section_contents (abfd, sec->output_section, contents,
1304                                      sec->output_offset, sec->size);
1305
1306   ptr_size = (get_elf_backend_data (abfd)
1307               ->elf_backend_eh_frame_address_size (abfd, sec));
1308   BFD_ASSERT (ptr_size != 0);
1309
1310   sec_info = elf_section_data (sec)->sec_info;
1311   htab = elf_hash_table (info);
1312   hdr_info = &htab->eh_info;
1313
1314   /* First convert all offsets to output section offsets, so that a
1315      CIE offset is valid if the CIE is used by a FDE from some other
1316      section.  This can happen when duplicate CIEs are deleted in
1317      _bfd_elf_discard_section_eh_frame.  We do all sections here because
1318      this function might not be called on sections in the same order as
1319      _bfd_elf_discard_section_eh_frame.  */
1320   if (!hdr_info->offsets_adjusted)
1321     {
1322       bfd *ibfd;
1323       asection *eh;
1324       struct eh_frame_sec_info *eh_inf;
1325
1326       for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1327         {
1328           if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1329               || (ibfd->flags & DYNAMIC) != 0)
1330             continue;
1331
1332           eh = bfd_get_section_by_name (ibfd, ".eh_frame");
1333           if (eh == NULL || eh->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
1334             continue;
1335
1336           eh_inf = elf_section_data (eh)->sec_info;
1337           for (ent = eh_inf->entry; ent < eh_inf->entry + eh_inf->count; ++ent)
1338             {
1339               ent->offset += eh->output_offset;
1340               ent->new_offset += eh->output_offset;
1341             }
1342         }
1343       hdr_info->offsets_adjusted = TRUE;
1344     }
1345
1346   if (hdr_info->table && hdr_info->array == NULL)
1347     hdr_info->array
1348       = bfd_malloc (hdr_info->fde_count * sizeof(*hdr_info->array));
1349   if (hdr_info->array == NULL)
1350     hdr_info = NULL;
1351
1352   /* The new offsets can be bigger or smaller than the original offsets.
1353      We therefore need to make two passes over the section: one backward
1354      pass to move entries up and one forward pass to move entries down.
1355      The two passes won't interfere with each other because entries are
1356      not reordered  */
1357   for (ent = sec_info->entry + sec_info->count; ent-- != sec_info->entry;)
1358     if (!ent->removed && ent->new_offset > ent->offset)
1359       memmove (contents + ent->new_offset - sec->output_offset,
1360                contents + ent->offset - sec->output_offset, ent->size);
1361
1362   for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1363     if (!ent->removed && ent->new_offset < ent->offset)
1364       memmove (contents + ent->new_offset - sec->output_offset,
1365                contents + ent->offset - sec->output_offset, ent->size);
1366
1367   for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1368     {
1369       unsigned char *buf, *end;
1370       unsigned int new_size;
1371
1372       if (ent->removed)
1373         continue;
1374
1375       if (ent->size == 4)
1376         {
1377           /* Any terminating FDE must be at the end of the section.  */
1378           BFD_ASSERT (ent == sec_info->entry + sec_info->count - 1);
1379           continue;
1380         }
1381
1382       buf = contents + ent->new_offset - sec->output_offset;
1383       end = buf + ent->size;
1384       new_size = size_of_output_cie_fde (ent, ptr_size);
1385
1386       /* Update the size.  It may be shrinked.  */
1387       bfd_put_32 (abfd, new_size - 4, buf);
1388
1389       /* Filling the extra bytes with DW_CFA_nops.  */
1390       if (new_size != ent->size)
1391         memset (end, 0, new_size - ent->size);
1392
1393       if (ent->cie)
1394         {
1395           /* CIE */
1396           if (ent->make_relative
1397               || ent->need_lsda_relative
1398               || ent->per_encoding_relative)
1399             {
1400               char *aug;
1401               unsigned int action, extra_string, extra_data;
1402               unsigned int per_width, per_encoding;
1403
1404               /* Need to find 'R' or 'L' augmentation's argument and modify
1405                  DW_EH_PE_* value.  */
1406               action = ((ent->make_relative ? 1 : 0)
1407                         | (ent->need_lsda_relative ? 2 : 0)
1408                         | (ent->per_encoding_relative ? 4 : 0));
1409               extra_string = extra_augmentation_string_bytes (ent);
1410               extra_data = extra_augmentation_data_bytes (ent);
1411
1412               /* Skip length, id and version.  */
1413               buf += 9;
1414               aug = (char *) buf;
1415               buf += strlen (aug) + 1;
1416               skip_leb128 (&buf, end);
1417               skip_leb128 (&buf, end);
1418               skip_leb128 (&buf, end);
1419               if (*aug == 'z')
1420                 {
1421                   /* The uleb128 will always be a single byte for the kind
1422                      of augmentation strings that we're prepared to handle.  */
1423                   *buf++ += extra_data;
1424                   aug++;
1425                 }
1426
1427               /* Make room for the new augmentation string and data bytes.  */
1428               memmove (buf + extra_string + extra_data, buf, end - buf);
1429               memmove (aug + extra_string, aug, buf - (bfd_byte *) aug);
1430               buf += extra_string;
1431               end += extra_string + extra_data;
1432
1433               if (ent->add_augmentation_size)
1434                 {
1435                   *aug++ = 'z';
1436                   *buf++ = extra_data - 1;
1437                 }
1438               if (ent->add_fde_encoding)
1439                 {
1440                   BFD_ASSERT (action & 1);
1441                   *aug++ = 'R';
1442                   *buf++ = DW_EH_PE_pcrel;
1443                   action &= ~1;
1444                 }
1445
1446               while (action)
1447                 switch (*aug++)
1448                   {
1449                   case 'L':
1450                     if (action & 2)
1451                       {
1452                         BFD_ASSERT (*buf == ent->lsda_encoding);
1453                         *buf |= DW_EH_PE_pcrel;
1454                         action &= ~2;
1455                       }
1456                     buf++;
1457                     break;
1458                   case 'P':
1459                     per_encoding = *buf++;
1460                     per_width = get_DW_EH_PE_width (per_encoding, ptr_size);
1461                     BFD_ASSERT (per_width != 0);
1462                     BFD_ASSERT (((per_encoding & 0x70) == DW_EH_PE_pcrel)
1463                                 == ent->per_encoding_relative);
1464                     if ((per_encoding & 0xf0) == DW_EH_PE_aligned)
1465                       buf = (contents
1466                              + ((buf - contents + per_width - 1)
1467                                 & ~((bfd_size_type) per_width - 1)));
1468                     if (action & 4)
1469                       {
1470                         bfd_vma val;
1471
1472                         val = read_value (abfd, buf, per_width,
1473                                           get_DW_EH_PE_signed (per_encoding));
1474                         val += ent->offset - ent->new_offset;
1475                         val -= extra_string + extra_data;
1476                         write_value (abfd, buf, val, per_width);
1477                         action &= ~4;
1478                       }
1479                     buf += per_width;
1480                     break;
1481                   case 'R':
1482                     if (action & 1)
1483                       {
1484                         BFD_ASSERT (*buf == ent->fde_encoding);
1485                         *buf |= DW_EH_PE_pcrel;
1486                         action &= ~1;
1487                       }
1488                     buf++;
1489                     break;
1490                   case 'S':
1491                     break;
1492                   default:
1493                     BFD_FAIL ();
1494                   }
1495             }
1496         }
1497       else
1498         {
1499           /* FDE */
1500           bfd_vma value, address;
1501           unsigned int width;
1502           bfd_byte *start;
1503           struct eh_cie_fde *cie;
1504
1505           /* Skip length.  */
1506           cie = ent->u.fde.cie_inf;
1507           buf += 4;
1508           value = ent->new_offset + 4 - cie->new_offset;
1509           bfd_put_32 (abfd, value, buf);
1510           buf += 4;
1511           width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1512           value = read_value (abfd, buf, width,
1513                               get_DW_EH_PE_signed (ent->fde_encoding));
1514           address = value;
1515           if (value)
1516             {
1517               switch (ent->fde_encoding & 0xf0)
1518                 {
1519                 case DW_EH_PE_indirect:
1520                 case DW_EH_PE_textrel:
1521                   BFD_ASSERT (hdr_info == NULL);
1522                   break;
1523                 case DW_EH_PE_datarel:
1524                   {
1525                     asection *got = bfd_get_section_by_name (abfd, ".got");
1526
1527                     BFD_ASSERT (got != NULL);
1528                     address += got->vma;
1529                   }
1530                   break;
1531                 case DW_EH_PE_pcrel:
1532                   value += ent->offset - ent->new_offset;
1533                   address += sec->output_section->vma + ent->offset + 8;
1534                   break;
1535                 }
1536               if (cie->make_relative)
1537                 value -= sec->output_section->vma + ent->new_offset + 8;
1538               write_value (abfd, buf, value, width);
1539             }
1540
1541           start = buf;
1542
1543           if (hdr_info)
1544             {
1545               hdr_info->array[hdr_info->array_count].initial_loc = address;
1546               hdr_info->array[hdr_info->array_count++].fde
1547                 = sec->output_section->vma + ent->new_offset;
1548             }
1549
1550           if ((ent->lsda_encoding & 0xf0) == DW_EH_PE_pcrel
1551               || cie->need_lsda_relative)
1552             {
1553               buf += ent->lsda_offset;
1554               width = get_DW_EH_PE_width (ent->lsda_encoding, ptr_size);
1555               value = read_value (abfd, buf, width,
1556                                   get_DW_EH_PE_signed (ent->lsda_encoding));
1557               if (value)
1558                 {
1559                   if ((ent->lsda_encoding & 0xf0) == DW_EH_PE_pcrel)
1560                     value += ent->offset - ent->new_offset;
1561                   else if (cie->need_lsda_relative)
1562                     value -= (sec->output_section->vma + ent->new_offset + 8
1563                               + ent->lsda_offset);
1564                   write_value (abfd, buf, value, width);
1565                 }
1566             }
1567           else if (cie->add_augmentation_size)
1568             {
1569               /* Skip the PC and length and insert a zero byte for the
1570                  augmentation size.  */
1571               buf += width * 2;
1572               memmove (buf + 1, buf, end - buf);
1573               *buf = 0;
1574             }
1575
1576           if (ent->set_loc)
1577             {
1578               /* Adjust DW_CFA_set_loc.  */
1579               unsigned int cnt, width;
1580               bfd_vma new_offset;
1581
1582               width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1583               new_offset = ent->new_offset + 8
1584                            + extra_augmentation_string_bytes (ent)
1585                            + extra_augmentation_data_bytes (ent);
1586
1587               for (cnt = 1; cnt <= ent->set_loc[0]; cnt++)
1588                 {
1589                   bfd_vma value;
1590                   buf = start + ent->set_loc[cnt];
1591
1592                   value = read_value (abfd, buf, width,
1593                                       get_DW_EH_PE_signed (ent->fde_encoding));
1594                   if (!value)
1595                     continue;
1596
1597                   if ((ent->fde_encoding & 0xf0) == DW_EH_PE_pcrel)
1598                     value += ent->offset + 8 - new_offset;
1599                   if (cie->make_relative)
1600                     value -= sec->output_section->vma + new_offset
1601                              + ent->set_loc[cnt];
1602                   write_value (abfd, buf, value, width);
1603                 }
1604             }
1605         }
1606     }
1607
1608   /* We don't align the section to its section alignment since the
1609      runtime library only expects all CIE/FDE records aligned at
1610      the pointer size. _bfd_elf_discard_section_eh_frame should
1611      have padded CIE/FDE records to multiple of pointer size with
1612      size_of_output_cie_fde.  */
1613   if ((sec->size % ptr_size) != 0)
1614     abort ();
1615
1616   return bfd_set_section_contents (abfd, sec->output_section,
1617                                    contents, (file_ptr) sec->output_offset,
1618                                    sec->size);
1619 }
1620
1621 /* Helper function used to sort .eh_frame_hdr search table by increasing
1622    VMA of FDE initial location.  */
1623
1624 static int
1625 vma_compare (const void *a, const void *b)
1626 {
1627   const struct eh_frame_array_ent *p = a;
1628   const struct eh_frame_array_ent *q = b;
1629   if (p->initial_loc > q->initial_loc)
1630     return 1;
1631   if (p->initial_loc < q->initial_loc)
1632     return -1;
1633   return 0;
1634 }
1635
1636 /* Write out .eh_frame_hdr section.  This must be called after
1637    _bfd_elf_write_section_eh_frame has been called on all input
1638    .eh_frame sections.
1639    .eh_frame_hdr format:
1640    ubyte version                (currently 1)
1641    ubyte eh_frame_ptr_enc       (DW_EH_PE_* encoding of pointer to start of
1642                                  .eh_frame section)
1643    ubyte fde_count_enc          (DW_EH_PE_* encoding of total FDE count
1644                                  number (or DW_EH_PE_omit if there is no
1645                                  binary search table computed))
1646    ubyte table_enc              (DW_EH_PE_* encoding of binary search table,
1647                                  or DW_EH_PE_omit if not present.
1648                                  DW_EH_PE_datarel is using address of
1649                                  .eh_frame_hdr section start as base)
1650    [encoded] eh_frame_ptr       (pointer to start of .eh_frame section)
1651    optionally followed by:
1652    [encoded] fde_count          (total number of FDEs in .eh_frame section)
1653    fde_count x [encoded] initial_loc, fde
1654                                 (array of encoded pairs containing
1655                                  FDE initial_location field and FDE address,
1656                                  sorted by increasing initial_loc).  */
1657
1658 bfd_boolean
1659 _bfd_elf_write_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
1660 {
1661   struct elf_link_hash_table *htab;
1662   struct eh_frame_hdr_info *hdr_info;
1663   asection *sec;
1664   bfd_byte *contents;
1665   asection *eh_frame_sec;
1666   bfd_size_type size;
1667   bfd_boolean retval;
1668   bfd_vma encoded_eh_frame;
1669
1670   htab = elf_hash_table (info);
1671   hdr_info = &htab->eh_info;
1672   sec = hdr_info->hdr_sec;
1673   if (sec == NULL)
1674     return TRUE;
1675
1676   size = EH_FRAME_HDR_SIZE;
1677   if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
1678     size += 4 + hdr_info->fde_count * 8;
1679   contents = bfd_malloc (size);
1680   if (contents == NULL)
1681     return FALSE;
1682
1683   eh_frame_sec = bfd_get_section_by_name (abfd, ".eh_frame");
1684   if (eh_frame_sec == NULL)
1685     {
1686       free (contents);
1687       return FALSE;
1688     }
1689
1690   memset (contents, 0, EH_FRAME_HDR_SIZE);
1691   contents[0] = 1;                              /* Version.  */
1692   contents[1] = get_elf_backend_data (abfd)->elf_backend_encode_eh_address
1693     (abfd, info, eh_frame_sec, 0, sec, 4,
1694      &encoded_eh_frame);                        /* .eh_frame offset.  */
1695
1696   if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
1697     {
1698       contents[2] = DW_EH_PE_udata4;            /* FDE count encoding.  */
1699       contents[3] = DW_EH_PE_datarel | DW_EH_PE_sdata4; /* Search table enc.  */
1700     }
1701   else
1702     {
1703       contents[2] = DW_EH_PE_omit;
1704       contents[3] = DW_EH_PE_omit;
1705     }
1706   bfd_put_32 (abfd, encoded_eh_frame, contents + 4);
1707
1708   if (contents[2] != DW_EH_PE_omit)
1709     {
1710       unsigned int i;
1711
1712       bfd_put_32 (abfd, hdr_info->fde_count, contents + EH_FRAME_HDR_SIZE);
1713       qsort (hdr_info->array, hdr_info->fde_count, sizeof (*hdr_info->array),
1714              vma_compare);
1715       for (i = 0; i < hdr_info->fde_count; i++)
1716         {
1717           bfd_put_32 (abfd,
1718                       hdr_info->array[i].initial_loc
1719                       - sec->output_section->vma,
1720                       contents + EH_FRAME_HDR_SIZE + i * 8 + 4);
1721           bfd_put_32 (abfd,
1722                       hdr_info->array[i].fde - sec->output_section->vma,
1723                       contents + EH_FRAME_HDR_SIZE + i * 8 + 8);
1724         }
1725     }
1726
1727   retval = bfd_set_section_contents (abfd, sec->output_section,
1728                                      contents, (file_ptr) sec->output_offset,
1729                                      sec->size);
1730   free (contents);
1731   return retval;
1732 }
1733
1734 /* Return the width of FDE addresses.  This is the default implementation.  */
1735
1736 unsigned int
1737 _bfd_elf_eh_frame_address_size (bfd *abfd, asection *sec ATTRIBUTE_UNUSED)
1738 {
1739   return elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64 ? 8 : 4;
1740 }
1741
1742 /* Decide whether we can use a PC-relative encoding within the given
1743    EH frame section.  This is the default implementation.  */
1744
1745 bfd_boolean
1746 _bfd_elf_can_make_relative (bfd *input_bfd ATTRIBUTE_UNUSED,
1747                             struct bfd_link_info *info ATTRIBUTE_UNUSED,
1748                             asection *eh_frame_section ATTRIBUTE_UNUSED)
1749 {
1750   return TRUE;
1751 }
1752
1753 /* Select an encoding for the given address.  Preference is given to
1754    PC-relative addressing modes.  */
1755
1756 bfd_byte
1757 _bfd_elf_encode_eh_address (bfd *abfd ATTRIBUTE_UNUSED,
1758                             struct bfd_link_info *info ATTRIBUTE_UNUSED,
1759                             asection *osec, bfd_vma offset,
1760                             asection *loc_sec, bfd_vma loc_offset,
1761                             bfd_vma *encoded)
1762 {
1763   *encoded = osec->vma + offset -
1764     (loc_sec->output_section->vma + loc_sec->output_offset + loc_offset);
1765   return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
1766 }