linker error: section __modver vma 0x6028c000 overlaps previous

michi1 at michaelblizek.twilightparadox.com michi1 at michaelblizek.twilightparadox.com
Wed May 9 00:41:38 EDT 2012


Hi!

I am facing a weird problem:
$ ARCH=um make linux
make[1]: `arch/um/sys-x86_64/user-offsets.s' is up to date.
  CHK     include/linux/version.h
  CHK     include/generated/utsrelease.h
  CALL    scripts/checksyscalls.sh
  CHK     include/generated/compile.h
  QUOTE   arch/um/kernel/config.tmp
  QUOTE   arch/um/kernel/config.c
  CC      arch/um/kernel/config.o
  LD      arch/um/kernel/built-in.o
  VDSOSYM arch/um/sys-x86_64/vdso/vdso-syms.lds
  LD      arch/um/sys-x86_64/vdso/built-in.o
  LD      arch/um/sys-x86_64/built-in.o
  CHK     kernel/config_data.h
  LD      vmlinux.o
  MODPOST vmlinux.o
  GEN     .version
  CHK     include/generated/compile.h
  UPD     include/generated/compile.h
  CC      init/version.o
  LD      init/built-in.o
  LD      .tmp_vmlinux1
  KSYM    .tmp_kallsyms1.S
  AS      .tmp_kallsyms1.o
  LD      .tmp_vmlinux2
/usr/bin/ld: .tmp_vmlinux2: section __modver vma 0x6028c000 overlaps previous sections
  KSYM    .tmp_kallsyms2.S
  AS      .tmp_kallsyms2.o
  LD      vmlinux
/usr/bin/ld: vmlinux: section __modver vma 0x6028c000 overlaps previous sections
  SYSMAP  System.map
  SYSMAP  .tmp_System.map
  LINK linux


This is triggered by changing files in my network protocol code for no
apparent reason. My code is at available at http://repo.or.cz/w/cor.git?a=tree

This change triggers it:

diff --git a/net/cor/credits.c b/net/cor/credits.c
index e0fb39a..776d197 100644
--- a/net/cor/credits.c
+++ b/net/cor/credits.c
@@ -556,7 +556,14 @@ void connreset_credits(struct conn *cn)
 {
 	unsigned long iflags;
 
-	__u32 unlockhints = credits_lock_conn(cn);
+	if (cn->is_client) {
+		spin_lock_bh(&(cn->rcv_lock));
+		spin_lock_bh(&(cn->reversedir->rcv_lock));
+	} else {
+		spin_lock_bh(&(cn->reversedir->rcv_lock));
+		spin_lock_bh(&(cn->rcv_lock));
+	}
+
 	if (cn->in_credit_list) {
 		spin_lock_irqsave(&credits_list_lock, iflags);
 		list_del(&(cn->credit_list));
@@ -582,13 +589,26 @@ void connreset_credits(struct conn *cn)
 				cn->crate_out, 0);
 		spin_unlock_irqrestore(&(nb->credits_lock), iflags);
 	}
-	credits_unlock_conn(cn, unlockhints);
+
+	if (cn->is_client) {
+		spin_unlock_bh(&(cn->rcv_lock));
+		spin_unlock_bh(&(cn->reversedir->rcv_lock));
+	} else {
+		spin_unlock_bh(&(cn->reversedir->rcv_lock));
+		spin_unlock_bh(&(cn->rcv_lock));
+	}
 }
 
 void set_conn_in_decaytime(struct neighbor *nb, __u32 conn_id,
 		struct conn *src_in, __u8 decaytime_seqno, __u16 decaytime)
 {
-	__u32 unlockhints = credits_lock_conn(src_in);
+	if (src_in->is_client) {
+		spin_lock_bh(&(src_in->rcv_lock));
+		spin_lock_bh(&(src_in->reversedir->rcv_lock));
+	} else {
+		spin_lock_bh(&(src_in->reversedir->rcv_lock));
+		spin_lock_bh(&(src_in->rcv_lock));
+	}
 
 	if (unlikely(is_conn_in(src_in, nb, conn_id) == 0))
 		goto out;
@@ -608,7 +628,13 @@ set:
 	refresh_conn_credits(src_in, 0, 1);
 
 out:
-	credits_unlock_conn(src_in, unlockhints);
+	if (src_in->is_client) {
+		spin_unlock_bh(&(src_in->rcv_lock));
+		spin_unlock_bh(&(src_in->reversedir->rcv_lock));
+	} else {
+		spin_unlock_bh(&(src_in->reversedir->rcv_lock));
+		spin_unlock_bh(&(src_in->rcv_lock));
+	}
 }
 
 static void background_refresh_credits(struct work_struct *work)


However, if only one instead of both credits_(un)lock_conn changes are made,
the error/warning is gone. By searching on the internet it looks like the
linker runs out of ressources, maybe because of certain properties of the
build environment. However, I did not find a solution yet. Any ideas?

My system is debian stable/squeeze.

	-Michi



More information about the Kernelnewbies mailing list