LLVM 3.3 с набором инструментов TileGX и LTO не работает
У меня есть простая программа 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 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
в этой среде. Кто-нибудь видел это раньше? Есть ли решение, чтобы решить это? Есть ли что-то еще, что я могу или должен делать?
1 ответ
Хорошо, это случай, когда класс имеет указатель на строку, которую он копирует в локальную переменную. Когда класс уничтожается, указатель также исчезает, поэтому локальная переменная теперь эффективно указывает на случайную память. Исправление состояло в том, чтобы скопировать строку в локальную переменную, а затем не забудьте освободить ее, когда я закончу с ней.
Для тех, кому все равно, достаточно вызвать strdup в локальной переменной. Единственное изменение кода требуется в gold-plugin.cpp
,