2012-01-26 78 views
1

我已經下載源代碼glibc(GNU c庫),版本 - 2.15.90。我正在追蹤printf()函數的代碼。我正在使用工具cscopectags瀏覽代碼。以下是我通過了解printf()函數的路徑。 (在這裏,我只是提函數調用): -glibc中printf()的跟蹤代碼

1. Opening file "glibc/stdio-common/printf.c" 
2. int __printf (const char *format, ...) 
3. __extern_always_inline int vfprintf (FILE *__restrict __stream, const char *__restrict __fmt, _G_va_list __ap) 
4. int attribute_hidden __vfprintf_chk (FILE *s, int flag, const char *fmt, va_list ap) 
5. int attribute_compat_text_section __nldbl___vfprintf_chk (FILE *s, int flag, const char *fmt, va_list ap) 

一旦我高達功能\__nldbl___vfprintf_chk()達到了,還有就是__vfprintf_chk(),因此最後2個函數的調用(第4點中提到和5)呼叫對方。我哪裏做錯了?

回答

3

我沒有看到這樣的調用,printf迅速跳入vfprintf哪個做了真正的工作我說你的源代碼瀏覽器正在發揮作用,glibc是相當宏觀密集型的。

+0

不,OP有GCC堆棧檢查或堆棧保護器或類似的功能(可能默認由OP的分佈...),它充滿了與glibc的交互並導致調用像這樣重定向... –

+0

所以你的意思是vfprintf()直接調用write()系統調用來在屏幕上打印輸出。 – curiousMind

+0

不,vfprintf會將寫入(副本)寫入stdio緩衝區,該緩衝區可能會也可能不會被緩衝或刷新,並且可能會或可能不會附加到stderr或stdout,它們可能會或可能不會附加到當前終端。 –