Skip to content
Snippets Groups Projects
Commit 466b3851 authored by Avi Kivity's avatar Avi Kivity
Browse files

dlfcn: implement dlsym(handle, sym) with handle != RTLD_DEFAULT

fixes loading unit tests with "main" as the entry point.
parent 49a44195
No related branches found
No related tags found
No related merge requests found
...@@ -27,6 +27,12 @@ namespace elf { ...@@ -27,6 +27,12 @@ namespace elf {
} }
symbol_module::symbol_module()
: symbol()
, object()
{
}
symbol_module::symbol_module(Elf64_Sym* _sym, elf_object* _obj) symbol_module::symbol_module(Elf64_Sym* _sym, elf_object* _obj)
: symbol(_sym) : symbol(_sym)
, object(_obj) , object(_obj)
......
...@@ -315,6 +315,7 @@ namespace elf { ...@@ -315,6 +315,7 @@ namespace elf {
struct symbol_module { struct symbol_module {
public: public:
symbol_module();
symbol_module(Elf64_Sym* sym, elf_object* object); symbol_module(Elf64_Sym* sym, elf_object* object);
void* relocated_addr() const; void* relocated_addr() const;
Elf64_Sym* symbol; Elf64_Sym* symbol;
......
...@@ -12,9 +12,17 @@ void* dlopen(const char* filename, int flags) ...@@ -12,9 +12,17 @@ void* dlopen(const char* filename, int flags)
void* dlsym(void* handle, const char* name) void* dlsym(void* handle, const char* name)
{ {
// FIXME: don't ignore handle elf::symbol_module sym;
auto sym = elf::get_program()->lookup(name); if (handle == RTLD_DEFAULT) {
if (!sym.object) { sym = elf::get_program()->lookup(name);
} else if (handle == RTLD_NEXT) {
// FIXME: implement
abort();
} else {
auto obj = reinterpret_cast<elf::elf_object*>(handle);
sym = { obj->lookup_symbol(name), obj };
}
if (!sym.object || !sym.symbol) {
return nullptr; return nullptr;
} }
return sym.relocated_addr(); return sym.relocated_addr();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment