簡體   English   中英

為什么 -D_FORTIFY_SOURCE=2 對我的編譯沒有影響?

[英]why does -D_FORTIFY_SOURCE=2 has no effect in my compilation?

我一直在添加一些“編譯標志”來激活我的二進制文件中的安全措施。 然后我使用checksec工具檢查這些措施是否已實施。 除了FORTIFY之外,我已經能夠激活所有這些。

我不斷得到

強化 = 否,強化 = 0,可強化 = 4

即使在使用-D_FORTIFY_SOURCE=2編譯之后,來自checksec的 output

我不得不說,我對許多二進制文件使用了一個通用的CMakeLists.txt ,並且我在全局add_compile_options部分添加了-D_FORTIFY_SOURCE=2

對於所有其他生成的二進制文件,宏具有預期的行為,即其他二進制文件得到“強化”。

我正在使用gcc 9.3.0 ,我的應用程序是用c++17編寫的,我用-O2編譯。

有人知道為什么我的二進制文件沒有得到強化嗎?

提前致謝。

checksec腳本完成的強化是啟發式完成的:通過在 readelf readelf --dyn-syms的 output 中查找_chk符號。 所以它只能在以下情況下檢測到防御工事

  • 您的源代碼包含對強化函數( memsetmemcpy等)的調用
  • 代碼經過優化編譯(宏__OPTIMIZE__已定義且大於零)
  • GCC 沒有將它們優化為未經檢查的版本或顯式循環(參見gimple-fold.c 中的 gimple_fold_builtin_memory_chk gimple_fold_builtin_memory_chk

為了確定您的特定情況的確切原因,我們需要一個MVCE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM