-
-
nm命令执行结果中,U,C,D,b,d标志的含义
-
发表于: 2019-6-20 18:11 5837
-
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; }
// 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,不会出现"重复定义"错误,它们在链接目标文件,也会各自占有一块空间。
- 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,不会出现"重复定义"错误,它们在链接目标文件,也会各自占有一块空间。
g1在g.o中不会占有空间,其它.o中必须要有g1的空间,才能链接成功,否则出现"未定义"错误。
g2未初始化,也就不需要在g.o中占有空间,并且不属于g.o专有,为弱变量:
① 其它.o中的g2为强变量,则转换为跟g1一样的情况;
② 其它.o中的g2为弱变量,则也不会占有空间,链接不会出现"重复定义"错误,并且在链接目标文件中的符号表,只记录一个g2的信息,加载到内存后也只会有一份空间,称为"公共区",由所有.o中的g2共用。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
- 调试器:显示调用栈 2617
- helloworld减肥 + 单步执行原理 2956
- gcc -O2编译,gdb单步执行怪怪的 10362
- systemtap追踪自己开发的内核模块 11736
- PCI总线初始化过程(linux-2.4.0内核中的pci_init()函数分析) 17360
看原图
赞赏
雪币:
留言: