On 06/05/17 19:23, Tomasz Buchert wrote:
> [...]

Ok, I confirm that dlopen() is required to properly resolve some
symbols later: I can only assume that openmpi does some magic
there. Here are 2 solutions I came up with:

  1. Just like in #741297: add another dlopen() call to the chain (see
     attached simple-but-wrong.debdiff)

  2. Figure out what is the libmpi to load. I attach a proof-of-concept that 
uses dl_iterate_phdr
     to find this out (see attached findlibmpi.debdiff).

I've tested both approaches and they work for me.

Btw, it would be good to add a smoke test to verify that loading from
R works, so that we can detect it just after build.

Let me know what you think.
Tomasz
only in patch2:
unchanged:
--- rmpi-0.6-6.orig/src/Rmpi.c
+++ rmpi-0.6-6/src/Rmpi.c
@@ -74,7 +74,8 @@
 
 #ifndef __APPLE__
 #ifdef OPENMPI
-    if (!dlopen("libmpi.so.1", RTLD_GLOBAL | RTLD_LAZY) 
+       if (!dlopen("libmpi.so.20", RTLD_GLOBAL | RTLD_LAZY) 
+    && !dlopen("libmpi.so.1", RTLD_GLOBAL | RTLD_LAZY) 
        && !dlopen("libmpi.so.0", RTLD_GLOBAL | RTLD_LAZY)
        && !dlopen("libmpi.so", RTLD_GLOBAL | RTLD_LAZY)) {
         Rprintf("%s\n",dlerror());
only in patch2:
unchanged:
--- rmpi-0.6-6.orig/src/Rmpi.c
+++ rmpi-0.6-6/src/Rmpi.c
@@ -15,10 +15,13 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+#define _GNU_SOURCE 
 #include "Rmpi.h"
 
 #ifdef OPENMPI
 #include <dlfcn.h>
+#include <link.h>
+#include <string.h>
 #endif
 
 static MPI_Comm        *comm;
@@ -57,6 +60,15 @@
        return AsInt(i);        
 }
 
+static int                                                                     
                          
+dl_iter_cb(struct dl_phdr_info *info, size_t size, void *data)                 
                            
+{                                                                              
                          
+  if (strstr(info->dlpi_name, "libmpi.so") != NULL) {                          
                          
+    *((char**)data) = strdup(info->dlpi_name);                                 
                          
+  }                                                                            
                          
+  return 0;                                                                    
                          
+}
+
 SEXP mpi_initialize(){
        int i,flag;
        MPI_Initialized(&flag);
@@ -74,12 +86,19 @@
 
 #ifndef __APPLE__
 #ifdef OPENMPI
-    if (!dlopen("libmpi.so.1", RTLD_GLOBAL | RTLD_LAZY) 
-       && !dlopen("libmpi.so.0", RTLD_GLOBAL | RTLD_LAZY)
-       && !dlopen("libmpi.so", RTLD_GLOBAL | RTLD_LAZY)) {
+       char* mpiso = NULL;
+       dl_iterate_phdr(dl_iter_cb, &mpiso);
+       if (mpiso == NULL) {
+               Rprintf("No openmpi linked.\n");
+               return AsInt(0);
+       }
+
+    if (!dlopen(mpiso, RTLD_GLOBAL | RTLD_LAZY)) {
+               free(mpiso);
         Rprintf("%s\n",dlerror());
         return AsInt(0);
     }
+       free(mpiso);
 #endif
 #endif
 

Attachment: signature.asc
Description: PGP signature

Reply via email to