- if (smpi_privatize_global_variables == SmpiPrivStrategies::DLOPEN) {
-
- std::string executable_copy = executable;
-
- // Prepare the copy of the binary (get its size)
- struct stat fdin_stat;
- stat(executable_copy.c_str(), &fdin_stat);
- off_t fdin_size = fdin_stat.st_size;
- static std::size_t rank = 0;
-
-
- std::string libname = simgrid::config::get_value<std::string>("smpi/privatize-lib");
- std::string target_lib;
- if(not libname.empty()){
- //load the library once to add it to the local libs, to get the absolute path
- void* libhandle = dlopen(libname.c_str(), RTLD_LAZY);
- //get library name from path
- char fullpath[512]={'\0'};
- strcpy(fullpath, libname.c_str());
- int ret = dl_iterate_phdr(visit_libs, fullpath);
- if(ret==0)
- xbt_die("Can't find a linked %s - check the setting you gave to smpi/privatize-lib", fullpath);
- else
- XBT_DEBUG("Extra lib to privatize found : %s", fullpath);
- privatize_lib_path=strdup(fullpath);
- dlclose(libhandle);
- }
-
- simix_global->default_function = [executable_copy, fdin_size](std::vector<std::string> args) {
- return std::function<void()>([executable_copy, fdin_size, args] {
-
- // Copy the dynamic library:
- std::string target_executable = executable_copy
- + "_" + std::to_string(getpid())
- + "_" + std::to_string(rank) + ".so";
-
- smpi_copy_file(executable_copy, target_executable, fdin_size, rank);
-
- //if smpi/privatize-lib is set, duplicate pointed lib and link each executable to a different one.
- //TODO : extend to multiple libs
- std::string libname = simgrid::config::get_value<std::string>("smpi/privatize-lib");
- //if we were given a full path, strip it
- size_t index = libname.find_last_of("/\\");
- if(index!=std::string::npos)
- libname=libname.substr(index+1);
- std::string target_lib;
- if(not libname.empty()){
- //load the library to add it to the local libs, to get the absolute path
- struct stat fdin_stat2;
- stat(privatize_lib_path, &fdin_stat2);
- off_t fdin_size2 = fdin_stat2.st_size;
-
- // Copy the dynamic library, the new name must be the same length as the old one
- // just replace the name with 0s and the rank.
- target_lib = std::string(libname.length() - std::to_string(rank).length(), '0')+std::to_string(rank);
- XBT_DEBUG("copy lib %s to %s, with size %zd", privatize_lib_path, target_lib.c_str(), fdin_size2);
- smpi_copy_file(privatize_lib_path, target_lib, fdin_size2, rank);
-
- std::string sedcommand = "sed -i -e 's/"+libname+"/"+target_lib+"/g' "+target_executable;
- int ret = system(sedcommand.c_str());
- if(ret!=0) xbt_die ("error while applying sed command %s \n", sedcommand.c_str());
- }
- rank++;
- // Load the copy and resolve the entry point:
- void* handle = dlopen(target_executable.c_str(), RTLD_LAZY | RTLD_LOCAL | 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())
- unlink(target_lib.c_str());
- }
- if (handle == nullptr)
- xbt_die("dlopen failed: %s (errno: %d -- %s)", dlerror(), saved_errno, strerror(saved_errno));
- smpi_entry_point_type entry_point = smpi_resolve_function(handle);
- if (not entry_point)
- xbt_die("Could not resolve entry point");
- smpi_run_entry_point(entry_point, args);
- });
- };
- }
- else {
- if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP)
- smpi_prepare_global_memory_segment();
- // Load the dynamic library and resolve the entry point:
- void* handle = dlopen(executable, RTLD_LAZY | RTLD_LOCAL);
- if (handle == nullptr)
- xbt_die("dlopen failed for %s: %s (errno: %d -- %s)", executable, dlerror(), errno, strerror(errno));
- smpi_entry_point_type entry_point = smpi_resolve_function(handle);
- if (not entry_point)
- xbt_die("main not found in %s", executable);
- if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP)
- smpi_backup_global_memory_segment();
-
- // Execute the same entry point for each simulated process:
- simix_global->default_function = [entry_point](std::vector<std::string> args) {
- return std::function<void()>([entry_point, args] {
- smpi_run_entry_point(entry_point, args);
- });
- };
- }