정보 = 비트 + 컨텍스트로 구성된다. .c 프로그램은 연속된 바이트들로 파일에 저장된다.
모든 시스템 내부의 정보들은 비트들로 표현이되고, 다른 객체들을 구분하는 유일한 방법은 이들을 바라보는 컨텍스트에 의해서이다.
소스파일 (text file)
- 오로지 아스키 문자들로만 이루어진 파일 ↔ 바이너리 파일
- C 프로그래밍 언어의 기원에 대해 잠시 알아보자면, C는 유닉스 운영체제를 만들기 위해 설계되었다.
컴파일 시스템
linux> gcc -o hello hello.c
: gcc 컴파일러 드라이버는 소스파일을 읽어서 실행파일로 번역한다. 번역은(전처리, 컴파일, 어셈블리, 링크) 4단계로 구성되고 , 이 네 단계를 실행하는 프로그램들을 합쳐 컴파일 시스템이라고 부른다.
1. 전처리 단계
: 전처리기(cpp)는 c 프로그램을 # 문자로 시작하는 디렉티브에 따라 수정한다.
#define MAX 4
#include <studio.h>
#ifdef_DEBUG
#else
#endif
→ 복붙과정
결과적으로 .i 로 끝나는 새로운 c 프로그램이 생성된다.
gcc -E test.c -o test.i
vi test.i
2. 컴파일 단계
: 컴파일러 (cc1)는 텍스트파일 .i를 텍스트파일인 .s로 번역하며, 이 파일에는 어셈블리어 프로그램이 저장된다.
3. 어셈블리 단계
: 어셈블러(as)가 .s 를 기계어 인스트럭션으로 번역하고 재배치가능 목적프로그램의 형태로 묶어 .o라는 목적파일에 결과를 저장한다.
다른 목적파일이나 라이브러리에 저장된 함수/변수들의 주소를 포함한다. Q
gcc -c test.c
objdump -d test.o
Symbol Table : symbol의 정보집합
Symbol : 전역변수/함수 식별자
- address / bind(g/l) / type(F/O) / section / size / name
static 은 l 파일에서만 접근 가능함을 나타낸다.
static 키워드
static은 변수 또는 함수의 **범위(scope)**와 수명을 제어합니다.
- 변수의 가시성:
- 전역 변수로 선언된 경우, 그 변수는 해당 파일 내에서만 유효합니다. 즉, 다른 파일에서는 접근할 수 없습니다. 이를 파일 범위라고 부릅니다.
- 지역 변수로 선언된 경우, 그 변수는 해당 함수 내에서만 유효하지만, 프로그램이 종료될 때까지 메모리에 남아 있습니다. 이를 **정적 수명(static lifetime)**이라고 합니다.
- 변수의 수명:
- static 변수는 프로그램이 실행되는 동안 메모리에 유지되며, 함수 호출이 끝나도 값이 유지됩니다. 이는 함수가 여러 번 호출되더라도 변수가 초기화되지 않고 마지막 값이 유지된다는 뜻입니다.
extern 은 g 다른 모듈에서 정의되었음을 나타낸다.
extern 키워드
extern은 변수가 다른 파일이나 코드 영역에 정의되어 있음을 알리기 위한 키워드입니다. 실제로 변수를 정의하지 않고, 다른 파일에서 정의된 변수를 사용할 때 사용됩니다.
- 변수의 가시성:
- extern으로 선언된 변수는 파일 외부에서 정의된 전역 변수로 접근할 수 있습니다. 즉, 여러 파일 간에 변수를 공유하고 싶을 때 사용합니다.
- 변수의 수명:
- extern으로 선언된 변수는 프로그램이 종료될 때까지 메모리에 존재하는 정적 수명을 가집니다. 이 변수는 선언된 곳이 아닌, 정의된 파일에서 메모리를 차지합니다.
<symbol table 알아보기 >
gcc -c test.c
objdump -t test.o
4. 링킹 단계
표준 c 라이브러리에 들어있는 함수는 이미 컴파일된 별도의 목적파일에 들어있다. 이 파일이 본래 목적파일과 결함되어야 한다.
: 링커 프로그램(ld)이 통합작업을 수행한다.
→ 실행가능 목적파일 = 실행파일로 메모리에 적재. 시스템에 의해 실행된다.
1) symbol resolution : 다중의 목적파일 사이에서 외부참조를 해결한다.
2) relocation : 단일의 실행파일로 통합한다.
- 여러개의 input file이 있을 수 있음. 목적파일(.o)나 library(.so)... 일련의 과정을 거치면 실행가능 목적파일로 통합된다.
'Major S-T-U-D-Y > System Programming' 카테고리의 다른 글
9. Derived type - array, pointer, and structure (1) (1) | 2024.11.12 |
---|---|
8. Procedure Call and Stack (0) | 2024.11.12 |
GNU make (1) | 2024.10.18 |
4. Machine level representation basics (1) (0) | 2024.10.15 |
GNU vi 주요 명령어 정리 (0) | 2024.10.03 |