diff --git a/src/backtrace.c b/src/backtrace.c index ec4c4701..759a8431 100644 --- a/src/backtrace.c +++ b/src/backtrace.c @@ -156,14 +156,33 @@ static void signal_handler(int signo) exit(EXIT_FAILURE); } -void __iwd_backtrace_init(const char *program) +void __iwd_backtrace_init() { static char path[PATH_MAX]; + static char cwd[PATH_MAX]; struct sigaction sa; sigset_t mask; + ssize_t len; - program_exec = program; - program_path = getcwd(path, sizeof(path)); + /* Attempt to get the full path to our executable */ + len = readlink("/proc/self/exe", path, sizeof(path) - 1); + if (len > 0) { + int i; + path[len] = '\0'; + + for (i = len - 1; i >= 0; i--) { + if (path[i] != '/') + continue; + + program_exec = path; + break; + } + } + + if (program_exec == NULL) + return; + + program_path = getcwd(cwd, sizeof(cwd)); sigemptyset(&mask); sa.sa_handler = signal_handler; diff --git a/src/backtrace.h b/src/backtrace.h index 973466a0..bfdc8583 100644 --- a/src/backtrace.h +++ b/src/backtrace.h @@ -20,6 +20,6 @@ * */ #ifdef __GLIBC__ -void __iwd_backtrace_init(const char *program); +void __iwd_backtrace_init(); void __iwd_backtrace_print(unsigned int offset); #endif diff --git a/src/main.c b/src/main.c index a75b3a34..3eb79486 100644 --- a/src/main.c +++ b/src/main.c @@ -197,7 +197,7 @@ int main(int argc, char *argv[]) l_debug_enable("*"); #ifdef __GLIBC__ - __iwd_backtrace_init(argv[0]); + __iwd_backtrace_init(); #endif l_info("Wireless daemon version %s", VERSION);