Date: Wed, 20 Feb 2013 21:51:37 +0100 From: Tijl Coosemans <tijl@coosemans.org> To: Konstantin Belousov <kostikbel@gmail.com>, Damjan Jovanovic <damjan.jov@gmail.com> Cc: freebsd-hackers@freebsd.org, freebsd-emulation@freebsd.org Subject: Re: [patch] Wine DLL base address patches Message-ID: <51253759.70508@coosemans.org> In-Reply-To: <20130220154855.GF2598@kib.kiev.ua> References: <CAJm2B-mtXqZn0nQH4B9=fYik9gxSM8KAD5QcrLeqDOjXEnYfmg@mail.gmail.com> <20130220154855.GF2598@kib.kiev.ua>
next in thread | previous in thread | raw e-mail | index | archive | help
This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig4D62C2023304E37962419127 Content-Type: multipart/mixed; boundary="------------080104070008010904010603" This is a multi-part message in MIME format. --------------080104070008010904010603 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable 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 mapping= s > which could exist at the specified address. 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. --------------080104070008010904010603 Content-Type: text/plain; charset=ISO-8859-15; name="rtld-wine.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="rtld-wine.diff" 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); --------------080104070008010904010603 Content-Type: text/plain; charset=ISO-8859-15; name="wine-devel-image-base.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="wine-devel-image-base.diff" 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" ); --------------080104070008010904010603-- --------------enig4D62C2023304E37962419127 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (FreeBSD) iF4EAREIAAYFAlElN2EACgkQfoCS2CCgtisDnAD9GONXdn6WPP8p/XyoBD88blqC ddZpmexN7gZj7nGrtGoA/0Khh2ETumbLDXjIkXceVf2xxzOwJSinzMXEAr+3X6LR =0GBW -----END PGP SIGNATURE----- --------------enig4D62C2023304E37962419127--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?51253759.70508>