Почему нет вызова fstab64 после прочтения? И может ли это быть проблемой? - PullRequest
0 голосов
/ 29 мая 2019

Я хочу создать новую динамическую библиотеку вместо другой, исходный код которой утерян. Я создал библиотеку с экспортированными функциями, но программа не загружает ее. Заключение 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)

1 Ответ

1 голос
/ 29 мая 2019

Вы пытаетесь загрузить 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.

...