WINEDUMP(1) Wine Developers Manual WINEDUMP(1)

winedump - ابزار کار با DLL در Wine

winedump [-h | sym sym | spec dll | dump file ] [mode_options]

دستور winedump ابزاری در Wine است که با هدف کمک به موارد زیر طراحی شده است:

- الف: پیاده‌سازی مجدد یک Win32 DLL برای استفاده در Wine، یا
- ب: کامپایل یک برنامه Win32 با Winelib که از DLLهای x86 استفاده می‌کند

برای هر دو وظیفه، به‌منظور امکان پیوند (link) به توابع Windows به مقداری کد واسط (glue code) نیاز است. این «واسط» در قالب یک فایل .spec ارائه می‌شود. فایل .spec به همراه مقداری کد ساختگی (dummy code)، برای ایجاد یک .so متناظر با DLL ویندوز در Wine استفاده می‌شود. سپس برنامه winebuild می‌تواند فراخوانی‌های انجام‌شده به توابع DLL را برطرف (resolve) کند.

ایجاد یک فایل .spec کاری پرزحمت و زمان‌بر است که احتمال بروز خطا در آن زیاد است. هدف winedump این است که این فرآیند را خودکار کرده و بخش اعظم کد پشتیبان مورد نیاز برای DLL شما را بسازد. علاوه بر این، می‌توانید با استفاده از winedump کدهایی تولید کنید که با امکان ردیابی فراخوانی‌های انجام‌شده به DLL و (در برخی موارد) تشخیص خودکار پارامترها، قراردادهای فراخوانی (calling conventions) و مقادیر بازگشتی توابع DLL، به شما در پیاده‌سازی مجدد DLL کمک کند.

کاربرد دیگر این ابزار، نمایش و استخراج (dump) اطلاعات مربوط به یک فایل ایمیج در قالب PE یا یک DLL سی و دو بیتی است. هنگام استفاده در این حالت، winedump عملکردی مشابه ابزارهایی مانند pedump دارد که توسط بسیاری از ارائه‌دهندگان کامپایلر Win32 عرضه می‌شوند.

در نهایت، از winedump می‌توان برای رمزگشایی و خواناسازی (demangle) نمادهای C++ نیز استفاده کرد.

دستور winedump می‌تواند در چندین حالت مختلف اجرا شود. آرگومان نخست برنامه تعیین می‌کند که winedump در چه حالتی اجرا خواهد شد.

حالت راهنما. راهنمای اولیه نحوه استفاده چاپ می‌شود.
برای استخراج و نمایش محتویات یک فایل.
برای تولید فایل‌های .spec و DLLهای ساختگی (stub).
حالت نماد. برای خواناسازی و رمزگشایی نمادهای C++ به کار می‌رود.

گزینه‌های حالت به حالتی که به عنوان نخستین آرگومان مشخص شده است بستگی دارند.

هیچ گزینه‌ای استفاده نمی‌شود. برنامه اطلاعات راهنما را چاپ کرده و خارج می‌شود.

محتویات file را استخراج و نمایش می‌دهد. قالب‌های مختلف فایل پشتیبانی می‌شوند (PE، NE، LE، Minidumps، .lnk).
رمزگشایی و خواناسازی نمادها (symbol demangling) را فعال می‌کند.
اطلاعات سرآیند فایل را استخراج می‌کند. این گزینه فقط ساختارهای سرآیند استاندارد PE را همراه با بخش‌های COFF موجود در فایل نمایش می‌دهد.
برای فایل‌هایی که سرآیند آن‌ها به دایرکتوری‌ها اشاره دارد، تنها محتوای دایرکتوری dir_name را نمایش می‌دهد. برای فایل‌های PE، دایرکتوری‌های import، export، debug، resource، tls، loadcfg، clr، reloc و except و همچنین بخش apiset پیاده‌سازی شده‌اند. برای فایل‌های NE، دایرکتوری‌های export و resource پیاده‌سازی شده‌اند.
همه‌چیز را نمایش می‌دهد (dump). این دستور تمام اطلاعات موجود (از جمله تمامی دایرکتوری‌های در دسترس - گزینه -j را ببینید) را درباره فایل چاپ می‌کند. از آنجا که خروجی بسیار زیادی تولید خواهد شد، ممکن است بخواهید خروجی را به more/less یا یک فایل هدایت کنید.
محتوای بخش اشکال‌زدایی (debug section) را در صورت وجود استخراج می‌کند (فعلاً تنها اطلاعات stabs پشتیبانی می‌شود).

از dll به عنوان فایل ورودی استفاده کرده و کد پیاده‌سازی را تولید می‌کند.
به دنبال پیش‌نمونه‌ها (prototypes) در دایرکتوری dir می‌گردد (گزینه -c را نیز در بر دارد). در مورد DLLهای ویندوز، این می‌تواند دایرکتوری include استاندارد از کامپایلر شما، یا دایرکتوری include مربوط به SDK باشد. اگر یک سند متنی حاوی پیش‌نمونه‌ها دارید (مانند مستندات)، آن هم قابل استفاده است؛ با این حال ممکن است نیاز باشد برخی خطوط غیرکدی را حذف کنید تا از تجزیه درست پیش‌نمونه‌ها اطمینان حاصل شود. آرگومان dir همچنین می‌تواند یک مشخصه فایل باشد (مانند include/*). اگر حاوی نویسه‌های عام (wildcard) است، باید آن را در نقل‌قول قرار دهید تا پوسته آن را بسط ندهد. اگر هیچ پیش‌نمونه‌ای ندارید، مقدار /dev/null را به عنوان dir مشخص کنید. ممکن است winedump همچنان بتواند مقداری کد stub قابل استفاده برای شما تولید کند.
کد اسکلتی (skeleton code) تولید می‌کند (نیازمند -I). این گزینه به winedump دستور می‌دهد تا برای هر تابع در DLL استاب‌های تابعی (function stubs) ایجاد کند. هنگامی که winedump هر نماد صادرشده را از DLL مبدأ می‌خواند، ابتدا سعی می‌کند نام آن را رمزگشایی (demangle) کند. اگر نام یک نماد C++ باشد، آرگومان‌ها، کلاس و مقدار بازگشتی همگی در نام نماد کدگذاری شده‌اند. Winedump این اطلاعات را به پیش‌نمونه یک تابع C تبدیل می‌کند. در صورت عدم موفقیت، فایل(های) مشخص‌شده در آرگومان -I برای یافتن یک پیش‌نمونه تابع جستجو می‌شوند. در صورت پیدا شدن، برای مرحله بعدی فرآیند یعنی تولید کد استفاده خواهد شد.
ردیابی آرگومان‌ها (TRACE) (گزینه -c را نیز در بر دارد). این گزینه کدی مشابه با -c تولید می‌کند، با این تفاوت که هنگام فراخوانی تابع، آرگومان‌ها در خروجی چاپ می‌شوند. ساختارهایی که بر اساس مقدار (by value) پاس داده می‌شوند به صورت "struct" چاپ می‌شوند، و توابعی که لیست آرگومان متغیر می‌پذیرند "..." را چاپ می‌کنند.
فراخوانی‌ها را به dll هدایت (forward) می‌کند (گزینه -t را نیز در بر دارد). این پیچیده‌ترین سطح تولید کد است. همان کد -t تولید می‌شود، اما پشتیبانی برای هدایت فراخوانی‌ها به یک DLL دیگر نیز افزوده می‌گردد. DLL مقصد برای هدایت فراخوانی‌ها در dll مشخص می‌شود.
تولید مستندات. به‌طور پیش‌فرض، winedump یک کامنت استاندارد در سرآیند هر تابعی که تولید می‌کند قرار می‌دهد. استفاده از این گزینه باعث می‌شود winedump یک قالب سرآیند کامل را برای مستندسازی استاندارد Wine با فهرست کردن پارامترها و مقدار بازگشتی تابع در خروجی تولید کند.
تنظیم نام DLL خروجی (پیش‌فرض: dll). به‌طور پیش‌فرض، اگر winedump روی DLL foo اجرا شود، فایل‌های foo.spec، foo_main.c و غیره را ایجاد کرده و پیشوند FOO_ را به ابتدای تمام توابع تولیدشده اضافه می‌کند. اگر -o bar داده شود، این موارد به ترتیب به bar.spec، bar_main.c و BAR_ تبدیل خواهند شد. این گزینه بیشتر در زمان تولید یک DLL هدایت‌کننده فراخوانی (forwarding DLL) کاربرد دارد.
فرض فراخوانی‌های __cdecl (پیش‌فرض: __stdcall). اگر winebuild نتواند قرارداد فراخوانی را تشخیص دهد، به‌طور پیش‌فرض از __stdcall استفاده می‌شود مگر اینکه این گزینه مشخص شده باشد. مگر در صورت تعیین گزینه -q، برای هر تابعی که winedump قرارداد فراخوانی آن را مشخص کند و با قرارداد فراخوانی فرضی همخوانی نداشته باشد، یک هشدار چاپ خواهد شد.
شروع جستجوی پیش‌نمونه پس از نماد شماره num.
پایان جستجوی پیش‌نمونه پس از نماد شماره num. با دادن گزینه‌های -s یا -e می‌توانید کاری کنید که winedump تنها برای بخشی از توابع موجود در DLL شما کد تولید کند. این ویژگی می‌تواند برای مثال هنگام افزودن قابلیت جدید به یک DLL موجود، جهت تولید یک تابع منفرد به کار رود.
جستجو تنها برای نام‌های پیش‌نمونه موجود در symfile. اگر می‌خواهید فقط برای زیرمجموعه‌ای از توابع صادرشده از DLL مبدأ خود کد تولید کنید، می‌توانید با استفاده از این گزینه، یک فایل متنی حاوی نام‌های نمادها برای استخراج (هر کدام در یک خط) ارائه دهید. تنها نمادهای موجود در این فایل در DLL خروجی شما استفاده خواهند شد.
عدم نمایش پیشرفت (حالت بی‌صدا). هیچ خروجی چاپ نمی‌شود مگر اینکه خطایی مرگبار رخ دهد.
نمایش جزئیات فراوان هنگام کار (حالت پرگو). هنگام اجرای winedump، ۳ سطح از خروجی وجود دارد. در سطح پیش‌فرض، زمانی که نه -q و نه -v مشخص نشده باشد، تعداد توابع صادرشده یافت‌شده در dll چاپ می‌شود، و در ادامه نام هر تابع به همراه وضعیت پردازش موفقیت‌آمیز آن هنگام پردازش نمایش می‌یابد. با تعیین گزینه -v، اطلاعات زیادی در حین کار winedump در خروجی ریخته می‌شود: این ویژگی برای کمک به اشکال‌زدایی مشکلات در نظر گرفته شده است.

نماد C++ با نام sym را رمزگشایی و خوانا (demangle) کرده و سپس خارج می‌شود.

اسکریپت Perl مورد استفاده برای بازیابی پیش‌نمونه تابع.

فایل‌های خروجی در حالت spec برای foo.dll:

این فایل .spec است.
این‌ها فایل‌های کد منبع حاوی حداقل کد لازم برای ساخت یک DLL ساختگی (stub) هستند. فایل C شامل یک تابع است، FOO_Init، که کاری انجام نمی‌دهد (اما وجود آن الزامی است).
این یک الگو برای configure جهت ساخت makefile است. این فایل برای DLLهایی طراحی شده که قرار است در درخت کد منبع Wine قرار گیرند.

رمزگشایی نام C++ به طور کامل با پیاده‌سازی msvcrt هماهنگ نیست. شاید ارسال نام C++ شما به مجموعه آزمون (testsuite) مربوط به msvcrt مفید باشد.

باگ‌ها را می‌توان در سیستم پیگیری باگ Wine گزارش کرد.

Jon P. Griffiths <jon_p_griffiths at yahoo dot com>
Michael Stefaniuc <mstefani at redhat dot com>

دستور winedump بخشی از توزیع Wine است که از طریق WineHQ، یعنی مقر توسعه Wine در دسترس است.

wine(1)
مستندات و پشتیبانی Wine.

October 2005 Wine 11.17