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

+ Recent posts