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

Marcus Meissner marcus at jet.franken.de
Sat Oct 17 08:41:30 CDT 2015


On Fri, Oct 16, 2015 at 10:21:50AM -0500, Michael Cronenworth wrote:
> 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>

Can confirm it works on SUSE too.

Signed-Off-By: Marcus Meissner <marcus at jet.franken.de>

> ---
>  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