gpt4 book ai didi

c - 如何在共享库中使用 popen()?

转载 作者:行者123 更新时间:2023-12-01 13:39:44 25 4
gpt4 key购买 nike

当尝试在共享库中使用 popen() 并通过 LD_PRELOAD 或/etc/ld.so.preload 预加载它时,进程陷入无限循环,并显示一条错误消息,指出无法预加载共享库,或者系统只是卡住并需要重新启动,具体取决于代码。

请注意,不作为共享库编译 (gcc test.c; ./a.out) 将正常工作。

如果有帮助,我正在 VirtualBox 上运行全新安装的 Debian:

Linux debian 3.16.0-4-586 #1 Debian 3.16.36-1+deb8u2 (2016-10-19) i686 GNU/Linux

好的,所以这段代码:

#define _GNU_SOURCE
#include <stdio.h>

__attribute__((constructor, visibility("hidden")))
void init()
{
FILE *fp = popen("/usr/bin/id", "r");
pclose(fp);
}

第一种情况的结果:

root@debian:/mnt/group/hcfrk# gcc test.c -o test.so -std=c99 -shared -fPIC
root@debian:/mnt/group/hcfrk# LD_PRELOAD=./test.so whoami
ERROR: ld.so: object './test.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
ERROR: ld.so: object './test.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
ERROR: ld.so: object './test.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
ERROR: ld.so: object './test.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
# For eternity.

这段代码:

...
#include <limits.h>
...
{
FILE *fp = popen("/usr/bin/id", "r");

if(!fp)
puts("Error.\n");

char buf[PATH_MAX];

while(fgets(buf, sizeof buf, fp))
printf("%s\n", buf);

pclose(fp); // Never gets here: VM just freezes.
}

第二种情况的结果(系统卡住)。我怀疑这是因为 while 循环没有结束并导致不调用 pclose(),因为第一个代码示例也会在没有 pclose() 的情况下卡住系统。

如有任何帮助,我们将不胜感激。谢谢!

最佳答案

你不是在这里用 fork 轰炸吗? LD_PRELOAD 中的构造函数将导致 /usr/bin/id 永远执行自身(因为每个新实例都会预加载您的库),很可能会停止您的机器。在打开之前,您可能应该unsetenv

关于c - 如何在共享库中使用 popen()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41306687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com