c_include_path与ld_library_path的区别

9
在Ubuntu 12.04或Springdale 6.4上使用gcc和g++编译时,C_INCLUDE_PATH(或CPLUS_INCLUDE_PATH)和LD_LIBRARY_PATH有什么区别? LD是只在运行时使用,另外两个是只在编译时使用吗?由于在这些操作系统上,GCC似乎会忽略INCLUDE和LIBRARY_PATH环境变量,因此我应该设置哪个变量来构建我的~/.bashrc文件,使其在现代Linux操作系统中尽可能地可移植(除了实际路径的更改)?

1
在你的 makefile 中直接定义它们是非常便携的。 - Duck
1个回答

6

LD_LIBRARY_PATH是一个环境变量,它告诉dll加载器在启动可执行文件时应查找哪些目录中的动态库。该变量是危险且已被弃用

LIBRARY_PATH - 在构建exe或lib时告诉链接器在哪里查找库 INCLUDE_PATH - 告诉编译器在 #include 语句中引用的文件在哪里查找

无论如何,LIBRARY_PATH和INCLUDE_PATH应在特定的构建系统中设置,而不是在bashrc中设置。脚本越容易构建c源文件,你的电脑就越有可能感染rootkit(恶意软件)。

顺便说一下: gcc是一个包装器,它调用适当的编译器(例如cc或g++)和链接器。 g ++是gnu c ++编译器

编辑 解释为什么LD_LIBRARY_PATH是危险的。

我已经好几年没有使用Linux了,我想知道这个环境变量是否仍存在于当前的发行版中。当我使用Linux时(大约在2006年左右),它被视为已弃用,因为它提供了非常容易被利用的钩子。

问题在于它规定了ld.so - 动态链接器查找所需库的路径顺序。如果LD_LIBRARY_PATH包含一个可写目录,黑客(现在称为网络犯罪分子)可以在该目录中放置一个名称类似于在系统目录中找到的库文件(例如/usr/lib)的库文件。该库文件可以首先执行任何不良操作,然后调用原始库文件。利用LD_LIBRARY_PATH比攻击系统目录中的二进制文件要容易得多。此外,这种攻击方式很难被检测出。


有趣的是,我不知道 LD_LIBRARY_PATH 已被弃用。你能提供一个更好的参考吗?因为我没有从你链接的文章中理解到这一点。 - CB Bailey
你知道LD_LIBRARY_PATH是否仍然不被推荐使用吗?在高性能计算中,这是非常常见的用于用户空间程序安装和加载的环境模块 - Levi Morrison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接