LINUX.ORG.RU

__dso_handle undefined reference


0

0

продолжаю экспериментировать с библиотеками (so) и С++.
добавляю в lib.cpp #include <iostream>. Компиляемся без проблем (но очень долго!!!).  Запускаю экзешник, который сразу вываливается с сообщением
relocation error: lib.so: undefined symbol: __dso_handle
смотрим, что слинковалось
$:ld lib.so

lib.so: the `gets' function is dangerous and should not be used.
ld: warning: cannot find entry symbol _start; not setting start address
lib.so: undefined reference to `__dso_handle'
lib.so: undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
lib.so: undefined reference to `operator delete(void*)'
lib.so: undefined reference to `__gxx_personality_v0'
lib.so: undefined reference to `_Unwind_Resume'
lib.so: undefined reference to `std::ios_base::Init::Init()'
lib.so: undefined reference to `vtable for __cxxabiv1::__class_type_info'lib.so: undefined reference to `std::ios_base::Init::~Init()'
lib.so: undefined reference to `operator new(unsigned)'

тихо фигею и лезу в гугл - о! флейм на gcc.gnu.org - чел пишет о такой же проблеме как и у меня, а в ответ невнятные рассуждения о ключах gcc и в конце концов, признание, мол, да проблема есть и мы ее пофиксили!
ставлю последние binutils (со всей байдой типа ld ar и прочей)  
К сожалению не помогает - проблема остается.

Кто уже сталкивался с подобной фигней? Как лечится (не надо говорить о том, что писать надо на Си)?

Где ты видишь здесь телепатов??? Сделаю предположение: ты юзаешь gcc флаг -nostartfiles. Либо ещй как-то отказался от стандартных файлов.

sergio_nsk
()

хехх... извиняюсь - забыл детали...
никаких нестандартных флагов - все обычно и скучно
g++ -c -o my_lib.o my_lib.cpp -Imy_lib/inc -g
gcc -shared -o my_lib.so my_lib.o -L. -lpthread

gcc версии 3.2
binutils коллективная версия 2.13.2
linux 2.4.18 RH8.0

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

ну и еще в догонку... проблема появляется только после #include <iostream>. Если сделать #include <iostream.h> и заткнуть глотку компилятору -Wno-depricated - то все катит! Еще бит информации, пытаясь разобраться в переписке на gcc.gnu.org, нахожу, что __dso_handle должен быть определен в binutils/crtstuff.c - я взял последние сырцы - там нет такого файла и нигде нет такого символа...

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

using namespace std; после include делаешь?

anonymous
()

Не хватает ключа -fPIC. И используй, пожалуйста, при линковке g++ -- должно быть единообразие.

sergio_nsk
()

ла здравствует коллективный разум и отдельное спасибо sergio_nsk - лечится все как в армии - единообразно - или йодом (если снаружи) или пеницилином (если внутри). Новые binutils + использование g++ - решает проблему (есть ощущение, что binutils новые и не требуются, но проверять уже не буду)

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

laban:

собственно как я понимаю помогло использование g++ вместо gcc, произошло это потому, что при линковке gcc не может разобраться в том, что это плюсовый код и надо подцеплять либу STL: -lstdc++

если компилировать и линковать сразу, то gcc догадывается по расширению, что это на самом деле надо g++ обрабатывать, запускает грубо говоря g++, который автоматически прилинковывает libstdc++ и все работает :)

можешь проверить :)

HTH.

PS. аднака много нас из нск :)

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