如何在 LD_PRELOAD 库中获取命令行参数
How to get command line arguments inside LD_PRELOAD library
我想从 LD_PRELOAD 库中获取 argv,例如,假设我们调用
LD_PRELOAD=/path/to/my/fopen ./program input
在我的自定义 fopen 中,我想获得“输入”,因此是我程序的 argv[1](还有 argv[2] 等等)。
可能吗?怎么样?
读取整个 /proc/self/cmdline
文件。命令行参数用 [=13=]
.
分隔
有关完整详细信息,请参阅 man proc
。
Linux 没有 C 标准库或错误处理的示例:
#include <unistd.h>
#include <fcntl.h>
#include <linux/limits.h>
int main() {
ssize_t i, n;
char cmdline[ARG_MAX];
int cmdline_fd = open("/proc/self/cmdline", O_RDONLY);
n = read(cmdline_fd, cmdline, sizeof cmdline);
for(i = 0; i < n; ++i)
if(!cmdline[i])
cmdline[i] = ' ';
cmdline[n - 1] = '\n';
write(STDOUT_FILENO, cmdline, n);
return 0;
}
Python版本供参考:
cmdline = open('/proc/self/cmdline', 'r').read().replace('[=11=]', ' ').strip()
print(cmdline)
我想从 LD_PRELOAD 库中获取 argv,例如,假设我们调用
LD_PRELOAD=/path/to/my/fopen ./program input
在我的自定义 fopen 中,我想获得“输入”,因此是我程序的 argv[1](还有 argv[2] 等等)。 可能吗?怎么样?
读取整个 /proc/self/cmdline
文件。命令行参数用 [=13=]
.
有关完整详细信息,请参阅 man proc
。
Linux 没有 C 标准库或错误处理的示例:
#include <unistd.h>
#include <fcntl.h>
#include <linux/limits.h>
int main() {
ssize_t i, n;
char cmdline[ARG_MAX];
int cmdline_fd = open("/proc/self/cmdline", O_RDONLY);
n = read(cmdline_fd, cmdline, sizeof cmdline);
for(i = 0; i < n; ++i)
if(!cmdline[i])
cmdline[i] = ' ';
cmdline[n - 1] = '\n';
write(STDOUT_FILENO, cmdline, n);
return 0;
}
Python版本供参考:
cmdline = open('/proc/self/cmdline', 'r').read().replace('[=11=]', ' ').strip()
print(cmdline)