에서 언급 한 바와 같이 왜 실행 소프트웨어 패키지는 잘 그것은 업그레이드되는 않는 경우에도? 잠금은 파일 이름이 아닌 inode에 배치됩니다. 바이너리를로드하고 실행할 때 파일이 사용 중으로 표시되므로 파일을 쓰려고 할 때 ETXTBSY (파일 사용 중) 오류가 발생합니다.
이제 공유 라이브러리의 경우 약간 다릅니다. 라이브러리는를 사용하여 프로세스의 주소 공간에 메모리를 매핑합니다 mmap()
. MAP_DENYWRITE
지정할 수는 있지만 Linux에서 적어도 Glibc는 자동으로 무시합니다 (Man 페이지에 따라 소스를 확인하십시오)-이 스레드를 확인하십시오 . 따라서 실제로 파일을 쓸 수 있으며 메모리에 매핑되면 변경 사항이 거의 즉시 표시됩니다. 즉, 충분히 노력 하면 라이브러리를 덮어 써서 머신 을 브릭 할 수 있습니다 .
따라서 업데이트하는 올바른 방법은 다음과 같습니다.
파일 시스템에서 데이터에 대한 참조를 제거하는 파일을 제거하여 파일을 사용하려는 새로 생성 된 응용 프로그램에 액세스 할 수 없도록하고 파일을 이미 열거 나 매핑 한 모든 사람이 데이터에 액세스 할 수 있도록합니다. ;
업데이트 된 내용으로 새 파일을 만듭니다.
새로 작성된 프로세스는 업데이트 된 컨텐츠를 사용하고 실행중인 애플리케이션은 이전 버전에 액세스합니다. 제정신 패키지 관리 유틸리티가하는 일입니다. dlsym()
라이브러리의 API가 자동으로 변경되면 코드를 동적으로로드하는 응용 프로그램 (예 : 친구들과 친구)이 아무런 위험이없는 것은 아닙니다 .
당신은 정말,에 있으려면 정말 , 안전을 시스템을 종료, 다른 운영 체제 인스턴스 업데이트에서 파일 시스템을 마운트하고 다시 업데이트 된 시스템을 가지고.
.so
파일ldd filename.so
을 점검 할 수 있습니다