69 lines
2.5 KiB
Diff
69 lines
2.5 KiB
Diff
|
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@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
|
||
|
|
||
|
|
||
|
|
||
|
|