![]() |
1
67
自从我和小精灵一起工作以来已经有一段时间了。但我想我还是记得这些东西。不,它在物理上不包含那些零。如果您查看一个ELF文件程序头,那么您将看到每个头都有两个数字:一个是文件中的大小。另一个是在虚拟内存中分配的部分的大小(
类型标头
对于此示例代码:
ELF规范指出,MEM大小大于文件大小的段的一部分,只是在虚拟内存中用零填充。第二个的段到段映射
所以这里也有其他部分。对于C++构造函数/析构函数。Java也一样。然后它包含
顺便说一下,您可以通过使用
默认情况下,为了与旧编译器兼容,gcc在公共部分中保留未初始化的全局,这些编译器允许在一个程序中定义两次全局,而不会出现多个定义错误。使用
|
![]() |
2
21
这个
在这种情况下
你可以看到不同使用
这通常是第一个 惊奇 嵌入式开发人员遇到的…从不显式将静态初始化为零。运行时加载器(通常)负责处理这个问题。一旦显式初始化任何东西,您就告诉编译器/链接器在可执行映像中包含数据。 |
![]() |
3
3
一
|
![]() |
4
1
这是正确的,.bss在文件中不是物理存在的,而是动态加载器为应用程序分配.bss节而存在的有关其大小的信息。 由于Thumb规则只加载,所以tls段获取应用程序的内存,其余部分用于动态加载程序。 关于静态可执行文件,BSS部分在可执行文件中也有一定的空间。 在没有加载程序的嵌入式应用程序中,这是常见的。 苏曼 |