如何调试由于“跳转到无效地址”而导致的细分错误?

时间:2019-09-08 15:14:18

标签: c pointers memory-corruption

我正在运行在am335x手臂处理器上运行的应用程序。 我正在定义以下结构,其中包含指向“命令”功能的功能指针。 “ Command”功能在同一文件中定义如下

ObjectDef BPObjectDef = { CCR_COMMS, 1, ATTRIBUTES, "BP", Command };

static BYTE Command( ObjectPtr Obj, BYTE Command)
{
<not writing code because function is big>
}

我交叉编译了上面的代码,并生成了二进制文件。使用objdump -t,我可以看到“命令”功能具有以下地址

00013f0d l     F .text  0000016c              Command

但是当我在目标计算机上运行二进制文件时,会得到“命令”功能的以下地址

address of BPObjectDef.Command = 0x3f0d0000

如我们所见,寻址的后两个字节与前两个字节交换。访问此功能时会导致分段错误。 有人遇到过类似的问题吗?在这种情况下如何调试?我猜我不能使用地址清理器,因为它是一个Arm平台。谢谢

1 个答案:

答案 0 :(得分:0)

@Yunnosch你真是个天才!正如您在评论中提到的,地址由于结构填充而被更改。在结构声明之前使用#pragma pack(1)解决了该问题。非常感谢