nm

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה לניווט קפיצה לחיפוש

nm הוא פקודה בחלק מגרסאות יוניקס ומערכות הפעלה דומות אשר בודקת קבצים בינאריים (בפרט ספריות, קובצי אובייקט וקובצי הרצה) ומציגה את תוכנם או מטא-דאטה המאוחסן בהם כדוגמת טבלת סמלים (symbol table). הפלט מאפשר לבחון את סוגי הסמלים השונים - למשל פונקציות הממומשות בקבצים ופונקציות הדרושות עבורם. nm משמש כאמצעי עזר בניפוי שגיאות כדי לפתור בעיות הנובעות מהתנגשות שמות וכדי לבדוק חלקים ב-Toolchain.

פלט[עריכת קוד מקור | עריכה]

nm מציג עבור כל סימול פרטים שונים למשל:

  • A - הערך של הסימול ידוע ולא ישתנה בקישור נוסף
  • U - הסימול אינו מוגדר
  • N הסימול משמש לניפוי שגיאות
  • B - הסימול מופיע בחטיבת BSS, לרוב סימולים לא מאותחלים או מאותחלים באפס
  • T - הסימול מופיע בחטיבת ה-text (חטיבת code)

דוגמה[עריכת קוד מקור | עריכה]

קוד דוגמה הפלט של nm
(הודר במהדר C של gcc)
הפלט של nm
(הודר במהדר C++ של gcc)
/*
 * 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;
}
# 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.1255
00000008 d local_static_var_init.1256
0000003b T main
00000036 T non_mangled_function
00000000 t static_function
00000000 b static_var
00000004 d static_var_init
# 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_v0
00000000 B global_var
00000000 D global_var_init
0000003b T main
00000036 T non_mangled_function