process - 进程地址空间中每个共享库的附加文本、数据和 bss 部分,这是真的吗?

标签 process linux-kernel

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

以上陈述是否正确,如果是,那么如何?

谁能解释一下吗?

最佳答案

这是正确的。文本部分是可执行代码。数据部分是初始化数据,因此任何全局或静态变量都放置在这里。 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 每个都记录了与其关联的文件名,因为随着程序执行的进行,代码和数据页是通过页面错误从文件动态加载的。

关于process - 进程地址空间中每个共享库的附加文本、数据和 bss 部分,这是真的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27440589/

相关文章:

haskell - 如何在 Haskell 中进行波浪号扩展和 $PATH 搜索?

c - Linux 内核 v5 中的 current_kernel_time 相当于什么?

c - 处理内核模块上的 `Wframe-larger-than` 警告的建议

c# - UWP 中的 Process.Start

c# - 如何在运行批处理文件时隐藏 cmd 窗口?

linux - 将参数传递并解析到正在运行/在线的 systemd 守护进程

python - 查找 Python 进程及其所有子进程使用的总内存

linux - 当 linux 内核崩溃时,内核堆栈和调用跟踪如何记录到控制台?

linux - 使用 Linux sysfs_notify 调用

linux - 给定的文件在 Linux 上的 netstat -s 中意味着什么