• A
    module: use hidden visibility for weak symbol references · 13150bc5
    Ard Biesheuvel 提交于
    Geert reports that commit be288182 ("arm64/build: Assert for
    unwanted sections") results in build errors on arm64 for configurations
    that have CONFIG_MODULES disabled.
    
    The commit in question added ASSERT()s to the arm64 linker script to
    ensure that linker generated sections such as .got.plt etc are empty,
    but as it turns out, there are corner cases where the linker does emit
    content into those sections. More specifically, weak references to
    function symbols (which can remain unsatisfied, and can therefore not
    be emitted as relative references) will be emitted as GOT and PLT
    entries when linking the kernel in PIE mode (which is the case when
    CONFIG_RELOCATABLE is enabled, which is on by default).
    
    What happens is that code such as
    
    	struct device *(*fn)(struct device *dev);
    	struct device *iommu_device;
    
    	fn = symbol_get(mdev_get_iommu_device);
    	if (fn) {
    		iommu_device = fn(dev);
    
    essentially gets converted into the following when CONFIG_MODULES is off:
    
    	struct device *iommu_device;
    
    	if (&mdev_get_iommu_device) {
    		iommu_device = mdev_get_iommu_device(dev);
    
    where mdev_get_iommu_device is emitted as a weak symbol reference into
    the object file. The first reference is decorated with an ordinary
    ABS64 data relocation (which yields 0x0 if the reference remains
    unsatisfied). However, the indirect call is turned into a direct call
    covered by a R_AARCH64_CALL26 relocation, which is converted into a
    call via a PLT entry taking the target address from the associated
    GOT entry.
    
    Given that such GOT and PLT entries are unnecessary for fully linked
    binaries such as the kernel, let's give these weak symbol references
    hidden visibility, so that the linker knows that the weak reference
    via R_AARCH64_CALL26 can simply remain unsatisfied.
    Signed-off-by: NArd Biesheuvel <ardb@kernel.org>
    Tested-by: NGeert Uytterhoeven <geert+renesas@glider.be>
    Reviewed-by: NFangrui Song <maskray@google.com>
    Acked-by: NJessica Yu <jeyu@kernel.org>
    Cc: Jessica Yu <jeyu@kernel.org>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Geert Uytterhoeven <geert@linux-m68k.org>
    Cc: Nick Desaulniers <ndesaulniers@google.com>
    Link: https://lore.kernel.org/r/20201027151132.14066-1-ardb@kernel.orgSigned-off-by: NWill Deacon <will@kernel.org>
    13150bc5
module.h 24.0 KB