abseil-cpp: [Bug]: missing Mutex::Dtor on linux?
Describe the issue
While https://github.com/conda-forge/grpc-cpp-feedstock/pull/348 grpc with -DgRPC_ABSL_PROVIDER="package"
in conda-forge against abseil 20240116.0, the sanity check of compiling an example against the library fails:
[7/18] Linking CXX executable greeter_client
FAILED: greeter_client
: && $PREFIX/bin/x86_64-conda-linux-gnu-c++ -fvisibility-inlines-hidden -fmessage-length=0 -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -ffunction-sections -pipe -isystem $PREFIX/include -fdebug-prefix-map=$SRC_DIR=/usr/local/src/conda/libgrpc-1.61.0 -fdebug-prefix-map=$PREFIX=/usr/local/src/conda-prefix -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,--disable-new-dtags -Wl,--gc-sections -Wl,--allow-shlib-undefined -Wl,-rpath,$PREFIX/lib -Wl,-rpath-link,$PREFIX/lib -L$PREFIX/lib CMakeFiles/greeter_client.dir/greeter_client.cc.o -o greeter_client libhw_grpc_proto.a $PREFIX/lib/libabsl_flags_parse.so.2401.0.0 $PREFIX/lib/libgrpc++_reflection.so.1.61.0 $PREFIX/lib/libgrpc++.so.1.61.0 $PREFIX/lib/libprotobuf.so.25.2.0 $PREFIX/lib/libgrpc.so.38.0.0 $PREFIX/lib/libaddress_sorting.so.38.0.0 $PREFIX/lib/libupb_json_lib.so.38.0.0 $PREFIX/lib/libupb_textformat_lib.so.38.0.0 $PREFIX/lib/libupb_message_lib.so.38.0.0 $PREFIX/lib/libupb_base_lib.so.38.0.0 $PREFIX/lib/libupb_mem_lib.so.38.0.0 $PREFIX/lib/libutf8_range_lib.so.38.0.0 $PREFIX/lib/libssl.so $PREFIX/lib/libcrypto.so $PREFIX/lib/libgpr.so.38.0.0 -ldl -lm -lrt $PREFIX/lib/libabsl_random_distributions.so.2401.0.0 $PREFIX/lib/libabsl_random_seed_sequences.so.2401.0.0 $PREFIX/lib/libabsl_random_internal_pool_urbg.so.2401.0.0 $PREFIX/lib/libabsl_random_internal_randen.so.2401.0.0 $PREFIX/lib/libabsl_random_internal_randen_hwaes.so.2401.0.0 $PREFIX/lib/libabsl_random_internal_randen_hwaes_impl.so.2401.0.0 $PREFIX/lib/libabsl_random_internal_randen_slow.so.2401.0.0 $PREFIX/lib/libabsl_random_internal_platform.so.2401.0.0 $PREFIX/lib/libabsl_random_internal_seed_material.so.2401.0.0 $PREFIX/lib/libabsl_random_seed_gen_exception.so.2401.0.0 $PREFIX/lib/libabsl_log_internal_check_op.so.2401.0.0 $PREFIX/lib/libabsl_leak_check.so.2401.0.0 $PREFIX/lib/libabsl_die_if_null.so.2401.0.0 $PREFIX/lib/libabsl_log_internal_conditions.so.2401.0.0 $PREFIX/lib/libabsl_log_internal_message.so.2401.0.0 $PREFIX/lib/libabsl_log_internal_nullguard.so.2401.0.0 $PREFIX/lib/libabsl_examine_stack.so.2401.0.0 $PREFIX/lib/libabsl_log_internal_format.so.2401.0.0 $PREFIX/lib/libabsl_log_internal_proto.so.2401.0.0 $PREFIX/lib/libabsl_log_internal_log_sink_set.so.2401.0.0 $PREFIX/lib/libabsl_log_sink.so.2401.0.0 $PREFIX/lib/libabsl_log_entry.so.2401.0.0 $PREFIX/lib/libabsl_log_initialize.so.2401.0.0 $PREFIX/lib/libabsl_log_globals.so.2401.0.0 $PREFIX/lib/libabsl_vlog_config_internal.so.2401.0.0 $PREFIX/lib/libabsl_log_internal_fnmatch.so.2401.0.0 $PREFIX/lib/libabsl_log_internal_globals.so.2401.0.0 $PREFIX/lib/libabsl_statusor.so.2401.0.0 $PREFIX/lib/libabsl_status.so.2401.0.0 $PREFIX/lib/libabsl_strerror.so.2401.0.0 $PREFIX/lib/libabsl_flags_usage.so.2401.0.0 $PREFIX/lib/libabsl_flags_usage_internal.so.2401.0.0 $PREFIX/lib/libabsl_flags_internal.so.2401.0.0 $PREFIX/lib/libabsl_flags_marshalling.so.2401.0.0 $PREFIX/lib/libabsl_flags_reflection.so.2401.0.0 $PREFIX/lib/libabsl_flags_config.so.2401.0.0 $PREFIX/lib/libabsl_cord.so.2401.0.0 $PREFIX/lib/libabsl_cordz_info.so.2401.0.0 $PREFIX/lib/libabsl_cord_internal.so.2401.0.0 $PREFIX/lib/libabsl_cordz_functions.so.2401.0.0 $PREFIX/lib/libabsl_cordz_handle.so.2401.0.0 $PREFIX/lib/libabsl_crc_cord_state.so.2401.0.0 $PREFIX/lib/libabsl_crc32c.so.2401.0.0 $PREFIX/lib/libabsl_str_format_internal.so.2401.0.0 $PREFIX/lib/libabsl_crc_internal.so.2401.0.0 $PREFIX/lib/libabsl_crc_cpu_detect.so.2401.0.0 $PREFIX/lib/libabsl_raw_hash_set.so.2401.0.0 $PREFIX/lib/libabsl_hash.so.2401.0.0 $PREFIX/lib/libabsl_bad_variant_access.so.2401.0.0 $PREFIX/lib/libabsl_city.so.2401.0.0 $PREFIX/lib/libabsl_low_level_hash.so.2401.0.0 $PREFIX/lib/libabsl_hashtablez_sampler.so.2401.0.0 $PREFIX/lib/libabsl_exponential_biased.so.2401.0.0 $PREFIX/lib/libabsl_flags_private_handle_accessor.so.2401.0.0 $PREFIX/lib/libabsl_flags_commandlineflag.so.2401.0.0 $PREFIX/lib/libabsl_bad_optional_access.so.2401.0.0 $PREFIX/lib/libabsl_flags_commandlineflag_internal.so.2401.0.0 $PREFIX/lib/libabsl_flags_program_name.so.2401.0.0 $PREFIX/lib/libabsl_synchronization.so.2401.0.0 $PREFIX/lib/libabsl_graphcycles_internal.so.2401.0.0 $PREFIX/lib/libabsl_kernel_timeout_internal.so.2401.0.0 $PREFIX/lib/libabsl_time.so.2401.0.0 $PREFIX/lib/libabsl_civil_time.so.2401.0.0 $PREFIX/lib/libabsl_time_zone.so.2401.0.0 $PREFIX/lib/libabsl_stacktrace.so.2401.0.0 $PREFIX/lib/libabsl_symbolize.so.2401.0.0 $PREFIX/lib/libabsl_strings.so.2401.0.0 $PREFIX/lib/libabsl_strings_internal.so.2401.0.0 $PREFIX/lib/libabsl_string_view.so.2401.0.0 $PREFIX/lib/libabsl_int128.so.2401.0.0 $PREFIX/lib/libabsl_throw_delegate.so.2401.0.0 $PREFIX/lib/libabsl_malloc_internal.so.2401.0.0 $PREFIX/lib/libabsl_debugging_internal.so.2401.0.0 $PREFIX/lib/libabsl_demangle_internal.so.2401.0.0 $PREFIX/lib/libabsl_base.so.2401.0.0 -lpthread $PREFIX/lib/libabsl_raw_logging_internal.so.2401.0.0 $PREFIX/lib/libabsl_log_severity.so.2401.0.0 $PREFIX/lib/$PREFIX/x86_64-conda-linux-gnu/bin/ld: libhw_grpc_proto.a(helloworld.grpc.pb.cc.o): in function `grpc::CompletionQueue::~CompletionQueue()':
helloworld.grpc.pb.cc:(.text._ZN4grpc15CompletionQueueD2Ev[_ZN4grpc15CompletionQueueD5Ev]+0x4d): undefined reference to `absl::lts_20240116::Mutex::Dtor()'
$PREFIX/x86_64-conda-linux-gnu/bin/ld: libhw_grpc_proto.a(helloworld.grpc.pb.cc.o): in function `grpc::ClientReader<helloworld::HelloReply>::~ClientReader()':
helloworld.grpc.pb.cc:(.text._ZN4grpc12ClientReaderIN10helloworld10HelloReplyEED2Ev[_ZN4grpc12ClientReaderIN10helloworld10HelloReplyEED5Ev]+0x6c): undefined reference to `absl::lts_20240116::Mutex::Dtor()'
$PREFIX/x86_64-conda-linux-gnu/bin/ld: libhw_grpc_proto.a(helloworld.grpc.pb.cc.o): in function `non-virtual thunk to grpc::ClientReader<helloworld::HelloReply>::~ClientReader()':
helloworld.grpc.pb.cc:(.text._ZN4grpc12ClientReaderIN10helloworld10HelloReplyEED2Ev[_ZN4grpc12ClientReaderIN10helloworld10HelloReplyEED5Ev]+0x10c): undefined reference to `absl::lts_20240116::Mutex::Dtor()'
$PREFIX/x86_64-conda-linux-gnu/bin/ld: libhw_grpc_proto.a(helloworld.grpc.pb.cc.o): in function `non-virtual thunk to grpc::ClientReaderWriter<helloworld::HelloRequest, helloworld::HelloReply>::~ClientReaderWriter()':
helloworld.grpc.pb.cc:(.text._ZN4grpc18ClientReaderWriterIN10helloworld12HelloRequestENS1_10HelloReplyEED2Ev[_ZN4grpc18ClientReaderWriterIN10helloworld12HelloRequestENS1_10HelloReplyEED5Ev]+0x7c): undefined reference to `absl::lts_20240116::Mutex::Dtor()'
$PREFIX/x86_64-conda-linux-gnu/bin/ld: libhw_grpc_proto.a(helloworld.grpc.pb.cc.o): in function `grpc::ClientReaderWriter<helloworld::HelloRequest, helloworld::HelloReply>::~ClientReaderWriter()':
helloworld.grpc.pb.cc:(.text._ZN4grpc18ClientReaderWriterIN10helloworld12HelloRequestENS1_10HelloReplyEED2Ev[_ZN4grpc18ClientReaderWriterIN10helloworld12HelloRequestENS1_10HelloReplyEED5Ev]+0x12c): undefined reference to `absl::lts_20240116::Mutex::Dtor()'
$PREFIX/x86_64-conda-linux-gnu/bin/ld: libhw_grpc_proto.a(helloworld.grpc.pb.cc.o):helloworld.grpc.pb.cc:(.text._ZN4grpc18ClientReaderWriterIN10helloworld12HelloRequestENS1_10HelloReplyEED2Ev[_ZN4grpc18ClientReaderWriterIN10helloworld12HelloRequestENS1_10HelloReplyEED5Ev]+0x1dc): more undefined references to `absl::lts_20240116::Mutex::Dtor()' follow
collect2: error: ld returned 1 exit status
Previously I had opened #1614 and https://github.com/grpc/grpc/issues/35854, but it now looks like this might be related to https://github.com/abseil/abseil-cpp/commit/f3760b4d3b2773d1cb8e9ddda29dc9bce386d540. In particular, the following looks like a likely culprit https://github.com/abseil/abseil-cpp/blob/119e0d3f74733aff2999d39cb8be99ddcb081c66/absl/synchronization/mutex.cc#L734-L739
I’m not sure what grpc does that (apparently) invalidates the assumptions explained in the commit message of that change.
Steps to reproduce the problem
Build https://github.com/grpc/grpc with -DgRPC_ABSL_PROVIDER="package"
against abseil 20240116.0 and then compile the grpc helloworld example. It would also be possible to replay the recipe we have in conda-forge.
What version of Abseil are you using?
20240116.0
What operating system and version are you using?
Linux
What compiler and version are you using?
GCC 12
What build system are you using?
CMake
Additional context
No response
About this issue
- Original URL
- State: open
- Created 5 months ago
- Reactions: 1
- Comments: 17 (14 by maintainers)
@derekmauro @dvyukov, could you comment about the (un-)inlining of the Mutex destructor, or alternatively, chime in on the linked grpc issue if their usage of the Mutex is somehow not supported?