Как создать исполняемый файл из файлов сборки и C с включенной целостностью потока управления? - PullRequest
0 голосов
/ 22 апреля 2019

Можно ли построить исполняемый файл из файлов 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
...