无法从C语言的.ELF文件中读取一个片段

问题描述 投票:0回答:1

我正在尝试读取一个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
```
c elf segment fseek
1个回答
0
投票

一切正常:十进制表示法的1024等于十六进制表示法的0x400,而0x8000等于32768。

无论如何,如果需要以十六进制表示形式的结果,请使用%x格式而不是%d

printf("\n%x",segment.p_offset);
printf("\n");
printf("pyshical address: ");
printf("%x",segment.p_paddr);
© www.soinside.com 2019 - 2024. All rights reserved.