ocsigen / lwt

OCaml promises and concurrent I/O
https://ocsigen.org/lwt
MIT License
709 stars 175 forks source link

Error on dynamically loaded library: dlllwt_unix_stubs.so #664

Closed rom38 closed 5 years ago

rom38 commented 5 years ago

Than i try install utop on android termux. I get the following:

$ opam install utop
The following actions will be performed:
  ∗ install utop 2.3.0

<><> Gathering sources ><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
[utop.2.3.0] found in cache

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
[ERROR] The compilation of utop failed at
        "/data/data/com.termux/files/home/.opam/4.06.1+termux/bin/dune build -p utop -j 7".

#=== ERROR while compiling utop.2.3.0 =========================================#
# context     2.0.1 | linux/arm64 |  | https://opam.ocaml.org#6cfd4ce2
# path        ~/.opam/4.06.1+termux/.opam-switch/build/utop.2.3.0
# command     ~/.opam/4.06.1+termux/bin/dune build -p utop -j 7
# exit-code   1
# env-file    ~/.opam/log/utop-4465-05296d.env
# output-file ~/.opam/log/utop-4465-05296d.out
### output ###
#       ocamlc src/top/utop.bc (exit 2)
# (cd _build/default && /data/data/com.termux/files/home/.opam/4.06.1+termux/bin/ocamlc.opt -w -40 -safe-string -g -o src/top/utop.bc -linkall -I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/bisect_ppx/runtime -I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/bytes -I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/camomile -I /data/data/com.termux/files/home/.opa[...]
# File "_none_", line 1:
# Error: Error on dynamically loaded library: /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/stublibs/dlllwt_unix_stubs.so: dlopen failed: cannot locate symbol "socket_type_table" referenced by "/data/data/com.termux/files/home/.opam/4.06.1+termux/lib/stublibs/dlllwt_unix_stubs.so"...

<><> Error report <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
┌─ The following actions failed
│ λ build utop 2.3.0
└─
╶─ No changes have been performed
$ cat ~/.opam/log/utop-5746-05296d.out
      ocamlc src/top/utop.bc (exit 2)
(cd _build/default && /data/data/com.termux/files/home/.opam/4.06.1+termux/bin/ocamlc.opt -w -40 -safe-string -g -o src/top/utop.bc -linkall
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/bisect_ppx/runtime
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/bytes 
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/camomile 
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/camomile/default_config 
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/camomile/dyn 
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/camomile/lib_default 
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/camomile/library 
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/findlib 
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/lambda-term 
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/lwt 
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/lwt/unix 
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/lwt_log 
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/lwt_log/core 
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/lwt_react 
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/ocaml/compiler-libs 
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/ocaml/threads
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/react 
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/result 
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/seq 
-I /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/zed 
-I src/lib
/data/data/com.termux/files/home/.opam/4.06.1+termux/lib/ocaml/compiler-libs/ocamlcommon.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/ocaml/compiler-libs/ocamlbytecomp.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/ocaml/compiler-libs/ocamltoplevel.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/findlib/findlib.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/findlib/findlib_top.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/ocaml/unix.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/bisect_ppx/runtime/bisect.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/result/result.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/seq/seq.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/lwt/lwt.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/ocaml/bigarray.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/ocaml/threads/threads.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/lwt/unix/lwt_unix.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/react/react.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/lwt_react/lwt_react.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/camomile/default_config/camomileDefaultConfig.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/camomile/library/camomileLibrary.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/camomile/lib_default/camomileLibraryDefault.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/camomile/dyn/camomileLibraryDyn.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/camomile/camomile_yuge.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/zed/zed.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/lwt_log/core/lwt_log_core.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/lwt_log/lwt_log.cma /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/lambda-term/lambda_term.cma src/lib/uTop.cma src/top/.utop.eobjs/byte/utop.cmo)
File "_none_", line 1:
Error: Error on dynamically loaded library: /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/stublibs/dlllwt_unix_stubs.so: dlopen failed: cannot locate symbol "socket_type_table" referenced by "/data/data/com.termux/files/home/.opam/4.06.1+termux/lib/stublibs/dlllwt_unix_stubs.so"...
readelf -s /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/stublibs/dlllwt_unix_stubs.so|grep so
    14: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND socket_type_table
    15: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND getsockopt@LIBC (2)
    77: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND alloc_sockaddr
    96: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND getsockname@LIBC (2)
   125: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND get_sockaddr
   128: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND setsockopt@LIBC (2)
   148: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND socket_domain_table
   172: 000000000000ae54    20 FUNC    GLOBAL DEFAULT   10 lwt_unix_is_socket
   215: 000000000000ab54   112 FUNC    GLOBAL DEFAULT   10 socket_domain
   321: 000000000000ae7c    20 FUNC    GLOBAL DEFAULT   10 lwt_unix_socketpair_stub
    38: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtbegin_so.c
  1603: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS windows_is_socket.c
  1621: 0000000000020510     8 OBJECT  LOCAL  DEFAULT   17 __dso_handle
  1651: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND socket_type_table
  1652: 000000000000ab54   112 FUNC    GLOBAL DEFAULT   10 socket_domain
  1657: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND getsockopt@@LIBC
  1789: 000000000000ae54    20 FUNC    GLOBAL DEFAULT   10 lwt_unix_is_socket
  1798: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND alloc_sockaddr
  1841: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND getsockname@@LIBC
  1844: 000000000000ae7c    20 FUNC    GLOBAL DEFAULT   10 lwt_unix_socketpair_stub
  1902: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND get_sockaddr
  1907: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND setsockopt@@LIBC
  1955: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND socket_domain_table
nm -D /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/stublibs/dlllwt_unix_stubs.so|grep so
                 U alloc_sockaddr
                 U get_sockaddr
                 U getsockname
                 U getsockopt
000000000000ae54 T lwt_unix_is_socket
000000000000ae7c T lwt_unix_socketpair_stub
                 U setsockopt
000000000000ab54 T socket_domain
                 U socket_domain_table
                 U socket_type_table

In linux ubuntu 18.06 and in windows 7 cygwin all OK

When I do simple thing, I get following:

$ touch x.ml

$ ocamlfind ocamlc -linkpkg  -package lwt.unix x.ml
ocamlfind: [WARNING] Package `threads': Linking problems may arise because of the missing -thread or -vmthread switch
File "x.ml", line 1:
Error: Error on dynamically loaded library: /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/stublibs/dlllwt_unix_stubs.so: dlopen failed: cannot locate symbol "socket_type_table" referenced by "/data/data/com.termux/files/home/.opam/4.06.1+termux/lib/stublibs/dlllwt_unix_stubs.so"...
$
$ ocamlfind ocamlc -linkpkg  -linkall -package lwt.unix x.ml
ocamlfind: [WARNING] Package `threads': Linking problems may arise because of the missing -thread or -vmthread switch
File "x.ml", line 1:
Error: Required module `Condition' is unavailable
$ ocamlfind ocamlc -linkpkg  -linkall -thread -package lwt.unix x.ml
File "x.ml", line 1:
Error: Error on dynamically loaded library: /data/data/com.termux/files/home/.opam/4.06.1+termux/lib/stublibs/dlllwt_unix_stubs.so: dlopen failed: cannot locate symbol "socket_type_table" referenced by "/data/data/com.termux/files/home/.opam/4.06.1+termux/lib/stublibs/dlllwt_unix_stubs.so"...
$

Looking at the Lwt code, there indeed seems to be an inconsistency between the .c and .h files regarding socket_type_table and defined(LWT_ON_WINDOWS) in file src/unix/lwt_unix_stubs.c

What can i do? And what the symbol "socket_type_table"? I can not find it in linux shared libraries in /system/lib/.

aantron commented 5 years ago

Try creating this file, has_sockets.c:

#include <stdio.h>
#include <caml/s.h>

int main()
{
    printf("%i\n", HAS_SOCKETS);
    return 0;
}

then

ocamlfind opt has_sockets.c
cc has_sockets.o
./a.out

What output does it print?

rom38 commented 5 years ago

Thanks for help. I think this problem is related with

https://github.com/android-ndk/ndk/issues/201

and

https://github.com/coq/coq/pull/6020

and need some changes in make files

I find symbol "socket_type_table" in shared library /lib/ocaml/unix.cmxs And this library is not loaded on Android. Need flag to compiler for link like -cclib or -lunix.cmxs

rom38 commented 5 years ago
$ cat has_sockets.c 
#include <stdio.h>
#include <caml/s.h>                                                                                                                                               int main()                                                                       {                                                                                            printf("%i\n", HAS_SOCKETS);                                                         return 0;
}
$ cat $(find ../.opam/ -name s.h)|grep HAS_SOCKETS
#define HAS_SOCKETS
$ ocamlfind opt has_sockets.c
has_sockets.c:6:32: error: expected expression                                               printf("%i\n", HAS_SOCKETS);                                                                               ^                                          1 error generated.                                                               $
rom38 commented 5 years ago
cat has_sockets.c
#include <stdio.h>                          #include <caml/s.h>

int main()
{
            printf("%i\n",HAS_GETHOSTBYNAME_
R);
                return 0;
}
$ ocamlfind opt has_sockets.c
$ cc has_sockets.o
$ ./a.out
6
aantron commented 5 years ago

What about this?

#include <stdio.h>

extern int socket_type_table[];

int main()
{
    printf("%i\n", socket_type_table[1]);
    return 0;
}

then

ocamlfind opt -linkpkg -package unix has_sockets.c

Making sure this is on termux, of course.

aantron commented 5 years ago

And please let me know if you are making progress using the other issues or not.

rom38 commented 5 years ago
$ cat has_socket2.c
#include <stdio.h>

 extern int socket_type_table[];

 int main()
{
            printf("%i\n", socket_type_table[1]);
                return 0;
}
$ ocamlfind opt -linkpkg -package unix has_socket2.c
$
aantron commented 5 years ago

Closing for now; please reopen if there is more information.

ELLIOTTCABLE commented 2 years ago

I'm seeing this as well; but I'm on macOS, and not using termux.

Full log from the above suggestions on my machine:

https://gist.github.com/ELLIOTTCABLE/dec074c9946cd94b194ee46fa9046ca4