У меня есть программа OCaml, которая пишет другую программу OCaml, компилирует ее и затем пытается динамически загрузить ее.К сожалению, это вызывает ошибку сегментации на моей машине с OSX 10.14, OCaml 4.07.1.
В частности, моя программа имеет следующую структуру:
- Файл A статически загружает несколько модулей (называть их вспомогательными модулями для справки) и определяет: 1. сигнатуру модуля, которая описывает модуль, который будет динамически загружен, 2. ссылку на опцию этого модуля, которая будет установлена загружаемым плагином 3. другой модуль, который используетэта ссылка.
open Helper
module type PLUGIN_TYPE = sig ... end
let plugin = ref None
let get_plugin () : (module PLUGIN_TYPE) =
match !plugin with
| Some x -> x
| None -> failwith "No plugin loaded"
module Test
struct =
... get_plugin () ...
end
Файл B является загрузчиком, короче говоря, он запускается Dynlink.loadfile
Файл C являетсясгенерированный файл OCaml, который также использует модули Helper и определяет модуль типа PLUGIN_TYPE и устанавливает ссылку на плагин.
module Plugin : PLUGIN_TYPE =
...
end
let () = A.plugin := Some (module Plugin : PLUGIN_TYPE)
Я использую ocamlbuild для сборки основной программы, а затем снова ocamlbuildсоздать плагин (для которого требуются те же модули / файлы Helper, что и в основной программе).
Когда я пытаюсь запустить его, я получаю ошибку segfault, предположительно во время Dynlink.loadfИль выполнен.Я не уверен, что я делаю неправильно, тот факт, что я связываю модули Helper как с основной программой, так и с плагином, вызывает у меня неудобство, но я не уверен, как обойти это.
Присоединение LLDBtrace:
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
* frame #0: 0x00000001002624da Main.native`caml_oldify_local_roots at roots.c:286 [opt]
frame #1: 0x00000001002664fb Main.native`caml_empty_minor_heap at minor_gc.c:352 [opt]
frame #2: 0x0000000100266cc5 Main.native`caml_gc_dispatch at minor_gc.c:446 [opt]
frame #3: 0x000000010026dca6 Main.native`caml_make_vect(len=<unavailable>, init=<unavailable>) at array.c:335 [opt]
frame #4: 0x0000000100114eb9 Main.native`camlLru_cache__init_inner_2624 + 89
frame #5: 0x0000000100087ea6 Main.native`camlSyntax__memoize_7621 + 38
frame #6: 0x000000010312d317 Plugin.cmxs`camlInterp__entry + 311
frame #7: 0x0000000100283424 Main.native`caml_start_program + 92
frame #8: 0x000000010027ad19 Main.native`caml_callback(closure=<unavailable>, arg=<unavailable>) at callback.c:173 [opt]
frame #9: 0x000000010027f6a0 Main.native`caml_natdynlink_run(handle_v=4345299456, symbol=72181230668639817) at natdynlink.c:141 [opt]
frame #10: 0x000000010009d727 Main.native`camlDynlink__fun_2440 + 23
frame #11: 0x0000000100183581 Main.native`camlStdlib__list__iter_1148 + 33
frame #12: 0x000000010009d5bc Main.native`camlDynlink__loadunits_2288 + 332
frame #13: 0x000000010009d788 Main.native`camlDynlink__load_2301 + 72
frame #14: 0x000000010000552c Main.native`camlLoader__load_plugin_1002 + 268
frame #15: 0x00000001000055d8 Main.native`camlLoader__simulate_1056 + 120
frame #16: 0x00000001000052c8 Main.native`camlMain__entry + 280
frame #17: 0x0000000100002489 Main.native`caml_program + 3481
frame #18: 0x0000000100283424 Main.native`caml_start_program + 92
frame #19: 0x00000001002617dc Main.native`caml_startup_common(argv=0x00007ffeefbff538, pooling=<unavailable>) at startup.c:157 [opt]
frame #20: 0x000000010026184b Main.native`caml_main [inlined] caml_startup_exn(argv=<unavailable>) at startup.c:162 [opt]
frame #21: 0x0000000100261844 Main.native`caml_main [inlined] caml_startup(argv=<unavailable>) at startup.c:167 [opt]
frame #22: 0x0000000100261844 Main.native`caml_main(argv=<unavailable>) at startup.c:174 [opt]
frame #23: 0x00000001002618bc Main.native`main(argc=<unavailable>, argv=<unavailable>) at main.c:44 [opt]
frame #24: 0x00007fff6d4f1ed9 libdyld.dylib`start + 1
frame #25: 0x00007fff6d4f1ed9 libdyld.dylib`start + 1
Для чего это стоит, это часть того, что я назвал модулями Helper:
frame #4: 0x0000000100114eb9 Main.native`camlLru_cache__init_inner_2624 + 89
frame #5: 0x0000000100087ea6 Main.native`camlSyntax__memoize_7621 + 38
Любые подсказки, что я делаю неправильно?