GCC 强化功能文档

GCC fortified function documentation

我正在尝试查找有关在 GCC 中为 libc 实现强化功能所需的信息。

据我所知,__builtin__*_chk 变体用于编译时检查,但如果 GCC 无法确定缓冲区大小,他将用 __*_c​​hk 版本(如果存在)替换调用。

以上说法是否正确?如果是这样,我在哪里可以找到有关 GCC 在 libc 中将函数与其运行时 __*_c​​hk 版本绑定在一起的要求的文档 FORTIFY_SOURCE=1|2?

谢谢

Fortification 主要通过 GCC 的 __builtin_constant_p__builtin_object_size 内部函数在 Glibc 中实现。例如。这是 /usr/include/string.hmemset 的定义:

__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 函数,但仅使用此知识执行优化(死代码删除、折叠等),而不用于验证。