본문 바로가기
정글/C언어

AArch64, ARM64 시스템에서 32비트 애플리케이션 컴파일하기

by 위대한초밥V 2023. 5. 17.

지난번에는 MacOS에서 Docker를 이용해 Ubuntu 개발 환경을 설치하였다.
Malloc 과제를 하기위해서는 32비트로 컴파일하는 것이 필요하다.
현재 사용하고 있는 환경은 AArch64 혹은 ARM64 비트 아키텍처로 64비트 환경이다.

 

 

잠깐만👋
AArch64는 아키텍처 개발사인 ARM Holdings의 공식 표현으로, ARM과 개발자들은 AArch64라고 부른다. 다만 Apple, Microsoft와 같은 기업 집단은 ARM64라고 표기한다.
원활한 환경 구축을 위해 자신의 개발 환경과 CPU 아키텍처에 대한 기본 개념을 아는 것이 도움되었다. 읽어보면 좋을 글을 함께 공유한다.
https://velog.io/@480/이제는-개발자도-CPU-아키텍처를-구분해야-합니다
 

이제는 개발자도 CPU 아키텍처를 구분해야 합니다.

Intel 천지였던 PC 분야에 ARM이 광풍을 불기 시작한지 얼마 되지 않았습니다.이에 개발자도 변화를 감지 하고 대응하기 위해 알아야 할 것들을 정리 했습니다.그동안 암묵적으로 대부분의 서버 환

velog.io

 

 

 

 

aarch64 시스템에서 32비트 애플리케이션을 컴파일하려면 32비트 cross-compiler 설치가 필요하다.

 

환경 설정

1. 32비트 라이브러리 설치

aarch64 시스템에서 32비트 애플리케이션을 실행하기 위해 32비트 라이브러리를 설치한다.

 sudo dpkg --add-architecture armhf
 sudo apt-get update
 sudo apt-get install libc6:armhf libncurses5:armhf libstdc++6:armhf

 

 

2. cross-compiler 설치

32비트 애플리케이션 컴파일을 위해 32비트 cross-compiler를 설치한다.

 sudo apt-get install gcc-arm-linux-gnueabihf

 

 

3. 컴파일하기

과제에서는 Makefile을 다음과 같이 수정했다.

 

수정 전

 CC = gcc
 CFLAGS = -Wall -O2 -m32

수정 후

CC = arm-linux-gnueabihf-gcc
CFLAGS = -Wall -O2 -mbe32

 

getopt 반환 값 수정

getopt 함수를 사용하는, mdriver.c 파일을 살펴보자.

/* 
* Read and interpret the command line arguments 
*/
while ((c = getopt(argc, argv, "f:t:hvVgal")) != -1) {
    switch (c) {
case 'g': /* Generate summary info for the autograder */
    autograder = 1;
    break;
  case 'f': /* Use one specific trace file only (relative to curr dir) */
  ...

이 코드는 입력받은 옵션에 따라 옵션을 실행하는 코드로 일치하지 않은 값을 입력하면 반복문을 빠져나간다.

getopt 함수에 대해 간략하게 소개하자면 문자열을 파싱하여 옵션을 구분하는데 사용하는 함수이다. 정확한 값이 입력되지 않으면 -1을 반환한다.

 

그런데…

 

계속 해당 반복문을 통과하지 못해 확인해보니 -1을 반환해야하는 상황에 255를 반환하고 있었다.

-1을 255로 수정하니 이후 잘 동작하였다.

확인해보니 시스템 자체가 문자를 반환하도록 설정되어있을지도 모른다고 한다. 이때 getopt()가 -1을 변환하면 255로 변환되어 저장되므로 문제가 발생한다. 이 부분이 왜 환경과 관련있을지 완벽하게 이해되지 않지만 일단 넘어간다.

C - Why does getopt return 255 on linux?

 

C - Why does getopt return 255 on linux?

I've been fooling around with getopt (from unistd.h) recently. I wrote some code that worked fine under Windows 7 compiled with gcc from MinGW, while not working under Raspbian Linux on my Raspberr...

stackoverflow.com

 

이 부분까지 완료되면 이제 64비트에서 32비트를 컴파일 할 수 있다.

2주 연속 환경 구축에 시간을 많이 투자했지만, 구축 과정에서 배울 점(ex. 도커, 컴파일러, make 등)도 많은 즐거운 시간이었다.

반응형