Skip to contentSkip to conversation

Module loader compile bug

2.5-bk Rusty Russell 3 participants 3 messages Nov 12, 2002 – Nov 13, 2002 1 message not in the archive

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

#1 lore raw

In message <[email protected]> you write:

Quoted 9 lines

I realize you're still working on this, but current bk is broken if you turn off module unload support. In include/linux/module.h we get:

	#else /*!CONFIG_MODULE_UNLOAD*/
<snip>
	#define symbol_put_addr(p) do { } while(0)
	
	#endif /* CONFIG_MODULE_UNLOAD */
Quoted 6 lines

Which upsets this line in kernel/module.c

void symbol_put_addr(void *addr)

After the preprocessor gets a hold of it all, gcc doesn't know what to make of "void do { } while(0)".

Yep, symbol_put_addr() in module.c should be moved under __symbol_put.

Patch is fairly trivial, does this work for you?
Rusty.
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.

kernel/module.c renamed from kernel/module.c.~1~ +22 -22
@@ -492,6 +492,28 @@ void __symbol_put(const char *symbol)
 }
 EXPORT_SYMBOL(__symbol_put);
 
+void symbol_put_addr(void *addr)
+{
+	struct kernel_symbol_group *ks;
+	unsigned long flags;
+
+	spin_lock_irqsave(&modlist_lock, flags);
+	list_for_each_entry(ks, &symbols, list) {
+ 		unsigned int i;
+
+		for (i = 0; i < ks->num_syms; i++) {
+			if (ks->syms[i].value == (unsigned long)addr) {
+				module_put(ks->owner);
+				spin_unlock_irqrestore(&modlist_lock, flags);
+				return;
+			}
+		}
+	}
+	spin_unlock_irqrestore(&modlist_lock, flags);
+	BUG();
+}
+EXPORT_SYMBOL_GPL(symbol_put_addr);
+
 #else /* !CONFIG_MODULE_UNLOAD */
 static void print_unload_info(struct seq_file *m, struct module *mod)
 {
@@ -716,28 +738,6 @@ void *__symbol_get(const char *symbol)
 }
 EXPORT_SYMBOL_GPL(__symbol_get);
 
-void symbol_put_addr(void *addr)
-{
-	struct kernel_symbol_group *ks;
-	unsigned long flags;
-
-	spin_lock_irqsave(&modlist_lock, flags);
-	list_for_each_entry(ks, &symbols, list) {
- 		unsigned int i;
-
-		for (i = 0; i < ks->num_syms; i++) {
-			if (ks->syms[i].value == (unsigned long)addr) {
-				module_put(ks->owner);
-				spin_unlock_irqrestore(&modlist_lock, flags);
-				return;
-			}
-		}
-	}
-	spin_unlock_irqrestore(&modlist_lock, flags);
-	BUG();
-}
-EXPORT_SYMBOL_GPL(symbol_put_addr);
-
 /* Transfer one ELF section to the correct (init or core) area. */
 static void *copy_section(const char *name,
 			  void *base,
#2 lore raw
Quoted 4 lines · Rusty Russell

Yep, symbol_put_addr() in module.c should be moved under __symbol_put.

Patch is fairly trivial, does this work for you?
Rusty.

Fixed mine. Only one minor thing, I still get a lot of warnings on:
include/linux/module.h:239: warning: `symbol_put' redefined

Thanks,
Paul Larson

#3 lore raw
In reply to Rusty Russell
Quoted 12 lines · Rusty Russell

In message <[email protected]> you write:

Quoted 11 lines

I realize you're still working on this, but current bk is broken if you turn off module unload support. In include/linux/module.h we get:

	#else /*!CONFIG_MODULE_UNLOAD*/
<snip>
	#define symbol_put_addr(p) do { } while(0)
	
	#endif /* CONFIG_MODULE_UNLOAD */

Which upsets this line in kernel/module.c

Quoted 8 lines
Quoted 4 lines

void symbol_put_addr(void *addr)

After the preprocessor gets a hold of it all, gcc doesn't know what to make of "void do { } while(0)".

Yep, symbol_put_addr() in module.c should be moved under __symbol_put.

Patch is fairly trivial, does this work for you?

Yes, thanks.

Signature · 1 line
Brad Heilbrun