iOSシミュレータとiOS実機のCヘッダファイルの差分を調べた

iOSシミュレータとiOS実機とでかなり環境が違うことはiOS開発者の方なら常識だと思います。両者でCPUアーキテクチャが違うのはもちろんですが、iOS実機のサンドボックス環境は様々な制約がかかっており、シミュレータで動くコードが実機で動かないなんてことも珍しくありません。

ところで、先日iOSシミュレータで動作確認していたCのソースコードを初めて実機向けにビルドしようと思ったら「`sys/user.h`が見つからないよ」というコンパイルエラーが出ました。「iOSシミュレータ環境とiOS実機とでヘッダファイルの有無まで変わる」というのは理屈上あり得ることではありますが、本当に違うならシミュレータ環境の存在価値って何なの？という気持ちになりますね。

とはいえ愚痴っていても仕方がないので、両環境のヘッダファイルの差分を一覧にしてみました。

# 調査方法

XCode7.3.1環境。下記2ディレクトリの差分からCPU名っぽいディレクトリ名のファイルを除去。

```
$(xcrun --sdk iphonesimulator --show-sdk-path)/usr/include
$(xcrun --sdk iphoneos --show-sdk-path)/usr/include
```

# iOSシミュレータ向けビルド環境にしか無いヘッダファイル

下記ファイルはiOS実機向けビルド環境では存在しません。

```
aliasdb.h
ar.h
arpa/ftp.h
arpa/telnet.h
arpa/tftp.h
atm/atm_types.h
bootparams.h
bsm/audit_domain.h
bsm/audit_errno.h
bsm/audit_fcntl.h
bsm/audit_internal.h
bsm/audit_kevents.h
bsm/audit_record.h
bsm/audit_socket_type.h
crt_externs.h
curses.h
default_pager/default_pager_object.h
default_pager/default_pager_types.h
device/device_port.h
disktab.h
editline/readline.h
eti.h
form.h
fsproperties.h
get_compat.h
hfs/hfs_encodings.h
hfs/hfs_format.h
hfs/hfs_mount.h
hfs/hfs_unistr.h
histedit.h
kern/exc_resource.h
kern/kern_cdata.h
libc.h
libcharset.h
libkern/machine/OSByteOrder.h
libkern/OSDebug.h
libkern/OSKextLib.h
libkern/OSReturn.h
libkern/OSThermalNotification.h
libkern/OSTypes.h
libproc.h
localcharset.h
MacErrors.h
mach/machine/sdt.h
mach/machine/sdt_isa.h
mach/sdt.h
mach/shared_memory_server.h
mach/shared_region.h
mach_debug/mach_debug.h
machine/_limits.h
machine/byte_order.h
machine/fasttrap_isa.h
machine/profile.h
machine/vmparam.h
menu.h
miscfs/devfs/devfs.h
miscfs/specfs/specdev.h
miscfs/union/union.h
monitor.h
nc_tparm.h
ncurses.h
ncurses_dll.h
net/bpf.h
net/dlil.h
net/if_arp.h
net/if_llc.h
net/if_media.h
net/if_mib.h
net/if_types.h
net/if_utun.h
net/kext_net.h
net/ndrv.h
net/route.h
netinet/bootp.h
netinet/icmp6.h
netinet/icmp_var.h
netinet/if_ether.h
netinet/igmp.h
netinet/igmp_var.h
netinet/in_pcb.h
netinet/in_var.h
netinet/ip6.h
netinet/ip_icmp.h
netinet/ip_var.h
netinet/tcp_fsm.h
netinet/tcp_seq.h
netinet/tcp_timer.h
netinet/tcp_var.h
netinet/tcpip.h
netinet/udp.h
netinet/udp_var.h
netinet6/ah.h
netinet6/esp.h
netinet6/in6_var.h
netinet6/ipcomp.h
netinet6/nd6.h
netinet6/raw_ip6.h
netkey/keysock.h
nfs/krpc.h
nfs/nfs.h
nfs/nfs_gss.h
nfs/nfs_ioctl.h
nfs/nfs_lock.h
nfs/nfsdiskless.h
nfs/nfsm_subs.h
nfs/nfsmount.h
nfs/nfsnode.h
nfs/nfsproto.h
nfs/nfsrvcache.h
nfs/rpcv2.h
nfs/xdr_subs.h
nlist.h
NSSystemDirectories.h
objc/hashtable.h
objc/hashtable2.h
objc/List.h
objc/objc-class.h
objc/objc-load.h
objc/objc-runtime.h
objc/Object.h
objc/Protocol.h
panel.h
pexpert/boot.h
pexpert/machine/boot.h
pexpert/machine/protos.h
pexpert/pexpert.h
pexpert/protos.h
printerdb.h
protocols/routed.h
protocols/rwhod.h
protocols/talkd.h
protocols/timed.h
ranlib.h
readline/history.h
readline/readline.h
rpc/pmap_clnt.h
rpc/pmap_prot.h
rpc/pmap_rmt.h
rpcsvc/yp_prot.h
rpcsvc/ypclnt.h
security/audit/audit_ioctl.h
security/mac.h
security/mac_policy.h
servers/key_defs.h
servers/ls_defs.h
servers/netname.h
servers/netname_defs.h
servers/nm_defs.h
sgtty.h
sqlite3_private.h
stab.h
strhash.h
struct.h
sys/acct.h
sys/buf.h
sys/conf.h
sys/dir.h
sys/disk.h
sys/dkstat.h
sys/domain.h
sys/dtrace.h
sys/dtrace_glue.h
sys/dtrace_impl.h
sys/ev.h
sys/fasttrap.h
sys/fasttrap_isa.h
sys/filedesc.h
sys/gmon.h
sys/ioctl_compat.h
sys/kdebug.h
sys/kern_control.h
sys/kern_event.h
sys/kernel.h
sys/kernel_types.h
sys/loadable_fs.h
sys/lockf.h
sys/malloc.h
sys/mbuf.h
sys/msgbuf.h
sys/netport.h
sys/pipe.h
sys/posix_sem.h
sys/posix_shm.h
sys/proc_info.h
sys/protosw.h
sys/ptrace.h
sys/random.h
sys/reboot.h
sys/resourcevar.h
sys/sbuf.h
sys/sdt.h
sys/signalvar.h
sys/socketvar.h
sys/sys_domain.h
sys/tprintf.h
sys/trace.h
sys/tty.h
sys/ttychars.h
sys/ttydev.h
sys/ubc.h
sys/unpcb.h
sys/user.h
sys/utfconv.h
sys/vadvise.h
sys/vcmd.h
sys/vmmeter.h
sys/vmparam.h
sys/vnioctl.h
sys/vnode.h
sys/vnode_if.h
sys/vstat.h
term.h
term_entry.h
termcap.h
tic.h
tidy/buffio.h
tidy/platform.h
tidy/tidy.h
tidy/tidyenum.h
timeconv.h
tzfile.h
unctrl.h
vfs/vfs_support.h
```

無くても仕方ないものが多い印象ではあります。特に`sys/`以下はそうですね。TTY・アカウント管理・共有メモリ周りなどが無いのはAndroid NDK環境と通じるところがあります。

# iOS実機向けビルド環境にだけ存在するヘッダファイル一覧

下記ファイルはiOSシミュレータ向けビルド環境では存在しません。

```
rpcsvc/bootparam_prot.h
rpcsvc/klm_prot.h
rpcsvc/mount.h
rpcsvc/nfs_prot.h
rpcsvc/nlm_prot.h
rpcsvc/rex.h
rpcsvc/rnusers.h
rpcsvc/rquota.h
rpcsvc/rstat.h
rpcsvc/rusers.h
rpcsvc/rwall.h
rpcsvc/sm_inter.h
rpcsvc/spray.h
rpcsvc/yp.h
rpcsvc/yppasswd.h
```

yp（NIS）やその他RPC関連のヘッダですね…。おそらく整理しきれてないだけでしょう。