Process 为进程中的每个共享库增加一个文本、数据和bss部分';s地址空间,这是真的吗?

Process 为进程中的每个共享库增加一个文本、数据和bss部分';s地址空间,这是真的吗?,process,linux-kernel,Process,Linux Kernel,每个共享库(如C库和动态链接器)的附加文本、数据和bss部分加载到进程的地址空间()中 如果是,上述陈述是否属实?比如何 有人能解释一下吗?没错。文本部分是可执行代码。数据部分是初始化数据,因此所有全局或静态变量都放在这里。bss部分是由库代码声明的未初始化数据(即隐式初始化为零) 因此,给定这个C代码: int my_flag = 1; char my_buf[100]; void my_func(void) { strcpy(my_buf, "Hello, world\n");

每个共享库(如C库和动态链接器)的附加文本、数据和bss部分加载到进程的地址空间()中

如果是,上述陈述是否属实?比如何


有人能解释一下吗?

没错。文本部分是可执行代码。数据部分是初始化数据,因此所有全局或静态变量都放在这里。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_标志进入数据,my_buf进入bss

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

要查看实际流程中的情况,请尝试:

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


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

您的意思是如果我的程序共享一个库,而不是进程地址空间中有两个数据部分、两个bss部分(一个用于程序代码,一个用于共享库),请解释是的。每个附加库都有其自己的文本、数据和bss部分。我们如何检查此附加区域,例如对于libc共享库,如果我们看到流程图,它只显示libc的区域。那么您想做什么?libc。共享库也是如此。“共享库”==“共享对象”