我想创建一个新的动态库,而不是另一个动态库,该动态库的源代码丢失了。我已经创建了具有导出功能的库,但是程序未加载它。结论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)
答案 0 :(得分:1)
您正在尝试将64位共享对象加载到32位进程中。
这两个read()
调用读取的ELF header:
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
选项进行编译和链接。