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 موارد زیر را نمایش می‌دهد:

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

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

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

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

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

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

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

نمایش نمادهای پویا به جای نمادهای عادی. این گزینه فقط برای اشیاء پویا، مانند انواع خاصی از کتابخانه‌های اشتراکی معنا دارد.
استفاده از قالب خروجی 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". این گزینه برای قالب‌های شیءای که اندازهٔ نماد را ذخیره نمی‌کنند اثری ندارد، مگر اینکه گزینهٔ --size-sort نیز استفاده شود که در این حالت یک اندازهٔ محاسبه‌شده نمایش داده می‌شود.
هنگام فهرست کردن نمادهای اعضای آرشیو، نمایه را نیز شامل می‌شود: نگاشتی (که توسط ar یا ranlib در آرشیو ذخیره شده) از این‌که کدام ماژول‌ها حاوی تعاریف کدام نام‌ها هستند.
استفاده از radix به‌عنوان مبنای شمارش برای چاپ مقادیر نمادها. این مقدار باید d برای ده‌دهی (دسیمال)، o برای هشت‌هشتی (اکتال)، یا x برای شانزده‌شانزدهی (هگزادسیمال) باشد.
فقط نمادهای تعریف‌نشده (نمادهایی که نسبت به هر فایل شیء خارجی هستند) را نمایش می‌دهد. به‌طور پیش‌فرض، هم نمادهای تعریف‌شده و هم نمادهای تعریف‌نشده نمایش داده می‌شوند.
فقط نمادهای تعریف‌شده برای هر فایل شیء را نمایش می‌دهد. به‌طور پیش‌فرض، هم نمادهای تعریف‌شده و هم نمادهای تعریف‌نشده نمایش داده می‌شوند.
نمایش شماره نسخه nm و خروج.
این گزینه به منظور سازگاری با نسخه AIX برنامه nm نادیده گرفته می‌شود. این گزینه یک پارامتر می‌گیرد که باید رشته 32_64 باشد. حالت پیش‌فرض nm در AIX با -X 32 مطابقت دارد که توسط GNU nm پشتیبانی نمی‌شود.
افزونه‌ای به نام name را جهت افزودن پشتیبانی از انواع هدف اضافی بارگذاری می‌کند. این گزینه تنها در صورتی در دسترس است که زنجیره ابزار (toolchain) با پشتیبانی فعال از افزونه‌ها ساخته شده باشد.

اگر --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 توالی را در محلی‌سازی جاری (locale) نمایش می‌دهد که ممکن است از آن‌ها پشتیبانی کند یا نکند. گزینه‌های --unicode=hex و --unicode=invalid آن‌ها را به‌صورت توالی‌های بایت هگزادسیمال احاطه‌شده توسط قلاب‌های زاویه‌دار یا آکولادها نمایش می‌دهند.

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

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

گزینه‌ها در file با نویسه فاصله (whitespace) از یکدیگر جدا می‌شوند. می‌توان یک نویسه فاصله را با احاطه کردن کل گزینه در علامت نقل‌قول تکی یا دوتایی درون آن گنجاند. هر نویسه‌ای (از جمله بک‌اسلش) را می‌توان با افزودن یک بک‌اسلش پیش از آن در گزینه قرار داد. خود file نیز ممکن است شامل گزینه‌های @file دیگری باشد؛ چنین گزینه‌هایی به‌صورت بازگشتی پردازش خواهند شد..SH "همچنین ببینید (SEE ALSO)" ar(1)، objdump(1)، ranlib(1)، و مدخل‌های 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