• XSS.stack #1 – первый литературный журнал от юзеров форума

Проблема с компиляцией байткода LLVM

reqwest

(L3) cache
Пользователь
Регистрация
05.05.2022
Сообщения
231
Реакции
137
Гарант сделки
2
Депозит
0.00
Есть простой сишный код:
C:
#include <windows.h>
int main() {
    MessageBoxW(0, 0, 0, 0);
}
Компилируем в IR:
clang -S -emit-llvm test.cpp
Компилируем IR в BC:
opt test.ll -o test.bc
Пробуем собрать в EXE'шник под х86 таргет на х64 хосте:
clang-cl test.bc -m32 /MT /link kernel32.lib libcmt.lib user32.lib
Получаем ошибку линковки error LNK2019: unresolved external symbol __imp__MessageBoxW referenced in function _main
Проверяем флаги, переданные компилем линковщику:
clang-cl test.bc -v -m32 /MT /link kernel32.lib libcmt.lib user32.lib
Все пути указаны верно:
Код:
link.exe \
    "-libpath:C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.34.31933\\lib\\x86" \
    "-libpath:C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.34.31933\\atlmfc\\lib\\x86" \
    "-libpath:C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.22621.0\\ucrt\\x86" \
    "-libpath:C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.22621.0\\um\\x86" \
    ...
Если попробовать собрать под тот же таргет что и хост:
clang-cl test.bc /MT /link kernel32.lib libcmt.lib user32.lib
Всё ок, получаем х64 бинарник.
Если попробовать собрать исходник:
clang-cl test.cpp /MT -m32 /link kernel32.lib libcmt.lib user32.lib
Всё ок, получаем х32 бинарник.

Но почему же не получается собрать байткод под другой таргет? Байткод не поддерживает кросскомпиляцию?
 
Или, возможно, есть другие варианты запустить кастомный пасс напрямую из clang? Минуя вызов opt вручную. LLVM 17.0.2, если версия имеет какое-то значение.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх