mirror of
https://github.com/mirror/tinycc.git
synced 2025-01-15 05:20:06 +08:00
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>
This commit is contained in:
parent
76cb1144ef
commit
642b6d0f50
2
tcc.c
2
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);
|
||||
|
38
tccpe.c
38
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;
|
||||
}
|
||||
}
|
||||
|
79
win32/_parseLibs.bat
Normal file
79
win32/_parseLibs.bat
Normal file
@ -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
|
30
win32/_tcc.bat
Normal file
30
win32/_tcc.bat
Normal file
@ -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
|
@ -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\
|
||||
|
Loading…
Reference in New Issue
Block a user