在进程的地址空间中,每个共享库的附加文本,数据和bss部分是否属实?

时间:2014-12-12 09:32:37

标签: process linux-kernel

每个共享库的附加文本,数据和bss部分,例如C库和动态链接器,加载到进程的地址空间(http://www.makelinux.net/books/lkd2/ch14

如果是,则上述陈述是真的吗?

任何人都可以解释一下吗?

1 个答案:

答案 0 :(得分:5)

这是对的。文本部分是可执行代码。数据部分是初始化数据,因此任何全局或静态变量都放在此处。 bss部分是库代码声明的未初始化数据(即隐式初始化为零)。

所以,给定这个C代码:

int my_flag = 1;

char my_buf[100];

void my_func(void) {
   strcpy(my_buf, "Hello, world\n");
   my_flag = 0;
}

my_func进入文本部分,my_flag进入数据,my_buf进入bss。

加载时,动态链接器将为每个部分安排单独的内存区域,并使用库文本部分中的(文本)可执行代码[应用重定位]初始化它们,(数据)来自库数据部分的初始化数据,(bss)将页面归零到为库的bss部分指定的大小。

要了解这在实际过程中的效果,请尝试:

cat /proc/self/maps

这将显示cat进程本身的内存映射。 (您可以通过/proc/<pid>/maps查看其他流程。)

请注意,没有使用bss部分记录文件名,因为一旦确定了大小,就不需要知道文件名。文本和数据部分OTOH各自都记录了与它们相关联的文件名,因为程序执行过程中会通过页面错误从文件中动态加载代码和数据页。