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

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

گزینه -r مترادفی برای گزینه --no-recurse-limit است. گزینه -R مترادفی برای گزینه --recurse-limit است.
ابزار c++filt می‌تواند روش‌های گوناگون درهم‌سازی را که توسط کامپایلرهای مختلف استفاده می‌شود، رمزگشایی کند. آرگومان این گزینه مشخص می‌کند از کدام روش استفاده شود:
"auto"
انتخاب خودکار بر پایه فایل اجرایی (روش پیش‌فرض)
"gnu"
روشی که توسط کامپایلر C++ گنو (g++) استفاده می‌شود
"lucid"
روشی که توسط کامپایلر Lucid (lcc) استفاده می‌شود
"arm"
روشی که توسط C++ Annotated Reference Manual مشخص شده است
"hp"
روشی که توسط کامپایلر HP (aCC) استفاده می‌شود
"edg"
روشی که توسط کامپایلر EDG استفاده می‌شود
"gnu-v3"
روشی که توسط کامپایلر C++ گنو (g++) به همراه V3 ABI استفاده می‌شود.
"java"
روشی که توسط کامپایلر جاوا گنو (gcj) استفاده می‌شود
"gnat"
روشی که توسط کامپایلر آدا گنو (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-2025 Free Software Foundation, Inc.

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

2026-01-23 binutils-2.45.1