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

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

گزینهٔ -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 با نویسهٔ فاصله از هم جدا می‌شوند. یک نویسهٔ فاصله را می‌توان با احاطه کردن کل گزینه در علامت‌های نقل‌قول تکی یا جفتی درون گزینه گنجاند. هر نویسه‌ای (از جمله یک بک‌اسلش) را می‌توان با افزودن پیشوند بک‌اسلش به نویسه در آن قرار داد. خود 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