【问题标题】:How to print message to stdout from GNU ld script?如何从 GNU ld 脚本将消息打印到标准输出?
【发布时间】:2015-07-09 14:20:01
【问题描述】:

我有相当大的ld 用于嵌入式平台的链接脚本,它的 RAM 和 ROM 都很低。我想知道重新定位所有代码后还剩下多少可用内存。实际上,我想打印出价值 位置计数器. 到标准输出。 我该怎么做?有没有像print(.) 这样的神奇命令?

【问题讨论】:

    标签: linker embedded ld


    【解决方案1】:

    我在我的项目中有一个链接后步骤,它可以转储内容的大小,以便我可以看到我离我有多近。只需添加以下内容:

    arm-none-eabi-size binary_image.axf
    

    这会让你得到如下输出:

       text    data     bss     dec     hex filename
     204808     704   23188  228700   37d5c Foo.axf
    

    在我的 cortex-m3 芯片上,这将是 text+data = flash 使用,data+bss = ram 使用。 dec/hex 是无用的值。

    正如 Olaf 所说,使用映射文件来实现更具体的内存消耗。我已将此添加到我的链接步骤中:

    -Xlinker -Map=Foo.map
    

    【讨论】:

      【解决方案2】:

      另一种解决方案可能是将以下命令添加到链接器:

      -Xlinker --print-memory-usage

      这给了我以下输出:

      Memory region Used Size Region Size %age Used m_interrupts: 576 B 576 B 100.00% m_text: 22988 B 32192 B 71.41% m_data: 26552 B 32 KB 81.03%

      【讨论】:

        【解决方案3】:

        阅读manual。没有这样的命令 - 不可能。

        链接器“脚本”实际上更像配置/描述符文件。它们不像脚本那样“执行”。也没有一个.(怎么可能是不同的内存区域?)。

        但是,您可以输出一个可能正是您需要的 map。尝试选项-M。如果您在链接描述文件中正确设置了内存区域,链接器会在某些内存区域溢出时发出警告,这实际上是您想要的自动构建。


        更新:如果您想坚持查看每个构建的部分大小,可以 grep/过滤地图文件。

        【讨论】:

        • 但是我想知道我有多少空间可以存放我以后要写的代码。但是,您是对的,在 ld 脚本中没有打印消息的命令,所以我会将您的答案标记为正确。
        • @RostakaGmfun:再次阅读最后一段,我稍作编辑。有办法!
        • 太棒了!那是我真正需要的东西!谢谢
        • 它们显然像脚本一样执行。 . 是一个随着脚本“执行”而更新的变量。我不知道你为什么认为这是不可能的。
        • @Timmmm 仅仅因为有一个变量并不意味着它们是可执行文件。尽管 makefile 不是脚本(尽管它们甚至可以包含 sn-ps 代码)。
        【解决方案4】:

        在执行脚本时您不能打印符号的值,但您可以创建一个符号并在之后使用nm 查找它。像这样:

        value_of_dot = .;
        

        然后

        nm my_file.elf | grep value_of_dot
        

        编辑:如果您真的希望将其打印到stdout,则必须修改链接器。例如。对于lld,在LinkerScript.cpp 中添加printfs 在LinkerScript::assignSymbol() 中。

        对于检查内存使用量的特定用例,最好使用 size(正如 escrafford 建议的那样)或 objdump -section-headers

        【讨论】:

        • 这实际上比简单地检查地图文件更糟糕,而且它不符合 OP 的要求(这显然是不可能的)。
        • 如果你把它放在你的脚本末尾的所有部分之后(假设它们是按顺序排列的),它确实可以满足 OP 的要求。
        • 使用size 显然更适合他的应用程序。但是从 Google 提出这个问题的人可能不想做完全相同的事情。
        • 不,它不执行 OP 显然想要的操作:通过链接器将此信息输出到标准输出。这正是我在回答中写的:不可能。此外,它实际上与嵌入式开发无关。这里想要检查代码/数据是否适合内存区域。这就是我在回答中所写的链接器自动检查的内容。这就是 OP 需要
        • 当然,但我来这个问题是因为我想出于不同的原因打印一个符号值,所以回答他提出的问题仍然对其他人有用。请删除您的反对票。这个答案显然有效。
        猜你喜欢
        • 1970-01-01
        • 2013-05-01
        • 2016-10-14
        • 1970-01-01
        • 2019-10-29
        • 2011-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多