c - 无法从 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
```
解决方案
一切正常:十进制的 1024 等于十六进制的 0x400,0x8000 等于 32768。
无论如何,如果您需要以十六进制表示的结果,请使用%x
format 而不是%d
:
printf("\n%x",segment.p_offset);
printf("\n");
printf("pyshical address: ");
printf("%x",segment.p_paddr);
推荐阅读
- javascript - 带有偏移量的画布 createPattern() 和 fill()
- python - 如何修复此 python 代码以获取我在代码中引用的表中的所有人员姓名?
- mips - 在 mips 程序集中显示浮点数的问题
- outlook-web-addins - outlook.office.com 上的插件是否存在额外边距出现的错误?
- java - 从 Alertdialog EditText 保存文本并显示到 Recyclerview 并永久保存
- networking - 我可以设置网络以在没有 Internet 访问权限的情况下共享信息吗?
- css - Angular:CSS封装bug-网格组件:悬停样式应用于兄弟网格组件
- arduino - 如何使用 NRF24L01 使用 Xbox 控制器远距离控制伺服电机
- python - 是否有 python 函数来获取 netcdf 索引、按值计数等
- c++ - ESP8266WebServer - 重构类,std::bind 和 handleRoot 问题