DLLTOOL(1) GNU Development Tools DLLTOOL(1)

dlltool - ایجاد فایل‌های مورد نیاز برای ساخت و استفاده از DLLها

dlltool [-d|--input-def def-file-name]
[-b|--base-file base-file-name]
[-e|--output-exp exports-file-name]
[-z|--output-def def-file-name]
[-l|--output-lib library-file-name]
[-y|--output-delaylib library-file-name]
[--export-all-symbols]
[--no-export-all-symbols]
[--exclude-symbols list]
[--no-default-excludes]
[-S|--as path-to-assembler]
[-f|--as-flags options]
[-D|--dllname name]
[-m|--machine machine]
[-a|--add-indirect]
[-U|--add-underscore]
[--add-stdcall-underscore]
[-k|--kill-at]
[-A|--add-stdcall-alias]
[-p|--ext-prefix-alias prefix]
[-x|--no-idata4]
[-c|--no-idata5]
[--use-nul-prefixed-import-tables]
[-I|--identify library-file-name]
[--identify-strict]
[-i|--interwork]
[-n|--nodelete]
[-t|--temp-prefix prefix]
[-v|--verbose]
[-h|--help]
[-V|--version]
[--no-leading-underscore]
[--leading-underscore]
[--deterministic-libraries]
[--non-deterministic-libraries]
[object-file ...]

دستور dlltool ورودی‌های خود را می‌خواند، که می‌توانند از گزینه‌های -d و -b و همچنین فایل‌های شیء مشخص‌شده در خط فرمان بیایند. سپس این ورودی‌ها را پردازش می‌کند و اگر گزینه -e مشخص شده باشد یک فایل صادرات (exports file) ایجاد می‌کند. اگر گزینه -l مشخص شده باشد یک فایل کتابخانه ایجاد می‌کند و اگر گزینه -z مشخص شده باشد یک فایل def ایجاد می‌کند. هر یک یا همه گزینه‌های -e، -l و -z می‌توانند در یک بار اجرای dlltool حضور داشته باشند.

هنگام ایجاد یک DLL، در کنار کد منبع برای DLL، وجود سه فایل دیگر ضروری است. ابزار dlltool می‌تواند در ایجاد این فایل‌ها کمک کند.

فایل نخست یک فایل .def است که مشخص می‌کند کدام توابع از DLL صادر می‌شوند، DLL کدام توابع را وارد می‌کند و مواردی از این دست. این یک فایل متنی است و می‌تواند به صورت دستی ایجاد شود، یا می‌توان از dlltool برای ایجاد آن با استفاده از گزینه -z استفاده کرد. در این حالت، dlltool فایل‌های شیء مشخص‌شده در خط فرمان را پویش می‌کند تا توابعی را که به طور خاص به عنوان صادرشونده علامت‌گذاری شده‌اند بیابد و مدخل‌هایی برای آن‌ها در فایل .def ایجادشده قرار دهد.

برای علامت‌گذاری یک تابع به عنوان صادرشونده از یک DLL، باید یک مدخل -export:<name_of_function> در بخش .drectve فایل شیء وجود داشته باشد. این کار را می‌توان در C با استفاده از عملگر asm() انجام داد:

asm (".section .drectve");
asm (".ascii \"-export:my_func\"");

int my_func (void) { ... }

فایل دوم مورد نیاز برای ایجاد DLL یک فایل صادرات (exports file) است. این فایل با فایل‌های شیء تشکیل‌دهنده بدنه DLL پیوند داده می‌شود و واسط بین DLL و دنیای خارج را مدیریت می‌کند. این یک فایل باینری است و می‌توان آن را با دادن گزینه -e به dlltool در هنگام ایجاد یا خواندن یک فایل .def ایجاد کرد.

فایل سوم مورد نیاز برای ایجاد DLL، فایل کتابخانه‌ای است که برنامه‌ها برای دسترسی به توابع درون DLL با آن پیوند می‌خورند (یک «کتابخانه واردات» یا `import library'). این فایل را می‌توان با دادن گزینه -l به dlltool در هنگام ایجاد یا خواندن یک فایل .def ایجاد کرد.

اگر گزینه -y مشخص شود، dlltool یک کتابخانه واردات با تأخیر (delay-import library) تولید می‌کند که می‌تواند به جای کتابخانه واردات معمولی استفاده شود تا به برنامه اجازه دهد تنها زمانی که یک تابع وارداتی برای نخستین بار فراخوانی می‌شود به dll پیوند بخورد. فایل اجرایی حاصل باید با کتابخانه ایستای delayimp حاوی __delayLoadHelper2() پیوند داده شود، که آن نیز به نوبه خود LoadLibraryA و GetProcAddress را از kernel32 وارد می‌کند.

ابزار dlltool فایل کتابخانه را به طور مستقیم می‌سازد، اما فایل صادرات را با ایجاد فایل‌های موقت حاوی دستورهای اسمبلی و سپس سرهم‌بندی (assemble) آن‌ها می‌سازد. گزینه خط فرمان -S می‌تواند برای تعیین مسیر اسمبلری که dlltool استفاده خواهد کرد به کار رود، و گزینه -f می‌تواند برای ارسال پرچم‌های خاص به آن اسمبلر استفاده شود. گزینه -n می‌تواند برای جلوگیری از حذف این فایل‌های موقت اسمبلی توسط dlltool پس از اتمام کار استفاده شود، و اگر -n دو بار مشخص شود، مانع از حذف فایل‌های شیء موقتی که برای ساخت کتابخانه استفاده شده است توسط dlltool می‌شود.

در اینجا نمونه‌ای از ایجاد یک DLL از فایل منبع dll.c و همچنین ایجاد برنامه‌ای (از یک فایل شیء به نام program.o) که از آن DLL استفاده می‌کند آورده شده است:

gcc -c dll.c
dlltool -e exports.o -l dll.lib dll.o
gcc dll.o exports.o -o dll.dll
gcc program.o dll.lib -o program

ابزار dlltool همچنین ممکن است برای پرس‌وجو از یک کتابخانه واردات موجود جهت تعیین نام DLL مرتبط با آن استفاده شود. توضیحات گزینه -I یا --identify را ببینید.

گزینه‌های خط فرمان دارای معانی زیر هستند:

نام یک فایل .def را برای خواندن و پردازش مشخص می‌کند.
نام یک فایل پایه (base file) را برای خواندن و پردازش مشخص می‌کند. محتوای این فایل به بخش بازمکانی در فایل صادرات تولیدشده توسط dlltool اضافه خواهد شد.
نام فایل صادراتی را که قرار است توسط dlltool ایجاد شود مشخص می‌کند.
نام فایل .def را که قرار است توسط dlltool ایجاد شود مشخص می‌کند.
نام فایل کتابخانه‌ای را که قرار است توسط dlltool ایجاد شود مشخص می‌کند.
نام فایل کتابخانه واردات با تأخیر را که قرار است توسط dlltool ایجاد شود مشخص می‌کند.
هنگام ایجاد کتابخانه‌های خروجی در پاسخ به گزینه‌های --output-lib یا --output-delaylib، برای هر برچسب زمانی، شناسه کاربر و شناسه گروه ایجادشده مقدار صفر را به کار می‌برد (--deterministic-libraries) یا برچسب‌های زمانی، شناسه کاربر و شناسه گروه واقعی را استفاده می‌کند (--non-deterministic-libraries).
با همه نمادهای تعریف‌شده سراسری و ضعیف یافت‌شده در فایل‌های شیء ورودی به عنوان نمادهای صادرشونده رفتار می‌کند. فهرست کوچکی از نمادها وجود دارد که به طور پیش‌فرض صادر نمی‌شوند؛ گزینه --no-default-excludes را ببینید. می‌توانید با استفاده از گزینه --exclude-symbols به این فهرست از نمادهای صادرنشدنی اضافه کنید.
تنها نمادهایی را صادر می‌کند که به طور صریح در یک فایل ورودی .def یا در بخش‌های .drectve در فایل‌های شیء ورودی فهرست شده‌اند. این رفتار پیش‌فرض است. بخش‌های .drectve توسط ویژگی‌های dllexport در کد منبع ایجاد می‌شوند.
نمادهای موجود در list را صادر نمی‌کند. این آرگومان فهرستی از نام‌های نماد است که با کاما یا دونقطه از هم جدا شده‌اند. نام‌های نماد نباید حاوی خط تیره زیرین (underscore) پیشین باشند. این گزینه تنها زمانی معنادار است که از --export-all-symbols استفاده شود.
هنگامی که از --export-all-symbols استفاده می‌شود، به طور پیش‌فرض از صادرات برخی نمادهای خاص جلوگیری می‌کند. فهرست فعلی نمادهای مستثنی‌شده عبارت است از: DllMain@12، DllEntryPoint@0 و impure_ptr. می‌توانید از گزینه --no-default-excludes برای ادامه کار و صادرات این نمادهای خاص استفاده کنید. این گزینه تنها زمانی معنادار است که از --export-all-symbols استفاده شود.
مسیر اسمبلر، از جمله نام فایل آن را که برای ایجاد فایل صادرات استفاده می‌شود مشخص می‌کند.
هرگونه گزینه خط فرمان خاصی را که قرار است هنگام ساخت فایل صادرات به اسمبلر ارسال شود مشخص می‌کند. این گزینه حتی اگر از گزینه -S استفاده نشود نیز کار خواهد کرد. این گزینه تنها یک آرگومان می‌گیرد، و اگر بیش از یک بار در خط فرمان تکرار شود، موارد بعدی موارد قبلی را بازنویسی خواهند کرد. بنابراین اگر لازم است چندین گزینه به اسمبلر ارسال شود، باید درون نقل‌قول دوتایی (گیومه) قرار گیرند.
نامی را مشخص می‌کند که باید در هنگام استفاده از گزینه -e، در فایل .def به عنوان نام DLL ذخیره شود. اگر این گزینه وجود نداشته باشد، نام فایل داده‌شده به گزینه -e به عنوان نام DLL استفاده خواهد شد.
نوع ماشینی را که فایل کتابخانه باید برای آن ساخته شود مشخص می‌کند. دستور dlltool بسته به نحوه ساخت خود دارای یک نوع پیش‌فرض توکار است، اما این گزینه می‌تواند برای بازنویسی آن استفاده شود. این گزینه معمولاً فقط هنگام ایجاد DLLها برای پردازنده ARM، زمانی که محتوای DLL در واقع با استفاده از دستورالعمل‌های Thumb کدگذاری شده است، مفید است.
مشخص می‌کند که وقتی dlltool در حال ایجاد فایل صادرات است باید بخشی اضافه کند که اجازه می‌دهد به توابع صادرشده بدون استفاده از کتابخانه واردات ارجاع داده شود.
مشخص می‌کند که وقتی dlltool در حال ایجاد فایل صادرات است، باید یک خط تیره زیرین به ابتدای نام همه نمادهای صادرشده اضافه کند.
مشخص می‌کند که آیا نماد استاندارد باید اجباراً پیشوندگذاری شود یا خیر.
مشخص می‌کند که وقتی dlltool در حال ایجاد فایل صادرات است، باید یک خط تیره زیرین به ابتدای نام توابع صادرشده stdcall اضافه کند. نام متغیرها و نام توابع غیر stdcall تغییر نمی‌یابند. این گزینه هنگام ایجاد کتابخانه‌های واردات سازگار با GNU برای DLLهای شخص ثالث که با ابزارهای MS-Windows ساخته شده‌اند مفید است.
مشخص می‌کند که پسوندهای @<number> باید از نام توابع stdcall که قرار است از DLL وارد شوند حذف شوند. این گزینه هنگام ایجاد یک کتابخانه واردات برای یک DLL که توابع stdcall را اما بدون پسوند معمول @<number> در نام نماد صادر می‌کند، مفید است.

این گزینه نام‌گذاری نمادهای ارائه‌شده توسط کتابخانه واردات به برنامه‌های پیوند داده شده با آن را تغییر نمی‌دهد، بلکه تنها مدخل‌های موجود در جدول واردات (یعنی بخش .idata) را تغییر می‌دهد.

مشخص می‌کند که وقتی dlltool در حال ایجاد فایل صادرات است، باید علاوه بر نمادهای دارای @ <number>، نام‌های مستعاری نیز برای نمادهای stdcall بدون @ <number> اضافه کند.
باعث می‌شود dlltool نام‌های مستعار خارجی برای تمام واردات DLL با پیشوند مشخص‌شده ایجاد کند. نام‌های مستعار برای هر دو نماد خارجی و وارداتی بدون خط تیره زیرین ابتدایی ایجاد می‌شوند.
مشخص می‌کند که وقتی dlltool در حال ایجاد فایل‌های صادرات و کتابخانه است باید از بخش ".idata4" صرف‌نظر کند. این برای سازگاری با برخی سیستم‌های عامل خاص است.
مشخص می‌کند که وقتی dlltool در حال ایجاد فایل‌های صادرات و کتابخانه است، باید یک عنصر صفر در ابتدای ".idata4" و ".idata5" قرار دهد. این کار رفتار قدیمی تولید کتابخانه واردات gnu در "dlltool" را شبیه‌سازی می‌کند. این گزینه به طور پیش‌فرض غیرفعال است.
مشخص می‌کند که وقتی dlltool در حال ایجاد فایل‌های صادرات و کتابخانه است باید از بخش ".idata5" صرف‌نظر کند. این برای سازگاری با برخی سیستم‌های عامل خاص است.
مشخص می‌کند که dlltool باید کتابخانه واردات مشخص‌شده توسط filename را بررسی کرده و نام DLL(های) مرتبط را در "stdout" گزارش دهد. این کار می‌تواند علاوه بر هر عملیات دیگری که توسط سایر گزینه‌ها و آرگومان‌ها مشخص شده است انجام شود. اگر کتابخانه واردات وجود نداشته باشد یا در واقع یک کتابخانه واردات نباشد، dlltool ناموفق خواهد بود. همچنین --identify-strict را ببینید.
رفتار گزینه --identify را تغییر می‌دهد، به طوری که اگر filename با بیش از یک DLL مرتبط باشد، خطا گزارش می‌شود.
مشخص می‌کند که dlltool باید اشیاء موجود در فایل کتابخانه و فایل صادراتی را که تولید می‌کند، به عنوان پشتیبانی‌کننده از کارکرد متقابل (interworking) بین کدهای ARM و Thumb علامت‌گذاری کند.
باعث می‌شود dlltool فایل‌های موقت اسمبلی را که برای ایجاد فایل صادرات استفاده کرده است نگه دارد. اگر این گزینه تکرار شود، dlltool همچنین فایل‌های شیء موقتی را که برای ایجاد فایل کتابخانه استفاده می‌کند حفظ خواهد کرد.
باعث می‌شود dlltool هنگام ساخت نام فایل‌های موقت اسمبلی و شیء از prefix استفاده کند. به طور پیش‌فرض، پیشوند فایل موقت از روی شناسه فرایند (PID) تولید می‌شود.
باعث می‌شود dlltool کارهایی را که انجام می‌دهد با جزئیات شرح دهد.
فهرستی از گزینه‌های خط فرمان را نمایش داده و سپس خارج می‌شود.
شماره نسخه dlltool را نمایش داده و سپس خارج می‌شود.
@file
گزینه‌های خط فرمان را از file می‌خواند. گزینه‌های خوانده‌شده به جای گزینه اصلی @file درج می‌شوند. اگر file وجود نداشته باشد یا نتوان آن را خواند، با این گزینه به صورت لفظی برخورد می‌شود و حذف نخواهد شد.

گزینه‌ها در file با نویسه‌های فاصله خالی از هم جدا می‌شوند. نویسه فاصله خالی می‌تواند با احاطه کل گزینه در گیومه تکی یا دوتایی در یک گزینه گنجانده شود. هر نویسه‌ای (از جمله بک‌اسلش) می‌تواند با پیشوند کردن نویسه مورد نظر با بک‌اسلش گنجانده شود. فایل file ممکن است خود حاوی گزینه‌های اضافی @file باشد؛ هر گونه گزینه‌ای از این دست به صورت بازگشتی پردازش خواهد شد.

صفحات راهنمای Info برای binutils.

Copyright (c) 1991-2026 Free Software Foundation, Inc.

مجوز کپی، توزیع و/یا تغییر این سند تحت شرایط مجوز مستندات آزاد گنو (GNU Free Documentation License)، نسخه 1.3 یا هر نسخه جدیدتر منتشرشده توسط بنیاد نرم‌افزارهای آزاد اعطا می‌شود؛ بدون بخش‌های تغییرناپذیر، بدون متون روی جلد و بدون متون پشت جلد. یک نسخه از این مجوز در بخشی با عنوان «GNU Free Documentation License» گنجانده شده است.

2026-08-03 binutils-2.47