linux下的a.out文件


 
 當然這里,我更重要的是強調這個什么段,什么段。這以前就知道。但其實是對一個可以執行的c語言程序的分析。就好比你分析一篇作文。有標題。有段落。

.out文件就是擴展名為out的文件,它本身不代表任何信息。在Linux中判斷文件是否是可執行文件,首先要看文件的屬性是否是可執行的,它沒有一個默認的擴展名表示此文件為可執行文件。為了方便,Linux中可執行文件一般都是沒有擴展名的。
在使用gcc編程時,沒有指定輸入可執行文件名,默認生成可執行文件a.out文件。執行時必須鍵入命令 ./a.out,即要帶上擴展名,如果鍵入./a 則不正確,因為它尋找a這個文件,而不是a.out這個文件。

a.out是由OMAGIC, NMAGIC, QMAGIC, 或者 ZMAGIC發展過來的一種可執行文件格式.
OMAGIC :在文件頭之后就是各個段,但是部分文本段和數據段.
NMAGIC:和OMAGIC差不多,但是數據段在代碼段之后加載之后就立即加載數據段,並且將代碼段標示位只讀.
ZMAGIC:只是增加了對頁需求的支持.
QMAGIC:這種格式可以將文件頭和代碼段的第一頁合並起來,這樣可以節省空間.它一般會在虛擬地址的最低地址加載一頁,來處里NULL地址引起的段錯誤.

一個典型的a.out文件由一下7部分組成,按順序有這些段:
exec header:文件頭
   這一段中含有一些參數,內核利用其中一些參數來把二進制文件加載到內存中並執行.ld利用另外一些參數來連接其它的二進制文件.這個段是唯一含有命令參數的.

text segment:代碼段
   包括在程序執行時加載到內存中的機器碼和相關數據.有可能是只讀的.

data segment:數據段
   包括初始化過的數據變量.通常是加載到內存中的可寫去中.

text relocations:代碼重定向
   包含編譯連接二進制文件時的記錄,這些記錄使用來更新代碼段中的指針.

data relocations:數據重定向
   和代碼重定向相似,區別是它針對於數據段的指針.

symbol table:符號表
   包含連接器對不同二進制文件中的變量,函數和地址之間的對應關系的記錄.

string table:字符串表
   包含和符號名字相一致的字符串.

每一種二進制文件都是以這樣的一個數據結構開始的:
           struct exec {
                   unsigned long   a_midmag;
                   unsigned long   a_text;
                   unsigned long   a_data;
                   unsigned long   a_bss;
                   unsigned long   a_syms;
                   unsigned long   a_entry;
                   unsigned long   a_trsize;
                   unsigned long   a_drsize;
           };
a_midmag:保存的是主機字節序, I由這些宏來訪問其中的部分bit位: N_GETFLAG(), N_GETMID(), N_GETMAGIC(), 由宏 N_SETMAGIC().來設置這個字段.
a_text    代碼段的大小Contains the size of the text segment in bytes.

a_data    數據段的大小Contains the size of the data segment in bytes.

a_bss     bss segment中字節數和被內核用來初始化數據段之后的BRK (bss = block started by symbol)//這里的理解還是有點問題

a_syms    符號表的大小

a_entry   保存在程序被內核加載到內存中后程序的起始地址,內核由此地址開始執行程序

a_trsize 代碼重定向表的大小

a_drsize 數據重定向表的大小


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM