پیونددهنده پویا

در نظریهٔ محاسبات، **پیوند دهندهٔ پویا** (به انگلیسی: Dynamic Linker) بخشی از سیستم‌عامل است که وظیفهٔ بارگذاری منابع و کتابخانه‌های مورد نیاز برنامهٔ اجرایی و پیوند دادن آن‌ها را به برنامه در زمان اجرا بر عهده دارد.

پیوند دادن معمولاً به فرایندی گفته می‌شود که در آن منابع مورد نیاز یک برنامه قبل از اجرا، در زمان کامپایل و توسط کامپایلر به آن برنامه متصل می‌شوند تا یک بستهٔ اجرایی (به انگلیسی: Executable)  کامل ایجاد شود. در مقابل پیوند دهندهٔ پویا منابع مورد نیاز را در زمان اجرای برنامه در آن بارگذاری کرده و سپس آن‌ها را به برنامهٔ در حال اجرا مقید (به انگلیسی: Bind) می‌کند.

پیونده دهندهٔ پویا عملیات بارگذاری و پیوند منابع و کتابخوانه‌ها را در زمان اجرای برنامه بر عهده دارد. به این صورت که کتابخوانه‌های اشتراکی (به انگلیسی: Shared Libraries) و منابع مورد نیاز برنامه را در زمان اجرا و در صورتی که در حافظهٔ اصلی موجود نباشند، از حافظهٔ پایدار (به انگلیسی: Persistent Storage) به حافظهٔ اصلی منتقل کرده، سپس جدول‌های پرش (به انگلیسی: Jump Table) برنامهٔ بارگذاری شده را با آدرس‌های منابع اشتراکی تکمیل و اشاره‌گرهای (به انگلیسی: Pointer) با آدرس مطلق برنامه را آدرس دهی می‌کند.

پیاده‌سازی پیوند دهندهٔ پویا و بارگذار پویا و توانایی‌ها و کاربردهای آن‌ها بسته به نوع و ردهٔ سیستم‌عامل و نوع فایل‌های اجرایی و منابع مورد نیاز آن‌ها ممکن است متفاوت باشد.

## پیاده‌سازی‌ها
### سیستم‌های عامل [[مایکروسافت ویندوز|ویندوز]]
کتابخانهٔ پیوندی پویا (به انگلیسی Dynamic-link library) یا DLL نام پیاده‌سازی شرکت مایکروسافت از مفهوم کتابخانهٔ اشتراکی است.

این پیاده‌سازی در سیستم‌های عامل ویندوز و OS/2 به کار گرفته شده‌است. فایل‌های کتابخانه‌ای در این پیاده‌سازی معمولاً از پسوند DLL استفاده می‌کنند.

ساختار و قالب این فایل‌ها مانند فایل‌های اجرایی سیستم‌عامل ویندوز (فایل‌های با پسوند EXE) است، از این رو این فایل‌ها می‌توانند شامل بخش‌های مختلفی از جنس کد منبع، اطلاعات برنامه و منابع اجرایی باشند.

کتابخانه‌های اجرایی که تنها شامل اطلاعات و منابع اجرایی باشند را DLLهای منبع می‌نامند.

به عنوان مثالی از این نوع کتابخانه‌های اشتراکی می‌توان کتابخانه‌های آیکون (با پسوند ICL) و برخی از قلم‌ها (به انگلیسی: font) (با پسوندهای FON و FOT) اشاره کرد.

### سیستم‌های عامل بر پایهٔ [[یونیکس]]
در بسیاری از سیستم‌های عامل بر پایهٔ یونیکس (به انگلیسی: Unix) کتابخانه‌های اشتراکی کاملاً مانند برنامه‌های اجرایی عادی هستند.

استفاده از این کتابخانه‌های اجرایی در یک برنامه باعث می‌شود کتابخانهٔ اشتراکی مورد استفاده قبل از بارگذاری برنامهٔ اصلی در فضای حافظهٔ برنامه قرار گیرد، سپس برنامهٔ اصلی بارگذاری شده، ارجاع‌های انجام شده در آن به کتابخانه‌های اشتراکی آدرس‌دهی می‌شوند و در نهایت اجرای برنامهٔ اصلی شروع می‌شود.

اگر بنابر علتی بارگذاری کتابخانهٔ اشتراکی موفقیت‌آمیز نباشد، روال اجرای برنامهٔ اصلی با شکست روبه‌رو خواهد شد.

وظیفهٔ بارگذاری رویه‌های کتابخانه‌های اشتراکی و برنامهٔ اصلی در فضای آدرس دهی برنامه و در نهایت شروع روال اجرا بر عهدهٔ پیونددهندهٔ پویا است.

در سیستم‌های عامل لینوکس (به انگلیسی: Linux) فایل‌های کتابخانه‌های اجرایی اشتراکی از پسوند SO استفاده می‌کنند.

#### سیستم‌های عامل [[مک‌اواس|macOS]] و [[آی‌اواس|iOS]]
در سیستم‌عامل داروین (به انگلیسی: Darwin) شرکت اپل و سیستم‌های عامل macOS و iOS که بر پایهٔ آن بنا شده‌اند نوع پیونده‌دهندهٔ پویایی که باید برای پیونددادن برنامه و کتابخانه‌های مورد استفاده‌اش استفاده شود در زمان پیوند مشخص می‌شود. به این منظور آدرس فایل اجرایی دودویی این پیونددهنده در فضای آدرس دهی پردازه قرار داده می‌شود.

فایل‌های کتابخانه‌های اشتراکی در این سیستم‌های عامل از پسوند DYLIB استفاده می‌کنند.

برنامهٔ اجرایی در این سیستم‌های عامل می‌تواند حین اجرای پیوند دهنده یا حین اجرای خود با پیونددهندهٔ پویا تعامل داشته باشد. به این صورت پیوند دهندهٔ پویا منابعی را با برنامه پیوند خواهد داد که در روال اجرای برنامه مورد نیاز هستند.
از این رو ممکن است منابع بارگذاری شده در دفعات مختلف اجرای یک برنامه متفاوت باشند.

در این سیستم‌های عامل، یک برنامه می‌تواند مدت‌ها پس از شروع اجرایش با تعامل با پیوند دهنده باعث بارگذاری منابع بیشتر یا خارج کردن منابع قبلی از حافظه شود.

این رفتار ویژه به منظور ارائهٔ سرویس‌های مورد نیاز در رابط‌های برنامه‌نویسی کاربردی (به انگلیسی: Application Programming Interface یا API) شرکت اپل مانند Cocoa و Objective-C در نظر گرفته شده‌است.

پیونددهندهٔ پویای اپل در سیستم‌عامل macOS یک پیونده‌دهندهٔ متن باز است که از طریق پروژهٔ متن باز اپل در دسترس عموم قرار دارد.

### سیستم‌های عامل یونیکس بر پایهٔ XCOFF
در سیستم‌های عامل بر پایهٔ XCOFF مانند AIX شرکت IBM فایل‌های کتابخانه‌های اجرایی اشتراکی از پسوند A استفاده می‌کنند.

## جستارهای وابسته
* پیوند مستقیم
* جهنم DLL
* بارگذاری پویا
* اتصال دیرهنگام
* پیش اتصال
* حذف کد مرده

## منابع
* Stephen C. Kleene, آشنایی با فراریاضیات*, North-Holland Publishing Company*, New York, ویرایش دهم سال ۱۹۹۱, اولین نشر در سال ۱۹۵۲.
* Martin Davis*, مقالات اولیه در مورد اظهارات تصمیم ناپذیر، مسائل حل ناشدنی و توابع محاسبه‌پذیر*, Raven Press, New York, نشر در سال ۱۹۶۵.
* Martin Davis, "محاسبات چیست؟", (in *Mathematics Today*, Lynn Arthur Steen, Vintage Books (Random House, نشر در سال ۱۹۸۰.
* Martin Davis, *محاسبه پذیری: با یادداشت‌هایی از Berry Jacobs*, دانشگاه نیویورک، Courant Institute of Mathematical Sciences, نشر در سال ۱۹۷۴.
* Martin Davis, Ron Sigal, Elaine J. Weyuker, (1994) محاسبه‌پذیری، *پیچیدگی و زبان‌ها: مبانی علوم نظری کامپیوتر – ویرایش دوم* Academic Press: Harcourt, Brace & Company, San Diego, 1994  (ویرایش اول، ۱۹۸۳).
* Fred Hennie, *آشنایی با محاسبه پذیری*, Addison–Wesley, نشر در سال ۱۹۷۷.
* Marvin Minsky, (1961), *حل نشدن بازگشتی مسألهٔ 'Tag' پست و مباحث دیگری در ماشین‌های تورینگ* Annals of Mathematics, جلد ۷۴, شمارهٔ ۳, نوامبر ۱۹۶۱.
* Roger Penrose, *The Emperor's New Mind: Concerning computers, Minds and the Laws of Physics*, Oxford University Press, Oxford England, ۱۹۹۰".
* (Hao Wang (۱۹۵۷: "نسخهٔ دیگری از نظریهٔ تورینگ در رابطه با ماشین‌های محاسبه‌گر", *Journal of the Association for Computing Machinery* (JACM) 4, 63–92.
* Muchnick, S.S. «پیاده‌سازی طراحی پیشرفتهٔ کامپیوتر» Morgan Kaufmann Publishers, نشر در سال ۱۹۹۷ 
* Kerrisk, M. «رابط برنامه‌نویسی لینوکس» No Starch Press, نشر در سال ۲۰۱۰ 
* Linux manual page. “ld.so, ld-linux.so - dynamic linker/loader”. man7.org, retrieved: Azar 17 1396
* OS Dev wiki. “Dynamic Linker”. wiki.osdev.org, retrieved: Azar 17 1396
* Microsoft Corporation. “Creating a Resource-Only DLL”. [Microsoft Developer Network Library](http://msdn.microsoft.com/en-US/library/24b2tcy0(v=VS.80).aspx).
* “ld.so.1(1)”. Solaris dynamic linker/loader – مرجع دستورات کاربری سیستم‌عامل Solaris 10
* “ld-linux.so(8)”. Linux Programmer's Manual – دستورات مدیریتی و ممتاز
* “rtld(1)”. FreeBSD dynamic linker/loader – FreeBSD General Commands Manual
* “ld.elf_so(1) ”. NetBSD dynamic linker/loader – NetBSD General Commands Manual
* “ld.so(1)”. OpenBSD dynamic linker/loader – OpenBSD General Commands Manual
* “uncompress.so”, delorie.com. Retrieved Azar 17 1396
* “zlibc.conf”, delorie.com. Retrieved Azar 17 1396
* “dyld(1)”. Darwin/Mac OS X dynamic linker/loader – Darwin and macOS General Commands Manual
* Apple Inc. “Open Source – Releases”. apple.com. Retrieved Azar 17 1396

## مطالعهٔ بیشتر
* *پیونددهنده‌ها و بارگذارنده‌ها* John R. Levine Morgan Kaufmannاکتبر سال ۱۹۹۹ 

## پیوند به بیرون
*https://play.google.com/store/apps/dev?id=5700313618786177705 *IECC.com*
* پیوند پویا در سیستم‌های عامل لینوکس و ویندوز - بخش اول *Symantec.com*
* ساختار کتابخانه‌های پویای لینوکس *IBM.com*
رده:کامپایلرها
رده:کتابخانه‌های رایانه
رده:سوءاستفاده امنیتی از رایانه