【问题标题】:modified elf symbol but not reflecting in disassembly修改了精灵符号但在反汇编中没有反映
【发布时间】:2017-11-02 19:21:12
【问题描述】:

我在来自链接器脚本的汇编代码中使用了一个符号“__copy_start”。符号在符号表中定义为 ABS。 该符号用于宏内部,用于将数据从一个内存位置复制到另一个内存位置。 在查看了直接在 elf 中修改此符号的 varenter 代码异端方法后,我决定编写自己的 C 代码来修改符号值。 为此,我遍历了整个符号表并对我感兴趣的符号进行了字符串匹配。当存在符号名称匹配时,我只是分配了 symbol_table.st_value = new value。 为了确保采用新值,我执行了 readelf -s 并检查它是否显示了我分配的新值。

现在,当我反汇编修改后的精灵时,我发现新值没有生效,我仍然看到汇编代码正在从旧符号值复制。

我的问题是: 我在这里做错了吗?是否可以更改精灵中的符号值?如果是,请告诉我正确的方法。我如何实现我打算在这里做的事情。

注意:我没有源代码所以采取这种方法。

提前致谢, 高拉夫

想添加更多信息,以便人们更好地理解。 复制下面的精灵头:

ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  **Type:                              EXEC (Executable file)**
  Machine:                           Ubicom32 32-bit microcontrollers
  Version:                           0x1
  Entry point address:               0xb0000000
  Start of program headers:          52 (bytes into file)
  Start of section headers:          33548 (bytes into file)
  Flags:                             0x6
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         2
  Size of section headers:           40 (bytes)
  Number of section headers:         6
  Section header string table index: 3

在这里,您可以看到该文件是可执行文件类型。 readelf -S 的输出复制如下: 有 6 个节头,从偏移量 0x830c 开始:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        3ffc0000 004000 000ebc 00  AX  0   0  1
  [ 2] .sdram            PROGBITS        50000000 008000 0002e4 00  WA  0   0  1
  [ 3] .shstrtab         STRTAB          00000000 0082e4 000028 00      0   0  1
  [ 4] .symtab           SYMTAB          00000000 0083fc 0001c0 10      5  20  4
  [ 5] .strtab           STRTAB          00000000 0085bc 00019a 00      0   0  1

我在指令中使用名为“__copy_start”的符号之一将数据从 .sdram 部分复制到 .text 部分。我的印象是我可以去更改 symbol_table.st_value,然后完成所需的工作。但不幸的是,事实并非如此。好像它已经编译了,不能像这样更改。 任何想法如何做到这一点都会非常有帮助。

问候, 高拉夫

【问题讨论】:

    标签: elf


    【解决方案1】:

    您确定目标代码实际上使用重定位来引用__copy_start 符号处的数据吗?即使对于与位置无关的代码,通常也可以将段起始地址转换为相对地址,而无需重定位。 (符号本身以绝对地址存在并不会改变这一点。)

    您可以使用readelf -reu-readelf -r 并检查输出来检查这一点。它在objdump --dissassemble --reloc 输出中也可见。

    【讨论】:

    • 感谢您的回复。实际上该部分不是可重定位部分,符号表不是动态的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 2010-10-08
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    相关资源
    最近更新 更多