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