c++ - 如何确定各种 ELF 文件部分的物理加载地址?
问题描述
当我 objdump 从 GHS Multi 发出的 ELF 文件时,每个部分的物理地址字段设置为 0;但是,节文件偏移量是可用的,但这些偏移量与链接器指令文件中的内存区域地址不对应,因此仅凭偏移量是不够的;因为它们似乎只是文件偏移量。
问题:如何计算每个部分的物理加载地址?
我的想法是通读 ELF 文件并确定 90 个部分中每个部分的加载地址,然后检查该地址所在的内存范围。通过这种方式,我可以统计每个内存区域的内存使用情况;内部 sram、外部 sram、flash、dataflash 等。
这个想法有缺陷吗?还有什么我想念的吗?
不使用虚拟寻址。它是一个用于 32 位微控制器的简单可执行文件。我们在 Renesas RH850 上运行 RTOS。没有 MMU 或 MPU 处于活动状态。程序入口点直接挂接到处理器复位向量;例外:我们在生产中使用小型引导加载程序,但直接从引导加载程序跳转到映像的起始地址。
我希望我可以分享地图文件或 ELF,但不幸的是,这不是我的分享。但是,我可以分享readelf
.
有 92 个节头,从偏移量 0xa2d6b0 开始:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] /DISCARD/ PROGBITS 00000000 000000 000000 00 0 0 0
[ 2] .text PROGBITS 00000000 000040 0c596a 00 AX 0 0 2
[ 3] .data PROGBITS 00000000 0c59b0 0038b8 00 WA 0 0 8
[ 4] .bss NOBITS 00000000 000000 0033b0 00 WA 0 0 8
[ 5] .entry_section PROGBITS 00000000 0c9268 0000e8 00 AX 0 0 2
[ 6] .vectorTableCOde PROGBITS 00000000 0c9350 000004 00 AX 0 0 2
[ 7] .rela.text RELA 00000000 0c9354 0a4b14 0c 89 2 4
[ 8] .rela.entry_secti RELA 00000000 16de68 000108 0c 89 5 4
[ 9] .rela.vectorTable RELA 00000000 16df70 00000c 0c 89 6 4
[10] .rodata PROGBITS 00000000 16df7c 135928 00 A 0 0 4
[11] .note.renesas NOTE 00000000 2a38a4 000050 00 0 0 4
[12] .bss_sram NOBITS 00000000 000000 07acd0 00 WA 0 0 8
[13] .rbss NOBITS 00000000 000000 00b5dc 00 WA 0 0 8
[14] .rela.data RELA 00000000 2a38f4 002124 0c 89 3 4
[15] .rela.rodata RELA 00000000 2a5a18 00d41c 0c 89 10 4
[16] .rela.ghsinfo RELA 00000000 2b2e34 000774 0c 89 88 4
[17] .slbss NOBITS 00000000 000000 003534 00 WA 0 0 8
[18] .applicationInfo PROGBITS 00000000 2b35a8 000040 00 A 0 0 4
[19] .applicationEnd PROGBITS 00000000 2b35e8 000014 00 A 0 0 4
[20] .R_FDL_Text PROGBITS 00000000 2b35fc 0016ea 00 AX 0 0 2
[21] .rela.R_FDL_Text RELA 00000000 2b4ce8 001278 0c 89 20 4
[22] .R_FDL_Const PROGBITS 00000000 2b5f60 000014 00 A 0 0 4
[23] .R_FDL_Data NOBITS 00000000 000000 000064 00 WA 0 0 4
[24] .OS_CONST PROGBITS 00000000 2b5f80 0002b4 00 A 0 0 16
[25] .rela.OS_CONST RELA 00000000 2b6234 000624 0c 89 24 4
[26] .OS_CODE PROGBITS 00000000 2b6858 0114c0 00 AX 0 0 4
[27] .rela.OS_CODE RELA 00000000 2c7d18 0094b0 0c 89 26 4
[28] .OS_CORE0_CONST PROGBITS 00000000 2d11c8 002af0 00 A 0 0 8
[29] .OS_CORE0_VAR_NOI NOBITS 00000000 000000 001604 00 WA 0 0 8
[30] .rela.OS_CORE0_CO RELA 00000000 2d3cb8 0040bc 0c 89 28 4
[31] .OS_STACK_BLETASK NOBITS 00000000 000000 001000 00 WA 0 0 4
[32] .OS_STACK_BSWTASK NOBITS 00000000 000000 001000 00 WA 0 0 4
[33] .OS_STACK_CANCM_T NOBITS 00000000 000000 000400 00 WA 0 0 4
[34] .OS_STACK_CANCOM_ NOBITS 00000000 000000 000800 00 WA 0 0 4
[35] .OS_STACK_CLITASK NOBITS 00000000 000000 000400 00 WA 0 0 4
[36] .OS_STACK_CPUMONI NOBITS 00000000 000000 000400 00 WA 0 0 4
[37] .OS_STACK_CHIMEAP NOBITS 00000000 000000 001388 00 WA 0 0 4
[38] .OS_STACK_CHIMEDR NOBITS 00000000 000000 000fa0 00 WA 0 0 4
[39] .OS_STACK_DIRANAB NOBITS 00000000 000000 000400 00 WA 0 0 4
[40] .OS_STACK_DIRANAD NOBITS 00000000 000000 000320 00 WA 0 0 4
[41] .OS_STACK_EXTAMPT NOBITS 00000000 000000 000800 00 WA 0 0 4
[42] .OS_STACK_HWTIMER NOBITS 00000000 000000 000320 00 WA 0 0 4
[43] .OS_STACK_IPC2TAS NOBITS 00000000 000000 000400 00 WA 0 0 4
[44] .OS_STACK_IPCMPTA NOBITS 00000000 000000 000400 00 WA 0 0 4
[45] .OS_STACK_IDLETAS NOBITS 00000000 000000 000400 00 WA 0 0 4
[46] .OS_STACK_IPCGATE NOBITS 00000000 000000 000400 00 WA 0 0 4
[47] .OS_STACK_KEYTASK NOBITS 00000000 000000 000800 00 WA 0 0 4
[48] .OS_STACK_LOGGERT NOBITS 00000000 000000 000800 00 WA 0 0 4
[49] .OS_STACK_MODULEM NOBITS 00000000 000000 000800 00 WA 0 0 4
[50] .OS_STACK_NVMTASK NOBITS 00000000 000000 001000 00 WA 0 0 4
[51] .OS_STACK_OSCORE_ NOBITS 00000000 000000 000800 00 WA 0 0 4
[52] .OS_STACK_OSCORE_ NOBITS 00000000 000000 001000 00 WA 0 0 4
[53] .OS_STACK_OSCORE_ NOBITS 00000000 000000 000400 00 WA 0 0 4
[54] .OS_STACK_OSCORE_ NOBITS 00000000 000000 000400 00 WA 0 0 4
[55] .OS_STACK_OSCORE_ NOBITS 00000000 000000 000800 00 WA 0 0 4
[56] .OS_STACK_OSCORE_ NOBITS 00000000 000000 000400 00 WA 0 0 4
[57] .OS_STACK_OSCORE_ NOBITS 00000000 000000 000400 00 WA 0 0 4
[58] .OS_STACK_OSCORE_ NOBITS 00000000 000000 000400 00 WA 0 0 4
[59] .OS_STACK_OSCORE_ NOBITS 00000000 000000 000400 00 WA 0 0 4
[60] .OS_STACK_OSCORE_ NOBITS 00000000 000000 001000 00 WA 0 0 4
[61] .OS_STACK_OSCORE_ NOBITS 00000000 000000 000800 00 WA 0 0 4
[62] .OS_STACK_OSCORE_ NOBITS 00000000 000000 000800 00 WA 0 0 4
[63] .OS_STACK_POLLING NOBITS 00000000 000000 000400 00 WA 0 0 4
[64] .OS_STACK_PWRAMPT NOBITS 00000000 000000 000800 00 WA 0 0 4
[65] .OS_STACK_RTCTASK NOBITS 00000000 000000 000400 00 WA 0 0 4
[66] .OS_STACK_TESTSIM NOBITS 00000000 000000 000400 00 WA 0 0 4
[67] .OS_STACK_TIMERTA NOBITS 00000000 000000 000400 00 WA 0 0 4
[68] .OS_STACK_VEHCFG3 NOBITS 00000000 000000 000960 00 WA 0 0 4
[69] .OS_STACK_VEHCFG4 NOBITS 00000000 000000 000320 00 WA 0 0 4
[70] .OS_STACK_VEHCFG5 NOBITS 00000000 000000 0004b0 00 WA 0 0 4
[71] .OS_STACK_VIDEOIN NOBITS 00000000 000000 000800 00 WA 0 0 4
[72] .OS_STACK_HWPWRCT NOBITS 00000000 000000 0005dc 00 WA 0 0 4
[73] .OS_STACK_SENSORT NOBITS 00000000 000000 000514 00 WA 0 0 4
[74] .OS_STACK_STARTUP NOBITS 00000000 000000 0008fc 00 WA 0 0 4
[75] .OS_STACK_SYSCTRL NOBITS 00000000 000000 000dac 00 WA 0 0 4
[76] .OS_STACK_VEHCFG1 NOBITS 00000000 000000 0005dc 00 WA 0 0 4
[77] .OS_STACK_VEHCFG2 NOBITS 00000000 000000 0005dc 00 WA 0 0 4
[78] .OS_EXCVEC_CORE0_ PROGBITS 00000000 2d7d80 0001fc 00 AX 0 0 512
[79] .OS_INTVEC_CORE0_ PROGBITS 00000000 2d7f80 000800 00 AX 0 0 512
[80] .rela.OS_EXCVEC_C RELA 00000000 2d8780 000180 0c 89 78 4
[81] .rela.OS_INTVEC_C RELA 00000000 2d8900 001800 0c 89 79 4
[82] .OS_VAR_NOCACHE_N NOBITS 00000000 000000 00000c 00 WA 0 0 4
[83] .OS_CORESTATUS_CO NOBITS 00000000 000000 000014 00 WA 0 0 4
[84] .OS_BARRIER_CORE0 NOBITS 00000000 000000 000008 00 WA 0 0 4
[85] .bootstrap PROGBITS 00000000 2da100 000040 00 AX 0 0 2
[86] .rela.bootstrap RELA 00000000 2da140 000018 0c 89 85 4
[87] .gstackfix PROGBITS 00000000 000000 000000 00 0 0 4
[88] .ghsinfo NOTE 00000000 2da158 000480 00 0 0 1
[89] .symtab SYMTAB 00000000 2da5d8 261080 10 90 110134 4
[90] .strtab STRTAB 00000000 53b658 4f173c 00 0 0 1
[91] .shstrtab STRTAB 00000000 a2cd94 00091c 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
p (processor specific)
解决方案
推荐阅读
- amazon-web-services - 在 Terraform 中使用外部数据源调用 Bash 脚本时出现问题
- laravel - 不支持的操作数类型:数组 + App\StockOut Laravel
- html - 如何通过引导程序对齐表格
- apigee - Spike Arrest 和配额政策如何在 ApiGee 中并行工作?
- r - 在 dplyr 中加速或替代 group by 和 lag
- amazon-web-services - Amazon S3 存储桶提供 AccessDenied
- java - jar中的log4j创建文件但不写入mac os中的日志文件
- reactjs - 如何防止对 redux 状态更改进行额外的钩子调用?
- python - 如何正确标记四边形标记形状的内角?
- android - 升级到 firebase-bom:27.0.0 后如何添加缺少的库?