在ELF文件中编辑变量值?

5

我需要修改一个已编译的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处的校验和。
我没有找到一个工具(objcopy等),甚至可以完成第一个任务(1)。似乎这应该是一个相当常见的情况?我现在已经写了自己的工具,但更希望有一个开源工具或类似工具。
非常感谢您的任何建议 / 想法 / 评论 / 批评 :D 谢谢!!

1
你有 adb(汇编语言调试器,不是安卓桥接器)吗?在过去,我们会做类似这样的事情:echo "0x1000?W 0x11111111" | adb -w MyFile.elf - Mark Plotnick
我还没有尝试过/听说过adb。我不认为我可以在我的项目中访问它,但无论如何我会调查一下。谢谢! - barnie82
2
调整已编译的二进制文件并不像您想象的那么常见。一个“通用”的工具如何知道在哪里找到要更改的值呢?在这种情况下,如果您需要经常进行此操作(1),编写定制实用程序正是我所做的。(1)对于一次性的操作,我会简单地使用十六进制编辑器。 - Jongware
2个回答

3
"

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

添加 "-batch" 和 "-x command_file",就可以让它按照你想要的方式执行。

"

我还没有尝试过,但是有几个人建议使用gdb。我正在WIN环境下编程,工具链没有提供gdb,但我想我可以为类似的CPU找到另一个工具链?非常感谢您的帮助 :) - barnie82
你使用什么工具链,目标是什么(x86?ARM?其他)?Cygwin和MinGW都提供预编译的GDB二进制文件,但这只适用于主机二进制文件。 - ArtemB
ARM,更准确地说是Freescale Kinetis K61 :) 我想如果我能找到一个类似CPU的预编译gdb,我可能可以使用它。谢谢! - barnie82
我忘了提到我被迫在一台WIN7-x64机器上进行开发 :( - barnie82

2
QNX具有一个名为"spatch"的内置工具,可以完全满足您的需求。其他建议使用gdb或十六进制编辑器同样有效。
虽然修改二进制代码是完全可行的,但听起来你做错了 :-)。也许最好将这些值存储在某个数据文件中,并在某种构造函数期间读取?除非您有一些强烈的理由要求它在二进制文件中,否则我会认真考虑设计并看看您是否真的需要这样做。
如果您得出的答案是“是的,我确实需要这样做”,那太好了。您有几种非常有效的方法可以完成此操作。祝你好运。

感谢您的想法。没有文件系统等。我正在编辑的图像基本上构成了这个数据文件,并直接使用JTAG编程到闪存中。 - barnie82
1
@barnie82 啊,那你并没有“做错”,我之前的指示是错误的。祝你好运。 :-) - kmort

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接