- 未初始化的全局变量在最终ld的那一步还是会被放在BSS段里面的,但是在单个.o文件中不会(考虑到全局可能会有多个弱定义 ,但是未初始化的局部静态变量就不一样了,外部文件是肯定不会用它的,所以大小已经定下来了)
静态链接
- 又提到了那个概念
- 很多库里面的函数实际上就是调用操作系统的API (e.g. printf( ) )
- 一个静态库可以简单地看成一组目标文件的集合
4.6 连接控制过程
3 methods
.def文件
- ld --verbose
查看后格式如下:
/usr/lib/gnu–xx/ilbc.a
- p 125 内嵌汇编??
- 段表页表??
- BFD库??
- COMM块??
琐碎
正则表达式
- 跨行匹配
[\s\S]* or [\w\W]* or [\d\D]* - 贪婪和非贪婪
在贪婪模式后面加个?就能转变成非贪婪啦 e.g.+? , *?
注意,+和*的区别仅仅只在于可不可以匹配零次,两者本身自己都是贪婪模式的
类内定义 弱定义 weak symbol
- 在类里面定义在类里面的类函数就是WEAK 的symbol,在类外面定义函数就是GLOBAL(所以强定义就是GLOBAL?基本上就是了)
- 定义在类里面的类函数,如果没有被调用时是不会出现在symbol table里面的(我觉得是在.bss段里面 )
- 如果被调用了就是weak symbol ( 因为类内定义的类成员函数默认是inline函数( most of time for most compilers ) )
所以我们不能在.h文件里面、类外部定义类成员函数,但是我们可以在.h文件里面、类内部定义类成员函数!
因为类内部的是inline function --> 一般情况下会是weak symbol
类外部就是Global Symbol 强定义啦
多个弱定义没有关系 ,多个强定义就很有问题了
more referece and details @ https://stackoverflow.com/questions/10754350/why-does-the-ld-linker-allow-multiple-class-definitions-with-the-same-methods/10755605#10755605
- 但是并不建议这么做
cy: inline的一般会运行得比较快,但是不适合编译大型项目,因为你改一处,后买你所有得地方都得重新编译,因为是覆盖的方式编译得。
再重新看这段话 ,我的理解是:在类成员内部定义了这个函数,那么只要函数实现有一点改变,所有include了这个头文件的c文件也得重新编译了 (相当于C文件的内容也全都变了)。在xx.h文件里面声明,但是在xx.c文件里面定义的好处就是,只有xx.c文件需要进行重新编译,包含了xx.h的其他c文件不需要改变,因为此时的c文件实际上只有相应函数的一个可重定位地址(这个地址在和xx.o文件的链接生成main.o的时候会指向xx.o中函数的地址),c文件的内容是没有变的。
question
- static变量的作用空间?
仅在当前文件中有效
- 近址寻址 & 远址寻址?
- 看到121页