mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-02-17 13:10:12 +08:00
xtensa: bfd: fix assertion in xlate_offset_with_removed_text
Linking objects containing jumps targeting the end of a section triggers assertion in the xlate_offset_with_removed_text. Such jumps may be generated by a compiler as a dead code and not removed at -O0. Allow such jumps. While at it make bsearch argument match comparison function expectations and use bfd_vma for address fields in the struct xlate_map_entry. bfd/ 2018-03-15 Max Filippov <jcmvbkbc@gmail.com> * elf32-xtensa.c (xlate_map_entry): Change types of address fields from 'unsigned' to 'bfd_vma'. (xlate_offset_with_removed_text): Use struct xlate_map_entry as the key argument to bsearch. Allow offsets past the end of a section, use the last map entry for translation of such offsets.
This commit is contained in:
parent
202d116e57
commit
0854d50445
@ -1,3 +1,11 @@
|
||||
2018-03-15 Max Filippov <jcmvbkbc@gmail.com>
|
||||
|
||||
* elf32-xtensa.c (xlate_map_entry): Change types of address
|
||||
fields from 'unsigned' to 'bfd_vma'.
|
||||
(xlate_offset_with_removed_text): Use struct xlate_map_entry as
|
||||
the key argument to bsearch. Allow offsets past the end of a
|
||||
section, use the last map entry for translation of such offsets.
|
||||
|
||||
2018-03-15 Kuan-Lin Chen <kuanlinchentw@gmail.com>
|
||||
|
||||
* elf32-nds32.c (nds32_elf_ex9_build_hash_table): Removed.
|
||||
|
@ -8150,8 +8150,8 @@ typedef struct xlate_map xlate_map_t;
|
||||
|
||||
struct xlate_map_entry
|
||||
{
|
||||
unsigned orig_address;
|
||||
unsigned new_address;
|
||||
bfd_vma orig_address;
|
||||
bfd_vma new_address;
|
||||
unsigned size;
|
||||
};
|
||||
|
||||
@ -8182,6 +8182,7 @@ xlate_offset_with_removed_text (const xlate_map_t *map,
|
||||
{
|
||||
void *r;
|
||||
xlate_map_entry_t *e;
|
||||
struct xlate_map_entry se;
|
||||
|
||||
if (map == NULL)
|
||||
return offset_with_removed_text (action_list, offset);
|
||||
@ -8189,10 +8190,19 @@ xlate_offset_with_removed_text (const xlate_map_t *map,
|
||||
if (map->entry_count == 0)
|
||||
return offset;
|
||||
|
||||
r = bsearch (&offset, map->entry, map->entry_count,
|
||||
se.orig_address = offset;
|
||||
r = bsearch (&se, map->entry, map->entry_count,
|
||||
sizeof (xlate_map_entry_t), &xlate_compare);
|
||||
e = (xlate_map_entry_t *) r;
|
||||
|
||||
/* There could be a jump past the end of the section,
|
||||
allow it using the last xlate map entry to translate its address. */
|
||||
if (e == NULL)
|
||||
{
|
||||
e = map->entry + map->entry_count - 1;
|
||||
if (xlate_compare (&se, e) <= 0)
|
||||
e = NULL;
|
||||
}
|
||||
BFD_ASSERT (e != NULL);
|
||||
if (e == NULL)
|
||||
return offset;
|
||||
|
Loading…
Reference in New Issue
Block a user