什么是export?
有什么区别:
export name=value
Run Code Online (Sandbox Code Playgroud)
和
name=value
Run Code Online (Sandbox Code Playgroud) 我的代码如下: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).
如果您使用:
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已从环境中删除.