winebuild: Add a helper for generating RVA pointers.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
stable
Alexandre Julliard 2019-03-06 10:13:45 +01:00
parent ef9bda4c96
commit 7555fd57e3
5 changed files with 49 additions and 21 deletions

View File

@ -248,6 +248,8 @@ extern int output( const char *format, ... )
__attribute__ ((__format__ (__printf__, 1, 2)));
extern void output_cfi( const char *format, ... )
__attribute__ ((__format__ (__printf__, 1, 2)));
extern void output_rva( const char *format, ... )
__attribute__ ((__format__ (__printf__, 1, 2)));
extern void spawn( struct strarray array );
extern struct strarray find_tool( const char *name, const char * const *names );
extern struct strarray get_as_command(void);

View File

@ -722,14 +722,11 @@ static void output_immediate_imports(void)
j = 0;
LIST_FOR_EACH_ENTRY( import, &dll_imports, struct import, entry )
{
output( "\t.long .L__wine_spec_import_data_names+%d-.L__wine_spec_rva_base\n", /* OriginalFirstThunk */
j * get_ptr_size() );
output_rva( ".L__wine_spec_import_data_names + %d", j * get_ptr_size() ); /* OriginalFirstThunk */
output( "\t.long 0\n" ); /* TimeDateStamp */
output( "\t.long 0\n" ); /* ForwarderChain */
output( "\t.long .L__wine_spec_import_name_%s-.L__wine_spec_rva_base\n", /* Name */
import->c_name );
output( "\t.long .L__wine_spec_import_data_ptrs+%d-.L__wine_spec_rva_base\n", /* FirstThunk */
j * get_ptr_size() );
output_rva( ".L__wine_spec_import_name_%s", import->c_name ); /* Name */
output_rva( ".L__wine_spec_import_data_ptrs + %d", j * get_ptr_size() ); /* FirstThunk */
j += import->nb_imports + 1;
}
output( "\t.long 0\n" ); /* OriginalFirstThunk */

View File

@ -476,8 +476,10 @@ void output_resources( DLLSPEC *spec )
/* dump the resource data entries */
for (i = 0, res = spec->resources; i < spec->nb_resources; i++, res++)
output( "\t.long .L__wine_spec_res_%d-.L__wine_spec_rva_base,%u,0,0\n",
i, res->data_size );
{
output_rva( ".L__wine_spec_res_%d", i );
output( "\t.long %u,0,0\n", res->data_size );
}
/* dump the name strings */

View File

@ -378,15 +378,15 @@ void output_exports( DLLSPEC *spec )
output( "\t.long 0\n" ); /* Characteristics */
output( "\t.long 0\n" ); /* TimeDateStamp */
output( "\t.long 0\n" ); /* MajorVersion/MinorVersion */
output( "\t.long .L__wine_spec_exp_names-.L__wine_spec_rva_base\n" ); /* Name */
output_rva( ".L__wine_spec_exp_names" ); /* Name */
output( "\t.long %u\n", spec->base ); /* Base */
output( "\t.long %u\n", nr_exports ); /* NumberOfFunctions */
output( "\t.long %u\n", spec->nb_names ); /* NumberOfNames */
output( "\t.long .L__wine_spec_exports_funcs-.L__wine_spec_rva_base\n" ); /* AddressOfFunctions */
output_rva( ".L__wine_spec_exports_funcs " ); /* AddressOfFunctions */
if (spec->nb_names)
{
output( "\t.long .L__wine_spec_exp_name_ptrs-.L__wine_spec_rva_base\n" ); /* AddressOfNames */
output( "\t.long .L__wine_spec_exp_ordinals-.L__wine_spec_rva_base\n" ); /* AddressOfNameOrdinals */
output_rva( ".L__wine_spec_exp_name_ptrs" ); /* AddressOfNames */
output_rva( ".L__wine_spec_exp_ordinals" ); /* AddressOfNameOrdinals */
}
else
{
@ -440,7 +440,7 @@ void output_exports( DLLSPEC *spec )
output( "\n.L__wine_spec_exp_name_ptrs:\n" );
for (i = 0; i < spec->nb_names; i++)
{
output( "\t.long .L__wine_spec_exp_names+%u-.L__wine_spec_rva_base\n", namepos );
output_rva( ".L__wine_spec_exp_names + %u", namepos );
namepos += strlen(spec->names[i]->name) + 1;
}
@ -636,8 +636,7 @@ void output_module( DLLSPEC *spec )
output( "\t.short %u,%u\n", /* Major/MinorSubsystemVersion */
spec->subsystem_major, spec->subsystem_minor );
output( "\t.long 0\n" ); /* Win32VersionValue */
output( "\t.long %s-.L__wine_spec_rva_base\n", /* SizeOfImage */
asm_name("_end") );
output_rva( "%s", asm_name("_end") ); /* SizeOfImage */
output( "\t.long %u\n", page_size ); /* SizeOfHeaders */
output( "\t.long 0\n" ); /* CheckSum */
output( "\t.short 0x%04x\n", /* Subsystem */
@ -652,20 +651,26 @@ void output_module( DLLSPEC *spec )
output( "\t.long 16\n" ); /* NumberOfRvaAndSizes */
if (spec->base <= spec->limit) /* DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT] */
output( "\t.long .L__wine_spec_exports-.L__wine_spec_rva_base,"
".L__wine_spec_exports_end-.L__wine_spec_exports\n" );
{
output_rva( ".L__wine_spec_exports" );
output( "\t.long .L__wine_spec_exports_end-.L__wine_spec_exports\n" );
}
else
output( "\t.long 0,0\n" );
if (has_imports()) /* DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] */
output( "\t.long .L__wine_spec_imports-.L__wine_spec_rva_base,"
".L__wine_spec_imports_end-.L__wine_spec_imports\n" );
{
output_rva( ".L__wine_spec_imports" );
output( "\t.long .L__wine_spec_imports_end-.L__wine_spec_imports\n" );
}
else
output( "\t.long 0,0\n" );
if (spec->nb_resources) /* DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE] */
output( "\t.long .L__wine_spec_resources-.L__wine_spec_rva_base,"
".L__wine_spec_resources_end-.L__wine_spec_resources\n" );
{
output_rva( ".L__wine_spec_resources" );
output( "\t.L__wine_spec_resources_end-.L__wine_spec_resources\n" );
}
else
output( "\t.long 0,0\n" );

View File

@ -1107,6 +1107,28 @@ void output_cfi( const char *format, ... )
va_end( valist );
}
/* output an RVA pointer */
void output_rva( const char *format, ... )
{
va_list valist;
va_start( valist, format );
switch (target_platform)
{
case PLATFORM_WINDOWS:
output( "\t.rva " );
vfprintf( output_file, format, valist );
fputc( '\n', output_file );
break;
default:
output( "\t.long " );
vfprintf( output_file, format, valist );
output( " - .L__wine_spec_rva_base\n" );
break;
}
va_end( valist );
}
/* output the GNU note for non-exec stack */
void output_gnu_stack_note(void)
{