On Wed, May 27, 2020 at 7:16 AM Arnd Bergmann <arnd@xxxxxxxx> 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@xxxxxxxxxxxxxxx > Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx> + 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@xxxxxxxxxxxxxxxx. > To view this discussion on the web visit https://groups.google.com/d/msgid/clang-built-linux/20200527141553.1768675-1-arnd%40arndb.de. -- Thanks, ~Nick Desaulniers