[PATCH] configure: Check for linker relocation support before relying on prelink

Michael Cronenworth mike at cchtml.com
Fri Oct 16 10:21:50 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 | 11 +++++++++--
 2 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/configure.ac b/configure.ac
index de8cde5..f283802 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..4acd12d 100644
--- a/tools/winegcc/winegcc.c
+++ b/tools/winegcc/winegcc.c
@@ -1134,6 +1134,12 @@ static void build(struct options* opts)
         }
         break;
     default:
+        /* Try option first, modern linkers support this */
+        if (opts->image_base &&
+            !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));
+        }
         break;
     }
 
@@ -1167,8 +1173,9 @@ 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 &&
+        try_link(opts->prefix, link_args, strmake("-Wl,-Ttext-segment=%s", opts->image_base)))
     {
         const char *prelink = PRELINK;
         if (prelink[0] && strcmp(prelink,"false"))
-- 
2.4.3




More information about the wine-patches mailing list