計算機系統基礎學習 技術日誌一(第七章 鏈結)

2021-09-27 13:16:12 字數 3687 閱讀 2931

include #include "vector.h"

int x[2] = ;

int y[2] = ;

int z[2];

int main()

int addcnt = 0;

void addvec(int *x, int *y, int *z, int n)

*1.使用gcc -c main2.c命令編譯main2.c 檔案,生成main2.o檔案

2.使用readelf -h main2.o來檢視elf頭

得到elf頭如下:

magic:表示該檔案是elf目標檔案,第乙個位元組7f是固定的數,後面的45 4c 46這三個位元組是e,l,f三個字元的ascii碼形式

類別(class):表示檔案的型別是64位的elf格式

資料(data):表示檔案中型別的格式組織(大端法或小端法) 這裡是小端法

版本(version):elf檔案頭的版本號 這裡的版本號為1

os/abi: 表示作業系統的型別 這裡是unix - system v

abi 版本: 為abi版本號 這裡為0

型別(type):表示elf檔案型別 這裡的是可重定位目標檔案rel (共有三種,還有兩種為可執行目標檔案exec和共享目標檔案)。

系統架構(machine): 表示機器的型別 這裡為x86-64

版本(version)(第二個):表示當前目標檔案的版本號 這裡是1。

入口點位址(entry point address): 表示程式的虛擬位址入口點 這裡為零(因為沒有鏈結,是不可執行的程式)

程式頭起點(start of program headers): 這個程式沒有程式頭

start of section headers: sections 頭的開始處 這裡的1000是十進位制,即開始的位址為0x3e8

標誌(flags):這是乙個與處理器相關聯的標誌 x86 平台(該機器)上此處為 0 。

本頭的大小(size of this header):elf檔案頭的位元組數 這裡是64位元組

標誌頭的大小(size of program headers): 每個程式頭的大小 因為不可執行,所以這裡為0

number of program headers: 程式頭的數目 因為不可執行,所以這裡為0

節頭大小(size of section headers): section頭的大小 這裡是64位元組。

節頭數量(number of section headers): section頭的數量 這裡有13個

字串表索引節頭(section header string table index): section 頭字串表索引號 這裡的索引號為10

1.使用gcc main2.c addvec.c -o main2命令編譯,生成main2.o檔案

2.使用readelf -h main2來檢視elf頭

此處出現的錯誤:開始用的readelf -h main2.o 結果出錯

得到elf頭如下:

格式無誤但是上傳失敗 下面寫出不同處

型別:exec可執行檔案

入口點位址:0x400430

程式頭起點:64

start of section headers: 6808

標誌頭的大小(size of program headers): 56

number of program headers: 9

節頭數量(number of section headers): 31

字串表索引節頭(section header string table index): 28

從這裡可以看到,之前因為不可執行顯示為0的地方有了數值

3.使用readelf -s main2.o命令

得到elf頭如下:

4.使用命令gcc main2.c addvec.c -fpic -shared -o main2.so生成main2.so,之後使用命令readelf -s main2.so

得到結果:

可以發現,value是有值的,addvec的ndx也是有值的

5.使用命令readelf -s main2.o

得到結果:

首位址 名稱 大小

00000000 elf頭(指向0x3e8) 無

00000040 .text 41

00000088 .data 10

00000098 .bss 00

000000a5 .comment 36

00000118 .symtab 168

00000280 .strtab 22

000002a8 .rela.text c0

00000380 .shstrtab 61

000003e8 節頭表

類似與袁春風老師ppt中的表,但順序不同

6.使用命令objdump -s main2.o

得到結果:

objdump -d main2進行鏈結操作

計算機系統基礎學習技術日誌三(I O)

linux中有一句話叫,一切皆檔案。每個linux檔案都有乙個型別來表明它在系統中的角色 1.普通檔案 包含任意資料。應用程式常常要區分文字檔案和二進位制檔案,文字檔案即只含有ascii或unicode字元的普通檔案,二進位制檔案是所有其他檔案 2.目錄檔案 包含一組鏈結的檔案。其中每個鏈結都將乙個...

深入計算機系統基礎 系統級I O技術日誌

概念 所有的i o裝置都被模型化為檔案,而所有的輸人作對相應檔案的讀和寫來執行。這種將裝置優雅地對映為檔案的方式,允許linux核心出乙個簡單 低階的應用介面,稱為unix 1 o。於 深入計算機系統基礎 第三版 分別呼叫read和write函式來執行輸入和輸出 觀察以下 what would th...

計算機系統基礎

includeint main return 0 如果將表示式換成 2147483647 1 2147483647 結果又會怎麼樣呢 編譯器如何處理字面量 高階語言中運算規則 高階語言與指令之間的對應 機器指令的執行過程 機器級資料的表示和運算 sum int a unsigned int len ...