我使用了一个符号" __ 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,然后完成所需的工作。但不幸的是情况并非如此。好像它已经编译好了,不能像这样改变。 任何想法如何做到这一点都会非常有用。
此致 拉夫
答案 0 :(得分:0)
您确定目标代码实际上使用重定位来引用__copy_start
符号处的数据吗?即使对于与位置无关的代码,通常也可以将段开始地址转换为相对地址,而不需要重定位。 (符号本身仍然存在绝对地址不会改变这一点。)
您可以使用readelf -r
或eu-readelf -r
检查输出并进行检查。它在objdump --dissassemble --reloc
输出中也可见。