我正在尝试查找有关在 GCC for libc 中实现强化功能所需的信息。
据我了解, __builtin__*_chk 变体用于编译时检查,但如果 GCC 无法确定缓冲区大小,他将用 __*_chk 版本(如果存在)替换调用。
上述说法正确吗?如果是这样,当 FORTIFY_SOURCE=1|2 时,我在哪里可以找到有关 GCC 在 libc 中将函数与其运行时 __*_chk 版本绑定在一起所需的文档?
谢谢
我正在尝试查找有关在 GCC for libc 中实现强化功能所需的信息。
据我了解, __builtin__*_chk 变体用于编译时检查,但如果 GCC 无法确定缓冲区大小,他将用 __*_chk 版本(如果存在)替换调用。
上述说法正确吗?如果是这样,当 FORTIFY_SOURCE=1|2 时,我在哪里可以找到有关 GCC 在 libc 中将函数与其运行时 __*_chk 版本绑定在一起所需的文档?
谢谢
Fortification 主要通过 GCC__builtin_constant_p
和__builtin_object_size
内在函数在 Glibc 中实现。例如,这是memset
from的定义/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
函数,但只使用这些知识来执行优化(死代码删除、折叠等),而不是用于验证。