Как я могу связать файлы, скомпилированные с помощью clang -flto, с помощью lld?

Я пытаюсь использовать llvm-lld для связывания объекта, который был скомпилирован с помощью -flto.

У меня есть ld в пути вызова lld со всеми предоставленными аргументами. Я создал простую программу на C ++, которую компилирую с помощью clang ++:

#include <stdio.h>
int main() {
    printf("Goodbye cruel world\n");
    return 0;
}

Без флага -flto я получаю исполняемый файл, с -flto я получаю эту ошибку:

warning: ignoring unknown argument: -plugin
warning: ignoring unknown argument: -plugin-opt=mcpu=x86-64
Cannot open /tmp/a-f1a2a7.o: Exec format error
clang-3.8: error: linker command failed with exit code 1 (use -v to see invocation)

Вот аргументы, передаваемые компоновщику, я вижу, что с -flto аргументы плагина включают эту опцию плагина, но, похоже, она не поддерживается.

--eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out /usr/lib64/gcc/x86_64-pc-linux-gnu/5.2.0/../../../../lib64/crt1.o /usr/lib64/gcc/x86_64-pc-linux-gnu/5.2.0/../../../../lib64/crti.o /usr/lib64/gcc/x86_64-pc-linux-gnu/5.2.0/crtbegin.o -L/usr/lib64/gcc/x86_64-pc-linux-gnu/5.2.0 -L/usr/lib64/gcc/x86_64-pc-linux-gnu/5.2.0/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib64/gcc/x86_64-pc-linux-gnu/5.2.0/../../../../x86_64-pc-linux-gnu/lib -L/usr/lib64/gcc/x86_64-pc-linux-gnu/5.2.0/../../.. -L/mnt/data/tmp/dev/llvm/prev/bin/../lib -L/lib -L/usr/lib -plugin /mnt/data/tmp/dev/llvm/prev/bin/../lib/LLVMgold.so -plugin-opt=mcpu=x86-64 /tmp/a-f1a2a7.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib64/gcc/x86_64-pc-linux-gnu/5.2.0/crtend.o /usr/lib64/gcc/x86_64-pc-linux-gnu/5.2.0/../../../../lib64/crtn.o

Есть ли способ lld связать этот код?


person G Hatzsis    schedule 26.08.2015    source источник


Ответы (1)


Да, вы можете сделать это, используя gold-linker, который поддерживает LTO через плагины:

Вот инструкции по его созданию и запуску

person Laser    schedule 02.09.2015
comment
Таким образом, плагин будет использоваться lld или binutil's ld (я считаю, что вам нужно указать путь к заголовкам binutil, когда вы компилируете плагин)? - person G Hatzsis; 06.09.2015