LLVM 3.3 с набором инструментов TileGX и LTO не работает - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть простая программа 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 в этой среде.Кто-нибудь видел это раньше?Есть ли решение, чтобы решить это?Есть ли что-то еще, что я могу или должен делать?

1 Ответ

0 голосов
/ 15 февраля 2019

ОК, это случай, когда класс имеет указатель на строку, которую он копирует в локальную переменную.Когда класс уничтожается, указатель также исчезает, поэтому локальная переменная теперь эффективно указывает на случайную память.Исправление состояло в том, чтобы дублировать строку в локальную переменную, а затем не забудьте освободить ее, когда я закончу с ней.

Для всех, кому не все равно, достаточно вызвать strdup из локальной переменной в себя.Требуется только изменение кода в gold-plugin.cpp.

...