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,  		     insn->jump_dest->offset > orig_insn->offset))  		    break; +		/* look for a relocation which references .rodata */  		text_rela = find_rela_by_dest_range(insn->sec, insn->offset,  						    insn->len); -		if (text_rela && text_rela->sym == file->rodata->sym) -			return find_rela_by_dest(file->rodata, -						 text_rela->addend); +		if (!text_rela || text_rela->sym != file->rodata->sym) +			continue; + +		/* +		 * Make sure the .rodata address isn't associated with a +		 * symbol.  gcc jump tables are anonymous data. +		 */ +		if (find_symbol_containing(file->rodata, text_rela->addend)) +			continue; + +		return find_rela_by_dest(file->rodata, text_rela->addend);  	}  	return NULL;  | 
