2017-04-21 51 views
0

我試圖找到在GCC for libc中實現強化函數所需的信息。GCC強化功能文檔

根據我的理解,__builtin __ * _ chk變體是用於編譯時檢查的,但是如果GCC無法確定緩衝區大小,他將用__ * _ chk版本(如果它們存在)替換該調用。

上述斷言是否正確?如果是這樣的話,我在哪裏可以找到關於GCC在libc中需要什麼的文檔,以便在FORTIFY_SOURCE = 1 | 2時將函數與其運行時__ * _ chk版本綁定在一起?

感謝

回答

0

設防主要是glibc中通過GCC的__builtin_constant_p__builtin_object_size內部函數實現。例如。這裏有一個memset定義從/usr/include/string.h

__fortify_function void * 
__NTH (memset (void *__dest, int __ch, size_t __len)) 
{ 
    if (__builtin_constant_p (__len) && __len == 0 
     && (!__builtin_constant_p (__ch) || __ch != 0)) 
    { 
     __warn_memset_zero_len(); 
     return __dest; 
    } 
    return __builtin___memset_chk (__dest, __ch, __len, __bos0 (__dest)); 
} 

__builtin___memset_chk簡單地由GCC擴展到到memset_chk呼叫(在libc.so定義)。

GCC知道*_chk函數,但僅使用此知識來執行優化(死代碼刪除,摺疊等),而不是用於驗證。