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,

Другие вопросы по тегам