diff --git a/tools/elf.c b/tools/elf.c index 51207bf..303184a 100644 --- a/tools/elf.c +++ b/tools/elf.c @@ -1,5 +1,5 @@ /* $Id$ */ -/* Copyright (c) 2010 Pierre Pronchery */ +/* Copyright (c) 2011 Pierre Pronchery */ /* This file is part of DeforaOS System Loader */ /* This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,6 +15,9 @@ +#include + + /* macros */ # undef ELFFUNC # undef ELFTYPE @@ -40,6 +43,7 @@ static int ELFFUNC(phdr)(char const * filename, FILE * fp, ELFTYPE(Ehdr) * ehdr, ELFTYPE(Phdr) * phdr); static int ELFFUNC(phdr_dyn)(char const * filename, FILE * fp, ELFTYPE(Ehdr) * ehdr, ELFTYPE(Phdr) * phdr, ELFTYPE(Dyn) * dyn); +static void ELFFUNC(phdr_dyn_print)(char const * filename, char const * rpath); static char * ELFFUNC(string)(char const * filename, FILE * fp, ELFTYPE(Ehdr) * ehdr, ELFTYPE(Addr) addr, ELFTYPE(Addr) index); @@ -114,6 +118,7 @@ static int ELFFUNC(phdr_dyn)(char const * filename, FILE * fp, ssize_t r = -1; size_t i; char * p; + char * rpath = NULL; for(i = 0; (i + 1) * sizeof(*dyn) < phdr->p_filesz; i++) { @@ -126,8 +131,12 @@ static int ELFFUNC(phdr_dyn)(char const * filename, FILE * fp, } if(s < 0) return -_error(filename, "Missing string section", 1); + if(s >= 0 && r >= 0) + rpath = ELFFUNC(string)(filename, fp, ehdr, dyn[s].d_un.d_val, + dyn[r].d_un.d_val); #ifdef DEBUG - fprintf(stderr, "DEBUG: %s() strtab=%ld\n", __func__, s); + fprintf(stderr, "DEBUG: %s() strtab=%ld rpath=%ld \"%s\"\n", __func__, + dyn[s].d_un.d_val, dyn[r].d_un.d_val, rpath); #endif for(i = 0; (i + 1) * sizeof(*dyn) < phdr->p_filesz; i++) { @@ -138,13 +147,48 @@ static int ELFFUNC(phdr_dyn)(char const * filename, FILE * fp, if((p = ELFFUNC(string)(filename, fp, ehdr, dyn[s].d_un.d_ptr, dyn[i].d_un.d_val)) == NULL) continue; - printf("\t%s\n", p); - /* FIXME display the full filename and address */ + ELFFUNC(phdr_dyn_print)(p, rpath); free(p); } return 0; } +static void ELFFUNC(phdr_dyn_print)(char const * filename, char const * rpath) +{ + size_t len = strlen(filename); + size_t i; + char * p; + struct stat st; + int res; + +#ifdef DEBUG + fprintf(stderr, "DEBUG: %s(\"%s\", \"%s\")\n", __func__, filename, + rpath); +#endif + if(rpath != NULL) + for(i = 0;;) + { + if(rpath[i] != ':' && rpath[i] != '\0') + { + i++; + continue; + } + p = malloc(i + len + 2); + snprintf(p, i + 1, "%s", rpath); + snprintf(&p[i], len, "/%s", filename); + if((res = stat(p, &st)) == 0) + printf("\t%s => %s\n", filename, p); + free(p); + if(res == 0) + return; + if(rpath[i] == '\0') + break; + rpath += i + 1; + i = 0; + } + printf("\t%s\n", filename); +} + static char * ELFFUNC(string)(char const * filename, FILE * fp, ELFTYPE(Ehdr) * ehdr, ELFTYPE(Addr) addr, ELFTYPE(Addr) index) {