【问题标题】:ELF section paddingELF 部分填充
【发布时间】:2016-08-19 06:24:26
【问题描述】:

我可能太好奇或太小心了,但请考虑一下:
例如,如果我将数组放置到某个部分 char buff[128] __attribute__((my_section)); 然后使用链接描述文件将该部分放置在例如地址 0x10004000 处, 我可以确定&buff[0] 永远是0x10004000 吗? (我正在考虑 ARM Inc. 的 ARMCC(前 RealView)以及基本的 GCC 工具链和 GNU ARM 开源。)可能有 buff 从一开始就存在偏移或填充,或者某些服务(运行时、链接、特定于收费链)的东西可能放在buff之前的0x10004000?
另外,在这种情况下,C 和 C++ 之间有什么区别吗?因为 C++ 有“更多的事情要做在后台”。 :) 您可以为此提供任何类型的文档以及您的知识——非常感谢。

【问题讨论】:

    标签: gcc linker arm sections toolchain


    【解决方案1】:

    是的,&buff[0] 将始终为 0x10004000。您可以在 Keil 帮助文件的“编译器用户指南”一书中看到第 9.46 节。

    Char 数组是 c/c++ 的内联对象。所以编译器对 c/c++ 做同样的事情。

    【讨论】:

    • 这并不完全正确。如果您在本节中有多个对象,则无法保证它们在内存中的布局顺序,因此您可能需要在链接描述文件中专门设置地址。但是当然,如​​果您保留此部分以仅存储此缓冲区,那么您很高兴。
    • @ChristopheAugier 是的。如果同一段中有很多对象,最好明确指定对象地址。
    • 我认为这对于小节并不总是正确的。如果您创建了一个.eeprom.my 部分,并从链接器脚本中指定该部分在.eeprom 部分的开头之后的100 个字节,则链接器可能决定将.eeprom.my 放在.eeprom 的开头,如果没有使用那 100 个字节。
    猜你喜欢
    • 2018-04-24
    • 2023-03-04
    • 2018-10-23
    • 2021-12-16
    • 2019-08-22
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多