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

lur*_*her 12 c gcc glibc addr2line

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

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

Mic*_*ade 15

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

int main (int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud)

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,"ERRORRRRR\n");
        exit(1);
    }
    exe[ret] = 0;
    printf("I am %s\n",exe);
}
Run Code Online (Sandbox Code Playgroud)

您也可以/proc/[pid]/exe直接转到addr2line().


bad*_*eip 7

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

用法示例:

extern const char *__progname;

int print_progname()
{
    return puts(__progname);
}
Run Code Online (Sandbox Code Playgroud)

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