Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix format string.
[simgrid.git] / src / smpi / internals / smpi_global.cpp
index aaef32d..21e938e 100644 (file)
@@ -15,6 +15,7 @@
 
 #include <algorithm>
 #include <cfloat> /* DBL_MAX */
+#include <cstdint> /* intmax_t */
 #include <dlfcn.h>
 #include <fcntl.h>
 #include <fstream>
@@ -53,12 +54,14 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_kernel, smpi, "Logging specific to SMPI (ke
   extern "C" void _gfortran_set_args(int, char **);
 #endif
 
-#ifndef RTLD_DEEPBIND
 /* RTLD_DEEPBIND is a bad idea of GNU ld that obviously does not exist on other platforms
  * See https://www.akkadia.org/drepper/dsohowto.pdf
  * and https://lists.freebsd.org/pipermail/freebsd-current/2016-March/060284.html
 */
-#define RTLD_DEEPBIND 0
+#if !defined(RTLD_DEEPBIND) || HAVE_SANITIZER_ADDRESS || HAVE_SANITIZER_THREAD
+#define WANT_RTLD_DEEPBIND 0
+#else
+#define WANT_RTLD_DEEPBIND RTLD_DEEPBIND
 #endif
 
 #if HAVE_PAPI
@@ -128,10 +131,6 @@ void smpi_process_init(int *argc, char ***argv){
   simgrid::smpi::ActorExt::init(argc, argv);
 }
 
-int smpi_process_index(){
-  return simgrid::s4u::this_actor::get_pid();
-}
-
 void * smpi_process_get_user_data(){
   return Actor::self()->get_impl()->get_user_data();
 }
@@ -491,11 +490,11 @@ static void smpi_copy_file(std::string src, std::string target, off_t fdin_size)
   int fdout = open(target.c_str(), O_CREAT | O_RDWR, S_IRWXU);
   xbt_assert(fdout >= 0, "Cannot write into %s", target.c_str());
 
-  XBT_DEBUG("Copy %ld bytes into %s", static_cast<long>(fdin_size), target.c_str());
+  XBT_DEBUG("Copy %jd bytes into %s", static_cast<intmax_t>(fdin_size), target.c_str());
 #if HAVE_SENDFILE
   ssize_t sent_size = sendfile(fdout, fdin, NULL, fdin_size);
-  xbt_assert(sent_size == fdin_size, "Error while copying %s: only %zd bytes copied instead of %ld (errno: %d -- %s)",
-             target.c_str(), sent_size, fdin_size, errno, strerror(errno));
+  xbt_assert(sent_size == fdin_size, "Error while copying %s: only %zd bytes copied instead of %jd (errno: %d -- %s)",
+             target.c_str(), sent_size, static_cast<intmax_t>(fdin_size), errno, strerror(errno));
 #else
   const int bufsize = 1024 * 1024 * 4;
   char buf[bufsize];
@@ -577,7 +576,7 @@ static void smpi_init_privatization_dlopen(std::string executable)
 
       smpi_copy_file(executable, target_executable, fdin_size);
       // if smpi/privatize-libs is set, duplicate pointed lib and link each executable copy to a different one.
-      std::string target_lib;
+      std::vector<std::string> target_libs;
       for (auto const& libpath : privatize_libs_paths) {
         // if we were given a full path, strip it
         size_t index = libpath.find_last_of("/\\");
@@ -596,8 +595,9 @@ static void smpi_init_privatization_dlopen(std::string executable)
           unsigned int pad = 7;
           if (libname.length() < pad)
             pad = libname.length();
-          target_lib =
+          std::string target_lib =
               std::string(pad - std::to_string(rank).length(), '0') + std::to_string(rank) + libname.substr(pad);
+          target_libs.push_back(target_lib);
           XBT_DEBUG("copy lib %s to %s, with size %lld", libpath.c_str(), target_lib.c_str(), (long long)fdin_size2);
           smpi_copy_file(libpath, target_lib, fdin_size2);
 
@@ -610,11 +610,11 @@ static void smpi_init_privatization_dlopen(std::string executable)
 
       rank++;
       // Load the copy and resolve the entry point:
-      void* handle    = dlopen(target_executable.c_str(), RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND);
+      void* handle    = dlopen(target_executable.c_str(), RTLD_LAZY | RTLD_LOCAL | WANT_RTLD_DEEPBIND);
       int saved_errno = errno;
       if (simgrid::config::get_value<bool>("smpi/keep-temps") == false) {
         unlink(target_executable.c_str());
-        if (not target_lib.empty())
+        for (const std::string& target_lib : target_libs)
           unlink(target_lib.c_str());
       }
       if (handle == nullptr)