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