Hello, please let me know which change 06/12 you prefer if my original
one or the alternative one below.
On Saturday 06 December 2025 19:29:05 Pali Rohár wrote:
> An alternative change instead of 06/12 which tries to address
> the ABI issue in dirent.h header file is below.
>
> I verified that this change is correct by _Static_assert code injected
> into mingw-w64-crt build:
> #include <dirent.h>
> #include <tchar.h>
> #ifdef _WIN64
> _Static_assert(__builtin_types_compatible_p(typeof(_tfindfirst),
> typeof(_tfindfirst64i32)), "Functions are compatible");
> #else
> _Static_assert(__builtin_types_compatible_p(typeof(_tfindfirst),
> typeof(_tfindfirst32)), "Functions are compatible");
> #endif
>
>
> crt: dirent: Use fixed size findfirst/findnext symbols
>
> For 64-bit builds *find* is replaced by *find*64i32.
> For 32-bit builds *find* is replaced by *find32.
> This is what are current definitions during the mingw-w64-crt build time.
> So this change does not modify any emitted symbol or strucure usage.
>
> This ensures that ABI of mingw-w64 dirent function would not change.
> Also this ensures that applications including the dirent.h would use
> ABI-same struct DIR as was defined at the mingw-w64 build time.
>
> diff --git a/mingw-w64-crt/misc/dirent.c b/mingw-w64-crt/misc/dirent.c
> index 4897cf492fa1..f65fdea3234b 100644
> --- a/mingw-w64-crt/misc/dirent.c
> +++ b/mingw-w64-crt/misc/dirent.c
> @@ -152,7 +152,13 @@ _treaddir (_TDIR * dirp)
> {
> /* We haven't started the search yet. */
> /* Start the search */
> - dirp->dd_handle = _tfindfirst (dirp->dd_name, &(dirp->dd_dta));
> + dirp->dd_handle =
> +#ifdef _WIN64
> + _tfindfirst64i32
> +#else
> + _tfindfirst32
> +#endif
> + (dirp->dd_name, &(dirp->dd_dta));
>
> if (dirp->dd_handle == -1)
> {
> @@ -168,7 +174,13 @@ _treaddir (_TDIR * dirp)
> else
> {
> /* Get the next search entry. */
> - if (_tfindnext (dirp->dd_handle, &(dirp->dd_dta)))
> + if (
> +#ifdef _WIN64
> + _tfindnext64i32
> +#else
> + _tfindnext32
> +#endif
> + (dirp->dd_handle, &(dirp->dd_dta)))
> {
> /* We are off the end or otherwise error.
> _findnext sets errno to ENOENT if no more file
> diff --git a/mingw-w64-headers/crt/dirent.h b/mingw-w64-headers/crt/dirent.h
> index 2d7a1b73f71e..e9a4d1ba1c27 100644
> --- a/mingw-w64-headers/crt/dirent.h
> +++ b/mingw-w64-headers/crt/dirent.h
> @@ -38,7 +38,11 @@ struct dirent
> typedef struct
> {
> /* disk transfer area for this dir */
> - struct _finddata_t dd_dta;
> +#ifdef _WIN64
> + struct _finddata64i32_t dd_dta;
> +#else
> + struct _finddata32_t dd_dta;
> +#endif
>
> /* dirent struct to return from dir (NOTE: this makes this thread
> * safe as long as only one thread uses a particular DIR struct at
> @@ -85,7 +89,11 @@ struct _wdirent
> typedef struct
> {
> /* disk transfer area for this dir */
> - struct _wfinddata_t dd_dta;
> +#ifdef _WIN64
> + struct _wfinddata64i32_t dd_dta;
> +#else
> + struct _wfinddata32_t dd_dta;
> +#endif
>
> /* dirent struct to return from dir (NOTE: this makes this thread
> * safe as long as only one thread uses a particular DIR struct at
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public