From: John K. <jk2...@ya...> - 2003-11-23 08:09:21
|
I'm having some problems loading foreign code into SBCL 0.8.5 on Darwin (OS X 10.3) Essentially I'm trying to load the library libcpgplot.a, which I've broken down into an object file cpgplot.o using: ar -x libcpgplot.a ld -r *.o -o cpgplot.o I do it this way because simply loading a .a file did not work under Linux, but this variant did work. I also tried other variants (see below) I load the library with: (sb-alien:load-alien '("cpgplot.o") :libraries '("/data/Software/lib/libpgplot.a" "/data/Software/lib/libcpgplot.a" "-lc" "-lz" "/sw/lib/libpng.a" "/usr/X11R6/lib/libX11.a" ;; prevent undefined dyld_stub_binding_helper "/usr/lib/bundle1.o" ;; prevent undefined _G77_getenv_0 "/sw/lib/libg2c.a" ;; other stuff that g77 seems to want "/usr/lib/libcc_kext.a" "/sw/lib/libf2c.a")) the above mess came from a long round of experimention to ensure all the symbols resolved during the load-alien call. Now all the symbols are resolved, but when I try to do sb-alien:define-alien-routine I get the error (eg) 'unknown foreign symbol: "_cpgarro"' The error occurs in (SB-SYS:FOREIGN-SYMBOL-ADDRESS-AS-INTEGER "_cpgarro") and cpgarro is the very first C function I use in def-alien-routine. -- cpgarro is defined in libcpgplot.a I could get this library to work under Linux and Solaris, but with a different set of supporting libraries. You will observe that I am loading libcpgplot.a twice (in desperation): once as the cpgplot.o and once as libcpgplot.a, but I can remove libcpgplot.a and it behaves the same, or I can replace cpgplot.o with libcpgplot.a without changing the outcome. Natually, as a test I tried to load a simple .o file with one test function and no libraries, and that linked in just fine, and I was able to call the test function. Does anyone know if there are some tricks or peculiarities with Darwin object file loading? Am I just doing something obviously dumb? Many thanks for any help. __________________________________ Do you Yahoo!? Free Pop-Up Blocker - Get it now http://companion.yahoo.com/ |
From: John K. <jk2...@ya...> - 2003-11-24 02:08:46
|
--- I wrote: > I'm having some problems loading foreign code into SBCL 0.8.5 > on Darwin (OS X 10.3) > Essentially I'm trying to load the library libcpgplot.a, > which I've broken down into an object file cpgplot.o > using: > ar -x libcpgplot.a > ld -r *.o -o cpgplot.o UPDATE: I changed the line to recombine the .o files into cpgplot.o into ld *.o -o cpgplot.o And it works fine now, the library loads, my ffi code sees it, and all is good. Being unable to find foreign symbols had nothing to do with the underscore/no-underscore problem mentioned earlier in this list at http://www.caddr.com/macho/archives/sbcl-devel/2003-8/2303.html because I had been unable to find either the foreign_function or _foreign_function. I still have no idea what is going on with Darwin linking. And I don't understand why I can't load the library libcpgplot.a directly rather than breaking it down into constituent files and then rebuilding a .o file. If anyone can illuminate these issues, I would appreciate it. __________________________________ Do you Yahoo!? Protect your identity with Yahoo! Mail AddressGuard http://antispam.yahoo.com/whatsnewfree |
From: John K. <jk2...@ya...> - 2003-11-24 03:41:05
|
--- John Klein <jk2...@ya...> wrote: > UPDATE: I changed the line to recombine the .o files > into cpgplot.o into > > ld *.o -o cpgplot.o > > And it works fine now, the library loads, my ffi code sees it, > and all is good. > ACK! more confusion. Mea Culpa. Actually, it works only because I run load-foreign TWICE. I see the foreign symbols only after the 2nd load-foreign. I am lost. If I have a library libfoo.a that depends on (say) libbar1.a libbar2.so libbar3.a, what is the proper, canonical, correct way to load this library into sbcl? What I am doing now is using ar to break up libfoo.a into .o files, and recombining them into a big libfoo.o file with ld, and then loading this libfoo.o TWICE. It works, but I am sure it is wrong. eg: (dotimes (i 2) (load-foreign '("/path/to/libfoo.o") :libraries '("-lbar1.a" "/path/to/libbar2.so" "/path/to/libbar3.a"))) __________________________________ Do you Yahoo!? Free Pop-Up Blocker - Get it now http://companion.yahoo.com/ |