使用静态链接的 musl 覆盖文件访问函数(以实现只读虚拟 FS)

问题描述 投票:0回答:1

如果

dlsym
在动态链接设置中可用,我可以使用
dlsym
RTLD_NEXT
访问原始 impl 指针,并在我的覆盖中使用它们,例如如下:

// paste these in main.c

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <dlfcn.h>

int open(const char *path, int flags)
{
    fprintf(stderr, "log_file_access_preload: open(\"%s\", %d)\n", path, flags);

    typedef int (*orig_open_func_type)(const char *pathname, int flags);
    orig_open_func_type orig_func = (orig_open_func_type)dlsym(RTLD_NEXT, "open");
    return orig_func(path, flags);
}

FILE* fopen(const char *path, const char *mode)
{
    fprintf(stderr, "log_file_access_preload: fopen(\"%s\", \"%s\")\n", path, mode);

    typedef FILE* (*orig_fopen_func_type)(const char *path, const char *mode);
    orig_fopen_func_type orig_func = (orig_fopen_func_type)dlsym(RTLD_NEXT, "fopen");
    return orig_func(path, mode);
}

有没有一种方法可以以不隐藏原始 libc/POSIX 符号的方式进行静态链接,以便我可以在覆盖中使用它们?我应该使用重命名的原始符号创建自己的 musl

*.a
文件副本吗?应该有效吗?还有别的办法吗?

用例:为自定义 LaTeX 程序(编译过程由我控制,使用 musl 静态构建)实现文件读取/访问功能的重定向,以从 ISO 或 TAR 存档(包含准备好的 TeX 目录结构)读取文件,而无需提取到磁盘

c static-linking musl
1个回答
0
投票

我目前的解决方案(如@KamilCuk 的评论中所讨论):

cp $(cc -print-file-name=libc.a) libcmy.a
ar x libcmy open.lo close.lo read.lo stat.lo fstat.lo lseek.lo access.lo fopen.lo fileno.lo
objcopy --redefine-sym open=orig_open       open.lo
objcopy --redefine-sym close=orig_close    close.lo
objcopy --redefine-sym read=orig_read       read.lo
objcopy --redefine-sym stat=orig_stat       stat.lo
objcopy --redefine-sym fstat=orig_fstat    fstat.lo
objcopy --redefine-sym lseek=orig_lseek    lseek.lo
objcopy --redefine-sym access=orig_access access.lo
objcopy --redefine-sym fopen=orig_fopen    fopen.lo
objcopy --redefine-sym fileno=orig_fileno fileno.lo
ar rs libcmy.a open.lo close.lo read.lo stat.lo fstat.lo lseek.lo access.lo fopen.lo fileno.lo

然后用

libcmy.a
而不是普通的
-lc
进行链接。

然后在代码中我们可以为这些orig函数添加原型并使用orig函数定义新函数。

© www.soinside.com 2019 - 2024. All rights reserved.