【发布时间】:2023-03-18 16:42:02
【问题描述】:
我正在尝试挂钩一些适用于文件名的 glibc 函数。基本上我需要稍微修改文件名,然后将它与其他参数一起传递给原始 glibc 函数。
代码如下:
FILE *fopen(const char *filename, const char *modes) {
filename = modify(filename); // assuming we don't need to free the new filename pointer for now
using FuncT = FILE*(*) (const char *, const char *);
static FuncT originalFunc = (FuncT)dlsym(RTLD_NEXT, "fopen");
return originalFunc(filename, modes);
}
这在大多数情况下都可以正常工作,但是当涉及到像 int execl(const char *path, const char *arg, ...) 这样的函数的可变参数时,我该如何正确地做到这一点?
【问题讨论】:
-
标准库中常见的可变参数函数的版本采用
va_list参数,例如vsnprintf()。 -
在哪里可以找到这些采用 va_list 的函数,例如
execl? -
查找 va_list 版本是逐个案例。在
execl的具体情况下,documentation for execl 还提到了execv函数,看起来就像你想要的那样。 -
支持
using FuncT = FILE*(*) (const char *, const char *);等记号的C方言不是通常叫C++吗?还是glibc的一个特性? -
关于
FILE *fopen(const char *filename, const char *modes) {和filename = modify(filename);,因为参数filename是'指向字符常量的指针,不能修改文件名指向的数据。 这是一个常量,但是可以修改该指针
标签: c