2012-05-21 2 views
4

최근에 저는 리눅스 플랫폼에서 간단한 컴파일러를 직접 작성하려고했습니다.libelf 또는 다른 라이브러리를 사용하지 않고 ELF 바이너리 만들기

컴파일러의 백엔드에 관해서는 libelf과 같은 써드 파티 라이브러리를 사용하지 않고 ELF 형식의 바이너리를 생성하기로 결정했습니다.

나는 대신 write() 함수를 사용하고 ELF 파일의 모든 세부 사항을 제어함으로써 ELF ABI에 상응하는 파일에 기계어 코드를 직접 작성하려고합니다.

이 방법의 장점은 제 컴파일러의 모든 것을 제어 할 수 있다는 것입니다.

그러나 나는 주저합니다. ELF ABI가 얼마나 상세했는지 고려하면 가능한가?

유용한 정보를 얻을 수있는 유용한 정보가 있으면 알려주십시오.

+6

아 그래, 옛날은 "나는 그때 피어 심사되어있어 하나의 오류에 대해 걱정할 필요가 없기 때문에, 내 자신의 백과 사전을 작성하고자하는, 수천명의 사람들이 교정 해 - 나는 그것을 더 잘할 수있다 "고 주장한다. –

+2

@Marc - 프로덕션 소프트웨어의 경우 완전히 동의합니다. 그러나 컴파일러 작성법에 대해 배우기 위해 이미 독자적인 컴파일러를 작성하고 있다면 코드 생성과 출력을 직접 해보십시오. 매우 흥미로운 학습 경험이 될 수 있습니다. – QuantumMechanic

+0

그것은 컴파일러가 아니라 링커의 역할입니다. –

답변

5

얼마나 쉽고/가능성이 있는지는 어떤 기능을 지원할 것인지에 달려 있습니다. 동적 링크를 사용하려면 심볼 테이블, 재배치 등을 처리해야합니다. 물론 기존 라이브러리와 심지어 정적 라이브러리와도 연결할 수 있기를 원한다면 필요한 모든 것을 지원해야합니다. 그러나 여러분의 목표가 독립형 정적 ELF 바이너리를 만드는 것일뿐입니다. 정말 쉽습니다. 필요한 것은 메인 ELF 헤더 (100 % 상용구)와 2 PT_LOAD 프로그램 헤더입니다 : 하나는 프로그램의 코드 세그먼트를로드하고 다른 하나는 데이터 세그먼트를로드합니다. 이론적으로 그들은 결합 될 수 있지만, 보안 강화 커널은 주어진 페이지가 쓰기 가능하고 실행 가능하도록 허용하지 않으므로, 분리하는 것이 현명 할 것입니다.

일부 제안 읽기 :

http://www.linuxjournal.com/article/1059

+1

당신의 제안을위한 Thannks. ELF 파일 형식을 공부하기 위해 어떤 정보라도 추천 해 주시겠습니까? – bluesea

+0

도움이 될만한 링크가 하나 추가되었습니다. –

관련 문제