[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