[Ecls-list] C:MAKE-BUILD composition and hierarchical ar shrink-wrapping

Samium Gromoff _deepfire at feelingofgreen.ru
Tue Apr 1 12:15:22 UTC 2008


At Tue, 1 Apr 2008 17:05:41 +0200,
Juan Jose Garcia-Ripoll wrote:
> 
> On Tue, Apr 1, 2008 at 12:18 PM, Samium Gromoff
> <_deepfire at feelingofgreen.ru> wrote:
> > At Tue, 01 Apr 2008 14:05:16 +0400,
> >
> > Samium Gromoff wrote:
> >  >   2. C:MAKE-BUILD :TYPE :FASL, with both cases of monolithicity, complains
> >  > during post-compile LOAD of individual .fas files about not being provided
> >  > with the functions referred to by FFI:DEF-FUNCTION.
> >
> >  The issue appears to have a wider extent than I originally reported,
> >  the :TYPE :SHARED-LIBRARY seems to be affected by this too, in both
> >  cases of monolithicity setting as well.
> 
> I need a more concrete example of this FFI:DEF-FUNCTION issue. It may
> well be that you are doing something that is impossible, such as
> defining a C function in one FASL file which is used (by name) in a
> different file. If this is the case, your only option is to gather
> both systems in the same system, as sub-components. But, as I said, I
> need more information.

Let me illustrate it:

foo.asd: ======= 8< =======

(defpackage :foo.system
  (:use :cl :asdf))

(in-package :foo.system)

(defsystem :foo
  :components
  ((:file "foo")
   (:file "foo2" :depends-on ("foo"))))


foo.lisp: ======= 8< =======

(ffi:def-function "a"
  ()
  :returning :void)


foo2.lisp: ======= 8< =======

(defun b ()
  (a))


And building it using:

rm -f *.fas *.o *.so && \
ecl -eval '(require :cmp)' \
    -eval '(require :asdf)' \
    -eval '(asdf:make-build :foo :type :fasl :monolithic t)' \
    -eval '(quit)'

effects in:

;;; Loading #P"/usr/lib/ecl/cmp.fas"
;;; Loading #P"/usr/lib/ecl/sysfun.lsp"
;;; Loading #P"/usr/lib/ecl/asdf.fas"
; loading system definition from foo.asd into #<ASDF0 package>
;;; Loading "/mnt/ext/home/deepfire/local/foo.asd"
; registering #<SYSTEM :FOO 138486456> as FOO
;;; Compiling /mnt/ext/home/deepfire/local/foo.lisp.
;;; Compiling (DEFUN A ...).
;;; End of Pass 1.  
;;; Note: Creating tag: "_eclcdH8L_ZpSBj3" for #P"/mnt/ext/home/deepfire/local/foo.o"
;;; Emitting code for A.
;;; Calling the C compiler... 
;;; Note: Invoking external command:
;;; gcc  -D_GNU_SOURCE -g -O2 -fPIC  -fstrict-aliasing -Dlinux -O "-I/usr/include/" -w -c "/mnt/ext/home/deepfire/local/foo.c" -o "/mnt/ext/home/deepfire/local/foo.o"
;;; OPTIMIZE levels: Safety=2, Space=0, Speed=3, Debug=0
;;; Finished compiling /mnt/ext/home/deepfire/local/foo.lisp.
;;; Note: Scanning #P"/mnt/ext/home/deepfire/local/foo.o"
;;; Note: Found tag: "_eclcdH8L_ZpSBj3"
;;; Note: Invoking external command:
;;; gcc  -D_GNU_SOURCE -g -O2 -fPIC  -fstrict-aliasing -Dlinux -O "-I/usr/include/" -w -c "/mnt/ext/home/deepfire/local/ECLINITH9SULi.c" -o "/mnt/ext/home/deepfire/local/ECLINITH9SULi.o"
;;; Note: Invoking external command:
;;; gcc -o "/mnt/ext/home/deepfire/local/foo.fas" -L"/usr/lib/" "/mnt/ext/home/deepfire/local/ECLINITH9SULi.o" "/mnt/ext/home/deepfire/local/foo.o"  -shared    -lecl -ldl  -lm   -lgmp
;;; Loading "/mnt/ext/home/deepfire/local/foo.fas"
An error occurred during initialization:
LOAD: Could not load file "/mnt/ext/home/deepfire/local/foo.fas" (Error: "/mnt/ext/home/deepfire/local/foo.fas: undefined symbol: a").


Note that here I sort of cheat, by providing no information
whatsoever about how to link the C function "a", but feeding
ASDF:MAKE-BUILD the .so doesn't change it.


regards, Samium Gromoff




More information about the ecl-devel mailing list