기록
[GPT가 알려주는] X86 vs Arm64 본문
요거 딱 정리해보면:
x86 = PC/노트북 CPU용 명령어셋
arm64 = ARM 계열 64비트(=AArch64) 모바일/임베디드 CPU용 명령어셋
이라서, CPU 종류 자체가 다르고, 그 위에서 돌아가는 바이너리도 서로 안 맞는다가 핵심이에요.
1. 어디서 쓰는 애들인지
- x86 / x86_64
- 인텔, AMD 데스크탑/노트북/서버 CPU
- 예: i5, i7, Ryzen 등
- Windows, 대부분의 리눅스 PC, 서버
- arm64 (ARMv8 AArch64)
- 스마트폰, 태블릿, 임베디드 보드, SoC
- 예: 스마트폰 AP, 라즈베리파이 3/4, Telechips TCC8070 같은 IVI용 SoC
- Android, 임베디드 리눅스, 일부 ARM 서버
→ 같은 Linux여도 CPU가 다르면 실행 파일(.so, ELF)이 호환 안 됨.
2. 내부 구조/철학 차이 (간단 버전)
x86 (CISC 계열)
- CISC(Complex Instruction Set Computer)
- 한 명령어가 하는 일이 많고, 명령어 길이도 가변적
- 레거시가 엄청 많아서 구조가 복잡함
- 대신 PC/서버용으로 최적화가 많이 되어 있음
arm64 (RISC 계열)
- RISC(Reduced Instruction Set Computer)
- 명령어가 비교적 단순, 길이 거의 일정
- 전력 소모 적게, 효율 좋게 설계 → 모바일/임베디드에 유리
- 레지스터도 64비트짜리 31개 등 넉넉하게 제공
3. 개발/빌드할 때 체감되는 차이
1) 바이너리 호환성
- x86에서 컴파일한 실행파일/라이브러리(.so)
→ arm64 보드에서 그대로 실행 불가 - arm64용으로 빌드한 .so
→ x86 PC에서 그대로 실행 불가
안드로이드 빌드 로그에서 자주 보이는 것처럼:
TARGET_ARCH=arm64
HOST_ARCH=x86_64
- HOST: 빌드하는 PC (대부분 x86_64 Linux)
- TARGET: 실제 돌아갈 기기 (arm64 SoC)
그래서:
- 빌드시 host용 툴(프로그램)은 x86_64로 컴파일,
- target용 라이브러리/실행파일은 arm64로 크로스 컴파일.
2) NDK / .so 쓸 때
안드로이드나 리눅스에서 .so 가져다 쓸 때:
- libfastdds.so가 만약 x86_64용이면
- file libfastdds.so 해보면 ELF 64-bit LSB shared object, x86-64 이런 식으로 나옴
- arm64 타깃에서 링크/실행하려고 하면:
- wrong ELF class: ELFCLASS64 또는
- Exec format error 같은 오류 뜸
그래서:
- target이 arm64면 arm64용 libfastdds.so가 필요
- host 툴로 쓸 거면 (PC에서 실행) x86_64용이 필요
동일 라이브러리라도 아키텍처별로 따로 들고 있어야 한다는 게 포인트.
3) 어셈블리/최적화 레벨
- x86 최적화 코드 (SSE, AVX 등)
→ arm64에서 그대로 못 씀, arm NEON 등으로 다시 짜야 함. - 반대로 arm64 NEON 최적화 코드 → x86에서 그대로 못 씀.
보통 C/C++ 상위 레벨로만 짜면 큰 차이 없이 돌아가는데,
플랫폼별로 어셈블리/최적화/인라인 asm 섞여 있으면 포팅 시 이 부분을 다 손봐야 함.
4. joo 상황에 딱 맞게 요약
지금 joo 로그에 자주 나오는 구조:
HOST_OS=linux
TARGET_ARCH=arm64
TARGET_CPU_VARIANT=cortex-a76
- 빌드 머신: x86_64 Linux PC
- 실제 보드: ARM64 (Cortex-A76 코어 포함된 TCC8070 SoC)
그래서:
- 빌드 시스템은 항상 “두 세상”을 함께 다룸
- host(x86_64)용 도구들
- target(arm64)용 바이너리들
- Android.bp에서 prebuit .so 집어넣을 때,
- 이 .so가 arm64용인지 x86_64용인지 꼭 확인해야 함
- TARGET에 넣는 라이브러리는 반드시 arm64용이어야 하고,
- 호스트에서 돌아가는 툴이면 x86_64용이어야 함.
- libfastdds 관련해서도,
- arm64 타깃에 올릴거면 arm64 빌드된 fastdds .so 필요
- x86 PC에서 실행하는 샘플/툴이면 x86_64 fastdds .so가 따로 필요
혹시
- “그럼 지금 내가 가지고 있는 libfastdds.so가 x86인지 arm인지 어떻게 확인해?”
- “Android.bp에서 host/target 구분은 어떻게 해?”
이런 거 궁금하면, 실제 파일/스니펫 보여주면 거기 맞춰서 딱 짚어줄게.
'잡동사니 > GPT가 알려주는' 카테고리의 다른 글
| [GPT가 알려주는] JniLib란? (0) | 2025.12.05 |
|---|---|
| [GPT가 알려주는] service & system 구조 파악 (dds 포팅 시도 중) (1) | 2025.12.05 |
| [GPT가 알려주는] AIDL과 HIDL (0) | 2025.12.04 |
| [GPT가 알려주는] AOSP랑 Soong (0) | 2025.11.27 |
| [GPT가 알려주는] 서버 확인 명령어 (lsb_release -a) (0) | 2025.11.26 |