我想知道是否有一个glibc函数可以使用gcc/g++来检索当前的可执行文件。
其目的是为addr2line提供-e参数,如this answer所示

最佳答案

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

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

数组的第一个元素是程序名。
然而,仅凭它自己并不一定足以确定可执行文件的确切位置。这个参数实际上是由运行程序的程序设置的—无论是shell还是窗口管理器—它们都没有太大帮助。如果您的程序在路径中,并且您只需使用
你的课程
在bash shell中,“your_program”是argv[0]中的全部内容。
对于完整的可执行路径,linux具有argv filesystem。在/proc下,每个运行的进程都有自己的“目录”,由其进程id命名。运行的进程也可以在/proc下看到自己的子树。每个进程获取的文件之一是/proc/self,它是指向进程正在运行的实际可执行文件的符号链接。
所以您可以得到实际的完整可执行路径,如下所示:
#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,"ERRORRRRR\n");
        exit(1);
    }
    exe[ret] = 0;
    printf("I am %s\n",exe);
}

您还可以将/proc/[pid]/exe直接传递到/proc/[pid]/exe

关于c - glibc函数检索当前的可执行文件名称?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10365086/

10-12 02:59