$ gcc [options] [src] -o [output_file]
gcc -Iinclude src/userprog.c
src/userprog.c
를 바이너리로 만들면 collect2
링커가 print
심볼을 찾지 못해 에러-I
옵션은 include할 파일의 위치를 지정한다.-I<header file path>
$ gcc -c -Iinclude src/userprog.c -o obj/userprog.o
readelf -s userprog.o
로 symbol을 보자userprog.o
내에 print
심볼을 찾는다.print
심볼을 찾을 것이다.print
심볼은 src/print.c
에 print
함수이다. 이에 대한 object를 만들어야한다.$ gcc -c -Iinclude src/print.c -o obj/print.o
$ gcc -c -Iinclude src/arith.c -o obj/arith.o
선택의 기로...
1. print.o, arith.o
가 심볼로 사용되긴 하는데 다른 프로그램(userprog.c
)에 하나의 바이너리로 '합쳐서' 만들 것인가?
2. print.o arith.o
를 심볼로 사용하긴 하는데, 라이브러리 로 만들어 다른 프로그램(userprog.c
)에서 가져와 사용하게 할 것인가?
userprog.c
가 바로 print.o
, arith.o
를 가져와 합쳐버리기$ gcc -Iinclude src/userprog.c obj/print.o obj/arith.o -o bin/userprog