簡體   English   中英

為什么__libc_start_main的第三個參數具有名稱ubp_av而不是argv?

[英]Why the 3rd parameter of __libc_start_main has name ubp_av and not argv?

在以下原型中:

int __libc_start_main( int (*main) (int, char * *, char * *),
    int argc, 
    char **ubp_av, 
    void (*init) (void),
    void (*fini) (void),
    void (*rtld_fini) (void),
    void (* stack_end) );

為什么ubp_av而不是argv出現?
ubp_av是什么意思?

libc是一個與特定的操作系統,處理器以及經常使用的編譯器緊密聯系的庫。 因此,在libc源代碼中看到一些相當神秘的東西並不少見。

在這種情況下, ubp_avargv無界指針。 GCC提供(未充分說明) __bounded__unbounded類型注釋,它們控制指針上的某些邊界檢查操作。 大概是因為argv是由OS提供的,因此它被認為是無界的(即可以指向任何長度的內存),並且大概是由於libc編碼標准,因此需要將其標記為argv

這是與特定版本的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的無限指針”。

編輯: nneonneo的答案比我的要好。

argv是第二個參數,以main ,它的類型的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有關,但這是與眾不同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM