0

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

"objdump -c foo"

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

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

我不能使用环境变量,因为这意味着修改了 c 代码,我希望 c 代码保持不变并添加常量,例如“Goo”到rodata 段。

4

2 回答 2

0

我已经设法编写了一个小的 bash 脚本,它或多或少地完成了我认为你想要的。

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

测试.c

#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
于 2015-08-29T22:51:52.073 回答
0

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

阅读 ELF 文件规范。

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

于 2015-08-29T21:33:42.783 回答