我想在不强化源代码的情况下编译rippled(具体来说,我想避免使用 *_chk 函数)。
据我所知,gcc/g++ 使用FORTIFY_SOURCE和-fstack-protector进行强化,为了禁用它,应该使用-U_FORTIFY_SOURCE 或 -D_FORTIFY_SOURCE=0和-fno-stack-protector。
但是,由于某种原因,这不适用于我的涟漪。我已经修改了 SConstruct 文件,以便添加上述定义和开关,并且我在构建过程中看到它们实际上被传递给编译器和链接器。但是,当我运行时readelf -sW rippled | egrep chk
,我会获得几行,例如:
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __printf_chk@GLIBC_2.3.4 (2)
38: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __vfprintf_chk@GLIBC_2.3.4 (2)
96: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __sprintf_chk@GLIBC_2.3.4 (2)
100: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __snprintf_chk@GLIBC_2.3.4 (2)
107: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __fread_chk@GLIBC_2.7 (14)
所以我猜测问题不在于开关和定义。但在那种情况下,我可能会错过什么?为什么这些符号仍然包含在 ELF 中?
PS:我知道对“_chk”功能的括号调用是-U_FORTIFY_SOURCE和-fno-stack-protector的替代方法,但我只是放弃了该选项,因为我不想修改rippled的代码(并且,但是,据我所知,这只会影响功能的一个子集)。