NM(1) GNU Development Tools NM(1)

nm - فهرست کردن نمادها از فایل‌های شیء

nm [-A|-o|--print-file-name]
[-a|--debug-syms]
[-B|--format=bsd]
[-C|--demangle[=style]]
[-D|--dynamic]
[-fformat|--format=format]
[-g|--extern-only]
[-h|--help]
[--ifunc-chars=CHARS]
[-j|--format=just-symbols]
[-l|--line-numbers] [--inlines]
[-n|-v|--numeric-sort]
[-P|--portability]
[-p|--no-sort]
[-r|--reverse-sort]
[-S|--print-size]
[-s|--print-armap]
[-t radix|--radix=radix]
[-u|--undefined-only]
[-U|--defined-only]
[-V|--version]
[-W|--no-weak]
[-X 32_64]
[--no-demangle]
[--no-recurse-limit|--recurse-limit]]
[--plugin name]
[--size-sort]
[--special-syms]
[--synthetic]
[--target=bfdname]
[--unicode=method]
[--with-symbol-versions]
[--without-symbol-versions]
[objfile...].SH "توضیحات (DESCRIPTION)" دستور GNU nm نمادهای موجود در پرونده‌های شیء objfile... را فهرست می‌کند. اگر هیچ پروندهٔ شیئی به عنوان آرگومان مشخص نشده باشد، nm پروندهٔ a.out را پیش‌فرض در نظر می‌گیرد.

برای هر نماد، nm موارد زیر را نشان می‌دهد:

  • مقدار نماد، در مبنای انتخاب‌شده با گزینه‌ها (پایین را ببینید)، یا در مبنای شانزده (هگزادسیمال) به‌طور پیش‌فرض.
  • نوع نماد. دست‌کم انواع زیر استفاده می‌شوند؛ انواع دیگری نیز بسته به قالب پروندهٔ شیء به کار می‌روند. اگر با حروف کوچک باشد، نماد معمولاً محلی (local) است؛ اگر با حروف بزرگ باشد، نماد سراسری یا خارجی (global/external) است. با این حال چند نماد با حروف کوچک وجود دارند که برای نمادهای سراسری ویژه نمایش داده می‌شوند ("u"، "v" و "w").
"A"
مقدار نماد مطلق (absolute) است و با پیوند زدن‌های بعدی تغییر نخواهد کرد.
"B"
"b"
نماد در بخش داده‌ای BSS قرار دارد. این بخش معمولاً شامل داده‌های مقداردهی‌نشده یا مقداردهی‌شده با صفر است، هرچند رفتار دقیق آن به سیستم بستگی دارد.
"C"
"c"
نماد از نوع مشترک (common) است. نمادهای مشترک داده‌های مقداردهی‌نشده هستند. هنگام پیوند زدن، ممکن است چندین نماد مشترک با نام یکسان ظاهر شوند. اگر نماد در جایی تعریف شده باشد، نمادهای مشترک به عنوان ارجاعات تعریف‌نشده در نظر گرفته می‌شوند. نویسهٔ کوچک c زمانی استفاده می‌شود که نماد در یک بخش ویژه برای مشترک‌های کوچک (small commons) باشد.
"D"
"d"
نماد در بخش داده‌های مقداردهی‌شده قرار دارد.
"G"
"g"
نماد در یک بخش داده‌های مقداردهی‌شده برای اشیاء کوچک قرار دارد. برخی از قالب‌های پروندهٔ شیء دسترسی کارآمدتری را به اشیاء داده‌ای کوچک فراهم می‌کنند، مانند یک متغیر سراسری int در مقایسه با یک آرایهٔ سراسری بزرگ.
"i"
برای پرونده‌های قالب PE این نشان می‌دهد که نماد در بخشی مختص پیاده‌سازی DLLها قرار دارد.

برای پرونده‌های قالب ELF این نشان می‌دهد که نماد یک تابع غیرمستقیم (indirect function) است. این یک گسترش گنو بر مجموعه استاندارد انواع نمادهای ELF است. این مورد نمادی را مشخص می‌کند که اگر توسط یک بازنشانی (relocation) ارجاع داده شود، مقدار آن به آدرسش ارزیابی نمی‌شود، بلکه باید در زمان اجرا فراخوانی گردد. اجرای زمان اجرا سپس مقداری را که باید در بازنشانی استفاده شود برمی‌گرداند.

نکته - نویسهٔ واقعی نمایش نمادهای غیرمستقیم گنو توسط گزینهٔ خط فرمان --ifunc-chars کنترل می‌شود. اگر این گزینه تعیین شده باشد، نخستین نویسه در رشته برای نمادهای توابع غیرمستقیم سراسری استفاده خواهد شد. اگر رشته دارای نویسهٔ دومی باشد، از آن برای نمادهای توابع غیرمستقیم محلی استفاده خواهد شد.

"I"
نماد یک ارجاع غیرمستقیم به نمادی دیگر است.
"N"
نماد یک نماد اشکال‌زدایی (debugging) است.
"n"
نماد در یک بخش فقط‌خواندنیِ غیرداده‌ای، غیرکدی و غیراشکال‌زدایی قرار دارد.
"p"
نماد در یک بخش بازپیچی پشته (stack unwind) قرار دارد.
"R"
"r"
نماد در یک بخش داده‌ای فقط‌خواندنی قرار دارد.
"S"
"s"
نماد در یک بخش داده‌ای مقداردهی‌نشده یا مقداردهی‌شده با صفر برای اشیاء کوچک قرار دارد.
"T"
"t"
نماد در بخش متن (کد) قرار دارد.
"U"
نماد تعریف‌نشده (undefined) است.
"u"
نماد یک نماد سراسری یکتا (unique global symbol) است. این یک گسترش گنو بر مجموعه استاندارد اتصالات نمادهای ELF است. برای چنین نمادی پیونددهندهٔ پویا اطمینان حاصل می‌کند که در سرتاسر فرایند تنها یک نماد با این نام و نوع مورد استفاده قرار می‌گیرد.
"V"
"v"
نماد یک شیء ضعیف (weak object) است. هنگامی که یک نماد تعریف‌شدهٔ ضعیف با یک نماد تعریف‌شدهٔ عادی پیوند داده می‌شود، نماد تعریف‌شدهٔ عادی بدون هیچ خطایی استفاده می‌شود. هنگامی که یک نماد تعریف‌نشدهٔ ضعیف پیوند داده شود و نماد تعریف نشده باشد، مقدار نماد ضعیف بدون خطا صفر می‌گردد. در برخی سیستم‌ها، حروف بزرگ نشان‌دهندهٔ این است که یک مقدار پیش‌فرض تعیین شده است.
"W"
"w"
نماد یک نماد ضعیف است که به‌طور خاص به عنوان نماد شیء ضعیف برچسب‌گذاری نشده است. هنگامی که یک نماد تعریف‌شدهٔ ضعیف با یک نماد تعریف‌شدهٔ عادی پیوند داده می‌شود، نماد تعریف‌شدهٔ عادی بدون خطا استفاده خواهد شد. هنگامی که یک نماد تعریف‌نشدهٔ ضعیف پیوند داده شود و نماد در جایی تعریف نشده باشد، مقدار نماد به روشی وابسته به سیستم و بدون خطا تعیین می‌شود. در برخی سیستم‌ها، حروف بزرگ نشان می‌دهد که یک مقدار پیش‌فرض مشخص شده است.
"-"
نماد یک نماد stabs در یک پروندهٔ شیء a.out است. در این حالت، مقادیر بعدی چاپ‌شده شامل فیلد other در stabs، فیلد desc در stabs و نوع stab هستند. نمادهای stabs برای نگهداری اطلاعات اشکال‌زدایی استفاده می‌شوند.
"?"
نوع نماد ناشناخته است، یا به قالب پروندهٔ شیء بستگی دارد.
نام نماد. اگر نمادی دارای اطلاعات نسخه مرتبط با خود باشد، اطلاعات نسخه نیز نمایش داده می‌شود. اگر نماد نسخه‌دار تعریف‌نشده باشد یا از پیونددهنده (linker) مخفی شده باشد، رشتهٔ نسخه به‌صورت پسوندی برای نام نماد و پس از یک نویسهٔ @ نمایش داده می‌شود؛ برای مثال foo@VER_1. اگر نسخه، نسخهٔ پیش‌فرضی باشد که هنگام حل ارجاعات بدون نسخه به نماد استفاده می‌شود، به‌صورت یک پسوند به همراه دو نویسهٔ @ در پیش از آن نمایش می‌یابد؛ برای مثال foo@@VER_2.

فرم‌های کوتاه و بلند گزینه‌ها که در اینجا به‌عنوان جایگزین نشان داده شده‌اند، معادل یکدیگر هستند.

به‌جای مشخص کردن فایل ورودی تنها یک بار پیش از تمام نمادهایش، پیش از هر نماد نام فایل ورودی (یا عضو آرشیو) که نماد در آن پیدا شده است درج شود.
نمایش همهٔ نمادها، حتی نمادهای ویژهٔ اشکال‌زدا؛ این نمادها در حالت عادی فهرست نمی‌شوند.
مشابه --format=bsd (برای سازگاری با nm در معماری MIPS).
رمزگشایی (demangle) نام‌های سطح پایین نمادها به نام‌های سطح کاربر. این کار علاوه بر حذف هرگونه زیرخط اولیه که توسط سیستم اضافه شده است، نام توابع C++ را خوانا می‌کند. کامپایلرهای مختلف سبک‌های درهم‌سازی (mangling) متفاوتی دارند. آرگومان اختیاری سبک کدگشایی می‌تواند برای انتخاب سبک مناسب با کامپایلر شما استفاده شود.
نام‌های نماد سطح پایین کدگشایی نشوند. این حالت پیش‌فرض است.
محدودیت میزان بازگشت (recursion) انجام‌شده حین کدگشایی رشته‌ها را فعال یا غیرفعال می‌کند. از آنجا که ساختارهای درهم‌سازی نام‌ها سطوح نامحدودی از بازگشت را مجاز می‌دانند، ممکن است رشته‌هایی ایجاد شوند که رمزگشایی آن‌ها تمام فضای پشته (stack) موجود در ماشین میزبان را مصرف کرده و باعث خطای حافظه شود. این محدودیت با محدود کردن بازگشت به ۲۰۴۸ سطح تو در تو، تلاش می‌کند از وقوع این مشکل جلوگیری کند.

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

نمایش نمادهای پویا (dynamic) به‌جای نمادهای عادی. این گزینه فقط برای اشیاء پویا، مانند انواع خاصی از کتابخانه‌های مشترک (shared libraries)، معنادار است.
استفاده از قالب خروجی format که می‌تواند "bsd"، "sysv"، "posix" یا "just-symbols" باشد. پیش‌فرض "bsd" است. فقط نویسهٔ اول format اهمیت دارد؛ این نویسه می‌تواند با حروف بزرگ یا کوچک باشد.
تنها نمادهای خارجی (external) نمایش داده شوند.
نمایش خلاصه‌ای از گزینه‌های nm و خروج.
هنگام نمایش نمادهای تابع غیرمستقیم گنو (GNU indirect function)، دستور nm به‌طور پیش‌فرض از نویسهٔ "i" هم برای توابع غیرمستقیم محلی و هم برای توابع غیرمستقیم سراسری استفاده خواهد کرد. گزینهٔ --ifunc-chars به کاربر اجازه می‌دهد رشته‌ای شامل یک یا دو نویسه را مشخص کند. نویسهٔ اول برای نمادهای تابع غیرمستقیم سراسری و نویسهٔ دوم (در صورت وجود) برای نمادهای تابع غیرمستقیم محلی استفاده خواهد شد.
مشابه --format=just-symbols.
برای هر نماد، با استفاده از اطلاعات اشکال‌زدایی تلاش می‌شود نام فایل و شماره خط پیدا شود. برای یک نماد تعریف‌شده، شماره خط مربوط به نشانی نماد جستجو می‌شود. برای یک نماد تعریف‌نشده، شماره خط ورودی بازنشانی (relocation) که به آن نماد اشاره دارد جستجو می‌شود. در صورت پیدا شدن اطلاعات شماره خط، این اطلاعات پس از سایر اطلاعات نماد چاپ می‌شود.
هنگامی که گزینهٔ -l فعال باشد، اگر نشانی متعلق به تابعی باشد که به‌صورت درون‌خطی (inlined) درآمده است، این گزینه باعث می‌شود اطلاعات منبع برای تمام دامنه‌های دربرگیرنده تا نخستین تابع غیردرون‌خطی نیز چاپ شود. برای مثال، اگر "main" تابع "callee1" را درون‌خطی کرده باشد و آن هم "callee2" را درون‌خطی کرده باشد، و نشانی متعلق به "callee2" باشد، اطلاعات منبع برای "callee1" و "main" نیز چاپ خواهد شد.
مرتب‌سازی عددی نمادها بر اساس نشانی‌هایشان، به جای مرتب‌سازی الفبایی بر اساس نام آن‌ها.
نمادها را بر اساس هیچ ترتیبی مرتب نکن؛ آن‌ها را به همان ترتیبی که در فایل آمده‌اند چاپ کن.
استفاده از قالب خروجی استاندارد POSIX.2 به جای قالب پیش‌فرض. معادل با -f posix.
معکوس کردن ترتیب مرتب‌سازی (چه عددی و چه الفبایی)؛ خروجی به ترتیبی نمایش داده می‌شود که موارد انتهایی در ابتدا بیایند.
چاپ هم مقدار و هم اندازهٔ نمادهای تعریف‌شده برای سبک خروجی "bsd". این گزینه روی قالب‌های شیء (object) که اندازهٔ نمادها را ثبت نمی‌کنند هیچ اثری ندارد، مگر اینکه از --size-sort نیز استفاده شود که در این حالت اندازهٔ محاسبه‌شده نمایش داده می‌شود.
هنگام فهرست کردن نمادها از اعضای آرشیو، نمایه را نیز بگنجانید: نگاشتی (که توسط ar یا ranlib در آرشیو ذخیره شده است) از اینکه کدام پودمان‌ها شامل تعاریف مربوط به چه نام‌هایی هستند.
استفاده از radix به عنوان مبنای عددی برای چاپ مقادیر نمادها. این مقدار باید برای ده‌دهی d، برای هشت‌هشتی o، یا برای هگزادسیمال x باشد.
تنها نمادهای تعریف‌نشده را نمایش می‌دهد (آن‌هایی که نسبت به هر فایل شیء خارجی هستند). به‌طور پیش‌فرض هم نمادهای تعریف‌شده و هم تعریف‌نشده نمایش داده می‌شوند.
تنها نمادهای تعریف‌شده را برای هر فایل شیء نمایش می‌دهد. به‌طور پیش‌فرض هم نمادهای تعریف‌شده و هم تعریف‌نشده نمایش داده می‌شوند.
نمایش شمارهٔ نسخهٔ nm و خروج.
این گزینه برای سازگاری با نسخهٔ AIX از nm نادیده گرفته می‌شود. این گزینه یک پارامتر می‌گیرد که باید رشتهٔ 32_64 باشد. حالت پیش‌فرض nm در AIX متناظر با -X 32 است که توسط GNU nm پشتیبانی نمی‌شود.
پلاگین با نام name را بارگذاری می‌کند تا پشتیبانی از انواع مقصدهای اضافی افزوده شود. این گزینه تنها در صورتی در دسترس است که زنجیره ابزار با پشتیبانی فعال از پلاگین ساخته شده باشد.

اگر --plugin مشخص نشده باشد، اما پشتیبانی از پلاگین فعال شده باشد، آن‌گاه nm فایل‌های موجود در ${libdir}/bfd-plugins را به ترتیب الفبایی بررسی کرده و از اولین پلاگینی که ادعای پشتیبانی از شیء مورد نظر را داشته باشد، استفاده می‌کند.

لطفاً توجه داشته باشید که این دایرکتوریِ جستجوی پلاگین، آن دایرکتوری مورد استفاده توسط گزینهٔ -plugin در ld نیست. برای اینکه nm از پلاگین پیونددهنده استفاده کند، باید آن را در دایرکتوری ${libdir}/bfd-plugins کپی کرد. برای کامپایل‌های مبتنی بر GCC، پلاگین پیونددهنده liblto_plugin.so.0.0.0 نامیده می‌شود. برای کامپایل‌های مبتنی بر Clang نام آن LLVMgold.so است. پلاگین GCC همیشه با نسخه‌های پیشین سازگار با گذشته است، بنابراین تنها کپی کردن جدیدترین نسخه کفایت می‌کند.

مرتب‌سازی نمادها بر اساس اندازه. برای اشیاء ELF، اندازهٔ نمادها از ELF خوانده می‌شود؛ برای سایر انواع اشیاء، اندازهٔ نماد به صورت تفاضل میان مقدار نماد و مقدار نماد بعدی با مقدار بالاتر محاسبه می‌گردد. اگر از قالب خروجی "bsd" استفاده شود، به جای مقدار، اندازهٔ نماد چاپ می‌شود، و برای چاپ هم اندازه و هم مقدار، باید از -S استفاده شود.

توجه - این گزینه در صورتی که --undefined-only فعال شده باشد کار نمی‌کند، زیرا نمادهای تعریف‌نشده اندازه‌ای ندارند.

نمایش نمادهایی که دارای معنای ویژهٔ وابسته به مقصد هستند. این نمادها معمولاً توسط مقصد برای برخی پردازش‌های ویژه استفاده می‌شوند و در صورت گنجانده شدن در فهرست‌های نماد معمولی، عموماً سودمند نیستند. برای نمونه در مقصدهای ARM، این گزینه از نمادهای نگاشتی که برای نشانه‌گذاری گذارها میان کد ARM، کد THUMB و داده‌ها به کار می‌روند، صرف‌نظر می‌کند.
گنجاندن نمادهای ساختگی (synthetic) در خروجی. این‌ها نمادهای ویژه‌ای هستند که توسط پیونددهنده برای مقاصد گوناگون ایجاد می‌شوند. این نمادها به صورت پیش‌فرض نمایش داده نمی‌شوند، زیرا بخشی از کد منبع اصلی باینری نیستند.
نمایش نویسه‌های چندبایتی کدگذاری‌شده با UTF-8 را در رشته‌ها کنترل می‌کند. حالت پیش‌فرض (--unicode=default) رفتار خاصی با آن‌ها ندارد. گزینهٔ --unicode=locale توالی را در لوکال جاری نمایش می‌دهد که ممکن است از آن‌ها پشتیبانی کند یا نکند. گزینه‌های --unicode=hex و --unicode=invalid آن‌ها را به عنوان توالی‌های بایتی هگز در میان قلاب‌ها یا آکولادها نمایش می‌دهند.

گزینهٔ --unicode=escape آن‌ها را به صورت توالی‌های گریز (\uxxxx) نمایش می‌دهد و گزینهٔ --unicode=highlight آن‌ها را به صورت توالی‌های گریزِ برجسته‌شده با رنگ قرمز (در صورت پشتیبانی توسط دستگاه خروجی) نمایش می‌دهد. این رنگ‌آمیزی برای جلب توجه به وجود توالی‌های یونیکد در جاهایی است که ممکن است انتظار حضور آن‌ها نرود.

عدم نمایش نمادهای ضعیف (weak symbols).
نمایش اطلاعات نسخهٔ نماد را فعال یا غیرفعال می‌کند. رشتهٔ نسخه به عنوان پسوند به نام نماد اضافه شده و پیش از آن یک نویسهٔ @ قرار می‌گیرد؛ برای نمونه foo@VER_1. اگر نسخه، نسخهٔ پیش‌فرضی باشد که هنگام حل کردن ارجاعات فاقد نسخه به نماد استفاده می‌شود، آن‌گاه به صورت پسوندی نمایش داده می‌شود که پیش از آن دو نویسهٔ @ قرار دارد؛ مانند foo@@VER_2. به صورت پیش‌فرض، اطلاعات نسخهٔ نماد نمایش داده می‌شود.
قالبی برای کد شیء به غیر از قالب پیش‌فرض سیستم شما تعیین می‌کند.
@file
گزینه‌های خط فرمان را از file می‌خواند. گزینه‌های خوانده‌شده به جای گزینهٔ اصلی @file درج می‌شوند. اگر file وجود نداشته باشد یا خوانده نشود، با این گزینه به صورت تحت‌اللفظی رفتار شده و حذف نمی‌شود.

گزینه‌ها در file با نویسهٔ فاصله از یکدیگر جدا می‌شوند. یک نویسهٔ فاصله می‌تواند با محصور کردن کل گزینه در علامت‌های نقل‌قول تکی یا جفتی، در یک گزینه گنجانده شود. هر نویسه‌ای (از جمله بک‌اسلش) می‌تواند با قرار دادن یک بک‌اسلش در پیش از آن وارد شود. خود file می‌تواند شامل گزینه‌های @file بیشتری باشد؛ هرگونه از این گزینه‌ها به صورت بازگشتی پردازش خواهند شد..SH "همچنین ببینید (SEE ALSO)" ar(1)، objdump(1)، ranlib(1) و مدخل‌های Info برای binutils.

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

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

2026-08-31 binutils-2.47