ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • gcc 옵션
    compiler 2017. 1. 31. 15:17

    참조: http://jangpd007.tistory.com/220


    gcc컴파일

    1) gcc 파일명(*.c) : Default로 out 파일이 생성된다. (ex a.out)

    2) gcc -c 파일명(*.c) : 오브젝트 파일을 생성한다.

    3) gcc -c 오브젝트_파일명(*.o) 파일명(*.c)

       gcc -o 실행파일명(*.out) 오브젝트_파일명(*.o)

    4) gcc -o 실행파일 파일명(*.c) : 실행 파일을 만든다. (3번을 한줄로...)


    compile 옵션


    프리프로세서 옵션

    1) -l 옵션 : 전처리 과정에서 헤더 파일을 탐색하는 기본 디렉토리를 추가할 때 사용하는 옵션

    2) -include 옵션 : 헤더 파일을 소스내에 추가할 때 사용한다.

    -nostdinc

      디폴트 include 디렉토리(usr/include)에서 헤더 파일을 탐색하지 않고, -l 옵션으로 추가한 디렉토리에서만 헤더 파일을 찾는다.




    cc1 옵션 : "C언어 옵션, 경고 옵션, 최적화 옵션, 디버깅 옵션"의 4가지 종류
      "경고 수위 조절 or 최적화 수위 조절"을 하고 싶을 때 사용한다. 

    1. 언어 옵션

    -fno-builtin

      빌트인 함수 가운데, 2 개의 언더 스코아로 시작되는 것 이외를 인식하지 않게 되어 _exit , abort , abs , alloca , cos , exit , fabs , labs , memcmp , memcpy , sin , sqrt , strcmp , strcpy , strlen 의 함수에 영향을 미칩니다.

    ` -ansi '옵션을 지정하면(자), alloca (와)과 _exit (은)는 빌트인 함수로서 다루어지지 않게 됩니다.


    2. 경고 옵션

    -Wall : 모든 오류와 경고를 출력

    -w : 모든 경고 메시지를 무시한다. 

    -Werror : 모든 경고를 오류로 취급한다. 


    3. 디버거 옵션

    -g

    gdb에게 제공하는 정보를 바이너리에 삽입한다. (-g 옵션을 사용하지 않고 gdb로 디버깅하면, 역어셈 → 어셈블리 코드로만 디버깅 가능)

    stabs 포맷을 사용하는 대부분의 시스템에 대해서는, ` -g '를 지정하면(자), GDB 만이 사용할 수 있는 여분의 디버그 정보가 사용 가능하게 됩니다.


    4. 최적화 옵션

    ⓐ 실행 파일의 크기를 줄여 메모리와 하드디스크의 사이즈를 절약 (큰 의미 X)

    ⓑ 실행 파일의 크기를 줄여 실행 속도를 향상시키는 것.

       1) -O0 옵션 : 최적화를 수행하지 않는다.

       2) -O1 옵션 : -O0보다는 조금 낫다. 

       3) -O2 옵션 : 가장 많이 사용하는 옵션. 일반 응용 프로그램이나 커널을 컴파일 할 때 사용

                     (거의 대부분의 최적화를 수행한다.)

       4) -O3 옵션 : 가장 높은 레벨의 최적화. 모든 함수를 인라인 함수와 같이 취급한다.               

                     (Call 인스트럭션은 사용 X. but, 되도록이면 사용하지 않는 것이 좋다. 

                       → 너무나 많은 소스의 변경이 가해지기 때문에 왜곡이 발생할 위험이 있다.)

       5) -O5 옵션 : 사이즈 최적화를 실행한다. (공간이 협소한 곳에서 사용 - 임베디드 시스템)


    5. 보안관련 옵션


    Disable ASLR:

    sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'

    Disable canaries:

    gcc overflow.c -o overflow -fno-stack-protector
     gcc 4.1버전 부터 있는 stack overflow를 방지하기 위한 컴파일러 옵션이다.



    ld(Linker) 옵션


    1) -L[라이브러리 디렉토리] 옵션 : 라이브러리를 찾을 디렉토리를 지정한다.

    2) -l 옵션 : 같이 링크할 라이브러리를 지정한다.


    3) -shared 옵션 : 공유 라이브러리와 정적 라이브러리가 같이 있을 경우, 공유 라이브러리를 우선하여 링크한다. (아무 옵션을 주지 않아도 공유 라이브러리를 우선으로 링크한다.)


    4) -static 옵션 : 정적 라이브러리와 공유 라이브러리가 같이 있다면, 정적 라이브러리를 우선하여 링크한다. (속도는 빠르지만 파일 사이즈가 커진다는 점 고려할 것!)


    5) -nostdlib 옵션 : 링크시에 표준 C 라이브러리를 사용하지 않는다. 

                        (OS, 부트로더와 같은 프로그램을 컴파일 할 때 사용)



    유용한 링크 옵션들

    -o output
    --output=output
    output를 ld로 만들어진 프로그램에 대한 이름으로 사용한다; 이 옵션이 지정되지 않으면 `a.out'가 디폴트로 사용된다.

    -r
    --relocateable
    재할당가능한 출력을 생성한다---즉, ld에 대한 입력이 될 수 있는 출력 파일을 생성한다. 이것은 종종 partial linking이라고 불린다. 부작용으로써 표준 유닉스 매직 넘버들을 지원하는 환경에서, 이 옵션은 또한 출력 파일의 매직 넘버를 OMAGIC로 설정한다. 이 옵션이 지정되지 않으면 절대 파일(absolute file)이 생성된다. C++ 프로그램들을 링크할 때 이 옵션은 생성자(constructor)들에 대한 참조를 해독(resolve) 하지 않을 것이다; 이렇게 하기 위해서는 `-Ur'를 사용하라. 이 옵션은 `-i'과 동일한 일을 한다.

    -M
    --print-map 링크 MAP를 표준 출력에 표시합니다. 링크 MAP는, 이하를 포함한 링크의 정보를 제공합니다:
    » 오브젝트 파일과 심볼이, 메모리의 어디에 MAP 될까.
    » 코먼 심볼을 어떻게 할당할 수 있었는지.
    » 링크에 포함되는 모든 아카이브(archive) 멤버, 및 그 아카이브(archive) 멤버를 수중에 넣는 계기가 된 심볼.

    -Map mapfile 링크 MAP를 파일 mapfile 에 출력합니다. 전출의 -M 옵션의 기술을 참조해 주세요.


    'compiler' 카테고리의 다른 글

    embedded system에서 Linker  (0) 2015.01.22
Designed by Tistory.