我有一个实际问题需要解决。在我正在研究的嵌入式系统中,我有一个非常大的结构,包含系统参数,包括int,float和其他结构。结构可以保存到外部存储器中。
我正在考虑编写一个PC软件来更改二进制结构中的某些值,而不会改变文件的整体布局。我们的想法是,可以更改1或2个参数,并将其从外部存储装载回内存。所以它是一个特殊用途的十六进制编辑器。
我的方式:如果我可以构建一个包含以下内容的表: - 参数名称 - 内存中参数的偏移量 - 类型 我应该能够改变我想要的任何东西。
我的问题是,以编程方式计算每个参数的偏移量并不容易。人们总是可以手动打印他们的地址,但我想避免这样做。
有人知道一个可以提供帮助的工具吗?
修改 有问题的系统是基于ARM的小端模式运行。编译器不会被要求打包结构,所以出于我的目的,它与x86 PC相同。 问题是结构的大小:它总共包含不少于1000个参数,分布在多层嵌套结构中。因此,编写短代码来转储所有偏移量是不可行的(或者我不愿意)。我想关键问题是解析C头并自动生成偏移量或代码来转储它们的偏移量。请建议这样的解析工具。
由于
答案 0 :(得分:4)
通常这样做的方法是通过共享定义结构的头文件和其他(PC)应用程序。然后,您应该能够基本上加载字节并将它们转换为那种结构并进行编辑。
在此之前,您需要了解(并可能处理):
#pragma
s。如果这里有太多差异需要打扰,并且你正在构建更快/更脏的东西,我不知道自动生成结构偏移的工具,但正如另一张海报所说,你可以编写一些简短的C代码使用offsetof或等效(或者,如你所建议的那样,指针算术)来转储一个字段和偏移表。
答案 1 :(得分:2)
我怀疑您可以解析pahole
工具的输出来获取此信息。它读取可执行文件中的调试信息,并打印出每个结构成员的类型,名称和偏移量。
答案 2 :(得分:1)
如果代码中有完全定义的结构,您可以使用offsetof()宏来查明字段的布局方式。但是,如果您尝试以编程方式确定其他计算机上的布局,这将无济于事。
答案 3 :(得分:1)
现有的十六进制编辑器不是编写自己的工具,而是采用结构定义并允许您编辑文件中的值。如果您使用的是Windows,我相信Hex Workshop可以执行此操作,例如。
答案 4 :(得分:1)
确保我理解这个问题:
在您的嵌入式系统中,您有一个包含系统设置的结构,如下所示:
struct SubStruct{
int subSetting1;
float subSetting2;
}
/* ... some other substructure definitions. ... */
struct Settings{
float setting1;
int setting2;
struct SubStruct setting3;
/* ... lots of other settings ... */
}
你的问题是你想要一个包含所述结构的二进制文件并修改另一台机器上的值吗?
鉴于您知道嵌入式系统使用的整数类型和包装的大小,您可以有两种选择。如果嵌入式系统和PC系统的字节顺序不同,您还必须处理这种情况,例如:在撰写字段时使用hton
。
选项1: 在PC程序中声明相同的结构,使用编译指示强制与嵌入式系统相同的字节对齐,并且在嵌入式系统和PC系统之间具有不同大小的任何整数类型“重新”到特定大小,例如,如果您有stdint.h,则使用int16_t,int32_t;如果没有,则使用您自己的typedef,在PC程序中使用。
选项2: 您可以简单地制作类型列表,例如一个看起来像的列表:
Name Type
setting1 float
setting2 int
subStruct1SubSetting1 int
subStruct1SubSetting2 float
然后根据嵌入式系统使用的尺寸和包装计算位置,例如:如果嵌入式系统使用4字节对齐,4字节浮点数和2字节整数,则上表将计算出:
Name Type Calculated Offset
setting1 float 0
setting2 int 4
subStruct1SubSetting1 int 8
subStruct1SubSetting2 float 12
或者嵌入式系统将结构打包为1字节对齐(例如,如果它是8位微处理器)
Name Type Calculated Offset
setting1 float 0
setting2 int 4
subStruct1SubSetting1 int 6
subStruct1SubSetting2 float 8
答案 5 :(得分:0)
我不确定您的系统中有哪些调试功能。在Windows下我会使用简单的调试脚本和文本转换(调试器可以在批处理模式下运行以生成类型信息)。