Как скомпилировать файл ".c" для "aarch64" с включенным "cfi", используя "clang"? - PullRequest
0 голосов
/ 11 апреля 2019

Я создаю файл "main.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);
}

int main() {
  erase_type(sum);
  return 0;
}

для платформы хоста "x86" с включенной функцией очистки "cfi" с помощью следующей команды:

./clang-8 \
-fsanitize=cfi \
-fvisibility=hidden \
-fno-sanitize-trap=all \
-fuse-ld=gold \
-flto \
main.c \
-o \
main

Теперь мне нужно скомпилировать этот файл для процессора "aarch64". Я знаю, как просто скомпилировать этот файл (с отключенной функцией cfi).

rm -f main.o && \
./clang-8 \
-cc1 \
-triple \
aarch64-funnyos-unknown-gnueabi \
-emit-obj \
-target-cpu \
generic \
-O2 \
-Wall \
-o \
main.o \
-x \
c \
main.c \
&& \
file main.o

Но я не знаю, как скомпилировать файл "main.c" для "aarch64" с включенной "cfi".

Кто-нибудь знает, как это сделать?

UPD. Предположим, что процессор относится к типу ARMv8, а Linux работает, например, на эмуляторе QEMU. Предположим, хост - x86 и работает под Linux. Мне нужно выполнить кросс-компиляцию кода на хосте x86 Linux для цели ARMv8 (которая работает на QEMU, Linux).

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Сначала нам нужно скомпилировать main.c компилятором clang в промежуточный код llvm:

./clang-8 \
--target=\
aarch64-funnyos-unknown-gnueabi \
-c \
-flto \
-fsanitize=cfi \
-fvisibility=default \
main.c \
-o \
main.o

Следующий шаг - перевести / связать этот код в двоичный файл с помощью золотого компоновщика (например, из AndroidNDK) с использованием золотого плагина (из проекта LLVM), сообщив компоновщику режим эмуляции (опция -m, для которой архитектура двоичный файл должен быть сгенерирован):

/PATH/TO/aarch64-linux-android-4.9/prebuilt/linux-x86_64/aarch64-linux-android/bin/ld.gold \
-pie \
-m \
aarch64_elf64_le_vec \
-o \
main \
-plugin \
/PATH/TO/llvm-project/build/lib/LLVMgold.so \
-plugin-opt=mcpu=generic \
-plugin-opt=O2 \
-plugin-opt=-debugger-tune=gdb \
main.o

P.S. Спасибо @yugr за помощь и помощь!

0 голосов
/ 12 апреля 2019

Ваши команды x86 и AArch64 очень разные.Первый запускает компилятор драйвер , который поддерживает флаги компилятора (в частности, -fsanitize=cfi).

Вторая команда, хотя и запускает компилятор Proper (как указано переключателем -cc1).Это внутренний режим: он запускается драйвером компилятора изнутри, поэтому он не поддерживает обычные флаги компилятора и не предназначен для запуска обычными пользователями.Вы должны переключиться на использование драйвера компилятора на AArch64.

...