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...]

ابزار گنو nm نمادها را از فایل‌های شیء objfile... فهرست می‌کند. اگر هیچ فایل شیئی به عنوان آرگومان مشخص نشود، nm فایل a.out را پیش‌فرض در نظر می‌گیرد.

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

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

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

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

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

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

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

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

نمایش نمادهای پویا به جای نمادهای عادی. این گزینه تنها برای اشیاء پویا، مانند انواع خاصی از کتابخانه‌های مشترک (shared libraries) معنادار است.
استفاده از قالب خروجی format، که می‌تواند "bsd"، "sysv"، "posix" یا "just-symbols" باشد. مقدار پیش‌فرض "bsd" است. تنها اولین نویسه format مهم است و می‌تواند با حروف بزرگ یا کوچک باشد.
تنها نمادهای خارجی (external) نمایش داده شوند.
نمایش خلاصه‌ای از گزینه‌های nm و خروج.
هنگام نمایش نمادهای توابع غیرمستقیم گنو، nm به‌طور پیش‌فرض از نویسه "i" هم برای توابع غیرمستقیم محلی و هم برای توابع غیرمستقیم سراسری استفاده می‌کند. گزینه --ifunc-chars به کاربر امکان می‌دهد رشته‌ای شامل یک یا دو نویسه را مشخص کند. نویسه نخست برای نمادهای توابع غیرمستقیم سراسری و نویسه دوم، در صورت وجود، برای نمادهای توابع غیرمستقیم محلی استفاده خواهد شد.
همانند --format=just-symbols.
برای هر نماد، با استفاده از اطلاعات اشکال‌زدایی تلاش می‌کند تا نام فایل و شماره خط را پیدا کند. برای یک نماد تعریف‌شده، به دنبال شماره خط آدرس نماد می‌گردد. برای یک نماد تعریف‌نشده، به دنبال شماره خط یک مدخل بازمکان‌یابی (relocation entry) که به آن نماد اشاره دارد می‌گردد. در صورت یافتن اطلاعات شماره خط، آن را پس از سایر اطلاعات نماد چاپ می‌کند.
هنگامی که گزینه -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 است، که توسط گنو nm پشتیبانی نمی‌شود.
بارگذاری افزونه‌ای به نام name جهت افزودن پشتیبانی از انواع اهداف اضافی. این گزینه تنها زمانی در دسترس است که زنجیره ابزار با فعال بودن پشتیبانی از افزونه‌ها ساخته شده باشد.

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

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

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

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

نمایش نمادهایی که معنای خاص وابسته به معماری هدف دارند. این نمادها معمولاً توسط معماری هدف برای پردازش‌های خاصی به کار می‌روند و گنجاندن آن‌ها در فهرست عادی نمادها معمولاً سودمند نیست. برای نمونه در معماری ARM، این گزینه نمادهای نگاشت مورد استفاده برای نشانه‌گذاری گذارها بین کد ARM، کد THUMB و داده‌ها را رد می‌کند.
گنجاندن نمادهای ساختگی (synthetic symbols) در خروجی. این‌ها نمادهای ویژه‌ای هستند که توسط پیونددهنده برای اهداف گوناگون ایجاد می‌شوند. این نمادها به‌طور پیش‌فرض نمایش داده نمی‌شوند چرا که بخشی از کد منبع اولیه باینری نیستند.
کنترل نحوه نمایش نویسه‌های چندبایتی کدگذاری‌شده با 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 بیشتری باشد؛ هرگونه گزینه از این دست به صورت بازگشتی پردازش خواهد شد.

ar(1)، objdump(1)، ranlib(1) و مدخل‌های Info برای binutils.

حق نشر © ۱۹۹۱-۲۰۲۶ بنیاد نرم‌افزارهای آزاد (Free Software Foundation, Inc.)

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

2026-07-30 binutils-2.47