20135203齊岳 信息安全系統設計基礎第二周學習總結


20135203齊岳 信息安全系統設計基礎第二周學習總結

學習計時:共15小時

讀書:5

代碼:4

作業:4

博客:2

一、學習目標

1.熟悉Linux系統下的開發環境

2.熟悉vi的基本操作

3.熟悉gcc編譯器的基本原理

4.熟練使用gcc編譯器的常用選項

5.熟練使用gdb調試技術

6.熟悉makefile基本原理及語法規范

7.掌握靜態庫和動態庫的生成

二、學習任務

1.教材第一章,第七章學習:閱讀並消化教材內容

2.《嵌入式Linux應用程序開發標准教程》第三章3.1-3.5的學習

3.完成實驗:

練習vimtutuor

練習gcc編譯運行代碼

練習gdb調試代碼

把上述代碼中除了main函數外的代碼制作成一個靜態庫math.a和一個共享庫math.so

編寫makefile,讓代碼編譯,上述靜態庫和共享庫的使用自動化。

三、學習過程

1.linux下的C語言編程環境

(1)編輯器

完成對所錄入文字的編輯功能,最常用的是vi(vim)和emacs

vi的三種模式及用法

·命令行模式:最初進入的默認模式,可上下移動光標進行刪除字符或整行刪除,也可進行復制粘貼,但無法編輯

·插入模式:可以編輯,按[Esc]鍵回到命令行模式

·底行模式:可以進行保存或退出,或設置編輯環境。

(2)編譯鏈接器

指源代碼轉化成生成可執行代碼的過程,最常用的編譯器是gcc。

gcc的編譯流程

·預處理階段:頭文件和宏定義,—E可以讓gcc在預處理結束之后停止編譯過程,因此可以看到預處理的過程

一般格式為:gcc [選項] 要編譯的文件 [選項] 目標文件

  gcc -E hello.c -o hello.i

·編譯階段:gcc將代碼翻譯成匯編語言,使用選項-S只進行編譯而不進行匯編,結果生成匯編代碼。

  gcc -S hello.i -o hello.s

匯編階段:將.s文件轉成目標文件,使用選項-c可以看到匯編代碼轉換為二進制目標代碼。

  gcc -c hello.s -o hello.o

鏈接階段:默認搜索鏈接到libc.so.6函數庫當中,調用庫文件中已經實現的函數。

gcc編譯選項分析

常用選項

-I dir :在頭文件的搜索路徑列表中添加dir目錄,當用戶希望添加放置在非默認位置的頭文件時可以通過該選項來指定。

庫選項

靜態庫:一系列的目標文件的歸檔文件,在編譯時會搜索靜態庫提取出其所需要的目標文件並將其復制到該程序可執行的二進制文件中。

動態庫:在程序編譯時並不會被鏈接到目標代碼中,而是在程序運行時才會被載入。

警告和出錯選項

優化選項

"-On":n是一個代表優化級別的整數,n的取值范圍對應的優化效果並不完全相同,比較典型的范圍是從0變化到2或者3。

“-O”主要進行線程跳轉和延遲退棧。 一般在程序即將發行的時候才考慮對其優化。

體系結構相關選項

(3)調試器

gdb調試器,可方便的設置斷點、單步跟蹤。

gdb的使用流程

·查看文件:鍵入l(list)查看所載入的文件

·設置斷點

i)按行設置斷點:b+對應行號即可,可設置多個斷點,運行到設置斷點的一行程序會自動停止

ii)函數斷點:按函數設置斷點只需把函數名列在命令“b”之后

iii)條件斷點:b 行數或函數名 if 表達式

·查看斷點情況:info b,在斷點鍵入bt可查到調用函數(堆棧)的情況。

·運行代碼:r+行號可從指定行開始運行代碼,默認從頭執行

·查看變量值:p+變量值即可

·單步運行

·恢復程序運行

gdb基本命令:

可通過help選項查看

help all:

(4)項目管理器

一個工程中的源文件不計其數,按其類型、功能、模塊分別放在若干個目錄中。makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至進行更復雜的功能操作(因為makefile就像一個shell腳本一樣,可以執行操作系統的命令)。

makefile帶來的好處就是——“自動化編譯”,一但寫好,只需要一個make命令,整個工程完全編譯,極大的提高了軟件的開發效率。make是一個命令工具,是一個及時makefile中命令的工具程序。

make工具最主要也是最基本的功能就是根據makefile文件中描述的源程序至今的相互關系來完成自動編譯、維護多個源文件工程。而makefile文件需要按某種語法進行編寫,文件中需要說明如何編譯各個源文件並鏈接生成可執行文件,要求定義源文件之間的依賴關系。

makefile基本結構

需要由make工具創建的目標體(target),通常是目標文件或可執行文件

要創建的目標體所依賴的文件(dependency_file)

創建每個目標體時需要運行的命令(command),這一行必須以制表符開頭,格式為

  target:dependency_files

    command

makefile變量

makefile規則

make管理器的使用

2.鏈接

與靜態庫鏈接

動態庫:將所有相關的目標模塊打包成一個單獨的文件,稱為靜態庫。在unix系統中,靜態庫以一種稱為存檔的特殊文件格式存放在磁盤中。

為了創建該庫,使用AR工具:

  ar rcs libvector.a addvec.o multvec.o
為了創建可執行文件,需要編譯鏈接輸入文件*.o 和libvector.a:

  gcc -O2 -c .c
  gcc -static -o p2
.o ./libvector.a
加載可執行目標文件

  ./p
與動態庫鏈接

共享庫是一個目標模塊,在運行時可以加載到任意的存儲器地址,並和一個在存儲器中的程序鏈接起來。這個過程稱為動態鏈接,是由一個叫做動態鏈接器的程序來執行的。

創建動態庫:

  gcc -shared -fPIC -o libvector.so addvec.c multvec.c

將動態庫鏈接到程序中:

  gcc -o p2 *.c ./libvector.so
四、遇到的問題

1.起初在使用gcc編譯時,認為-E、-S等選項是可寫可不寫的,於是第一次編譯過程中沒有加選項,出現了如下情況

2.設置斷點后查看斷點相關情況出現如下錯誤:

原因是程序並未開始運行,所以斷點無數據,也無堆棧使用情況。使用r命令使程序運行后數據正常。

3.制作靜態庫動態庫的時候,在前面的代碼都編譯無誤,進行到這一步時報錯:

原因是vector.h未定義,找不到該文件。 書上解釋說vector.h為頭文件,當中定義了libvector.a中的函數原型,又嘗試去掉#include “vector.h”進行編譯,當編譯到最后一步時報錯函數addvec未定義。

同樣,在動態庫的制作過程中vector.h也沒有相關文件,導致鏈接失敗。

4.課本第七章動態庫與靜態庫的創建和鏈接應用較好理解,但7.6符號解析,7.7重定位以及7.12PIC和重定位相關知識較為抽象不好理解,希望老師在課堂上作系統講解。

總結:

本周學習內容以練習為主,vim編輯器,gcc編譯以及gdb調試和makefile項目管理都是C語言中的知識只不過換到linux系統中用不同的工具以命令行的形式呈現,較為容易理解,其中對makefile理解最深刻因為在VC寫程序時VC環境會幫助做好項目管理,無需自己編寫,但在linux中面對較為復雜的程序時makefile則會大大減輕工作量,需多加練習。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com