![정적 라이브러리는 재배치 가능한 개체 파일을 사용하고 공유 라이브러리는 소스 파일을 사용하는 이유는 무엇입니까?](https://linux55.com/image/179521/%EC%A0%95%EC%A0%81%20%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EB%8A%94%20%EC%9E%AC%EB%B0%B0%EC%B9%98%20%EA%B0%80%EB%8A%A5%ED%95%9C%20%EA%B0%9C%EC%B2%B4%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EA%B3%A0%20%EA%B3%B5%EC%9C%A0%20%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EB%8A%94%20%EC%86%8C%EC%8A%A4%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
정적 라이브러리와 공유 라이브러리를 소개하는 교과서를 읽었습니다. 두 개의 소스 파일 addvec.c
이 있으며 multvec.c
정적 라이브러리를 생성하기 위해 아래와 같이 ar 도구를 사용합니다.
linux> gcc -c addvec.c multvec.c
linux> ar rcs libvector.a addvec.o multvec.o
따라서 기본적으로 먼저 재배치 가능한 개체 파일(.o)을 만든 다음 이러한 .o 파일과 함께 ar 도구를 사용합니다.
그러나 공유 라이브러리 libVector.so를 구축하려면 이 책의 명령은 다음과 같습니다.
linux> gcc -shared -fpic -o libvector.so addvec.c multvec.c
재배치 가능한 객체 파일이 아닌 소스 파일(.c)을 매개변수로 직접 사용한다는 점에 유의하세요.
그렇다면 공유 라이브러리의 경우 재배치 가능한 개체 파일을 생성할 필요가 없지만 소스 파일을 직접 사용할 필요가 없는 이유는 무엇입니까? 이는 재배치 가능한 개체 파일을 사용한 정적 링크와 일치하지 않습니다.
답변1
너할 수 있는공유 라이브러리의 구성요소 개체를 별도로 빌드합니다.
gcc -fpic -c addvec.c multvec.c
gcc -shared -fpic -o libvector.so addvec.o multvec.o
그러나 모든 컴파일 및 연결 단계에서는 동일한 플래그를 사용해야 합니다. 나는 이것이 당신의 교과서에서 사용된 접근법의 주된 이유라고 생각합니다. 정적 라이브러리에는 위치 독립적 코드가 필요하지 않지만 공유 라이브러리에는 필요합니다. 공유 라이브러리는 명시적으로 각 개체 파일을 두 번 빌드하거나 정적 라이브러리에서 PIC를 "낭비"하는 대신 소스 파일의 PIC를 사용하여 빌드됩니다.