1
我已經下載源代碼glibc
(GNU c
庫),版本 - 2.15.90。我正在追蹤printf()
函數的代碼。我正在使用工具cscope
和ctags
瀏覽代碼。以下是我通過了解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)呼叫對方。我哪裏做錯了?
不,OP有GCC堆棧檢查或堆棧保護器或類似的功能(可能默認由OP的分佈...),它充滿了與glibc的交互並導致調用像這樣重定向... –
所以你的意思是vfprintf()直接調用write()系統調用來在屏幕上打印輸出。 – curiousMind
不,vfprintf會將寫入(副本)寫入stdio緩衝區,該緩衝區可能會也可能不會被緩衝或刷新,並且可能會或可能不會附加到stderr或stdout,它們可能會或可能不會附加到當前終端。 –