2014-03-25 80 views
5

下鄉glibc中複雜的宏的兔子洞,我已經達到/usr/lib/gcc/x86_64-linux-gnu/4.8.2/include/stdarg.h的實施方案,其中,例如,va_start宏定義爲:__builtin_va_start(V,L)

#define va_start(v,l) __builtin_va_start(v,l)

但我我一直試圖尋找沒有成功的__builtin_va_start(v,l)的實際實施。我用google搜索了一下,對於Visual Studio,我得到的最遠距離是Microsoft’s implementation,我認爲這並沒有根本的不同。

有誰知道glibc的實現是在哪裏?

TIA。

+4

您將不得不檢查gcc編譯器本身的源代碼,因爲(除非我錯了)它是在內部僞函數實現的級別。該源代碼可以在網上免費獲得。 –

+1

如果您想快速查看擴展的內容,只需在gcc中使用-E進行編譯即可。 –

+1

您尋求什麼信息,那不包含在va_start的手冊頁中?根據我的經驗,'va_list'聲明瞭一個指針,'va_start'將這個指針設置爲指向堆棧上的某個隨機位置。如果您需要知道系統的確切實現方法,那麼一種方法是使用調試器來逐步執行彙編代碼。 – user3386109

回答

8

要查看gcc的源代碼,請從http://www.netgull.com/gcc/releases/下載匹配的版本。例如,4.8.2版本的版本是http://www.netgull.com/gcc/releases/gcc-4.8.2/(82 MB)。

的內置關鍵字在gcc/builtins.c

+2

我認爲這是一個更好的做法,指向官方消息來源,如http://gcc.gnu.org/svn.html。我使用'apt-get source gcc-4.8',因爲我有Debian發行版。 據我瞭解,'frv.c'是特定於架構的,就像'gcc/config'下的許多目錄一樣。 你的意思是'gcc/builtins.c',對不對? – Alf

+2

請注意,這些內置函數(就像標準頭文件)旨在隱藏實現特定的魔法,並且可能是瘋狂的不可移植的。 'va_start()'可以分配內存,必須使用'va_end()'釋放內存。這就是你不能簡單地複製'va_list'但必須使用'va_copy()'的原因。 – Deduplicator

+1

@Alf:當我張貼時我環顧四周,但沒有看到一個簡單的下載方式,所以我按照「鏡像」鏈接。感謝您的更好的鏈接。另外,我不知道路徑發生了什麼。它現在已經修復,配置的東西被刪除。 – wallyk

0

一般4169線進行處理,找到GCC如何擴展內置GCC功能,其名稱是「__builtin_ 」,看在報關海合會源的函數'expand_builtin_ foo'。