For those of you in or from the US, Happy Thanksgiving, and to everyone else, all the best. In the lull between the parade and the turkey I returned to my SqueakFFIPrims on FreeBSD mystery.
On Fri, 2009-11-20 at 09:30 -0800, Eliot Miranda wrote:
On Fri, Nov 20, 2009 at 3:26 AM, Gary Dunn osp@aloha.com wrote:
[snip]
The thing is, this does not fix the real problem. If I load my 3.9 image and install the FFI package from SqueakMap, then run the FFI-Tests in SUnit runner I get 21 run, 0 passes, 0 expected failures, 0 failures, 21 errors, 0 unexpected passes. When I click on a result and open a debugger I find Error: Unable to find function address invokeWithArguments: argArray "Manually invoke the receiver, representing an external function." <primitive: 'primitiveCalloutWithArgs' module:'SqueakFFIPrims'> ^self externalCallFailed externalCallFailed "Raise an error after a failed call to an external function" | errCode | errCode := ExternalFunction getLastError. "this allows us to look at the actual error code" ^self error: (ExternalFunction errorMessageFor: errCode). error: aString "Throw a generic Error exception." ^Error new signal: aString If the ffi-test-main.c tests are passing, why are the SUnit tests all failing? Is that 64bit thing a big deal?
twice as big a deal as 32-bits... But seriously folks...
Have you built a SqueakFFIPrims shared object? Have you installed it in the right directory with other plugins?
Not there, but as you suggest later it might be 'built-in'
The Makefile in /usr/ports/lang/squeak/work/Squeak-3.9-7/build begins with:
MAKEFLAGS= --no-print-directory
VM_MAJOR= 3 VM_MINOR= 9 VM_RELEASE= 7 VM_VERSION= 3.9-7
SQ_MAJOR= 3 SQ_MINOR= 9a SQ_UPDATE= 7024 SQ_VERSION= 3.9a-7024
DEVEL= @DEVEL@
host= i386-portbld-freebsd7.1 host_cpu= i386 host_vendor= portbld host_os= freebsd7.1
topdir= /usr/ports/lang/squeak/work/Squeak-3.9-7 cfgdir= /usr/ports/lang/squeak/work/Squeak-3.9-7/platforms/unix/config srcdir= /usr/ports/lang/squeak/work/Squeak-3.9-7/platforms/unix/src blddir= /usr/ports/lang/squeak/work/Squeak-3.9-7/build
top_builddir= /usr/ports/lang/squeak/work/Squeak-3.9-7/build
prefix=/usr/local exec_prefix= ${prefix}
bindir= ${exec_prefix}/bin libdir= /usr/local/share datadir= ${prefix}/share mandir= /usr/local/man imgdir= /usr/local/share/squeak plgdir= /usr/local/share/squeak/3.9-7 docdir=/usr/local/share/doc/squeak
SHELL= /bin/sh MKINSTALLDIRS= $(SHELL) $(cfgdir)/mkinstalldirs INSTALL= /usr/bin/install -c -o root -g wheel INSTALL_PROG= install -s -o root -g wheel -m 555 $(INSTALL_ARGS) INSTALL_DATA= install -o root -g wheel -m 644 $(INSTALL_ARGS) UNINSTALL= $(SHELL) $(cfgdir)/uninstall AS= as AWK= gawk RANLIB= ranlib LIBTOOL= $(SHELL) $(top_builddir)/libtool NM= /usr/bin/nm -B LN= ln LN_S= ln -s
CC= cc DEFS= -DHAVE_CONFIG_H INCLUDES= -I/usr/ports/lang/squeak/work/Squeak-3.9-7/build -I/usr/ports/lang/squeak/work/Squeak-3.9-7/platforms/unix/vm -I/usr/ports/lang/squeak/work/Squeak-3.9-7/platforms/Cross/vm -I/usr/ports/lang/squeak/work/Squeak-3.9-7/platforms/unix/src/vm CPPFLAGS= -I/usr/local/include CFLAGS= -O2 -fno-strict-aliasing -pipe -fomit-frame-pointer -DLSB_FIRST=1 WFLAGS= -Wall -Wno-unknown-pragmas LDFLAGS= -L/usr/local/lib SOFLAGS= @SOFLAGS@ LIBM_CFLAGS= -O -fomit-frame-pointer
LIBS= -lutil -lm -liconv
X_CFLAGS= -O2 -fno-strict-aliasing -pipe -fomit-frame-pointer -DLSB_FIRST=1 X_INCLUDES= -I/usr/ports/lang/squeak/work/Squeak-3.9-7/build -I/usr/ports/lang/squeak/work/Squeak-3.9-7/platforms/unix/vm -I/usr/ports/lang/squeak/work/Squeak-3.9-7/platforms/Cross/vm -I/usr/ports/lang/squeak/work/Squeak-3.9-7/platforms/unix/src/vm -I/usr/local/include X_LIBS= -lGL -lXext -lSM -lICE -L/usr/local/lib -lm -lX11
LIB_UUID=
FFI_DIR= /usr/ports/lang/squeak/work/Squeak-3.9-7/platforms/unix/plugins/SqueakFFIPrims FFI_C= x86-sysv FFI_S= x86-sysv-asm FFI_O= x86-sysv$o x86-sysv-asm$o ...
I assume plgdir is the location of the plugins directory. Mine contains:
$ cd /usr/local/share/squeak/3.9-7 $ ll total 18276 drwxr-xr-x 2 root wheel - 1024 Apr 9 2009 ./ drwxr-xr-x 3 root wheel - 512 Apr 9 2009 ../ -r-xr-xr-x 1 root wheel - 6228 Apr 9 2009 AioPlugin* -r-xr-xr-x 1 root wheel - 51232 Apr 9 2009 B3DAcceleratorPlugin* -r-xr-xr-x 1 root wheel - 8472 Apr 9 2009 PseudoTTYPlugin* -r-xr-xr-x 1 root wheel - 53456 Apr 9 2009 Squeak3D* -rw-r--r-- 1 root wheel - 17584742 Apr 9 2009 SqueakV39.sources -r-xr-xr-x 1 root wheel - 30388 Apr 9 2009 UnixOSProcessPlugin* -r-xr-xr-x 1 root wheel - 6420 Apr 9 2009 XDisplayControlPlugin* -rwxr-xr-x 1 root wheel - 18200 Apr 9 2009 npsqueak.so* -r-xr-xr-x 1 root wheel - 785476 Apr 9 2009 squeak* -r-xr-xr-x 1 root wheel - 68824 Apr 9 2009 vm-display-X11* -r-xr-xr-x 1 root wheel - 5128 Apr 9 2009 vm-display-null* -r-xr-xr-x 1 root wheel - 7552 Apr 9 2009 vm-sound-NAS* -r-xr-xr-x 1 root wheel - 19720 Apr 9 2009 vm-sound-OSS* -r-xr-xr-x 1 root wheel - 4136 Apr 9 2009 vm-sound-null*
Nothing there about SqueakFFIPrims.
Is the export table in SqueakFFIPrims.c correct (calls itself SqueakFFIPrims, includes both primitiveCallout and primitiveCalloutWithArgs as exports).
I have /usr/ports/lang/squeak/work/Squeak-3.9-7/platforms/unix/src/vm/intplugins/SqueakFFIPrims which contains the single file SqueakFFIPrims.c
Near the top it has
/*** Constants ***/ #define FFIAtomicTypeMask 251658240 #define FFIAtomicTypeShift 24 #define FFIErrorAddressNotFound 13
which explains why the tests fail with error 13.
At the end of the file is the table as described by Eliot.
[snip]
The second tells you that, probably the VM is finding the SqueakFFIPrims module but its not finding primitiveCalloutWithArgs within it. You can check by tracing execution through ioLoadExternalFunctionOfLengthFromModuleOfLength.
Never been there. I Googled and found sqUnixExternalPrims.c by Andreas Raab, /* Primitive entry point from the Interpreter. Answer the address of the * given function in the given module. Fail the primitive (setting * successFlag to false) if the function cannot be found. */ int ioLoadExternalFunctionOfLengthFromModuleOfLength( int functionNameIndex, int functionNameLength, int moduleNameIndex, int moduleNameLength) { ...
I have that in /usr/ports/lang/squeak/work/Squeak-3.9-7/platforms/unix/src/vm
How do I trace execution through that? (If I am getting in over my head please say so. I don't want to waste people's time.)
[snip]
Note that the table shouldn't be being used because the plugin is typically used as an external plugin. If you're building it in then ignore what follows and reply saying "I want an internal plugin dammit!!"
If primitiveCalloutWithArgs isn't missing then is it being exported form the module? Use nm on whatever SqueakFFIPrims is compiled to and make sure its exported.
I can't find a SqueakFFIPrims.o file. Is there some other way to use nm?
That's it for now, it's time to feast. I will keep on poking, and certainly appreciate any and all help.