提问人:Berlin 提问时间:6/27/2023 最后编辑:MathieuBerlin 更新时间:6/28/2023 访问量:111
使用LD_PRELOAD时如何拦截普通符号?
How can I intercept normal symbols when using LD_PRELOAD?
问:
LD_PRELOAD
只是可以拦截动态符号,有什么方法可以拦截普通符号吗?
nm -D /usr/lib64/libc-2.17.so
显示动态符号。而这些符号可以通过使用 .LD_PRELOAD
但是我不知道如何拦截正常符号(显示所有正常符号)。nm libc-2.17.so
例如:是一个普通的符号,而不是一个动态的符号,我尝试过用我自己重写这个函数并用来拦截。但是使用时有一个错误:__opendirat
test.cpp
LD_PRELOAD
LD_DEBUG
/lib/libc.so.6: error: symbol lookup error: undefined symbol: __opendirat (fatal)
答:
0赞
Paul Floyd
6/28/2023
#1
您使用的术语有点令人困惑。
符号可见性主要有两种。局部(例如,“t”表示函数,如图所示 ny )和全局或外部(例如,“T”表示函数,如 所示)。nm
nm
由于局部函数只能从库内调用,因此它们使用静态链接。
全局函数可以从库外部调用,因此它们具有动态链接。
替换动态库中的静态函数是不可能的(至少使用像LD_PRELOAD这样的简单技术是不可能的。
评论
0赞
Berlin
6/28/2023
谢谢你的回答。看来我需要找到另一种方法来弄清楚。对不起,术语令人困惑。我提出的普通符号正是局部函数的含义。
评论
LD_PRELOAD
由动态链接器实现。它只能拦截它处理的符号。strip
extern "C"