1. 程式人生 > >2018-2019-1 20165228 蘇祚堃《信息安全系統設計基礎》第一周學習總結

2018-2019-1 20165228 蘇祚堃《信息安全系統設計基礎》第一周學習總結

文件的 代碼行數 清除 代碼托管 簡單的 pen 以及 順序 路徑

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 蘇祚堃《信息安全系統設計基礎》第一周學習總結