解決一個Linux下C語言工程無法調試的問題

準備跟一下iostat(包含在sysstat軟件包中)的源碼。在Eclipse中新建一個Makefile工程,導入sysstat 9.1.3的源代碼。代碼可以通過編譯,編譯出來的iostat也可以正常運行。然而,在Eclipse調試運行卻提示"function 'main' not defined",代碼中的斷點也都不起作用。

在命令行下用gdb調試,在main函數上設置斷點時也會提示"function 'main' not defined"。

將iostat用objdump反彙編,在彙編代碼中看到一處"call __libc_start_main"。於是在gdb中在__libc_start_main函數上設斷點,成功,單步跟蹤,然而跟到libc-start.c中的"result = main (argc, argv, __environ MAIN_AUXVEC_PARAM)"這一行就再也跟不進去了。

在Eclipse中建一個對比C工程,編譯,然後用objdump反彙編,發現該反彙編結果中的"Symbol table '.symtab'"含有符號"main",然而前面反彙編的iostat中卻沒有。

於是考慮是不是兩個工程的gcc編譯參數不一樣,於是進行比較:

iostat:
編譯:
gcc -o iostat.o -c -g3 -O0 -Wall -Wstrict-prototypes -pipe -O0 -DSA_DIR=/"/var/log/sa/" -DSADC_PATH=/"/usr/local/lib/sa/sadc/" -DUSE_NLS -DPACKAGE=/"sysstat/" -DLOCALEDIR=/"/usr/local/share/locale/" iostat.c
鏈接:
gcc -o iostat -g3 -O0 -Wall -Wstrict-prototypes -pipe -O0 iostat.o librdstats.a libsyscom.a -s

對比C工程:
編譯:
gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"ttt.d" -MT"ttt.d" -o"ttt.o" "../ttt.c"
鏈接:
gcc -o"testtest" ./ttt.o

參數相差的還不少,經過一番查閱資料,發現問題出在iostat鏈接參數中的"-s"上,gcc手冊上寫"-s"的作用是"Remove all symbol table and relocation information from the executable"。

於是進入sysstat工程的Makefile,將"LFLAGS"裏的"-s"刪掉。這樣再編譯的iostat就可以正常調試了。自己對gcc瞭解不多,這個小問題就折騰了半天,也讓我學到不少。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章