[erlang-questions] EEP7 FFI patch for R11B-5

Alceste Scalas alceste@REDACTED
Mon Mar 30 12:41:00 CEST 2009

Quoting Zvi <exta7@REDACTED>:
> 3> erl_ddll:load_library("/usr/lib/libc.so", mylib, [{preload,  
> [{malloc, {void, pointer}},{free, {void, nonnull}}]}]).
> {error,{open_error,-13}}

There are three problems here.

First of all, erl_ddll:load_library/3 expects a path as first
argument, and a filename (excluding the .so extension) as second
argument (just like erl_ddll:load/2).  You should, thus, call
something like this:

     erl_ddll:load_library("/usr/lib", libc, [{preload, [{malloc,  
{void, pointer}},{free, {void, nonnull}}]}]).

Another problem is that /usr/lib/libc.so is not a regular .so file as
one might expect.  Here are its contents on my laptop (Ubuntu 8.10):

     [alceste@REDACTED ~]$ cat /usr/lib/libc.so
     /* GNU ld script
        Use the shared library, but some functions are only in
        the static library, so try that secondarily.  */
     GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a  AS_NEEDED (  
/lib/ld-linux.so.2 ) )

The real file you should open is /lib/libc.so.6.

And here comes the final problem: erl_ddll:load_library/3, just like
other erl_ddll functions, expects the file to end with .so.  And since
/lib/libc.so.6 does not respect this requirement, you should create a
symlink with the proper name, for example:

     ln -s /lib/libc.so.6 /tmp/libc.so

After that, you can simply execute:

     erl_ddll:load_library("/tmp", libc, [{preload, [{malloc, {void,  
pointer}},{free, {void, nonnull}}]}]).

And it should work as expected.

Note, however, that all .so files are (usually) automatically linked
to libc: you can open any regular .so file and just use it to call
libc functions through the FFI (thus avoiding the symlink cruft above).

Alceste Scalas <alceste@REDACTED>

This message was sent using IMP, the Internet Messaging Program.

More information about the erlang-questions mailing list