On Mon, 25 Aug 2025, Alexander Monakov wrote:

> Most likely you are hitting Static Initialization Order Fiasco:
> https://en.cppreference.com/w/cpp/language/siof.html
> 
> class color actually has a constructor which will be used for constructing
> the 'default_color' global object:
> 
>   color(symbol s = default_symbol) : scheme(DEFAULT), nm(s) {}
> 
> This will copy the uninitialized contents of default_symbol, if its 
> constructor
> has not completed by that time.
> 
> Since libgroff is a static library, the order in which constructors run 
> without
> LTO depends on the order in which linker extracts the object files from
> libgroff.a static archive when linking. If the dependencies are such that
> symbol.o is consistently pulled in prior to color.o, the constructor for
> default_symbol would always run first.

Oh, sorry, looks like it's worse: you were relying on the fiasco to get
default_color.nm initialized to all-zeroes instead of default_symbol?

Alexander

Reply via email to