是否有任何开源方法可以从没有源代码可用性的动态可执行文件中生成静态?
让我用一个例子来解释这个问题。 我在日常工作中使用了一些旧程序,例如xfig和pdfedit 。
现在,这些程序已经很老了,而且不经常更新; 我担心的是,由于缺少某些库或某些不兼容的更新,有一天他们将不再工作。
如果程序现在很容易编译,在正在运行的系统上,解决方案很方便:尝试破解一点源并静态编译它 – 生成的可执行文件很大而且效率不高,但它可以用于可预见的未来(1)。 这似乎是xfig
的情况,我会尽快尝试。
但是,例如, pdfedit
依赖于Qt3,并且设置一个系统来编译它在这个时候非常复杂。 幸运的是, 它可以立即运行 ,这要归功于它所需的库不会与任何东西发生冲突。 但是这可以在将来改变,所以我想解决这个问题:
如果我在Ubuntu上有动态的和所有的库,但没有源代码,我怎么能做一个静态二进制(或类似的东西)?
我四处搜寻。 一种可能性是statifier (2),但它在地址随机化方面存在很多问题 ,所以这是一个禁忌。 非自由版本Ermine似乎有效,但我更喜欢开源选项。
另一种可能性是使用泊坞或类似的包装系统。 但是我发现的所有教程都是面向RedHat的 ; 而且,说实话,要非常复杂。
脚注 :
(1)不是那么疯狂。 我使用静态ffmpeg例如,工作正常,没有任何兼容性问题…
(2)编译statifier
,请参阅https://stackoverflow.com/questions/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-fatal-error
您可以用另一种更简单的方式解决问题:
在可执行文件上使用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/
。 但这将适用于整个系统的变化。
关于statifier的一个建议:
如果地址空间布局随机化(ASLR)导致它失败,则不必为整个机器关闭它。 您只需为该过程关闭它:
$ setarch `uname -m` -R statified_pdfedit [args...]
它将运行该命令,禁用随机布局(无需为root)。