2009-11-20 93 views
6

很抱歉,如果這是一個明顯的問題,但我在網上找到了令人驚訝的一些參考...二進制兼容性

我與我們的業務合作伙伴用C語言編寫的API時並以Fedora 11爲基礎構建的.so二進制文件提供給我們。我們已經在Fedora 11開發機器上測試了API,沒有任何問題。但是,當我嘗試與客戶的目標平臺(恰好是SuSE Enterprise 10.2)上的API進行鏈接時,出現「文件格式未識別」錯誤。

命令那也是binutils的包的一部分,如objdump的或納米,給我相同的文件格式錯誤。 「文件」命令顯示了我:

ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), not stripped 

和「LDD」命令顯示:

ldd: warning: you do not have execution permission for `./libuscuavactivity.so.1.1' 
./libuscuavactivity.so.1.1: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./libuscuavactivity.so.1.1) 
[dependent library list] 

我猜這是因爲這兩個平臺上的C庫之間的不兼容,與問題在於代碼是針對新版本的glibc等進行編譯的,而不是SuSE 10.2上提供的。我發佈這個問題的機會是,有一種方法可以在我們的合作伙伴的Fedora 11平臺上編譯代碼,以便它也可以在SuSE 10.2上運行。

+2

在同一架構上? (i386!= amd64) – elmarco 2009-11-20 16:27:13

+0

我應該提到構建平臺和目標SuSE 10.2平臺都是x86_64。 – 2009-11-20 16:45:01

+0

您可以使用objdump或通過簡單地執行.so來檢查文件格式(是的,這是可能的)。這將是ELF,因爲它是從石器時代開始使用的。如果你有不兼容的libc版本,你會得到一個錯誤信息,說明這一點 - 所以你的猜測很可能是錯誤的,這個問題可能是不同的。 – hirschhornsalz 2009-11-20 19:41:34

回答

4

我認爲,關鍵是要建立在Linux上的最舊的內核和任何你想支持平臺的C庫版本一番風味。在我的工作中,我們基於Debian 4,它允許我們以非官方的方式正式支持Debian 4和更高版本,RedHat 3,4,5,SuSE 10以及其他各種發行版(SELinux等)。

我懷疑,通過建立在一個不錯的新版本的linux上,很難在舊機器上支持人員。

(編輯)我要指出,我們採用自帶的Debian 4,我認爲這是GCC 4.1.2編譯器默認。安裝較新的編譯器版本往往會使兼容性變得更糟。

3

Windows有它不同一般realeases,服務包,安裝的SDK,和DLL之間的兼容性問題(DLL地獄,任何人嗎?)。 Linux不能解決相同類型的問題。

我所看到的兼容性問題包括:

  • 運行庫改變
  • 鏈接庫改變
  • 內核修改
  • 編譯器技術的變化(如:前,後的電梯羣控系統的gcc版本,這可能。成爲你的問題)。
  • 打包問題(RPM與APT)

你的具體情況,我讓他們做一個「GCC -v」他們的系統上,並且向你彙報的gcc版本號。將其與您正在使用的內容進行比較。

您可能需要掌握該版本的編譯器才能使用。

1

如果消息是不承認,那麼問題是Elmarco公司,在留言中最有可能的一個文件格式 - 即,不同的架構。它可能(我不確定)是一個動態鏈接器版本不匹配,但這意味着.so文件是由一個古老的動態鏈接器構建的。我不相信libc中的任何不兼容可能導致這種情況 - 它們可能會導致鏈接失敗和運行時問題(後者很少),但不是這樣。

0

我不知道Suse,但我知道Fedora喜歡留在最前沿。所以你可能對圖書館版本很對。你爲什麼不問問,看看你是否可以獲得源代碼並在你的Suse機器上構建它?

3

可以使用Linux應用程序檢查工具([1][2][3])爲了解決Linux發行版之間的應用的兼容性的問題。它會檢查你的文件格式和所有相關的庫。它支持幾乎所有流行的Linux發行版,包括所有版本的SuSE和Fedora。

enter image description here

2

這只是個人意見,但分佈在東西時,只有二進制文件的形成在Linux上,你有幾種選擇:

  1. 建立.deb文件和.rpms的色域對於每個發生在太陽下的發行版,對於任何你錯過的任何東西,都會有一個名爲「.tar.gz完整的二進制文件」的軟件包。第一部分是理想但繁瑣。後一部分將帶領您到2點和3

  2. 做一些所提出的建議,並找到你可以找到和建立有最古老的發行。我個人的看法是這是一個荒謬的想法。見第3點。

  3. 分配二進制文件和靜態鏈接哪裏可以。特別是對於libstdC++,這似乎是你的問題。似乎存在很多不兼容的libstdC++版本,這使得它成爲兼容性的噩夢。如果您無法靜態鏈接,您還可以將* .so文件放在您的二進制文件旁邊,並使用像LD_PRELOADLD_LIBRARY_PATH這樣的文件使它們在運行時優先鏈接。請注意,如果您採用此路線,您可能必須遵守LGPL等,因爲您現在正在將其他人的工作分配給您的項目。

當然,在Linux上總是首選以源代碼形式發佈項目。 :-)