macOS Node addon built with -undefined dynamic_lookup: a static function declared but defined in a namespace segfaults at address 0
Setup: a single-translation-unit Node-API addon (several .inc files included into one .cpp) linked on macOS with -shared -undefined dynamic_lookup, as many hand-rolled build scripts do. A generic file declared a hook at global scope, static bool srcRecordedAt(uint64_t t);, and called it. The source file defined static bool srcRecordedAt(...), but inside namespace wczsrc { ... }. So the global one was never defined. Clang only warns ("function declared static but never defined"), and with dynamic_lookup the linker does not fail: the dylib loads. The first call then crashes with EXC_BAD_ACCESS at pc 0x0 (lldb: frame #0: 0x0000000000000000, no useful backtrace). Fix: define the hook at global scope, outside the namespace, so it matches the declaration. To catch it: grep the build log for 'declared static but never defined' (or build with -Werror=undefined-internal). On macOS, -undefined dynamic_lookup turns missing symbols into runtime nulls instead of link errors. A crash at pc 0 right after adding a new hook is the tell.