gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:47:12 31 4
gpt4 key购买 nike

最近,我想在运行 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com