Hi Willy, On 2025-02-22 10:38:51+0100, Willy Tarreau wrote: > On Mon, Feb 17, 2025 at 10:24:11PM +0100, Thomas Weißschuh wrote: > > On 2025-02-16 10:39:40+0100, Willy Tarreau wrote: > > > On Wed, Feb 12, 2025 at 07:01:01PM +0100, Thomas Weißschuh wrote: > > > > The nolibc testsuite can be run against other libcs to test for > > > > interoperability. Some aspects of the constructor execution are not > > > > standardized and musl does not provide all tested feature, for one it > > > > does not provide arguments to the constructors, anymore? > > > > > > > > Skip the constructor tests on non-nolibc configurations. > > > > > > I'm not much surprised, I've always avoided arguments in my use of > > > constructors due to a lack of portability. However the patch disables > > > all constructors tests, while I'm seeing that the linkage_test version > > > does not make use of arguments, though there is an implied expectation > > > that they're executed in declaration order, which is not granted. > > > > The tests are written specifically to test for execution order. > > While we can not rely on the order for other libcs, the idea was to > > expect a given order for the nolibc implementation. > > OK. > > > > I'm wondering if we shouldn't make the tests more robust: > > > 1) explicitly set linkage_test_constructor_test_value to zero in the > > > declaration, because here it's not set so we have no guarantee > > > (we're not in the kernel) > > > > Ack. > > > > > 2) only add values to check for cumulated values (e.g. |1 in const1, > > > |2 in const2) and verify that the result is properly 3 > > > > This would stop validating the order. > > That was my purpose but OK I got it. Then there's another option which > preserves the order and even gives history: > > __attribute__((constructor)) > static void constructor1(void) > { > constructor_test_value = constructor_test_value * 0x10 + 1; > } > > __attribute__((constructor)) > static void constructor2(void) > { > constructor_test_value = constructor_test_value * 0x10 + 2; > } > > Then if executed in the right order, you'll find 0x12. If both > are executed in any order, it will always be >= 0x10. If only one > is executed, it will be < 0x10, and if none is executed, it's 0. Sounds good! Do you want to write a patch? It should also add the missing zero-initializion of constructor_test_value. Thomas