Bill Allombert on Fri, 03 May 2019 11:41:42 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: PATCH: support install() on Win: [Re: Please test pari-2.11.2 prerelease 1] |
On Thu, May 02, 2019 at 03:39:56AM -0700, Ilya Zakharevich wrote: > On Sun, Apr 28, 2019 at 04:08:23PM +0200, Bill Allombert wrote: > > We have made available a prerelease of PARI 2.11.2 (stable). > > Strangely, install() is not supported on Windows (with static > builds). It is so much easier on Windows than on OS/2?????????you could not > export symbols from an exe file??? It is supported by the dynamic build, which is provided by the NSIS installer package: <https://pari.math.u-bordeaux.fr/pub/pari/windows/snapshots/Pari64-2-11-2-pre1.exe> > I attach a patch to es.c. Additionally, a def file should be linked > to the exe. The patch below shows one way to do it. (I do not know > how to modify the build environment to make this change to Makefile.) This is done in config/Makefile.SH > --- pari-2.11.1/src/language/es.c-pre 2018-07-25 11:00:21.000000000 -0700 > +++ pari-2.11.1/src/language/es.c 2019-05-02 03:25:45.470881300 -0700 > @@ -5200,7 +5200,6 @@ install0(const char *name, const char *l > # define RTLD_GLOBAL 0 > #endif > handle = gp_dlopen(lib, RTLD_LAZY|RTLD_GLOBAL); > - > if (!handle) > { > const char *s = dlerror(); if (s) err_printf("%s\n\n",s); > @@ -5236,12 +5235,24 @@ gp_LoadLibrary(const char *name) > } > return NULL; > } > +static int I_m_a_DLL = -1; > +static HMODULE hmod_exe, hmod_dll; > static void * > install0(const char *name, const char *lib) > { > HMODULE handle; > > - handle = gp_LoadLibrary(lib); > + if (lib == pari_library_path) { > + if (I_m_a_DLL < 0) { > + hmod_exe = hmod_dll = GetModuleHandleA(NULL); > + if (!hmod_exe /* Can this happen? */ > + || !(GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, > + (LPCSTR)install0, &hmod_dll))) > + I_m_a_DLL = hmod_exe != hmod_dll; > + } > + handle = hmod_dll; > + } else > + handle = gp_LoadLibrary(lib); > if (!handle) > { > if (lib) pari_err(e_MISC,"couldn't open dynamic library '%s'",lib); What does that do ? Does install("addii",GG); addii(2,3) work with this patch with gp-sta ? Cheers, Bill