diff --git a/repos/dde_rump/src/lib/rump/bootstrap.cc b/repos/dde_rump/src/lib/rump/bootstrap.cc
index fe22ec966..f669e71aa 100644
--- a/repos/dde_rump/src/lib/rump/bootstrap.cc
+++ b/repos/dde_rump/src/lib/rump/bootstrap.cc
@@ -19,10 +19,9 @@ extern "C" {
#include
#include
+#include
#include
-#include "dl_interface.h"
-
extern "C" void wait_for_continue();
#ifdef _LP64
@@ -36,14 +35,14 @@ typedef Elf32_Sym Elf_Sym;
static bool const verbose = false;
-static void *dl_main;
+static Genode::Shared_object *obj_main;
struct Sym_tab
{
- link_map *map;
+ Genode::Shared_object::Link_map const *map;
- void const *dynamic_base = 0;
- void const *sym_base = 0;
+ void const *dynamic_base = nullptr;
+ void const *sym_base = nullptr;
Elf_Addr str_tab = 0;
size_t sym_cnt = 0;
@@ -52,20 +51,21 @@ struct Sym_tab
Elf_Sym *sym_tab;
- Sym_tab(link_map *map) : map(map), dynamic_base(map->l_ld)
+ Sym_tab(Genode::Shared_object::Link_map const *map)
+ : map(map), dynamic_base(map->dynamic)
{
if (!dynamic_base) {
- PERR("%s: base is bogus %lx", map->l_name, map->l_addr);
+ PERR("%s: base is bogus %lx", map->path, map->addr);
throw -1;
}
if (verbose)
- PDBG("for %s at %lx\n", map->l_name, map->l_addr);
+ PDBG("for %s at %lx\n", map->path, map->addr);
find_tables();
if (!sym_base) {
- PERR("%s: could not find symbol table (sym_base %p)", map->l_name,
+ PERR("%s: could not find symbol table (sym_base %p)", map->path,
sym_base);
throw -2;
}
@@ -117,10 +117,10 @@ struct Sym_tab
switch (dyn_tag) {
case DT_SYMTAB:
- sym_base = (void *)(elf_dyn(i)->d_un.d_ptr + map->l_addr);
+ sym_base = (void *)(elf_dyn(i)->d_un.d_ptr + map->addr);
break;
case DT_STRTAB:
- str_tab = elf_dyn(i)->d_un.d_ptr + map->l_addr;
+ str_tab = elf_dyn(i)->d_un.d_ptr + map->addr;
break;
case DT_STRSZ:
str_size = elf_dyn(i)->d_un.d_ptr;
@@ -128,7 +128,7 @@ struct Sym_tab
case DT_HASH:
{
Elf_Symindx *hashtab = (Elf_Symindx *)(elf_dyn(i)->d_un.d_ptr +
- map->l_addr);
+ map->addr);
sym_cnt = hashtab[1];
}
break;
@@ -164,7 +164,7 @@ struct Sym_tab
sym_tab[out_cnt] = *sym;
/* set absolute value */
- sym_tab[out_cnt].st_value += map->l_addr;
+ sym_tab[out_cnt].st_value += map->addr;
if (verbose)
PDBG("Read symbol %s val: %zx", name, sym_tab[out_cnt].st_value);
out_cnt++;
@@ -178,37 +178,30 @@ struct Sym_tab
};
-char const *_filename(char const *path)
-{
- int i;
- int len = Genode::strlen(path);
- for (i = len; i > 0 && path[i] != '/'; i--) ;
- return path + i + 1;
-}
-
/**
* Call init functions of libraries
*/
-static void _dl_init(link_map const *map,
+static void _dl_init(Genode::Shared_object::Link_map const *map,
rump_modinit_fn mod_init,
rump_compload_fn comp_init)
{
- void *handle = dlopen(map->l_name, RTLD_LAZY);
- if (!handle)
- PERR ("Could not dlopen %s\n", map->l_name);
+ using namespace Genode;
+ Shared_object *obj;
+ try { obj = new (Genode::env()->heap()) Shared_object(map->path); }
+ catch (...) { PERR ("Could not dlopen %s\n", map->path); return; }
struct modinfo **mi_start, **mi_end;
struct rump_component **rc_start, **rc_end;
- mi_start = (modinfo **)dlsym(handle, "__start_link_set_modules");
- mi_end = (modinfo **)dlsym(handle, "__stop_link_set_modules");
+ mi_start = obj->lookup("__start_link_set_modules");
+ mi_end = obj->lookup("__stop_link_set_modules");
if (verbose)
PDBG("MI: start: %p end: %p", mi_start, mi_end);
if (mi_start && mi_end)
mod_init(mi_start, (size_t)(mi_end-mi_start));
- rc_start = (rump_component **)dlsym(handle, "__start_link_set_rump_components");
- rc_end = (rump_component **)dlsym(handle, "__stop_link_set_rump_components");
+ rc_start = obj->lookup("__start_link_set_rump_components");
+ rc_end = obj->lookup("__stop_link_set_rump_components");
if (verbose)
PDBG("RC: start: %p end: %p", rc_start, rc_end);
if (rc_start && rc_end) {
@@ -222,26 +215,24 @@ void rumpuser_dl_bootstrap(rump_modinit_fn domodinit, rump_symload_fn symload,
rump_compload_fn compload)
{
/* open main program and request link map */
- dl_main = dlopen(0, RTLD_NOW);
+ using namespace Genode;
- struct link_map *map;
- if(dlinfo(dl_main, RTLD_DI_LINKMAP, &map)) {
- PERR("Error: Could not retrieve linkmap from main program");
- return;
- }
+ obj_main = new (env()->heap()) Shared_object(nullptr, Shared_object::NOW);
- for (; map->l_next; map = map->l_next) ;
+ Shared_object::Link_map const *map = obj_main->link_map();
+ for (; map->next; map = map->next) ;
- struct link_map *curr_map;
+ Shared_object::Link_map const *curr_map;
- for (curr_map = map; curr_map; curr_map = curr_map->l_prev)
- if (!Genode::strcmp(_filename(curr_map->l_name), "rump", 4)) {
+ for (curr_map = map; curr_map; curr_map = curr_map->prev) {
+ if (!Genode::strcmp(curr_map->path, "rump", 4)) {
Sym_tab tab(curr_map);
/* load into rum kernel */
tab.rump_load(symload);
/* init modules and components */
_dl_init(curr_map, domodinit, compload);
}
+ }
PINF("BOOTSTRAP");
}
@@ -249,7 +240,9 @@ void rumpuser_dl_bootstrap(rump_modinit_fn domodinit, rump_symload_fn symload,
void * rumpuser_dl_globalsym(const char *symname)
{
- void *addr = dlsym(RTLD_DEFAULT, symname);
+ void *addr = 0;
+ try { addr = obj_main->lookup(symname); }
+ catch (...) { }
if (verbose)
PDBG("Lookup: %s addr %p", symname, addr);
diff --git a/repos/dde_rump/src/lib/rump/dl_interface.h b/repos/dde_rump/src/lib/rump/dl_interface.h
deleted file mode 100644
index ccfa6235a..000000000
--- a/repos/dde_rump/src/lib/rump/dl_interface.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * \brief DL interface to the dynamic linker (since we don't rely on libc)
- *
- * These "weak" function should never be reached, because they are
- * intercepted by ouer dynamic linker, if you see an error message than
- * you program might not be a dynamic one.
- *
- * \author Sebastian Sumpf
- * \date 2013-13-13
- */
-
-/*
- * Copyright (C) 2013-2014 Genode Labs GmbH
- *
- * This file is part of the Genode OS framework, which is distributed
- * under the terms of the GNU General Public License version 2.
- */
-#ifndef _DL_INTERFACE_H_
-#define _DL_INTERFACE_H_
-
-#include
-
-extern "C" {
-
-/**
- * dlopen
- */
-enum Open_mode { RTLD_LAZY = 1, RTLD_NOW = 2 };
-
-void __attribute__((weak))
-*dlopen(const char *name, int mode)
-{
- PERR("dlopen: Local function called");
- return 0;
-}
-
-/**
- * dlinfo
- */
-enum Reqeust { RTLD_DI_LINKMAP = 2 };
-
-struct link_map {
- unsigned long l_addr; /* Base Address of library */
- const char *l_name; /* Absolute Path to Library */
- const void *l_ld; /* Pointer to .dynamic in memory */
- struct link_map *l_next, *l_prev; /* linked list of of mapped libs */
-};
-
-int __attribute__((weak))
-dlinfo(void *handle, int request, void *p)
-{
- PERR("dlinfo: Local function called");
- return 0;
-}
-
-/**
- * dlsym
- */
-#define RTLD_DEFAULT ((void *)-2)
-
-void __attribute__((weak))
-*dlsym(void *handle, const char *name)
-{
- PERR("dlsym: Local function called");
- return 0;
-}
-
-} /* extern "C" */
-
-#endif /* _DL_INTERFACE_H_ */