[GHC] #7062: Spurious undefined reference to `openpty'

GHC cvs-ghc at haskell.org
Wed Jul 11 13:55:32 CEST 2012


#7062: Spurious undefined reference to `openpty'
---------------------------------+------------------------------------------
    Reporter:  simonmar          |       Owner:                  
        Type:  bug               |      Status:  new             
    Priority:  high              |   Milestone:  7.6.1           
   Component:  Compiler          |     Version:  7.4.2           
    Keywords:                    |          Os:  Unknown/Multiple
Architecture:  Unknown/Multiple  |     Failure:  None/Unknown    
  Difficulty:  Unknown           |    Testcase:                  
   Blockedby:                    |    Blocking:                  
     Related:                    |  
---------------------------------+------------------------------------------

Comment(by nus):

 All right, "It's not a bug, it's a feature".

 The linking command issued by 'inplace/bin/ghc-stage2 -o process001
 process001.hs -dynamic' through gcc (reformatted for clarity):
 {{{
 /usr/lib/gcc/x86_64-linux-gnu/4.6/collect2
 --sysroot=/ --build-id --no-add-needed --as-needed --eh-frame-hdr -m
 elf_x86_64
 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro
 -o process001
 -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
 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o
 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o
 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
 -L/home/user/dev/ghcbld/libraries/process/dist-install/build
 -L/home/user/dev/ghcbld/libraries/directory/dist-install/build
 -L/home/user/dev/ghcbld/libraries/unix/dist-install/build
 -L/home/user/dev/ghcbld/libraries/bytestring/dist-install/build
 -L/home/user/dev/ghcbld/libraries/time/dist-install/build
 -L/home/user/dev/ghcbld/libraries/old-locale/dist-install/build
 -L/home/user/dev/ghcbld/libraries/filepath/dist-install/build
 -L/home/user/dev/ghcbld/libraries/deepseq/dist-install/build
 -L/home/user/dev/ghcbld/libraries/array/dist-install/build
 -L/home/user/dev/ghcbld/libraries/base/dist-install/build
 -L/home/user/dev/ghcbld/libraries/integer-gmp/dist-install/build
 -L/home/user/dev/ghcbld/libraries/ghc-prim/dist-install/build
 -L/home/user/dev/ghcbld/rts/dist/build -L/usr/lib/gcc/x86_64-linux-gnu/4.6
 -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu
 -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib -L/lib/x86_64-linux-
 gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib
 -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../..
 --hash-size=31 --reduce-memory-overheads
 process001.o
 -rpath /home/user/dev/ghcbld/libraries/process/dist-install/build -rpath
 /home/user/dev/ghcbld/libraries/directory/dist-install/build -rpath
 /home/user/dev/ghcbld/libraries/unix/dist-install/build -rpath
 /home/user/dev/ghcbld/libraries/bytestring/dist-install/build -rpath
 /home/user/dev/ghcbld/libraries/time/dist-install/build -rpath
 /home/user/dev/ghcbld/libraries/old-locale/dist-install/build -rpath
 /home/user/dev/ghcbld/libraries/filepath/dist-install/build -rpath
 /home/user/dev/ghcbld/libraries/deepseq/dist-install/build -rpath
 /home/user/dev/ghcbld/libraries/array/dist-install/build -rpath
 /home/user/dev/ghcbld/libraries/base/dist-install/build -rpath
 /home/user/dev/ghcbld/libraries/integer-gmp/dist-install/build -rpath
 /home/user/dev/ghcbld/libraries/ghc-prim/dist-install/build -rpath
 /home/user/dev/ghcbld/rts/dist/build
 /tmp/ghc25888_0/ghc25888_0.o
 /tmp/ghc25888_0/ghc25888_1.o
 -lHSprocess-1.1.0.0-ghc7.5
 -lHSdirectory-1.1.0.1-ghc7.5
 -lHSunix-2.5.1.0-ghc7.5
 -lrt
 -lutil
 -ldl
 -lpthread
 -lHSbytestring-0.10.0.0-ghc7.5
 -lHStime-1.4-ghc7.5
 -lHSold-locale-1.0.0.4-ghc7.5
 -lHSfilepath-1.2.0.1-ghc7.5
 -lHSdeepseq-1.2.0.1-ghc7.5
 -lHSarray-0.3.0.3-ghc7.5
 -lHSbase-4.6.0.0-ghc7.5
 -lHSinteger-gmp-0.3.0.0-ghc7.5
 -lgmp
 -lHSghc-prim-0.2.0.0-ghc7.5
 -lHSrts-ghc7.5
 -lm
 -lrt
 -ldl
 -lgcc
 --as-needed -lgcc_s --no-as-needed
 -lc
 -lgcc
 --as-needed -lgcc_s --no-as-needed
 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
 }}}
 From the libraries involved in the linkage only 'HSunix-2.5.1.0-ghc7.5'
 has references to 'openpty':
 {{{
 $ readelf -a libraries/unix/dist-install/build/libHSunix-2.5.1.0-ghc7.5.so
 [...snip...]
 Relocation section '.rela.plt' at offset 0x592e8 contains 159 entries:
 [...snip...]
 0000002b2090  003300000007 R_X86_64_JUMP_SLO 0000000000000000 openpty + 0
 [...snip...]
 Symbol table '.dynsym' contains 3142 entries:
 [...snip...]
     51: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND openpty
 [...snip...]
 Symbol table '.symtab' contains 6624 entries:
 [...snip...]
   3832: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND openpty
 [...snip...]
 }}}
 {{{
 $ readelf -d libraries/process/dist-
 install/build/libHSprocess-1.1.0.0-ghc7.5.so
 Dynamic section at offset 0x16a50 contains 27 entries:
   Tag        Type                         Name/Value
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSunix-2.5.1.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSdeepseq-1.2.0.1-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSbase-4.6.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libHSghc-
 prim-0.2.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
  0x000000000000000e (SONAME)             Library soname:
 [libHSprocess-1.1.0.0-ghc7.5.so]
 [...snip...]
 }}}
 {{{
 $ readelf -d libraries/directory/dist-
 install/build/libHSdirectory-1.1.0.1-ghc7.5.so
 Dynamic section at offset 0x1aa18 contains 30 entries:
   Tag        Type                         Name/Value
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSunix-2.5.1.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libutil.so.1]
  0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
  0x0000000000000001 (NEEDED)             Shared library:
 [libHStime-1.4-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSfilepath-1.2.0.1-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSbase-4.6.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libHSinteger-
 gmp-0.3.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libHSghc-
 prim-0.2.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
  0x000000000000000e (SONAME)             Library soname:
 [libHSdirectory-1.1.0.1-ghc7.5.so]
 [...snip...]
 }}}
 {{{
 $ readelf -d libraries/unix/dist-install/build/libHSunix-2.5.1.0-ghc7.5.so
 Dynamic section at offset 0xb1778 contains 26 entries:
   Tag        Type                         Name/Value
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSbytestring-0.10.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSbase-4.6.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libHSinteger-
 gmp-0.3.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libHSghc-
 prim-0.2.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
  0x000000000000000e (SONAME)             Library soname:
 [libHSunix-2.5.1.0-ghc7.5.so]
 [...snip...]
 }}}

 {{{
  --as-needed
  --no-as-needed
 This option affects ELF DT_NEEDED tags for dynamic libraries mentioned on
 the command line after the --as-needed option.  Normally the linker will
 add a DT_NEEDED tag for each dynamic library mentioned on the command
 line, regardless of whether the library is actually needed or not.  --as-
 needed causes a DT_NEEDED tag to only be emitted for a
 library that satisfies an undefined symbol reference from a regular object
 file or, if the library is not found in the DT_NEEDED lists of other
 libraries linked up to that
 point, an undefined symbol reference from another dynamic library.  --no-
 as-needed restores the default behaviour.
 }}}
 The 'process001' link failure is a consequence of Ubuntu introducing
 '--as-needed' into the builtin gcc specs:
 {{{
 $ gcc -v
 Using built-in specs.
 COLLECT_GCC=gcc
 COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
 Target: x86_64-linux-gnu
 Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro
 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs
 --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-
 suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib
 --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
 --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls
 --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-
 libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-
 objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-
 checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu
 --target=x86_64-linux-gnu
 Thread model: posix
 gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
 }}}
 {{{
 $ gcc -dumpspecs
 [...snip...]
 *link:
 %{!r:--build-id} --no-add-needed --as-needed %{!static:--eh-frame-hdr}
 %{!m32:-m elf_x86_64} %{m32:-m elf_i386} --hash-style=gnu
 %{shared:-shared}   %{!shared:     %{!static:       %{rdynamic:-export-
 dynamic}       %{m32:-dynamic-linker %{muclibc:/lib/ld-
 uClibc.so.0;:%{mbionic:/system/bin/linker;:/lib/ld-linux.so.2}}}
 %{!m32:-dynamic-linker
 %{muclibc:/lib/ld64-uClibc.so.0;:%{mbionic:/system/bin/linker64;:/lib64
 /ld-linux-x86-64.so.2}}}}     %{static:-static}}
 [...snip...]
 }}}

 '''1)''' If the first '--as-needed' is removed from the above 'collect2'
 command, the linkage finishes OK:
 {{{
 $ readelf -d process001
 Dynamic section at offset 0x2c58 contains 40 entries:
   Tag        Type                         Name/Value
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSprocess-1.1.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSdirectory-1.1.0.1-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSunix-2.5.1.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
  0x0000000000000001 (NEEDED)             Shared library: [libutil.so.1]
  0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
  0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSbytestring-0.10.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library:
 [libHStime-1.4-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libHSold-
 locale-1.0.0.4-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSfilepath-1.2.0.1-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSdeepseq-1.2.0.1-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSarray-0.3.0.3-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSbase-4.6.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libHSinteger-
 gmp-0.3.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libgmp.so.10]
  0x0000000000000001 (NEEDED)             Shared library: [libHSghc-
 prim-0.2.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libHSrts-
 ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
  0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
  0x000000000000000f (RPATH)              Library rpath:
 [/home/user/dev/ghcbld/libraries/process/dist-
 install/build:/home/user/dev/ghcbld/libraries/directory/dist-
 install/build:/home/user/dev/ghcbld/libraries/unix/dist-
 install/build:/home/user/dev/ghcbld/libraries/bytestring/dist-
 install/build:/home/user/dev/ghcbld/libraries/time/dist-
 install/build:/home/user/dev/ghcbld/libraries/old-locale/dist-
 install/build:/home/user/dev/ghcbld/libraries/filepath/dist-
 install/build:/home/user/dev/ghcbld/libraries/deepseq/dist-
 install/build:/home/user/dev/ghcbld/libraries/array/dist-
 install/build:/home/user/dev/ghcbld/libraries/base/dist-
 install/build:/home/user/dev/ghcbld/libraries/integer-gmp/dist-
 install/build:/home/user/dev/ghcbld/libraries/ghc-prim/dist-
 install/build:/home/user/dev/ghcbld/rts/dist/build]
 [...snip...]
 }}}

 '''2)''' If in the above 'collect2' command '--no-as-needed'/"--as-needed"
 put around '-lHSdirectory-1.1.0.1-ghc7.5', the linkage finishes OK:
 {{{
 $ readelf -d process001
 Dynamic section at offset 0x2d38 contains 26 entries:
   Tag        Type                         Name/Value
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSprocess-1.1.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSdirectory-1.1.0.1-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSbase-4.6.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libHSghc-
 prim-0.2.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libHSrts-
 ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
  0x000000000000000f (RPATH)              Library rpath:
 [/home/user/dev/ghcbld/libraries/process/dist-
 install/build:/home/user/dev/ghcbld/libraries/directory/dist-
 install/build:/home/user/dev/ghcbld/libraries/unix/dist-
 install/build:/home/user/dev/ghcbld/libraries/bytestring/dist-
 install/build:/home/user/dev/ghcbld/libraries/time/dist-
 install/build:/home/user/dev/ghcbld/libraries/old-locale/dist-
 install/build:/home/user/dev/ghcbld/libraries/filepath/dist-
 install/build:/home/user/dev/ghcbld/libraries/deepseq/dist-
 install/build:/home/user/dev/ghcbld/libraries/array/dist-
 install/build:/home/user/dev/ghcbld/libraries/base/dist-
 install/build:/home/user/dev/ghcbld/libraries/integer-gmp/dist-
 install/build:/home/user/dev/ghcbld/libraries/ghc-prim/dist-
 install/build:/home/user/dev/ghcbld/rts/dist/build]
 [...snip...]
 }}}

 '''3)''' If '-u openpty' is appended to the above 'collect2' command, the
 linkage finishes OK:
 {{{
 $ readelf -d process001
 Dynamic section at offset 0x2d48 contains 25 entries:
   Tag        Type                         Name/Value
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSprocess-1.1.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library:
 [libHSbase-4.6.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libHSghc-
 prim-0.2.0.0-ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libHSrts-
 ghc7.5.so]
  0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
  0x000000000000000f (RPATH)              Library rpath:
 [/home/user/dev/ghcbld/libraries/process/dist-
 install/build:/home/user/dev/ghcbld/libraries/directory/dist-
 install/build:/home/user/dev/ghcbld/libraries/unix/dist-
 install/build:/home/user/dev/ghcbld/libraries/bytestring/dist-
 install/build:/home/user/dev/ghcbld/libraries/time/dist-
 install/build:/home/user/dev/ghcbld/libraries/old-locale/dist-
 install/build:/home/user/dev/ghcbld/libraries/filepath/dist-
 install/build:/home/user/dev/ghcbld/libraries/deepseq/dist-
 install/build:/home/user/dev/ghcbld/libraries/array/dist-
 install/build:/home/user/dev/ghcbld/libraries/base/dist-
 install/build:/home/user/dev/ghcbld/libraries/integer-gmp/dist-
 install/build:/home/user/dev/ghcbld/libraries/ghc-prim/dist-
 install/build:/home/user/dev/ghcbld/rts/dist/build]
 [...snip...]
 }}}
 {{{
 $ readelf -a process001
 [...snip...]
 Symbol table '.dynsym' contains 74 entries:
 [...snip...]
     10: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND openpty
 [...snip...]
 Symbol table '.symtab' contains 161 entries:
 [...snip...]
     84: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND openpty
 [...snip...]
 }}}

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/7062#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler



More information about the Glasgow-haskell-bugs mailing list