ldso: defer execution of static constructors

Ldso now does not automatically execute static constructors of the
binary and shared libraries the binary depends on. If static
construction is required (e.g., if a shared library with constructor is
used or a compilation unit contains global statics) the component needs
to execute the constructors explicitly in Component::construct() via
Genode::Env::exec_static_constructors().

In the case of libc components this is done by the libc startup code
(i.e., the Component::construct() implementation in the libc).

The loading of shared objects at runtime is not affected by this change
and constructors of those objects are executed immediately.

Fixes #2332
This commit is contained in:
Christian Helmuth
2017-03-15 15:40:55 +01:00
parent 67ac0dde6e
commit cb43e04691
36 changed files with 310 additions and 87 deletions

View File

@@ -160,4 +160,10 @@ struct Main
}
};
void Component::construct(Genode::Env &env) { static Main main(env); }
void Component::construct(Genode::Env &env)
{
/* XXX execute constructors of global statics */
env.exec_static_constructors();
static Main main(env);
}