Skip to content

Commit 9c7a42a

Browse files
yhwangMylesBorins
authored andcommitted
src: explicitly register built-in modules
Previously, built-in modules are registered before main() via __attribute__((constructor)) mechanism in GCC and similiar mechanism in MSVC. This causes some issues when node is built as static library. Calling module registration function for built-in modules in node::Init() helps to avoid the issues. Signed-off-by: Yihong Wang <[email protected]> Refs: #14986 (comment) Backport-PR-URL: #17625 PR-URL: #16565 Reviewed-By: Gireesh Punathil <[email protected]> Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Colin Ihrig <[email protected]>
1 parent 47cd49a commit 9c7a42a

35 files changed

+167
-35
lines changed

node.gyp

+1
Original file line numberDiff line numberDiff line change
@@ -815,6 +815,7 @@
815815
'defines': [ 'NODE_WANT_INTERNALS=1' ],
816816

817817
'sources': [
818+
'test/cctest/node_module_reg.cc',
818819
'test/cctest/node_test_fixture.cc',
819820
'test/cctest/test_aliased_buffer.cc',
820821
'test/cctest/test_base64.cc',

src/async_wrap.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -831,4 +831,4 @@ void EmitAsyncDestroy(Isolate* isolate, async_context asyncContext) {
831831

832832
} // namespace node
833833

834-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(async_wrap, node::AsyncWrap::Initialize)
834+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(async_wrap, node::AsyncWrap::Initialize)

src/cares_wrap.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -2259,4 +2259,4 @@ void Initialize(Local<Object> target,
22592259
} // namespace cares_wrap
22602260
} // namespace node
22612261

2262-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(cares_wrap, node::cares_wrap::Initialize)
2262+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(cares_wrap, node::cares_wrap::Initialize)

src/fs_event_wrap.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -221,4 +221,4 @@ void FSEventWrap::Close(const FunctionCallbackInfo<Value>& args) {
221221
} // anonymous namespace
222222
} // namespace node
223223

224-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(fs_event_wrap, node::FSEventWrap::Initialize)
224+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(fs_event_wrap, node::FSEventWrap::Initialize)

src/inspector_js_api.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -348,5 +348,5 @@ void InitInspectorBindings(Local<Object> target, Local<Value> unused,
348348
} // namespace inspector
349349
} // namespace node
350350

351-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(inspector,
351+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(inspector,
352352
node::inspector::InitInspectorBindings);

src/js_stream.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -251,4 +251,4 @@ void JSStream::Initialize(Local<Object> target,
251251

252252
} // namespace node
253253

254-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(js_stream, node::JSStream::Initialize)
254+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(js_stream, node::JSStream::Initialize)

src/node.cc

+22-2
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,16 @@ typedef int mode_t;
123123
extern char **environ;
124124
#endif
125125

126+
// This is used to load built-in modules. Instead of using
127+
// __attribute__((constructor)), we call the _register_<modname>
128+
// function for each built-in modules explicitly in
129+
// node::RegisterBuiltinModules(). This is only forward declaration.
130+
// The definitions are in each module's implementation when calling
131+
// the NODE_BUILTIN_MODULE_CONTEXT_AWARE.
132+
#define V(modname) void _register_##modname();
133+
NODE_BUILTIN_MODULES(V)
134+
#undef V
135+
126136
namespace node {
127137

128138
using v8::Array;
@@ -4575,6 +4585,9 @@ void Init(int* argc,
45754585
// Initialize prog_start_time to get relative uptime.
45764586
prog_start_time = static_cast<double>(uv_now(uv_default_loop()));
45774587

4588+
// Register built-in modules
4589+
node::RegisterBuiltinModules();
4590+
45784591
// Make inherited handles noninheritable.
45794592
uv_disable_stdio_inheritance();
45804593

@@ -4984,11 +4997,18 @@ int Start(int argc, char** argv) {
49844997
return exit_code;
49854998
}
49864999

5000+
// Call built-in modules' _register_<module name> function to
5001+
// do module registration explicitly.
5002+
void RegisterBuiltinModules() {
5003+
#define V(modname) _register_##modname();
5004+
NODE_BUILTIN_MODULES(V)
5005+
#undef V
5006+
}
49875007

49885008
} // namespace node
49895009

49905010
#if !HAVE_INSPECTOR
4991-
static void InitEmptyBindings() {}
5011+
void InitEmptyBindings() {}
49925012

4993-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(inspector, InitEmptyBindings)
5013+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(inspector, InitEmptyBindings)
49945014
#endif // !HAVE_INSPECTOR

src/node_buffer.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -1304,4 +1304,4 @@ void Initialize(Local<Object> target,
13041304
} // namespace Buffer
13051305
} // namespace node
13061306

1307-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(buffer, node::Buffer::Initialize)
1307+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(buffer, node::Buffer::Initialize)

src/node_config.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,4 @@ static void InitConfig(Local<Object> target,
132132

133133
} // namespace node
134134

135-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(config, node::InitConfig)
135+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(config, node::InitConfig)

src/node_contextify.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -1171,4 +1171,4 @@ void InitContextify(Local<Object> target,
11711171
} // anonymous namespace
11721172
} // namespace node
11731173

1174-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(contextify, node::InitContextify)
1174+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(contextify, node::InitContextify)

src/node_crypto.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -6286,4 +6286,4 @@ void InitCrypto(Local<Object> target,
62866286
} // namespace crypto
62876287
} // namespace node
62886288

6289-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(crypto, node::crypto::InitCrypto)
6289+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(crypto, node::crypto::InitCrypto)

src/node_file.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -1473,4 +1473,4 @@ void InitFs(Local<Object> target,
14731473

14741474
} // end namespace node
14751475

1476-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(fs, node::InitFs)
1476+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(fs, node::InitFs)

src/node_http2.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -2250,4 +2250,4 @@ HTTP_STATUS_CODES(V)
22502250
} // namespace http2
22512251
} // namespace node
22522252

2253-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(http2, node::http2::Initialize)
2253+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(http2, node::http2::Initialize)

src/node_http_parser.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -821,4 +821,4 @@ void InitHttpParser(Local<Object> target,
821821
} // anonymous namespace
822822
} // namespace node
823823

824-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(http_parser, node::InitHttpParser)
824+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(http_parser, node::InitHttpParser)

src/node_i18n.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,6 @@ void Init(Local<Object> target,
874874
} // namespace i18n
875875
} // namespace node
876876

877-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(icu, node::i18n::Init)
877+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(icu, node::i18n::Init)
878878

879879
#endif // NODE_HAVE_I18N_SUPPORT

src/node_internals.h

+83-2
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,81 @@ struct sockaddr;
7373
constant_attributes).FromJust(); \
7474
} while (0)
7575

76+
77+
#if HAVE_OPENSSL
78+
#define NODE_BUILTIN_OPENSSL_MODULES(V) V(crypto) V(tls_wrap)
79+
#else
80+
#define NODE_BUILTIN_OPENSSL_MODULES(V)
81+
#endif
82+
83+
#if NODE_HAVE_I18N_SUPPORT
84+
#define NODE_BUILTIN_ICU_MODULES(V) V(icu)
85+
#else
86+
#define NODE_BUILTIN_ICU_MODULES(V)
87+
#endif
88+
89+
// A list of built-in modules. In order to do module registration
90+
// in node::Init(), need to add built-in modules in the following list.
91+
// Then in node::RegisterBuiltinModules(), it calls modules' registration
92+
// function. This helps the built-in modules are loaded properly when
93+
// node is built as static library. No need to depends on the
94+
// __attribute__((constructor)) like mechanism in GCC.
95+
#define NODE_BUILTIN_STANDARD_MODULES(V) \
96+
V(async_wrap) \
97+
V(buffer) \
98+
V(cares_wrap) \
99+
V(config) \
100+
V(contextify) \
101+
V(fs) \
102+
V(fs_event_wrap) \
103+
V(http2) \
104+
V(http_parser) \
105+
V(inspector) \
106+
V(js_stream) \
107+
V(module_wrap) \
108+
V(os) \
109+
V(performance) \
110+
V(pipe_wrap) \
111+
V(process_wrap) \
112+
V(serdes) \
113+
V(signal_wrap) \
114+
V(spawn_sync) \
115+
V(stream_wrap) \
116+
V(tcp_wrap) \
117+
V(timer_wrap) \
118+
V(tty_wrap) \
119+
V(udp_wrap) \
120+
V(url) \
121+
V(util) \
122+
V(uv) \
123+
V(v8) \
124+
V(zlib)
125+
126+
#define NODE_BUILTIN_MODULES(V) \
127+
NODE_BUILTIN_STANDARD_MODULES(V) \
128+
NODE_BUILTIN_OPENSSL_MODULES(V) \
129+
NODE_BUILTIN_ICU_MODULES(V)
130+
131+
#define NODE_MODULE_CONTEXT_AWARE_CPP(modname, regfunc, priv, flags) \
132+
static node::node_module _module = { \
133+
NODE_MODULE_VERSION, \
134+
flags, \
135+
nullptr, \
136+
__FILE__, \
137+
nullptr, \
138+
(node::addon_context_register_func) (regfunc), \
139+
NODE_STRINGIFY(modname), \
140+
priv, \
141+
nullptr \
142+
}; \
143+
void _register_ ## modname() { \
144+
node_module_register(&_module); \
145+
}
146+
147+
148+
#define NODE_BUILTIN_MODULE_CONTEXT_AWARE(modname, regfunc) \
149+
NODE_MODULE_CONTEXT_AWARE_CPP(modname, regfunc, nullptr, NM_F_BUILTIN)
150+
76151
namespace node {
77152

78153
// Set in node.cc by ParseArgs with the value of --openssl-config.
@@ -205,6 +280,12 @@ void SetupProcessObject(Environment* env,
205280
int exec_argc,
206281
const char* const* exec_argv);
207282

283+
// Call _register<module_name> functions for all of
284+
// the built-in modules. Because built-in modules don't
285+
// use the __attribute__((constructor)). Need to
286+
// explicitly call the _register* functions.
287+
void RegisterBuiltinModules();
288+
208289
enum Endianness {
209290
kLittleEndian, // _Not_ LITTLE_ENDIAN, clashes with endian.h.
210291
kBigEndian
@@ -328,8 +409,8 @@ class InternalCallbackScope {
328409
bool closed_ = false;
329410
};
330411

331-
#define NODE_MODULE_CONTEXT_AWARE_INTERNAL(modname, regfunc) \
332-
NODE_MODULE_CONTEXT_AWARE_X(modname, regfunc, NULL, NM_F_INTERNAL) \
412+
#define NODE_MODULE_CONTEXT_AWARE_INTERNAL(modname, regfunc) \
413+
NODE_MODULE_CONTEXT_AWARE_CPP(modname, regfunc, nullptr, NM_F_INTERNAL)
333414

334415
} // namespace node
335416

src/node_os.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -414,4 +414,4 @@ void Initialize(Local<Object> target,
414414
} // namespace os
415415
} // namespace node
416416

417-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(os, node::os::Initialize)
417+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(os, node::os::Initialize)

src/node_perf.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -390,4 +390,4 @@ void Init(Local<Object> target,
390390
} // namespace performance
391391
} // namespace node
392392

393-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(performance, node::performance::Init)
393+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(performance, node::performance::Init)

src/node_serdes.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -483,4 +483,4 @@ void InitializeSerdesBindings(Local<Object> target,
483483
} // anonymous namespace
484484
} // namespace node
485485

486-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(serdes, node::InitializeSerdesBindings)
486+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(serdes, node::InitializeSerdesBindings)

src/node_url.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -2220,4 +2220,4 @@ static void Init(Local<Object> target,
22202220
} // namespace url
22212221
} // namespace node
22222222

2223-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(url, node::url::Init)
2223+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(url, node::url::Init)

src/node_util.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -239,4 +239,4 @@ void Initialize(Local<Object> target,
239239
} // namespace util
240240
} // namespace node
241241

242-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(util, node::util::Initialize)
242+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(util, node::util::Initialize)

src/node_v8.cc

+2-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
// USE OR OTHER DEALINGS IN THE SOFTWARE.
2121

2222
#include "node.h"
23+
#include "node_internals.h"
2324
#include "env-inl.h"
2425
#include "util-inl.h"
2526
#include "v8.h"
@@ -200,4 +201,4 @@ void InitializeV8Bindings(Local<Object> target,
200201

201202
} // namespace node
202203

203-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(v8, node::InitializeV8Bindings)
204+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(v8, node::InitializeV8Bindings)

src/node_zlib.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -710,4 +710,4 @@ void InitZlib(Local<Object> target,
710710
} // anonymous namespace
711711
} // namespace node
712712

713-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(zlib, node::InitZlib)
713+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(zlib, node::InitZlib)

src/pipe_wrap.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -240,4 +240,4 @@ void PipeWrap::Connect(const FunctionCallbackInfo<Value>& args) {
240240

241241
} // namespace node
242242

243-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(pipe_wrap, node::PipeWrap::Initialize)
243+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(pipe_wrap, node::PipeWrap::Initialize)

src/process_wrap.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -311,4 +311,4 @@ class ProcessWrap : public HandleWrap {
311311
} // anonymous namespace
312312
} // namespace node
313313

314-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(process_wrap, node::ProcessWrap::Initialize)
314+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(process_wrap, node::ProcessWrap::Initialize)

src/signal_wrap.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -126,4 +126,4 @@ class SignalWrap : public HandleWrap {
126126
} // namespace node
127127

128128

129-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(signal_wrap, node::SignalWrap::Initialize)
129+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(signal_wrap, node::SignalWrap::Initialize)

src/spawn_sync.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -1073,5 +1073,5 @@ void SyncProcessRunner::KillTimerCloseCallback(uv_handle_t* handle) {
10731073

10741074
} // namespace node
10751075

1076-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(spawn_sync,
1076+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(spawn_sync,
10771077
node::SyncProcessRunner::Initialize)

src/stream_wrap.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -398,5 +398,5 @@ void LibuvStreamWrap::OnAfterWriteImpl(WriteWrap* w, void* ctx) {
398398

399399
} // namespace node
400400

401-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(stream_wrap,
401+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(stream_wrap,
402402
node::LibuvStreamWrap::Initialize)

src/tcp_wrap.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -387,4 +387,4 @@ Local<Object> AddressToJS(Environment* env,
387387

388388
} // namespace node
389389

390-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(tcp_wrap, node::TCPWrap::Initialize)
390+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(tcp_wrap, node::TCPWrap::Initialize)

src/timer_wrap.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -136,4 +136,4 @@ class TimerWrap : public HandleWrap {
136136
} // anonymous namespace
137137
} // namespace node
138138

139-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(timer_wrap, node::TimerWrap::Initialize)
139+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(timer_wrap, node::TimerWrap::Initialize)

src/tls_wrap.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -982,4 +982,4 @@ void TLSWrap::Initialize(Local<Object> target,
982982

983983
} // namespace node
984984

985-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(tls_wrap, node::TLSWrap::Initialize)
985+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(tls_wrap, node::TLSWrap::Initialize)

src/tty_wrap.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -175,4 +175,4 @@ TTYWrap::TTYWrap(Environment* env,
175175

176176
} // namespace node
177177

178-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(tty_wrap, node::TTYWrap::Initialize)
178+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(tty_wrap, node::TTYWrap::Initialize)

src/udp_wrap.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -512,4 +512,4 @@ uv_udp_t* UDPWrap::UVHandle() {
512512

513513
} // namespace node
514514

515-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(udp_wrap, node::UDPWrap::Initialize)
515+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(udp_wrap, node::UDPWrap::Initialize)

src/uv.cc

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
#include "uv.h"
2323
#include "node.h"
24+
#include "node_internals.h"
2425
#include "env-inl.h"
2526

2627
namespace node {
@@ -58,4 +59,4 @@ void InitializeUV(Local<Object> target,
5859
} // anonymous namespace
5960
} // namespace node
6061

61-
NODE_MODULE_CONTEXT_AWARE_BUILTIN(uv, node::InitializeUV)
62+
NODE_BUILTIN_MODULE_CONTEXT_AWARE(uv, node::InitializeUV)

test/cctest/node_module_reg.cc

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Need to create empty definition for these modules'
2+
// registration function for cctest. Because when
3+
// building cctest, the definitions for the following
4+
// registration functions are not included.
5+
void _register_cares_wrap() {}
6+
void _register_config() {}
7+
void _register_contextify() {}
8+
void _register_fs() {}
9+
void _register_fs_event_wrap() {}
10+
void _register_http2() {}
11+
void _register_http_parser() {}
12+
void _register_js_stream() {}
13+
void _register_module_wrap() {}
14+
void _register_os() {}
15+
void _register_pipe_wrap() {}
16+
void _register_process_wrap() {}
17+
void _register_serdes() {}
18+
void _register_signal_wrap() {}
19+
void _register_spawn_sync() {}
20+
void _register_stream_wrap() {}
21+
void _register_tcp_wrap() {}
22+
void _register_timer_wrap() {}
23+
void _register_tty_wrap() {}
24+
void _register_udp_wrap() {}
25+
void _register_util() {}
26+
void _register_uv() {}
27+
void _register_v8() {}
28+
void _register_zlib() {}

0 commit comments

Comments
 (0)