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
479   htab = elf_hash_table (info);
480   hdr_info = &htab->eh_info;
481   if (hdr_info->parsed_eh_frames)
482     return;
483
484   if (sec->size == 0)
485     {
486       /* This file does not contain .eh_frame information.  */
487       return;
488     }
489
490   if (bfd_is_abs_section (sec->output_section))
491     {
492       /* At least one of the sections is being discarded from the
493          link, so we should just ignore them.  */
494       return;
495     }
496
497   /* Read the frame unwind information from abfd.  */
498
499   REQUIRE (bfd_malloc_and_get_section (abfd, sec, &ehbuf));
500
501   if (sec->size >= 4
502       && bfd_get_32 (abfd, ehbuf) == 0
503       && cookie->rel == cookie->relend)
504     {
505       /* Empty .eh_frame section.  */
506       free (ehbuf);
507       return;
508     }
509
510   /* If .eh_frame section size doesn't fit into int, we cannot handle
511      it (it would need to use 64-bit .eh_frame format anyway).  */
512   REQUIRE (sec->size == (unsigned int) sec->size);
513
514   ptr_size = (get_elf_backend_data (abfd)
515               ->elf_backend_eh_frame_address_size (abfd, sec));
516   REQUIRE (ptr_size != 0);
517
518   /* Go through the section contents and work out how many FDEs and
519      CIEs there are.  */
520   buf = ehbuf;
521   end = ehbuf + sec->size;
522   num_cies = 0;
523   num_entries = 0;
524   while (buf != end)
525     {
526       num_entries++;
527
528       /* Read the length of the entry.  */
529       REQUIRE (skip_bytes (&buf, end, 4));
530       hdr_length = bfd_get_32 (abfd, buf - 4);
531
532       /* 64-bit .eh_frame is not supported.  */
533       REQUIRE (hdr_length != 0xffffffff);
534       if (hdr_length == 0)
535         break;
536
537       REQUIRE (skip_bytes (&buf, end, 4));
538       hdr_id = bfd_get_32 (abfd, buf - 4);
539       if (hdr_id == 0)
540         num_cies++;
541
542       REQUIRE (skip_bytes (&buf, end, hdr_length - 4));
543     }
544
545   sec_info = bfd_zmalloc (sizeof (struct eh_frame_sec_info)
546                           + (num_entries - 1) * sizeof (struct eh_cie_fde));
547   REQUIRE (sec_info);
548
549   ecies = bfd_zmalloc (num_cies * sizeof (*ecies));
550   REQUIRE (ecies);
551
552   /* If we're not merging CIE entries (such as for a relocatable link),
553      we need to have a "struct cie" for each CIE in this section.  */
554   if (hdr_info->cies == NULL)
555     {
556       local_cies = bfd_zmalloc (num_cies * sizeof (*local_cies));
557       REQUIRE (local_cies);
558     }
559
560 #define ENSURE_NO_RELOCS(buf)                           \
561   REQUIRE (!(cookie->rel < cookie->relend               \
562              && (cookie->rel->r_offset                  \
563                  < (bfd_size_type) ((buf) - ehbuf))     \
564              && cookie->rel->r_info != 0))
565
566 #define SKIP_RELOCS(buf)                                \
567   while (cookie->rel < cookie->relend                   \
568          && (cookie->rel->r_offset                      \
569              < (bfd_size_type) ((buf) - ehbuf)))        \
570     cookie->rel++
571
572 #define GET_RELOC(buf)                                  \
573   ((cookie->rel < cookie->relend                        \
574     && (cookie->rel->r_offset                           \
575         == (bfd_size_type) ((buf) - ehbuf)))            \
576    ? cookie->rel : NULL)
577
578   buf = ehbuf;
579   ecie_count = 0;
580   while ((bfd_size_type) (buf - ehbuf) != sec->size)
581     {
582       char *aug;
583       bfd_byte *start, *insns, *insns_end;
584       bfd_size_type length;
585       unsigned int set_loc_count;
586
587       this_inf = sec_info->entry + sec_info->count;
588       last_fde = buf;
589
590       /* Read the length of the entry.  */
591       REQUIRE (skip_bytes (&buf, ehbuf + sec->size, 4));
592       hdr_length = bfd_get_32 (abfd, buf - 4);
593
594       /* The CIE/FDE must be fully contained in this input section.  */
595       REQUIRE ((bfd_size_type) (buf - ehbuf) + hdr_length <= sec->size);
596       end = buf + hdr_length;
597
598       this_inf->offset = last_fde - ehbuf;
599       this_inf->size = 4 + hdr_length;
600       this_inf->reloc_index = cookie->rel - cookie->rels;
601
602       if (hdr_length == 0)
603         {
604           /* A zero-length CIE should only be found at the end of
605              the section.  */
606           REQUIRE ((bfd_size_type) (buf - ehbuf) == sec->size);
607           ENSURE_NO_RELOCS (buf);
608           sec_info->count++;
609           break;
610         }
611
612       REQUIRE (skip_bytes (&buf, end, 4));
613       hdr_id = bfd_get_32 (abfd, buf - 4);
614
615       if (hdr_id == 0)
616         {
617           unsigned int initial_insn_length;
618
619           /* CIE  */
620           this_inf->cie = 1;
621
622           /* If we're merging CIEs, construct the struct cie in TMP_CIE;
623              we'll enter it into the global pool later.  Otherwise point
624              CIE to one of the section-local cie structures.  */
625           if (local_cies)
626             cie = local_cies + ecie_count;
627           else
628             {
629               cie = &tmp_cie;
630               memset (cie, 0, sizeof (*cie));
631             }
632           cie->cie_inf = this_inf;
633           cie->length = hdr_length;
634           cie->output_sec = sec->output_section;
635           start = buf;
636           REQUIRE (read_byte (&buf, end, &cie->version));
637
638           /* Cannot handle unknown versions.  */
639           REQUIRE (cie->version == 1 || cie->version == 3);
640           REQUIRE (strlen ((char *) buf) < sizeof (cie->augmentation));
641
642           strcpy (cie->augmentation, (char *) buf);
643           buf = (bfd_byte *) strchr ((char *) buf, '\0') + 1;
644           ENSURE_NO_RELOCS (buf);
645           if (buf[0] == 'e' && buf[1] == 'h')
646             {
647               /* GCC < 3.0 .eh_frame CIE */
648               /* We cannot merge "eh" CIEs because __EXCEPTION_TABLE__
649                  is private to each CIE, so we don't need it for anything.
650                  Just skip it.  */
651               REQUIRE (skip_bytes (&buf, end, ptr_size));
652               SKIP_RELOCS (buf);
653             }
654           REQUIRE (read_uleb128 (&buf, end, &cie->code_align));
655           REQUIRE (read_sleb128 (&buf, end, &cie->data_align));
656           if (cie->version == 1)
657             {
658               REQUIRE (buf < end);
659               cie->ra_column = *buf++;
660             }
661           else
662             REQUIRE (read_uleb128 (&buf, end, &cie->ra_column));
663           ENSURE_NO_RELOCS (buf);
664           cie->lsda_encoding = DW_EH_PE_omit;
665           cie->fde_encoding = DW_EH_PE_omit;
666           cie->per_encoding = DW_EH_PE_omit;
667           aug = cie->augmentation;
668           if (aug[0] != 'e' || aug[1] != 'h')
669             {
670               if (*aug == 'z')
671                 {
672                   aug++;
673                   REQUIRE (read_uleb128 (&buf, end, &cie->augmentation_size));
674                   ENSURE_NO_RELOCS (buf);
675                 }
676
677               while (*aug != '\0')
678                 switch (*aug++)
679                   {
680                   case 'L':
681                     REQUIRE (read_byte (&buf, end, &cie->lsda_encoding));
682                     ENSURE_NO_RELOCS (buf);
683                     REQUIRE (get_DW_EH_PE_width (cie->lsda_encoding, ptr_size));
684                     break;
685                   case 'R':
686                     REQUIRE (read_byte (&buf, end, &cie->fde_encoding));
687                     ENSURE_NO_RELOCS (buf);
688                     REQUIRE (get_DW_EH_PE_width (cie->fde_encoding, ptr_size));
689                     break;
690                   case 'S':
691                     break;
692                   case 'P':
693                     {
694                       int per_width;
695
696                       REQUIRE (read_byte (&buf, end, &cie->per_encoding));
697                       per_width = get_DW_EH_PE_width (cie->per_encoding,
698                                                       ptr_size);
699                       REQUIRE (per_width);
700                       if ((cie->per_encoding & 0xf0) == DW_EH_PE_aligned)
701                         {
702                           length = -(buf - ehbuf) & (per_width - 1);
703                           REQUIRE (skip_bytes (&buf, end, length));
704                         }
705                       ENSURE_NO_RELOCS (buf);
706                       /* Ensure we have a reloc here.  */
707                       if (GET_RELOC (buf) != NULL)
708                         {
709                           unsigned long r_symndx;
710
711 #ifdef BFD64
712                           if (elf_elfheader (abfd)->e_ident[EI_CLASS]
713                               == ELFCLASS64)
714                             r_symndx = ELF64_R_SYM (cookie->rel->r_info);
715                           else
716 #endif
717                             r_symndx = ELF32_R_SYM (cookie->rel->r_info);
718                           if (r_symndx >= cookie->locsymcount
719                               || ELF_ST_BIND (cookie->locsyms[r_symndx]
720                                               .st_info) != STB_LOCAL)
721                             {
722                               struct elf_link_hash_entry *h;
723
724                               r_symndx -= cookie->extsymoff;
725                               h = cookie->sym_hashes[r_symndx];
726
727                               while (h->root.type == bfd_link_hash_indirect
728                                      || h->root.type == bfd_link_hash_warning)
729                                 h = (struct elf_link_hash_entry *)
730                                     h->root.u.i.link;
731
732                               cie->personality.h = h;
733                             }
734                           else
735                             {
736                               Elf_Internal_Sym *sym;
737                               asection *sym_sec;
738                               bfd_vma val;
739
740                               sym = &cookie->locsyms[r_symndx];
741                               sym_sec = (bfd_section_from_elf_index
742                                          (abfd, sym->st_shndx));
743                               if (sym_sec != NULL)
744                                 {
745                                   if (sym_sec->kept_section != NULL)
746                                     sym_sec = sym_sec->kept_section;
747                                   if (sym_sec->output_section != NULL)
748                                     {
749                                       val = (sym->st_value
750                                              + sym_sec->output_offset
751                                              + sym_sec->output_section->vma);
752                                       cie->personality.val = val;
753                                       cie->local_personality = 1;
754                                     }
755                                 }
756                             }
757
758                           /* Cope with MIPS-style composite relocations.  */
759                           do
760                             cookie->rel++;
761                           while (GET_RELOC (buf) != NULL);
762                         }
763                       REQUIRE (skip_bytes (&buf, end, per_width));
764                       REQUIRE (cie->local_personality || cie->personality.h);
765                     }
766                     break;
767                   default:
768                     /* Unrecognized augmentation. Better bail out.  */
769                     goto free_no_table;
770                   }
771             }
772
773           /* For shared libraries, try to get rid of as many RELATIVE relocs
774              as possible.  */
775           if (info->shared
776               && (get_elf_backend_data (abfd)
777                   ->elf_backend_can_make_relative_eh_frame
778                   (abfd, info, sec)))
779             {
780               if ((cie->fde_encoding & 0xf0) == DW_EH_PE_absptr)
781                 cie->make_relative = 1;
782               /* If the CIE doesn't already have an 'R' entry, it's fairly
783                  easy to add one, provided that there's no aligned data
784                  after the augmentation string.  */
785               else if (cie->fde_encoding == DW_EH_PE_omit
786                        && (cie->per_encoding & 0xf0) != DW_EH_PE_aligned)
787                 {
788                   if (*cie->augmentation == 0)
789                     this_inf->add_augmentation_size = 1;
790                   this_inf->add_fde_encoding = 1;
791                   cie->make_relative = 1;
792                 }
793             }
794
795           if (info->shared
796               && (get_elf_backend_data (abfd)
797                   ->elf_backend_can_make_lsda_relative_eh_frame
798                   (abfd, info, sec))
799               && (cie->lsda_encoding & 0xf0) == DW_EH_PE_absptr)
800             cie->make_lsda_relative = 1;
801
802           /* If FDE encoding was not specified, it defaults to
803              DW_EH_absptr.  */
804           if (cie->fde_encoding == DW_EH_PE_omit)
805             cie->fde_encoding = DW_EH_PE_absptr;
806
807           initial_insn_length = end - buf;
808           if (initial_insn_length <= sizeof (cie->initial_instructions))
809             {
810               cie->initial_insn_length = initial_insn_length;
811               memcpy (cie->initial_instructions, buf, initial_insn_length);
812             }
813           insns = buf;
814           buf += initial_insn_length;
815           ENSURE_NO_RELOCS (buf);
816
817           this_inf->make_relative = cie->make_relative;
818           this_inf->make_lsda_relative = cie->make_lsda_relative;
819           this_inf->per_encoding_relative
820             = (cie->per_encoding & 0x70) == DW_EH_PE_pcrel;
821         }
822       else
823         {
824           /* Find the corresponding CIE.  */
825           unsigned int cie_offset = this_inf->offset + 4 - hdr_id;
826           for (ecie = ecies; ecie < ecies + ecie_count; ++ecie)
827             if (cie_offset == ecie->local_cie->offset)
828               break;
829
830           /* Ensure this FDE references one of the CIEs in this input
831              section.  */
832           REQUIRE (ecie != ecies + ecie_count);
833           cie = ecie->cie;
834           this_inf->u.fde.cie_inf = ecie->local_cie;
835
836           ENSURE_NO_RELOCS (buf);
837           REQUIRE (GET_RELOC (buf));
838
839           /* Skip the initial location and address range.  */
840           start = buf;
841           length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
842           REQUIRE (skip_bytes (&buf, end, 2 * length));
843
844           /* Skip the augmentation size, if present.  */
845           if (cie->augmentation[0] == 'z')
846             REQUIRE (read_uleb128 (&buf, end, &length));
847           else
848             length = 0;
849
850           /* Of the supported augmentation characters above, only 'L'
851              adds augmentation data to the FDE.  This code would need to
852              be adjusted if any future augmentations do the same thing.  */
853           if (cie->lsda_encoding != DW_EH_PE_omit)
854             {
855               this_inf->lsda_offset = buf - start;
856               /* If there's no 'z' augmentation, we don't know where the
857                  CFA insns begin.  Assume no padding.  */
858               if (cie->augmentation[0] != 'z')
859                 length = end - buf;
860             }
861
862           /* Skip over the augmentation data.  */
863           REQUIRE (skip_bytes (&buf, end, length));
864           insns = buf;
865
866           buf = last_fde + 4 + hdr_length;
867           SKIP_RELOCS (buf);
868         }
869
870       /* Try to interpret the CFA instructions and find the first
871          padding nop.  Shrink this_inf's size so that it doesn't
872          include the padding.  */
873       length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
874       set_loc_count = 0;
875       insns_end = skip_non_nops (insns, end, length, &set_loc_count);
876       /* If we don't understand the CFA instructions, we can't know
877          what needs to be adjusted there.  */
878       if (insns_end == NULL
879           /* For the time being we don't support DW_CFA_set_loc in
880              CIE instructions.  */
881           || (set_loc_count && this_inf->cie))
882         goto free_no_table;
883       this_inf->size -= end - insns_end;
884       if (insns_end != end && this_inf->cie)
885         {
886           cie->initial_insn_length -= end - insns_end;
887           cie->length -= end - insns_end;
888         }
889       if (set_loc_count
890           && ((cie->fde_encoding & 0xf0) == DW_EH_PE_pcrel
891               || cie->make_relative))
892         {
893           unsigned int cnt;
894           bfd_byte *p;
895
896           this_inf->set_loc = bfd_malloc ((set_loc_count + 1)
897                                           * sizeof (unsigned int));
898           REQUIRE (this_inf->set_loc);
899           this_inf->set_loc[0] = set_loc_count;
900           p = insns;
901           cnt = 0;
902           while (p < end)
903             {
904               if (*p == DW_CFA_set_loc)
905                 this_inf->set_loc[++cnt] = p + 1 - start;
906               REQUIRE (skip_cfa_op (&p, end, length));
907             }
908         }
909
910       this_inf->removed = 1;
911       this_inf->fde_encoding = cie->fde_encoding;
912       this_inf->lsda_encoding = cie->lsda_encoding;
913       if (this_inf->cie)
914         {
915           /* We have now finished constructing the struct cie.  */
916           if (hdr_info->cies != NULL)
917             {
918               /* See if we can merge this CIE with an earlier one.  */
919               void **loc;
920
921               cie_compute_hash (cie);
922               loc = htab_find_slot_with_hash (hdr_info->cies, cie,
923                                               cie->hash, INSERT);
924               REQUIRE (loc);
925               if (*loc == HTAB_EMPTY_ENTRY)
926                 {
927                   *loc = malloc (sizeof (struct cie));
928                   REQUIRE (*loc);
929                   memcpy (*loc, cie, sizeof (struct cie));
930                 }
931               cie = (struct cie *) *loc;
932             }
933           this_inf->u.cie.merged = cie->cie_inf;
934           ecies[ecie_count].cie = cie;
935           ecies[ecie_count++].local_cie = this_inf;
936         }
937       sec_info->count++;
938     }
939   BFD_ASSERT (sec_info->count == num_entries);
940   BFD_ASSERT (ecie_count == num_cies);
941
942   elf_section_data (sec)->sec_info = sec_info;
943   sec->sec_info_type = ELF_INFO_TYPE_EH_FRAME;
944   goto success;
945
946  free_no_table:
947   (*info->callbacks->einfo)
948     (_("%P: error in %B(%A); no .eh_frame_hdr table will be created.\n"),
949      abfd, sec);
950   hdr_info->table = FALSE;
951   if (sec_info)
952     free (sec_info);
953  success:
954   if (ehbuf)
955     free (ehbuf);
956   if (ecies)
957     free (ecies);
958   if (local_cies)
959     free (local_cies);
960 #undef REQUIRE
961 }
962
963 /* Finish a pass over all .eh_frame sections.  */
964
965 void
966 _bfd_elf_end_eh_frame_parsing (struct bfd_link_info *info)
967 {
968   struct eh_frame_hdr_info *hdr_info;
969
970   hdr_info = &elf_hash_table (info)->eh_info;
971   if (hdr_info->cies != NULL)
972     {
973       htab_delete (hdr_info->cies);
974       hdr_info->cies = NULL;
975     }
976   hdr_info->parsed_eh_frames = TRUE;
977 }
978
979 /* This function is called for each input file before the .eh_frame
980    section is relocated.  It discards duplicate CIEs and FDEs for discarded
981    functions.  The function returns TRUE iff any entries have been
982    deleted.  */
983
984 bfd_boolean
985 _bfd_elf_discard_section_eh_frame
986    (bfd *abfd, struct bfd_link_info *info, asection *sec,
987     bfd_boolean (*reloc_symbol_deleted_p) (bfd_vma, void *),
988     struct elf_reloc_cookie *cookie)
989 {
990   struct eh_cie_fde *ent, *cie, *merged;
991   struct eh_frame_sec_info *sec_info;
992   struct eh_frame_hdr_info *hdr_info;
993   unsigned int ptr_size, offset;
994
995   sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
996   if (sec_info == NULL)
997     return FALSE;
998
999   hdr_info = &elf_hash_table (info)->eh_info;
1000   for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1001     if (!ent->cie)
1002       {
1003         cookie->rel = cookie->rels + ent->reloc_index;
1004         BFD_ASSERT (cookie->rel < cookie->relend
1005                     && cookie->rel->r_offset == ent->offset + 8);
1006         if (!(*reloc_symbol_deleted_p) (ent->offset + 8, cookie))
1007           {
1008             if (info->shared
1009                 && (((ent->fde_encoding & 0xf0) == DW_EH_PE_absptr
1010                      && ent->u.fde.cie_inf->make_relative == 0)
1011                     || (ent->fde_encoding & 0xf0) == DW_EH_PE_aligned))
1012               {
1013                 /* If a shared library uses absolute pointers
1014                    which we cannot turn into PC relative,
1015                    don't create the binary search table,
1016                    since it is affected by runtime relocations.  */
1017                 hdr_info->table = FALSE;
1018                 (*info->callbacks->einfo)
1019                   (_("%P: fde encoding in %B(%A) prevents .eh_frame_hdr"
1020                      " table being created.\n"), abfd, sec);
1021               }
1022             ent->removed = 0;
1023             hdr_info->fde_count++;
1024
1025             cie = ent->u.fde.cie_inf;
1026             if (cie->removed)
1027               {
1028                 merged = cie->u.cie.merged;
1029                 if (!merged->removed)
1030                   /* We have decided to keep the group representative.  */
1031                   ent->u.fde.cie_inf = merged;
1032                 else if (merged->u.cie.merged != merged)
1033                   /* We didn't keep the original group representative,
1034                      but we did keep an alternative.  */
1035                   ent->u.fde.cie_inf = merged->u.cie.merged;
1036                 else
1037                   {
1038                     /* Make the local CIE represent the merged group.  */
1039                     merged->u.cie.merged = cie;
1040                     cie->removed = 0;
1041                   }
1042               }
1043           }
1044       }
1045
1046   ptr_size = (get_elf_backend_data (sec->owner)
1047               ->elf_backend_eh_frame_address_size (sec->owner, sec));
1048   offset = 0;
1049   for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1050     if (!ent->removed)
1051       {
1052         ent->new_offset = offset;
1053         offset += size_of_output_cie_fde (ent, ptr_size);
1054       }
1055
1056   sec->rawsize = sec->size;
1057   sec->size = offset;
1058   return offset != sec->rawsize;
1059 }
1060
1061 /* This function is called for .eh_frame_hdr section after
1062    _bfd_elf_discard_section_eh_frame has been called on all .eh_frame
1063    input sections.  It finalizes the size of .eh_frame_hdr section.  */
1064
1065 bfd_boolean
1066 _bfd_elf_discard_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
1067 {
1068   struct elf_link_hash_table *htab;
1069   struct eh_frame_hdr_info *hdr_info;
1070   asection *sec;
1071
1072   htab = elf_hash_table (info);
1073   hdr_info = &htab->eh_info;
1074
1075   sec = hdr_info->hdr_sec;
1076   if (sec == NULL)
1077     return FALSE;
1078
1079   sec->size = EH_FRAME_HDR_SIZE;
1080   if (hdr_info->table)
1081     sec->size += 4 + hdr_info->fde_count * 8;
1082
1083   elf_tdata (abfd)->eh_frame_hdr = sec;
1084   return TRUE;
1085 }
1086
1087 /* This function is called from size_dynamic_sections.
1088    It needs to decide whether .eh_frame_hdr should be output or not,
1089    because when the dynamic symbol table has been sized it is too late
1090    to strip sections.  */
1091
1092 bfd_boolean
1093 _bfd_elf_maybe_strip_eh_frame_hdr (struct bfd_link_info *info)
1094 {
1095   asection *o;
1096   bfd *abfd;
1097   struct elf_link_hash_table *htab;
1098   struct eh_frame_hdr_info *hdr_info;
1099
1100   htab = elf_hash_table (info);
1101   hdr_info = &htab->eh_info;
1102   if (hdr_info->hdr_sec == NULL)
1103     return TRUE;
1104
1105   if (bfd_is_abs_section (hdr_info->hdr_sec->output_section))
1106     {
1107       hdr_info->hdr_sec = NULL;
1108       return TRUE;
1109     }
1110
1111   abfd = NULL;
1112   if (info->eh_frame_hdr)
1113     for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link_next)
1114       {
1115         /* Count only sections which have at least a single CIE or FDE.
1116            There cannot be any CIE or FDE <= 8 bytes.  */
1117         o = bfd_get_section_by_name (abfd, ".eh_frame");
1118         if (o && o->size > 8 && !bfd_is_abs_section (o->output_section))
1119           break;
1120       }
1121
1122   if (abfd == NULL)
1123     {
1124       hdr_info->hdr_sec->flags |= SEC_EXCLUDE;
1125       hdr_info->hdr_sec = NULL;
1126       return TRUE;
1127     }
1128
1129   hdr_info->table = TRUE;
1130   return TRUE;
1131 }
1132
1133 /* Adjust an address in the .eh_frame section.  Given OFFSET within
1134    SEC, this returns the new offset in the adjusted .eh_frame section,
1135    or -1 if the address refers to a CIE/FDE which has been removed
1136    or to offset with dynamic relocation which is no longer needed.  */
1137
1138 bfd_vma
1139 _bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED,
1140                                   struct bfd_link_info *info,
1141                                   asection *sec,
1142                                   bfd_vma offset)
1143 {
1144   struct eh_frame_sec_info *sec_info;
1145   struct elf_link_hash_table *htab;
1146   struct eh_frame_hdr_info *hdr_info;
1147   unsigned int lo, hi, mid;
1148
1149   if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
1150     return offset;
1151   sec_info = elf_section_data (sec)->sec_info;
1152
1153   if (offset >= sec->rawsize)
1154     return offset - sec->rawsize + sec->size;
1155
1156   htab = elf_hash_table (info);
1157   hdr_info = &htab->eh_info;
1158   if (hdr_info->offsets_adjusted)
1159     offset += sec->output_offset;
1160
1161   lo = 0;
1162   hi = sec_info->count;
1163   mid = 0;
1164   while (lo < hi)
1165     {
1166       mid = (lo + hi) / 2;
1167       if (offset < sec_info->entry[mid].offset)
1168         hi = mid;
1169       else if (offset
1170                >= sec_info->entry[mid].offset + sec_info->entry[mid].size)
1171         lo = mid + 1;
1172       else
1173         break;
1174     }
1175
1176   BFD_ASSERT (lo < hi);
1177
1178   /* FDE or CIE was removed.  */
1179   if (sec_info->entry[mid].removed)
1180     return (bfd_vma) -1;
1181
1182   /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
1183      relocation against FDE's initial_location field.  */
1184   if (!sec_info->entry[mid].cie
1185       && sec_info->entry[mid].u.fde.cie_inf->make_relative
1186       && offset == sec_info->entry[mid].offset + 8)
1187     return (bfd_vma) -2;
1188
1189   /* If converting LSDA pointers to DW_EH_PE_pcrel, there will be no need
1190      for run-time relocation against LSDA field.  */
1191   if (!sec_info->entry[mid].cie
1192       && sec_info->entry[mid].u.fde.cie_inf->make_lsda_relative
1193       && (offset == (sec_info->entry[mid].offset + 8
1194                      + sec_info->entry[mid].lsda_offset))
1195       && (sec_info->entry[mid].u.fde.cie_inf->need_lsda_relative
1196           || !hdr_info->offsets_adjusted))
1197     {
1198       sec_info->entry[mid].u.fde.cie_inf->need_lsda_relative = 1;
1199       return (bfd_vma) -2;
1200     }
1201
1202   /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
1203      relocation against DW_CFA_set_loc's arguments.  */
1204   if (sec_info->entry[mid].set_loc
1205       && (sec_info->entry[mid].cie
1206           ? sec_info->entry[mid].make_relative
1207           : sec_info->entry[mid].u.fde.cie_inf->make_relative)
1208       && (offset >= sec_info->entry[mid].offset + 8
1209                     + sec_info->entry[mid].set_loc[1]))
1210     {
1211       unsigned int cnt;
1212
1213       for (cnt = 1; cnt <= sec_info->entry[mid].set_loc[0]; cnt++)
1214         if (offset == sec_info->entry[mid].offset + 8
1215                       + sec_info->entry[mid].set_loc[cnt])
1216           return (bfd_vma) -2;
1217     }
1218
1219   if (hdr_info->offsets_adjusted)
1220     offset -= sec->output_offset;
1221   /* Any new augmentation bytes go before the first relocation.  */
1222   return (offset + sec_info->entry[mid].new_offset
1223           - sec_info->entry[mid].offset
1224           + extra_augmentation_string_bytes (sec_info->entry + mid)
1225           + extra_augmentation_data_bytes (sec_info->entry + mid));
1226 }
1227
1228 /* Write out .eh_frame section.  This is called with the relocated
1229    contents.  */
1230
1231 bfd_boolean
1232 _bfd_elf_write_section_eh_frame (bfd *abfd,
1233                                  struct bfd_link_info *info,
1234                                  asection *sec,
1235                                  bfd_byte *contents)
1236 {
1237   struct eh_frame_sec_info *sec_info;
1238   struct elf_link_hash_table *htab;
1239   struct eh_frame_hdr_info *hdr_info;
1240   unsigned int ptr_size;
1241   struct eh_cie_fde *ent;
1242
1243   if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
1244     return bfd_set_section_contents (abfd, sec->output_section, contents,
1245                                      sec->output_offset, sec->size);
1246
1247   ptr_size = (get_elf_backend_data (abfd)
1248               ->elf_backend_eh_frame_address_size (abfd, sec));
1249   BFD_ASSERT (ptr_size != 0);
1250
1251   sec_info = elf_section_data (sec)->sec_info;
1252   htab = elf_hash_table (info);
1253   hdr_info = &htab->eh_info;
1254
1255   /* First convert all offsets to output section offsets, so that a
1256      CIE offset is valid if the CIE is used by a FDE from some other
1257      section.  This can happen when duplicate CIEs are deleted in
1258      _bfd_elf_discard_section_eh_frame.  We do all sections here because
1259      this function might not be called on sections in the same order as
1260      _bfd_elf_discard_section_eh_frame.  */
1261   if (!hdr_info->offsets_adjusted)
1262     {
1263       bfd *ibfd;
1264       asection *eh;
1265       struct eh_frame_sec_info *eh_inf;
1266
1267       for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1268         {
1269           if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1270               || (ibfd->flags & DYNAMIC) != 0)
1271             continue;
1272
1273           eh = bfd_get_section_by_name (ibfd, ".eh_frame");
1274           if (eh == NULL || eh->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
1275             continue;
1276
1277           eh_inf = elf_section_data (eh)->sec_info;
1278           for (ent = eh_inf->entry; ent < eh_inf->entry + eh_inf->count; ++ent)
1279             {
1280               ent->offset += eh->output_offset;
1281               ent->new_offset += eh->output_offset;
1282             }
1283         }
1284       hdr_info->offsets_adjusted = TRUE;
1285     }
1286
1287   if (hdr_info->table && hdr_info->array == NULL)
1288     hdr_info->array
1289       = bfd_malloc (hdr_info->fde_count * sizeof(*hdr_info->array));
1290   if (hdr_info->array == NULL)
1291     hdr_info = NULL;
1292
1293   /* The new offsets can be bigger or smaller than the original offsets.
1294      We therefore need to make two passes over the section: one backward
1295      pass to move entries up and one forward pass to move entries down.
1296      The two passes won't interfere with each other because entries are
1297      not reordered  */
1298   for (ent = sec_info->entry + sec_info->count; ent-- != sec_info->entry;)
1299     if (!ent->removed && ent->new_offset > ent->offset)
1300       memmove (contents + ent->new_offset - sec->output_offset,
1301                contents + ent->offset - sec->output_offset, ent->size);
1302
1303   for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1304     if (!ent->removed && ent->new_offset < ent->offset)
1305       memmove (contents + ent->new_offset - sec->output_offset,
1306                contents + ent->offset - sec->output_offset, ent->size);
1307
1308   for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1309     {
1310       unsigned char *buf, *end;
1311       unsigned int new_size;
1312
1313       if (ent->removed)
1314         continue;
1315
1316       if (ent->size == 4)
1317         {
1318           /* Any terminating FDE must be at the end of the section.  */
1319           BFD_ASSERT (ent == sec_info->entry + sec_info->count - 1);
1320           continue;
1321         }
1322
1323       buf = contents + ent->new_offset - sec->output_offset;
1324       end = buf + ent->size;
1325       new_size = size_of_output_cie_fde (ent, ptr_size);
1326
1327       /* Update the size.  It may be shrinked.  */
1328       bfd_put_32 (abfd, new_size - 4, buf);
1329
1330       /* Filling the extra bytes with DW_CFA_nops.  */
1331       if (new_size != ent->size)
1332         memset (end, 0, new_size - ent->size);
1333
1334       if (ent->cie)
1335         {
1336           /* CIE */
1337           if (ent->make_relative
1338               || ent->need_lsda_relative
1339               || ent->per_encoding_relative)
1340             {
1341               char *aug;
1342               unsigned int action, extra_string, extra_data;
1343               unsigned int per_width, per_encoding;
1344
1345               /* Need to find 'R' or 'L' augmentation's argument and modify
1346                  DW_EH_PE_* value.  */
1347               action = ((ent->make_relative ? 1 : 0)
1348                         | (ent->need_lsda_relative ? 2 : 0)
1349                         | (ent->per_encoding_relative ? 4 : 0));
1350               extra_string = extra_augmentation_string_bytes (ent);
1351               extra_data = extra_augmentation_data_bytes (ent);
1352
1353               /* Skip length, id and version.  */
1354               buf += 9;
1355               aug = (char *) buf;
1356               buf += strlen (aug) + 1;
1357               skip_leb128 (&buf, end);
1358               skip_leb128 (&buf, end);
1359               skip_leb128 (&buf, end);
1360               if (*aug == 'z')
1361                 {
1362                   /* The uleb128 will always be a single byte for the kind
1363                      of augmentation strings that we're prepared to handle.  */
1364                   *buf++ += extra_data;
1365                   aug++;
1366                 }
1367
1368               /* Make room for the new augmentation string and data bytes.  */
1369               memmove (buf + extra_string + extra_data, buf, end - buf);
1370               memmove (aug + extra_string, aug, buf - (bfd_byte *) aug);
1371               buf += extra_string;
1372               end += extra_string + extra_data;
1373
1374               if (ent->add_augmentation_size)
1375                 {
1376                   *aug++ = 'z';
1377                   *buf++ = extra_data - 1;
1378                 }
1379               if (ent->add_fde_encoding)
1380                 {
1381                   BFD_ASSERT (action & 1);
1382                   *aug++ = 'R';
1383                   *buf++ = DW_EH_PE_pcrel;
1384                   action &= ~1;
1385                 }
1386
1387               while (action)
1388                 switch (*aug++)
1389                   {
1390                   case 'L':
1391                     if (action & 2)
1392                       {
1393                         BFD_ASSERT (*buf == ent->lsda_encoding);
1394                         *buf |= DW_EH_PE_pcrel;
1395                         action &= ~2;
1396                       }
1397                     buf++;
1398                     break;
1399                   case 'P':
1400                     per_encoding = *buf++;
1401                     per_width = get_DW_EH_PE_width (per_encoding, ptr_size);
1402                     BFD_ASSERT (per_width != 0);
1403                     BFD_ASSERT (((per_encoding & 0x70) == DW_EH_PE_pcrel)
1404                                 == ent->per_encoding_relative);
1405                     if ((per_encoding & 0xf0) == DW_EH_PE_aligned)
1406                       buf = (contents
1407                              + ((buf - contents + per_width - 1)
1408                                 & ~((bfd_size_type) per_width - 1)));
1409                     if (action & 4)
1410                       {
1411                         bfd_vma val;
1412
1413                         val = read_value (abfd, buf, per_width,
1414                                           get_DW_EH_PE_signed (per_encoding));
1415                         val += ent->offset - ent->new_offset;
1416                         val -= extra_string + extra_data;
1417                         write_value (abfd, buf, val, per_width);
1418                         action &= ~4;
1419                       }
1420                     buf += per_width;
1421                     break;
1422                   case 'R':
1423                     if (action & 1)
1424                       {
1425                         BFD_ASSERT (*buf == ent->fde_encoding);
1426                         *buf |= DW_EH_PE_pcrel;
1427                         action &= ~1;
1428                       }
1429                     buf++;
1430                     break;
1431                   case 'S':
1432                     break;
1433                   default:
1434                     BFD_FAIL ();
1435                   }
1436             }
1437         }
1438       else
1439         {
1440           /* FDE */
1441           bfd_vma value, address;
1442           unsigned int width;
1443           bfd_byte *start;
1444           struct eh_cie_fde *cie;
1445
1446           /* Skip length.  */
1447           cie = ent->u.fde.cie_inf;
1448           buf += 4;
1449           value = ent->new_offset + 4 - cie->new_offset;
1450           bfd_put_32 (abfd, value, buf);
1451           buf += 4;
1452           width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1453           value = read_value (abfd, buf, width,
1454                               get_DW_EH_PE_signed (ent->fde_encoding));
1455           address = value;
1456           if (value)
1457             {
1458               switch (ent->fde_encoding & 0xf0)
1459                 {
1460                 case DW_EH_PE_indirect:
1461                 case DW_EH_PE_textrel:
1462                   BFD_ASSERT (hdr_info == NULL);
1463                   break;
1464                 case DW_EH_PE_datarel:
1465                   {
1466                     asection *got = bfd_get_section_by_name (abfd, ".got");
1467
1468                     BFD_ASSERT (got != NULL);
1469                     address += got->vma;
1470                   }
1471                   break;
1472                 case DW_EH_PE_pcrel:
1473                   value += ent->offset - ent->new_offset;
1474                   address += sec->output_section->vma + ent->offset + 8;
1475                   break;
1476                 }
1477               if (cie->make_relative)
1478                 value -= sec->output_section->vma + ent->new_offset + 8;
1479               write_value (abfd, buf, value, width);
1480             }
1481
1482           start = buf;
1483
1484           if (hdr_info)
1485             {
1486               hdr_info->array[hdr_info->array_count].initial_loc = address;
1487               hdr_info->array[hdr_info->array_count++].fde
1488                 = sec->output_section->vma + ent->new_offset;
1489             }
1490
1491           if ((ent->lsda_encoding & 0xf0) == DW_EH_PE_pcrel
1492               || cie->need_lsda_relative)
1493             {
1494               buf += ent->lsda_offset;
1495               width = get_DW_EH_PE_width (ent->lsda_encoding, ptr_size);
1496               value = read_value (abfd, buf, width,
1497                                   get_DW_EH_PE_signed (ent->lsda_encoding));
1498               if (value)
1499                 {
1500                   if ((ent->lsda_encoding & 0xf0) == DW_EH_PE_pcrel)
1501                     value += ent->offset - ent->new_offset;
1502                   else if (cie->need_lsda_relative)
1503                     value -= (sec->output_section->vma + ent->new_offset + 8
1504                               + ent->lsda_offset);
1505                   write_value (abfd, buf, value, width);
1506                 }
1507             }
1508           else if (cie->add_augmentation_size)
1509             {
1510               /* Skip the PC and length and insert a zero byte for the
1511                  augmentation size.  */
1512               buf += width * 2;
1513               memmove (buf + 1, buf, end - buf);
1514               *buf = 0;
1515             }
1516
1517           if (ent->set_loc)
1518             {
1519               /* Adjust DW_CFA_set_loc.  */
1520               unsigned int cnt, width;
1521               bfd_vma new_offset;
1522
1523               width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1524               new_offset = ent->new_offset + 8
1525                            + extra_augmentation_string_bytes (ent)
1526                            + extra_augmentation_data_bytes (ent);
1527
1528               for (cnt = 1; cnt <= ent->set_loc[0]; cnt++)
1529                 {
1530                   bfd_vma value;
1531                   buf = start + ent->set_loc[cnt];
1532
1533                   value = read_value (abfd, buf, width,
1534                                       get_DW_EH_PE_signed (ent->fde_encoding));
1535                   if (!value)
1536                     continue;
1537
1538                   if ((ent->fde_encoding & 0xf0) == DW_EH_PE_pcrel)
1539                     value += ent->offset + 8 - new_offset;
1540                   if (cie->make_relative)
1541                     value -= sec->output_section->vma + new_offset
1542                              + ent->set_loc[cnt];
1543                   write_value (abfd, buf, value, width);
1544                 }
1545             }
1546         }
1547     }
1548
1549   /* We don't align the section to its section alignment since the
1550      runtime library only expects all CIE/FDE records aligned at
1551      the pointer size. _bfd_elf_discard_section_eh_frame should
1552      have padded CIE/FDE records to multiple of pointer size with
1553      size_of_output_cie_fde.  */
1554   if ((sec->size % ptr_size) != 0)
1555     abort ();
1556
1557   return bfd_set_section_contents (abfd, sec->output_section,
1558                                    contents, (file_ptr) sec->output_offset,
1559                                    sec->size);
1560 }
1561
1562 /* Helper function used to sort .eh_frame_hdr search table by increasing
1563    VMA of FDE initial location.  */
1564
1565 static int
1566 vma_compare (const void *a, const void *b)
1567 {
1568   const struct eh_frame_array_ent *p = a;
1569   const struct eh_frame_array_ent *q = b;
1570   if (p->initial_loc > q->initial_loc)
1571     return 1;
1572   if (p->initial_loc < q->initial_loc)
1573     return -1;
1574   return 0;
1575 }
1576
1577 /* Write out .eh_frame_hdr section.  This must be called after
1578    _bfd_elf_write_section_eh_frame has been called on all input
1579    .eh_frame sections.
1580    .eh_frame_hdr format:
1581    ubyte version                (currently 1)
1582    ubyte eh_frame_ptr_enc       (DW_EH_PE_* encoding of pointer to start of
1583                                  .eh_frame section)
1584    ubyte fde_count_enc          (DW_EH_PE_* encoding of total FDE count
1585                                  number (or DW_EH_PE_omit if there is no
1586                                  binary search table computed))
1587    ubyte table_enc              (DW_EH_PE_* encoding of binary search table,
1588                                  or DW_EH_PE_omit if not present.
1589                                  DW_EH_PE_datarel is using address of
1590                                  .eh_frame_hdr section start as base)
1591    [encoded] eh_frame_ptr       (pointer to start of .eh_frame section)
1592    optionally followed by:
1593    [encoded] fde_count          (total number of FDEs in .eh_frame section)
1594    fde_count x [encoded] initial_loc, fde
1595                                 (array of encoded pairs containing
1596                                  FDE initial_location field and FDE address,
1597                                  sorted by increasing initial_loc).  */
1598
1599 bfd_boolean
1600 _bfd_elf_write_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
1601 {
1602   struct elf_link_hash_table *htab;
1603   struct eh_frame_hdr_info *hdr_info;
1604   asection *sec;
1605   bfd_byte *contents;
1606   asection *eh_frame_sec;
1607   bfd_size_type size;
1608   bfd_boolean retval;
1609   bfd_vma encoded_eh_frame;
1610
1611   htab = elf_hash_table (info);
1612   hdr_info = &htab->eh_info;
1613   sec = hdr_info->hdr_sec;
1614   if (sec == NULL)
1615     return TRUE;
1616
1617   size = EH_FRAME_HDR_SIZE;
1618   if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
1619     size += 4 + hdr_info->fde_count * 8;
1620   contents = bfd_malloc (size);
1621   if (contents == NULL)
1622     return FALSE;
1623
1624   eh_frame_sec = bfd_get_section_by_name (abfd, ".eh_frame");
1625   if (eh_frame_sec == NULL)
1626     {
1627       free (contents);
1628       return FALSE;
1629     }
1630
1631   memset (contents, 0, EH_FRAME_HDR_SIZE);
1632   contents[0] = 1;                              /* Version.  */
1633   contents[1] = get_elf_backend_data (abfd)->elf_backend_encode_eh_address
1634     (abfd, info, eh_frame_sec, 0, sec, 4,
1635      &encoded_eh_frame);                        /* .eh_frame offset.  */
1636
1637   if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
1638     {
1639       contents[2] = DW_EH_PE_udata4;            /* FDE count encoding.  */
1640       contents[3] = DW_EH_PE_datarel | DW_EH_PE_sdata4; /* Search table enc.  */
1641     }
1642   else
1643     {
1644       contents[2] = DW_EH_PE_omit;
1645       contents[3] = DW_EH_PE_omit;
1646     }
1647   bfd_put_32 (abfd, encoded_eh_frame, contents + 4);
1648
1649   if (contents[2] != DW_EH_PE_omit)
1650     {
1651       unsigned int i;
1652
1653       bfd_put_32 (abfd, hdr_info->fde_count, contents + EH_FRAME_HDR_SIZE);
1654       qsort (hdr_info->array, hdr_info->fde_count, sizeof (*hdr_info->array),
1655              vma_compare);
1656       for (i = 0; i < hdr_info->fde_count; i++)
1657         {
1658           bfd_put_32 (abfd,
1659                       hdr_info->array[i].initial_loc
1660                       - sec->output_section->vma,
1661                       contents + EH_FRAME_HDR_SIZE + i * 8 + 4);
1662           bfd_put_32 (abfd,
1663                       hdr_info->array[i].fde - sec->output_section->vma,
1664                       contents + EH_FRAME_HDR_SIZE + i * 8 + 8);
1665         }
1666     }
1667
1668   retval = bfd_set_section_contents (abfd, sec->output_section,
1669                                      contents, (file_ptr) sec->output_offset,
1670                                      sec->size);
1671   free (contents);
1672   return retval;
1673 }
1674
1675 /* Return the width of FDE addresses.  This is the default implementation.  */
1676
1677 unsigned int
1678 _bfd_elf_eh_frame_address_size (bfd *abfd, asection *sec ATTRIBUTE_UNUSED)
1679 {
1680   return elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64 ? 8 : 4;
1681 }
1682
1683 /* Decide whether we can use a PC-relative encoding within the given
1684    EH frame section.  This is the default implementation.  */
1685
1686 bfd_boolean
1687 _bfd_elf_can_make_relative (bfd *input_bfd ATTRIBUTE_UNUSED,
1688                             struct bfd_link_info *info ATTRIBUTE_UNUSED,
1689                             asection *eh_frame_section ATTRIBUTE_UNUSED)
1690 {
1691   return TRUE;
1692 }
1693
1694 /* Select an encoding for the given address.  Preference is given to
1695    PC-relative addressing modes.  */
1696
1697 bfd_byte
1698 _bfd_elf_encode_eh_address (bfd *abfd ATTRIBUTE_UNUSED,
1699                             struct bfd_link_info *info ATTRIBUTE_UNUSED,
1700                             asection *osec, bfd_vma offset,
1701                             asection *loc_sec, bfd_vma loc_offset,
1702                             bfd_vma *encoded)
1703 {
1704   *encoded = osec->vma + offset -
1705     (loc_sec->output_section->vma + loc_sec->output_offset + loc_offset);
1706   return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
1707 }