编辑 ELF 文件中的变量值

Edit variable values in ELF file?

本文关键字:变量值 文件 ELF 编辑      更新时间:2023-10-16

我需要在编译的ELF文件中更改几个变量。为了清楚地解释这一点,我将使用一个简单的 C 结构作为示例。

单个源文件从 MyFile.c 编译并链接到 (@ 0x1000) 到 MyFile.elf 中:

typedef struct {
    uint32_t SerialNumber;      /* Increments for every time it's programmed */
    uint32_t PartNumber;        /* Always the same */
    char     ProdDateTime[32];  /* "YYYY-MM-DD HH:MM:SS" date/time when programmed */
    uint32_t CalcCrc32;         /* Checksum of the above data */
} MyData_T;
const MyData_T MyData = {
    /* SerialNumber      */ 0x11111111,
    /* PartNumber        */ 0x12345678,
    /* ProdDateTime[32]  */ "2013-11-10 12:49:30",
    /* CalcCrc32         */ 0xC0CAC01A
                        };

现在我需要一个"控制台工具"(无需编译):

  1. 将新的序列号写入0x1000
  2. 将新字符串写入0x1008
  3. 在0x1028处更新校验和。

我无法找到甚至执行第一 (1) 项任务的工具(objcopy 等)。似乎这应该是一个相当常见的场景?我现在已经编写了自己的工具,但更喜欢开源工具或类似工具。

任何建议/想法/评论/批评都受到高度赞赏:D谢谢!!

"gdb --write/your/application/binary"应该能够更改初始化数据的值并将其写回可执行文件。

添加"-batch"和"-x command_file",你应该能够让它做你想做的事情。

QNX 有一个名为"spatch"的内置工具,可以做到这一点。使用 gdb 或十六进制编辑器的其他建议同样有效。

虽然修补二进制代码是完全可能的,但听起来你做错了:-)。也许这些值更适合存储在与二进制文件一起分发的某个数据文件中,并在某种构造函数期间读入?除非你有一些令人信服的理由要求它在二进制文件中,否则我会认真研究设计,看看你是否真的需要这样做。

如果你给出的答案是"是的,我真的需要这样做",那就太好了。您建议了几种非常有效的方法来完成此操作。祝你好运。