首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >替代LD_PRELOAD或LD_LIBRARY_PATH

替代LD_PRELOAD或LD_LIBRARY_PATH
EN

Stack Overflow用户
提问于 2011-04-01 00:46:11
回答 4查看 2.4K关注 0票数 1

我在一台没有root访问权限的机器上进行一些C编程。我已经编译了一些我要链接的共享库,但是因为我不能在典型位置(/usr/local/lib)安装库,所以我必须在每次编译和运行时显式地指定库的位置。在编译时,这仅仅意味着在gcc命令中添加-L标志,但是对于程序执行来说,这要麻烦得多。要么必须在每次会话中将非标准目录添加到LD_LIBRARY_PATH,要么必须将LD_PRELOAD=/path/to/libs添加到execute命令的开头。

有没有更好的方法在我没有root访问权限的机器上做这件事?

顺便说一句,这台机器正在运行Red Hat 4.1。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-04 21:18:40

有几种解决方案,从好到坏:

从您的gcc main.o -L../lib -lfoo -Wl,-rpath='$ORIGIN'/../lib

  • Use或.profile

使用

  • $ORIGIN,例如gcc main.o -L../lib -lfoo -Wl,-rpath='$ORIGIN'/../lib

  • Use目标RPATH,例如gcc main.o -L../LIB -lfoo -Wl,-rpath=/home/user/lib

  • Set LD_LIBRARY_PATH

解决方案1允许您将二进制文件安装到任何地方,只要您将二进制文件和库一起移动,例如my-app/bin/a.out和my-app/lib/{needed shared-libs}.so。它还允许应用程序的多个版本及其共享库的集合。

如果您只需要一组共享库,并且从不希望移动它们,则解决方案2可以很好地工作。

解决方案3会影响您运行的每个应用程序,并可能导致其中一些应用程序绑定到您的共享库,而不是系统库。这可能会导致它们崩溃、因无法解析的符号而失败,或者给您带来其他痛苦。更糟糕的是,这个问题只会发生在你身上,而不会发生在其他人身上,所以你很难得到帮助。

票数 4
EN

Stack Overflow用户

发布于 2011-04-01 00:48:59

您可以将环境变量添加到.bashrc (或登录时您的shell源文件)。

票数 1
EN

Stack Overflow用户

发布于 2011-04-01 10:06:01

如果在编译和链接程序时设置了环境变量LD_RUN_PATH,那么该搜索路径将被嵌入到可执行文件中,并且动态链接器将在运行时对其进行搜索。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5503329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档