clang and gas seem to interpret the symbols in memmove_64.S and memset_64.S differently, such that clang does not make them 'weak' as expected, which leads to a linker error, with both ld.bfd and ld.lld:
ld.lld: error: duplicate symbol: memmove
defined at common.c kasan/common.o:(memmove) in archive mm/built-in.a defined at memmove.o:(__memmove) in archive arch/arm64/lib/lib.a
ld.lld: error: duplicate symbol: memset
defined at common.c kasan/common.o:(memset) in archive mm/built-in.a defined at memset.o:(__memset) in archive arch/arm64/lib/lib.a
Copy the exact way these are written in memcpy_64.S, which does not have the same problem.
I don't know why this makes a difference, and it would be good to have someone with a better understanding of assembler internals review it.
It might be either a bug in the kernel or a bug in the assembler, no idea which one. My patch makes it work with all versions of clang and gcc, which is probably helpful even if it's a workaround for a clang bug.
Cc: stable@vger.kernel.org Signed-off-by: Arnd Bergmann arnd@arndb.de --- arch/x86/lib/memmove_64.S | 4 ++-- arch/x86/lib/memset_64.S | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/arch/x86/lib/memmove_64.S b/arch/x86/lib/memmove_64.S index 7ff00ea64e4f..dcca01434be8 100644 --- a/arch/x86/lib/memmove_64.S +++ b/arch/x86/lib/memmove_64.S @@ -26,8 +26,8 @@ */ .weak memmove
-SYM_FUNC_START_ALIAS(memmove) -SYM_FUNC_START(__memmove) +SYM_FUNC_START_ALIAS(__memmove) +SYM_FUNC_START_LOCAL(memmove)
mov %rdi, %rax
diff --git a/arch/x86/lib/memset_64.S b/arch/x86/lib/memset_64.S index 9ff15ee404a4..a97f2ea4e0b2 100644 --- a/arch/x86/lib/memset_64.S +++ b/arch/x86/lib/memset_64.S @@ -19,8 +19,8 @@ * * rax original destination */ -SYM_FUNC_START_ALIAS(memset) -SYM_FUNC_START(__memset) +SYM_FUNC_START_ALIAS(__memset) +SYM_FUNC_START_LOCAL(memset) /* * Some CPUs support enhanced REP MOVSB/STOSB feature. It is recommended * to use it when possible. If not available, use fast string instructions.
On Wed, May 27, 2020 at 7:16 AM Arnd Bergmann arnd@arndb.de wrote:
clang and gas seem to interpret the symbols in memmove_64.S and memset_64.S differently, such that clang does not make them 'weak' as expected, which leads to a linker error, with both ld.bfd and ld.lld:
ld.lld: error: duplicate symbol: memmove
defined at common.c kasan/common.o:(memmove) in archive mm/built-in.a defined at memmove.o:(__memmove) in archive arch/arm64/lib/lib.a
ld.lld: error: duplicate symbol: memset
defined at common.c kasan/common.o:(memset) in archive mm/built-in.a defined at memset.o:(__memset) in archive arch/arm64/lib/lib.a
Copy the exact way these are written in memcpy_64.S, which does not have the same problem.
I don't know why this makes a difference, and it would be good to have someone with a better understanding of assembler internals review it.
It might be either a bug in the kernel or a bug in the assembler, no idea which one. My patch makes it work with all versions of clang and gcc, which is probably helpful even if it's a workaround for a clang bug.
Cc: stable@vger.kernel.org Signed-off-by: Arnd Bergmann arnd@arndb.de
+ Bill, Fangrui, Jian I think we saw this bug or a very similar bug internally around the ordering of .weak to .global.
arch/x86/lib/memmove_64.S | 4 ++-- arch/x86/lib/memset_64.S | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/arch/x86/lib/memmove_64.S b/arch/x86/lib/memmove_64.S index 7ff00ea64e4f..dcca01434be8 100644 --- a/arch/x86/lib/memmove_64.S +++ b/arch/x86/lib/memmove_64.S @@ -26,8 +26,8 @@ */ .weak memmove
-SYM_FUNC_START_ALIAS(memmove) -SYM_FUNC_START(__memmove) +SYM_FUNC_START_ALIAS(__memmove) +SYM_FUNC_START_LOCAL(memmove)
mov %rdi, %rax
diff --git a/arch/x86/lib/memset_64.S b/arch/x86/lib/memset_64.S index 9ff15ee404a4..a97f2ea4e0b2 100644 --- a/arch/x86/lib/memset_64.S +++ b/arch/x86/lib/memset_64.S @@ -19,8 +19,8 @@
- rax original destination
*/ -SYM_FUNC_START_ALIAS(memset) -SYM_FUNC_START(__memset) +SYM_FUNC_START_ALIAS(__memset) +SYM_FUNC_START_LOCAL(memset) /* * Some CPUs support enhanced REP MOVSB/STOSB feature. It is recommended * to use it when possible. If not available, use fast string instructions. -- 2.26.2
-- You received this message because you are subscribed to the Google Groups "Clang Built Linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to clang-built-linux+unsubscribe@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/clang-built-linux/20200527141553.1768675-1....
linux-stable-mirror@lists.linaro.org