#2458: GHC MacOS X Leopard build succeeds, but ghci complains about: unknown
symbol `_environ'
--------------------------+-------------------------------------------------
Reporter: IgorBoehm | Owner:
Type: bug | Status: new
Priority: normal | Component: libraries/base
Version: 6.9 | Severity: major
Keywords: environ | Testcase:
Architecture: x86 | Os: MacOS X
--------------------------+-------------------------------------------------
Shared libraries and bundles on MacOS X Leopard don't have direct access
to environ (i.e. extern char **environ), which is only available to the
loader ld when a complete program is being linked. If direct access to
environ is needed, the _NSGetEnviron() routine, defined in <crt_externs.h>
can be used to retrieve the address of environ at runtime
([http://developer.apple.com/documentation/Darwin/Reference/ManPages/man7/environ.7.html
man environ(7)] see last paragraph in section PROGRAMMING).
Two Libraries are affected by this - namely
[http://darcs.haskell.org/packages/base/ base] and
[http://darcs.haskell.org/packages/unix/ unix]. Both of these Libraries
implement (duplicate code) access to environ:
* [http://darcs.haskell.org/packages/base/include/HsBase.h
base/include/HsBase.h]:
{{{
* ToDo: write a feature test that doesn't assume 'environ' to
* be in scope at link-time. */
extern char** environ;
INLINE char **__hscore_environ() { return environ; }
}}}
* [http://darcs.haskell.org/packages/unix/include/HsUnix.h
unix/include/HsUnix.h]
{{{
extern char **environ;
}}}
Unfortunately this does not work on MaxOS X Leopard with XCode 3.0. My
temporary workaround was to comment out the current definition of environ
in the header files and add the following instead:
* Hack for [http://darcs.haskell.org/packages/base/include/HsBase.h
base/include/HsBase.h]:
{{{
/* ToDo: write a feature test that doesn't assume 'environ' to
* be in scope at link-time. */
//extern char **environ;
//INLINE char **__hscore_environ() { return environ; }
#include <crt_externs.h>
INLINE char **__hscore_environ(void) { return (*_NSGetEnviron()); }
}}}
* Hack for [http://darcs.haskell.org/packages/unix/include/HsUnix.h
unix/include/HsUnix.h]:
{{{
//extern char **environ;
#include <crt_externs.h>
INLINE char **__hsunix_environ (void) { return (*_NSGetEnviron()); }
}}}
* Hack for [http://darcs.haskell.org/packages/unix/System/Posix/Env.hsc
unix/System/Posix/Env.hsc]:
{{{
--getEnvironmentPrim :: IO [String]
--getEnvironmentPrim = do
-- c_environ <- peek c_environ_p
-- arr <- peekArray0 nullPtr c_environ
-- mapM peekCString arr
--
--foreign import ccall unsafe "&environ"
-- c_environ_p :: Ptr (Ptr CString)
getEnvironmentPrim :: IO [String]
getEnvironmentPrim = do
c_environ <- c_environ_p
arr <- peekArray0 nullPtr c_environ
mapM peekCString arr
foreign import ccall unsafe "__hsunix_environ"
c_environ_p :: IO (Ptr CString)
}}}
Unfortunately I do not know GHC well enough to propose a clean patch. With
these 'hacks' ghc compiled from source on MacOS X Leopard with XCode 3.0
works well. It would also probably be good to get rid of the code
duplication in the base and unix libraries.
Shall I open another Ticket for libraries/unix?
References:
*
[http://developer.apple.com/documentation/Darwin/Reference/ManPages/man7/environ.7.html
environ man page]
* [http://lists.apple.com/archives/Java-dev/2007/Dec/msg00096.html
response to similar problem on Apple Mailing List]
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/2458>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs