Message ID | cover.1688134399.git.falcon@tinylab.org |
---|---|
Headers | show |
Series | selftests/nolibc: allow run with minimal kernel config | expand |
_GNU_SOURCE Implies _LARGEFILE64_SOURCE in glibc, but in musl, the default configuration doesn't enable _LARGEFILE64_SOURCE.
On Fri, Jun 30, 2023, at 16:44, Zhangjin Wu wrote: > _GNU_SOURCE Implies _LARGEFILE64_SOURCE in glibc, but in musl, the > default configuration doesn't enable _LARGEFILE64_SOURCE. > > From include/dirent.h of musl, getdents64 is provided as getdents when > _LARGEFILE64_SOURCE is defined. > > #if defined(_LARGEFILE64_SOURCE) > ... > #define getdents64 getdents > #endif > > Let's define _LARGEFILE64_SOURCE to fix up this compile error: I think a better solution would be to use the normal getdents() instead of glibc getdents64(), but then define _FILE_OFFSET_BITS=64 to tell glibc to use the modern version of all filesystem syscalls. Arnd
On Fri, Jun 30, 2023, at 20:01, Zhangjin Wu wrote: > Hi, Arnd > >> On Fri, Jun 30, 2023, at 16:44, Zhangjin Wu wrote: >> > _GNU_SOURCE Implies _LARGEFILE64_SOURCE in glibc, but in musl, the >> > default configuration doesn't enable _LARGEFILE64_SOURCE. >> > >> > From include/dirent.h of musl, getdents64 is provided as getdents when >> > _LARGEFILE64_SOURCE is defined. >> > >> > #if defined(_LARGEFILE64_SOURCE) >> > ... >> > #define getdents64 getdents >> > #endif >> > >> > Let's define _LARGEFILE64_SOURCE to fix up this compile error: >> >> I think a better solution would be to use the normal getdents() instead >> of glibc getdents64(), but then define _FILE_OFFSET_BITS=64 to tell >> glibc to use the modern version of all filesystem syscalls. >> > > Just checked the getdents manpage[1] and the nolibc code, both of glibc and > nolibc don't provide the getdents() library routine but both of them provide > the getdents64(), only musl provide getdents() by default. > > And as the manpage shows, it is not easy to call getdents() with glibc, we > need manually call syscall() and define the 'dirent' struct ourselves: > > glibc does not provide a wrapper for getdents(); call getdents() > using syscall(2). In that case you will need to define the > linux_dirent or linux_dirent64 structure yourself. > > And for nolibc, a getdents64() with linux_dirent64 struct (with int64_t offset) > is provided, there is either no getdents() currently. > > This patch aims to let nolibc-test at least compile for musl and therefore we > can easily check the new tests for musl, glibc and nolibc together. Ok, I see. Your current approach should be fine then. > For the 64bit offset related stuff, we'd better delay it in another patchset > (part of full rv32 support), which will convert the off_t to 64bit by default. Right, makes sense. ARnd