better-sqlite3 icon indicating copy to clipboard operation
better-sqlite3 copied to clipboard

Undefined symbol on node 20 with nix

Open irisjae opened this issue 1 year ago • 4 comments

I was trying this library out in the REPL as it looked promising, but I seem to have run into some problem with the prebuilt stuff. For what it's worth, while better-sqlite3 doesn't work, sqlite3 seems to work for me.

I'm on node v20.5.0 packaged with Nix (using node2nix), and the machine is a NixOS VM on M1 (aarch64).

> var db = require('better-sqlite3')('foobar.db')                                                                                                                                                            
Uncaught:                                                                                                                                                                                                    
Error: /nix/store/g9168fk4d0ckk036xxz2ca3kq3ay7wdy-node-dependencies-custom-node-modules/lib/node_modules/bettersqlite3/build/Release/better_sqlite3.node: undefined symbol: _ZN2v88internal20CanHaveInternalFieldEi
    at Module._extensions..node (node:internal/modules/cjs/loader:1319:18)
    at Module.load (node:internal/modules/cjs/loader:1091:32)
    at Module._load (node:internal/modules/cjs/loader:938:12)
    at Module.require (node:internal/modules/cjs/loader:1115:19)
    at require (node:internal/modules/helpers:119:18)
    at bindings (/nix/store/g9168fk4d0ckk036xxz2ca3kq3ay7wdy-node-dependencies-custom-node-modules/lib/node_modules/bindings/bindings.js:112:48)
    at new Database (/nix/store/g9168fk4d0ckk036xxz2ca3kq3ay7wdy-node-dependencies-custom-node-modules/lib/node_modules/better-sqlite3/lib/database.js:48:64)
    at Database (/nix/store/g9168fk4d0ckk036xxz2ca3kq3ay7wdy-node-dependencies-custom-node-modules/lib/node_modules/better-sqlite3/lib/database.js:11:10) {
  code: 'ERR_DLOPEN_FAILED'
}

irisjae avatar Nov 23 '24 07:11 irisjae

Which version of glibc is installed on the system?

neoxpert avatar Nov 23 '24 19:11 neoxpert

ldd --version yields ldd (GNU libc) 2.40

irisjae avatar Nov 24 '24 15:11 irisjae

Well, at least that should fit. _ZN2v88internal20CanHaveInternalFieldEi hints to some mismatch (missing entry point) within libs NodeJS is using / provided with. While sqlite3 utilizes the N-Api, better-sqlite3 uses the the v8 interface which has different requirements to the runtime. As with Alpine, I guess that the NodeJS build using node2nix is missing some dependencies or using outdated versions.

Have you tried setting up some build environment on NixOS to compile the native module for better-sqlite3?

neoxpert avatar Nov 25 '24 19:11 neoxpert

In the meantime I've resorted to node:sqlite (I really needed the sync api). Let me try the build sometime.

irisjae avatar Nov 26 '24 03:11 irisjae