캡스톤 디자인 일지 #1

Dreamer_01·2022년 4월 26일
0

LLVM이란?

프로그램을 짤때, 프로그래머는 사람이 읽을 수 있는 프로그래밍 언어로 작성한다. 근데 이 언어를 기계인 컴퓨터는 이해하지 못한다. 이를 변환하는데 컴파일러가 사용되고, 이 컴파일러 안에도 단계적으로 과정이 이루어져 있다.

[출처:https://www.praj.in/posts/2020/graalvms-secret-llvm-backend/ ]
위의 그림이 llvm의 간략한 과정이다.
llvm을 통해서 중간 코드, 이진 코드로 변환이 가능하다.
llvm안에 위치한 프론트 엔드는 c,c++ 같은 고급언어를 llvm ir언어로 만들어주고, 백엔드는 그 Ir코드를 컴퓨터별 기계언어로 만들어준다.

LLVM 설치

우리 조는 이번에 악성코드를 분석하는 자동화 툴을 만들기 위해서 ir코드를 다루기로 하였고, ir코드를 생성하기 위해서는 llvm이 필요하다.

현재 내가 사용하는 OS는 ubuntu 20.04 버전이다.

구글링을 해서 내 환경에 맞는 레퍼런스를 찾아보았다.

https://installati.one/ubuntu/20.04/llvm/
나는 이중에서 apt-get을 사용해서 패키지를 설치하였다.


[출처:https://www.praj.in/posts/2020/graalvms-secret-llvm-backend/ ]

llvm이 진행되는 대략적인 그림이다. 우리가 흔히 사용하는 소스코드는 c,cpp이기에 llvm을 사용해서 llvm bitcode를 만드는 것이 목표이다.
그러기 위해서는 그림에서도 보이듯 clang을 설치해야 한다.

Clang이란?

clang은 위의 그림에서도 볼 수 있듯, C, C++, Objective-C, Objective-C++를 IR로 만드는 컴파일러이다.

llvm 사용


위의 사진은 내 ubuntu에 작성한 예제 파일이다. 먼저, 이것을 clang을 통해서 컴파일 하는 과정을 보여주겠다.

clang을 이용해 컴파일


위의 사진처럼 코드를 작성해야 하는데

clang <원본 파일> [-o 변환되는 파일 이름] 

이라고 생각하고 입력한다.
그러고 나서 ./hello를 입력해주면 hello.c 파일안에 프린트 되도록 되어있는 hello world가 출력되는 것을 볼 수 있다.

이건 clang을 이용해서 컴파일을 진행한거지 llvm의 ir단계에 도달한 것은 아니다.

ir코드로 변환


위의 코드들을 입력해야지 llvm의 ir단계에 도달했음을 알 수 있다.

ll은 human-readable assembly로 소스 코드를 바꿔준다.

bc는 bitcode로 바꿔주는데 .ll 파일과 같은 내용으로 나온다 (=why?)

ll코드를 머신의 어셈블리 언어로 변환하기

llc <원본 파일> [-o 변환되는 어셈플리 파일 이름.s]

참고자료

출처: https://zeddios.tistory.com/1175 [ZeddiOS]
출처: https://roadtosuccess.tistory.com/39

0개의 댓글