Linux에서 지연 동적 연결을 사용할 수 있습니까?

Linux에서 지연 동적 연결을 사용할 수 있습니까?

UNIX에서는 다음 명령줄을 사용할 수 있습니다.

cc -o executable *.o -zlazyload -lsomelib

오른쪽에 나열된 라이브러리는 -zlazyload바이너리의 LAZYLOAD ELF 태그로 표시됩니다. 이는 호출을 통해 확인할 수 dump -Lv executable있으며 결과에는 다음이 포함됩니다.

  **** DYNAMIC SECTION INFORMATION ****
.dynamic:
[INDEX] Tag         Value
[1]     POSFLAG_1       LAZYLOAD
[2]     NEEDED          libsecdb.so.1

이 경우 는 실행 파일의 시작 시간에 로드되지 않고 첫 번째 함수가 호출되는 libsecdb시간까지 지연됩니다 .libsecdb

이 트릭은 모든 기능을 사용하지 않는 경우 실행 파일의 incore 표현을 더 작게 유지하는 데 사용될 수 있습니다.

Linux에서 동일한 결과를 얻을 수 있는 방법이 있습니까? GNU 링커에 플래그가 있는 것 같지만 -zlazy제 경험으로는 효과가 없습니다.

이 질문의 배경은 Solaris에서 지연 연결을 사용하여 현재 Bourne Shell(bosh)을 연결하는 것이 간단하고 이로 인해 쉘 스크립트를 실행할 때만큼 작지만 dash여전히 dash. 대화형 히스토리 편집기의 공유 라이브러리는 쉘이 대화형 모드에서 사용되는 경우에만 링크됩니다.

답변1

제가 틀렸을 수도 있지만, 저는 두 가지가 있다고 생각합니다.

  1. 로딩(즉, 공유 라이브러리를 메모리에 mmap'하는 것) 및
  2. 바인딩(즉, 기호 해석)

Linux에서는 -zlazy지연 바인딩을 켭니다(기본값이므로 추가해도 아무런 변화가 없습니다). Linux에서는 지연 로딩이 발생하지 않습니다.

관련 정보