在ELF文件中编辑变量值?

时间:2013-11-10 20:51:29

标签: c++ c elf objcopy

我需要在已编译的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的校验和。
  4. 我找不到第一个(1)任务的工具(objcopy等?)。似乎这应该是一个相当常见的场景?我现在已经编写了自己的工具,但更喜欢开源工具或类似工具。

    任何建议/想法/意见/批评都非常感谢:D谢谢!

2 个答案:

答案 0 :(得分:2)

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

添加“-batch”和“-x command_file”,你应该可以让它做你想做的事。

答案 1 :(得分:1)

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

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

如果您提出的答案是“是的,我真的需要这样做”,那么很棒。你有几个非常有效的方法来完成这个。祝你好运。