Я использовал clang-3.5
, чтобы с радостью создавать версии битового кода musl libc и использовать результат для создания замечательных автономных исполняемых файлов.clang-3.8 и compiler-rt vs libgcc
Недавние попытки с clang-3.8
не были так счастливы. Похоже, что clang-3.8
генерирует битовый код использует функцию, определенную в
compiler-rt/lib/builtins
Типичных примеров функций Я считаю, загрязняющими являются mulxc3
битовым кодом, mulsc3
и muldc3
. Я могу решить это, связываясь с libgcc
или даже альтернативой llvm, если бы у меня было четкое представление о том, что это было. Хотя я бы предпочел предотвратить возникновение проблемы в первую очередь.
Я видел упоминание флагов, таких как rtlib=compiler-rt
и т. Д., Но нашел ценную небольшую документацию по этому вопросу.
Итак, вот несколько простых вопросов.
Можно ли предотвратить
clang
от использованияcompiler-rt/lib/builtins
в излучаемого битового кода? Или если нетИмеет ли llvm версию libgcc, которую я мог бы использовать. На самом деле я бы , вероятно, создал версию его битового кода, но это, помимо точки.
Любовь, чтобы услышать некоторые рекомендации по этому вопросу.
Добавлено 12/8/2016: Так я проиллюстрирую мои проблемы с конкретным рабочим процессом, который люди могут размножаться, если они хотят, или, скорее, просто указать, где я глуп.
Так начните, проверяя:
и следуйте инструкциям в README.to компиляции (здесь я использую лязг-3,8 на убунту 14.04)
WLLVM_CONFIGURE_ONLY=1 CC=wllvm ./configure --target=LLVM --build=LLVM
make
cd lib
extract-bc -b libc.a
вы будете также нужен биткод простого исполняемого файла. Я буду использовать nweb.c здесь.
wllvm nweb.c -o nweb
extract-bc nweb
Теперь мы можем сделать что-то вроде:
clang -static -nostdlib nweb.bc libc.a.bc crt1.o libc.a -o nweb
Этого рабочий процесс проходит гладко лязг-3.5, но для лязга-3.8 мы получаем:
clang -static -nostdlib nweb.bc libc.a.bc crt1.o libc.a -o nweb
/tmp/libc-f734a3.o: In function `cpowl':
libc.a.bc:(.text+0xbb9a): undefined reference to `__mulxc3'
/tmp/libc-f734a3.o: In function `cpowf':
libc.a.bc:(.text+0x38f7d): undefined reference to `__mulsc3'
/tmp/libc-f734a3.o: In function `csqrt':
libc.a.bc:(.text+0x78fc3): undefined reference to `__muldc3'
/tmp/libc-f734a3.o: In function `cpow':
libc.a.bc:(.text+0xafafc): undefined reference to `__muldc3'
clang-3.8: error: linker command failed with exit code 1 (use -v to seeinvocation)
Итак, как @ Поль-Брэннэн указывает, что мы могли бы попробовать
clang -static -nostdlib --rtlib=compiler-rt nweb.bc libc.a.bc crt1.o libc.a -o nweb
Но это, где я, наверное, глупо, потому что я получаю:
clang-3.8: warning: argument unused during compilation: '--rtlib=compiler-rt'
независимо от того, использую ли я его как флаг связывания или компиляции.
Я не знаю ответа на вопрос, но я считаю, что этот отчет об ошибке является актуальным: https://llvm.org/bugs/show_bug.cgi?id=16404 BTW, связавшись с использованием --rtlib = compiler-rt решил мои проблемы с привязкой к поиску __muloti4, в то время как связь с libgcc этого не сделала. –
Спасибо за подсказку @ paul-brannan, выглядит «can-o-wormish». Тем не менее у меня, похоже, нет мидаса. Я опубликую последующую информацию, чтобы люди могли дублировать мою проблему и кормить меня в землю обетованной. –
Я добавляю это здесь, потому что, хотя он не отвечает на мой вопрос, это также кажется актуальным. [Сборка GNU-бесплатных исполняемых файлов с clang] (https://blogs.gentoo.org/gsoc2016-native-clang/2016/05/31/build-gnu-free-executables-with-clang/) –