svn commit: r309748 - head/sys/amd64/amd64
Gleb Smirnoff
glebius at FreeBSD.org
Fri Dec 9 18:07:29 UTC 2016
Author: glebius
Date: Fri Dec 9 18:07:28 2016
New Revision: 309748
URL: https://svnweb.freebsd.org/changeset/base/309748
Log:
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
Modified:
head/sys/amd64/amd64/elf_machdep.c
Modified: head/sys/amd64/amd64/elf_machdep.c
==============================================================================
--- head/sys/amd64/amd64/elf_machdep.c Fri Dec 9 18:00:45 2016 (r309747)
+++ head/sys/amd64/amd64/elf_machdep.c Fri Dec 9 18:07:28 2016 (r309748)
@@ -178,6 +178,7 @@ elf_reloc_internal(linker_file_t lf, Elf
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
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);
More information about the svn-src-head
mailing list