[Rd] How to customize the list of exported functions in a shared library

Vladimir Eremeev wl2776 at gmail.com
Mon Feb 5 15:41:56 CET 2007

Andrew Piskorski wrote:
> On Mon, Feb 05, 2007 at 01:28:24AM -0800, Vladimir Eremeev wrote:
>> I am writing binding from C library to R.
>> I use R 2.4.1, windows XP, and MinGW.
>> R CMD SHLIB -d --output=Rsnns.dll  [ list of all C sources]
>> R CMD SHLIB -d --output Rsnns.dll Rsnns.c
>> -Wl,-Lc:/mingw/lib,-lfl,-L../sources,-lkernel,-lfunc
> You should probably also show us the actual compiler/linker commands
> that "R CMD SHLIB" is generating, so we can be sure of what's really
> going on.

It calls gcc:
gcc  "-I../sources" "-I."  -IC:/PROGRA~1/R/include  -gdwarf-2 -Wall -O2
-std=gnu99   -c rsnns.c -o rsnns.o
gcc  -shared   -o Rsnns.dll Rsnns.def [ lots of *.o ]  -LC:/PROGRA~1/R/bin
"-Lc:/mingw/lib" -lfl -liberty   -lR

The file Rsnns.def is generated automatically and is deleted on success.
On error, it remains, and contains export of all symbols.
Probably GCC generates it, I haven't tracked its generation in the R's

Andrew Piskorski wrote:
> I'm not sure what you may have to do differently with MinGW on Windows
> (what linker does that use anyway?), but for comparison, here's how I
> do it for R 2.2.1, on Linux (Ubuntu Dapper 6.06), with gcc 4.0.3, and
> Gnu ld 2.16.91:

gcc.EXE (GCC) 3.4.2 (mingw-special)
GNU ld version 2.15.91 20040904

Thank you, I'll study this linker option.

Andrew Piskorski wrote:
> For my own custom R package's C code, my Makefile says:
>   OBJ = ../foo.o $(patsubst %.c,%.o,$(wildcard ../source/[a-z]*.c))
>   $(OBJ): %.o:  %.c $(HDRS)
>   R.so: $(OBJ) Makevars vis.map
>           R CMD SHLIB -o my_pkg_name_R.so $(OBJ)
> My Makevars includes this:
>   PKG_LIBS = -Wl,--version-script=vis.map
> And when I build my R package, the R.so make target above generates
> this link command:
>   gcc -shared -o my_pkg_name_R.so [lots of *.o filenames here]
> -Wl,--version-script=vis.map -L/usr/lib/R/lib -lR
> My vis.map file, which uses Gnu ld syntax, looks like this:
>   {
>      global: my_pkg_*;
>      local:*;
>   };
> That works, my shared library exports ONLY the symbols starting with
> "my_pkg_", everything else remains private.
> It's the "--version-script" linker option doing the magic.  Even with
> Gnu ld, there are definitely other ways to control symbol visibility,
> but that one seemed most convenient in my case.
> -- 
> Andrew Piskorski <atp at piskorski.com>
> http://www.piskorski.com/

View this message in context: http://www.nabble.com/How-to-customize-the-list-of-exported-functions-in-a-shared-library-tf3173289.html#a8807456
Sent from the R devel mailing list archive at Nabble.com.

More information about the R-devel mailing list