1/22 clang xv6-aarch64 コンパイル log
コンパイラを変更して、とりあえずmakeしてみる
code:error
clang -Wall -Werror -Os -g -fno-omit-frame-pointer -mcpu=cortex-a72+nofp -MD -ffreestanding -fno-common -nostdlib -I. -fno-stack-protector -c -o kernel/printf.o kernel/printf.c
オプションの-mcpu=cortex-a72+nofpはclangにないので、-target aarch64-none-linux-gnuに置き換える
Makefileの変更点
code:Makefile
+dalmore+e205729 diff Makefile ../xv6-aarch64/Makefile
50,51c50
< # clang コンパイラの指定
< CC = clang
---
CC = $(TOOLPREFIX)gcc
57c56
< CFLAGS = -Wall -Werror -Os -g -fno-omit-frame-pointer -target aarch64-none-linux-gnu
---
CFLAGS = -Wall -Werror -Os -g -fno-omit-frame-pointer -mcpu=cortex-a72+nofp
72c71
< ASFLAGS = -Og -ggdb -target aarch64-none-linux-gnu -MD -I.
---
ASFLAGS = -Og -ggdb -mcpu=cortex-a72 -MD -I.
もう一度make
code:error
^
=
^
=
^
=
^
=
^
=
5 errors generated.
kernel/proc.cのコンパイルで、GNUの拡張機能を使用している一部がエラー
GPTに聞いてみる
code:GPT
エラーメッセージから判断すると、Clangコンパイラが kernel/proc.c ファイル内の指定子付き初期化子に関連する問題を検出しています。GNU拡張を使用せず、標準の構文を使用するように指定子付き初期化子を変更する必要があります。
proc.cを書き直す
code:proc.c
+dalmore+e205729 diff kernel/proc.c ../xv6-aarch64/kernel/proc.c
591,595c591,595
---
再度make
code:error
clang -Wall -Werror -Os -g -fno-omit-frame-pointer -target aarch64-none-linux-gnu -MD -ffreestanding -fno-common -nostdlib -I. -fno-stack-protector -c -o kernel/proc.o kernel/proc.c
clang -Og -ggdb -mcpu=cortex-a72 -MD -I. -c -o kernel/swtch.o kernel/swtch.S
kernel/swtch.S:10:9: error: unknown use of instruction mnemonic without a size suffix
mov x9, x0
^
kernel/swtch.S:11:9: error: unknown use of instruction mnemonic without a size suffix
mov x10, sp
^
kernel/swtch.S:13:27: error: expected ']' in brackets expression
^
kernel/swtch.S:14:26: error: expected ']' in brackets expression
^
kernel/swtch.S:15:26: error: expected ']' in brackets expression
^
kernel/swtch.S:16:26: error: expected ']' in brackets expression
^
kernel/swtch.S:17:26: error: expected ']' in brackets expression
^
kernel/swtch.S:18:26: error: expected ']' in brackets expression
^
kernel/swtch.S:19:26: error: expected ']' in brackets expression
^
kernel/swtch.S:21:9: error: unknown use of instruction mnemonic without a size suffix
mov x9, x1
^
kernel/swtch.S:23:27: error: expected ']' in brackets expression
^
kernel/swtch.S:24:26: error: expected ']' in brackets expression
^
kernel/swtch.S:25:26: error: expected ']' in brackets expression
^
kernel/swtch.S:26:26: error: expected ']' in brackets expression
^
kernel/swtch.S:27:26: error: expected ']' in brackets expression
^
kernel/swtch.S:28:26: error: expected ']' in brackets expression
^
kernel/swtch.S:29:26: error: expected ']' in brackets expression
^
kernel/swtch.S:31:9: error: unknown use of instruction mnemonic without a size suffix
mov sp, x10
^
code:GPT
まず、アーキテクチャの指定で-mcpu=cortex-a72が使用されていましたが、Clangはこのオプションをサポートしていないため、警告が出ています。そのため、アーキテクチャ指定を削除します。
次に、kernel/swtch.Sファイル内でのアセンブリの文法が正しくないようです。
Makefileの、ASFLAGS = -Og -ggdb -mcpu=cortex-a72 -MD -I.部分を修正
-mcpu=cortex-a72を、 -target aarch64-none-linux-gnuに置き換える
swich.Sのアセンブリを編集 (x10 -> /*sp*/に置き換えても動く?)
code:swtch.S
+dalmore+e205729 diff kernel/swtch.S ../xv6-aarch64/kernel/swtch.S
6a7
12c13
---
22c23
---
31c32
<
---
33d33
<
make
code:error
^
=
^
=
^
=
^
=
^
=
^
=
^
=
^
=
^
=
^
=
^
=
^
=
^
=
^
=
^
=
^
=
^
=
^
=
^
=
20 errors generated.
code:GPT
これらのエラーメッセージは、kernel/syscall.c ファイルでのGNU拡張機能に関する問題を指しています。具体的には、SYS_fork、SYS_exitなどのデザインエーターでのGNU拡張機能の使用が原因です。 これを修正するには、デザインエーターの代わりに通常の初期化リストを使用します。
code:syscall.c
+dalmore+e205729 diff kernel/syscall.c ../xv6-aarch64/kernel/syscall.c
86,106c86,106
< uint64 sys_fork(void);
< uint64 sys_exit(void);
< uint64 sys_wait(void);
< uint64 sys_pipe(void);
< uint64 sys_read(void);
< uint64 sys_kill(void);
< uint64 sys_exec(void);
< uint64 sys_fstat(void);
< uint64 sys_chdir(void);
< uint64 sys_dup(void);
< uint64 sys_getpid(void);
< uint64 sys_sbrk(void);
< uint64 sys_sleep(void);
< uint64 sys_uptime(void);
< uint64 sys_open(void);
< uint64 sys_write(void);
< uint64 sys_mknod(void);
< uint64 sys_unlink(void);
< uint64 sys_link(void);
< uint64 sys_mkdir(void);
< uint64 sys_close(void);
---
extern uint64 sys_chdir(void);
extern uint64 sys_close(void);
extern uint64 sys_dup(void);
extern uint64 sys_exec(void);
extern uint64 sys_exit(void);
extern uint64 sys_fork(void);
extern uint64 sys_fstat(void);
extern uint64 sys_getpid(void);
extern uint64 sys_kill(void);
extern uint64 sys_link(void);
extern uint64 sys_mkdir(void);
extern uint64 sys_mknod(void);
extern uint64 sys_open(void);
extern uint64 sys_pipe(void);
extern uint64 sys_read(void);
extern uint64 sys_sbrk(void);
extern uint64 sys_sleep(void);
extern uint64 sys_unlink(void);
extern uint64 sys_wait(void);
extern uint64 sys_write(void);
extern uint64 sys_uptime(void);
108,130c108,129
< // Define the syscalls array with function pointers
< uint64 (*syscalls[])(void) = {
---
static uint64 (*syscalls[])(void) = {
コンパイルは通るが、objdumpがバイナリを認識できてない?
code:warning
aarch64-linux-gnu-objdump -S kernel/kernel > kernel/kernel.asm
aarch64-linux-gnu-objdump: Warning: Unrecognized form: 0x22
aarch64-linux-gnu-objdump: Warning: Unrecognized form: 0x22
aarch64-linux-gnu-objdump: Warning: Unrecognized form: 0x22
aarch64-linux-gnu-objdump: Warning: Unrecognized form: 0x22
aarch64-linux-gnu-objdump: Warning: Unrecognized form: 0x22
code:GPT
これらの警告は、objdumpが特定の形式の情報を認識できない場合に発生します。通常、これはobjdumpが対象のバイナリ形式を正確に解釈できない場合に発生します。