2013-03-23 2 views
3

C 프로그램에서 간단한 ELF 파일로 작업해야합니다. 외부 라이브러리를 사용할 수 없지만 elf.h을 사용할 수 있습니다.ELF 파일 작업

은의 소스에 대한 hello.o 파일을 보자 :

int Hello() { return 3; } 
내가 ohter의 C 프로그램은 hello.o 파일을 필요에 Hello에 액세스 할 수있는 방법

?

이렇게하면 mmap 또는 sth를 사용하여 메모리에로드해야합니다. 마지막에는 훨씬 복잡한 ELF 파일로 작업해야하지만 지금은 시작하는 방법을 모른다.

업데이트 : 학습 목적으로 사용했기 때문에이 방법으로 설명해야합니다. 전체 문제는 내가 설명한 것보다 더 복잡합니다.

int HelloFromElfO(const char* helloFile); 

helloFile에서 구현 Hello 기능을 수행하는 것입니다 :이 질문에 대한

내가 방법을 쓸 필요가 가정합니다.

전 대답을 원하지 않습니다. 나는 어떤 코드도 필요 없다. 나는 뭔가를 시작할 필요가있다.

필자는 ELF 파일 구조에 대한 기본 지식을 가지고 있지만, 파서 또는 sth없이 바이너리 파일로 C에서 어떻게 작동하는지 전혀 모른다.

UPDATE2 : 좋아, readelf와 같은 앱은 입니다. 매우입니다. 어쩌면 내가이 방법을 시도해 볼 수도 있습니다. 다시 말하십시오. hello.optr에 매핑됩니다. Hello 함수에 대한 포인터를 얻으려면 어떻게해야합니까?

hello.o에서 구조화 된 데이터를 얻으려면 어떻게해야합니까? 내 말은, 순수한 바이트가 아니라 함께 작업 할 수있는 것입니다.

+2

당신은 단순히 공유 객체들을 만들고, 그리고 동적 로더에 의존하는 옵션을 가지고 있지 않은거야? – NPE

+0

@npe 이것은 학문적 인 문제입니다. 나는 그렇게 할 필요가있다. – Ari

+1

'readelf' 명령과 그 소스 코드를 보면서 .o 파일에서 필요한 정보를 추출하는 방법을 보여 주어야합니다. 아마도'dlsym' 소스를 보아라. 이것은 당신이 원하는대로하는 것이지만, C 라이브러리에서는 가능하다. – teppic

답변

5

이것은 생각보다 쉬운 방법입니다. ELF는 당신의 문제와 아무 관련이 없습니다 (그리고 mmap()은 더 멀리 있습니다 ...). hello.o은 ELF 파일이 아니며 개체 파일입니다.

개체 파일을 실행 파일에 연결하면 Hello()에 액세스 할 수 있습니다. here를 참조하면 yourCode.o로 오브젝트 파일로 프로그램을 컴파일 한 가정하면, 당신은 hello.o

cc yourCode.o hello.o -o yourExecutable 

으로이 yourCode.o을 연결합니다.

편집 : 당신이

  1. mmap() 후, 오브젝트 파일을 파일을 연결하지만 동적으로로드 할 수없는 경우

  2. 메모리에 Hello() 주소를 가져옵니다. 이 경우 hello.o (예 : objdump)을 정적으로 분석하고 Hello() 진입 점 오프셋을 파일에 가져올 수 있습니다.
  3. mmap()에 의해 반환 된 주소에이 오프셋을 추가하여 Hello() 주소를 가져옵니다.
  4. function pointer
  5. 함수를 호출하십시오.
  6. ???
  7. 이익
+0

알아. 문제는 내가 파일을 링크하고 싶지 않고, 동적으로로드하고 싶습니다. (그리고 나는 .so를 사용하고 싶지 않습니다.) 이것은 학문적 인 문제입니다. 나는 "동적 연결"을 구현해야한다. – Ari

+0

질문에 링크하지 않으려면 명시 적으로 기술하십시오. 그렇지 않으면 알 수 없습니다.) – m0skit0

+0

답변을 업데이트했습니다. – m0skit0