14

現在の実行可能ファイルを取得する gcc/g++ から使用できる glibc 関数があるかどうか疑問に思っています。

これの目的は 、この回答addr2lineに示されているように-e 引数を提供することです

4

2 に答える 2

16

標準の C と glibc では、argv[0] があります。

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

配列の最初の要素はargvプログラム名です。

ただし、実行可能ファイルが正確にどこにあるかを判断するには、それだけでは必ずしも十分ではありません。引数は実際には、プログラムを実行したプログラム (シェルであれウィンドウ マネージャーであれ) によって設定されますが、それらはあまり役に立ちません。プログラムがパスにあり、単にプログラムを実行する場合

あなたのプログラム

bash シェルでは、「your_program」だけが argv[0] に表示されます。

完全な実行可能パスについては、linux には/procfilesystemがあります。実行中の各プロセスの下で/proc、プロセス ID で名前が付けられた独自の「ディレクトリ」を取得します。実行中のプロセスは、 の下に独自のサブツリーも表示できます/proc/self。各プロセスが取得するファイルの 1 つに があります/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

glibc に保存されたポインターを使用して、実際の変数への参照なしで argv[0] にアクセスできます: 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 execveおよびman 7 環境を参照してください。

于 2013-01-21T19:15:23.997 に答える