为什么读取后没有调用fstab64?这会是一个问题吗?

时间:2019-05-29 12:04:04

标签: c linux strace lib

我想创建一个新的动态库,而不是另一个动态库,该动态库的源代码丢失了。我已经创建了具有导出功能的库,但是程序未加载它。结论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 个答案:

答案 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选项进行编译和链接。