프로그램을 짤때, 프로그래머는 사람이 읽을 수 있는 프로그래밍 언어로 작성한다. 근데 이 언어를 기계인 컴퓨터는 이해하지 못한다. 이를 변환하는데 컴파일러가 사용되고, 이 컴파일러 안에도 단계적으로 과정이 이루어져 있다.
[출처:https://www.praj.in/posts/2020/graalvms-secret-llvm-backend/ ]
위의 그림이 llvm의 간략한 과정이다.
llvm을 통해서 중간 코드, 이진 코드로 변환이 가능하다.
llvm안에 위치한 프론트 엔드는 c,c++ 같은 고급언어를 llvm ir언어로 만들어주고, 백엔드는 그 Ir코드를 컴퓨터별 기계언어로 만들어준다.
우리 조는 이번에 악성코드를 분석하는 자동화 툴을 만들기 위해서 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은 위의 그림에서도 볼 수 있듯, C, C++, Objective-C, Objective-C++를 IR로 만드는 컴파일러이다.
위의 사진은 내 ubuntu에 작성한 예제 파일이다. 먼저, 이것을 clang을 통해서 컴파일 하는 과정을 보여주겠다.
위의 사진처럼 코드를 작성해야 하는데
clang <원본 파일> [-o 변환되는 파일 이름]
이라고 생각하고 입력한다.
그러고 나서 ./hello를 입력해주면 hello.c 파일안에 프린트 되도록 되어있는 hello world가 출력되는 것을 볼 수 있다.
이건 clang을 이용해서 컴파일을 진행한거지 llvm의 ir단계에 도달한 것은 아니다.
위의 코드들을 입력해야지 llvm의 ir단계에 도달했음을 알 수 있다.
ll은 human-readable assembly로 소스 코드를 바꿔준다.
bc는 bitcode로 바꿔주는데 .ll 파일과 같은 내용으로 나온다 (=why?)
llc <원본 파일> [-o 변환되는 어셈플리 파일 이름.s]
출처: https://zeddios.tistory.com/1175 [ZeddiOS]
출처: https://roadtosuccess.tistory.com/39