- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我创建一个 .dylib 文件并编译它:
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
static void* (*real_malloc)(size_t);
void *malloc(size_t size)
{
void *p = NULL;
fprintf(stderr, "malloc(%zd) = ", size);
p = real_malloc(size);
fprintf(stderr, "%p\n", p);
return p;
}
void __attribute((constructor))init()
{
real_malloc = (decltype(real_malloc))dlsym(RTLD_NEXT, "malloc");
if (NULL == real_malloc) {
fprintf(stderr, "Error in `dlsym`: %s\n", dlerror());
return;
}
}
然后我创建一个调用 malloc
的测试程序。我确保未优化对 malloc 的调用。
接下来我运行了以下命令:
DYLD_PRINT_LIBRARIES=1 X=1 DYLD_INSERT_LIBRARIES=./libTestHook.dylib ./malloctest
它加载它但它根本不 Hook 函数..有什么想法吗?我在 El Capitan 升级之前尝试了这段代码,它曾经工作过。我还让 malloc 抛出一个异常,只是为了看看它是否被调用。不是。
我错过了什么?
结果是:
sh-3.2# DYLD_PRINT_LIBRARIES=1 X=1 DYLD_INSERT_LIBRARIES=./libTestHook.dylib ./malloctest clear
dyld: loaded: /Users/Brandon/Desktop/./malloctest
dyld: loaded: ./libTestHook.dylib
dyld: loaded: /usr/lib/libc++.1.dylib
dyld: loaded: /usr/lib/libSystem.B.dylib
dyld: loaded: /usr/lib/libc++abi.dylib
dyld: loaded: /usr/lib/system/libcache.dylib
dyld: loaded: /usr/lib/system/libcommonCrypto.dylib
dyld: loaded: /usr/lib/system/libcompiler_rt.dylib
dyld: loaded: /usr/lib/system/libcopyfile.dylib
dyld: loaded: /usr/lib/system/libcorecrypto.dylib
dyld: loaded: /usr/lib/system/libdispatch.dylib
dyld: loaded: /usr/lib/system/libdyld.dylib
dyld: loaded: /usr/lib/system/libkeymgr.dylib
dyld: loaded: /usr/lib/system/liblaunch.dylib
dyld: loaded: /usr/lib/system/libmacho.dylib
dyld: loaded: /usr/lib/system/libquarantine.dylib
dyld: loaded: /usr/lib/system/libremovefile.dylib
dyld: loaded: /usr/lib/system/libsystem_asl.dylib
dyld: loaded: /usr/lib/system/libsystem_blocks.dylib
dyld: loaded: /usr/lib/system/libsystem_c.dylib
dyld: loaded: /usr/lib/system/libsystem_configuration.dylib
dyld: loaded: /usr/lib/system/libsystem_coreservices.dylib
dyld: loaded: /usr/lib/system/libsystem_coretls.dylib
dyld: loaded: /usr/lib/system/libsystem_dnssd.dylib
dyld: loaded: /usr/lib/system/libsystem_info.dylib
dyld: loaded: /usr/lib/system/libsystem_kernel.dylib
dyld: loaded: /usr/lib/system/libsystem_m.dylib
dyld: loaded: /usr/lib/system/libsystem_malloc.dylib
dyld: loaded: /usr/lib/system/libsystem_network.dylib
dyld: loaded: /usr/lib/system/libsystem_networkextension.dylib
dyld: loaded: /usr/lib/system/libsystem_notify.dylib
dyld: loaded: /usr/lib/system/libsystem_platform.dylib
dyld: loaded: /usr/lib/system/libsystem_pthread.dylib
dyld: loaded: /usr/lib/system/libsystem_sandbox.dylib
dyld: loaded: /usr/lib/system/libsystem_secinit.dylib
dyld: loaded: /usr/lib/system/libsystem_trace.dylib
dyld: loaded: /usr/lib/system/libunc.dylib
dyld: loaded: /usr/lib/system/libunwind.dylib
dyld: loaded: /usr/lib/system/libxpc.dylib
dyld: loaded: /usr/lib/libobjc.A.dylib
dyld: loaded: /usr/lib/libauto.dylib
dyld: loaded: /usr/lib/libDiagnosticMessagesClient.dylib
A
B
C
D
最佳答案
我原来帖子中的代码曾经在 Yosemite 上运行。在 El Capitan 上,它不起作用。我最终采用了以下方法 (DYLD_INTERPOSE
+ DYLD_INSERT_LIBRARIES
):
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#define DYLD_INTERPOSE(_replacment,_replacee) \
__attribute__((used)) static struct{ const void* replacment; const void* replacee; } _interpose_##_replacee \
__attribute__ ((section ("__DATA,__interpose"))) = { (const void*)(unsigned long)&_replacment, (const void*)(unsigned long)&_replacee };
void* pMalloc(size_t size) //would be nice if I didn't have to rename my function..
{
printf("Allocated: %zu\n", size);
return malloc(size);
}
DYLD_INTERPOSE(pMalloc, malloc);
关于c - DYLD_LIBRARY_PATH 和 DYLD_INSERT_LIBRARIES 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34114587/
我有一个我正在尝试运行的简单 C++ 程序,它与我之前构建的 Boost.Thread 库版本相关联。我似乎无法理解运行时库路径在 OS X 上的行为方式。 因为我的 Boost 库没有 RPATH-
我是 Xcode 和 Mac 环境的新手。我正在使用一些动态和静态库,如 boost、Clucene 等。我有所有的库 MyApp.app/Contents/Resources 我想将此路径设置为应用
我在 OSX 10.9 和 PHP 5.4.19 上使用 Xamppp for macos 我已经安装了 oracle Instantclient,我可以看到 oci8 在 phpinfo 中启用(如
我创建一个 .dylib 文件并编译它: #define _GNU_SOURCE #include #include static void* (*real_malloc)(size_t); vo
我正在使用 openCV 库进行计算机视觉研究,并且在编译时遇到了一些问题,这些问题让我尝试了解操作系统如何将库与源代码链接起来。在互联网上寻找了一段时间以获得良好的概述并阅读 g++/gcc 的手册
要在我的 Mac 上运行 mysql,我总是必须在终端上发送此命令: export DYLD_LIBRARY_PATH=/usr/local/mysql/lib/ 如何解决这个问题? 最佳答案 将其插
我正在使用 Python 2.7 并尝试导入 graph_tool,我的 libboost_thread-mt.dylib 似乎位于/opt/local/lib 而不是/usr/local/lib。
我已经看过两打关于这个问题的帖子,但我太菜鸟了,我不确定如何正确修改所有内容。 我正在尝试完成安装,但是当我转到 Python 并“导入 MySQLdb”时,我最终得到: ImportError: d
免责声明:这个问题始于 GitHub issue . 问题 我会放the X question就在前面: 有谁知道设置DYLD_LIBRARY_PATH的方法以 Excel 2016 将在 MacOS
我有一个 Perl CGI 脚本,当我使用 ./roster_return.cgi StudentID=101095 从命令行运行它时,它工作正常,但是当我在 MAMP (http://localho
我读到一些文章不鼓励使用 DYLD_LIBRARY_PATH,因为动态库的路径应该使用 -install_name、@rpath 和 @loader_path 来固定。 就制作一个同时在 Linux
这是我的: Mac 操作系统 10.11 El Capitan python 2.7.12,从 python.org 安装在 /Library/Frameworks/Python.framework/
在终端中安装 matlab python 包后使用: cd "matlabroot\extern\engines\python" python setup.py install 尝试运行它时,出现段错
在 macOS Sierra 10.12.6 上,环境变量 LD_LIBRARY_PATH os.system() 不能使用, subprocess.run()和 subprocess.Popen()
我是一名优秀的程序员,十分优秀!