Repository navigation
Question about the sentinel fuse.聽#88
Description
Activity
If it's what I think you are asking about the fuse is to ensure there is as close as possible to 0 impact on Node.js binaries shipped by the project. The furst ensures there is a close to zero overhead check so that when there is no bundled application there is no overhead.
Reacted by Darshan SenAh ok... a very low overhead pre-check makes sense. For build-time injection via linker-flags it would also make sense to set the fuse at build time. How about we somehow expose the initial value:
#ifndef POSTJECT_FUSE_VALUE # define POSTJECT_FUSE_VALUE 0 #endif // use stringify macros to build the actual string
... or with a bit more API:
#ifdef POSTJECT_INJECT_USING_LINKER // TODO: better name? # define POSTJECT_FUSE_VALUE ":1" #else # define POSTJECT_FUSE_VALUE ":0" #endif
Let me know which style you prefer and I make a PR...
FWIW, the initial value is already exposed as the
POSTJECT_SENTINEL_FUSEmacro in the header file:Lines 20 to 23 in 3c4f208
#ifndef POSTJECT_SENTINEL_FUSE #define POSTJECT_SENTINEL_FUSE \ "POSTJECT_SENTINEL_fce680ab2cc467b6e072b8b5df1996b2" #endif It can be customized at build-time if the
POSTJECT_SENTINEL_FUSEmacro is defined before the header is included. For reference, this is how it is done in Node.js: https://github.com/nodejs/node/blob/f9737b1b8c96e43cedfff764634524df62cf3109/src/node_sea.cc#L11-L18// The POSTJECT_SENTINEL_FUSE macro is a string of random characters selected by // the Node.js project that is present only once in the entire binary. It is // used by the postject_has_resource() function to efficiently detect if a // resource has been injected. See // https://github.com/nodejs/postject/blob/35343439cac8c488f2596d7c4c1dddfec1fddcae/postject-api.h#L42-L45. #define POSTJECT_SENTINEL_FUSE "NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2" #include "postject-api.h" #undef POSTJECT_SENTINEL_FUSE
Is this what you were looking for?
No. The macro
POSTJECT_SENTINEL_FUSEdefines the fuse name. I'd like to override the initial fuse value, which is currently a string literal. See https://github.com/nodejs/postject/blob/main/postject-api.h#L42This is useful when embedding resources using the linker.
Ah, okay. I personally like the second option in #88 (comment) more than the first one. Feel free to send a PR. :)
First, let me thank you guys for making this. It's really fun to work with and it certainly beats appending a zip to the executable. 馃榿
I'm unsure about the sentinel though. On one hand the goal is compatibility with build-time injection using the linker. On the other hand, the only thing that prevents me from loading link-time resources is the sentinel fuse. I'd have to run
sedor something...Looking at the test.cpp it would seem it is safe to ignore
postject_has_resource()sincepostject_find_resource(...)will returnnullif no resource is found. And indeed my application works better withoutpostject_has_resource(). Now I can load both, resources injected at build-time and resources injected using postject.So, my question is what is the sentinel/fuse actually guarding against? It just seems odd to introduce this artificial string substitution step since it breaks one of the main design goals: compatibility with link-time injection.
Unless the fuse has a hidden purpose that I don't understand just yet, I feel postject would be better of without it.
Thanks for looking into this...