GCC : GNN C/C++ compiler
cross-compile
ex) x86 -> ARM object 처럼 서로 다른 환경에서도 GCC를 사용
g++ for c++
ADA, Java 등 다른 language들에서 사용됨
preprocessing - 매크로처리
compilation, assembly
linking
위 세가지를 적절히 호출하여 사용
cpp : c preprocessor(cpp)
compiler : gcc(x86,ARM 등 여러버전으로 만듦 -> .s)
assembler : as -> .o(기계어 - 소스코드만)
linker : ld(라이브러리 등 붙임) -> a.out
gcc archtecture
Front End : 우리가 가지고있는 소스파일을 Generic(byte code)이라는 형태로 저장
여러 언어들이 들어와도 한 가지 파일 형식을 가지게 됨
Middle End : 최적화 - optimize와 RTL(register - transfer language)이라는 형태로 변환
여러 언어들이 공통적으로 실행하는 부분
Back End : RTL을 가지고 assembly코드를 만듦(여러가지)
새 machine code -> 이에 맞는 Back End필요
gcc사용 예제
gcc -o hello hello.c -g -Wall
'-o'는 생성될 소스파일의 이름을 정함
'-g'는 디버깅 옵션을 추가
'-Wall'은 모든 warning 메시지를 출력
그 외
'-O' 혹은 '-O*' : 최적화(optimization)
compiler path option
'-Idir' : 해당 directory안에 있는 Header파일을 찾아 씀 -> 여러번 사용가능
'-Ldir' : 외부 library들을 directory에서 찾음 -> 여러번 사용가능
'-l' : 명령을 -lfoo라고 쓰면 libfoo.so(shared)또는 libfoo.a(static)를 링크에서 사용하능
compiler perprocessor options
'-E' : 매크로를 처리 -> 뒷 부분은 실행안함 - only processor
'-Ddef' : Define def -> 정의
'-Udef' : Undefine def -> 정의 해제
Compiler warning options
'-pg' : 전문가를 위한 프로파일 정보 제공
Compiler input/output options
'-c' : object파일 생성 후 중지, 링크하지 않음
'-ofile' : 생성되는 output이 file이고 default는 a.out임
Compiler control options
'-ansi' : ASNI준수 적용; '-std=c99'와 동일
'-pedantic' : 다른 gcc 확장자를 사용안함
'-std=c99' : IOS C99 준수 적용하여 compile
'-static' : 공유 라이브러리 사용x, 정적 라이브러리 사용
'-O[lev]' : 0,1,2,3 4가지 중 하나의 optimization단계 사용
'-Os' : size를 위한 Optimize
ex) -O2 -Wall -pedantic : 2단계 optimization, warnning모두 출력, gcc extension사용x
Libraries : 컴파일된 오브젝트들(기능들)을 모아놓은 것(파일)
1) static Library : 정적 라이브러리
Linker : 작성하지 않은 Library와 .o파일들을 포함시킴 -> a.out
예제(실습 게시판에 더 자세히 나와있음)
$ gcc-c func1.c
$ gcc-c func2.c
-> 두 c파일을 compile
$ ar rv libfuncs.a func1.o func.o
-> compile하여 작성된 object파일들을 libfuncs.a에 포함시킴
ar - verbose : 정보를 많이 찍으라는 의미
$ gcc myapp.c–L. -lfuncs -o myapp
-L : 현재 디렉토리에서 library들을 찾음
-l : lib*.a (*안에 사용자가 정한 이름)이라는 파일에서 object들을 myapp에 링크
※ $ nm -s libfuncs.a
nm은 object 파일이나 라이브러리들을 나열
2) shared library : 공유(동적) 라이브러리
정적라이브러리는 프로그램이 많아질 수록 공유되는 object파일들이 겹쳐 불필요한 용량이 많아진다는 단점이 있음 -> 공유 라이브러리는 pointer를 이용하여 한가지 라이브러리를 여러 프로그램이 공유하기 때문에 용량을 최소화 할 수 있음
예제
$ gcc -fPIC-c func1.c
$ gcc -fPIC-c func2.c
-> 포지션 indepandent code : 공유라이브러리를 사용할 때 써줘야함
$ gcc -fPIC-shared -Wl,-soname=libmyfuncs.so.1 *.o -o libmyfuncs.so.1.0 -lc
or
$ ld -shared -soname=libmyfuncs.so.1 *.o -o libmyfuncs.so.1.o –lc
-shared : defalt값(공유라이브러리 생성)
-WI : 뒤에 나오는 명령어 옵션들이 ld에 전달
-soname=libmyfuncs.so.1 : shared lib에 추가
*.o : 모든 object포함
-o : 이름
-lc : libc에서 ib생략
$ ln -s libmyfuncs.so.1.0 libmyfuncs.so
$ ln -s libmyfuncs.so.1.0 libmyfuncs.so.1
libmyfuncs.so : gcc link에 사용
libmyfuncs.so.1 : Runtime에 사용
$ gcc -o foo foo.c-L/mypath/lib -lmyfuncs
-L : 디렉토리 안에서 찾음
-lmyfuncs : libmyfuncs를 link함
$ export LD_LIBRARY_PATH=$HOME/foo/lib
Linux Loader가 정한 경로에서 라이브러리를 찾아봄 <- 꼭 해줘야 됨
주의점
글로벌 변수를 만들어서 사용하면 안됨 : 여러 파일들이 하나의 파일을 사용하기 때문에 변수가 겹쳐 값이 바뀌면 안됨
memory load위치가 사용할 때마다 바뀌기 때문에 스크립트를 작성할 때 특정 address를 예측하여 사용하거나(jump) 주소를 고치면 안됨
데이터가 특정한 주소에 존재한다고 생각하면 안됨
동적 라이브러리의 세 가지 형태
libmyfuncs.so.1.0 : 실제로 생성한(공유할) 라이브러리
libmyfuncs.so.1 : 실제 library runtime에 사용 <- pointing하는 버전의 library사용
libmyfuncs.so : 컴파일 time에 사용 - 버전 정보가 제일 높은 것 사용 -> 이것이 어떤것을 pointing하느냐에 따라서 링크할 library를 알 수 있음
※ libmyfuncs.so.1.0에서 뒤의 숫자는 왼쪽이 major버전의 숫자 오른쪽이 minor버전의 숫자를 의미
runtime library : /etc/ld.so.conf <- 시스템 라이브러리 /lib, /usrlib 명시
'임베디드SW공학' 카테고리의 다른 글
[6주차]Linux/Unix System Programming (0) | 2018.11.01 |
---|---|
[5주차]git (0) | 2018.10.16 |
[4주차]make (0) | 2018.10.07 |
[2주차]Shell Script Programming (0) | 2018.09.26 |
[1주차]Linux Terminology (0) | 2018.09.26 |