loadable.
svn path=/trunk/yasm/; revision=700
noinst_PROGRAMS =
yasm_SOURCES =
+yasm_LDFLAGS = -export-dynamic
yasm_LDADD = @LIBLTDL@ @LIBOBJS@ $(INTLLIBS) @LIBADD_DL@
lib_LTLIBRARIES =
#endif
/* Initialize preloaded symbol lookup table. */
- /*LTDL_SET_PRELOADED_SYMBOLS();*/
+ LTDL_SET_PRELOADED_SYMBOLS();
/* Initialize libltdl. */
errors = lt_dlinit();
$(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 \
# $(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 \
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 \
# $(YASMOBJFMTFILES) \
# $(YASMARCHFILES) \
# $(CHECKFILES)
-#memexpr_test_LDADD = @LIBOBJS@ $(INTLLIBS)
+#memexpr_test_LDFLAGS = -export-dynamic
+#memexpr_test_LDADD = @LIBLTDL@ @LIBOBJS@ $(INTLLIBS) @LIBADD_DL@
# $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
}
/* Define objfmt structure -- see objfmt.h for details */
-objfmt bin_objfmt = {
+objfmt yasm_bin_LTX_objfmt = {
"Flat format binary",
"bin",
NULL,
# $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
}
/* 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",
#endif
/* Initialize preloaded symbol lookup table. */
- /*LTDL_SET_PRELOADED_SYMBOLS();*/
+ LTDL_SET_PRELOADED_SYMBOLS();
/* Initialize libltdl. */
errors = lt_dlinit();
#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@*/
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);
+ }
+ }
}
# $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
}
/* Define objfmt structure -- see objfmt.h for details */
-objfmt bin_objfmt = {
+objfmt yasm_bin_LTX_objfmt = {
"Flat format binary",
"bin",
NULL,
# $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
}
/* 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",
$(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 \
# $(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 \
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 \
# $(YASMOBJFMTFILES) \
# $(YASMARCHFILES) \
# $(CHECKFILES)
-#memexpr_test_LDADD = @LIBOBJS@ $(INTLLIBS)
+#memexpr_test_LDFLAGS = -export-dynamic
+#memexpr_test_LDADD = @LIBLTDL@ @LIBOBJS@ $(INTLLIBS) @LIBADD_DL@