【问题标题】:glibc function to retrieve current executable name?glibc 函数检索当前的可执行文件名?
【发布时间】:2012-05-09 01:19:06
【问题描述】:

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

这样做的目的是为addr2line 提供-e 参数,如this answer 所示

【问题讨论】:

  • argv[0] 不是你想要的,出于某种原因吗?

标签: c gcc glibc addr2line


【解决方案1】:

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

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

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

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

你的程序

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

对于完整的可执行路径,linux 有/proc filesystem。在/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()

【讨论】:

  • 在这种情况下使用/proc/self/exe 更容易,因此不需要getpid() 调用。
【解决方案2】:

您可以在不引用实际变量的情况下访问 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-19
    • 2020-08-11
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    相关资源
    最近更新 更多