[GHC] #8921: ghc-stage2 fails with ld: fatal: library -lrt: not found on topHandler02(dyn) test
GHC
ghc-devs at haskell.org
Sat Mar 22 20:16:50 UTC 2014
#8921: ghc-stage2 fails with ld: fatal: library -lrt: not found on
topHandler02(dyn) test
-------------------------------------+-------------------------------------
Reporter: AlainODea | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.8.1-rc2
Keywords: | Operating System: Solaris
Architecture: x86_64 (amd64) | Type of failure: Compile-time
Difficulty: Easy (less than 1 | crash
hour) | Test Case:
Blocked By: | Blocking:
Related Tickets: |
-------------------------------------+-------------------------------------
On SmartOS ghc-stage2 crashes with an error when trying to run the
topHandler02(dyn) test:
ld: fatal: library -lrt: not found
Tracing this with the following DTrace script to stop ghc-stage2 at the
point of launching ld:
'''~/exit_on_ld.d''':
{{{
#!/usr/sbin/dtrace -s
#pragma D option destructive
syscall::exec*:entry
/copyinstr(arg0) == "/usr/bin/ld"/
{
trace(pid);
stop();
system("pargs %d", pid);
exit(0);
}
}}}
This let me observe the command-line arguments to ld:
In ssh session A I started DTrace:
{{{
chmod +x ~/exit_on_ld.d
~/exit_on_ld.d
}}}
In a ssh session B I started the topHandler02(dyn) test manually with no
output redirection:
{{{
cd ~/ghc/libraries/base/tests && '/root/ghc/inplace/bin/ghc-stage2'
-fforce-recomp -dcore-lint -dcmm-lint -dno-debug-output -no-user-package-
db -rtsopts -fno-ghci-history -o topHandler02 topHandler02.hs -O -prof
-static -auto-all -threaded
}}}
In ssh session A I observed the ld call (ghc-stage2 is now frozen by
stop):
{{{
CPU ID FUNCTION:NAME
3 5167 exece:entry 9186691866:
/opt/local/gcc47/libexec/gcc/x86_64-sun-solaris2.11/4.7.3/collect2
-R/opt/local
argv[0]: /opt/local/gcc47/libexec/gcc/x86_64-sun-
solaris2.11/4.7.3/collect2
argv[1]: -R/opt/local/lib/
argv[2]: -Y
argv[3]: P,/lib/amd64:/usr/lib/amd64:/opt/local/lib/
argv[4]: -Qy
argv[5]: -o
argv[6]: topHandler02.o
argv[7]: -L/opt/local/gcc47/lib/gcc/x86_64-sun-solaris2.11/4.7.3
argv[8]: -L/opt/local/gcc47/lib/gcc/x86_64-sun-
solaris2.11/4.7.3/../../../../x86_64-sun-solaris2.11/lib/amd64
argv[9]: -L/opt/local/gcc47/lib/gcc/x86_64-sun-
solaris2.11/4.7.3/../../../amd64
argv[10]: -L/lib/amd64
argv[11]: -L/usr/lib/amd64
argv[12]: -L/opt/local/gcc47/lib/gcc/x86_64-sun-
solaris2.11/4.7.3/../../../../x86_64-sun-solaris2.11/lib
argv[13]: -L/opt/local/gcc47/lib/gcc/x86_64-sun-solaris2.11/4.7.3/../../..
argv[14]: -R/opt/local/gcc47/x86_64-sun-solaris2.11/lib/amd64
argv[15]: -R/opt/local/gcc47/lib/amd64
argv[16]: -lrt
argv[17]: -r
argv[18]: /tmp/ghc91814_0/ghc91814_6.o
argv[19]: /tmp/ghc91814_0/ghc91814_5.o
}}}
I was then able to run them in isolation with GHC's temp files present on
disk:
{{{
# /opt/local/gcc47/libexec/gcc/x86_64-sun-solaris2.11/4.7.3/collect2
-R/opt/local/lib/ -Y P,/lib/amd64:/usr/lib/amd64:/opt/local/lib/ -Qy -o
topHandler02.o -L/opt/local/gcc47/lib/gcc/x86_64-sun-solaris2.11/4.7.3
-L/opt/local/gcc47/lib/gcc/x86_64-sun-solaris2.11/4.7.3/../../../../x86_64
-sun-solaris2.11/lib/amd64 -L/opt/local/gcc47/lib/gcc/x86_64-sun-
solaris2.11/4.7.3/../../../amd64 -L/lib/amd64 -L/usr/lib/amd64
-L/opt/local/gcc47/lib/gcc/x86_64-sun-solaris2.11/4.7.3/../../../../x86_64
-sun-solaris2.11/lib -L/opt/local/gcc47/lib/gcc/x86_64-sun-
solaris2.11/4.7.3/../../.. -R/opt/local/gcc47/x86_64-sun-
solaris2.11/lib/amd64 -R/opt/local/gcc47/lib/amd64 -lrt -r
/tmp/ghc91814_0/ghc91814_6.o /tmp/ghc91814_0/ghc91814_5.o
ld: fatal: library -lrt: not found
ld: fatal: file processing errors. No output written to topHandler02.o
collect2: error: ld returned 1 exit status
}}}
If I omit '''-lrt''' from the arguments it succeeds (on Illumos-based
systems, including SmartOS, librt is a passthrough to libc):
{{{
# /opt/local/gcc47/libexec/gcc/x86_64-sun-solaris2.11/4.7.3/collect2
-R/opt/local/lib/ -Y P,/lib/amd64:/usr/lib/amd64:/opt/local/lib/ -Qy -o
topHandler02.o -L/opt/local/gcc47/lib/gcc/x86_64-sun-solaris2.11/4.7.3
-L/opt/local/gcc47/lib/gcc/x86_64-sun-solaris2.11/4.7.3/../../../../x86_64
-sun-solaris2.11/lib/amd64 -L/opt/local/gcc47/lib/gcc/x86_64-sun-
solaris2.11/4.7.3/../../../amd64 -L/lib/amd64 -L/usr/lib/amd64
-L/opt/local/gcc47/lib/gcc/x86_64-sun-solaris2.11/4.7.3/../../../../x86_64
-sun-solaris2.11/lib -L/opt/local/gcc47/lib/gcc/x86_64-sun-
solaris2.11/4.7.3/../../.. -R/opt/local/gcc47/x86_64-sun-
solaris2.11/lib/amd64 -R/opt/local/gcc47/lib/amd64 -r
/tmp/ghc91814_0/ghc91814_6.o /tmp/ghc91814_0/ghc91814_5.o
# echo $?
0
}}}
No errors are emitted and the exit code is 0 (good).
I would like to conditionally omit '''-lrt''' from the ld arguments.
Where do I need to look for where ghc-stage2 populates the arguments to
ld?
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8921>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list