NetBSD 공작소

64비트 환경에서 32비트 실행 파일 지원

x86 기종이 32비트 환경에서 64비트 환경으로 넘어가면서 가장 먼저 고려해야할 것은 하위 호환성이었다. 80386과 함께 보급된 수많은 32비트 피씨에서 돌고 있는 소프트웨어들이 있었기 때문이다. 하지만 인텔은 이를 무시하고 펜티엄과 호환되지 않는 아이태니엄(IA-64)을 발표해버렸다. 하지만 일반 사용자 입장에서는 잘 쓰던 프로그램을 돌릴 수 없는데 이 칩이 내장된 컴퓨터를 살 이유가 없었다. 결국 잽싸게 펜티엄 호환 64비트 칩(AMD64)을 출시한 AMD가 개인용 64비트 피씨 시장을 선점해버렸다. 인텔도 뒤늦게 잘못을 깨닫고 AMD64를 베낀 EM64T를 내놓았지만, 만회하기까지에는 상당한 시간이 걸렸다.

어쨌든 그 결과 지금은 대부분의 개인용 피씨가 AMD64 아키텍쳐를 채택하고 있어서, 사용자는 64비트든 32비트든 자기가 원하는 버젼의 운영 체제를 설치해서 사용할 수 있다. 하지만 32비트와의 호환성 문제는 여기서 그치지 않는다. 비록 64비트 운영 체제를 설치했다고 하더라도, 32비트 프로그램을 돌리고자 할 때가 있다. 이전에 32비트 환경에서 개발했는데 64비트 환경으로 이식하기엔 너무 노력이 많이 드는 프로그램이나, 32비트용으로 구매를 해서 바이너리만 갖고 있는 소프트웨어 등이 그런 경우에 해당할 것이다. 이 경우 우선 운영 체제가 32비트 호환 모드로 프로그램을 실행할 수 있어야 하고, 해당 32비트 프로그램이 필요로 하는 모든 동적 라이브러리도 제공해 주어야 한다. 몇몇 리눅스 시스템의 경우 /usr/lib32라는 디렉토리를 만들어 32비트용 라이브러리를 넣어두고 쓰는 방식을 택하기도 했다.

NetBSD에서는 최근 Matthew Green씨가 이를 깔끔한 방법으로 구현하여 발표했다. /usr/lib에는 해당 운영 체제의 원래 라이브러리가 들어가고, 다른 아키텍쳐의 라이브러리는 /usr/lib 밑에 아키텍쳐 이름과 같은 디렉토리에 들어간다. 즉, AMD64용 라이브러리는 /usr/lib에 두고, /usr/lib/i386에 32비트용 x86 라이브러리를 넣는 것이다. 이 방식은 다른 NetBSD 포트에도 동일하게 적용되어, NetBSD/sparc64라면 /usr/lib에는 sparc64의 라이브러리가, /usr/lib/sparc에는 32비트용 sparc의 라이브러리가 들어간다. 중요한 것은 사용자는 이에 대해 전혀 신경 쓸 필요가 없다는 점이다. 32비트 바이너리이든 64비트 바이너리이든, 그냥 실행만 하면 동적 링커가 알아서 맞는 라이브러리를 찾아 실행해준다. 더 나아가 64비트 환경에서 32비트 프로그램을 만드는 일도 간단하다. 컴파일러에 -m32 옵션만 주면 된다. 어떤 바이너리가 생성되었는지는 file 명령으로 간단히 알아볼 수 있다. 옵션 없이 NetBSD/amd64에서 C 프로그램을 컴파일하면 다음과 같이 64비트 실행파일이 생긴다.

% gcc test.c
% file a.out
a.out: ELF 64-bit LSB executable, x86-64, ...

이제 -m32 옵션을 줘 보자.

% gcc -m32 test.c
% file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, ...

32비트 실행파일이 만들어진 것을 알 수 있다. 이 실행파일은 64비트 실행파일과 마찬가지로 그냥 셸에서 바로 실행할 수 있다. 게다가 이 파일을 32비트 환경, 즉 NetBSD/i386으로 가져가도 실행할 수 있다. 느려터진 32비트 컴퓨터에서 컴파일할 일이 있다고 좌절할 필요가 없는 것이다. 빠른 64비트 컴퓨터에서 32비트용으로 순식간에 컴파일한 후, 파일만 그대로 복사하면 된다.

이 기능은 최신 NetBSD 소스를 받아 NetBSD를 설치하면 사용할 수 있으며, 다음 버젼인 5.0에 포함될 예정이다.

답글 없음 »

답글이 없습니다.

이 글의 답글을 위한 RSS 피드 트랙백 URL

답글 남기기