Fix some broken relocation handling

In a few cases, the symbol lookup is missing before attempting to
perform the relocation. While the relocation types affected are
currently unused, this results in an uninitialized variable warning,
that is escalated to an error when building with clang.

Reviewed by:	markj
MFC after:	3 days
Differential Revision:	https://reviews.freebsd.org/D21773
This commit is contained in:
Mitchell Horne 2019-09-26 00:58:47 +00:00
parent 8b86850749
commit c81e8f9891

View File

@ -373,6 +373,10 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
break;
case R_RISCV_PCREL_HI20:
error = lookup(lf, symidx, 1, &addr);
if (error != 0)
return (-1);
val = addr - (Elf_Addr)where;
insn32p = (uint32_t *)where;
before32 = *insn32p;
@ -385,6 +389,10 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
break;
case R_RISCV_PCREL_LO12_I:
error = lookup(lf, symidx, 1, &addr);
if (error != 0)
return (-1);
val = addr - (Elf_Addr)where;
insn32p = (uint32_t *)where;
before32 = *insn32p;
@ -396,6 +404,10 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
break;
case R_RISCV_PCREL_LO12_S:
error = lookup(lf, symidx, 1, &addr);
if (error != 0)
return (-1);
val = addr - (Elf_Addr)where;
insn32p = (uint32_t *)where;
before32 = *insn32p;
@ -412,6 +424,7 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
if (error != 0)
return (-1);
val = addr;
insn32p = (uint32_t *)where;
before32 = *insn32p;
imm20 = calc_hi20_imm(val);