glibc 源码分析

获取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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值