Those of you who write parallel applications know full well that, while using MPI to divide and conquer in your apps means that your code will compile and run just about anywhere, you cannot simply move your application from one MPI implementation to another, even on the same machine.
This is because MPI specifies an application programming interface (API), not a binary interface.
Switching to another launching-mechanism requires the user to relink the application to the corresponding MPI-library. In general, this re-linking is not possible without first recompiling the application, because different MPI-implementations are not guaranteed to be binary compatible.
ClusterMonkey has an interesting piece on the value of adopting an application binary interface as a mechanism to stimulate ISV development
Through striving for optimal performance, the MPI standard reduces portability, however. The MPI-standard forces applications to be launched using the same MPI-implementation as the one they were compiled against. This is no problem when the application is compiled and launched on the same machine. However this is a severe constraint for shrink-wrapped software.
Shrink-wrapped software is only available on a limited number of platforms which are selected by the application-developer. The HPC-world, in which MPI is mainly used, consists of many diverse platforms in contrast to the many X86 mainstream applications (e.g. office applications).
You can find the full article at ClusterMonkey; it walks though a discussion of an implementation of an ABI for MPI called MorphMPI.
MorphMPI is available under the LGPL and is hosted on sourceforge. Actually it is essential to MorphMPI to make the source-code available because this allows users to compile and link morphed applications with any MPI-implementation.