blog.csdn.net/20180519103243489?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Rlc3RfYmFubmVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/85)
3. 節(jié)表
節(jié)表是可執(zhí)行文件中的一個數(shù)據(jù)結(jié)構(gòu),它記錄了文件中所有的節(jié)(Section)的信息,如節(jié)的名稱、大小、起始位置等等。在Windows操作系統(tǒng)中,節(jié)表是為了方便程序員進行內(nèi)存管理而存在的。每個節(jié)都有自己的一塊內(nèi)存空間,程序員可以在其中存儲代碼、數(shù)據(jù)等信息。
4. 節(jié)數(shù)據(jù)
節(jié)數(shù)據(jù)是可執(zhí)行文件中實際存儲的代封裝網(wǎng)頁生成器電腦軟件碼和數(shù)據(jù),它們按照節(jié)表中的描述分別存儲在不同的節(jié)中。
二、生成PE格式的可執(zhí)行文件
在Windows平臺上,我們可以使用多種編程語言來生成PE格式的可執(zhí)行文件,如C、C++、C#等等。這里以C語言為例,簡要介紹如何生成PE格式的可執(zhí)行文件。
1. 編寫代碼
首先,我們需要編寫程序代碼。在C語言中,我們可以使用標準庫函數(shù)來實現(xiàn)各種功能。下面是一個簡單的示例程序,它實現(xiàn)了從命令行讀取一個字符串并輸出到屏幕上。
“`
#include
int main(int argc, char *argv[])
{
char str[100];
printf(“Enter a string: “);
scanf(“%s”, str);
printf(“You entered: %s\n”, str);
return 0;
}
“`
2. 編譯代碼
編寫好程序代碼后,我們需要用編譯器將其編譯成可執(zhí)行文件。在Windows平臺上,我們可以使用Microsoft Visual Studio等集成開發(fā)環(huán)境來編譯代碼。在Visual Studio中,我們可以創(chuàng)建一個控制臺應用程序項目,將上面的代碼復制到項目中,并點擊“生成”按鈕即可生成可執(zhí)行文件。編譯后的可執(zhí)行文件默認會存儲在項目目錄下的“bin”文件夾中。
3. 生成PE格式的可執(zhí)行文件
編譯后的可執(zhí)行文件默認是以COFF格式存儲的,我們需要使用工具將其轉(zhuǎn)換成PE格式的可執(zhí)行文件。在Windows平臺上,有多種工具可以實現(xiàn)這個功能,如objcopy、objdump等等。這里我們介紹一種比較常用的工具——Microsoft的link.exe。
link.exe是Visual Studio自帶的鏈接器,它可以將COFF格式的可執(zhí)行文件轉(zhuǎn)換成PE格式的可執(zhí)行文件。我們可以使用link.exe的命令行界面來進行操作。打開命令提示符,進入到可執(zhí)行文件所在的目錄,執(zhí)行以下命令即可生成PE格式的可執(zhí)行文件。
“`
link /subsystem:console /entry:main /out:myapp.exe myapp.obj
“`
其中,/subsystem參數(shù)指定了程序的子系統(tǒng)類型,這里我們選擇了控制臺應用程序;/entry參數(shù)指定了程序的入口點,這里我們選擇了main函數(shù);/out參數(shù)指定了輸出文件的名稱,這里我們選擇了myapp.exe;myapp.obj是編譯后的目標文件。
執(zhí)行完上述命令后,我們就生成了一個PE格式的可執(zhí)行文件myapp