2014-06-10 73 views

回答

3

libc是一個與特定操作系統,處理器以及經常使用的編譯器緊密相關的庫。因此,在libc來源中看到一些相當不可思議的東西並不罕見。

在這種情況下,ubp_av無界指向argv的指針。 GCC提供了控制指針上某些邊界檢查操作的(未詳細記錄的)__bounded__unbounded類型註釋。大概因爲argv是由OS提供的,它被認爲是無界的(即可能指向基本上任何長度的存儲器),並且可能由於libc編碼標準,它需要被標記爲這樣。

下面是GNU C庫的特定版本稍有不同的函數簽名:

int 
/* GKM FIXME: GCC: this should get __BP_ prefix by virtue of the 
    BPs in the arglist of startup_info.main and startup_info.init. */ 
    BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av, 
        char *__unbounded *__unbounded ubp_ev, 
        ElfW (auxv_t) * __unbounded auxvec, 
        void (*rtld_fini) (void), 
        struct startup_info *__unbounded stinfo, 
        char *__unbounded *__unbounded stack_on_entry) 
{ 
#if __BOUNDED_POINTERS__ 
    char **argv; 
#else 
# define argv ubp_av 
#endif 

... 

,從中可以清楚地看到,ubp_av意思是「無界指針ARGV」。

+0

Thee links幫助我更好理解你的答案;我加入以幫助他人:[鏈接](http://en.wikipedia.org/wiki/Bounded_pointer),[鏈接](https://gcc.gnu.org/projects/bp/main.html ),[鏈接](https://www.sourceware.org/ml/glibc-linux/2000-q2/msg00145.html)該gcc項目似乎被放棄。 – user2431763

0

編輯:nneonneo's answer比我好。

argvmain的第二個參數,它的類型爲char**

此功能__libc_start_main有7個參數。第一個是指向函數的指針,它看起來像是要與main兼容 - 還有第三個參數可能是環境指針。該函數指針的聲明省略了指向函數的參數名稱。如果這些名稱已包含,則第一行可能是:

int __libc_start_main(int (*main) (int argc, char **argv, char **envp), 

後跟其他6個參數聲明。

給定名稱,__libc_start_main可能是運行時庫中的一個函數,它負責調用用戶程序的main函數。

第二個參數是int argc,但這不同於main的第一個參數。

如果沒有更多的細節(特別是其執行的C庫,這是從的),我只能說約upb_av是,它的__libc_start_main第三個參數,而且它的char**類型。 av後綴表示它是某種參數向量,但我不知道upb前綴的含義。它可能與argv有關,但它是一個明顯的事情。

+0

main()的第三個參數是envp,它總是在堆棧上傳遞給main(),即使不存在於聲明中,即使我們寫入:int main(int argc,char ** argv){ ...} – user2431763

+1

@ user2431763:在什麼情況下?'envp'是一個常見的擴展,但C標準沒有提及它。 –

+0

你說得對,我在Debian wheezy(32位)中使用gcc 4.7.2 – user2431763

相關問題