c++ - 如何使用 PatchELF 或 chrpath 替换库共享对象

标签 c++ c linux gcc

最近,我想在运行 GCC 5.2.0 的最新 Linux 系统上运行由 GCC 3.4.5 编译的旧应用程序。 GCC 版本有冲突。 我捕获了一些跟随的想法:

  1. 我可以在我自己的特定目录 ${MYLIB_DIR} 上重建 GCC 3.4.5,并编译我的应用程序,然后将其部署到 GCC 5.2.0 上并使用 ${MYLIB_DIR} 导出 LD_LIBRARY_PATH。但这是错误的,因为 LD_LIBRARY_PATH 将在其他应用程序上工作,例如 shell 命令:ls、ldd...所以这种方式无法工作。
  2. 使用命令 chrpath 或 patchelf。我可以改变我的应用程序的运行路径,而不是不影响其他应用程序。但是在我自己的目录${MYLIB_DIR}中有一些库共享对象无法搜索到,比如libcom_err.so,libdl.so。

我想用第二种方法,libpthread.so可以准确地搜索和替换,但是我想知道如何让GCC在我自己的${MYLIB_DIR}中搜索libcom_err.so?

最佳答案

采用方法 1。我在这里可能是错的并且误解了你的意思,但听起来你担心如果 LD_LIBRARY_PATH 完全独立于所讨论程序的其他程序将会中断设置在它们使用的 shell 中。

如果是这种情况,您可能没有意识到环境变量仅在其特定子 shell 中是本地的。因此,如果您创建一个子 shell,设置变量,然后启动您的程序,则父 shell 中的其他程序将不会受到该变量的影响。

一个常见的方法是创建一个 bash 启动器脚本,例如 launchProg.sh:

#!/bin/bash

export LD_LIBRARY_PATH=/my/lib/dir
./myprog

其中 myprog 是您的程序,位于与 launchProg.sh 相同的目录中,而 /my/lib/dir ${MYLIB_DIR}.

当您运行此脚本时,它会创建一个子 shell,因此导出的变量在其外部不可见。

关于c++ - 如何使用 PatchELF 或 chrpath 替换库共享对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38369803/

相关文章:

c++ - 如果是 Singleton 类,我应该如何编写复制构造函数,我应该如何重载 = 运算符?

c - #define, EQ(a, b) ((a) == (b)) 是什么意思?

c - 将指针从 main() 移动到第一个可执行函数

php - 将 Laravel 从 Windows 迁移到 Linux Server

C++ 错误 LNK2019

c++ - 将 Variadic 模板包转换为 std::initializer_list

python - 显式链接本地共享对象库

linux - 如何单行执行此 "expect"命令?

linux - 如何从使用 sudo 运行的程序访问用户的 ssh key ?

C++类指针删除(Segmentation Fault Issue)