[英]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_av
是argv
的無界指針。 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.