Prelink
"این مقاله در حال ترجمه از ویکی انگلیسی است. لطفا حذف نشود."
در محاسبات ، prebinding که به آن prelinking نیز میگویند، روشی برای بهینهسازی زمان اجرای برنامه، با پیدا کردن نمادهای کتابخانه قبل از اجرا است.
زمینه[ویرایش]
اکثر برنامه های کامپیوتری شامل کدهایی هستند که برای اجرا شدن نیاز به کتابخانه های به اشتراک گذاشته شده ی خارجی دارند. این کتابخانه ها معمولاً در زمان اجرا توسط یک لودر با برنامه در فرآیندی به نام پیوند شدن پویا (dynamic linking)، ادغام می گردند.
در حالی که پیوند شدن پویا دارای مزیت هایی در اندازه کد و مدیریت آن است، معایبی نیز به همراه خواهد داشت. هر بار که یک برنامه اجرا می شود، اجرا کننده باید کتابخانه های مربوطه را پیدا کند. از آنجایی که کتابخانه ها در حافظه جابجا می شوند، پس پیدا کردن آن برای عملکرد هزینه ای دارد. این هزینه برای هر کتابخانه ی اضافی که نیاز به پیدا کردن دارد افزایش می یابد.
Prelinking با پیدا کردن کتابخانه ها از قبل، این هزینه را کاهش می دهد. که پس از آن، فرایند پیدا کردن تنها در صورتی رخ میدهد که کتابخانهها از زمان prelink شدن تغییر کرده باشند، همانند بعد از ارتقا یافتن آنها.
Mac OS[ویرایش]
در Mac OS فایل های اجرایی با فرمت Mach-O ذخیره می شوند.
Mac OS X، عملیات prebinding را در مرحله "بهینه سازی" برای نصب کردن نرم افزارهای سیستم و یا برنامه های خاص، انجام می دهد.
Prebinding چند بار در سری Mac OS X تغییر کرده است. قبل از 10.2، prebinding فقط هنگام مراحل نصب رخ میداد (مرحله "بهینه سازی" گفته شده در بالا). از 10.2 تا 10.3، سیستمعامل در زمان اجرای برنامهها، prebinding را بررسی میکرد و اولین باری که یک برنامه اجرا میشد، prebound میشد و راهاندازیهای بعدی را سریعتر میکرد. این عملیات همچنین می توانست به صورت دستی اجرا شود، که برخی از فرایند های نصب در سطح سیستم عامل، آنرا انجام می دادند. در 10.4، فقط کتابخانههای سیستم عامل prebound بودند. در 10.5 و بعد از آن، اپل prebinding را با مکانیزم حافظه پنهان مشترک dyld جایگزین کرد، که عملکرد بهتری را برای سیستمعامل فراهم می کرد.
لینوکس[ویرایش]
در لینوکس، prelinking از طریق برنامه ای به اسم 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 در دسترس باشد، آسیبپذیریهای پیمایش دایرکتوری میتوانند، توسط مهاجمانی که حساب ندارند مورد استفاده قرار بگیرند.
به سبب اینکه عملیات prelink عموما به صورت دوره ای اجرا می شود، اغلب هر دو هفته یکبار، آدرس هر کتابخانه ای که داده شده است، در طول زمان امکان تغییر دارد. prelink عموما در حالت افزایشی استفاده میشود که در آن کتابخانههای از قبل پیوند داده شده تغییری نخواهند کرد، مگر اینکه کاملاً ضروری باشد، بنابراین یک کتابخانه ممکن است آدرس پایه ی خود را زمانی که prelink دوباره اجرا میشود تغییر ندهد. این کار به هر آدرس نشئت گرفته شده، نصف عمر دوره ای که در آن prelink اجرا می شود را می دهد. همچنین توجه داشته باشید که اگر نسخه جدیدی از کتابخانه نصب شود، آدرس ها تغییر می کند.
Jakub Jelínek اشاره می کند که position independent executables (PIE) از prelinkشدن در لینوکس Red Hat Enterprise و Fedora چشم پوشی می کند و توصیه می کند که شبکه و SUID برنامه ها برای کمک کردن به یک محیط امن تر، به صورت PIE ساخته شوند.
Issues[ویرایش]
بعضی اوقات، prelink میتواند باعث بوجود آمدن مشکلاتی در ایست بازرسی برنامه و راهاندازی مجدد کتابخانههایی همانند 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 "Prelink" is from Wikipedia. The list of its authors can be seen in its historical and/or the page Edithistory:Prelink. Articles copied from Draft Namespace on Wikipedia could be seen on the Draft Namespace of Wikipedia and not main one.