2010-11-09 23 views
3

使用MacPorts我剛剛在我的MacBook Pro上安裝了arm-elf-gcc。這工作完美無缺,似乎都運行良好。運行arm-elf-gcc編譯代碼時出現seg fault

但是,在C和C++編譯一個簡單的hello world測試程序並嘗試在目標板(運行Debian Linux的基於ARM9的電路板)上運行後,它們立即發生故障。

我有點卡住瞭如何去調試這個,因爲目標板的可用工具有限,沒有gdb。我已經使用Linux託管的交叉編譯器成功構建並運行了其他代碼,因此它應該可以工作。

任何想法?

繼我已經建立的建議和運行gdbserver的,我得到的主機在gdb以下幾點:

計劃接收信號SIGSEGV,分割過錯。 0x00000000在? ()

我認爲這可能是一個標準的C庫的問題,所以我刪除了任何調用,並只有一個空的主返回0,它編譯爲-WALL -G hello-arm.cpp -static 。作爲測試,我使用Linux託管的交叉編譯器編譯了相同的源代碼,並且運行並退出正常。我可以看到的唯一區別是Linux編譯版本的大小是兩倍,並且文件的輸出差異命令:

arm-elf-gcc:ELF 32位LSB可執行文件,ARM版本1靜態鏈接,而不是汽提

臂 - * - Linux操作系統:ELF 32位LSB的可執行文件,ARM,版本1,靜態鏈接,用於GNU/Linux 2.4.18,不剝離

回答

2

通常的調試的方法在這種情況下,要在目標板上運行gdbserver,並使用在主機上運行的gdb連接到它(通過以太網)。或者,您可以嘗試在Mac編譯的「Hello World」程序和(工作)Linux編譯的程序中比較程序集,以查看不同的程序組。

1

在挖掘了幾天後,我開始對嵌入式編譯器有所瞭解。我並不確定通過MacPorts安裝的arm-elf-gcc與我在Linux機器上安裝的arm-unknown-linux工具鏈之間的區別。

重要:使用GNU編譯器 創建可執行文件是不太 一樣使用GNU鏈接器, 臂elf-我只是碰到標題爲「An introduction to the GNU compiler」 PDF文件包含以下段落來了ld,你自己。原因是 ,GNU編譯器自動將 鏈接到一些標準的系統庫中到您的可執行文件中。這些 庫允許您的程序以 與操作系統交互,使用標準C庫函數 ,使用某些語言功能和 操作(如除法)等等 。如果您希望看到哪些 庫正在鏈接到 可執行文件中,則應將 詳細標誌-12v傳遞給編譯器。

這對於嵌入式系統 有重要意義!這種系統通常不具有操作系統。 這意味着在系統連接 庫幾乎總是 意義:如果沒有操作系統 系統,例如,然後調用 標準printf函數不作 多大意義。

因此,當我回到我的開發機器後,我將確定與Linux構建鏈接的庫,並將它們添加到arm-elf-gcc構建中。

我會在有更多信息時更新此信息,但我只是想記錄下我的發現,以防其他人遇到這些問題。

+0

我現在正在經歷同樣的問題。你有沒有得到答案? – Jim 2011-11-03 16:59:40

+0

我並沒有真正瞭解這一點,我認爲這更多的是因爲我對這個問題的誤解。不過,我通過從http://www.obdev.at/products/crosspack/index.html安裝Crosspack ARM獲得了可用的ARM交叉編譯器。 – Patrick 2011-11-18 00:15:59