LINUX.ORG.RU

Llvm не линкуется в программу у которой статический stdc++

 , , ,


0

2

Я нигде не могу найти решение этой проблемы: https://lists.llvm.org/pipermail/llvm-dev/2018-May/123745.html

Всё что я сделал это скомпилировал с -static-libgcc и -static-libstdc++.

Когда я отключаю llvm в своей программе, ошибка эта исчезает, и зависимости от stdc++ пропадают.

Но мне нужно, чтобы llvm работал, и я понятия не имею что делать. Пробовал всё, даже в makefile залезал, менял положение этих двух флагов в link_args, ничего не помогает короче.



Последнее исправление: gradle (всего исправлений: 1)
Ответ на: комментарий от DELIRIUM

[912/912] Linking target src/gallium/targets/libgl-xlib/libGL.so.1.5.0. FAILED: src/gallium/targets/libgl-xlib/libGL.so.1.5.0 c++ -o src/gallium/targets/libgl-xlib/libGL.so.1.5.0 ‘src/gallium/targets/libgl-xlib/a6bea21@@GL@sha/xlib.c.o’ -Wl,–no-undefined -shared -fPIC -Wl,–start-group -Wl,-soname,libGL.so.1 src/gallium/state_trackers/glx/xlib/libxlib.a src/gallium/winsys/sw/xlib/libws_xlib.a src/mapi/glapi/libglapi_static.a src/gallium/auxiliary/libgallium.a src/compiler/glsl/libglsl.a src/compiler/glsl/glcpp/libglcpp.a src/util/libmesa_util.a src/compiler/nir/libnir.a src/compiler/libcompiler.a src/mesa/libmesa_gallium.a src/mesa/libmesa_sse41.a src/gallium/drivers/llvmpipe/libllvmpipe.a src/gallium/drivers/softpipe/libsoftpipe.a -Wl,-Bsymbolic -Wl,–gc-sections -Wl,–version-script /home/xdroid/Desktop/mesa/src/gallium/targets/libgl-xlib/libgl-xlib.sym -pthread /usr/lib/i386-linux-gnu/libX11.so /usr/lib/i386-linux-gnu/libXext.so /usr/lib/i386-linux-gnu/libxcb.so -L/usr/lib/llvm-8/lib -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMGlobalISel -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMAggressiveInstCombine -lLLVMTransformUtils -lLLVMBitWriter -lLLVMX86Desc -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMMCJIT -lLLVMExecutionEngine -lLLVMTarget -lLLVMAnalysis -lLLVMProfileData -lLLVMRuntimeDyld -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMCore -lLLVMMCDisassembler -lLLVMMC -lLLVMDebugInfoCodeView -lLLVMDebugInfoMSF -lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle /usr/lib/i386-linux-gnu/libz.so -L/usr/lib/llvm-8/lib -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMGlobalISel -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMAggressiveInstCombine -lLLVMTransformUtils -lLLVMBitWriter -lLLVMX86Desc -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMMCJIT -lLLVMExecutionEngine -lLLVMTarget -lLLVMAnalysis -lLLVMProfileData -lLLVMRuntimeDyld -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMCore -lLLVMMCDisassembler -lLLVMMC -lLLVMDebugInfoCodeView -lLLVMDebugInfoMSF -lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle -Wl,–end-group ‘-Wl,-rpath,$ORIGIN/../../state_trackers/glx/xlib:$ORIGIN/../../winsys/sw/xlib:$ORIGIN/../../../mapi/glapi:$ORIGIN/../../auxiliary:$ORIGIN/../../../compiler/glsl:$ORIGIN/../../../compiler/glsl/glcpp:$ORIGIN/../../../util:$ORIGIN/../../../compiler/nir:$ORIGIN/../../../compiler:$ORIGIN/../../../mesa:$ORIGIN/../../drivers/llvmpipe:$ORIGIN/../../drivers/softpipe’ -Wl,-rpath-link,/home/xdroid/Desktop/mesa/build/src/gallium/state_trackers/glx/xlib -Wl,-rpath-link,/home/xdroid/Desktop/mesa/build/src/gallium/winsys/sw/xlib -Wl,-rpath-link,/home/xdroid/Desktop/mesa/build/src/mapi/glapi -Wl,-rpath-link,/home/xdroid/Desktop/mesa/build/src/gallium/auxiliary -Wl,-rpath-link,/home/xdroid/Desktop/mesa/build/src/compiler/glsl -Wl,-rpath-link,/home/xdroid/Desktop/mesa/build/src/compiler/glsl/glcpp -Wl,-rpath-link,/home/xdroid/Desktop/mesa/build/src/util -Wl,-rpath-link,/home/xdroid/Desktop/mesa/build/src/compiler/nir -Wl,-rpath-link,/home/xdroid/Desktop/mesa/build/src/compiler -Wl,-rpath-link,/home/xdroid/Desktop/mesa/build/src/mesa -Wl,-rpath-link,/home/xdroid/Desktop/mesa/build/src/gallium/drivers/llvmpipe -Wl,-rpath-link,/home/xdroid/Desktop/mesa/build/src/gallium/drivers/softpipe -lz -ltinfo -lrt -ldl -lpthread -lm -static-libstdc++ -static-libgcc /usr/lib/llvm-8/lib/libLLVMSupport.a(Timer.cpp.o): In function llvm::CreateInfoOutputFile()‘: Timer.cpp:(.text._ZN4llvm20CreateInfoOutputFileEv+0x78): undefined reference tostd::system_category()’ /usr/lib/llvm-8/lib/libLLVMX86CodeGen.a(X86InsertPrefetch.cpp.o): In function (anonymous namespace)::X86InsertPrefetch::runOnMachineFunction(llvm::MachineFunction&)‘: X86InsertPrefetch.cpp:(.text._ZN12_GLOBAL__N_117X86InsertPrefetch20runOnMachineFunctionERN4llvm15MachineFunctionE+0x4d9): undefined reference tostd::system_category()’ X86InsertPrefetch.cpp:(.text._ZN12_GLOBAL__N_117X86InsertPrefetch20runOnMachineFunctionERN4llvm15MachineFunctionE+0x82e): undefined reference to `std::system_category()’ …….. /usr/lib/llvm-8/lib/libLLVMObject.a(WasmObjectFile.cpp.o):WasmObjectFile.cpp:(.text._ZNK4llvm6object14WasmObjectFile18getSectionContentsENS0_11DataRefImplERNS_9StringRefE+0x39): more undefined references to std::system_category()’ follow /usr/lib/llvm-8/lib/libLLVMDebugInfoCodeView.a(CodeViewError.cpp.o): In functionCodeViewErrorCategory::~CodeViewErrorCategory()‘: CodeViewError.cpp:(.text._ZN21CodeViewErrorCategoryD0Ev[_ZN21CodeViewErrorCategoryD0Ev]+0x17): undefined reference to std::error_category::~error_category()’ /usr/lib/llvm-8/lib/libLLVMDebugInfoCodeView.a(CodeViewError.cpp.o):(.data.rel.ro._ZTV21CodeViewErrorCategory[_ZTV21CodeViewErrorCategory]+0x8): undefined reference tostd::error_category::~error_category()’ /usr/lib/llvm-8/lib/libLLVMDebugInfoCodeView.a(CodeViewError.cpp.o):(.data.rel.ro._ZTV21CodeViewErrorCategory[_ZTV21CodeViewErrorCategory]+0x18): undefined reference to std::error_category::default_error_condition(int) const’ /usr/lib/llvm-8/lib/libLLVMDebugInfoCodeView.a(CodeViewError.cpp.o):(.data.rel.ro._ZTV21CodeViewErrorCategory[_ZTV21CodeViewErrorCategory]+0x1c): undefined reference tostd::error_category::equivalent(int, std::error_condition const&) const’ /usr/lib/llvm-8/lib/libLLVMDebugInfoCodeView.a(CodeViewError.cpp.o):(.data.rel.ro._ZTV21CodeViewErrorCategory[_ZTV21CodeViewErrorCategory]+0x20): undefined reference to std::error_category::equivalent(std::error_code const&, int) const’ /usr/lib/llvm-8/lib/libLLVMDebugInfoCodeView.a(CodeViewError.cpp.o):(.data.rel.ro._ZTI21CodeViewErrorCategory[_ZTI21CodeViewErrorCategory]+0x8): undefined reference totypeinfo for std::error_category’ /usr/lib/llvm-8/lib/libLLVMSupport.a(Memory.cpp.o): In function llvm::sys::Memory::allocateMappedMemory(unsigned int, llvm::sys::MemoryBlock const*, unsigned int, std::error_code&)‘: Memory.cpp:(.text._ZN4llvm3sys6Memory20allocateMappedMemoryEjPKNS0_11MemoryBlockEjRSt10error_code+0x20): undefined reference tostd::system_category()’ Memory.cpp:(.text._ZN4llvm3sys6Memory20allocateMappedMemoryEjPKNS0_11MemoryBlockEjRSt10error_code+0x143): undefined reference to std::generic_category()’ /usr/lib/llvm-8/lib/libLLVMSupport.a(Memory.cpp.o): In functionllvm::sys::Memory::protectMappedMemory(llvm::sys::MemoryBlock const&, unsigned int)‘: Memory.cpp:(.text._ZN4llvm3sys6Memory19protectMappedMemoryERKNS0_11MemoryBlockEj+0x89): undefined reference to std::generic_category()’ Memory.cpp:(.text._ZN4llvm3sys6Memory19protectMappedMemoryERKNS0_11MemoryBlockEj+0x92): undefined reference tostd::generic_category()’ Memory.cpp:(.text._ZN4llvm3sys6Memory19protectMappedMemoryERKNS0_11MemoryBlockEj+0xbe): undefined reference to std::system_category()’ /usr/lib/llvm-8/lib/libLLVMSupport.a(Memory.cpp.o): In functionllvm::sys::Memory::releaseMappedMemory(llvm::sys::MemoryBlock&)‘: Memory.cpp:(.text._ZN4llvm3sys6Memory19releaseMappedMemoryERNS0_11MemoryBlockE+0x3d): undefined reference to std::generic_category()’ Memory.cpp:(.text._ZN4llvm3sys6Memory19releaseMappedMemoryERNS0_11MemoryBlockE+0x59): undefined reference tostd::system_category()’ collect2: error: ld returned 1 exit status ninja: build stopped: subcommand failed.

9 уже пробовал, не помогло. И он работает у меня плохо, т.к программа его не полностью поддерживает.

gradle
() автор топика

Как-то чинил такое, но давно и плохо (не уверен что верно) помню причину и рецепт.

Если не ошибаюсь, то первопричина в том, что clang не совсем корректно обрабатывает опции -static-libgcc и -static-libstdc++ кода его поженили с gcc.

А рецепт починки это попробовать -static если приемлемо, либо явно линковать с нужной статической libstdc++:

  • сначала потренироваться на простейшем hello-word с использованием std::system_category().
  • понять с какой именно библиотекой линкует gcc при указании -static-libstdc++.
  • добавить для llvm/clang линковку именно с этой библиотекой.

Как вариант можно линковать посредством gcc, а не clang/llvm.

Ну и на всякий случай лучше явно указать стандарт c++11/14 при сборке.

Deleted
()
Ответ на: комментарий от Deleted

При чём здесь clang? Я всё компилирую через gcc, а линкер там bfd. Моя библиотека (мой форк чужой библиотеки) использует LLVM для некоторых вычислений. Когда я использовал livstdc++.so.6, всё работало нормально, когда стал использовать libstdc++.a, стала вылезать эта ошибка. Если llvm я убираю, ошибка тут же пропадает, и всё работает статически.

Что значит перевести линковку с clang на gcc?

gradle
() автор топика
Ответ на: комментарий от gradle

Как добавить в llvm линковку с libstdc++.a? Зачем это вообще? Llvm у меня находится в libLLVM*.a, они же не связаны ни с чем, это обычные архивы. С какой именно линукет я в курсе.

gradle
() автор топика
Ответ на: комментарий от gradle

При чём здесь clang? Я всё компилирую через gcc, а линкер там bfd. Моя библиотека (мой форк чужой библиотеки) использует LLVM для некоторых вычислений. Когда я использовал livstdc++.so.6, всё работало нормально, когда стал использовать libstdc++.a, стала вылезать эта ошибка. Если llvm я убираю, ошибка тут же пропадает, и всё работает статически.

Пардон, я неверно понял проблему.

Тогда все чуть «понятнее»:

  • в libstdc++.so есть std::system_category(), потому-что TL;DR он нужен для совместимости по ABI.
  • в libstdc++.a НЕТ std::system_category(), потому-что при сборке актуальным компилятором с актуальными хидерами стандартной библиотеки ссылки на такой символ не возникает (инлайнится, либо получается std::_V1::system_category() или std::_V2::system_category()).
  • а в библиотеках LLVM такая ссылка есть, так как они собраны c другими хидерами стандартной библиотеки C++ и/или с другими опциями (другой стандарт С++).

Варианта три:

  • отказаться от статической линковки.
  • пересобрать LLVM.
  • сделать заглушку для std::system_category() (и лучше пометить её посредством __attribute__((weak))).
Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Пересборка llvm точно поможет? Как его правильно пересобирать в этом случае? Вдруг я что-то там забуду и ошибка останется.

gradle
() автор топика
Ответ на: комментарий от gradle

Сразу говорю, линковать libstdc++.a в libLLVM.a нежелательно, т.к это будет лишняя копия, и лишнее раздувание кода моей программы

gradle
() автор топика
Ответ на: комментарий от gradle

Пересборка llvm точно поможет? Как его правильно пересобирать в этом случае? Вдруг я что-то там забуду и ошибка останется.

Если собрать одним компилятором, с одинаковой версией STL, для одинакового стандарта С++, то обозначенной проблемы быть не должно.

Однако, не факт что «так просто» всё это получиться…

Deleted
()
Ответ на: комментарий от gradle

Будут ли просадки производительности из-за занижения стандартов? (У моей библиотеки немного старые стандарты)

gradle
() автор топика
Ответ на: комментарий от gradle

Как эти стандарты мне определить и задать для llvm?

Будут ли просадки производительности из-за занижения стандартов? (У моей библиотеки немного старые стандарты)

llvm вообще может не скомпилироваться из-за занижения стандартов…

Если вы собираете библиотеки в разных режимах (или разными компиляторами, или с разной версией STL), то они не обязаны работать вместе на уровне объектов/интерфейсов С++.

Сборка llvm с очень большой вероятностью не предусматривается изменение стандарта, но если вы используете его библиотеки, то все соответствующие подробности вам уже следует знать.

Тем не менее, скорее всего проблема исчезнет просто после пересборки. Но разумеется если действительно будет использоваться один компилятор и заголовки, т.е. на всякий случай вам лучше убедиться что у вас только один компилятор С++, и только одна STL.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от gradle
  • у вас есть некая целевая система (дистрибутив).
  • в этом дистрибутиве есть штатный toolchain и штатная версия stl.
  • вам нужно просто использовать системные библиотеки, а не системные пересобрать штатными средствами.
  • так вы получите работоспособную сборку для вашей целевой системы (дистрибутива), и с ненулевой вероятностью работающую где-то еще.
  • если требуется что-то другое, то это отдельная тема.
  • если у вас «грязная» сборочная машина (после каких-то экспериментов с установкой разных компиляторов и т.д.), то лучше все привести в порядок (или даже переставить систему).
Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от gradle

Нужно подогнать их под gcc 9.

Если для дистрибутива штатно доступен gcc-9, то весьма вероятно что все уже предусмотрено. Т.е. установив соотвествующий пакет и удалив другие ненужные вы получите валидную сборочную среду.

Deleted
()
Ответ на: комментарий от Deleted

Я устанавливал gcc 9 сам, на ubuntu 14.04 этого нет. Я спрашиваю, какой пакет нужен, чтобы обновить все заголовочные файлы, которые приводят к ошибкам

gradle
() автор топика
Ответ на: комментарий от gradle

Я устанавливал gcc 9 сам, на ubuntu 14.04 этого нет. Я спрашиваю, какой пакет нужен, чтобы обновить все заголовочные файлы, которые приводят к ошибкам

Тут такое дело - ни я, ни кто-то еще не может стоять рядом с вами «со свечкой» пока вы добиваетесь положительного результата.

Вам нужно либо разобраться в теме «как оно устроено» (с массой ньюансов), либо просто использовать Fedora, Gentoo, либо другой дистрибутив где новый компилятор в комплекте. Как вариант задействовать какой-нибудь flatpack, snappy и т.п.

Тем не менее, скорее всего вам достаточно оставить в системе штатную libstdc++ (с её родными заголовками) и один (нужный вам) компилятор. После чего пересобрать llvm и остальные ваши библиотеки.

Однако, может оказаться так, что пересборка llvm потребует более новой версии libstdc++, чем та, что штатно в составе дистрибутива.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Это агрессивный неуч, который прямо декларирует нежелание разбираться в чем бы то ни было. Попытки ему помочь обернутся впустую потраченным временем. Его предыдущий аккаунт был забанен за массовые оскорбления.

anonymous
()
Ответ на: комментарий от anonymous

На сколько я помню, мне помогают здесь 25% людей. Заблокировать аккаунт пришлось, чтобы стереть некоторые посты, которые мне даже удалить не позволяли. А понимать то, что мне не нужно я не собираюсь. Той информации, которую мне дали, в принципе должно хватить.

gradle
() автор топика
Ответ на: комментарий от gradle

А понимать то, что мне не нужно я не собираюсь.

Откуда ты знаешь, что тебе нужно, а что нет? Ты же ничерта не разбираешься в вопросе.

crutch_master ★★★★★
()
Ответ на: комментарий от Deleted

Мог ли баг появиться из-за того, что llvm сконфигурирован с std=c++11, а моя библиотека вся на std=c++14?

gradle
() автор топика
Ответ на: комментарий от Deleted

Огромное всем спасибо, после трёх попыток мучительной пересборки llvm всё стало линковаться. Теперь я наконец-то отвязал эти липучие libgcc т libstdc++

gradle
() автор топика
Ответ на: комментарий от gradle

Я же написал, что может не работать, а не что не будет. Я же твой код не видел, что ты понавертел.

DELIRIUM ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.