nm (Unix)
nmهو أمر Unix يستخدم لتفريغ جدول الرموز وسماتها من ملف تنفيذي ثنائي (بما في ذلك المكتبات ووحدات الكائنات المجمعة وملفات الكائنات المشتركة والملفات التنفيذية المستقلة ).
يُفرّق الناتج nmبين أنواع الرموز المختلفة. على سبيل المثال، يُفرّق بين دالة مُقدّمة من وحدة كائنية ودالة مطلوبة منها. nmيُستخدم هذا الناتج كأداة مساعدة في تصحيح الأخطاء ، للمساعدة في حل المشكلات الناجمة عن تعارضات الأسماء وتشويه أسماء C++ ، وللتحقق من صحة أجزاء أخرى من سلسلة الأدوات .
يأتي هذا الأمر مُضمّنًا في عدد من الإصدارات اللاحقة من أنظمة يونكس وأنظمة التشغيل المشابهة ، بما في ذلك بلان 9. ويُقدّم مشروع جنو تطبيقًا له كجزء من حزمة جنو بينوتيلز .nm
أصل الكلمة هو أنه في الإصدار القديم 7 من يونكس، nmاستخدمت صفحة الدليل مصطلح قائمة الأسماء بدلاً من جدول الرموز . [ 1 ]
عينة خرج نانومتر
/* * اسم الملف: test.c * لتجميع كود C باستخدام: * gcc -c test.c * * لتجميع كود C++ باستخدام: * g++ -c test.cpp */كثافة العمليات العالمية_فار ؛ int global_var_init = 26 ؛static int static_var ; static int static_var_init = 25 ;static int static_function () { return 0 ; }دالة عامة int ( int p ) { متغير ثابت محلي int ; متغير ثابت محلي int تهيئة = 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 () { // لا أفعل شيئًا }int main ( void ) { global_var = 1 ; static_var = 2 ;return 0 ; }إذا تم تجميع الكود السابق باستخدام مترجم لغة C الخاص بـ gcc ، فسيكون ناتج الأمر 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.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عند استخدام مترجم لغة 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_v0 00000000 B global_var 00000000 D global_var_init 0000003b T main 00000036 T non_mangled_functionكما توضح الاختلافات بين المخرجات مثالاً على حل مشكلة تشويه الأسماء باستخدام extern "C" في كود C++.
| نوع الرمز | وصف |
|---|---|
| أ | رمز مطلق عالمي |
| أ | رمز مطلق محلي |
| ب | رمز bss العالمي |
| ب | رمز bss المحلي |
| د | رمز البيانات العالمية |
| د | رمز البيانات المحلية |
| و | رمز اسم ملف المصدر |
| R | رمز عالمي للقراءة فقط |
| ر | رمز محلي للقراءة فقط |
| تي | رمز النص العالمي |
| ت | رمز النص المحلي |
| يو | رمز غير معرف |
انظر أيضاً
مراجع
روابط خارجية
- : كتابة قائمة أسماء ملف كائن – مرجع الصدفة والأدوات المساعدة، مواصفات يونكس الموحدة ، الإصدار 5 من مجموعة Open Group
- – دليل مبرمج الخطة 9 ، المجلد 1
- أدوات برمجة يونكس
- أدوات يونكس SUS2008
- أوامر الخطة 9
- نماذج يونكس
