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