Question: When lazy_static vairable/initializtion and Once::call_once() code get executed and when does it gets reset, and rexecuted, relate to a clone/fork or execv* syscall/
Code inside call_once is expected to be executed only once. But once per, what? process?
How does the clone/fork system call, or execv* system call affect whether the code gets executed?
use std::sync::Once;
static START: Once = Once::new();
START.call_once(|| {
println!("Hello World")
// run initialization here
});
Specifically, within a process that has done START.call_once() already, will the code in START.call_once() get executed again after syscall clone? How about after execv syscall?
What is the boundary that resets this and causes the code to be executed again.
I suspect this also applies to when lazy_static!{} variables are initialized or reinitialized.
I am building LD_PRELOAD program.
I have some one time initialization code like opening a tracker file to write filesystem access meta data to it. We also create UUID typically once per process. I put in some tracing out put to track what happens.
I also made the one time initialization code is invoked from multiple locations, including the library constructor functon, the intercepted execv* functions.
The following traceback suggests, the one time initialization code gets executed once from the constructor function, then after I suspect a clone syscall, that forks a new PID, shown in "WISKTRACK Initializer Start: false 25872"
The UUID is printed for every line of trace and supposed to be created once process. And UUID lazy_static doesnt seem to be reinitialized as part of the clone syscall and doesnt change after PID change.
But the TRACKER lazy_static seems to reinitialized/created after the clone/fork sys call as seen by the logs.
VeStgUiiyEa0KVLIPVP61F: initialize_constructor_statics:
VeStgUiiyEa0KVLIPVP61F: initialize_constructor_statics: Complete
VeStgUiiyEa0KVLIPVP61F: WISKTRACK Initializer Start: false 25872
VeStgUiiyEa0KVLIPVP61F: WISKTRACK Initializing: false
VeStgUiiyEa0KVLIPVP61F: initialize_statics:
VeStgUiiyEa0KVLIPVP61F: Config Reading....
VeStgUiiyEa0KVLIPVP61F: CONFIG Reading....Done
VeStgUiiyEa0KVLIPVP61F: APP64BITONLY_PATTERNS Reading....
VeStgUiiyEa0KVLIPVP61F: p: ["^/ws/sarvi\\-sjc/wisktrack/asdadasd/asdai-++.sdad"]
VeStgUiiyEa0KVLIPVP61F: APP64BITONLY_PATTERNS Reading....Done
VeStgUiiyEa0KVLIPVP61F: Tracker Create
VeStgUiiyEa0KVLIPVP61F: Tracker Initializer: 800
VeStgUiiyEa0KVLIPVP61F: Tracker Initialization 1: false
VeStgUiiyEa0KVLIPVP61F: Tracker Initialization 2: false
VeStgUiiyEa0KVLIPVP61F: Tracker Initialization 3: true
VeStgUiiyEa0KVLIPVP61F: Tracker Create Done
VeStgUiiyEa0KVLIPVP61F: initialize_statics: Complete
VeStgUiiyEa0KVLIPVP61F: Tracker Initialization 1: true
VeStgUiiyEa0KVLIPVP61F: Tracker Initialization 3: true
VeStgUiiyEa0KVLIPVP61F: Tracker Initializer Complete true
The above happens inside the cosntructor function.
This same once initialization is also invoked inside an execv* iterept boundary before the syscall is invoked.
The following happens as part of the execv* interception, before the syscall. But I suspect a process clone happenned as the PID has changed from 25872 to 25874. The think both lazy static initializations and std::sync::Once wrapped code are executed again.
VeStgUiiyEa0KVLIPVP61F: execve(VeStgUiiyEa0KVLIPVP61F, /usr/bin/ls, "ls NULL")
VeStgUiiyEa0KVLIPVP61F: execve: VeStgUiiyEa0KVLIPVP61F: Updated Env {"PWD": "/ws/sarvi-sjc/wisktrack", "LD_PRELOAD": "/ws/sarvi-sjc/wisktrack/${LIB}/libwisktrack.so", "RUST_BACKTRACE": "1", "WISK_WSROOT": "/ws/sarvi-sjc/wisktrack", "HOME": "/users/sarvi", "WISK_CONFIG": "", "PATH": "/users/sarvi/.cargo/bin:/auto/binos-tools/bin:/router/bin:/usr/cisco/bin:/usr/atria/bin:/usr/bin:/usr/local/bin:/usr/local/etc:/bin:/usr/X11R6/bin:/usr/sbin:/sbin:/usr/bin:/auto/nova-env/Lab/Labpatch/bin", "SHLVL": "1", "TERM": "xterm-256color", "WISK_TRACK": "", "_": "/usr/bin/ls", "WISK_PUUID": "VeStgUiiyEa0KVLIPVP61F", "WISK_TRACE": "", "USER": "sarvi"}
VeStgUiiyEa0KVLIPVP61F: WISKTRACK Initializer Start: true 25874
VeStgUiiyEa0KVLIPVP61F: Tracker Initializer Complete true
U6dZUjfrIAZWoKTFv9OtH9: initialize_constructor_statics:
U6dZUjfrIAZWoKTFv9OtH9: initialize_constructor_statics: Complete
U6dZUjfrIAZWoKTFv9OtH9: WISKTRACK Initializer Start: false 25874
U6dZUjfrIAZWoKTFv9OtH9: WISKTRACK Initializing: false
U6dZUjfrIAZWoKTFv9OtH9: initialize_statics:
U6dZUjfrIAZWoKTFv9OtH9: Config Reading....
U6dZUjfrIAZWoKTFv9OtH9: CONFIG Reading....Done
U6dZUjfrIAZWoKTFv9OtH9: APP64BITONLY_PATTERNS Reading....
U6dZUjfrIAZWoKTFv9OtH9: p: ["^/ws/sarvi\\-sjc/wisktrack/asdadasd/asdai-++.sdad"]
U6dZUjfrIAZWoKTFv9OtH9: APP64BITONLY_PATTERNS Reading....Done
U6dZUjfrIAZWoKTFv9OtH9: Tracker Create
U6dZUjfrIAZWoKTFv9OtH9: Tracker Initializer: 800
U6dZUjfrIAZWoKTFv9OtH9: Tracker Initialization 1: false
U6dZUjfrIAZWoKTFv9OtH9: Tracker Initialization 2: false
U6dZUjfrIAZWoKTFv9OtH9: Tracker Initialization 3: true
U6dZUjfrIAZWoKTFv9OtH9: Tracker Create Done
U6dZUjfrIAZWoKTFv9OtH9: initialize_statics: Complete
U6dZUjfrIAZWoKTFv9OtH9: Tracker Initialization 1: true
U6dZUjfrIAZWoKTFv9OtH9: Tracker Initialization 3: true
U6dZUjfrIAZWoKTFv9OtH9: Tracker Initializer Complete true
Cargo.lock Makefile core.bash.25110 lib32 src t.diff test wisk
Cargo.toml README.md core.bash.25485 lib64 strace t.sh test.sh wisktrack.file
LICENSE config lib scripts t target tests
VeStgUiiyEa0KVLIPVP61F: execve(VeStgUiiyEa0KVLIPVP61F, /usr/bin/ls, "ls NULL")
VeStgUiiyEa0KVLIPVP61F: execve: VeStgUiiyEa0KVLIPVP61F: Updated Env {"PWD": "/ws/sarvi-sjc/wisktrack", "LD_PRELOAD": "/ws/sarvi-sjc/wisktrack/${LIB}/libwisktrack.so", "RUST_BACKTRACE": "1", "WISK_WSROOT": "/ws/sarvi-sjc/wisktrack", "HOME": "/users/sarvi", "WISK_CONFIG": "", "PATH": "/users/sarvi/.cargo/bin:/auto/binos-tools/bin:/router/bin:/usr/cisco/bin:/usr/atria/bin:/usr/bin:/usr/local/bin:/usr/local/etc:/bin:/usr/X11R6/bin:/usr/sbin:/sbin:/usr/bin:/auto/nova-env/Lab/Labpatch/bin", "SHLVL": "1", "TERM": "xterm-256color", "WISK_TRACK": "", "_": "/usr/bin/ls", "WISK_PUUID": "VeStgUiiyEa0KVLIPVP61F", "WISK_TRACE": "", "USER": "sarvi"}
VeStgUiiyEa0KVLIPVP61F: WISKTRACK Initializer Start: true 25875
VeStgUiiyEa0KVLIPVP61F: Tracker Initializer Complete true
3GO5kxWacAM07nLRGqYh59: initialize_constructor_statics:
3GO5kxWacAM07nLRGqYh59: initialize_constructor_statics: Complete
3GO5kxWacAM07nLRGqYh59: WISKTRACK Initializer Start: false 25875
3GO5kxWacAM07nLRGqYh59: WISKTRACK Initializing: false
3GO5kxWacAM07nLRGqYh59: initialize_statics:
3GO5kxWacAM07nLRGqYh59: Config Reading....
3GO5kxWacAM07nLRGqYh59: CONFIG Reading....Done
3GO5kxWacAM07nLRGqYh59: APP64BITONLY_PATTERNS Reading....
3GO5kxWacAM07nLRGqYh59: p: ["^/ws/sarvi\\-sjc/wisktrack/asdadasd/asdai-++.sdad"]
3GO5kxWacAM07nLRGqYh59: APP64BITONLY_PATTERNS Reading....Done
3GO5kxWacAM07nLRGqYh59: Tracker Create
3GO5kxWacAM07nLRGqYh59: Tracker Initializer: 800
3GO5kxWacAM07nLRGqYh59: Tracker Initialization 1: false
3GO5kxWacAM07nLRGqYh59: Tracker Initialization 2: false
3GO5kxWacAM07nLRGqYh59: Tracker Initialization 3: true
3GO5kxWacAM07nLRGqYh59: Tracker Create Done
3GO5kxWacAM07nLRGqYh59: initialize_statics: Complete
3GO5kxWacAM07nLRGqYh59: Tracker Initialization 1: true
3GO5kxWacAM07nLRGqYh59: Tracker Initialization 3: true
3GO5kxWacAM07nLRGqYh59: Tracker Initializer Complete true