Treat R_X86_64_PLT32 relocs as R_X86_64_PC32.
If we load a binary that is designed to be a library, it produces relocatable code via assembler directives in the assembly itself (rather than compiler options). This emits R_X86_64_PLT32 relocations, which are not handled by the kernel linker. Submitted by: gallatin Reviewed by: kib
This commit is contained in:
parent
296d65b7a9
commit
f98751499c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=309748
@ -178,6 +178,7 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
|
||||
switch (rtype) {
|
||||
case R_X86_64_PC32:
|
||||
case R_X86_64_32S:
|
||||
case R_X86_64_PLT32:
|
||||
addend = *(Elf32_Addr *)where;
|
||||
break;
|
||||
default:
|
||||
@ -211,6 +212,8 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
|
||||
break;
|
||||
|
||||
case R_X86_64_PC32: /* S + A - P */
|
||||
case R_X86_64_PLT32: /* L + A - P, L is PLT location for
|
||||
the symbol, which we treat as S */
|
||||
error = lookup(lf, symidx, 1, &addr);
|
||||
where32 = (Elf32_Addr *)where;
|
||||
val32 = (Elf32_Addr)(addr + addend - (Elf_Addr)where);
|
||||
|
Loading…
Reference in New Issue
Block a user