실행 파일 수행시 공유 오브젝트 사용 불가시 dump로 확인 방법
실행파일을 수행할 때 시스템 로더가 공유 오브젝트를 찾지 못하면, 다음과 비슷한 에러메시지가 나올 것이다.
exec(): 0509-036 Cannot load program ex1 because of the following errors:
0509-022 Cannot load library libone.so.
0509-026 System error: A file or directory in the path name does not exist.
찾지 못한 오브젝트는 0509-022 에러메시지 부분에 나와 있다. find 명령을 사용해서 공유 오브젝트를 찾아보자.
공유 오브젝트를 찾으면, 그 오브젝트가 위치하는 디렉토리를 LIBPATH 변수에 추가한 다음 어플리케이션을 다시 수행한다.
또 그 오브젝트나 라이브러리가 읽기가능(read permission)인지 살펴보자.
시스템 로더가 지정한 공유 오브젝트는 찾았지만, 심볼을 해석할 수 없을 때에도 비슷한 에러 메시지가 보인다. 실행파일과 호환되지 않는 버전의 공유 오브젝트를 사용하면 이런 경우가 발생할 수 있다. 에러메시지는 다음과 비슷하다.
exec(): 0509-036 Cannot load program ./example because of the following errors:
0509-023 Symbol func1 in ex1 is not defined.
0509-026 System error: Cannot run a file that does not have a valid format.
해석하지 못한 심볼은 0509-023 메시지에서 알 수 있다. 이 심볼 이름을 우선 적어놓은 다음(여기에서는 func1) dump -Tv 명령을 사용하여 실행파일에서는 어느 공유 오브젝트에 이 심볼이 정의되어 있는 것으로 알고 있는지 알아보자.
# dump -Tv example | grep func1
[4] 0x00000000 undef IMP DS EXTref libone.a(shr1.o) func1
이 경우 실행파일은 func1 심볼이 공유 오브젝트 shr1.o에 있으며 shr1.o 파일은 libone.a 의 아카이브 멤버라고 알고 있다.
이러한 정보를 이용하여 문제해결에 도움을 줄 수 있다.