Systems without Weak Symbols



next up previous contents
Next: Complications Up: MPI Library Implementation Previous: Systems With Weak

Systems without Weak Symbols

In the absence of weak symbols then one possible solution would be to use the C macro pre-processor thus

#ifdef PROFILELIB
#    ifdef __STDC__
#        define FUNCTION(name) P##name
#    else
#        define FUNCTION(name) P/**/name
#    endif
#else
#    define FUNCTION(name) name
#endif

Each of the user visible functions in the library would then be declared thus

int FUNCTION(MPI_Send)(/* appropriate args */)
{
    /* Useful content */        
}

The same source file can then be compiled to produce the MPI and the PMPI versions of the library, depending on the state of the PROFILELIB macro symbol.

It is required that the standard MPI library be built in such a way that the inclusion of MPI functions can be achieved one at a time. This is a somewhat unpleasant requirement, since it may mean that each external function has to be compiled from a separate file. However this is necessary so that the author of the profiling library need only define those MPI functions that are to be intercepted, references to any others being fulfilled by the normal MPI library. Therefore the link step can look something like this

% cc ... -lprof -lpmpi -lmpi

Here libprof.a contains the profiler functions which intercept some of the MPI functions. libpmpi.a contains the ``name shifted'' MPI functions, and libmpi.a contains the normal definitions of the MPI functions. Thus, on systems without weak links the example shown in Fig. gif would be resolved as shown in Fig. gif


Figure: Resolution of MPI calls on systems without weak links.



Jack Dongarra
Fri Sep 1 06:16:55 EDT 1995