C 阻止对“dlsym”的调用(RTLD\U下一步)
我正在尝试包装函数。为此,在注入动态库之后,我考虑使用C 阻止对“dlsym”的调用(RTLD\U下一步),c,macos,macos-mojave,dlsym,C,Macos,Macos Mojave,Dlsym,我正在尝试包装函数。为此,在注入动态库之后,我考虑使用dlsym获取内存中的实际函数位置 我现在运行的是macosmojave(10.14.6)和Apple-clangversion11.0.0(clang-1100.0.33.8) 我试图运行一个相当简单的代码,每次调用malloc时都显示一条消息 所以我用了这篇文章的代码: 我的测试代码是: #包括 int main() { (无效)malloc(1); (无效)malloc(1); 返回(0); } 我使用OSX上的DYLD\u INSE
dlsym
获取内存中的实际函数位置
我现在运行的是macosmojave(10.14.6)
和Apple-clangversion11.0.0(clang-1100.0.33.8)
我试图运行一个相当简单的代码,每次调用malloc
时都显示一条消息
所以我用了这篇文章的代码:
我的测试代码是:
#包括
int main()
{
(无效)malloc(1);
(无效)malloc(1);
返回(0);
}
我使用OSX上的DYLD\u INSERT\u LIBRARIES=./mylib.so DYLD\u FORCE\u FLAT\u NAMESPACE=1
和Ubuntu上的LD\u PRELOAD=./mylib.so
注入了动态库
在OSX上,程序阻塞了dlsym
调用,在Ubuntu docker框中,程序运行正常
编辑:
作为@R。。指出,OSX上的
dlsym
实现正在调用malloc(参见来源:)调用dlsym
可能会导致对malloc
的递归调用,这反过来会导致对dlsym
的递归调用,这会导致第二次死锁,因为它已经持有一些锁。使用预加载库来包装malloc
,而不是完全替换它,这通常是一个坏主意,因为这一点和其他原因
您可以使用OSX上的
LD_AUDIT
或等效功能(如果有)打印调用malloc
时的跟踪。否则,您可以使用调试输出插入一个完整的替换malloc。由于调用fprintf()
,您也可能陷入无限递归,因此使用此代码插入malloc()
是危险的(从中复制):
库代码,如
fprintf()
可能调用malloc()
,因为此方法适用于打开的function@GrandChaman:因为dlsym
不调用open
。当然,dlsym
调用malloc
确实是一种糟糕的设计,因为这意味着dlsym
可能会在内存不足的情况下错误地失败,但这是我从苹果的libc中期望的实现质量不好的一种……请注意,fprintf()
也可以调用malloc()
,还有一条通向无限递归的路,我试着把它们去掉,但也没用。我将问题缩小到dlsym
调用本身(使用write
进行调试)
void *malloc(size_t size)
{
void *p = NULL;
fprintf(stderr, "malloc(%d) = ", size);
p = real_malloc(size);
fprintf(stderr, "%p\n", p);
return p;
}