2017-12-19 2 views
1

세그먼트를 __TEXT 세그먼트 밖으로 이동하고 mach-o 바이너리의 새 세그먼트로 이동하려면 어떻게해야합니까? 내가 묻는 이유는 내 iPhone 앱을 더 작게 만들고 iOS App Store가 압축하기 전에 __TEXT 세그먼트를 암호화하기 때문에 전혀 압축되지 않습니다. 실행 가능하지 않은 모든 섹션을 해당 세그먼트에서 새로운 읽기 전용 세그먼트로 이동할 수 있다면 내 응용 프로그램의 크기를 약 9 % 줄일 수 있습니다.__TEXT 밖의 섹션을 mach-o 바이너리의 새 세그먼트로 만들려면 어떻게해야합니까?

답변

0

당신이 __attribute__ section(...)을 사용할 수 있습니다 (그 문제 또는 C) 목표 - C를 사용하는 가정.
구문 : https://opensource.apple.com/source/clang/clang-137/src/lib/MC/MCSectionMachO.cpp에서
__attribute__ ((section("segmentName,sectionName,[optional]sectionType,[optional]sectionAttribute,[optional]stubSize")))
sectionTypes 수 :

{ "regular",     "S_REGULAR" },     // 0x00 
    { 0,       "S_ZEROFILL" },     // 0x01 
    { "cstring_literals",   "S_CSTRING_LITERALS" },   // 0x02 
    { "4byte_literals",   "S_4BYTE_LITERALS" },    // 0x03 
    { "8byte_literals",   "S_8BYTE_LITERALS" },    // 0x04 
    { "literal_pointers",   "S_LITERAL_POINTERS" },   // 0x05 
    { "non_lazy_symbol_pointers", "S_NON_LAZY_SYMBOL_POINTERS" }, // 0x06 
    { "lazy_symbol_pointers",  "S_LAZY_SYMBOL_POINTERS" },  // 0x07 
    { "symbol_stubs",    "S_SYMBOL_STUBS" },    // 0x08 
    { "mod_init_funcs",   "S_MOD_INIT_FUNC_POINTERS" },  // 0x09 
    { "mod_term_funcs",   "S_MOD_TERM_FUNC_POINTERS" },  // 0x0A 
    { "coalesced",    "S_COALESCED" },     // 0x0B 
    { 0, /*FIXME??*/    "S_GB_ZEROFILL" },    // 0x0C 
    { "interposing",    "S_INTERPOSING" },    // 0x0D 
    { "16byte_literals",   "S_16BYTE_LITERALS" },   // 0x0E 
    { 0, /*FIXME??*/    "S_DTRACE_DOF" },     // 0x0F 
    { 0, /*FIXME??*/    "S_LAZY_DYLIB_SYMBOL_POINTERS" }, // 0x10 
    { "thread_local_regular",  "S_THREAD_LOCAL_REGULAR" },  // 0x11 
    { "thread_local_zerofill", "S_THREAD_LOCAL_ZEROFILL" },  // 0x12 
    { "thread_local_variables", "S_THREAD_LOCAL_VARIABLES" },  // 0x13 
    { "thread_local_variable_pointers", 
    "S_THREAD_LOCAL_VARIABLE_POINTERS" },       // 0x14 
    { "thread_local_init_function_pointers", 
    "S_THREAD_LOCAL_INIT_FUNCTION_POINTERS"},      // 0x15 

section attributes 허용 :

ENTRY("pure_instructions", S_ATTR_PURE_INSTRUCTIONS) 
ENTRY("no_toc",    S_ATTR_NO_TOC) 
ENTRY("strip_static_syms", S_ATTR_STRIP_STATIC_SYMS) 
ENTRY("no_dead_strip",  S_ATTR_NO_DEAD_STRIP) 
ENTRY("live_support",  S_ATTR_LIVE_SUPPORT) 
ENTRY("self_modifying_code", S_ATTR_SELF_MODIFYING_CODE) 
ENTRY("debug",    S_ATTR_DEBUG) 
ENTRY("" /*FIXME*/,   S_ATTR_SOME_INSTRUCTIONS) 
ENTRY("" /*FIXME*/,   S_ATTR_EXT_RELOC) 
ENTRY("" /*FIXME*/,   S_ATTR_LOC_RELOC) 

몇 가지 예 :

//Variable in brand new segment & section, segment VM access defaults to read/write 
int intInCustomPlace __attribute__ ((section ("__DATA2,__data2"))); 

//Read only string constant outside of __TEXT in readonly __LINKEDIT 
char *kString __attribute__ ((section ("__LINKEDIT,__customSection"))) = "value"; 

//C function in custom section 
void foo() __attribute__ ((section ("__TEXT,__customSection"))); 

//obj-c method in custom section 
- (void) foo:(NSInteger)someArg __attribute__ ((section ("__TEXT, __customSection"))); 

당신은 쉽게 물건을 깰 수 있다는 것을 명심하십시오. MachOView은 바이너리 검사에 편리한 도구입니다. 맞춤 ("__TEXT,__cstring") 교체가 가장 가능성이 높습니다.

편집 : 존재하지 않는 세그먼트는 기본적으로 읽기 가능 & 쓰기 가능 (예 : __DATA)으로 표시되므로 실행 코드에서 작동하지 않습니다. 당신이 여기에 문서화 인라인 어셈블리 경로를 탐색하려면

: https://developer.apple.com/library/content/documentation/DeveloperTools/Reference/Assembler/040-Assembler_Directives/asm_directives.html이 가진 유일한 문제는이 같은 모든 하나 하나에 주석을하지 않고 내가 별도의 세그먼트로이 섹션에서 모든 단일 변수를 이동하려는 것입니다

+0

. 그렇지 않으면 내가 주석을 달아야하는 곳이 수천 개있을 것입니다. – meisel

+0

섹션 마커를 함수, 메소드, 속성 및 전역 변수에만 적용 할 수 있으므로 사용자 정의 섹션/세그먼트가있는 typedef는 문제가되지 않습니다. 나는 영리한 매크로가 최선의 방법이라고 생각한다. Btw 나는 당신의 변수가''__DATA' 세그먼트에서 끝나는 것을 기대할 것입니다. 문자열 상수 만'__TEXT'에 있어야합니다. –

관련 문제