"정적 연결"이란 무엇을 의미합니까?

"정적 연결"이란 무엇을 의미합니까?

내 이해에 따르면 so파일은 동적 라이브러리입니다. 이를 사용하여 ldd종속성을 인쇄할 수 있습니다.

ldd -r /usr/lib/aarch64-linux-gnu/libstdc++.so.6예를 들어 다음과 같은 출력을 얻기 위해 실행할 수 있습니다 .

    linux-vdso.so.1 =>  (0x0000ffff793f7000)
    libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000ffff79173000)
    libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffff7902c000)
    /lib/ld-linux-aarch64.so.1 (0x0000aaaae0a5d000)
    libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x0000ffff7900b000)

그런데 오늘 실행해보니 ldd -r /lib/ld-linux-aarch64.so.1다음과 같은 결과가 나왔습니다.

statically linked

이 출력이 나타나는 이유는 무엇입니까? 무슨 뜻이에요?

답변1

이 파일은 동적 라이브러리를 사용하지 않지만 실행 파일에 라이브러리의 필수 부분을 포함합니다.

따라서 ldd파일에 대해 아무 것도 알 수 없습니다.

이는 실행 파일에 동적 라이브러리가 필요하지 않다는 의미이지만 라이브러리의 버그 수정으로 인한 이점을 얻을 수 없으며 커널 인터페이스가 변경되면 정적 실행 파일이 변경 후 새 커널에서 작동하지 않는다는 의미이기도 합니다.

run time linker특별한 경우 런타임 시 동적 라이브러리를 기본 바이너리에 연결하는 데 사용되는 소위 메서드를 확인 mmap()하고 동적 라이브러리 호출에 대한 올바른 오프셋을 생성하여 확인합니다. 런타임 링커가 작업을 수행하므로 다른 동적 개체에 의존할 수 없습니다.

관련 정보