| mono-shlib-cop(1) | General Commands Manual | mono-shlib-cop(1) |
نام (NAME)
mono-shlib-cop - بررسیکننده نحوه استفاده از کتابخانههای مشترک
خلاصه دستور (SYNOPSIS)
mono-shlib-cop [OPTIONS]* [ASSEMBLY-FILE-NAME]*
گزینهها (OPTIONS)
- -p, --prefixes=PREFIX
- پیشوندهای نصب Mono. این گزینه برای پیدا کردن $prefix/etc/mono/config به کار میرود. پیشفرض بر اساس مکان mscorlib.dll تعیین میشود و معمولاً درست است.
توضیحات (DESCRIPTION)
mono-shlib-cop ابزاری است که یک اسمبلی مدیریتشده را برای یافتن استفادههای نادرست یا مشکوک از کتابخانههای مشترک بررسی میکند.
این ابزار یک یا چند نام فایل اسمبلی را دریافت کرده و هر اسمبلی مشخصشده را بررسی میکند.
خطاهای مورد بررسی عبارتند از:
- *
- آیا کتابخانه مشترک وجود دارد؟
- *
- آیا نماد درخواستی در کتابخانه مشترک وجود دارد؟
هشدارهای مورد بررسی عبارتند از:
- *
- آیا کتابخانه مشترک هدف، یک کتابخانه نسخهدار است؟ (فقط در سیستمهای یونیکس مرتبط است، نه Mac OS X یا Windows.)
به طور کلی، فقط کتابخانههای نسخهدار مانند libc.so.6 روی سیستم کاربر وجود دارند، و تلاش برای بارگذاری libc.so منجر به System.DllNotFoundException خواهد شد. سه راهحل برای این مسئله وجود دارد:
- 1.
- از کاربر خواسته شود که بستههای -devel را که کتابخانه بدون نسخه را ارائه میدهند نصب کند. این کار معمولاً مستلزم این است که کاربر تعداد زیادی بسته اضافی نصب کند که فرایند نصب را پیچیده میکند.
- 2.
- استفاده از یک نام کاملاً نسخهدار در دستورات DllImport خود. این کار مستلزم ویرایش کد منبع و کامپایل مجدد در هر بار نیاز به هدف قرار دادن نسخه متفاوتی از کتابخانه مشترک است.
- 3.
- ارائه یک فایل assembly.config که حاوی عناصر <dllmap/> برای نگاشت مجدد نام کتابخانه مشترکِ استفادهشده توسط اسمبلی شما به کتابخانه مشترک نسخهدار واقعیِ موجود در سیستم کاربر باشد. Mono تعدادی ورودی <dllmap/> از پیش موجود، از جمله برای libc.so و libX11.so ارائه میدهد.
مثالها (EXAMPLES)
کد زیر شامل مثالهایی از خطاها و هشدارهای فوق است:
using System.Runtime.InteropServices; // for DllImport
class Demo {
[DllImport ("bad-library-name")]
private static extern void BadLibraryName ();
[DllImport ("libc.so")]
private static extern void BadSymbolName ();
[DllImport ("libcap.so")]
private static extern int cap_clear (IntPtr cap_p);
}
- نام کتابخانه نادرست
- با فرض اینکه کتابخانه bad-library-name روی سیستم شما وجود ندارد، Demo.BadLibraryName یک خطا تولید خواهد کرد، زیرا به یک کتابخانه مشترک نیاز دارد که نمیتواند بارگذاری شود. این مورد ممکن است قابل چشمپوشی باشد؛ بخش گزارش باگها (BUGS) را ببینید.
- نام نماد نادرست
- Demo.BadSymbolName یک خطا تولید خواهد کرد، زیرا libc.so (که توسط فایل $prefix/etc/mono/config مونو به libc.so.6 نگاشت مجدد شده است) شامل تابع BadSymbolName نیست.
- وابستگی به کتابخانه بدون نسخه
- با فرض اینکه فایل libcap.so را دارید، Demo.cap_clear یک هشدار تولید خواهد کرد، زیرا هرچند libcap.so میتواند بارگذاری شود، ممکن است libcap.so روی سیستم کاربر وجود نداشته باشد (در FC2، فایل /lib/libcap.so توسط libcap-devel ارائه میشود، و شما نمیتوانید فرض کنید که کاربران نهایی بستههای -devel را نصب دارند).
اصلاح کد (FIXING CODE)
رفع مشکل به نوع هشدار یا خطا بستگی دارد:
- نامهای کتابخانه نادرست
- از یک نام کتابخانه معتبر در صفت DllImport استفاده کنید، یا یک ورودی <dllmap/> برای نگاشت نام کتابخانه موجود خود به یک نام کتابخانه معتبر ارائه دهید.
- نامهای نماد نادرست
- به نمادی ارجاع دهید که واقعاً در کتابخانه هدف وجود دارد.
- وابستگی به کتابخانه بدون نسخه
- یک ورودی <dllmap/> برای ارجاع به یک کتابخانه به درستی نسخهدار شده ارائه دهید، یا از هشدار صرفنظر کنید (بخش گزارش باگها (BUGS) را ببینید).
ورودیهای DLLMAP (DLLMAP ENTRIES)
مونو برای هر اسمبلی بارگذاریشده، به دنبال یک فایل ASSEMBLY-NAME میگردد و این فایل را برای یافتن اطلاعات نگاشت Dll میخواند. برای مثال، برای mcs.exe ، مونو فایل mcs.exe.config را میخواند، و برای Mono.Posix.dll ، مونو فایل Mono.Posix.dll.config را میخواند.
فایل .config یک سند XML است که حاوی یک بخش سطح بالای <configuration/> با ورودیهای تو در توی <dllmap/> است که شامل صفتهای dll و target میباشد. صفت dll باید شامل همان رشتهای باشد که در مقدار صفت DllImport استفاده شده است، و صفت target مشخص میکند که مونو در زمان اجرا واقعاً کدام کتابخانه مشترک را باید بارگذاری کند.
یک نمونه فایل .config عبارت است از:
<configuration> <dllmap dll="gtkembedmoz" target="libgtkembedmoz.so" /> </configuration>
گزارش باگها (BUGS)
- *
- فقط
ورودیهای
DllImport بررسی
میشوند؛
کدهای IL
پیرامون
نادیده
گرفته
میشوند. در
نتیجه، اگر
یک بررسی در
زمان اجرا
برای
انتخاب این
که کدام
کتابخانه
مشترک
فراخوانی
شود انجام
گیرد، حتی
اگر
کتابخانه
مشخصشده
هرگز
استفاده
نشود یک خطا
گزارش
خواهد شد.
این کد را
در نظر
بگیرید:
using System.Runtime.InteropServices; // for DllImport class Beep { [DllImport ("kernel32.dll")] private static extern int Beep (int dwFreq, int dwDuration); [DllImport ("libcurses.so")] private static extern int beep (); public static void Beep () { if (System.IO.Path.DirectorySeparatorChar == '\\') { Beep (750, 300); } else { beep (); } } }اگر mono-shlib-cop روی این اسمبلی اجرا شود، خطایی برای استفاده از kernel32.dll گزارش خواهد شد، حتی اگر kernel32.dll هرگز در پلتفرمهای یونیکس استفاده نشود. - *
- در حال حاضر
mono-shlib-cop تنها
پسوند فایل
کتابخانه
مشترک را
بررسی
میکند تا
تعیین کند
که آیا باید
هشداری
ایجاد شود
یا خیر. یک
پسوند .so
همیشه یک
هشدار
تولید
میکند،
حتی اگر .so
یک پیوند
نمادین
نباشد، در
یک بسته -devel
ارائه نشده
باشد، و هیچ
کتابخانه
مشترک
نسخهداری
وجود
نداشته
باشد
(نمونههای
محتمل شامل
/usr/lib/libtcl8.4.so ، /usr/lib/libubsec.so و
غیره).
در نتیجه، هشدارها برای چنین کتابخانههایی بیاستفاده و نادرست هستند.
سیستمهای Windows و Mac OS X هرگز هشداری ایجاد نمیکنند، زیرا این پلتفرمها از پسوندهای متفاوتی برای کتابخانههای مشترک استفاده میکنند.
فهرستهای پستی (MAILING LISTS)
برای جزئیات بیشتر به http://lists.ximian.com/mailman/listinfo/mono-devel-list مراجعه کنید.
وبگاه (WEB SITE)
برای جزئیات بیشتر به http://www.mono-project.com مراجعه کنید.