William Hu wrote:
> Hi David,
> 
> > What were the missing symbols? With the OCaml 4.10 package, I hit
> problems with this:
> >
> > echo 'print_endline "hello, world"' > hello.ml
> >
> > ocamlc -custom -runtime-variant _shared -o hello.exe hello.ml
> >
> > I think that may be an issue upstream (libasmrun_shared.so IIRC is
> broken on all platforms - on Cygwin, you can just about to persuade it to
> get to the same symbol errors because of the extra .dll.a file which gets
> generated).
> 
> It's a very long list of missing symbols (~400) so it's included as an
> attachment in case the mailing list truncates extremely lengthy emails.
> Also, just to note, the .dll.a file doesn't seem to be automatically
> generated by upstream OCaml.

I think this down to neglect - the PIC/shared versions of the runtime were 
contributed for a specific purpose and aren't properly maintained/tested AFAICT.

I'm not sure that libcamlrun_shared can ever have worked on Cygwin, at least 
certainly not since OCaml 3.11 (which is a loooong time ago). The patch builds 
cygcamlrun_shared.dll as a plugin DLL - so the symbols will have been stripped 
and moved into symtbl (hence the huge number of missing symbols when linking 
against it when it gets passed to a normal linker).

What normally happens with flexlink is that either an executable or a "main 
program DLL" (compiled with flexlink -maindll) would receive that symtbl from a 
DLL it flexdll_dlopen's and the DLL receives static_symtbl from the executable. 
That then means that the DLL can relocate any symbols it expected from the main 
executable and any other flexdll_dlopen'd DLLs. However, that's all meant to 
happen at runtime - I don't think flexlink has ever supported compiling an 
executable _itself_ which must flexdll_dlopen DLLs _before_ its main function.

I think it's quite feasible to add that to flexlink, but it's not a small piece 
of work - in the meantime I'd suggest instead deleting the 
BYTECODE_SHARED_LIBRARIES += and NATIVE_SHARED_LIBRARIES += lines in 
runtime/Makefile instead of patching them.

> > What's the full configuration command and what gets inferred for the
> build, host and target triplets? fma should work without emulation in
> Cygwin32 and it should be detecting as failing on Cygwin64 but the
> emulation should be enabled by default unless you explicitly passed --
> disable-imprecise-c99-float-ops.
> 
> Configuration command:
> ./configure --prefix=/usr --enable-ocamltest
> 
> If it's relevant, I'm compiling on a 64-bit machine with Cygwin32
> installed to compile the 32-bit version. Inferred build/host/target:
> configure:2779: Configuring OCaml version 4.14.0
> configure:3007: checking build system type
> configure:3021: result: i686-pc-cygwin
> configure:3041: checking host system type
> configure:3054: result: i686-pc-cygwin
> configure:3074: checking target system type
> configure:3087: result: i686-pc-cygwin
> 
> On Cygwin64, the test does fail and emulate by default:
> 
> configure:14872: result: no
> configure:14896: WARNING: fma does not work; emulation enabled
> 
> However, on Cygwin32, I get
> 
> configure:14872: result: no
> configure:14894: error: fma does not work, enable emulation with --enable-
> imprecise-c99-float-ops
> 
> config.log conveniently includes the program that fails, so I copy-pasted
> some very redundant code (attached) and ran it on the different
> architectures:
> 
> Cygwin64:
> t264| ans: 0x0p+0   accept: 0x1.0989687cp-1044 0x1.09df287cp-1044 0x1.0ap-
> 1044
> t264| pass?: 0
> t265| ans: 0x0p+0   accept: 0x1.0988p-1060 0x1.09ep-1060 0x1.0ap-1060
> t265| pass?: 0
> t266| ans: 0x1p-1074   accept: 0x1p-1073
> t266| pass?: 0
> 
> Cygwin32:
> t264| ans: 0x1.0ap-1044   accept: 0x1.0989687cp-1044 0x1.09df287cp-1044
> 0x1.0ap-1044
> t264| pass?: 1
> t265| ans: 0x1.0ap-1060   accept: 0x1.0988p-1060 0x1.09ep-1060 0x1.0ap-
> 1060
> t265| pass?: 1
> t266| ans: 0x1p-1073   accept: 0x1p-1073
> t266| pass?: 1
> 
> The numbers look like they agree but configure doesn't think so for some
> reason.

Would you be able to send the entire config.log file (off-list is fine!). I'm 
not seeing this at all in Cygwin32 here! 

All best,


David

Reply via email to