'GCC'에 해당되는 글 2건
- 2011.07.05 [Hack #22] GCC 확장기능 (빌트인, 애트리뷰트, 레이블)
- 2011.06.27 [gcc] 옵션 정리
[ 빌트인 함수 ] | |
♧ gcc에는 표준 라이브러리에 있을 듯한 몇몇 함수가 빌트인 함수로 마련되어 있음. 최적화 방법에 따라 소스에 쓰인 것과 다른 코드를 생성할 경우 있다.
▷ 예를 들면 printf(3) 함수의 경우 다음과 같이 문자열을 출력하는 코드에서는 실행할 때 pirntf(3)의 형식 문자열을 해석할 수 없으므로 다음과 같이 puts(3)를 호출하는 코드를 생성.
▷ 기본적으로는 같은 동작을 하고 더 빠르게 실행될 듯한 코드가 생성되어 문제는 없으나, LD_PRELOAD 등으로 오버라이드(override)해서 동작을 변경하고자 할 경우에는 주의 할 필요가 있다. 최적화를 통해 어떤 코드가 생성되는지 gcc/builtins.c에 프로그램 되어 있다.
|
[ 애트리뷰트 (__attribute__) ] | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
♧ 함수에 애트리뷰트를 덧붙여 선언하면 함수에 특별한 의미를 부여하거나 함수호출을 최적화 할 수 있다.
▶ 애트리뷰트 선언 2가지 방법
▶ 함수에 관한 애트리뷰트에는 다음과 같은 것들이 있다.
|
[ 레이블(label) 참조 ] | |||
♧ C에서는 그다지 사용되지 않지만 goto로 점프할 위치를 지정할 때 레이블을 사용.
▷ GCC에서 레이블은 &&로 참조하고 void *형 함수에 대입할 수 있다.
이와 같이 레이블을 변수에 대입할 수 있기 때문에 변수 값에 따라 점프할 위치를 변경하도록 하는 코드는 레이블로의 참조를 요소로 갖는 배열로도 구현할 수 있다. 레이블을 &&로 참조한 값은 void *에 대입할 수 있는 포인터형이므로 뺄셈으로 오프셋을 얻을 수 있다. 따라서 다음과 같은 코드를 작성할 수 있다.
|
[ 정리 ]
GCC는 C99표준에 준거하도록 노력하는 한편, 소스코드를 기술하기 쉽도록 하기 위한
확장 기능을 제공하고 있다. GCC의 확장기능임을 이해한 후 이 기능을 사용하면 편리한
경우가 있다. 예를 들면 리눅스 커널에는 GCC확장 기능을 이용한 코드를 볼 수 있다.
이러한 코드를 파악하려 할 경우에는 GCC 확장기능에 대한 이해가 필수적이다.
'컴퓨터 서적 정리 > Binary Hacks' 카테고리의 다른 글
[Hack #20] 공유 라이브러리에 PIC를 사용하는 이유 (1) | 2011.07.05 |
---|---|
[Hack #19] 링크할 때 심볼 충돌 방지하기 (0) | 2011.07.04 |
[Hack #18] C와 C++ 프로그램 링크 방법 (0) | 2011.07.04 |
[Hack #17] ar - 정적 라이브러리 다루기 (0) | 2011.07.04 |
[Hack #16] strip - 오브젝트 파일에서 심볼 삭제 (0) | 2011.07.04 |
[ GCC 전역 옵션]
옵션 |
설명 |
-E |
전처리 과정 화면에 출력 |
-S |
어셈블리 파일 생성 |
-c |
오브젝트 파일 생성 |
-v |
컴파일 과정 화면에 출력 |
--save-tmps |
컴파일 시 생성되는 중간 파일 저장 |
-da |
컴파일 과정에서 생성되는 중간 코드 생성(RTL 파일 등 생성) |
[ 전처리기(cpp0) 옵션]
옵션 |
설명 |
-l[패스] |
헤더 파일을 탐색할 디렉토리 지정 (ex_: -l/opt/include) |
-include[헤더 파일 패스] |
해당 헤더 파일을 모든 소스 내 추가 (ex_: -include /root/my.h) |
-D[매크로] |
외부에서 #define 지정 (ex_: -DDEBUF) |
-D[매크로]=[매크로 값] |
외부에서 해당 매크로를 정의하고 값을 지정 (ex_: -DDEBUG=1) |
-U[매크로] |
외부에서 #endef 지정 (ex_ -UDEBUG) |
-M 또는 -MM |
make 기술 파일을 위한 소스 파일의 종속 항목 출력 |
-nostdinc |
표준 C 헤더 파일을 include하지 않음 |
-C |
전처리 과정에서 주석을 제거하지 않음 |
-Wp,[옵션 리스트] |
옵션 리스트를 전처리기에 바로 전달 |
[ C컴파일러(cc1) 옵션]
- C 언어 옵션 - | |
옵션 |
설명 |
-ansi |
ANSI C 문법으로 문법 검사 |
-std=[c 표준] |
지정한 C 표준으로 문법 검사 (표준:c89, c99, gnu89, gnu99 등) |
-traditional |
K&R C문법으로 문법 검사 |
-fno-asm |
asm, inline, typeof 키워드를 사용하지 않음(gnu89 문법 기준) |
- 경고 옵션 - | |
-Wall -W |
모든 경고 메시지 출력 |
-w |
모든 경고 메시지 제거 |
-Werror |
모든 경고를 오류로 취급하여 컴파일 중단 |
-pedantic |
C89 표준에서 요구하는 모든 경고 메시지를 표시 |
-pedantic-errors |
C89 표준에서 요구하는 모든 오류 메시지를 표시 |
-Wtraditional |
ANSI C와 K&R C 간에 서로 다른 결과를 가져올 수 있는 부분이 있다면 경고 |
- 최적화 옵션 - | |
-O0 |
아무런 최적화를 수행치 않음 |
-O1 또는 -O |
최적화 레벨 1 수행 |
-O2 |
최적화 레벨 2 수행 |
-O3 |
최적화 레벨 3 수행 |
-O4 |
사이즈 최적화 수행 |
- 디버깅 옵션 - | |
-g |
바이너리 파일에 디버깅 정보 삽입 |
-pg |
프로파일을 위한 코드 삽입 |
[ 어셈블리(as) 옵션]
옵션 |
설명 |
-Wa,[옵션 리스트] |
어셈블러에게 옵션 리스트를 바로 전달 |
-Wa,-al |
어셈블된 코드와 인스트럭션을 보임 |
-Wa,-as |
정의된 심볼을 보임 |
[ 링크(ld) 옵션]
옵션 |
설명 |
-L[패스] |
라이브러리 탐색 디렉토리 지정 (ex_: -L/opt/lib) |
-l[라이브러리 이름] |
해당 라이브러리를 링크 (ex_: -lm) |
-shared |
공유 라이브러리를 우선하여 링크 |
-static |
정적 라이브러리를 우선하여 링크 |
-nostdlib |
표준 C 라이브러리를 사용하지 않음 |
-Wl,[옵션 리스트] |
옵션 리스트를 링크에 바로 전달 |
'Essential Tools' 카테고리의 다른 글
맨페이지 간단한 색상 추가해서 보기 (0) | 2011.10.25 |
---|---|
한장으로 보는 정규 표현식(Regular Expression) cheat sheet (0) | 2011.09.10 |
DJGPP 설정 (1) | 2011.05.08 |
[Port scanner] Nmap Security Scanner (0) | 2010.09.04 |
[토탈커맨더] Total Commander 단축키 (0) | 2010.05.09 |