[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
scripts.
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