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
제가 틀렸을 수도 있지만, 저는 두 가지가 있다고 생각합니다.
- 로딩(즉, 공유 라이브러리를 메모리에 mmap'하는 것) 및
- 바인딩(즉, 기호 해석)
Linux에서는 -zlazy
지연 바인딩을 켭니다(기본값이므로 추가해도 아무런 변화가 없습니다). Linux에서는 지연 로딩이 발생하지 않습니다.