LINUX.ORG.RU

кто кривой: я, mingw, g++ или кто-то ещё?


0

0

сорри за ламерство
mingw, GCC 4.4.0, балуюсь с llvm
Не растекаясь мыслью по древу: результат линковки

g++ `llvm-config --libs --cflags core analysis executionengine jit interpreter native --ldflags` fac.o -o fac

зависит от порядка указания библиотек для линковки. Т.е. в вышеуказанном виде ругается на отсутствие одних символов

ac.o:fac.c:(.text+0x36): undefined reference to `LLVMLinkInJIT'
ac.o:fac.c:(.text+0x3b): undefined reference to `LLVMInitializeX86TargetInfo'
...

если раскрыть `llvm-config...` - лезут уже другие ошибки, и только при некотором порядке библиотек в командной строке всё линкуется на ура.

Кто-нибудь знает в чём дело?

Или надо больше информации?

★★★★★

GCC 4.4.0 << обновили бы до 4.4.4 по возможности

если раскрыть `llvm-config...` - лезут уже другие ошибки, и только при некотором порядке библиотек в командной строке всё линкуется на ура.


да, нужно больше информации,
если есть --as-needed флаг, то уберите, или задавайте последовательность линковки

а) обьектные файлы приложения
б) статические библиотеки
в) разные библиотеки
в последнюю очередь в флагах должны перечисляться г) общесистемные библиотеки

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

>да, нужно больше информации

ок, одну команду я уже привёл, вот результат раскрытия llvm-config:

$ llvm-config --libs --cflags --ldflags core analysis executionengine jit interpreter native
-I/mingw/include -D_DEBUG -D__NO_CTYPE_INLINE -D_GNU_SOURCE -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -O2 -fomit-frame-pointer
-L/mingw/lib -ldl -lpsapi -limagehlp -lm
-lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86AsmPrinter -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMMCParser -lLLVMX86Info -lLLVMInterpreter -lLLVMJIT -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils -lLLVMipa -lLLVMExecutionEngine -lLLVMAnalysis -lLLVMTarget -lLLVMMC -lLLVMCore -lLLVMSupport -lLLVMSystem

при этом уже лезут ошибки

g:/gnu/mingw/lib/libLLVMSystem.a(DynamicLibrary.o):DynamicLibrary.cpp:(.text+0x74e): undefined reference to `_imp__EnumerateLoadedModules@12'
g:/gnu/mingw/lib/libLLVMSystem.a(Signals.o):Signals.cpp:(.text+0x342): undefined reference to `_imp__SymSetOptions@4'
g:/gnu/mingw/lib/libLLVMSystem.a(Signals.o):Signals.cpp:(.text+0x35c): undefined reference to `_imp__SymInitialize@12'

задавайте последовательность линковки


это делает llvm-config. Что, баг вывешивать?

в последнюю очередь в флагах должны перечисляться г) общесистемные библиотеки


вот перенос -limagehlp -lpsapi в конец списка и решил все проблемы

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

>это делает llvm-config. Что, баг вывешивать?

да, не мешало бы, похоже что mingw ведет себя также как и нативный линуксовый gcc/ld с флагом --as-needed

собственные библиотеки llvm должны быть вначале списка, системные - в конце.

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

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

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

>его исправить нельзя, ибо чтобы понять в каком порядке линковать библиотеки надо уже что-то слинковать

в багзилле даже патч лежит, который именно это исправляет

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

Заранее отвечу, что бесполезно. Лучше пропиши в Makefile либы в том порядке в котором линкуется без ошибок.

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

спасибо, но поздняк метаться. Если не поможет - накачу дифф на llvm-config «и будет мне счастье» =)

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

ипать, с 4.5.0 вообще не собралось:

g:/gnu/home/src/llvm/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp: In member function 'void llvm::LiveIntervals::handleVirtualRegisterDef(llvm::MachineBasicBlock*, llvm::MachineBasicBlock::iterator, llvm::SlotIndex, llvm::MachineOperand&, unsigned int, llvm::LiveInterval&)':
g:/gnu/home/src/llvm/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp:300:6: internal compiler error: Segmentation fault

откатываемся на 4.4.0

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

4.5.0 вообще невозможно использовать) если хочется 4.5 ветку, то надо брать то, что сейчас лежит в svn для 4.5.1 , оно уже пригодно, а релизный .0 - ноль он и есть ноль)

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

>т.е. кривой llvm-config? Спасибо...

Т. е. кривые руки у кого-то:

gcc $(LDFLAGS) $(OBJ) $(LIBS)

Библиотеки идут в конце. В случае динамических библиотек неважно, в каком порядке и где их указывать, а в случае статических действует такое правило: в текущей библиотеке ищутся unresolved символы на текущий момент. Соответственно, указываешь библиотеки в начале и они не используются, т. к. нету unresolved symbols, которые нужно брать из них.

Если уж очень хочется, то gcc -Wl,-( `llvm-config....` -Wl,-) ...

The linker will search an archive only once, at the location where it is specified on the command line. If the archive defines a symbol which was undefined in some object which appeared before the archive on the command line, the linker will include the appro- priate file(s) from the archive. However, an undefined symbol in an object appearing later on the command line will not cause the linker to search the archive again.

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

>Если уж очень хочется, то gcc -Wl,-( `llvm-config....` -Wl,-) ...

имхо, проще llvm-config пропатчить, не?

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

>4.5.0 вообще невозможно использовать) если хочется 4.5 ветку, то надо брать то, что сейчас лежит в svn для 4.5.1 , оно уже пригодно, а релизный .0 - ноль он и есть ноль)

собирать самому gcc под mingw? Неее, 4.5 мне на столько не хочется =)

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

>имхо, проще llvm-config пропатчить, не?

А тебе не кажется, что правильнее писать как положено:

$(CC) `llvm-config --cflags --ldflags` $(SRC) `llvm-config --libs`

Библиотеки в конце, цитату из man ld я приводил. Рекомендую посношаться с автотулзами: там в какой-то момент наступаешь на эти грабли и разница между LDFLAGS и LIBS надежно отпечатывается и оседает в мозгу.

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

хм... да, наверное вы правы.
Спасибо

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