Use dyld to link in frameworks at runtime. Use ld to make your programs and link archive libraries at build time.

Linker Documentation

Pinned Posts

Posts under Linker tag

160 Posts
Sort by:
Post not yet marked as solved
0 Replies
84 Views
With XCode 14 and below, our macOS application is building and running fine. The application depends on some third-party .dylibs and also a couple of .frameworks that we make in-house, all of which are happily in the .app bundle and working. When compiled under XCode 15, the application crashes because one of our .frameworks now tries to load these dylibs which cannot be found if run on a machine that didn't build it. Note that previously, this framework never depended on these dylibs before, but the application does. The rpaths for these dylibs are pointing to the build dependencies folder, which would only exist on a build machine. Also, the dependencies are now looking for versioned dylib filenames, while the application itself depends on the un-versioned dylib filenames. So to recap, that's 3 new problems when building with the new linker: The framework is now dependent on dylibs that normally only the application depends on The new dependency is on versioned dylibs, where the original application dependency is on un-versioned dylibs The framework's rpaths now include intermediate build folders Running otool -L on the framework binary shows a clear difference between ld_prime and ld_classic. The dependencies on the third-party dylibs are only showing up when the framework is built with the new linker. We have a couple of workarounds: Using ld_classic to build our application with the old linker Using post-build commands (install_name_tool) to change the dependencies and remove the build folders from the rpaths Though ultimately, workaround 1) could only be temporary and 2) is hacky. We'd like to understand why the linker is exhibiting this new behaviour, so we can make the proper adjustments to fix this the correct way. Any insight would be greatly appreciated. Thanks in advance. Note: this is a cross-platform product, and CMake is used to generate the .xcodeproj project file.
Posted
by Jeffrey_B.
Last updated
.
Post not yet marked as solved
7 Replies
329 Views
Hi, I have a unity game which i am trying to export to iOS. The build was working fine until i had to integrate the following SDKs into my project. Facebook SDK Firebase (firestore, messaging, auth) Google ads My Xcode version is: 15.1 Build target: 12 i'm getting the following error in the logs while trying to build: Any help would be appreciated The error is Undefined symbols and linker command failed with exit code 1 (use -v to see invocation) with output ld: Undefined symbols: absl::lts_20220623::variant_internal::ThrowBadVariantAccess(), referenced from: firebase::firestore::nanopb::SharedMessage<firebase::firestore::_google_firestore_v1_Value>& absl::lts_20220623::variant_internal::TypedThrowBadVariantAccess<firebase::firestore::nanopb::SharedMessage<firebase::firestore::_google_firestore_v1_Value>&>() in libFirebaseCppFirestore.a[arm64][37](field_value_main.cc.o) firebase::firestore::DocumentReference const& absl::lts_20220623::variant_internal::TypedThrowBadVariantAccess<firebase::firestore::DocumentReference const&>() in libFirebaseCppFirestore.a[arm64][37](field_value_main.cc.o) std::__1::vector<firebase::firestore::FieldValue, std::__1::allocator<firebase::firestore::FieldValue>> const& absl::lts_20220623::variant_internal::TypedThrowBadVariantAccess<std::__1::vector<firebase::firestore::FieldValue, std::__1::allocator<firebase::firestore::FieldValue>> const&>() in libFirebaseCppFirestore.a[arm64][37](field_value_main.cc.o) std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, firebase::firestore::FieldValue, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const, firebase::firestore::FieldValue>>> const& absl::lts_20220623::variant_internal::TypedThrowBadVariantAccess<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, firebase::firestore::FieldValue, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const, firebase::firestore::FieldValue>>> const&>() in libFirebaseCppFirestore.a[arm64][37](field_value_main.cc.o) firebase::firestore::nanopb::SharedMessage<firebase::firestore::_google_firestore_v1_Value> const& absl::lts_20220623::variant_internal::TypedThrowBadVariantAccess<firebase::firestore::nanopb::SharedMessage<firebase::firestore::_google_firestore_v1_Value> const&>() in libFirebaseCppFirestore.a[arm64][37](field_value_main.cc.o) absl::lts_20220623::optional_internal::throw_bad_optional_access(), referenced from: absl::lts_20220623::optional<firebase::firestore::_google_firestore_v1_Value>::value() && in libFirebaseCppFirestore.a[arm64][35](document_snapshot_main.cc.o) absl::lts_20220623::optional<firebase::firestore::model::Document>::value() const & in libFirebaseCppFirestore.a[arm64][40](query_main.cc.o) absl::lts_20220623::optional<std::__1::vector<firebase::firestore::DocumentChange, std::__1::allocator<firebase::firestore::DocumentChange>>>::value() & in libFirebaseCppFirestore.a[arm64][41](query_snapshot_main.cc.o) absl::lts_20220623::optional<std::__1::vector<firebase::firestore::DocumentSnapshot, std::__1::allocator<firebase::firestore::DocumentSnapshot>>>::value() & in libFirebaseCppFirestore.a[arm64][41](query_snapshot_main.cc.o) absl::lts_20220623::optional<std::__1::unordered_set<firebase::firestore::FieldPath, std::__1::hash<firebase::firestore::FieldPath>, std::__1::equal_to<firebase::firestore::FieldPath>, std::__1::allocator<firebase::firestore::FieldPath>>>::value() const & in libFirebaseCppFirestore.a[arm64][43](user_data_converter_main.cc.o) firebase::firestore::api::AggregateQuery::Get(std::__1::function<void (firebase::firestore::util::StatusOr<long long> const&)>&&), referenced from: firebase::firestore::AggregateQueryInternal::Get(firebase::firestore::AggregateSource) in libFirebaseCppFirestore.a[arm64][29](aggregate_query_main.cc.o) firebase::firestore::api::operator==(firebase::firestore::api::AggregateQuery const&, firebase::firestore::api::AggregateQuery const&), referenced from: firebase::firestore::operator==(firebase::firestore::AggregateQueryInternal const&, firebase::firestore::AggregateQueryInternal const&) in libFirebaseCppFirestore.a[arm64][29](aggregate_query_main.cc.o) firebase::firestore::operator==(firebase::firestore::AggregateQuerySnapshotInternal const&, firebase::firestore::AggregateQuerySnapshotInternal const&) in libFirebaseCppFirestore.a[arm64][30](aggregate_query_snapshot_main.cc.o) firebase::firestore::api::Query::Count() const, referenced from: firebase::firestore::QueryInternal::Count() in libFirebaseCppFirestore.a[arm64][40](query_main.cc.o) firebase::firestore::core::Query::normalized_order_bys() const, referenced from: firebase::firestore::QueryInternal::ToBound(firebase::firestore::QueryInternal::BoundPosition, firebase::firestore::DocumentSnapshot const&) const in libFirebaseCppFirestore.a[arm64][40](query_main.cc.o) firebase::firestore::QueryInternal::ToBound(firebase::firestore::QueryInternal::BoundPosition, firebase::firestore::DocumentSnapshot const&) const in libFirebaseCppFirestore.a[arm64][40](query_main.cc.o) firebase::firestore::QueryInternal::ToBound(firebase::firestore::QueryInternal::BoundPosition, firebase::firestore::DocumentSnapshot const&) const in libFirebaseCppFirestore.a[arm64][40](query_main.cc.o) vtable for firebase::firestore::api::AggregateQuery, referenced from: firebase::firestore::api::AggregateQuery::AggregateQuery(firebase::firestore::api::AggregateQuery const&) in libFirebaseCppFirestore.a[arm64][2](aggregate_query.cc.o) firebase::firestore::api::AggregateQuery::~AggregateQuery() in libFirebaseCppFirestore.a[arm64][2](aggregate_query.cc.o) clang: error: linker command failed with exit code 1 (use -v to see invocation)
Posted Last updated
.
Post not yet marked as solved
4 Replies
1.8k Views
Second attempt to publish the Mac version of my App, but it was rejected again due to the same error: 'Library missing'. The library IS included with the build. The extracted .app from .xcarchive runs without a problem on different machines, both M1 and Intel. So, I don't know what's wrong. Can somebody please help me? I can provide the complete .ips from Apple if needed. { "code": 1, "flags": 518, "namespace": "DYLD", "indicator": "Library missing", "details": [ "(terminated at launch; ignore backtrace)" ], "reasons": [ "Library not loaded: @rpath/TitaniumKit.framework/Versions/A/TitaniumKit", "Referenced from: <85BA8613-0157-3B28-99AF-E73F1E579B72> /Applications/TiDesigner.app/Contents/MacOS/TiDesigner", "Reason: tried: '/usr/lib/swift/TitaniumKit.framework/Versions/A/TitaniumKit' (no such file, not in dyld cache), '/System/Volumes/Preboot/Cryptexes/OS/usr/lib/swift/TitaniumKit.framework/Versions/A/TitaniumKit' (no such file), '/usr/lib/swift/TitaniumKit.framework/Versions/A/TitaniumKit' (no such file, not in dyld cache), '/System/Volumes/Preboot/Cryptexes/OS/usr/lib/swift/TitaniumKit.framework/Versions/A/TitaniumKit' (no such file), '/System/Library/Frameworks/TitaniumKit.framework/Versions/A/TitaniumKit' (no such file, not in dyld cache), (security policy does not allow @ path expansion)" ] }
Posted
by macCesar.
Last updated
.
Post not yet marked as solved
1 Replies
82 Views
After reading An Apple Library Primer and watching Meet mergeable libraries (both really good resources) I'm sold on mergeable libraries. In my company we're working with static libraries as much as possible (both for precompiled dependencies and for our own Xcode projects). I can see that switching to mergeable libraries would (at least) improve iteration time because mergeable libraries would only be merged in release configs by default. You made it sound like it's "the holy grail of libraries". However, before starting the migration process I'd like to know: Is there any drawback to (merged) mergeable libraries when compared to using static libraries? I got the idea that mergeable libraries behave "almost" like static libraries after being linked "statically" with the app. What differences can I expect? Is there any situation where it's better to use static libraries instead of mergeable libraries? Thank you!
Posted Last updated
.
Post not yet marked as solved
1 Replies
96 Views
Hello there, I'm struggling with the following issue since Xcode 15 arrived and haven't been able to solve it. I have a go library c-archive library which I'm using in a iOS app and build were OK until Sonoma updated came last year. I updated all my go libraries and go runtime to latest version and still facing issues: my make script as follows: ios-arm64: CGO_ENABLED=1 GOOS=ios GOARCH=arm64 SDK=iphoneos SDK_PATH=xcrun --sdk iphoneos --show-sdk-path CARCH="arm64" CC=$(PWD)/clangwrap.sh CGO_CFLAGS="-fembed-bitcode" go build -v -buildmode=c-archive -ldflags="-s -w" -gcflags=all="-l -B" -tags ios -o $(IOS_OUT)/btfs.a . If there is anything else you need I can share more details. Thanks!
Posted Last updated
.
Post marked as solved
4 Replies
707 Views
I have an app that links to two dynamic frameworks which both link to the same static library, as follows: |--App |--DynamicFramework1 |--StaticLibrary |--DynamicFramework2 |--StaticLibrary <- the same library that DynamicFramework1 links to The static library's symbols are included in each framework's binary because of the way dynamic frameworks are built by default. The app therefore finds duplicates of the static library's symbols at runtime. Is it possible to link a dynamic framework to a static library (and to still be able to call on the classes and methods of the static library within the dynamic framework) in a manner that symbols from the static library are excluded from the dynamic framework's binary? My hope in doing this is that the binary of each of the two dynamic frameworks will exclude the symbols of the static library. I will then make it the responsibility of the app to link to the static library directly. Notes I have tried linking my dynamic framework with the static library in two different ways thus far: (1) I added the static library to my framework's "Link Binary with Libraries" Build Phase; and (2) I referenced the static library in my framework's "Other Linker Flags" Build Setting. Both result in the static library's symbols being included in the framework's binary. I am aware that changing a framework target's "Mach-O Type" from "Dynamic Framework" to "Static Library" will build the framework's binary without the symbols of the static libraries that it links to. I want to keep my frameworks as dynamic frameworks so that (1) I can benefit from how Xcode bundles together resources (strings, storyboards etc) automatically for dynamic frameworks; and (2) users of my framework can benefit from Mergeable Libraries in the near future. I am aware that I can solve this problem by changing the static library to a dynamic framework. I want to avoid this as much as possible since the static library is from a third-party. I want to avoid forking the static library's source code and messing with its build scripts if I can.
Posted Last updated
.
Post marked as solved
4 Replies
164 Views
I have developed a framework for my customer, thats a swift dyanmic framework. For code modularization i have divided this framework features in to multiple static libraries as shown in the diagram below. Currently we have on main swift dynamnic framework and it contains 2 static libraries too. Also the first static library here in turn nested with another static library, Key points to note here is My static libraries contains other third party iOS frameworks My static libraries using CoccoaPods as the dependency for Alarmofire at the moment. My questios are Is there any problem in the current architecture , because i heard nested libraries are not supported in iOS . but since we dont have frameworks nested here, all of our second level frameworks are static libraries only. What are link/libary search path guidance we needed to take care to make a successful build.
Posted
by vishnu_tf.
Last updated
.
Post not yet marked as solved
22 Replies
3.4k Views
In Xcode 15 beta 6, building any Mac Catalyst project will encounter the following Linker warning. ld: warning: building for 'macCatalyst', but linking in dylib (/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa.tbd) built for 'macOS'
Posted
by Gong.
Last updated
.
Post not yet marked as solved
1 Replies
115 Views
I am new to Xcode and trying to learn and having issues with errors it seems. I believe the problem is specifically with my code not being able to be displayed on the example iPhone on the right hand side of the screen. Here are the 2 errors I receive below. The codes at the very bottom are red on my screen so I am guessing those are what is most important out of all of this. Thanks and please let me know if I can answer any additional questions regarding this. Ld /Users/tward/Library/Developer/Xcode/DerivedData/Playground-aoepzfpfzcxxqggglpllgxkoywsr/Build/Intermediates.noindex/Previews/Playground/Products/Debug-iphonesimulator/Playground.app/Playground normal (in target 'Playground' from project 'Playground') cd /Users/tward/Desktop/Playground.swiftpm /Users/tward/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -Xlinker -reproducible -target x86_64-apple-ios15.2-simulator -isysroot /Users/tward/Downloads/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator16.4.sdk -L/Users/tward/Library/Developer/Xcode/DerivedData/Playground-aoepzfpfzcxxqggglpllgxkoywsr/Build/Intermediates.noindex/Previews/Playground/Intermediates.noindex/EagerLinkingTBDs/Debug-iphonesimulator -L/Users/tward/Library/Developer/Xcode/DerivedData/Playground-aoepzfpfzcxxqggglpllgxkoywsr/Build/Intermediates.noindex/Previews/Playground/Products/Debug-iphonesimulator -L/Users/tward/Downloads/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/lib -F/Users/tward/Library/Developer/Xcode/DerivedData/Playground-aoepzfpfzcxxqggglpllgxkoywsr/Build/Intermediates.noindex/Previews/Playground/Intermediates.noindex/EagerLinkingTBDs/Debug-iphonesimulator -F/Users/tward/Library/Developer/Xcode/DerivedData/Playground-aoepzfpfzcxxqggglpllgxkoywsr/Build/Intermediates.noindex/Previews/Playground/Products/Debug-iphonesimulator -F/Users/tward/Downloads/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks -iframework /Users/tward/Downloads/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks -iframework /Users/tward/Downloads/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator16.4.sdk/Developer/Library/Frameworks -filelist /Users/tward/Library/Developer/Xcode/DerivedData/Playground-aoepzfpfzcxxqggglpllgxkoywsr/Build/Intermediates.noindex/Previews/Playground/Intermediates.noindex/Playground.build/Debug-iphonesimulator/Playground.build/Objects-normal/x86_64/Playground.LinkFileList -Xlinker -rpath -Xlinker @executable_path/../lib -dead_strip -Xlinker -object_path_lto -Xlinker /Users/tward/Library/Developer/Xcode/DerivedData/Playground-aoepzfpfzcxxqggglpllgxkoywsr/Build/Intermediates.noindex/Previews/Playground/Intermediates.noindex/Playground.build/Debug-iphonesimulator/Playground.build/Objects-normal/x86_64/Playground_lto.o -Xlinker -export_dynamic -Xlinker -no_deduplicate -Xlinker -objc_abi_version -Xlinker 2 -fobjc-link-runtime -L/Users/tward/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator -L/usr/lib/swift -Xlinker -add_ast_path -Xlinker /Users/tward/Library/Developer/Xcode/DerivedData/Playground-aoepzfpfzcxxqggglpllgxkoywsr/Build/Intermediates.noindex/Previews/Playground/Intermediates.noindex/Playground.build/Debug-iphonesimulator/Playground.build/Objects-normal/x86_64/Playground.swiftmodule -Xlinker -sectcreate -Xlinker __TEXT -Xlinker __entitlements -Xlinker /Users/tward/Library/Developer/Xcode/DerivedData/Playground-aoepzfpfzcxxqggglpllgxkoywsr/Build/Intermediates.noindex/Previews/Playground/Intermediates.noindex/Playground.build/Debug-iphonesimulator/Playground.build/Playground.app-Simulated.xcent -Xlinker -sectcreate -Xlinker __TEXT -Xlinker __ents_der -Xlinker /Users/tward/Library/Developer/Xcode/DerivedData/Playground-aoepzfpfzcxxqggglpllgxkoywsr/Build/Intermediates.noindex/Previews/Playground/Intermediates.noindex/Playground.build/Debug-iphonesimulator/Playground.build/Playground.app-Simulated.xcent.der -Xlinker -no_adhoc_codesign -Xlinker -dependency_info -Xlinker /Users/tward/Library/Developer/Xcode/DerivedData/Playground-aoepzfpfzcxxqggglpllgxkoywsr/Build/Intermediates.noindex/Previews/Playground/Intermediates.noindex/Playground.build/Debug-iphonesimulator/Playground.build/Objects-normal/x86_64/Playground_dependency_info.dat -o /Users/tward/Library/Developer/Xcode/DerivedData/Playground-aoepzfpfzcxxqggglpllgxkoywsr/Build/Intermediates.noindex/Previews/Playground/Products/Debug-iphonesimulator/Playground.app/Playground ld: entry point (_main) undefined. for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
Posted
by Tybward.
Last updated
.
Post not yet marked as solved
2 Replies
116 Views
Hello, I am developing a tool in python or nodejs to intercept flows between two applications (MITM). I want to use the FRIDA library, but when I use it I get the following error: Error: module not found at "/usr/lib/libSystem.B.dylib". Indeed, the library is not present in the folder. I tried to get help directly from FRIDA but I couldn't find any help and on the current forum I did see some posts talking about this problem but I couldn't solve it. Do you have an idea of how to solve this problem. Thank you. Ps: I'm new to the APPLE ecosystem (Mac mini - Apple M1)
Posted
by MathRails.
Last updated
.
Post not yet marked as solved
1 Replies
146 Views
gcc -I/opt/homebrew/opt/postgresql@15/include -I/opt/homebrew/Cellar/openssl@3/3.2.1/include -fPIC -c -o pkg/publisher/pg/clibpq/copy.o pkg/publisher/pg/clibpq/copy.c gcc -shared -L/opt/homebrew/opt/postgresql@15/lib -lpq -o pkg/publisher/pg/clibpq/libcopy.so pkg/publisher/pg/clibpq/copy.o ld: warning: ignoring file '/opt/homebrew/Cellar/postgresql@15/15.6_1/lib/libpq.5.15.dylib': found architecture 'arm64', required architecture 'x86_64' ld: Undefined symbols: _PQclear, referenced from: _copy_table_data in copy.o _copy_table_data in copy.o _copy_table_data in copy.o _start_copy_origin_tx in copy.o _start_copy_origin_tx in copy.o _start_copy_target_tx in copy.o _finish_copy_origin_tx in copy.o ... clang: error: linker command failed with exit code 1 (use -v to see invocation)
Posted
by Verahuang.
Last updated
.
Post marked as solved
1 Replies
180 Views
I have a shell script that turns a framework into a plain dylib and updates some dependent library paths using install_name_tool. It works, but if the framework was signed, I get warnings like: install_name_tool: warning: changes being made to the file will invalidate the code signature in: [redacted].dylib (for architecture x86_64) I thought I could get rid of the warning by adding codesign --remove-signature dylib-path to the script before using install_name_tool, but then I get errors like install_name_tool: fatal error: file not in an order that can be processed (link edit information does not fill the __LINKEDIT segment): [redacted].dylib (for architecture x86_64) Is there a way to fix this?
Posted
by JWWalker.
Last updated
.
Post not yet marked as solved
0 Replies
141 Views
My app has a pod dependency (xcframework), BUILD_LIBRARY_FOR_DISTRIBUTION was changed to YES when generating the xcframework. After adding the pod dependency in the Podfile the app crash: dyld[21474]: Symbol not found: _$s10Foundation13URLComponentsV3urlAA3URLVSgvg Referenced from: /Users/user_repo/Library/Developer/CoreSimulator/Devices/.../data/Containers/Bundle/Application/.../MyApp.app/Frameworks/PodDependency.framework/PodDependency Expected in: /Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 15.5.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Foundation.framework/Foundation The app is build on XCode15.2 and don't crash on iOS16+. Cocoapods version: 1.15.2 I already tried to set BUILD_LIBRARY_FOR_DISTRIBUTION to YES for the specific pod in the Podfile of my project.
Posted Last updated
.
Post marked as solved
6 Replies
245 Views
environment: Apple clang version 14.0.3 (clang-1403.0.22.14.1) I am trying to override c++ symbols at linking time for the purpose of inserting measurement code into an existing library. Perhaps typical linkers would search for symbols in specifing order of library and adopt the first hit. Xcode's ld apparently does this in units of a object file. If you create one object file to override one function and link it first, but call another function in the same object file contained in the original library, that one will be adopted. As a result, you cannot override function. To override a function, the function to be overridden must be moved to a new cpp file and separated from the object file. Here is a sample program to test this. https://onedrive.live.com/redir?resid=DD46698E2D493F32!395&authkey=!AJqfiva7CXIDI_Y&e=OaFlSr As you can see in main.cpp, func() and bar() are called from main(). func() and bar() are implemented in func.cpp and bar.cpp, respectively. They are linked to libTest.lib. To override func(), link libTest2.lib implementing func2() in func2.cpp, before libTest.lib. If you run make and look at the code with objdump -d a.out, you can see the override. Because the content of func2() is return i+1, __Z4funci contains leal 1(%rdi), %eax. Then, build with make clean and make CONCAT=1, func() and bar() are concatenated into one cpp file and compiled. The generated a.out is checked in the same way, you will see movl %edi, %eax at same position which means return i; which is the content of func(). This sample is small in scale, but in a larger project, it can be quite a hassle to isolate the functions you want to override. Is there any easier way to override the function? Since the original function name cannot be changed, it is our policy not to use -alias symbol_name alternate_symbol_name. Thanks.
Posted
by mkawasaki.
Last updated
.
Post not yet marked as solved
0 Replies
4.7k Views
Apple’s library technology has a long and glorious history, dating all the way back to the origins of Unix. This does, however, mean that it can be a bit confusing to newcomers. This is my attempt to clarify some terminology. If you have any questions or comments about this, start a new thread and tag it with Linker so that I see it. Share and Enjoy — Quinn “The Eskimo!” @ Developer Technical Support @ Apple let myEmail = "eskimo" + "1" + "@" + "apple.com" An Apple Library Primer Apple’s tools support two related concepts: Platform — This is the platform itself; macOS, iOS, iOS Simulator, and Mac Catalyst are all platforms. Architecture — This is a specific CPU architecture used by a platform. arm64 and x86_64 are both architectures. A given architecture might be used by multiple platforms. The most obvious example of this arm64, which is used by all of the platforms listed above. Code built for one platform will not work on another platform, even if both platforms use the same architecture. Code is usually packaged in either a Mach-O file or a static library. Mach-O is used for executables, dynamic libraries, bundles, and object files. These can have a variety of different extensions; the only constant is that .o is always used for a Mach-O containing an object file. Use otool and nm to examine a Mach-O file. Use vtool to quickly determine the platform for which it was built. Use size to get a summary of its size. Use dyld_info to get more details about a dynamic library. IMPORTANT All the tools mentioned here are documented in man pages; for information on how to access that documentation, see Reading UNIX Manual Pages. The term Mach-O image refers to a Mach-O that can be loaded and executed without further processing. That includes executables, dynamic libraries, and bundles, but not object files. A dynamic library has the extension .dylib. You may also see this called a shared library. A framework is a bundle structure with the .framework extension that has both compile-time and run-time roles: At compile time, the framework combines the library’s headers and its stub library (stub libraries are explained below). At run time, the framework combines the library’s code, as a Mach-O dynamic library, and its associated resources. The exact structure of a framework varies by platform. For the details, see Placing Content in a Bundle. macOS supports both frameworks and standalone dynamic libraries. Other Apple platforms support frameworks but not standalone dynamic libraries. Historically these two roles were combined, that is, the framework included the headers, the dynamic library, and its resources. These days Apple ships different frameworks for each role. That is, the macOS SDK includes the compile-time framework and macOS itself includes the run-time one. Most third-party frameworks continue to combine these roles. A static library is an archive of one or more object files. It has the extension .a. Use ar, libtool, and ranlib to inspect and manipulate these archives. The static linker, or just the linker, runs at build time. It combines various inputs into a single output. Typically these inputs are object files, static libraries, dynamic libraries, and various configuration items. The output is most commonly a Mach-O image, although it’s also possible to output an object file. The linker may also output metadata, such as a link map (see Using a Link Map to Track Down a Symbol’s Origin). The linker has seen three major implementations: ld — This dates from the dawn of Mac OS X. ld64 — This was a rewrite started in the 2005 timeframe. Eventually it replaced ld completely. If you type ld, you get ld64. ld_prime — This was introduced with Xcode 15. This isn’t a separate tool. Rather, ld now supports the -ld_classic and -ld_new options to select a specific implementation. Note During the Xcode 15 beta cycle these options were -ld64 and -ld_prime. I continue to use those names because the definition of new changes over time (some of us still think of ld64 as the new linker ;–). The dynamic linker loads Mach-O images at runtime. Its path is /usr/lib/dyld, so it’s often referred to as dyld, dyld, or DYLD. Personally I pronounced that dee-lid, but some folks say di-lid and others say dee-why-el-dee. The dynamic linker has seen 4 major revisions. See WWDC 2017 Session 413 (referenced below) for a discussion of versions 1 through 3. Version 4 is basically a merging of versions 2 and 3. The dyld man page is chock-full of useful info, including a discussion of how it finds images at runtime. One of the most common points of confusion with dynamic linker is the way that the dynamic linker identifies dynamic libraries. There are two standard approaches to this, as described in Dynamic Library Identification. Xcode 15 introduced the concept of a mergeable library. This a dynamic library with extra metadata that allows the linker to embed it into the output Mach-O image, much like a static library. Mergeable libraries have many benefits. For all the backstory, see WWDC 2023 Session 10268 Meet mergeable libraries. For instructions on how to set this up, see Configuring your project to use mergeable libraries. If you put a mergeable library into a framework structure you get a mergeable framework. Xcode 15 also introduced the concept of a static framework. This is a framework structure where the framework’s dynamic library is replaced by a static library. Note It’s not clear to me whether this offers any benefit over creating a mergeable framework. Earlier versions of Xcode did not have proper static framework support. That didn’t stop folks trying to use them, which caused all sorts of weird build problems. A universal binary is a file that contains multiple architectures for the same platform. Universal binaries always use the universal binary format. Use the file command to learn what architectures are within a universal binary. Use the lipo command to manipulate universal binaries. A universal binary’s architectures are either all in Mach-O format or all in the static library archive format. The latter is called a universal static library. A universal binary has the same extension as its non-universal equivalent. That means a .a file might be a static library or a universal static library. Most tools work on a single architecture within a universal binary. They default to the architecture of the current machine. To override this, pass the architecture in using a command-line option, typically -arch or --arch. An XCFramework is a single document package that includes libraries for any combination of platforms and architectures. It has the extension .xcframework. An XCFramework holds either a framework, a dynamic library, or a static library. All the elements must be the same type. Use xcodebuild to create an XCFramework. For specific instructions, see Xcode Help > Distribute binary frameworks > Create an XCFramework. Historically there was no need to code sign libraries in SDKs. If you shipped an SDK to another developer, they were responsible for re-signing all the code as part of their distribution process. Xcode 15 changes this. You should sign your SDK so that a developer using it can verify this dependency. For more details, see WWDC 2023 Session 10061 Verify app dependencies with digital signatures and Verifying the origin of your XCFrameworks. A stub library is a compact description of the contents of a dynamic library. It has the extension .tbd, which stands for text-based description (TBD). Apple’s SDKs include stub libraries to minimise their size; for the backstory, read this post. Stub libraries currently use YAML format, a fact that’s relevant when you try to interpret linker errors. Use the tapi tool to create and manipulate these files. In this context TAPI stands for a text-based API, an alternative name for TBD. Oh, and on the subject of tapi, I’d be remiss if I didn’t mention tapi-analyze! Mach-O uses a two-level namespace. When a Mach-O image imports a symbol, it references the symbol name and the library where it expects to find that symbol. This improves both performance and reliability but it precludes certain techniques that might work on other platforms. For example, you can’t define a function called printf and expect it to ‘see’ calls from other dynamic libraries because those libraries import the version of printf from libSystem. To help folks who rely on techniques like this, macOS supports a flat namespace compatibility mode. This has numerous sharp edges — for an example, see the posts on this thread — and it’s best to avoid it where you can. If you’re enabling the flat namespace as part of a developer tool, search the ’net for dyld interpose to learn about an alternative technique. WARNING Dynamic linker interposing is not documented as API. While it’s a useful technique for developer tools, do not use it in products you ship to end users. Apple platforms use DWARF. When you compile a file, the compiler puts the debug info into the resulting object file. When you link a set of object files into a executable, dynamic library, or bundle for distribution, the linker does not include this debug info. Rather, debug info is stored in a separate debug symbols document package. This has the extension .dSYM and is created using dsymutil. Use symbols to learn about the symbols in a file. Use dwarfdump to get detailed information about DWARF debug info. Use atos to map an address to its corresponding symbol name. Over the years there have been some really good talks about linking and libraries at WWDC, including: WWDC 2023 Session 10268 Meet mergeable libraries WWDC 2022 Session 110362 Link fast: Improve build and launch times WWDC 2022 Session 110370 Debug Swift debugging with LLDB WWDC 2021 Session 10211 Symbolication: Beyond the basics WWDC 2019 Session 416 Binary Frameworks in Swift — Despite the name, this covers XCFrameworks in depth. WWDC 2018 Session 415 Behind the Scenes of the Xcode Build Process WWDC 2017 Session 413 App Startup Time: Past, Present, and Future WWDC 2016 Session 406 Optimizing App Startup Time Note The older talks are no longer available from Apple, but you may be able to find transcripts out there on the ’net. Historically Apple published a document, Mac OS X ABI Mach-O File Format Reference, or some variant thereof, that acted as the definitive reference to the Mach-O file format. This document is no longer available from Apple. If you’re doing serious work with Mach-O, I recommend that you find an old copy. It’s definitely out of date, but there’s no better place to get a high-level introduction to the concepts. The Mach-O Wikipedia page has a link to an archived version of the document. For the most up-to-date information about Mach-O, see the declarations and doc comments in <mach-o/loader.h>. Revision History 2024-03-02 Updated the discussion of static frameworks to account for Xcode 15 changes. Removed the link to WWDC 2018 Session 415 because it no longer works )-: 2024-03-01 Added the WWDC 2023 session to the list of sessions to make it easier to find. Added a reference to Using a Link Map to Track Down a Symbol’s Origin. Made other minor editorial changes. 2023-09-20 Added a link to Dynamic Library Identification. Updated the names for the static linker implementations (-ld_prime is no more!). Removed the beta epithet from Xcode 15. 2023-06-13 Defined the term Mach-O image. Added sections for both the static and dynamic linkers. Described the two big new features in Xcode 15: mergeable libraries and dependency verification. 2023-06-01 Add a reference to tapi-analyze. 2023-05-29 Added a discussion of the two-level namespace. 2023-04-27 Added a mention of the size tool. 2023-01-23 Explained the compile-time and run-time roles of a framework. Made other minor editorial changes. 2022-11-17 Added an explanation of TAPI. 2022-10-12 Added links to Mach-O documentation. 2022-09-29 Added info about .dSYM files. Added a few more links to WWDC sessions. 2022-09-21 First posted.
Posted
by eskimo.
Last updated
.
Post marked as solved
1 Replies
193 Views
I am currently experiencing a problem with Xcode where I am unable to view the verbose output of the linker, despite having set the -v flag in my build settings. When attempting to build my project, I encounter a "Linker command failed with exit code 1" error, along with a message about "Undefined symbols". The specific issues that arise are: After setting the -v flag for more verbose logging, the expected detailed output is not visible in the Report Navigator within Xcode. When I right-click on the error in the Issue Navigator and select "Reveal in Log," there is no response from Xcode and the log does not appear. Troubleshooting steps I've taken so far: Ensured that the -v flag is correctly set in the "Other Linker Flags" section of my build settings. Tried cleaning the build folder and deleting Derived Data. Attempted to manually expand the error in the Report Navigator to access the detailed logs without success. Restarted Xcode Environment: Xcode version: 15.2 (15C500b) Target device: iPhone 15 Pro (17.2) macOS version: Sonoma 14.0 (23A344) I'm looking for assistance in resolving this issue so that I can access the detailed linker logs and address the "Undefined symbols" error. Any guidance on how to enable verbose output for the linker or alternative methods to retrieve this information would be greatly appreciated.
Posted Last updated
.
Post not yet marked as solved
7 Replies
361 Views
I am using Xcode version 13.0 beta Unity Version 2022.3.8.f1 After solving the semantic errors I am now getting 100 different errors Link UnityFramework (arm64) Showing All Messages Undefined symbol: _objc_msgSend$onDisconnectUpdateChildValues:withCompletionBlock: Undefined symbol: _objc_msgSend$onDisconnectSetValue:andPriority:withCompletionBlock: Undefined symbol: _objc_msgSend$onDisconnectSetValue:withCompletionBlock: Undefined symbol: _objc_msgSend$cancelDisconnectOperationsWithCompletionBlock: Undefined symbol: _objc_msgSend$updateChildValues:withCompletionBlock: Undefined symbol: _objc_msgSend$setValue:andPriority:withCompletionBlock: Undefined symbol: _objc_msgSend$setValue:withCompletionBlock: Undefined symbol: _objc_msgSend$abort Undefined symbol: _objc_msgSend$runTransactionBlock:andCompletionBlock: Undefined symbol: _objc_msgSend$childByAutoId Undefined symbol: _objc_msgSend$child: Undefined symbol: _objc_msgSend$parent Undefined symbol: _objc_msgSend$hasChild: Undefined symbol: _objc_msgSend$hasChildren Undefined symbol: _objc_msgSend$setValue: Undefined symbol: _objc_msgSend$hasChildAtPath: Undefined symbol: _objc_msgSend$key Undefined symbol: _objc_msgSend$children Undefined symbol: _objc_msgSend$childDataByAppendingPath: Undefined symbol: OBJC_CLASS$_FIRDatabase Undefined symbol: _objc_msgSend$setLoggingEnabled: Undefined symbol: _objc_msgSend$setPersistenceEnabled: Undefined symbol: _objc_msgSend$purgeOutstandingWrites Undefined symbol: _objc_msgSend$goOnline Undefined symbol: _objc_msgSend$goOffline Undefined symbol: _objc_msgSend$databaseForApp: Undefined symbol: _objc_msgSend$queryLimitedToLast: Undefined symbol: _objc_msgSend$queryEqualToValue: Undefined symbol: _objc_msgSend$queryEndingAtValue:childKey: Undefined symbol: _objc_msgSend$queryEndingAtValue: Undefined symbol: _objc_msgSend$queryOrderedByValue Undefined symbol: _objc_msgSend$queryOrderedByKey Undefined symbol: _objc_msgSend$keepSynced: Undefined symbol: _objc_msgSend$childListener Undefined symbol: _objc_msgSend$observeEventType:withBlock:withCancelBlock: Undefined symbol: _objc_msgSend$addObserverHandle: Undefined symbol: _objc_msgSend$databaseForApp:URL: Undefined symbol: _objc_msgSend$databaseInternal Undefined symbol: _objc_msgSend$valueListener Undefined symbol: _objc_msgSend$initWithDatabase:andQuery:andValueListener:andChildListener: Undefined symbol: _objc_msgSend$setValueListener: Undefined symbol: _objc_msgSend$removeAllObservers Undefined symbol: _objc_msgSend$state Undefined symbol: _objc_msgSend$bannerClient Undefined symbol: _objc_msgSend$removeAllObjects Undefined symbol: _objc_msgSend$lock Undefined symbol: _objc_msgSend$unlock Undefined symbol: _objc_msgSend$initWithFormat: Undefined symbol: _objc_msgSend$setValue:forKey: Undefined symbol: _objc_msgSend$numberWithBool: Undefined symbol: _objc_msgSend$testDeviceIdentifiers Undefined symbol: _objc_msgSend$initWithCapacity: Undefined symbol: _objc_msgSend$bytes Undefined symbol: _objc_msgSend$setAppEventCallback: Undefined symbol: _objc_msgSend$objCType Undefined symbol: _objc_msgSend$initWithBannerClientReference:adUnitID:adSize:adPosition: Undefined symbol: _objc_msgSend$initWithGoogleAppID:GCMSenderID: Undefined symbol: _objc_msgSend$isAnonymous Undefined symbol: _objc_msgSend$presentFromRootViewController:userDidEarnRewardHandler: Undefined symbol: _objc_msgSend$metadata Undefined symbol: _objc_msgSend$creationDate Undefined symbol: _objc_msgSend$willPresentCallback Undefined symbol: _objc_msgSend$isEmailVerified Undefined symbol: _objc_msgSend$setPaidEventCallback: Undefined symbol: _objc_msgSend$timeIntervalSince1970 Undefined symbol: OBJC_CLASS$_GADRequest Undefined symbol: _objc_msgSend$reloadWithCompletion: Undefined symbol: _objc_msgSend$profileChangeRequest Undefined symbol: _objc_msgSend$setDisplayName: Undefined symbol: _objc_msgSend$absoluteString Undefined symbol: _objc_msgSend$presentFromViewController:completionHandler: Undefined symbol: _objc_msgSend$sendEmailVerificationWithCompletion: Undefined symbol: _objc_msgSend$objectAtIndexedSubscript: Undefined symbol: _objc_msgSend$URLWithString: Undefined symbol: _objc_msgSend$phoneNumber Undefined symbol: _objc_msgSend$photoURL Undefined symbol: _objc_msgSend$displayName Undefined symbol: _objc_msgSend$removeBannerView Undefined symbol: _objc_msgSend$setProjectID: Undefined symbol: _objc_msgSend$email Undefined symbol: _objc_msgSend$stringByAddingPercentEscapesUsingEncoding: Undefined symbol: _objc_msgSend$providerData Undefined symbol: _objc_msgSend$getIDTokenForcingRefresh:completion: Undefined symbol: OBJC_CLASS$_FIRAuth Undefined symbol: _objc_msgSend$adDidDismissFullScreenContentCallback Undefined symbol: _objc_msgSend$signOut: Undefined symbol: _objc_msgSend$signInWithEmail:password:completion: Undefined symbol: _objc_msgSend$tagForChildDirectedTreatment Undefined symbol: _objc_msgSend$signInWithCredential:completion: Undefined symbol: _objc_msgSend$adPosition Undefined symbol: _objc_msgSend$setAPIKey: Undefined symbol: _objc_msgSend$signInWithCustomToken:completion: Undefined symbol: _objc_msgSend$initWithDomain:code:userInfo: Undefined symbol: _objc_msgSend$UTF8String Undefined symbol: _objc_msgSend$providerWithProviderID:auth: Undefined symbol: _objc_msgSend$user Undefined symbol: _objc_msgSend$interstitialAdGAM Undefined symbol: _objc_msgSend$linkWithCredential:completion: Undefined symbol: _objc_msgSend$providerID Undefined symbol: _objc_msgSend$username You can check the image.
Posted Last updated
.
Post not yet marked as solved
3 Replies
204 Views
Recently Apple deprecated the NXFindBestFatArch, used to find the most compatible / appropriate slice in a universal/fat binary. However its replacement macho_best_slice is broken and will return EBADARCH for any non-Apple binary 😓 The issue seems to be that the dyld3::GradedArchs::grade method does not take into the account the nuances of the CPU sub types of type *_ALL. Namely that any CPU with a more specific sub type (e.g. CPU_SUBTYPE_ARM64E) can also still execute code compiled with a CPU sub type of *_ALL (e.g. CPU_SUBTYPE_ARM64_ALL). All the details (+code, +debugging, +disassembly) posted at: https://objective-see.org/blog/blog_0x80.html. Also, hrmm!?:
Posted Last updated
.
Post not yet marked as solved
0 Replies
173 Views
I am recently migrated from android to Apple Store. Trying to publish my first Unity Game but this error pop up. Would be great if anyone could help. I think this bug belongs to Admob on Unity Game. Showing All Messages Undefined symbol: OBJC_CLASS$_GAMRequest Undefined symbol: _objc_msgSend$setCustomTargeting: Undefined symbol: _objc_msgSend$categoryExclusions Undefined symbol: OBJC_CLASS$_GAMInterstitialAd Undefined symbol: _objc_msgSend$interstitialAdGAM Undefined symbol: OBJC_CLASS$_GADRewardedInterstitialAd Undefined symbol: _objc_msgSend$setRewardedInterstitialAd: Undefined symbol: _objc_msgSend$didEarnRewardCallback Undefined symbol: _objc_msgSend$presentFromRootViewController:userDidEarnRewardHandler: Undefined symbol: _objc_msgSend$setRewardedAd: Undefined symbol: OBJC_CLASS$_GADRequest Undefined symbol: _objc_msgSend$setKeywords: Undefined symbol: _objc_msgSend$requestAgent Undefined symbol: _objc_msgSend$registerAdNetworkExtras: Undefined symbol: _objc_msgSend$extras Undefined symbol: _objc_msgSend$stringWithFormat: Undefined symbol: _objc_msgSend$objectForKey: Undefined symbol: OBJC_CLASS$_GADInterstitialAd Undefined symbol: _objc_msgSend$interstitialAd Undefined symbol: _objc_msgSend$loadWithAdUnitID:request:completionHandler: Undefined symbol: OBJC_CLASS$_UMPDebugSettings Undefined symbol: OBJC_CLASS$_UMPRequestParameters Undefined symbol: _objc_msgSend$debugSettings Undefined symbol: OBJC_CLASS$_UMPConsentInformation Undefined symbol: OBJC_CLASS$_GADExtras Undefined symbol: _objc_msgSend$countByEnumeratingWithState:objects:count: Undefined symbol: _objc_msgSend$presentFromViewController:completionHandler: Undefined symbol: _objc_msgSend$loadWithCompletionHandler: Undefined symbol: _objc_msgSend$adClickedCallback Undefined symbol: _objc_msgSend$adFailedCallback Undefined symbol: _objc_msgSend$description Undefined symbol: _objc_msgSend$currencyCode Undefined symbol: _objc_msgSend$customAdPosition Undefined symbol: _kGADAdSizeSmartBannerPortrait Undefined symbol: _objc_msgSend$frame Undefined symbol: _objc_msgSend$bannerView Undefined symbol: _objc_msgSend$bannerClient Undefined symbol: _objc_msgSend$adaptiveAdSizeForWidth:orientation: Undefined symbol: _objc_msgSend$adSizeForWidth:height: Undefined symbol: _objc_msgSend$interstitialClient Undefined symbol: _objc_msgSend$initWithBannerClientReference:adUnitID:adSize:adPosition: Undefined symbol: _objc_msgSend$setAppEventDelegate: Undefined symbol: _objc_msgSend$adWillPresentFullScreenContentCallback Undefined symbol: _objc_msgSend$adDidDismissFullScreenContentCallback Undefined symbol: _objc_msgSend$setAdFailedToLoadCallback: Undefined symbol: _objc_msgSend$presentFromRootViewController: Undefined symbol: _objc_msgSend$adFailedToPresentFullScreenContentCallback Undefined symbol: _objc_msgSend$adFailedToLoadCallback Undefined symbol: _objc_msgSend$paidEventCallback Undefined symbol: _objc_msgSend$allKeys Undefined symbol: OBJC_CLASS$_GADAppOpenAd Undefined symbol: _objc_msgSend$cStringUsingEncoding: Undefined symbol: _objc_msgSend$setAppOpenAd: Undefined symbol: _objc_msgSend$setInterstitialAdGAM: Undefined symbol: _objc_msgSend$request Undefined symbol: _objc_msgSend$setFullScreenContentDelegate: Undefined symbol: _objc_msgSend$adReceivedCallback Undefined symbol: _objc_msgSend$testDeviceIdentifiers Undefined symbol: _objc_msgSend$appOpenAd Undefined symbol: _objc_msgSend$setPaidEventHandler: Undefined symbol: _objc_msgSend$setDelegate: Undefined symbol: _objc_msgSend$appOpenAdClient Undefined symbol: _objc_msgSend$rewardedInterstitialAdClient Undefined symbol: _objc_msgSend$didDismissCallback Undefined symbol: _objc_msgSend$loadWithAdUnitID:request:orientation:completionHandler: Undefined symbol: OBJC_CLASS$_GADBannerView Undefined symbol: _GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth Undefined symbol: _GADPortraitAnchoredAdaptiveBannerAdSizeWithWidth Undefined symbol: _objc_msgSend$show Undefined symbol: _objc_msgSend$adDidRecordImpressionCallback Undefined symbol: _objc_msgSend$window Undefined symbol: _GADLandscapeAnchoredAdaptiveBannerAdSizeWithWidth Undefined symbol: _objc_msgSend$setCustomTargetingWithKey:value: Undefined symbol: _GADAdSizeFullWidthPortraitWithHeight Undefined symbol: _objc_msgSend$positionView:inParentView:customPosition: Undefined symbol: _objc_msgSend$setCenter: Undefined symbol: _kGADAdSizeSmartBannerLandscape Undefined symbol: _GADAdSizeEqualToSize Undefined symbol: _CGSizeFromGADAdSize Undefined symbol: _objc_msgSend$isOperatingSystemAtLeastVersion: Undefined symbol: _objc_msgSend$safeAreaLayoutGuide Undefined symbol: _objc_msgSend$positionBannerView Undefined symbol: _objc_msgSend$loadFormWithCompletionHandler: Undefined symbol: _objc_msgSend$initWithConsentFormClientReference: Undefined symbol: _objc_msgSend$setObject:forKey: Undefined symbol: _objc_msgSend$willPresentCallback Undefined symbol: _objc_msgSend$reset Undefined symbol: _objc_msgSend$isConsentFormAvailable Undefined symbol: _objc_msgSend$requestConsentInfoUpdateWithParameters:completionHandler: Undefined symbol: _objc_msgSend$setDebugSettings: Undefined symbol: _objc_msgSend$adReward Undefined symbol: _GADAdSizeFromCGSize Undefined symbol: OBJC_CLASS$_GADServerSideVerificationOptions Undefined symbol: _objc_msgSend$code Undefined symbol: OBJC_CLASS$_GADMobileAds Undefined symbol: _objc_msgSend$adUnitMapping Undefined symbol: _objc_msgSend$adSourceID Undefined symbol: _objc_msgSend$value Undefined symbol: _GADErrorUserInfoKeyResponseInfo Undefined symbol: _objc_msgSend$localizedDescription
Posted Last updated
.