[clean-list] htoclean sorrows
Matthew Bromberg
mattcbro at earthlink.net
Thu May 11 06:33:19 MEST 2006
I am attempting to link to the acml BLAS .dll in a simple test of the
clean FFI. I have a windows XP 64 amd x2
machine.
Unfortunately after several days of playing around with it, including
downloading an
updated linker, I could not get it to work either using Microsofts VC
2003 or VC 6.0 toolset.
I'm afraid I will have to switch to Haskell for now since it is critical
that I am able to link to external dynamic libraries.
The description of how to do this is contained in this one paragraph in
the documentation
"The Clean linker for Windows and MacOS does not support importing
symbols from DLLs/shared libraries using object files (import
libraries), because some relocations are not implemented. Instead
symbols from a DLL/shared library are imported using an ascii file that
lists the symbols that are exported by a DLL/shared library. The first
line of such a file contains the name of the DLL/shared library (with
.dll extension on windows, usually no full pathname), the next lines
contain the names of the exported symbols (only functions), each symbol
on one line, spaces and comments are not permitted. Examples can be
found in the 'Clean System Files' folder of the StdEnv.'
Some things that are missing from this description are the fact that the
symbol format has an @number syntax appended to each symbol that is not
explained, and the menu path to the IDE menus that permit the import of
the symbol file and the import of the DLL are tricky to find and frankly
I can't be sure I got it correct. Also there is no description of how to
add the object file.
Here is my import file acml_library:
libacml_dll.dll
daxpy at 6
I have no idea really what the @6 means. I guessed it means push 6 32
bit words on to the argument stack, but I can't be sure. Is this
supposed to be a .def format? Here is my C code, cmatrix.c
#include "acml.h"
#include "Clean.h"
#include "cmatrix.h"
/* real multiply and accumulate using a stride of 1
* y = y + alpha * x
* the array length is returned */
int rmac(double alpha, CleanRealArray x, CleanRealArray y )
{
int nlen ;
nlen = CleanRealArraySize(y);
daxpy(nlen, alpha, x, 1, y, 1) ;
return(nlen) ;
}
/*
int main()
{
double xa[5] = {0.0 , 0.0, 1.0, 2.0, 3.0} ;
double ya[5] = {0.0, 0.0, 3.0, 2.0, 1.0} ;
int k, j, *iptr ;
double *x, *y ;
x = &(xa[2]) ;
y = &(ya[2]) ;
iptr = (unsigned int *) &(x[0]) ;
iptr[-2] = 3 ;
iptr = (unsigned int *) &(y[0]) ;
iptr[-2] = 3 ;
k = rmac(2.0, x, y) ;
printf("length = %d\n", k) ;
for (j = 0 ; j < 3 ; j++) {
printf("y[%d] = %g ", j, y[j]) ;
}
printf("\n") ;
return(k) ;
}
*/
This code links and works correctly if I uncomment main() and link to
the acml lib via C. htoclean and the compiler also run without
complaint. Here is my matrix.icl file:
module matrix
import StdEnv
import StdList
import StdArray
import cmatrix
x :: {#Real}
x = {0.5, -0.5, 1.0, -1.0}
// unboxed array IO, uniqueness
y :: *{#Real}
y = {1.0, 2.0, 3.0, 4.0}
// q = {z+ 2.0 * w \\ z <-: y & w <-: x}
// Start = q
nlen :: *Int
nlen = 0
Start :: (*{#Real}, Int)
Start
#! nlen = rmac 2.0 x y
= (y, nlen)
Now everything compiles and links correctly but fails on execution with
the cryptic words
from the operating system that matrix.exe is not a valid Win32
application. It then exits with the words
access denied in the Dos window. It does this with both the old linker
and the new linker.
More information about the clean-list
mailing list