用户提交了错误报告,我的应用程序会在“__fortify_fail()”中进行段错误。
我知道这与使用Debian的“强化”标志-D_FORTIFY_SOURCE=2 -fstack-protector
构建我的应用程序有关。
不幸的是,用户的backtrace并没有告诉我太多,并且用户没有超级响应(现在)。
为了更好地了解正在发生的事情,我想知道__fortify_fail
实际上做了什么。
答案 0 :(得分:4)
此功能通常只是一个错误记者。 glibc的示例代码是:
extern char **__libc_argv attribute_hidden;
void
__attribute__ ((noreturn))
__fortify_fail (msg)
const char *msg;
{
/* The loop is added only to keep gcc happy. */
while (1)
__libc_message (2, "*** %s ***: %s terminated\n",
msg, __libc_argv[0] ?: "<unknown>");
}
libc_hidden_def (__fortify_fail)
在这里和那里可以称之为强化来源。 &#34;设防&#34;本身只是几个运行时检查。来自openat
的{{1}}函数中的示例用法是:
io/openat.c
如果没有强化,int
__openat_2 (fd, file, oflag)
int fd;
const char *file;
int oflag;
{
if (oflag & O_CREAT)
__fortify_fail ("invalid openat call: O_CREAT without mode");
return __openat (fd, file, oflag);
}
在没有模式的情况下是可以接受的(这种情况仍然非常可疑, 合法)。
考虑O_CREAT
喜欢printf + abort。
关于你的问题转向心灵感应,我可能会建议用户在用户代码中使用libc时遇到一些问题。 __fortify_fail
是libc中的一个位置,其中某些运行时检查失败,因此/lib/x86_64-linux-gnu/libc.so.6(+0xebdf0)[0x7f75d3576df0]
是一个无法正确调用libc的地方。