just clear s1->static_link before loading msvcrt etc. Also: - configure: get cc_version/name when making a cross compiler too - configure: fix android triplets - Makefile: remove CONFIG_TCC_CROSS, check TCC_TARGET_xxx instead - libtcc.c: parse some linker option arguments more correctly - tccelf.c: fix a versym problem with clang on android - lib/Makefile, build-tcc.bat: bcheck.c now includes config.h
Unified · Split
| @@ -169,7 +169,6 @@ DEFINES += $(DEF-$(or $(findstring win,$T),unx)) · 168 unmodified lines | |||
| 169 | 169 | ||
| 170 | ifneq ($(X),) | 170 | ifneq ($(X),) |
| 171 | $(if $(DEF-$T),,$(error error: unknown target: '$T')) | 171 | $(if $(DEF-$T),,$(error error: unknown target: '$T')) |
| 172 | DEF-$T += -DCONFIG_TCC_CROSS | ||
| 173 | DEF-$(NATIVE_TARGET) = | 172 | DEF-$(NATIVE_TARGET) = |
| 174 | DEF-$T += -DCONFIG_TCC_CROSSPREFIX="\"$X\"" | 173 | DEF-$T += -DCONFIG_TCC_CROSSPREFIX="\"$X\"" |
| 175 | ifneq ($(CONFIG_WIN32),yes) | 174 | ifneq ($(CONFIG_WIN32),yes) |
| @@ -234,7 +233,9 @@ LIBTCC_INC = $(filter %.h %-gen.c %-link.c,$($T_FILES)) · 58 unmodified lines | |||
| 234 | TCC_FILES = $(X)tcc.o $(LIBTCC_OBJ) | 233 | TCC_FILES = $(X)tcc.o $(LIBTCC_OBJ) |
| 235 | $(X)tccpp.o : $(TCCDEFS_H) | 234 | $(X)tccpp.o : $(TCCDEFS_H) |
| 236 | $(X)libtcc.o : DEFINES += -DONE_SOURCE=0 | 235 | $(X)libtcc.o : DEFINES += -DONE_SOURCE=0 |
| 236 | $(CROSS_TARGET)-tcc.o : DEFINES += -DONE_SOURCE=0 | ||
| 237 | endif | 237 | endif |
| 238 | # native tcc always made from tcc.o and libtcc.[so|a] | ||
| 238 | tcc.o : DEFINES += -DONE_SOURCE=0 | 239 | tcc.o : DEFINES += -DONE_SOURCE=0 |
| 239 | DEFINES += -I$(TOP) | 240 | DEFINES += -I$(TOP) |
| 240 | 241 | ||
| @@ -464,7 +465,7 @@ tcov-tes% : tcc_c$(EXESUF) · 223 unmodified lines | |||
| 464 | tcc_c$(EXESUF): $($T_FILES) | 465 | tcc_c$(EXESUF): $($T_FILES) |
| 465 | $S$(TCC) tcc.c -o $@ -ftest-coverage $(DEFINES) $(LIBS) | 466 | $S$(TCC) tcc.c -o $@ -ftest-coverage $(DEFINES) $(LIBS) |
| 466 | # test the installed tcc instead | 467 | # test the installed tcc instead |
| 467 | test-install: tccdefs_.h | 468 | test-install: $(TCCDEFS_H) |
| 468 | @$(MAKE) -C tests TESTINSTALL=yes #_all | 469 | @$(MAKE) -C tests TESTINSTALL=yes #_all |
| 469 | 470 | ||
| 470 | clean: | 471 | clean: |
| @@ -384,12 +384,12 @@ case $targetos in · 383 unmodified lines | |||
| 384 | confvars_set Android new_dtags rpath=no | 384 | confvars_set Android new_dtags rpath=no |
| 385 | test "${cpu}" != "i386" && confvars_set pie | 385 | test "${cpu}" != "i386" && confvars_set pie |
| 386 | default_conf "static=no" | 386 | default_conf "static=no" |
| 387 | if test "${cpu}" = "arm"; then | 387 | case "$cpu" in |
| 388 | default triplet "arm-linux-androideabi" | 388 | arm) default triplet "arm-linux-androideabi"; cpuver=7 ;; |
| 389 | cpuver=7 | 389 | arm64) default triplet "aarch64-linux-android" ;; |
| 390 | else | 390 | x86_64) default triplet "x86_64-linux-android" ;; |
| 391 | default triplet "${cpu}-linux-android" | 391 | i386) default triplet "i686-linux-android" ;; |
| 392 | fi | 392 | esac |
| 393 | test "${cpu%64}" != "${cpu}" && S="64" || S="" | 393 | test "${cpu%64}" != "${cpu}" && S="64" || S="" |
| 394 | default tcc_sysincludepaths "{B}/include:{R}/include:{R}/include/${triplet}" | 394 | default tcc_sysincludepaths "{B}/include:{R}/include:{R}/include/${triplet}" |
| 395 | default tcc_libpaths "{B}:{R}/lib:/system/lib${S}" | 395 | default tcc_libpaths "{B}:{R}/lib:/system/lib${S}" |
| @@ -438,17 +438,27 @@ if test x"$show_help" = "xyes" ; then · 42 unmodified lines | |||
| 438 | show_help | 438 | show_help |
| 439 | fi | 439 | fi |
| 440 | 440 | ||
| 441 | if test -z "$build_cross"; then | 441 | CONFTEST=./conftest$EXESUF |
| 442 | CONFTEST=./conftest$EXESUF | 442 | if test -z "$cross_prefix" \ |
| 443 | if ! $cc -o $CONFTEST "$source_path/conftest.c" ; then | 443 | && $cc -o $CONFTEST "$source_path/conftest.c" \ |
| 444 | && $CONFTEST 2>/dev/null; then | ||
| 445 | cc_name="$($CONFTEST compiler)" | ||
| 446 | gcc_major="$($CONFTEST version)" | ||
| 447 | gcc_minor="$($CONFTEST minor)" | ||
| 448 | else | ||
| 449 | if test -z "$build_cross"; then | ||
| 444 | echo "configure: error: '$cc' failed to compile conftest.c." | 450 | echo "configure: error: '$cc' failed to compile conftest.c." |
| 445 | else | ||
| 446 | cc_name="$($CONFTEST compiler)" | ||
| 447 | gcc_major="$($CONFTEST version)" | ||
| 448 | gcc_minor="$($CONFTEST minor)" | ||
| 449 | bigendian="$($CONFTEST bigendian)" | ||
| 450 | _triplet="$($CONFTEST triplet)" | ||
| 451 | fi | 451 | fi |
| 452 | if test "${cc%tcc*}" != "$cc"; then | ||
| 453 | cc_name="tcc" | ||
| 454 | elif test "${cc%clang*}" != "$cc"; then | ||
| 455 | cc_name="clang" | ||
| 456 | fi | ||
| 457 | fi | ||
| 458 | |||
| 459 | if test -z "$build_cross"; then | ||
| 460 | bigendian="$($CONFTEST bigendian)" | ||
| 461 | _triplet="$($CONFTEST triplet)" | ||
| 452 | if test "$mingw32" = "no" ; then | 462 | if test "$mingw32" = "no" ; then |
| 453 | if test -z "$triplet" && test -n "$_triplet"; then | 463 | if test -z "$triplet" && test -n "$_triplet"; then |
| 454 | if test -f "/usr/lib/$_triplet/crti.o"; then | 464 | if test -f "/usr/lib/$_triplet/crti.o"; then |
| @@ -473,11 +483,6 @@ if test -z "$build_cross"; then · 18 unmodified lines | |||
| 473 | fi | 483 | fi |
| 474 | else | 484 | else |
| 475 | # can only make guesses about compiler and target | 485 | # can only make guesses about compiler and target |
| 476 | if test "${cc%tcc*}" != "$cc"; then | ||
| 477 | cc_name="tcc" | ||
| 478 | elif test "${cc%clang*}" != "$cc"; then | ||
| 479 | cc_name="clang" | ||
| 480 | fi | ||
| 481 | case $cpu in | 486 | case $cpu in |
| 482 | ppc|mips|s390) bigendian=yes;; | 487 | ppc|mips|s390) bigendian=yes;; |
| 483 | esac | 488 | esac |
| @@ -619,7 +624,8 @@ cat >$TMPH <<EOF · 135 unmodified lines | |||
| 619 | #define GCC_MAJOR $gcc_major | 624 | #define GCC_MAJOR $gcc_major |
| 620 | #define GCC_MINOR $gcc_minor | 625 | #define GCC_MINOR $gcc_minor |
| 621 | 626 | ||
| 622 | #if !CONFIG_TCC_CROSS | 627 | #if !(TCC_TARGET_I386 || TCC_TARGET_X86_64 || TCC_TARGET_ARM\ |
| 628 | || TCC_TARGET_ARM64 || TCC_TARGET_RISCV64 || TCC_TARGET_C67) | ||
| 623 | EOF | 629 | EOF |
| 624 | 630 | ||
| 625 | predefs=1 | 631 | predefs=1 |
| @@ -16,7 +16,7 @@ XCC = $(XTCC) · 15 unmodified lines | |||
| 16 | XAR = $(XTCC) -ar | 16 | XAR = $(XTCC) -ar |
| 17 | XFLAGS-unx = -B$(TOPSRC) | 17 | XFLAGS-unx = -B$(TOPSRC) |
| 18 | XFLAGS-win = -B$(TOPSRC)/win32 -I$(TOPSRC)/include | 18 | XFLAGS-win = -B$(TOPSRC)/win32 -I$(TOPSRC)/include |
| 19 | XFLAGS = $(XFLAGS$(XCFG)) -I$(TOP) | 19 | XFLAGS = $(XFLAGS$(XCFG)) |
| 20 | BFLAGS = -bt | 20 | BFLAGS = -bt |
| 21 | 21 | ||
| 22 | # in order to use gcc, type: make <target>-libtcc1-usegcc=yes | 22 | # in order to use gcc, type: make <target>-libtcc1-usegcc=yes |
| @@ -91,7 +91,7 @@ $(X)%.o : %.S $(TCC) · 68 unmodified lines | |||
| 91 | $(TOP)/%.o : %.c $(TCC) | 91 | $(TOP)/%.o : %.c $(TCC) |
| 92 | $S$(XCC) -c $< -o $@ $(XFLAGS) | 92 | $S$(XCC) -c $< -o $@ $(XFLAGS) |
| 93 | 93 | ||
| 94 | $(TOP)/bcheck.o : XFLAGS += $(BFLAGS) | 94 | $(TOP)/bcheck.o : XFLAGS += $(BFLAGS) -I$(TOP) |
| 95 | $(TOP)/bt-exe.o : $(TOP)/tccrun.c | 95 | $(TOP)/bt-exe.o : $(TOP)/tccrun.c |
| 96 | 96 | ||
| 97 | $(X)crt1w.o : crt1.c | 97 | $(X)crt1w.o : crt1.c |
| @@ -1194,11 +1194,9 @@ ST_FUNC int tcc_add_dll(TCCState *s, const char *filename, int flags) · 1193 unmodified lines | |||
| 1194 | /* find [cross-]libtcc1.a and tcc helper objects in library path */ | 1194 | /* find [cross-]libtcc1.a and tcc helper objects in library path */ |
| 1195 | ST_FUNC int tcc_add_support(TCCState *s1, const char *filename) | 1195 | ST_FUNC int tcc_add_support(TCCState *s1, const char *filename) |
| 1196 | { | 1196 | { |
| 1197 | #if CONFIG_TCC_CROSS | ||
| 1198 | char buf[100]; | 1197 | char buf[100]; |
| 1199 | if (CONFIG_TCC_CROSSPREFIX[0]) | 1198 | if (CONFIG_TCC_CROSSPREFIX[0]) |
| 1200 | filename = strcat(strcpy(buf, CONFIG_TCC_CROSSPREFIX), filename); | 1199 | filename = strcat(strcpy(buf, CONFIG_TCC_CROSSPREFIX), filename); |
| 1201 | #endif | ||
| 1202 | return tcc_add_dll(s1, filename, AFF_PRINT_ERROR); | 1200 | return tcc_add_dll(s1, filename, AFF_PRINT_ERROR); |
| 1203 | } | 1201 | } |
| 1204 | 1202 | ||
| @@ -1234,11 +1232,6 @@ LIBTCCAPI int tcc_add_library(TCCState *s, const char *libraryname) · 29 unmodified lines | |||
| 1234 | return ret; | 1232 | return ret; |
| 1235 | ++pp; | 1233 | ++pp; |
| 1236 | } | 1234 | } |
| 1237 | #if CONFIG_TCC_CROSS | ||
| 1238 | /* hack for '<cross>-tcc -nostdlib -ltcc1' to find <cross>-libtcc1.a */ | ||
| 1239 | if (0 == strcmp(libraryname, "tcc1")) | ||
| 1240 | return tcc_add_support(s, TCC_LIBTCC1); | ||
| 1241 | #endif | ||
| 1242 | return tcc_add_dll(s, libraryname, AFF_PRINT_ERROR); | 1235 | return tcc_add_dll(s, libraryname, AFF_PRINT_ERROR); |
| 1243 | } | 1236 | } |
| 1244 | 1237 | ||
| @@ -1343,6 +1336,12 @@ static int link_option(const char *str, const char *val, const char **ptr) · 98 unmodified lines | |||
| 1343 | return ret; | 1336 | return ret; |
| 1344 | } | 1337 | } |
| 1345 | 1338 | ||
| 1339 | static int link_arg(const char *opt, const char *str) | ||
| 1340 | { | ||
| 1341 | int l = strlen(opt); | ||
| 1342 | return 0 == strncmp(opt, str, l) && (str[l] == '\0' || str[l] == ','); | ||
| 1343 | } | ||
| 1344 | |||
| 1346 | static const char *skip_linker_arg(const char **str) | 1345 | static const char *skip_linker_arg(const char **str) |
| 1347 | { | 1346 | { |
| 1348 | const char *s1 = *str; | 1347 | const char *s1 = *str; |
| @@ -1410,10 +1409,10 @@ static int tcc_set_linker(TCCState *s, const char *option) · 61 unmodified lines | |||
| 1410 | if (strstart("elf32-", &p)) { | 1409 | if (strstart("elf32-", &p)) { |
| 1411 | #endif | 1410 | #endif |
| 1412 | s->output_format = TCC_OUTPUT_FORMAT_ELF; | 1411 | s->output_format = TCC_OUTPUT_FORMAT_ELF; |
| 1413 | } else if (!strcmp(p, "binary")) { | 1412 | } else if (link_arg("binary", p)) { |
| 1414 | s->output_format = TCC_OUTPUT_FORMAT_BINARY; | 1413 | s->output_format = TCC_OUTPUT_FORMAT_BINARY; |
| 1415 | #ifdef TCC_TARGET_COFF | 1414 | #ifdef TCC_TARGET_COFF |
| 1416 | } else if (!strcmp(p, "coff")) { | 1415 | } else if (link_arg("coff", p)) { |
| 1417 | s->output_format = TCC_OUTPUT_FORMAT_COFF; | 1416 | s->output_format = TCC_OUTPUT_FORMAT_COFF; |
| 1418 | #endif | 1417 | #endif |
| 1419 | } else | 1418 | } else |
| @@ -1446,24 +1445,24 @@ static int tcc_set_linker(TCCState *s, const char *option) · 26 unmodified lines | |||
| 1446 | s->pe_stack_size = strtoul(p, &end, 10); | 1445 | s->pe_stack_size = strtoul(p, &end, 10); |
| 1447 | } else if (link_option(option, "subsystem=", &p)) { | 1446 | } else if (link_option(option, "subsystem=", &p)) { |
| 1448 | #if defined(TCC_TARGET_I386) || defined(TCC_TARGET_X86_64) | 1447 | #if defined(TCC_TARGET_I386) || defined(TCC_TARGET_X86_64) |
| 1449 | if (strstart("native", &p)) { | 1448 | if (link_arg("native", p)) { |
| 1450 | s->pe_subsystem = 1; | 1449 | s->pe_subsystem = 1; |
| 1451 | } else if (strstart("console", &p)) { | 1450 | } else if (link_arg("console", p)) { |
| 1452 | s->pe_subsystem = 3; | 1451 | s->pe_subsystem = 3; |
| 1453 | } else if (strstart("gui", &p) || strstart("windows", &p)) { | 1452 | } else if (link_arg("gui", p) || link_arg("windows", p)) { |
| 1454 | s->pe_subsystem = 2; | 1453 | s->pe_subsystem = 2; |
| 1455 | } else if (strstart("posix", &p)) { | 1454 | } else if (link_arg("posix", p)) { |
| 1456 | s->pe_subsystem = 7; | 1455 | s->pe_subsystem = 7; |
| 1457 | } else if (strstart("efiapp", &p)) { | 1456 | } else if (link_arg("efiapp", p)) { |
| 1458 | s->pe_subsystem = 10; | 1457 | s->pe_subsystem = 10; |
| 1459 | } else if (strstart("efiboot", &p)) { | 1458 | } else if (link_arg("efiboot", p)) { |
| 1460 | s->pe_subsystem = 11; | 1459 | s->pe_subsystem = 11; |
| 1461 | } else if (strstart("efiruntime", &p)) { | 1460 | } else if (link_arg("efiruntime", p)) { |
| 1462 | s->pe_subsystem = 12; | 1461 | s->pe_subsystem = 12; |
| 1463 | } else if (strstart("efirom", &p)) { | 1462 | } else if (link_arg("efirom", p)) { |
| 1464 | s->pe_subsystem = 13; | 1463 | s->pe_subsystem = 13; |
| 1465 | #elif defined(TCC_TARGET_ARM) | 1464 | #elif defined(TCC_TARGET_ARM) |
| 1466 | if (strstart("wince", &p)) { | 1465 | if (link_arg("wince", p)) { |
| 1467 | s->pe_subsystem = 9; | 1466 | s->pe_subsystem = 9; |
| 1468 | #endif | 1467 | #endif |
| 1469 | } else | 1468 | } else |
| @@ -582,17 +582,24 @@ version_add (TCCState *s1) · 581 unmodified lines | |||
| 582 | for (sym_index = 1; sym_index < end_sym; ++sym_index) { | 582 | for (sym_index = 1; sym_index < end_sym; ++sym_index) { |
| 583 | int dllindex, verndx; | 583 | int dllindex, verndx; |
| 584 | sym = &((ElfW(Sym) *)symtab->data)[sym_index]; | 584 | sym = &((ElfW(Sym) *)symtab->data)[sym_index]; |
| 585 | if (sym->st_shndx != SHN_UNDEF) | ||
| 586 | continue; /* defined symbol doesn't need library version */ | ||
| 587 | name = (char *) symtab->link->data + sym->st_name; | 585 | name = (char *) symtab->link->data + sym->st_name; |
| 588 | dllindex = find_elf_sym(s1->dynsymtab_section, name); | 586 | dllindex = find_elf_sym(s1->dynsymtab_section, name); |
| 589 | verndx = (dllindex && dllindex < nb_sym_to_version) | 587 | verndx = (dllindex && dllindex < nb_sym_to_version) |
| 590 | ? sym_to_version[dllindex] : -1; | 588 | ? sym_to_version[dllindex] : -1; |
| 591 | if (verndx >= 0) { | 589 | if (verndx >= 0 |
| 590 | /* XXX: on android, clang refuses to link with a libtcc.so made by tcc | ||
| 591 | when defined symbols have a version > 1 or when the version is '0'. | ||
| 592 | Whereas version '1' for example for 'signal' in an exe defeats | ||
| 593 | bcheck's signal_redir. */ | ||
| 594 | && (sym->st_shndx == SHN_UNDEF || (s1->output_type & TCC_OUTPUT_EXE)) | ||
| 595 | ) { | ||
| 592 | if (!sym_versions[verndx].out_index) | 596 | if (!sym_versions[verndx].out_index) |
| 593 | sym_versions[verndx].out_index = nb_versions++; | 597 | sym_versions[verndx].out_index = nb_versions++; |
| 594 | versym[sym_index] = sym_versions[verndx].out_index; | 598 | versym[sym_index] = sym_versions[verndx].out_index; |
| 599 | } else { | ||
| 600 | versym[sym_index] = 1; /* (*global*) */ | ||
| 595 | } | 601 | } |
| 602 | //printf("SYM %d %s\n", versym[sym_index], name); | ||
| 596 | } | 603 | } |
| 597 | /* generate verneed section, but not when it will be empty. Some | 604 | /* generate verneed section, but not when it will be empty. Some |
| 598 | dynamic linkers look at their contents even when DTVERNEEDNUM and | 605 | dynamic linkers look at their contents even when DTVERNEEDNUM and |
| @@ -631,6 +638,7 @@ version_add (TCCState *s1) · 32 unmodified lines | |||
| 631 | sv->out_index = -2; | 638 | sv->out_index = -2; |
| 632 | vna->vna_name = put_elf_str(verneed_section->link, sv->version); | 639 | vna->vna_name = put_elf_str(verneed_section->link, sv->version); |
| 633 | vna->vna_next = sizeof (*vna); | 640 | vna->vna_next = sizeof (*vna); |
| 641 | //printf("LIB %d %s %s\n", vna->vna_other, sv->lib, verneed_section->link->data + vna->vna_name); | ||
| 634 | n_same_libs++; | 642 | n_same_libs++; |
| 635 | } | 643 | } |
| 636 | if (prev >= 0) | 644 | if (prev >= 0) |
| @@ -1909,6 +1909,7 @@ static void pe_add_runtime(TCCState *s1, struct pe_info *pe) · 1908 unmodified lines | |||
| 1909 | const char * const *pp, *p; | 1909 | const char * const *pp, *p; |
| 1910 | if (TCC_LIBTCC1[0]) | 1910 | if (TCC_LIBTCC1[0]) |
| 1911 | tcc_add_support(s1, TCC_LIBTCC1); | 1911 | tcc_add_support(s1, TCC_LIBTCC1); |
| 1912 | s1->static_link = 0; /* no static crt for tcc */ | ||
| 1912 | for (pp = libs; 0 != (p = *pp); ++pp) { | 1913 | for (pp = libs; 0 != (p = *pp); ++pp) { |
| 1913 | if (*p) | 1914 | if (*p) |
| 1914 | tcc_add_library(s1, p); | 1915 | tcc_add_library(s1, p); |
| @@ -318,7 +318,7 @@ CROSS-TGTS = \ · 317 unmodified lines | |||
| 318 | 318 | ||
| 319 | define CROSS-COMPILE | 319 | define CROSS-COMPILE |
| 320 | @echo " . $(1)" | 320 | @echo " . $(1)" |
| 321 | $(TCC) $(DEF-$1) -DCONFIG_TCC_CROSS -DTCC_CROSS_TEST -run $(TOPSRC)/tcc.c \ | 321 | $(TCC) $(DEF-$1) -DTCC_CROSS_TEST -run $(TOPSRC)/tcc.c \ |
| 322 | -c $(if $(findstring c67,$1),$(filter %/ex3.c,$^),$<) -w $(TCCFLAGS) | 322 | -c $(if $(findstring c67,$1),$(filter %/ex3.c,$^),$<) -w $(TCCFLAGS) |
| 323 | 323 | ||
| 324 | endef | 324 | endef |
| @@ -201,7 +201,7 @@ exit /B %ERRORLEVEL% · 200 unmodified lines | |||
| 201 | .\tcc -B. -m%1 -c ../lib/alloca-bt.S | 201 | .\tcc -B. -m%1 -c ../lib/alloca-bt.S |
| 202 | .\tcc -B. -m%1 -c ../lib/stdatomic.c | 202 | .\tcc -B. -m%1 -c ../lib/stdatomic.c |
| 203 | .\tcc -B. -m%1 -ar lib/%2libtcc1.a libtcc1.o crt1.o crt1w.o wincrt1.o wincrt1w.o dllcrt1.o dllmain.o chkstk.o alloca.o alloca-bt.o stdatomic.o | 203 | .\tcc -B. -m%1 -ar lib/%2libtcc1.a libtcc1.o crt1.o crt1w.o wincrt1.o wincrt1w.o dllcrt1.o dllmain.o chkstk.o alloca.o alloca-bt.o stdatomic.o |
| 204 | .\tcc -B. -m%1 -c ../lib/bcheck.c -o lib/%2bcheck.o -bt | 204 | .\tcc -B. -m%1 -c ../lib/bcheck.c -o lib/%2bcheck.o -bt -I.. |
| 205 | .\tcc -B. -m%1 -c ../lib/bt-exe.c -o lib/%2bt-exe.o | 205 | .\tcc -B. -m%1 -c ../lib/bt-exe.c -o lib/%2bt-exe.o |
| 206 | .\tcc -B. -m%1 -c ../lib/bt-log.c -o lib/%2bt-log.o | 206 | .\tcc -B. -m%1 -c ../lib/bt-log.c -o lib/%2bt-log.o |
| 207 | .\tcc -B. -m%1 -c ../lib/bt-dll.c -o lib/%2bt-dll.o | 207 | .\tcc -B. -m%1 -c ../lib/bt-dll.c -o lib/%2bt-dll.o |