Albert Lee wrote:
> Oops, I meant the subject to be: "Prevent library from being mapped
> non-contiguously"
> 
> On Sun, 2008-04-27 at 21:01 -0400, Albert Lee wrote:
>> Hi,
>>
>> I'm trying to fix a problem in Wine that is caused by a shared library
>> mapping by the dynamic linker. Wine's memory management facility keeps
>> track of where some libraries are mapped and assumes they occupy a
>> contiguous range of the process address space.
>>
>> However, in some cases they are not contiguous. In the following
>> example, there is a 56K "hole" (containing a single page?) between
>> sections of a library at 7FFB0000.
>>
>> 7FF20000     448K r-x--  /export/ws/wine/dlls/ntdll/ntdll.dll.so
>> 7FF90000       4K rw---  /export/ws/wine/dlls/ntdll/ntdll.dll.so
>> 7FF91000     120K r-x--  /export/ws/wine/dlls/ntdll/ntdll.dll.so
>> 7FFB0000       4K rw--- 
>> 7FFBE000      40K rwx--  /export/ws/wine/dlls/ntdll/ntdll.dll.so
>> 7FFC8000      72K rwx--  /export/ws/wine/dlls/ntdll/ntdll.dll.so
>>
>> The problem is that an mmap after the library is loaded can occupy that
>> "hole", which then appears as an overlapping segment to Wine's memory
>> management (http://bugs.winehq.org/attachment.cgi?id=12470 ).
>>
>> What is responsible for this "hole"? Is there a way to prevent it when
>> creating the object file for the library?

Hmm, interesting set of mappings.  Typically there are two or three mapping
for most shared objects: the text segment, the data segment, and possibly
a /dev/zero mapping to provide for bss.  The segments are laid out at
link-edit time based on ABI alignments or mapfile controls.  The segments
are defined by PT_LOAD program headers (see elfdump -p).

The runtime linker (ld.so.1) determines the address range required to
capture all the files segments, and asks the kernel for enough VM to
provide this address range (ie. mmap(0, ..).  ld.so.1 then maps the
text, data and if necessary, any bss segment to the the appropriate
areas within this memory reservation.  Any free space between the
segments is unmapped.  These free spaces could be used to provide
for other mmap() requests as the kernel sees fit.

Bottom line, ld.so.1 doesn't control where the original total reservation
is made, nor what happens to any holes in that reservation that can
be freed up.

I don't have a copy of this dependency, so I can't see from the ELF
program headers how you've gotten 5 separate mappings.

Why does Wine need to care where dependencies are mapped?  Why does
any application care where dependencies are mapped :-)


-- 

Rod.

Reply via email to