From 642b6d0f50c6b6a842c9239a102fe34d5619e931 Mon Sep 17 00:00:00 2001 From: YX Hao Date: Thu, 19 Sep 2013 21:50:38 +0800 Subject: [PATCH] Add the possibility to use noname functions by ordinal tcc.c: process.h:177:20: note: expected 'char * const*' but argument is of type 'char const*const*' tccpe.c: Add the possibility to use noname functions by ordinal. use def file: "AliasName @n" build-tcc.bat: 1. Enable 32 bits mode on 64 bits OS. 2. build doc. _parseLibs.bat: Convenient to use "*.def + *.c" instead of *.a, just use -l* _tcc.bat: a practice of _parseLibs.bat Signed-off-by: YX Hao --- tcc.c | 2 +- tccpe.c | 38 +++++++++++++++++++++---- win32/_parseLibs.bat | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++ win32/_tcc.bat | 30 ++++++++++++++++++++ win32/build-tcc.bat | 9 +++++- 5 files changed, 150 insertions(+), 8 deletions(-) create mode 100644 win32/_parseLibs.bat create mode 100644 win32/_tcc.bat diff --git a/tcc.c b/tcc.c index b223d39f..58f9007f 100644 --- a/tcc.c +++ b/tcc.c @@ -79,7 +79,7 @@ static void help(void) #include static int execvp_win32(const char *prog, char **argv) { - int ret = spawnvp(P_NOWAIT, prog, (char const*const*)argv); + int ret = spawnvp(P_NOWAIT, prog, (char *const*)argv); if (-1 == ret) return ret; cwait(&ret, ret, WAIT_CHILD); diff --git a/tccpe.c b/tccpe.c index 19b20abf..bc1545e6 100644 --- a/tccpe.c +++ b/tccpe.c @@ -813,6 +813,7 @@ static void pe_build_imports(struct pe_info *pe) hdr->Name = v + rva_base; for (k = 0, n = p->sym_count; k <= n; ++k) { + int ordinal = 0; if (k < n) { int iat_index = p->symbols[k]->iat_index; int sym_index = p->symbols[k]->sym_index; @@ -823,25 +824,31 @@ static void pe_build_imports(struct pe_info *pe) org_sym->st_value = thk_ptr; org_sym->st_shndx = pe->thunk->sh_num; v = pe->thunk->data_offset + rva_base; - section_ptr_add(pe->thunk, sizeof(WORD)); /* hint, not used */ - put_elf_str(pe->thunk, name); + + /* ordinal or name */ + ordinal = imp_sym->st_value; /* from pe_load_def, temperary use */ + //if (ordinal) printf("ordinal: %d\n", ordinal); + if (!ordinal) { + section_ptr_add(pe->thunk, sizeof(WORD)); /* hint, not used */ + put_elf_str(pe->thunk, name); + } #ifdef TCC_IS_NATIVE if (pe->type == PE_RUN) { v = imp_sym->st_value; if (dllref) { if ( !dllref->handle ) dllref->handle = LoadLibrary(dllref->name); - v = (ADDR3264)GetProcAddress(dllref->handle, name); + v = (ADDR3264)GetProcAddress(dllref->handle, ordinal?(LPCSTR)NULL+ordinal:name); } if (!v) - tcc_error_noabort("undefined symbol '%s'", name); + tcc_error_noabort("can't build symbol '%s'", name); } #endif } else { v = 0; /* last entry is zero */ } *(ADDR3264*)(pe->thunk->data+thk_ptr) = - *(ADDR3264*)(pe->thunk->data+ent_ptr) = v; + *(ADDR3264*)(pe->thunk->data+ent_ptr) = (ordinal && pe->type != PE_RUN)?(ADDR3264)1<<(sizeof(ADDR3264)*8-1)|ordinal:v; thk_ptr += sizeof (ADDR3264); ent_ptr += sizeof (ADDR3264); } @@ -1590,6 +1597,8 @@ static int pe_load_def(TCCState *s1, int fd) char line[400], dllname[80], *p; for (;;) { + int ord = 0; + char *x, *d, idxstr[8]; p = get_line(line, sizeof line, fd); if (NULL == p) break; @@ -1614,7 +1623,24 @@ static int pe_load_def(TCCState *s1, int fd) ++state; default: - pe_putimport(s1, dllindex, p, 0); + /* get ordianl and will store in sym->st_value */ + d = NULL; + x = strchr(line, ' '); + if (x) x = strchr(line, '@'); + while (x != NULL) { + d =x; + x = strchr(x+1, '@'); + } + if (d) { + ord = atoi(d+1); + itoa(ord, idxstr, 10); + if (strcmp(idxstr, d+1) == 0) { + memset(d, 0, 1); + trimback(p, d); + } else + ord = 0; + } + pe_putimport(s1, dllindex, p, ord); continue; } } diff --git a/win32/_parseLibs.bat b/win32/_parseLibs.bat new file mode 100644 index 00000000..19e8e648 --- /dev/null +++ b/win32/_parseLibs.bat @@ -0,0 +1,79 @@ +@echo off +setlocal enabledelayedexpansion + +pushd %~dp0 + +::Define as main parameters +set _Args_= +set _LIBs_= +set LIBi= + +set ARGSO=-IExt\include -LExt\lib %* + +::This is for the .def file also have a similar name .c file +::.a file will be larger than .def + .c +::*-uuid.c files are suitable to form libuuid.a +::w32api-3.17.2 +:GetRLib +for %%i in (%ARGSO%) do ( + set ARG=%%i + set OPT=!ARG:~0,2! + if "!OPT!"=="-l" ( + set LIB=!ARG:~2! + set LIBi= + if "!LIB!"=="uuid" ( + set LIBi= lib\*uid.c + ) else ( + if "!LIB!"=="vfw32" ( + set LIBi= lib\msvfw32.def lib\avifil32.def lib\avicap32.def + ) else ( + call :GetLibS + ) + ) + if "!LIBi!"=="" ( + set _Args_=!_Args_! %%i + ) else ( + set LIBi=!LIBi:%~dp0=! + set _LIBs_=!_LIBs_! !LIBi! + echo For lib !LIB! will use: + echo !LIBi! + echo. + ) + ) else ( + set _Args_=!_Args_! %%i + ) +) + +::GetRLib End +popd + +tcc.exe !_Args_! !_LIBs_! + +exit /b + +:::::::::: + +:GetLibS +for %%D in (-Llib %ARGSO%) do ( + set ARG_=%%D + set OPT_=!ARG_:~0,2! + set LIBD= + if "!OPT_!"=="-L" ( + set LIBD=!ARG_:~2! + if exist "!LIBD!" call :GetDLib + ) +) +set LIBD= +set OPT_= +set ARG_= +exit /b +::GetLibD End + +:GetDLib +pushd !LIBD! +for /f "usebackq delims=" %%I in (`"dir /b /s !LIB!.c !LIB!_*.c !LIB!.def !LIB!_*.def 2>nul"`) do ( + set LIBi=!LIBi! "%%I" +) +popd +exit /b +::GetDLib End diff --git a/win32/_tcc.bat b/win32/_tcc.bat new file mode 100644 index 00000000..65a7697c --- /dev/null +++ b/win32/_tcc.bat @@ -0,0 +1,30 @@ +@echo off +setlocal enabledelayedexpansion + +pushd %~dp0 + +path %~dp0;%path% + +set EXT=.exe +echo %*|findstr /R /C:"\<-c\>" >nul &&set EXT=.o +echo %*|findstr /R /C:"\<-shared\>" >nul &&set EXT=.dll + +::1st file found must be the main c file to get output file name +set OUTF= +call :FINDFN %* + +if "%OUTF%"=="" goto :EXIT + +call _parseLibs -vv -o "%OUTF%" %* + +:EXIT +popd +pause +exit /b + +:FINDFN +for %%i in (%*) do ( + if exist %%i set OUTF=%%~dpni%EXT%&goto :ENDFDF +) +:ENDFDF +exit /b diff --git a/win32/build-tcc.bat b/win32/build-tcc.bat index 5bc55858..772ed265 100644 --- a/win32/build-tcc.bat +++ b/win32/build-tcc.bat @@ -5,7 +5,7 @@ @set /p VERSION= < ..\VERSION echo>..\config.h #define TCC_VERSION "%VERSION%" -@if _%PROCESSOR_ARCHITEW6432%_==_AMD64_ goto x86_64 +@rem @if _%PROCESSOR_ARCHITEW6432%_==_AMD64_ goto x86_64 @if _%PROCESSOR_ARCHITECTURE%_==_AMD64_ goto x86_64 @set target=-DTCC_TARGET_PE -DTCC_TARGET_I386 @@ -58,3 +58,10 @@ tiny_libmaker lib/libtcc1.a libtcc1.o alloca86_64.o crt1.o wincrt1.o dllcrt1.o d :the_end del *.o + +:makedoc +echo>..\config.texi @set VERSION %VERSION% +if not exist doc md doc +makeinfo --html --no-split -o doc\tcc-doc.html ../tcc-doc.texi +if exist tcc-win32.txt move tcc-win32.txt doc\ +copy ..\tests\libtcc_test.c examples\ -- 2.11.4.GIT