We seem to have an issue on linux with both the CMakefiles from pathscale (lightly modified) and my recreation of the same approach in cmake. On darwin, my attached CMakelist.txt, when placed in openmp/runtime/src, has no problems compiling and linking libiomp5.dylib…
% cd openmp/runtime/src
% mkdir build
% cd build
% cmake …
% make VERBOSE=1
However on x86_64, Fedora 15, with the clang set to use clang-omp (currently based on 3.4), I find the final linkage fails with…
Linking CXX shared library libiomp5.so
/usr/bin/cmake -E cmake_link_script CMakeFiles/iomp5.dir/link.txt --verbose=1
clang++ -fPIC -D USE_ITT_BUILD -D NDEBUG -D KMP_ARCH_STR=“"Intel(R) 64"” -D _GNU_SOURCE -D _REENTRANT -D KMP_USE_ASSERT -D BUILD_I8 -D BUILD_TV -D KMP_LIBRARY_FILE="libiomp5.so" -D KMP_VERSION_MAJOR=5 -D CACHE_LINE=64 -D KMP_ADJUST_BLOCKTIME=1 -D BUILD_PARALLEL_ORDERED -D KMP_ASM_INTRINS -D USE_LOAD_BALANCE -D USE_CBLKDATA -D GUIDEDLL_EXPORTS -D KMP_GOMP_COMPAT -D KMP_USE_ADAPTIVE_LOCKS=1 -D KMP_DEBUG_ADAPTIVE_LOCKS=0 -D OMP_50_ENABLED=0 -D OMP_41_ENABLED=0 -D OMP_40_ENABLED=1 -D OMP_30_ENABLED=1 -D USE_ITT_NOTIFY=1 -D INTEL_ITTNOTIFY_PREFIX=_kmp_itt -D KMP_TDATA_GTID -D KMP_BUILD_TIME=“"2014-05-31 14:03:22 UTC"” -fPIC -Wno-unused-value -Wno-switch -Wno-deprecated-register -fno-exceptions -shared -Wl,-soname,libiomp5.so -o libiomp5.so CMakeFiles/iomp5.dir/thirdparty/ittnotify/ittnotify_static.c.o CMakeFiles/iomp5.dir/kmp_affinity.cpp.o CMakeFiles/iomp5.dir/kmp_alloc.c.o CMakeFiles/iomp5.dir/kmp_atomic.c.o CMakeFiles/iomp5.dir/kmp_cancel.cpp.o CMakeFiles/iomp5.dir/kmp_csupport.c.o CMakeFiles/iomp5.dir/kmp_debug.c.o CMakeFiles/iomp5.dir/kmp_dispatch.cpp.o CMakeFiles/iomp5.dir/kmp_environment.c.o CMakeFiles/iomp5.dir/kmp_error.c.o CMakeFiles/iomp5.dir/kmp_ftn_cdecl.c.o CMakeFiles/iomp5.dir/kmp_ftn_extra.c.o CMakeFiles/iomp5.dir/kmp_global.c.o CMakeFiles/iomp5.dir/kmp_gsupport.c.o CMakeFiles/iomp5.dir/kmp_i18n.c.o CMakeFiles/iomp5.dir/kmp_io.c.o CMakeFiles/iomp5.dir/kmp_itt.c.o CMakeFiles/iomp5.dir/kmp_lock.cpp.o CMakeFiles/iomp5.dir/kmp_runtime.c.o CMakeFiles/iomp5.dir/kmp_sched.cpp.o CMakeFiles/iomp5.dir/kmp_settings.c.o CMakeFiles/iomp5.dir/kmp_str.c.o CMakeFiles/iomp5.dir/kmp_taskdeps.cpp.o CMakeFiles/iomp5.dir/kmp_tasking.c.o CMakeFiles/iomp5.dir/kmp_taskq.c.o CMakeFiles/iomp5.dir/kmp_threadprivate.c.o CMakeFiles/iomp5.dir/kmp_utility.c.o CMakeFiles/iomp5.dir/kmp_version.c.o CMakeFiles/iomp5.dir/z_Linux_util.c.o z_Linux_asm.o
/usr/bin/ld: libiomp5.so: version node not found for symbol omp_test_lock@@VERSION
/usr/bin/ld: failed to set dynamic section sizes: Bad value
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [libiomp5.so] Error 1
make[2]: Leaving directory /home/howarth/llvm-clang-omp/openmp/runtime/src/build' make[1]: *** [CMakeFiles/iomp5.dir/all] Error 2 make[1]: Leaving directory
/home/howarth/llvm-clang-omp/openmp/runtime/src/build’
make: *** [all] Error 2
A careful comparison with the log from ‘make compiler=clang’ on x86_64 Fedora 15 reveals no substantial differences to the cmake build other than the details of how clang is invoked to do the linkage…
----- 1/1 — unstripped/.dir -----
mkdir -p unstripped/
touch unstripped/.dir
----- 1/1 — unstripped/libiomp5.so.lst -----
echo ittnotify_static.o kmp_affinity.o kmp_alloc.o kmp_atomic.o kmp_cancel.o kmp_csupport.o kmp_debug.o kmp_dispatch.o kmp_environment.o kmp_error.o kmp_ftn_cdecl.o kmp_ftn_extra.o kmp_global.o kmp_gsupport.o kmp_i18n.o kmp_io.o kmp_itt.o kmp_lock.o kmp_runtime.o kmp_sched.o kmp_settings.o kmp_str.o kmp_taskdeps.o kmp_tasking.o kmp_taskq.o kmp_threadprivate.o kmp_utility.o kmp_version.o z_Linux_asm.o z_Linux_util.o > unstripped/libiomp5.so.lst
----- 1/1 — unstripped/libiomp5.so -----
clang -shared -Wl,-soname=libiomp5.so -Wl,–as-needed -Wl,-z,noexecstack -g -Wsign-compare -Wl,–warn-shared-textrel -Wl,-fini=__kmp_internal_end_fini -pthread -fPIC -Wl,–version-script=…/…/src/exports_so.txt -o unstripped/libiomp5.so $(cat unstripped/libiomp5.so.lst) -Wl,-ldl
----- 1/1 — unstripped/libiomp5.dbg -----
objcopy --only-keep-debug unstripped/libiomp5.so unstripped/libiomp5.dbg
----- 1/1 — libiomp5.dbg -----
cp -f unstripped/libiomp5.dbg libiomp5.dbg
----- 1/1 — stripped/.dir -----
mkdir -p stripped/
touch stripped/.dir
----- 1/1 — stripped/libiomp5.so -----
objcopy --strip-debug unstripped/libiomp5.so stripped/libiomp5.so.tmp
objcopy --add-gnu-debuglink=libiomp5.dbg stripped/libiomp5.so.tmp stripped/libiomp5.so
----- 1/1 — libiomp5.so -----
cp -f stripped/libiomp5.so libiomp5.so
----- 1/1 — test-touch-rt/.dir -----
mkdir -p test-touch-rt/
touch test-touch-rt/.dir
----- 1/1 — test-touch-rt/.test -----
rm -f test-touch-rt/*
cc -pthread -o test-touch-rt/test-touch -m64 …/…/src/test-touch.c libiomp5.so
rm -f test-touch-rt/test-touch
cc -pthread -o test-touch-rt/test-touch -m64 …/…/src/test-touch.c libiomp5.so -Wl,–verbose > test-touch-rt/build.log 2>&1
LD_LIBRARY_PATH=“.:/usr/lib64/alliance/lib:/usr/local/share/man:/usr/share/man:/usr/lib64/alliance/man” KMP_VERSION=1 test-touch-rt/test-touch
One difference between the cmake build and the ‘make compiler=clang’ build, is that CMakelist.txt doesn’t pass all of the COMMON_FLAGS when assembling z_Linux_asm.s due to the compiler being invoked via perl which chokes on the quotes…
----- 1/1 — z_Linux_asm.o -----
clang -I ./ -I …/…/src/ -I …/…/src/i18n/ -I …/…/src/include/40/ -I …/…/src/thirdparty/ittnotify/ -D USE_ITT_BUILD -D NDEBUG -D KMP_ARCH_STR=“"Intel(R) 64"” -D _GNU_SOURCE -D _REENTRANT -D KMP_USE_ASSERT -D BUILD_I8 -D BUILD_TV -D KMP_LIBRARY_FILE="libiomp5.so" -D KMP_VERSION_MAJOR=5 -D CACHE_LINE=64 -D KMP_ADJUST_BLOCKTIME=1 -D BUILD_PARALLEL_ORDERED -D KMP_ASM_INTRINS -D USE_LOAD_BALANCE -D USE_CBLKDATA -D GUIDEDLL_EXPORTS -D KMP_GOMP_COMPAT -D KMP_USE_ADAPTIVE_LOCKS=1 -D KMP_DEBUG_ADAPTIVE_LOCKS=0 -D OMP_50_ENABLED=0 -D OMP_41_ENABLED=0 -D OMP_40_ENABLED=1 -D OMP_30_ENABLED=1 -D USE_ITT_NOTIFY=1 -D INTEL_ITTNOTIFY_PREFIX=_kmp_itt -D KMP_TDATA_GTID -D _KMP_BUILD_TIME=“"2014-05-31 18:05:28 UTC"” -D KMP_ARCH_X86_64 -c -x assembler-with-cpp -o z_Linux_asm.o …/…/src/z_Linux_asm.s
in the build.pl based build vs the following for the cmake build…
[ 0%] Generating z_Linux_asm.o
clang++ -c -o z_Linux_asm.o -D KMP_ASM_INTRINS -D KMP_GOMP_COMPAT -D KMP_ARCH_X86_64 -x assembler-with-cpp /home/howarth/llvm-clang-omp/openmp/runtime/src/z_Linux_asm.s
A Google search suggests that folks running into this "version node not found for symbol " error normally solve it with --disable-symver in configure but it is unclear if a similar option exists in cmake or if it would even have the expected impact here.
Jack
ps The attached CMakefile.txt has the same behavior as the Pathscale ones (in emulating the build.pl build of openmp) with a couple corrections for openmp svn. On linux, -D KMP_TDATA_GTID is passed like in the ‘make compiler=clang’ build. When z_Linux_asm.s is compiled, the missing -D KMP_ASM_INTRINS was added into the command line to match the ‘make compiler=clang’ build on both Apple and Linux.
pps The actual failing linkage line (as emitted from clang++ with -v) is…
“/usr/bin/ld” --hash-style=gnu --no-add-needed --build-id --eh-frame-hdr -m elf_x86_64 -shared -o libiomp5.so /usr/lib/gcc/x86_64-redhat-linux/4.6.3/…/…/…/…/lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.6.3/crtbeginS.o -L/usr/lib/gcc/x86_64-redhat-linux/4.6.3 -L/usr/lib/gcc/x86_64-redhat-linux/4.6.3/…/…/…/…/lib64 -L/lib/…/lib64 -L/usr/lib/…/lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.6.3/…/…/… -L/lib -L/usr/lib -soname libiomp5.so CMakeFiles/iomp5.dir/thirdparty/ittnotify/ittnotify_static.c.o CMakeFiles/iomp5.dir/kmp_affinity.cpp.o CMakeFiles/iomp5.dir/kmp_alloc.c.o CMakeFiles/iomp5.dir/kmp_atomic.c.o CMakeFiles/iomp5.dir/kmp_cancel.cpp.o CMakeFiles/iomp5.dir/kmp_csupport.c.o CMakeFiles/iomp5.dir/kmp_debug.c.o CMakeFiles/iomp5.dir/kmp_dispatch.cpp.o CMakeFiles/iomp5.dir/kmp_environment.c.o CMakeFiles/iomp5.dir/kmp_error.c.o CMakeFiles/iomp5.dir/kmp_ftn_cdecl.c.o CMakeFiles/iomp5.dir/kmp_ftn_extra.c.o CMakeFiles/iomp5.dir/kmp_global.c.o CMakeFiles/iomp5.dir/kmp_gsupport.c.o CMakeFiles/iomp5.dir/kmp_i18n.c.o CMakeFiles/iomp5.dir/kmp_io.c.o CMakeFiles/iomp5.dir/kmp_itt.c.o CMakeFiles/iomp5.dir/kmp_lock.cpp.o CMakeFiles/iomp5.dir/kmp_runtime.c.o CMakeFiles/iomp5.dir/kmp_sched.cpp.o CMakeFiles/iomp5.dir/kmp_settings.c.o CMakeFiles/iomp5.dir/kmp_str.c.o CMakeFiles/iomp5.dir/kmp_taskdeps.cpp.o CMakeFiles/iomp5.dir/kmp_tasking.c.o CMakeFiles/iomp5.dir/kmp_taskq.c.o CMakeFiles/iomp5.dir/kmp_threadprivate.c.o CMakeFiles/iomp5.dir/kmp_utility.c.o CMakeFiles/iomp5.dir/kmp_version.c.o CMakeFiles/iomp5.dir/z_Linux_util.c.o z_Linux_asm.o -lstdc++ -lm -lgcc_s -lc -lgcc_s /usr/lib/gcc/x86_64-redhat-linux/4.6.3/crtendS.o /usr/lib/gcc/x86_64-redhat-linux/4.6.3/…/…/…/…/lib64/crtn.o
/usr/bin/ld: libiomp5.so: version node not found for symbol omp_test_lock_@@VERSION
/usr/bin/ld: failed to set dynamic section sizes: Bad value
CMakeLists.txt (5.04 KB)