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