Commit f841536e authored by Masahiro Yamada's avatar Masahiro Yamada
Browse files

modpost: dump Module.symvers in the same order of modules.order



modpost dumps the exported symbols into Module.symvers, but currently
in random order because it iterates in the hash table.

Add a linked list of exported symbols in struct module, so we can
iterate on symbols per module.

This commit makes Module.symvers much more readable; the outer loop in
write_dump() iterates over the modules in the order of modules.order,
and the inner loop dumps symbols in each module.

Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
Reviewed-by: default avatarNick Desaulniers <ndesaulniers@google.com>
parent ab489d60
Loading
Loading
Loading
Loading
+13 −16
Original line number Diff line number Diff line
@@ -185,6 +185,7 @@ static struct module *new_module(const char *modname)
	mod = NOFAIL(malloc(sizeof(*mod) + strlen(modname) + 1));
	memset(mod, 0, sizeof(*mod));

	INIT_LIST_HEAD(&mod->exported_symbols);
	INIT_LIST_HEAD(&mod->unresolved_symbols);
	INIT_LIST_HEAD(&mod->missing_namespaces);
	INIT_LIST_HEAD(&mod->imported_namespaces);
@@ -211,7 +212,7 @@ static struct module *new_module(const char *modname)

struct symbol {
	struct symbol *next;
	struct list_head list;	/* link to module::unresolved_symbols */
	struct list_head list;	/* link to module::exported_symbols or module::unresolved_symbols */
	struct module *module;
	char *namespace;
	unsigned int crc;
@@ -413,6 +414,7 @@ static struct symbol *sym_add_exported(const char *name, struct module *mod,

	if (!s) {
		s = new_symbol(name, mod, export);
		list_add_tail(&s->list, &mod->exported_symbols);
	} else if (!external_module || s->module->is_vmlinux ||
		   s->module == mod) {
		warn("%s: '%s' exported twice. Previous export was in %s%s\n",
@@ -2456,22 +2458,17 @@ static void read_dump(const char *fname)
static void write_dump(const char *fname)
{
	struct buffer buf = { };
	struct symbol *symbol;
	const char *namespace;
	int n;
	struct module *mod;
	struct symbol *sym;

	for (n = 0; n < SYMBOL_HASH_SIZE ; n++) {
		symbol = symbolhash[n];
		while (symbol) {
			if (!symbol->module->from_dump) {
				namespace = symbol->namespace;
	list_for_each_entry(mod, &modules, list) {
		if (mod->from_dump)
			continue;
		list_for_each_entry(sym, &mod->exported_symbols, list) {
			buf_printf(&buf, "0x%08x\t%s\t%s\t%s\t%s\n",
					   symbol->crc, symbol->name,
					   symbol->module->name,
					   export_str(symbol->export),
					   namespace ? namespace : "");
			}
			symbol = symbol->next;
				   sym->crc, sym->name, mod->name,
				   export_str(sym->export),
				   sym->namespace ?: "");
		}
	}
	write_buf(&buf, fname);
+1 −0
Original line number Diff line number Diff line
@@ -113,6 +113,7 @@ buf_write(struct buffer *buf, const char *s, int len);

struct module {
	struct list_head list;
	struct list_head exported_symbols;
	struct list_head unresolved_symbols;
	bool is_gpl_compatible;
	bool from_dump;		/* true if module was loaded from *.symvers */