[Haskell-cafe] getSymbolicLinkStatus completely broken on some 6.8.2 systems

Jeremy Shaw jeremy.shaw at linspireinc.com
Wed Feb 13 17:55:50 EST 2008


Hello,

You rule!

Here is where I am at now. It seems that when I build ghc from source,
the top level configure script detects that my system has large file
support, and enables it. As you discovered, this gets dumped into:

/usr/lib/ghc-6.8.2/include/ghcautoconf.h

which gets included when hsc2hs calculates the offsets.

However, it seems that that header file does not get included when the
unix library builds -- so it builds the library with out large file
support.

If I run ltrace on this program:

> import System.Posix.Files
>
> main =
>     do getSymbolicLinkStatus "/etc/passwd" >>= print . fileID
>        getFileStatus "/etc/passwd" >>= print . fileID

I see that __xstat64 is called, but plain old __xlstat is called. As a
fix(??) I added the copied the following from ghc's configure.ac into
unix's configure.ac and ran autoreconf:

dnl ** Enable large file support.  NB. do this before testing the type of
dnl    off_t, because it will affect the result of that test.
AC_SYS_LARGEFILE


This seemed to fix my problem -- ltrace shows that __lxstat64 is
called and the results are normal.

thanks a ton!
j.

At Tue, 12 Feb 2008 23:45:41 -0800,
Adam Langley wrote:
> 
> On Feb 12, 2008 11:04 PM, Adam Langley <agl at imperialviolet.org> wrote:
> > structure filled in. HsUnix.h has a wrapper around lstat for exactly
> > this reason, however ltrace shows it calling the wrong one.
> 
> So (finally!) the real issue:
> 
> hsc2hs has a C preprocessor prelude (utils/hsc2hs/template-hsc.h)
> which includes some GHC header files. As a result, hsc processes files
> in 64-bit mode:
> % cpp -I../../includes -dM template-hsc.h | grep FILE_OFFSET_BITS
> #define _FILE_OFFSET_BITS 64
> 
> However, when building HsUnix.c (or any c file with cabal), the
> environment is different and it's built in 32-bit mode. Thus the lstat
> wrapper called the 32-bit glibc function, but the structure sizes and
> offsets in Files.hs (from Files.hsc) are all for 64-bit mode.
> 
> The fix is not quite obvious. Probably hsc2hs should try harder not to
> change the environment so much. I'm not quite sure why the hsc2hs
> template pulls in the HsFFI header - it doesn't seem to need it.
> 
> Although you can remove the #include and rebuild the unix package, I
> can safely say that you'll be reinstalling ghc if you do. What might
> work is changing hsc2hs and then rebuilding all of GHC. However,
> that's an overnight build so I don't know yet.
> 
> 
> AGL
> 
> -- 
> Adam Langley                                      agl at imperialviolet.org
> http://www.imperialviolet.org                       650-283-9641


More information about the Haskell-Cafe mailing list