跨 Debian 發行版維護單個二進製文件
我們目前正在將我們的系統從 Debian 6 遷移到 8。議程是嘗試跨 OS 平台(基於 x86)維護單個二進製文件
但是,我嘗試在 Debian 6 中執行 Debian 8 編譯的二進製文件。結果是
符號查找錯誤:g_thread_create
我嘗試了相反的編譯,一個 Debian 6 編譯的應用程序在 Debian 8 下執行。
目標平台是x86 Atom 板。
Debian 8
ldd
顯示: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 6
ldd
顯示: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)
正如評論中所說,建構可在不同版本的 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
,並使用歸檔儲存庫)。