相关疑难解决方法(0)

883
推荐指数
10
解决办法
36万
查看次数

即使在unsetenv("LD_PRELOAD")之后,LD_PRELOAD也会影响新的孩子

我的代码如下:preload.c,具有以下内容:

#include <stdio.h>
#include <stdlib.h>

int  __attribute__((constructor))  main_init(void)
{
    printf("Unsetting LD_PRELOAD: %x\n",unsetenv("LD_PRELOAD"));
    FILE *fp = popen("ls", "r");
    pclose(fp);
}
Run Code Online (Sandbox Code Playgroud)

然后在shell中(小心做第二个命令!!):

    gcc preload.c -shared -Wl,-soname,mylib -o mylib.so -fPIC
    LD_PRELOAD=./mylib.so bash
Run Code Online (Sandbox Code Playgroud)

!小心最后一个命令,它将导致无限循环的分叉"sh -c ls".用^ C后2秒钟停止它(或者更好^ Z然后看ps).

更多信息

  1. 这个问题在某种程度上与bash有关; 或者作为用户运行的命令,或者作为popen执行的bash.
  2. 其他关键因素:1)从预加载的库中执行popen,2)可能需要在库的初始化部分中执行popen.
  3. 如果您使用:

    LD_DEBUG=all LD_DEBUG_OUTPUT=/tmp/ld-debug LD_PRELOAD=./mylib.so bash
    
    Run Code Online (Sandbox Code Playgroud)

    而不是最后一个命令,您将获得许多ld-debug文件,名为/tmp/ld-debug.*.每个分叉过程一个.在所有这些文件中,您将看到首先在mylib中搜索符号.即使LD_PRELOAD已从环境中删除.

c linux bash shared-libraries popen

7
推荐指数
1
解决办法
5256
查看次数

标签 统计

bash ×2

linux ×2

c ×1

popen ×1

shared-libraries ×1

shell ×1