2017-04-21 75 views
0

我试图找到在GCC for libc中实现强化函数所需的信息。GCC强化功能文档

根据我的理解,__builtin __ * _ chk变体是用于编译时检查的,但是如果GCC无法确定缓冲区大小,他将用__ * _ chk版本(如果它们存在)替换该调用。

上述断言是否正确?如果是这样的话,我在哪里可以找到关于GCC在libc中需要什么的文档,以便在FORTIFY_SOURCE = 1 | 2时将函数与其运行时__ * _ chk版本绑定在一起?

感谢

回答

0

设防主要是glibc中通过GCC的__builtin_constant_p__builtin_object_size内部函数实现。例如。这里有一个memset定义从/usr/include/string.h

__fortify_function void * 
__NTH (memset (void *__dest, int __ch, size_t __len)) 
{ 
    if (__builtin_constant_p (__len) && __len == 0 
     && (!__builtin_constant_p (__ch) || __ch != 0)) 
    { 
     __warn_memset_zero_len(); 
     return __dest; 
    } 
    return __builtin___memset_chk (__dest, __ch, __len, __bos0 (__dest)); 
} 

__builtin___memset_chk简单地由GCC扩展到到memset_chk呼叫(在libc.so定义)。

GCC知道*_chk函数,但仅使用此知识来执行优化(死代码删除,折叠等),而不是用于验证。