Я хочу создать новую динамическую библиотеку вместо другой, исходный код которой утерян. Я создал библиотеку с экспортированными функциями, но программа ее не загружает. Заключение Strace почти такой же, разница только в том, что в случае загрузки моей библиотеки после вызова read() не происходит вызова fstat64().
оригинальная библиотека strace:
open("/usr/local/lpr/li2/libSA.so", O_RDONLY) = 12
read(12, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\3409\0"..., 1024) = 1024
fstat64(12, {st_mode=S_IFREG|0644, st_size=46166, ...}) = 0
old_mmap(NULL, 40256, PROT_READ|PROT_EXEC, MAP_PRIVATE, 12, 0) = 0x40150000
mprotect(0x40159000, 3392, PROT_NONE) = 0
old_mmap(0x40159000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 12, 0x8000) = 0x40159000
close(12) = 0
моя библиотека:
open("/usr/local/lpr/li2/libSA.so", O_RDONLY) = 12
read(12, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\210\0\0"..., 1024) = 1024
close(12) = 0
time(NULL)
загрузить с помощью «dlopen»
Тогда dlopen
потерпит неудачу или преуспеет? Если не получится, то с какой ошибкой?
Вы пытаетесь загрузить 64-битный общий объект в 32-битный процесс.
заголовок ELF, прочитанный этими двумя вызовами read()
:
read(12, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\3409\0"..., 1024) = 1024
а также
read(12, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\210\0\0"..., 1024) = 1024
отличаются. Обратите внимание, что пятый байт в первом read()
равен 1
. Это загрузка успешный 32-битного общего объекта.
Этот пятый байт — это 2
при попытке неудачный, и этот 2
означает, что общий объект является 64-битным общим объектом.
Вероятно, вам нужно скомпилировать и связать с опцией -m32
.
Вы связываетесь со своей библиотекой или загружаете ее с помощью
dlopen
?