如何在 Linux 上重新实现(或包装)系统调用函数?

2024-11-01 08:41:00
admin
原创
211
摘要:问题描述:假设我想要完全接管 open() 系统调用,也许是为了包装实际的系统调用并执行一些日志记录。一种方法是使用 LD_PRELOAD加载接管 open() 入口点的(用户制作的)共享对象库。open()然后,用户编写的 open() 例程通过dlsym()ing 并调用它来获取指向 glibc 函数的指...

问题描述:

假设我想要完全接管 open() 系统调用,也许是为了包装实际的系统调用并执行一些日志记录。一种方法是使用 LD_PRELOAD加载接管 open() 入口点的(用户制作的)共享对象库。

open()然后,用户编写的 open() 例程通过dlsym()ing 并调用它来获取指向 glibc 函数的指针。

但是,上面提出的解决方案是动态解决方案。假设我想静态链接自己的包装器。我该怎么做?我猜机制是一样的,但我还猜想用户定义和 libcopen()之间会发生符号冲突。open()`open()`

请分享任何其他技术来实现相同目标。


解决方案 1:

您可以使用 提供的换行功能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
", 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

解决方案 2:

链接器按照您在命令行中列出的顺序解析符号,因此如果您在标准库之前列出您的库,您将具有优先级。对于 gcc,您需要指定

gcc <BLAH> -nodefaultlibs <BLAH BLAH> -lYOUR_LIB <OTHER_LIBS>

这样,您的图书馆就会首先被搜索并找到。

解决方案 3:

对于 linux 和 GNU libc,该库内置了对拦截和重新实现库中任何函数的支持。

如果您定义任何 libc 函数的自己的版本,并在 libc 之前链接它(因此将其作为可执行文件的一部分,或者在链接命令上 -lc 之前链接的库中,或者LD_PRELOAD如果 libc 是动态链接的,甚至加载),它将被调用而不是 libc 版本(甚至在 libc 本身的其他函数中调用)。然后,您可以使用前缀调用该函数__libc_来获取库中的实际版本(尽管您需要自己声明该符号。)例如:

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>

       extern int __libc_open(const char *pathname, int flags, mode_t mode);

       int open(const char *pathname, int flags, mode_t mode) {
           return __libc_open(pathname, flags, mode);
       }
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3878  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2714  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   49  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   49  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   49  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用