首页 > 解决方案 > 如何确定各种 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)

标签: c++ccompiler-constructionelf

解决方案


推荐阅读