2014-01-12 42 views
3

我一直在嘗試使用--with-fpmath=387來源編譯gcc 4.x,但我得到這個錯誤:"Invalid --with-fpmath=387"。我看着在CONFIGS,發現它不支持此選項(即使文檔仍然提到它作爲一個可能的選擇):gcc 4.x不支持x87 FPU數學?

case ${with_fpmath} in 
    avx) 
    tm_file="${tm_file} i386/avxmath.h" 
    ;; 
    sse) 
    tm_file="${tm_file} i386/ssemath.h" 
    ;; 
    *) 
    echo "Invalid --with-fpmath=$with_fpmath" 1>&2 
    exit 1 

基本上,我開始了這件事,因爲我需要提供一個可執行一箇舊的目標平臺(實際上,它是一箇舊的賽揚,但沒有任何SSE2指令,明顯由libstdC++使用,默認默認)。可執行文件在第一條指令(movq XMM0,...)中崩潰,該指令來自libstdC++中複製例程的「非法指令」消息。 有什麼辦法可以解決這個問題嗎?我需要一個相當新的g ++才能移植我現有的代碼庫。

我想知道是否有可能從舊版本提供這些頭/源以支持常規x87指令,以便不引用SSE指令?

更新:請注意我在談論編譯的libstdC++在對象代碼中有SSE2指令,所以問題不在於gcc命令行參數。無論我在編譯代碼時向gcc提供什麼內容,都將與已經具有內置SSE2指令的libstdC++鏈接。

真正的答案是不使用ANY --with-fpmath開關編譯GCC時。我被配置腳本switch語句弄糊塗了,它認爲它只支持sse或avx,而實際上,默認值(在這個開關中沒有提到是「387」)。因此,確保在運行configure時不要使用--with-fpmath。我沒有它重新編譯GCC,它現在工作正常。

謝謝。

+0

正如您找到解決方案,請關閉此問題或添加您的更新作爲答案並接受該答案。 –

回答

0

請注意這個問題是關於編譯的libstdC++在對象代碼中有SSE2指令,所以問題不在於gcc命令行參數。無論我在編譯代碼時向gcc提供什麼內容,都將與已經具有內置SSE2指令的libstdC++鏈接。

真正的答案不是在編譯GCC時使用ANY --with-fpmath開關。我感到困惑的配置腳本開關聲明認爲它只支持sse或avx,而實際上,默認值(在此開關中沒有提到是「387」)。因此,確保在運行configure時不要使用--with-fpmath。我沒有它重新編譯GCC,它現在工作正常。

2

的參數告訴GCC來產生代碼的特定目標是-march =CPU其中CPU是你想要的特定的CPU。對於一個老賽揚,你可能想-march=pentium2-march=pentium3

要分別控制在FP代碼生成,GCC使用-mfpmath=的新版本 - 在你的情況,你想-mfpmath=387

所有這些和許多其他的都覆蓋在gcc documentation

編輯

爲了用於建設圖書館的標誌(如的libstdC++)日後會鏈接到程序,您需要爲庫配置構建以使用適當的標誌。 libstdC++是作爲g ++構建的一部分構建的,因此您需要進行自定義構建 - 您可以使用configure CXXFLAGS=-mfpmath=387設置額外的標誌以在構建時使用。

+0

感謝Chris,但我正在討論編譯適當的libstdC++,它使用前面提到的設置來生成代碼,我將在稍後進行鏈接。即無論我將提供給編譯器的參數是什麼,它都將與libstdC++鏈接,_ALREADY_具有SSE2指令。因此,需要在編譯g ++的所有依賴關係的早期編譯階段完成。 PS我無法執行動態鏈接,因爲目標操作系統沒有安裝任何libstdC++ - 它們都必須靜態鏈接。 – user1552175