On 01/25/13 09:40 PM, Simon Marlow wrote:
On 25/01/13 19:12, Karel Gardas wrote:

Hi Simon,

it's simple, every lib is rpath-ed except the libffi. See:

Then that sounds like a bug, no?

IMHO it's more an expected behavior than a bug, but as Ian implemented it anyway, let's leave him a last word about it.

From my point of view it looks like libffi is provided by any linux distro when you install GHC. (e.g. on ubuntu/debian you install ghc and libffi/libffi-dev is installed too). So this means on linux libffi is in /usr/lib and so available w/o any issue, it means the issue will not hit you on Linux.

The problem I see is on Solaris. There is no system libffi and so ghc brings its own. The decision that libffi is linked only to rts lib seems to be also good as you don't need to decide while linking application if libffi is used or not. Simply link rts and be done with it. Another decision that libffi is linked into rts without rpath is also good IMHO as it allows you to move rts library around -- for example for installation.

So well, that's at least my understanding of this and that's also the reason why I consider this to be more of expected behavior than of a bug...

Anyway, thanks a lot for your very careful eyes following what's going into GHC and what not!

Karel

I'm not up to speed on this rpath
stuff, maybe Ian knows what's going on. I'd rather not hide the bug by
committing a workaround to the testsuite.

Cheers,
Simon




End of readFile001 compilation with -v looks:

*** Linker:
/usr/sfw/bin/gcc -DTABLES_NEXT_TO_CODE -o readFile001 readFile001.o
-L/export/home/karel/vcs/ghc-src/ghc-head/libraries/base/dist-install/build

-Wl,-rpath
-Wl,/export/home/karel/vcs/ghc-src/ghc-head/libraries/base/dist-install/build

-L/export/home/karel/vcs/ghc-src/ghc-head/libraries/integer-gmp/dist-install/build

-Wl,-rpath
-Wl,/export/home/karel/vcs/ghc-src/ghc-head/libraries/integer-gmp/dist-install/build

-L/export/home/karel/vcs/ghc-src/ghc-head/libraries/ghc-prim/dist-install/build

-Wl,-rpath
-Wl,/export/home/karel/vcs/ghc-src/ghc-head/libraries/ghc-prim/dist-install/build

-L/export/home/karel/vcs/ghc-src/ghc-head/rts/dist/build -Wl,-rpath
-Wl,/export/home/karel/vcs/ghc-src/ghc-head/rts/dist/build
/tmp/ghc28147_0/ghc28147_0.o -lHSbase-4.7.0.0-ghc7.7.20130125
-lHSinteger-gmp-0.5.1.0-ghc7.7.20130125 -lgmp
-lHSghc-prim-0.3.1.0-ghc7.7.20130125 -lHSrts-ghc7.7.20130125 -lm -lrt
-ldl -u ghczmprim_GHCziTypes_Izh_static_info -u
ghczmprim_GHCziTypes_Czh_static_info -u
ghczmprim_GHCziTypes_Fzh_static_info -u
ghczmprim_GHCziTypes_Dzh_static_info -u base_GHCziPtr_Ptr_static_info -u
ghczmprim_GHCziTypes_Wzh_static_info -u base_GHCziInt_I8zh_static_info
-u base_GHCziInt_I16zh_static_info -u base_GHCziInt_I32zh_static_info -u
base_GHCziInt_I64zh_static_info -u base_GHCziWord_W8zh_static_info -u
base_GHCziWord_W16zh_static_info -u base_GHCziWord_W32zh_static_info -u
base_GHCziWord_W64zh_static_info -u
base_GHCziStable_StablePtr_static_info -u
ghczmprim_GHCziTypes_Izh_con_info -u ghczmprim_GHCziTypes_Czh_con_info
-u ghczmprim_GHCziTypes_Fzh_con_info -u
ghczmprim_GHCziTypes_Dzh_con_info -u base_GHCziPtr_Ptr_con_info -u
base_GHCziPtr_FunPtr_con_info -u base_GHCziStable_StablePtr_con_info -u
ghczmprim_GHCziTypes_False_closure -u ghczmprim_GHCziTypes_True_closure
-u base_GHCziPack_unpackCString_closure -u
base_GHCziIOziException_stackOverflow_closure -u
base_GHCziIOziException_heapOverflow_closure -u
base_ControlziExceptionziBase_nonTermination_closure -u
base_GHCziIOziException_blockedIndefinitelyOnMVar_closure -u
base_GHCziIOziException_blockedIndefinitelyOnSTM_closure -u
base_ControlziExceptionziBase_nestedAtomically_closure -u
base_GHCziWeak_runFinalizzerBatch_closure -u
base_GHCziTopHandler_flushStdHandles_closure -u
base_GHCziTopHandler_runIO_closure -u
base_GHCziTopHandler_runNonIO_closure -u
base_GHCziConcziIO_ensureIOManagerIsRunning_closure -u
base_GHCziConcziSync_runSparks_closure -u
base_GHCziConcziSignal_runHandlers_closure
link: done
*** Deleting temp files:
Deleting: /tmp/ghc28147_0/ghc28147_0.o /tmp/ghc28147_0/ghc28147_0.c
*** Deleting temp dirs:
Deleting: /tmp/ghc28147_0


there is no libffi linked there as it's linked in RTS lib already. it's
probably not rpath-ed there (for obvious reason) so ldd's output on the
test looks:

$ ldd readFile001
libHSbase-4.7.0.0-ghc7.7.20130125.so =>
/export/home/karel/vcs/ghc-src/ghc-head/libraries/base/dist-install/build/libHSbase-4.7.0.0-ghc7.7.20130125.so


libHSinteger-gmp-0.5.1.0-ghc7.7.20130125.so =>
/export/home/karel/vcs/ghc-src/ghc-head/libraries/integer-gmp/dist-install/build/libHSinteger-gmp-0.5.1.0-ghc7.7.20130125.so


libgmp.so.3 => /usr/lib/libgmp.so.3
libHSghc-prim-0.3.1.0-ghc7.7.20130125.so =>
/export/home/karel/vcs/ghc-src/ghc-head/libraries/ghc-prim/dist-install/build/libHSghc-prim-0.3.1.0-ghc7.7.20130125.so


libHSrts-ghc7.7.20130125.so =>
/export/home/karel/vcs/ghc-src/ghc-head/rts/dist/build/libHSrts-ghc7.7.20130125.so


libm.so.2 => /lib/libm.so.2
librt.so.1 => /lib/librt.so.1
libdl.so.1 => /lib/libdl.so.1
libc.so.1 => /lib/libc.so.1
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1
libffi.so.6 => (file not found)


And of course for the purpose of the test I've unset LD_LIBRARY_PATH
completely:
karel@silence:~/vcs/ghc-src/ghc-head/libraries/base/tests/IO$ echo
$LD_LIBRARY_PATH

karel@silence:~/vcs/ghc-src/ghc-head/libraries/base/tests/IO$


So that's why I've thought my solution of setting LD_LIBRARY_PATH in
runtests is the most easiest one but if you prefer something different
just let me know.

Thanks!
Karel

On 01/25/13 09:02 AM, Simon Marlow wrote:
Hold on a minute. Why do you need to set LD_LIBRARY_PATH? It should be
unnecessary because the binaries are linked with -rpath options so they
can find their libraries.

Cheers,
Simon

On 25/01/13 01:33, David Terei wrote:
Committed. Thanks!

On 24 January 2013 13:28, Karel Gardas <karel.gar...@centrum.cz> wrote:
This patch follows Windows and Darwin way of setting environment
variable
to set the file-system paths to GHC's shared libraries. It does the
same
thing for any other OS, which should be Unix-like OS presumably. This
patch fixes a lot of `dyn' tests failures on Solaris which fail with
following
error message:
Failed to open shared library: ld.so.1: T3807-load: fatal:
libffi.so.6: open failed: No such file or directory
---
driver/runtests.py | 48
++++++++++++++++++++++++++----------------------
1 files changed, 26 insertions(+), 22 deletions(-)

diff --git a/driver/runtests.py b/driver/runtests.py
index 66e3bf4..16deda6 100644
--- a/driver/runtests.py
+++ b/driver/runtests.py
@@ -181,28 +181,32 @@ from testlib import *

# On Windows we need to set $PATH to include the paths to all the DLLs
# in order for the dynamic library tests to work.
-if windows or darwin:
- pkginfo = getStdout([config.ghc_pkg, 'dump'])
- topdir = config.libdir
- for line in pkginfo.split('\n'):
- if line.startswith('library-dirs:'):
- path = line.rstrip()
- path = re.sub('^library-dirs: ', '', path)
- path = re.sub('\\$topdir', topdir, path)
- if path.startswith('"'):
- path = re.sub('^"(.*)"$', '\\1', path)
- path = re.sub('\\\\(.)', '\\1', path)
- if windows:
- if config.cygwin:
- # On cygwin we can't put "c:\foo" in $PATH, as : is a
- # field separator. So convert to /cygdrive/c/foo instead.
- # Other pythons use ; as the separator, so no problem.
- path = re.sub('([a-zA-Z]):', '/cygdrive/\\1', path)
- path = re.sub('\\\\', '/', path)
- os.environ['PATH'] = os.pathsep.join([path, os.environ.get("PATH",
"")])
- else:
- # darwin
- os.environ['DYLD_LIBRARY_PATH'] = os.pathsep.join([path,
os.environ.get("DYLD_LIBRARY_PATH", "")])
+# if windows or darwin:
+pkginfo = getStdout([config.ghc_pkg, 'dump'])
+topdir = config.libdir
+for line in pkginfo.split('\n'):
+ if line.startswith('library-dirs:'):
+ path = line.rstrip()
+ path = re.sub('^library-dirs: ', '', path)
+ path = re.sub('\\$topdir', topdir, path)
+ if path.startswith('"'):
+ path = re.sub('^"(.*)"$', '\\1', path)
+ path = re.sub('\\\\(.)', '\\1', path)
+ if windows:
+ if config.cygwin:
+ # On cygwin we can't put "c:\foo" in $PATH, as : is a
+ # field separator. So convert to /cygdrive/c/foo instead.
+ # Other pythons use ; as the separator, so no problem.
+ path = re.sub('([a-zA-Z]):', '/cygdrive/\\1', path)
+ path = re.sub('\\\\', '/', path)
+ os.environ['PATH'] = os.pathsep.join([path, os.environ.get("PATH",
"")])
+ elif darwin:
+ # darwin
+ os.environ['DYLD_LIBRARY_PATH'] = os.pathsep.join([path,
os.environ.get("DYLD_LIBRARY_PATH", "")])
+ else:
+ # unix
+ os.environ['LD_LIBRARY_PATH'] = os.pathsep.join([path,
os.environ.get("LD_LIBRARY_PATH", "")])
+

global testopts_local
testopts_local.x = TestOptions()
--
1.7.3.2


_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://www.haskell.org/mailman/listinfo/ghc-devs

_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://www.haskell.org/mailman/listinfo/ghc-devs








_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://www.haskell.org/mailman/listinfo/ghc-devs

Reply via email to