winegcc: Make get_lddllflags() more generic to return all link flags.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
stable
Alexandre Julliard 2019-03-09 20:42:37 +01:00
parent d228b3cfd5
commit 9ce91cd56e
1 changed files with 65 additions and 69 deletions

View File

@ -213,6 +213,7 @@ struct options
const char* section_align;
const char* lib_suffix;
const char* subsystem;
const char* prelink;
strarray* prefix;
strarray* lib_dirs;
strarray* linker_args;
@ -378,9 +379,17 @@ static int try_link( const strarray *prefix, const strarray *link_tool, const ch
return ret;
}
static const strarray* get_lddllflags( const struct options *opts, const strarray *link_tool )
static strarray *get_link_args( struct options *opts, const char *output_name )
{
const strarray *link_tool = get_translator( opts );
strarray *flags = strarray_alloc();
unsigned int i;
strarray_addall( flags, link_tool );
for (i = 0; i < opts->linker_args->size; i++) strarray_add( flags, opts->linker_args->base[i] );
if (verbose > 1) strarray_add( flags, "-v" );
switch (opts->target_platform)
{
case PLATFORM_APPLE:
@ -392,34 +401,64 @@ static const strarray* get_lddllflags( const struct options *opts, const strarra
strarray_add( flags, "-read_only_relocs" );
strarray_add( flags, "warning" );
}
if (opts->image_base)
{
strarray_add( flags, "-image_base" );
strarray_add( flags, opts->image_base );
}
if (opts->strip) strarray_add( flags, "-x" );
return flags;
case PLATFORM_SOLARIS:
{
char *mapfile = get_temp_file( output_name, ".map" );
const char *align = opts->section_align ? opts->section_align : "0x1000";
create_file( mapfile, 0644, "text = A%s;\ndata = A%s;\n", align, align );
strarray_add( flags, strmake("-Wl,-M,%s", mapfile) );
strarray_add( tmp_files, mapfile );
}
break;
case PLATFORM_ANDROID:
case PLATFORM_SOLARIS:
case PLATFORM_UNSPECIFIED:
strarray_add( flags, "-shared" );
strarray_add( flags, "-Wl,-Bsymbolic" );
/* Try all options first - this is likely to succeed on modern compilers */
if (!try_link( opts->prefix, link_tool, "-fPIC -shared -Wl,-Bsymbolic "
"-Wl,-z,defs -Wl,-init,__wine_spec_init,-fini,_wine_spec_fini" ))
{
strarray_add( flags, "-Wl,-z,defs" );
strarray_add( flags, "-Wl,-init,__wine_spec_init,-fini,__wine_spec_fini" );
}
else /* otherwise figure out which ones are allowed */
{
if (!try_link( opts->prefix, link_tool, "-fPIC -shared -Wl,-Bsymbolic -Wl,-z,defs" ))
strarray_add( flags, "-Wl,-z,defs" );
if (!try_link( opts->prefix, link_tool, "-fPIC -shared -Wl,-Bsymbolic "
"-Wl,-init,__wine_spec_init,-fini,_wine_spec_fini" ))
strarray_add( flags, "-Wl,-init,__wine_spec_init,-fini,__wine_spec_fini" );
}
/* the Android loader requires a soname for all libraries */
strarray_add( flags, strmake( "-Wl,-soname,%s.so", output_name ));
break;
default:
assert(0);
if (opts->image_base)
{
if (!try_link( opts->prefix, link_tool, strmake("-Wl,-Ttext-segment=%s", opts->image_base)) )
strarray_add( flags, strmake("-Wl,-Ttext-segment=%s", opts->image_base) );
else
opts->prelink = PRELINK;
}
if (!try_link( opts->prefix, link_tool, "-Wl,-z,max-page-size=0x1000"))
strarray_add( flags, "-Wl,-z,max-page-size=0x1000");
break;
}
/* generic Unix shared library flags */
strarray_add( flags, "-shared" );
strarray_add( flags, "-Wl,-Bsymbolic" );
/* Try all options first - this is likely to succeed on modern compilers */
if (!try_link( opts->prefix, link_tool, "-fPIC -shared -Wl,-Bsymbolic "
"-Wl,-z,defs -Wl,-init,__wine_spec_init,-fini,_wine_spec_fini" ))
{
strarray_add( flags, "-Wl,-z,defs" );
strarray_add( flags, "-Wl,-init,__wine_spec_init,-fini,__wine_spec_fini" );
}
else /* otherwise figure out which ones are allowed */
{
if (!try_link( opts->prefix, link_tool, "-fPIC -shared -Wl,-Bsymbolic -Wl,-z,defs" ))
strarray_add( flags, "-Wl,-z,defs" );
if (!try_link( opts->prefix, link_tool, "-fPIC -shared -Wl,-Bsymbolic "
"-Wl,-init,__wine_spec_init,-fini,_wine_spec_fini" ))
strarray_add( flags, "-Wl,-init,__wine_spec_init,-fini,__wine_spec_fini" );
}
return flags;
}
@ -807,7 +846,6 @@ static void build(struct options* opts)
char *output_file;
const char *spec_o_name;
const char *output_name, *spec_file, *lang;
const char *prelink = NULL;
int generate_app_loader = 1;
int fake_module = 0;
unsigned int j;
@ -1151,53 +1189,11 @@ static void build(struct options* opts)
if (fake_module) return; /* nothing else to do */
/* link everything together now */
strarray_addall(link_args, get_translator(opts));
strarray_addall(link_args, get_lddllflags(opts, link_args));
link_args = get_link_args( opts, output_name );
strarray_add(link_args, "-o");
strarray_add(link_args, strmake("%s.so", output_file));
for ( j = 0 ; j < opts->linker_args->size ; j++ )
strarray_add(link_args, opts->linker_args->base[j]);
switch (opts->target_platform)
{
case PLATFORM_APPLE:
if (opts->image_base)
{
strarray_add(link_args, "-image_base");
strarray_add(link_args, opts->image_base);
}
if (opts->strip)
strarray_add(link_args, "-Wl,-x");
break;
case PLATFORM_SOLARIS:
{
char *mapfile = get_temp_file( output_name, ".map" );
const char *align = opts->section_align ? opts->section_align : "0x1000";
create_file( mapfile, 0644, "text = A%s;\ndata = A%s;\n", align, align );
strarray_add(link_args, strmake("-Wl,-M,%s", mapfile));
strarray_add(tmp_files, mapfile);
}
break;
case PLATFORM_ANDROID:
/* the Android loader requires a soname for all libraries */
strarray_add( link_args, strmake( "-Wl,-soname,%s.so", output_name ));
break;
default:
if (opts->image_base)
{
if (!try_link(opts->prefix, link_args, strmake("-Wl,-Ttext-segment=%s", opts->image_base)))
strarray_add(link_args, strmake("-Wl,-Ttext-segment=%s", opts->image_base));
else
prelink = PRELINK;
}
if (!try_link(opts->prefix, link_args, "-Wl,-z,max-page-size=0x1000"))
strarray_add(link_args, "-Wl,-z,max-page-size=0x1000");
break;
}
for ( j = 0; j < lib_dirs->size; j++ )
strarray_add(link_args, strmake("-L%s", lib_dirs->base[j]));
@ -1229,12 +1225,12 @@ static void build(struct options* opts)
strarray_free (link_args);
/* set the base address with prelink if linker support is not present */
if (prelink && !opts->target)
if (opts->prelink && !opts->target)
{
if (prelink[0] && strcmp(prelink,"false"))
if (opts->prelink[0] && strcmp(opts->prelink,"false"))
{
strarray *prelink_args = strarray_alloc();
strarray_add(prelink_args, prelink);
strarray_add(prelink_args, opts->prelink);
strarray_add(prelink_args, "--reloc-only");
strarray_add(prelink_args, opts->image_base);
strarray_add(prelink_args, strmake("%s.so", output_file));