この関数は通常、単なるエラー レポーターです。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)
それは、ソースが強化されていることが好ましい場所で、あちこちで呼び出される場合があります。「Fortification」自体は、ほんの数回の実行時チェックです。openat
関数の使用例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
なし、モードなしで許容されます (それでも、このケースは非常に疑わしいですが、合法です)。
__fortify_fail
printf+abort について考えてみてください。
あなたの質問についてテレパシーをオンにすると、ユーザー コードで libc を使用する際に問題が発生する可能性があります。/lib/x86_64-linux-gnu/libc.so.6(+0xebdf0)[0x7f75d3576df0]
は、いくつかの実行時チェックが失敗する libc 内pd[0x49b5c0]
の場所であるため、libc が誤って呼び出された場所です。