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

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

گزینهٔ -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 با نویسه‌های فاصله از هم جدا می‌شوند. یک نویسهٔ فاصله می‌تواند با قرار دادن کل گزینه در گیومهٔ تکی یا جفتی گنجانده شود. هر نویسه‌ای (از جمله ممیز وارونه) را می‌توان با پیشوند قرار دادن یک ممیز وارونه به آن نویسه درج کرد. خودِ file می‌تواند شامل گزینه‌های اضافی @file باشد؛ چنین گزینه‌هایی به‌صورت بازگشتی پردازش خواهند شد..SH "پانویس‌ها (FOOTNOTES)"
1.
سیستم‌عامل MS-DOS نویسهٔ "+" را در نام فایل‌ها مجاز نمی‌داند، بنابراین در
MS-DOS این برنامه CXXFILT نامیده می‌شود.

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

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

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

2026-01-23 binutils-2.45.1