У меня есть простая программа HelloWorld.c (поэтому я помещаю ее сюда), которую я пытаюсь собрать с версией 3.3 clang с включенным LTO, которая выдает странные ошибки.Я строю это с cmake
, используя -DCMAKE_TOOLCHAIN_FILE
.Я могу успешно собрать и связать эту программу без -flto
, но мне нужно иметь возможность использовать этот классификатор.Инструментарий предназначен для TileGX (следовательно, необходимо остановиться на версии clang 3.3).Итак, вот мое окружение:
Ubuntu 16.04
cmake Version 3.9.4
I built the TileGX toolchain on 16.04, as well as 14.04
I build clang Version 3.3 on 16.04 (can't build it on 14.04)
Вот мой CMakeLists.txt
файл:
cmake_minimum_required (VERSION 3.9)
project (HelloWorld)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v -flto -static")
add_executable(HelloWorld HelloWorld.c)
Я добавил флаг -v
, чтобы посмотреть, что происходит в clang.
Вывод clang при попытке связать (переформатирован для более удобного чтения):
clang version 3.3
Target: tilegx-unknown-linux-gnu
Thread model: posix
./toolchains/univ_tilegx/usr/bin/tilegx-unknown-linux-gnu-ld -m elf64tilegx \
-static -o HelloWorld \
./toolchains/univ_tilegx/usr/tilegx-unknown-linux-gnu/sys-root/usr/lib/crt1.o \
./toolchains/univ_tilegx/usr/tilegx-unknown-linux-gnu/sys-root/usr/lib/crti.o \
./toolchains/univ_tilegx/usr/lib/gcc/tilegx-unknown-linux-gnu/4.9.2/crtbeginT.o \
-L./toolchains/univ_tilegx/usr/tilegx-unknown-linux-gnu/lib \
-L./third_party/toolchains/univ_tilegx/usr/lib/gcc/tilegx-unknown-linux-gnu/4.9.2/ \
-L./toolchains/univ_tilegx/usr/tilegx-unknown-linux-gnu/lib \
-L./toolchains/univ_tilegx/usr/lib/gcc/tilegx-unknown-linux-gnu/4.9.2/ \
-L/lib/../lib64 -L/lib -L/usr/lib -plugin ../lib/LLVMgold.so \
CMakeFiles/HelloWorld.dir/HelloWorld.c.o \
--start-group \
-lgcc -lgcc_eh -lc
--end-group \
./toolchains/univ_tilegx/usr/lib/gcc/tilegx-unknown-linux-gnu/4.9.2/crtend.o \
./toolchains/univ_tilegx/usr/tilegx-unknown-linux-gnu/sys-root/usr/lib/crtn.o
./toolchains/univ_tilegx/usr/bin/tilegx-unknown-linux-gnu-ld: cannot find 0�: \
No such file or directory
./toolchains/univ_tilegx/usr/bin/tilegx-unknown-linux-gnu-ld: error:
Failed to delete '0�': 0�: can't get status of file: No such file or directory
clang-3.3: error: linker command failed with exit code 1 (use -v to see invocation)
CMakeFiles/HelloWorld.dir/build.make:94: recipe for target 'HelloWorld' failed
make[2]: *** [HelloWorld] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/HelloWorld.dir/all' failed
make[1]: *** [CMakeFiles/HelloWorld.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
Сначала я подумал, что это проблема использования разделяемого объекта (LLVMgold.so
) построен на Ubuntu 16.04 с компоновщиком на 14.04.Компоновщик вызовет разделяемый объект, который затем перезвонит в компоновщик.Но теперь, когда у меня есть компоновщик, созданный 16.04, я все еще получаю ошибку.
Поскольку я собираю LLVMgold.so
, я поместил некоторый код для отслеживания того, что происходило, когда компоновщик вызывал разделяемый объект,но все там выглядит нормально.Я вижу, что ld
не может найти файл со странным именем, но я не уверен, какой файл может быть в наборе этих файлов.
Я перепробовал все, что мог представить, чтобы я могиспользуйте -flto
в этой среде.Кто-нибудь видел это раньше?Есть ли решение, чтобы решить это?Есть ли что-то еще, что я могу или должен делать?