loadDynlib() 总是使用 RTLD_LOCAL,这会破坏需要包自身导出符号的扩展程序 (例如 DuckDB) 的 dlopen()。
作者: maxdemarzi创建于 2026年8月4日更新于 2026年8月5日
总结
src/js/dynload.ts中的loadDynlib() -- 由pyodide.loadPackage()和micropip.install()两者都使用 -- 总是调用 Emscripten 的loadDynamicLibrary(),具有仅本地可见性(flags = 2,即RTLD_NOW | RTLD_LOCAL)。这意味着加载的模块自身导出的符号永远不会进入 Emscripten 的共享/全局符号表,因此从该模块(或任何其他已加载的模块)中运行的 C/C++ 代码所做的一个单独的后续dlopen()调用无法解析它们 -- 即使目标模块的 WASM 导出部分确实包含了该符号。
内容来源: pyodide/pyodide