linux下的a.out文件
生活随笔
收集整理的這篇文章主要介紹了
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 數據重定向表的大小
.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 數據重定向表的大小
轉載于:https://www.cnblogs.com/zhangfeionline/p/5967671.html
總結
以上是生活随笔為你收集整理的linux下的a.out文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Xcode8.0 删除插件路径
- 下一篇: [四校联考P3] 区间颜色众数 (主席