پیش پیوند
این مقاله، پیش پیوند، اخیراً بهواسطهٔ فرایند ایجاد مقاله ایجاد شدهاست. بازبینیکننده در حال بستن درخواست است و این برچسب احتمالاً بهزودی برداشته میشود.
ابزارهای بازبینی: پیشبارگیری بحث اعلان به نگارنده |
خطای اسکریپتی: پودمان «AfC submission catcheck» وجود ندارد. "این مقاله در حال ترجمه از ویکی انگلیسی است. لطفا حذف نشود."
در محاسبات ، 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
رده:نرمافزارهای سیستمی آزاد رده:نرمافزارهای مدیریت حافظه رده:مک اواس رده:پیش پیوند رده:پیوند سازی
This article "پیش پیوند" is from Wikipedia. The list of its authors can be seen in its historical and/or the page Edithistory:پیش پیوند. Articles copied from Draft Namespace on Wikipedia could be seen on the Draft Namespace of Wikipedia and not main one.