.so, .la 및 .a 라이브러리 파일의 차이점은 무엇입니까?


230

.so파일이 일종의 동적 라이브러리 라는 것을 알고 있습니다 (많은 스레드가 그러한 라이브러리를 공유 할 수 있으므로 메모리에 파일 사본을 두 개 이상 가질 필요가 없습니다). 그러나 .a와 의 차이점은 무엇 .la입니까? 이것들은 모두 정적 라이브러리입니까?

동적 라이브러리가 정적 라이브러리보다 큰 장점을 가지고 있다면 여전히 정적 라이브러리가 많은 이유는 무엇입니까?

또한 라이브러리 (두 종류)를로드하는 기본 메커니즘과 어딘가에서 사용될 때 lib의 코드 조각이 어떻게 호출되는지 알고 싶습니다. 커널의 어느 부분을 연구해야합니까? 프로세스가 어떻게 실행되고 있는지 알기 위해서는 어떤 관련 Linux 명령 / 유틸리티를 알아야합니까? (지금까지만 ld명령을 알고 있습니다)

언제 .so또는에 코드를 작성하려고 .a합니까? 어느 것이 더 낫습니까?

[mirror@home ins_openvpn]$ ls lib/openvpn/plugins/ -l
total 96
-rw-r--r-- 1 mirror mirror 22892 Sep  2 23:25 openvpn-plugin-auth-pam.a
-rwxr-xr-x 1 mirror mirror   931 Sep  2 23:25 openvpn-plugin-auth-pam.la
-rwxr-xr-x 1 mirror mirror 23621 Sep  2 23:25 openvpn-plugin-auth-pam.so
-rw-r--r-- 1 mirror mirror 17228 Sep  2 23:25 openvpn-plugin-down-root.a
-rwxr-xr-x 1 mirror mirror   932 Sep  2 23:25 openvpn-plugin-down-root.la
-rwxr-xr-x 1 mirror mirror 18805 Sep  2 23:25 openvpn-plugin-down-root.so

답변:


306

.so파일은 동적 라이브러리 입니다. 라이브러리와 연결된 모든 응용 프로그램은 결과 실행 파일에 복사본을 만들지 않고 동일한 파일을 사용하기 때문에 접미사는 "공유 개체"를 나타냅니다.

.a파일은 정적 라이브러리 입니다. 접미사는 "아카이브"의 약자입니다. 왜냐하면 실제로 는 원본 .o 객체 파일 의 아카이브 ( ar이전에는 tar라이브러리를 만드는 데 사용되는 명령) 로 만들어 졌기 때문 입니다.

.la파일은 GNU "libtools"패키지 에서 해당 라이브러리를 구성하는 파일을 설명하기 위해 사용하는 텍스트 파일 입니다. 이 질문에서 그들에 대한 자세한 정보를 찾을 수 있습니다 : libtool의 .la 파일은 무엇입니까?

정적 라이브러리와 동적 라이브러리에는 각각 장단점이 있습니다.

정적 프로 : 사용자는 항상 응용 프로그램으로 테스트 한 라이브러리 버전을 사용하므로 놀라운 호환성 문제는 없습니다.

정적 단점 : 라이브러리에서 문제가 해결 된 경우이를 활용하려면 응용 프로그램을 재배포해야합니다. 그러나 사용자가 스스로 업데이트 할 가능성이있는 라이브러리가 아니라면 어쨌든이 작업을 수행해야합니다.

Dynamic pro : 라이브러리에 사용되는 메모리가 라이브러리를 사용하는 모든 프로세스에서 상각되므로 프로세스의 메모리 공간이 더 작습니다.

Dynamic pro : 라이브러리는 런타임에 필요할 때로드 할 수 있습니다. 이것은 플러그인에 유용하므로 소프트웨어를 컴파일하고 설치할 때 사용할 플러그인을 선택할 필요가 없습니다. 새로운 플러그인을 즉시 추가 할 수 있습니다.

동적 연결 : 누군가 응용 프로그램을 설치하려는 시스템에 라이브러리가 없거나 응용 프로그램과 호환되지 않는 버전이있을 수 있습니다. 이를 완화하기 위해 응용 프로그램 패키지에 라이브러리의 사본이 포함되어 필요할 경우 설치할 수 있습니다. 이것은 또한 필요한 종속성을 다운로드하여 설치할 수있는 패키지 관리자에 의해 완화되기도합니다.

동적 라이브러리는 다음과 같은 시스템 라이브러리에 특히 유용합니다 libc. 커널 인터페이스가 변경 되었기 때문에 이러한 라이브러리에는 종종 특정 OS 및 버전에 종속 된 코드가 포함되어야합니다. 프로그램을 정적 시스템 라이브러리와 링크하면이 라이브러리 버전이 작성된 OS 버전에서만 실행됩니다. 그러나 동적 라이브러리를 사용하면 실행중인 시스템에 설치된 라이브러리가 자동으로 선택됩니다.


1
@Barmar, 정적 라이브러리의 장점이 동적 라이브러리의 장점보다 크다고 말하는가?
Pacerier

4
@Pacerier 나는 당신이 그것을 어디서 얻었는지 모른다.
Barmar

13
무의미한 질문입니다. 장단점은 상황에 따라 다르며 보편적 인 대답은 없습니다. 당신이 의제를 가지고있는 것 같고, 당신은 저를 미끼려고합니다.
Barmar

3
@Barmar, Nop 저는 결백합니다. 호기심이 많은 사람.
Pacerier

11
또 다른 요소는 라이센싱입니다. LGPL은 상업적인 맥락, 즉 소스를 배포하지 않으려는 경우 동적 링크를 필요로합니다.
Sam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.