Можно ли построить исполняемый файл из файлов Assembly и C с включенной функцией Clang Control Flow Integrity?
Создать файл funcs.s
с помощью команды:
gcc -S funcs.c
из funcs.c
файла:
int sum(int x, int y) {
return x + y;
}
int dbl(int x) {
return x + x;
}
void call_fn(int (*fn)(int)) {
(*fn)(42);
}
void erase_type(void *fn) {
call_fn(fn);
}
Файл main.c
:
int main() {
erase_type(sum);
return 0;
}
Сборка исполняемого файла для платформы хоста "x86" с включенной функцией дезинфекции "cfi":
./clang-8 \
-fsanitize=cfi \
-fvisibility=hidden \
-fno-sanitize-trap=all \
-fuse-ld=gold \
-flto \
funcs.s \
main.c \
-o \
main
Тестовая функция:
./main
Проблема не обнаружена.
P.S. Если я использую оригинальный funcs.c
файл вместо funcs.s
, все работает правильно:
$ ./main
funcs.c:10:3: runtime error: control flow integrity check for type 'int (int)' failed during indirect function call
(.../build_x86_cfi_lto_asm/main+0x42cb00): note: (unknown) defined here