1456 lines
27 KiB
Python
Executable file
1456 lines
27 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
|
|
"""Generate many skeletal functions with a thick call graph spanning a
|
|
large address space to induce lld to create branch-islands for arm64.
|
|
|
|
"""
|
|
from __future__ import print_function
|
|
import random
|
|
import argparse
|
|
import string
|
|
from pprint import pprint
|
|
from math import factorial
|
|
from itertools import permutations
|
|
|
|
# This list comes from libSystem.tbd and contains a sizeable subset
|
|
# of dylib calls available for all MacOS target archs.
|
|
libSystem_calls = (
|
|
"__CurrentRuneLocale",
|
|
"__DefaultRuneLocale",
|
|
"__Exit",
|
|
"__NSGetArgc",
|
|
"__NSGetArgv",
|
|
"__NSGetEnviron",
|
|
"__NSGetMachExecuteHeader",
|
|
"__NSGetProgname",
|
|
"__PathLocale",
|
|
"__Read_RuneMagi",
|
|
"___Balloc_D2A",
|
|
"___Bfree_D2A",
|
|
"___ULtod_D2A",
|
|
"____mb_cur_max",
|
|
"____mb_cur_max_l",
|
|
"____runetype",
|
|
"____runetype_l",
|
|
"____tolower",
|
|
"____tolower_l",
|
|
"____toupper",
|
|
"____toupper_l",
|
|
"___add_ovflpage",
|
|
"___addel",
|
|
"___any_on_D2A",
|
|
"___assert_rtn",
|
|
"___b2d_D2A",
|
|
"___big_delete",
|
|
"___big_insert",
|
|
"___big_keydata",
|
|
"___big_return",
|
|
"___big_split",
|
|
"___bigtens_D2A",
|
|
"___bt_close",
|
|
"___bt_cmp",
|
|
"___bt_defcmp",
|
|
"___bt_defpfx",
|
|
"___bt_delete",
|
|
"___bt_dleaf",
|
|
"___bt_fd",
|
|
"___bt_free",
|
|
"___bt_get",
|
|
"___bt_new",
|
|
"___bt_open",
|
|
"___bt_pgin",
|
|
"___bt_pgout",
|
|
"___bt_put",
|
|
"___bt_ret",
|
|
"___bt_search",
|
|
"___bt_seq",
|
|
"___bt_setcur",
|
|
"___bt_split",
|
|
"___bt_sync",
|
|
"___buf_free",
|
|
"___call_hash",
|
|
"___cleanup",
|
|
"___cmp_D2A",
|
|
"___collate_equiv_match",
|
|
"___collate_load_error",
|
|
"___collate_lookup",
|
|
"___collate_lookup_l",
|
|
"___copybits_D2A",
|
|
"___cxa_atexit",
|
|
"___cxa_finalize",
|
|
"___cxa_finalize_ranges",
|
|
"___cxa_thread_atexit",
|
|
"___d2b_D2A",
|
|
"___dbpanic",
|
|
"___decrement_D2A",
|
|
"___default_hash",
|
|
"___default_utx",
|
|
"___delpair",
|
|
"___diff_D2A",
|
|
"___dtoa",
|
|
"___expand_table",
|
|
"___fflush",
|
|
"___fgetwc",
|
|
"___find_bigpair",
|
|
"___find_last_page",
|
|
"___fix_locale_grouping_str",
|
|
"___fread",
|
|
"___free_ovflpage",
|
|
"___freedtoa",
|
|
"___gdtoa",
|
|
"___gdtoa_locks",
|
|
"___get_buf",
|
|
"___get_page",
|
|
"___gethex_D2A",
|
|
"___getonlyClocaleconv",
|
|
"___hash_open",
|
|
"___hdtoa",
|
|
"___hexdig_D2A",
|
|
"___hexdig_init_D2A",
|
|
"___hexnan_D2A",
|
|
"___hi0bits_D2A",
|
|
"___hldtoa",
|
|
"___i2b_D2A",
|
|
"___ibitmap",
|
|
"___increment_D2A",
|
|
"___isctype",
|
|
"___istype",
|
|
"___istype_l",
|
|
"___ldtoa",
|
|
"___libc_init",
|
|
"___lo0bits_D2A",
|
|
"___log2",
|
|
"___lshift_D2A",
|
|
"___maskrune",
|
|
"___maskrune_l",
|
|
"___match_D2A",
|
|
"___mb_cur_max",
|
|
"___mb_sb_limit",
|
|
"___memccpy_chk",
|
|
"___memcpy_chk",
|
|
"___memmove_chk",
|
|
"___memset_chk",
|
|
"___mult_D2A",
|
|
"___multadd_D2A",
|
|
"___nrv_alloc_D2A",
|
|
"___opendir2",
|
|
"___ovfl_delete",
|
|
"___ovfl_get",
|
|
"___ovfl_put",
|
|
"___pow5mult_D2A",
|
|
"___put_page",
|
|
"___quorem_D2A",
|
|
"___ratio_D2A",
|
|
"___rec_close",
|
|
"___rec_delete",
|
|
"___rec_dleaf",
|
|
"___rec_fd",
|
|
"___rec_fmap",
|
|
"___rec_fpipe",
|
|
"___rec_get",
|
|
"___rec_iput",
|
|
"___rec_open",
|
|
"___rec_put",
|
|
"___rec_ret",
|
|
"___rec_search",
|
|
"___rec_seq",
|
|
"___rec_sync",
|
|
"___rec_vmap",
|
|
"___rec_vpipe",
|
|
"___reclaim_buf",
|
|
"___rshift_D2A",
|
|
"___rv_alloc_D2A",
|
|
"___s2b_D2A",
|
|
"___sF",
|
|
"___sclose",
|
|
"___sdidinit",
|
|
"___set_ones_D2A",
|
|
"___setonlyClocaleconv",
|
|
"___sflags",
|
|
"___sflush",
|
|
"___sfp",
|
|
"___sfvwrite",
|
|
"___sglue",
|
|
"___sinit",
|
|
"___slbexpand",
|
|
"___smakebuf",
|
|
"___snprintf_chk",
|
|
"___snprintf_object_size_chk",
|
|
"___split_page",
|
|
"___sprintf_chk",
|
|
"___sprintf_object_size_chk",
|
|
"___sread",
|
|
"___srefill",
|
|
"___srget",
|
|
"___sseek",
|
|
"___stack_chk_fail",
|
|
"___stack_chk_guard",
|
|
"___stderrp",
|
|
"___stdinp",
|
|
"___stdoutp",
|
|
"___stpcpy_chk",
|
|
"___stpncpy_chk",
|
|
"___strcat_chk",
|
|
"___strcp_D2A",
|
|
"___strcpy_chk",
|
|
"___strlcat_chk",
|
|
"___strlcpy_chk",
|
|
"___strncat_chk",
|
|
"___strncpy_chk",
|
|
"___strtodg",
|
|
"___strtopdd",
|
|
"___sum_D2A",
|
|
"___svfscanf",
|
|
"___swbuf",
|
|
"___swhatbuf",
|
|
"___swrite",
|
|
"___swsetup",
|
|
"___tens_D2A",
|
|
"___tinytens_D2A",
|
|
"___tolower",
|
|
"___tolower_l",
|
|
"___toupper",
|
|
"___toupper_l",
|
|
"___trailz_D2A",
|
|
"___ulp_D2A",
|
|
"___ungetc",
|
|
"___ungetwc",
|
|
"___vsnprintf_chk",
|
|
"___vsprintf_chk",
|
|
"___wcwidth",
|
|
"___wcwidth_l",
|
|
"__allocenvstate",
|
|
"__atexit_receipt",
|
|
"__c_locale",
|
|
"__cleanup",
|
|
"__closeutx",
|
|
"__copyenv",
|
|
"__cthread_init_routine",
|
|
"__deallocenvstate",
|
|
"__endutxent",
|
|
"__flockfile_debug_stub",
|
|
"__fseeko",
|
|
"__ftello",
|
|
"__fwalk",
|
|
"__getenvp",
|
|
"__getutxent",
|
|
"__getutxid",
|
|
"__getutxline",
|
|
"__inet_aton_check",
|
|
"__init_clock_port",
|
|
"__int_to_time",
|
|
"__libc_fork_child",
|
|
"__libc_initializer",
|
|
"__long_to_time",
|
|
"__mkpath_np",
|
|
"__mktemp",
|
|
"__openutx",
|
|
"__os_assert_log",
|
|
"__os_assert_log_ctx",
|
|
"__os_assumes_log",
|
|
"__os_assumes_log_ctx",
|
|
"__os_avoid_tail_call",
|
|
"__os_crash",
|
|
"__os_crash_callback",
|
|
"__os_crash_fmt",
|
|
"__os_debug_log",
|
|
"__os_debug_log_error_str",
|
|
"__putenvp",
|
|
"__pututxline",
|
|
"__rand48_add",
|
|
"__rand48_mult",
|
|
"__rand48_seed",
|
|
"__readdir_unlocked",
|
|
"__reclaim_telldir",
|
|
"__seekdir",
|
|
"__setenvp",
|
|
"__setutxent",
|
|
"__sigaction_nobind",
|
|
"__sigintr",
|
|
"__signal_nobind",
|
|
"__sigvec_nobind",
|
|
"__sread",
|
|
"__sseek",
|
|
"__subsystem_init",
|
|
"__swrite",
|
|
"__time32_to_time",
|
|
"__time64_to_time",
|
|
"__time_to_int",
|
|
"__time_to_long",
|
|
"__time_to_time32",
|
|
"__time_to_time64",
|
|
"__unsetenvp",
|
|
"__utmpxname",
|
|
"_a64l",
|
|
"_abort",
|
|
"_abort_report_np",
|
|
"_abs",
|
|
"_acl_add_flag_np",
|
|
"_acl_add_perm",
|
|
"_acl_calc_mask",
|
|
"_acl_clear_flags_np",
|
|
"_acl_clear_perms",
|
|
"_acl_copy_entry",
|
|
"_acl_copy_ext",
|
|
"_acl_copy_ext_native",
|
|
"_acl_copy_int",
|
|
"_acl_copy_int_native",
|
|
"_acl_create_entry",
|
|
"_acl_create_entry_np",
|
|
"_acl_delete_def_file",
|
|
"_acl_delete_entry",
|
|
"_acl_delete_fd_np",
|
|
"_acl_delete_file_np",
|
|
"_acl_delete_flag_np",
|
|
"_acl_delete_link_np",
|
|
"_acl_delete_perm",
|
|
"_acl_dup",
|
|
"_acl_free",
|
|
"_acl_from_text",
|
|
"_acl_get_entry",
|
|
"_acl_get_fd",
|
|
"_acl_get_fd_np",
|
|
"_acl_get_file",
|
|
"_acl_get_flag_np",
|
|
"_acl_get_flagset_np",
|
|
"_acl_get_link_np",
|
|
"_acl_get_perm_np",
|
|
"_acl_get_permset",
|
|
"_acl_get_permset_mask_np",
|
|
"_acl_get_qualifier",
|
|
"_acl_get_tag_type",
|
|
"_acl_init",
|
|
"_acl_maximal_permset_mask_np",
|
|
"_acl_set_fd",
|
|
"_acl_set_fd_np",
|
|
"_acl_set_file",
|
|
"_acl_set_flagset_np",
|
|
"_acl_set_link_np",
|
|
"_acl_set_permset",
|
|
"_acl_set_permset_mask_np",
|
|
"_acl_set_qualifier",
|
|
"_acl_set_tag_type",
|
|
"_acl_size",
|
|
"_acl_to_text",
|
|
"_acl_valid",
|
|
"_acl_valid_fd_np",
|
|
"_acl_valid_file_np",
|
|
"_acl_valid_link",
|
|
"_addr2ascii",
|
|
"_alarm",
|
|
"_alphasort",
|
|
"_arc4random",
|
|
"_arc4random_addrandom",
|
|
"_arc4random_buf",
|
|
"_arc4random_stir",
|
|
"_arc4random_uniform",
|
|
"_ascii2addr",
|
|
"_asctime",
|
|
"_asctime_r",
|
|
"_asprintf",
|
|
"_asprintf_l",
|
|
"_asxprintf",
|
|
"_asxprintf_exec",
|
|
"_atexit",
|
|
"_atexit_b",
|
|
"_atof",
|
|
"_atof_l",
|
|
"_atoi",
|
|
"_atoi_l",
|
|
"_atol",
|
|
"_atol_l",
|
|
"_atoll",
|
|
"_atoll_l",
|
|
"_backtrace",
|
|
"_backtrace_from_fp",
|
|
"_backtrace_image_offsets",
|
|
"_backtrace_symbols",
|
|
"_backtrace_symbols_fd",
|
|
"_basename",
|
|
"_basename_r",
|
|
"_bcopy",
|
|
"_brk",
|
|
"_bsd_signal",
|
|
"_bsearch",
|
|
"_bsearch_b",
|
|
"_btowc",
|
|
"_btowc_l",
|
|
"_catclose",
|
|
"_catgets",
|
|
"_catopen",
|
|
"_cfgetispeed",
|
|
"_cfgetospeed",
|
|
"_cfmakeraw",
|
|
"_cfsetispeed",
|
|
"_cfsetospeed",
|
|
"_cfsetspeed",
|
|
"_cgetcap",
|
|
"_cgetclose",
|
|
"_cgetent",
|
|
"_cgetfirst",
|
|
"_cgetmatch",
|
|
"_cgetnext",
|
|
"_cgetnum",
|
|
"_cgetset",
|
|
"_cgetstr",
|
|
"_cgetustr",
|
|
"_chmodx_np",
|
|
"_clearerr",
|
|
"_clearerr_unlocked",
|
|
"_clock",
|
|
"_clock_getres",
|
|
"_clock_gettime",
|
|
"_clock_gettime_nsec_np",
|
|
"_clock_port",
|
|
"_clock_sem",
|
|
"_clock_settime",
|
|
"_closedir",
|
|
"_compat_mode",
|
|
"_confstr",
|
|
"_copy_printf_domain",
|
|
"_creat",
|
|
"_crypt",
|
|
"_ctermid",
|
|
"_ctermid_r",
|
|
"_ctime",
|
|
"_ctime_r",
|
|
"_daemon",
|
|
"_daylight",
|
|
"_dbm_clearerr",
|
|
"_dbm_close",
|
|
"_dbm_delete",
|
|
"_dbm_dirfno",
|
|
"_dbm_error",
|
|
"_dbm_fetch",
|
|
"_dbm_firstkey",
|
|
"_dbm_nextkey",
|
|
"_dbm_open",
|
|
"_dbm_store",
|
|
"_dbopen",
|
|
"_devname",
|
|
"_devname_r",
|
|
"_difftime",
|
|
"_digittoint",
|
|
"_digittoint_l",
|
|
"_dirfd",
|
|
"_dirname",
|
|
"_dirname_r",
|
|
"_div",
|
|
"_dprintf",
|
|
"_dprintf_l",
|
|
"_drand48",
|
|
"_duplocale",
|
|
"_dxprintf",
|
|
"_dxprintf_exec",
|
|
"_ecvt",
|
|
"_encrypt",
|
|
"_endttyent",
|
|
"_endusershell",
|
|
"_endutxent",
|
|
"_endutxent_wtmp",
|
|
"_erand48",
|
|
"_err",
|
|
"_err_set_exit",
|
|
"_err_set_exit_b",
|
|
"_err_set_file",
|
|
"_errc",
|
|
"_errx",
|
|
"_execl",
|
|
"_execle",
|
|
"_execlp",
|
|
"_execv",
|
|
"_execvP",
|
|
"_execvp",
|
|
"_exit",
|
|
"_f_prealloc",
|
|
"_fchmodx_np",
|
|
"_fclose",
|
|
"_fcvt",
|
|
"_fdopen",
|
|
"_fdopendir",
|
|
"_feof",
|
|
"_feof_unlocked",
|
|
"_ferror",
|
|
"_ferror_unlocked",
|
|
"_fflagstostr",
|
|
"_fflush",
|
|
"_fgetc",
|
|
"_fgetln",
|
|
"_fgetpos",
|
|
"_fgetrune",
|
|
"_fgets",
|
|
"_fgetwc",
|
|
"_fgetwc_l",
|
|
"_fgetwln",
|
|
"_fgetwln_l",
|
|
"_fgetws",
|
|
"_fgetws_l",
|
|
"_fileno",
|
|
"_fileno_unlocked",
|
|
"_filesec_dup",
|
|
"_filesec_free",
|
|
"_filesec_get_property",
|
|
"_filesec_init",
|
|
"_filesec_query_property",
|
|
"_filesec_set_property",
|
|
"_filesec_unset_property",
|
|
"_flockfile",
|
|
"_fmemopen",
|
|
"_fmtcheck",
|
|
"_fmtmsg",
|
|
"_fnmatch",
|
|
"_fopen",
|
|
"_fork",
|
|
"_forkpty",
|
|
"_fparseln",
|
|
"_fprintf",
|
|
"_fprintf_l",
|
|
"_fpurge",
|
|
"_fputc",
|
|
"_fputrune",
|
|
"_fputs",
|
|
"_fputwc",
|
|
"_fputwc_l",
|
|
"_fputws",
|
|
"_fputws_l",
|
|
"_fread",
|
|
"_free_printf_comp",
|
|
"_free_printf_domain",
|
|
"_freelocale",
|
|
"_freopen",
|
|
"_fscanf",
|
|
"_fscanf_l",
|
|
"_fseek",
|
|
"_fseeko",
|
|
"_fsetpos",
|
|
"_fstatvfs",
|
|
"_fstatx_np",
|
|
"_fsync_volume_np",
|
|
"_ftell",
|
|
"_ftello",
|
|
"_ftime",
|
|
"_ftok",
|
|
"_ftrylockfile",
|
|
"_fts_children",
|
|
"_fts_close",
|
|
"_fts_open",
|
|
"_fts_open_b",
|
|
"_fts_read",
|
|
"_fts_set",
|
|
"_ftw",
|
|
"_fungetrune",
|
|
"_funlockfile",
|
|
"_funopen",
|
|
"_fwide",
|
|
"_fwprintf",
|
|
"_fwprintf_l",
|
|
"_fwrite",
|
|
"_fwscanf",
|
|
"_fwscanf_l",
|
|
"_fxprintf",
|
|
"_fxprintf_exec",
|
|
"_gcvt",
|
|
"_getbsize",
|
|
"_getc",
|
|
"_getc_unlocked",
|
|
"_getchar",
|
|
"_getchar_unlocked",
|
|
"_getcwd",
|
|
"_getdate",
|
|
"_getdate_err",
|
|
"_getdelim",
|
|
"_getdiskbyname",
|
|
"_getenv",
|
|
"_gethostid",
|
|
"_gethostname",
|
|
"_getipv4sourcefilter",
|
|
"_getlastlogx",
|
|
"_getlastlogxbyname",
|
|
"_getline",
|
|
"_getloadavg",
|
|
"_getlogin",
|
|
"_getlogin_r",
|
|
"_getmntinfo",
|
|
"_getmntinfo_r_np",
|
|
"_getmode",
|
|
"_getopt",
|
|
"_getopt_long",
|
|
"_getopt_long_only",
|
|
"_getpagesize",
|
|
"_getpass",
|
|
"_getpeereid",
|
|
"_getprogname",
|
|
"_gets",
|
|
"_getsourcefilter",
|
|
"_getsubopt",
|
|
"_gettimeofday",
|
|
"_getttyent",
|
|
"_getttynam",
|
|
"_getusershell",
|
|
"_getutmp",
|
|
"_getutmpx",
|
|
"_getutxent",
|
|
"_getutxent_wtmp",
|
|
"_getutxid",
|
|
"_getutxline",
|
|
"_getvfsbyname",
|
|
"_getw",
|
|
"_getwc",
|
|
"_getwc_l",
|
|
"_getwchar",
|
|
"_getwchar_l",
|
|
"_getwd",
|
|
"_glob",
|
|
"_glob_b",
|
|
"_globfree",
|
|
"_gmtime",
|
|
"_gmtime_r",
|
|
"_grantpt",
|
|
"_hash_create",
|
|
"_hash_destroy",
|
|
"_hash_purge",
|
|
"_hash_search",
|
|
"_hash_stats",
|
|
"_hash_traverse",
|
|
"_hcreate",
|
|
"_hdestroy",
|
|
"_heapsort",
|
|
"_heapsort_b",
|
|
"_hsearch",
|
|
"_imaxabs",
|
|
"_imaxdiv",
|
|
"_inet_addr",
|
|
"_inet_aton",
|
|
"_inet_lnaof",
|
|
"_inet_makeaddr",
|
|
"_inet_net_ntop",
|
|
"_inet_net_pton",
|
|
"_inet_neta",
|
|
"_inet_netof",
|
|
"_inet_network",
|
|
"_inet_nsap_addr",
|
|
"_inet_nsap_ntoa",
|
|
"_inet_ntoa",
|
|
"_inet_ntop",
|
|
"_inet_ntop4",
|
|
"_inet_ntop6",
|
|
"_inet_pton",
|
|
"_initstate",
|
|
"_insque",
|
|
"_isalnum",
|
|
"_isalnum_l",
|
|
"_isalpha",
|
|
"_isalpha_l",
|
|
"_isascii",
|
|
"_isatty",
|
|
"_isblank",
|
|
"_isblank_l",
|
|
"_iscntrl",
|
|
"_iscntrl_l",
|
|
"_isdigit",
|
|
"_isdigit_l",
|
|
"_isgraph",
|
|
"_isgraph_l",
|
|
"_ishexnumber",
|
|
"_ishexnumber_l",
|
|
"_isideogram",
|
|
"_isideogram_l",
|
|
"_islower",
|
|
"_islower_l",
|
|
"_isnumber",
|
|
"_isnumber_l",
|
|
"_isphonogram",
|
|
"_isphonogram_l",
|
|
"_isprint",
|
|
"_isprint_l",
|
|
"_ispunct",
|
|
"_ispunct_l",
|
|
"_isrune",
|
|
"_isrune_l",
|
|
"_isspace",
|
|
"_isspace_l",
|
|
"_isspecial",
|
|
"_isspecial_l",
|
|
"_isupper",
|
|
"_isupper_l",
|
|
"_iswalnum",
|
|
"_iswalnum_l",
|
|
"_iswalpha",
|
|
"_iswalpha_l",
|
|
"_iswascii",
|
|
"_iswblank",
|
|
"_iswblank_l",
|
|
"_iswcntrl",
|
|
"_iswcntrl_l",
|
|
"_iswctype",
|
|
"_iswctype_l",
|
|
"_iswdigit",
|
|
"_iswdigit_l",
|
|
"_iswgraph",
|
|
"_iswgraph_l",
|
|
"_iswhexnumber",
|
|
"_iswhexnumber_l",
|
|
"_iswideogram",
|
|
"_iswideogram_l",
|
|
"_iswlower",
|
|
"_iswlower_l",
|
|
"_iswnumber",
|
|
"_iswnumber_l",
|
|
"_iswphonogram",
|
|
"_iswphonogram_l",
|
|
"_iswprint",
|
|
"_iswprint_l",
|
|
"_iswpunct",
|
|
"_iswpunct_l",
|
|
"_iswrune",
|
|
"_iswrune_l",
|
|
"_iswspace",
|
|
"_iswspace_l",
|
|
"_iswspecial",
|
|
"_iswspecial_l",
|
|
"_iswupper",
|
|
"_iswupper_l",
|
|
"_iswxdigit",
|
|
"_iswxdigit_l",
|
|
"_isxdigit",
|
|
"_isxdigit_l",
|
|
"_jrand48",
|
|
"_kOSThermalNotificationPressureLevelName",
|
|
"_killpg",
|
|
"_l64a",
|
|
"_labs",
|
|
"_lchflags",
|
|
"_lchmod",
|
|
"_lcong48",
|
|
"_ldiv",
|
|
"_lfind",
|
|
"_link_addr",
|
|
"_link_ntoa",
|
|
"_llabs",
|
|
"_lldiv",
|
|
"_localeconv",
|
|
"_localeconv_l",
|
|
"_localtime",
|
|
"_localtime_r",
|
|
"_lockf",
|
|
"_login",
|
|
"_login_tty",
|
|
"_logout",
|
|
"_logwtmp",
|
|
"_lrand48",
|
|
"_lsearch",
|
|
"_lstatx_np",
|
|
"_lutimes",
|
|
"_mblen",
|
|
"_mblen_l",
|
|
"_mbmb",
|
|
"_mbrlen",
|
|
"_mbrlen_l",
|
|
"_mbrrune",
|
|
"_mbrtowc",
|
|
"_mbrtowc_l",
|
|
"_mbrune",
|
|
"_mbsinit",
|
|
"_mbsinit_l",
|
|
"_mbsnrtowcs",
|
|
"_mbsnrtowcs_l",
|
|
"_mbsrtowcs",
|
|
"_mbsrtowcs_l",
|
|
"_mbstowcs",
|
|
"_mbstowcs_l",
|
|
"_mbtowc",
|
|
"_mbtowc_l",
|
|
"_memmem",
|
|
"_memset_s",
|
|
"_mergesort",
|
|
"_mergesort_b",
|
|
"_mkdirx_np",
|
|
"_mkdtemp",
|
|
"_mkdtempat_np",
|
|
"_mkfifox_np",
|
|
"_mkostemp",
|
|
"_mkostemps",
|
|
"_mkostempsat_np",
|
|
"_mkpath_np",
|
|
"_mkpathat_np",
|
|
"_mkstemp",
|
|
"_mkstemp_dprotected_np",
|
|
"_mkstemps",
|
|
"_mkstempsat_np",
|
|
"_mktemp",
|
|
"_mktime",
|
|
"_monaddition",
|
|
"_moncontrol",
|
|
"_moncount",
|
|
"_moninit",
|
|
"_monitor",
|
|
"_monoutput",
|
|
"_monreset",
|
|
"_monstartup",
|
|
"_mpool_close",
|
|
"_mpool_filter",
|
|
"_mpool_get",
|
|
"_mpool_new",
|
|
"_mpool_open",
|
|
"_mpool_put",
|
|
"_mpool_sync",
|
|
"_mrand48",
|
|
"_nanosleep",
|
|
"_new_printf_comp",
|
|
"_new_printf_domain",
|
|
"_newlocale",
|
|
"_nextwctype",
|
|
"_nextwctype_l",
|
|
"_nftw",
|
|
"_nice",
|
|
"_nl_langinfo",
|
|
"_nl_langinfo_l",
|
|
"_nrand48",
|
|
"_nvis",
|
|
"_off32",
|
|
"_off64",
|
|
"_offtime",
|
|
"_open_memstream",
|
|
"_open_with_subsystem",
|
|
"_open_wmemstream",
|
|
"_opendev",
|
|
"_opendir",
|
|
"_openpty",
|
|
"_openx_np",
|
|
"_optarg",
|
|
"_opterr",
|
|
"_optind",
|
|
"_optopt",
|
|
"_optreset",
|
|
"_pause",
|
|
"_pclose",
|
|
"_perror",
|
|
"_popen",
|
|
"_posix2time",
|
|
"_posix_openpt",
|
|
"_posix_spawnp",
|
|
"_printf",
|
|
"_printf_l",
|
|
"_psignal",
|
|
"_psort",
|
|
"_psort_b",
|
|
"_psort_r",
|
|
"_ptsname",
|
|
"_ptsname_r",
|
|
"_putc",
|
|
"_putc_unlocked",
|
|
"_putchar",
|
|
"_putchar_unlocked",
|
|
"_putenv",
|
|
"_puts",
|
|
"_pututxline",
|
|
"_putw",
|
|
"_putwc",
|
|
"_putwc_l",
|
|
"_putwchar",
|
|
"_putwchar_l",
|
|
"_qsort",
|
|
"_qsort_b",
|
|
"_qsort_r",
|
|
"_querylocale",
|
|
"_radixsort",
|
|
"_raise",
|
|
"_rand",
|
|
"_rand_r",
|
|
"_random",
|
|
"_rb_tree_count",
|
|
"_rb_tree_find_node",
|
|
"_rb_tree_find_node_geq",
|
|
"_rb_tree_find_node_leq",
|
|
"_rb_tree_init",
|
|
"_rb_tree_insert_node",
|
|
"_rb_tree_iterate",
|
|
"_rb_tree_remove_node",
|
|
"_readdir",
|
|
"_readdir_r",
|
|
"_readpassphrase",
|
|
"_reallocf",
|
|
"_realpath",
|
|
"_recv",
|
|
"_regcomp",
|
|
"_regcomp_l",
|
|
"_regerror",
|
|
"_regexec",
|
|
"_regfree",
|
|
"_register_printf_domain_function",
|
|
"_register_printf_domain_render_std",
|
|
"_regncomp",
|
|
"_regncomp_l",
|
|
"_regnexec",
|
|
"_regwcomp",
|
|
"_regwcomp_l",
|
|
"_regwexec",
|
|
"_regwncomp",
|
|
"_regwncomp_l",
|
|
"_regwnexec",
|
|
"_remove",
|
|
"_remque",
|
|
"_rewind",
|
|
"_rewinddir",
|
|
"_rindex",
|
|
"_rpmatch",
|
|
"_sbrk",
|
|
"_scandir",
|
|
"_scandir_b",
|
|
"_scanf",
|
|
"_scanf_l",
|
|
"_seed48",
|
|
"_seekdir",
|
|
"_send",
|
|
"_setbuf",
|
|
"_setbuffer",
|
|
"_setenv",
|
|
"_sethostid",
|
|
"_sethostname",
|
|
"_setinvalidrune",
|
|
"_setipv4sourcefilter",
|
|
"_setkey",
|
|
"_setlinebuf",
|
|
"_setlocale",
|
|
"_setlogin",
|
|
"_setmode",
|
|
"_setpgrp",
|
|
"_setprogname",
|
|
"_setrgid",
|
|
"_setruid",
|
|
"_setrunelocale",
|
|
"_setsourcefilter",
|
|
"_setstate",
|
|
"_settimeofday",
|
|
"_setttyent",
|
|
"_setusershell",
|
|
"_setutxent",
|
|
"_setutxent_wtmp",
|
|
"_setvbuf",
|
|
"_sigaction",
|
|
"_sigaddset",
|
|
"_sigaltstack",
|
|
"_sigblock",
|
|
"_sigdelset",
|
|
"_sigemptyset",
|
|
"_sigfillset",
|
|
"_sighold",
|
|
"_sigignore",
|
|
"_siginterrupt",
|
|
"_sigismember",
|
|
"_signal",
|
|
"_sigpause",
|
|
"_sigrelse",
|
|
"_sigset",
|
|
"_sigsetmask",
|
|
"_sigvec",
|
|
"_skip",
|
|
"_sl_add",
|
|
"_sl_find",
|
|
"_sl_free",
|
|
"_sl_init",
|
|
"_sleep",
|
|
"_snprintf",
|
|
"_snprintf_l",
|
|
"_snvis",
|
|
"_sockatmark",
|
|
"_sprintf",
|
|
"_sprintf_l",
|
|
"_sradixsort",
|
|
"_srand",
|
|
"_srand48",
|
|
"_sranddev",
|
|
"_srandom",
|
|
"_srandomdev",
|
|
"_sscanf",
|
|
"_sscanf_l",
|
|
"_stat_with_subsystem",
|
|
"_statvfs",
|
|
"_statx_np",
|
|
"_stpcpy",
|
|
"_stpncpy",
|
|
"_strcasecmp",
|
|
"_strcasecmp_l",
|
|
"_strcasestr",
|
|
"_strcasestr_l",
|
|
"_strcat",
|
|
"_strcoll",
|
|
"_strcoll_l",
|
|
"_strcspn",
|
|
"_strdup",
|
|
"_strenvisx",
|
|
"_strerror",
|
|
"_strerror_r",
|
|
"_strfmon",
|
|
"_strfmon_l",
|
|
"_strftime",
|
|
"_strftime_l",
|
|
"_strmode",
|
|
"_strncasecmp",
|
|
"_strncasecmp_l",
|
|
"_strncat",
|
|
"_strndup",
|
|
"_strnstr",
|
|
"_strnunvis",
|
|
"_strnunvisx",
|
|
"_strnvis",
|
|
"_strnvisx",
|
|
"_strpbrk",
|
|
"_strptime",
|
|
"_strptime_l",
|
|
"_strrchr",
|
|
"_strsenvisx",
|
|
"_strsep",
|
|
"_strsignal",
|
|
"_strsignal_r",
|
|
"_strsnvis",
|
|
"_strsnvisx",
|
|
"_strspn",
|
|
"_strsvis",
|
|
"_strsvisx",
|
|
"_strtod",
|
|
"_strtod_l",
|
|
"_strtof",
|
|
"_strtof_l",
|
|
"_strtofflags",
|
|
"_strtoimax",
|
|
"_strtoimax_l",
|
|
"_strtok",
|
|
"_strtok_r",
|
|
"_strtol",
|
|
"_strtol_l",
|
|
"_strtold",
|
|
"_strtold_l",
|
|
"_strtoll",
|
|
"_strtoll_l",
|
|
"_strtonum",
|
|
"_strtoq",
|
|
"_strtoq_l",
|
|
"_strtoul",
|
|
"_strtoul_l",
|
|
"_strtoull",
|
|
"_strtoull_l",
|
|
"_strtoumax",
|
|
"_strtoumax_l",
|
|
"_strtouq",
|
|
"_strtouq_l",
|
|
"_strunvis",
|
|
"_strunvisx",
|
|
"_strvis",
|
|
"_strvisx",
|
|
"_strxfrm",
|
|
"_strxfrm_l",
|
|
"_suboptarg",
|
|
"_svis",
|
|
"_swab",
|
|
"_swprintf",
|
|
"_swprintf_l",
|
|
"_swscanf",
|
|
"_swscanf_l",
|
|
"_sxprintf",
|
|
"_sxprintf_exec",
|
|
"_sync_volume_np",
|
|
"_sys_errlist",
|
|
"_sys_nerr",
|
|
"_sys_siglist",
|
|
"_sys_signame",
|
|
"_sysconf",
|
|
"_sysctl",
|
|
"_sysctlbyname",
|
|
"_sysctlnametomib",
|
|
"_system",
|
|
"_tcdrain",
|
|
"_tcflow",
|
|
"_tcflush",
|
|
"_tcgetattr",
|
|
"_tcgetpgrp",
|
|
"_tcgetsid",
|
|
"_tcsendbreak",
|
|
"_tcsetattr",
|
|
"_tcsetpgrp",
|
|
"_tdelete",
|
|
"_telldir",
|
|
"_tempnam",
|
|
"_tfind",
|
|
"_thread_stack_pcs",
|
|
"_time",
|
|
"_time2posix",
|
|
"_timegm",
|
|
"_timelocal",
|
|
"_timeoff",
|
|
"_times",
|
|
"_timespec_get",
|
|
"_timezone",
|
|
"_timingsafe_bcmp",
|
|
"_tmpfile",
|
|
"_tmpnam",
|
|
"_toascii",
|
|
"_tolower",
|
|
"_tolower_l",
|
|
"_toupper",
|
|
"_toupper_l",
|
|
"_towctrans",
|
|
"_towctrans_l",
|
|
"_towlower",
|
|
"_towlower_l",
|
|
"_towupper",
|
|
"_towupper_l",
|
|
"_tre_ast_new_catenation",
|
|
"_tre_ast_new_iter",
|
|
"_tre_ast_new_literal",
|
|
"_tre_ast_new_node",
|
|
"_tre_ast_new_union",
|
|
"_tre_compile",
|
|
"_tre_fill_pmatch",
|
|
"_tre_free",
|
|
"_tre_mem_alloc_impl",
|
|
"_tre_mem_destroy",
|
|
"_tre_mem_new_impl",
|
|
"_tre_parse",
|
|
"_tre_stack_destroy",
|
|
"_tre_stack_new",
|
|
"_tre_stack_num_objects",
|
|
"_tre_tnfa_run_backtrack",
|
|
"_tre_tnfa_run_parallel",
|
|
"_tsearch",
|
|
"_ttyname",
|
|
"_ttyname_r",
|
|
"_ttyslot",
|
|
"_twalk",
|
|
"_tzname",
|
|
"_tzset",
|
|
"_tzsetwall",
|
|
"_ualarm",
|
|
"_ulimit",
|
|
"_umaskx_np",
|
|
"_uname",
|
|
"_ungetc",
|
|
"_ungetwc",
|
|
"_ungetwc_l",
|
|
"_unlockpt",
|
|
"_unsetenv",
|
|
"_unvis",
|
|
"_uselocale",
|
|
"_usleep",
|
|
"_utime",
|
|
"_utmpxname",
|
|
"_uuid_clear",
|
|
"_uuid_compare",
|
|
"_uuid_copy",
|
|
"_uuid_generate",
|
|
"_uuid_generate_random",
|
|
"_uuid_generate_time",
|
|
"_uuid_is_null",
|
|
"_uuid_pack",
|
|
"_uuid_parse",
|
|
"_uuid_unpack",
|
|
"_uuid_unparse",
|
|
"_uuid_unparse_lower",
|
|
"_uuid_unparse_upper",
|
|
"_vasprintf",
|
|
"_vasprintf_l",
|
|
"_vasxprintf",
|
|
"_vasxprintf_exec",
|
|
"_vdprintf",
|
|
"_vdprintf_l",
|
|
"_vdxprintf",
|
|
"_vdxprintf_exec",
|
|
"_verr",
|
|
"_verrc",
|
|
"_verrx",
|
|
"_vfprintf",
|
|
"_vfprintf_l",
|
|
"_vfscanf",
|
|
"_vfscanf_l",
|
|
"_vfwprintf",
|
|
"_vfwprintf_l",
|
|
"_vfwscanf",
|
|
"_vfwscanf_l",
|
|
"_vfxprintf",
|
|
"_vfxprintf_exec",
|
|
"_vis",
|
|
"_vprintf",
|
|
"_vprintf_l",
|
|
"_vscanf",
|
|
"_vscanf_l",
|
|
"_vsnprintf",
|
|
"_vsnprintf_l",
|
|
"_vsprintf",
|
|
"_vsprintf_l",
|
|
"_vsscanf",
|
|
"_vsscanf_l",
|
|
"_vswprintf",
|
|
"_vswprintf_l",
|
|
"_vswscanf",
|
|
"_vswscanf_l",
|
|
"_vsxprintf",
|
|
"_vsxprintf_exec",
|
|
"_vwarn",
|
|
"_vwarnc",
|
|
"_vwarnx",
|
|
"_vwprintf",
|
|
"_vwprintf_l",
|
|
"_vwscanf",
|
|
"_vwscanf_l",
|
|
"_vxprintf",
|
|
"_vxprintf_exec",
|
|
"_wait",
|
|
"_wait3",
|
|
"_waitpid",
|
|
"_warn",
|
|
"_warnc",
|
|
"_warnx",
|
|
"_wcpcpy",
|
|
"_wcpncpy",
|
|
"_wcrtomb",
|
|
"_wcrtomb_l",
|
|
"_wcscasecmp",
|
|
"_wcscasecmp_l",
|
|
"_wcscat",
|
|
"_wcschr",
|
|
"_wcscmp",
|
|
"_wcscoll",
|
|
"_wcscoll_l",
|
|
"_wcscpy",
|
|
"_wcscspn",
|
|
"_wcsdup",
|
|
"_wcsftime",
|
|
"_wcsftime_l",
|
|
"_wcslcat",
|
|
"_wcslcpy",
|
|
"_wcslen",
|
|
"_wcsncasecmp",
|
|
"_wcsncasecmp_l",
|
|
"_wcsncat",
|
|
"_wcsncmp",
|
|
"_wcsncpy",
|
|
"_wcsnlen",
|
|
"_wcsnrtombs",
|
|
"_wcsnrtombs_l",
|
|
"_wcspbrk",
|
|
"_wcsrchr",
|
|
"_wcsrtombs",
|
|
"_wcsrtombs_l",
|
|
"_wcsspn",
|
|
"_wcsstr",
|
|
"_wcstod",
|
|
"_wcstod_l",
|
|
"_wcstof",
|
|
"_wcstof_l",
|
|
"_wcstoimax",
|
|
"_wcstoimax_l",
|
|
"_wcstok",
|
|
"_wcstol",
|
|
"_wcstol_l",
|
|
"_wcstold",
|
|
"_wcstold_l",
|
|
"_wcstoll",
|
|
"_wcstoll_l",
|
|
"_wcstombs",
|
|
"_wcstombs_l",
|
|
"_wcstoul",
|
|
"_wcstoul_l",
|
|
"_wcstoull",
|
|
"_wcstoull_l",
|
|
"_wcstoumax",
|
|
"_wcstoumax_l",
|
|
"_wcswidth",
|
|
"_wcswidth_l",
|
|
"_wcsxfrm",
|
|
"_wcsxfrm_l",
|
|
"_wctob",
|
|
"_wctob_l",
|
|
"_wctomb",
|
|
"_wctomb_l",
|
|
"_wctrans",
|
|
"_wctrans_l",
|
|
"_wctype",
|
|
"_wctype_l",
|
|
"_wcwidth",
|
|
"_wcwidth_l",
|
|
"_wmemchr",
|
|
"_wmemcmp",
|
|
"_wmemcpy",
|
|
"_wmemmove",
|
|
"_wmemset",
|
|
"_wordexp",
|
|
"_wordfree",
|
|
"_wprintf",
|
|
"_wprintf_l",
|
|
"_wscanf",
|
|
"_wscanf_l",
|
|
"_wtmpxname",
|
|
"_xprintf",
|
|
"_xprintf_exec",
|
|
)
|
|
|
|
|
|
def print_here_head(name):
|
|
print(
|
|
"""\
|
|
(tee %s.s |llvm-mc -filetype=obj -triple %s -o %s.o) <<END_OF_FILE &"""
|
|
% (name, triple, name)
|
|
)
|
|
|
|
|
|
def print_here_tail():
|
|
print(
|
|
"""\
|
|
END_OF_FILE
|
|
"""
|
|
)
|
|
|
|
|
|
def print_function_head(p2align, name):
|
|
if args.os == "macos":
|
|
print(
|
|
"""\
|
|
.section __TEXT,__text,regular,pure_instructions
|
|
.p2align %d, 0x90
|
|
.globl _%s
|
|
_%s:"""
|
|
% (p2align, name, name)
|
|
)
|
|
elif args.os == "windows":
|
|
print(
|
|
"""\
|
|
.text
|
|
.def %s;
|
|
.scl 2;
|
|
.type 32;
|
|
.endef
|
|
.globl %s
|
|
.p2align %d
|
|
%s:"""
|
|
% (name, name, p2align, name)
|
|
)
|
|
elif args.os == "linux":
|
|
print(
|
|
"""\
|
|
.text
|
|
.p2align %d
|
|
.globl %s
|
|
%s:"""
|
|
% (p2align, name, name)
|
|
)
|
|
|
|
|
|
def print_function(addr, size, addrs):
|
|
name = "x%08x" % addr
|
|
calls = random.randint(0, size >> 12)
|
|
print_here_head(name)
|
|
print(
|
|
"""\
|
|
### %s size=%x calls=%x"""
|
|
% (name, size, calls)
|
|
)
|
|
print_function_head(4, name)
|
|
for i in range(calls):
|
|
print(
|
|
" bl %sx%08x\n .p2align 4"
|
|
% (
|
|
"_" if args.os == "macos" else "",
|
|
addrs[random.randint(0, len(addrs) - 1)],
|
|
)
|
|
)
|
|
if args.os == "macos":
|
|
print(
|
|
" bl %s\n .p2align 4"
|
|
% (libSystem_calls[random.randint(0, len(libSystem_calls) - 1)])
|
|
)
|
|
fill = size - 4 * (calls + 1)
|
|
assert fill > 0
|
|
print(
|
|
"""\
|
|
.fill 0x%x
|
|
ret"""
|
|
% (fill)
|
|
)
|
|
print_here_tail()
|
|
|
|
|
|
def random_seed():
|
|
"""Generate a seed that can easily be passed back in via --seed=STRING"""
|
|
return "".join(random.choice(string.ascii_lowercase) for i in range(10))
|
|
|
|
|
|
def generate_sizes(base, megabytes):
|
|
total = 0
|
|
while total < megabytes:
|
|
size = random.randint(0x100, 0x10000) * 0x10
|
|
yield size
|
|
total += size
|
|
|
|
|
|
def generate_addrs(addr, sizes):
|
|
i = 0
|
|
while i < len(sizes):
|
|
yield addr
|
|
addr += sizes[i]
|
|
i += 1
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(
|
|
description=__doc__,
|
|
epilog="""\
|
|
WRITEME
|
|
""",
|
|
)
|
|
parser.add_argument(
|
|
"--seed",
|
|
type=str,
|
|
default=random_seed(),
|
|
help="Seed the random number generator",
|
|
)
|
|
parser.add_argument(
|
|
"--size",
|
|
type=int,
|
|
default=None,
|
|
help="Total text size to generate, in megabytes",
|
|
)
|
|
parser.add_argument(
|
|
"--os", type=str, default="macos", help="Target OS: macos, windows, or linux"
|
|
)
|
|
global args
|
|
args = parser.parse_args()
|
|
triples = {
|
|
"macos": "arm64-apple-macos",
|
|
"linux": "aarch64-pc-linux",
|
|
"windows": "aarch64-pc-windows",
|
|
}
|
|
global triple
|
|
triple = triples.get(args.os)
|
|
|
|
print(
|
|
"""\
|
|
### seed=%s triple=%s
|
|
"""
|
|
% (args.seed, triple)
|
|
)
|
|
|
|
random.seed(args.seed)
|
|
|
|
base = 0x4010
|
|
megabytes = (int(args.size) if args.size else 512) * 1024 * 1024
|
|
sizes = [size for size in generate_sizes(base, megabytes)]
|
|
addrs = [addr for addr in generate_addrs(base, sizes)]
|
|
|
|
for i in range(len(addrs)):
|
|
print_function(addrs[i], sizes[i], addrs)
|
|
|
|
print_here_head("main")
|
|
print(
|
|
"""\
|
|
### _x%08x
|
|
"""
|
|
% (addrs[-1] + sizes[-1])
|
|
)
|
|
print_function_head(14 if args.os == "macos" else 4, "main")
|
|
print(" ret")
|
|
print_here_tail()
|
|
print("wait")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|