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