如何评估模块版本校验和?

时间:2015-12-03 02:59:53

标签: linux-kernel

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

  

校验和是根据符号的原型或声明计算的。

那些不同的应该有不同的原型或声明。但我发现这不是真的。我挑选了其中两个(函数)并比较了源代码,其中一个在定义(即函数体)上有所不同,另一个函数在两个源代码中完全相同。 (我使用vimdiff进行比较,间距相同)。这两个函数都有相同的原型。

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

1 个答案:

答案 0 :(得分:2)

当计算导出函数的校验和时,函数原型中的每个类型(参数的类型或返回值的类型)不仅字面,而且还通过<评估 强>定义即可。如果类型很复杂(例如,结构),则也检查其字段。 (也就是说,进程递归)。

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

,例如,下面的函数声明将具有不同的校验和:

<强> Kernel1

struct a
{
    int i;
};

void f(struct a* arg);

<强> Kernel2

struct a
{
    int i;
    char c;
};

void f(struct a* arg);