2011-03-22 10 views
5

저는 LD_PRELOAD를 사용하여 Linux에서 write() 시스템 호출을 캡처하고 있습니다. 쓰기 시스템 호출을 위해이 작업을 성공적으로 수행 할 수있게되었습니다.LD_PRELOAD가 printf에 대해 작동하지 않습니다.

하지만 printf()를 호출하면 작동하지 않습니다. strace를 사용하여 printf 스택 추적을 관찰하면 printf가 write() 시스템 호출을 호출하여 콘솔에 기록하지만 실제로 write() 시스템 호출을 호출하기 전에 write() 시스템 호출이 호출되지 않았다는 것을 알게되었습니다. .

아무도 이유가 무엇입니까?

+0

일부 코드 스 니펫을 게시하면 어떤 일이 발생하는지 알 수 있습니다. –

+0

[This] (https://stackoverflow.com/questions/13374240/why-ld-preload-doesnt-work-for-one-of-loaded-shared-libraries)도 관련 될 수 있습니다. – Albert

답변

11

한 라이브러리에서 다른 라이브러리로 또는 실행 파일에서 동적으로로드 된 라이브러리에 대한 함수 호출은 PLT (프로 시저 연결 테이블)를 거쳐 LD_PRELOAD를 사용하여 리디렉션 될 수 있습니다. 그러나 라이브러리 내의 함수 호출은 컴파일 타임에 해결할 수 있으며 PLT를 거치지 않습니다. 따라서 LD_PRELOAD를 통해 리디렉션 할 수 없습니다. printf와 write는 둘 다 libc.so.6에서 컴파일되기 때문에 printf에서 쓰기위한 호출은 가능한 리디렉션을 찾기 위해 PLT를 통과하지 않지만 응용 프로그램 (또는 다른 공유 라이브러리)에서 직접 쓰기를 호출하면 .

관련 문제