2012-08-10 2 views
1

개인 목표 - C 특정 마하-O 섹션 마하-O 바이너리의 데이터 세그먼트

것은 인용합니다 (Mach-O file format의 7 페이지에 언급 된) 몇 가지 목표 - C 특정 섹션이 있습니다 PiOS paper 다음 __objc_classlist 섹션 구현 분석 진 내에 존재하는 모든 클래스들의 목록을 포함

(즉, 정적 링커 현상에 의해 구현되거나 포함 된 모든 클래스 )

__objc_classref 섹션은, 다른 한편으로는, 에 대한 참조 응용 프로그램에서 사용하는 모든 클래스가 포함되어 있습니다. 의 구현은 바이너리 자체에 포함될 필요는 없지만 런타임 프레임 워크 ( 동적 연결 라이브러리에 해당)에 의해 제공되는 일 수 있습니다.

이들 구조의 레이아웃은 Objective C 런타임 헤더 (사용 가능한 here)에서 사용할 수 있습니다.

__objc_classref__objc_classlist 섹션의 실제 구조는 무엇입니까?

미리 감사드립니다.

답변

3

slightly newer version of the Objective-C runtime implementation에있는 GETSECT 매크로의 정의를 살펴보십시오. 너무과 같습니다

#define GETSECT(name, type, sectname)         \ 
    type *name(const header_info *hi, size_t *outCount) \ 
    {                 \ 
     unsigned long byteCount = 0;         \ 
     type *data = (type *)           \ 
      getsectiondata(hi->mhdr, SEG_DATA, sectname, &byteCount); \ 
     *outCount = byteCount/sizeof(type);       \ 
     return data;             \ 
    } 

이, 각 영역은 유형 type의 항목의 배열 것을 우리에게 알려줍니다.

당신이 관심있는 두 개의 섹션을 읽어 _getObjc2ClassRefs_getObjc2ClassList라는 이름의 함수를 선언하는 몇 줄 나중에 사용되는 :

GETSECT(_getObjc2ClassRefs,   class_t *,  "__objc_classrefs"); 
GETSECT(_getObjc2ClassList,   classref_t,  "__objc_classlist"); 

그래서 __objc_classrefsclass_t *의를 포함하고 __objc_classlistclassref_t의이 포함되어 있습니다. 해당 필드를 해석하는 것은 상대적으로 자명합니다.