我有2个Linux内核代码副本(相同版本:3.0.1),一个是vanilla源代码,另一个是一些修改。在使用相同的配置文件编译它们之后(未修改的代码在make期间提示有关驱动程序的一些其他配置),它们输出稍微不同的Module.symvers
文件,这是合理的。然后我使用awk
仅列出它们的前两个字段以更好地比较符号校验和。大多数符号校验和是相同的,但是一些符号的校验和是不同的。根据这个article from lwn.net:
校验和是根据符号的原型或声明计算的。
那些不同的应该有不同的原型或声明。但我发现这不是真的。我挑选了其中两个(函数)并比较了源代码,其中一个在定义(即函数体)上有所不同,另一个函数在两个源代码中完全相同。 (我使用vimdiff
进行比较,间距相同)。这两个函数都有相同的原型。
所以情况可能已经改变了?究竟是什么原因导致现在的校验和不同(在我的情况下3.0.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);