基本用法
我第一次见到LD_DEBUG
的使用,是下面这种方式(其实也是最常用的方式,我猜的):
1 | $ LD_DEBUG=bindings ./hello |
当时觉得很神奇,有点像魔法,不过经过一些思考,还是发现了一些端倪。根据一些
经验,猜测前面的LD_DEBUG=bindings
可能是要在 shell 里定义变量,但又不同于
一般的定义形式,觉得可能是临时定义一个变量。于是写一个程序打印出环境变量看
一下,果然是这样:
1 |
|
打印出来确实是有这个变量的,程序结束后环境变量中也没有这个项(可以使用env
命令打印出所有环境变量),确认是临时的变量。其实也可以在 shell 里直接
定义这个变量,但因为这个变量的存在会使动态链接器/加载器输出一些信息,所以不
推荐这么做。
LD_DEBUG
影响了谁?
LD_DEBUG
会影响动态链接器/加载器(dynamic linker/loader),即ld.so
、ld-linux.so*
的运行,完整的文档可以查看man ld.so
。以下翻译一下[1]中的问
题答案:
LD_DEBUG
在这里只是一个环境变量,且你把值libs
赋给了它。这除了会把LD_DEBUG
添加到你运行的命令的环境里并不会有其他的用处。当你运行一个动态链接的可执行文件,
ld.so(8)
须要首先进行运行时链接和符号
解析。动态链接器和其他任何程序一样都可以读取环境变量。链接器谈会读取LD_DEBUG
和其他一些环境变量,并根据它们来改变自己的行为。手册里有所有会
影响动态链接器行为的环境变量名称。
这个回答已经说得很清楚了。使用LD_DEBUG=help
可以查看所有可以取得的值,其他
的一些变量名称还包括LD_ASSUME_KERNEL
、LD_LIBRARY_PATH
、LD_PRELOAD
、LD_ORIGIN_PATH
等。
References
[1] how an expression which contains LD_DEBUG is processed?
[2] 在 Linux 下学习 C 语言有什么好处?
[3] man ld.so