Dll 은 본질적으로 EXEs 와 동일하기 때문에 연결 프로세스의 일부로 생성 할 선택은 명확성을위한 것입니다.
DLL 을 직접 실행할 수는 없으며 운영 체제가 진입 점을 통해로드 할 수 있도록 EXE 가 필요하기 때문에 RUNDLL 과 같은 유틸리티가 존재합니다.EXE 또는 RUNDLL32.많은 지원없이 실행할 수있는 충분한 기능을 포함하는 Dll 에 대한 진입 점과 최소한의 프레임 워크를 제공하는 EXE.,
Dll 을 제공하는 메커니즘을 공유 코드 및 데이터 수 있도록 개발자의 공유 코드/데이터를 업그레이드 기능을 필요로하지 않고 응용 프로그램을 다시 연결될 또 다시 컴파일합니다. 에서는 응용 프로그램 개발의 관점 윈도우즈와 OS/2 으로 생각할 수 있습의 컬렉션을 Dll 업그레이드 할 수 있도록,응용 프로그램를 위한 하나의 버전 OS 에서 일을 나중에 하나,제공되는 OS 공급업체 보장하고있는 인터페이스 기능과 호환됩니다.,
Dll 을 실행하의 메모리 공간에서 호출 프로세스와 같은 액세스 권한이 있다는 것을 의미하는 것은 약간의 오버헤드에서 그들의 사용을 하지만 또한 없다는 것을 보호에 대한 호출 EXE 경우 응용 프로그램이 어떤 종류의 버그입니다.
Memory managementEdit
Windows API 에서 DLL 파일은 섹션으로 구성됩니다. 각 섹션에서는 자체의 특성과 같이 쓰기 가능한 또는 읽기 전용 실행 파일(코드)또는 비행(를 위한 데이터)니다.,
코드 DLL 에서는 일반적으로 공유 중 하는 모든 프로세스를 사용하여 DLL,즉 그들이 차지하는 단순한 장소에서는 물리 메모리 공간을 차지하지 않습 페이지에서 파일입니다. 윈도우를 사용하지 않는 위치 독립적인 코드에 대한 Dll 을 대신 코드를 겪는 재배치로드,수정 주소에 대한 모든 항목에 포인트를 위치에서 무료로 메모리 공간의 첫 번째 과정 또는 컴퓨., 에서는 오래된 Windows 버전에서는 모든 실행하는 프로세스 점유의 일반적인 단일 주소 공간에,단일의 복사본을 DLL 의 코드는 것이 충분을 위한 모든 프로세스입니다. 그러나,최신 Windows 버전을 사용하는 별도의 주소 공간에 대한 각 프로그램,그것은 단지 가능한한 사용하는 같은 이전의 사본을 DLL 에서 여러 프로그램을 경우 각 프로그램은 동일한 가상 주소를 무료로 수용할 수 있 DLL 의 코드입니다., 면 어떤 프로그램(또는 그들의 조합을 의미-로드 Dll)가 그 주소를 무료 후,추가적인 육체의 복사본을 DLL 의 코드를 만들 필요가 있을 것을 사용하여,다른 세트의 이전 항목이 포인트입니다. 는 경우는 물리 메모리에 의해 점령한 코드 섹션을 확보할,해당 내용을 삭제하고,나중에 다시 로드에서 직접 DLL 파일로 필요합니다.
에 대비하는 코드 섹션,데이터는 섹션의 DLL 은 일반적으로 개인,즉 각 프로세스를 사용하여 응용 프로그램이 자신의 사본을 DLL 의 모든 데이터입니다., 선택적으로 데이터 섹션을 공유하여 이 공유 메모리 영역을 통한 프로세스 간 통신을 가능하게 할 수 있습니다. 그러나 때문에 사용자에 대한 제한사항이 적용되지 않습의 사용 공유 DLL 메모리,이 만들어 보안 hole;즉,하나의 프로세스할 수 있는 손상이 공유 데이터를 일으킬 가능성이 높은 다른 모든 공유 프로세스 작동 바람직하지 않다. 예를 들어,프로세스에서 실행되는 게스트 계정에서 할 수있는 이 방법으로 손상된 다른 프로세스에서 실행하는 권한 계정입니다. 이것은 Dll 에서 공유 섹션의 사용을 피하는 중요한 이유입니다.,
DLL 이 특정 실행 가능 패커(예:UPX)에 의해 압축 된 경우 모든 코드 섹션은 읽기 및 쓰기로 표시되며 공유 해제됩니다. 읽기 및 쓰기 코드 섹션은 개인 데이터 섹션과 마찬가지로 각 프로세스에 비공개입니다. 따라서 Dll 을 공유된 데이터는 섹션에서 해야 되지 않을 압축하면 그들은 사용하여 동시에 여러 개의 프로그램을,이후는 각 프로그램으로 인스턴스를 수행해야 할 것입니다 그것의 자신의 복사본을 DLL,의 결과로서 증가 메모리 소비가 있습니다.
import librariesEdit
정적 라이브러리와 마찬가지로 Dll 에 대한 import 라이브러리가 주목됩니다.,lib 파일 확장자. 예를 들어,kernel32.파일 생성 및 메모리 관리와 같은 Windows 의 기본 기능을위한 기본 동적 라이브러리 인 dll 은 kernel32 를 통해 연결됩니다.리브. 일반적인 방법 가져오기 라이브러리에서 적절한 정적 라이브러리에 의해 크기:가져올 라이브러리는 훨씬 작으로 포함되어 기호를 참조하여 실제 DLL,에 처리할 수 있는 링크를 시간이다. 그럼에도 불구하고 둘 다 Unix ar 형식 파일입니다.
연결하는 동적 라이브러리는 일반적으로 처리하여 연결을 가져올 라이브러리할 때는 건물 또는 연결을 실행 파일을 생성하는 파일., 그런 다음 생성 된 실행 파일에는 모든 DLL 함수 호출이 참조되는 iat(import address table)가 포함됩니다(참조 된 각 DLL 함수는 IAT 에 자체 항목을 포함합니다). 런타임에 IAT 는 별도로로드 된 DLL 의 함수를 직접 가리키는 적절한 주소로 채워집니다.
cygwin/MSYS 및 MinGW 에서 가져 오기 라이브러리에는 일반적으로 접미사.dll.a
가 주어지며 Windows DLL 접미사와 Unix ar 접미사가 모두 결합됩니다., 파일 형식은 비슷하지만 가져 오기를 표시하는 데 사용되는 기호는 다릅니다(_head_foo_dll vs__IMPORT_DESCRIPTOR_foo). Gnu Binutils 툴체인은 가져 오기 라이브러리를 생성하고 링크 할 수 있지만 DLL 에 직접 링크하는 것이 더 빠릅니다. Genlib 라는 mingw 의 실험 도구를 사용하여 MSVC 스타일 기호로 가져 오기 라이브러리를 생성 할 수 있습니다.
기호 해상도 및 bindingEdit
DLL 에 의해 내 보낸 각 함수는 숫자 서수 및 선택적으로 이름으로 식별됩니다. 마찬가지로 함수는 서수 또는 이름으로 DLL 에서 가져올 수 있습니다., 서수는 DLL 내보내기 주소 테이블에서 함수의 주소 포인터의 위치를 나타냅니다. 내부 함수는 서수로만 내보내는 것이 일반적입니다. 대부분의 Windows API 함수의 경우 다른 Windows 릴리스에서 이름 만 보존되며 서수는 변경 될 수 있습니다. 따라서 서수별로 Windows API 함수를 안정적으로 가져올 수 없습니다.
가져오는 기능을 제공하는 서수만 약간 더 나은 성능을 보다 그것들을 가져에 이름:내보내기 테이블의 Dll 을 주문 이름,이렇게 검색할 수 있습을 찾기 위해 사용될 수 있습니다., 그런 다음 찾은 이름의 인덱스는 내보내기 서수 테이블에서 서수를 조회하는 데 사용됩니다. 16 비트 윈도우에서는 이름 테이블이 정렬되지 않았으므로 이름 조회 오버 헤드가 훨씬 더 두드러졌습니다.
DLL 의 특정 버전에 실행 파일을 바인딩하는 것,즉 컴파일 타임에 가져온 함수의 주소를 확인하는 것도 가능합니다. 바운드 임포트의 경우 링커는 임포트가 바인딩된 DLL 의 타임스탬프와 체크섬을 저장합니다. 런타임에 Windows 는 동일한 버전의 라이브러리가 사용되고 있는지 확인하고,그렇다면 Windows 는 가져 오기 처리를 우회합니다., 그렇지 않으면 라이브러리가 바인딩 된 라이브러리와 다른 경우 Windows 는 일반적인 방법으로 가져 오기를 처리합니다.
바인딩된 실행파일드는 다소 빠른 실행 하는 경우에는 같은 환경은 그들이 컴파일되었고,정확하게 동시에 실행 하는 경우에,다른 환경이 없도록 단점에 대한 바인딩을 가져올 수 있습니다. 예를 들어 모든 표준 Windows 응용 프로그램은 해당 Windows 릴리스의 시스템 Dll 에 바인딩됩니다. 응용 프로그램의 가져 오기를 대상 환경에 바인딩 할 수있는 좋은 기회는 응용 프로그램을 설치하는 동안입니다., 이렇게하면 다음 OS 업데이트까지 라이브러리를’바운드’상태로 유지합니다. 그러나 그것은,변경,체크섬의 실행,그래서 그것은 무언가를 할 수 있는 서명된 프로그램 또는 프로그램에 의해 관리되는 구성 관리 도구를 사용하는 사용 체크(MD5 같은 체크)을 관리하는 파일 버전입니다. 으로 최신 Windows 버전에서 멀리 이동하는 고정 주소에 대한 모든 로드 라이브러리(보안상의 이유로),기회와 가치의 바인딩은 실행이 감소하고 있습니다.,
명시적인 run-time linkingEdit
DLL 파일이 명시적으로드 실행 시간,프로세스에게 실행 시 동적 연결하여 Microsoft,를 사용하여LoadLibrary
(또는LoadLibraryEx
)API 함수입니다. GetProcAddress
API 함수는 내 보낸 기호를 이름으로 조회하는 데 사용되며FreeLibrary
–DLL 을 언로드합니다. 이러한 함수는 POSIX 표준 API 에서dlopen
,dlsym
및dlclose
와 유사합니다.,
는 절차에 대해 명시적으로 실행 시간 연결에서 어떤 언어를 지원하는 포인터 기능에 의존하기 때문이 Windows API 아닌 언어로 구성 합니다.
지연 loadingEdit
정상적으로,응용 프로그램 연결에 대한 DLL 을 가져오 라이브러리는 것을 시작할 수 없는 경우 DLL 찾을 수 없기 때문에,윈도우지 않을 것입 응용 프로그램을 실행하지 않으면 그것을 모두 찾을 수 있습니다 Dll 을 응용 프로그램을 수도 있습니다. 그러나 동적 라이브러리의 지연된 로딩을 허용하기 위해 응용 프로그램이 가져 오기 라이브러리에 대해 링크 될 수 있습니다.,이 경우 운영체제 시스템을 찾으려고하지 않거나 DLL 을 로드하는 응용 프로그램이 시작되면 대신 스텁은 응용 프로그램에 포함된 링커에 의해 어떤 것도 발견하고 DLL 을 로드하는을 통해 LoadLibrary 및 getprocaddress 에 하나의 함수가 호출됩니다. DLL 을 찾거나로드 할 수 없거나 호출 된 함수가 존재하지 않으면 응용 프로그램이 예외를 생성하여 적절하게 잡아서 처리 할 수 있습니다. 응용 프로그램이 예외를 처리하지 않으면 오류 메시지와 함께 프로그램을 종료하는 운영 체제에 의해 잡힐 것입니다.,
지연 로딩 메커니즘 또한 알림을 제공합 갈 수 있도록 응용 프로그램을 추가로 수행 가공 또는 오류 처리 DLL 로드리고/또는 DLL 함수가 호출됩니다.피>
답글 남기기