Suprateeka R Hegde via llvm-dev
2016-Sep-19 16:31 UTC
[llvm-dev] Incorrect LD_LIBRARY_PATH manifests in a totally different way!
Hi While building llvm trunk (including compiler-rt), the build (asan link) failed with "undefined reference to shm_open". Upon search, it is found in librt.so. But -lrt was not there on the link-line at all. Adding -lrt in the CMake generated link.txt, makes the build go through. But thats not the solution. Upon further searching, I find: --- append_list_if(COMPILER_RT_HAS_LIBRT rt ASAN_DYNAMIC_LIBS) --- in file projects/compiler-rt/lib/asan/CMakeLists.txt. The boolean COMPILER_RT_HAS_LIBRT was set to false, and hence, the "if" failed to add -lrt. But why was the boolean set to false? Turns out that in the very beginning (cmake configure stage), when testing the availability for function shm_open, -lrt was indeed linked, but the test failed! Why because, librt.so has libpthread.so is DT_NEEDED. Unknowingly I had set LD_LIBRARY_PATH to an incorrect (actually very latest and incompatible glibc) path where the latest libpthread.so (trunk built glibc based) was available. However, this libpthread was incompatible with system installed libc.so. Though all libraries have been picked up from the system standard path, libpthread.so being DT_NEEDED inside librt.so, was picked from my LD_LIBRARY_PATH. The test for availability of shm_open failed SILENTLY! At the end, cmake returned exit status 0 (success). And eventually compiler-rt (asan) build failed. (I hate this GNU ld behavior of looking under LD_LIBRARY_PATH for DT_NEEDED even at static link time. It should search only at runtime. Anyway, thats how the system is) How do I force CMake to bail out in such case? Do I need to change "append_list_if(booleans)" to something strict? What is the best solution? -- Supra