2012-01-29 41 views
0

我的平臺是ubuntu的i686的(32個比特)GCC與作爲-LD用於調試目的,而不是擊中的gdb斷點

如果我編譯gcc驅動一彙編源與調試選項:

gcc -nostartfiles -g -o toupper toupper.s 

我打開用gdb調試的可執行TOUPPER上集成

$ emacs toupper.s-> M-x gdb -> M-x gdb-many-windows 

我產生於第一instruccion斷點與

012 Emacs編輯器
(gdb) b _start 
(gdb) run 

當我開始室內用執行運行命令_start標籤上的調試器停止,正確。

如果我編譯爲彙編器和鏈接使用ld鏈接器相同的源toupper.s:

as -g -o toupper.o toupper.s 
ld -o toupper toupper.o 

現在進行調試的步驟相匹配的gcc的情況。

$ emacs toupper.s -> M-x gdb -> M-x gdb-many-windows 
(gdb) b _start -> mark with a red point the _start line 
(gdb) run -> DONT HIT THE _start LINE ¿? 

我看到符號表是正確的,斷點標記它是正確的,但執行不是一步一步的。

我已經在海灣合作委員會的情況下顯示去詳細步驟和AS/LD情況下再次嘗試過,但結果是一樣的

¿存在着不匹配的AS/LD情況下對GCC情況下,一些默認的選項?

在此先感謝

+0

是您的問題,調試器不會停止在斷點? – 2012-01-29 15:19:56

+0

順便說一句,爲什麼使用-nostartfiles?它可以編譯。 – 2012-01-29 15:26:48

回答

0

當你建立與gcc -nostartfiles -g ...,GCC(至少我的GCC在Linux系統上)經過-gdwarf2as。如果您將-v添加到gcc的調用中,您可以看到實際的as命令。

當你建立與as -g ...直接,你不及格-gdwarf2

我猜那如何解釋行爲的差異。我不知道什麼-g意味着您的版本的as,或爲什麼應該沒關係。

+0

謝謝。對於彙編器無關緊要的是-g或-gdwarf2選項。 gcc前端鏈接過程與ld(binutils鏈接器)的區別在於gcc鏈接到collect2程序。如果在彙編後執行collect2鏈接器,結果是正確的,但是如果使用ld執行鏈接階段,那麼後步驟調試將逐步失敗。它需要用一些選項設置ld鏈接器以匹配collect2等價鏈接器。 哪一個? 。謝謝。 – candido 2012-01-30 15:49:23

+0

@candido在Linux上,'collect2'只是執行'ld'。據我所見,它不會添加任何新的選項。您可以通過運行'strace -v -fe trace = execve collect2 ... rest..of..collect2..args'來查看'collect'調用的實際'ld'命令。 – 2012-01-30 16:14:53

+0

@就業俄羅斯,連接器ld需要與像'libgcc.so'和'libc.so'爲表符號解析共享庫鏈接。我不知道爲什麼。所以下一個選項是一個解決方案:'ld -dynamic-linker /lib/ld-linux.so.2 -L/usr/lib/gcc/i486-linux-gnu/4.4.3 -lgcc --as-needed - lgcc_s - 不需要-lc -o toupper toupper.o' – candido 2012-01-31 11:16:53