我们目前正在将系统从 Debian 6 迁移到 8。议程是尝试跨操作系统平台(基于 x86)维护单个二进制文件
但是,我尝试在 Debian 6 中运行 Debian 8 编译的二进制文件。结果是
符号查找错误:g_thread_create
我尝试了相反的编译,Debian 6 编译的应用程序可以在 Debian 8 下运行。
目标平台是x86原子板。
Debian 8ldd
显示:
linux-gate.so.1 (0xb76f5000)
libusb-1.0.so.0 => /lib/i386-linux-gnu/libusb-1.0.so.0 (0xb76c7000)
libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xb76ab000)
librt.so.1 => /lib/i386-linux-gnu/i686/cmov/librt.so.1 (0xb76a1000)
libUFScanner.so => /usr/lib/libUFScanner.so (0xb751a000)
libUFMatcher.so => /usr/lib/libUFMatcher.so (0xb74f1000)
libjpeg.so.62 => /usr/lib/i386-linux-gnu/libjpeg.so.62 (0xb7492000)
libsqlite3.so.0 => /usr/lib/i386-linux-gnu/libsqlite3.so.0 (0xb73b9000)
libxml2.so.2 => /usr/lib/i386-linux-gnu/libxml2.so.2 (0xb7237000)
libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xb70e5000)
libssl.so.0.9.8 => /usr/lib/i686/cmov/libssl.so.0.9.8 (0xb7099000)
libcrypto.so.0.9.8 => /usr/lib/i686/cmov/libcrypto.so.0.9.8 (0xb6f41000)
libmorphosdk.so.6 => /usr/lib/libmorphosdk.so.6 (0xb6f1e000)
libMSO100.so.6 => /usr/lib/libMSO100.so.6 (0xb6f0e000)
libMSO_Drv.so.6 => /usr/lib/libMSO_Drv.so.6 (0xb6f06000)
libgtk-x11-2.0.so.0 => /usr/lib/i386-linux-gnu/libgtk-x11-2.0.so.0 (0xb6a0e000)
libgdk-x11-2.0.so.0 => /usr/lib/i386-linux-gnu/libgdk-x11-2.0.so.0 (0xb694d000)
libatk-1.0.so.0 => /usr/lib/i386-linux-gnu/libatk-1.0.so.0 (0xb6925000)
libgdk_pixbuf-2.0.so.0 => /usr/lib/i386-linux-gnu/libgdk_pixbuf-2.0.so.0 (0xb68fc000)
libpangocairo-1.0.so.0 => /usr/lib/i386-linux-gnu/libpangocairo-1.0.so.0 (0xb68ee000)
libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb689c000)
libcairo.so.2 => /usr/lib/i386-linux-gnu/libcairo.so.2 (0xb6753000)
libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0xb66f5000)
libgmodule-2.0.so.0 => /usr/lib/i386-linux-gnu/libgmodule-2.0.so.0 (0xb66ef000)
libdl.so.2 => /lib/i386-linux-gnu/i686/cmov/libdl.so.2 (0xb66ea000)
libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xb65c2000)
libgthread-2.0.so.0 => /usr/lib/i386-linux-gnu/libgthread-2.0.so.0 (0xb65bf000)
libftd2xx.so => /usr/lib/i386-linux-gnu/libftd2xx.so (0xb657c000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb648a000)
libm.so.6 => /lib/i386-linux-gnu/i686/cmov/libm.so.6 (0xb6444000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb6427000)
libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb627d000)
libudev.so.1 => /lib/i386-linux-gnu/libudev.so.1 (0xb626a000)
/lib/ld-linux.so.2 (0xb76f8000)
libusb-0.1.so.4 => /lib/i386-linux-gnu/libusb-0.1.so.4 (0xb6260000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb6243000)
liblzma.so.5 => /lib/i386-linux-gnu/liblzma.so.5 (0xb621a000)
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb61f4000)
libXcomposite.so.1 => /usr/lib/i386-linux-gnu/libXcomposite.so.1 (0xb61ef000)
libXdamage.so.1 => /usr/lib/i386-linux-gnu/libXdamage.so.1 (0xb61eb000)
libXfixes.so.3 => /usr/lib/i386-linux-gnu/libXfixes.so.3 (0xb61e4000)
libgio-2.0.so.0 => /usr/lib/i386-linux-gnu/libgio-2.0.so.0 (0xb602e000)
libpangoft2-1.0.so.0 => /usr/lib/i386-linux-gnu/libpangoft2-1.0.so.0 (0xb6016000)
libfontconfig.so.1 => /usr/lib/i386-linux-gnu/libfontconfig.so.1 (0xb5fd3000)
libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0xb5f22000)
libXrender.so.1 => /usr/lib/i386-linux-gnu/libXrender.so.1 (0xb5f16000)
libXinerama.so.1 => /usr/lib/i386-linux-gnu/libXinerama.so.1 (0xb5f12000)
libXi.so.6 => /usr/lib/i386-linux-gnu/libXi.so.6 (0xb5eff000)
libXrandr.so.2 => /usr/lib/i386-linux-gnu/libXrandr.so.2 (0xb5ef2000)
libXcursor.so.1 => /usr/lib/i386-linux-gnu/libXcursor.so.1 (0xb5ee6000)
libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xb5ed1000)
libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xb5ea4000)
libthai.so.0 => /usr/lib/i386-linux-gnu/libthai.so.0 (0xb5e9a000)
libpixman-1.so.0 => /usr/lib/i386-linux-gnu/libpixman-1.so.0 (0xb5de0000)
libxcb-shm.so.0 => /usr/lib/i386-linux-gnu/libxcb-shm.so.0 (0xb5ddc000)
libxcb-render.so.0 => /usr/lib/i386-linux-gnu/libxcb-render.so.0 (0xb5dd1000)
libffi.so.6 => /usr/lib/i386-linux-gnu/libffi.so.6 (0xb5dc9000)
libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb5d58000)
libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xb5d53000)
libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xb5d4d000)
libselinux.so.1 => /lib/i386-linux-gnu/libselinux.so.1 (0xb5d25000)
libresolv.so.2 => /lib/i386-linux-gnu/i686/cmov/libresolv.so.2 (0xb5d0e000)
libharfbuzz.so.0 => /usr/lib/i386-linux-gnu/libharfbuzz.so.0 (0xb5cb1000)
libexpat.so.1 => /lib/i386-linux-gnu/libexpat.so.1 (0xb5c87000)
libdatrie.so.1 => /usr/lib/i386-linux-gnu/libdatrie.so.1 (0xb5c7e000)
libgraphite2.so.3 => /usr/lib/i386-linux-gnu/libgraphite2.so.3 (0xb5c62000)
Debian 6ldd
显示:
linux-gate.so.1 => (0xb7757000)
libusb-1.0.so.0 => /lib/libusb-1.0.so.0 (0xb773a000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7721000)
librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb7717000)
libUFScanner.so => /usr/lib/libUFScanner.so (0xb7590000)
libUFMatcher.so => /usr/lib/libUFMatcher.so (0xb7567000)
libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0xb7547000)
libsqlite3.so.0 => /usr/lib/libsqlite3.so.0 (0xb74bb000)
libxml2.so.2 => /usr/lib/libxml2.so.2 (0xb7390000)
libX11.so.6 => /usr/lib/libX11.so.6 (0xb7273000)
libssl.so.0.9.8 => /usr/lib/i686/cmov/libssl.so.0.9.8 (0xb7227000)
libcrypto.so.0.9.8 => /usr/lib/i686/cmov/libcrypto.so.0.9.8 (0xb70cf000)
libmorphosdk.so.6 => /usr/lib/libmorphosdk.so.6 (0xb70ac000)
libMSO100.so.6 => /usr/lib/libMSO100.so.6 (0xb709d000)
libMSO_Drv.so.6 => /usr/lib/libMSO_Drv.so.6 (0xb7094000)
libgtk-x11-2.0.so.0 => /usr/lib/libgtk-x11-2.0.so.0 (0xb6d09000)
libgdk-x11-2.0.so.0 => /usr/lib/libgdk-x11-2.0.so.0 (0xb6c82000)
libatk-1.0.so.0 => /usr/lib/libatk-1.0.so.0 (0xb6c66000)
libgdk_pixbuf-2.0.so.0 => /usr/lib/libgdk_pixbuf-2.0.so.0 (0xb6c4d000)
libpangocairo-1.0.so.0 => /usr/lib/libpangocairo-1.0.so.0 (0xb6c41000)
libpango-1.0.so.0 => /usr/lib/libpango-1.0.so.0 (0xb6bfd000)
libcairo.so.2 => /usr/lib/libcairo.so.2 (0xb6b88000)
libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0xb6b4a000)
libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0xb6b46000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb6b41000)
libglib-2.0.so.0 => /lib/libglib-2.0.so.0 (0xb6a78000)
libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb6a73000)
libftd2xx.so => /usr/lib/libftd2xx.so (0xb6a31000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb693b000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb6915000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb68f7000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb67b0000)
/lib/ld-linux.so.2 (0xb775a000)
libusb-0.1.so.4 => /lib/libusb-0.1.so.4 (0xb67a8000)
libz.so.1 => /usr/lib/libz.so.1 (0xb6793000)
libxcb.so.1 => /usr/lib/libxcb.so.1 (0xb677a000)
libXcomposite.so.1 => /usr/lib/libXcomposite.so.1 (0xb6777000)
libXdamage.so.1 => /usr/lib/libXdamage.so.1 (0xb6774000)
libXfixes.so.3 => /usr/lib/libXfixes.so.3 (0xb676f000)
libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0xb673f000)
libXext.so.6 => /usr/lib/libXext.so.6 (0xb6730000)
libXrender.so.1 => /usr/lib/libXrender.so.1 (0xb6727000)
libXinerama.so.1 => /usr/lib/libXinerama.so.1 (0xb6724000)
libXi.so.6 => /usr/lib/libXi.so.6 (0xb6716000)
libXrandr.so.2 => /usr/lib/libXrandr.so.2 (0xb670e000)
libXcursor.so.1 => /usr/lib/libXcursor.so.1 (0xb6705000)
libgio-2.0.so.0 => /usr/lib/libgio-2.0.so.0 (0xb6669000)
libpangoft2-1.0.so.0 => /usr/lib/libpangoft2-1.0.so.0 (0xb6643000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0xb65cb000)
libpixman-1.so.0 => /usr/lib/libpixman-1.so.0 (0xb6572000)
libpng12.so.0 => /lib/libpng12.so.0 (0xb654d000)
libxcb-render-util.so.0 => /usr/lib/libxcb-render-util.so.0 (0xb6549000)
libxcb-render.so.0 => /usr/lib/libxcb-render.so.0 (0xb6542000)
libpcre.so.3 => /lib/libpcre.so.3 (0xb650f000)
libXau.so.6 => /usr/lib/libXau.so.6 (0xb650c000)
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xb6506000)
libexpat.so.1 => /usr/lib/libexpat.so.1 (0xb64e0000)
libresolv.so.2 => /lib/i686/cmov/libresolv.so.2 (0xb64cc000)
libselinux.so.1 => /lib/libselinux.so.1 (0xb64b1000)
答案1
正如评论中所说,构建可在 Debian(或任何 Linux 发行版)的不同版本上运行的单个二进制文件的唯一可靠方法是静态构建它。这在 Debian 和其他地方得到了很好的支持,包括pkg-config
等。静态二进制文件可以持续工作数十年;内核的用户空间接口以向后兼容的方式维护(有时它会中断,但这被认为是一个错误,通常会很快修复)。您会发现静态二进制文件停止工作的情况,但这通常与libnss
处理有关(即使在静态二进制文件中也是动态的),或者与 X 服务器的期望发生变化有关(这发生在老的 Linux 游戏),或者发行版内核放弃对被认为过时的功能的支持(例如Ubuntu 内核上的 OSS 声音接口)。
(另一种方法是发送所有依赖库并使用rpath
shell 脚本来正确设置;这就是 Steam 所做的,许多非 Steam Linux 游戏也这样做,但它不如静态链接那么面向未来,并且它是当出现问题时更难修复。)
在 Debian 6 上构建的动态二进制文件可以在 Debian 8 上运行,因为二进制文件的直接依赖项仍然可用你的安装Debian 8;这纯粹是运气,而不是你可以依赖的东西。例如,您的二进制文件链接到libssl.so.0.9.8
;这在 Debian 8 中仍然适用,因为您仍然有旧的libssl0.9.8
软件包(请注意,该链接是由 满足的/usr/lib/i686/cmov/libssl.so.0.9.8
,它不使用多架构路径,并且可能来自旧的软件包)。在没有旧软件包的 Debian 8 上构建,您最终会得到一个链接libssl.so.1.0.0
,而这在 Debian 6 中不可用。(这就是您在新安装的 Debian 8 系统中最终遇到的情况。)
您的 Debian 8 构建的二进制文件无法在 Debian 6 上运行,这是完全正常的:二进制兼容性只是升序,而不是降序。这意味着,如果您在 Debian 6 上构建二进制文件,并且它仍然在 Debian 8 上找到其库,那么它应该可以正常工作;但是在 Debian 8 上链接的二进制文件可以期望库中的符号在 Debian 6 上不可用,而无需更改库的 sonames。发生您所关心的错误g_thread_create
是因为您是在 Debian 8 上构建的,其中libglib-2.0.so.0
有该符号,但 Debian 6libglib-2.0.so.0
没有。如果您构建了一个包含二进制文件的包,则该包的依赖项将正确识别这一点(您至少会获得对 的依赖项libglib2.0-0 (>= 2.31.8)
;Debian 6 仅具有版本 2.24.2)。
让您的设置面向未来的最佳方法是生成一个具有 Debian 6 和 8 中可以满足的依赖项的源代码包;那么你可以轻松地为 Debian 6、7、8、9 构建正确的二进制包...这比构建静态二进制文件要复杂一些,至少在你这样做的前几次是这样,但我认为从长远来看这是值得的如果您计划将来进行这些类型的升级,请运行。通常你会使用pbuilder
为此,它支持为各种发行版构建(sbuild
也可以这样做)。扩展我为 Debian 6 链接的说明应该相对容易(重复 的处理STABLE_CODENAME
,OLDOLDSTABLE_CODENAME
并使用归档存储库)。