链接描述文件中的位置计数器(。)更新

时间:2014-05-14 07:00:43

标签: gcc counter ld linker-scripts

我在链接描述文件中遇到位置计数器问题。不知道这是一个错误,还是我怀疑输出错误。

我有一个bss部分

/* Program bss, zeroed out during init. */
.bss :
{
    . = ALIGN(4);
    __bss_start = .;
    *(.bss*)
    *(.COMMON*)
    . = ALIGN(4);
    __bss_end = .;
    __heap_start = .;
} >sram_u
__bss_size = SIZEOF(.bss);

我的问题是(__bss_end - __bss_start)不等于__bss_size。如果我改为在.bss部分之外分配__bss_end,我会得到预期的值。如果我用elfread检查部分标题,我会得到预期的.bss大小。

我使用的链接器是:

GNU ld (GNU Tools for ARM Embedded Processors) 2.23.2.20131129
Copyright 2012 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.

和海湾合作委员会

arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 4.8.3 20131129 (release)
[ARM/embedded-4_8-branch revision 205641]
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE

所以问题是如果位置计数器(。)应该在节定义中更新,或者我只是错误地使用它?

PS:希望我使用正确的条款......

1 个答案:

答案 0 :(得分:2)

很抱歉没有回复。

问题是有一个。在COMMON之前。链接描述文件应该说

.bss :
{
    . = ALIGN(4);
    __bss_start = .;
    *(.bss*)
    *(COMMON*)
    . = ALIGN(4);
    __bss_end = .;
    __heap_start = .;
} >sram_u
__bss_size = SIZEOF(.bss);

即使查看地图文件,我也错过了一些东西。链接器会将COMMON放在bss中作为默认值,但是.bss部分中的__bss_end不会看到它。在bss部分声明之外移动__bss_end会捕获它。通过向gcc添加-fno-common删除了COMMON块。