다음 이전 차례

6. a.out 바이너리 파일과의 호환성

매우 드문 경우이지만, a.out 바이너리 파일을 사용해야만 할 수도 있다. 소스 코드를 얻을 수 없다거나, 어떤 이유에서든 소스로부터 새로운 ELF 바이너리 파일을 만들 수 없기 때문이다.

이럴 때, ELF로 설치된 리눅스 시스템은 대개 /usr/i486-linuxaout/lib 디렉터리에 완벽한 a.out 라이브러리들을 가지고 있다. a.out 라이브러리는 ELF 라이브러리와의 혼란을 피하기 위해 ELF와 다르게 버젼을 붙인다. 따라서 a.out 바이너리 파일은 실행될 때 올바른 라이브러리를 찾을 수 있어야 하지만, 항상 이렇게 되지는 않는다.

커널이 a.out 지원 기능을 자체 내에나 모듈로서 갖도록 컴파일되었어야 한다는 것에 주의하라. 필요하면 커널을 다시 컴파일할 수도 있다. 어떤 리눅스 배포본은 특별한 호환용 유틸리티를 설치해야 하기도 한다. 예를 들어 a.out의 X 응용 프로그램을 위해서, 데비안에서는 xcompat를 설치해야 한다.

6.1 예

Jerry Smith는 몇 년 전에 rolodex라는 매우 편리한 프로그램을 짰다. 이 프로그램은 Motif 라이브러리를 사용하지만, 다행히도 정적으로 링크된 a.out 형식의 바이너리 파일을 구할 수 있다. 불행한 것은 lesstif 라이브러리를 써서 다시 컴파일 하려면 소스를 수없이 뜯어고쳐야 한다는 것이다. 더 큰 불행은 a.out이 어떤 ELF 시스템에서는 다음과 같은 에러 메시지를 터뜨린다는 것이다.

xrolodex: can't load library '//lib/libX11.so.3'
No such library

이 때, /usr/i486-linuxaout/lib에는 그런 라이브러리가 있지만 xrolodex는 그 라이브러리를 실행 중에 찾지 못한 것이다. 간단한 해결책은 /lib 라이브러리에 심볼릭 링크를 만들어주는 것이다.

ln -s /usr/i486-linuxaout/lib/X11.so.3.1.0 libX11.so.3

libXt.so.3과 libc.so.4 라이브러리도 비슷한 링크를 만들어주어야 한다. 물론 이런 일들은 root로서 해야 한다. 이때 이미 있는 라이브러리를 덮어쓰거나 버젼 번호에 충돌을 일으키는 것이 아닌지 아주 확실히 해야 한다는 점을 명심하라. 다행히도 새로운 ELF 라이브러리는 이런 문제를 예상하고 미리 a.out 라이브러리 보다 높은 버젼 번호를 가지고 있다.

위의 세 링크를 만들어주고 나면, xrolodex는 잘 실행된다.

xrolodex 패키지는 원래 Spectro에 올려졌지만, 그곳에서는 지워진 것 같다. 지금은 Sunsite에서 tar.Z 형식의 소스 파일[512k]로 다운받을 수 있다.


다음 이전 차례