Unix/Linux/Mac

Ubuntu에서 MIT/GNU Scheme 사용하기

Ubuntu 8.04와 8.10에서 MIT/GNU Scheme을 사용하게 되면, 몇 가지 문제점이 있다.

일단, apt로 rpm package를 설치하는 경우, broken dependency로 인해서 설치가 잘 안 되는 경우가 있다.

MIT/GNU Scheme 홈페이지에서 제공되는 “Source”와 “Portable C” 패키지는 컴파일 에러가 발생하기도 하며, Ubuntu용 deb 패키지와 “Other unix” 패키지는 제작된 바이너리 자체가 Ubuntu의 시스템 기본 설정과 충돌하는 문제점이 있다.

* 위 문제점들은 플랫폼에 따라 다르게 나타날 수 있으며 절대적인 문제점은 아님.

scheme을 실행시켰을 때, 다음과 같은 에러 메시지를 출력하는 것이 문제인데,

Requested allocation is too large.
Try again with a smaller argument to ‘–heap’.

Ubuntu에서는 –heap 옵션을 써도 문제가 해결되지 않는다.

이 문제점은 오래 전에 다음 링크의 Ubuntu bug tracking system에 등록되었으나 현재의 Ubuntu 패키지에도 동일한 문제점이 여전히 남아 있다.
Bug #217792: MIT-Scheme will not launch

이 링크를 자세히 살펴보고 이것저것 테스트를 해봤는데, 제안된 방법 중에서 HEAP_IN_LOW_MEMORY 매크로가 유효하지 않도록 처리해서 다시 build하면 해결된다는 것이었다. 그러나 그렇게 해결이 되지 않는다. 해당 매크로를 끈 상태에서 컴파일을 해보면 에러가 발생하여 build가 잘 안 되는 것이다.

결국 해법은 sysctl로 vm.mmap_min_addr를 65536에서 0으로 변경해주는 방법이었다.

# sysctl -w vm.mmap_min_addr=0

Linux kernel 2.6.23에서 보안 문제를 해결하기 위해 mmap_min_addr 값을 64K로 설정하는 방법이 제안되었고, Ubuntu 8에서 처음으로 이 설정의 default 값을 64K로 도입하게 되었다. 이 설정은 사용자 프로세스의 메모리 공간의 하위 64K를 mmap으로 할당되지 않도록 해주는 안전 장치로 작용하고 있다. 그러나 이로 인해 Wine과 Scheme에서 이 포스트에서 다루고 있는 메모리 할당 문제가 발생했다.

# protect bottom 64k of memory from mmap to prevent NULL-dereference
# attacks against potential future kernel security vulnerabilities. (Added in kernel 2.6.23.)

이 설정이 영구적으로 유효하도록 하려면 /etc/sysctl.conf이나 /etc/sysctl.d 디렉토리의 애플리케이션 별 설정 파일에 다음과 같은 항목을 추가해야 한다. Ubuntu의 경우, /etc/sysctl.d/30-scheme.conf에 다음 설정을 추가하고,

vm.mmap_min_addr = 0

다음의 명령을 root 권한으로 실행해주면 된다.

invoke-rc.d procps start

댓글 2개

답글 남기기