aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYX Hao <lifenjoiner@163.com>2013-09-19 21:50:38 +0800
committerYX Hao <lifenjoiner@163.com>2013-09-19 21:50:38 +0800
commit642b6d0f50c6b6a842c9239a102fe34d5619e931 (patch)
tree60ca755ef6d92565ce21a9d4ca9baf8ebd146a0a
parent76cb1144ef91924c53c57ea71e6f67ce73ce1cc6 (diff)
downloadtinycc-642b6d0f50c6b6a842c9239a102fe34d5619e931.tar.gz
tinycc-642b6d0f50c6b6a842c9239a102fe34d5619e931.tar.bz2
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 <lifenjoiner@163.com>
-rw-r--r--tcc.c2
-rw-r--r--tccpe.c38
-rw-r--r--win32/_parseLibs.bat79
-rw-r--r--win32/_tcc.bat30
-rw-r--r--win32/build-tcc.bat9
5 files changed, 150 insertions, 8 deletions
diff --git a/tcc.c b/tcc.c
index b223d39..58f9007 100644
--- a/tcc.c
+++ b/tcc.c
@@ -79,7 +79,7 @@ static void help(void)
#include <process.h>
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 19b20ab..bc1545e 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 0000000..19e8e64
--- /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 0000000..65a7697
--- /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 5bc5585..772ed26 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\