본문 바로가기
컴퓨터 관련/Linux || Unix

리눅스(우분투) 32bit와 64bit 차이점 및 64bit에서 32bit 또는 32bit에서 64bit 컴파일 방법 정리

by _BlankSpace 2017. 5. 25.


 0. 서론 

흔히들, 이런 말을 들어보신 분들이 많으실 겁니다.


Q. 너 메모리 몇이야?

A. 나? 8GB인데?

Q. 그럼 윈도우 64비트 설치해야겠구나.


이렇듯, 왜 64비트 인지는 모르겠지만, 8GB가 넘어가게 되면 64비트를 설치하는 것이 당연하게 되었습니다.

그 이유에 대해서, 또한, 제가 먹고 살아가야 하는 리눅스에서는 어떻게 사용해야 하는 가에 대해서 정리하고자 합니다.


 1. 리눅스 32bit와 64bit의 차이점은?

먼저, 가장 기본적인 차이는 데이터의 전송 단위라고 할 수 있습니다.


64bit가 나오기 전, 32bit의 PC는 말 그대로 데이터를 32비트 단위로 전송하였습니다. 다시 말하자면, 32비트의 경우는 2의 32제곱으로 0에서 

4,294,967,296 개의 처리를 할 수 있게 됩니다.

그럼, 64비트는 어떨까요? 단순히 32bit에서 64bit라고 2배가 차이 난다고 생각하시면, 엄청난 오해입니다.

64bit는 2의 64제곱이므로 18,446,744,073,709,551,616가지로 저장이 가능하죠. 결국 2의 32제곱만큼 더 많은 단위로 정보를 처리할 수 있게 되는 겁니다.


이 때문에, 메모리 용량에서도 차이를 보입니다.

32비트의 컴퓨터는 최대 4GB의 메모리까지(정확히 말하자면, 4GB이하라고 합니다) 인식이 가능하게 됩니다. 반면에 64비트는 약 1TB까지 인식이 가능합니다. (윈도우의 경우에는 192GB까지)

다행히, 64비트를 사용하게 되면 저같은 경우에는 한동안 최대 램을 사용할 수는 없겠네요..ㅋㅋ



 2. 리눅스 64bit에서 만든 프로그램은 32bit 에서 실행할 수 없을까?

리눅스에서 개발하다보면, 64비트에서 개발한 프로그램을 32비트에서도 호환이 가능하도록 해야할 경우가 있습니다.


이럴 경우, 32비트에서도 호환이 가능하도록 두개의 경우로 나누어서 개발을 진행해야 할까요? 물론, 이게 가능하다면 가장 최선의 방법이 아닐까 생각이 드네요.


하지만, 불가능한 일입니다. 언제 다 만들고 있나요 ㅠㅠ 야근하는 소리가 들립니다. 따라서 64비트에서 32비트로 실행할 수 있는 실행파일로 컴파일 하는 방법을 정리하고자 합니다.


먼저, 사용하는 리눅스의 버전을 확인해야 하겠죠? 리눅스의 버전을 확인하는 방법은 다음과 같습니다.


방법 (1)

1
getconf LONG_BIT
cs
다음의 명령어를 입력하면, 32 또는 64의 숫자가 출력됩니다. 이것이 사용하는 컴퓨터의 비트입니다.


방법 (2)

1
arch
cs

출력하는 값이 x86_64이면 64 bit, i386 또는 i686이면 32 bit 입니다.


그럼, 컴파일 방법을 소개하겠습니다.

gcc 컴파일 옵션 중에서 -m32 옵션을 컴파일할 때, 같이 넣어주면 32비트로 모드로 컴파일이 가능합니다.

이러한, 옵션은 다음의 패키지를 설치하면 가능합니다.


1
sudo apt-get install gcc-multilib
cs


저는 다음의 예제로 컴파일 방법 설명을 이어가겠습니다.

1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main(void)
{
    int a = 100;
    long b = 1023213;
    printf("%d %x\n", a, b); 
    return 0;
}
cs

[이것은 C의 경우입니다.] -----------------------------------------------------------

 

1. 32비트용 컴파일을 할 때,

1
gcc test.cpp -o test32 -m32
cs

결과:

1
2
3
4
ldd test32 // < 터미널 명령어 입니다.
    linux-gate.so.1 =>  (0xf77b3000)
    libc.so.6 => /lib32/libc.so.6 (0xf75e2000)
    /lib/ld-linux.so.2 (0x56582000)
cs

2. 64비트용 컴파일을 할 때,

1
gcc test.cpp -o test64 -m64
cs


결과:

1
2
3
4
ldd test64 // < 터미널 명령어 입니다.
    linux-vdso.so.1 =>  (0x00007ffe322eb000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8d8a302000)
    /lib64/ld-linux-x86-64.so.2 (0x000055999124a000)
cs

[이것은 C++의 경우입니다.] ---------------------------------------------------------


cpp에서 위의 경우처럼 따라해보면 안되는 것을 알 수 있습니다. C++에서는 추가로 패키지 설치가 필요합니다. 필요한 패키지는 다음과 같습니다.


1
sudo apt install gcc-multilib g++-multilib
cs


다음의 cpp 예제로 방법을 진행하였습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#define BUFFER_SIZE 256
 
using namespace std;
 
char statusString[10][256= {"big""small""star""flower""fly"};
 
class Mario
{
    enum {
        big = 0,
        small,
        star,
        flower,
        fly,
    };  
public:
    int speed;
    char status;
    void printStatus();
};
 
void Mario::printStatus()
{
    cout << "speed : " << speed <<endl;
    cout << "status : " << statusString[status] << endl;
}
 
int main(void)
{
    Mario m1; 
    m1.speed = 15
    m1.status = 2;
    m1.printStatus();
    return 0;
}
cs

1. 32비트용 컴파일을 할 때,

1
g++ -m32 SuperMario.cpp -o SuperMario32
cs

결과:
1
2
3
4
5
6
7
ldd SuperMario32
    linux-gate.so.1 =>  (0xf7795000)
    libstdc++.so.6 => /usr/lib32/libstdc++.so.6 (0xf7601000)
    libc.so.6 => /lib32/libc.so.6 (0xf744d000)
    libm.so.6 => /lib32/libm.so.6 (0xf73f8000)
    /lib/ld-linux.so.2 (0x565ff000)
    libgcc_s.so.1 => /usr/lib32/libgcc_s.so.1 (0xf73db000)
cs


2. 64비트용 컴파일을 할 때,

1
g++ -m64 SuperMario.cpp -o SuperMario64
cs


결과:

1
2
3
4
5
6
7
ldd SuperMario64
    linux-vdso.so.1 =>  (0x00007ffdcf3b3000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f9ba1cbf000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9ba18f6000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9ba15ec000)
    /lib64/ld-linux-x86-64.so.2 (0x000055ca9f052000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f9ba13d6000)
cs


두 결과처럼 다른 차이를 볼 수 있습니다.


이상, 포스팅을 마치겠습니다.


제 글이 도움이 되셨거나 공감이 되시는 부분이 있으셨다면, 밑에 있는 공감 버튼 한 번씩 꾸욱 눌러주시면 감사하겠습니다.


공감 버튼은 저에게 큰 도움이 됩니다. 감사합니다.



댓글