diff options
author | Bert Belder <bertbelder@gmail.com> | 2015-03-25 07:00:12 +0300 |
---|---|---|
committer | Forrest L Norvell <forrest@npmjs.com> | 2015-05-30 15:16:18 +0300 |
commit | 53e98cc1b44203147c0abdc03eb0e57e34c4274d (patch) | |
tree | 7ae495fbd7910c66fb0aeccf8691f529c7738864 | |
parent | f9fd554500508f94a414ee43ee91b8f554eee76e (diff) |
win,node-gyp: enable delay-load hook by default
The delay-load hook allows node.exe/iojs.exe to be renamed. See efadffe
for more background.
This commit is a combined squash of the following previous patches:
ba93c583bca993be9d16d9a1819ecdb23697b73a,
3bda6cbfa4a9bb073790d53bc14e85b6e575bbe5,
0d6d3dda95e3fff30996c224197fac88fba85b5b.
PR-URL: https://github.com/nodejs/io.js/pull/1763
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
-rw-r--r-- | deps/npm/node_modules/node-gyp/addon.gypi | 25 | ||||
-rw-r--r-- | deps/npm/node_modules/node-gyp/src/win_delay_load_hook.c | 33 |
2 files changed, 58 insertions, 0 deletions
diff --git a/deps/npm/node_modules/node-gyp/addon.gypi b/deps/npm/node_modules/node-gyp/addon.gypi index 63fefe3d16c..1fe142f70da 100644 --- a/deps/npm/node_modules/node-gyp/addon.gypi +++ b/deps/npm/node_modules/node-gyp/addon.gypi @@ -1,7 +1,9 @@ { 'target_defaults': { 'type': 'loadable_module', + 'win_delay_load_hook': 'true', 'product_prefix': '', + 'include_dirs': [ '<(node_root_dir)/src', '<(node_root_dir)/deps/uv/include', @@ -13,11 +15,34 @@ 'product_extension': 'node', 'defines': [ 'BUILDING_NODE_EXTENSION' ], }], + ['_type=="static_library"', { # set to `1` to *disable* the -T thin archive 'ld' flag. # older linkers don't support this flag. 'standalone_static_library': '<(standalone_static_library)' }], + + ['_win_delay_load_hook=="true"', { + # If the addon specifies `'win_delay_load_hook': 'true'` in its + # binding.gyp, link a delay-load hook into the DLL. This hook ensures + # that the addon will work regardless of whether the node/iojs binary + # is named node.exe, iojs.exe, or something else. + 'conditions': [ + [ 'OS=="win"', { + 'sources': [ + 'src/win_delay_load_hook.c', + ], + 'msvs_settings': { + 'VCLinkerTool': { + 'DelayLoadDLLs': [ 'iojs.exe', 'node.exe' ], + # Don't print a linker warning when no imports from either .exe + # are used. + 'AdditionalOptions': [ '/ignore:4199' ], + }, + }, + }], + ], + }], ], 'conditions': [ diff --git a/deps/npm/node_modules/node-gyp/src/win_delay_load_hook.c b/deps/npm/node_modules/node-gyp/src/win_delay_load_hook.c new file mode 100644 index 00000000000..f397cfa195e --- /dev/null +++ b/deps/npm/node_modules/node-gyp/src/win_delay_load_hook.c @@ -0,0 +1,33 @@ +/* + * When this file is linked to a DLL, it sets up a delay-load hook that + * intervenes when the DLL is trying to load 'node.exe' or 'iojs.exe' + * dynamically. Instead of trying to locate the .exe file it'll just return + * a handle to the process image. + * + * This allows compiled addons to work when node.exe or iojs.exe is renamed. + */ + +#ifdef _MSC_VER + +#define WIN32_LEAN_AND_MEAN +#include <windows.h> + +#include <delayimp.h> +#include <string.h> + +static FARPROC WINAPI load_exe_hook(unsigned int event, DelayLoadInfo* info) { + HMODULE m; + if (event != dliNotePreLoadLibrary) + return NULL; + + if (_stricmp(info->szDll, "iojs.exe") != 0 && + _stricmp(info->szDll, "node.exe") != 0) + return NULL; + + m = GetModuleHandle(NULL); + return (FARPROC) m; +} + +PfnDliHook __pfnDliNotifyHook2 = load_exe_hook; + +#endif |