调用 syslog() 替换为 __syslog_chk()?

calls to syslog() replaced with __syslog_chk()?

我正在尝试使用 LD_PRELOAD 拦截对 syslog() 的调用。我可以在 my 程序之一上成功地尝试它并且它起作用了。

当我在预构建的应用程序(通过 Debian 软件包获得)上尝试它时,我观察到它调用了 __syslog_chk(),在检查软件包的源代码时,没有直接调用 __syslog_chk() !

所以,应该是编译器[使用哪个],将syslog()s 更改为__syslog_chk()? 我尝试了 gcc 选项 -D_FORTIFY_SOURCE=2-O2 等。None 似乎做出了这种改变!哪个选项强制使用 __chk() 函数?

it ought to be the compiler [whichever was used], changed the syslog()s to __syslog_chk() ?

是的,您可能会像往常一样检查来源。 https://github.com/lattera/glibc/blob/master/misc/sys/syslog.h -> #if __USE_FORTIFY_LEVEL > 0 && defined __fortify_function -> https://github.com/lattera/glibc/blob/master/misc/bits/syslog.h#L31 . The __fortify_function is a extern inline, and you might want to read about extern inline https://gcc.gnu.org/onlinedocs/gcc/Inline.html What does extern inline do?。编译器选择函数的 inline 版本而不是 extern 版本,并内联调用,使其成为 __syslog_chk.

Which option forces use of __chk() function ?

使用-D_FORTIFY_SOURCE=2。检查你系统的 syslog.h - 它都在那里。很好 IDE 带有“跳转到定义”功能,在这种情况下可以大大增强浏览。

注意 https://github.com/lattera/glibc/blob/895ef79e04a953cac1493863bcae29ad85657ee1/misc/syslog.c#L112 syslog->__syslog->__vsyslog_chk__syslog_chk -> __vsyslog_chk。您可能 LD_PRELOAD __vsyslog_chk 可以处理所有情况。