#include <algorithm>
#include <cfloat> /* DBL_MAX */
+#include <cinttypes>
+#include <cstdint> /* intmax_t */
#include <dlfcn.h>
#include <fcntl.h>
#include <fstream>
extern "C" void _gfortran_set_args(int, char **);
#endif
+/* 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
+*/
+#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
#include "papi.h"
std::string papi_default_config_name = "default";
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();
}
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 %" PRIdMAX " 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 %" PRIdMAX " (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];
rank++;
// Load the copy and resolve the entry point:
- void* handle = dlopen(target_executable.c_str(), RTLD_LAZY | RTLD_LOCAL);
+ 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());