본문 바로가기
프로그래밍/툴

gcc 툴체인 옵션 간단 정리

by 써드아이 2014. 4. 16.

- 정말 오래전에 정리해둔 파일을 발견, 웹에 옮겨 둔다.



gcc


-c : 컴파일만


-nostdinc / - nostdinc++ : 표준 헤더파일을 디렉토리를 검색하지 않는다.


-o : 출력파일 이름


-static : 정정 링크를 해서 실행파일을 만든다. 


-shared : 동적으로 링크


-soname : 동적 라이브러리를 만든다.


-O : 최적화 옵션


-S : 어셈블링을 하지 않는다 ( 어셈블 소스 코드 출력 )


-E : 프리프로세싱만 수행


-D : 매크로 디파인


-g : 디버깅 정보 포함


-ggdb : gdb전용 옵션 포함


-pg : profiling을 위한 정보 포함


-w : 모든 경고 메세지 억제


-Wall : gcc가 제공할 수 있고 유용한 모든 경고 메세지를 나타낸다


-werror : 모든 경고를 에러로 변환 컴파일을 중단한다


-pedantic : ANSI/ISO C 표준에서 요구되는 모든 경고를 나타낸다.


-pedantic-errors : ANSI/ISO C 표준에서 요구되는 모든 에러를 나타낸다.


-I : (대문자 i ) 헤더 파일을 검색하는 디렉토리 목록


-L : 라이브러리를 검색하는 디렉토리 목록


-l : (소문자 L) 함께 링크할 라이브러리


-nostdlib : 표준 라이브러리와 링크하지 않는다.


-V : 컴파일의 각 단계에서 사용하는 명령어를 보여준다.



.c : C언어 소스


.C .cc : C++ 소스


.i : 선행 처리된 C 소스


.ii : 선행처리된 C++ 소스


.S .s : 어셈블리어 소스


.o : 컴파일된 오브젝트


.a .so : 컴파일된 라이브러리




nm : nm [options] file

오브젝트나 바이너리에 인코딩된 모든 기호를 나열한다.

수행하는 함수 호출을 살펴보고, 라이브러리나 오•‹ㄱ트 파일에 필ㄹ요한 함수가 존재하는지 확인하는데 사용

-C : 기호 이름을 사용자 단계 이름으로 변환, 특히 C++ 함수 이름을 읽을 수 있도록 만드는데 유용


ar : ar [options] file

정적 라이브러리 파일을 생성한다

r : 기존에 존재하면 대체한다.

c : 경고를 생략하고 라이브러리를 생성한다.

s : 멤버에 링크하는 맵을 생성하거나 갱신 (???)

q : 대체를 확인하지 않고 마지막에 파일을 추가

d : 라이브러리에서 오브젝트를 삭제

t : 목록 출력


ranlib : ranlib [options] file

라이브러리 자체에 색인을 저장한다. (ar -s file과 동일 ??)


strip 

오브젝트 내의 심볼을 제거한다.


size



strings

파일내의 출력 가능한 문자들을 출력한다.


objcopy


objdump


ldd : ldd [options] file

file에 필요한 공유 라이브러리의 이름을 출력

-d 재배치를 수행하고 생략된 함수를 보고

-r 함수와 데이터 오브젝트를 위한 재배치를 수행하고 생략된 함수나 데이터 오브젝트를 보고


ldconfig : ldconfig [option] root_dir

/etc/ld.so.conf 에 지정된 공유 라이브러리를 위한 디렉토리 캐쉬 생성

ld.so ( 공유 라이브러리에 대한 링크 생성 관리를 위한 동적 링커/로더 )와 함께 동작한다.


-p : ld.so가 알고 있는 공유 라이브러리 디렉토리 (/etc/ld.so.cache)의 내용 출력

-v : 각 라이브러리의 버전 번호, 검색 디렉토리, 생성되거나 갱신되는 링크 나열 

/etc/ld.so.cache 갱신

-r : / (root)로 사용할 디렉토리를 지정


ld.so (동적 링커/로더)

$LD_LIBRARY_PATH - 공유 라이브러리 목록 (콜론으로 구분)

$LD_PRELOAD - 먼저 로드되는 추가적인 사용자 지정 공유 라이브러리의 목록 (공백으로 구분)

두개의 환경 변수를 사용한다.

/etc/ld.so.conf는 ld.so가 사용하는 설정 파일로 공유 라이브러리를 검색하는 디렉토리 목록

( /lib, /usr/lib 는 표준으로 포함하지 않는다. )

/etc/ld.so.preload 는 $LD_PRELOAD 환경 변수의 디스크 기번 버전이라네



* 공유 라이브러리 생성


1. 컴파일시에 -fPIC (Position Independent Code : 어던 주소에서 링크하고 로드할 수 있는 코드) 옵션을 사용


2. 오브젝트 파일에서 디버깅 기호를 저거하지 않고 gcc의 -fomit-frame-pointer 옵션을 사용하지 않는다.


3. gcc의 -shared  와 -soname 옵션을 사용한다.


4. ld에게 인수를 전달하기 위해서 gcc의 -W 옵션을 사용한다.


5. gcc의 -l (소문자 L)옵션을 사용하여 C 라이브럴에 대해 분명한 링크를 한다.


ex)

gcc -fPIC -g -c libMylib.c -o libMylib.o

gcc -g -shared -Wl,-soname,libMylib.so -o libMylib.so.1.0.0 libMylib.o -lc


이렇게 하면 libMylib.so.1.0.0이라는 공유 라이브러리가 생성된다.

링크시에 -lMylib 옵션으로 링크가 가능하게 하기위해 심볼릭 링크를 생성한다.


ln -s libMylib.so.1.0.0 libMylib.so




/lib 

/usr/lib


/usr/include

/usr/include/linux


/usr/i686-pc-linux-gnu/lib

/usr/i686-pc-linux-gnu/lib/ldscripts/

/usr/i686-pc-linux-gnu/gcc-bin/version/



'프로그래밍 > ' 카테고리의 다른 글

gdb를 이용한 리모트 디버깅  (0) 2015.04.15
Makefile 만들기  (0) 2014.06.24
Makefile  (0) 2013.11.27
Windows 7 에서 user32.dll, kernel32.dll, gdi32.dll 의 위치  (0) 2013.05.21
[wxWidgets] 설치 with mingw32-gcc  (0) 2011.12.17