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