2012-07-23 3 views
1

Linux에서이 공유 라이브러리 (.so 확장자 포함)를 수정하려고합니다. 일부 printf 문 및 fprintf 문을 디버깅 할 때 삽입하고 아무 효과가 없습니다. .so 파일을 제거하고 프로그램이 계속 정상적으로 실행됨을 알았습니다. 프로그램이 메모리에로드되었음을 의미합니까 ?? (하지만 나는 단지 .so 파일을 사용하기 위해 테스트하고있는 프로그램 일뿐입니다.)메모리에서 공유 라이브러리 언로드

언로드하면 어떻게 프로그램이 수정 된 파일을로드하는지 확인할 수 있습니까?

+0

당신은 충분한 세부 사항을주지 못하기 때문에 우리는 당신이 실제로 무엇을하고 있는지 추측해야합니다. –

답변

5

아니요, 공유 라이브러리는 메모리에 캐시되지 않습니다. 당신은 .so 파일을 삭제하고 프로그램을 계속 한 후, 실행하는 경우 다음 중 하나를

    프로그램이 다른 위치에서 같은 이름의 .so를로드
  • , 또는
  • .so
  • 를로드하지 않고 실행할 수있는 프로그램을

.so은 당신의 OS가 실제로 .so을 생각하는 경우 다음 찾아 ldd을 사용할 수 있습니다, 프로그램 시작시로드 할 생각됩니다.

.so이 런타임에 동적으로로드되는 경우 strace은 무슨 일이 일어나고 있는지 정확하게 나타낼 수 있습니다.

+0

시작 프로그램 시작 또는 OS 시작을 의미합니까? – huggie

+1

프로그램 시작. ELF 실행 파일에는 프로세스가 시작될 때 OS가 프로세스 대신로드하는 공유 라이브러리 목록이 들어 있습니다. 프로세스는 나중에'dlopen()'을 사용하여 더 많은 공유 라이브러리를 열도록 선택할 수 있습니다. –

+0

공유 라이브러리를 사용하는 Python 프로그램입니다. 일종의 일을 더 복잡하게 만듭니다. – huggie

2

/proc/1234/maps을 읽고 프로세스 1234의 메모리 맵을 확인할 수 있습니다. 또한 동적으로로드되는 공유 객체가 표시됩니다.

LD_LIBRARY_PATH 환경 변수를 사용하여 공유 라이브러리의 경로를 변경하고 ldconfig 캐시를 업그레이드 할 수 있습니다. /etc/ld.so.conf 등을보십시오.

물론 공유 라이브러리를로드하는 프로그램을 다시 시작해야합니다.