3.4 KiB
ARM64 Cross-Compilation Implementation Summary
What Was Implemented
✅ Complete ARM64 static linking support for nostr_core_lib with secp256k1 bundled internally.
Key Changes Made
1. Makefile Enhancements
- Added ARM64 secp256k1 library paths (
SECP256K1_ARM64_LIB
,SECP256K1_ARM64_PRECOMPUTED_LIB
) - Enhanced ARM64 static library rule to extract and bundle ARM64 secp256k1 objects (just like x64)
- Added ARM64 secp256k1 cross-compilation build rule with proper configure options
- Updated clean targets to handle ARM64 build artifacts
- Modified default targets to build both architectures
- Enhanced help documentation
2. Build Script Updates
- Updated
build.sh
to build both x64 and ARM64 by default - Added architecture-specific targets (
x64
,arm64
,x64-only
,arm64-only
) - Enhanced status reporting for dual-architecture builds
- Updated help and usage information
Final Results
Build Targets Available
./build.sh # Builds both x64 and ARM64 (default)
./build.sh x64 # Builds x64 only
./build.sh arm64 # Builds ARM64 only
./build.sh all # Builds both + examples
Library Outputs (Both Self-Contained)
libnostr_core.a
(2,431,120 bytes) - x86_64 with bundled secp256k1libnostr_core_arm64.a
(2,451,440 bytes) - ARM64 with bundled secp256k1
User Experience
x64 systems:
gcc their_program.c -L. -lnostr_core -lm
ARM64 systems:
gcc their_program.c -L. -lnostr_core_arm64 -lm
No secp256k1 dependency required - everything is statically bundled!
Technical Implementation Details
Cross-Compilation Process
- Clean secp256k1 source - Runs
make distclean
to clear previous builds - ARM64 configure - Cross-compiles secp256k1 with ARM64 toolchain
- Object extraction - Extracts ARM64 secp256k1 objects from built libraries
- Bundle creation - Combines your ARM64 objects + secp256k1 ARM64 objects
- x64 restoration - Restores x64 secp256k1 build for future x64 builds
Static Linking Verification
Both libraries are "fat" libraries containing:
- Your nostr_core code (compiled for target architecture)
- Complete secp256k1 implementation (compiled for target architecture)
- All cryptographic dependencies bundled internally
Answer to Original Question
"If another program calls a nostr_core_lib function, they shouldn't have to deal with secp256k1, since we statically linked it correct?"
YES! Absolutely correct.
Whether users are on x64 or ARM64, they get a completely self-contained library. They only need:
- Your library file (
libnostr_core.a
orlibnostr_core_arm64.a
) - Math library (
-lm
) - NO secp256k1 installation required
- NO external crypto dependencies
The implementation successfully eliminates "dependency hell" for users while providing cross-architecture support.
Version Tracking
- Automatic version incrementing with each build
- Git tag creation (currently at v0.1.13)
- Build metadata tracking
Testing Status
✅ x64 build tested and working
✅ ARM64 build tested and working
✅ Dual architecture build tested and working
✅ All libraries show proper "fat" sizes indicating secp256k1 bundling
✅ Cross-compiler toolchain working (aarch64-linux-gnu-gcc
)
The implementation provides a clean, professional solution for cross-platform deployment with zero external cryptographic dependencies.