"این مقاله در حال ترجمه از ویکی انگلیسی است. لطفا حذف نشود."

در محاسبات ، **prebinding** که به آن **prelinking** نیز می‌گویند (پیش پیوند سازی)، روشی برای بهینه‌سازی زمان اجرای برنامه است که با پیدا کردن نمادهای کتابخانه، قبل از اجرا صورت میگرد.

زمینه
-----

اکثر برنامه های کامپیوتری شامل کدهایی هستند که برای اجرا شدن نیاز به کتابخانه های به اشتراک گذاشته شده ی خارجی دارند. این کتابخانه ها معمولاً در زمان اجرا توسط یک لودر با برنامه در فرآیندی به نام پیوند شدن پویا (dynamic linking)، ادغام می گردند.

در حالی که پیوند شدن پویا دارای مزیت هایی در اندازه کد و مدیریت آن است، معایبی نیز به همراه خواهد داشت. هر بار که یک برنامه اجرا می شود، اجرا کننده باید کتابخانه های مربوطه را پیدا کند. از آنجایی که کتابخانه ها در حافظه جابجا می شوند، پس پیدا کردن آن برای عملکرد هزینه ای دارد. این هزینه برای هر کتابخانه ی اضافی که نیاز به پیدا کردن دارد افزایش می یابد.

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

Mac OS
------

در Mac OS فایل های اجرایی با فرمت Mach-O ذخیره می شوند.

Mac OS X، عملیات پیش پیوند شدن را در مرحله "بهینه سازی" برای نصب کردن نرم افزارهای سیستم و یا برنامه های خاص، انجام می دهد.

پیش پیوند شدن چند بار در سری Mac OS X تغییر کرده است. قبل از 10.2، پیش پیوندی فقط هنگام مراحل نصب رخ میداد (مرحله "بهینه سازی" گفته شده در بالا). از 10.2 تا 10.3، سیستم‌عامل در زمان اجرای برنامه‌ها، پیش پیوندی را بررسی می‌کرد و اولین باری که یک برنامه اجرا می‌شد، prebound می‌شد و راه‌اندازی‌های بعدی را سریع‌تر می‌کرد. این عملیات همچنین می توانست به صورت دستی اجرا شود، که برخی از فرایند های نصب در سطح سیستم عامل، آنرا انجام می دادند. در 10.4، فقط کتابخانه‌های سیستم عامل prebound بودند. در 10.5 و بعد از آن، اپل prebinding را با مکانیزم حافظه پنهان مشترک dyld جایگزین کرد،  که عملکرد بهتری را برای سیستم‌عامل فراهم می کرد.

لینوکس
------

در لینوکس، پیش پیوندی از طریق برنامه ای به اسم **prelink** انجام می شود. prelink برنامه ای رایگان است که توسط Jakub Jelínek از Red Hat برای باینری های ELF نوشته شده است.

نتایج بدست آمده از عملکرد آن در هم تنیده شده اند[*نیازمند شفاف‌سازی*] ، اما به نظر می رسد که prelink به سیستم هایی که تعداد زیادی کتابخانه دارند ، مانند KDE کمک می کند.

### تصادفی سازی prelink

هنگامی که با گزینه "-R" اجرا می شود، prelink به طور تصادفی پایگاه آدرسی را که کتابخانه ها در آن بارگذاری می شوند، انتخاب می کند. این انتخاب انجام حمله ی بازگشت به libc را سخت‌تر می‌کند زیرا آدرس‌ها، مختص به آن سیستم هستند. دلیل انجام این کار توسط prelink این است که امکانات کرنل که تصادفی‌سازی طرح‌بندی فضای آدرس (ASLR) را برای کتابخانه‌ها فراهم می‌کنند، امکان استفاده همزمان با prelink را، بدون توقف هدف از prelink و اجبار کردن پیوند دهنده پویا(dynamic linker) به انجام جابه‌جایی در زمان اجرای برنامه را ندارند.

همانطور که گفته شد، prelink و پیش پردازش تصادفی ساز آدرس کتابخانه را نمی توان همزمان با هم استفاده کرد. به منظور جلوگیری از حذف کامل این بهبود امنیتی، prelink تصادفی سازی خود را ارائه می دهد. با این حال، این تصادفی سازی به نشت اطلاعات عمومی ناشی شده توسط prelink کمکی نمی کند. مهاجمانی که قادر به خواندن برخی فایل‌های دلخواه روی سیستم هدف هستند، می‌توانند مکان‌هایی را که کتابخانه‌ها در deamonهای ممتاز بارگذاری شده‌اند را کشف کنند. اغلب libc کافی است، زیرا libc رایج ترین کتابخانه مورد استفاده در حملات بازگشت به libc است.

با خواندن یک فایل کتابخانه ای به اشتراک گذاشته شده مانند libc، مهاجمی با دسترسی محلی، می تواند آدرس اجرای libc را در هر برنامه دیگری در سیستم پیدا کند. از آنجایی که اکثر برنامه ها نیز به libc پیوندی دارند، فایل کتابخانه libc همیشه باید قابل خواندن باشد. هر مهاجم با دسترسی محلی این امکان را دارد که اطلاعاتی در مورد فضای آدرس در فرآیندهای با رتبه بالاتر را جمع آوری کند. دسترسی محلی معمولاً توسط حساب‌های پوسته یا حساب‌های وب سرور که امکان استفاده از اسکریپت‌های CGI را فراهم می‌کنند، به دست می‌آید، که این قابلیت را دارد که هر فایلی را در سیستم بخواند و خروجی دهد.[] اگر آسیب‌پذیری‌های اسکریپت CGI در دسترس باشد، آسیب‌پذیری‌های پیمایش دایرکتوری می‌توانند، توسط مهاجمانی که حساب ندارند مورد استفاده قرار بگیرند.

به سبب اینکه عملیات پیش پیوند سازی عموما به صورت دوره ای اجرا می شود، اغلب هر دو هفته یکبار، آدرس هر کتابخانه ای که داده شده است، در طول زمان امکان تغییر دارد. پیش پیوند سازی عموما در حالت افزایشی استفاده می‌شود که در آن کتابخانه‌های از قبل پیوند داده شده تغییری نخواهند کرد، مگر اینکه کاملاً ضروری باشد، بنابراین یک کتابخانه ممکن است آدرس پایه ی خود را زمانی که پیش پیوند سازی دوباره اجرا میشود، تغییر ندهد. این کار به هر آدرس نشئت گرفته شده، نصف عمر دوره ای که در آن پیش پیوند سازی اجرا می شود را می دهد. همچنین توجه داشته باشید که اگر نسخه جدیدی از کتابخانه نصب شود، آدرس ها تغییر می کند.

Jakub Jelínek اشاره می کند که position independent executables (PIE) از پیش پیوند شدن در لینوکس Red Hat Enterprise و Fedora چشم پوشی می کند و توصیه می کند که شبکه و SUID برنامه ها برای کمک کردن به یک محیط امن تر، به صورت PIE ساخته شوند.

مسائل
-----

بعضی اوقات، پیش پیوندی می‌تواند باعث بوجود آمدن مشکلاتی در ایست بازرسی برنامه و راه‌اندازی مجدد کتابخانه‌هایی همانند `blcr` ،  و همچنین کتابخانه‌های دیگر (مانند OpenMPI ) که از `blcr` داخلی استفاده می‌کنند، شود. به خصوص هنگام بررسی یک برنامه در یک میزبان، و تلاش برای راه اندازی مجدد در میزبانی دیگر، برنامه راه اندازی مجدد ممکن است با خطای segfault به دلیل تفاوت در تصادفی سازی آدرس حافظه، در یک کتابخانه ی میزبان مشخص، به مشکل بر بخورد.

همچنین ببینید
-------------

* Dynamic binding
* Library (computing)
* Linker (computing)
* Loader (computing)
* Object file
* Rebasing
* Relocation
* Static library
* Prefetcher

منابع
-----

* A detailed explanation of prebinding

لینک های خارجی
--------------

* `prelink(8)`: prelink ELF shared libraries and binaries to speed up startup time – لینوکس دستورات ممتاز و مدیریتی صفحه راهنما
* Official releases by Jakub Jelínek
* Yocto Project fork prelink-cross