我的库中有 glibc 提供的相同重写的open();我首先在我的库中设置了LD_PRELOAD
,所以当进程调用open()
时,我的库中定义的open被调用。
问题: - glibc 中还有其他一些函数,一旦这样的示例为getpt()
,当getpt()
调用open()
时调用open(),调用 glibc 中定义的open()
,如何让getpt()
调用我的库()中定义的open()
。
约束: - 我没有选择编译glibc。
答案 0 :(得分:1)
我只需在库中定义getpt()函数就可以在编译时解决它。
这个解决方案是不完整的,因为glibc中可能有其他函数[除了getpt()]可以调用open,然后调用glibc中的open调用。
我现在可以使用这个解决方案,但是我将来需要完全修复它。
答案 1 :(得分:0)
我认为你不能用LD_PRELOAD做到这一点。
如果您查看libc的反汇编(使用例如objdump --disassemble /lib64/libc.so.6 | grep -A20 "<getpt>:"
,您可以看到getpt()
调用__open()
,这是open()
的别名。
000000000011e9d0 <posix_openpt>:
11e9d0: 53 push %rbx
[...]
11e9ee: e8 dd d9 fb ff callq dc3d0 <__open>
然而,对__open的调用是PC相对调用,不通过PLT - 这意味着你可以不用LD_PRELOAD插入符号,因为libc中的所有调用都不会使用PLT。这可能是因为libc与-BSymbolic
链接。
剩下的唯一选择是执行 strace 所做的事情,并使用 ptrace 附加到流程。有关其工作原理,请参阅this question。