-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Description
Description
Building a React Native iOS app with Firebase Firestore results in 50+ undefined symbol errors for absl::lts_20240722::* functions. The symbols exist in the abseil library (verified with nm), but are not being resolved by the linker despite using -force_load.
Critical Finding: Symbols ARE present in the archive, but -force_load is not loading all archive members. Some abseil symbols ARE resolved (e.g., Mutex::Mutex()), but many others are not (e.g., CHexEscape, FormatTime, SimpleAtod, etc.).
Environment History
React Native Versions Tested
- Started with: React Native 0.74.5 (original issue)
- Upgraded to: React Native 0.76.5 (issue persists)
- Rationale for upgrade: Attempted to resolve compatibility issues, but did not fix the abseil linking problem
Xcode Versions Tested
- Xcode 26.2 (Build 17C52) - Issue present
- Xcode 16.4 - Issue persists, additionally had
glogbuild problems - Current: Xcode 26.2
Current Environment
- React Native: 0.76.5
- Firebase iOS SDK: 12.6.0
- abseil: 1.20240722.0
- CocoaPods: 1.16.2 (also tried 1.15.2 - same results)
- xcodeproj gem: 1.27.0
- Platform: iOS Simulator (arm64)
- Linkage Mode: Static libraries (not frameworks)
Error Messages
Undefined symbols for architecture arm64:
"absl::lts_20240722::CHexEscape(std::__1::basic_string_view<char, std::__1::char_traits<char>>)"
"absl::lts_20240722::FormatTime(std::__1::basic_string_view<char, std::__1::char_traits<char>>, absl::lts_20240722::Time, absl::lts_20240722::TimeZone)"
"absl::lts_20240722::SimpleAtod(std::__1::basic_string_view<char, std::__1::char_traits<char>>, double*)"
"absl::lts_20240722::SimpleAtof(std::__1::basic_string_view<char, std::__1::char_traits<char>>, float*)"
"absl::lts_20240722::Base64Escape(...)"
... (50+ more similar errors)
Verification: Symbols Exist in Archive ✅
Confirmed with nm command:
nm libabseil.a | grep CHexEscape
# Output: 0000000000000684 T __ZN4absl12lts_20240722CHexEscapeENS0_11string_viewE
nm libabseil.a | grep FormatTime
# Output: 0000000000000000 T __ZN4absl12lts_2024072210FormatTimeENS0_11string_viewENS0_4TimeENS0_8TimeZoneEArchive Details:
- Archive exists at:
${PODS_CONFIGURATION_BUILD_DIR}/abseil/libabseil.a - Architecture: Universal binary (arm64 + x86_64) ✅
- Symbols present: Verified with
nm✅ - Some symbols DO resolve:
Mutex::Mutex(),Notification::WaitForNotification()✅ - Many symbols DO NOT resolve:
CHexEscape,FormatTime,SimpleAtod, etc. ❌
Linker Command Observation:
-Wl,-force_load,${PODS_CONFIGURATION_BUILD_DIR}/abseil/libabseil.ais present ✅- Flag is positioned BEFORE
$(inherited)✅ - Archive path resolves correctly ✅
- BUT: Symbols still not resolved ❌
Comprehensive List of Attempted Fixes
1. Firebase Recommended Workaround ✅ Applied
- Action: Set
CLANG_CXX_LANGUAGE_STANDARD = 'gnu++14'for abseil target - Location: Applied at the very end of Podfile
post_installhook - Result: ❌ Did not resolve the issue
- Verification: Confirmed workaround is applied (shown in
pod installoutput)
2. CocoaPods Version Changes ✅ Tested
- Versions tried: CocoaPods 1.16.2 (latest) and 1.15.2 (older)
- Result: ❌ Both versions produce identical errors
- xcodeproj gem: 1.27.0 (required for CocoaPods 1.16+)
3. Xcode Version Changes ✅ Tested
- Xcode 26.2: Issue present
- Xcode 16.4: Same errors, plus
glogbuild issues - Result: ❌ Xcode version is not the root cause
4. React Native Version Upgrade ✅ Tested
- Started: React Native 0.74.5
- Upgraded to: React Native 0.76.5 (hoping to fix compatibility issues)
- Result: ❌ Issue persists on both versions
5. Linker Flag Approaches ✅ Multiple Attempts
A. Added -force_load to intermediate targets
- Action: Added
-Wl,-force_loadfor abseil to gRPC-Core, FirebaseFirestoreInternal, gRPC-C++ targets - Result: ❌ Symbols still undefined
B. Added -force_load to main app target
- Action: Added
-Wl,-force_load,${PODS_CONFIGURATION_BUILD_DIR}/abseil/libabseil.ato ResponderMapNew target's OTHER_LDFLAGS - Position: BEFORE
$(inherited)to ensure early processing - Result: ❌ Symbols still undefined
C. Tried -all_load flag
- Action: Attempted
-Wl,-all_loadinstead of-force_load - Result: ❌ Same errors, also causes issues with other libraries
D. Verified flag position in linker command
- Action: Confirmed
-force_loadappears before other libraries in actual linker command - Result: ✅ Flag is correctly positioned, but still not working
6. Abseil Build Configuration ✅ Applied
All of the following settings are applied to the abseil target in Podfile post_install:
config.build_settings['MACH_O_TYPE'] = 'staticlib'
config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
config.build_settings['GCC_GENERATE_DEBUGGING_SYMBOLS'] = 'YES'
config.build_settings['SKIP_INSTALL'] = 'NO'
config.build_settings['ARCHS'] = 'arm64 x86_64'
config.build_settings['DEAD_CODE_STRIPPING'] = 'NO'
config.build_settings['SYMBOLS_HIDDEN_BY_DEFAULT'] = 'NO'
config.build_settings['CLANG_CXX_LANGUAGE_STANDARD'] = 'gnu++14' # Firebase workaround- Result: ❌ Issue persists with all these settings
7. Target Dependencies ✅ Applied
- Action: Added abseil as explicit target dependency for ResponderMapNew
- Result: ❌ Does not resolve the linking issue
8. Clean Builds ✅ Performed Multiple Times
- Actions:
- Cleaned DerivedData multiple times
- Removed Pods directory and reinstalled
- Clean Build Folder in Xcode
- Rebuilt from scratch
- Result: ❌ Issue persists after every clean build
9. Module Map Fixes ✅ Applied
- Action: Fixed gRPC-Core.modulemap path issues (common Firebase/React Native issue)
- Location: Created modulemap and added pre-compile script
- Result: ✅ Module map issues resolved, but abseil linking issue persists
10. React Native Upgrade Related Fixes ✅ Applied
- Action: Applied fixes for React Native 0.76.5:
- Global
use_modular_headers!for Firebase Swift pods - gRPC-Core.modulemap creation and pre-compile script
- Fixed react-native-maps EventEmitterCallbackWrapper access (separate issue)
- Global
- Result: ✅ These fixes applied successfully, but abseil linking issue persists
Current Podfile Configuration
Key post_install Hook Sections:
-
Abseil Build Settings:
- Forces static library build
- Disables dead code stripping
- Disables symbol hiding
- Sets C++ standard to
gnu++14 - Builds universal binary
-
Force Load Flag:
abseil_force_load_flag = '-Wl,-force_load,${PODS_CONFIGURATION_BUILD_DIR}/abseil/libabseil.a' # Prepend BEFORE $(inherited) in OTHER_LDFLAGS
-
Target Dependencies:
- Explicitly adds abseil as dependency for ResponderMapNew target
Critical Observations
-
Partial Linking Success:
- Some abseil symbols ARE resolved (e.g.,
Mutex::Mutex()found inlibabseil.a[arm64][82](mutex.o)) - Many abseil symbols are NOT resolved (e.g.,
CHexEscape,FormatTime) - This suggests the archive IS being processed, but not all members are loaded
- Some abseil symbols ARE resolved (e.g.,
-
Symbol Verification:
- Verified with
nmthat missing symbols exist in the archive - Archive is a valid universal binary with both architectures
- Archive path is correct and accessible
- Verified with
-
Linker Behavior:
-force_loadflag is present and correctly positioned- Linker processes the archive (some symbols work)
- But
-force_loadis not forcing ALL archive members to load
-
Consistency Across Versions:
- Issue persists across React Native 0.74.5 and 0.76.5
- Issue persists across Xcode 26.2 and 16.4
- Standard linking fixes have no effect
Hypothesis
The issue appears to be that -force_load is not functioning as expected for the abseil static library. Possible causes:
- Linker Bug: There may be a bug in the linker (ld) that prevents
-force_loadfrom loading all archive members for this specific library - Archive Structure: The abseil archive might have a structure that prevents
-force_loadfrom working correctly - Symbol Visibility: Despite setting
SYMBOLS_HIDDEN_BY_DEFAULT = NO, symbols might still have hidden visibility - Build Toolchain Issue: Combination of React Native, Firebase, abseil, and Xcode might expose a toolchain bug
Additional Context
- Android Build: Works correctly (not affected by this iOS-specific issue)
- Other Libraries: No linking issues with other Firebase or React Native libraries
- Project Complexity: Standard React Native app with Firebase Firestore, Auth, Functions, Messaging
Request for Help
This issue has persisted through:
- Multiple React Native versions (0.74.5 → 0.76.5)
- Multiple Xcode versions (26.2, 16.4)
- Extensive configuration changes
- All standard troubleshooting approaches
Given that:
- Symbols exist in the archive (verified)
-force_loadis correctly configured (verified)- Some symbols ARE resolved (proving the archive is processed)
- Many symbols are NOT resolved (despite being in the archive)
We believe this may be:
- A deeper linker/toolchain issue
- A compatibility problem between React Native, Firebase, abseil, and recent Xcode versions
- A bug that requires upstream fixes
Questions for Firebase/React Native Firebase team:
- Is this a known issue with React Native 0.74.5+ / 0.76.5 and Firebase?
- Are there any workarounds beyond the standard
gnu++14setting? - Is there a different linking approach we should try?
- Should we consider downgrading Firebase iOS SDK versions?
- Are there any pending fixes for abseil linking in upcoming releases?
Files Modified
ios/Podfile- Extensivepost_installhooks for abseil configurationios/Pods/Target Support Files/**/*.xcconfig- Modified to fix module map pathsnode_modules/react-native-maps/ios/generated/RNMapsSpecs/*- Fixed for RN 0.76.5 compatibility
Build Command Output
The linker command includes:
-Wl,-force_load,/path/to/Build/Products/Debug-iphonesimulator/abseil/libabseil.a
Positioned before all other library flags, but symbols still not resolved.
Date: December 23, 2024
Status: Issue unresolved after extensive troubleshooting
Next Steps: Awaiting guidance from Firebase/React Native Firebase support
Reproducing the issue
Reproduction Steps
- Create React Native 0.76.5 project
- Install Firebase:
npm install @react-native-firebase/app @react-native-firebase/firestore - Run
cd ios && pod install - Build in Xcode
- Observe undefined symbol errors for abseil functions
Firebase SDK Version
12.6.0
Xcode Version
26.2
Installation Method
CocoaPods
Firebase Product(s)
All
Targeted Platforms
iOS, macOS
Relevant Log Output
If using Swift Package Manager, the project's Package.resolved
Expand Package.resolved snippet
Replace this line with the contents of your Package.resolved.
If using CocoaPods, the project's Podfile.lock
Expand Podfile.lock snippet
Replace this line with the contents of your Podfile.lock!