您好,现在我来为大家解答以上的问题。elf文件怎么打开,eln文件怎么打开相信很多小伙伴还不知道,现在让我们一起来看看吧!
1、Linux ELF ELF = Executable and Linkable Format,可执行连接格式,是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的。
2、扩展名为elf。
3、工具接口标准委员会(TIS)选择了正在发展中的ELF标准作为工作在32位INTEL体系上不同 *** 作系统之间可移植的二进制文件格式。
4、假定开发者定义了一个二进制接口集合,ELF标准用它来支持流线型的软件发展。
5、应该减少不同执行接口的数量。
6、因此可以减少重新编程重新编译的代码。
7、编辑本段文件格式Linking View Elf headerProgram header table optionalsection1……section nsection header tableExection View Elf headerProgram header table segment 1section 2……segment header table一个ELF头在文件的开始,保存了路线图(road map),描述了该文件的组织情况。
8、sections保存着object 文件的信息,从连接角度看:包括指令,键郑数据,符号表,重定位信息等等。
9、特别sections的描述会出项在以后手谨的第一部分。
10、第二部分讨论了段和从程序的执行角度看文件。
11、 假如一个程序头表(program header table)存在,那么它告诉系统如何来创建一个进程的内存映象。
12、被用来建立进程映象(执行一个程序)的文件必须要有一个程序头表(program header table);可重定位文件不需要这个头表。
13、一个section头表(section header table)包含了描述文件sections的信息。
14、每个section在这个表中有一个入口;每个入口给出了该section的名字,大小,等等信息。
15、在联接过程中的文件必须有一个section头表;其他object文件可要可不要这个section头表。
16、 注意: 虽然图显示出程序头表立刻出现在一个ELF头后,section头表跟着其他section部分出现,事实是的文件是可以不同的。
17、此外,sections和段(segments)没有特别的顺序。
18、只有ELF头(elf header)是在文件的固定位置。
楼主,这个恐怕不是一个函数能解决的,ELF文件格式还是有点复杂的。 我以前做过类似的功能,从ELF文件中加载所有符号表信息,字符串信息,并下载代码。 我推荐你用一个开源的液滚库:ELFIO。 我想这个库应该可以实现你的功能,只是你要去闹皮余研究一下它的用法。 当然,你得首先对ELF文件格式有所了解。ELFIO库下载地址: http://sourceforge.net/projects/elfio/ ================================这是我以前写过的加载ELF中所有Section信息的例子: BOOL LoadELF(char* pFilename){
CString strName,tmp
IELFI* pReader
if ( ERR_ELFIO_NO_ERROR != ELFIO::GetInstance()->CreateELFI( &pReader ) ) {
Msg( "Can't create ELF reader.\r\n",2,0)
return FALSE
}
if ( ERR_ELFIO_NO_ERROR != pReader->Load(pFilename ) ) {
Msg( "Can't open input elf file.\r\n",2,0)
return FALSE
} int nSecNo = pReader->GetSectionsNum()
for (int i = 0i <nSecNoi++ )
{ // For all sections
const IELFISection* pSec = pReader->GetSection( i )
printf("%s\n",pSec->GetName().c_str())
Elf32_Half index= pSec->GetIndex()
std::string name = pSec->GetName()
Elf32_Word type =pSec->GetType()
Elf32_Addr addr = pSec->GetAddress()
Elf32_Word size = pSec->GetSize()
Elf32_Word link = pSec->GetLink()
Elf32_Word info = pSec->GetInfo()
Elf32_Word aa = pSec->GetAddrAlign()
Elf32_Word esize = pSec->GetEntrySize()
const char* p = pSec->GetData()
Elf32_Word flag = pSec->GetFlags()
strName = pSec->GetName().c_str()strName.MakeUpper()
//如果未指定section,读取所有SHF_EXECINSTR属性的Section
if(g_MapScetion.GetCount()==0)
{
if(flag&SHF_EXECINSTR)
LoadElfSection((BYTE*)pSec->GetData(),pSec->GetAddress(),pSec->GetSize(),pList,pAddInfo)
}
else
{
if(g_MapScetion.Lookup(strName,tmp))
LoadElfSection((BYTE*)pSec->握数GetData(),pSec->GetAddress(),pSec->GetSize(),pList,pAddInfo)
}
pSec->Release()
} pReader->Release()
return TRUE
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)