diff --git a/tools/winebuild/spec32.c b/tools/winebuild/spec32.c index efb136a8e61..ba2edfb588f 100644 --- a/tools/winebuild/spec32.c +++ b/tools/winebuild/spec32.c @@ -51,6 +51,14 @@ int needs_get_pc_thunk = 0; static const char builtin_signature[32] = "Wine builtin DLL"; static const char fakedll_signature[32] = "Wine placeholder DLL"; +static unsigned int hash_filename( const char *name ) +{ + /* FNV-1 hash */ + unsigned int ret = 2166136261u; + while (*name) ret = (ret * 16777619) ^ *name++; + return ret; +} + /* check if entry point needs a relay thunk */ static inline int needs_relay( const ORDDEF *odp ) { @@ -405,7 +413,7 @@ void output_exports( DLLSPEC *spec ) /* export directory header */ output( "\t.long 0\n" ); /* Characteristics */ - output( "\t.long 0\n" ); /* TimeDateStamp */ + output( "\t.long %u\n", hash_filename(spec->file_name) ); /* TimeDateStamp */ output( "\t.long 0\n" ); /* MajorVersion/MinorVersion */ output_rva( ".L__wine_spec_exp_names" ); /* Name */ output( "\t.long %u\n", spec->base ); /* Base */ @@ -666,7 +674,7 @@ void output_module( DLLSPEC *spec ) output( "\t.short 0x%04x\n", /* Machine */ machine ); output( "\t.short 0\n" ); /* NumberOfSections */ - output( "\t.long 0\n" ); /* TimeDateStamp */ + output( "\t.long %u\n", hash_filename(spec->file_name) ); /* TimeDateStamp */ output( "\t.long 0\n" ); /* PointerToSymbolTable */ output( "\t.long 0\n" ); /* NumberOfSymbols */ output( "\t.short %d\n", /* SizeOfOptionalHeader */ @@ -817,7 +825,7 @@ void output_fake_module( DLLSPEC *spec ) case CPU_ARM64: put_word( IMAGE_FILE_MACHINE_ARM64 ); break; } put_word( nb_sections ); /* NumberOfSections */ - put_dword( 0 ); /* TimeDateStamp */ + put_dword( hash_filename(spec->file_name) ); /* TimeDateStamp */ put_dword( 0 ); /* PointerToSymbolTable */ put_dword( 0 ); /* NumberOfSymbols */ put_word( get_ptr_size() == 8 ?