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) است و با پیوندزدن (linking) بیشتر تغییر نخواهد کرد.
"B"
"b"
نماد در بخش دادهٔ BSS قرار دارد. این بخش معمولاً شامل داده‌های مقداردهی‌نشده یا مقداردهی‌شده با صفر است، اگرچه رفتار دقیق آن به سیستم بستگی دارد.
"C"
"c"
نماد مشترک (common) است. نمادهای مشترک، داده‌های مقداردهی‌نشده هستند. هنگام پیوندزدن، ممکن است چندین نماد مشترک با نام یکسان ظاهر شوند. اگر نماد در جایی تعریف شده باشد، با نمادهای مشترک مانند ارجاعات تعریف‌نشده رفتار می‌شود. نویسهٔ کوچک c زمانی استفاده می‌شود که نماد در بخشی ویژه برای داده‌های مشترک کوچک (small commons) باشد.
"D"
"d"
نماد در بخش داده‌های مقداردهی‌شده (initialized data) قرار دارد.
"G"
"g"
نماد در یک بخش داده‌های مقداردهی‌شده برای اشیاء کوچک (small objects) قرار دارد. برخی از قالب‌های فایل شیء دسترسی کارآمدتری را به اشیاء داده‌ای کوچک فراهم می‌کنند، مانند یک متغیر سراسری int در مقایسه با یک آرایهٔ سراسری بزرگ.
"i"
برای فایل‌های با قالب PE این مورد نشان می‌دهد که نماد در بخشی مختص پیاده‌سازی DLLها قرار دارد.

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

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

"I"
نماد یک ارجاع غیرمستقیم به نمادی دیگر است.
"N"
نماد یک نماد اشکال‌زدایی (debugging) است.
"n"
نماد در یک بخش فقط‌خواندنیِ غیرداده‌ای، غیرکدی و غیراشکال‌زدایی قرار دارد.
"p"
نماد در یک بخش بازپیچی پشته (stack unwind) قرار دارد.
"R"
"r"
نماد در یک بخش داده‌های فقط‌خواندنی (read-only data) قرار دارد.
"S"
"s"
نماد در یک بخش داده‌های مقداردهی‌نشده یا مقداردهی‌شده با صفر برای اشیاء کوچک قرار دارد.
"T"
"t"
نماد در بخش متن یا کد (text) قرار دارد.
"U"
نماد تعریف‌نشده (undefined) است.
"u"
نماد یک نماد سراسری یکتا (unique global symbol) است. این یک افزونهٔ GNU به مجموعهٔ استاندارد اتصالات نمادهای ELF است. برای چنین نمادی، پیونددهندهٔ پویا (dynamic linker) اطمینان حاصل خواهد کرد که در کل فرایند تنها یک نماد با این نام و نوع مورد استفاده قرار می‌گیرد.
"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 (جهت سازگاری با nm در MIPS).
رمزگشایی (demangle) نام‌های سطح پایین نمادها به نام‌های سطح کاربر. این کار علاوه بر حذف خط زیرین اولیه که توسط سیستم اضافه می‌شود، نام توابع ++C را خوانا می‌کند. کامپایلرهای مختلف شیوه‌های دستکاری نام (mangling) متفاوتی دارند. از آرگومان اختیاری شیوه demangle می‌توان برای انتخاب شیوه مناسب برای کامپایلر خود استفاده کرد.
نام‌های سطح پایین نمادها رمزگشایی نشوند. این حالت پیش‌فرض است.
محدودیتی را بر میزان بازگشت انجام‌شده حین رمزگشایی رشته‌ها فعال یا غیرفعال می‌کند. از آنجا که قالب‌های دستکاری نام امکان بازگشت نامحدود را فراهم می‌کنند، این احتمال وجود دارد که رشته‌هایی ایجاد شوند که رمزگشایی آن‌ها تمام فضای پشته موجود در ماشین میزبان را مصرف کرده و باعث خطای حافظه شود. این محدودیت با محدود کردن بازگشت به ۲۰۴۸ سطح تودرتو سعی می‌کند از وقوع این امر جلوگیری کند.

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

نمادهای پویا (dynamic) را به جای نمادهای عادی نمایش می‌دهد. این گزینه تنها برای اشیاء پویا، مانند انواع خاصی از کتابخانه‌های اشتراکی، معنادار است.
استفاده از قالب خروجی 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 را برای افزودن پشتیبانی از انواع هدف اضافی بارگذاری می‌کند. این گزینه تنها در صورتی در دسترس است که زنجیره ابزار با فعال بودن پشتیبانی از پلاگین ساخته شده باشد.

اگر --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) را نمایش نمی‌دهد.
نمایش اطلاعات نگارش نماد را فعال یا غیرفعال می‌کند. رشتهٔ نگارش به عنوان یک پسوند برای نام نماد که پیش از آن یک نویسهٔ @ آمده است نمایش داده می‌شود؛ برای نمونه 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-2025 Free Software Foundation, Inc.

اجازهٔ کپی، توزیع و/یا تغییر این سند تحت شرایط «مجوز مستندات آزاد گنو» (GNU Free Documentation License)، نسخهٔ 1.3 یا هر نسخهٔ متأخرتری که توسط بنیاد نرم‌افزارهای آزاد (Free Software Foundation) منتشر شده است اعطا می‌شود؛ بدون بخش‌های ناوردا (Invariant Sections)، بدون متون روی جلد (Front-Cover Texts)، و بدون متون پشت جلد (Back-Cover Texts). یک نسخه از مجوز در بخشی با عنوان “GNU Free Documentation License” آمده است.

2026-01-23 binutils-2.45.1