2

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

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

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

谢谢

4

1 回答 1

1

Fortification 主要通过 GCC__builtin_constant_p__builtin_object_size内在函数在 Glibc 中实现。例如,这是memsetfrom的定义/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函数,但只使用这些知识来执行优化(死代码删除、折叠等),而不是用于验证。

于 2017-04-24T09:51:04.483 回答