如何使用所有需要的库复制可执行文件?
Posted
技术标签:
【中文标题】如何使用所有需要的库复制可执行文件?【英文标题】:How to copy an executable with all needed libraries? 【发布时间】:2017-08-21 04:22:04 【问题描述】:我有两个完全相同的 (Linux-) 系统,但一个只安装了一组最少的软件包。在一个系统上,我有一个正在运行的(二进制/ELF)可执行文件,我想将它复制到另一个系统(使用最少的设置)。
现在我还需要一种方法来复制所有需要的共享库。目前我在源系统上启动应用程序,然后通过输出
lsof | grep <PID>
或
ldd <FILE>
获取应用程序当前加载的所有库的列表并手动复制它们。
现在我的问题是:在我开始自动化这种方法并遇到许多小问题并最终得到另一个重新发明的***之前 - 有没有一种工具已经为我实现了自动化?我现在梦寐以求的工具会像这样工作:
$ pack-bin-for-copy <MY_EXE>
它创建了一个.tgz
,其中包含运行此可执行文件所需的所有共享库。
或
$ cp-bin <MY_EXE> user@target:/target/path/
只复制一次二进制文件..
注意:我不需要专业的方式部署应用程序(通过 RPM/apt/等)。我正在寻找“暂时”的解决方案。
【问题讨论】:
在我看来,您使用ldd
的方法是手动准备交付包的正确方法。除此之外,如果您是构建软件的所有者,您还应该能够定义哪些非链接相关文件很重要并且应该包括在内:配置文件、脚本、运行时加载的库/插件等。
提示:很多发行版的 initrd 生成器都有这个功能。
还有commandlinefu.com/commands/view/10238和h3manth.com/content/copying-shared-library-dependencies
【参考方案1】:
如果您还在链接时启用-Wl,--no-dynamic-lookup
,ldd
的用法是正确的。
【讨论】:
以上是关于如何使用所有需要的库复制可执行文件?的主要内容,如果未能解决你的问题,请参考以下文章
使用 QT Creator,如何制作不需要在目标平台上安装 .dll 的 Windows 可执行文件? [复制]
如何使用 NSFileManager 复制 UNIX 可执行文件?
如何使用 Testcontainers 将可执行文件复制到 Docker 容器