在Ubunteu 12.04或Springdale 6.4上,使用gcc和g++,C_INCLUDE_PATH
(或CPLUS_INCLUDE_PATH
)和LD_LIBRARY_PATH
之间有什么区别?LD
是否仅在运行时使用,其他两个仅在编译时使用?
由于INCLUDE
和LIBRARY_PATH
环境变量在这些操作系统上似乎被GCC忽略了,所以在构建~/.bashrc文件时,我应该设置哪个,以使其在现代Linux操作系统中尽可能地可移植(实际路径中的模更改)?
LD_LIBRARY_PATH是一个环境变量,当您启动可执行文件时,它告诉dll加载程序应该在哪些目录中查找动态库。该变量很危险,已弃用
LIBRARY_PATH-告诉链接器在生成exe或lib时也要查找库的位置INCLUDE_PATH-告诉在哪里查找#INCLUDE语句中引用的文件
在任何情况下,都应该在特定的构建系统中设置LIBRARY_PATH和INCLUDE_PATH,而不是在bashrc中。脚本越容易构建c源,你的电脑感染rootkit的可能性就越大。
BTW:gcc是一个包装器,它调用适当的编译器(例如cc或g++)和链接器。g++是gnu c++编译器
编辑解释为什么LD_LIBRARY_PATH是危险的。
我已经有几年没有使用Linux了,我想知道这个env变量是否仍在当前的发行版中。当我使用Linux(大约在2006年)时,它被认为是不推荐使用的,因为它提供了非常容易利用的钩子。
它的问题是,它规定了ld.so动态链接器查找所需库的路径顺序。如果LD_LIBRARY_PATH包含一个可写目录,黑客(在新的语音中是网络罪犯)可以在该目录中放置一个名称可能在系统目录(例如/usr/lib)中找到的库。这个库可以先做任何肮脏的工作,然后调用原始库。利用LD_LIBRARY_PATH要比破坏系统目录中的二进制文件容易得多。而且这种漏洞也很难被发现。