首页
论坛
专栏
课程

nm命令执行结果中,U,C,D,b,d标志的含义

2019-6-20 18:11 1830

nm命令执行结果中,U,C,D,b,d标志的含义

2019-6-20 18:11
1830
1. 执行"gcc -c g.c -g -Wall",将下面代码,编译成g.o文件:
// g.c
extern int g1;
int g2;
int g3 = 0x03030303;
static int g4;
static int g5 = 0x05050505;
 
void fun(int a[5])
{
    a[0] = g1;
    a[1] = g2;
    a[2] = g3;
    a[3] = g4;
    a[4] = g5;
}

2. 执行"nm g.o",观察g1,g2,g3,g4,g5五个全局变量的属性,分别为U,C,D,b,d:


3. 这些标志的含义,man手册和网上,很容易都可以查到,以下通过通过它们在文件、内存中是否占有空间的区别,更加深入的了解一下它们的含义:
  • U
         g1在g.o中不会占有空间,其它.o中必须要有g1的空间,才能链接成功,否则出现"未定义"错误。
  • C
         g2未初始化,也就不需要在g.o中占有空间,并且不属于g.o专有,为弱变量:
         ① 其它.o中的g2为强变量,则转换为跟g1一样的情况;
         ② 其它.o中的g2为弱变量,则也不会占有空间,链接不会出现"重复定义"错误,并且在链接目标文件中的符号表,只记录一个g2的信息,加载到内存后也只会有一份空间,称为"公共区",由所有.o中的g2共用。
  • D
         g3必须在g.o中占有空间,记录初始值,其它.o中不能也有g3的空间,否则出现"重复定义"错误。
  • b
         g4未初始化,不会在g.o中占有空间,但信息会记录在g.o的符号表中,其它.o的符号表中如果也有专有的g4,不会出现"重复定义"错误,并且在链接目标文件中,会保留所有g4的符号信息,加载到内存后,也会各自占有一块空间。
  • d
         g5必须在g.o中占有空间,记录初始值,其它.o的符号表中也有专有的g5,不会出现"重复定义"错误,它们在链接目标文件,也会各自占有一块空间。



[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最新回复 (0)
游客
登录 | 注册 方可回帖
返回