2011-08-04 78 views
0

我在sparc9和sparc10系統上安裝了gcc 3.4.6。當我嘗試在sparc10上使用共享對象(構建在sparc9上)時,我遇到了不兼容問題。我沒有看到任何問題,如果我在sparc9系統上使用相同的共享對象。從生成文件摘錄: -solaris sparc 9/10 libstdC++兼容性問題(64位)

LIB=-L/usr/lib/sparcv9 -L/usr/local/lib/sparcv9 -L/lib/sparcv9 
gcc -m64 -shared -fPIC -o myapi.so.1 myapi.o $(LIB) -lc -lstdc++ -luuid 

現在按照sparc10: -

ldd -d /home/myapi.so 
libstdc++.so.6 =>  /usr/local/lib/sparcv9/libstdc++.so.6 
symbol not found: _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode    (./myapi.so) 

我跳過上述輸出其他依賴其顯示正常。

然後,我跑在/ usr/local/lib目錄/ SPARCV9 「納米」 反對的libstdC++ so.6以上未引用的符號,並得出以下結論出來: - 。

V9---> _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode 
V10--->_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode 

如果你仔細看,你可以看到sparc9和sparc10中的損壞名稱符號...「ExSt12」v/s「ElSt12」中的差異。

同樣,如果我在sparc10上構建myapi.so,由於V9和V10中的符號不​​匹配,它會在sparc9上失敗。

有人可以請我指出任何有用的提示,如果我失去了一些東西?或者我需要在V9上安裝任何軟件包。我假設在V9上構建的共享對象應該可以在V10上工作。

我想補充說的是,有一個libstdC++的大小,在V9上的so.6與V10不同。 V9有SMCgcc,V10有SUNWgccruntime和SMCgcc。

回答

0

看起來像是在兩個操作系統上使用GNU C++編譯器&標準庫的不兼容版本。不幸的是,C++沒有標準的ABI,許多編譯器在主要發行版之間改變了符號修改約定(例如Sun C++編譯器4.x與5.x,或者g ++ 2.x與3.x與4.x )。

/usr/local/lib路徑意味着您正在使用從sunfreeware.com站點下載的SMCgcc軟件包中的庫 - 確保您在Solaris 9和10計算機上具有匹配的版本。 (有沒有 「SPARC 10」,所以你必須意味着Solaris 10操作系統)

+0

@ alanc ..感謝您對此問題的幫助。兩臺機器上的gcc/g ++版本都是3.4.6。不過,兩臺機器上的「as」版本的gcc是不同的。我無法找到solaris9的64位SUNWgccruntime軟件包(這是solaris 10中的默認軟件包)。在這種情況下,我應該檢查solaris 10上的SMCgcc版本,並在solaris 9上安裝相同的版本嗎?這是推薦的方法還是應該用其他方法? – confused

+0

SUNWgccruntime是Solaris捆綁的gcc運行時,它首次在Solaris 10中添加 - 它從未針對Solaris 9製作。 – alanc

1

這些符號還原函數:

std::basic_streambuf<char, std::char_traits<char> >::seekoff(long long, std::_Ios_Seekdir, std::_Ios_Openmode) 

std::basic_streambuf<char, std::char_traits<char> >::seekoff(long, std::_Ios_Seekdir, std::_Ios_Openmode) 

注意到一個使用long和其他用途long long

我懷疑這意味着一個是用64位文件偏移(又稱大文件支持)構建的,另一個則不是。這意味着GCC的兩個版本的構建方式不同(sunfreeware.com或提供它們的人)並且不兼容。