[Linux]最近遇到的奇怪的不同平台编译相同代码生产的elf运行不一致问题


在不同的平台上(virtualbox/vmware/windowssubsystem),编译出的elf运行不一致,有的平台运行之后一直高频率进input dma中断。

查看主要的库版本,libc libm等版本一致,操作系统为ubuntu,大版本一致,小版本有差别。从现象上看怀疑工具链在不同平台运行有问题。

后来平台编译信息对比,发现最后的链接顺序不一样。正常的平台按照异常的平台的链接顺序编译的话,也是无法运行。

由于问题跟中断有关,无法用gdb进行单步跟踪,只好用其他方法。

中断分析:
正常状态下,input dma中断为10ms一次(100hz),发现出问题时dma的中断频率为(730hz)。之后发现另外的一个现象,修改某个函数的代码,之前正常的平台编译出来的elf运行也是730hz。 两个不同的行为出现了相同的现象。

于是,要来了DMA与dma搬运数据的codec模块寄存器表,发现dma一切正常,但是codec异常,寄存器全部为默认值。此时开始怀疑模块没有初始化。后来跟踪代码发现,codec模块初始化是由一个判断控制。这个判断用于一个power模块,而这个模块又没有使用。此时这个判断会从0地址去获取数据用于判断。

由于不同的链接顺序下,0地址的代码并不一致,从而导致的不同平台的不同表现。至于修改某个函数的代码也会出现,恰恰是这个函数被链接到了0地址,从而也引发了相应的现象。

现在回头想的话,在修改代码也出现问题的时候,应该去怀疑对应的地址的变化会导致出问题。当然最终定位还是需要看寄存器的相关信息。