2015-11-18 38 views
2

我想了解如何做的Hello World程序的工作原理:如何理解glibc交叉引用?

#include <stdio.h> 

int main(int argc, char **argv) { 
    printf("Hello World!"); 
    return 0; 
} 

大部分是簡單,除了printf部分。我不知道它是如何工作的。爲了理解它,我找了glibc cross reference,發現this page

然後我搜索了printf,它給我帶來了很多results

現在我的程序正在使用這些printf中的哪一個?我如何確定它?

另外,例如打開first result在該頁面時,在printf功能的功能使我__printf_chk,其中__printf_chk功能使我__nldbl___vfprintf_chk,其中__nldbl___vfprintf_chk功能使我__vfprintf_chk,其中功能__vfprintf_chk將我引向__nldbl___vfprintf_chk,它創建了一個無限遞歸。這是怎麼回事?

總之,我該如何追蹤給定函數/源代碼的來源?

+0

發現「現在這些用printfs我的程序正在使用?如何確定呢?一」你應該弄清楚圖書館是如何建造的。這主要取決於如何調用編譯器,這是在Makefiles中定義的。這可能是不可讀的。不是glibc好玩嗎? (破壞者:glibc不好玩) –

+0

另一個破壞者:你最終會在[vfprintf in stdio-common/vfprintf.c]中定義(http://osxr.org/glibc/source/stdio- common/vfprintf.c#0221),但要查看'__printf'之類的函數與函數之間的關係,則必須通過大量的預處理宏和GCC特定的屬性聲明。 –

+0

@Rhymoid是所有這些創建/保存可移植性的原因嗎? – Utku

回答

0

我沒有一個完整的答案,但我無法發表評論。它看起來像__vfprintf_chk調用vfprintf,該文件在/stdio-common/vfprintf.c中似乎被別名爲_IO_vfprintf_internal。我不知道最後一個函數的起源,但我看不到這裏的無限循環?

+0

[在此頁](http://osxr.org/glibc/source/sysdeps/ieee754/ldbl-opt/nldbl-vfprintf_chk.c#0005),'__vfprintf_chk'調用'__nldbl ___ vfprintf_chk'。 – Utku

+0

我明白你的意思了。看起來我不會有太大的幫助,而且我不知道你提到的遞歸是如何解決的,但printf似乎已經定義[here](http://osxr.org/glibc/source/stdio-common /printf.c)。查明哪一個被使用將需要挖掘哪一個被構建系統編譯/鏈接,不知道更多。 – tauroid

0

printf實現在stdio-common/printf.c

int 
__printf (const char *format, ...) 
{ 
    va_list arg; 
    int done; 

    va_start (arg, format); 
    done = vfprintf (stdout, format, arg); 
    va_end (arg); 

    return done; 
} 

這就要求vfprintf

+1

我該怎麼知道它叫_that_'printf'而不是別人? – Utku

+1

這是迷惑我的主要部分。例如,當您在交叉引用頁面中查找'vfprintf'時,您會看到一打[結果](http://osxr.org/glibc/ident?_i=vfprintf),其中3個表示爲函數定義。你的鏈接指向這些結果中的第二個函數定義,但我怎麼知道第二個'vprintf'被調用,而不是2個? – Utku

+0

有沒有簡單的規則 - 你可能需要檢查每個選項。由於可移植性和兼容性的要求,「glibc」非常密集。也就是說,清除一些選項的一個簡單方法是查看文件路徑和文件名。 '__printf_chk'帶你進入'sysdep'目錄 - 你不需要進入核心實現的那些類型的目錄。 – rohit89