From e97614bc9d60abd7cb15f11fd30eee9b8c291f3e Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sun, 10 Jul 2011 11:29:48 +0000 Subject: [PATCH] Implemented the LD_LIBRARY_PATH environment variable --- tools/elf.c | 24 ++++++++++++++---------- tools/ldd.c | 14 ++++++++------ 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/tools/elf.c b/tools/elf.c index 1fd32c3..273d19d 100644 --- a/tools/elf.c +++ b/tools/elf.c @@ -33,21 +33,23 @@ /* prototypes */ -static int ELFFUNC(ldd)(char const * filename, FILE * fp, ELFTYPE(Ehdr) * ehdr); +static int ELFFUNC(ldd)(char const * filename, FILE * fp, ELFTYPE(Ehdr) * ehdr, + char const * ldpath); /* functions */ /* ldd */ -static int ELFFUNC(ldd)(char const * filename, FILE * fp, ELFTYPE(Ehdr) * ehdr); static int ELFFUNC(phdr)(char const * filename, FILE * fp, ELFTYPE(Ehdr) * ehdr, - ELFTYPE(Phdr) * phdr); + ELFTYPE(Phdr) * phdr, char const * ldpath); static int ELFFUNC(phdr_dyn)(char const * filename, FILE * fp, - ELFTYPE(Ehdr) * ehdr, ELFTYPE(Phdr) * phdr, ELFTYPE(Dyn) * dyn); + ELFTYPE(Ehdr) * ehdr, ELFTYPE(Phdr) * phdr, ELFTYPE(Dyn) * dyn, + char const * ldpath); static int 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); -static int ELFFUNC(ldd)(char const * filename, FILE * fp, ELFTYPE(Ehdr) * ehdr) +static int ELFFUNC(ldd)(char const * filename, FILE * fp, ELFTYPE(Ehdr) * ehdr, + char const * ldpath) { int ret; ELFTYPE(Phdr) * phdr; @@ -60,13 +62,13 @@ static int ELFFUNC(ldd)(char const * filename, FILE * fp, ELFTYPE(Ehdr) * ehdr) return -_error(filename, strerror(errno), 1); if((phdr = malloc(sizeof(*phdr) * ehdr->e_phnum)) == NULL) return -_error(filename, strerror(errno), 1); - ret = ELFFUNC(phdr)(filename, fp, ehdr, phdr); + ret = ELFFUNC(phdr)(filename, fp, ehdr, phdr, ldpath); free(phdr); return ret; } static int ELFFUNC(phdr)(char const * filename, FILE * fp, ELFTYPE(Ehdr) * ehdr, - ELFTYPE(Phdr) * phdr) + ELFTYPE(Phdr) * phdr, char const * ldpath) { int ret = 0; size_t i; @@ -97,7 +99,7 @@ static int ELFFUNC(phdr)(char const * filename, FILE * fp, ELFTYPE(Ehdr) * ehdr, } if(fread(dyn, phdr[i].p_filesz, 1, fp) == 1) ret = ELFFUNC(phdr_dyn)(filename, fp, ehdr, &phdr[i], - dyn); + dyn, ldpath); else { if(ferror(fp) != 0) @@ -112,7 +114,8 @@ static int ELFFUNC(phdr)(char const * filename, FILE * fp, ELFTYPE(Ehdr) * ehdr, } static int ELFFUNC(phdr_dyn)(char const * filename, FILE * fp, - ELFTYPE(Ehdr) * ehdr, ELFTYPE(Phdr) * phdr, ELFTYPE(Dyn) * dyn) + ELFTYPE(Ehdr) * ehdr, ELFTYPE(Phdr) * phdr, ELFTYPE(Dyn) * dyn, + char const * ldpath) { ssize_t s = -1; ssize_t r = -1; @@ -147,7 +150,8 @@ 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; - if(ELFFUNC(phdr_dyn_print)(p, rpath) != 0 + if(ELFFUNC(phdr_dyn_print)(p, ldpath) != 0 + && ELFFUNC(phdr_dyn_print)(p, rpath) != 0 && ELFFUNC(phdr_dyn_print)(p, "/usr/lib:/lib") != 0) printf("\t%s\n", p); diff --git a/tools/ldd.c b/tools/ldd.c index b465afe..813df85 100644 --- a/tools/ldd.c +++ b/tools/ldd.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 @@ -26,7 +26,7 @@ /* private */ /* prototypes */ static int _error(char const * error1, char const * error2, int ret); -static int _ldd(char const * filename); +static int _ldd(char const * filename, char const * ldpath); #undef ELFSIZE #define ELFSIZE 32 #include "elf.c" @@ -44,6 +44,7 @@ int main(int argc, char * argv[]) int ret = 0; int o; int i; + char const * ldpath; while((o = getopt(argc, argv, "")) != -1) switch(o) @@ -53,8 +54,9 @@ int main(int argc, char * argv[]) } if(optind == argc) return _usage(); + ldpath = getenv("LD_LIBRARY_PATH"); for(i = optind; i < argc; i++) - ret |= _ldd(argv[i]); + ret |= _ldd(argv[i], ldpath); return (ret == 0) ? 0 : 2; } @@ -62,7 +64,7 @@ int main(int argc, char * argv[]) /* private */ /* functions */ /* ldd */ -static int _ldd(char const * filename) +static int _ldd(char const * filename, char const * ldpath) { int ret = 1; FILE * fp; @@ -80,9 +82,9 @@ static int _ldd(char const * filename) if(memcmp(elf.e_ident, ELFMAG, SELFMAG) != 0) ret = -_error(filename, "Not an ELF file", 1); else if(elf.e_ident[EI_CLASS] == ELFCLASS32) - ret = _do_ldd32(filename, fp, &elf.ehdr32); + ret = _do_ldd32(filename, fp, &elf.ehdr32, ldpath); else if(elf.e_ident[EI_CLASS] == ELFCLASS64) - ret = _do_ldd64(filename, fp, &elf.ehdr64); + ret = _do_ldd64(filename, fp, &elf.ehdr64, ldpath); else ret = -_error(filename, "Could not determine ELF class", 1);