2010-12-08 7 views
6

내가에만 실행 액세스가 스크립트를 실행하려고하면 나는 다음과 같은 오류가 발생합니다 : 이것은 내가 LD_PRELOAD 환경을 설정 한 후어떤 프로세스가 로더 오류를 발생하게

uname: symbol lookup error: /home/dumindara/random/sotest/a.out: undefined symbol: dlsym

을 변수는 /home/dumindara/random/sotest/a.out입니다.

a.out은 테스트 malloc을 가지고 있으며 내부적으로 dlsym을 호출합니다.

ls을 실행할 때이 문제가 발생하지 않습니다. 대부분의 프로세스는이 오류를 제공합니다. 왜 이런 일이 생기고 어떻게 작동시킬 수 있습니까?

+0

그것은 일반적으로 좋은 아이디어는 쉘 환경을 수정하기보다는 a.out에 대해서만 LD_PRELOAD를 설정하는 것입니다. 대부분의 유닉스 셸에서는'LD_PRELOAD = xyz./a.out'을 입력 할 수 있습니다. 그렇지 않으면'(LD_PRELOAD = xyz; ./a.out)'을 시도하십시오. –

+0

@ 토니 : 나는 a.out이 그 병약 한 이름에도 불구하고이 경우 공유 된 객체라고 생각합니다. OP는 분명히 자신의 버전으로'malloc()'을 오버라이드하려고 시도하고 실제 malloc으로 패스 스루하려고합니다. – thkala

+0

@tkhala : 아, 좋은 catch는 LD_PRELOAD = \'pwd \'/a.out program_to_test'와 비슷할 것입니다. –

답변

13

나는

dlsym()

은 일반적으로 공유 libdl.so.2에있는 libdl 라이브러리에서 함수입니다 ... 당신의 a.out 파일이 공유 객체가 아닌 실행 파일이라고 가정 및 이동 현대 리눅스 시스템의 객체.

귀하의 a.out 공유 객체가 libdl에 연결되어 있지 않다고 추측합니다. 즉, 다른 라이브러리를 많이 사용하지 않는 uname과 같은 간단한 바이너리로 미리로드하면 libdl.so.2가 가져 오지 않아 정의되지 않은 심볼 오류가 발생합니다.

libdl.so.2에 링크되어 있고 마지막으로 libdl.so.2를 가져 오는 바이너리에 미리로드하면 공유 객체가 올바르게 작동합니다.

자신의 공유 객체가 libdl에 링크되어 있고 unamels이 실행될 때 어떤 라이브러리가 직접 또는 간접적으로 연결되는지 확인하려면 ldd으로 확인합니다.

편집 :

나는 이것을 확인했다. 이 오류를 수정하는 방법은 공유 객체를 libdl에 연결하는 것입니다. LDFLAGS에 -ldl을 추가하면 트릭을 수행해야합니다.

+0

-ldl은 다른 .o 파일보다 먼저 필요할 수도 있습니다. 예"gcc -ldl -shared foo.o bar.o -o baz.so". –

16

허용 된 답변에 댓글을 달 수는 없지만 컴파일 명령 앞에 -ldl이 사용되면 libdl.so.2가 제대로 링크되지 않는 문제가 발생할 수 있습니다. 컴파일은 동일한 명령으로 실행되며 LD_PRELOAD 라이브러리는 대개 하나의 소스 파일을 기반으로하므로 가능합니다.

그래서 결국에 -ldl와 GCC 전화 : 내 경우

gcc -shared -fPIC fakeuname.c -o libfakeuname.so -ldl

을 전면에 -ldl을 가진이 같은 문제로 오류가 발생했습니다 :

uname: symbol lookup error: ./libfakehostname.so: undefined symbol: dlsym

+0

매우 중요한 점 .. – user1173339

+0

네 엄지 손가락 !! thkala 대답은 여전히 ​​나에게 오류를 줬지만 결국 "-ldl"은 모든 것을 해결했다. –

+0

고마워요! 이것은 나를 위해 일했습니다! –