我试图了解如何在rodata段中设置字符串的值,因为使用环境变量加载它会给我带来问题。 我想在rodata部分外部设置一个常量字符串。此函数应独立于执行的代码。所以,当我做的时候
"objdump -c foo"
rodata部分必须登记此字符串,而文件foo.c必须这样做。 如何在.rodata部分设置常量?
编辑:Linux操作系统并使用GCC
我不能使用环境var,因为这意味着c代码被修改,我希望c代码不变,并添加常量,比如说“goo”到rodata段。
答案 0 :(得分:0)
然后你需要编写一个允许你修改二进制文件的程序。
阅读ELF文件规范。
然后编写一个修改ELF程序和节头的程序,并将数据添加到.rodata节。
答案 1 :(得分:0)
我设法写了一个小的bash脚本,它或多或少地做了我想你想要的。
首先让我们考虑这个示例程序:
#include <stdio.h>
const char message[1024] = "world";
int main()
{
printf("hello %s\n", message);
}
目标变量为message
。请注意,我不会更改变量的大小,这将是一个烂摊子,你要小心保留尽可能多的内存。
现在脚本:
#!/bin/bash
# usage: patchsym PROGRAM SYMBOL < NEWCONTENT
EXE="$1"
SYMBOL="$2"
OFFS=$((0x$(objdump -t "$EXE" | grep " $SYMBOL$" | cut -d ' ' -f 1)))
OFFS=2176
dd of="$EXE" bs=1 seek=$OFFS conv=notrunc
新邮件内容将是:
universe^@
(其中^@
实际上是NUL字符。)
现在就做:
$ gcc test.c -o test
$ ./test
hello world
$ ./patchsym test message < newmsg
$ ./test
hello universe