5

STARTUPLD スクリプトでディレクティブを使用して、プログラムを独自のスタートアップ ファイルにリンクしようとしています。

...
ENTRY(_start)
STARTUP(my_crt1.o)
...

GCC ドライバーは、プログラムをリンクするために使用されます (libgcc などのライブラリ パスを気にしないでください)。

gcc -T my_script.ld ...

残念ながら、powerpc ターゲット用にコンパイルされた GCC でのみ動作しますが、arm または i686 ターゲットは、collect2 に crt0.o を含めず、まだ含んでいます。例えば:

arm-eabi-g++ -v -T my_script.ld ...

私に与えます:

collect2 ... /opt/lib/gcc/arm-eabi/4.8.0/../../../../arm-eabi/lib/crt0.o ...

したがって:

crt0.S:101: multiple definition of `_start'

ディレクティブは完全に無視されているようでSTARTUP(ディレクティブが指定されていない限り、powerpc ターゲットはデフォルトの crt0 も使用しますSTARTUP)、デフォルトの crt0 を無効にする方法はありません。

別の起動ファイルにリンクするポータブルな方法はありますか?

私の起動ファイルはlibgcc関数を使用して (ctors と dtors を呼び出すためcrtbegin.o) 、 などが必要なので、無効にするオプションをcrtend.o避けたいと思います- 無効にする必要があるだけです。-nostartfilescrt*.ocrt0.o

ありがとうございました

4

2 に答える 2

5

独自の起動ファイルを使用してプログラムをリンクしようとしています...
GCC ドライバーを使用してプログラムをリンクしています...

その場合、フラグもGCC に指定する必要があります。-nostartfiles

于 2013-05-19T21:59:41.243 に答える
2

この制限により、実際にはデフォルトのスタートアップファイルを無効にする必要があります-nostartfiles(私が好む-nostdlib)。次に、ランタイム オブジェクトのリストを自分で作成する必要があります。gcc には、-print-file-nameコンパイルに使用したライブラリの絶対パスを出力するオプションがあります (crtbegin.o、crtend.o、libgcc.a...)。例えば:arm-eabi-g++ <FLAGS> -print-file-name=crtbegin.o

これが私が使用するGNU Makeマクロです(gccとcflagsを提供します):

define m.in/toolchain/gnu/locate =
$(strip
  $(shell $(m.in/toolchain/gnu/bin/gcc) $(m.in/toolchain/gnu/cflags) \
          -print-file-name=$(m.in/argv/1))
)
endef

crtn := $(call m.in/toolchain/gnu/locate, crtn.o)
于 2016-01-23T07:48:52.167 に答える