PC操作系統:ubuntu 11.10
使用的開發板:am335x_evm
開發板使用的操作系統:linux 3.2

用途

顯示關於對象文件、可執行文件以及對象文件庫裏的符號信息。

語法

nm [ -A ] [ -C ] [ -X {32|64|32_64}] [ -f ] [ -h ] [ -l ] [ -p ] [ -r ] [ -T ] [ -v ] [ -B | -P ] [ -e | -g | -u ] [ -d | -o | -x | -t Format ] File ...

描述

nm 命令顯示關於指定 File 中符號的信息,文件可以是對象文件、可執行文件或對象文件庫。如果文件沒有包含符號信息,nm 命令報告該情況,但不把它解釋為出錯條件。 nm 命令缺省情況下報告十進制符號表示法下的數字值。

nm 命令把以下符號信息寫入標準輸出:

庫或對象名
如果您指定了 -A 選項,則 nm 命令只報告與該文件有關的或者庫或者對象名。

符號名稱
符號類型
nm 命令使用以下符號(用同樣的字符表示弱符號作為全局符號)之一來表示文件符號類型:

A    Global absolute 符號。
a    Local absolute 符號。
B    Global bss 符號。
b    Local bss 符號。
D    Global data 符號。
d    Local data 符號。
f    源文件名稱符號。
T    Global text 符號。
t    Local text 符號。
U    未定義符號。

大小
如果可應用,nm 命令報告與符號有關的大小。

標誌

-A    每行或者顯示全路徑名稱或者顯示對象庫名。
-B    在 Berkeley 軟件分發(BSD)格式中顯示輸出:
值   類型   名稱
-C    限制解碼(demangle) C++ 名稱。缺省是解碼所有 C++ 符號名。
註:
C++ 對象文件中的符號在被使用前它們的名稱已經被解碼了。
-d    用十進制顯示符號的值和大小。這是缺省的。
-e    只顯示靜態的和外部的(全局)符號。
-f    顯示完整的輸出,包括冗余的 .text、 .data 以及 .bss 符號,這些在通常都是被限制的。
-g    只顯示外部的(全局)符號。
-h    限制輸出頭數據的顯示。
-l    通過給 WEAK 符號的編碼鍵附加一個 * 來區分 WEAK 和 GLOBAL 符號。如果和 -P 選項一起使用, WEAK 符號的符號類型顯示如下:
V
Weak Data 符號
W
Weak Text 符號
w
Weak 未定義符號
Z
Weak bss 符號
-o    用八進制而不是十進制數來顯示符號的值和大小。
-P    以標準可移植輸出格式顯示信息:
庫/對象名  名稱   類型   值   大小
該格式以十六進制符號表示法顯示數字值,除非您用 -t、-d 或 -o 標誌指定不同的格式。

如果您指定了 -A 標誌 -P 標誌只顯示 庫/對象名字段。同樣,-P 標誌只顯示大小適用的符號大小字段。

-p    不排序。輸出按符號表順序打印。
-r    倒序排序。
-T    把可能會溢出它的列的每個名字截短,使顯示的名字的最後一個字符是星號(*)。缺省情況下,nm 顯示列出的符號的全名,並且一個比為其設置的列的寬度長的名稱會引起名稱後的每個列無法對齊。
-t Format    顯示指定格式下的數字值,其中 Format 參數是以下符號表示法之一:
d
十進制符號表示法。這是 nm 命令的缺省格式。
o
八進制符號表示法。
x
十六進制符號表示法。
-u    只顯示未定義符號。
-v    按值而不是按字母表順序排序輸出。
-x    用十六進制而不是十進制數來顯示符號的值和大小。
-X mode    指定 nm 應該檢查的對象文件的類型。 mode 必須是下列之一:
32
只處理 32 位對象文件
64
只處理 64 位對象文件
32_64
處理 32 位和 64 位對象文件
缺省是處理 32 位對象文件(忽略 64 位對象)。 mode 也可以 OBJECT_MODE 環境變量來設置。例如,OBJECT_MODE=64 使 nm 處理任何 64 位對象並且忽略 32 位對象。 -X 標誌覆蓋 OBJECT_MODE 變量。

註:
nm 命令支持 -- (雙連字符)標誌。如果文件名會被曲解為一個選項,該標誌區別於 File 操作數。例如,要指定文件名以連字符開始,請使用 -- 標誌。
退出狀態

該命令返回下列出口值:

0    成功完成。
>0    發生錯誤。
示例

列出 a.out 對象文件的靜態和外部符號,請輸入:
nm -e a.out
以十六進制顯示符號大小和值並且按值排序符號,請輸入:
nm -xv a.out
顯示 libc.a 中所有 64 位對象符號,忽略所有 32 位對象:
nm -X64 /usr/lib/libc.a
文件

/usr/ccs/bin/nm    包含 nm 命令。

示例:
程序源碼:

#include <linux init.h="">
#include <linux module.h="">
#include <linux leds.h="">
#include <linux io.h="">
#include <linux semaphore.h="">
#include <linux kernel.h="">
#include <linux cdev.h="">
#include <linux types.h="">
#include <linux fs.h="">    //register_chrdev_region
#include <mach gpio.h="">
#include <plat mux.h="">
#include <linux gpio.h="">
 
 
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("SM");
MODULE_VERSION("0.0.1");
//MODULE_DEVICE("global memory");
MODULE_DESCRIPTION("led ...");
MODULE_ALIAS("LED");
 
 
 
/*******************************************/
 
#define NAME "led"
#define GPIO_TO_PIN(bank, gpio)        (32 * (bank) + (gpio))
#define LED_GPIO_1                      1
#define LED_PIN_1                       24
 
 
 
static  int     major =283;//定義主設備號
static  struct class    *led_class;
 
/*******************************************/
 
void led_on(void)
 
{    
     gpio_set_value(GPIO_TO_PIN(LED_GPIO_1,LED_PIN_1), 1);
 
}
EXPORT_SYMBOL(led_on);
 
 
 
void led_off(void)
 
{    
     gpio_set_value(GPIO_TO_PIN(LED_GPIO_1,LED_PIN_1), 0);
 
}
EXPORT_SYMBOL(led_off);
 
 
 
void led_init(void)
 
{
        int result;
 
         /* Allocating GPIOs and setting direction */
        gpio_free(GPIO_TO_PIN(LED_GPIO_1,LED_PIN_1));
        result = gpio_request(GPIO_TO_PIN(LED_GPIO_1,LED_PIN_1), "Leds");//usr1
        if (result != 0)
                printk("gpio_request(%d_%d) failed!\n",LED_GPIO_1,LED_PIN_1);
 
        result = gpio_direction_output(GPIO_TO_PIN(LED_GPIO_1,LED_PIN_1), 1);
        if (result != 0)
                printk("gpio_direction(%d_%d) failed!\n",LED_GPIO_1,LED_PIN_1);
}
 
 
 
 
struct light_dev
 
{
    struct cdev cdev;
    unsigned char value;
};
 
 
 
struct light_dev *light_devp;
 
 
// 打開和關閉函數
 
int light_open(struct inode *inode,struct file *filp)
 
{
    struct light_dev *dev;
 
    // 獲得設備結構體指針
    dev = container_of(inode->i_cdev,struct light_dev,cdev);
 
    // 讓設備結構體作為設備的私有信息
    filp->private_data = dev;
 
    return 0;
 
}
 
 
 
int light_release(struct inode *inode,struct file *filp)
 
{
    return 0;    
 
}
 
 
 
 
 
// ioctl
 
long light_ioctl(struct file *filp,unsigned int cmd,
 
unsigned long arg)
 
{
    struct light_dev *dev = filp->private_data;
 
    switch(cmd)
 
    {
        case 0:
            dev->value = 0;
            led_off();         
            break;
 
        case 1:
            dev->value = 1;
            led_on();
           break;
 
        default:
            return -ENOTTY;
        // break;
    }
 
    return 0;
}  
 
//set up the cdev structure for a device
static  void    led_setup_cdev(struct cdev* dev,int minor,struct file_operations *fops)
{
    int     err, devno  = MKDEV(major,minor);
 
    cdev_init(dev,fops);
    dev->owner   = THIS_MODULE;
    dev->ops = fops;
    err         = cdev_add(dev,devno,1);
 
    if(err)
        printk(KERN_NOTICE"Error %d adding led%d",err,minor);
}   
 
 
 
struct file_operations light_fops =
 
{
    .owner = THIS_MODULE,
    .unlocked_ioctl = light_ioctl,
    .open  = light_open,
    .release = light_release,
};
 
 
static  struct cdev cdev_led;
// 模塊加載函數
int light_init(void)
 
{
    int ret;
    dev_t   dev = MKDEV(major,0);
 
    led_init();
    printk(KERN_ALERT "led modules is install\n");   
 
 //   ret=register_chrdev(major,NAME,&light_fops);   
    if(major)
        ret = register_chrdev_region(dev,1,NAME);
    else
    {
        ret = alloc_chrdev_region(&dev,0,1,NAME);
        major   = MAJOR(dev);
    }
    if(ret<0)   
    {   
      printk("unable to register myled driver!\n");   
      return ret;   
     }     
 
    printk(KERN_DEBUG"led device number : %x\n",dev);
 
    led_setup_cdev(&cdev_led,0,&light_fops);       
 
    led_class   = class_create(THIS_MODULE,"led_class");
    if(IS_ERR(led_class))
    {
        printk(KERN_INFO"create led class error\n");
        return -1;
    }
 
    device_create(led_class,NULL,dev,NULL,"led" "%d",MINOR(dev));
 
 
    return 0;  
}
 
 
 
// 模塊卸載函數
 
void light_cleanup(void)
 
{
 //   unregister_chrdev(major,NAME);   
    device_destroy(led_class,MKDEV(major,0));
    class_destroy(led_class);
    cdev_del(&cdev_led);
    unregister_chrdev_region(MKDEV(major,0),1);
 
    printk("Goodbye,cruel world!\n");
}
 
module_init(light_init);
module_exit(light_cleanup);
 

arrow
arrow
    全站熱搜

    愛在屋簷下 發表在 痞客邦 留言(0) 人氣()