2018-2019-1 20165228 蘇祚堃《信息安全系統設計基礎》第一周學習總結
2018-2019-1 20165228 《信息安全系統設計基礎》第一周學習總結
教材學習內容總結
GCC編譯:
- 預處理:gcc –E hello.c –o hello.i;gcc –E調用cpp
- 編 譯:gcc –S hello.i –o hello.s;gcc –S調用ccl
- 匯 編:gcc –c hello.s –o hello.o;gcc -c 調用as
- 鏈 接:gcc hello.o –o hello ;gcc -o 調用ld
帶head.h的頭文件編譯:需要使用"-I + 頭文件路徑"
例:gcc -I include src/*.c -o bin/xx註意使用GCC編譯時要加“-g”參數
GDB基本命令
- gdb programm(啟動GDB)
- b 設斷點(要會設4種斷點:行斷點、函數斷點、條件斷點、臨時斷點)
- run 開始運行程序
- bt 打印函數調用堆棧
- p 查看變量值
- c 從當前斷點繼續運行到下一個斷點
- n 單步運行
- s 單步運行
- quit 退出GDB
- 大寫“K”可以用來查找函數的幫助信息:查看 man page,命令模式下,將光標放在函數名上,按"K"可以直接察看 man page。
- 斷點調試:
break x (x表示設置斷點位置的行號)
delete x (x表示刪除斷點的行號)
list 顯示帶行數的代碼
start+cotinue=run 運行
s+c=r
watch b 觀察變量b的值,變化時程序停止
s 進入函數內部
n 單步調試
quit 退出gdb
info b 查看斷點信息並保存
save breakpoint fig.dp 保存斷點到fig.dp中
gdb hello2 -x fig.dp 調試時讀取保存斷點文件
靜態庫的生成
例:
1、輸入 "gcc (-g) -c -I/頭文件所在路徑 add.c sub.c mul.c div.c" 生成.o文件
2、輸入 "ar rcvs libmath.a add.o sub.o mul.o div.o"生成靜態庫
3、輸入 "gcc (-g) main.c -o main -I/頭文件所在路徑 -L. -lmath" 生成可執行文件main
註意: -I參數用來指定程序要鏈接的庫,-I參數緊接著就是庫名
-L參數跟著的是庫文件所在的目錄名
gcc會在靜態庫名前加上前綴lib,然後追加擴展名.a得到靜態庫文件名來查找靜態庫文件
動態庫的生成
例:
1、輸入 "gcc (-g) -fPIC -c -I/頭文件所在路徑 add.c sub.c mul.c div.c" 生成.o文件
2、輸入 "gcc -shared -o libmath.so add.o sub.o mul.o div.o"生成動態庫
3、將文件libmath.so復制到目錄/usr/lib中後,再輸入"gcc (-g) main.c -o main -I/頭文件所在路徑 -L. -lmath"生成可執行文件main
Makefile文件的書寫格式:
vim Makefile
文件類型:由哪個文件得到
得到過程
例如:
main:main.o //可執行文件main是由目標文件main.o得到。
gcc main.o –o main //得到過程是將main.o編譯成main文件。
main.o:main.c
gcc -c main.c -o main.o
在Makefile文件中一定要將每一個.c文件按執行順序先編譯成.o文件,再按順序將.o文件編譯成可執行文件。
每次編譯過後會產生很多的.o文件,對於程序運行沒什麽太大意義,反而會占內存,所以我們也可以在Makefile文件中添加清除命令(clean),如:
.PHONY:clean
clean: 刪除所有文件類型為.o的文件
rm –rf *.o
編譯和執行(make:編譯, 。/all:執行)
代碼調試中的問題和解決過程
- 問題1:在編譯時,報錯"ld returned 1 exit status"
- 問題1解決方案:在查找資料後,指示編譯方式或編譯指令有誤。最後發現是指令中的I與小寫L混淆了。
- 問題2:在做測試的時候,不會使用GDB設置斷點
- 問題2解決方案:在參考linux c之gdb常用斷點調試總結,學習了(條件)斷點的設置和保存,以及一些簡單的GDB指令。
- 問題3:GDB調試問題“No source file named file.c. Make breakpoint pending on future shared library load?”和“沒有符號表被讀取。請使用"file" 命令”
- 問題3解決方案:在編譯的時候,沒有加-g的選項,導致沒有產生調試符號。
代碼托管
(statistics.sh腳本的運行結果截圖)
其他(感悟、思考等,可選)
在學習本門課程的第一周,就對忘了很多的C語言進行了深入的學習。比如編譯這一步驟,之前只會用codeblock等點一下就編譯了,而沒想過中間還需要預處理等步驟,最後還要鏈接可執行程序。讓我有了很大的收獲,尤其是剛剛學習的靜態庫、動態庫,讓我對C有了新的認識。在這之前,我對Makefile一點認識都沒有,在編寫Makefile時遇到了一些困難,不論是格式還是編寫規則,都是十分新鮮的事物。
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一周 | 124/124 | 1/1 | 9/9 |
計劃學習時間:5小時
實際學習時間:9小時
2018-2019-1 20165228 蘇祚堃《信息安全系統設計基礎》第一周學習總結