5

Cortex-A8 プロセッサ用のソフトウェアを作成していますが、特定のレジスタにアクセスするために ARM アセンブリ コードを作成する必要があります。私は gnu コンパイラと関連するツール チェーンを利用しています。これらのツールは Ubuntu のプロセッサ ボード (Freescale i.MX515) にインストールされています。WinSCP と PuTTY ターミナルを使用して、ホスト PC (Windows) から接続します。

いつものように、 main.cfunctions.sを持つ単純な C プロジェクトから始めました。GCCを使用して main.c をコンパイルし、 asを使用して functions.s をアセンブルし、生成されたオブジェクト ファイルをもう一度GCCを使用してリンクしますが、このプロセス中に奇妙なエラーが発生します。

重要な発見 -

一方、コマンドを使用して個別にアセンブルし、コマンドを使用as -o functions.o functions.sして生成されたfunctions.o./functions.oを実行しようとすると、bash シェルがこのファイルを実行可能ファイルとして認識できないため (タブ関数を押すと) 、アセンブリ コードに問題がある可能性があることがわかりました。.o が選択されていない/PuTTY がファイルを強調表示していない)。

誰かがここで何が起こっているかを提案できますか? リンク処理中に GCC に送信しなければならない特定のオプションはありますか? 私が見るエラーは奇妙で、私の理解を超えています。GCC が何を参照しているのか理解できません。

main.c、functions.s、Makefile、およびエラーのリストの内容をここに貼り付けます。

助けてください!!!

ここでみんなが提案したように、makfileが編集された後に含まれる最新のエラー-

ubuntu@ubuntu-desktop:~/Documents/Project/Others/helloworld$ make
gcc -c -mcpu=cortex-a8 main.c
as -mcpu=cortex-a8 -o functions.o functions.s
gcc -o hello main.o functions.o
functions.o: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/arm-linux-gnueabi/4.3.3/../../../crt1.o:init.c:(.text+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [hello] Error 1

main.c

#include <stdio.h>
#include <stdlib.h>

int main(void) {

    puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
    return EXIT_SUCCESS;
}

functions.s

* Main program */
    .equ      STACK_TOP, 0x20000800
    .text
    .global _start
    .syntax unified

_start:
    .word STACK_TOP, start
    .type start, function

start:
    movs  r0, #10
    movs  r1, #0
    .end

メイクファイル

all: hello

hello: main.o functions.o
    gcc hello -o main.o functions.o

--スタックオーバーフローの人たちがここに提案した後、こんにちはがここに含まれましたが、問題はまだ解決せず、同じエラーが発生します。

main.o: main.c
    gcc -c -mcpu=cortex-a8 main.c

functions.o: functions.s
    as -mcpu=cortex-a8 -o functions.o functions.s

エラー

ubuntu@ubuntu-desktop:~/Documents/Project/Others/helloworld$ make
gcc -c -mcpu=cortex-a8 main.c
as -mcpu=cortex-a8 -o functions.o functions.s
gcc -o main.o functions.o
functions.o: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/arm-linux-gnueabi/4.3.3/../../../crt1.o:init.c:(.text+0x0): first defined here
/usr/lib/gcc/arm-linux-gnueabi/4.3.3/../../../crt1.o: In function `_start':
init.c:(.text+0x30): undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [hello] Error 1
4

4 に答える 4

8

メイクファイルで:

hello: main.o functions.o
    gcc -o main.o functions.o

次のようにする必要があります。

hello: main.o functions.o
    gcc -o hello main.o functions.o

現状では、main.o ではなく functions.o をリンクし、既存の main.o を上書きする main.o という出力実行可能ファイルを生成します。

于 2010-04-19T16:28:41.053 に答える
2

すべきではない

hello: main.o functions.o
    gcc -o main.o functions.o

なれ

hello: main.o functions.o
    gcc -o hello main.o functions.o
于 2010-04-19T16:28:59.250 に答える
2

Bigbohne が示唆するように、gcc は標準のランタイム ライブラリにリンクしようとしています。-nostdlib オプションを gcc 呼び出しに追加してみてください。

gcc -nostdlib -o hello main.o functions.o
于 2010-04-19T18:50:30.017 に答える
0

これは、gcc が最後にリンクしているランタイム ライブラリと関係があると思います。

そして、このライブラリにはすでに「_start」があります。

「標準ライブラリ」なしでコンパイルする必要があると思います。ただし、printf、getchar、およびその他すべての便利なものはありません。

于 2010-04-19T16:50:51.087 に答える