2014-10-10 31 views
1

我需要一個確定的答案,因爲這仍然不清楚,我無法在文檔中的任何地方找到明確的答案。我可以使用X64構建ARM的gcc嗎?

假設我有一個工作gcc工具鏈,其中

host x86_64-linux-gnu 
target x86_64-linux-gnu 

,問題是現在我還能配置和構建來源gcc用?

host x86_64-linux-gnu 
build x86_64-linux-gnu 
target arm-gnu-eabi 

爲什麼我會喜歡上這個答案的原因是關於我是否應該花時間來嘗試不同的配置我的圖書館,是否無論是否用於構建gcc腳本能夠有些隱含的第1階段構建,可以暫時在這個x64上爲我暫時引導一個ARM編譯器,這樣我就可以生成我需要的工具鏈,用於我想要的目標。

+0

[this](http://dev-jungle.blogspot.de/2013/09/building-gcc-471-arm-cross-toolchain-on.html)有幫助嗎? – 2014-10-10 18:28:43

+1

除了正常的[交叉編譯器](https://gcc.gnu。org/wiki/Building_Cross_Toolchains_with_gcc)?有很多方法可以構建一個,雖然它可能更容易與幫助工具,如[crosstool ng](http://crosstool-ng.org/) – nos 2014-10-10 18:29:18

+0

@nos的幫助時,有很多方法達到相同的目標,並且沒有集中的文檔來源:這是一個問題;因此我的困惑。我知道crosstool-ng,我想根據自己的需要自己做所有事情。 – user2485710 2014-10-10 18:30:38

回答

3

「我可以使用X64構建ARM的gcc嗎?」

是的,你可以。我已經在blog post of mine中描述了suse linux主機開發系統的這個過程。

============================================== ==================================== 我要複製這裏的步驟:

1.確保有必要的標頭&庫安裝我已經使用YaST的「安裝軟件」功能,安裝下面的包,這將需要完成所有的構建步驟

(只搜索包名,選擇並接受):


  • GMP-devel的
  • MPFR-devel的
  • MPC-devel的
  • 的texinfo
  • ncurses的devel的
  • 的termcap

2.創建一個目錄骨架


cd ~ 
mkdir arm-none-eabi arm-none-eabi-src 
cd arm-none-eabi 
mkdir src build 
cd ~/arm-none-eabi-src 
mkdir src build 

3.下載的源碼包,並提取它們

我使用gcc-4.7.1這裏,當然,同樣的過程將適用於GCC的新版本。


cd ~/arm-none-eabi-src/src 

wget ftp://ftp.gnu.org/gnu/gcc/gcc-4.7.1/gcc-4.7.1.tar.bz2 
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.22.tar.bz2 
wget ftp://ftp.gnu.org/gnu/gdb/gdb-7.4.tar.bz2 
wget ftp://sources.redhat.com/pub/newlib/newlib-1.20.0.tar.gz 

tar -xf gcc-4.7.1.tar.bz2 
tar -xf binutils-2.22.tar.bz2 
tar -xf gdb-7.4.tar.bz2 
tar -xf newlib-1.20.0.tar.gz 

4.生成binutils的


cd ~/arm-none-eabi-src/build 
mkdir binutils-2.22 
cd binutils-2.22 
../../src/binutils-2.22/configure \ 
    --target=arm-none-eabi \ 
    --prefix=$HOME/arm-none-eabi \ 
    --with-cpu=cortex-m3 \ 
    --with-no-thumb-interwork \ 
    --with-mode=thumb 
make all install 
export PATH="$PATH:$HOME/arm-none-eabi/bin" 

5.構建GCC(第1部分)


cd ~/arm-none-eabi-src/build 
mkdir gcc-4.7.1 
cd gcc-4.7.1 
../../src/gcc-4.7.1/configure --target=arm-none-eabi \ 
    --prefix=$HOME/arm-none-eabi --with-cpu=cortex-m3 \ 
    --with-mode=thumb --disable-multilib \ 
    --with-no-thumb-interwork \ 
    --enable-languages="c,c++" --with-newlib \ 
    --with-headers=../../src/newlib-1.20.0/newlib/libc/include 
make all-gcc install-gcc 

的--enable-CXX-標誌配置選項可能被附加地用來控制的libstdC++(包含在此步驟)的構建國旗:

--enable-cxx-flags='-fno-exceptions \ 
    -ffunction-sections -fno-omit-frame-pointer' 

通常相同的C++應該使用編譯標誌,因爲它們在構建預期的目標代碼時會出現。


6.構建GCC newlib與交叉編譯器(第2部分)


cd ~/arm-none-eabi-src/build 
mkdir newlib-1.20.0 
cd newlib-1.20.0 
../../src/newlib-1.20.0/configure --target=arm-none-eabi \ 
    --prefix=$HOME/arm-none-eabi --disable-multilib \ 
    --disable-newlib-supplied-syscalls 
make all install 

有關--disable-newlib-supplied-syscalls選項的說明:
禁用默認newlib系統調用存根實現通常是一個當你打算編譯目標而不使用像操作系統這樣的linux,或者根本沒有操作系統時,這是個好主意。它會讓你在未實現的存根函數上留下鏈接錯誤,你需要爲newlib提供這些函數。 刪除該選項仍然可以使您用自己的實現覆蓋newlib提供的存根。

雖然,當您打算將交叉工具鏈與CMake結合使用時,應該省略此選項。 CMake使用指定的編譯器定義(例如來自toolchain.cmake文件)執行一些基本測試,如果沒有提供默認存根實現,它將會失敗。


7.完成安裝GCC


cd ~/arm-none-eabi-src/build/gcc-4.7.1 
make all install 

8.生成GDB


cd ~/arm-none-eabi-src/build 
mkdir gdb-7.4 
cd gdb-7.4 
../../src/gdb-7.4/configure --target=arm-none-eabi \ 
    --prefix=$HOME/arm-none-eabi 
make all install 

UPDATE
同樣的作品相當不錯GCC 4.8.2也。

+0

問題:這是否應該與一個in tree用binutils旁邊的gcc源代碼構建?因爲我已經沿着這條線嘗試了一些東西,而且我知道一個不起作用的事實,所以我不知道我是否做錯了什麼,或者我只需要在單獨的步驟中構建binutils。 – user2485710 2014-10-10 19:29:53

+0

@ user2485710 _「......或者我只需要在單獨的步驟中將binutils從樹中構建出來。''嗯,我的解決方案建議在單獨的步驟中構建並安裝binutils,**之前**交叉編譯器我不知道這是否真的很重要,但是我懷疑樹參數的輸入/輸出與它有什麼關係 – 2014-10-10 19:35:21

+0

與我以前的步驟在編譯libgcc時,我總是遇到錯誤,它處於階段2階段如果我記得正確的話,這意味着我可能擁有大部分我的標誌,但是關於架構和庫的可能是錯誤的。我認爲'with-cpu'可能是一個改變遊戲規則的東西,這可能是x64中隱含的。完成編譯binutils for ARM後,你的指導,我認爲,這種樹形建設確實有所作爲 – user2485710 2014-10-10 19:40:54

相關問題