linux - 程序执行期间的数据段

标签 linux unix memory-management data-segment

疑问:

如果我们执行一个程序,以下是分配给该程序的内存类型。

                                            __________________
                                            |                |
                                            |      stack     |
                                            |                |
                                            ------------------
                                            |                |
                                            |   <Un Allocated|
                                            |       space>   |
                                            ------------------
                                            |                |
                                            |                |
                                            |       Heap     |
                                            |                |
                                            |                |
                                            __________________
                                            |                |
                                            |       data     |
                                            __________________
                                            |       text     |
                                            __________________

这里数据段起着至关重要的作用。所有已初始化的数据和未初始化的数据都存在于数据段中。但是,我不知道数据段中数据的存储顺序。对于Ex,初始化数据、未初始化数据、只读和读写数据。我认为以上是数据段中存在的四种类型。

所以,数据将按照什么顺序放置在数据段中。就像地址小于全部的第一个初始化数据一样。接下来是未初始化的数据,其地址比初始化的数据高。

提前致谢。

最佳答案

数据段中全局变量的顺序无法提前确定 - 这取决于您的链接器和编译器。通常,链接器会保留变量在链接的目标文件中出现的顺序,但这不是硬性要求(例如,链接器可以将 double 变量放在前面,将 char 放在最后,以保留所需的对齐字节)。

未初始化的全局数据通常存在于 .bss 段中,该段位于 .data 段之后(在您的图片中,位于其“上方”,因为图片的较高部分=较大的地址)。 .bss 段全为零,仅其大小存储在可执行文件中。这样,我们就不需要在二进制图像中存储长串零。

关于linux - 程序执行期间的数据段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31335070/

相关文章:

sql-server - Microsoft ODBC Driver 11 for SQL Server on Linux 是否与 SQL Server 2014 兼容

linux - 环境变量不可用于 shell 脚本中的下一个命令

memory-management - OpenCV 的自定义内存分配器

string - 在vb6中清除内存

C 使用 system() 与使用 execl() 启动 X11 session

java - Apache Commons CSV 框架是否提供内存高效的增量/顺序模式来读取大文件?

linux - Linux 上的 Qt Creator 和构建配置目录

linux - 无法从 CLI 连接到远程 DB2 数据库

linux - 服务器重启后在 Linux 中重启服务

linux - 在另一个进程上设置限制