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.
>   *

Reply via email to