2

以下に示すアセンブリファイルがあります。いくつかの関数しかありません。コンパイルしたら、それらの関数だけをバイナリに入れたいと思います。

#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などの不要な変数をコードに挿入するのはなぜですか?

4

2 に答える 2

5

何が起こっているかというと、GCC がデフォルト ライブラリをプロジェクトにリンクし、それらのすべての機能を含めていることです。-nodefaultlibsこれを防ぐには、でコンパイルする必要があります。

于 2013-01-26T23:13:35.940 に答える
4

リンカスクリプトは、スタートアップコードに.dataセクションを含めるか、.bssセクションをゼロにすることができるようにそれらを定義します。独自のリンカースクリプトと他の回答を使用してください。デフォルトではありません。

于 2013-01-27T02:53:32.397 に答える