summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Filippov <jcmvbkbc@gmail.com>2015-05-17 06:46:15 +0300
committerMax Filippov <jcmvbkbc@gmail.com>2015-05-26 10:14:17 +0300
commit4de0562a4c69fef4952aa7e19d7bda359f02e8b4 (patch)
treeb93a12cbcb93a315df61a6a77323529eca5ce13c
parent8f2fd309e013e4e230df46d2dee03c5ca2228836 (diff)
downloadbinutils-gdb-4de0562a4c69fef4952aa7e19d7bda359f02e8b4.tar.gz
xtensa: fix gas segfault with --text-section-literals
When --text-section-literals is used and code in the .init or .fini emits literal in the absence of .literal_position, xtensa_move_literals segfaults. Check that search_frag is non-NULL in the xtensa_move_literals and report error otherwise. 2015-05-26 Max Filippov <jcmvbkbc@gmail.com> gas/ * config/tc-xtensa.c (xtensa_move_literals): Check that search_frag is non-NULL. Report error if literal frag is not found.
-rw-r--r--gas/ChangeLog6
-rw-r--r--gas/config/tc-xtensa.c10
2 files changed, 15 insertions, 1 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index f3a30d2624b..a0ab897f947 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,9 @@
+2015-05-26 Max Filippov <jcmvbkbc@gmail.com>
+
+ * config/tc-xtensa.c (xtensa_move_literals): Check that
+ search_frag is non-NULL. Report error if literal frag is not
+ found.
+
2015-05-22 Nick Clifton <nickc@redhat.com>
PR gas/18446
diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c
index 31c0b6be7ee..18307c1b52a 100644
--- a/gas/config/tc-xtensa.c
+++ b/gas/config/tc-xtensa.c
@@ -10808,13 +10808,21 @@ xtensa_move_literals (void)
frchain_to = NULL;
frag_splice = &(frchain_from->frch_root);
- while (!search_frag->tc_frag_data.literal_frag)
+ while (search_frag && !search_frag->tc_frag_data.literal_frag)
{
gas_assert (search_frag->fr_fix == 0
|| search_frag->fr_type == rs_align);
search_frag = search_frag->fr_next;
}
+ if (!search_frag)
+ {
+ search_frag = frchain_from->frch_root;
+ as_bad_where (search_frag->fr_file, search_frag->fr_line,
+ _("literal pool location required for text-section-literals; specify with .literal_position"));
+ continue;
+ }
+
gas_assert (search_frag->tc_frag_data.literal_frag->fr_subtype
== RELAX_LITERAL_POOL_BEGIN);
xtensa_switch_section_emit_state (&state, segment->seg, 0);