세그먼트를 __TEXT
세그먼트 밖으로 이동하고 mach-o 바이너리의 새 세그먼트로 이동하려면 어떻게해야합니까? 내가 묻는 이유는 내 iPhone 앱을 더 작게 만들고 iOS App Store가 압축하기 전에 __TEXT
세그먼트를 암호화하기 때문에 전혀 압축되지 않습니다. 실행 가능하지 않은 모든 섹션을 해당 세그먼트에서 새로운 읽기 전용 세그먼트로 이동할 수 있다면 내 응용 프로그램의 크기를 약 9 % 줄일 수 있습니다.__TEXT 밖의 섹션을 mach-o 바이너리의 새 세그먼트로 만들려면 어떻게해야합니까?
답변
당신이 __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이 가진 유일한 문제는이 같은 모든 하나 하나에 주석을하지 않고 내가 별도의 세그먼트로이 섹션에서 모든 단일 변수를 이동하려는 것입니다
- 1. 새 HttpContext를 만들려면 어떻게해야합니까?
- 2. 트랜잭션 데이터베이스를 사용하여 중요한 섹션을 만들려면 어떻게해야합니까?
- 3. 코드에서 MachO 바이너리에 빈 섹션을 추가하는 방법은 무엇입니까?
- 4. Trac에서 새 프로젝트를 만들려면 어떻게해야합니까?
- 5. 로캘을 URI 세그먼트로 지정하려면 어떻게해야합니까?
- 6. 내 사이트의 라이브 스레드 (vidiprinter) 유형 섹션을 만들려면 어떻게해야합니까?
- 7. 기존 파일의 위치에 새 디렉토리를 만들려면 어떻게해야합니까?
- 8. BitcoinLib을 사용하여 새 주소를 만들려면 어떻게해야합니까?
- 9. 링크/href가있는 새 노드를 만들려면 어떻게해야합니까?
- 10. 새 컨트롤 센터 명령을 만들려면 어떻게해야합니까?
- 11. git repo를 사용하여 새 프로젝트를 만들려면 어떻게해야합니까?
- 12. CalDAV/WebDAV 서버에서 새 주체를 만들려면 어떻게해야합니까?
- 13. 기존 데이터 프레임에 새 카테고리를 만들려면 어떻게해야합니까?
- 14. Android로 Java로 새 연락처를 만들려면 어떻게해야합니까?
- 15. 다른 스택에 새 카드를 만들려면 어떻게해야합니까?
- 16. xcode에서 새 창 인스턴스를 만들려면 어떻게해야합니까?
- 17. 루프 내에서 새 변수를 만들려면 어떻게해야합니까?
- 18. 현재 티켓과 관련된 새 티켓을 만들려면 어떻게해야합니까?
- 19. 사용자가 buddypress에서 작성하는 새 페이지를 만들려면 어떻게해야합니까?
- 20. 기존 값으로 새 객체를 만들려면 어떻게해야합니까?
- 21. Django 앱에서 새 URL을 만들려면 어떻게해야합니까?
- 22. Flash CS3의 버튼에 새 상태를 만들려면 어떻게해야합니까?
- 23. SharePoint : 목록 템플릿에서 새 목록을 만들려면 어떻게해야합니까?
- 24. Laravel 5 미들웨어에서 새 요청을 만들려면 어떻게해야합니까?
- 25. PassportJS를 사용하여 새 세션을 만들려면 어떻게해야합니까?
- 26. QML 내에서 새 창을 만들려면 어떻게해야합니까?
- 27. 현재 개체를 기반으로 새 개체를 만들려면 어떻게해야합니까?
- 28. 기존 데이터베이스에 새 테이블을 추가하거나 새 데이터베이스를 만들려면 어떻게해야합니까?
- 29. Apple Macho Linker Error Xcode
- 30. MRI에서 Neo4j와 관계를 만들려면 어떻게해야합니까?
. 그렇지 않으면 내가 주석을 달아야하는 곳이 수천 개있을 것입니다. – meisel
섹션 마커를 함수, 메소드, 속성 및 전역 변수에만 적용 할 수 있으므로 사용자 정의 섹션/세그먼트가있는 typedef는 문제가되지 않습니다. 나는 영리한 매크로가 최선의 방법이라고 생각한다. Btw 나는 당신의 변수가''__DATA' 세그먼트에서 끝나는 것을 기대할 것입니다. 문자열 상수 만'__TEXT'에 있어야합니다. –