diff options
author | Max Filippov <jcmvbkbc@gmail.com> | 2018-03-15 10:35:59 -0700 |
---|---|---|
committer | Max Filippov <jcmvbkbc@gmail.com> | 2018-03-15 13:53:33 -0700 |
commit | 0854d50445a11847f80e655482fd180d7c4e4d00 (patch) | |
tree | 5d212be4070c5fd1eb9addb5e80080ae8cb345e2 /bfd | |
parent | 202d116e5714a0c21d0c38b7dd45b5d4ee494880 (diff) | |
download | gdb-0854d50445a11847f80e655482fd180d7c4e4d00.zip gdb-0854d50445a11847f80e655482fd180d7c4e4d00.tar.gz gdb-0854d50445a11847f80e655482fd180d7c4e4d00.tar.bz2 |
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.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/elf32-xtensa.c | 16 |
2 files changed, 21 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index d06541a..f4fac1a 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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. diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c index cd08796..c12b2f5 100644 --- a/bfd/elf32-xtensa.c +++ b/bfd/elf32-xtensa.c @@ -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; |