ARCH(3)

NAME
NXGetAllArchInfos, NXGetLocalArchInfo, NXGetArchInfoFromName, NXGetArchInfoFromCpuType, NXFreeArchInfo, NXFindBestFatArch, NXCombineCpuSubtypes - get architecture information

SYNOPSIS
#include <mach-o/arch.h>
extern const NXArchInfo *
NXGetAllArchInfos(void);
extern const NXArchInfo *
NXGetLocalArchInfo(void);
extern const NXArchInfo *
NXGetArchInfoFromName(const char *name);
extern const NXArchInfo *
NXGetArchInfoFromCpuType(cpu_type_t cputype, cpu_subtype_t cpusubtype);
extern void
NXFreeArchInfo(NXArchInfo *x);
extern struct fat_arch *
NXFindBestFatArch(cpu_type_t cputype, cpu_subtype_t cpusubtype, struct fat_arch *fat_archs, uint32_t nfat_archs);
extern struct fat_arch_64 *
NXFindBestFatArch_64(cpu_type_t cputype, cpu_subtype_t cpusubtype, struct fat_arch_64 *fat_archs64, uint32_t nfat_archs);
extern cpu_subtype_t
NXCombineCpuSubtypes(cpu_type_t cputype, cpu_subtype_t cpusubtype1, cpu_subtype_t cpusubtype2);

DESCRIPTION
These functions are intended for use in programs that have to deal with universal files or programs that can target multiple architectures. Typically, a program will use a command-line argument that starts with “-arch name”, where this specifies an architecture. These functions and data structures provide some help for processing architecture flags and then processing the contents of a universal file.

The structure NXArchInfo is defined in <mach-o/arch.h>:

    	typedef struct {
    		const char *name;
    		cpu_type_t cputype;
    		cpu_subtype_t cpusubtype;
    		enum NXByteOrder byteorder;
    		const char *description;
    	} NXArchInfo;

It is used to hold the name of the architecture and the corresponding CPU type and CPU subtype, together with the architecture's byte order and a brief description string.

The currently known architectures are:
Name | CPU Type | CPU Subtype | Description
x86_64 | CPU_TYPE_X86_64 | CPU_SUBTYPE_X86_64_ALL | Intel x86-64
i386 | CPU_TYPE_I386 | CPU_SUBTYPE_I386_ALL | Intel 80x86
arm | CPU_TYPE_ARM | CPU_SUBTYPE_ARM_ALL | ARM
arm64 | CPU_TYPE_ARM64 | CPU_SUBTYPE_ARM64_ALL | ARM64
arm64e | CPU_TYPE_ARM64 | CPU_SUBTYPE_ARM64E | ARM64E
arm64_32 | CPU_TYPE_ARM64_32 | CPU_SUBTYPE_ARM64_32_V8 | ARM64_32
ppc | CPU_TYPE_POWERPC | CPU_SUBTYPE_POWERPC_ALL | PowerPC
ppc64 | CPU_TYPE_POWERPC64 | CPU_SUBTYPE_POWERPC64_ALL | PowerPC 64-bit
m68k | CPU_TYPE_MC680x0 | CPU_SUBTYPE_MC680x0_ALL | Motorola 68K
hppa | CPU_TYPE_HPPA | CPU_SUBTYPE_HPPA_ALL | HP-PA
i860 | CPU_TYPE_I860 | CPU_SUBTYPE_I860_ALL | Intel 860
m88k | CPU_TYPE_MC88000 | CPU_SUBTYPE_MC88000_ALL | Motorola 88K
sparc | CPU_TYPE_SPARC | CPU_SUBTYPE_SPARC_ALL | SPARC
i486 | CPU_TYPE_I386 | CPU_SUBTYPE_486 | Intel 486
i486SX | CPU_TYPE_I386 | CPU_SUBTYPE_486SX | Intel 486SX
pentium | CPU_TYPE_I386 | CPU_SUBTYPE_PENT | Intel Pentium
i586 | CPU_TYPE_I386 | CPU_SUBTYPE_586 | Intel 586
pentpro | CPU_TYPE_I386 | CPU_SUBTYPE_PENTPRO | Intel Pentium Pro
i686 | CPU_TYPE_I386 | CPU_SUBTYPE_PENTPRO | Intel Pentium Pro
pentIIm3 | CPU_TYPE_I386 | CPU_SUBTYPE_PENTII_M3 | Intel Pentium II Model 3
pentIIm5 | CPU_TYPE_I386 | CPU_SUBTYPE_PENTII_M5 | Intel Pentium II Model 5
pentium4 | CPU_TYPE_I386 | CPU_SUBTYPE_PENTIUM_4 | Intel Pentium 4
armv4t | CPU_TYPE_ARM | CPU_SUBTYPE_ARM_V4T | arm v4t
armv5 | CPU_TYPE_ARM | CPU_SUBTYPE_ARM_V5TEJ | arm v5
xscale | CPU_TYPE_ARM | CPU_SUBTYPE_ARM_XSCALE | arm xscale
armv6 | CPU_TYPE_ARM | CPU_SUBTYPE_ARM_V6 | arm v6
armv6m | CPU_TYPE_ARM | CPU_SUBTYPE_ARM_V6M | arm v6m
armv7 | CPU_TYPE_ARM | CPU_SUBTYPE_ARM_V7 | arm v7
armv7f | CPU_TYPE_ARM | CPU_SUBTYPE_ARM_V7F | arm v7f
armv7s | CPU_TYPE_ARM | CPU_SUBTYPE_ARM_V7S | arm v7s
armv7k | CPU_TYPE_ARM | CPU_SUBTYPE_ARM_V7K | arm v7k
armv7m | CPU_TYPE_ARM | CPU_SUBTYPE_ARM_V7M | arm v7m
armv7em | CPU_TYPE_ARM | CPU_SUBTYPE_ARM_V7EM | arm v7em
armv8 | CPU_TYPE_ARM | CPU_SUBTYPE_ARM_V8 | arm v8
arm64 | CPU_TYPE_ARM64 | CPU_SUBTYPE_ARM64_V8 | arm64 v8
ppc601 | CPU_TYPE_POWERPC | CPU_SUBTYPE_POWERPC_601 | PowerPC 601
ppc603 | CPU_TYPE_POWERPC | CPU_SUBTYPE_POWERPC_603 | PowerPC 603
ppc604 | CPU_TYPE_POWERPC | CPU_SUBTYPE_POWERPC_604 | PowerPC 604
ppc604e | CPU_TYPE_POWERPC | CPU_SUBTYPE_POWERPC_604e | PowerPC 604e
ppc750 | CPU_TYPE_POWERPC | CPU_SUBTYPE_POWERPC_750 | PowerPC 750
ppc7400 | CPU_TYPE_POWERPC | CPU_SUBTYPE_POWERPC_7400 | PowerPC 7400
ppc7450 | CPU_TYPE_POWERPC | CPU_SUBTYPE_POWERPC_7450 | PowerPC 7450
ppc970 | CPU_TYPE_POWERPC | CPU_SUBTYPE_POWERPC_970 | PowerPC 970
m68030 | CPU_TYPE_MC680x0 | CPU_SUBTYPE_MC68030_ONLY | Motorola 68030
m68040 | CPU_TYPE_MC680x0 | CPU_SUBTYPE_MC68040 | Motorola 68040
hppa7100LC | CPU_TYPE_HPPA | CPU_SUBTYPE_HPPA_7100LC | HP-PA 7100LC

The first set of entries are used for the architecture family. The second set of entries are used for a specific architecture, when more than one specific architecture is supported in a family of architectures.

NXGetAllArchInfos() returns a pointer to an array of all known NXArchInfo structures. The last NXArchInfo is marked by a NULL name.

NXGetLocalArchInfo() returns the NXArchInfo for the local host, or NULL if none is known.

NXGetArchInfoFromName() and NXGetArchInfoFromCpuType() return the NXArchInfo from the architecture's name or CPU type/CPU subtype combination. A CPU subtype of CPU_SUBTYPE_MULTIPLE can be used to request the most general NXArchInfo known for the given CPU type. NULL is returned if no matching NXArchInfo can be found.

NXFreeArchInfo() is passed a pointer to an NXArchInfo returned by the above interfaces and if not in the array returned in NXGetAllArchInfos() will free(3) the description field and then the NXArchInfo pointer.

The above interfaces that return pointers to NXArchInfo structs in normal cases returns a pointer from the array returned in NXGetAllArchInfos(). In some cases when the cputype is CPU_TYPE_I386 or CPU_TYPE_POWERPC it will return a malloc(3)'ed NXArchInfo struct which contains a string in the description field also a malloc(3)'ed pointer. To allow programs not to leak memory they can call NXFreeArchInfo() on pointers returned from the above interfaces. Since this is a new API on older systems can use the code below. Going forward the above interfaces will only return pointers from the array returned in NXGetAllArchInfos().

    static void NXFreeArchInfo(
    const NXArchInfo *x)
    {
    	const NXArchInfo *p;
    	p = NXGetAllArchInfos();
    	while(p->name != NULL){
    		if(x == p)
    			return;
    		p++;
    	}
    	free((char *)x->description);
    	free((NXArchInfo *)x);
    }

NXFindBestFatArch() is passed a CPU type and CPU subtype and a set of fat_arch structs. It selects the best one that matches (if any), and returns a pointer to that fat_arch struct (or NULL). The fat_arch structs must be in the host byte order and correct such that fat_archs really points to enough memory for nfat_archs structs. It is possible that this routine could fail if new CPU types or CPU subtypes are added and an old version of this routine is used. But if there is an exact match between the CPU type and CPU subtype and one of the fat_arch structs, this routine will always succeed.

NXFindBestFatArch_64() is the same as NXFindBestFatArch() but returns and takes fat_arch_64 structs.

NXCombineCpuSubtypes() returns the resulting CPU subtype when combining two different CPU subtypes for the specified CPU type. If the two CPU subtypes can't be combined (the specific subtypes are mutually exclusive), -1 is returned, indicating it is an error to combine them. This can also fail and return -1 if new CPU types or CPU subtypes are added and an old version of this routine is used. But if the CPU subtypes are the same, they can always be combined and this routine will return the CPU subtype passed in.

SEE ALSO
arch(1)