>Load module.
>Libarary: ./models/libModelTemplate.so[0x09a1f130], load success.
>Unload module.
>debug. handle: 0x09a1f130, symbol: modelName
>Error get symbol "modelName": >��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷: undefined symbol: >modelName
>debug. handle: 0x09a1f130, symbol: modelVersion
>Error get symbol "modelVersion": 8�� ��� ��� ��� >��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷��� ��� ��޷��޷��޷��޷��޷��޷��޷��޷��޷��޷: >undefined symbol: modelVersion
Динамическая библиотека
Всего смысла этого творение не буду рассказывать, он очень глубоко зарыт . Но в общих чертах:
есть разные способы обработки некой конфигурационной информации, появилась мысль реализовать это все посредством модулей и грузить все это динамически. Почитал разную литературу на эту тему и оно родилось - oiAdapter(для динамической загрузки), oiLoader(для загрузки скопом с директории), oiModel(некий интерфейс, пока не реализованный), /models/oiModelTemplate(примерный модуль). Все это дело весело компилится и собирается, но при работе происходят чудеса. Во вывод первоначальный(test1):
Код:
Поставил флаги на загрузку и выгрузку модуля. И происходит, модуль загружается, отладочная инфа говорит что модуль удачно загружен, потом модуль каким-то волшебным образом системой выгружается и дальше естественно не могу нихрена получить, да еще к томуже dlerror выплевывает кракозябры. Если в dlopen убрать флаг RTLD_GLOBAL, то все к чертям валится (скорее всего из-за того, что система почему-то сразу выгружает библиотеку и адрес уже не действительный).
Вывод nm:
Код:
lerdeb:/home/pastor/Desktop/settings/models# nm libModelTemplate.so
00001b38 d DW.ref.__gxx_personality_v0
00001a18 a _DYNAMIC
00001b10 a _GLOBAL_OFFSET_TABLE_
w _Jv_RegisterClasses
00001b60 b _ZL8instance
00001b64 b _ZL9parametrs
00001b80 b _ZZ12modelVersionE7version
U _ZdlPv@@GLIBCXX_3.4
00001a04 d __CTOR_END__
000019fc d __CTOR_LIST__
00001a10 d __DTOR_END__
00001a08 d __DTOR_LIST__
000009f8 r __FRAME_END__
00001a14 d __JCR_END__
00001a14 d __JCR_LIST__
00001b3c A __bss_start
w __cxa_finalize@@GLIBC_2.1.3
00000850 t __do_global_ctors_aux
000005f0 t __do_global_dtors_aux
00001b34 d __dso_handle
w __gmon_start__
U __gxx_personality_v0@@CXXABI_1.3
000006a7 t __i686.get_pc_thunk.bx
00000846 t __i686.get_pc_thunk.cx
00001b3c A _edata
00001c80 A _end
00000888 T _fini
00000550 T _init
00001b40 b completed.5706
00001b44 b dtor_idx.5708
0000072d T fini
00000670 t frame_dummy
U fwrite@@GLIBC_2.0
000006eb T init
U memcpy@@GLIBC_2.0
0000079f T modelConfigure
000006c2 T modelInstance
000006ac T modelName
000007ec T modelVersion
U sprintf@@GLIBC_2.0
U stdout@@GLIBC_2.0
00001b38 d DW.ref.__gxx_personality_v0
00001a18 a _DYNAMIC
00001b10 a _GLOBAL_OFFSET_TABLE_
w _Jv_RegisterClasses
00001b60 b _ZL8instance
00001b64 b _ZL9parametrs
00001b80 b _ZZ12modelVersionE7version
U _ZdlPv@@GLIBCXX_3.4
00001a04 d __CTOR_END__
000019fc d __CTOR_LIST__
00001a10 d __DTOR_END__
00001a08 d __DTOR_LIST__
000009f8 r __FRAME_END__
00001a14 d __JCR_END__
00001a14 d __JCR_LIST__
00001b3c A __bss_start
w __cxa_finalize@@GLIBC_2.1.3
00000850 t __do_global_ctors_aux
000005f0 t __do_global_dtors_aux
00001b34 d __dso_handle
w __gmon_start__
U __gxx_personality_v0@@CXXABI_1.3
000006a7 t __i686.get_pc_thunk.bx
00000846 t __i686.get_pc_thunk.cx
00001b3c A _edata
00001c80 A _end
00000888 T _fini
00000550 T _init
00001b40 b completed.5706
00001b44 b dtor_idx.5708
0000072d T fini
00000670 t frame_dummy
U fwrite@@GLIBC_2.0
000006eb T init
U memcpy@@GLIBC_2.0
0000079f T modelConfigure
000006c2 T modelInstance
000006ac T modelName
000007ec T modelVersion
U sprintf@@GLIBC_2.0
U stdout@@GLIBC_2.0
Вывод ldd:
Код:
lerdeb:/home/pastor/Desktop/settings/models# ldd libModelTemplate.so
linux-gate.so.1 => (0xb7efb000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7df7000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7dd1000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7dc3000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7c68000)
/lib/ld-linux.so.2 (0xb7efc000)
linux-gate.so.1 => (0xb7efb000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7df7000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7dd1000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7dc3000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7c68000)
/lib/ld-linux.so.2 (0xb7efc000)
Созданный мной для проверки testModelTemplate отрабатывает хорошо. Да, если я oiAdapter скармливаю например libm.so, то все хорошо работает, это говорит что все кроме состряпанной библиотеки работает.
Ломаю голову уже какой день, перечитал кучу манов и всяких статей, но почему-то у Всех все шоколадно, а у меня (как обычно) все через задний проход. Не посоветуете, что может быть не так, в чем я мог наколоться?
Конструктор копирования и естественно оператор присваивания.
причиной было именно это, поэтому пришлось использовать указатели.
:)