.\" -*- mode: troff; coding: utf-8 -*- .\" Automatically generated by Pod::Man v6.0.2 (Pod::Simple 3.45) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ . ds C` "" . ds C' "" 'br\} .el\{\ . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Required to disable full justification in groff 1.23.0. .if n .ds AD l .\" ======================================================================== .\" .IX Title "C++FILT 1" .TH C++FILT 1 2026-01-23 binutils-2.45.1 "GNU Development Tools" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "نام (NAME)" c++filt \- بازگردانی نمادهای درهم‌ریختهٔ C++ و Java به نام‌های خوانا .SH "خلاصه دستور (SYNOPSIS)" .IX Header "SYNOPSIS" c++filt [\fB\-_\fR|\fB\-\-strip\-underscore\fR] [\fB\-n\fR|\fB\-\-no\-strip\-underscore\fR] [\fB\-p\fR|\fB\-\-no\-params\fR] [\fB\-t\fR|\fB\-\-types\fR] [\fB\-i\fR|\fB\-\-no\-verbose\fR] [\fB\-r\fR|\fB\-\-no\-recurse\-limit\fR] [\fB\-R\fR|\fB\-\-recurse\-limit\fR] [\fB\-s\fR \fIformat\fR|\fB\-\-format=\fR\fIformat\fR] [\fB\-\-help\fR] [\fB\-\-version\fR] [\fIsymbol\fR...] .SH "توضیحات (DESCRIPTION)" .IX Header "DESCRIPTION" زبان‌های C++ و Java قابلیت سربارگذاری توابع (function overloading) را ارائه می‌دهند، بدین معنا که می‌توانید توابع متعددی با نامی یکسان تعریف کنید، به شرطی که هر تابع پارامترهایی با انواع متفاوت دریافت کند. برای امکان‌پذیر ساختن تشخیص این توابع هم‌نام، C++ و Java آن‌ها را در قالب یک نام اسمبلی سطح‌پایین کدگذاری می‌کنند که هر نسخهٔ متفاوت را به‌طور یکتا مشخص می‌سازد. این فرآیند با عنوان \fImangling\fR شناخته می‌شود. برنامهٔ \&\fBc++filt\fR [1] نگاشت معکوس را انجام می‌دهد: این برنامه نام‌های سطح‌پایین را به نام‌های سطح کاربر رمزگشایی (\fIdemangle\fR) می‌کند تا برای انسان قابل‌خواندن باشند. .PP هر واژهٔ الفبایی-عددی (متشکل از حروف، ارقام، زیرخط‌ها، علامت‌های دلار، یا نقطه‌ها) که در ورودی دیده شود، یک نام درهم‌ریختهٔ بالقوه محسوب می‌شود. اگر این نام به یک نام C++ رمزگشایی شود، نام C++ در خروجی جایگزین نام سطح‌پایین می‌گردد؛ در غیر این صورت، واژهٔ اصلی در خروجی چاپ می‌شود. به این ترتیب می‌توانید کل یک فایل منبع اسمبلی را که حاوی نام‌های درهم‌ریخته است از طریق \fBc++filt\fR عبور دهید و همان فایل منبع را حاوی نام‌های رمزگشایی‌شده دریافت کنید. .PP همچنین می‌توانید با ارسال نمادها از طریق خط فرمان، از \fBc++filt\fR برای رمزگشایی تک‌تک نمادها استفاده کنید: .PP .Vb 1 \& c++filt .Ve .PP چنانچه هیچ آرگومان \fIsymbol\fR مشخص نشده باشد، \fBc++filt\fR در عوض نام نمادها را از ورودی استاندارد می‌خواند. همهٔ نتایج در خروجی استاندارد چاپ می‌شوند. تفاوت خواندن نام‌ها از خط فرمان در مقایسه با خواندن از ورودی استاندارد این است که انتظار می‌رود آرگومان‌های خط فرمان صرفاً نام‌های درهم‌ریخته باشند و هیچ بررسی خاصی برای جداسازی آن‌ها از متن‌های مجاور انجام نمی‌شود. بنابراین برای مثال: .PP .Vb 1 \& c++filt \-n _Z1fv .Ve .PP کار خواهد کرد و نام را به "f()" بازگردانی می‌کند، در حالی که: .PP .Vb 1 \& c++filt \-n _Z1fv, .Ve .PP کار نخواهد کرد. (به کامای اضافه در انتهای نام درهم‌ریخته که آن را نامعتبر می‌سازد دقت کنید). با این وجود، دستور زیر کار خواهد کرد: .PP .Vb 1 \& echo _Z1fv, | c++filt \-n .Ve .PP و "f()," را نمایش می‌دهد؛ یعنی نام رمزگشایی‌شده که به دنبال آن یک کاما در انتها آمده است. این رفتار به این دلیل است که هنگام خواندن نام‌ها از ورودی استاندارد، انتظار می‌رود که ممکن است بخشی از یک فایل منبع اسمبلی باشند که شاید در آن نویسه‌های اضافی و نامربوطی در پی یک نام درهم‌ریخته قرار گرفته باشد. برای مثال: .PP .Vb 1 \& .type _Z1fv, @function .Ve.SH "گزینه‌ها (OPTIONS)" .IX Header "OPTIONS" .IP \fB\-_\fR 4 .IX Item "-_" .PD 0 .IP \fB\-\-strip\-underscore\fR 4 .IX Item "--strip-underscore" .PD در برخی سیستم‌ها، کامپایلرهای C و C++ یک زیرخط (underscore) در ابتدای هر نام قرار می‌دهند. برای نمونه، نام C یعنی \f(CW\*(C`foo\*(C'\fR، نام سطح‌پایین \f(CW\*(C`_foo\*(C'\fR را به خود می‌گیرد. این گزینه زیرخط آغازین را حذف می‌کند. اینکه آیا \&\fBc++filt\fR به‌طور پیش‌فرض زیرخط را حذف می‌کند یا خیر، به معماری مقصد (target) بستگی دارد. .IP \fB\-n\fR 4 .IX Item "-n" .PD 0 .IP \fB\-\-no\-strip\-underscore\fR 4 .IX Item "--no-strip-underscore" .PD زیرخط آغازین را حذف نمی‌کند. .IP \fB\-p\fR 4 .IX Item "-p" .PD 0 .IP \fB\-\-no\-params\fR 4 .IX Item "--no-params" .PD هنگام نام‌گشایی (demangling) نام یک تابع، انواع پارامترهای تابع نمایش داده نمی‌شوند. .IP \fB\-t\fR 4 .IX Item "-t" .PD 0 .IP \fB\-\-types\fR 4 .IX Item "--types" .PD تلاش می‌کند انواع داده (types) را نیز همانند نام توابع نام‌گشایی کند. این گزینه به‌طور پیش‌فرض غیرفعال است؛ چرا که انواع رمزشده (mangled) معمولاً تنها درون کامپایلر به‌کار می‌روند و ممکن است با نام‌های رمزنَشده اشتباه گرفته شوند. برای نمونه، تابعی با نام «a» اگر به عنوان یک نوع رمزشده در نظر گرفته شود، به «signed char» نام‌گشایی خواهد شد. .IP \fB\-i\fR 4 .IX Item "-i" .PD 0 .IP \fB\-\-no\-verbose\fR 4 .IX Item "--no-verbose" .PD جزئیات پیاده‌سازی (در صورت وجود) را در خروجیِ نام‌گشایی‌شده قرار نمی‌دهد. .IP \fB\-r\fR 4 .IX Item "-r" .PD 0 .IP \fB\-R\fR 4 .IX Item "-R" .IP \fB\-\-recurse\-limit\fR 4 .IX Item "--recurse-limit" .IP \fB\-\-no\-recurse\-limit\fR 4 .IX Item "--no-recurse-limit" .IP \fB\-\-recursion\-limit\fR 4 .IX Item "--recursion-limit" .IP \fB\-\-no\-recursion\-limit\fR 4 .IX Item "--no-recursion-limit" .PD محدودیتی را بر میزان بازگشت (recursion) انجام‌شده هنگام نام‌گشایی رشته‌ها فعال یا غیرفعال می‌کند. از آنجا که قالب‌های رمزبندی نام (name mangling) اجازهٔ سطح نامتناهی از بازگشت را می‌دهند، امکان ایجاد رشته‌هایی وجود دارد که رمزگشایی آن‌ها تمام فضای پشتهٔ (stack) موجود در ماشین میزبان را مصرف کرده و باعث بروز خطای حافظه (memory fault) شود. این محدودیت با تحدید بازگشت به ۲۰۴۸ سطحِ تودرتو، سعی می‌کند از این رخداد جلوگیری کند. .Sp حالت پیش‌فرض فعال بودن این محدودیت است، اما غیرفعال‌سازی آن ممکن است برای نام‌گشایی نام‌های واقعاً پیچیده ضروری باشد. با این حال توجه داشته باشید که اگر محدودیت بازگشت غیرفعال شود، اتمام فضای پشته ممکن است و هرگونه گزارش باگ در مورد چنین رخدادی رد خواهد شد. .Sp گزینهٔ \fB\-r\fR مترادفی برای گزینهٔ \&\fB\-\-no\-recurse\-limit\fR است. گزینهٔ \fB\-R\fR نیز مترادفی برای گزینهٔ \fB\-\-recurse\-limit\fR است. .IP "\fB\-s\fR \fIformat\fR" 4 .IX Item "-s format" .PD 0 .IP \fB\-\-format=\fR\fIformat\fR 4 .IX Item "--format=format" .PD ابزار \&\fBc++filt\fR می‌تواند روش‌های گوناگونی از رمزبندی نام را که توسط کامپایلرهای مختلف استفاده می‌شوند، رمزگشایی کند. آرگومان ارائه‌شده به این گزینه مشخص می‌کند که از کدام روش استفاده شود: .RS 4 .ie n .IP """auto""" 4 .el .IP \f(CWauto\fR 4 .IX Item "auto" انتخاب خودکار بر پایهٔ فایل اجرایی (روش پیش‌فرض) .ie n .IP """gnu""" 4 .el .IP \f(CWgnu\fR 4 .IX Item "gnu" روشی که توسط کامپایلر GNU C++ (g++) استفاده می‌شود .ie n .IP """lucid""" 4 .el .IP \f(CWlucid\fR 4 .IX Item "lucid" روشی که توسط کامپایلر Lucid (lcc) استفاده می‌شود .ie n .IP """arm""" 4 .el .IP \f(CWarm\fR 4 .IX Item "arm" روشی که توسط راهنمای ارجاع حاشیه‌نویسی‌شدهٔ C++ (ARM) مشخص شده است .ie n .IP """hp""" 4 .el .IP \f(CWhp\fR 4 .IX Item "hp" روشی که توسط کامپایلر HP (aCC) استفاده می‌شود .ie n .IP """edg""" 4 .el .IP \f(CWedg\fR 4 .IX Item "edg" روشی که توسط کامپایلر EDG استفاده می‌شود .ie n .IP """gnu\-v3""" 4 .el .IP \f(CWgnu\-v3\fR 4 .IX Item "gnu-v3" روشی که توسط کامپایلر GNU C++ (g++) با رابط V3 ABI استفاده می‌شود. .ie n .IP """java""" 4 .el .IP \f(CWjava\fR 4 .IX Item "java" روشی که توسط کامپایلر GNU Java (gcj) استفاده می‌شود .ie n .IP """gnat""" 4 .el .IP \f(CWgnat\fR 4 .IX Item "gnat" روشی که توسط کامپایلر GNU Ada (GNAT) استفاده می‌شود. .RE .RS 4 .RE .IP \fB\-\-help\fR 4 .IX Item "--help" خلاصه‌ای از گزینه‌های \fBc++filt\fR را چاپ می‌کند و خارج می‌شود. .IP \fB\-\-version\fR 4 .IX Item "--version" شماره نگارش \fBc++filt\fR را چاپ می‌کند و خارج می‌شود. .IP \fB@\fR\fIfile\fR 4 .IX Item "@file" گزینه‌های خط فرمان را از \fIfile\fR می‌خواند. گزینه‌های خوانده‌شده به‌جای گزینهٔ اصلی @\fIfile\fR قرار می‌گیرند. اگر \fIfile\fR وجود نداشته باشد یا خوانده نشود، با این گزینه به‌صورت لفظی (تحت‌اللفظی) رفتار شده و حذف نمی‌گردد. .Sp گزینه‌ها در \fIfile\fR با نویسهٔ فاصله (whitespace) از یکدیگر جدا می‌شوند. می‌توان یک نویسهٔ فاصله را با احاطه کردن کل گزینه در علامت نقل‌قول تکی یا دوتایی درون یک گزینه گنجاند. هر نویسه‌ای (از جمله ممیز وارونه یا backslash) را می‌توان با افزودن یک ممیز وارونه پیش از آن گنجاند. خود \fIfile\fR نیز ممکن است شامل گزینه‌های @\fIfile\fR دیگری باشد؛ هر یک از چنین گزینه‌هایی به‌صورت بازگشتی پردازش خواهند شد..SH "پاورقی‌ها (FOOTNOTES)" .IX Header "FOOTNOTES" .IP 1. 4 سیستم‌عامل MS\-DOS استفاده از نویسه‌های \f(CW\*(C`+\*(C'\fR را در نام فایل‌ها مجاز نمی‌داند، بنابراین در MS\-DOS نام این برنامه \fBCXXFILT\fR است. .SH "همچنین ببینید (SEE ALSO)" .IX Header "SEE ALSO" مدخل‌های Info برای \fIbinutils\fR. .SH "کپی‌رایت و تکثیر (COPYRIGHT)" .IX Header "COPYRIGHT" کپی‌رایت (c) 1991\-2025 Free Software Foundation, Inc. .PP مجوز کپی، توزیع و/یا تغییر این سند تحت شرایط مجوز مستندات آزاد گنو (GNU Free Documentation License)، نسخهٔ 1.3 یا هر نسخهٔ بالاترِ منتشر شده توسط بنیاد نرم‌افزارهای آزاد (Free Software Foundation)؛ بدون بخش‌های تغییرناپذیر، بدون متون روی جلد و بدون متون پشت جلد صادر شده است. نسخه‌ای از این مجوز در بخشی با عنوان "GNU Free Documentation License" گنجانده شده است.