【问题标题】:Why is GCC inserting seemingly unneeded variables into my assembly file?为什么 GCC 会在我的程序集文件中插入看似不需要的变量?
【发布时间】:2013-01-26 23:09:11
【问题描述】:

我有一个汇编文件,如下所示。它只有几个函数,一旦编译,我只希望这些函数在二进制文件中。

#include            <arm.h>

.section            vectors

reset:              ldr pc, =entry

undefined:          b undefined

swi:                b swi

prefetch_abort:     b prefetch_abort

data_abort:         b data_abort

reserved:           b reserved

interrupt_request:  b irq

fiq:                b fiq

irq:

.text

entry:              mov     sp,     #stack_address

                    bl      init

.end

但是当我编译它时,NM 显示了这一点。它有一些多余的变量。

00000000 t reset
00000004 t undefined
00000008 t swi
0000000c t prefetch_abort
00000010 t data_abort
00000014 t reserved
00000018 t interrupt_request
0000001c t fiq
00000020 t irq
0000002c T init
00000040 T main
00008024 t entry
00080000 N _stack
a0000000 D __data_start
a0000000 D a
a0000004 D b
a0000008 D __bss_end__
a0000008 D __bss_start
a0000008 D __bss_start__
a0000008 D __end__
a0000008 D _bss_end__
a0000008 D _edata
a0000008 D _end

为什么 gcc 会在我的代码中插入不必要的变量,例如 data_start、__bss_end、__bss_start 等?

【问题讨论】:

  • 这些变量不会全部占用空间。他们只是定义地址。 -nodefaultlibs-ffreestanding 可能还有 -nostdlib 将摆脱不需要的代码/数据。

标签: gcc arm c-preprocessor


【解决方案1】:

发生的事情是 GCC 将默认库链接到项目中并包含它们的所有功能。您需要使用-nodefaultlibs 进行编译以防止这种情况发生。

【讨论】:

  • 这行得通,但我仍然收到一条错误消息,说 newlib 正在访问的函数未定义。它通过使用 -nostdlib 编译得到修复,但是仍然留下了一些不需要的变量。你知道如何摆脱这些吗?
  • @George - 你在通过-ffreestanding吗?
  • 传递 -ffreestanding 并没有改变 NM 的转储。
【解决方案2】:

链接描述文件定义了这些,以便您可以在启动代码中拥有 .data 部分或将 .bss 部分归零。使用您自己的链接器脚本以及其他答案,nodefault this nostd that 等。

【讨论】:

  • 那么有什么办法可以摆脱它们吗?
  • 是的,使用您自己的链接器脚本(您没有定义这些变量)
  • 我正在使用我自己的链接器脚本。 SECTIONS { . = 0x00000000; .text : { * (vectors); * (.text); } .rodata : { * (.rodata); } text_end = .; . = 0xA4000000; .data : AT (text_end) { * (.data); } .bss : { * (.bss); } }
猜你喜欢
  • 2011-09-04
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多