Linux kernel 为什么ARM Linux ELF模块加载器支持这些特定的重新定位?

Linux kernel 为什么ARM Linux ELF模块加载器支持这些特定的重新定位?,linux-kernel,arm,elf,Linux Kernel,Arm,Elf,我指的是。这似乎是ARM ELF重新定位的任意子集。这份清单列出了大约130种重新安置类型。其中大多数是“静态的”(为什么模块加载器处理的是静态重定位而不是动态重定位?)?或者还有其他原因吗?ARM手册适用于所有ELF文件;这包括链接前的“C”编译器输出。130搬迁类型适用于各种情况;模块加载器只处理其中的一个子集。对于共享库和内核模块,最终输出不知道它的最终地址,但它知道所有函数/数据彼此之间的相对位置。绝对的迁移需要处理 它不会尝试将“.o”文件链接在一起以生成“.ko”。这是由ld完成的,

我指的是。这似乎是ARM ELF重新定位的任意子集。这份清单列出了大约130种重新安置类型。其中大多数是“静态的”(为什么模块加载器处理的是静态重定位而不是动态重定位?)?或者还有其他原因吗?

ARM手册适用于所有ELF文件;这包括链接前的“C”编译器输出。130搬迁类型适用于各种情况;模块加载器只处理其中的一个子集。对于共享库和内核模块,最终输出不知道它的最终地址,但它知道所有函数/数据彼此之间的相对位置。绝对的迁移需要处理


它不会尝试将“.o”文件链接在一起以生成“.ko”。这是由
ld
完成的,它将处理更多的重定位类型,但可能仍然不是所有类型。该规范旨在全面完成。在目标CPU上可能不需要某些类型的重新定位(例如一些非常旧的ARM1 26位)。

我从ARM Linux新闻组得到了以下答案:

在用于编译内核的配置下,只有 这些重新定位中的一小部分将由GCC发出。对于 例如,由于我们在构建时没有-fpic,因此许多GOT和PLT 相关的事情永远不会发生。而且,由于模块不是共享的 库,但只是部分链接的对象文件,运行时链接 这种情况实际上更像是静态链接,而不是静态链接 动态链接。(不支持像懒散解决这样的事情 ELF标准定义的跳转目标或符号抢占。) 此外,虽然文本重新定位通常在userland中避免,但是 它们破坏了代码页的共享,这在 内核


所以原因是因为内核模块的GCC编译只会输出这些重定位。我希望GCC ARM维护人员知道这一点…

谢谢,但我想问的是,为什么Linux会特别选择这些来实现。我问这个问题的原因是因为我看到另一个系统选择实现相同的重新定位子集,我想知道这些工程师是从Linux上获得的,还是有一些独立的原因选择这些重新定位。因为如果你重新定位映像的基部,这些就是你需要实现的。相对的东西不需要重新定位。