程序员的自我修养 chapeter 4 静态链接

  • 未初始化的全局变量在最终ld的那一步还是会被放在BSS段里面的,但是在单个.o文件中不会(考虑到全局可能会有多个弱定义 ,但是未初始化的局部静态变量就不一样了,外部文件是肯定不会用它的,所以大小已经定下来了)

静态链接

  • 又提到了那个概念
    • 很多库里面的函数实际上就是调用操作系统的API (e.g. printf( ) )
  • 一个静态库可以简单地看成一组目标文件的集合

4.6 连接控制过程

3 methods

在这里插入图片描述

.def文件

  • ld --verbose在这里插入图片描述

查看后格式如下:
lds的格式没看

/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 ) )

ref

所以我们不能在.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页
发布了177 篇原创文章 · 获赞 28 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Hesy_H/article/details/101033643