C语言 如何调试由于"跳转到无效地址"而导致的分段错误?



我正在开发一个在am335x arm处理器上运行的应用程序。 我正在定义以下结构,其中包含指向"命令"函数的函数指针。"命令"功能在下面在同一文件中定义

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

正如我们所看到的,寻址的最后两个字节与前两个字节交换。这会导致访问此功能时出现分段错误。 以前有人遇到过类似的问题吗?在这种情况下如何调试?我想我不能使用地址消毒器,因为它是一个手臂平台。谢谢

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

最新更新