History

tccpe.c: never assume static system libtaries

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

grischka committed 1 year ago

Commit a5222131 parent 31582878 files · +63 −48Browse files

Unified · Split

8 files
  1. Makefile +3 −2
  2. configure +27 −21
  3. lib/Makefile +2 −2
  4. libtcc.c +17 −18
  5. tccelf.c +11 −3
  6. tccpe.c +1 −0
  7. tests/Makefile +1 −1
  8. win32/build-tcc.bat +1 −1
Makefile+3−2
@@ -169,7 +169,6 @@ DEFINES += $(DEF-$(or $(findstring win,$T),unx)) · 168 unmodified lines
169 169
170ifneq ($(X),)170ifneq ($(X),)
171$(if $(DEF-$T),,$(error error: unknown target: '$T'))171$(if $(DEF-$T),,$(error error: unknown target: '$T'))
172DEF-$T += -DCONFIG_TCC_CROSS
173DEF-$(NATIVE_TARGET) =172DEF-$(NATIVE_TARGET) =
174DEF-$T += -DCONFIG_TCC_CROSSPREFIX="\"$X\""173DEF-$T += -DCONFIG_TCC_CROSSPREFIX="\"$X\""
175ifneq ($(CONFIG_WIN32),yes)174ifneq ($(CONFIG_WIN32),yes)
@@ -234,7 +233,9 @@ LIBTCC_INC = $(filter %.h %-gen.c %-link.c,$($T_FILES)) · 58 unmodified lines
234TCC_FILES = $(X)tcc.o $(LIBTCC_OBJ)233TCC_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=0235$(X)libtcc.o : DEFINES += -DONE_SOURCE=0
236$(CROSS_TARGET)-tcc.o : DEFINES += -DONE_SOURCE=0
237endif237endif
238# native tcc always made from tcc.o and libtcc.[so|a]
238tcc.o : DEFINES += -DONE_SOURCE=0239tcc.o : DEFINES += -DONE_SOURCE=0
239DEFINES += -I$(TOP)240DEFINES += -I$(TOP)
240 241
@@ -464,7 +465,7 @@ tcov-tes% : tcc_c$(EXESUF) · 223 unmodified lines
464tcc_c$(EXESUF): $($T_FILES)465tcc_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 instead467# test the installed tcc instead
467test-install: tccdefs_.h468test-install: $(TCCDEFS_H)
468 @$(MAKE) -C tests TESTINSTALL=yes #_all469 @$(MAKE) -C tests TESTINSTALL=yes #_all
469 470
470clean:471clean:
configure+27−21
@@ -384,12 +384,12 @@ case $targetos in · 383 unmodified lines
384 confvars_set Android new_dtags rpath=no384 confvars_set Android new_dtags rpath=no
385 test "${cpu}" != "i386" && confvars_set pie385 test "${cpu}" != "i386" && confvars_set pie
386 default_conf "static=no"386 default_conf "static=no"
387 if test "${cpu}" = "arm"; then387 case "$cpu" in
388 default triplet "arm-linux-androideabi"388 arm) default triplet "arm-linux-androideabi"; cpuver=7 ;;
389 cpuver=7389 arm64) default triplet "aarch64-linux-android" ;;
390 else390 x86_64) default triplet "x86_64-linux-android" ;;
391 default triplet "${cpu}-linux-android"391 i386) default triplet "i686-linux-android" ;;
392 fi392 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_help438 show_help
439fi439fi
440 440
441if test -z "$build_cross"; then441CONFTEST=./conftest$EXESUF
442 CONFTEST=./conftest$EXESUF442if test -z "$cross_prefix" \
443 if ! $cc -o $CONFTEST "$source_path/conftest.c" ; then443 && $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)"
448else
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 fi451 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
457fi
458
459if test -z "$build_cross"; then
460 bigendian="$($CONFTEST bigendian)"
461 _triplet="$($CONFTEST triplet)"
452 if test "$mingw32" = "no" ; then462 if test "$mingw32" = "no" ; then
453 if test -z "$triplet" && test -n "$_triplet"; then463 if test -z "$triplet" && test -n "$_triplet"; then
454 if test -f "/usr/lib/$_triplet/crti.o"; then464 if test -f "/usr/lib/$_triplet/crti.o"; then
@@ -473,11 +483,6 @@ if test -z "$build_cross"; then · 18 unmodified lines
473 fi483 fi
474else484else
475 # can only make guesses about compiler and target485 # 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 in486 case $cpu in
482 ppc|mips|s390) bigendian=yes;;487 ppc|mips|s390) bigendian=yes;;
483 esac488 esac
@@ -619,7 +624,8 @@ cat >$TMPH <<EOF · 135 unmodified lines
619#define GCC_MAJOR $gcc_major624#define GCC_MAJOR $gcc_major
620#define GCC_MINOR $gcc_minor625#define GCC_MINOR $gcc_minor
621 626
622#if !CONFIG_TCC_CROSS627#if !(TCC_TARGET_I386 || TCC_TARGET_X86_64 || TCC_TARGET_ARM\
628 || TCC_TARGET_ARM64 || TCC_TARGET_RISCV64 || TCC_TARGET_C67)
623EOF629EOF
624 630
625predefs=1631predefs=1
lib/Makefile+2−2
@@ -16,7 +16,7 @@ XCC = $(XTCC) · 15 unmodified lines
16XAR = $(XTCC) -ar16XAR = $(XTCC) -ar
17XFLAGS-unx = -B$(TOPSRC)17XFLAGS-unx = -B$(TOPSRC)
18XFLAGS-win = -B$(TOPSRC)/win32 -I$(TOPSRC)/include18XFLAGS-win = -B$(TOPSRC)/win32 -I$(TOPSRC)/include
19XFLAGS = $(XFLAGS$(XCFG)) -I$(TOP)19XFLAGS = $(XFLAGS$(XCFG))
20BFLAGS = -bt20BFLAGS = -bt
21 21
22# in order to use gcc, type: make <target>-libtcc1-usegcc=yes22# 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.c95$(TOP)/bt-exe.o : $(TOP)/tccrun.c
96 96
97$(X)crt1w.o : crt1.c97$(X)crt1w.o : crt1.c
libtcc.c+17−18
@@ -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 */
1195ST_FUNC int tcc_add_support(TCCState *s1, const char *filename)1195ST_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
1339static 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
1346static const char *skip_linker_arg(const char **str)1345static 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#endif1410#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_COFF1414#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#endif1417#endif
1419 } else1418 } 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#endif1467#endif
1469 } else1468 } else
tccelf.c+11−3
@@ -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. Some604 /* generate verneed section, but not when it will be empty. Some
598 dynamic linkers look at their contents even when DTVERNEEDNUM and605 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)
tccpe.c+1−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);
tests/Makefile+1−1
@@ -318,7 +318,7 @@ CROSS-TGTS = \ · 317 unmodified lines
318 318
319define CROSS-COMPILE319define 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
324endef324endef
win32/build-tcc.bat+1−1
@@ -201,7 +201,7 @@ exit /B %ERRORLEVEL% · 200 unmodified lines
201.\tcc -B. -m%1 -c ../lib/alloca-bt.S201.\tcc -B. -m%1 -c ../lib/alloca-bt.S
202.\tcc -B. -m%1 -c ../lib/stdatomic.c202.\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.o203.\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 -bt204.\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.o205.\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.o206.\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.o207.\tcc -B. -m%1 -c ../lib/bt-dll.c -o lib/%2bt-dll.o

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t