LLVM - 1

System 2016. 8. 12. 13:44

0. Intro


주변에서 LLVM에 대한 소문이 무성히 들려온다.


이런저런 사정으로 LLVM을 손대봐야 하는 상황까지 와버려서, 설치부터 실행, 응용까지 차근차근 겪은일들, 해결한 방법 등을 적어 나가려 한다.


우선 LLVM이 무엇인지 알아야 하는데.. 검색으로도 LLVM이 무엇인지 알수 있다.


Low Level Virtual Machine 이라고 하는데.. 뭐 구구절절한건 집어치우고 일단 본론만 들어가자.



1. 왜 LLVM인가?


일단 LLVM이 무슨 프로그램인가 하고 굳이 분류를 나누자면 컴파일러 인 것 같다. 이런저런 글들을 다 살펴보아도 컴파일러에 관한 이야기 밖에 없다.


그럼 평소에 우리가 쓰는 gcc와 같은 컴파일러와 무엇의 차이점이 있는것인가?


이는 어쩔수 없이 흔한 그림으로 대체하여 설명하려 한다.


다소 거부감이 있더라도 최대한 이해한대로 쉽게 풀어 쓸 테니 양해하고 읽으면 좋겠다.


 

출처 : http://kyejusung.com/


글쓴이는 컴파일러에 대한 공부를 한 적이 없다. 그래서 알고있는것은 gcc source.c -o output 정도.


내가 저렇게 명령어를 입력하고 gcc를 실행시키면, 내부적으로는 위의 그림처럼 3단계를 거쳐서 ouput이 나온다고 한다.


모두가 알다시피 우리가 사용하는 프로그래밍 언어는 컴퓨터가 알아듣지 못한다. 이를 기계어로 번역하는 일을 컴파일러가 도맡아 하는데, 이때 몇가지의 과정이 있다.



- Frontend 

 해당 단계에서는 우리가 쓴 프로그래밍 언어를 분석하고 중간코드를 생성한다. LLVM에서는 중간코드를 IR 이라고 부르는 모양이다.


-Optimizer 

 단계 이름 그대로 최적화를 위한 중복계산을 제거하거나 여러가지 변환을 실행한단다.


-BackEnd

 코드를 타겟에 맞는 기계명령어로 매핑하고 실행코드를 생성한다. 



이렇게 3단계를 거쳐서 우리는 output 이라는 컴파일 결과물을 얻을수 있다.


물론, 우리가 자세히 알필요는 없었다. 우리가 필요한건 결과물이지 그 중간과정이 필요한게 아니었으니까. 내가 명령어를 넣으면, 결과물이 나온다. 

이게 글쓴이가 알고있던 컴파일러였다.


LLVM은 쓸데없이 이 3단계를 따로 분리 해 둔 컴파일러이다.


출처 : http://kyejusung.com/



나올 결과물만 보면 이전의 그것들과 다를것이 없다. 우리는 평범하게 소스코드 파일을 입력으로 줄것이고, LLVM은 이것을 컴파일해서 결과물을 가져올 것이다.


이제 겉은 그만 보고 조금만 안으로 들여다보면, LLVM의 잔머리에 감탄할 수도 있다.


LLVM은 중간코드(이하 IR)를 만들고 이를 각 아키텍쳐(타겟)에 맞는 명령어 셋으로 변환 할수 있다.


더이상 크로스컴파일 같은것에 얽매일 필요가 없다는 뜻이다.


사실 이 내용을 처음 접했을때는 여러가지 크로스 컴파일을 덕지덕지 붙여논것이라고 생각했다. 하지만 여기서 LLVM은 한술 더 뜬다


아키텍쳐에 맞는 명령어셋을 IR코드로 변환 가능하다


IR을 명령어로, 명령어를 IR로 바꿀수 있는것은 아마 생각하지 못한 여러가지 이점을 가져올수 있다. 악성코드 분석이든, 개발이나 어느방향이든.



개인적인 사정을 떠나서 LLVM이 어떻게 동작할지, 어떻게 다룰수 있을지에 대해서 흥미가 붙었다.


다음 해야할 일은 LLVM을 설치하고.. 이것을 어떻게 사용할지, IR은 어떻게 보는지, 그리고 정말 결과물을 내가 IR코드로 되돌릴수 있는지에 대해서 테스트 해 볼 생각이다.

'System' 카테고리의 다른 글

How 2 heap - first_fit.c  (0) 2017.05.15
LLVM -3  (2) 2016.08.24
LLVM - 2  (0) 2016.08.17
프로그램에서 일어날수 있는 레이스컨디션의 예제  (8) 2015.04.01
사기를 위한 프로그램 분석  (0) 2014.12.26
Posted by IzayoiSakuya
,

Proxy.py

backup 2016. 6. 13. 14:53
import socket
import os
import sys

class Server():
	def __init__(self,port):
		self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		self.s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
		self.s.bind(("",port))
		self.s.listen(10)

	def Connect(self):
		self.client, self.addr = self.s.accept()
		print "[*] %s is connected."%(self.addr[0])
		return self.client
			

	def FromUser(self):
		data = self.client.recv(65536)
		return data
		
class Client():
	def __init__(self,Host,Port):
		self.s = socket.socket()
		self.s.connect((Host,int(Port)))

	def FromServer(self):
		data = self.s.recv(65536)
		return data

if len(sys.argv) != 4:
	print "[*] USAGE : %s LocalPort RemoteHost RemotePort"%(sys.argv[0])
	exit(-1)

User = Server(int(sys.argv[1]))
while(1):
	User.Connect()
	pid = os.fork()
	if pid == 0:
		Server = Client(sys.argv[2],sys.argv[3])
		pid = os.fork()
		if pid == 0:
			while (1):
				try:
					data = Server.FromServer()
					User.client.send(data)
				except:
					pass
		else:
			while(1):
				try:
					data = User.FromUser()
					Server.s.send(data+"\r\n")
				except:
					pass
	else:
		continue

'backup' 카테고리의 다른 글

discord.py  (0) 2016.12.08
Pixiv Crawler  (2) 2016.06.02
Zip parser source  (0) 2016.03.15
security tools.php  (0) 2015.12.04
[Gussing]  (0) 2015.10.11
Posted by IzayoiSakuya
,

Pixiv Crawler

backup 2016. 6. 2. 19:16

pixiv.zip
8.12MB

이 프로그램은 .NET 4.5를 요구합니다꼭 설치하고 실행해 주세요

https://www.microsoft.com/ko-kr/download/confirmation.aspx?id=30653

 

관련 검색어 기능 추가

단일 일러스트/ 복수 일러스트 선택기능 추가

 

16.06.22 - RANK 버튼 오류 수정

21.02.15 - OAuth 방식 변화로 인한 selenium 추가 및 로그인 로직 수정

 

 

 

 

 

'backup' 카테고리의 다른 글

discord.py  (0) 2016.12.08
Proxy.py  (0) 2016.06.13
Zip parser source  (0) 2016.03.15
security tools.php  (0) 2015.12.04
[Gussing]  (0) 2015.10.11
Posted by IzayoiSakuya
,