]> granicus.if.org Git - yasm/commitdiff
Support dynamic linking for objfmts, and make bin and dbg both dynamically
authorPeter Johnson <peter@tortall.net>
Sat, 17 Aug 2002 05:08:53 +0000 (05:08 -0000)
committerPeter Johnson <peter@tortall.net>
Sat, 17 Aug 2002 05:08:53 +0000 (05:08 -0000)
loadable.

svn path=/trunk/yasm/; revision=700

14 files changed:
Makefile.am
frontends/yasm/yasm.c
libyasm/tests/Makefile.inc
modules/objfmts/bin/Makefile.inc
modules/objfmts/bin/bin-objfmt.c
modules/objfmts/dbg/Makefile.inc
modules/objfmts/dbg/dbg-objfmt.c
src/main.c
src/objfmt.c
src/objfmts/bin/Makefile.inc
src/objfmts/bin/bin-objfmt.c
src/objfmts/dbg/Makefile.inc
src/objfmts/dbg/dbg-objfmt.c
src/tests/Makefile.inc

index b122052d987bcc625f471b0cc71c705c81c9e1b6..51adcf7abbd702d785e73c5019b5721344a38860 100644 (file)
@@ -15,6 +15,7 @@ TESTS =
 noinst_PROGRAMS =
 
 yasm_SOURCES =
+yasm_LDFLAGS = -export-dynamic
 yasm_LDADD = @LIBLTDL@ @LIBOBJS@ $(INTLLIBS) @LIBADD_DL@
 
 lib_LTLIBRARIES =
index 0a91dd4ca03bf824b3eff3009fe8410406fdf925..fb4e9fe569e3f0929b69f35e348483328645da45 100644 (file)
@@ -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();
index 6fa0399062530923da073e4826d6e03a8fc3c490..43ca0c14613646714ec74c2054a2ea1fe04db9d3 100644 (file)
@@ -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@
index c48e66a06733e07dbad745bd3594db5aa50adc23..88a027cd53d07721abbe7c6569def6c5fb8ca28b 100644 (file)
@@ -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
index 4bd045b1dabc5fe4b12d3248b81faa7cfe34ece0..3a882c9ef3e06c1fa461eff10c3a86a7065cc0d6 100644 (file)
@@ -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,
index 6d22de0b9da05437dd39e4101988b85c546367d9..1083df36651452626d189cd36c67c15ae6759aae 100644 (file)
@@ -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
index 2189eec96e93b6cbffeaef4c0e88c495e7286879..35140996abef87fb77d5ef3750b4961636a8ea56 100644 (file)
@@ -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",
index 0a91dd4ca03bf824b3eff3009fe8410406fdf925..fb4e9fe569e3f0929b69f35e348483328645da45 100644 (file)
@@ -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();
index 01363927f721caa9c881fd4a118b6701ba615bc0..3619b362e2c78fff241474771c93ffededdeaf92 100644 (file)
 #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);
+       }
+    }
 }
index c48e66a06733e07dbad745bd3594db5aa50adc23..88a027cd53d07721abbe7c6569def6c5fb8ca28b 100644 (file)
@@ -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
index 4bd045b1dabc5fe4b12d3248b81faa7cfe34ece0..3a882c9ef3e06c1fa461eff10c3a86a7065cc0d6 100644 (file)
@@ -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,
index 6d22de0b9da05437dd39e4101988b85c546367d9..1083df36651452626d189cd36c67c15ae6759aae 100644 (file)
@@ -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
index 2189eec96e93b6cbffeaef4c0e88c495e7286879..35140996abef87fb77d5ef3750b4961636a8ea56 100644 (file)
@@ -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",
index 6fa0399062530923da073e4826d6e03a8fc3c490..43ca0c14613646714ec74c2054a2ea1fe04db9d3 100644 (file)
@@ -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@