PING. Summary: gcc-go currently assumes that both loff_t and off64_t are defined as a typedef. However, musl defines them as a CPP macro causing gccgo to not compile with musl libc.
See: https://gcc.gnu.org/pipermail/gcc-patches/2022-April/593527.html If an alternative solution to the problem is preferred, please let me know. Sören Tempel <soe...@soeren-tempel.net> wrote: > The libgo code assumes both off64_t and loff_t to be present. For > example, for the splice(2) function prototype. Similar to glibc, > musl libc supports these types but defines them as macros, not as > typedefs. Unfortunately, -fdump-go-spec only recognizes types defined > using typedef. To workaround that, this commit adds explicit typedefs > for these types if off64_t or loff_t are defined as macros. > > Furthermore, loff_t is only defined on musl with -D_GNU_SOURCE and > requires an include of fcntl.h (this is in accordance with the splice(2) > man page). Therefore, the configure script has also been adjusted > accordingly. > --- > libgo/configure | 6 +++++- > libgo/configure.ac | 6 +++++- > libgo/sysinfo.c | 14 ++++++++++++++ > 3 files changed, 24 insertions(+), 2 deletions(-) > > diff --git a/libgo/configure b/libgo/configure > index ffe17c9b..b83ddfb3 100755 > --- a/libgo/configure > +++ b/libgo/configure > @@ -15546,7 +15546,10 @@ _ACEOF > > fi > > -ac_fn_c_check_type "$LINENO" "loff_t" "ac_cv_type_loff_t" > "$ac_includes_default" > +CFLAGS_hold=$CFLAGS > +CFLAGS="$CFLAGS -D_GNU_SOURCE" > +ac_fn_c_check_type "$LINENO" "loff_t" "ac_cv_type_loff_t" "#include <fcntl.h> > +" > if test "x$ac_cv_type_loff_t" = xyes; then : > > cat >>confdefs.h <<_ACEOF > @@ -15556,6 +15559,7 @@ _ACEOF > > fi > > +CFLAGS=$CFLAGS_hold > > LIBS_hold="$LIBS" > LIBS="$LIBS -lm" > diff --git a/libgo/configure.ac b/libgo/configure.ac > index 7e2b98ba..b8f7d1a0 100644 > --- a/libgo/configure.ac > +++ b/libgo/configure.ac > @@ -601,7 +601,11 @@ AC_STRUCT_DIRENT_D_TYPE > > AC_CHECK_FUNCS(accept4 dup3 epoll_create1 faccessat fallocate fchmodat > fchownat futimesat getxattr inotify_add_watch inotify_init inotify_init1 > inotify_rm_watch listxattr mkdirat mknodat open64 openat pipe2 removexattr > renameat setxattr sync_file_range splice syscall tee unlinkat unshare > utimensat) > AC_TYPE_OFF_T > -AC_CHECK_TYPES([loff_t]) > + > +CFLAGS_hold=$CFLAGS > +CFLAGS="$CFLAGS -D_GNU_SOURCE" > +AC_CHECK_TYPES([loff_t], [], [], [[#include <fcntl.h>]]) > +CFLAGS=$CFLAGS_hold > > LIBS_hold="$LIBS" > LIBS="$LIBS -lm" > diff --git a/libgo/sysinfo.c b/libgo/sysinfo.c > index 8ce061e2..22f52e5b 100644 > --- a/libgo/sysinfo.c > +++ b/libgo/sysinfo.c > @@ -343,6 +343,20 @@ enum { > #endif > }; > > +// musl libc has both off64_t and loff_t. However, both of these types > +// are defined as CPP macros, not as C typedefs. Unfortunately, the GCC > +// option -fdump-go-spec only recognizes types defined using typedefs. > +#if defined(HAVE_OFF64_T) && defined(off64_t) > +typedef off64_t __musl_off64_t; > +#undef off64_t > +typedef __musl_off64_t off64_t; > +#endif > +#if defined(HAVE_LOFF_T) && defined(loff_t) > +typedef loff_t __musl_loff_t; > +#undef loff_t > +typedef __musl_loff_t loff_t; > +#endif > + > // SIOCGIFMTU can't be added in the above enum as it might > // be signed in some OSes.