dlfcn.c

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2008 Jiri Svoboda
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  *
00009  * - Redistributions of source code must retain the above copyright
00010  *   notice, this list of conditions and the following disclaimer.
00011  * - Redistributions in binary form must reproduce the above copyright
00012  *   notice, this list of conditions and the following disclaimer in the
00013  *   documentation and/or other materials provided with the distribution.
00014  * - The name of the author may not be used to endorse or promote products
00015  *   derived from this software without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
00018  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00019  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00020  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
00021  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
00022  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00023  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00024  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00025  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00026  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00027  */
00028 
00037 #include <stdio.h>
00038 #include <stdlib.h>
00039 #include <dlfcn.h>
00040 
00041 #include <rtld/module.h>
00042 #include <rtld/symbol.h>
00043 
00044 void *dlopen(const char *path, int flag)
00045 {
00046         module_t *m;
00047 
00048         if (runtime_env == NULL) {
00049                 printf("Dynamic linker not set up -- initializing.\n");
00050                 rtld_init_static();
00051         }
00052 
00053         printf("dlopen(\"%s\", %d)\n", path, flag);
00054 
00055         printf("module_find('%s')\n", path);
00056         m = module_find(path);
00057         if (m == NULL) {
00058                 printf("NULL. module_load('%s')\n", path);
00059                 m = module_load(path);
00060                 printf("module_load_deps(m)\n");
00061                 module_load_deps(m);
00062                 /* Now relocate. */
00063                 printf("module_process_relocs(m)\n");
00064                 module_process_relocs(m);
00065         } else {
00066                 printf("not NULL\n");
00067         }
00068 
00069         return (void *) m;
00070 }
00071 
00072 /*
00073  * @note Symbols with NULL values are not accounted for.
00074  */
00075 void *dlsym(void *mod, const char *sym_name)
00076 {
00077         elf_symbol_t *sd;
00078         module_t *sm;
00079 
00080         printf("dlsym(0x%lx, \"%s\")\n", (long)mod, sym_name);
00081         sd = symbol_bfs_find(sym_name, (module_t *) mod, &sm);
00082         if (sd != NULL) {
00083                 return symbol_get_addr(sd, sm);
00084         }
00085 
00086         return NULL;
00087 }
00088 

Generated on Thu Jun 2 07:45:46 2011 for HelenOS/USB by  doxygen 1.4.7