Alexandre Julliard : winebuild:
Disable linking to external symbols by default.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Apr 18 14:35:02 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 88bf4d61c3588753dd7741b8a851bd4d0f3ccde1
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=88bf4d61c3588753dd7741b8a851bd4d0f3ccde1
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Apr 18 20:49:29 2006 +0200
winebuild: Disable linking to external symbols by default.
---
tools/winebuild/build.h | 2 ++
tools/winebuild/import.c | 21 +++++++++++++++++++--
tools/winebuild/main.c | 34 +++++++++++++++++++++-------------
tools/winebuild/winebuild.man.in | 8 ++++++++
4 files changed, 50 insertions(+), 15 deletions(-)
diff --git a/tools/winebuild/build.h b/tools/winebuild/build.h
index c100b2c..a899a1e 100644
--- a/tools/winebuild/build.h
+++ b/tools/winebuild/build.h
@@ -85,6 +85,7 @@ typedef struct
typedef struct
{
+ char *src_name; /* file name of the source spec file */
char *file_name; /* file name of the dll */
char *dll_name; /* internal name of the dll */
char *init_func; /* initialization routine */
@@ -214,6 +215,7 @@ extern int display_warnings;
extern int kill_at;
extern int verbose;
extern int save_temps;
+extern int link_ext_symbols;
extern char *input_file_name;
extern char *spec_file_name;
diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c
index 7eafe47..7f228e5 100644
--- a/tools/winebuild/import.c
+++ b/tools/winebuild/import.c
@@ -440,8 +440,25 @@ static void check_undefined_exports( DLL
if (odp->flags & FLAG_FORWARD) continue;
if (find_name( odp->link_name, &undef_symbols ))
{
- odp->flags |= FLAG_EXT_LINK;
- add_name( &ext_link_imports, odp->link_name );
+ switch(odp->type)
+ {
+ case TYPE_PASCAL:
+ case TYPE_STDCALL:
+ case TYPE_CDECL:
+ case TYPE_VARARGS:
+ if (link_ext_symbols)
+ {
+ odp->flags |= FLAG_EXT_LINK;
+ add_name( &ext_link_imports, odp->link_name );
+ }
+ else error( "%s:%d: function '%s' not defined\n",
+ spec->src_name, odp->lineno, odp->link_name );
+ break;
+ default:
+ error( "%s:%d: external symbol '%s' is not a function\n",
+ spec->src_name, odp->lineno, odp->link_name );
+ break;
+ }
}
}
}
diff --git a/tools/winebuild/main.c b/tools/winebuild/main.c
index 98da643..87625e9 100644
--- a/tools/winebuild/main.c
+++ b/tools/winebuild/main.c
@@ -47,6 +47,7 @@ int display_warnings = 0;
int kill_at = 0;
int verbose = 0;
int save_temps = 0;
+int link_ext_symbols = 0;
#ifdef __i386__
enum target_cpu target_cpu = CPU_x86;
@@ -246,8 +247,9 @@ static const char usage_str[] =
" --as-cmd=AS Command to use for assembling (default: as)\n"
" -d, --delay-lib=LIB Import the specified library in delayed mode\n"
" -D SYM Ignored for C flags compatibility\n"
-" -E, --export=FILE Export the symbols defined in the .spec or .def file\n"
" -e, --entry=FUNC Set the DLL entry point function (default: DllMain)\n"
+" -E, --export=FILE Export the symbols defined in the .spec or .def file\n"
+" --external-symbols Allow linking to external symbols\n"
" -f FLAGS Compiler flags (only -fPIC is supported)\n"
" -F, --filename=DLLFILE Set the DLL filename (default: from input file name)\n"
" -h, --help Display this help message\n"
@@ -285,6 +287,7 @@ enum long_options_values
LONG_OPT_DEF,
LONG_OPT_EXE,
LONG_OPT_ASCMD,
+ LONG_OPT_EXTERNAL_SYMS,
LONG_OPT_LDCMD,
LONG_OPT_NMCMD,
LONG_OPT_RELAY16,
@@ -299,18 +302,19 @@ static const char short_options[] = "C:D
static const struct option long_options[] =
{
- { "dll", 0, 0, LONG_OPT_DLL },
- { "def", 0, 0, LONG_OPT_DEF },
- { "exe", 0, 0, LONG_OPT_EXE },
- { "as-cmd", 1, 0, LONG_OPT_ASCMD },
- { "ld-cmd", 1, 0, LONG_OPT_LDCMD },
- { "nm-cmd", 1, 0, LONG_OPT_NMCMD },
- { "relay16", 0, 0, LONG_OPT_RELAY16 },
- { "relay32", 0, 0, LONG_OPT_RELAY32 },
- { "save-temps",0, 0, LONG_OPT_SAVE_TEMPS },
- { "subsystem",1, 0, LONG_OPT_SUBSYSTEM },
- { "target", 1, 0, LONG_OPT_TARGET },
- { "version", 0, 0, LONG_OPT_VERSION },
+ { "dll", 0, 0, LONG_OPT_DLL },
+ { "def", 0, 0, LONG_OPT_DEF },
+ { "exe", 0, 0, LONG_OPT_EXE },
+ { "as-cmd", 1, 0, LONG_OPT_ASCMD },
+ { "external-symbols", 0, 0, LONG_OPT_EXTERNAL_SYMS },
+ { "ld-cmd", 1, 0, LONG_OPT_LDCMD },
+ { "nm-cmd", 1, 0, LONG_OPT_NMCMD },
+ { "relay16", 0, 0, LONG_OPT_RELAY16 },
+ { "relay32", 0, 0, LONG_OPT_RELAY32 },
+ { "save-temps", 0, 0, LONG_OPT_SAVE_TEMPS },
+ { "subsystem", 1, 0, LONG_OPT_SUBSYSTEM },
+ { "target", 1, 0, LONG_OPT_TARGET },
+ { "version", 0, 0, LONG_OPT_VERSION },
/* aliases for short options */
{ "delay-lib", 1, 0, 'd' },
{ "export", 1, 0, 'E' },
@@ -466,6 +470,9 @@ static char **parse_options( int argc, c
case LONG_OPT_ASCMD:
as_command = xstrdup( optarg );
break;
+ case LONG_OPT_EXTERNAL_SYMS:
+ link_ext_symbols = 1;
+ break;
case LONG_OPT_LDCMD:
ld_command = xstrdup( optarg );
break;
@@ -554,6 +561,7 @@ static int parse_input_file( DLLSPEC *sp
char *extension = strrchr( spec_file_name, '.' );
int result;
+ spec->src_name = xstrdup( input_file_name );
if (extension && !strcmp( extension, ".def" ))
result = parse_def_file( input_file, spec );
else
diff --git a/tools/winebuild/winebuild.man.in b/tools/winebuild/winebuild.man.in
index 78e10a2..3b6d0c7 100644
--- a/tools/winebuild/winebuild.man.in
+++ b/tools/winebuild/winebuild.man.in
@@ -85,6 +85,14 @@ Specify a .spec file (see \fBSPEC FILE S
or a standard Windows .def file that defines the exports
of the DLL or executable that is being built.
.TP
+.B \--external-symbols
+Allow linking to external symbols directly from the spec
+file. Normally symbols exported by a dll have to be defined in the dll
+itself; this option makes it possible to use symbols defined in
+another Unix library (for symbols defined in another dll, a
+.I forward
+specification must be used instead).
+.TP
.BI \-f\ flags
Ignored for compatibility with the C compiler.
.TP
More information about the wine-cvs
mailing list