1. 程式人生 > >20155325 2017-2018 1 《信息安全系統設計基礎》 第十四周學習總結

20155325 2017-2018 1 《信息安全系統設計基礎》 第十四周學習總結

如果 全局 red cannot 輸出 方式 紅色 exec 一行

++不論是在查資料還是編譯運行時總能碰到這個庫那個鏈接的問題,所以我認為有必要再回去看看第七章++

教材學習內容總結

靜態鏈接過程

技術分享圖片

  • 命令:
gcc -Og -o 可執行目標文件名 main.c 函數名.c
//編譯
./可執行目標文件名
//運行

可重定向目標文件&可執行目標文件

技術分享圖片

技術分享圖片

符合和符號表

任何帶有static屬性聲明的全局變量或者函數都是模塊私有的。

符號表是由匯編器構造的,使用編譯器輸出到匯編語言.s文件中的符號。

與靜態庫鏈接

  • 使用C標準庫和數學庫中函數的程序
gcc main.v /usr/lib/libm.a /usr/lib/libc.a

靜態庫(.a)

  • .a <- 靜態庫
  • 創建靜態庫
gcc -c 要封裝的函數的名.c 
ar rcs 靜態庫名.a 要封裝的函數的名.o
  • 使用靜態庫
gcc -c 主函數.c 
gcc -static -o 可執行目標文件名 主函數.o ./靜態庫名.a

或者

gcc -c 主函數.c 
gcc -static -o 可執行目標文件名 主函數.o -L. -靜態庫名簡寫
  • 調用順序
    技術分享圖片

動態庫(.so)

調用編譯器驅動程序

gcc -shared -fpic -o 動態庫名.so 函數名.c

創建動態庫

gcc -o 可執行目標文件名 main.c ./動態庫名.so

位置無關代碼

在調用編譯器驅動程序時,命令中用到了 -fpic,指示編譯器生成與位置無關的代碼

而位置無關代碼是可以加載而無需重定位的代碼。可以把他們加載到內存的任何位置而無需鏈接器修改。

教材學習和代碼運行中的問題和解決過程

  • 問題1:編譯時:"-Og",學習解析多重定義的全局符號時:"-Wall"什麽作用
  • 問題1解決方案:表示使用全局優化;會打開一些很有用的警告選項,建議編譯時加此選項。
    鏈接: gcc 編譯選項
  • 問題2:

技術分享圖片

技術分享圖片

對於第二種方式中的簡寫規則存在模糊不清

  • 問題2解決方案:首先我猜想是在靜態庫名裏面按順序隨意挑選字符進行模糊匹配

我在自己的虛擬機上進行測試
技術分享圖片

技術分享圖片

然後我發現書上第一種方式是可行的,但是第二種似乎是不可行的。
在觀察了它們的報錯後我發現在嘗試按照書上寫以下命令時它的報錯與其他的不一樣

技術分享圖片

技術分享圖片

所以我去查了一下/usr/bin/ld放的是什麽東西

Linux中出現/usr/bin/ld: cannot find -lxxx報錯該怎麽辦?

技術分享圖片

在看到小橘框標識所處的地方我開始猜想是不是靜態庫命名有標準,不能隨意起,是否是"lib+名"?

於是我進一步進行試驗
技術分享圖片

經試驗證實我的猜測正確,再加上後來我接著看小橘框的下一行,更加作證了我的想法。

縮寫格式為"-l"+".a名字的除了lib的部分"。其實就少些了兩個字母而已,2333

如果一定不想用"lib"+"名字"的方式起自己的靜態庫名字,用第一種方式也是可以運行出來的。

  • 問題3:技術分享圖片

紅色框框之處語義矛盾,到底放哪?

  • 問題3解決方案:結合圖中下面那個例子,我猜人邏輯理解的“之前”在命令行表現為放到後面。

代碼托管

技術分享圖片

上周考試錯題總結

  • Y86-64中()指令沒有訪存操作.

A .
rrmovl
B .
irmovq
C .
rmmovq
D .
pushq
E .
jXX
F .
ret

正確答案: A B E

4.3節

  • 有關磁盤操作,說法正確的是()

A .
對磁盤扇區的訪問時間包括三個部分中,傳送時間最小。

B .
磁盤以字節為單位讀寫數據

C .
磁盤以扇區為單位讀寫數據

D .
讀寫頭總處於同一柱面

正確答案: A C D

p409

  • 有關RAM的說法,正確的是()

A .
SRAM和DRAM掉電後均無法保存裏面的內容。

B .
DRAM將一個bit存在一個雙穩態的存儲單元中

C .
一般來說,SRAM比DRAM快

D .
SRAM常用來作高速緩存

E .
DRAM將每一個bit存儲為對一個電容充電

F .
SRAM需要不斷刷新

G .
DRAM被組織為二維數組而不是線性數組

正確答案: A C D E G

p400

  • 有關exec系列函數,下面說法正確的是()

A .
可以用char[][] 來傳遞argv

B .
進程調用了exec系列函數後,pid會變

C .
進程調用了exec系列函數後,代碼會改變。

D .
system()和exec系列等價。

E .
exec系列函數中帶e的要傳入環境變量參數

F .
exec系列函數中帶v的要傳入環境變量參數

正確答案: C E

不能用char[][] 來傳遞argv,結尾的0(null)無法處理;system=fork+exec+wait;

結對

  • 本周結對學習情況
    • 20155328
    • 結對照片
    • 結對學習內容
      • 第十四周博客

學習進度條

時間 代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 16篇 400小時
第1周 9/9 1/1 19/19 熟練下載安裝技能,鍛煉解決問題能力
第2周 380/389 2/3 26/45 1、7章
第3,4周 1270/1659 3/6 42/87 2、10章
第5周 20/1679 2/8 30/117 實驗一&3章
第6周 223/1902 1/9 20/137 課堂測試、課下作業、第八章
第7周 3020/4770 2/11 20/157 實驗二、第四章
第8、9周 21665/26435 3/14 55/212 實驗三、第六章
第10、11周 410/26845 3/17 40/252 實驗四、第九章
第12、13周 2437/287021 2/19 38/290 實驗五、第十二章

參考資料

  • gcc 編譯選項
  • Linux中出現/usr/bin/ld: cannot find -lxxx報錯該怎麽辦?

20155325 2017-2018 1 《信息安全系統設計基礎》 第十四周學習總結