[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