首页 > 解决方案 > 无法从 C 中的 .ELF 文件中读取一个段

问题描述

我正在尝试读取一个 ELF 文件以访问它拥有的一个段。到目前为止,我已经阅读了文件的标题,它显示段部分的偏移量从文件开头开始 52 个字节(header.e_phoff)所以我尝试使用 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
```

标签: celfsegmentfseek

解决方案


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

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

printf("\n%x",segment.p_offset);
printf("\n");
printf("pyshical address: ");
printf("%x",segment.p_paddr);

推荐阅读