Linux

Linux) 리눅스 개발 환경 이해하기(1)

하이오야이 2024. 4. 22. 12:32

용어

  • 빌드(build): 소스 코드를 실행할 수 있는 바이너리 코드로 변환하는 과정
  • 호스트(host): 빌드를 진행하는 환경
  • 타겟(target): 빌드를 진행한 바이너리 코드가 실행될 환경
    타겟에 따라 요구되는 바이너리 코드가 다름

  • 툴체인(toolchain): 원하는 타겟에 맞춰서 빌드를 해주는 개발도구 모음
    • 컴파일러(compiler): 소스코드를 기계어(object file = 목적 파일)로 변환하는 도구
    • 링커(linker): 여러 기계어와 라이브러리를 모아 하나의 바이너리로 결함하는 도구
    • 빌드 시스템(build system): 빌드 시스템은 소프트웨어를 빌드(컴파일, 링크, 테스트, 배포)하고 관리하는 도구입니다. 
     
  • SDK(Software Develope Kit)소프트웨어 개발 도구 모음으로서, API, 개발을 위한 도구, 라이브러리, 문서등을
    포함한 패키지입니다.

소스코드 -> 실행파일 얻기까지 과정
소스코드 -> 목적파일 얻기까지 과정

 

헤더 VS 라이브러리

헤더(Header)

헤더는 프로그램에서 사용될 함수, 구조체, 매크로 등을 선언하기 위한 파일입니다.

여기서! 라이브러리와 차이점은 헤더 파일 같은 경우 사용될 요소들의 프로토타입만을 정의한 파일입니다. 다시 말해, 구현을 하지 않고 선언만을 진행하는 파일입니다.

// example.h

#ifndef EXAMPLE_H
#define EXAMPLE_H

// 매크로 정의
#define TRUE 1
#define FALSE 1

// 함수의 프로토타입 선언
void exampleFunction(int arg1, int arg2);

// 구조체 정의
struct ExampleStruct {
    int member1;
    float member2;
};

#endif

 

라이브러리(Library)

일반적으로 라이브러리 파일은 함수, 구조체, 매크로 등을 선언과 동시에 구현한 파일입니다.

라이브러리 자체로는 실행할 수 없고, 라이브러리를 호출하는 프로그램에 의해 실행할 수 있습니다.

 

컴파일 & 링킹

컴파일과 링킹 과정을 명령어로 보여주기 위해 예시를 들어보겠습니다.

 

현재 지점1(x1,y1), 지점2(x2,y2)의 거리를 구하는 코드를 작성하였습니다.

distance.h
distance.c
main.c

 

//모든 확장자명이 .c인 파일을 컴파일 진행(소스 코드 -> 목적 파일)
gcc -c *.c

distance.c과 main.c파일을 distance.o과 main.o파일을 생성합니다.

 

ld *.o /usr/lib/x86_64-linux-gnu/crt1.o -lm -lc -dynamic-linker=/lib64/ld-linux-x86-64.so.2

ld 명령어로 목적 파일과 라이브러리를 하나로 묶어 실행 파일로 변환합니다.

 

/usr/lib/x86_64-linux-gnu/crt1.o

해당 경로는 crt1.o 목적 파일을 가리키는 경로입니다. crt1.o는 C 런타임 목적파일으로써 main()함수를 수행하기 이전 초기화를 진행하는 파일입니다.
CRT(C Runtime): c언어에서 main()함수를 실행하기 이전까지 수행해야하는 초기화 실행

 

-lm, -lc

-lm과 -lc는 라이브러리를 링킹하기 위해 참조하는 옵션입니다.

-lm = libm: math.h

-lc = libc: stdlib.h

 

-dynamic-linker=/lib64/ld-linux-x86-64.so.2

해당 옵션은 동적 링커를 설정해주는 옵셥입니다.

 

동적 링커를 이해하기 앞서 정적 라이브러리와 동적 라이브러리를 이해해야합니다.

 

정적 라이브러리: 컴파일 이전에 프로그램에 직접 포함하는 라이브러리를 의미합니다.

동적 라이브러리: 런타임에서 라이브러리를 필요한 순간에 메모리에 로드하여 사용하는 라이브러리 입니다.

 

동적 링커는 런타임에서 동적 라이브러리를 로드하고 연결하는 역활을 수행하는 도구입니다.