覆盖libc open()库函数

时间:2014-03-26 17:26:48

标签: linux gcc override ld glibc

我的库中有 glibc 提供的相同重写的open();我首先在我的库中设置了LD_PRELOAD,所以当进程调用open()时,我的库中定义的open被调用。

问题: - glibc 中还有其他一些函数,一旦这样的示例为getpt(),当getpt()调用open()时调用open(),调用 glibc 中定义的open(),如何让getpt()调用我的库()中定义的open()

约束: - 我没有选择编译glibc。

2 个答案:

答案 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