Reference: For ARM64 architecture details, see
../references/arm_architecture.md. For cross-compilation setup, seecross_compilation.md.
QEMU user-mode emulation allows running ARM64 binaries on x86-64 systems. Proper execution requires understanding static vs dynamic linking and library paths.
Advantages:
- No library dependencies
- Works directly with QEMU (no
-Lflag needed) - Portable - can run on any system with QEMU
- Simpler execution
Compilation:
aarch64-linux-gnu-gcc -nostdlib -static -o program program.sExecution:
qemu-aarch64 ./programVerification:
file program
# Should show: "statically linked"Requirements:
- ARM64 library path must be available
- Requires
-Lflag with QEMU or binfmt support - More complex setup
Compilation:
aarch64-linux-gnu-gcc -nostdlib -o program program.s
# Note: Without -static flagExecution Options:
qemu-aarch64 -L /usr/aarch64-linux-gnu ./program# Install binfmt support (automatic library resolution)
sudo apt-get install qemu-user-binfmt
qemu-aarch64 ./programCause: Dynamic binary can't find ARM64 libraries
Solutions:
-
Recompile with static linking (recommended):
aarch64-linux-gnu-gcc -nostdlib -static -o program program.s qemu-aarch64 ./program
-
Use -L flag with library path:
qemu-aarch64 -L /usr/aarch64-linux-gnu ./program
-
Install binfmt support:
sudo apt-get install qemu-user-binfmt qemu-aarch64 ./program
Cause: Binary format mismatch or missing interpreter
Solutions:
-
Verify binary format:
file program readelf -h program | grep Machine # Should show: "ARM aarch64"
-
Use static linking:
aarch64-linux-gnu-gcc -nostdlib -static -o program program.s
-
Check QEMU installation:
qemu-aarch64 --version
Cause: Dynamic library not found in library path
Solutions:
-
Find ARM64 library path:
dpkg -L libc6-dev-arm64-cross | grep libc.so -
Use correct library path:
qemu-aarch64 -L /usr/aarch64-linux-gnu ./program
-
Install missing libraries:
sudo apt-get install libc6-dev-arm64-cross
# Debian/Ubuntu
/usr/aarch64-linux-gnu/
/usr/lib/aarch64-linux-gnu/
# Arch Linux
/usr/aarch64-linux-gnu/
/usr/lib/aarch64-linux-gnu/
# Find installed paths
# Debian/Ubuntu:
dpkg -L libc6-dev-arm64-cross | grep -E "libc\.so|ld-linux"
# Arch Linux:
pacman -Ql aarch64-linux-gnu-glibc | grep -E "libc\.so|ld-linux"Note: All project Makefiles auto-detect library paths for your distribution.
# Check if path exists
ls -la /usr/aarch64-linux-gnu/lib/
# Check for libc
ls -la /usr/aarch64-linux-gnu/lib/libc.so*-
Use static linking for standalone programs
- Simplifies execution
- No library path issues
- More portable
-
Verify binary type before execution
file program
-
Test with simple program first
echo 'int main(){return 0;}' > test.c aarch64-linux-gnu-gcc -static test.c -o test qemu-aarch64 ./test
-
Use binfmt for development (if needed)
- Automatic library resolution
- Transparent execution
qemu-aarch64 -g 1234 ./program &
gdb-multiarch ./program
(gdb) target remote :1234qemu-aarch64 -g 1234 -L /usr/aarch64-linux-gnu ./program &
gdb-multiarch ./program
(gdb) target remote :1234- QEMU User Mode Emulation Documentation
../references/arm_architecture.md- ARM64 architecturecross_compilation.md- Cross-compilation guide