[BACK]Return to elf-eh-frame.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / external / gpl3 / binutils.old / dist / bfd

Annotation of src/external/gpl3/binutils.old/dist/bfd/elf-eh-frame.c, Revision 1.7

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

CVSweb <webmaster@jp.NetBSD.org>