From: Andi Kleen <a...@linux.intel.com> LTO doesn't like the assembler aliasing used for SYSCALL_ALIAS. Replace it with C aliasing. Also mark the only users visible.
This gives cleaner and nicer code, so is useful even without LTO. Signed-off-by: Andi Kleen <a...@linux.intel.com> --- arch/x86/include/asm/syscall_wrapper.h | 1 + include/linux/linkage.h | 6 ++---- kernel/time/posix-stubs.c | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/arch/x86/include/asm/syscall_wrapper.h b/arch/x86/include/asm/syscall_wrapper.h index e046a405743d..6f7a73da8437 100644 --- a/arch/x86/include/asm/syscall_wrapper.h +++ b/arch/x86/include/asm/syscall_wrapper.h @@ -52,6 +52,7 @@ SYSCALL_METADATA(_##sname, 0); \ asmlinkage long __x64_sys_##sname(void); \ ALLOW_ERROR_INJECTION(__x64_sys_##sname, ERRNO); \ + asmlinkage long __ia32_sys_##sname(void); \ SYSCALL_ALIAS(__ia32_sys_##sname, __x64_sys_##sname); \ asmlinkage long __x64_sys_##sname(void) diff --git a/include/linux/linkage.h b/include/linux/linkage.h index 7e020782ade2..5fc9ecd55bda 100644 --- a/include/linux/linkage.h +++ b/include/linux/linkage.h @@ -30,10 +30,8 @@ #endif #ifndef SYSCALL_ALIAS -#define SYSCALL_ALIAS(alias, name) asm( \ - ".globl " __stringify(alias) "\n\t" \ - ".set " __stringify(alias) "," \ - __stringify(name)) +#define SYSCALL_ALIAS(a, name) \ + __visible typeof(a) a __attribute__((alias(__stringify(name)))) #endif #define __page_aligned_data __section(.data..page_aligned) __aligned(PAGE_SIZE) diff --git a/kernel/time/posix-stubs.c b/kernel/time/posix-stubs.c index 67df65f887ac..4777892bee82 100644 --- a/kernel/time/posix-stubs.c +++ b/kernel/time/posix-stubs.c @@ -21,7 +21,7 @@ #include <asm/syscall_wrapper.h> #endif -asmlinkage long sys_ni_posix_timers(void) +__visible asmlinkage long sys_ni_posix_timers(void) { pr_err_once("process %d (%s) attempted a POSIX timer syscall " "while CONFIG_POSIX_TIMERS is not set\n", -- 2.20.1