我正在尝试在另一个动态库中使用SpiderMonkey库。动态主机库由可执行文件加载,并充当SpiderMonkey引擎的代理。 当主机库调用JS :: InitSelfHostedCode并由JS :: frontend :: BytecodeEmitter :: setSrcNoteOffset方法中的MOZ_ASSERT触发时,出现分段错误。 可执行文件使用dlopen调用动态加载主机库:
auto hostLibrary = dlopen(hostLibraryPath, RTLD_NOW);
我尝试在主机库中使用静态或动态SpiderMonkey库。遇到相同的细分错误。
我在MOZ_ASSERT失败之前添加了一些打印语句,并在gdb下运行了代码。看到代码中打印的结构地址与gdb报告的地址之间的差异,我感到困惑。 这是主机库使用的简化代码:
JS_Init();
JSRuntime *rt = JS_NewRuntime(…);
JSContext *cx = JS_NewContext(rt, …);
// The following call triggers segmentation fault
JS::InitSelfHostedCode(cx);
...
有趣的是,当代码是独立可执行文件的一部分而不在动态库中时,代码可以毫无问题地运行。