假设我想完全接管open()系统调用,也许要包装实际的syscall并执行一些日志记录。一种方法是使用LD_PRELOAD加载(用户制作的)共享对象库,该库将接管open()入口点。
然后,用户制作的open()例程open()
通过dlsym()
调用glibc函数来获取它的指针。
但是,以上提出的解决方案是动态解决方案。假设我想open()
静态链接我自己的包装器。我该怎么办?我猜想机制是一样的,但我也猜想用户定义open()
和libc
之间会有符号冲突open()
。
请分享其他任何技术来达到相同的目标。
您可以使用提供的包装功能ld
。来自man ld
:
--wrap symbol
对符号使用包装函数。对的任何未定义引用symbol
都将解析为__wrap_symbol
。对的任何未定义引用
__real_symbol
都将解析为symbol
。
因此,您只需要__wrap_
在包装函数中使用前缀,并__real_
在要调用实函数时使用前缀即可。一个简单的例子是:
malloc_wrapper.c
:
#include <stdio.h>
void *__real_malloc (size_t);
/* This function wraps the real malloc */
void * __wrap_malloc (size_t size)
{
void *lptr = __real_malloc(size);
printf("Malloc: %lu bytes @%p\n", size, lptr);
return lptr;
}
测试应用testapp.c
:
#include <stdio.h>
#include <stdlib.h>
int main()
{
free(malloc(1024)); // malloc will resolve to __wrap_malloc
return 0;
}
然后编译应用程序:
gcc -c malloc_wrapper.c
gcc -c testapp.c
gcc -Wl,-wrap,malloc testapp.o malloc_wrapper.o -o testapp
结果应用程序的输出将是:
$ ./testapp
Malloc: 1024 bytes @0x20d8010
问题内容: 问题是创建现有对象的动态增强版本。 我无法修改的。相反,我必须: 子类化 将现有对象包装在新对象中 将所有原始方法调用委托给包装的对象 实现另一个接口定义的所有方法 要添加到现有对象的接口是: 使用Byte Buddy,我设法继承了类并实现了我的接口。问题是委派给包装的对象。我发现做到这一点的唯一方法是使用反射速度太慢(我在应用程序上负担很重,性能至关重要)。 到目前为止,我的代码是:
问题内容: 我正在尝试在Amazon Linux实例上安装OpenCV与Pastec一起使用。这是我第一次使用Amazon服务,而且我对Linux的使用经验不足。 我将如何安装OpenCV及其对Amazon Linux的依赖关系? 我尝试使用以下命令添加EPEL存储库: …可以,但是仍然无法安装OpenCV … 问题答案: 似乎 Amazon AMI的* 默认存储库不包含 OpenCV 软件包。
问题内容: 注意:最初发布时,我正在尝试安装maven2。由于主要答案是针对maven3的,因此我更新了标题。问题的其余部分仍然保持原来的状态。 我正在尝试使用以下命令在Redhat Linux框上安装Maven2 但是,yum似乎无法找到maven2。 我遇到过有关该主题的其他帖子,但是对以下帖子的回答建议添加存储库。我添加了所述存储库,但是在添加它们后遇到了错误。 我只能通过命令行访问此框,因
问题内容: 我看过有关使用yum安装依赖项,然后从源代码安装Node.JS和NPM的文章。虽然这样做确实可行,但我觉得Node.JS和NPM都应该放在某个公共仓库中。 如何在AWS Amazon Linux上的一个命令中安装Node.JS和NPM? 问题答案: 迷迷糊糊地发现,后来很难再次找到。后代放在这里: 编辑3: 自2016年7月起, 编辑1 不再适用于nodejs 4(和 编辑2 都不适用
我已经看到了关于使用yum安装依赖项,然后从源代码处安装node.js&NPM的文章。虽然这确实起作用,但我觉得Node.js和NPM都应该在某个地方公开回购。 如何在AWS Amazon Linux上用一个命令安装node.js和NPM?
注:这是一个老问题,答案反映了当时的世界。现代的Ubuntu发行版都有OpenJDK,可以使用 我正在尝试在Ubuntu Linux发行版上安装Java开发工具包(JDK),但我无法安装它。 在Ubuntu上安装它的步骤是什么?