C - 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 <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(void) {
    char exe[1024];
    int ret;
    ret = readlink("/proc/self/exe",exe,sizeof(exe)-1);
    if(ret ==-1) {
        fprintf(stderr,"ERRORRRRRn");
        exit(1);
    }
    exe[ret] = 0;
    printf("I am %sn",exe);
}

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

你可以在不引用实际变量的情况下访问 argv[0],方法是使用 glibc: 中保存的指针 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] 并不一定反映用于调用程序的名称。有关更多信息,请参阅男人 2 执行男人 7 环境

最新更新