From: Peter Johnson Date: Sat, 17 Aug 2002 05:08:53 +0000 (-0000) Subject: Support dynamic linking for objfmts, and make bin and dbg both dynamically X-Git-Tag: v0.2.0~152 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4a4fd6be7d67aa2eca3e821f034c3281cc5c79ed;p=yasm Support dynamic linking for objfmts, and make bin and dbg both dynamically loadable. svn path=/trunk/yasm/; revision=700 --- diff --git a/Makefile.am b/Makefile.am index b122052d..51adcf7a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -15,6 +15,7 @@ TESTS = noinst_PROGRAMS = yasm_SOURCES = +yasm_LDFLAGS = -export-dynamic yasm_LDADD = @LIBLTDL@ @LIBOBJS@ $(INTLLIBS) @LIBADD_DL@ lib_LTLIBRARIES = diff --git a/frontends/yasm/yasm.c b/frontends/yasm/yasm.c index 0a91dd4c..fb4e9fe5 100644 --- a/frontends/yasm/yasm.c +++ b/frontends/yasm/yasm.c @@ -144,7 +144,7 @@ main(int argc, char *argv[]) #endif /* Initialize preloaded symbol lookup table. */ - /*LTDL_SET_PRELOADED_SYMBOLS();*/ + LTDL_SET_PRELOADED_SYMBOLS(); /* Initialize libltdl. */ errors = lt_dlinit(); diff --git a/libyasm/tests/Makefile.inc b/libyasm/tests/Makefile.inc index 6fa03990..43ca0c14 100644 --- a/libyasm/tests/Makefile.inc +++ b/libyasm/tests/Makefile.inc @@ -18,7 +18,8 @@ bitvect_test_SOURCES = \ $(YASMOBJFMTFILES) \ $(YASMARCHFILES) \ $(CHECKFILES) -bitvect_test_LDADD = @LIBOBJS@ $(INTLLIBS) +bitvect_test_LDFLAGS = -export-dynamic +bitvect_test_LDADD = @LIBLTDL@ @LIBOBJS@ $(INTLLIBS) @LIBADD_DL@ #bytecode_test_SOURCES = \ # src/tests/bytecode_test.c \ @@ -30,7 +31,8 @@ bitvect_test_LDADD = @LIBOBJS@ $(INTLLIBS) # $(YASMOBJFMTFILES) \ # $(YASMARCHFILES) \ # $(CHECKFILES) -#bytecode_test_LDADD = @LIBOBJS@ $(INTLLIBS) +#bytecode_test_LDFLAGS = -export-dynamic +#bytecode_test_LDADD = @LIBLTDL@ @LIBOBJS@ $(INTLLIBS) @LIBADD_DL@ floatnum_test_SOURCES = \ src/tests/floatnum_test.c \ @@ -41,7 +43,8 @@ floatnum_test_SOURCES = \ src/xmalloc.c \ src/xstrdup.c \ $(CHECKFILES) -floatnum_test_LDADD = @LIBOBJS@ $(INTLLIBS) +floatnum_test_LDFLAGS = -export-dynamic +floatnum_test_LDADD = @LIBLTDL@ @LIBOBJS@ $(INTLLIBS) @LIBADD_DL@ #memexpr_test_SOURCES = \ # src/tests/memexpr_test.c \ @@ -53,4 +56,5 @@ floatnum_test_LDADD = @LIBOBJS@ $(INTLLIBS) # $(YASMOBJFMTFILES) \ # $(YASMARCHFILES) \ # $(CHECKFILES) -#memexpr_test_LDADD = @LIBOBJS@ $(INTLLIBS) +#memexpr_test_LDFLAGS = -export-dynamic +#memexpr_test_LDADD = @LIBLTDL@ @LIBOBJS@ $(INTLLIBS) @LIBADD_DL@ diff --git a/modules/objfmts/bin/Makefile.inc b/modules/objfmts/bin/Makefile.inc index c48e66a0..88a027cd 100644 --- a/modules/objfmts/bin/Makefile.inc +++ b/modules/objfmts/bin/Makefile.inc @@ -1,7 +1,11 @@ # $IdPath$ -YASMOBJFMTFILES += \ +lib_LTLIBRARIES += yasm-bin.la + +yasm_bin_la_SOURCES = \ src/objfmts/bin/bin-objfmt.c +yasm_bin_la_LDFLAGS = -module +yasm_LDADD += -dlopen yasm-bin.la EXTRA_DIST += \ src/objfmts/bin/tests/Makefile.inc diff --git a/modules/objfmts/bin/bin-objfmt.c b/modules/objfmts/bin/bin-objfmt.c index 4bd045b1..3a882c9e 100644 --- a/modules/objfmts/bin/bin-objfmt.c +++ b/modules/objfmts/bin/bin-objfmt.c @@ -554,7 +554,7 @@ bin_objfmt_directive(const char *name, valparamhead *valparams, } /* Define objfmt structure -- see objfmt.h for details */ -objfmt bin_objfmt = { +objfmt yasm_bin_LTX_objfmt = { "Flat format binary", "bin", NULL, diff --git a/modules/objfmts/dbg/Makefile.inc b/modules/objfmts/dbg/Makefile.inc index 6d22de0b..1083df36 100644 --- a/modules/objfmts/dbg/Makefile.inc +++ b/modules/objfmts/dbg/Makefile.inc @@ -1,4 +1,8 @@ # $IdPath$ -YASMOBJFMTFILES += \ +lib_LTLIBRARIES += yasm-dbg.la + +yasm_dbg_la_SOURCES = \ src/objfmts/dbg/dbg-objfmt.c +yasm_dbg_la_LDFLAGS = -module +yasm_LDADD += -dlopen yasm-dbg.la diff --git a/modules/objfmts/dbg/dbg-objfmt.c b/modules/objfmts/dbg/dbg-objfmt.c index 2189eec9..35140996 100644 --- a/modules/objfmts/dbg/dbg-objfmt.c +++ b/modules/objfmts/dbg/dbg-objfmt.c @@ -241,7 +241,7 @@ dbg_objfmt_directive(const char *name, valparamhead *valparams, } /* Define objfmt structure -- see objfmt.h for details */ -objfmt dbg_objfmt = { +objfmt yasm_dbg_LTX_objfmt = { "Trace of all info passed to object format module", "dbg", "dbg", diff --git a/src/main.c b/src/main.c index 0a91dd4c..fb4e9fe5 100644 --- a/src/main.c +++ b/src/main.c @@ -144,7 +144,7 @@ main(int argc, char *argv[]) #endif /* Initialize preloaded symbol lookup table. */ - /*LTDL_SET_PRELOADED_SYMBOLS();*/ + LTDL_SET_PRELOADED_SYMBOLS(); /* Initialize libltdl. */ errors = lt_dlinit(); diff --git a/src/objfmt.c b/src/objfmt.c index 01363927..3619b362 100644 --- a/src/objfmt.c +++ b/src/objfmt.c @@ -22,23 +22,23 @@ #include "util.h" /*@unused@*/ RCSID("$IdPath$"); +#include "ltdl.h" + #include "globals.h" #include "objfmt.h" -/* Available object formats */ -extern objfmt dbg_objfmt; -extern objfmt bin_objfmt; +static objfmt *dyn_objfmt = NULL; +static lt_dlhandle objfmt_module = NULL; -/* NULL-terminated list of all available object formats. - * Someday change this if we dynamically load object formats at runtime. +/* NULL-terminated list of all possibly available object format keywords. * Could improve this a little by generating automatically at build-time. */ /*@-nullassign@*/ -objfmt *objfmts[] = { - &dbg_objfmt, - &bin_objfmt, +const char *objfmts[] = { + "dbg", + "bin", NULL }; /*@=nullassign@*/ @@ -46,25 +46,43 @@ objfmt *objfmts[] = { objfmt * find_objfmt(const char *keyword) { - int i; + char *modulename; - /* We're just doing a linear search, as there aren't many object formats */ - for (i = 0; objfmts[i]; i++) { - if (strcasecmp(objfmts[i]->keyword, keyword) == 0) - /*@-unqualifiedtrans@*/ - return objfmts[i]; - /*@=unqualifiedtrans@*/ + /* Look for dynamic module. First build full module name from keyword. */ + modulename = xmalloc(5+strlen(keyword)+1); + strcpy(modulename, "yasm-"); + strcat(modulename, keyword); + objfmt_module = lt_dlopenext(modulename); + xfree(modulename); + + if (!objfmt_module) + return NULL; + + /* Find objfmt structure */ + dyn_objfmt = (objfmt *)lt_dlsym(objfmt_module, "objfmt"); + + if (!dyn_objfmt) { + lt_dlclose(objfmt_module); + return NULL; } - /* no match found */ - return NULL; + /* found it */ + return dyn_objfmt; } void list_objfmts(void (*printfunc) (const char *name, const char *keyword)) { int i; + objfmt *of; - for (i = 0; objfmts[i]; i++) - printfunc(objfmts[i]->name, objfmts[i]->keyword); + /* Go through available list, and try to load each one */ + for (i = 0; objfmts[i]; i++) { + of = find_objfmt(objfmts[i]); + if (of) { + printfunc(of->name, of->keyword); + dyn_objfmt = NULL; + lt_dlclose(objfmt_module); + } + } } diff --git a/src/objfmts/bin/Makefile.inc b/src/objfmts/bin/Makefile.inc index c48e66a0..88a027cd 100644 --- a/src/objfmts/bin/Makefile.inc +++ b/src/objfmts/bin/Makefile.inc @@ -1,7 +1,11 @@ # $IdPath$ -YASMOBJFMTFILES += \ +lib_LTLIBRARIES += yasm-bin.la + +yasm_bin_la_SOURCES = \ src/objfmts/bin/bin-objfmt.c +yasm_bin_la_LDFLAGS = -module +yasm_LDADD += -dlopen yasm-bin.la EXTRA_DIST += \ src/objfmts/bin/tests/Makefile.inc diff --git a/src/objfmts/bin/bin-objfmt.c b/src/objfmts/bin/bin-objfmt.c index 4bd045b1..3a882c9e 100644 --- a/src/objfmts/bin/bin-objfmt.c +++ b/src/objfmts/bin/bin-objfmt.c @@ -554,7 +554,7 @@ bin_objfmt_directive(const char *name, valparamhead *valparams, } /* Define objfmt structure -- see objfmt.h for details */ -objfmt bin_objfmt = { +objfmt yasm_bin_LTX_objfmt = { "Flat format binary", "bin", NULL, diff --git a/src/objfmts/dbg/Makefile.inc b/src/objfmts/dbg/Makefile.inc index 6d22de0b..1083df36 100644 --- a/src/objfmts/dbg/Makefile.inc +++ b/src/objfmts/dbg/Makefile.inc @@ -1,4 +1,8 @@ # $IdPath$ -YASMOBJFMTFILES += \ +lib_LTLIBRARIES += yasm-dbg.la + +yasm_dbg_la_SOURCES = \ src/objfmts/dbg/dbg-objfmt.c +yasm_dbg_la_LDFLAGS = -module +yasm_LDADD += -dlopen yasm-dbg.la diff --git a/src/objfmts/dbg/dbg-objfmt.c b/src/objfmts/dbg/dbg-objfmt.c index 2189eec9..35140996 100644 --- a/src/objfmts/dbg/dbg-objfmt.c +++ b/src/objfmts/dbg/dbg-objfmt.c @@ -241,7 +241,7 @@ dbg_objfmt_directive(const char *name, valparamhead *valparams, } /* Define objfmt structure -- see objfmt.h for details */ -objfmt dbg_objfmt = { +objfmt yasm_dbg_LTX_objfmt = { "Trace of all info passed to object format module", "dbg", "dbg", diff --git a/src/tests/Makefile.inc b/src/tests/Makefile.inc index 6fa03990..43ca0c14 100644 --- a/src/tests/Makefile.inc +++ b/src/tests/Makefile.inc @@ -18,7 +18,8 @@ bitvect_test_SOURCES = \ $(YASMOBJFMTFILES) \ $(YASMARCHFILES) \ $(CHECKFILES) -bitvect_test_LDADD = @LIBOBJS@ $(INTLLIBS) +bitvect_test_LDFLAGS = -export-dynamic +bitvect_test_LDADD = @LIBLTDL@ @LIBOBJS@ $(INTLLIBS) @LIBADD_DL@ #bytecode_test_SOURCES = \ # src/tests/bytecode_test.c \ @@ -30,7 +31,8 @@ bitvect_test_LDADD = @LIBOBJS@ $(INTLLIBS) # $(YASMOBJFMTFILES) \ # $(YASMARCHFILES) \ # $(CHECKFILES) -#bytecode_test_LDADD = @LIBOBJS@ $(INTLLIBS) +#bytecode_test_LDFLAGS = -export-dynamic +#bytecode_test_LDADD = @LIBLTDL@ @LIBOBJS@ $(INTLLIBS) @LIBADD_DL@ floatnum_test_SOURCES = \ src/tests/floatnum_test.c \ @@ -41,7 +43,8 @@ floatnum_test_SOURCES = \ src/xmalloc.c \ src/xstrdup.c \ $(CHECKFILES) -floatnum_test_LDADD = @LIBOBJS@ $(INTLLIBS) +floatnum_test_LDFLAGS = -export-dynamic +floatnum_test_LDADD = @LIBLTDL@ @LIBOBJS@ $(INTLLIBS) @LIBADD_DL@ #memexpr_test_SOURCES = \ # src/tests/memexpr_test.c \ @@ -53,4 +56,5 @@ floatnum_test_LDADD = @LIBOBJS@ $(INTLLIBS) # $(YASMOBJFMTFILES) \ # $(YASMARCHFILES) \ # $(CHECKFILES) -#memexpr_test_LDADD = @LIBOBJS@ $(INTLLIBS) +#memexpr_test_LDFLAGS = -export-dynamic +#memexpr_test_LDADD = @LIBLTDL@ @LIBOBJS@ $(INTLLIBS) @LIBADD_DL@