讀書筆記之Linux目標文件調試說明

 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 虛擬內存分佈】

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章