有没有可用的开源方法可以从动态可执行文件制作静态文件而没有源代码?


20

让我用一个例子来解释这个问题。我在日常工作中使用了一些旧程序,例如xfigpdfedit

现在,这些程序已经很老了,不需要经常更新。我担心的是,由于缺少某些库或某些不兼容的更新,有一天或另一天它们将不再起作用。

如果程序很容易编译现在,正在运行的系统上,解决的办法是得心应手:尝试破解了一下源和编译静态---生成的可执行文件将是很大的,不那么有效,但是它会为工作可预见的未来(1)。似乎是这种情况xfig,我将尽快尝试。

但是,例如,pdfedit取决于Qt3,此时建立一个系统对其进行编译非常复杂。幸运的是,由于它需要的库没有任何冲突,因此它可以立即运行。但这将来可能会改变,所以我想解决这个问题:

如果我在Ubuntu上有一个动态的所有库,但没有源代码,如何制作静态二进制文件(或类似的东西)?

我四处搜寻。指示符(2)是一种可能,但是地址随机化存在很多问题,因此是不行的。非免费版本Ermine似乎可以使用,但我确实希望使用开源选项。

另一种可能性是使用docker或类似的打包系统。但是我发现的所有教程都是面向RedHat的。老实说,遵循起来非常复杂。


脚注

(1)没有那么疯狂。例如,我使用静态ffmpeg,工作正常,没有任何兼容性问题...

(2)进行编译statifier,请参见/programming/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-fatal-error

Answers:


19

您可以用另一种更简单的方式解决问题:

ldd在可执行文件上使用以查看链接的库,例如:

$ ldd /bin/bash
linux-vdso.so.1 =>  (0x00007fffb2fd4000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fac9ef91000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fac9ed8d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac9e9c6000)
/lib64/ld-linux-x86-64.so.2 (0x00007fac9f1e1000)

然后将所有库收集到一个文件夹中,并在运行程序之前将LD_LIBRARY_PATH环境变量指向该文件夹:

$ LD_LIBRARY_PATH="/opt/my_program/lib" /opt/my_program/start

或者,您可以将lib文件夹的条目添加到/etc/ld.so.conf.d/。但这将适用于整个系统的更改。


这是个好主意-尽管我真的很想找到一种方法将所有这些打包到可执行文件中。加载程序的更改可能会影响此解决方案(尽管我希望没有人会以非向后兼容的方式进行此类操作)。如果没有更好的解决方案,将奖励赏金---谢谢。
Rmano 2014年

好吧,您可以将其添加到一个小的安装脚本中,并将其链接到本地​​路径。我喜欢这个解决方案,本来可以回想一下。
WalyKu 2014年

1
@Klaus,linux-vdso.so.1 无处可寻,我想它在内核中,对吗?
Rmano 2014年

1
是。来自man 7 vdso:““ vDSO”(虚拟动态共享对象)是一个小型共享库,内核会自动将其映射到所有用户空间应用程序的地址空间中。
Klaus D.

尽管这并不是严格地解决问题的方法,但这是一个合理的解决方法。谢谢。
Rmano 2014年

2

关于指示符的一项建议:

如果地址空间布局随机化(ASLR)导致失败,则不必为整个计算机将其关闭。您可以仅针对该过程将其关闭:

$ setarch `uname -m` -R statified_pdfedit [args...]

它将在禁用随机布局的情况下运行该命令(无需成为root用户)。


哇有趣。现在,如果我能编译的话statifier……
Rmano 2014年

编译并检查。xfig_statified仍然是核心转储...可惜。不管怎么说,还是要谢谢你。
Rmano 2014年

是的,可惜。我想知道这是否不是64位问题,请尝试在32位设置上运行statifier吗?
lemonsqueeze 2014年

在32位计算机上检查时,仍然是核心转储。
Rmano 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.