在rodata中设定常数

时间:2015-08-29 18:32:20

标签: c data-segment

我试图了解如何在rodata段中设置字符串的值,因为使用环境变量加载它会给我带来问题。 我想在rodata部分外部设置一个常量字符串。此函数应独立于执行的代码。所以,当我做的时候

"objdump -c foo"

rodata部分必须登记此字符串,而文件foo.c必须这样做。 如何在.rodata部分设置常量?

编辑:Linux操作系统并使用GCC

我不能使用环境var,因为这意味着c代码被修改,我希望c代码不变,并添加常量,比如说“goo”到rodata段。

2 个答案:

答案 0 :(得分:0)

然后你需要编写一个允许你修改二进制文件的程序。

阅读ELF文件规范。

然后编写一个修改ELF程序和节头的程序,并将数据添加到.rodata节。

答案 1 :(得分:0)

我设法写了一个小的bash脚本,它或多或少地做了我想你想要的。

首先让我们考虑这个示例程序:

test.c的

#include <stdio.h>
const char message[1024] = "world";
int main()
{
    printf("hello %s\n", message);
}

目标变量为message。请注意,我不会更改变量的大小,这将是一个烂摊子,你要小心保留尽可能多的内存。

现在脚本:

patchsym

#!/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

新邮件内容将是:

newmsg

universe^@

(其中^@实际上是NUL字符。)

现在就做:

$ gcc test.c -o test
$ ./test
hello world
$ ./patchsym test message < newmsg
$ ./test
hello universe