diff options
Diffstat (limited to 'tools/objtool/builtin-check.c')
-rw-r--r-- | tools/objtool/builtin-check.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/tools/objtool/builtin-check.c b/tools/objtool/builtin-check.c index 4cfdbb5b6967..066086dd59a8 100644 --- a/tools/objtool/builtin-check.c +++ b/tools/objtool/builtin-check.c | |||
@@ -805,11 +805,20 @@ static struct rela *find_switch_table(struct objtool_file *file, | |||
805 | insn->jump_dest->offset > orig_insn->offset)) | 805 | insn->jump_dest->offset > orig_insn->offset)) |
806 | break; | 806 | break; |
807 | 807 | ||
808 | /* look for a relocation which references .rodata */ | ||
808 | text_rela = find_rela_by_dest_range(insn->sec, insn->offset, | 809 | text_rela = find_rela_by_dest_range(insn->sec, insn->offset, |
809 | insn->len); | 810 | insn->len); |
810 | if (text_rela && text_rela->sym == file->rodata->sym) | 811 | if (!text_rela || text_rela->sym != file->rodata->sym) |
811 | return find_rela_by_dest(file->rodata, | 812 | continue; |
812 | text_rela->addend); | 813 | |
814 | /* | ||
815 | * Make sure the .rodata address isn't associated with a | ||
816 | * symbol. gcc jump tables are anonymous data. | ||
817 | */ | ||
818 | if (find_symbol_containing(file->rodata, text_rela->addend)) | ||
819 | continue; | ||
820 | |||
821 | return find_rela_by_dest(file->rodata, text_rela->addend); | ||
813 | } | 822 | } |
814 | 823 | ||
815 | return NULL; | 824 | return NULL; |