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

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

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

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

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

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

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

2026-08-26 binutils-2.47