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개
지브엄
정말 몇시간 동안 헤메고 헤맨 문제였습니다.
영문 구글에서도 찾지를 못하였는데 여기서 찾게 되네요.
정말 진심으로 감사드립니다!
terzeron
도움이 되셨다니 저도 기쁩니다.
좋은 하루 되세요.