[PATCH] winegcc: Check for linker relocation support before relying on prelink
Michael Cronenworth
mike at cchtml.com
Wed Oct 21 20:54:38 CDT 2015
Prelink was used to rewrite binares and set their text segment, but
modern linkers support setting the value at link time. Prelink is
being retired by upstream.
Signed-off-by: Michael Cronenworth <mike at cchtml.com>
---
configure.ac | 11 ++++++++---
tools/winegcc/winegcc.c | 12 ++++++++++--
2 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/configure.ac b/configure.ac
index 5ab2d69..a30b552 100644
--- a/configure.ac
+++ b/configure.ac
@@ -988,10 +988,15 @@ wine-installed: main.o
*) LDEXECFLAGS="$LDEXECFLAGS -Wl,--section-start,.interp=0x7bf00400" ;;
esac
])
- AC_PATH_PROG(PRELINK, prelink, false, [/sbin /usr/sbin $PATH])
- if test "x$PRELINK" = xfalse
+ WINE_TRY_CFLAGS([-Wl,-Ttext-segment=0x7bc00000],
+ [HAVE_TTEXT_SEGMENT="yes"])
+ if test "x$HAVE_TTEXT_SEGMENT" != "xyes"
then
- WINE_WARNING([prelink not found, base address of core dlls won't be set correctly.])
+ AC_PATH_PROG(PRELINK, prelink, false, [/sbin /usr/sbin $PATH])
+ if test "x$PRELINK" = xfalse
+ then
+ WINE_WARNING([prelink not found and linker does not support relocation, base address of core dlls won't be set correctly.])
+ fi
fi
;;
esac
diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c
index 3b2794e..fa62c34 100644
--- a/tools/winegcc/winegcc.c
+++ b/tools/winegcc/winegcc.c
@@ -778,6 +778,7 @@ static void build(struct options* opts)
const char *output_name, *spec_file, *lang;
int generate_app_loader = 1;
int fake_module = 0;
+ int text_segment = 0;
unsigned int j;
/* NOTE: for the files array we'll use the following convention:
@@ -1112,6 +1113,11 @@ static void build(struct options* opts)
for ( j = 0 ; j < opts->linker_args->size ; j++ )
strarray_add(link_args, opts->linker_args->base[j]);
+ /* check linker support for setting text base address */
+ if (opts->image_base &&
+ !try_link(opts->prefix, link_args, strmake("-Wl,-Ttext-segment=%s", opts->image_base)))
+ text_segment = 1;
+
switch (opts->target_platform)
{
case PLATFORM_APPLE:
@@ -1134,6 +1140,8 @@ static void build(struct options* opts)
}
break;
default:
+ if (text_segment)
+ strarray_add(link_args, strmake("-Wl,-Ttext-segment=%s", opts->image_base));
break;
}
@@ -1167,8 +1175,8 @@ static void build(struct options* opts)
spawn(opts->prefix, link_args, 0);
strarray_free (link_args);
- /* set the base address */
- if (opts->image_base && !opts->target)
+ /* set the base address with prelink if linker support is not present */
+ if (opts->image_base && !opts->target && !text_segment)
{
const char *prelink = PRELINK;
if (prelink[0] && strcmp(prelink,"false"))
--
2.4.3
More information about the wine-patches
mailing list