LINUX.ORG.RU

проблема с динамической библиотекой


0

0

Есть некая динамическая библиотека, которая используется моей программой. Либа тоже самописная. Кидаю в /usr/local/lib/mylib/ файл mylib.so

дальше делаю ldconfig. ldconfig -p показывает что знает мою библиотеку. В скрипте на питоне делаю следующее:

name = 'mylib'
loadName = find_library(name)

получаю ошибку: библиотека не найдена. пробую проделать то же самое в интерактивном режиме — результат аналогичный. пробовал так же поместить либу в другую папку, а путь к ней прописать в /etc/ld.so.conf.d/ в файле с именем mylib.conf

что делать и куда пилить?

UPD: здесь тоже всё прочитал: http://python.net/crew/theller/ctypes/tutorial.html

UPD2: так же пробовал прописать путь в переменную среды LD_LIBRARY_PATH. Не помогло. С именем библиотеки всё нормально, так что здесь проблем быть не может(т.е.вариант с неправильным указанием имени библиотеки отпадает)



Последнее исправление: Odin (всего исправлений: 2)

LD_LIBRARY_PATH вроде как юзает ld при сборе программы программы в памяти

а то что делаеш ты - ты нпрямую тягаеш либу их проги - для этого по абсалютному адресу на фс ее загружай

ae1234 ★★
()

имхо умееться ввиду чтото типа dlopen

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

чего непомагло ?
запускай прогу - хотть и на питоне через strace - и смотри где она ищет твую либу

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

да, делал. вот еще: [code] odin@odin-laptop:~/libamico/AmiCoPyJava$ g++ -c -g -I/usr/include/python2.6 -I/usr/lib/jvm/java-6-sun-1.6.0.15/include -I/usr/lib/jvm/java-6-sun-1.6.0.15/include/linux -I/opt/jdk1.6.0_20/include -I/opt/jdk1.6.0_20/include/linux -fPIC -MMD -MP -MF build/LinuxLocalDebug/GNU-Linux-x86/PythonCallsJava.o.d -o build/LinuxLocalDebug/GNU-Linux-x86/PythonCallsJava.o PythonCallsJava.cc [/code] [code] g++ -shared -W1,-soname,AmiCoJcP.so.1 -o dist/LinuxLocalDebug/GNU-Linux-x86/libAmiCoPyJava.so -fPIC build/LinuxLocalDebug/GNU-Linux-x86/PythonCallsJava.o [/code]

секции SONAME по прежнему нет.

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

да, делал. вот еще:

 odin@odin-laptop:~/libamico/AmiCoPyJava$ g++ -c -g -I/usr/include/python2.6 -I/usr/lib/jvm/java-6-sun-1.6.0.15/include -I/usr/lib/jvm/java-6-sun-1.6.0.15/include/linux -I/opt/jdk1.6.0_20/include -I/opt/jdk1.6.0_20/include/linux -fPIC -MMD -MP -MF build/LinuxLocalDebug/GNU-Linux-x86/PythonCallsJava.o.d -o build/LinuxLocalDebug/GNU-Linux-x86/PythonCallsJava.o PythonCallsJava.cc 
 g++ -shared -W1,-soname,AmiCoJcP.so.1 -o dist/LinuxLocalDebug/GNU-Linux-x86/libAmiCoPyJava.so -fPIC build/LinuxLocalDebug/GNU-Linux-x86/PythonCallsJava.o
 

секции SONAME по прежнему нет.

пардон за другой нелицеприятный пост

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

man gcc:

-Wl,option Pass option as an option to the linker. If option contains commas, it is split into multiple options at the commas. You can use this syntax to pass an argument to the option. For example, `-Wl,-Map,output.map' passes `-Map output.map' to the linker. When using the GNU linker, you can also get the same effect with `-Wl,-Map=output.map'.

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

замечательно. секция появилась, но библиотека по прежнему не находится.

objdump -p -j .dynamic /home/odin/libamico/AmiCoPyJava/dist/LinuxLocalDebug/GNU-Linux-x86/libAmiCoPyJava.so | grep SONAME
  SONAME               AmiCoPcJ
Odin
() автор топика
Ответ на: комментарий от Odin
g++ -shared -W1,-soname,libAmiCoPyJava.so.1 -o dist/LinuxLocalDebug/GNU-Linux-x86/libAmiCoPyJava.so -fPIC build/LinuxLocalDebug/GNU-Linux-x86/PythonCallsJava.o

Пробуйте.

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

>библиотека по прежнему не находится

Всё правильно, по имени AmiCoPyJava она так как вы делаете не найдётся, найдётся она по имени AmiCoJcP.

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

>Всё правильно, по имени AmiCoPyJava она так как вы делаете не найдётся, найдётся она по имени AmiCoJcP.

это я затупил, но потом увидел и попробовал AmiCoJcP — результат аналогичный.

g++ -shared -W1,-soname,libAmiCoPyJava.so.1 -o dist/LinuxLocalDebug/GNU-Linux-x86/libAmiCoPyJava.so -fPIC build/LinuxLocalDebug/GNU-Linux-x86/PythonCallsJava.o

Пробуйте.

пробовал. не работает.

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

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

в интерактивном режиме завелось. в программе — нет

loadName = ctypes.util.find_library('AmiCoPyJava')
print loadName

попробовал сделать так:

>>> a = ctypes.util.find_library('AmiCoPyJava') 
>>> print a
libAmiCoPyJava.so.1
>>> k = ctypes.CDLL(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/ctypes/__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: /usr/local/lib/amico/libAmiCoPyJava.so.1: undefined symbol: JNI_CreateJavaVM
Odin
() автор топика
Ответ на: комментарий от Odin

>OSError: /usr/local/lib/amico/libAmiCoPyJava.so.1: undefined symbol:
JNI_CreateJavaVM

Это уже косяк в вашей библиотеке libAmiCoPyJava.so.1.

Попробуйте
ldd /usr/local/lib/amico/libAmiCoPyJava.so.1

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

ldd /usr/local/lib/amico/libAmiCoPyJava.so.1

odin@odin-laptop:/usr/local/lib/amico$ ldd -d libAmiCoPyJava.so.1 
	linux-gate.so.1 =>  (0x00e02000)
	libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x006bf000)
	libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x00110000)
	libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00136000)
	libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00155000)
	/lib/ld-linux.so.2 (0x00c28000)
Odin
() автор топика
Ответ на: комментарий от anon_666

проблема решена внесением необходимых путей в LD_LIBRARY_PATH.

Спасибо! =)

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