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>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --] 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=176216), as well as a port > >> of Prelink to FreeBSD which Wine uses to set base addresses > >> (http://www.freebsd.org/cgi/query-pr.cgi?pr=176283). 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. > > > > Unfortunately, it is not safe. MAP_FIXED overrides any previous mappings > > 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. > > Index: libexec/rtld-elf/map_object.c > =================================================================== > --- 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 = trunc_page(segs[0]->p_vaddr); > base_vlimit = round_page(segs[nsegs]->p_vaddr + segs[nsegs]->p_memsz); > mapsize = base_vlimit - base_vaddr; > - base_addr = hdr->e_type == ET_EXEC ? (caddr_t) base_vaddr : NULL; > + base_addr = (caddr_t) base_vaddr; > > mapbase = mmap(base_addr, mapsize, PROT_NONE, MAP_ANON | MAP_PRIVATE | > 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 > =================================================================== > --- Makefile (revision 312556) > +++ Makefile (working copy) > @@ -28,7 +28,7 @@ > LATEST_LINK= wine-devel > CPPFLAGS+= -I${LOCALBASE}/include > LDFLAGS+= -L${LOCALBASE}/lib > -USE_GCC= any > +USE_GCC= 4.7 > GNU_CONFIGURE= yes > CONFIGURE_ARGS+=--verbose --disable-tests \ > --without-alsa --without-capi --without-dbus \ > Index: files/patch-tools-winegcc-utils.h > =================================================================== > --- 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 @@ > + > + enum target_platform > + { > +- PLATFORM_UNSPECIFIED, PLATFORM_APPLE, PLATFORM_SOLARIS, PLATFORM_WINDOWS, PLATFORM_CYGWIN > ++ PLATFORM_UNSPECIFIED, PLATFORM_APPLE, PLATFORM_FREEBSD, PLATFORM_SOLARIS, > ++ PLATFORM_WINDOWS, PLATFORM_CYGWIN > + }; > + > + void error(const char* s, ...) DECLSPEC_NORETURN; > Index: files/patch-tools-winegcc-winegcc.c > =================================================================== > --- 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 @@ > + > + #ifdef __APPLE__ > + static enum target_platform build_platform = PLATFORM_APPLE; > ++#elif defined(__FreeBSD__) > ++static enum target_platform build_platform = PLATFORM_FREEBSD; > + #elif defined(__sun) > + static enum target_platform build_platform = 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=%s", opts->image_base)); > ++ } > ++ break; > + case PLATFORM_SOLARIS: > + { > + char *mapfile = get_temp_file( output_name, ".map" ); [-- Attachment #2 --] -----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-----help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20130220211629.GR2598>
