| C++FILT(1) | GNU Development Tools | C++FILT(1) |
نام (NAME)
c++filt - بازگردانی نمادهای درهمسازیشدهٔ C++ و Java (demangle)
خلاصه دستور (SYNOPSIS)
c++filt [-_|--strip-underscore]
[-n|--no-strip-underscore]
[-p|--no-params]
[-t|--types]
[-i|--no-verbose]
[-r|--no-recurse-limit]
[-R|--recurse-limit]
[-s format|--format=format]
[--help] [--version] [symbol...]
توضیحات (DESCRIPTION)
زبانهای C++ و Java قابلیت سربارگذاری توابع (function overloading) را ارائه میدهند؛ بدین معنا که میتوانید توابع متعددی با نام یکسان تعریف کنید، به شرط آنکه پارامترهایی با انواع متفاوت دریافت کنند. زبانهای C++ و Java برای تشخیص و تمایز میان این توابعِ همنام، آنها را در قالب نامهای سطحپایین اسمبلی کدگذاری میکنند که هر نسخه را بهطور یکتا مشخص میسازد. این فرایند با عنوان mangling (درهمسازی) شناخته میشود. برنامهٔ c++filt [1] نگاشت معکوس را انجام میدهد: این برنامه نامهای سطحپایین را به نامهای سطح کاربر رمزگشایی (demangle) میکند تا خوانا و قابل فهم باشند.
هر کلمهٔ الفبایی-عددی (متشکل از حروف، ارقام، زیرخط، دلار یا نقطه) که در ورودی مشاهده شود، به عنوان یک نام درهمسازیشدهٔ بالقوه در نظر گرفته میشود. اگر نام به یک نامِ C++ رمزگشایی شود، نامِ C++ در خروجی جایگزین نام سطحپایین میشود؛ در غیر این صورت، کلمهٔ اصلی در خروجی نوشته خواهد شد. به این ترتیب میتوانید کل یک پروندهٔ منبع اسمبلی را که شامل نامهای درهمسازیشده است به c++filt هدایت کرده و همان پرونده را با نامهای رمزگشاییشده دریافت کنید.
شما همچنین میتوانید با ارسال نمادها از طریق خط فرمان، از c++filt برای کشف معنای نمادهای تکی استفاده کنید:
c++filt <symbol>
اگر هیچ آرگومان symbol مشخص نشود، c++filt در عوض نامهای نماد را از ورودی استاندارد میخواند. تمامی نتایج در خروجی استاندارد چاپ میشوند. تفاوت میان خواندن نامها از خط فرمان در مقایسه با خواندن از ورودی استاندارد این است که از آرگومانهای خط فرمان انتظار میرود صرفاً نامهای درهمسازیشده باشند و هیچ بررسی برای جداسازی آنها از متن مجاور انجام نمیشود. بنابراین برای نمونه:
c++filt -n _Z1fv
بهدرستی کار کرده و نام را به «f()» بازگردانی میکند، در حالی که:
c++filt -n _Z1fv,
کار نخواهد کرد. (به کامای اضافه در انتهای نام درهمسازیشده توجه کنید که باعث نامعتبر شدن آن میشود). با این حال، دستور زیر کار خواهد کرد:
echo _Z1fv, | c++filt -n
و عبارت «f(),» را نمایش میدهد؛ یعنی نام رمزگشاییشده به همراه کامایی که در انتهای آن قرار دارد. این رفتار به این دلیل است که در خواندن از ورودی استاندارد، این انتظار وجود دارد که نامها بخشی از پروندهٔ منبع اسمبلی باشند که ممکن است نویسههای اضافه و بیربطی به انتهای نام درهمسازیشده چسبیده باشد. به عنوان نمونه:
.type _Z1fv, @function
گزینهها (OPTIONS)
- -_
- --strip-underscore
- در برخی سامانهها، کامپایلرهای C و C++ یک خط زیرخط (underscore) در ابتدای هر نام قرار میدهند. برای مثال، نامِ C نماد "foo" به نام سطحپایین "_foo" تبدیل میشود. این گزینه خط زیرخط ابتدایی را حذف میکند. حذف شدن یا نشدن این زیرخط بهصورت پیشفرض در c++filt، به معماری مقصد بستگی دارد.
- -n
- --no-strip-underscore
- زیرخط ابتدایی را حذف نکن.
- -p
- --no-params
- هنگام رمزگشایی نام تابع، نوع پارامترهای تابع را نمایش نده.
- -t
- --types
- تلاش برای بازگردانی نوعها (types) علاوه بر نام توابع. این گزینه بهصورت پیشفرض غیرفعال است، زیرا نوعهای درهمسازیشده معمولاً فقط در داخل کامپایلر کاربرد دارند و ممکن است با نامهای درهمسازینشده اشتباه گرفته شوند. برای نمونه، تابعی به نام «a» اگر به عنوان یک نوع درهمسازیشده فرض شود، به «signed char» رمزگشایی خواهد شد.
- -i
- --no-verbose
- جزئیات پیادهسازی (در صورت وجود) را در خروجیِ بازگردانیشده نیاور.
- -r
- -R
- --recurse-limit
- --no-recurse-limit
- --recursion-limit
- --no-recursion-limit
- فعال یا
غیرفعال
کردن
محدودیت در
میزان
بازگشت (recursion)
انجامشده
در هنگام
رمزگشایی
رشتهها. از
آنجا که
قالبهای
درهمسازی
نامها
بازگشت
نامحدود را
مجاز
میشمارند،
ممکن است
رشتههایی
ساخته شوند
که
رمزگشایی
آنها تمام
فضای پشتهٔ
(stack) موجود در
ماشین
میزبان را
به پایان
رسانده و
خطای حافظه
ایجاد کند.
این
محدودیت
تلاش
میکند با
محدود کردن
بازگشت به
۲۰۴۸ سطح
تودرتو، از
این رویداد
پیشگیری
کند.
پیشفرض بر این است که این محدودیت فعال باشد، اما برای رمزگشایی نامهای بسیار پیچیده ممکن است غیرفعال کردن آن ضروری باشد. با این حال توجه داشته باشید که در صورت غیرفعال کردن این محدودیت، سرریز و اتمام پشته ممکن خواهد بود و هرگونه گزارش باگ در این زمینه رد خواهد شد.
گزینهٔ -r مترادف گزینهٔ --no-recurse-limit است. گزینهٔ -R مترادف گزینهٔ --recurse-limit است.
- -s format
- --format=format
- ابزار c++filt میتواند روشهای مختلف درهمسازی مورد استفاده در کامپایلرهای متنوع را رمزگشایی کند. آرگومانِ این گزینه روش مورد استفاده را مشخص میکند:
- "auto"
- انتخاب خودکار بر اساس پروندهٔ اجرایی (روش پیشفرض)
- "gnu"
- روش مورد استفاده توسط کامپایلر GNU C++ (g++)
- "lucid"
- روش مورد استفاده توسط کامپایلر Lucid (lcc)
- "arm"
- روش مشخصشده توسط کتاب مرجع تفسیری C++ (ARM)
- "hp"
- روش مورد استفاده توسط کامپایلر HP (aCC)
- "edg"
- روش مورد استفاده توسط کامپایلر EDG
- "gnu-v3"
- روش مورد استفاده توسط کامپایلر GNU C++ (g++) با رابط ABI نسخهٔ ۳ (V3 ABI).
- "java"
- روش مورد استفاده توسط کامپایلر GNU Java (gcj)
- "gnat"
- روش مورد استفاده توسط کامپایلر GNU Ada (GNAT).
- --help
- نمایش چکیدهای از گزینههای c++filt و خروج.
- --version
- نمایش نسخهٔ c++filt و خروج.
- @file
- خواندن
گزینههای
خط فرمان از
file.
گزینههای
خواندهشده
بهجای
گزینهٔ
اصلی @file
جایگزین
میشوند.
اگر file وجود
نداشته
باشد یا
قابل
خواندن
نباشد، با
این گزینه
بهصورت
تحتاللفظی
رفتار
خواهد شد و
حذف
نمیشود.
گزینهها در file با نویسههای فاصله از یکدیگر جدا میشوند. یک نویسهٔ فاصله را میتوان با قرار دادن کل گزینه در میان نقلقول تکی یا جفتی در آن گنجاند. هر نویسهای (شامل بکاسلش) میتواند با پیشوند کردن یک بکاسلش در کنار نویسه وارد شود. خودِ file میتواند حاوی گزینههای @file دیگری باشد؛ چنین گزینههایی بهصورت بازگشتی پردازش خواهند شد.
پاورقیها (FOOTNOTES)
- 1.
- سامانهٔ MS-DOS اجازهٔ استفاده از نویسهٔ "+" را در نام پروندهها نمیدهد، بنابراین در MS-DOS نام این برنامه CXXFILT است.
همچنین ببینید (SEE ALSO)
مدخلهای Info برای binutils.
کپیرایت و تکثیر (COPYRIGHT)
حق نشر © ۱۹۹۱-۲۰۲۶ بنیاد نرمافزار آزاد (Free Software Foundation, Inc.)
اجازهٔ نسخهبرداری، توزیع و/یا تغییر این سند تحت شرایط مجوز مستندات آزاد گنو (GNU Free Documentation License)، نسخهٔ ۱.۳ یا هر نسخهٔ متأخرتری که توسط بنیاد نرمافزار آزاد منتشر شده، داده میشود؛ بدون بخشهای تغییرناپذیر، بدون متون جلد و بدون متون پشت جلد. نسخهای از این مجوز در بخش مربوط به «GNU Free Documentation License» آورده شده است.
| 2026-07-30 | binutils-2.47 |