繁体   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