C++FILT(1) GNU Development Tools C++FILT(1)

c++filt - خواناسازی نمادهای C++ و Java

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...]

زبان‌های C++ و Java قابلیت سربارگذاری تابع (function overloading) را ارائه می‌دهند؛ بدین معنی که می‌توانید چندین تابع با نام یکسان بنویسید، به شرط آنکه هر تابع پارامترهایی از انواع متفاوت دریافت کند. برای امکان تمایز بین این توابع هم‌نام، C++ و Java آن‌ها را در یک نام سطح پایین اسمبلی کدگذاری می‌کنند که هر نسخهٔ متفاوت را به‌طور یکتا مشخص می‌سازد. این فرآیند با عنوان mangling (درهم‌سازی) شناخته می‌شود. برنامهٔ c++filt [1] عمل نگاشت معکوس را انجام می‌دهد: این برنامه نام‌های سطح پایین را به نام‌های سطح کاربر رمزگشایی (demangles یا خواناسازی) می‌کند تا قابل خواندن باشند.

هر کلمهٔ حرفی-عددی (شامل حروف، ارقام، زیرخط، دلار یا نقطه) که در ورودی دیده شود، یک نام درهم‌سازی‌شدهٔ بالقوه است. اگر این نام به یک نام C++ رمزگشایی شود، نام C++ در خروجی جایگزین نام سطح پایین می‌شود؛ در غیر این صورت کلمهٔ اصلی به خروجی فرستاده می‌شود. به این ترتیب می‌توانید کل یک فایل منبع اسمبلی حاوی نام‌های درهم‌سازی‌شده را به c++filt هدایت کنید و همان فایل منبع را با نام‌های خواناسازی‌شده (demangled) مشاهده نمایید.

همچنین می‌توانید از 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
-_
در برخی سامانه‌ها، هر دو کامپایلر C و ++C یک خط زیرین در ابتدای هر نام قرار می‌دهند. برای مثال، نام "foo" در C نام سطح پایین "_foo" را به خود می‌گیرد. این گزینه خط زیرین ابتدایی را حذف می‌کند. اینکه آیا c++filt این خط زیرین را به طور پیش‌فرض حذف می‌کند یا خیر، به معماری مقصد (target) بستگی دارد.
خط زیرین ابتدایی را حذف نمی‌کند.
هنگام واگردانی درهم‌سازی نام یک تابع، انواع پارامترهای تابع را نمایش نمی‌دهد.
تلاش برای واگردانی درهم‌سازی انواع (types) افزون بر نام توابع. این گزینه به‌طور پیش‌فرض غیرفعال است زیرا انواع درهم‌سازی‌شده معمولاً فقط در داخل کامپایلر استفاده می‌شوند و ممکن است با نام‌های درهم‌سازی‌نشده اشتباه گرفته شوند. برای مثال، تابعی به نام "a" اگر به عنوان یک نام نوع درهم‌سازی‌شده در نظر گرفته شود، به "signed char" واگردانی خواهد شد.
جزئیات پیاده‌سازی (در صورت وجود) را در خروجی واگردانی‌شده درج نمی‌کند.
محدودیت میزان بازگشت (recursion) انجام‌شده در حین واگردانی رشته‌ها را فعال یا غیرفعال می‌کند. از آنجا که قالب‌های درهم‌سازی نام اجازهٔ سطح نامحدودی از بازگشت را می‌دهند، ممکن است رشته‌هایی ایجاد شوند که رمزگشایی آن‌ها تمام فضای پشتهٔ موجود در ماشین میزبان را مصرف کرده و باعث خطای حافظه شود. این محدودیت با محدود کردن بازگشت به ۲۰۴۸ سطح تودرتویی، تلاش می‌کند از وقوع این اتفاق جلوگیری کند.

حالت پیش‌فرض، فعال بودن این محدودیت است؛ اما غیرفعال کردن آن ممکن است برای واگردانی نام‌های واقعاً پیچیده لازم باشد. با این حال توجه داشته باشید که در صورت غیرفعال کردن محدودیت بازگشت، اتمام فضای پشته محتمل است و هرگونه گزارش باگ پیرامون چنین رویدادی رد خواهد شد.

گزینهٔ -r مترادفی برای گزینهٔ --no-recurse-limit است. گزینهٔ -R مترادفی برای گزینهٔ --recurse-limit است.
برنامهٔ c++filt می‌تواند روش‌های مختلف درهم‌سازی را که توسط کامپایلرهای گوناگون استفاده می‌شوند، رمزگشایی کند. آرگومان ارائه‌شده به این گزینه مشخص می‌کند که از کدام روش استفاده شود:
"auto"
انتخاب خودکار بر اساس فایل اجرایی (روش پیش‌فرض)
"gnu"
روشی که توسط کامپایلر GNU C++ (یعنی g++) استفاده می‌شود
"lucid"
روشی که توسط کامپایلر Lucid (یعنی lcc) استفاده می‌شود
"arm"
روشی که توسط C++ Annotated Reference Manual مشخص شده است
"hp"
روشی که توسط کامپایلر HP (یعنی aCC) استفاده می‌شود
"edg"
روشی که توسط کامپایلر EDG استفاده می‌شود
"gnu-v3"
روشی که توسط کامپایلر GNU C++ (یعنی g++) به همراه V3 ABI استفاده می‌شود.
"java"
روشی که توسط کامپایلر GNU Java (یعنی gcj) استفاده می‌شود
"gnat"
روشی که توسط کامپایلر GNU Ada (یعنی GNAT) استفاده می‌شود.
خلاصه‌ای از گزینه‌های c++filt را چاپ کرده و خارج می‌شود.
شماره نگارش c++filt را چاپ کرده و خارج می‌شود.
@file
گزینه‌های خط فرمان را از file می‌خواند. گزینه‌های خوانده‌شده به جای گزینهٔ اصلی @file درج می‌شوند. اگر file وجود نداشته باشد یا قابل خواندن نباشد، با گزینه به صورت متنیِ صرف برخورد شده و حذف نخواهد شد.

گزینه‌ها در file با نویسه‌های فاصله از یکدیگر جدا می‌شوند. یک نویسهٔ فاصله می‌تواند با قرار دادن کل گزینه درون گیومهٔ تکی یا دوتایی درون آن گنجانده شود. هر نویسه‌ای (از جمله ممیز وارونه یا backslash) می‌تواند با افزودن یک ممیز وارونه به عنوان پیشوند قبل از آن نویسه درج شود. خودِ file ممکن است حاوی گزینه‌های @file بیشتری باشد؛ هر نوع از این گزینه‌ها به‌صورت بازگشتی پردازش خواهند شد..SH "پاورقی‌ها (FOOTNOTES)"
1.
سیستم‌عامل MS-DOS اجازهٔ استفاده از نویسه‌های "+" را در نام فایل‌ها نمی‌دهد، بنابراین در MS-DOS این برنامه CXXFILT نام‌گذاری شده است.

مدخل‌های Info برای binutils.

کپی‌رایت (c) 1991-2025 Free Software Foundation, Inc.

مجوز کپی، توزیع و/یا تغییر این سند تحت شرایط «مجوز مستندات آزاد گنو» (GNU Free Documentation License)، نسخهٔ 1.3 یا هر نسخهٔ متأخر دیگری که توسط Free Software Foundation منتشر شده باشد اعطا می‌شود؛ بدون بخش‌های تغییرناپذیر (Invariant Sections)، بدون متون روی جلد (Front-Cover Texts) و بدون متون پشت جلد (Back-Cover Texts). نسخه‌ای از این مجوز در بخشی با عنوان «GNU Free Documentation License» گنجانده شده است.

2026-01-23 binutils-2.45.1