On Fri, 1 Dec 2023, Antonin Décimo wrote:

We can use `#pragma section` and `__declspec(allocate("xxx"))`
instead.

Umm, this doesn't seem to work for me. With your example code below, with
foo_init renamed into main(), I don't get any working TLS callbacks, on
neither x86 nor x64, and linking produces the following warning:

LIBCMT.lib(tlssup.obj) : warning LNK4078: multiple '.CRT' sections found
with different attributes (40400040)
LIBCMT.lib(initializers.obj) : warning LNK4254: section '.CRT' (50000040)
merged into '.rdata' (40000040) with different attributes

My bad, the warning disappears if the "shared" attribute is not used.
If I remove it, all the test cases behave correctly.

It seems that if we use `const_seg`, we don't need the
`__declspec(allocate(".CRT$XLF"))`
expanded by `WINPTHREADS_ATTRIBUTE(WINPTHREADS_SECTION(".CRT$XLF"))`
Should I keep the macros only if __GNUC__ is defined?

To me, using `const_seg` feels a little bit less like magic than using
`section`.

Actually, I feel the other way around. With #pragma section(), we just declare that we might add things to this section somewhere later, and then we add this specific variable to it with __declspec(allocate()) - which maps nicely to WINPTHREADS_ATTRIBUTE(WINPTHREADS_SECTION(...)). This requires fewer ifdefs (only one for #pragma section, which can be merged with the ones for other pragmas for MSVC).

Compared with the existing code, it only requires tweaking the one #pragma section line, right? One might want to remove the #pragma data_seg() as I'm not sure why that's needed at all.

// Martin

_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to