동적 라이브러리 예제

다음은 정적 라이브러리에 대한 몇 가지 중요한 사항입니다. 1. 정적 라이브러리의 경우 실제 코드는 링커에 의해 라이브러리에서 추출되고 응용 프로그램을 컴파일/빌드하는 시점에서 최종 실행 파일을 빌드하는 데 사용됩니다. 전역 범위가 있는 모든 개체(실행 및 라이브러리)는 내부 목록(전역 목록)에 저장됩니다. 전역 범위 개체는 기본적으로 로드되는 모든 공유 라이브러리에 모든 기호를 사용할 수 있도록 합니다. 전역 목록에는 처음에 실행 및 프로그램의 시작 시 로드된 모든 라이브러리가 포함됩니다. 그 목적 때문에, 우리의 라이브러리는 다른 프로그램과 연결하는 동안 동적으로 공유되어야하고, 이를 가능하게하기 위해, 우리는 LD_LIBRARY_PATH 환경 변수에 라이브러리에 대한 경로를 추가했습니다 : -L 플래그는 라이브러리에 대한 경로를 지정합니다. , 우리의 경우 현재 디렉토리이며 -l 플래그는 사용할 라이브러리의 이름을 지정합니다. lib 접두사와 .so 확장은 컴파일러에 의해 해결되었습니다. ldd를 사용하여 라이브러리의 /usr/lib 인스턴스를 사용하고 있는지 확인하겠습니다: 새 프로세스가 만들어지면 프로세스 관리자가 먼저 실행 가능한 부분에서 메모리로 두 세그먼트를 매핑합니다. 그런 다음 프로그램의 ELF 헤더를 디코딩합니다. 프로그램 헤더가 실행 프로그램이 공유 라이브러리에 대해 연결되었다는 것을 나타내는 경우 프로세스 관리자는 프로그램 헤더에서 동적 인터프리터의 이름을 추출합니다.

동적 인터프리터는 런타임 링커 코드가 포함된 공유 라이브러리를 가리킵니다. 프로세스 관리자는 이 공유 라이브러리를 메모리에 로드한 다음 이 라이브러리의 런타임 링커 코드에 컨트롤을 전달합니다. 프로세스는 런타임 링커가 이 라이브러리를 로드하도록 지시하는 dlopen() 호출을 사용하여 런타임에 공유 라이브러리를 로드할 수 있습니다. 라이브러리가 로드되면 프로그램은 dlsym() 호출을 사용하여 해당 라이브러리 내의 모든 함수를 호출하여 해당 주소를 확인할 수 있습니다. 정적 연결이라는 용어는 링크타임에 링크된 프로그램과 연결된 특정 라이브러리가 링커에 의해 함께 결합된다는 것을 의미합니다. 즉, 프로그램과 특정 라이브러리 간의 바인딩은 프로그램이 실행하기 훨씬 전에 linktime에서 고정되고 알려져 있습니다.

Share on FacebookPin on PinterestTweet about this on TwitterShare on TumblrShare on Google+Digg this