w standardowych C glibc zostały argv [0]
int main (int argc, char *argv[])
pierwszy element z argv
array to nazwa programu.
Jednak nie wystarczy samodzielnie określić, gdzie dokładnie znajduje się plik wykonywalny. Argument jest faktycznie ustawiony przez program, który uruchomił twój program - czy to skorupa, czy menedżer okien - i nie są one strasznie pomocne. Jeśli program znajduje się na ścieżce i uruchomieniu programu po prostu z
your_program
w powłoce bash, a następnie „your_program” to wszystko otrzymasz w argv [0].
Dla pełnej ścieżki wykonywalnej, linux ma /proc
filesystem. Zgodnie z /proc
każdy uruchomiony proces otrzymuje własny "katalog", nazwany jego identyfikatorem procesu. Działający proces może również zobaczyć własne poddrzewo pod numerem /proc/self
. Jeden z plików otrzymywanych przez każdy proces to /proc/[pid]/exe
, który jest dowiązaniem symbolicznym do faktycznego pliku wykonywalnego, w którym proces jest uruchomiony.
Więc można uzyskać rzeczywiste pełną ścieżkę pliku wykonywalnego tak:
#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);
}
może także być w stanie przekazać /proc/[pid]/exe
bezpośrednio do addr2line()
.
Można go uzyskać z argv [0] – BlackBear
Czy argv [0] nie jest to, co chcesz, z jakiegoś powodu? – thb