【发布时间】: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