Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 20 Feb 2013 23:16:29 +0200
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Tijl Coosemans <tijl@coosemans.org>
Cc:        Damjan Jovanovic <damjan.jov@gmail.com>, freebsd-emulation@freebsd.org, freebsd-hackers@freebsd.org
Subject:   Re: [patch] Wine DLL base address patches
Message-ID:  <20130220211629.GR2598@kib.kiev.ua>
In-Reply-To: <51253759.70508@coosemans.org>
References:  <CAJm2B-mtXqZn0nQH4B9=fYik9gxSM8KAD5QcrLeqDOjXEnYfmg@mail.gmail.com> <20130220154855.GF2598@kib.kiev.ua> <51253759.70508@coosemans.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--3VJSuQsIgdmXj2/q
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Wed, Feb 20, 2013 at 09:51:37PM +0100, Tijl Coosemans wrote:
> On 20-02-2013 16:48, Konstantin Belousov wrote:
> > On Wed, Feb 20, 2013 at 05:29:01PM +0200, Damjan Jovanovic wrote:
> >> Hi
> >>
> >> Wine needs some of its libraries to be loaded at specific base
> >> addresses (https://wiki.freebsd.org/Wine), something FreeBSD currently
> >> lacks.
> >>
> >> I've written a patch to the dynamic loader (/libexec/ld-elf.so.1) that
> >> loads libraries at their preferred base addresses
> >> (http://www.freebsd.org/cgi/query-pr.cgi?pr=3D176216), as well as a po=
rt
> >> of Prelink to FreeBSD which Wine uses to set base addresses
> >> (http://www.freebsd.org/cgi/query-pr.cgi?pr=3D176283). Both work :-),
> >> the changed dynamic loader doesn't show any problems in a few days of
> >> testing, and prelink works with the --reloc-only option as used by
> >> Wine.
> >>
> >> Please review/test/comment/commit.
> >=20
> > Unfortunately, it is not safe. MAP_FIXED overrides any previous mappings
> > which could exist at the specified address.
>=20
> I've simplified the rtld patch to a single line. The second patch makes
> Wine use -Ttext-segment linker flag instead of prelink. This requires
> binutils from ports, but it's easier than porting prelink.
>=20
> Index: libexec/rtld-elf/map_object.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- libexec/rtld-elf/map_object.c	(revision 246986)
> +++ libexec/rtld-elf/map_object.c	(working copy)
> @@ -175,7 +175,7 @@ map_object(int fd, const char *path, const struct
>      base_vaddr =3D trunc_page(segs[0]->p_vaddr);
>      base_vlimit =3D round_page(segs[nsegs]->p_vaddr + segs[nsegs]->p_mem=
sz);
>      mapsize =3D base_vlimit - base_vaddr;
> -    base_addr =3D hdr->e_type =3D=3D ET_EXEC ? (caddr_t) base_vaddr : NU=
LL;
> +    base_addr =3D (caddr_t) base_vaddr;
> =20
>      mapbase =3D mmap(base_addr, mapsize, PROT_NONE, MAP_ANON | MAP_PRIVA=
TE |
>        MAP_NOCORE, -1, 0);

If this is enough for wine, I definitely have no objection.  The typical
dso has zero virtual base for the first segment, so the patch should change
nothing for dso built without special map file.


> Index: Makefile
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- Makefile	(revision 312556)
> +++ Makefile	(working copy)
> @@ -28,7 +28,7 @@
>  LATEST_LINK=3D	wine-devel
>  CPPFLAGS+=3D	-I${LOCALBASE}/include
>  LDFLAGS+=3D	-L${LOCALBASE}/lib
> -USE_GCC=3D	any
> +USE_GCC=3D	4.7
>  GNU_CONFIGURE=3D	yes
>  CONFIGURE_ARGS+=3D--verbose --disable-tests \
>  		--without-alsa --without-capi --without-dbus \
> Index: files/patch-tools-winegcc-utils.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- files/patch-tools-winegcc-utils.h	(revision 0)
> +++ files/patch-tools-winegcc-utils.h	(working copy)
> @@ -0,0 +1,12 @@
> +--- tools/winegcc/utils.h.orig
> ++++ tools/winegcc/utils.h
> +@@ -42,7 +42,8 @@
> +=20
> + enum target_platform
> + {
> +-    PLATFORM_UNSPECIFIED, PLATFORM_APPLE, PLATFORM_SOLARIS, PLATFORM_WI=
NDOWS, PLATFORM_CYGWIN
> ++    PLATFORM_UNSPECIFIED, PLATFORM_APPLE, PLATFORM_FREEBSD, PLATFORM_SO=
LARIS,
> ++    PLATFORM_WINDOWS, PLATFORM_CYGWIN
> + };
> +=20
> + void error(const char* s, ...) DECLSPEC_NORETURN;
> Index: files/patch-tools-winegcc-winegcc.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- files/patch-tools-winegcc-winegcc.c	(revision 0)
> +++ files/patch-tools-winegcc-winegcc.c	(working copy)
> @@ -0,0 +1,32 @@
> +--- tools/winegcc/winegcc.c.orig
> ++++ tools/winegcc/winegcc.c
> +@@ -172,6 +172,7 @@
> + {
> +     { "macos",   PLATFORM_APPLE },
> +     { "darwin",  PLATFORM_APPLE },
> ++    { "freebsd", PLATFORM_FREEBSD },
> +     { "solaris", PLATFORM_SOLARIS },
> +     { "cygwin",  PLATFORM_CYGWIN },
> +     { "mingw32", PLATFORM_WINDOWS },
> +@@ -232,6 +233,8 @@
> +=20
> + #ifdef __APPLE__
> + static enum target_platform build_platform =3D PLATFORM_APPLE;
> ++#elif defined(__FreeBSD__)
> ++static enum target_platform build_platform =3D PLATFORM_FREEBSD;
> + #elif defined(__sun)
> + static enum target_platform build_platform =3D PLATFORM_SOLARIS;
> + #elif defined(__CYGWIN__)
> +@@ -1020,6 +1023,12 @@
> +         if (opts->strip)
> +             strarray_add(link_args, "-Wl,-x");
> +         break;
> ++    case PLATFORM_FREEBSD:
> ++        if (opts->image_base)
> ++        {
> ++            strarray_add(link_args, strmake("-Wl,-Ttext-segment=3D%s", =
opts->image_base));
> ++        }
> ++        break;
> +     case PLATFORM_SOLARIS:
> +         {
> +             char *mapfile =3D get_temp_file( output_name, ".map" );




--3VJSuQsIgdmXj2/q
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (FreeBSD)

iQIcBAEBAgAGBQJRJT0tAAoJEJDCuSvBvK1BOjwQAIwDtkAYTikXCeL6vsrst7hz
6+VKPQm2wZLO0/VBhpKqYgzhjcynxSTYrmf+DWu3iq4i8S7z37nO0UFNozBCCZhh
iHVdXWJ/+NhpBGMVy4b3V88Z6BVvW8i7hZVsX35eiKKLq87hhC9R4rpjEQK9eKgK
10AFW5uNYpmR8IN/qLOXTgMOQ76x8lHrcLdvsw5Pe7WhKX9VGO47CanBm9Ux3cA1
cvmlx8V36W/cATH+dkZ1NgNFtWB2rjL7jp1FR6WOU4K02Jl22ggVVrc6l6E/owdh
DTwrkptrL+Fca0vaN+0xYQbJiRcCZ2Z2m4uTaEH3/6bzFnr7s10lRRA5KHElgzps
MSoery+hPL2YzfTvaYGIBbA+cciguiwFBVavi8BjrmIwLuRnwznN8JTJNjG4UV0v
Wu+BYju5n3jdBlxE+0adZVChioP3f9A0c6xnEoxps4D2ekan9L8Ly1KcjqzHlaJH
y2qTCS4xxBLF6JAdX/pQGVaG5a0NfPDyPnK/TPq9dKPLE4uuzBAPq5nscpGpbfh8
9WlFffV4DYuispAcr9ojeOrfikp5yo0WNwRJS34vdw4h/a2jKwbq/qcNOZsbjGS0
8fUIqoQN1ljhW+8fDRxMPrCAyVUYvqZHmHP8mrhCHbzvbPfrZYoA6wTS3l8JoblE
b8xJHdk5Lb7jGag5YkLI
=kx1j
-----END PGP SIGNATURE-----

--3VJSuQsIgdmXj2/q--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20130220211629.GR2598>