无法从 C 中的 .ELF 文件中读取一个段
Trouble reading one segment from a .ELF file in C
我正在尝试读取一个 ELF 文件以访问它拥有的一个段。到目前为止,我已经阅读了文件的 header,它显示段部分的偏移量从文件的开头开始 52 个字节 (header.e_phoff),所以我尝试使用 fseek(fitxer , header.e_phoff, SEEK_SET );但是当我读取该段并打印它时,它显示 header 的偏移量是 1024,物理地址是 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);
我正在尝试读取一个 ELF 文件以访问它拥有的一个段。到目前为止,我已经阅读了文件的 header,它显示段部分的偏移量从文件的开头开始 52 个字节 (header.e_phoff),所以我尝试使用 fseek(fitxer , header.e_phoff, SEEK_SET );但是当我读取该段并打印它时,它显示 header 的偏移量是 1024,物理地址是 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);