기록

[GPT가 알려주는] X86 vs Arm64 본문

잡동사니/GPT가 알려주는

[GPT가 알려주는] X86 vs Arm64

heylo 2025. 12. 4. 15:57

요거 딱 정리해보면:

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)

그래서:

  1. 빌드 시스템은 항상 “두 세상”을 함께 다룸
    • host(x86_64)용 도구들
    • target(arm64)용 바이너리들
  2. Android.bp에서 prebuit .so 집어넣을 때,
    • 이 .so가 arm64용인지 x86_64용인지 꼭 확인해야 함
    • TARGET에 넣는 라이브러리는 반드시 arm64용이어야 하고,
    • 호스트에서 돌아가는 툴이면 x86_64용이어야 함.
  3. libfastdds 관련해서도,
    • arm64 타깃에 올릴거면 arm64 빌드된 fastdds .so 필요
    • x86 PC에서 실행하는 샘플/툴이면 x86_64 fastdds .so가 따로 필요

혹시

  • “그럼 지금 내가 가지고 있는 libfastdds.so가 x86인지 arm인지 어떻게 확인해?”
  • “Android.bp에서 host/target 구분은 어떻게 해?”

이런 거 궁금하면, 실제 파일/스니펫 보여주면 거기 맞춰서 딱 짚어줄게.