Date: Thu, 21 Feb 2013 00:57:45 +0200 From: Damjan Jovanovic <damjan.jov@gmail.com> To: Tijl Coosemans <tijl@coosemans.org> Cc: Konstantin Belousov <kostikbel@gmail.com>, freebsd-hackers@freebsd.org, freebsd-emulation@freebsd.org Subject: Re: [patch] Wine DLL base address patches Message-ID: <CAJm2B-=_HokZx5kOn0MDFAU8OrEBgFAE-32tBboX9%2BmubwenCQ@mail.gmail.com> 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
--f46d04088f171ba4d104d62fe4f9 Content-Type: text/plain; charset=ISO-8859-1 On Wed, Feb 20, 2013 at 10:51 PM, Tijl Coosemans <tijl@coosemans.org> 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. > All of that occurred to me as well. The problem with that one-line rtld patch is that loading an application will now fail if any of its libraries cannot be loaded at their requested address. The problem with -Ttext-segment (and isn't it just -Ttext?) is that it doesn't seem to work: the base_vaddr seen by rtld will remain 0, and the address listed in /proc/.../map is different from what it should be. Also run "readelf -l" on a library compiled that way and compare with the output of one run through "prelink --reloc-only", you'll see the lowest VirtAddr and PhysAddr in LOAD headers change only with prelink. I really ported prelink because there was no other choice. See my attached test cases, and examine the contents of /proc/.../map while they run. --f46d04088f171ba4d104d62fe4f9--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJm2B-=_HokZx5kOn0MDFAU8OrEBgFAE-32tBboX9%2BmubwenCQ>