.\" Process this file with .\" groff -man -Tascii patchelf.1 .\" .TH PATCHELF 1 "JULY 2022" PATCHELF "User Manuals" .SH "نام (NAME)" patchelf \- ویرایش و تغییر فایل‌های ELF .SH "خلاصه دستور (SYNOPSIS)" .B patchelf .I OPTION .B .I FILE .SM ... .B .SH "توضیحات (DESCRIPTION)" ابزار PatchELF یک ابزار ساده برای تغییر و دستکاری فایل‌های اجرایی و کتابخانه‌های ELF موجود است. این ابزار می‌تواند بارگذار پویا («مفسر ELF») فایل‌های اجرایی را تغییر داده و RPATH فایل‌های اجرایی و کتابخانه‌ها را ویرایش کند. .SH "گزینه‌ها (OPTIONS)" تک‌گزینهٔ داده‌شده روی هر FILE اعمال شده و فایل‌ها درجا (در محل) ویرایش می‌شوند. هر گزینه‌ای که آرگومان رشته‌ای می‌پذیرد، با قرار دادن نماد @ در ابتدای آرگومان می‌تواند یک فایل را نیز به عنوان ورودی دریافت کند. بخش «مثال‌ها (EXAMPLES)» را ببینید. .IP "--page-size SIZE" به‌جای اندازه پیش‌فرض، از اندازه صفحه (page size) داده‌شده استفاده می‌کند. .IP "--set-interpreter INTERPRETER" بارگذار پویای («مفسر ELF») فایل اجرایی را به INTERPRETER تغییر می‌دهد. .IP --print-interpreter مفسر ELF فایل اجرایی را چاپ می‌کند. .IP --print-os-abi مقدار OS ABI فایل اجرایی (فیلد EI_OSABI فایل ELF) را چاپ می‌کند. .IP "--set-os-abi ABI" مقدار OS ABI فایل اجرایی (فیلد EI_OSABI فایل ELF) را تغییر می‌دهد. پارامتر ABI بسیار انعطاف‌پذیر است. برای نمونه، می‌توانید آن را به‌صورت "Linux"، "linux" یا حتی "lInUx" مشخص کنید \- تمام این نام‌ها فیلد EI_OSABI سرآیند ELF را روی مقدار "3" که متناظر با Linux OS ABI است تنظیم می‌کنند. همین قاعده برای سایر نام‌های ABI نظیر System V، FreeBSD، Solaris و غیره نیز صدق می‌کند. .IP --print-soname مدخل DT_SONAME بخش .dynamic را چاپ می‌کند. در صورتی که DT_SONAME وجود نداشته باشد، خطا صادر می‌کند. .IP "--set-soname SONAME" مدخل DT_SONAME یک کتابخانه را به SONAME تنظیم می‌کند. .IP "--set-rpath RUNPATH" مقدار DT_RUNPATH فایل اجرایی یا کتابخانه را به RUNPATH تغییر می‌دهد. .IP "--add-rpath RUNPATH" مقدار RUNPATH را به DT_RUNPATH موجود در فایل اجرایی یا کتابخانه اضافه می‌کند. .IP --remove-rpath مدخل DT_RPATH یا DT_RUNPATH فایل اجرایی یا کتابخانه را حذف می‌کند. .IP --shrink-rpath تمام دایرکتوری‌هایی را که شامل هیچ کتابخانه‌ای که توسط فیلدهای DT_NEEDED فایل اجرایی یا کتابخانه ارجاع داده شده است نیستند، از DT_RUNPATH یا DT_RPATH حذف می‌کند. برای نمونه، اگر یک فایل اجرایی به یک کتابخانه به نام libfoo.so ارجاع دهد، دارای RPATH با مقدار "/lib:/usr/lib:/foo/lib" باشد و libfoo.so تنها در /foo/lib یافت شود، آنگاه RPATH جدید برابر با "/foo/lib" خواهد بود. .IP "--allowed-rpath-prefixes PREFIXES" در ترکیب با گزینهٔ "--shrink-rpath"، این گزینه می‌تواند برای تنظیم دقیق‌تر rpath استفاده شود. برای نمونه، اگر یک فایل اجرایی دارای RPATH با مقدار "/tmp/build-foo/.libs:/foo/lib" باشد، احتمالاً مطلوب است که ارجاع "/foo/lib" به‌جای مدخل "/tmp" نگه داشته شود. .IP --print-rpath مقدار DT_RUNPATH یا DT_RPATH را برای یک فایل اجرایی یا کتابخانه چاپ می‌کند. .IP --force-rpath استفاده از DT_RPATH منسوخ‌شده را در فایل به‌جای DT_RUNPATH اجباری می‌کند. به‌طور پیش‌فرض DT_RPATH به DT_RUNPATH تبدیل می‌شود. .IP "--add-needed LIBRARY" یک وابستگی اعلام‌شده به یک کتابخانه پویا (DT_NEEDED) اضافه می‌کند. این گزینه می‌تواند چندین بار مشخص شود. .IP "--replace-needed LIB_ORIG LIB_NEW" یک وابستگی اعلام‌شده به یک کتابخانه پویا را با کتابخانه دیگری جایگزین می‌کند (DT_NEEDED). این گزینه می‌تواند چندین بار مشخص شود. .IP "--remove-needed LIBRARY" یک وابستگی اعلام‌شده به LIBRARY را حذف می‌کند (مدخل DT_NEEDED). این گزینه می‌تواند چندین بار مشخص شود. .IP --print-needed تمام مدخل‌های DT_NEEDED فایل اجرایی را چاپ می‌کند. .IP "--no-default-lib" شیء (object) را به گونه‌ای علامت‌گذاری می‌کند که جستجو برای وابستگی‌های این شیء از تمام مسیرهای پیش‌فرض جستجوی کتابخانه صرف‌نظر کند. .IP "--build-resolution-cache" هر وابستگی DT_NEEDED را در زمان وصله‌زدن در برابر مسیر اجرای شیء (run path) حل کرده و نتیجه را در یک یادداشت \fB.note.nixos.ldcache\fR ثبت می‌کند، به طوری که یک بارگذار که این یادداشت را درک می‌کند بتواند از جستجوی مسیر اجرا در زمان راه‌اندازی صرف‌نظر کند. دایرکتوری‌هایی که از قبل قابل حل نیستند (مؤلفه‌های خالی یا نسبی، مواردی که حاوی نشانه‌های رشته‌ای پویا مانند \fB$ORIGIN\fR یا یک زیردایرکتوری \fBglibc-hwcaps\fR هستند، و مسیرهایی که در زمان وصله‌زدن به دلیل مفقود بودن، دایرکتوری نبودن، یا عدم دسترسی قابل جستجو نیستند) به‌جای یک مسیر دقیق، به عنوان یک راهنمای جستجو ذخیره می‌شوند. این حافظه موقت یک بار از روی باینری وصله‌نشده ساخته می‌شود؛ این گزینه نمی‌تواند با \fB--force-rpath\fR ترکیب شود. .IP "--no-sort" سرآیندهای برنامه یا سرآیندهای بخش را مرتب نمی‌کند. این ویژگی هنگام اشکال‌زدایی patchelf مفید است، چرا که خواندن تفاوت‌های (diffs) خروجی "readelf -a" را آسان‌تر می‌کند. .IP "--add-debug-tag" در صورتی که برچسب DT_DEBUG هنوز در یک شیء ELF وجود نداشته باشد، آن را به بخش .dynamic اضافه می‌کند. یک کتابخانه اشتراکی (-shared) به‌طور پیش‌فرض برچسب DT_DEBUG را دریافت نمی‌کند. این بدان معناست که وقتی یک کتابخانه اشتراکی دارای یک نقطه ورود باشد (به طوری که بتوان آن را به عنوان یک فایل اجرایی اجرا کرد)، دیباگر به‌درستی به آن متصل نمی‌شود و نمادها حل نمی‌شوند. .IP "--print-execstack" وضعیت پرچم قابل اجرا بودن سرآیند برنامه GNU_STACK را (در صورت وجود) چاپ می‌کند. .IP "--clear-execstack" پرچم قابل اجرا بودن سرآیند برنامه GNU_STACK را پاک می‌کند، یا یک سرآیند جدید اضافه می‌کند. .IP "--set-execstack" پرچم قابل اجرا بودن سرآیند برنامه GNU_STACK را تنظیم می‌کند، یا یک سرآیند جدید اضافه می‌کند. .IP "--rename-dynamic-symbols NAME_MAP_FILE" نمادهای پویا را تغییر نام می‌دهد. فایل نگاشت نام باید شامل خطوطی با نام قدیم و نام جدید باشد که با فاصله از هم جدا شده‌اند، مانند این: old_name new_name نام‌های نماد شامل مشخص‌کننده‌های نسخه‌ای که در خروجی دستور nm -D از binutils نیز نشان داده می‌شوند، نیستند. بنابراین به جای نام write@GLIBC_2.2.5، تنها مقدار write است. .IP "--no-clobber-old-sections" مقادیر بخش‌های قدیمی را رونویسی (clobber) نمی‌کند. به‌طور پیش‌فرض patchelf بخش‌های سرآیند جایگزین‌شده را با داده‌های بی‌استفاده رونویسی می‌کند تا اطمینان حاصل شود که به طور تصادفی استفاده نمی‌شوند. این گزینه اجازه می‌دهد تا از این رفتار انصراف داده شود، به طوری که فایل‌های باینری که تلاش می‌کنند سرآیندهای خود را از یک آفست ثابت بخوانند (مانند Firefox) همچنان کار کنند. به ندرت و با احتیاط استفاده شود. .IP "--output FILE" نام فایل خروجی را تعیین می‌کند. در صورت عدم تعیین، فایل ورودی درجا تغییر می‌یابد. .IP --debug جزئیات تغییرات ایجادشده در فایل ورودی را چاپ می‌کند. .IP --version نسخه patchelf را نمایش می‌دهد. .SH "مثال‌ها (EXAMPLES)" برای استفاده از محتویات یک فایل خارجی به عنوان پارامتر: .RS $ patchelf a.out --add-rpath @/tmp/generated-rpath.bin .RE برای تغییر دادن RPATH یک باینری. توجه داشته باشید که .BR $ORIGIN یک نماد ویژه است که توسط بارگذار استفاده می‌شود، بنابراین باید داخل علامت نقل‌قول قرار گیرد. .RS patchelf --set-rpath '$ORIGIN/../lib64' a.out .RE .SH "نویسندگان (AUTHORS)" Eelco Dolstra .SH "همچنین ببینید (SEE ALSO)" .BR elf (5), .BR ld.so (8)