Я хочу скомпилировать 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 (и, тем не менее, это повлияет только на подмножество функций, насколько я могу рассказать).