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 can_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->can_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->per_encoding_relative
821             = (cie->per_encoding & 0x70) == DW_EH_PE_pcrel;
822         }
823       else
824         {
825           asection *rsec;
826
827           /* Find the corresponding CIE.  */
828           unsigned int cie_offset = this_inf->offset + 4 - hdr_id;
829           for (ecie = ecies; ecie < ecies + ecie_count; ++ecie)
830             if (cie_offset == ecie->local_cie->offset)
831               break;
832
833           /* Ensure this FDE references one of the CIEs in this input
834              section.  */
835           REQUIRE (ecie != ecies + ecie_count);
836           cie = ecie->cie;
837           this_inf->u.fde.cie_inf = ecie->local_cie;
838
839           ENSURE_NO_RELOCS (buf);
840           REQUIRE (GET_RELOC (buf));
841
842           /* Chain together the FDEs for each section.  */
843           rsec = _bfd_elf_gc_mark_rsec (info, sec, gc_mark_hook, cookie);
844           REQUIRE (rsec && rsec->owner == abfd);
845           this_inf->u.fde.next_for_section = elf_fde_list (rsec);
846           elf_fde_list (rsec) = this_inf;
847
848           /* Skip the initial location and address range.  */
849           start = buf;
850           length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
851           REQUIRE (skip_bytes (&buf, end, 2 * length));
852
853           /* Skip the augmentation size, if present.  */
854           if (cie->augmentation[0] == 'z')
855             REQUIRE (read_uleb128 (&buf, end, &length));
856           else
857             length = 0;
858
859           /* Of the supported augmentation characters above, only 'L'
860              adds augmentation data to the FDE.  This code would need to
861              be adjusted if any future augmentations do the same thing.  */
862           if (cie->lsda_encoding != DW_EH_PE_omit)
863             {
864               SKIP_RELOCS (buf);
865               if (cie->can_make_lsda_relative && GET_RELOC (buf))
866                 cie->cie_inf->u.cie.make_lsda_relative = 1;
867               this_inf->lsda_offset = buf - start;
868               /* If there's no 'z' augmentation, we don't know where the
869                  CFA insns begin.  Assume no padding.  */
870               if (cie->augmentation[0] != 'z')
871                 length = end - buf;
872             }
873
874           /* Skip over the augmentation data.  */
875           REQUIRE (skip_bytes (&buf, end, length));
876           insns = buf;
877
878           buf = last_fde + 4 + hdr_length;
879           SKIP_RELOCS (buf);
880         }
881
882       /* Try to interpret the CFA instructions and find the first
883          padding nop.  Shrink this_inf's size so that it doesn't
884          include the padding.  */
885       length = get_DW_EH_PE_width (cie->fde_encoding, ptr_size);
886       set_loc_count = 0;
887       insns_end = skip_non_nops (insns, end, length, &set_loc_count);
888       /* If we don't understand the CFA instructions, we can't know
889          what needs to be adjusted there.  */
890       if (insns_end == NULL
891           /* For the time being we don't support DW_CFA_set_loc in
892              CIE instructions.  */
893           || (set_loc_count && this_inf->cie))
894         goto free_no_table;
895       this_inf->size -= end - insns_end;
896       if (insns_end != end && this_inf->cie)
897         {
898           cie->initial_insn_length -= end - insns_end;
899           cie->length -= end - insns_end;
900         }
901       if (set_loc_count
902           && ((cie->fde_encoding & 0xf0) == DW_EH_PE_pcrel
903               || cie->make_relative))
904         {
905           unsigned int cnt;
906           bfd_byte *p;
907
908           this_inf->set_loc = bfd_malloc ((set_loc_count + 1)
909                                           * sizeof (unsigned int));
910           REQUIRE (this_inf->set_loc);
911           this_inf->set_loc[0] = set_loc_count;
912           p = insns;
913           cnt = 0;
914           while (p < end)
915             {
916               if (*p == DW_CFA_set_loc)
917                 this_inf->set_loc[++cnt] = p + 1 - start;
918               REQUIRE (skip_cfa_op (&p, end, length));
919             }
920         }
921
922       this_inf->removed = 1;
923       this_inf->fde_encoding = cie->fde_encoding;
924       this_inf->lsda_encoding = cie->lsda_encoding;
925       if (this_inf->cie)
926         {
927           /* We have now finished constructing the struct cie.  */
928           if (hdr_info->cies != NULL)
929             {
930               /* See if we can merge this CIE with an earlier one.  */
931               void **loc;
932
933               cie_compute_hash (cie);
934               loc = htab_find_slot_with_hash (hdr_info->cies, cie,
935                                               cie->hash, INSERT);
936               REQUIRE (loc);
937               if (*loc == HTAB_EMPTY_ENTRY)
938                 {
939                   *loc = malloc (sizeof (struct cie));
940                   REQUIRE (*loc);
941                   memcpy (*loc, cie, sizeof (struct cie));
942                 }
943               cie = (struct cie *) *loc;
944             }
945           this_inf->u.cie.merged = cie->cie_inf;
946           ecies[ecie_count].cie = cie;
947           ecies[ecie_count++].local_cie = this_inf;
948         }
949       sec_info->count++;
950     }
951   BFD_ASSERT (sec_info->count == num_entries);
952   BFD_ASSERT (ecie_count == num_cies);
953
954   elf_section_data (sec)->sec_info = sec_info;
955   sec->sec_info_type = ELF_INFO_TYPE_EH_FRAME;
956   goto success;
957
958  free_no_table:
959   (*info->callbacks->einfo)
960     (_("%P: error in %B(%A); no .eh_frame_hdr table will be created.\n"),
961      abfd, sec);
962   hdr_info->table = FALSE;
963   if (sec_info)
964     free (sec_info);
965  success:
966   if (ehbuf)
967     free (ehbuf);
968   if (ecies)
969     free (ecies);
970   if (local_cies)
971     free (local_cies);
972 #undef REQUIRE
973 }
974
975 /* Finish a pass over all .eh_frame sections.  */
976
977 void
978 _bfd_elf_end_eh_frame_parsing (struct bfd_link_info *info)
979 {
980   struct eh_frame_hdr_info *hdr_info;
981
982   hdr_info = &elf_hash_table (info)->eh_info;
983   if (hdr_info->cies != NULL)
984     {
985       htab_delete (hdr_info->cies);
986       hdr_info->cies = NULL;
987     }
988   hdr_info->parsed_eh_frames = TRUE;
989 }
990
991 /* Mark all relocations against CIE or FDE ENT, which occurs in
992    .eh_frame section SEC.  COOKIE describes the relocations in SEC;
993    its "rel" field can be changed freely.  */
994
995 static bfd_boolean
996 mark_entry (struct bfd_link_info *info, asection *sec,
997             struct eh_cie_fde *ent, elf_gc_mark_hook_fn gc_mark_hook,
998             struct elf_reloc_cookie *cookie)
999 {
1000   for (cookie->rel = cookie->rels + ent->reloc_index;
1001        cookie->rel < cookie->relend
1002          && cookie->rel->r_offset < ent->offset + ent->size;
1003        cookie->rel++)
1004     if (!_bfd_elf_gc_mark_reloc (info, sec, gc_mark_hook, cookie))
1005       return FALSE;
1006
1007   return TRUE;
1008 }
1009
1010 /* Mark all the relocations against FDEs that relate to code in input
1011    section SEC.  The FDEs belong to .eh_frame section EH_FRAME, whose
1012    relocations are described by COOKIE.  */
1013
1014 bfd_boolean
1015 _bfd_elf_gc_mark_fdes (struct bfd_link_info *info, asection *sec,
1016                        asection *eh_frame, elf_gc_mark_hook_fn gc_mark_hook,
1017                        struct elf_reloc_cookie *cookie)
1018 {
1019   struct eh_cie_fde *fde, *cie, *merged;
1020
1021   for (fde = elf_fde_list (sec); fde; fde = fde->u.fde.next_for_section)
1022     {
1023       if (!mark_entry (info, eh_frame, fde, gc_mark_hook, cookie))
1024         return FALSE;
1025
1026       /* At this stage, all cie_inf fields point to local CIEs, so we
1027          can use the same cookie to refer to them.  */
1028       cie = fde->u.fde.cie_inf;
1029       merged = cie->u.cie.merged;
1030       if (!merged->u.cie.gc_mark)
1031         {
1032           merged->u.cie.gc_mark = 1;
1033           if (!mark_entry (info, eh_frame, cie, gc_mark_hook, cookie))
1034             return FALSE;
1035         }
1036     }
1037   return TRUE;
1038 }
1039
1040 /* This function is called for each input file before the .eh_frame
1041    section is relocated.  It discards duplicate CIEs and FDEs for discarded
1042    functions.  The function returns TRUE iff any entries have been
1043    deleted.  */
1044
1045 bfd_boolean
1046 _bfd_elf_discard_section_eh_frame
1047    (bfd *abfd, struct bfd_link_info *info, asection *sec,
1048     bfd_boolean (*reloc_symbol_deleted_p) (bfd_vma, void *),
1049     struct elf_reloc_cookie *cookie)
1050 {
1051   struct eh_cie_fde *ent, *cie, *merged;
1052   struct eh_frame_sec_info *sec_info;
1053   struct eh_frame_hdr_info *hdr_info;
1054   unsigned int ptr_size, offset;
1055
1056   sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
1057   if (sec_info == NULL)
1058     return FALSE;
1059
1060   hdr_info = &elf_hash_table (info)->eh_info;
1061   for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1062     if (!ent->cie)
1063       {
1064         cookie->rel = cookie->rels + ent->reloc_index;
1065         BFD_ASSERT (cookie->rel < cookie->relend
1066                     && cookie->rel->r_offset == ent->offset + 8);
1067         if (!(*reloc_symbol_deleted_p) (ent->offset + 8, cookie))
1068           {
1069             if (info->shared
1070                 && (((ent->fde_encoding & 0xf0) == DW_EH_PE_absptr
1071                      && ent->u.fde.cie_inf->make_relative == 0)
1072                     || (ent->fde_encoding & 0xf0) == DW_EH_PE_aligned))
1073               {
1074                 /* If a shared library uses absolute pointers
1075                    which we cannot turn into PC relative,
1076                    don't create the binary search table,
1077                    since it is affected by runtime relocations.  */
1078                 hdr_info->table = FALSE;
1079                 (*info->callbacks->einfo)
1080                   (_("%P: fde encoding in %B(%A) prevents .eh_frame_hdr"
1081                      " table being created.\n"), abfd, sec);
1082               }
1083             ent->removed = 0;
1084             hdr_info->fde_count++;
1085
1086             cie = ent->u.fde.cie_inf;
1087             if (cie->removed)
1088               {
1089                 merged = cie->u.cie.merged;
1090                 if (!merged->removed)
1091                   /* We have decided to keep the group representative.  */
1092                   ent->u.fde.cie_inf = merged;
1093                 else if (merged->u.cie.merged != merged)
1094                   /* We didn't keep the original group representative,
1095                      but we did keep an alternative.  */
1096                   ent->u.fde.cie_inf = merged->u.cie.merged;
1097                 else
1098                   {
1099                     /* Make the local CIE represent the merged group.  */
1100                     merged->u.cie.merged = cie;
1101                     cie->removed = 0;
1102                     cie->u.cie.make_lsda_relative
1103                       = merged->u.cie.make_lsda_relative;
1104                   }
1105               }
1106           }
1107       }
1108
1109   ptr_size = (get_elf_backend_data (sec->owner)
1110               ->elf_backend_eh_frame_address_size (sec->owner, sec));
1111   offset = 0;
1112   for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1113     if (!ent->removed)
1114       {
1115         ent->new_offset = offset;
1116         offset += size_of_output_cie_fde (ent, ptr_size);
1117       }
1118
1119   sec->rawsize = sec->size;
1120   sec->size = offset;
1121   return offset != sec->rawsize;
1122 }
1123
1124 /* This function is called for .eh_frame_hdr section after
1125    _bfd_elf_discard_section_eh_frame has been called on all .eh_frame
1126    input sections.  It finalizes the size of .eh_frame_hdr section.  */
1127
1128 bfd_boolean
1129 _bfd_elf_discard_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
1130 {
1131   struct elf_link_hash_table *htab;
1132   struct eh_frame_hdr_info *hdr_info;
1133   asection *sec;
1134
1135   htab = elf_hash_table (info);
1136   hdr_info = &htab->eh_info;
1137
1138   sec = hdr_info->hdr_sec;
1139   if (sec == NULL)
1140     return FALSE;
1141
1142   sec->size = EH_FRAME_HDR_SIZE;
1143   if (hdr_info->table)
1144     sec->size += 4 + hdr_info->fde_count * 8;
1145
1146   elf_tdata (abfd)->eh_frame_hdr = sec;
1147   return TRUE;
1148 }
1149
1150 /* This function is called from size_dynamic_sections.
1151    It needs to decide whether .eh_frame_hdr should be output or not,
1152    because when the dynamic symbol table has been sized it is too late
1153    to strip sections.  */
1154
1155 bfd_boolean
1156 _bfd_elf_maybe_strip_eh_frame_hdr (struct bfd_link_info *info)
1157 {
1158   asection *o;
1159   bfd *abfd;
1160   struct elf_link_hash_table *htab;
1161   struct eh_frame_hdr_info *hdr_info;
1162
1163   htab = elf_hash_table (info);
1164   hdr_info = &htab->eh_info;
1165   if (hdr_info->hdr_sec == NULL)
1166     return TRUE;
1167
1168   if (bfd_is_abs_section (hdr_info->hdr_sec->output_section))
1169     {
1170       hdr_info->hdr_sec = NULL;
1171       return TRUE;
1172     }
1173
1174   abfd = NULL;
1175   if (info->eh_frame_hdr)
1176     for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link_next)
1177       {
1178         /* Count only sections which have at least a single CIE or FDE.
1179            There cannot be any CIE or FDE <= 8 bytes.  */
1180         o = bfd_get_section_by_name (abfd, ".eh_frame");
1181         if (o && o->size > 8 && !bfd_is_abs_section (o->output_section))
1182           break;
1183       }
1184
1185   if (abfd == NULL)
1186     {
1187       hdr_info->hdr_sec->flags |= SEC_EXCLUDE;
1188       hdr_info->hdr_sec = NULL;
1189       return TRUE;
1190     }
1191
1192   hdr_info->table = TRUE;
1193   return TRUE;
1194 }
1195
1196 /* Adjust an address in the .eh_frame section.  Given OFFSET within
1197    SEC, this returns the new offset in the adjusted .eh_frame section,
1198    or -1 if the address refers to a CIE/FDE which has been removed
1199    or to offset with dynamic relocation which is no longer needed.  */
1200
1201 bfd_vma
1202 _bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED,
1203                                   struct bfd_link_info *info,
1204                                   asection *sec,
1205                                   bfd_vma offset)
1206 {
1207   struct eh_frame_sec_info *sec_info;
1208   struct elf_link_hash_table *htab;
1209   struct eh_frame_hdr_info *hdr_info;
1210   unsigned int lo, hi, mid;
1211
1212   if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
1213     return offset;
1214   sec_info = elf_section_data (sec)->sec_info;
1215
1216   if (offset >= sec->rawsize)
1217     return offset - sec->rawsize + sec->size;
1218
1219   htab = elf_hash_table (info);
1220   hdr_info = &htab->eh_info;
1221   if (hdr_info->offsets_adjusted)
1222     offset += sec->output_offset;
1223
1224   lo = 0;
1225   hi = sec_info->count;
1226   mid = 0;
1227   while (lo < hi)
1228     {
1229       mid = (lo + hi) / 2;
1230       if (offset < sec_info->entry[mid].offset)
1231         hi = mid;
1232       else if (offset
1233                >= sec_info->entry[mid].offset + sec_info->entry[mid].size)
1234         lo = mid + 1;
1235       else
1236         break;
1237     }
1238
1239   BFD_ASSERT (lo < hi);
1240
1241   /* FDE or CIE was removed.  */
1242   if (sec_info->entry[mid].removed)
1243     return (bfd_vma) -1;
1244
1245   /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
1246      relocation against FDE's initial_location field.  */
1247   if (!sec_info->entry[mid].cie
1248       && sec_info->entry[mid].u.fde.cie_inf->make_relative
1249       && offset == sec_info->entry[mid].offset + 8)
1250     return (bfd_vma) -2;
1251
1252   /* If converting LSDA pointers to DW_EH_PE_pcrel, there will be no need
1253      for run-time relocation against LSDA field.  */
1254   if (!sec_info->entry[mid].cie
1255       && sec_info->entry[mid].u.fde.cie_inf->u.cie.make_lsda_relative
1256       && offset == (sec_info->entry[mid].offset + 8
1257                     + sec_info->entry[mid].lsda_offset))
1258     return (bfd_vma) -2;
1259
1260   /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
1261      relocation against DW_CFA_set_loc's arguments.  */
1262   if (sec_info->entry[mid].set_loc
1263       && (sec_info->entry[mid].cie
1264           ? sec_info->entry[mid].make_relative
1265           : sec_info->entry[mid].u.fde.cie_inf->make_relative)
1266       && (offset >= sec_info->entry[mid].offset + 8
1267                     + sec_info->entry[mid].set_loc[1]))
1268     {
1269       unsigned int cnt;
1270
1271       for (cnt = 1; cnt <= sec_info->entry[mid].set_loc[0]; cnt++)
1272         if (offset == sec_info->entry[mid].offset + 8
1273                       + sec_info->entry[mid].set_loc[cnt])
1274           return (bfd_vma) -2;
1275     }
1276
1277   if (hdr_info->offsets_adjusted)
1278     offset -= sec->output_offset;
1279   /* Any new augmentation bytes go before the first relocation.  */
1280   return (offset + sec_info->entry[mid].new_offset
1281           - sec_info->entry[mid].offset
1282           + extra_augmentation_string_bytes (sec_info->entry + mid)
1283           + extra_augmentation_data_bytes (sec_info->entry + mid));
1284 }
1285
1286 /* Write out .eh_frame section.  This is called with the relocated
1287    contents.  */
1288
1289 bfd_boolean
1290 _bfd_elf_write_section_eh_frame (bfd *abfd,
1291                                  struct bfd_link_info *info,
1292                                  asection *sec,
1293                                  bfd_byte *contents)
1294 {
1295   struct eh_frame_sec_info *sec_info;
1296   struct elf_link_hash_table *htab;
1297   struct eh_frame_hdr_info *hdr_info;
1298   unsigned int ptr_size;
1299   struct eh_cie_fde *ent;
1300
1301   if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
1302     return bfd_set_section_contents (abfd, sec->output_section, contents,
1303                                      sec->output_offset, sec->size);
1304
1305   ptr_size = (get_elf_backend_data (abfd)
1306               ->elf_backend_eh_frame_address_size (abfd, sec));
1307   BFD_ASSERT (ptr_size != 0);
1308
1309   sec_info = elf_section_data (sec)->sec_info;
1310   htab = elf_hash_table (info);
1311   hdr_info = &htab->eh_info;
1312
1313   /* First convert all offsets to output section offsets, so that a
1314      CIE offset is valid if the CIE is used by a FDE from some other
1315      section.  This can happen when duplicate CIEs are deleted in
1316      _bfd_elf_discard_section_eh_frame.  We do all sections here because
1317      this function might not be called on sections in the same order as
1318      _bfd_elf_discard_section_eh_frame.  */
1319   if (!hdr_info->offsets_adjusted)
1320     {
1321       bfd *ibfd;
1322       asection *eh;
1323       struct eh_frame_sec_info *eh_inf;
1324
1325       for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1326         {
1327           if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1328               || (ibfd->flags & DYNAMIC) != 0)
1329             continue;
1330
1331           eh = bfd_get_section_by_name (ibfd, ".eh_frame");
1332           if (eh == NULL || eh->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
1333             continue;
1334
1335           eh_inf = elf_section_data (eh)->sec_info;
1336           for (ent = eh_inf->entry; ent < eh_inf->entry + eh_inf->count; ++ent)
1337             {
1338               ent->offset += eh->output_offset;
1339               ent->new_offset += eh->output_offset;
1340             }
1341         }
1342       hdr_info->offsets_adjusted = TRUE;
1343     }
1344
1345   if (hdr_info->table && hdr_info->array == NULL)
1346     hdr_info->array
1347       = bfd_malloc (hdr_info->fde_count * sizeof(*hdr_info->array));
1348   if (hdr_info->array == NULL)
1349     hdr_info = NULL;
1350
1351   /* The new offsets can be bigger or smaller than the original offsets.
1352      We therefore need to make two passes over the section: one backward
1353      pass to move entries up and one forward pass to move entries down.
1354      The two passes won't interfere with each other because entries are
1355      not reordered  */
1356   for (ent = sec_info->entry + sec_info->count; ent-- != sec_info->entry;)
1357     if (!ent->removed && ent->new_offset > ent->offset)
1358       memmove (contents + ent->new_offset - sec->output_offset,
1359                contents + ent->offset - sec->output_offset, ent->size);
1360
1361   for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1362     if (!ent->removed && ent->new_offset < ent->offset)
1363       memmove (contents + ent->new_offset - sec->output_offset,
1364                contents + ent->offset - sec->output_offset, ent->size);
1365
1366   for (ent = sec_info->entry; ent < sec_info->entry + sec_info->count; ++ent)
1367     {
1368       unsigned char *buf, *end;
1369       unsigned int new_size;
1370
1371       if (ent->removed)
1372         continue;
1373
1374       if (ent->size == 4)
1375         {
1376           /* Any terminating FDE must be at the end of the section.  */
1377           BFD_ASSERT (ent == sec_info->entry + sec_info->count - 1);
1378           continue;
1379         }
1380
1381       buf = contents + ent->new_offset - sec->output_offset;
1382       end = buf + ent->size;
1383       new_size = size_of_output_cie_fde (ent, ptr_size);
1384
1385       /* Update the size.  It may be shrinked.  */
1386       bfd_put_32 (abfd, new_size - 4, buf);
1387
1388       /* Filling the extra bytes with DW_CFA_nops.  */
1389       if (new_size != ent->size)
1390         memset (end, 0, new_size - ent->size);
1391
1392       if (ent->cie)
1393         {
1394           /* CIE */
1395           if (ent->make_relative
1396               || ent->u.cie.make_lsda_relative
1397               || ent->per_encoding_relative)
1398             {
1399               char *aug;
1400               unsigned int action, extra_string, extra_data;
1401               unsigned int per_width, per_encoding;
1402
1403               /* Need to find 'R' or 'L' augmentation's argument and modify
1404                  DW_EH_PE_* value.  */
1405               action = ((ent->make_relative ? 1 : 0)
1406                         | (ent->u.cie.make_lsda_relative ? 2 : 0)
1407                         | (ent->per_encoding_relative ? 4 : 0));
1408               extra_string = extra_augmentation_string_bytes (ent);
1409               extra_data = extra_augmentation_data_bytes (ent);
1410
1411               /* Skip length, id and version.  */
1412               buf += 9;
1413               aug = (char *) buf;
1414               buf += strlen (aug) + 1;
1415               skip_leb128 (&buf, end);
1416               skip_leb128 (&buf, end);
1417               skip_leb128 (&buf, end);
1418               if (*aug == 'z')
1419                 {
1420                   /* The uleb128 will always be a single byte for the kind
1421                      of augmentation strings that we're prepared to handle.  */
1422                   *buf++ += extra_data;
1423                   aug++;
1424                 }
1425
1426               /* Make room for the new augmentation string and data bytes.  */
1427               memmove (buf + extra_string + extra_data, buf, end - buf);
1428               memmove (aug + extra_string, aug, buf - (bfd_byte *) aug);
1429               buf += extra_string;
1430               end += extra_string + extra_data;
1431
1432               if (ent->add_augmentation_size)
1433                 {
1434                   *aug++ = 'z';
1435                   *buf++ = extra_data - 1;
1436                 }
1437               if (ent->add_fde_encoding)
1438                 {
1439                   BFD_ASSERT (action & 1);
1440                   *aug++ = 'R';
1441                   *buf++ = DW_EH_PE_pcrel;
1442                   action &= ~1;
1443                 }
1444
1445               while (action)
1446                 switch (*aug++)
1447                   {
1448                   case 'L':
1449                     if (action & 2)
1450                       {
1451                         BFD_ASSERT (*buf == ent->lsda_encoding);
1452                         *buf |= DW_EH_PE_pcrel;
1453                         action &= ~2;
1454                       }
1455                     buf++;
1456                     break;
1457                   case 'P':
1458                     per_encoding = *buf++;
1459                     per_width = get_DW_EH_PE_width (per_encoding, ptr_size);
1460                     BFD_ASSERT (per_width != 0);
1461                     BFD_ASSERT (((per_encoding & 0x70) == DW_EH_PE_pcrel)
1462                                 == ent->per_encoding_relative);
1463                     if ((per_encoding & 0xf0) == DW_EH_PE_aligned)
1464                       buf = (contents
1465                              + ((buf - contents + per_width - 1)
1466                                 & ~((bfd_size_type) per_width - 1)));
1467                     if (action & 4)
1468                       {
1469                         bfd_vma val;
1470
1471                         val = read_value (abfd, buf, per_width,
1472                                           get_DW_EH_PE_signed (per_encoding));
1473                         val += ent->offset - ent->new_offset;
1474                         val -= extra_string + extra_data;
1475                         write_value (abfd, buf, val, per_width);
1476                         action &= ~4;
1477                       }
1478                     buf += per_width;
1479                     break;
1480                   case 'R':
1481                     if (action & 1)
1482                       {
1483                         BFD_ASSERT (*buf == ent->fde_encoding);
1484                         *buf |= DW_EH_PE_pcrel;
1485                         action &= ~1;
1486                       }
1487                     buf++;
1488                     break;
1489                   case 'S':
1490                     break;
1491                   default:
1492                     BFD_FAIL ();
1493                   }
1494             }
1495         }
1496       else
1497         {
1498           /* FDE */
1499           bfd_vma value, address;
1500           unsigned int width;
1501           bfd_byte *start;
1502           struct eh_cie_fde *cie;
1503
1504           /* Skip length.  */
1505           cie = ent->u.fde.cie_inf;
1506           buf += 4;
1507           value = ent->new_offset + 4 - cie->new_offset;
1508           bfd_put_32 (abfd, value, buf);
1509           buf += 4;
1510           width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1511           value = read_value (abfd, buf, width,
1512                               get_DW_EH_PE_signed (ent->fde_encoding));
1513           address = value;
1514           if (value)
1515             {
1516               switch (ent->fde_encoding & 0xf0)
1517                 {
1518                 case DW_EH_PE_indirect:
1519                 case DW_EH_PE_textrel:
1520                   BFD_ASSERT (hdr_info == NULL);
1521                   break;
1522                 case DW_EH_PE_datarel:
1523                   {
1524                     asection *got = bfd_get_section_by_name (abfd, ".got");
1525
1526                     BFD_ASSERT (got != NULL);
1527                     address += got->vma;
1528                   }
1529                   break;
1530                 case DW_EH_PE_pcrel:
1531                   value += ent->offset - ent->new_offset;
1532                   address += sec->output_section->vma + ent->offset + 8;
1533                   break;
1534                 }
1535               if (cie->make_relative)
1536                 value -= sec->output_section->vma + ent->new_offset + 8;
1537               write_value (abfd, buf, value, width);
1538             }
1539
1540           start = buf;
1541
1542           if (hdr_info)
1543             {
1544               hdr_info->array[hdr_info->array_count].initial_loc = address;
1545               hdr_info->array[hdr_info->array_count++].fde
1546                 = sec->output_section->vma + ent->new_offset;
1547             }
1548
1549           if ((ent->lsda_encoding & 0xf0) == DW_EH_PE_pcrel
1550               || cie->u.cie.make_lsda_relative)
1551             {
1552               buf += ent->lsda_offset;
1553               width = get_DW_EH_PE_width (ent->lsda_encoding, ptr_size);
1554               value = read_value (abfd, buf, width,
1555                                   get_DW_EH_PE_signed (ent->lsda_encoding));
1556               if (value)
1557                 {
1558                   if ((ent->lsda_encoding & 0xf0) == DW_EH_PE_pcrel)
1559                     value += ent->offset - ent->new_offset;
1560                   else if (cie->u.cie.make_lsda_relative)
1561                     value -= (sec->output_section->vma + ent->new_offset + 8
1562                               + ent->lsda_offset);
1563                   write_value (abfd, buf, value, width);
1564                 }
1565             }
1566           else if (cie->add_augmentation_size)
1567             {
1568               /* Skip the PC and length and insert a zero byte for the
1569                  augmentation size.  */
1570               buf += width * 2;
1571               memmove (buf + 1, buf, end - buf);
1572               *buf = 0;
1573             }
1574
1575           if (ent->set_loc)
1576             {
1577               /* Adjust DW_CFA_set_loc.  */
1578               unsigned int cnt, width;
1579               bfd_vma new_offset;
1580
1581               width = get_DW_EH_PE_width (ent->fde_encoding, ptr_size);
1582               new_offset = ent->new_offset + 8
1583                            + extra_augmentation_string_bytes (ent)
1584                            + extra_augmentation_data_bytes (ent);
1585
1586               for (cnt = 1; cnt <= ent->set_loc[0]; cnt++)
1587                 {
1588                   bfd_vma value;
1589                   buf = start + ent->set_loc[cnt];
1590
1591                   value = read_value (abfd, buf, width,
1592                                       get_DW_EH_PE_signed (ent->fde_encoding));
1593                   if (!value)
1594                     continue;
1595
1596                   if ((ent->fde_encoding & 0xf0) == DW_EH_PE_pcrel)
1597                     value += ent->offset + 8 - new_offset;
1598                   if (cie->make_relative)
1599                     value -= sec->output_section->vma + new_offset
1600                              + ent->set_loc[cnt];
1601                   write_value (abfd, buf, value, width);
1602                 }
1603             }
1604         }
1605     }
1606
1607   /* We don't align the section to its section alignment since the
1608      runtime library only expects all CIE/FDE records aligned at
1609      the pointer size. _bfd_elf_discard_section_eh_frame should
1610      have padded CIE/FDE records to multiple of pointer size with
1611      size_of_output_cie_fde.  */
1612   if ((sec->size % ptr_size) != 0)
1613     abort ();
1614
1615   return bfd_set_section_contents (abfd, sec->output_section,
1616                                    contents, (file_ptr) sec->output_offset,
1617                                    sec->size);
1618 }
1619
1620 /* Helper function used to sort .eh_frame_hdr search table by increasing
1621    VMA of FDE initial location.  */
1622
1623 static int
1624 vma_compare (const void *a, const void *b)
1625 {
1626   const struct eh_frame_array_ent *p = a;
1627   const struct eh_frame_array_ent *q = b;
1628   if (p->initial_loc > q->initial_loc)
1629     return 1;
1630   if (p->initial_loc < q->initial_loc)
1631     return -1;
1632   return 0;
1633 }
1634
1635 /* Write out .eh_frame_hdr section.  This must be called after
1636    _bfd_elf_write_section_eh_frame has been called on all input
1637    .eh_frame sections.
1638    .eh_frame_hdr format:
1639    ubyte version                (currently 1)
1640    ubyte eh_frame_ptr_enc       (DW_EH_PE_* encoding of pointer to start of
1641                                  .eh_frame section)
1642    ubyte fde_count_enc          (DW_EH_PE_* encoding of total FDE count
1643                                  number (or DW_EH_PE_omit if there is no
1644                                  binary search table computed))
1645    ubyte table_enc              (DW_EH_PE_* encoding of binary search table,
1646                                  or DW_EH_PE_omit if not present.
1647                                  DW_EH_PE_datarel is using address of
1648                                  .eh_frame_hdr section start as base)
1649    [encoded] eh_frame_ptr       (pointer to start of .eh_frame section)
1650    optionally followed by:
1651    [encoded] fde_count          (total number of FDEs in .eh_frame section)
1652    fde_count x [encoded] initial_loc, fde
1653                                 (array of encoded pairs containing
1654                                  FDE initial_location field and FDE address,
1655                                  sorted by increasing initial_loc).  */
1656
1657 bfd_boolean
1658 _bfd_elf_write_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
1659 {
1660   struct elf_link_hash_table *htab;
1661   struct eh_frame_hdr_info *hdr_info;
1662   asection *sec;
1663   bfd_byte *contents;
1664   asection *eh_frame_sec;
1665   bfd_size_type size;
1666   bfd_boolean retval;
1667   bfd_vma encoded_eh_frame;
1668
1669   htab = elf_hash_table (info);
1670   hdr_info = &htab->eh_info;
1671   sec = hdr_info->hdr_sec;
1672   if (sec == NULL)
1673     return TRUE;
1674
1675   size = EH_FRAME_HDR_SIZE;
1676   if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
1677     size += 4 + hdr_info->fde_count * 8;
1678   contents = bfd_malloc (size);
1679   if (contents == NULL)
1680     return FALSE;
1681
1682   eh_frame_sec = bfd_get_section_by_name (abfd, ".eh_frame");
1683   if (eh_frame_sec == NULL)
1684     {
1685       free (contents);
1686       return FALSE;
1687     }
1688
1689   memset (contents, 0, EH_FRAME_HDR_SIZE);
1690   contents[0] = 1;                              /* Version.  */
1691   contents[1] = get_elf_backend_data (abfd)->elf_backend_encode_eh_address
1692     (abfd, info, eh_frame_sec, 0, sec, 4,
1693      &encoded_eh_frame);                        /* .eh_frame offset.  */
1694
1695   if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
1696     {
1697       contents[2] = DW_EH_PE_udata4;            /* FDE count encoding.  */
1698       contents[3] = DW_EH_PE_datarel | DW_EH_PE_sdata4; /* Search table enc.  */
1699     }
1700   else
1701     {
1702       contents[2] = DW_EH_PE_omit;
1703       contents[3] = DW_EH_PE_omit;
1704     }
1705   bfd_put_32 (abfd, encoded_eh_frame, contents + 4);
1706
1707   if (contents[2] != DW_EH_PE_omit)
1708     {
1709       unsigned int i;
1710
1711       bfd_put_32 (abfd, hdr_info->fde_count, contents + EH_FRAME_HDR_SIZE);
1712       qsort (hdr_info->array, hdr_info->fde_count, sizeof (*hdr_info->array),
1713              vma_compare);
1714       for (i = 0; i < hdr_info->fde_count; i++)
1715         {
1716           bfd_put_32 (abfd,
1717                       hdr_info->array[i].initial_loc
1718                       - sec->output_section->vma,
1719                       contents + EH_FRAME_HDR_SIZE + i * 8 + 4);
1720           bfd_put_32 (abfd,
1721                       hdr_info->array[i].fde - sec->output_section->vma,
1722                       contents + EH_FRAME_HDR_SIZE + i * 8 + 8);
1723         }
1724     }
1725
1726   retval = bfd_set_section_contents (abfd, sec->output_section,
1727                                      contents, (file_ptr) sec->output_offset,
1728                                      sec->size);
1729   free (contents);
1730   return retval;
1731 }
1732
1733 /* Return the width of FDE addresses.  This is the default implementation.  */
1734
1735 unsigned int
1736 _bfd_elf_eh_frame_address_size (bfd *abfd, asection *sec ATTRIBUTE_UNUSED)
1737 {
1738   return elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64 ? 8 : 4;
1739 }
1740
1741 /* Decide whether we can use a PC-relative encoding within the given
1742    EH frame section.  This is the default implementation.  */
1743
1744 bfd_boolean
1745 _bfd_elf_can_make_relative (bfd *input_bfd ATTRIBUTE_UNUSED,
1746                             struct bfd_link_info *info ATTRIBUTE_UNUSED,
1747                             asection *eh_frame_section ATTRIBUTE_UNUSED)
1748 {
1749   return TRUE;
1750 }
1751
1752 /* Select an encoding for the given address.  Preference is given to
1753    PC-relative addressing modes.  */
1754
1755 bfd_byte
1756 _bfd_elf_encode_eh_address (bfd *abfd ATTRIBUTE_UNUSED,
1757                             struct bfd_link_info *info ATTRIBUTE_UNUSED,
1758                             asection *osec, bfd_vma offset,
1759                             asection *loc_sec, bfd_vma loc_offset,
1760                             bfd_vma *encoded)
1761 {
1762   *encoded = osec->vma + offset -
1763     (loc_sec->output_section->vma + loc_sec->output_offset + loc_offset);
1764   return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
1765 }