修改后的精灵符号但不反映在反汇编中

时间:2017-11-02 19:21:12

标签: elf

我使用了一个符号" __ copy_start"在汇编代码中,它来自链接描述文件。符号在符号表中定义为ABS。 此符号在宏内部用于将数据从一个内存位置复制到另一个内存位置。 在查看了varenter代码以及在elf中直接修改此符号的方法后,我决定编写自己的C代码来修改符号值。 为此,我遍历整个符号表并为我感兴趣的符号进行字符串匹配。当存在符号名称匹配时,我只分配了symbol_table.st_value =新值。 为了确保获取新值,我做了readelf -s并检查它是否显示了我指定的新值。

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

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

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

提前致谢, 拉夫

希望添加更多信息,以便人们可以更好地理解。 复制下面的精灵标题:

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,然后完成所需的工作。但不幸的是情况并非如此。好像它已经编译好了,不能像这样改变。 任何想法如何做到这一点都会非常有用。

此致 拉夫

1 个答案:

答案 0 :(得分:0)

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

您可以使用readelf -reu-readelf -r检查输出并进行检查。它在objdump --dissassemble --reloc输出中也可见。