让我用一个例子来解释这个问题。我在日常工作中使用一些旧的程序,比如xfig和pdfedit。
现在,这些程序相当古老,更新频率也不高;我担心总有一天它们会因为缺少某个库或者某个不兼容的更新而无法正常工作。
如果这个程序在当前系统上很容易编译,解决方案就很简单:稍微修改一下源代码,静态编译它——生成的可执行文件会很大,效率也不高,但是可以在可预见的未来内正常工作(1)。这似乎适用于
例如,
脚注:
(1) 并不是那么疯狂。我举一个例子,使用静态的ffmpeg,运行良好且没有任何兼容性问题...
(2) 要编译
现在,这些程序相当古老,更新频率也不高;我担心总有一天它们会因为缺少某个库或者某个不兼容的更新而无法正常工作。
如果这个程序在当前系统上很容易编译,解决方案就很简单:稍微修改一下源代码,静态编译它——生成的可执行文件会很大,效率也不高,但是可以在可预见的未来内正常工作(1)。这似乎适用于
xfig
,我会尽快尝试一下。例如,
pdfedit
依赖于Qt3,在此时设置编译系统相当复杂。幸运的是它现在可以运行,因为它需要的库与任何其他库不冲突。但是这可能会在未来发生变化,所以我想解决这个问题:
如果我在Ubuntu上有一个动态二进制文件(或类似的文件),并且拥有所有库但没有源代码,我该如何制作静态二进制文件?
我搜索了一下。Statifier(2) 是一种可能性,但它有很多地址随机化方面的问题,所以不可取。非免费版本Ermine似乎可以工作,但我真的更喜欢开源选项。
另一个可能性是使用Docker或类似的打包系统。但是,我找到的教程都非常面向Red Hat;而且,老实说,跟随起来相当复杂。
脚注:
(1) 并不是那么疯狂。我举一个例子,使用静态的ffmpeg,运行良好且没有任何兼容性问题...
(2) 要编译
statifier
,请参考https://stackoverflow.com/questions/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-fatal-error
linux-vdso.so.1
看不到任何地方,我猜它应该在内核中,对吗? - Rmanoman 7 vdso
中可以得知:““vDSO”(虚拟动态共享对象)是一个小型的共享库,内核会自动映射到所有用户空间应用程序的地址空间中。” - Klaus D.otool -L
而不是ldd
。顺便说一句。 - keen