Skip to content

Commit a41a5c1

Browse files
authored
Fix LD_PRELOAD (#184)
- __libc_start_main in libomnitrace-dl wasn't wrapping bc of -fvisibility=hidden - fix OMNITRACE_STRIP_TARGET - omnitrace_reset_preload function in main library - defer removing libomnitrace from LD_PRELOAD
1 parent f2a0485 commit a41a5c1

File tree

8 files changed

+111
-20
lines changed

8 files changed

+111
-20
lines changed

cmake/MacroUtilities.cmake

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,11 +122,11 @@ function(OMNITRACE_STRIP_TARGET _TARGET)
122122
--keep-symbol="omnitrace_finalize" --keep-symbol="omnitrace_push_trace"
123123
--keep-symbol="omnitrace_pop_trace" --keep-symbol="omnitrace_push_region"
124124
--keep-symbol="omnitrace_pop_region" --keep-symbol="omnitrace_set_env"
125-
--keep-symbol="omnitrace_set_mpi" --keep-symbol="omnitrace_user_*"
126-
--keep-symbol="ompt_start_tool" --keep-symbol="kokkosp_*"
127-
--keep-symbol="OnLoad" --keep-symbol="OnUnload"
128-
--keep-symbol="OnLoadToolProp" --keep-symbol="OnUnloadTool" ${ARGN}
129-
$<TARGET_FILE:${_TARGET}>
125+
--keep-symbol="omnitrace_set_mpi" --keep-symbol="omnitrace_reset_preload"
126+
--keep-symbol="omnitrace_user_*" --keep-symbol="ompt_start_tool"
127+
--keep-symbol="kokkosp_*" --keep-symbol="OnLoad" --keep-symbol="OnUnload"
128+
--keep-symbol="OnLoadToolProp" --keep-symbol="OnUnloadTool"
129+
--keep-symbol="__libc_start_main" ${ARGN} $<TARGET_FILE:${_TARGET}>
130130
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
131131
COMMENT "Stripping ${_TARGET}...")
132132
endif()

source/bin/omnitrace-avail/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ set_target_properties(
3131
omnitrace-avail PROPERTIES BUILD_RPATH "\$ORIGIN:\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}"
3232
INSTALL_RPATH "${OMNITRACE_EXE_INSTALL_RPATH}")
3333

34+
omnitrace_strip_target(omnitrace-avail)
35+
3436
install(
3537
TARGETS omnitrace-avail
3638
DESTINATION ${CMAKE_INSTALL_BINDIR}

source/bin/omnitrace-sample/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ set_target_properties(
1717
omnitrace-sample PROPERTIES BUILD_RPATH "\$ORIGIN:\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}"
1818
INSTALL_RPATH "${OMNITRACE_EXE_INSTALL_RPATH}")
1919

20+
omnitrace_strip_target(omnitrace-sample)
21+
2022
install(
2123
TARGETS omnitrace-sample
2224
DESTINATION ${CMAKE_INSTALL_BINDIR}

source/lib/omnitrace-dl/dl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -963,7 +963,7 @@ omnitrace_preload()
963963

964964
if(_preload)
965965
{
966-
reset_omnitrace_preload();
966+
// reset_omnitrace_preload();
967967
omnitrace_preinit_library();
968968
OMNITRACE_DL_LOG(1, "[%s] invoking %s(%s)\n", __FUNCTION__, "omnitrace_init",
969969
::omnitrace::join(::omnitrace::QuoteStrings{}, ", ", "sampling",

source/lib/omnitrace-dl/main.c

Lines changed: 47 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,46 @@
2222

2323
#define _GNU_SOURCE
2424

25+
#define OMNITRACE_PUBLIC_API __attribute__((visibility("default")));
26+
#define OMNITRACE_HIDDEN_API __attribute__((visibility("hidden")));
27+
2528
#include <dlfcn.h>
2629
#include <stdio.h>
2730
#include <unistd.h>
2831
#include <stdlib.h>
2932
#include <string.h>
3033
#include <stdbool.h>
3134

35+
//
36+
// local type definitions
37+
//
38+
typedef int (*start_main_t)(int (*)(int, char**, char**), int, char**,
39+
int (*)(int, char**, char**), void (*)(void), void (*)(void),
40+
void*);
41+
42+
//
43+
// local variables
44+
//
45+
static int (*main_real)(int, char**, char**); // Trampoline for the real main()
46+
47+
//
48+
// local function declarations
49+
//
50+
int
51+
omnitrace_main(int, char**, char**) OMNITRACE_HIDDEN_API;
52+
53+
int
54+
omnitrace_libc_start_main(int (*)(int, char**, char**), int, char**,
55+
int (*)(int, char**, char**), void (*)(void), void (*)(void),
56+
void*) OMNITRACE_HIDDEN_API;
57+
58+
int
59+
__libc_start_main(int (*)(int, char**, char**), int, char**, int (*)(int, char**, char**),
60+
void (*)(void), void (*)(void), void*) OMNITRACE_PUBLIC_API;
61+
62+
//
63+
// external function declarations
64+
//
3265
extern int
3366
omnitrace_preload_library(void);
3467

@@ -41,18 +74,15 @@ omnitrace_push_trace(const char* name);
4174
extern void
4275
omnitrace_pop_trace(const char* name);
4376

44-
// extern void
45-
// omnitrace_update_env(char*** envp);
46-
4777
extern void
4878
omnitrace_init_tooling(void);
4979

5080
extern void
5181
omnitrace_init(const char*, bool, const char*);
5282

53-
// Trampoline for the real main()
54-
static int (*main_real)(int, char**, char**);
55-
83+
//
84+
// local function definitions
85+
//
5686
int
5787
omnitrace_main(int argc, char** argv, char** envp)
5888
{
@@ -77,13 +107,8 @@ omnitrace_main(int argc, char** argv, char** envp)
77107
return ret;
78108
}
79109

80-
typedef int
81-
(*omnitrace_libc_start_main)(int (*)(int, char**, char**), int, char**,
82-
int (*)(int, char**, char**), void (*)(void),
83-
void (*)(void), void*);
84-
85110
int
86-
__libc_start_main(int (*_main)(int, char**, char**), int _argc, char** _argv,
111+
omnitrace_libc_start_main(int (*_main)(int, char**, char**), int _argc, char** _argv,
87112
int (*_init)(int, char**, char**), void (*_fini)(void),
88113
void (*_rtld_fini)(void), void* _stack_end)
89114
{
@@ -101,7 +126,7 @@ __libc_start_main(int (*_main)(int, char**, char**), int _argc, char** _argv,
101126
main_real = _main;
102127

103128
// Find the real __libc_start_main()
104-
omnitrace_libc_start_main user_main = dlsym(RTLD_NEXT, "__libc_start_main");
129+
start_main_t user_main = dlsym(RTLD_NEXT, "__libc_start_main");
105130

106131
// disable future LD_PRELOADs
107132
setenv("OMNITRACE_PRELOAD", "0", 1);
@@ -127,3 +152,12 @@ __libc_start_main(int (*_main)(int, char**, char**), int _argc, char** _argv,
127152
return -1;
128153
}
129154
}
155+
156+
int
157+
__libc_start_main(int (*_main)(int, char**, char**), int _argc, char** _argv,
158+
int (*_init)(int, char**, char**), void (*_fini)(void),
159+
void (*_rtld_fini)(void), void* _stack_end)
160+
{
161+
return omnitrace_libc_start_main(_main, _argc, _argv, _init, _fini, _rtld_fini,
162+
_stack_end);
163+
}

source/lib/omnitrace/api.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@ omnitrace_finalize(void)
9090
omnitrace_finalize_hidden();
9191
}
9292

93+
extern "C" void
94+
omnitrace_reset_preload(void)
95+
{
96+
omnitrace_reset_preload_hidden();
97+
}
98+
9399
extern "C" void
94100
omnitrace_set_env(const char* env_name, const char* env_val)
95101
{

source/lib/omnitrace/api.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ extern "C"
4343
/// shuts down all tooling and generates output
4444
void omnitrace_finalize(void) OMNITRACE_PUBLIC_API;
4545

46+
/// remove libomnitrace from LD_PRELOAD
47+
void omnitrace_reset_preload(void) OMNITRACE_PUBLIC_API;
48+
4649
/// sets an environment variable
4750
void omnitrace_set_env(const char* env_name,
4851
const char* env_val) OMNITRACE_PUBLIC_API;
@@ -76,6 +79,7 @@ extern "C"
7679
bool omnitrace_init_tooling_hidden(void) OMNITRACE_HIDDEN_API;
7780
void omnitrace_init_hidden(const char*, bool, const char*) OMNITRACE_HIDDEN_API;
7881
void omnitrace_finalize_hidden(void) OMNITRACE_HIDDEN_API;
82+
void omnitrace_reset_preload_hidden(void) OMNITRACE_HIDDEN_API;
7983
void omnitrace_set_env_hidden(const char* env_name,
8084
const char* env_val) OMNITRACE_HIDDEN_API;
8185
void omnitrace_set_mpi_hidden(bool use, bool attached) OMNITRACE_HIDDEN_API;

source/lib/omnitrace/library.cpp

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ omnitrace_init_tooling_hidden()
424424
omnitrace_preinit_hidden();
425425

426426
// start these gotchas once settings have been initialized
427-
get_init_bundle()->start();
427+
if(get_init_bundle()) get_init_bundle()->start();
428428

429429
if(get_use_sampling()) sampling::block_signals();
430430

@@ -564,6 +564,28 @@ omnitrace_init_hidden(const char* _mode, bool _is_binary_rewrite, const char* _a
564564

565565
//======================================================================================//
566566

567+
extern "C" void
568+
omnitrace_reset_preload_hidden(void)
569+
{
570+
tim::set_env("OMNITRACE_PRELOAD", "0", 1);
571+
auto&& _preload_libs = get_env("LD_PRELOAD", std::string{});
572+
if(_preload_libs.find("libomnitrace") != std::string::npos)
573+
{
574+
auto _modified_preload = std::string{};
575+
for(const auto& itr : delimit(_preload_libs, ":"))
576+
{
577+
if(itr.find("libomnitrace") != std::string::npos) continue;
578+
_modified_preload += common::join("", ":", itr);
579+
}
580+
if(!_modified_preload.empty() && _modified_preload.find(':') == 0)
581+
_modified_preload = _modified_preload.substr(1);
582+
583+
tim::set_env("LD_PRELOAD", _modified_preload, 1);
584+
}
585+
}
586+
587+
//======================================================================================//
588+
567589
extern "C" void
568590
omnitrace_finalize_hidden(void)
569591
{
@@ -590,6 +612,8 @@ omnitrace_finalize_hidden(void)
590612
tim::signals::block_signals(get_sampling_signals(),
591613
tim::signals::sigmask_scope::process);
592614

615+
omnitrace_reset_preload_hidden();
616+
593617
// some functions called during finalization may alter the push/pop count so we need
594618
// to save them here
595619
auto _push_count = tracing::push_count().load();
@@ -635,6 +659,13 @@ omnitrace_finalize_hidden(void)
635659
tim::signals::enable_signal_detection({ tim::signals::sys_signal::Interrupt },
636660
[](int) {});
637661

662+
std::string _bundle_name = OMNITRACE_FUNCTION;
663+
comp::user_global_bundle _bundle{ _bundle_name.c_str() };
664+
_bundle.clear();
665+
_bundle.insert<comp::wall_clock, comp::cpu_clock, comp::peak_rss, comp::page_rss,
666+
comp::cpu_util>();
667+
_bundle.start();
668+
638669
OMNITRACE_DEBUG_F("Copying over all timemory hash information to main thread...\n");
639670
// copy these over so that all hashes are known
640671
auto& _hzero = tracing::get_timemory_hash_ids(0);
@@ -929,6 +960,18 @@ omnitrace_finalize_hidden(void)
929960
}
930961
}
931962

963+
_bundle.stop();
964+
auto _get_metric = [](auto* _v, std::string_view _tail) -> std::string {
965+
return (_v) ? JOIN("", *_v, _tail) : std::string{};
966+
};
967+
968+
OMNITRACE_VERBOSE_F(0, "Finalization metrics: %s%s%s%s%s\n",
969+
_get_metric(_bundle.get<comp::wall_clock>(), ", ").c_str(),
970+
_get_metric(_bundle.get<comp::peak_rss>(), ", ").c_str(),
971+
_get_metric(_bundle.get<comp::page_rss>(), ", ").c_str(),
972+
_get_metric(_bundle.get<comp::cpu_clock>(), ", ").c_str(),
973+
_get_metric(_bundle.get<comp::cpu_util>(), "").c_str());
974+
932975
if(_timemory_manager && _timemory_manager != nullptr)
933976
{
934977
_timemory_manager->add_metadata([](auto& ar) {

0 commit comments

Comments
 (0)