ld.so
런타임 링커( )와 프로그램의 차이점은 무엇입니까 prelink
? 런타임 링커( ld.so
)가 프로그램에 필요한 모든 동적 라이브러리를 로드한다는 것을 알고 있지만 이점은 무엇입니까 prelink
? 둘 다 같은 일을 하고 있지 않나요?
답변1
이는 크게 다룹니다.prelink
맨페이지:
prelink
동적 링커가 시작 시 재배치를 수행하는 데 필요한 시간을 크게 줄이는 방식으로 ELF 공유 라이브러리와 ELF 동적으로 링크된 바이너리를 수정하는 프로그램입니다. 재배치가 적기 때문에 런타임 메모리 소비도 줄어듭니다(특히 공유할 수 없는 페이지 수). 사전 링크 정보는 사전 링크 이후 종속 라이브러리가 변경되지 않은 경우 시작 시에만 사용됩니다. 그렇지 않으면 프로그램이 정상적으로 재배치됩니다.
prelink
사전 링크할 ELF 바이너리와 이들이 의존하는 ELF 공유 라이브러리를 수집하는 것부터 시작하세요. 그런 다음 각 라이브러리에 대해 고유한 가상 주소 공간 슬롯을 할당하고 공유 라이브러리를 해당 기본 주소에 다시 연결합니다. 동적 링커가 이러한 라이브러리를 로드하려고 시도할 때 해당 가상 주소 공간 슬롯이 이미 점유되어 있지 않은 한 라이브러리를 지정된 슬롯에 매핑합니다. 이 작업이 완료되면prelink
동적 링커의 도움으로 바이너리 또는 라이브러리의 모든 재배치가 종속 라이브러리에 대해 해결되고 재배치는 ELF 개체에 저장됩니다. 또한 모든 종속 라이브러리 목록과 해당 체크섬을 바이너리 파일이나 라이브러리에 저장합니다. 바이너리 파일의 경우 목록도 계산합니다.갈등 (종속 라이브러리의 더 작은 검색 범위와는 다르게 바이너리의 기호 검색 범위에서 해결됨) 특수 ELF 섹션에 저장됩니다.런타임 시 동적 링커는 먼저 모든 종속 라이브러리가 지정된 주소 공간 슬롯에 성공적으로 매핑되었는지, 사전 링크가 완료된 이후 변경되지 않았는지 확인합니다. 모든 검사가 성공하면 동적 링커는 모든 라이브러리를 재배치하는 대신 충돌 목록(일반적으로 총 재배치 수보다 훨씬 짧음)만 재생합니다.
ld.so
와 사이의 주요 차이점 prelink
은 전자는 동적으로 연결된 바이너리가 로드될 때마다 실행된다는 것입니다. 바이너리를 동적으로 연결하는 데 관련된 라이브러리 재배치를 미리 계산하여 prelink
시작 시 프로그램이 차지하는 시간과 메모리를 줄이려고 시도합니다. ld.so
이러한 재배치는 바이너리에 저장되고 ld.so
해당 정보를 사용하여 여전히 유효한지 여부를 확인할 수 있습니다. 자체 재배치를 건너뜁니다(사전 연결된 재배치가 유효한 경우).
사용하면 prelink
특히 다음과 같은 많은 불리한 결과가 발생합니다.
- 이는 바이너리를 수정합니다. 즉, 바이너리가 변조되었는지 확인하기 위해 더 이상 "소스"(패키지 등)와 비교할 수 없습니다.
- 이로 인해 고정된 재배치가 발생하여 주소 공간 레이아웃 무작위화 범위가 크게 줄어들어 시스템의 보안이 저하됩니다(사전 연결된 특정 바이너리의 경우 연결된 라이브러리가 변경되지 않는 한 재배치는 변경되지 않고 유지됩니다. 이러한 라이브러리 중 하나에 있는 가젯을 악용하려는 공격자에게 유용합니다.