Navigation Menu

Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SR-3472] compiler-rt on amd64 ubuntu targets i386 even if libstd++ is not present for i386 #46060

Open
swift-ci opened this issue Dec 22, 2016 · 4 comments
Labels
bug A deviation from expected or documented behavior. Also: expected but undesirable behavior.

Comments

@swift-ci
Copy link
Collaborator

Previous ID SR-3472
Radar rdar://problem/29203860
Original Reporter erg (JIRA User)
Type Bug
Additional Detail from JIRA
Votes 0
Component/s
Labels Bug
Assignee erg (JIRA)
Priority Medium

md5: 6fc82fe1d9a95955eff4e6f3ae35b5d6

Issue Description:

compiler-rt builds for i386 even when there is no i386 ``libstdc++`` installed, so it fails on the linker step. Should we even be building for i386 here?

The cmake does a check_library_exists in ``compiler-rt/cmake/config-ix.cmake``:
check_library_exists(stdc++ __cxa_throw "" COMPILER_RT_HAS_LIBSTDCXX)

But this isn't fine-grained enough for 64/32bit.

I don't know which platforms compiler-rt should support by default.

$ uname -a
Linux asdf 4.4.0-45-generic #66-Ubuntu SMP Wed Oct 19 14:12:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
aka Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-45-generic x86_64)

$ apt search 'libstdc++' | grep libstd | grep installed
libstdc++-4.8-dev/xenial,now 4.8.5-4ubuntu2 amd64 [installed]

$ mkdir jira-issue-i386
$ git clone git@github.com:apple/swift.git
$ swift/utils/update-checkout --clone
$ swift/utils/build-script --preset=buildbot_incremental_linux

    • Target triple: x86_64-unknown-linux-gnu

    • Native target architecture is X86

    • Threads enabled.

    • Doxygen disabled.

    • Sphinx disabled.

    • Go bindings enabled.

    • Could NOT find OCaml (missing: OCAMLFIND OCAML_VERSION OCAML_STDLIB_PATH)

    • Could NOT find OCaml (missing: OCAMLFIND OCAML_VERSION OCAML_STDLIB_PATH)

    • OCaml bindings disabled.

    • Building with -fPIC

    • Constructing LLVMBuild project information

    • Targeting X86

    • Targeting ARM

    • Targeting AArch64

    • Targeting PowerPC

    • Targeting SystemZ

    • Clang version: 4.0.0

    • Configuring done

    • Generating done

    • Build files have been written to: /home/erg/build/buildbot_incremental/llvm-linux-x86_64

Linker step:

FAILED: : && /home/erg/build/buildbot_incremental/llvm-linux-x86_64/./bin/clang++ -fPIC -Wall -std=c+11 -Wno-unused-parameter -O3 -DNDEBUG -m32 -shared -Wl,-soname,libclang_rt.asan-i386.so -o /home/erg/build/buildbot_incremental/llvm-linux-x86_64/lib/clang/4.0.0/lib/linux/libclang_rt.asan-i386.so lib/interception/CMakeFiles/RTInterception.i386.dir/interception_linux.cc.o lib/interception/CMakeFiles/RTInterception.i386.dir/interception_mac.cc.o lib/interception/CMakeFiles/RTInterception.i386.dir/interception_win.cc.o lib/interception/CMakeFiles/RTInterception.i386.dir/interception_type_test.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_allocator.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_common.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_deadlock_detector1.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_deadlock_detector2.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_flags.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_flag_parser.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_libc.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_libignore.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_linux.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_linux_s390.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_mac.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_persistent_allocator.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_platform_limits_linux.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_platform_limits_posix.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_posix.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_printf.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_procmaps_common.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_procmaps_freebsd.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_procmaps_linux.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_procmaps_mac.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_stackdepot.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_stacktrace.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_stacktrace_printer.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_suppressions.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_symbolizer.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_symbolizer_libbacktrace.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_symbolizer_mac.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_symbolizer_win.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_tls_get_addr.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_thread_registry.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_win.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_linux_x86_64.S.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommon.i386.dir/sanitizer_termination.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.i386.dir/sanitizer_common_libcdep.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.i386.dir/sanitizer_coverage_libcdep.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.i386.dir/sanitizer_coverage_mapping_libcdep.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.i386.dir/sanitizer_linux_libcdep.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.i386.dir/sanitizer_posix_libcdep.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.i386.dir/sanitizer_stacktrace_libcdep.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.i386.dir/sanitizer_stoptheworld_linux_libcdep.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.i386.dir/sanitizer_symbolizer_libcdep.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.i386.dir/sanitizer_symbolizer_posix_libcdep.cc.o lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.i386.dir/sanitizer_unwind_linux_libcdep.cc.o lib/lsan/CMakeFiles/RTLSanCommon.i386.dir/lsan_common.cc.o lib/lsan/CMakeFiles/RTLSanCommon.i386.dir/lsan_common_linux.cc.o lib/ubsan/CMakeFiles/RTUbsan.i386.dir/ubsan_diag.cc.o lib/ubsan/CMakeFiles/RTUbsan.i386.dir/ubsan_init.cc.o lib/ubsan/CMakeFiles/RTUbsan.i386.dir/ubsan_flags.cc.o lib/ubsan/CMakeFiles/RTUbsan.i386.dir/ubsan_handlers.cc.o lib/ubsan/CMakeFiles/RTUbsan.i386.dir/ubsan_value.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_allocator.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_activation.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_debugging.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_descriptions.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_errors.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_fake_stack.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_flags.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_globals.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_interceptors.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_linux.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_mac.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_malloc_linux.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_malloc_mac.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_malloc_win.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_memory_profile.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_poisoning.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_posix.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_report.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_rtl.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_stack.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_stats.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_suppressions.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_thread.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_win.cc.o lib/asan/CMakeFiles/RTAsan_dynamic.i386.dir/asan_new_delete.cc.o lib/asan/CMakeFiles/RTAsan_dynamic_version_script_dummy.i386.dir/dummy.cc.o lib/ubsan/CMakeFiles/RTUbsan_cxx.i386.dir/ubsan_handlers_cxx.cc.o lib/ubsan/CMakeFiles/RTUbsan_cxx.i386.dir/ubsan_type_hash.cc.o lib/ubsan/CMakeFiles/RTUbsan_cxx.i386.dir/ubsan_type_hash_itanium.cc.o lib/ubsan/CMakeFiles/RTUbsan_cxx.i386.dir/ubsan_type_hash_win.cc.o -lc -ldl -lrt -lm -lpthread -lstdc+ && :
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/5.4.0/libstdc+.so when searching for -lstdc+
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/5.4.0/libstdc+.a when searching for -lstdc+
/usr/bin/ld: cannot find -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/5.4.0/libstdc+.so when searching for -lstdc+
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/5.4.0/libstdc+.a when searching for -lstdc+
/usr/bin/ld: cannot find -lstdc++
clang-4.0: error: linker command failed with exit code 1 (use -v to see invocation)

@swift-ci
Copy link
Collaborator Author

Comment by Doug Coleman (JIRA)

Vedant, can you sort out what should be happening here? I'm happy to help write some cmake, but I don't know which platforms are correct. Thanks!

@vedantk
Copy link
Member

vedantk commented Dec 22, 2016

The ASan runtime can optionally link against libstdc++ on non-Apple platforms.

As you discovered, the way we check for the presence of libstdc++ doesn't take into account the architecture we're targeting. This is a problem because we build the ASan runtime for (potentially) a bunch of different architectures.

Have you tried just installing a 32-bit version of libstdc++ on the affected machines? Is this a regression, and if so, when did it start happening?

Presumably the ASan runtime does need some sort of C++ standard library, otherwise it wouldn't try to link against libstdc++. We shouldn't just disable the check for COMPILER_RT_HAS_LIBSTDCXX on 32-bit linux: if that configuration really is unsupported (I'm not the right person to answer that, maybe ask @AnnaZaks?), it should be disallowed higher up in the build script.

@AnnaZaks
Copy link
Mannequin

AnnaZaks mannequin commented Dec 22, 2016

compiler-rt supports 32-bit Linux. I suspect there are open source llvm bots building it in that configuration.

@swift-ci
Copy link
Collaborator Author

Comment by Doug Coleman (JIRA)

Normally I could install libstd++ 32bit, but I don't have admin privs on this one machine. It doesn't look like a regression because the cmake files don't make a distinction between processors for any of the library checks.

There are bots that build the 32bit configuration. They are ok since they have extra libstd++ 32bit libraries installed. The issue is when we warn the user to install them: it should be cmake time rather than link time. I'll look into adding the check.

@swift-ci swift-ci transferred this issue from apple/swift-issues Apr 25, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug A deviation from expected or documented behavior. Also: expected but undesirable behavior.
Projects
None yet
Development

No branches or pull requests

2 participants