diff --git a/README.md b/README.md
index 330a0cd..0e83899 100644
--- a/README.md
+++ b/README.md
@@ -638,3 +638,13 @@ libname_la_LDFLAGS = -version-info 0:0:0 (current:vevision:age)  (注意，这
 Libtool有个选项 -module，这个选项用在hithere_la_LDFLAGS变量后面，这个选项告诉Libtool，你希望以hithere而不是libhithere去调用这个模块。如果在使用模块时，不需要版本信息，可以使用-avoid-version选项。这样生成的库名字为：libname.so，而不是libname.so.0.0.0，同时也不会生横软链接文件。

+
+使用Libtool's Ltdl替代libdl，大部分程序忽略了Ltdl，因为在调用它的过程中有点麻烦。下面介绍下：
+1、ltdl函数提供了dl库中函数的名字转换，都加了前缀lt_;
+2、和dl库不同，ltdl库必须初始化，在应用程序适当的地方终止；
+3、程序必须在链接选项中使用 -dlopen modulename(在*_LDFLAGS变量中)。来告诉Libtool当构建程序时没有共享库，或当静态链接时，链接module的代码到应用程序中；
+4、LTDL_SET_PRELOADED_SYMBOLS() 宏应该在应用程序适当的地方使用，却保模块代码可以通过非动态库或当静态链接时被访问到；
+5、动态库模块设计成dlopen-ed， 使用ldtl应该加上-module选项(可以使用-avoid-version选项) (可以是通过命令行或是通过*_LDFLAGS变量)；
+6、ltdl库提供比dl库丰富的功能，这些功能都是可选的
+
+
diff --git a/configure.ac b/configure.ac
index 01690e1..34e9285 100644
--- a/configure.ac
+++ b/configure.ac
@@ -56,10 +56,10 @@ AC_ARG_ENABLE([async-exec],
 ######## First check if the user enable a function, then check the headers and libs, as it need!

 # Checks for header files.
-AC_CHECK_HEADERS([stdlib.h dlfcn.h])
+AC_CHECK_HEADERS([stdlib.h ltdl.h])

 # Checks for libraries.
-AC_SEARCH_LIBS([dlopen], [dl])
+AC_SEARCH_LIBS([lt_dlopen], [ltdl])

 if test "x${async_exec}" = xyes; then
     # Checks for libraries.
diff --git a/src/Makefile.am b/src/Makefile.am
index 847589b..883b9d9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -3,7 +3,7 @@ SUBDIRS = modules/hithere
 bin_PROGRAMS = jupiter
 jupiter_SOURCES = main.c module.h
 jupiter_CPPFLAGS = -I$(top_srcdir)/include
-jupiter_LDADD = ../libjup/libjupiter.la
+jupiter_LDADD = ../libjup/libjupiter.la -dlopen modules/hithere/hithere.la

 check_SCRIPTS = greptest.sh
 TESTS = $(check_SCRIPTS)
diff --git a/src/main.c b/src/main.c
index 17891bf..7a5c406 100644
--- a/src/main.c
+++ b/src/main.c
@@ -11,8 +11,8 @@
 #include <pthread.h>
 #endif

-#if HAVE_DLFCN_H
-#include <dlfcn.h>
+#if HAVE_LTDL_H
+#include <ltdl.h>
 #endif

 #define DEFAULT_SALUTATION "Hello"
@@ -20,25 +20,34 @@
 int main(int argc, char *argv[]) {
     const char *salutation = DEFAULT_SALUTATION;

-#if HAVE_DLFCN_H
-    void *module;
+#if HAVE_LTDL_H
+    int ltdl;
+    lt_dlhandle *module;
     get_salutation_t *get_salutation_fp = NULL;

-    module = dlopen("./module.so", RTLD_NOW);
-    if (module != NULL) {
-        get_salutation_fp = (get_salutation_t *)
-                            dlsym(module, GET_SALUTATION_SYM);
-        if (get_salutation_fp != NULL) {
-            salutation = get_salutation_fp();
+    LTDL_SET_PRELOADED_SYMBOLS();
+
+    ltdl = lt_dlinit();
+    if (ltdl == 0) {
+        module = lt_dlopen("modules/hithere/hithere.la");
+        if (module != NULL) {
+            get_salutation_fp = (get_salutation_t *)
+                                lt_dlsym(module, GET_SALUTATION_SYM);
+            if (get_salutation_fp != NULL) {
+                salutation = get_salutation_fp();
+            }
         }
     }
 #endif

     jupiter_print(salutation, argv[0]);

-#if HAVE_DLFCN_H
-    if (module != NULL) {
-        dlclose(module);
+#if HAVE_LTDL_H
+    if (ltdl == 0) {
+        if (module != NULL) {
+            lt_dlclose(module);
+        }
+        lt_dlexit();
     }
 #endif