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

c++filt - رمزگشایی و بازگردانی نمادهای C++ و Java (demangle)

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

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

گزینهٔ -r مترادفی برای گزینهٔ --no-recurse-limit است. گزینهٔ -R مترادفی برای گزینهٔ --recurse-limit است.
ابزار c++filt می‌تواند روش‌های گوناگون درهم‌ریزی را که توسط کامپایلرهای مختلف استفاده می‌شوند رمزگشایی کند. آرگومان داده‌شده به این گزینه مشخص می‌کند از کدام روش استفاده شود:
"auto"
انتخاب خودکار بر پایهٔ فایل اجرایی (روش پیش‌فرض)
"gnu"
روش مورد استفاده در کامپایلر GNU C++ (یا g++)
"lucid"
روش مورد استفاده در کامپایلر Lucid (یا lcc)
"arm"
روش تعیین‌شده توسط راهنمای حاشیه‌نویسی‌شدهٔ C++ (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 با نویسه‌های فاصله خالی (whitespace) از یکدیگر جدا می‌شوند. یک نویسهٔ فاصله می‌تواند با قرار گرفتن کل گزینه درون علامت‌های نقل‌قول تکی یا دوتایی، در گزینه گنجانده شود. هر نویسه‌ای (از جمله بک‌اسلش) می‌تواند با پیشوند کردن یک بک‌اسلش به آن نویسه وارد شود. خود file نیز می‌تواند شامل گزینه‌های @file بیشتری باشد؛ چنین گزینه‌هایی به صورت بازگشتی پردازش خواهند شد..SH "پاورقی‌ها (FOOTNOTES)"
1.
سیستم‌عامل MS-DOS اجازهٔ استفاده از نویسهٔ "+" را در نام فایل‌ها نمی‌دهد، بنابراین در MS-DOS این برنامه CXXFILT نامیده می‌شود.

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

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

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

2026-08-31 binutils-2.47