[patch] Wine DLL base address patches

Damjan Jovanovic damjan.jov at gmail.com
Wed Feb 20 22:58:13 UTC 2013


On Wed, Feb 20, 2013 at 10:51 PM, Tijl Coosemans <tijl at 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.


More information about the freebsd-emulation mailing list