为什么用-fno-pic编译Android内核模块?

问题描述 投票:5回答:1

我经常读到Android内核模块必须用-fno-pic编译才能工作。这是针对ARM体系结构的,还是为什么不需要/(什么时候)x86的内核模块需要使用该标志进行编译?

android linux-kernel kernel kernel-module
1个回答
0
投票

根据https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/Code-Gen-Options.html-fno-pic-fpic参数的负面形式。来自同一链接:

-fpic如果目标计算机支持,则生成适用于共享库的位置无关代码(PIC)。这样的代码通过全局偏移表(GOT)访问所有常量地址。程序启动时动态加载程序解析GOT条目(动态加载程序不是GCC的一部分;它是操作系统的一部分)。如果链接可执行文件的GOT大小超过计算机特定的最大大小,则会从链接器收到错误消息,指示-fpic不起作用;在这种情况下,请使用-fPIC重新编译。 (这些最大值在SPARC上为8k,在AArch64上为28k,在m68k和RS / 6000上为32k。x86没有此限制。)与位置无关的代码需要特殊支持,因此仅适用于某些机器。对于x86,GCC支持System for System的PIC,但不支持Sun 386i的PIC。为IBM RS / 6000生成的代码始终与位置无关。

设置此标志后,宏__pic____PIC__定义为1。

所以-fno-pic意味着“不要使用与位置无关的代码(PIC)”。

但为什么?

好吧,通过查看https://developer.arm.com/products/software-development-tools/hpc/documentation/note-about-building-position-independent-code-pic-on-aarch64,我们发现:

在AArch64上使用-fpic编译器标志和GCC编译器会导致编译器在代码中为每个地址计算生成少一条指令,并且可以提供代码大小和性能优势。但是,它还为全局偏移表(GOT)设置了32k的限制,并且由于GOT溢出,构建可能在可执行链接阶段失败。

所以,最后,似乎-fno-pic更像是一种预防而不是真正的需要。当然,这是一个猜测,可能涉及更多的事情。

© www.soinside.com 2019 - 2024. All rights reserved.