《程序员的自我修养》的笔记-第214页

prife
prife (相濡以沫,不如相忘于江湖)

读过 程序员的自我修养

  • 章节名:7.6.1动态链接器自举
  • 页码:第214页 2013-02-05 00:26:53
21人阅读

2013-02-05 14:35:22 Grissiom

对模块内部 static 变量的引用是通过绝对地址还是相对地址呢?

2013-02-05 14:36:18 Grissiom

这里的“通过相对地址”指的是通过 GOT/PLT 引用~

2013-02-05 16:41:37 prife

对模块内部static变量/函数的引用都将通过相对地址,不会存在全局符号介入问题。所以相对地址将是固定的,也是位置无关(PIC)的。

其实变量和函数作为符号时,并无本质区别。模块内定义的全局变量与非static函数一样,模块内静态变量由于静态函数一样。


2013-02-05 21:15:32 Grissiom

嗯,那也就是说静态库函数内部不应该用 static 变量?因为同一个 static 变量在不同程序中会指向不同的地址……

2013-02-06 17:23:09 prife

"嗯,那也就是说静态库函数内部不应该用 static 变量?因为同一个 static 变量在不同程序中会指向不同的地址…… "

1. 无论一个变量是不是static的,这个变量的地址在不同的程序(进程)中都将是不同的。因为静态库里变量的地址并不确定,因为静态库里的变量还没有重定位啊,重定位发生在链接时。既然是静态库,那么变量的地址自然是在编译链接时确定,所以每个程序相同变量具有不同地址是自然的。比如errno这个全局变量。

2. 无论动态链接还是静态链接,bss段和data段都是进程独有的。对于静态链接,数据段和代码段都是不同的拷贝。对于动态链接,库代码段在多个进程里共享,但是库中的变量,全局or static都是每个进程一份拷贝。还是以errno为例,进程A和进程B里的errno将是不同的,不是整个操作系统就一个errno。


2013-02-06 21:11:41 Grissiom

嗯嗯,明白了,多谢啦~ ;)

> prife的所有笔记(42篇)

prife对本书的所有笔记  · · · · · ·

  • 第171页

    关于本书的笔记实在不少,我就来挑点小刺吧。 处于工作需要,我是直接从第6章开始读的,利用坐..

  • 第214页

说明  · · · · · ·

表示其中内容是对原文的摘抄