GNU Makefile, gcc 컴파일 기본

markyang92·2021년 8월 27일
0
post-thumbnail

Makefile

간단한 c 컴파일

  • src, include file 관계
  • 위치

$ gcc [options] [src] -o [output_file]

gcc -Iinclude src/userprog.c
  • 쌩뚱맞게 바로 src/userprog.c를 바이너리로 만들면 collect2 링커가 print 심볼을 찾지 못해 에러
    • -I 옵션은 include할 파일의 위치를 지정한다.
    • -I<header file path>

  1. object파일 부터 만들어보자.
$ gcc -c -Iinclude src/userprog.c -o obj/userprog.o
  • userprog.o object 파일이 생성된다.

  1. readelf -s userprog.o 로 symbol을 보자

    2-1. userprog.o 내에 print 심볼을 찾는다.
    2-2. 링커가 최종적으로 바이너리를 만들 때, print 심볼을 찾을 것이다.
    2-3. print심볼은 src/print.cprint함수이다. 이에 대한 object를 만들어야한다.

  1. 헤더 파일선언되어 있는 함수들 부터 먼저 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)에서 가져와 사용하게 할 것인가?


1. obj 파일들을 프로그램에 합치기

  • 대규모 프로그램에서는 라이브러리로 만들어 관리하겠지만, 보통 간단한 프로그램은 하나의 바이너리로 합친다.
  1. userprog.c가 바로 print.o, arith.o를 가져와 합쳐버리기
$ gcc -Iinclude src/userprog.c obj/print.o obj/arith.o -o bin/userprog
  • 결과

profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글