/* .eh_frame section optimization.
- Copyright (C) 2001-2017 Free Software Foundation, Inc.
+ Copyright (C) 2001-2020 Free Software Foundation, Inc.
Written by Jakub Jelinek <jakub@redhat.com>.
This file is part of BFD, the Binary File Descriptor library.
hdr_info->array_count--;
hdr_info->u.compact.entries[hdr_info->array_count] = NULL;
i--;
- }
+ }
}
}
sec_info = (struct eh_frame_sec_info *)
bfd_zmalloc (sizeof (struct eh_frame_sec_info)
- + (num_entries - 1) * sizeof (struct eh_cie_fde));
+ + (num_entries - 1) * sizeof (struct eh_cie_fde));
REQUIRE (sec_info);
/* We need to have a "struct cie" for each CIE in this section. */
{
aug++;
REQUIRE (read_uleb128 (&buf, end, &cie->augmentation_size));
- ENSURE_NO_RELOCS (buf);
+ ENSURE_NO_RELOCS (buf);
}
while (*aug != '\0')
switch (*aug++)
{
+ case 'B':
+ break;
case 'L':
REQUIRE (read_byte (&buf, end, &cie->lsda_encoding));
ENSURE_NO_RELOCS (buf);
{
(*info->callbacks->minfo)
/* xgettext:c-format */
- (_("discarding zero address range FDE in %B(%A).\n"),
+ (_("discarding zero address range FDE in %pB(%pA).\n"),
abfd, sec);
this_inf->u.fde.cie_inf = NULL;
}
bfd_byte *p;
this_inf->set_loc = (unsigned int *)
- bfd_malloc ((set_loc_count + 1) * sizeof (unsigned int));
+ bfd_malloc ((set_loc_count + 1) * sizeof (unsigned int));
REQUIRE (this_inf->set_loc);
this_inf->set_loc[0] = set_loc_count;
p = insns;
goto success;
free_no_table:
- (*info->callbacks->einfo)
+ _bfd_error_handler
/* xgettext:c-format */
- (_("%P: error in %B(%A); no .eh_frame_hdr table will be created.\n"),
+ (_("error in %pB(%pA); no .eh_frame_hdr table will be created"),
abfd, sec);
hdr_info->u.dwarf.table = FALSE;
- if (sec_info)
- free (sec_info);
+ free (sec_info);
success:
- if (ehbuf)
- free (ehbuf);
- if (local_cies)
- free (local_cies);
+ free (ehbuf);
+ free (local_cies);
#undef REQUIRE
}
if (!sec->rawsize)
sec->rawsize = sec->size;
- bfd_set_section_size (sec->owner, sec, sec->size + 8);
+ bfd_set_section_size (sec, sec->size + 8);
}
/* Finish a pass over all .eh_frame_entry sections. */
struct eh_frame_sec_info *sec_info
= (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
unsigned int lo, hi, mid;
- struct eh_cie_fde *ent;
+ struct eh_cie_fde *ent = NULL;
bfd_signed_vma delta;
lo = 0;
don't create the binary search table,
since it is affected by runtime relocations. */
hdr_info->u.dwarf.table = FALSE;
- if (num_warnings_issued < 10)
+ /* Only warn if --eh-frame-hdr was specified. */
+ if (info->eh_frame_hdr_type != 0)
{
- (*info->callbacks->einfo)
- /* xgettext:c-format */
- (_("%P: FDE encoding in %B(%A) prevents .eh_frame_hdr"
- " table being created.\n"), abfd, sec);
- num_warnings_issued ++;
- }
- else if (num_warnings_issued == 10)
- {
- (*info->callbacks->einfo)
- (_("%P: Further warnings about FDE encoding preventing .eh_frame_hdr generation dropped.\n"));
- num_warnings_issued ++;
+ if (num_warnings_issued < 10)
+ {
+ _bfd_error_handler
+ /* xgettext:c-format */
+ (_("FDE encoding in %pB(%pA) prevents .eh_frame_hdr"
+ " table being created"), abfd, sec);
+ num_warnings_issued ++;
+ }
+ else if (num_warnings_issued == 10)
+ {
+ _bfd_error_handler
+ (_("further warnings about FDE encoding preventing .eh_frame_hdr generation dropped"));
+ num_warnings_issued ++;
+ }
}
}
ent->removed = 0;
}
}
- if (sec_info->cies)
- {
- free (sec_info->cies);
- sec_info->cies = NULL;
- }
+ free (sec_info->cies);
+ sec_info->cies = NULL;
/* It may be that some .eh_frame input section has greater alignment
than other .eh_frame sections. In that case we run the risk of
if (info->eh_frame_hdr_type == COMPACT_EH_HDR)
{
/* For compact frames we only add the header. The actual table comes
- from the .eh_frame_entry sections. */
+ from the .eh_frame_entry sections. */
sec->size = 8;
}
else
{
for (o = abfd->sections; o; o = o->next)
{
- const char *name = bfd_get_section_name (abfd, o);
+ const char *name = bfd_section_name (o);
if (strcmp (name, ".eh_frame_entry")
&& !bfd_is_abs_section (o->output_section))
if (addr <= last_addr)
{
/* xgettext:c-format */
- _bfd_error_handler (_("%B: %A not in order"), sec->owner, sec);
+ _bfd_error_handler (_("%pB: %pA not in order"), sec->owner, sec);
return FALSE;
}
if (addr & 1)
{
/* xgettext:c-format */
- _bfd_error_handler (_("%B: %A invalid input section size"),
+ _bfd_error_handler (_("%pB: %pA invalid input section size"),
sec->owner, sec);
bfd_set_error (bfd_error_bad_value);
return FALSE;
if (last_addr >= addr + sec->rawsize)
{
/* xgettext:c-format */
- _bfd_error_handler (_("%B: %A points past end of text section"),
+ _bfd_error_handler (_("%pB: %pA points past end of text section"),
sec->owner, sec);
bfd_set_error (bfd_error_bad_value);
return FALSE;
{
hdr_info->frame_hdr_is_compact = FALSE;
hdr_info->u.dwarf.array = (struct eh_frame_array_ent *)
- bfd_malloc (hdr_info->u.dwarf.fde_count
+ bfd_malloc (hdr_info->u.dwarf.fde_count
* sizeof (*hdr_info->u.dwarf.array));
}
if (hdr_info->u.dwarf.array == NULL)
|| ent->u.cie.per_encoding_relative)
{
char *aug;
- unsigned int action, extra_string, extra_data;
+ unsigned int version, action, extra_string, extra_data;
unsigned int per_width, per_encoding;
/* Need to find 'R' or 'L' augmentation's argument and modify
extra_string = extra_augmentation_string_bytes (ent);
extra_data = extra_augmentation_data_bytes (ent);
- /* Skip length, id and version. */
- buf += 9;
+ /* Skip length, id. */
+ buf += 8;
+ version = *buf++;
aug = (char *) buf;
buf += strlen (aug) + 1;
skip_leb128 (&buf, end);
skip_leb128 (&buf, end);
- skip_leb128 (&buf, end);
+ if (version == 1)
+ skip_bytes (&buf, end, 1);
+ else
+ skip_leb128 (&buf, end);
if (*aug == 'z')
{
/* The uleb128 will always be a single byte for the kind
address += elf_gp (abfd);
break;
default:
- (*info->callbacks->einfo)
- (_("%P: DW_EH_PE_datarel unspecified"
- " for this architecture.\n"));
+ _bfd_error_handler
+ (_("DW_EH_PE_datarel unspecified"
+ " for this architecture"));
/* Fall thru */
case bfd_arch_frv:
case bfd_arch_i386:
+ case bfd_arch_nios2:
BFD_ASSERT (htab->hgot != NULL
&& ((htab->hgot->root.type
== bfd_link_hash_defined)
if (sec->output_section != osec)
{
_bfd_error_handler
- (_("Invalid output section for .eh_frame_entry: %A"),
+ (_("invalid output section for .eh_frame_entry: %pA"),
sec->output_section);
return FALSE;
}
p->offset = p->u.indirect.section->output_offset;
if (p->next != NULL)
- i--;
+ i--;
}
if (i != 0)
{
_bfd_error_handler
- (_("Invalid contents in %A section"), osec);
+ (_("invalid contents in %pA section"), osec);
return FALSE;
}
/* The .eh_frame_hdr format for DWARF frames:
ubyte version (currently 1)
- ubyte eh_frame_ptr_enc (DW_EH_PE_* encoding of pointer to start of
+ ubyte eh_frame_ptr_enc (DW_EH_PE_* encoding of pointer to start of
.eh_frame section)
ubyte fde_count_enc (DW_EH_PE_* encoding of total FDE count
number (or DW_EH_PE_omit if there is no
overlap = TRUE;
}
if (overflow)
- (*info->callbacks->einfo) (_("%P: .eh_frame_hdr entry overflow.\n"));
+ _bfd_error_handler (_(".eh_frame_hdr entry overflow"));
if (overlap)
- (*info->callbacks->einfo)
- (_("%P: .eh_frame_hdr refers to overlapping FDEs.\n"));
+ _bfd_error_handler (_(".eh_frame_hdr refers to overlapping FDEs"));
if (overflow || overlap)
{
bfd_set_error (bfd_error_bad_value);
retval = FALSE;
free (contents);
- if (hdr_info->u.dwarf.array != NULL)
- free (hdr_info->u.dwarf.array);
+ free (hdr_info->u.dwarf.array);
return retval;
}