Bug 844 - ocamlc can\'t compile a program with threads
: ocamlc can\'t compile a program with threads
Status: CLOSED FIXED
: Sisyphus
(All bugs in Sisyphus/ocaml)
: unstable
: all Linux
: P4 minor
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2002-04-15 19:23 by
Modified: 2004-06-06 18:23 (History)


Attachments
0000844-ocaml-3.04+7-threadhack.patch (deleted)
2002-04-15 21:13, Sergey Vlasov
no flags Details


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2002-04-15 19:23:10
ocamlc (на самом деле ocamlc.opt) не в состоянии скомпилировать в байт-код
программу, использующую threads.cma.

Простейший пример:

===== begin thrtest.ml =====
let _ = Thread.join (Thread.create (fun () -> print_string
\"Hello\\n\") ())
===== end thrtest.ml =====

$ rpm -q ocaml
ocaml-3.04+7-alt1
$ ocamlopt -thread -o thrtest unix.cmxa threads.cmxa thrtest.ml
$ ./thrtest 
Hello
(так все работает)

$ ocamlc -thread -o thrtest unix.cma threads.cma thrtest.ml
Error on dynamically loaded library: /usr/lib/ocaml/dllthreads.so: undefined
symbol: external_raise

Причина подобной ситуации в том, что ocamlc при сборке байт-кода пытается
подгрузить через dlopen() все указанные в *.cma-файлах динамические библиотеки
(dll*.so), чтобы проверить наличие там нужных примитивов. Однако библиотека
dllthreads.so ссылается на переменную external_raise, которая определена только
в libcamlrun.a (и, соответственно, в /usr/bin/ocamlrun), но не в libasmrun.a.
Поэтому dllthreads.so может быть загружена только программой, скомпилированной
в байт-код.

Видимые мной способы решения проблемы:

1. Проигнорировать и при необходимости собирать подобные программы с -custom -
так собирается, но это некрасиво.

2. Вернуть на место байт-кодовый ocamlc (не заменять его полностью на
ocamlc.opt). Для ocamlopt такой проблемы нет, поэтому его можно оставить
полностью в native.

3. Всадить в otherlibs/systhreads/posix.c директиву:

      #ifndef NATIVE_CODE
      asm(\".weak external_raise\")
      #endif

   В результате dllthreads.so можно будет загрузить и из    native-программы;
работать она, естественно, не будет (при первой же попытке обращения к этой
переменной получим SIGSEGV), но от нее это и не требуется - нужно лишь успешное
выполнение dlopen() и dlsym(). (Попробовал собрать так - работает, lablgtktop_t
собирается и по крайней мере выполняет свои же примеры (там потоки в явном виде
не применяются - только свой при инициализации lablgtktop_t).

Что будем делать?
---

---
------- Comment #1 From 2002-04-15 21:14:21 -------
0000844-ocaml-3.04+7-threadhack.patch - тот самый хакерский вариант с .weak
------- Comment #2 From 2002-04-15 21:14:21 -------
0000844-ocaml-3.04+7-threadhack.patch - тот самый хакерский вариант с .weak
------- Comment #3 From 2002-04-16 21:34:50 -------
Лучше всего выбрать оба варианта - и не убивать байткодовые версии, и хакнуть
posix.c

Сейчас всё пересобираю (с CVS-ным 3.04+9)...
------- Comment #4 From 2002-04-16 21:34:50 -------
Лучше всего выбрать оба варианта - и не убивать байткодовые версии, и хакнуть
posix.c

Сейчас всё пересобираю (с CVS-ным 3.04+9)...
------- Comment #5 From 2004-06-06 18:22:55 -------
давно исправлено...