Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 阻止对“dlsym”的调用(RTLD\U下一步)_C_Macos_Macos Mojave_Dlsym - Fatal编程技术网

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;
}