2017-11-16 37 views
1

다른 iOS 아키텍처 바이너리 파일이 동일한 전체 코드인지, 아니면 다를 수 있습니다.ios 아키텍처 버전 - 동일 코드

이 바이너리에서 특정 작업 (예 : PIE, ARC 또는 memcpy 등의 문자열)을 검사하려는 경우 동일한 작업에 대해 두 가지 얇은 바이너리를 모두 확인해야합니까, 아니면 서로 다른 메모리 주소 ?

예컨대 a fat binary consisting of armv7 and arm64, if the armv7 binary has PIE enabled, so will the arm64?

if the armv7 binary uses strcpy, the arm64 binary will also use strcpy?

추가 설명을위한 예 : 두 바이너리 TLDR에서 아래와 같은 수단 동일한 결과를 포함? 똑같은 코드가 아치마다 다르게 컴파일됩니다.

armv7 
0x001e7e44 665 _memcpy 
0x001e7ea4 770 _strlen 
0x001e7eac 772 _strncpy 
0x001e85b4 665 _memcpy 

arm64 
0x00000001001be7f0 645 _memcpy 
0x00000001001be904 746 _strlen 
0x00000001001be91c 748 _strncpy 
0x0000000100220f18 645 _memcpy 

TLDR; 2 iOS 바이너리가 동일한 코드이며 아키텍처에 따라 다르게 컴파일됩니까?

답변

0

지방 바이너리에는 여러 가지 독립적 인 Mach-O 파일이 포함되어 있습니다.이 파일에는 아무 것도 공통으로 사용할 필요가 없습니다.

하나의 플랫폼 용 바이너리를 컴파일 할 때 그 사실은 거의 드러나지 않지만 크로스 플랫폼 바이너리 (일부 연구 도구는 macOS와 jailbroken iDevices 모두에서 실행될 수 있음)를 빌드 할 때는 실제로 수행 할 방법이 없습니다. 수동으로는 :

gcc -o program.macos program.c 
xcrun -sdk iphoneos gcc -arch armv7 -arch arm64 -o program.ios program.c 
lipo -create -output program program.macos program.ios 

지금, 지방 마하-O의 일반적으로 여러 개의 조각은 다른 아키텍처 용으로 컴파일 된 같은 코드베이스를 포함 - 결국, 그 용도입니다. 하지만 아무런 요구 사항이 없습니다. staple entirely different object files together (면책 조항 : 저의 답변). 그러나 내가 선택한 게시물에 대한 통제권이 없기 때문에 그 게시물에서 작성한 것처럼 매우 제한적인 용도로 사용됩니다.

미묘한 차이점은 꽤 흔하며, 예를 들어. 이 같은 C 코드 : 나는 이전에 간단한 수입을 허용 io_* 기능은 32 비트에 수출하지만 64 비트에있는 (공식적으로 금지) IOKit 프레임 워크의 사용을 포함 알고

void some_function(void) 
{ 
#if __LP64__ 
    // do something 
#else 
    // do something else 
#endif 
} 

예 그러나 후자에 집안에 dlsym() 작풍 스캐닝 부호를 요구했다. 결론적으로

:

다른 마하-O의 조각인가는 일반적으로 동일한 코드베이스에서 컴파일? .
해야할까요? .
그것은 어떤 방식 으로든 보장됩니까? 아니요입니다.

+0

좋아, 그럼에도 불구하고 그들은 함께 스테이플 링 할 수 있습니다, 그들은 보통입니까? 내가 본 모든 파이썬, 스택 스매싱, 아크 등, 모든 MAOS-O 파일은 똑같습니다 ... 내가 어떤 차이점을 발견했는지, 나는 여전히 armv7 그리고 arm64? – jerrythebum

+0

we''d도 MacOS 애플 리케이션이 아니라 여기의 iOS 애플 리케이션에 대해 말하고있다 – jerrythebum

+0

글쎄, 당신은 정확히 무엇을하고 싶니? 궁극적으로, Mach-O의 내용에 관한 모든 것은 저자까지 100 %입니다. – Siguza