|
Message-ID: <168864586814.64499.13397704850676744237@alexps.local> Date: Thu, 06 Jul 2023 08:17:48 -0400 From: Alex Xu <alex_y_xu@...oo.ca> To: musl@...ts.openwall.com Subject: Re: __MUSL__ macro Quoting Alastair Houghton (2023-07-06 06:48:04) > Hi all, > > Before I start, I’m aware of > > <https://www.openwall.com/lists/musl/2013/03/29/13> > > but I *still* want to add __MUSL__ (see attached patch). > > Let me explain what we’re doing, why we want it and why we think musl *should* have it. We’re trying to add support for musl to Swift <https://swift.org <https://swiftlang.org/>> and its attendant core libraries, and there are a number of things about musl that presently differ from other platforms/C libraries we support. All of these seem to fall at least suspiciously closely to "the usage case was badly wrong"... > Examples include the use of `union`s in `pthread_mutex_t` et al (which means that we can’t write a C++ `constexpr` function that returns one, even if all it does is return `PTHREAD_MUTEX_INITIALIZER`), The issue is that some of the members are volatile, not the union itself. As I understand, though, constexpr is useful to evaluate certain expressions at compile time, such as if (x < 10) or int arr[getlen(x)]. You can't do any arithmetic with pthread_mutex_t, and the only valid value at compile time is PTHREAD_MUTEX_INITIALIZER though, so what is the use case? > the fact that it doesn’t have the `d_namlen` member of `struct dirent` You can use strlen(d->d_name) instead? This seems like exactly the reason why __MUSL__ should absolutely not be added, because it incentivizes individual checks for endless platforms instead of writing portable code. If strlen(d->d_name) is too slow in some context, then an argument should be made to add d_namlen. glibc even already has a macro _DIRENT_HAVE_D_NAMLEN that could be used to signal support for this rather than hardcoding specific musl versions. > or the fact that `dladdr()` is a no-op when statically linked. When statically linked, the dynamic linking interface doesn't work at all though? And furthermore, even if it did, what would it return? If you're (once again) trying to do stack traces manually, try libunwind? > I’m aware that there are other solutions for some of these cases - but for instance the `dladdr()` issue is not something you can test at configuration time when cross-compiling, since there’s no way to know what the result would be without running a program on the target system (which you don’t necessarily have available at configuration time in that case). I don't understand, don't you know at compile time whether you're linking statically or dynamically? > Likewise, configuration time tests are slow and aren’t even a thing in some of the projects we need to add support in, whereas we do generally have the ability to use the preprocessor. Configure-time checks for specific functionality are a standard part of writing portable C code. Preprocessor checks for specific platforms lead to ifdef swamps that are still not portable to any platforms not initially considered. > You might say we should just bite the bullet and add configuration steps to all of the other projects, but that is honestly a non-starter; the owners of those projects are not likely to accept patches to add such a thing, even as a short-term fix, and the patches to do so would be non-trivial in a number of cases also. In the longer term we don’t want higher level projects to need to do this kind of thing and the lower level ones could in many cases do some kind of configuration time testing, but that’s a longer term goal and it doesn’t help us to add musl support in the interim, which we would like to do. > > I’ve attached a proposed patch that adds `__MUSL__` (set to the major version) and `__MUSL_MINOR__` (set to the minor version) as well as `__MUSL_PREREQ()` (which works the same way `__GLIBC_PREREQ()` does). In theory, there could possibly be some reason why __MUSL__ could be useful in some cases. However, your examples appear to be exactly why __MUSL__ should not be added because it leads to bad code. Cheers, Alex.
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.