1,OBJ文件的概念:
ELF文件格式(可重定向文件(obj),可執行文件,共享文件(so),核心存儲文件(core dump file)),use command "file" to show
the file's information.
ELF header,text section 放代碼段,data section:全局賦值變量 , bss:局部靜態,未定義。... Symbol table
debug command: 與tool-chain有關係1) objdump[-h,-d,-s,-x] nm{查看文件中有多少函數,-l 可以查案具體屬於哪個文件中}
OS linux:2) size 3) readelf [-h,-s]
GCC attribute use: http://gong301.blog.163.com/blog/static/18388590720117215204552/
GCC build command :-g{show debug info} -strip{decrease debug info}
每個目標文件,其因爲沒有分配虛擬地址,都是互相獨立,從0x00000000
2, OBJ之間的靜態鏈接
build command:ld -static
link static library:-l[lib name]
GCC compiler:use "-verbose"可以將整個編譯鏈接過程中間步驟打印出來。
debug command: 查看lib庫是由哪幾個.o組成,可以使用ar{tool-chain有關係}【-t/-x】來查看。
objdump/nm/readelf是可以作用所有elf文件格式。
缺陷:其因爲這個文件中包含所有.o的一份copy,size上會比較大。如果lib中的一個.o修改了,那麼就需要
更新整個lib,這樣子維護都比較麻煩。因爲其生成lib之後就很容易確定他在虛擬地址的空間,所以很容易定位。
3,OBJ之間的動態鏈接
概念:該lib庫可以指出需要使用的.o,在運行的時候採取鏈接載入。具有了一定靈活性,且修改.o只需要更新
該.o就可以。不同的lib可以共享同一個o文件。
地址空間:因爲不知道他真正地址,轉載時候才知道,所以其地址是從0x00000000開始。
不同進程使用同一共享庫:其會將該共享庫copy一份到進程地址空間,所以最原始的共享庫中斷數據量並沒有改變,
修改的只是該so的一份備份,所以如果so中有全局變量,這個時候不同進程並不會同時影響這個全局變量,只是影響
該so的備份中的全局變量。 所以,進程之間如果要共享so中全局變量,必須時候特別的共享方式。
4, 程序的裝載
一個執行程序需要運行,那麼就需要將其載入到memory中去執行相關性的機器指令集。
1 ) 查看進程中每個process中各個庫使用VM的情況:cat /proc/${PID}/maps .
2 ) 使用了虛擬地址空間,採用的是分頁映射機制載入。
3 )其實裝載過程就是去動態運行可執行文件,也可以理解爲進程的運行,那麼讓一進程工作,需要做什麼:
step1,爲進程創建一個獨立的虛擬地址空間。
step2,讀取裝載的可執行文件頭,並且建立虛擬地址空間與可執行文件的映射關係。
step3,將CPU指令就成年期設定爲可執行文件的入口地址,啓動運行。
因此,一個進程只有一個路口地址(表現爲main)。
http://mqzhuang.iteye.com/blog/901602【process 虛擬內存分佈】