Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

64비트 GCC에서 32비트 C/C++ 프로그램 컴파일하는 방법

요즘 배포되는 컴파일러는 대부분 기본적으로 64비트 버전입니다. 하지만 때로는 32비트 시스템에서 코드를 컴파일하고 실행해야 하는 경우가 있습니다. 이럴 때 GCC의 -m32 옵션과 멀티라이브러리(multilib) 기능을 활용하면 됩니다.

1. 현재 GCC 타깃 아키텍처 확인하기

먼저 현재 사용 중인 GCC 컴파일러의 타깃 아키텍처를 확인해야 합니다. 다음 명령어를 입력하면 확인할 수 있습니다.

gcc –v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
...........
...........
...........

출력 결과에서 Target이 x86_64로 표시되므로, 현재 64비트 버전의 GCC를 사용 중임을 알 수 있습니다.

2. -m32 옵션으로 32비트 컴파일하기

32비트 환경을 대상으로 컴파일하려면 다음과 같이 -m32 옵션을 붙여서 실행하면 됩니다.

gcc –m32 program_name.c

그런데 이 명령어를 처음 실행하면 아래와 같은 오류가 발생할 수 있습니다. 이 오류는 GCC의 32비트 표준 라이브러리가 설치되어 있지 않다는 의미이며, 이 경우 해당 패키지를 먼저 설치해야 합니다.

In file included from test_c.c:1:0:
/usr/include/stdio.h:27:10: fatal error: bits/libc-header-start.h: No such file
or directory
#include <bits/libc-header-start.h>
^~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

3. 멀티라이브러리(multilib) 설치하기

GCC의 32비트 표준 라이브러리를 설치하려면 다음 명령어를 실행합니다. C 언어만 사용한다면 gcc-multilib만으로 충분하지만, C++도 함께 사용한다면 g++-multilib도 설치하는 것이 좋습니다.

sudo apt-get install gcc-multilib
sudo apt-get install g++-multilib

4. 32비트와 64비트 실행 결과 비교

설치가 완료되면 아래 예제 코드를 통해 32비트 환경과 64비트 환경에서 실행 결과가 어떻게 달라지는지 확인할 수 있습니다.

예제 코드

#include<stdio.h>
main(){
    printf("The Size is: %lu\n", sizeof(long));
}

64비트 환경 출력 결과

$ gcc test_c.c
test_c.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
main(){
^~~~
$ ./a.out
The Size is: 8

32비트 환경 출력 결과 (-m32 옵션 사용)

$ gcc -m32 test_c.c
test_c.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
main(){
^~~~
test_c.c: In function ‘main’:
test_c.c:4:28: warning: format ‘%lu’ expects argument of type ‘long unsigned
int’, but argument 2 has type ‘unsigned int’ [-Wformat=]
printf("The Size is: %lu\n", sizeof(long));
~~^
%u
$ ./a.out
The Size is: 4

실행 결과를 보면 알 수 있듯이, 64비트 환경에서는 long 타입의 크기가 8바이트로 출력되는 반면, -m32 옵션으로 컴파일한 32비트 환경에서는 4바이트로 출력됩니다. 또한 32비트 환경에서는 데이터 타입 크기가 달라져 %lu 포맷 지정자 관련 경고가 추가로 발생하는 점도 참고하세요. 이처럼 -m32 옵션 하나만으로 동일한 소스 코드를 32비트 환경에 맞게 손쉽게 컴파일할 수 있습니다.