2012-04-16 1 views
2

나는 dyld가 수행하는 작업의 일부분을 구현하려고하는데 스텁 트램폴린에 조금 붙어 있습니다. 링크 (하위 프로 시저 호출)와가져온 기호를 dyld로 해결하는 방법은 무엇입니까?

BL 0x2fec 

이 가지 0x2fec하기 :

는 다음과 ARM 명령어를 생각해 보자. 0x2fd8에서 시작하는 __TEXT 세그먼트에 __symbolstub1 섹션이 있으므로 __symbolstub1 내부의 20 바이트로 점프한다는 사실을 알고 있습니다.

지금, 상징 나는 LC_SYMTAB로드 명령을 통해 해결 한

(undefined) external _objc_autoreleasePoolPush (from libobjc) 

있다. 제공되는 알려진 주소가 없습니다. 사실, 0x2fec 주소는 _objc_autoreleasePoolPush에 대한 트램 폴린이지만 어떤 방법으로도 증명할 수는 없습니다.

나는 LC_DYLD_INFO_ONLY 명령을 확인했습니다, 그리고 내가 거기에 약간의 힌트를 가지고는 lazy_bind 기호에 내가 발견했습니다

{:offset=>20, :segment=>2, :library=>6, :flags=>[], :name=>"_objc_autoreleasePoolPush"} 

이름과 오프셋 내가 정확히 무엇을 일치, 어디서 라이브러리 # 6은 "/usr/lib/libobjc.A.dylib"이며 이는 또한 완벽합니다. 이제 문제는 세그먼트 # 2는 __TEXT이지만 __TEXT는 0x1000에서 시작하고 __symbolstub1은 0x2fd8에서 끝나는 것입니다. 따라서 섹션에 대한 참조가 누락되었습니다.

내가 _objc_autoreleasePoolPush하는 0x2fec 가상 주소를 매핑 할 수 있겠 방법에 대한 아이디어? 조금 더 파고 나는

답변

1

ㅎ는 LC_DYSYMTAB의 간접 상징에서 그것을 발견했습니다.

이제 긴 대답.

  1. 은 지정된 주소에 대한 섹션을 찾기;
  2. 섹션은 S_NON_LAZY_SYMBOL_POINTERS, S_LAZY_SYMBOL_POINTERS, S_LAZY_DYLIB_SYMBOL_POINTERS, S_THREAD_LOCAL_VARIABLE_POINTERS 또는 S_SYMBOL_STUBS이어야한다; 그렇지 않으면 (4)에 동일한 것으로 간주된다
  3. 섹션 타입은 다음의 바이트 크기 reserved2에 저장 S_SYMBOL_STUBS이면
  4. ;
  5. 는 표 한 Reserved1에 저장된 심볼 간접 오프셋;
  6. 간접 기호 테이블에 인덱스

    인덱스 = sect.reserved1 + (vmaddr - sect.addr)로서 계산된다

    /bytesize;

  7. 심볼 테이블의 심볼은 심볼

  8. [indirect_symbols [인덱스]에서 발견된다.

+0

내가 (어쨌든 인텔 아키텍처를 설명하지만) 당신이이 글을 읽기위한 흥미로운 일이 될 수도 있겠죠 : http://www.codeproject.com/Articles/187181/Dynamic-Linking-of-Imported -Functions-in-Mach-O http://www.codeproject.com/Articles/187192/Redirection-of-Imported-Functions-in-Mach-O 또는 러시아어로 : http://habrahabr.ru/게시물/115558 – shoumikhin

관련 문제