iOS4 と iOS5 で完全に動作するアプリケーションがあります。ARM を対象とした zeromq ライブラリの静的にコンパイルされたバージョンを使用します。Apple は、iOS 6 でクラッシュすると主張しているため、私のアプリケーションを拒否しました (まだリリースされていません..wth?)
iOS 6 GM で試したところ、ZeroMQ ソケットを初期化するとクラッシュすることが確認できました。クラッシュ メッセージは次のとおりです。
dyld: lazy symbol binding failed: Symbol not found: ___sync_fetch_and_add_4
Referenced from: /var/mobile/Applications/00EDEEDA-0068-4061-9188-01D627F9A6D6/OpenAir.app/OpenAir
Expected in: /usr/lib/libSystem.B.dylib
dyld: Symbol not found: ___sync_fetch_and_add_4
Referenced from: /var/mobile/Applications/00EDEEDA-0068-4061-9188-01D627F9A6D6/OpenAir.app/OpenAir
Expected in: /usr/lib/libSystem.B.dylib
__sync_fetch_add_4 シンボルがコンパイラのアトミック ビルトインであることを理解しています。ZeroMQ が内部ロックのためにミューテックスを使用していることは知っています。これらのシンボルが存在しない原因となった iOS6 の変更点を突き止めるために、あらゆる場所を検索してきました。
Xcode 4.5 と iOS6 GM を使用すると、ライブラリは同じタイプのメッセージでコンパイルされません。
Undefined symbols for architecture armv7:
"___sync_fetch_and_add_4", referenced from:
zmq::socket_base_t::unregister_session(std::basic_string<unsigned char, std::char_traits<unsigned char>, std::allocator<unsigned char> > const&)in libzmq.a(libzmq_la-socket_base.o)
この問題を完全に回避するために、Apple コンパイラのアトミック ビルトインを無効にする方法はありますか?