diff --git a/repos/base/src/lib/ldso/include/init.h b/repos/base/src/lib/ldso/include/init.h index 7d221d362..aaf568827 100644 --- a/repos/base/src/lib/ldso/include/init.h +++ b/repos/base/src/lib/ldso/include/init.h @@ -104,6 +104,15 @@ struct Linker::Init : List exec_static_constructors(); } + bool needs_static_construction() + { + for (Object *obj = first(); obj; obj = obj->next_init()) + if (obj->needs_static_construction()) + return true; + + return false; + } + void exec_static_constructors() { in_progress = true; diff --git a/repos/base/src/lib/ldso/include/linker.h b/repos/base/src/lib/ldso/include/linker.h index d4544d5e7..ee49bbe36 100644 --- a/repos/base/src/lib/ldso/include/linker.h +++ b/repos/base/src/lib/ldso/include/linker.h @@ -132,6 +132,8 @@ class Linker::Object : private Fifo::Element, Object *_next_object() const { return List::Element::next(); } + Elf::Addr _symbol_address(char const *name); + Name _name { }; File const *_file { nullptr }; Elf::Addr _reloc_base { 0 }; @@ -195,6 +197,8 @@ class Linker::Object : private Fifo::Element, * Return address info for symboal at addr */ virtual Symbol_info symbol_at_address(addr_t addr) const = 0; + + bool needs_static_construction(); }; diff --git a/repos/base/src/lib/ldso/main.cc b/repos/base/src/lib/ldso/main.cc index c41752fd9..db5781f37 100644 --- a/repos/base/src/lib/ldso/main.cc +++ b/repos/base/src/lib/ldso/main.cc @@ -385,10 +385,7 @@ struct Linker::Binary : private Root_object, public Elf_object { if (static_construction_finished) return false; - Func * const ctors_start = (Func *)lookup_symbol("_ctors_start"); - Func * const ctors_end = (Func *)lookup_symbol("_ctors_end"); - - return (ctors_end != ctors_start) || Init::list()->contains_deps(); + return Init::list()->needs_static_construction(); } void finish_static_construction() @@ -477,6 +474,28 @@ struct Linker::Binary : private Root_object, public Elf_object }; +/********************************** + ** Linker object implementation ** + **********************************/ + +Elf::Addr Linker::Object::_symbol_address(char const *name) +{ + unsigned long hash = Hash_table::hash(name); + Elf::Sym const *sym = dynamic().lookup_symbol(name, hash); + + if (sym) + return reloc_base() + sym->st_value; + else + return Elf::Addr(0); +} + + +bool Linker::Object::needs_static_construction() +{ + return _symbol_address("_ctors_end") != _symbol_address("_ctors_start"); +} + + /*************************************** ** Global Linker namespace functions ** ***************************************/ diff --git a/repos/libports/src/test/fatfs_blkio/component.cc b/repos/libports/src/test/fatfs_blkio/component.cc index 5b8287acf..5489e06d8 100644 --- a/repos/libports/src/test/fatfs_blkio/component.cc +++ b/repos/libports/src/test/fatfs_blkio/component.cc @@ -6,8 +6,6 @@ extern int main (int argc, char* argv[]); void Libc::Component::construct(Libc::Env &env) { - env.exec_static_constructors(); - Genode::Heap heap(env.ram(), env.rm()); Fatfs::block_init(env, heap);