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
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();
}
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("/\\");
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);
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)