Daniel P. Berrangé <[email protected]> writes: > Functions marked with __attribute__((__constructor__)) will be > invoked in linker order. In theory this is well defined, but > in practice, it is hard to determine what this order will be > with the layers of indirection through meson, ninja and the > static libraries QEMU builds. > > Notably, the order currently appears different between Linux > and Windows (as tested with Wine on Linux). This can cause > problems when certain QEMU constructors have a dependancy on > other QEMU constructors. > > To address this define a QEMU_CONSTRUCTOR_EARLY constant which > provides a priority value that will run before other default > constructors. This is to be used for QEMU constructors that > are themselves self-contained, but may be relied upon by other > constructors. > > Reviewed-by: Richard Henderson <[email protected]> > Reviewed-by: Dr. David Alan Gilbert <[email protected]> > Signed-off-by: Daniel P. Berrangé <[email protected]>
I'm no fan of doing non-trivial work in constructors. We discussed possible alternatives in review of v5. This is an opinion, not a demand. And Paolo's opinion counts a lot more here. > --- > include/qemu/compiler.h | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/include/qemu/compiler.h b/include/qemu/compiler.h > index 1c2b673c05..4c49f52eb0 100644 > --- a/include/qemu/compiler.h > +++ b/include/qemu/compiler.h > @@ -194,6 +194,14 @@ > # define QEMU_USED > #endif > > +/* > + * A priority for __attribute__((constructor(...))) that > + * will run earlier than the default constructors. Must > + * only be used for functions that have no dependency > + * on global initialization of other QEMU subsystems. > + */ > +#define QEMU_CONSTRUCTOR_EARLY 101 > + > /* > * Disable -ftrivial-auto-var-init on a local variable. > *
