Mark Mitchell wrote:
> I'm disappointed to hear that MinGW made this change. As a MinGW user,
> I don't want MinGW to interpose anything between me and the MSVCRT
> libraries. I want MinGW to give me headers and import libraries for the
> Microsoft DLLs, with all their warts; nothing more, nothing less.
I may have overstated the nature of the change, as it still requires
#defining a symbol to get a change in behavior:
#ifdef __USE_MINGW_ACCESS
/* Old versions of MSVCRT access() just ignored X_OK, while the version
shipped with Vista, returns an error code. This will restore the
old behaviour */
static inline int __mingw_access (const char* __fname, int __mode)
{ return _access (__fname, __mode & ~X_OK); }
#define access(__f,__m) __mingw_access (__f, __m)
#endif
So the default behavior is still the broken wartyness of X_OK.
> Obviously, I don't have any say or control over MinGW; I'm just
> providing feedback as a long-term MinGW user. When I want a UNIX-like
> environment on Windows, I use Cygwin; when I want an alternative to
> VisualStudio for "native" Windows applications, I use MinGW. I'd prefer
> that code I write with MinGW also work with VisualStudio and vice versa.
There is a long precedent for MinGW implementing/augmenting the MSVCRT
interface in the form of libmingwex for C99 complex math for example.
> In my opinion, this is a GCC bug: there's no such thing as X_OK on
> Windows (it's not in the Microsoft headers, or documented by Microsoft
> as part of the API), and so GCC shouldn't be using it. The Vista
> runtime library chooses to issue an error when you set random bits in
> the mode provided to access, which is its privilege.
>
> There's a simple GCC change to fix this: have libiberty wrap the access
> function and mask out X_OK on non-Cygwin Windows. It's reasonable to
> put this change in libiberty, since it's job is to provide portability
> between systems.
This is also true, so I suppose it's not entirely correct to say that
this is not a gcc issue in the slightest. This above should indeed go
into libiberty as the long term solution. But no change today will
affect the MinGW system compiler (gcc 3.4.5 with a large amount of local
patches) which must be rebuilt one way or another, either by a patched
/mingw/include/io.h or by auditing all the source code and removing
X_OK, and the former is clearly less work than the latter. And the
__USE_MINGW_ACCESS feature can apply to porting other arbitrary packages
to Vista, without any source auditing.
Brian