1#!/usr/bin/env python3 2 3"""Generate many skeletal functions with a thick call graph spanning a 4large address space to induce lld to create branch-islands for arm64. 5 6""" 7from __future__ import print_function 8import random 9import argparse 10import string 11from pprint import pprint 12from math import factorial 13from itertools import permutations 14 15# This list comes from libSystem.tbd and contains a sizeable subset 16# of dylib calls available for all MacOS target archs. 17libSystem_calls = ( 18 "__CurrentRuneLocale", "__DefaultRuneLocale", "__Exit", "__NSGetArgc", 19 "__NSGetArgv", "__NSGetEnviron", "__NSGetMachExecuteHeader", 20 "__NSGetProgname", "__PathLocale", "__Read_RuneMagi", "___Balloc_D2A", 21 "___Bfree_D2A", "___ULtod_D2A", "____mb_cur_max", "____mb_cur_max_l", 22 "____runetype", "____runetype_l", "____tolower", "____tolower_l", 23 "____toupper", "____toupper_l", "___add_ovflpage", "___addel", 24 "___any_on_D2A", "___assert_rtn", "___b2d_D2A", "___big_delete", 25 "___big_insert", "___big_keydata", "___big_return", "___big_split", 26 "___bigtens_D2A", "___bt_close", "___bt_cmp", "___bt_defcmp", 27 "___bt_defpfx", "___bt_delete", "___bt_dleaf", "___bt_fd", 28 "___bt_free", "___bt_get", "___bt_new", "___bt_open", "___bt_pgin", 29 "___bt_pgout", "___bt_put", "___bt_ret", "___bt_search", "___bt_seq", 30 "___bt_setcur", "___bt_split", "___bt_sync", "___buf_free", 31 "___call_hash", "___cleanup", "___cmp_D2A", "___collate_equiv_match", 32 "___collate_load_error", "___collate_lookup", "___collate_lookup_l", 33 "___copybits_D2A", "___cxa_atexit", "___cxa_finalize", 34 "___cxa_finalize_ranges", "___cxa_thread_atexit", "___d2b_D2A", 35 "___dbpanic", "___decrement_D2A", "___default_hash", "___default_utx", 36 "___delpair", "___diff_D2A", "___dtoa", "___expand_table", 37 "___fflush", "___fgetwc", "___find_bigpair", "___find_last_page", 38 "___fix_locale_grouping_str", "___fread", "___free_ovflpage", 39 "___freedtoa", "___gdtoa", "___gdtoa_locks", "___get_buf", 40 "___get_page", "___gethex_D2A", "___getonlyClocaleconv", 41 "___hash_open", "___hdtoa", "___hexdig_D2A", "___hexdig_init_D2A", 42 "___hexnan_D2A", "___hi0bits_D2A", "___hldtoa", "___i2b_D2A", 43 "___ibitmap", "___increment_D2A", "___isctype", "___istype", 44 "___istype_l", "___ldtoa", "___libc_init", "___lo0bits_D2A", 45 "___log2", "___lshift_D2A", "___maskrune", "___maskrune_l", 46 "___match_D2A", "___mb_cur_max", "___mb_sb_limit", "___memccpy_chk", 47 "___memcpy_chk", "___memmove_chk", "___memset_chk", "___mult_D2A", 48 "___multadd_D2A", "___nrv_alloc_D2A", "___opendir2", "___ovfl_delete", 49 "___ovfl_get", "___ovfl_put", "___pow5mult_D2A", "___put_page", 50 "___quorem_D2A", "___ratio_D2A", "___rec_close", "___rec_delete", 51 "___rec_dleaf", "___rec_fd", "___rec_fmap", "___rec_fpipe", 52 "___rec_get", "___rec_iput", "___rec_open", "___rec_put", 53 "___rec_ret", "___rec_search", "___rec_seq", "___rec_sync", 54 "___rec_vmap", "___rec_vpipe", "___reclaim_buf", "___rshift_D2A", 55 "___rv_alloc_D2A", "___s2b_D2A", "___sF", "___sclose", "___sdidinit", 56 "___set_ones_D2A", "___setonlyClocaleconv", "___sflags", "___sflush", 57 "___sfp", "___sfvwrite", "___sglue", "___sinit", "___slbexpand", 58 "___smakebuf", "___snprintf_chk", "___snprintf_object_size_chk", 59 "___split_page", "___sprintf_chk", "___sprintf_object_size_chk", 60 "___sread", "___srefill", "___srget", "___sseek", "___stack_chk_fail", 61 "___stack_chk_guard", "___stderrp", "___stdinp", "___stdoutp", 62 "___stpcpy_chk", "___stpncpy_chk", "___strcat_chk", "___strcp_D2A", 63 "___strcpy_chk", "___strlcat_chk", "___strlcpy_chk", "___strncat_chk", 64 "___strncpy_chk", "___strtodg", "___strtopdd", "___sum_D2A", 65 "___svfscanf", "___swbuf", "___swhatbuf", "___swrite", "___swsetup", 66 "___tens_D2A", "___tinytens_D2A", "___tolower", "___tolower_l", 67 "___toupper", "___toupper_l", "___trailz_D2A", "___ulp_D2A", 68 "___ungetc", "___ungetwc", "___vsnprintf_chk", "___vsprintf_chk", 69 "___wcwidth", "___wcwidth_l", "__allocenvstate", "__atexit_receipt", 70 "__c_locale", "__cleanup", "__closeutx", "__copyenv", 71 "__cthread_init_routine", "__deallocenvstate", "__endutxent", 72 "__flockfile_debug_stub", "__fseeko", "__ftello", "__fwalk", 73 "__getenvp", "__getutxent", "__getutxid", "__getutxline", 74 "__inet_aton_check", "__init_clock_port", "__int_to_time", 75 "__libc_fork_child", "__libc_initializer", "__long_to_time", 76 "__mkpath_np", "__mktemp", "__openutx", "__os_assert_log", 77 "__os_assert_log_ctx", "__os_assumes_log", "__os_assumes_log_ctx", 78 "__os_avoid_tail_call", "__os_crash", "__os_crash_callback", 79 "__os_crash_fmt", "__os_debug_log", "__os_debug_log_error_str", 80 "__putenvp", "__pututxline", "__rand48_add", "__rand48_mult", 81 "__rand48_seed", "__readdir_unlocked", "__reclaim_telldir", 82 "__seekdir", "__setenvp", "__setutxent", "__sigaction_nobind", 83 "__sigintr", "__signal_nobind", "__sigvec_nobind", "__sread", 84 "__sseek", "__subsystem_init", "__swrite", "__time32_to_time", 85 "__time64_to_time", "__time_to_int", "__time_to_long", 86 "__time_to_time32", "__time_to_time64", "__unsetenvp", "__utmpxname", 87 "_a64l", "_abort", "_abort_report_np", "_abs", "_acl_add_flag_np", 88 "_acl_add_perm", "_acl_calc_mask", "_acl_clear_flags_np", 89 "_acl_clear_perms", "_acl_copy_entry", "_acl_copy_ext", 90 "_acl_copy_ext_native", "_acl_copy_int", "_acl_copy_int_native", 91 "_acl_create_entry", "_acl_create_entry_np", "_acl_delete_def_file", 92 "_acl_delete_entry", "_acl_delete_fd_np", "_acl_delete_file_np", 93 "_acl_delete_flag_np", "_acl_delete_link_np", "_acl_delete_perm", 94 "_acl_dup", "_acl_free", "_acl_from_text", "_acl_get_entry", 95 "_acl_get_fd", "_acl_get_fd_np", "_acl_get_file", "_acl_get_flag_np", 96 "_acl_get_flagset_np", "_acl_get_link_np", "_acl_get_perm_np", 97 "_acl_get_permset", "_acl_get_permset_mask_np", "_acl_get_qualifier", 98 "_acl_get_tag_type", "_acl_init", "_acl_maximal_permset_mask_np", 99 "_acl_set_fd", "_acl_set_fd_np", "_acl_set_file", "_acl_set_flagset_np", 100 "_acl_set_link_np", "_acl_set_permset", "_acl_set_permset_mask_np", 101 "_acl_set_qualifier", "_acl_set_tag_type", "_acl_size", "_acl_to_text", 102 "_acl_valid", "_acl_valid_fd_np", "_acl_valid_file_np", 103 "_acl_valid_link", "_addr2ascii", "_alarm", "_alphasort", 104 "_arc4random", "_arc4random_addrandom", "_arc4random_buf", 105 "_arc4random_stir", "_arc4random_uniform", "_ascii2addr", "_asctime", 106 "_asctime_r", "_asprintf", "_asprintf_l", "_asxprintf", 107 "_asxprintf_exec", "_atexit", "_atexit_b", "_atof", "_atof_l", 108 "_atoi", "_atoi_l", "_atol", "_atol_l", "_atoll", "_atoll_l", 109 "_backtrace", "_backtrace_from_fp", "_backtrace_image_offsets", 110 "_backtrace_symbols", "_backtrace_symbols_fd", "_basename", 111 "_basename_r", "_bcopy", "_brk", "_bsd_signal", "_bsearch", 112 "_bsearch_b", "_btowc", "_btowc_l", "_catclose", "_catgets", 113 "_catopen", "_cfgetispeed", "_cfgetospeed", "_cfmakeraw", 114 "_cfsetispeed", "_cfsetospeed", "_cfsetspeed", "_cgetcap", 115 "_cgetclose", "_cgetent", "_cgetfirst", "_cgetmatch", "_cgetnext", 116 "_cgetnum", "_cgetset", "_cgetstr", "_cgetustr", "_chmodx_np", 117 "_clearerr", "_clearerr_unlocked", "_clock", "_clock_getres", 118 "_clock_gettime", "_clock_gettime_nsec_np", "_clock_port", 119 "_clock_sem", "_clock_settime", "_closedir", "_compat_mode", 120 "_confstr", "_copy_printf_domain", "_creat", "_crypt", "_ctermid", 121 "_ctermid_r", "_ctime", "_ctime_r", "_daemon", "_daylight", 122 "_dbm_clearerr", "_dbm_close", "_dbm_delete", "_dbm_dirfno", 123 "_dbm_error", "_dbm_fetch", "_dbm_firstkey", "_dbm_nextkey", 124 "_dbm_open", "_dbm_store", "_dbopen", "_devname", "_devname_r", 125 "_difftime", "_digittoint", "_digittoint_l", "_dirfd", "_dirname", 126 "_dirname_r", "_div", "_dprintf", "_dprintf_l", "_drand48", 127 "_duplocale", "_dxprintf", "_dxprintf_exec", "_ecvt", "_encrypt", 128 "_endttyent", "_endusershell", "_endutxent", "_endutxent_wtmp", 129 "_erand48", "_err", "_err_set_exit", "_err_set_exit_b", 130 "_err_set_file", "_errc", "_errx", "_execl", "_execle", "_execlp", 131 "_execv", "_execvP", "_execvp", "_exit", "_f_prealloc", "_fchmodx_np", 132 "_fclose", "_fcvt", "_fdopen", "_fdopendir", "_feof", "_feof_unlocked", 133 "_ferror", "_ferror_unlocked", "_fflagstostr", "_fflush", "_fgetc", 134 "_fgetln", "_fgetpos", "_fgetrune", "_fgets", "_fgetwc", "_fgetwc_l", 135 "_fgetwln", "_fgetwln_l", "_fgetws", "_fgetws_l", "_fileno", 136 "_fileno_unlocked", "_filesec_dup", "_filesec_free", 137 "_filesec_get_property", "_filesec_init", "_filesec_query_property", 138 "_filesec_set_property", "_filesec_unset_property", "_flockfile", 139 "_fmemopen", "_fmtcheck", "_fmtmsg", "_fnmatch", "_fopen", "_fork", 140 "_forkpty", "_fparseln", "_fprintf", "_fprintf_l", "_fpurge", 141 "_fputc", "_fputrune", "_fputs", "_fputwc", "_fputwc_l", "_fputws", 142 "_fputws_l", "_fread", "_free_printf_comp", "_free_printf_domain", 143 "_freelocale", "_freopen", "_fscanf", "_fscanf_l", "_fseek", 144 "_fseeko", "_fsetpos", "_fstatvfs", "_fstatx_np", "_fsync_volume_np", 145 "_ftell", "_ftello", "_ftime", "_ftok", "_ftrylockfile", 146 "_fts_children", "_fts_close", "_fts_open", "_fts_open_b", 147 "_fts_read", "_fts_set", "_ftw", "_fungetrune", "_funlockfile", 148 "_funopen", "_fwide", "_fwprintf", "_fwprintf_l", "_fwrite", 149 "_fwscanf", "_fwscanf_l", "_fxprintf", "_fxprintf_exec", "_gcvt", 150 "_getbsize", "_getc", "_getc_unlocked", "_getchar", "_getchar_unlocked", 151 "_getcwd", "_getdate", "_getdate_err", "_getdelim", "_getdiskbyname", 152 "_getenv", "_gethostid", "_gethostname", "_getipv4sourcefilter", 153 "_getlastlogx", "_getlastlogxbyname", "_getline", "_getloadavg", 154 "_getlogin", "_getlogin_r", "_getmntinfo", "_getmntinfo_r_np", 155 "_getmode", "_getopt", "_getopt_long", "_getopt_long_only", 156 "_getpagesize", "_getpass", "_getpeereid", "_getprogname", "_gets", 157 "_getsourcefilter", "_getsubopt", "_gettimeofday", "_getttyent", 158 "_getttynam", "_getusershell", "_getutmp", "_getutmpx", "_getutxent", 159 "_getutxent_wtmp", "_getutxid", "_getutxline", "_getvfsbyname", 160 "_getw", "_getwc", "_getwc_l", "_getwchar", "_getwchar_l", "_getwd", 161 "_glob", "_glob_b", "_globfree", "_gmtime", "_gmtime_r", "_grantpt", 162 "_hash_create", "_hash_destroy", "_hash_purge", "_hash_search", 163 "_hash_stats", "_hash_traverse", "_hcreate", "_hdestroy", 164 "_heapsort", "_heapsort_b", "_hsearch", "_imaxabs", "_imaxdiv", 165 "_inet_addr", "_inet_aton", "_inet_lnaof", "_inet_makeaddr", 166 "_inet_net_ntop", "_inet_net_pton", "_inet_neta", "_inet_netof", 167 "_inet_network", "_inet_nsap_addr", "_inet_nsap_ntoa", "_inet_ntoa", 168 "_inet_ntop", "_inet_ntop4", "_inet_ntop6", "_inet_pton", 169 "_initstate", "_insque", "_isalnum", "_isalnum_l", "_isalpha", 170 "_isalpha_l", "_isascii", "_isatty", "_isblank", "_isblank_l", 171 "_iscntrl", "_iscntrl_l", "_isdigit", "_isdigit_l", "_isgraph", 172 "_isgraph_l", "_ishexnumber", "_ishexnumber_l", "_isideogram", 173 "_isideogram_l", "_islower", "_islower_l", "_isnumber", "_isnumber_l", 174 "_isphonogram", "_isphonogram_l", "_isprint", "_isprint_l", 175 "_ispunct", "_ispunct_l", "_isrune", "_isrune_l", "_isspace", 176 "_isspace_l", "_isspecial", "_isspecial_l", "_isupper", "_isupper_l", 177 "_iswalnum", "_iswalnum_l", "_iswalpha", "_iswalpha_l", "_iswascii", 178 "_iswblank", "_iswblank_l", "_iswcntrl", "_iswcntrl_l", "_iswctype", 179 "_iswctype_l", "_iswdigit", "_iswdigit_l", "_iswgraph", "_iswgraph_l", 180 "_iswhexnumber", "_iswhexnumber_l", "_iswideogram", "_iswideogram_l", 181 "_iswlower", "_iswlower_l", "_iswnumber", "_iswnumber_l", 182 "_iswphonogram", "_iswphonogram_l", "_iswprint", "_iswprint_l", 183 "_iswpunct", "_iswpunct_l", "_iswrune", "_iswrune_l", "_iswspace", 184 "_iswspace_l", "_iswspecial", "_iswspecial_l", "_iswupper", 185 "_iswupper_l", "_iswxdigit", "_iswxdigit_l", "_isxdigit", 186 "_isxdigit_l", "_jrand48", "_kOSThermalNotificationPressureLevelName", 187 "_killpg", "_l64a", "_labs", "_lchflags", "_lchmod", "_lcong48", 188 "_ldiv", "_lfind", "_link_addr", "_link_ntoa", "_llabs", "_lldiv", 189 "_localeconv", "_localeconv_l", "_localtime", "_localtime_r", 190 "_lockf", "_login", "_login_tty", "_logout", "_logwtmp", "_lrand48", 191 "_lsearch", "_lstatx_np", "_lutimes", "_mblen", "_mblen_l", 192 "_mbmb", "_mbrlen", "_mbrlen_l", "_mbrrune", "_mbrtowc", "_mbrtowc_l", 193 "_mbrune", "_mbsinit", "_mbsinit_l", "_mbsnrtowcs", "_mbsnrtowcs_l", 194 "_mbsrtowcs", "_mbsrtowcs_l", "_mbstowcs", "_mbstowcs_l", "_mbtowc", 195 "_mbtowc_l", "_memmem", "_memset_s", "_mergesort", "_mergesort_b", 196 "_mkdirx_np", "_mkdtemp", "_mkdtempat_np", "_mkfifox_np", 197 "_mkostemp", "_mkostemps", "_mkostempsat_np", "_mkpath_np", 198 "_mkpathat_np", "_mkstemp", "_mkstemp_dprotected_np", "_mkstemps", 199 "_mkstempsat_np", "_mktemp", "_mktime", "_monaddition", "_moncontrol", 200 "_moncount", "_moninit", "_monitor", "_monoutput", "_monreset", 201 "_monstartup", "_mpool_close", "_mpool_filter", "_mpool_get", 202 "_mpool_new", "_mpool_open", "_mpool_put", "_mpool_sync", "_mrand48", 203 "_nanosleep", "_new_printf_comp", "_new_printf_domain", "_newlocale", 204 "_nextwctype", "_nextwctype_l", "_nftw", "_nice", "_nl_langinfo", 205 "_nl_langinfo_l", "_nrand48", "_nvis", "_off32", "_off64", 206 "_offtime", "_open_memstream", "_open_with_subsystem", 207 "_open_wmemstream", "_opendev", "_opendir", "_openpty", "_openx_np", 208 "_optarg", "_opterr", "_optind", "_optopt", "_optreset", "_pause", 209 "_pclose", "_perror", "_popen", "_posix2time", "_posix_openpt", 210 "_posix_spawnp", "_printf", "_printf_l", "_psignal", "_psort", 211 "_psort_b", "_psort_r", "_ptsname", "_ptsname_r", "_putc", 212 "_putc_unlocked", "_putchar", "_putchar_unlocked", "_putenv", 213 "_puts", "_pututxline", "_putw", "_putwc", "_putwc_l", "_putwchar", 214 "_putwchar_l", "_qsort", "_qsort_b", "_qsort_r", "_querylocale", 215 "_radixsort", "_raise", "_rand", "_rand_r", "_random", "_rb_tree_count", 216 "_rb_tree_find_node", "_rb_tree_find_node_geq", "_rb_tree_find_node_leq", 217 "_rb_tree_init", "_rb_tree_insert_node", "_rb_tree_iterate", 218 "_rb_tree_remove_node", "_readdir", "_readdir_r", "_readpassphrase", 219 "_reallocf", "_realpath", "_recv", "_regcomp", "_regcomp_l", 220 "_regerror", "_regexec", "_regfree", "_register_printf_domain_function", 221 "_register_printf_domain_render_std", "_regncomp", "_regncomp_l", 222 "_regnexec", "_regwcomp", "_regwcomp_l", "_regwexec", "_regwncomp", 223 "_regwncomp_l", "_regwnexec", "_remove", "_remque", "_rewind", 224 "_rewinddir", "_rindex", "_rpmatch", "_sbrk", "_scandir", 225 "_scandir_b", "_scanf", "_scanf_l", "_seed48", "_seekdir", "_send", 226 "_setbuf", "_setbuffer", "_setenv", "_sethostid", "_sethostname", 227 "_setinvalidrune", "_setipv4sourcefilter", "_setkey", "_setlinebuf", 228 "_setlocale", "_setlogin", "_setmode", "_setpgrp", "_setprogname", 229 "_setrgid", "_setruid", "_setrunelocale", "_setsourcefilter", 230 "_setstate", "_settimeofday", "_setttyent", "_setusershell", 231 "_setutxent", "_setutxent_wtmp", "_setvbuf", "_sigaction", 232 "_sigaddset", "_sigaltstack", "_sigblock", "_sigdelset", 233 "_sigemptyset", "_sigfillset", "_sighold", "_sigignore", 234 "_siginterrupt", "_sigismember", "_signal", "_sigpause", "_sigrelse", 235 "_sigset", "_sigsetmask", "_sigvec", "_skip", "_sl_add", "_sl_find", 236 "_sl_free", "_sl_init", "_sleep", "_snprintf", "_snprintf_l", 237 "_snvis", "_sockatmark", "_sprintf", "_sprintf_l", "_sradixsort", 238 "_srand", "_srand48", "_sranddev", "_srandom", "_srandomdev", 239 "_sscanf", "_sscanf_l", "_stat_with_subsystem", "_statvfs", 240 "_statx_np", "_stpcpy", "_stpncpy", "_strcasecmp", "_strcasecmp_l", 241 "_strcasestr", "_strcasestr_l", "_strcat", "_strcoll", "_strcoll_l", 242 "_strcspn", "_strdup", "_strenvisx", "_strerror", "_strerror_r", 243 "_strfmon", "_strfmon_l", "_strftime", "_strftime_l", "_strmode", 244 "_strncasecmp", "_strncasecmp_l", "_strncat", "_strndup", "_strnstr", 245 "_strnunvis", "_strnunvisx", "_strnvis", "_strnvisx", "_strpbrk", 246 "_strptime", "_strptime_l", "_strrchr", "_strsenvisx", "_strsep", 247 "_strsignal", "_strsignal_r", "_strsnvis", "_strsnvisx", "_strspn", 248 "_strsvis", "_strsvisx", "_strtod", "_strtod_l", "_strtof", 249 "_strtof_l", "_strtofflags", "_strtoimax", "_strtoimax_l", 250 "_strtok", "_strtok_r", "_strtol", "_strtol_l", "_strtold", 251 "_strtold_l", "_strtoll", "_strtoll_l", "_strtonum", "_strtoq", 252 "_strtoq_l", "_strtoul", "_strtoul_l", "_strtoull", "_strtoull_l", 253 "_strtoumax", "_strtoumax_l", "_strtouq", "_strtouq_l", "_strunvis", 254 "_strunvisx", "_strvis", "_strvisx", "_strxfrm", "_strxfrm_l", 255 "_suboptarg", "_svis", "_swab", "_swprintf", "_swprintf_l", 256 "_swscanf", "_swscanf_l", "_sxprintf", "_sxprintf_exec", 257 "_sync_volume_np", "_sys_errlist", "_sys_nerr", "_sys_siglist", 258 "_sys_signame", "_sysconf", "_sysctl", "_sysctlbyname", 259 "_sysctlnametomib", "_system", "_tcdrain", "_tcflow", "_tcflush", 260 "_tcgetattr", "_tcgetpgrp", "_tcgetsid", "_tcsendbreak", "_tcsetattr", 261 "_tcsetpgrp", "_tdelete", "_telldir", "_tempnam", "_tfind", 262 "_thread_stack_pcs", "_time", "_time2posix", "_timegm", "_timelocal", 263 "_timeoff", "_times", "_timespec_get", "_timezone", "_timingsafe_bcmp", 264 "_tmpfile", "_tmpnam", "_toascii", "_tolower", "_tolower_l", 265 "_toupper", "_toupper_l", "_towctrans", "_towctrans_l", "_towlower", 266 "_towlower_l", "_towupper", "_towupper_l", "_tre_ast_new_catenation", 267 "_tre_ast_new_iter", "_tre_ast_new_literal", "_tre_ast_new_node", 268 "_tre_ast_new_union", "_tre_compile", "_tre_fill_pmatch", 269 "_tre_free", "_tre_mem_alloc_impl", "_tre_mem_destroy", 270 "_tre_mem_new_impl", "_tre_parse", "_tre_stack_destroy", 271 "_tre_stack_new", "_tre_stack_num_objects", "_tre_tnfa_run_backtrack", 272 "_tre_tnfa_run_parallel", "_tsearch", "_ttyname", "_ttyname_r", 273 "_ttyslot", "_twalk", "_tzname", "_tzset", "_tzsetwall", "_ualarm", 274 "_ulimit", "_umaskx_np", "_uname", "_ungetc", "_ungetwc", 275 "_ungetwc_l", "_unlockpt", "_unsetenv", "_unvis", "_uselocale", 276 "_usleep", "_utime", "_utmpxname", "_uuid_clear", "_uuid_compare", 277 "_uuid_copy", "_uuid_generate", "_uuid_generate_random", 278 "_uuid_generate_time", "_uuid_is_null", "_uuid_pack", "_uuid_parse", 279 "_uuid_unpack", "_uuid_unparse", "_uuid_unparse_lower", 280 "_uuid_unparse_upper", "_vasprintf", "_vasprintf_l", "_vasxprintf", 281 "_vasxprintf_exec", "_vdprintf", "_vdprintf_l", "_vdxprintf", 282 "_vdxprintf_exec", "_verr", "_verrc", "_verrx", "_vfprintf", 283 "_vfprintf_l", "_vfscanf", "_vfscanf_l", "_vfwprintf", "_vfwprintf_l", 284 "_vfwscanf", "_vfwscanf_l", "_vfxprintf", "_vfxprintf_exec", 285 "_vis", "_vprintf", "_vprintf_l", "_vscanf", "_vscanf_l", 286 "_vsnprintf", "_vsnprintf_l", "_vsprintf", "_vsprintf_l", "_vsscanf", 287 "_vsscanf_l", "_vswprintf", "_vswprintf_l", "_vswscanf", 288 "_vswscanf_l", "_vsxprintf", "_vsxprintf_exec", "_vwarn", "_vwarnc", 289 "_vwarnx", "_vwprintf", "_vwprintf_l", "_vwscanf", "_vwscanf_l", 290 "_vxprintf", "_vxprintf_exec", "_wait", "_wait3", "_waitpid", 291 "_warn", "_warnc", "_warnx", "_wcpcpy", "_wcpncpy", "_wcrtomb", 292 "_wcrtomb_l", "_wcscasecmp", "_wcscasecmp_l", "_wcscat", "_wcschr", 293 "_wcscmp", "_wcscoll", "_wcscoll_l", "_wcscpy", "_wcscspn", 294 "_wcsdup", "_wcsftime", "_wcsftime_l", "_wcslcat", "_wcslcpy", 295 "_wcslen", "_wcsncasecmp", "_wcsncasecmp_l", "_wcsncat", "_wcsncmp", 296 "_wcsncpy", "_wcsnlen", "_wcsnrtombs", "_wcsnrtombs_l", "_wcspbrk", 297 "_wcsrchr", "_wcsrtombs", "_wcsrtombs_l", "_wcsspn", "_wcsstr", 298 "_wcstod", "_wcstod_l", "_wcstof", "_wcstof_l", "_wcstoimax", 299 "_wcstoimax_l", "_wcstok", "_wcstol", "_wcstol_l", "_wcstold", 300 "_wcstold_l", "_wcstoll", "_wcstoll_l", "_wcstombs", "_wcstombs_l", 301 "_wcstoul", "_wcstoul_l", "_wcstoull", "_wcstoull_l", "_wcstoumax", 302 "_wcstoumax_l", "_wcswidth", "_wcswidth_l", "_wcsxfrm", "_wcsxfrm_l", 303 "_wctob", "_wctob_l", "_wctomb", "_wctomb_l", "_wctrans", 304 "_wctrans_l", "_wctype", "_wctype_l", "_wcwidth", "_wcwidth_l", 305 "_wmemchr", "_wmemcmp", "_wmemcpy", "_wmemmove", "_wmemset", 306 "_wordexp", "_wordfree", "_wprintf", "_wprintf_l", "_wscanf", 307 "_wscanf_l", "_wtmpxname", "_xprintf", "_xprintf_exec" 308) 309 310def print_here_head(name): 311 print("""\ 312(tee %s.s |llvm-mc -filetype=obj -triple %s -o %s.o) <<END_OF_FILE &""" % (name, triple, name)) 313 314def print_here_tail(): 315 print("""\ 316END_OF_FILE 317""") 318 319def print_function_head(p2align, name): 320 if args.os == "macos": 321 print("""\ 322 .section __TEXT,__text,regular,pure_instructions 323 .p2align %d, 0x90 324 .globl _%s 325_%s:""" % (p2align, name, name)) 326 elif args.os == "windows": 327 print("""\ 328 .text 329 .def %s; 330 .scl 2; 331 .type 32; 332 .endef 333 .globl %s 334 .p2align %d 335%s:""" % (name, name, p2align, name)) 336 elif args.os == "linux": 337 print("""\ 338 .text 339 .p2align %d 340 .globl %s 341%s:""" % (p2align, name, name)) 342 343def print_function(addr, size, addrs): 344 name = "x%08x" % addr 345 calls = random.randint(0, size>>12) 346 print_here_head(name) 347 print("""\ 348### %s size=%x calls=%x""" % (name, size, calls)) 349 print_function_head(4, name) 350 for i in range(calls): 351 print(" bl %sx%08x\n .p2align 4" % 352 ("_" if args.os == "macos" else "", 353 addrs[random.randint(0, len(addrs)-1)])) 354 if args.os == "macos": 355 print(" bl %s\n .p2align 4" % 356 (libSystem_calls[random.randint(0, len(libSystem_calls)-1)])) 357 fill = size - 4 * (calls + 1) 358 assert fill > 0 359 print("""\ 360 .fill 0x%x 361 ret""" % (fill)) 362 print_here_tail() 363 364def random_seed(): 365 """Generate a seed that can easily be passsed back in via --seed=STRING""" 366 return ''.join(random.choice(string.ascii_lowercase) for i in range(10)) 367 368def generate_sizes(base, megabytes): 369 total = 0 370 while total < megabytes: 371 size = random.randint(0x100, 0x10000) * 0x10 372 yield size 373 total += size 374 375def generate_addrs(addr, sizes): 376 i = 0 377 while i < len(sizes): 378 yield addr 379 addr += sizes[i] 380 i += 1 381 382def main(): 383 parser = argparse.ArgumentParser( 384 description=__doc__, 385 epilog="""\ 386WRITEME 387""") 388 parser.add_argument('--seed', type=str, default=random_seed(), 389 help='Seed the random number generator') 390 parser.add_argument('--size', type=int, default=None, 391 help='Total text size to generate, in megabytes') 392 parser.add_argument('--os', type=str, default="macos", 393 help='Target OS: macos, windows, or linux') 394 global args 395 args = parser.parse_args() 396 triples = { 397 "macos": "arm64-apple-macos", 398 "linux": "aarch64-pc-linux", 399 "windows": "aarch64-pc-windows" 400 } 401 global triple 402 triple = triples.get(args.os) 403 404 print("""\ 405### seed=%s triple=%s 406""" % (args.seed, triple)) 407 408 random.seed(args.seed) 409 410 base = 0x4010 411 megabytes = (int(args.size) if args.size else 512) * 1024 * 1024 412 sizes = [size for size in generate_sizes(base, megabytes)] 413 addrs = [addr for addr in generate_addrs(base, sizes)] 414 415 for i in range(len(addrs)): 416 print_function(addrs[i], sizes[i], addrs) 417 418 print_here_head("main") 419 print("""\ 420### _x%08x 421""" % (addrs[-1] + sizes[-1])) 422 print_function_head(14 if args.os == "macos" else 4, "main") 423 print(" ret") 424 print_here_tail() 425 print("wait") 426 427 428if __name__ == '__main__': 429 main() 430