[英]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.