2013-04-03 4 views
1

정말 빠른 질문이 여기에 있습니다. 우분투에서 일하고 있는데, 간단한 "Hello World!" x86 어셈블리로 어셈블 된 어셈블리 프로그램. 이제 그 컴퓨터 코드를 내 컴퓨터가 실행할 수있는 ELF 실행 파일로 변환하려고합니다. ELF에 직접 어셈블 할 수 있다는 것을 알고 있습니다. ELF 바이너리를 어셈블 된 머신 코드에서 만드는 방법을 알아내는 것이 목적입니다.인텔 바이너리 ELF

감사합니다.

답변

0

실제로 어셈블 된 경우 이미 ELF 형식으로되어 있습니다 (Linux를 타겟팅하는 컴파일러는 일반적으로 ELF 오브젝트 파일에도 객체 코드를 저장합니다).

그러나 완벽하게 작동하는 실행 파일을 원하면 개체 파일을 linker으로 보내야합니다.

+0

이것은 오브젝트 파일이 아니라 x86 머신 코드입니다. –

+0

@ BigEndian 그게 무슨 뜻이야? 어떤 형식입니까? 플랫 바이너리? 어셈블러를 어떻게 호출 했습니까? –

+0

@ H2CO3이 내 대답에 대한 그의 의견을 읽었습니다. –

1

최종 ELF 실행 파일은 일반적으로 링커가 재구성 한 다른 ELF 파일로 작성됩니다. 물론 가장 쉬운 방법은 ELF를 어셈블러의 출력 형식으로 지정하는 것입니다.


1) 정말이 작업을 수행하려면, 당신은 (당신이 등, 컴파일 또는 아무것도 조립하지에서 얻을)에 "빈"ELF 파일을 시작할 수 있습니다. 그런 다음 objcopy --add-section을 사용하면 임의의 파일을 기존 ELF 파일의 섹션으로 추가 할 수 있습니다.

이 최소한의 ELF 파일을 생성합니다 :

$ echo "" | gcc -c -o empty.out -xc - 


2) 다른 방법으로는 다음과 같이 조립 될 필요가 NASM의 incbin 같은 것을 사용하여 다른 어셈블리 파일에 원시 바이너리를 포함 할 수 꼬마 요정.


3) 세 번째 옵션 (지금까지는 최고)은 원시 바이너리를 링커에 제공하고 사용자 정의 링커 스크립트를 사용하여 입력 할 파일 섹션 (입력 파일 이름). 입력 파일 앞에 -b 플래그가 있으면 파일 형식이 ld입니다. 이렇게하면 플랫 바이너리 파일을 사용할 수 있습니다.


첫 번째 장애물 중 하나는 코드를 가리키는 진입 점을 얻는 것입니다. 내 머리 꼭대기에서 나는 그것을 편집하는 방법을 모르겠다.

귀하의 탐구에 도움이 될 pyelftools 파이썬 라이브러리가 있습니다.

+1

필자가 직접 컴파일러를 작성하는 데 관심이 있지만 모든 헤더와 테이블 및 섹션이 포함 된 전체 ELF 파일을 생성하는 코드를 작성할 시간을 투자 할 준비가되지 않은 경우, x86 머신 코드의 ELF 파일 :) 첫 번째 제안을 시도하겠습니다 ... –

+0

@BigEndian Fair 충분히 -이 다음과 같은 일을하는 논리적 인 이유처럼 보입니다. 다른 아이디어를 생각해 내면 알려 드리겠습니다. –

+0

이제 링커가 제게 펑키했습니다. 거의 침대 시간입니다. 나는 내일 이것을 고를 것 같아. 파이썬 코드로 진입 점 포인터를 편집 할 수 있습니다.Kludgey 솔루션,하지만 그게 내가 잘하는거야. –