ARM-NONE-EABI-C++FILT(1) GNU Development Tools ARM-NONE-EABI-C++FILT(1)

arm-none-eabi-c++filt - رمزگشایی و تبدیل نمادهای منگل‌شده (Demangle) در زبان‌های ++C و Java

arm-none-eabi-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 رمزگشایی کنید:

arm-none-eabi-c++filt <symbol>

اگر هیچ آرگومان symbol مشخص نشود، c++filt نام‌های نماد را از ورودی استاندارد می‌خواند. همه نتایج در خروجی استاندارد چاپ می‌شوند. تفاوت میان خواندن نام‌ها از خط فرمان در برابر خواندن نام‌ها از ورودی استاندارد در این است که از آرگومان‌های خط فرمان انتظار می‌رود فقط نام‌های درهم‌ریخته باشند و هیچ بررسی برای جدا کردن آن‌ها از متن پیرامون انجام نمی‌گیرد. بنابراین برای نمونه:

arm-none-eabi-c++filt -n _Z1fv

کار خواهد کرد و نام را به "()f" رمزگشایی می‌کند، در حالی که:

arm-none-eabi-c++filt -n _Z1fv,

کار نخواهد کرد. (به کامای اضافی در انتهای نام منگل‌شده دقت کنید که آن را نامعتبر می‌سازد). با این حال این دستور کار خواهد کرد:

echo _Z1fv, | arm-none-eabi-c++filt -n

و مقدار ",()f" را نمایش می‌دهد، یعنی نام رمزگشایی‌شده که به دنبال آن یک کاما آمده است. این رفتار به این دلیل است که وقتی نام‌ها از ورودی استاندارد خوانده می‌شوند، انتظار می‌رود که ممکن است بخشی از یک پرونده منبع اسمبلی باشند که در آن ممکن است نویسه‌های اضافی در ادامه یک نام درهم‌ریخته قرار داشته باشند. برای نمونه:

.type   _Z1fv, @function

-_
در برخی سیستم‌ها، هر دو کامپایلر C و ++C یک زیرخط (_) در ابتدای هر نام قرار می‌دهند. برای نمونه، نام C با عنوان "foo" نام سطح پایین "_foo" را دریافت می‌کند. این گزینه زیرخط اولیه را حذف می‌کند. اینکه آیا c++filt به‌طور پیش‌فرض زیرخط را حذف می‌کند یا خیر، وابسته به معماری هدف است.
زیرخط اولیه را حذف نکن.
هنگام رمزگشایی نام یک تابع، نوع پارامترهای تابع را نمایش نده.
تلاش برای رمزگشایی نوع‌ها و همچنین نام‌های توابع. این گزینه به‌طور پیش‌فرض غیرفعال است زیرا انواع منگل‌شده معمولاً فقط به‌صورت داخلی در کامپایلر استفاده می‌شوند و ممکن است با نام‌های غیرمنگل اشتباه گرفته شوند. برای نمونه، تابعی به نام "a" اگر به‌عنوان یک نوع منگل‌شده تلقی شود، به "signed char" رمزگشایی می‌شود.
جزئیات پیاده‌سازی (در صورت وجود) را در خروجی رمزگشایی‌شده نگنجان.
محدودیت میزان بازگشت (recursion) انجام‌شده هنگام رمزگشایی رشته‌ها را فعال یا غیرفعال می‌کند. از آنجا که قالب‌های درهم‌ریزی نام امکان سطح نامحدودی از بازگشت را فراهم می‌کنند، ممکن است رشته‌هایی ایجاد شوند که رمزگشایی آن‌ها فضای پشته موجود در سیستم میزبان را به اتمام رسانده و خطای حافظه (memory fault) ایجاد کند. این محدودیت تلاش می‌کند با محدود کردن بازگشت به ۲۰۴۸ سطح تودرتو، از وقوع این مسئله جلوگیری کند.

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

گزینه -r مترادف گزینه --no-recurse-limit است. گزینه -R مترادف گزینه --recurse-limit است.

برنامه c++filt می‌تواند روش‌های گوناگون درهم‌ریزی را که توسط کامپایلرهای مختلف استفاده شده رمزگشایی کند. آرگومان این گزینه روش مورد استفاده را انتخاب می‌کند:
"auto"
انتخاب خودکار بر اساس فایل اجرایی (روش پیش‌فرض)
"gnu"
روشی که توسط کامپایلر GNU C++ (g++) استفاده می‌شود
"lucid"
روشی که توسط کامپایلر Lucid (lcc) استفاده می‌شود
"arm"
روشی که توسط راهنمای مرجع تفسیری ++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 دیگری باشد؛ چنین گزینه‌هایی به‌صورت بازگشتی پردازش خواهند شد.

1.
سیستم‌عامل MS-DOS نویسه "+" را در نام فایل‌ها مجاز نمی‌داند، بنابراین در MS-DOS این برنامه CXXFILT نامیده می‌شود.

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

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

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

2026-07-30 binutils-2.47