Rel. 11.3: Kernel doesn't compile anymore (SVN-334762, please fix!)
Peter
pmc at citylink.dinoex.sub.org
Wed Jul 24 23:13:22 UTC 2019
> Trying to compile my custom kernel in Rel. 11.3 results in this:
>
> -- kernel.full ---
> linking kernel.full
> atomic.o: In function `atomic_add_64':
> /usr/obj/usr/src/sys/E1R11V1/./machine/atomic.h:629: multiple definition of `atomic_add_64'
> opensolaris_atomic.o:/usr/src/sys/cddl/contrib/opensolaris/common/atomic/i386/opensolaris_atomic.S:71: first defined here
> *** [kernel.full] Error code 1
>
> Same config worked with 11.2
>
> The offending feature is either
> options ZFS
> or
> device dtrace
> (Adding any of these to the GENERIC config gives the same error.)
>
> This happens only when building for i386. Building amd64 with these
> options works.
Trying to analyze the issue:
The problem appears with SVN 334762 in 11.3:
This change adds two new functions to sys/i386/include/atomic.h:
atomic_add_64()
atomic_subtract_64()
[I don't really understand why this goes into a headerfile, but, well,
nevermind]
Also, this change deactivates two functions (only in case *i386*) from
sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c
atomic_add_64()
atomic_del_64()
[Now, there seems to be a slight strangeness here: if we *deactivate*
atomic_del_64(), and *insert* atomic_subtract_64(), then these two
names are not the same, and I might suppose that the atomic_del_64()
is then somehow missing. But, well, nevermind]
Now, the strange thing:
this file sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c
from which now two functions get excluded *only in case i386*, is not
even compiled for i386:
>/usr/src/sys/conf$ grep opensolaris_atomic.c *
>files.arm:cddl/compat/opensolaris/kern/opensolaris_atomic.c optional zfs | dtrace compile-with "${CDDL_C}"
>files.mips:cddl/compat/opensolaris/kern/opensolaris_atomic.c optional zfs | dtrace compile-with "${CDDL_C}"
>files.powerpc:cddl/compat/opensolaris/kern/opensolaris_atomic.c optional zfs powerpc | dtrace powerpc compile-with "${ZFS_C}"
>files.riscv:cddl/compat/opensolaris/kern/opensolaris_atomic.c optional zfs | dtrace compile-with "${CDDL_C}"
[So maybe that's the reason why the now lack of atomic_del_64() is not
complained? Or maybe it's not used, or maybe I didn't find some
definition whereever. Well, nevermind]
Anyway, the actual name clash happens between
sys/cddl/contrib/opensolaris/common/atomic/i386/opensolaris_atomic.S,
because that one *is* compiled:
>/usr/src/sys/conf$ grep i386/opensolaris_atomic.S *
>files.i386:cddl/contrib/opensolaris/common/atomic/i386/opensolaris_atomic.S optional zfs | dtrace compile-with "${ZFS_S}"
I tried to move out the changes from SVN 334762. Sadly, that didn't
work, because something does already use these atomic_add_64() stuff,
So instead, I did this one:
--- sys/cddl/contrib/opensolaris/common/atomic/i386/opensolaris_atomic.S (revision 350287)
+++ sys/cddl/contrib/opensolaris/common/atomic/i386/opensolaris_atomic.S (working copy)
@@ -66,8 +66,7 @@
* specific mapfile and remove the NODYNSORT attribute
* from atomic_add_64_nv.
*/
- ENTRY(atomic_add_64)
- ALTENTRY(atomic_add_64_nv)
+ ENTRY(atomic_add_64_nv)
pushl %edi
pushl %ebx
movl 12(%esp), %edi // %edi = target address
@@ -87,7 +86,6 @@
popl %edi
ret
SET_SIZE(atomic_add_64_nv)
- SET_SIZE(atomic_add_64)
ENTRY(atomic_or_8_nv)
movl 4(%esp), %edx // %edx = target address
And at least it compiles now. If it actually runs, that remains to be
found out.
Bottomline:
Please, please, please, sort this out and fix it.
More information about the freebsd-stable
mailing list