[Darshan-users] Instrumenting statically-linked applications
Phil Carns
carns at mcs.anl.gov
Thu Nov 29 08:45:52 CST 2012
On 11/29/2012 09:42 AM, Phil Carns wrote:
> On 11/28/2012 11:10 PM, Dragos Constantin wrote:
>> Hi Phil,
>> Here is the ldd output:
>>
> <snip>
>> libmpich.so.1.2 => /opt/apps/gcc4_4/mvapich2/1.6/lib/libmpich.so.1.2
>> (0x00002b574274a000)
> <snip>
>
>> libc.so.6 => /lib64/libc.so.6 (0x000000358d400000)
>
> Hi Dragos, sorry about the wild goose chase, but because these two
> libraries are shared, you will need to use the LD_PRELOAD method to
> capture your I/O calls. The mechanism that you have been using (with
> a modified mpicc script) only works when those libraries are
> statically linked.
>
>>
>> I believe LD_PRELOAD is used by the dynamic library loader (ld.so) to
>> find the darshan dynamic library 'libdarshan.so'. I might be wrong so
>> please do not hesitate to correct me. In any case, it does not hurt
>> to export this environment variable but if I am right this will not
>> change a thing as 'ld.so' does not touch 'libdarshan.so'.
>
> The general idea with this approach is that you link your application
> normally at compile time and then set LD_PRELOAD to point to
> libdarshan.so at run time. When your application launches, ld.so will
> link in this LD_PRELOAD library before anything else, which gives
> Darshan a chance to intercept your I/O function symbols before they
> get to libc or libmpich. LD_PRELOAD doesn't just set a library path,
> it actually specifies a specific .so file (previously unknown to the
> application) that the loader will link in.
>
> So the steps that you need to try are as follows:
>
> 1) recompile and relink your application using the stock mpicc (with
> no darshan modifications). You should not see any darshan symbols in
> the resulting executable.
> 2) add a line like this near the job of your job script:
>
> #$ -v
> LD_PRELOAD=/full/path/to/your/darshan/installation/lib/libdarshan.so
Just a quick note to anyone else that may run across this in the list
archives; the format of that line is specific to the scheduler used on
Ranger. In general you might just do "export LD_PRELOAD=..." to set the
environment variable or else use whatever is appropriate for your
scheduler or job launcher.
-Phil
>
> 3) run your application as usual
>
> I think that should work in your case. As Bill mentioned you do need
> to call MPI_Init() and MPI_Finalize(), but it sounds like you are
> already doing that (otherwise you would not get the empty log that you
> are seeing now), so you should be all set.
>
> Sorry about the confusion. It is pretty annoying that there isn't one
> method that works for both static and dynamic linking. You have to go
> one way or the other depending on how those libraries are used.
>
> -Phil
>
> _______________________________________________
> Darshan-users mailing list
> Darshan-users at lists.mcs.anl.gov
> https://lists.mcs.anl.gov/mailman/listinfo/darshan-users
More information about the Darshan-users
mailing list