UB의 포맷은 (의외로?) 대단히 단순하다.

fat_header는 단 2개의 32비트 정수로 이루어진 구조체다.
nfat_arch는 해당 UB가 지원하는 아키텍처 갯수를 표시한다. 요즘 UB는 대개 2겠지(PowerPC, Intel). 이론적으로는 3 이상이 될 가능성도 얼마든지 있으니 조심.
그 다음으로 이어지는 것은 총 20바이트 크기인 fat_arch 구조체의 리스트다. 절대 2개 고정이 아니며 nfat_arch에 써있는 갯수만큼 나열된다.
align의 의미는
..잘 모르겠다.
이것은 원문

fat_header는 단 2개의 32비트 정수로 이루어진 구조체다.
struct fat_headermagic은 이름에서 짐작하듯이 매직 넘버다. Big Endian에서는 0xCAFEBABE, Little Endian에서는 0xBEBAFECA. 읽어들일 때는 ntohl 따위를 써 주는 편이 좋겠다. 내부에 포함된 Mach-O 포맷(Mac OSX의 진짜 실행파일 포맷)은 엔디안에 따라 저장되는 모양새가 다르지만, UB 헤더는 무조건 Big Endian으로 저장된다. 따라서 인텔 CPU처럼 리틀 엔디안을 쓴다면 ntohl 함수 등을 써서 원래 값으로 복구해 주는 편이 좋다.{
uint32_t magic;
uint32_t nfat_arch;
};
nfat_arch는 해당 UB가 지원하는 아키텍처 갯수를 표시한다. 요즘 UB는 대개 2겠지(PowerPC, Intel). 이론적으로는 3 이상이 될 가능성도 얼마든지 있으니 조심.
그 다음으로 이어지는 것은 총 20바이트 크기인 fat_arch 구조체의 리스트다. 절대 2개 고정이 아니며 nfat_arch에 써있는 갯수만큼 나열된다.
offset은 해당 코드가 시작되는 절대위치(파일 시작위치가 0이라고 봤을 때)이므로 주의.struct fat_arch뭐.. 설명이 굳이 필요하려나.
{
cpu_type_t cputype;
cpu_subtype_t cpusubtype;
uint32_t offset;
uint32_t size;
uint32_t align;
};
align의 의미는
..잘 모르겠다.
이것은 원문
alignThe power of 2 alignment for the offset of the object file for the architecture specified in
cputypewithin the binary. This is required to ensure that, if this binary is changed, the contents it retains are correctly aligned for virtual memory paging and other uses.
TAG ub분석

댓글을 달아 주세요