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

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

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