From kyleb at metrumrg.com  Sun Aug  7 06:51:53 2016
From: kyleb at metrumrg.com (Kyle Baron)
Date: Sat, 6 Aug 2016 23:51:53 -0500
Subject: [Rd] Quote symbol names under EXPORTS in tmp.def on Windows
Message-ID: <CAJ2Cw8S1bfQQwMOsPhc9xQ6xNKadGqPmmrXt6tjXsofKT_bqCA@mail.gmail.com>

I originally posted on this topic on a different thread:
https://stat.ethz.ch/pipermail/r-devel/2016-August/072938.html

These sources suggested that a safe practice might be to put double
quotes around symbol names in EXPORTS in case the symbol name is the
same as a linker keyword:
   - https://sourceware.org/binutils/docs/ld/Symbols.html#Symbols
   - https://msdn.microsoft.com/en-us/library/163abkbh.aspx

I wasn't sure how that related specifically to what Rtools is using,
but when I made the following change to winshlib.mk (double quotes
around symbol names in tmp.def), I was able to compile code without
issue and get symbols like BASE (or other keywords) exported.


Kyle




## ${R_HOME}/share/make/winshlib.mk
6a7,8
> ADDQU = 's/[^ ][^ ]*/"&"/g'
>
17c19
<     $(NM) $^ | $(SED) -n $(SYMPAT) $(NM_FILTER) >> tmp.def; \
---
>     $(NM) $^ | $(SED) -n $(SYMPAT) $(NM_FILTER) | $(SED) $(ADDQU) >> tmp.def; \



code <- '

void BASE(int *nin, double *x) {
   int n = nin[0];
   for (int i=0; i<n; i++) x[i] = x[i] * x[i];
}

void rd(int *nin, double *x) {
   int n = nin[0];
   for (int i=0; i<n; i++) x[i] = x[i] * x[i];
}

double EXPORTS = 2.1;
int LIBRARY = 3;
'

writeLines(code, "src1.c")

system("R CMD SHLIB src1.c")
dyn.load("src1.dll")

is.loaded("EXPORTS",PACKAGE="src1")
is.loaded("BASE",PACKAGE="src1")
is.loaded("rd",PACKAGE="src1")

dyn.unload("src1.dll")



-- 
Kyle Baron
Metrum Research Group



[Rd] Quote symbol names under EXPORTS in tmp.def on Windows
Kyle Baron