요즘 배포되는 컴파일러는 대부분 기본적으로 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: 832비트 환경 출력 결과 (-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비트 환경에 맞게 손쉽게 컴파일할 수 있습니다.