Кіріспе
Компьютердің операциялық жүйесінің бөлігі
Информатикада динамикалық байланыстырушы – бұл операциялық жүйенің атқарылатын файлға қажетті ортақ кітапханаларды оның іске қосылу кезінде ("жүргізу кезінде") жүктейтін және байланыстыратын бөлігі, кітапханалардың мазмұнын тұрақты жадтан оперативтік жадқа көшіріп, секіру кестелерін толтыру және мекенжайларды өзгерту арқылы. Динамикалық байланыстырушының қалай жұмыс істейтіні және қалай іске асырылатыны нақты операциялық жүйе мен атқарылатын файлдың форматымен анықталады. Байланыстыру жиі атқарылатын файл құрастырылған кезде орындалатын процесс ретінде қарастырылады, ал динамикалық байланыстырушы – бұл операциялық жүйенің арнайы бөлігі, ол сыртқы ортақ кітапханаларды жұмыс істеп тұрған процесске жүктейді және осы ортақ кітапханаларды жұмыс істеп тұрған процесске динамикалық түрде байланыстырады. Бұл тәсіл динамикалық байланыстыру немесе кешіктірілген байланыстыру деп те аталады.
Microsoft Windows-тың жүйелік жүйесі
Динамикалық байланыс кітапханасы, немесе DLL — Microsoft Windows және OS/2 операциялық жүйелеріндегі ортақ кітапхана тұжырымдамасының Microsoft жүзеге асырған нұсқасы. Бұл кітапханалар әдетте DLL, OCX (ActiveX элементтерін қамтитын кітапханалар үшін) немесе DRV (ескі жүйе драйверлері үшін) файлдық кеңейтімдерін қолданады. DLL файлдарының форматтары 32- және 64-биттік Windows үшін Портативті орындалатын (PE) және 16-биттік Windows үшін Жаңа орындалатын (NE) форматтарымен Windows EXE файлдарының форматтарымен сәйкес келеді. EXE файлдары сияқты, DLL-дер де кез келген комбинацияда кодты, деректерді және ресурстарды қамтуы мүмкін. DLL файлымен бірдей форматта, бірақ басқа файлдық кеңейтімдері бар және тек ресурс бөлімдерін қамтитын дерек файлдарын ресурстық DLL деп атауға болады. Мұндай DLL-дердің мысалдарына MUI кеңейтімі бар көп тілді пайдаланушы интерфейсі кітапханалары, кейде ICL кеңейтімі бар белгіше кітапханалары және FON және FOT кеңейтімдері бар қаріп файлдары жатады.
ELF және Дарвинге негізделген ЮНИКС-қа ұқсас жүйелер
Unix-ке ұқсас жүйелерде динамикалық байланысты құрайтын машиналық кодтың көп бөлігі, шындығында, операциялық жүйе ядросы жаңадан құрылған процестің адрес кеңістігінде алдымен жүктеп, орындайтын сыртқы атқарылатын файл болып табылады. exec немесе posix spawn функцияларын шақыру нәтижесінде. Қосылу кезінде пайдаланылуға тиіс динамикалық байланыстың жолы атқарылатын бейнеге енгізіледі. Атқарылатын файл жүктелгенде, операциялық жүйе ядросы одан динамикалық байланыстың жолын оқиды, содан кейін осы басқа атқарылатын бинарлық файлды жүктеуге және орындауға тырысады; егер бұл әрекет сәтсіз болса, мысалы, мұндай жолмен файл болмаса, бастапқы атқарылатын файлды орындау әрекеті сәтсіз аяқталады. Динамикалық байланыстырушы бастапқы атқарылатын файлды және оған тәуелді барлық динамикалық байланысты кітапханаларды жүктейді және атқарылатын файлды іске қосады. Нәтижесінде, динамикалық байланыстырушының жол атауы операциялық жүйенің қолданбалық бинарлық интерфейсінің бір бөлігі болып табылады.
ELF пайдаланатын жүйелер
Unix сияқты жүйелерде, ELF орындалатын файлдар мен динамикалық кітапханалар үшін қолданылады, мысалы Solaris, HP-UX-тың 64-биттік нұсқалары, Linux, FreeBSD, NetBSD, OpenBSD және DragonFly BSD, динамикалық байланыстырушының қандай жол қолданылуы керек екендігі, сілтеме жасау уақытында орындалатын файлдың PT INTERP сегментінің interp бөлігіне енгізіледі. Бұл жүйелерде динамикалық түрде жүктелетін ортақ кітапханалар файл атауының со (shared object) жұрнағы арқылы анықталады. Динамикалық байланыстырушы бағдарламаның орындалуы немесе бағдарламаның сілтеме жасалуы кезінде өзінің мінез-құлқын өзгертуге ықпал ете алады, және мұның мысалдары әртүрлі Unix сияқты жүйелер үшін орындалу уақытындағы байланыстырушының нұсқаулық беттерінде көрініс табады. Бұл мінез-құлқын өзгертудің әдеттегі жолы – LD_LIBRARY_PATH және LD_PRELOAD орта айнымалыларын пайдалану, олар орындалу уақытындағы байланыстыру процесін басқа жерлерде ортақ кітапханаларды іздеу арқылы және тиісінше, әдетте жүктелмейтін кітапханаларды күштеп жүктеу және байланыстыру арқылы реттейді. Мысал ретінде zlibc, сондай-ақ uncompress деп те белгілі, LD_PRELOAD хакі арқылы қолданғанда мөлдір декомпрессияны жеңілдетеді; нәтижесінде, BSD және Linux жүйелеріндегі алдын ала қысылған (gzipped) файл деректерін файлдар қысылмағандай оқуға болады, бұл пайдаланушыға кейбір шектеулермен бірге, негізінен, файлдарға мөлдір қысымды қосуға мүмкіндік береді. Механизм икемді, ол файлды оқу кезінде, аталған деректерді оны сұраған пайдаланушы процесіне беруден бұрын, деректерді қосымша немесе баламалы түрде өңдеу үшін бірдей кодты оңай бейімдеуге мүмкіндік береді.
macOS және iOS
Apple Darwin операциялық жүйесінде және оның негізінде құрылған macOS және iOS операциялық жүйелерінде пайдаланылуы тиіс динамикалық байланыстырушының жолы, орындалатын кескіндегі Mach O жүктеме командаларының біріне сілтеме жасау уақытында енгізіледі. Бұл жүйелерде динамикалық түрде жүктелетін ортақ кітапханалар файл атауының соңындағы «dylib» жұрнағы арқылы немесе олардың фреймворк үшін жинаманың ішінде орналасуы арқылы анықталады. Динамикалық байланыстырушы мақсатты орындалатын файлды ортақ кітапханалармен байланыстырып қана қоймай, сонымен қатар мақсатты орындалатын файл сілтеме жасау уақытында білетін жадтағы нақты адрестік нүктелерге машиналық код функцияларын орналастырады. Орындалатын файл динамикалық байланыстырушымен өзара әрекеттесуді қалағанда, ол машинаға тән шақыру немесе секіру нұсқаулығын сол белгілі адрестік нүктелердің біріне орындайды. macOS және iOS платформаларындағы орындалатын файлдар процестің орындалуы кезінде динамикалық байланыстырушымен жиі өзара әрекеттеседі; тіпті орындалатын файл бастапқыда іске қосылғаннан кейін бірнеше сағаттан кейін көбірек кітапханаларды жүктеуге және көбірек символдарды шешуге себеп болатын динамикалық байланыстырушымен өзара әрекеттесе алады. macOS немесе iOS бағдарламасының динамикалық байланыстырушымен жиі өзара әрекеттесуінің себебі Apple-дің Cocoa және Cocoa Touch API-леріне және олар іске асырылған Objective-C тіліне байланысты (қосымша ақпарат алу үшін олардың негізгі мақалаларын қараңыз). Динамикалық байланыстырушының кейбір мінез-құлқын өзгертуге болады; алайда, басқа Unix-ке ұқсас операциялық жүйелерден айырмашылығы, бұл өзгерістер динамикалық байланыстырушы елемейтін (кейде) кеңестер болып табылады. Мұның мысалдары dyld нұсқаулық бетінде көрініс тапқан. Бұл мінез-құлықты өзгертудің әдеттегі жолы DYLD FRAMEWORK PATH және DYLD PRINT LIBRARIES орта айнымалыларын пайдалану болып табылады. Бұрын аталған айнымалылардың біріншісі орындалатын файлдардың ортақ кітапханаларды іздеу жолын реттейді, ал екіншісі кітапханалардың атауларын жүктеліп, байланыстырылған кезде көрсетеді. Apple-дің macOS динамикалық байланыстырушысы – Darwin құрамына кірген ашық бастапқы кодты жоба және оны Apple-дің ашық бастапқы кодындағы dyld жобасында табуға болады.
XCOFF-ке негізделген Unix-қа ұқсас жүйелер
Unix-ке ұқсас операциялық жүйелерде, XCOFF-ты қолданатын, мысалы AIX сияқты, динамикалық түрде жүктелетін ортақ кітапханалар файл атауының соңына "a" қосымшасын пайдаланады. Динамикалық байланыстырғыш бағдарламаның орындалуы немесе байланыстырылуы кезінде өз мінез-құлқына әсер етуге болатындықтан, оны өзгертуге болады. Мұндай мінез-құлқының әдеттегі өзгертілуі – LIBPATH ортасының айнымалысын пайдалану. Бұл айнымалы орындалу кезіндегі байланыстыру процесін басқа орналасқан жерлерде ортақ кітапханаларды іздеу арқылы және әдетте жүктелмейтін кітапханаларды күштеп жүктеу және байланыстыру арқылы реттейді.
OS/360 және оның жалғастырушылары
IBM OS/360 және оның кейінгі нұсқаларындағы Ассемблер тіліндегі бағдарламалардан динамикалық байланыстыру әдетте, кітапхана модулін бағдарламаға қосу үшін операциялық жүйенің реттіліктерін іске қосатын Бақылаушы шақыру нұсқаулығын қамтитын LINK макро-нұсқаулығы арқылы жүзеге асырылады. Кітапхана модульдері басқару карталарында көрсетілген "STEPLIB" немесе "JOBLIB" арқылы бағдарламаның нақты бір орындалуы үшін ғана қолжетімді болуы мүмкін, жүйе іске қосылған кезде көрсетілген PARMLIB-дегі LINKLIST-ке кіретін кітапханада немесе жүйе іске қосылған кезде белгілі бір қайта кіретін модульдер жүктелетін "байланыс жинағы аймағында" орналасуы мүмкін.
Көптілер
Multics операциялық жүйесінде барлық файлдар, оның ішінде орындалатын файлдар да сегменттер болып табылады. Егер шақырылған режім ағымдағы сегменттің құрамына кірмесе, жүйе сілтеме жасалған сегментті жадтан немесе дискіден іздеп, оны іске қосылған процестің адрестік кеңістігіне қосады. Динамикалық байланыс – қалыпты жұмыс тәсілі, ал статикалық байланыс (байлаушы қолданылып) – ерекше жағдай.
Тиімділік
Динамикалық байланыстыру, көбінесе компиляция уақытындағы байланыстырудан гөрі баяу (көптеген процестер орындалу кезіндегідей), өйткені көптеген процессор циклдары қажет. Дегенмен, динамикалық байланыстыру көбінесе жадты тиімді пайдаланады (дискіде де, орындалу кезіндегі жадта да). Кітапхана статикалық түрде байланыстырылғанда, әрбір іске қосылатын процесс шақырылатын кітапхана функцияларының өз көшірмесімен байланысады. Сондықтан, егер бірнеше бағдарлама бір кітапхананы көп рет пайдаланса, сол кітапханадағы бірдей функциялар жүйенің жадында бірнеше рет дубликатталады. Ортақ, динамикалық кітапханаларды пайдалану, әрбір файлды компиляция кезінде кітапхананың жеке көшірмесімен байланыстырып, жадты ысырап етудің орнына, кітапхананың бір ғана көшірмесі бір уақытта жадта сақталады, бұл басқа мақсаттар үшін жадты босатады. Сонымен қатар, динамикалық байланыстыруда кітапхана тек қана пайдаланылған жағдайда ғана жүктеледі.