Создание и использование библиотек бит-кода LLVM

У меня есть проект на С++, который использует библиотеку С++, которую я также написал. Я использую clang++ 3.3 для создания всего. Каждый файл в библиотеке скомпилирован как

clang++ -c -O -emit-llvm somefile.cpp -o somefile.bc

Затем я использую llvm-link для объединения всех файлов библиотеки *.bc в один файл с битным кодом, например

llvm-link -o MyLibrary.bc somefile.bc someotherfile.bc etc.bc

Я концептуализую это похоже на создание архива объектных файлов, но я не думаю, что это правда, основываясь на действиях.

Затем я компилирую исходные файлы моего проекта, используя аналогичную команду, приведенную выше. Затем я использую llvm-link (снова), чтобы объединить их вместе с файлом битового кода библиотеки в один файл с битным кодом, подобным этому

llvm-link -o app.bc1 main.bc x.bc y.bc path/to/MyLibrary.bc

Далее я компилирую app.bc1 в собственный файл объекта

llc -filetype=obj app.bc1 -o app.o

Наконец, я снова использую clang++, чтобы связать этот собственный файл объекта (и с другими родными библиотеками, которые мне нужны, например, стандартная библиотека С++ и т.д.)

clang++ app.o -o app

Однако, похоже, что происходит, когда я llvm-связываю код приложения, все содержимое MyLibrary.bc, кажется, включено в результат. Таким образом, конечная ссылка должна разрешать ссылки, сделанные библиотечными компонентами, которые я фактически не использую.

Что бы я хотел сделать, так это извлечь из MyLibrary.bc только файлы битового кода, которые мне нужны. Я вижу, что есть программа llvm-ar, но, читая об этом, у меня не создается впечатление, что это поможет здесь. Я предположил, что могу объединить библиотеку с llvm-ar вместо llvm-link, но я не могу понять это. Я надеюсь, что все, что мне нужно, это немного толчок:)

Ответ 1

РЕДАКТИРОВАТЬ: На самом деле он работает.

Бит опоздал, но все же может иметь отношение к кому-то, мы используем ar и ld.gold с плагином LLVM для соединения битового кода:

ar r --plugin /usr/lib64/llvm/LLVMgold.so library.a <files...>
ld.gold --plugin /usr/lib64/llvm/LLVMgold.so -plugin-opt emit-llvm  main.bc library.a

Конечно, путь к LLVMgold.so может быть другим. Таким образом, результат .bc имеет только нужные символы.