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
clang: error: argument unused during compilation: '-mcpu=cortex-a72+nofp' -Werror,-Wunused-command-line-argument
make: *** <builtin>: kernel/printf.o Error 1
オプションの-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
kernel/proc.c:591:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
UNUSED "unused",
^
=
kernel/proc.c:592:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SLEEPING "sleep ",
^
=
kernel/proc.c:593:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
RUNNABLE "runble",
^
=
kernel/proc.c:594:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
RUNNING "run ",
^
=
kernel/proc.c:595:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
ZOMBIE "zombie"
^
=
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
< 0 = "unused",
< 1 = "sleep ",
< 2 = "runble",
< 3 = "run ",
< 4 = "zombie"
---
UNUSED = "unused",
SLEEPING = "sleep ",
RUNNABLE = "runble",
RUNNING = "run ",
ZOMBIE = "zombie"
再度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
clang: warning: argument unused during compilation: '-mcpu=cortex-a72' -Wunused-command-line-argument
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
stp x10 , x18, x9, #16 * 0
^
kernel/swtch.S:14:26: error: expected ']' in brackets expression
stp x19, x20, x9, #16 * 1
^
kernel/swtch.S:15:26: error: expected ']' in brackets expression
stp x21, x22, x9, #16 * 2
^
kernel/swtch.S:16:26: error: expected ']' in brackets expression
stp x23, x24, x9, #16 * 3
^
kernel/swtch.S:17:26: error: expected ']' in brackets expression
stp x25, x26, x9, #16 * 4
^
kernel/swtch.S:18:26: error: expected ']' in brackets expression
stp x27, x28, x9, #16 * 5
^
kernel/swtch.S:19:26: error: expected ']' in brackets expression
stp x29, x30, x9, #16 * 6
^
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
ldp x10 , x18, x9, #16 * 0
^
kernel/swtch.S:24:26: error: expected ']' in brackets expression
ldp x19, x20, x9, #16 * 1
^
kernel/swtch.S:25:26: error: expected ']' in brackets expression
ldp x21, x22, x9, #16 * 2
^
kernel/swtch.S:26:26: error: expected ']' in brackets expression
ldp x23, x24, x9, #16 * 3
^
kernel/swtch.S:27:26: error: expected ']' in brackets expression
ldp x25, x26, x9, #16 * 4
^
kernel/swtch.S:28:26: error: expected ']' in brackets expression
ldp x27, x28, x9, #16 * 5
^
kernel/swtch.S:29:26: error: expected ']' in brackets expression
ldp x29, x30, x9, #16 * 6
^
kernel/swtch.S:31:9: error: unknown use of instruction mnemonic without a size suffix
mov sp, x10
^
make: *** <builtin>: kernel/swtch.o Error 1
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
< stp x10, x18, x9, #16 * 0
---
stp x10/*sp*/, x18, x9, #16 * 0
22c23
< ldp x10, x18, x9, #16 * 0
---
ldp x10/*sp*/, x18, x9, #16 * 0
31c32
<
---
33d33
<
make
code:error
kernel/syscall.c:109:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_fork sys_fork,
^
=
kernel/syscall.c:110:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_exit sys_exit,
^
=
kernel/syscall.c:111:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_wait sys_wait,
^
=
kernel/syscall.c:112:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_pipe sys_pipe,
^
=
kernel/syscall.c:113:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_read sys_read,
^
=
kernel/syscall.c:114:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_kill sys_kill,
^
=
kernel/syscall.c:115:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_exec sys_exec,
^
=
kernel/syscall.c:116:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_fstat sys_fstat,
^
=
kernel/syscall.c:117:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_chdir sys_chdir,
^
=
kernel/syscall.c:118:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_dup sys_dup,
^
=
kernel/syscall.c:119:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_getpid sys_getpid,
^
=
kernel/syscall.c:120:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_sbrk sys_sbrk,
^
=
kernel/syscall.c:121:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_sleep sys_sleep,
^
=
kernel/syscall.c:122:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_uptime sys_uptime,
^
=
kernel/syscall.c:123:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_open sys_open,
^
=
kernel/syscall.c:124:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_write sys_write,
^
=
kernel/syscall.c:125:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_mknod sys_mknod,
^
=
kernel/syscall.c:126:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_unlink sys_unlink,
^
=
kernel/syscall.c:127:15: error: use of GNU 'missing =' extension in designator -Werror,-Wgnu-designator
SYS_link sys_link,
^
=
fatal error: too many errors emitted, stopping now -ferror-limit=
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) = {
< SYS_fork = sys_fork,
< SYS_exit = sys_exit,
< SYS_wait = sys_wait,
< SYS_pipe = sys_pipe,
< SYS_read = sys_read,
< SYS_kill = sys_kill,
< SYS_exec = sys_exec,
< SYS_fstat = sys_fstat,
< SYS_chdir = sys_chdir,
< SYS_dup = sys_dup,
< SYS_getpid = sys_getpid,
< SYS_sbrk = sys_sbrk,
< SYS_sleep = sys_sleep,
< SYS_uptime = sys_uptime,
< SYS_open = sys_open,
< SYS_write = sys_write,
< SYS_mknod = sys_mknod,
< SYS_unlink = sys_unlink,
< SYS_link = sys_link,
< SYS_mkdir = sys_mkdir,
< SYS_close = sys_close,
---
static uint64 (*syscalls[])(void) = {
SYS_fork sys_fork,
SYS_exit sys_exit,
SYS_wait sys_wait,
SYS_pipe sys_pipe,
SYS_read sys_read,
SYS_kill sys_kill,
SYS_exec sys_exec,
SYS_fstat sys_fstat,
SYS_chdir sys_chdir,
SYS_dup sys_dup,
SYS_getpid sys_getpid,
SYS_sbrk sys_sbrk,
SYS_sleep sys_sleep,
SYS_uptime sys_uptime,
SYS_open sys_open,
SYS_write sys_write,
SYS_mknod sys_mknod,
SYS_unlink sys_unlink,
SYS_link sys_link,
SYS_mkdir sys_mkdir,
SYS_close sys_close,
コンパイルは通るが、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が対象のバイナリ形式を正確に解釈できない場合に発生します。