답변1
라이브러리 함수를 호출하는 프로그램이 있습니다. 이 경우에는 "C 라이브러리"라고도 알려진 시스템 표준 라이브러리입니다(그러나 C 코드에서 호출할 수 있는 다른 라이브러리가 많이 있으며 이는 단지 이름일 뿐입니다). "라이브러리 함수"는 코드가 함수의 일부로 배포되는 함수를 의미합니다.도서관. 프로그램이 실행될 때 라이브러리 함수는 두 가지 방법으로 호출될 수 있습니다.
도서관이라면정적 링크즉, 프로그램이 빌드될 때 결과는 프로그램 main
의 소스 코드(프로그램의 함수 및 기타 함수)와 라이브러리의 함수를 컴파일한 결과를 포함하는 실행 파일입니다 printf
. 링커는 또는 유사한 위치라는 프로그램을 실행합니다 . 이는 프로그램이 빌드될 때 "링커" 단계가 완전히 실행되고 프로그램 실행 /lib/libc.a
시 코드가 필요하지 않음을 의미합니다 .printf
write
시스템 호출라이브러리 함수² 대신 해당 코드가 커널 내부에 있습니다.
도서관이라면동적 링크, 다이어그램의 링커 단계에는 실행 파일의 라이브러리 코드가 포함되지 않습니다. 그것이 하는 일은 프로그램이 시작될 때 라이브러리에서 특정 기능을 로드하기 위한 몇 가지 지침을 채우는 것뿐입니다. 실행 파일에는 여전히 "(Lib ref)" 비트가 포함되어 있습니다. 실행 파일이 실행될 때 가장 먼저 하는 일은 공유 라이브러리 파일( /lib/libc.so
또는 유사한 파일)을 로드하고 프로그램에 필요한 함수 이름을 라이브러리에서 제공하는 이름과 일치시키는 것입니다.
"추상적 방법"이라는 용어는 다소 모호합니다. 그것에 집착하지 마십시오. 동일한 실행 파일이 다른 라이브러리 구현을 사용하여 실행될 수 있기 때문에 동적 연결이 라이브러리를 추상화한다고 말할 수 있습니다.
다이어그램은 정적 연결을 설명하는 것 같습니다. 실제 생활에서 동적 연결은 다중 프로그래밍 시스템에서 가장 일반적입니다. 정적 링크에는 두 가지 주요 단점이 있습니다. 라이브러리를 사용하는 모든 프로그램을 업그레이드하지 않으면 라이브러리를 업그레이드(예: 버그 수정)할 수 없으며, 많은 프로그램이 동일한 라이브러리를 사용하는 경우 가능한 한 많은 코드 복사본을 저장해야 합니다. 정적 링크는 단일 프로그램만 실행하고 전체 코드 이미지를 교체해야만 업그레이드할 수 있는 저가형 임베디드 시스템에 적합하지만, 동적 링크는 다양한 프로그램을 실행하는 시스템의 표준입니다.
¹ 파일 이름은 시스템에 있는 것보다 더 복잡할 수 있지만 이는 이 답변과 관련이 없습니다.
²실제로 이라는 라이브러리 함수가 있지만 write
그것이 하는 일은 시스템 호출뿐입니다. 내 대답에서 나는 그 이름의 시스템 호출을 언급하고 있습니다.