grpc: grpc-ruby 1.42.0 fails with dyld[]: missing symbol called

What version of gRPC and what language are you using?

grpc - 1.42.0 language - ruby

What operating system (Linux, Windows,…) and version?

MacOS - 12.0.1 MacBook Pro (16-inch, 2019) Processor 2.6 GHz 6-Core Intel Core i7

What runtime / compiler are you using (e.g. python version or version of gcc)

Ruby - 2.7.0, 3.0.0, 3.0.3

What did you do?

Run acceptance for the spanner ruby client library. https://github.com/googleapis/google-cloud-ruby/tree/main/google-cloud-spanner

# some random test project and key, just so that test starts
export SPANNER_TEST_PROJECT="test"
export SPANNER_TEST_KEYFILE=~/test.json
bundle exec rake acceptance

What did you expect to see?

All test runs fine without any crash by GRPC

What did you see instead?

Fails while making an rpc call. The same works fine when we downgrade to 1.41.1.

D1203 18:48:33.343635000 4538004992 ev_posix.cc:172]                   Using polling engine: poll
D1203 18:48:33.343708000 4538004992 lb_policy_registry.cc:42]          registering LB policy factory for "grpclb"
D1203 18:48:33.343717000 4538004992 lb_policy_registry.cc:42]          registering LB policy factory for "priority_experimental"
D1203 18:48:33.343724000 4538004992 lb_policy_registry.cc:42]          registering LB policy factory for "weighted_target_experimental"
D1203 18:48:33.343730000 4538004992 lb_policy_registry.cc:42]          registering LB policy factory for "pick_first"
D1203 18:48:33.343734000 4538004992 lb_policy_registry.cc:42]          registering LB policy factory for "round_robin"
D1203 18:48:33.343740000 4538004992 lb_policy_registry.cc:42]          registering LB policy factory for "ring_hash_experimental"
D1203 18:48:33.343746000 4538004992 dns_resolver_ares.cc:495]          Using ares dns resolver
D1203 18:48:33.343784000 4538004992 certificate_provider_registry.cc:33] registering certificate provider factory for "file_watcher"
D1203 18:48:33.343789000 4538004992 lb_policy_registry.cc:42]          registering LB policy factory for "cds_experimental"
D1203 18:48:33.343795000 4538004992 lb_policy_registry.cc:42]          registering LB policy factory for "xds_cluster_impl_experimental"
D1203 18:48:33.343803000 4538004992 lb_policy_registry.cc:42]          registering LB policy factory for "xds_cluster_resolver_experimental"
D1203 18:48:33.343808000 4538004992 lb_policy_registry.cc:42]          registering LB policy factory for "xds_cluster_manager_experimental"
D1203 18:48:33.343882000 4538004992 rb_grpc.c:291]                     GRPC_RUBY: grpc_ruby_init - prev g_grpc_ruby_init_count:0
D1203 18:48:33.343906000 4538004992 rb_grpc.c:291]                     GRPC_RUBY: grpc_ruby_init - prev g_grpc_ruby_init_count:1
D1203 18:48:33.343916000 4538004992 rb_grpc.c:291]                     GRPC_RUBY: grpc_ruby_init - prev g_grpc_ruby_init_count:2
D1203 18:48:33.343922000 4538004992 rb_grpc.c:291]                     GRPC_RUBY: grpc_ruby_init - prev g_grpc_ruby_init_count:3
D1203 18:48:33.343931000 4538004992 rb_channel.c:708]                  GRPC_RUBY: wait for channel polling thread to start
D1203 18:48:33.343940000 123145478193152 rb_grpc.c:291]                GRPC_RUBY: grpc_ruby_init - prev g_grpc_ruby_init_count:4
D1203 18:48:33.343968000 123145481912320 rb_channel.c:697]             GRPC_RUBY: run_poll_channels_loop - create connection polling thread
D1203 18:48:33.343977000 123145481912320 rb_grpc.c:291]                GRPC_RUBY: grpc_ruby_init - prev g_grpc_ruby_init_count:5
D1203 18:48:33.343982000 123145481912320 rb_channel.c:621]             GRPC_RUBY: run_poll_channels_loop_no_gil - begin
dyld[60801]: missing symbol called
rake aborted!
SignalException: SIGABRT

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Reactions: 10
  • Comments: 28 (14 by maintainers)

Commits related to this issue

Most upvoted comments

@brodock’s suggestion did not work for me. Instead, what did the trick for me was adding this into my Gemfile:

if RUBY_PLATFORM =~ /darwin/
  module BundlerHack
    def __materialize__
      if name == 'grpc' || name == 'google-protobuf'
        Bundler.settings.temporary(force_ruby_platform: true) do
          super
        end
      else
        super
      end
    end
  end
  Bundler::LazySpecification.prepend(BundlerHack)
end

Considerations:

  • I’m only using it for development.
  • ruby -e 'puts Gem::Platform.local' returns x86_64-darwin-20 for me
  • I’m not using an M1 MacBook pro

to anyone who needs to get grpc working on their development machines, you can temporarily set bundler platform to ruby which ignores any OS specific pre-built binary and rebuild directly from source:

bundle config set force_ruby_platform true

Just for anyone else who is looking for a (temporary) solve, downgrading grcp to 1.41.1 in my gemfile fixed my issue. I was trying to use the google-cloud-firestore gem and it was failing due to the error listed in this issue.

OK, that seems to narrow things down to the new x86_64 package build from https://github.com/grpc/grpc/pull/25794.

cc @flavorjones

A good explanation of what’s happening is in this series of blog posts:

  1. Undefined Symbol on macOS – Eugene Petrenko
  2. Undefined isOSVersionAtLeast on macOS – Eugene Petrenko
  3. Understanding isOSVersionAtLeast on macOS – Eugene Petrenko

And some prior instances of this exact problem (cross-compiling via osxcross):

It doesn’t look like the rake-compiler-dock installation of osxcross has the compiler-rt libraries installed. I’m going to explore doing that next.

(and can confirm downgrading to 1.41 fixes it)