Re: [DynInst_API:] Issue about linux-vdso.so.1


Date: Tue, 18 Jun 2013 10:56:10 +0800
From: Zifei Tong <soariez@xxxxxxxxx>
Subject: Re: [DynInst_API:] Issue about linux-vdso.so.1
Hi,

Thanks for your explanation.

The copying/renaming trick and the workaround patch I attached in the
last mail is to demonstrate the issue.

I just realized this could be a issue of glibc [2]. Dyninst might need
work around this problem as in [1][3].

[1] http://sourceware.org/bugzilla/show_bug.cgi?id=14466
[2] http://sourceware.org/bugzilla/show_bug.cgi?id=13097
[3] http://pkgs.fedoraproject.org/cgit/gdb.git/tree/gdb-glibc-vdso-workaround.patch

Thanks,
Zifei Tong

On Tue, Jun 18, 2013 at 1:54 AM, Saul St. John <sstjohn@xxxxxxxxxxx> wrote:
> linux-vdso.so.1 (nee linux-gate.so.1) is a virtual shared library that lives
> in the kernel, providing fast syscall alternatives. It is mapped by the
> kernel into the address space of any userland program.
>
> I don't know what the correct solution is, but copying a different shared
> object into /usr/lib and renaming it linux-vdso.so.1 does not sound OK; it
> sounds likely to confuse ld.so.
>
> see also:
>
> *
> https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/ABI/stable/vdso?id=v3.8
>
> * http://www.trilithium.com/johan/2005/08/linux-gate/
>
> -s
>
>
> On 06/16/2013 12:05 PM, Zifei Tong wrote:
>>
>> Hi,
>>
>> I cannot get dyninst working on my Archlinux machine.
>>
>> The problem is dyninst tries to load linux-vdso.so.1, which will fail.
>>
>> I copyed a .so file for /usr/lib and rename it to linux-vdso.so.1,
>> then everything is OK.
>>
>> Here is related debug log:
>>
>> [140737353914176]mapped_object.C[157]:  about to parseImage
>> [140737353914176]mapped_object.C[159]: name linux-vdso.so.1, codeBase
>> 0x7ffff88fa000, dataBase 0x7ffff88fa000
>> [140737353914176]image.C[1100]:  about to create image
>> [140737353914176]image.C[1374]:  opening file linux-vdso.so.1
>> [140737353914176]image.C[1102]:  created image
>> [140737353914176]image.C[1105]: processing shared object
>> [140737353914176]image.C[1123]: error in processing, deleting image
>> and returning
>> [140737353914176]mapped_object.C[162]:  failed to parseImage
>> [140737353914176]pcEventHandler.C[857]: failed to create mapped object
>> for library linux-vdso.so.1
>> [140737353914176]pcEventHandler.C[194]: continue condition ( 0 0 1 1 1 1 )
>> [140737353914176]pcEventHandler.C[230]: delaying process continue:
>> <return failure> <desired stop> <stopped> <no reported event> <not
>> terminated> <no pending events>
>> [140737353914176]pcEventHandler.C[242]: finished handling event:
>> Library (err = true)
>> [140737353914176]dynProcess.C[418]: bootstrap failed to wait for events
>> Failed to bootstrap process 26943: terminating...
>> [140737353914176]dynProcess.C[1147]: Terminating process 26943
>> [140737353914176]pcEventMuxer.C[219]: Begin callbackMux, process
>> pointer = 0x6b4e90, event post-ForceTerminate
>> [140737353914176]pcEventMuxer.C[439]: Added event post-ForceTerminate
>> to mailbox, size now 1
>> [140737353914176]pcEventMuxer.C[221]: after muxing event, mailbox size is
>> 1
>> [140737353914176]pcEventMuxer.C[464]: Returning event
>> post-ForceTerminate from mailbox
>> [140737353914176]pcEventHandler.C[65]: attempting to handle event
>> post-ForceTerminate on thread 26943/26943
>> [140737353914176]pcEventHandler.C[194]: continue condition ( 1 0 1 1 0 1 )
>> [140737353914176]pcEventHandler.C[230]: delaying process continue:
>> <return success> <desired stop> <stopped> <no reported event>
>> <terminated> <no pending events>
>> [140737353914176]pcEventHandler.C[236]: pending exit reported to
>> BPatch-level, marking process exited
>> [140737353914176]pcEventHandler.C[242]: finished handling event:
>> post-ForceTerminate (err = false)
>> [140737353914176]dynProcess.C[1155]: finished terminating process 26943
>> --FATAL-- #68: Dyninst was unable to create the specified process
>> --FATAL-- #68: create process failed bootstrap
>>
>> Here is a workaround patch:
>>
>> diff --git a/dyninstAPI/src/pcEventHandler.C
>> b/dyninstAPI/src/pcEventHandler.C
>> index 46a4ff9..64c516d 100644
>> --- a/dyninstAPI/src/pcEventHandler.C
>> +++ b/dyninstAPI/src/pcEventHandler.C
>> @@ -839,6 +839,8 @@ bool
>> PCEventHandler::handleLibrary(EventLibrary::const_ptr ev, PCProcess
>> *evProc
>>       const set<Library::ptr> &added = ev->libsAdded();
>>
>>       for(set<Library::ptr>::const_iterator i = added.begin(); i !=
>> added.end(); ++i) {
>> +        if ((*i)->getAbsoluteName() == "linux-vdso.so.1")
>> +            continue;
>>           Address dataAddress = (*i)->getLoadAddress();
>>           if( evProc->usesDataLoadAddress() ) dataAddress =
>> (*i)->getDataLoadAddress();
>>
>> I tried to trace what's going on but got no clue. Would you please help?
>>
>> I am using Linux 3.9.6 x86_64, with dyninst compiled against master HEAD.
>>
>> Thanks,
>> --
>> 仝子飞 (Zifei Tong)
>> College of Computer Science and Technology, Zhejiang University
>> _______________________________________________
>> Dyninst-api mailing list
>> Dyninst-api@xxxxxxxxxxx
>> https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api
>>
>
t
[← Prev in Thread] Current Thread [Next in Thread→]