2015-12-03 44 views
1

我有两个Linux内核代码副本(相同版本:3.0.1),一个是香草源代码,另一个是一些修改。在使用相同的配置文件(未修改的代码在make期间提示一些关于驱动程序的其他配置)编译它们之后,它们输出稍微不同的Module.symvers文件,这是合理的。然后,我使用awk来仅列出它们的前两个字段,以更好地比较符号校验和。大部分符号校验和是相同的,但是一些符号的校验和是不同的。根据此article from lwn.net模块版本校验和是如何评估的?

校验和是从符号的原型或声明计算出来的。

这些不同的应该有不同的原型或声明。但我发现这不是事实。我选择了其中两个(函数)并比较了源代码,其中一个在定义(即函数体)方面有所不同,另一个函数在两个源代码中完全相同。 (我用vimdiff比较和间距是相同的)。这两个功能都具有相同的原型。

所以事情可能已经改变了?究竟是什么导致了现在不同的校验和(在我的情况下3.0.1之后)。我不想知道计算校验和的细节,我只想简单介绍一下这里有什么区别。

回答

1

当计算导出的函数的校验和,以函数的原型(参数的类型或返回值的类型)每种类型不仅字面上,也可由定义评价。如果一个类型是复杂的(例如,结构),它的字段也会被检查。 (也就是说,过程是递归)。

即使参数实际上是指向类型的指针,也会检查类型的定义。

例如,函数的声明下面都会有不同校验

Kernel1

struct a 
{ 
    int i; 
}; 

void f(struct a* arg); 

Kernel2

struct a 
{ 
    int i; 
    char c; 
}; 

void f(struct a* arg); 
+0

谢谢!我追溯了一些不同的论点,他们之间存在定义差异。 –