Lookup modules.symbols.bin

Test in my system:

./test/test-lookup symbol:sas_slave_destroy
libkmod version 0.1
Alias: 'symbol:sas_slave_destroy'
Modules matching:
	libsas
diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c
index 7450ee3..fdfcf45 100644
--- a/libkmod/libkmod-module.c
+++ b/libkmod/libkmod-module.c
@@ -180,6 +180,8 @@
 	err = kmod_lookup_alias_from_config(ctx, alias, list);
 	CHECK_ERR_AND_FINISH(err, fail, list, finish);
 
+	err = kmod_lookup_alias_from_symbols_file(ctx, alias, list);
+	CHECK_ERR_AND_FINISH(err, fail, list, finish);
 
 finish:
 
diff --git a/libkmod/libkmod-private.h b/libkmod/libkmod-private.h
index 4abea76..55626f2 100644
--- a/libkmod/libkmod-private.h
+++ b/libkmod/libkmod-private.h
@@ -56,6 +56,7 @@
 /* libkmod.c */
 const char *kmod_get_dirname(struct kmod_ctx *ctx) __attribute__((nonnull(1)));
 int kmod_lookup_alias_from_config(struct kmod_ctx *ctx, const char *name, struct kmod_list **list);
+int kmod_lookup_alias_from_symbols_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list);
 
 /* libkmod-config.c */
 struct kmod_config {
diff --git a/libkmod/libkmod.c b/libkmod/libkmod.c
index 3dea3b8..b0c45f8 100644
--- a/libkmod/libkmod.c
+++ b/libkmod/libkmod.c
@@ -30,6 +30,7 @@
 
 #include "libkmod.h"
 #include "libkmod-private.h"
+#include "libkmod-index.h"
 
 /**
  * SECTION:libkmod
@@ -266,6 +267,52 @@
 	ctx->log_priority = priority;
 }
 
+
+static const char *symbols_file = "modules.symbols";
+
+int kmod_lookup_alias_from_symbols_file(struct kmod_ctx *ctx, const char *name,
+						struct kmod_list **list)
+{
+	char *fn;
+	int err;
+	struct index_file *index;
+	struct index_value *realnames, *realname;
+
+	if (!startswith(name, "symbol:"))
+		return 0;
+
+	if (asprintf(&fn, "%s/%s.bin", ctx->dirname, symbols_file) < 0)
+		return -ENOMEM;
+
+	DBG(ctx, "file=%s alias=%s", fn, name);
+
+	index = index_file_open(fn);
+	if (index == NULL) {
+		free(fn);
+		return -ENOSYS;
+	}
+
+	realnames = index_searchwild(index, name);
+	for (realname = realnames; realname; realname = realnames->next) {
+		struct kmod_module *mod;
+
+		err = kmod_module_new_from_name(ctx, realname->value, &mod);
+		if (err < 0) {
+			ERR(ctx, "%s\n", strerror(-err));
+			goto finish;
+		}
+
+		*list = kmod_list_append(*list, mod);
+	}
+
+finish:
+	index_values_free(realnames);
+	index_file_close(index);
+	free(fn);
+
+	return err;
+}
+
 int kmod_lookup_alias_from_config(struct kmod_ctx *ctx, const char *name,
 						struct kmod_list **list)
 {