macos - 防止函数插入链接到执行插入的库的库中
问题描述
好吧,我找不到适合我的问题标题的简短短语,但这就是我的意思:
我有一个库,其中插入了一些系统调用,例如open(2)
. 我使用这种方法进行设置。我添加它以DYLD_INSERT_LIBRARIES
实现我的目标。
包含插入代码的库是a.dylib
.
我需要链接一个库b.dylib
,a.dylib
因为它包含一些a.dylib
需要的功能。
问题是也a.dylib
插入b.dylib
了我不想要的功能。
我不是链接专家。有什么方法可以防止这种行为,发生这种情况的原因是什么?
更新:
这是如何b.dylib
构建的:
clang -dynamiclib -fPIC -Wextra -Wall -pedantic -Wl,-single_module <object files> -o b.dylib -install_name <path>
这是如何a.dylib
构建的:
clang -dynamiclib -fPIC -Wextra -Wall -pedantic -Wl,-single_module <object files> -o a.dylib -install_name <path> b.dylib
仅a.dylib
添加到DYLD_INSERT_LIBRARIES
.
解决方案
您说a.dylib
取决于b.dylib
但b.dylib
不取决于a.dylib
并且您不希望任何呼叫b.dylib
被插入。您open
举了一个插入函数的例子。
我给出的示例是a.dylib
需要调用processFile
其中定义的b.dylib
并打开文件。您不希望open
调用b.dylib
被插入(无论是否a.dylib
加载)。
我知道解决这个问题的唯一方法是processFile
动态加载 C 库,而不是让它ld
自动加载。
这种方法有两个问题。第一个是每个需要调用的函数open
都需要一个额外if
的语句来执行代码来解析符号。
另一个是您需要提前知道要加载的 C 库的文件名。如果解决符号有问题,那么您必须处理大多数程序不必处理的情况;至少在以后的时间。
代码将如下所示:
void processFile (char * filename) {
FILE *fp;
// c_open can have file scope if thread safety isn't needed
static int (*c_open)() = NULL;
if (c_open == NULL) {
// factor this if more than one function needs open
void *dlh = dlopen(C_LIBRARY_FILENAME, RTLD_LAZY);
if (dlh == NULL) {
perror("cannot load C library");
exit(1);
}
c_open = dlsym(dlh, "open");
if (c_open == NULL) {
perror("cannot resolve open in the C library");
exit(1);
}
}
c_open(filename, O_RDONLY);
...
}
更新
如果不指定 C 库的完整路径名,dlopen
可能会打开意外文件。
推荐阅读
- azure-devops - Azure DevOps 中的聊天功能
- odoo - 为什么这个域没有给我结果?
- python - CP-SAT 中的性能问题
- sql - 从日期范围计算特定日期的分钟数
- google-cloud-platform - 如何使用 Airflow 将 BigQuery 分区导出到 GCS
- java - 从 excel 文件中读取并加载到 SOAP UI 请求中
- javascript - 可以使用 Workbox 缓存策略在页面请求图像之前预加载图像吗?
- elasticsearch - 当自定义分析器明确不使用它时,仍会应用 Elasticsearch 小写过滤器
- android - 在使用数据绑定和 MVVM 将新数据放入活动之前,旧视图数据会短暂出现在活动中
- python - 如何在两个不同的数据框中搜索一个值并将其添加到第三个?