From kevinushey at gmail.com  Mon Jul 27 21:12:45 2015
From: kevinushey at gmail.com (Kevin Ushey)
Date: Mon, 27 Jul 2015 12:12:45 -0700
Subject: [Rd] R package with Fortran module on Windows? undefined
 reference to `__stack_chk_fail'
In-Reply-To: <CAJA1VFzHTJpsDKFJ7oJi5s_yPt3VQ3pXuOxyrpexO40eVucu6Q@mail.gmail.com>
References: <CAJA1VFzHTJpsDKFJ7oJi5s_yPt3VQ3pXuOxyrpexO40eVucu6Q@mail.gmail.com>
Message-ID: <CAJXgQP1tD2-t+r5RgOG0zj509AwkTCcU3fXMWRgMxx2qFFbcCg@mail.gmail.com>

You should be able to set PKG_FCFLAGS="-fno-stack-protector" when
compiling to ensure that the stack protector is not used.

(Trying that out on a Windows VM, with a simple `R CMD build` + `R CMD
INSTALL`, compilation of your package succeeded but linking failed
saying the DLL 'Fpi' was not found; I imagine that's a separate
issue.)

As an aside, be sure to check out what R-exts has to say on the topic
of Fortran code in R packages (especially F90 and above):
https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Using-F95-code.

Cheers,
Kevin

On Mon, Jul 27, 2015 at 11:06 AM, Ignacio Martinez <ignacio82 at gmail.com> wrote:
> Hi,
>
> I created a R library that uses a Fortran module. Everything works like a
> charm on linux.
>
> Now I'm trying to make it work on Windows. I cloned my git repository
> <https://github.com/ignacio82/MyPi> on a windows computer, and when I press
> the build and reload button on Rstudio I get these errors:
>
> ==> Rcmd.exe INSTALL --no-multiarch --with-keep.source MyPi
> * installing to library
> 'C:/Users/IMartinez/Documents/R/R-3.2.1/library'* installing *source*
> package 'MyPi' ...** libs
> gfortran -m64 -shared -s -static-libgcc -o MyPi.dll tmp.def Fpi.o
> -Ld:/RCompile/r-compiling/local/local320/lib/x64
> -Ld:/RCompile/r-compiling/local/local320/lib
> -LC:/Users/IMARTI~1/DOCUME~1/R/R-32~1.1/bin/x64 -lR
> Fpi.o: In function `__fortranpi_MOD_dboard':
> Fpi.f90:(.text+0xd7): undefined reference to `__stack_chk_fail'
> Fpi.o: In function `pi_':
> Fpi.f90:(.text+0x249): undefined reference to `__stack_chk_fail'
> collect2: ld returned 1 exit status
> no DLL was created
> ERROR: compilation failed for package 'MyPi'* removing
> 'C:/Users/IMartinez/Documents/R/R-3.2.1/library/MyPi'
>
> Exited with status 1.
>
>
> This is  the Fortran code:
>
>
> Module Fortranpi
> IMPLICIT NONE
> contains
> subroutine dboard(darts, dartsscore)
>   integer, intent(in)                    :: darts
>   double precision, intent(out)          :: dartsscore
>   double precision                       :: x_coord, y_coord
>   integer                                :: score, n
>
> score = 0
> do n = 1, darts
>   call random_number(x_coord)
>   call random_number(y_coord)
>
>   if ((x_coord**2 + y_coord**2) <= 1.0d0) then
>   score = score + 1
>   end if
> end do
>
> dartsscore = 4.0d0*score/darts
>
> end subroutine dboard
>
> subroutine pi(avepi, DARTS, ROUNDS) bind(C, name="pi_")
>   use, intrinsic                         :: iso_c_binding, only :
> c_double, c_int
>   real(c_double), intent(out)            ::  avepi
>   integer(c_int), intent(in)             ::  DARTS, ROUNDS
>   integer                                ::  MASTER, rank, i, n
>   integer, allocatable                   ::  seed(:)
>   double precision                       ::  pi_est, homepi, pirecv, pisum
> ! we set it to zero in the sequential run
> rank = 0! initialize the random number generator! we make sure the
> seed is different for each task
> call random_seed()
> call random_seed(size = n)
> allocate(seed(n))
> seed = 12 + rank*11
> call random_seed(put=seed(1:n))
> deallocate(seed)
>
> avepi = 0
> do i = 0, ROUNDS-1
>   call dboard(darts, pi_est)
>   ! calculate the average value of pi over all iterations
>   avepi = ((avepi*i) + pi_est)/(i + 1)
> end do
> end subroutine pi
>
> end module Fortranpi
>
>
> I tried adding <http://i.stack.imgur.com/lC82X.png> -fno-stack-protector
> -lssp but it did not help.
>
> I also tried doing this "by hand" <http://i.stack.imgur.com/WY4VD.png> and
> I get these errors:
>
>
>> system("R CMD SHLIB -fno-stack-protector -lssp ./src/Fpi.f90")
> gfortran -m64 -shared -s -static-libgcc -o src/Fpi.dll tmp.def
> ./src/Fpi.o -fno-stack-protector -lssp
> -Ld:/RCompile/r-compiling/local/local320/lib/x64
> -Ld:/RCompile/r-compiling/local/local320/lib
> -LC:/Users/IMARTI~1/DOCUME~1/R/R-32~1.1/bin/x64 -lR>
> dyn.load("./src/Fpi.dll")
> Error in inDL(x, as.logical(local), as.logical(now), ...) :
>   unable to load shared object 'C:/Users/IMartinez/Projects/MyPi/./src/Fpi.dll':
>   LoadLibrary failure:  %1 is not a valid Win32 application.
> 'C:/Users/IMartinez/Projects/MyPi/./src/Fpi.dll':
>   LoadLibrary failure:  %1 is not a valid Win32 application.
>
>
> Thanks for the help!
> ?
>
>
> PS: I posted this question in stackoverflow with no luck.
> <http://stackoverflow.com/questions/31638934/r-package-with-fortran-module-on-windows-undefined-reference-to-stack-chk-fa>
>
>
> PPS: I also sent this to r-help but they told me to try this list
>
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] R package with Fortran module on Windows? undefined reference to `__stack_chk_fail'
Kevin Ushey