我正在尝试读取一个ELF文件,以访问该文件所在的段。到目前为止,我已经阅读了文件的标头,它表明段节的偏移量从文件的开头(header.e_phoff)开始52个字节,因此我尝试使用fseek(fitxer,header.e_phoff,SEEK_SET );但是,当我阅读并打印该段时,它表明标头的偏移量为1024,而pyshical地址为32768,当它们应分别为0x000400和0x00008000时。
FILE* fitxer = fopen(string,"rb");
if(fitxer)
{
fread(&header, 1, sizeof(header), fitxer);
fseek(fitxer, header.e_phoff, SEEK_SET );
fread(&segment, 1, sizeof(segment), fitxer);
}
fclose(fitxer);
printf("offset: ");
printf("\n%d",segment.p_offset);
printf("\n");
printf("pyshical address: ");
printf("%d",segment.p_paddr);
printf("\n");
我在做什么错?
$ arm-none-eabi-readelf -l HOLA.elf
Elf file type is EXEC (Executable file)
Entry point 0x8000
There are 1 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x000400 0x00008000 0x00008000 0x0019f 0x0019f R E 0x400
Section to Segment mapping:
Segment Sections...
00 .text .rodata
```
一切正常:十进制表示法的1024等于十六进制表示法的0x400,而0x8000等于32768。
无论如何,如果需要以十六进制表示形式的结果,请使用%x
格式而不是%d
:
printf("\n%x",segment.p_offset);
printf("\n");
printf("pyshical address: ");
printf("%x",segment.p_paddr);