14

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

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

4

2 回答 2

16

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

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

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

然而,仅靠它自己来确定可执行文件的确切位置并不一定足够。该参数实际上是由运行您的程序的程序设置的——无论是外壳程序还是窗口管理器——它们并不是很有帮助。如果您的程序在路径中并且您只需使用

你的程序

在 bash shell 中,您将在 argv[0] 中获得“your_program”。

对于完整的可执行路径,linux 有/procfilesystem。在/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,"ERRORRRRR\n");
        exit(1);
    }
    exe[ret] = 0;
    printf("I am %s\n",exe);
}

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

于 2012-04-28T16:15:31.963 回答
11

您可以在不引用实际变量的情况下访问 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] 不一定反映用于调用程序的名称。有关详细信息,请参阅man 2 execveman 7 environ

于 2013-01-21T19:15:23.997 回答