为什么读取后不调用 fstab64?这会成为问题吗?

Why no call fstab64 after read? And can this be a problem?

我想创建一个新的动态库而不是另一个,它的源代码丢失了。我创建了一个带有导出函数的库,但程序没有加载它。结论 Strace 几乎相同,唯一的区别是在调用 read() 之后加载我的库的情况下没有调用 fstat64()。

strace原库:

open("/usr/local/lpr/li2/libSA.so", O_RDONLY) = 12
read(12, "7ELF[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]09[=10=]"...,     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, "7ELF[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]>[=11=][=11=][=11=][=11=]`0[=11=][=11=]"...,     1024) = 1024
close(12)                               = 0
time(NULL)

您正在尝试将 64 位共享对象加载到 32 位进程中。

这两个read()调用读取的ELF header

read(12, "7ELF[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]09[=10=]"...,     1024) = 1024

read(12, "7ELF[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]>[=11=][=11=][=11=][=11=]`0[=11=][=11=]"...,     1024) = 1024

不同。请注意第一个 read() 中的第五个字节是 1。那是成功加载32位共享对象。

第五个字节是 2 不成功 尝试 - 2 表示共享对象是 64 位共享对象。

您可能需要使用 -m32 选项进行编译和 link。