こちらを見させていただきながらC言語の理解を深めているところです。「ステップ2:加減算のできるコンパイラの作成」のように少し複雑になる前に「ステップ1:整数1個をコンパイルする言語の作成」でmakeコマンドを試したいと思い、実行したら以下のエラーが出ました。
cc -std=c11 -g -static 9cc.c -o 9cc ld: library not found for -lcrt0.o clang: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [9cc] Error 1
crt0.oというのはこちらの記事によるとmain()より前に走る処理が書いてあるそうでこれが(動的に?静的に?)リンクできないということだと思うのですがどこにどう書き足したら良いでしょうか?ld: library not found for -lcrt0.o
で調べたのですがわかりませんでした。
ファイルは以下の通りです。よろしくお願いいたします。
//test.sh #!/bin/bash assert() { expected="$1" input="$2" ./9cc "$input" > tmp.s cc -o tmp tmp.s ./tmp actual="$?" if [ "$actual" = "$expected" ]; then echo "$input => $actual" else echo "$input => $expected expected, but got $actual" exit 1 fi } assert 0 0 assert 42 42 echo OK
//Makefile CFLAGS=-std=c11 -g -static 9cc: 9cc.c test: 9cc ./test.sh clean: rm -f 9cc *.o *~ tmp* .PHONY: test clean
//9cc.c #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "引数の個数が正しくありません\n"); return 1; } printf(".intel_syntax noprefix\n"); printf(".globl main\n"); printf("main:\n"); printf(" mov rax, %d\n", atoi(argv[1])); printf(" ret\n"); return 0; }
//tmp.s .intel_syntax noprefix .globl main main: mov rax, 42 ret