2010-03-09 55 views
2

我坐在一个我没有真正控制的环境中(它不只是我,所以基本上,我不能改变环境或赢得' t为其他人工作),我唯一可以影响的是二进制文件是如何构建的。忽略LD_LIBRARY_PATH并坚持链接时通过-rpath给出的库

我的问题是,环境指定了一个LD_LIBRARY_PATH,其中包含一个与正在使用的编译器不兼容的libstdC++。我试着静态编译它,但对g ++来说似乎不可能(版本4.2.3,似乎在后来的版本中已经完成了这方面的工作,尽管它不可​​用,-static-libstdC++或类似的东西)。

现在我已经到达使用rpath将绝对路径名称烘焙到可执行文件中(可以工作,它应该运行的所有机器都是相同的)。不幸的是,似乎LD_LIBRARY_PATH优先于rpath(重置LD_LIBRARY_PATH确认它能够找到该库,但如上所述,将为每个人设置LD_LIBRARY_PATH,并且我无法更改它)。

有没有什么办法可以使rpath优先于LD_LIBRARY_PATH,还是有任何其他可能的解决方案来解决我的问题吗?请注意,我在运行时讨论动态链接,我可以在编译和链接时控制命令行。

谢谢。

回答

1

libstdc++.a链接是绝对有可能的,虽然棘手。说明here

我有点怀疑你声称LD_LIBRARY_PATH优先于“中烤”的DT_RPATH但 - 至少在Linux和(我相信)的Solaris,LD_LIBRARY_PATH只是看了之后DT_RPATH查找失败。

+0

我看过这篇文章,'伪造'没有'.so'文件的目录可能有效。我只能改变编译器和命令行(尽管我想我可以将编译器改为脚本),但我也许可以创建自己的lib目录。我会给它一个镜头。至于第二部分,这是一个Solaris环境,我做的测试是:'ldd binary'从LD_LIBRARY_PATH生成库,'LD_LIBRARY_PATH = ldd binary'生成一个(不重要的)烘焙文件。我不知道这些东西是如何实现的,我只能告诉你我看到了什么。 – falstro 2010-03-10 08:58:33

+0

声明在Solaris下'LD_LIBRARY_PATH'优先于'DT_RPATH'是* [绝对正确](http://docs.oracle.com/cd/E19082-01/819-0690/chapter6-63352/index.html) *只要进程不符合[安全进程]的定义(http://docs.oracle.com/cd/E19683-01/816-1386/6m7qcobkt/index.html)。 – vladr 2013-05-02 18:46:53

3

也许你可以使用一个shell包装器来修改这个程序的环境?

#!/bin/sh 

LD_LIBRARY_PATH="/path/to/your/lib:${LD_LIBRARY_PATH}" 
export LD_LIBRARY_PATH 
exec /path/to/binary [email protected] 

这应该在执行前重载LD_LIBRARY_PATH,然后用exec通过二进制文件替换包装器。

这会有帮助吗?