[llvm-dev] Wrong relocation emitted when building shared libraries with Control Flow Integrity

Artem Dinaburg via llvm-dev
Sat, 04 Feb 2017 07:02:14 -0000

Hello,

I am encountering a linking failure when using Control Flow Integrity while
building a shared library. It looks like the wrong relocation type is being
emitted for functions referenced via the PLT. I am using clang 3.9.

The error message I get is:

/usr/bin/ld.gold: error: /tmp/lto-llvm-df723d.o: requires dynamic R_X86_64_PC32
reloc against 'free' which may overflow at runtime; recompile with -fPIC

Recompiling with -fPIC does not actually help. I've managed to create a
minimal reproducible testcase. Full command line and code to reproduce are
below.

--- hello.c ---
#include <stdio.h>
#include <stdlib.h>

typedef void(*freeptr)(void*);

int getval(freeptr fp) {
    void *m = malloc(sizeof(int));
    if(m) {
        fp(m);
    }
    return 42;
}

int export() {
    printf("Test: %d\n", getval(free));
    return 0;
}
---

--- command line ---
clang-3.9 -shared -fuse-ld=gold -flto -fsanitize=cfi-icall -fPIC -o libhello.so
hello.c
---

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 3970 bytes
Desc: not available
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20170204/f942d372/attachment.bin>