我試圖編譯一個大的代碼庫編寫的32位嵌入式處理器在64位桌面處理器上運行,以進行仿真/單元測試。我需要生成的對象成爲共享庫。這在Windows中不是問題,我可以像這樣構建一個dll(/ DWIN32)並且運行良好。無法鏈接共享庫與-mx32和gcc 4.7或gcc 4.8
在Linux中,我可以使用給予gcc和鏈接器的-m32選項進行編譯和鏈接,並獲得共享庫。問題是,這個庫(就像我用-m32指定的那樣)是一個32位庫,並且不會在我的64位版本庫上運行。使用Python,我嘗試加載庫(使用ctypes.cdll.LoadLibrary())
OSError: out.so: wrong ELF class: ELFCLASS32
我發現了-mx32選項,並根據docs這正是我想要的:
-mx32選項將int,long和指針類型設置爲32位, 爲x86-64體系結構生成代碼。
所以,我通過-mx32到編譯器和鏈接(更換我-m32選項),並得到以下(剪斷輸出):
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.a when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/32/libstdc++.so when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/32/libstdc++.a when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.a when searching for -lstdc++
/usr/bin/ld: cannot find -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libm.so when searching for -lm
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libm.a when searching for -lm
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libm.so when searching for -lm
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libm.a when searching for -lm
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libm.so when searching for -lm
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libm.a when searching for -lm
/usr/bin/ld: cannot find -lm
我與GCC 4.7相同的結果和gcc 4.8。以上輸出來自gcc 4.8。
我已經安裝了gcc-4.8-multilib和g ++ - 4.8-multilib。
我的庫路徑是:
LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:/usr/lib/gcc/x86_64-linux-gnu/4.8/32:/usr/lib/gcc/x86_64-linux-gnu/4.8/
從.bashrc中我看完之後這樣的(如下圖)指定,在絕望中加入/4.8/和/4.8/32/東西,鏈接器會只與工作的庫綁定。
export LIBRARY_PATH=/usr/lib/$(gcc -print-multiarch):/usr/lib/gcc/x86_64-linux-gnu/4.8/32:/usr/lib/gcc/x86_64-linux-gnu/4.8/
正如我所說,這已經很好地在Windows上作爲一個dll,我不得不相信我只是失去了一些東西。指針應該是32位,長整型應該是32位,整個事情應該在x86_64上運行。 -mx32表示它會做到這一點(對吧?)。
檢查對象之一-m32編譯後:
$:~/project$ file foo.o
foo.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
而且隨着-mx32編譯後檢查相同的對象:
$:~/project$ file foo.o
foo.o: ELF 32-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
我要對這個錯誤的方式?我還可以使用我的32位共享庫和某種兼容層嗎?
我看到一個針對gcc 4.7的bug report關於這些鏈接錯誤......但我沒有看到太多的結論。 This page說gcc 4.8是x32的推薦最小值,所以我安裝了它。仍然 - 我無法把它鏈接起來。 -m32鏈接正常。
假設您確實需要一個ELF 64位,它看起來像鏈接器無法找到由glibc提供的libm.so。你可以在庫路徑中加入'/ usr/lib64'嗎? – alvits
感謝您的回覆@alvits,但我沒有這個目錄:'$ cd/usr/lib64 bash:cd:/ usr/lib64:沒有這樣的文件或目錄' – skelliam