0

我有以下测试代码:

#include <stdio.h>

int main(void)
{
    fprintf(stderr, "This is a test.\n");
    int ret = open("somefile.log", 1);
    fprintf(stderr, "Return value is %d.\n", ret);
    return 0;
}

编译gcc -m64 test.c -o test

如果我运行truss ./test,我最终会看到以下输出:

getrlimit(RLIMIT_STACK, 0xFFFFFFFF7FFFE280)     = 0
getpid()                                        = 1984 [1983]
setustack(0xFFFFFFFF7EE002C0)
fstat(2, 0xFFFFFFFF7FFFDAA0)                    = 0
This is a test.
write(2, " T h i s   i s   a   t e".., 16)      = 16
open("somefile.log", O_WRONLY)                  = 3
Return value is write(2, " R e t u r n   v a l u e".., 16)      = 16
3.
write(2, " 3 .\n", 3)                           = 3
_exit(0)

我想挂钩 open 系统调用并在调用 open 完成之前执行一些代码。我已阅读有关使用 ptrace 执行此操作的信息,但是我在此系统 (solaris) 上没有 sys/ptrace.h。我看到文档说明应该使用 /proc 调试接口而不是 ptrace(),但我无法弄清楚如何使用 procfs 来做我想做的事情。

有谁知道这是否可能?如果是这样,怎么做?

作为旁注,我还尝试使用 LD_PRELOAD 技巧在我自己的共享库中实现 open 系统调用,并让它调用 dlsym 来查找常规 open 系统调用的地址。我无法 100% 弄清楚为什么这不起作用,但它似乎与内联调用有关,而不是使用地址表来查找这些函数。然而,不知何故truss能够检测到对 open() 的调用。

这是我尝试的代码:

cat wrap_open.c

#define _GNU_SOURCE

#include <dlfcn.h>
#include <stdio.h>

static int (*next_open) (const char *path, int oflag, /* mode_t mode */) = NULL;

int open(const char *path, int oflag)
{
    char *msg;

    if(next_open == NULL) {

            fprintf(stderr, "wrapping open\n");

            next_open = dlsym(RTLD_NEXT, "open");

            if((msg = dlerror()) != NULL) {
                    fprintf(stderr, "open: dlopen failed: %s\n", msg);
            } else {
                    fprintf(stderr, "open: wrapping done\n");
            }

    }

    fprintf(stderr, "open: opening %s\n", msg);
    fflush(stderr);

    return next_open(path, oflag);
}

编译与gcc -fPIC -shared -Wl,-soname,libwrap_open.so.1 -ldl -o libwrap_open.so.1.0 执行LD_PRELOAD_32=./libwrap_open.so.1.0 ./test

我没有从这里的共享库中得到任何输出。只有正常的程序输出。

任何帮助或指针表示赞赏。提前致谢。

4

1 回答 1

0

我的错误比你想象的还要愚蠢。

这是我的编译命令

gcc -g -m64 -fPIC -shared -ldl -o libwrap_open64.so.1.0

这是正确的命令

gcc -g -m64 -fPIC -shared -ldl -o libwrap_open64.so.1.0 wrap_open.c

我猜第一个命令会构建一个没有任何内容的库。我通过运行发现了问题,nm -g libwrap_open64.so.1.0发现我的函数没有被导出。在我意识到我什至没有编译我的代码之前,我有点头晕目眩......

于 2013-10-22T22:22:24.887 回答