From: Fangrui Song <maskray@google.com> To: Ard Biesheuvel <ardb@kernel.org> Cc: Nick Desaulniers <ndesaulniers@google.com>, LKML <linux-kernel@vger.kernel.org>, Linux ARM <linux-arm-kernel@lists.infradead.org>, Will Deacon <will@kernel.org>, Catalin Marinas <catalin.marinas@arm.com>, Jessica Yu <jeyu@kernel.org>, Kees Cook <keescook@chromium.org>, Geert Uytterhoeven <geert@linux-m68k.org>, clang-built-linux <clang-built-linux@googlegroups.com>, linux-toolchains@vger.kernel.org Subject: Re: [PATCH] module: use hidden visibility for weak symbol references Date: Tue, 27 Oct 2020 15:18:14 -0700 [thread overview] Message-ID: <20201027221814.rkm73l5dtyysvagj@google.com> (raw) In-Reply-To: <CAKwvOd=XHAGotJ38o=hZTwi89XvCyshaUtWezZQ-k6aRT20xwQ@mail.gmail.com> One nit about ".got" in the message: Reviewed-by: Fangrui Song <maskray@google.com> On 2020-10-27, Nick Desaulniers wrote: >+ Fangrui > >On Tue, Oct 27, 2020 at 8:11 AM Ard Biesheuvel <ardb@kernel.org> wrote: >> >> Geert reports that commit be2881824ae9eb92 ("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, .got -> .got.plt be2881824ae9eb92 does not ASSERT on .got (it can). Strangely *(.got) is placed in .text in arch/arm64/kernel/vmlinux.lds.S I think that line can be removed. On x86, aarch64 and many other archs, the start of .got.plt is the GOT base. .got is not needed (ppc/arm/riscv use .got instead of .got.plt as the GOT base anchor). >> 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). Confirmed. >> 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. Yes, the R_AARCH64_CALL26 relocation referencing an undefined weak symbol causes one .plt entry and one .got.plt 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. >> >> 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> >> Signed-off-by: Ard Biesheuvel <ardb@kernel.org> >> --- >> include/linux/module.h | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/include/linux/module.h b/include/linux/module.h >> index 7ccdf87f376f..6264617bab4d 100644 >> --- a/include/linux/module.h >> +++ b/include/linux/module.h >> @@ -740,7 +740,7 @@ static inline bool within_module(unsigned long addr, const struct module *mod) >> } >> >> /* Get/put a kernel symbol (calls should be symmetric) */ >> -#define symbol_get(x) ({ extern typeof(x) x __attribute__((weak)); &(x); }) >> +#define symbol_get(x) ({ extern typeof(x) x __attribute__((weak,visibility("hidden"))); &(x); }) >> #define symbol_put(x) do { } while (0) >> #define symbol_put_addr(x) do { } while (0) >> >> -- >> 2.17.1 >> > > >-- >Thanks, >~Nick Desaulniers
WARNING: multiple messages have this Message-ID (diff)
From: Fangrui Song <maskray@google.com> To: Ard Biesheuvel <ardb@kernel.org> Cc: Kees Cook <keescook@chromium.org>, Catalin Marinas <catalin.marinas@arm.com>, Nick Desaulniers <ndesaulniers@google.com>, LKML <linux-kernel@vger.kernel.org>, clang-built-linux <clang-built-linux@googlegroups.com>, Geert Uytterhoeven <geert@linux-m68k.org>, linux-toolchains@vger.kernel.org, Jessica Yu <jeyu@kernel.org>, Will Deacon <will@kernel.org>, Linux ARM <linux-arm-kernel@lists.infradead.org> Subject: Re: [PATCH] module: use hidden visibility for weak symbol references Date: Tue, 27 Oct 2020 15:18:14 -0700 [thread overview] Message-ID: <20201027221814.rkm73l5dtyysvagj@google.com> (raw) In-Reply-To: <CAKwvOd=XHAGotJ38o=hZTwi89XvCyshaUtWezZQ-k6aRT20xwQ@mail.gmail.com> One nit about ".got" in the message: Reviewed-by: Fangrui Song <maskray@google.com> On 2020-10-27, Nick Desaulniers wrote: >+ Fangrui > >On Tue, Oct 27, 2020 at 8:11 AM Ard Biesheuvel <ardb@kernel.org> wrote: >> >> Geert reports that commit be2881824ae9eb92 ("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, .got -> .got.plt be2881824ae9eb92 does not ASSERT on .got (it can). Strangely *(.got) is placed in .text in arch/arm64/kernel/vmlinux.lds.S I think that line can be removed. On x86, aarch64 and many other archs, the start of .got.plt is the GOT base. .got is not needed (ppc/arm/riscv use .got instead of .got.plt as the GOT base anchor). >> 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). Confirmed. >> 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. Yes, the R_AARCH64_CALL26 relocation referencing an undefined weak symbol causes one .plt entry and one .got.plt 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. >> >> 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> >> Signed-off-by: Ard Biesheuvel <ardb@kernel.org> >> --- >> include/linux/module.h | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/include/linux/module.h b/include/linux/module.h >> index 7ccdf87f376f..6264617bab4d 100644 >> --- a/include/linux/module.h >> +++ b/include/linux/module.h >> @@ -740,7 +740,7 @@ static inline bool within_module(unsigned long addr, const struct module *mod) >> } >> >> /* Get/put a kernel symbol (calls should be symmetric) */ >> -#define symbol_get(x) ({ extern typeof(x) x __attribute__((weak)); &(x); }) >> +#define symbol_get(x) ({ extern typeof(x) x __attribute__((weak,visibility("hidden"))); &(x); }) >> #define symbol_put(x) do { } while (0) >> #define symbol_put_addr(x) do { } while (0) >> >> -- >> 2.17.1 >> > > >-- >Thanks, >~Nick Desaulniers _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2020-10-27 22:18 UTC|newest] Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-10-27 15:11 [PATCH] module: use hidden visibility for weak symbol references Ard Biesheuvel 2020-10-27 15:11 ` Ard Biesheuvel 2020-10-27 17:55 ` Geert Uytterhoeven 2020-10-27 17:55 ` Geert Uytterhoeven 2020-10-27 18:27 ` Nick Desaulniers 2020-10-27 18:27 ` Nick Desaulniers 2020-10-27 22:18 ` Fangrui Song [this message] 2020-10-27 22:18 ` Fangrui Song 2020-10-28 10:00 ` Will Deacon 2020-10-28 10:00 ` Will Deacon 2020-10-28 12:27 ` Ard Biesheuvel 2020-10-28 12:27 ` Ard Biesheuvel 2020-10-28 13:24 ` Will Deacon 2020-10-28 13:24 ` Will Deacon 2020-10-28 14:03 ` Jessica Yu 2020-10-28 14:03 ` Jessica Yu 2020-10-28 14:07 ` Will Deacon 2020-10-28 14:07 ` Will Deacon 2020-10-28 15:12 ` Will Deacon 2020-10-28 15:12 ` Will Deacon
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20201027221814.rkm73l5dtyysvagj@google.com \ --to=maskray@google.com \ --cc=ardb@kernel.org \ --cc=catalin.marinas@arm.com \ --cc=clang-built-linux@googlegroups.com \ --cc=geert@linux-m68k.org \ --cc=jeyu@kernel.org \ --cc=keescook@chromium.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-toolchains@vger.kernel.org \ --cc=ndesaulniers@google.com \ --cc=will@kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.