]> xenbits.xensource.com Git - people/royger/freebsd.git/commitdiff
Treat R_X86_64_PLT32 relocs as R_X86_64_PC32.
authorglebius <glebius@FreeBSD.org>
Fri, 9 Dec 2016 18:07:28 +0000 (18:07 +0000)
committerglebius <glebius@FreeBSD.org>
Fri, 9 Dec 2016 18:07:28 +0000 (18:07 +0000)
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

sys/amd64/amd64/elf_machdep.c

index ca07adc7cadd04f6a7de381ba5f4bf2c2e92b0ed..1c3460eb031c2cb1cd8ceca2cef13cf4dbaa2746 100644 (file)
@@ -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);