获取source
git clone https://sourceware.org/git/glibc.git
cd glibc
git checkout release/2.17/master
git checkout release/2.20/master
libc-2.20 分析
./sysdeps/x86_64/multiarch/memset.S
/* Define multiple versions only for the definition in lib. */
# ifndef NOT_IN_libc
ENTRY(memset)
.type memset, @gnu_indirect_function
cmpl $0, __cpu_features+KIND_OFFSET(%rip)
jne 1f
call __init_cpu_features
1: leaq __memset_sse2(%rip), %rax
testl $bit_AVX2_Usable, __cpu_features+FEATURE_OFFSET+index_AVX2_Usable(%rip)
jz 2f
leaq __memset_avx2(%rip), %rax
2: ret
END(memset)
# endif
./sysdeps/x86_64/multiarch/memcpy.S
/* Define multiple versions only for the definition in lib and for
DSO. In static binaries we need memcpy before the initialization
happened. */
#if defined SHARED && !defined NOT_IN_libc
.text
ENTRY(__new_memcpy)
.type __new_memcpy, @gnu_indirect_function
cmpl $0, KIND_OFFSET+__cpu_features(%rip)
jne 1f
call __init_cpu_features
1: leaq __memcpy_avx_unaligned(%rip), %rax
testl $bit_AVX_Fast_Unaligned_Load, __cpu_features+FEATURE_OFFSET+index_AVX_Fast_Unaligned_Load(%rip)
jz 1f
ret
1: leaq __memcpy_sse2(%rip), %rax
testl $bit_Slow_BSF, __cpu_features+FEATURE_OFFSET+index_Slow_BSF(%rip)
jnz 2f
leaq __memcpy_sse2_unaligned(%rip), %rax
ret
2: testl $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip)
jz 3f
leaq __memcpy_ssse3(%rip), %rax
3: ret
END(__new_memcpy)
语法
string.h
__BEGIN_NAMESPACE_STD
/* Copy N bytes of SRC to DEST. */
extern void *memcpy (void *__restrict __dest, const void *__restrict __src,
size_t __n) __THROW __nonnull ((1, 2));
/* Copy N bytes of SRC to DEST, guaranteeing
correct behavior for overlapping strings. */
extern void *memmove (void *__dest, const void *__src, size_t __n)
__THROW __nonnull ((1, 2));
__END_NAMESPACE_STD
其代码实现却在 汇编的 .S 文件
memmove
glibc-2.29 里 MEMMOVE
./glibc-2.29/sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:# define MEMCPY_SYMBOL(p,s) MEMMOVE_SYMBOL(p, s)
./sysdeps/x86_64/multiarch/memmove-avx512-no-vzeroupper.S:strong_alias (__memmove_avx512_no_vzeroupper, __memcpy_avx512_no_vzeroupper)
./sysdeps/x86_64/multiarch/memmove-avx512-no-vzeroupper.S:strong_alias (__memmove_chk_avx512_no_vzeroupper, __memcpy_chk_avx512_no_vzeroupper)