본문 바로가기

전체 글43

[C언어]링크(Link) 단계 (컴파일과 링크가 따로 되어있는 이유) 링크란? 대략적인 과정은 링커가 모든 오브젝트 코드들을 입력받아서 최종실행파일을 출력하는 과정이다. 입력 : 모든 오브젝트 코드들 링커는 오브젝트 코드에 있는 구멍들을 메꿔줘야 하므로 모든 오브젝트 코드들을 입력받는다 처리 오브젝트 파일을 다 모아서 하나의 이진파일로 만들면서 함수들의 위치도 기억하고 있는다 그러다 함수 호출 코드를 만나면 실행위치(구멍)에 함수 주소로 점프하는 코드를 넣어준다 출력 : 최종실행파일(.exe, .out) 파일에서 선언만 되어있고 구현(정의)이 되지 않아서 여전히 구멍으로 남으면 어떡하나요? 이럴 때는 링커가 링커오류를 출력한다. 이는 경고(Warning)가 아니라 애러(Error)이기 때문에 실행파일이 만들어지지 않는다. 왜 컴파일단계와 링크 단계가 분리되어 있는 이유 ... 2023. 2. 16.
[C언어][Hex]헥스편집기 HxD editor 다운로드 방법 이전 글 어셈블 단계에서 오브젝트 코드를 보려면 hex편집기를 이용해서 봐야한다고 했었다. 내가 쓰는 Hxd editor 설치방법을 소개하도록 하겠다. Hxd editor 설치방법 https://mh-nexus.de/en/hxd/ HxD - Freeware Hex Editor and Disk Editor | mh-nexus HxD - Freeware Hex Editor and Disk Editor HxD is a carefully designed and fast hex editor which, additionally to raw disk editing and modifying of main memory (RAM), handles files of any size. The easy to use interfa.. 2023. 2. 16.
[C언어]어셈블(Assemble) 단계 어셈블이란? 전처리와 컴파일을 거쳐서 나온 어셈블리어 코드를 이용해서 어셈블단계에 대해서 설명해 보도록 하겠다. 어셈블 단계에서는 어셈블러가 담당을 하고 그 결과로 오브젝트 코드가 나오게 된다. 기계어와 1:1 대응이 되는 어셈블리어 코드를 어셈블러가 오브젝트 코드로 변환을 시키는데 이 오브젝트 코드가 이제야 기계가 읽을 수 있는 언어인 이진코드, 기계어로 변환이 된다. 오브젝트 코드 기계가 곧바로 이해가 가능한 기계코드로 이진코드(binary code)로 되어있다. 하지만 어셈블단계에서 입력을 받을 때 구멍이 뚫린 어셈블리어 코드를 받았기 때문에 오브젝트 코드도 아직까지는 구멍이 메꿔지지 않았다. 그 구멍을 메꾸는 것은 링커가 해준다. 오브젝트 코드 보는 방법(.o) (Clang 기준) -c 플래그를 .. 2023. 2. 16.
[C언어]컴파일(Compilation) 단계 전처리 단계에 이어서 컴파일 단계에 대해서 알아보자. 컴파일은 컴파일러가 담당을 하고 확장된 소스코드 하나를 입력받아서 어셈블리어로 출력을 하게 된다. 어셈블리어란? 어셈블리어는 기계어와 1:1로 대응하는 언어로 하드웨어에 가깝다. 출력되는 파일이 아직까지도 텍스트 파일이기 때문에 사람들이 읽을 수 있다. 기계는 아직까지도 읽지 못한다. 어셈블리어는 바이러니(이진) 코드가 아니기 때문이다. 그리고 어셈블리코드는 정의를 모르는 심볼을 사용할 수 있다. 심볼의 예를 들면 함수나 변수의 이름을 뜻한다. 그래서 이전에 배운 헤더파일을 통한 선언 만으로 컴파일이 가능하게 된다!! 컴파일러가 심볼의 선언만 보고 판단하는 과정을 설명하겠다. 함수나 변수가 선언이 되어 있네? 근데 정의를 찾지 못하겠다. 일단 프로그래.. 2023. 2. 16.
[C언어]전처리(Preprocessing) 단계 전처리 단계에 대해서 설명해 보겠다. 전처리 과정의 뜻은 대략적으로 소스코드를 확장된 소스 코드(=트랜스레이션 유닛)로 바꿔주는 과정을 말한다. 이전 글에서도 간단하게 #include 가 어떤 식으로 작동하는지를 보여줬는데 모든 #으로 시작하는 매크로는 아래와 같은 방식으로 작동되니 알고 있으면 될 것 같다. 전처리 과정 입력 : C파일 하나 주석제거 : C파일에 있는 모든 주석을 제거해 주는 작업을 한다. 매크로를 복붙(확장)함 #으로 시작하는 것들을 매크로라고 하는데, 이 매크로들은 전부다 복붙을 한다고 보면 된다. 확장 : (#include "헤더파일")을 지우고 그 자리에 헤더파일 속에 있는 내용을 복사해서 가져다 붙인다. 인클루드는 꼭 헤더파일만 하는 것은 아니다 .c 파일도 가능하지만 컴파일을.. 2023. 2. 16.
[C언어]C언어에서 헤더파일이 필요한 이유?(헤더파일 필요성) 헤더파일 이란 C언어에서는 두 종류의 소스코드 파일이 있다. (.h 와 .c) 이 두 파일을 비교해 보면 다음과 같다. C파일 (.c) 헤더 파일 (.h) 실제 프로그램을 돌게하는 로직 코드를 저장하는 파일 내용(함수 정의(=함수 구현), 매크로, 변수, 전역변수등) 여러 소스코드 파일에 공통적으로 필요한 것들을 저장하는 파일 내용(함수 선언, 매크로, extern 변수 선언등) #include 로 헤더파일을 인클루드 함 여기서 C파일과 헤더 파일은 그냥 합쳐서 하나의 파일로 만들면 되지 않을까?라는 생각이 들 수 있다. 헤더파일의 필요성 없어도 되지만 있는 것이 더 편해서 프로그래머들은 한 파일 안에 모든 코드들을 넣기보다 체계적으로 나누어서 넣는 것을 좋아한다. 그렇기에 연관된 기능끼리 모아서 .c .. 2023. 2. 16.