Don't remove ignored symbols from the undefined list, simply skip them
when resolving imports. Added get_temp_file_name utility function.
This commit is contained in:
parent
cecfc3f43e
commit
87c347b18e
|
@ -169,6 +169,7 @@ extern void error( const char *msg, ... )
|
||||||
__attribute__ ((__format__ (__printf__, 1, 2)));
|
__attribute__ ((__format__ (__printf__, 1, 2)));
|
||||||
extern void warning( const char *msg, ... )
|
extern void warning( const char *msg, ... )
|
||||||
__attribute__ ((__format__ (__printf__, 1, 2)));
|
__attribute__ ((__format__ (__printf__, 1, 2)));
|
||||||
|
extern char *get_temp_file_name( const char *prefix, const char *suffix );
|
||||||
extern void output_standard_file_header( FILE *outfile );
|
extern void output_standard_file_header( FILE *outfile );
|
||||||
extern FILE *open_input_file( const char *srcdir, const char *name );
|
extern FILE *open_input_file( const char *srcdir, const char *name );
|
||||||
extern void close_input_file( FILE *file );
|
extern void close_input_file( FILE *file );
|
||||||
|
|
|
@ -63,8 +63,6 @@ static struct name_table ignore_symbols; /* list of symbols to ignore */
|
||||||
static struct name_table extra_ld_symbols; /* list of extra symbols that ld should resolve */
|
static struct name_table extra_ld_symbols; /* list of extra symbols that ld should resolve */
|
||||||
static struct name_table delayed_imports; /* list of delayed import dlls */
|
static struct name_table delayed_imports; /* list of delayed import dlls */
|
||||||
|
|
||||||
static char *ld_tmp_file; /* ld temp file name */
|
|
||||||
|
|
||||||
static struct import **dll_imports = NULL;
|
static struct import **dll_imports = NULL;
|
||||||
static int nb_imports = 0; /* number of imported dlls (delayed or not) */
|
static int nb_imports = 0; /* number of imported dlls (delayed or not) */
|
||||||
static int nb_delayed = 0; /* number of delayed dlls */
|
static int nb_delayed = 0; /* number of delayed dlls */
|
||||||
|
@ -222,12 +220,6 @@ static void free_imports( struct import *imp )
|
||||||
free( imp );
|
free( imp );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* remove the temp file at exit */
|
|
||||||
static void remove_ld_tmp_file(void)
|
|
||||||
{
|
|
||||||
if (ld_tmp_file) unlink( ld_tmp_file );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check whether a given dll is imported in delayed mode */
|
/* check whether a given dll is imported in delayed mode */
|
||||||
static int is_delayed_import( const char *name )
|
static int is_delayed_import( const char *name )
|
||||||
{
|
{
|
||||||
|
@ -496,21 +488,10 @@ static int check_unused( const struct import* imp, const DLLSPEC *spec )
|
||||||
static const char *ldcombine_files( char **argv )
|
static const char *ldcombine_files( char **argv )
|
||||||
{
|
{
|
||||||
unsigned int i, len = 0;
|
unsigned int i, len = 0;
|
||||||
char *cmd, *p;
|
char *cmd, *p, *ld_tmp_file;
|
||||||
int fd, err;
|
int err;
|
||||||
|
|
||||||
if (output_file_name && output_file_name[0])
|
|
||||||
{
|
|
||||||
ld_tmp_file = xmalloc( strlen(output_file_name) + 10 );
|
|
||||||
strcpy( ld_tmp_file, output_file_name );
|
|
||||||
strcat( ld_tmp_file, ".XXXXXX.o" );
|
|
||||||
}
|
|
||||||
else ld_tmp_file = xstrdup( "/tmp/winebuild.tmp.XXXXXX.o" );
|
|
||||||
|
|
||||||
if ((fd = mkstemps( ld_tmp_file, 2 ) == -1)) fatal_error( "could not generate a temp file\n" );
|
|
||||||
close( fd );
|
|
||||||
atexit( remove_ld_tmp_file );
|
|
||||||
|
|
||||||
|
ld_tmp_file = get_temp_file_name( output_file_name, ".o" );
|
||||||
if (!ld_command) ld_command = xstrdup("ld");
|
if (!ld_command) ld_command = xstrdup("ld");
|
||||||
for (i = 0; i < extra_ld_symbols.count; i++) len += strlen(extra_ld_symbols.names[i]) + 5;
|
for (i = 0; i < extra_ld_symbols.count; i++) len += strlen(extra_ld_symbols.names[i]) + 5;
|
||||||
for (i = 0; argv[i]; i++) len += strlen(argv[i]) + 1;
|
for (i = 0; argv[i]; i++) len += strlen(argv[i]) + 1;
|
||||||
|
@ -565,25 +546,14 @@ void read_undef_symbols( DLLSPEC *spec, char **argv )
|
||||||
free( cmd );
|
free( cmd );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void remove_ignored_symbols(void)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
if (!ignore_symbols.size) init_ignored_symbols();
|
|
||||||
sort_names( &ignore_symbols );
|
|
||||||
for (i = 0; i < undef_symbols.count; i++)
|
|
||||||
{
|
|
||||||
if (find_name( undef_symbols.names[i], &ignore_symbols ))
|
|
||||||
remove_name( &undef_symbols, i-- );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* resolve the imports for a Win32 module */
|
/* resolve the imports for a Win32 module */
|
||||||
int resolve_imports( DLLSPEC *spec )
|
int resolve_imports( DLLSPEC *spec )
|
||||||
{
|
{
|
||||||
unsigned int i, j, removed;
|
unsigned int i, j, removed;
|
||||||
|
ORDDEF *odp;
|
||||||
|
|
||||||
remove_ignored_symbols();
|
if (!ignore_symbols.size) init_ignored_symbols();
|
||||||
|
sort_names( &ignore_symbols );
|
||||||
|
|
||||||
for (i = 0; i < nb_imports; i++)
|
for (i = 0; i < nb_imports; i++)
|
||||||
{
|
{
|
||||||
|
@ -591,7 +561,8 @@ int resolve_imports( DLLSPEC *spec )
|
||||||
|
|
||||||
for (j = removed = 0; j < undef_symbols.count; j++)
|
for (j = removed = 0; j < undef_symbols.count; j++)
|
||||||
{
|
{
|
||||||
ORDDEF *odp = find_export( undef_symbols.names[j], imp->exports, imp->nb_exports );
|
if (find_name( undef_symbols.names[j], &ignore_symbols )) continue;
|
||||||
|
odp = find_export( undef_symbols.names[j], imp->exports, imp->nb_exports );
|
||||||
if (odp)
|
if (odp)
|
||||||
{
|
{
|
||||||
add_import_func( imp, odp );
|
add_import_func( imp, odp );
|
||||||
|
|
|
@ -27,9 +27,24 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "build.h"
|
#include "build.h"
|
||||||
|
|
||||||
|
#define MAX_TMP_FILES 8
|
||||||
|
static const char *tmp_files[MAX_TMP_FILES];
|
||||||
|
static unsigned int nb_tmp_files;
|
||||||
|
|
||||||
|
/* atexit handler to clean tmp files */
|
||||||
|
static void cleanup_tmp_files(void)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
for (i = 0; i < MAX_TMP_FILES; i++) if (tmp_files[i]) unlink( tmp_files[i] );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void *xmalloc (size_t size)
|
void *xmalloc (size_t size)
|
||||||
{
|
{
|
||||||
void *res;
|
void *res;
|
||||||
|
@ -147,6 +162,31 @@ void warning( const char *msg, ... )
|
||||||
va_end( valist );
|
va_end( valist );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* get a name for a temp file, automatically cleaned up on exit */
|
||||||
|
char *get_temp_file_name( const char *prefix, const char *suffix )
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
assert( nb_tmp_files < MAX_TMP_FILES );
|
||||||
|
if (!nb_tmp_files) atexit( cleanup_tmp_files );
|
||||||
|
|
||||||
|
if (!prefix || !prefix[0]) prefix = "winebuild.tmp";
|
||||||
|
if (!suffix) suffix = "";
|
||||||
|
name = xmalloc( strlen(prefix) + strlen(suffix) + sizeof("/tmp/.XXXXXX") );
|
||||||
|
sprintf( name, "%s.XXXXXX%s", prefix, suffix );
|
||||||
|
|
||||||
|
if ((fd = mkstemps( name, strlen(suffix) ) == -1))
|
||||||
|
{
|
||||||
|
sprintf( name, "/tmp/%s.XXXXXX%s", prefix, suffix );
|
||||||
|
if ((fd = mkstemps( name, strlen(suffix) ) == -1))
|
||||||
|
fatal_error( "could not generate a temp file\n" );
|
||||||
|
}
|
||||||
|
close( fd );
|
||||||
|
tmp_files[nb_tmp_files++] = name;
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
/* output a standard header for generated files */
|
/* output a standard header for generated files */
|
||||||
void output_standard_file_header( FILE *outfile )
|
void output_standard_file_header( FILE *outfile )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue