diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2018-09-18 20:46:55 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2018-09-18 20:46:55 +0000 |
commit | e837bd8d024753f126e57bf72f4e368a52e5dd01 (patch) | |
tree | 3f7e3649f8dac293fe088946b7d3a240a0866e10 | |
parent | 8620f1555c4aa6d68bf34a0e22ff294f4fc0a2d8 (diff) |
MFC r309748 (by glebius):
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
PR: 231451
Notes
Notes:
svn path=/stable/8/; revision=338756
-rw-r--r-- | sys/amd64/amd64/elf_machdep.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/sys/amd64/amd64/elf_machdep.c b/sys/amd64/amd64/elf_machdep.c index 7dcaac7be06a..20e49f99c6ec 100644 --- a/sys/amd64/amd64/elf_machdep.c +++ b/sys/amd64/amd64/elf_machdep.c @@ -161,6 +161,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: @@ -194,6 +195,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 */ addr = lookup(lf, symidx, 1); where32 = (Elf32_Addr *)where; val32 = (Elf32_Addr)(addr + addend - (Elf_Addr)where); |