Re: GNU Prolog and C mixing problem
Daniel Diaz <[email protected]>
| Newsgroups | gmane.comp.gnu.prolog.bugs |
|---|---|
| Message-ID | <[email protected]> |
GNU Prolog does not support shared library mainly because it uses ebx
which is also used to access the global offset table (GOT) with shared
library. I plan to modify this in the future...
Sorry.
Charles Christophe Thomart wrote:
> Hello,
>
> I've got some problems when trying to build a GNUProlog engine as a shared
> library.
>
> ##### Here's my main program (main.c) :
> #include <stdio.h>
> #include "libCtoProlog.h"
>
> int main(int argc, char *argv[]) {
> printf("In main!\n");
> doPrologDistribution("distribute", "prologdistribution.dist");
> return 0;
> }
>
> ##### The library header (libCtoProlog.h) :
> #include <stdio.h>
> #include <string.h>
> #include "gprolog.h"
>
> //void saveDistribution(FILE *outstream, PlTerm *List);
> int doPrologDistribution(char *PrologFileName, char *distributionfile);
> void testlib(void);
>
> ##### The library source code (libCtoProlog.c) :
> #include <stdio.h>
> #include <string.h>
> #include "gprolog.h"
> #define MAX_ELEMENT_NUMBER 200
>
> /*
> void saveDistribution(FILE *outstream, PlTerm *List) {
> ...
> }
> */
>
> int doPrologDistribution(char *PrologFileName, char *distributionfile) {
> int distribute, loadMyFile;
> WamWord args[3];
> PlTerm *solution;
> long solduration = 0;
> Bool res;
> // FILE *outputfile;
>
> printf("Launching prolog engine...\n");
> printf("Number of directives loaded : %d\n", Start_Prolog(0, NULL));
>
> // Initialisation
> loadMyFile = Find_Atom("consult");
> printf("Launching request...\n");
> Pl_Query_Begin(FALSE);
> args[0] = Mk_String(PrologFileName);
> printf("Arguments : %ld\n", args[0]);
>
> res = Pl_Query_Call(loadMyFile, 1, args);
> printf("Initialisation check : %d\n", res);
> Pl_Query_End(PL_CUT);
>
> if(res == 2)
> { //Case of an exception
> printf("Cannot find file %s.pl\n", PrologFileName);
> Stop_Prolog();
> return res;
> }
>
> distribute = Find_Atom("distribute");
>
> Pl_Query_Begin(FALSE);
> args[0] = Mk_Variable();
> args[1] = Mk_Variable();
>
> res = Pl_Query_Call(distribute, 2, args);
> printf("Request result : %d\n", res);
>
> if(res == 2)
> { //Cas of an exception
> printf("Terms are of type PLV:%d FDV:%d INT:%d FLT:%d ATM:%d LST:%d
> STC:%d\n", PLV, FDV, INT, FLT, ATM, LST, STC);
> printf("Exception of type %d\n", Type_Of_Term(Pl_Get_Exception()));;
> Stop_Prolog();
> return res;
> }
>
> solution = Rd_List_Check(args[0]);
> solduration = Rd_Integer(args[1]);
>
> Pl_Query_End(PL_CUT);
>
> printf("Solution founded with a maximum of %ld\n", solduration);
> /*
> outputfile = fopen(distributionfile, "w+t");
> saveDistribution(outputfile, solution);
> fclose(outputfile);
> */
>
> Stop_Prolog();
> return 0;
> }
>
> void testlib(void) {
> printf("Testing library...\n");
> }
>
> ##### The distribute.pl file could be as :
> % Empty file
>
> ##### The called distribution.pl file :
> distribute([[a, b]], 10).
>
> ##### The Makefile :
> CC = g++ -g2
> PROLOGCOMPILER = gplc
>
> PROLOG_LIBS_BEFORE = -L${GNUPROLOGHOME}/lib ${GNUPROLOGHOME}/lib/obj_begin.o
> PROLOG_LIBS_AFTER = ${GNUPROLOGHOME}/lib/all_pl_bips.o
> ${GNUPROLOGHOME}/lib/all_fd_bips.o ${GNUPROLOGHOME}/lib/top_level.o
> ${GNUPROLOGHOME}/lib/debugger.o -lbips_fd -lengine_fd -lbips_pl
> ${GNUPROLOGHOME}/lib/obj_end.o -lengine_pl -llinedit -lm
> PROLOG_FLAGS = ${GNUPROLOGHOME}/lib/obj_begin.o
> ${GNUPROLOGHOME}/lib/all_pl_bips.o ${GNUPROLOGHOME}/lib/all_fd_bips.o
> ${GNUPROLOGHOME}/lib/top_level.o ${GNUPROLOGHOME}/lib/debugger.o
> ${GNUPROLOGHOME}/lib/libbips_fd.a ${GNUPROLOGHOME}/lib/libengine_fd.a
> ${GNUPROLOGHOME}/lib/libbips_pl.a ${GNUPROLOGHOME}/lib/obj_end.o
> ${GNUPROLOGHOME}/lib/libengine_pl.a ${GNUPROLOGHOME}/lib/liblinedit.a -lm
>
> all: libCtoProlog.so CtoProlog
>
> CtoProlog: libCtoProlog.h distribution.o main.o libCtoProlog.so
> ${CC} ${PROLOG_LIBS_BEFORE} \
> main.o distribution.o -o CtoProlog \
> -L. -lCtoProlog ${PROLOG_LIBS_AFTER}
>
> main.o: main.c
> ${CC} -Wall -c $^ -o main.o ${PROLOG_FLAGS}
>
> distribution.o: distribution.pl
> ${PROLOGCOMPILER} -c distribution.pl
>
> libCtoProlog.o: libCtoProlog.c
> ${CC} -Wall -c $^ `./gprolog.conf --cflags`
>
> libCtoProlog.so: libCtoProlog.o distribution.o
> ${CC} -shared -o libCtoProlog.so \
> ${PROLOG_LIBS_BEFORE} $^ \
> ${PROLOG_LIBS_AFTER}
>
> clean:
> rm -f distribution.o main.o libCtoProlog.o CtoProlog *~
> rm -f libCtoProlog.so*
>
> ############################################
>
> The compilation seems to work : no errors, links look ok (with ldd), the
> library has the requested function (nm).
> But, when executing, I've got a "Global stack overflow (size 8193Kb)" error
> message, which sounds strange, since there's quite nothing to load.
>
> Using gdb, we see that the libraries are loaded, but the libCtoProlog.so
> hasn't got any start adress.
> The testlib() function is there only to test if the library is loaded, and
> seems to work.
>
> In fact, the error occurs during the Start_Prolog() call, or, to be precise,
> just after. This functions returns correctly, but the error appear a bit
> later (you can see it by putting a pause).
>
> Any ideas?
> Thanks in advance.
>
> Andalariel.
--
Ce message a subi une analyse antivirus
par MailScanner ; il est vraisemblablement
sans danger.