FILE struct size mismatch
Paul Cercueil <[email protected]> Sat, 04 Apr 2026 17:20:54 +0200
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <[email protected]> |
Hi,
I am in the process of porting the KallistiOS kernel
(github.com/KallistiOS/KallistiOS) to the Dreamcast's sound CPU, which
is an ARM7DI (ARMv3).
Given that this is older than what's supported by Newlib I have to
patch it like that:
diff --color -ruN newlib-4.6.0.20260123/newlib/configure.host newlib-
4.6.0.20260123-kos/newlib/configure.host
--- newlib-4.6.0.20260123/newlib/configure.host 2024-02-10
09:30:58.772247624 -0600
+++ newlib-4.6.0.20260123-kos/newlib/configure.host 2024-02-10
09:31:16.329331366 -0600
@@ -130,6 +130,5 @@
machine_dir=arc64
;;
arm*)
- machine_dir=arm
- libm_machine_dir=arm
+ newlib_cflags="${newlib_cflags} -mcpu=arm7di -
DREENTRANT_SYSCALLS_PROVIDED -DMALLOC_PROVIDED -DABORT_PROVIDED -
DHAVE_FCNTL -ffunction-sections -fdata-sections"
;;
Note that the "newlib_cflags" are the same as for our SH4 build apart
from the "-mcpu=arm7di" so you can ignore these. The thing I wanted to
point out here is that I unset the "machine_dir" and "libm_machine_dir"
variables so that no ASM is compiled (as these require ARMv4 minimum).
Newlib is configured like this:
./configure \
--disable-newlib-supplied-syscalls \
--target=arm-eabi \
--prefix=/home/paul/dev/toolchains/arm-eabi-8.5.0 \
--with-arch=armv4 --with-mode=arm --disable-multilib \
--enable-newlib-io-c99-formats \
CC_FOR_TARGET="arm-eabi-gcc"
This builds fine, and most of the libc functions (memcpy etc) seem to
work fine.
However I don't have stdio working.
This works (prints to my debug output):
write(STDOUT_FILENO, "Hello\n", 6);
This does not work:
printf("Hello\n")
Disabling buffering on stdout does not fix the problem.
When debugging this, I noticed that the "__sf" array (which contain the
stdin/stdout/stderr FILE objects) is 312 bytes, so 104 bytes per FILE
(which matches what I computed by hand). However, if I create a small
program that just includes <stdio.h>, then sizeof(FILE) is 112 bytes
for some reason.
Consequently, if I print ((uintptr_t)stdout->_write) in my small
program, to get the address of the function that's set there, I see
that it points to __sclose()... (Which is probably just because the
FILE struct is defined differently).
I can't help but think that this FILE struct size mismatch is related
to my stdio not working (e.g. if a part of Newlib uses the 104-byte
sized struct while other parts use the 112-byte sized struct).
Thoughts very much appreciated!
Cheers,
-Paul