glibc函数检索当前的可执行文件名?

我想知道是否有一个glibc函数,我可以使用gcc / g ++来检索当前的可执行文件。

这样做的目的是为addr2line提供-e参数,如本答案所示

在标准C和glibc中,你有argv [0]:

 int main (int argc, char *argv[]) 

argv数组的第一个元素是程序名。

然而,它本身并不足以确定可执行文件的确切位置。 该参数实际上是由运行程序的程序设置的 – 无论是shell还是窗口管理器 – 它们都不是非常有用。 如果您的程序在路径中并且您只是使用运行程序

your_program

在bash shell中,然后“your_program”就是argv [0]中的所有内容。

对于完整的可执行文件路径,linux具有/proc文件系统 。 在/proc每个运行进程都有自己的“目录”,以进程ID命名。 运行进程也可以在/proc/self下看到自己的子树。 每个进程获取的文件之一是/proc/[pid]/exe ,它是进程运行的实际可执行文件的符号链接。

所以你可以像这样得到实际的完整可执行路径:

 #include  #include  #include  #include  int main(void) { char exe[1024]; int ret; ret = readlink("/proc/self/exe",exe,sizeof(exe)-1); if(ret ==-1) { fprintf(stderr,"ERRORRRRR\n"); exit(1); } exe[ret] = 0; printf("I am %s\n",exe); } 

您也可以将/proc/[pid]/exe直接传递给addr2line()

您可以通过在glibc中使用已保存的指针来访问argv [0]而不引用实际变量: https ://sourceware.org/git/ ? p = glibc.git; a = blob; f = misc / init- misc.c; H = 2a1b82710ec8b42b4dac6edb359d8920f902cd21; HB = HEAD

用法示例:

 extern const char *__progname; int print_progname() { return puts(__progname); } 

argv [0]不一定反映用于调用程序的名称。 有关更多信息,请参阅man 2 execveman 7 environ

Interesting Posts