[Haskell-cafe] ghci and TH cannot: unknown symbol `stat64`
travitch at cs.wisc.edu
Thu Jul 12 18:07:05 CEST 2012
On Thu, Jul 12, 2012 at 06:29:41PM +0300, Michael Snoyman wrote:
> I've come up with a minimal example that demonstrates this problem. The
> crux of the matter is the following C code:
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <unistd.h>
> #include <stdio.h>
> typedef int stat_func(const char*, struct stat*);
> stat_func *foo = &stat;
> void stat_test(void)
> struct stat buf;
> printf("About to stat-test.c\n");
> foo("stat-test.c", &buf);
> As you can see, all of the include statements are present as necessary. The
> code compiles just fine with -Wall -Werror. And when you compile the
> Haskell code as well, everything works just fine. But if you follow these
> steps, you can reproduce the error I saw:
> * Unpack the attached tarball
> * `cabal install` in that folder
> * `runghc main.hs` from the `exe` folder
> On my system at least, I get:
> unknown symbol `stat'
> main.hs: main.hs: unable to load package `stat-test-0.1.0.0'
> One thing I noticed is that I needed to use a function pointer to trigger
> the bug. When I called `stat` directly the in stat_test function, gcc
> automatically inlined the call, so that the disassessmbled code just showed
> a `moveq` (i.e., it's making the system call directly). But using a
> function pointer, we're avoiding the inlining. I believe this is why this
> issue only came up with the sqlite3 upgrade: previous versions did not use
> a function pointer, but rather hard-coded in how to make a stat call.
> Does this expose any other possibilities?
Are you trying this on a 32 bit system? And when you compiled that C
program, did you try to add
to the compile command? When I define those the resulting object file
from your example correctly references stat64 instead of stat.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Size: 189 bytes
Desc: not available
More information about the Haskell-Cafe