現在の実行可能ファイルを取得する gcc/g++ から使用できる glibc 関数があるかどうか疑問に思っています。
これの目的は 、この回答addr2line
に示されているように-e 引数を提供することです
標準の C と glibc では、argv[0] があります。
int main (int argc, char *argv[])
配列の最初の要素はargv
プログラム名です。
ただし、実行可能ファイルが正確にどこにあるかを判断するには、それだけでは必ずしも十分ではありません。引数は実際には、プログラムを実行したプログラム (シェルであれウィンドウ マネージャーであれ) によって設定されますが、それらはあまり役に立ちません。プログラムがパスにあり、単にプログラムを実行する場合
あなたのプログラム
bash シェルでは、「your_program」だけが argv[0] に表示されます。
完全な実行可能パスについては、linux には/proc
filesystemがあります。実行中の各プロセスの下で/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()
ます。
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 環境を参照してください。