دستور NM
دستور nm با تعدادی از نسخههای بعد یونیکس و سیستم عاملهای مشابه شد. nm برای بررسی فایلهای باینری (از جمله کتابخانهها، آبجکت فایلهای کامپایل شده، آبجکت فایلهای به اشتراک گذاشته شده و فایلهای اجرایی مستقل) و مشاهده محتوای ان فایلها یا متا دیتاهایی که در ان فایلها ذخیره شدهاست (بهطور خاص جدول نمادها) استفاده میشود. خروجی از nm انواع مختلف نماد را تشخیص میدهد. به عنوان مثال، آن را بین یک تابع که از طریق یک ماژول شیء و یک تابع که توسط آن مورد نیاز است، تمایز میدهد. Nm به عنوان یک کمک برای اشکال زدایی، برای حل مشکلات ناشی از درگیریهای نام در C ++، و همچنین اعتبار بخشی به بخشهای دیگر ابزار tool chain استفاده میشود.
پروژه GNU اجرای nm را به عنوان بخشی از بسته GNU Binutils پیادهسازی کردهاست.
مثال برای خروجی nm
[ویرایش]/*
* File name: test.c
* For C code compile with:
* gcc -c test.c
*
* For C++ code compile with:
* g++ -c test.cpp
*/
int global_var;
int global_var_init = 26;
static int static_var;
static int static_var_init = 25;
static int static_function()
{
return 0;
}
int global_function(int p)
{
static int local_static_var;
static int local_static_var_init=5;
local_static_var = p;
return local_static_var_init + local_static_var;
}
int global_function2()
{
int x;
int y;
return x+y;
}
#ifdef __cplusplus
extern "C"
#endif
void non_mangled_function()
{
// I do nothing
}
int main(void)
{
global_var = 1;
static_var = 2;
return 0;
}
اگر کد قبلی با کامپایلر gcc C کامپایل شده باشد، خروجی دستور nm مانند پایین است:
# nm test.o 0000000a T global_function 00000025 T global_function2 00000004 C global_var 00000000 D global_var_init 00000004 b local_static_var.۱۲۵۵ 00000008 d local_static_var_init.۱۲۵۶ 0000003b T main 00000036 T non_mangled_function 00000000 t static_function 00000000 b static_var 00000004 d static_var_init
هنگامی که کامپایلر C ++ استفاده میشود، خروجی متفاوت است:
- nm test.o
0000000a T _Z15global_functioni 00000025 T _Z16global_function2v 00000004 b _ZL10static_var 00000000 t _ZL15static_functionv 00000004 d _ZL15static_var_init 00000008 b _ZZ15global_functioniE16local_static_var 00000008 d _ZZ15global_functioniE21local_static_var_init
U __gxx_personality_v000000000 B global_var 00000000 D global_var_init 0000003b T main 00000036 T non_mangled_function
تفاوت بین خروجی نیز نشان میدهد که یک مثال از حل مشکل نام منجلینگ با استفاده از extern C در کد C ++ است.
پیوند به بیرون
[ویرایش]- The Single UNIX® Specification, Issue 7 from The Open Group : write the name list of an object file – Commands & Utilities Reference,