elf文件不能執(zhí)行?
是lzs機(jī)后綴6?modbo4.0的固件在港版上有bug,這是可能的原因之一。
文件頭是什么?
首先,解釋為什么可執(zhí)行文件需要一個(gè)頭文件。
對(duì)于可執(zhí)行文件,操作系統(tǒng)在執(zhí)行它之前需要知道:
1、要看操作系統(tǒng)版本,比如有的只能在DOS下運(yùn)行,有的可以在Windows下運(yùn)行;有些必須在64位環(huán)境下運(yùn)行等等。
2.它的入口在哪里?不是所有可執(zhí)行文件的入口都在文件的前面,也有在中間或者后面的,所以需要描述一些東西。
3.其中哪部分是代碼,哪部分是數(shù)據(jù),因?yàn)橥ǔ?duì)于代碼來(lái)說(shuō),代碼部分應(yīng)該是只讀的,數(shù)據(jù)部分是可讀寫(xiě)的。
4.哪些數(shù)據(jù)需要初始化為0?通常在可執(zhí)行文件中,有一個(gè)叫BSS段的部分,需要操作系統(tǒng)在加載可執(zhí)行文件時(shí)清除BSS。
5.運(yùn)行時(shí)的虛擬地址是什么,如果無(wú)法加載到指定的地址(重定向表),操作系統(tǒng)該怎么辦。
6.初始寄存器值是多少?
……
因此,為了描述這些信息,有必要在可執(zhí)行文件中添加一個(gè)文件頭。否則,操作系統(tǒng)將無(wú)確加載和運(yùn)行可執(zhí)行文件。
那么有沒(méi)有一個(gè)可執(zhí)行文件不不需要標(biāo)題?答案是肯定的。
我記得兩件事:
首先是DOS時(shí)代的COM文件。這個(gè)文件的條目是它的第一個(gè)字節(jié)。大部分寄存器都是自己初始化的,大小不允許超過(guò)一個(gè)16位的段大小(64KB),所以功能非常有限。
另一個(gè)是嵌入式開(kāi)發(fā)用的BIN文件,其條目是它的第一個(gè)字節(jié)。有些BIN文件可以自己初始化段寄存器,所以基本上可以認(rèn)為是沒(méi)有文件頭的可執(zhí)行代碼。但是由于BIN沒(méi)有統(tǒng)一的規(guī)范,所以很難說(shuō)一個(gè)BIN文件有沒(méi)有頭。
然后,解釋為什么不同系統(tǒng)的文件頭不一樣。
一方面,由于歷史原因,不同的操作系統(tǒng)各自為戰(zhàn),造成了不同的格式。但更本質(zhì)的原因是不同的操作系統(tǒng)環(huán)境。例如,在WindowsXP32位系統(tǒng)中,在虛擬地址空間中,用戶(hù)地址占用0x00000000-0x7FFFFFFF的地址范圍,內(nèi)核空間地址是0x80000000-0xFFFFFFFF的地址范圍,用戶(hù)空間是2GB,內(nèi)核空間是2GB,通常是默認(rèn)的。但是,在Linux中,用戶(hù)空間是3GB,內(nèi)核空間是1GB。這種內(nèi)存分配的差異導(dǎo)致很多事情都不一樣,包括可執(zhí)行文件的入口地址范圍、可用內(nèi)存等。因此,Linux中的ELWindows中的f文件和PE文件不能定義的完全一樣。和PE格式都包含一個(gè)DOS文件頭,這在Linux中是沒(méi)有的。在PE中,要指定Windows子系統(tǒng)的類(lèi)型,Linux肯定不會(huì)支持。而且,DLL庫(kù)和SO庫(kù)是不同的。所以,基于以上原因,不同操作系統(tǒng)的可執(zhí)行文件頭文件格式是不一樣的。