On 2023-08-29 11:26:19+0200, Willy Tarreau wrote:
On Tue, Aug 29, 2023 at 11:14:09AM +0200, Thomas Weißschuh wrote:
Hi Willy!
On 2023-08-29 08:28:27+0200, Willy Tarreau wrote:
On Sun, Aug 27, 2023 at 10:00:15AM +0200, Thomas Weißschuh wrote:
This allows nolic to work with `-nostdinc` avoiding any reliance on system headers.
The implementation has been lifted from musl libc 1.2.4. There is already an implementation of stdarg.h in include/linux/stdarg.h but that is GPL licensed and therefore not suitable for nolibc.
I'm a bit confused because for me, stdarg was normally provided by the compiler, but I could be mistaken. It's just that it reminds me not so old memories. Therefore maybe we just need to include or define "something" to use it.
It is indeed provided by the compiler.
OK. But then, doesn't it mean that if we don't provide our stdarg.h, the compilers' will be used ? I'm asking because we're already using va_list and va_args, for example in vfprintf() in stdio.h, which precisely includes <stdarg.h> so it must indeed come from the compiler.
It will be used *iff* -nostdinc is *not* passed.
I think we need to clarify the definition of the word "provided". For me it means that the compiler ships an implementation of this header file in the compiler-specific include directory.
If -nostdinc is passed this include directory is not actually usable.
If a user wants to avoid the implicit usage of any system-provided headers they need to pass -nostdinc, as far as I know there is no flag to keep only the compiler-specific include directories.
One usecase is in nolibc-test itself, where Zhangjin ran into weird and inconsistent behavior of system includes being pulled in. By using -nostdinc we avoid this.
I can also see this being useful for normal users.
I could not find anybody doing this differently. Using builtins seems to me to be the normal way to expose compiler implementation specifics.
OK but it's already what the compiler does itself in its own stdarg that is provided. That's why I don't understand what specific case we're trying to cover here, I feel like we're providing an alternate stdarg in case the compiler doesn't provide one except that I've not seen a compiler not provide it (even tcc comes with it), it's like stddef.
It's all about supporting -nostdinc.
FYI stdint.h is also provided by nolibc, gcc and glibc.