Date: Wed, 15 Jul 2015 18:17:20 +1000 From: Jan Mikkelsen <janm@transactionware.com> To: FreeBSD Stable Mailing List <freebsd-stable@freebsd.org> Cc: Karl Denninger <karl@denninger.net> Subject: amd64 kernel dynamic linking allows extern references to statics Message-ID: <13C52D9D-E1E6-4F83-A881-4E867C336B31@transactionware.com>
next in thread | raw e-mail | index | archive | help
Hi, (All on 10.2-BETA1.) I noticed that the latest patch in the bug = https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D187594 = <https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D187594> works on = amd64 but fails to load zfs.ko on i386 with a symbol not found error. Looking at the patch, there is one file that has =E2=80=9Cextern int = zio_use_uma=E2=80=9D to reference a variable that is declared elsewhere = as =E2=80=9Cstatic int zio_use_uma=E2=80=9D. To me this obviously should = not work. However it does work on amd64 but fails on i386. Below is a small test case that reproduces the problem. The generated = kernel module loads on amd64 but fails on i386. On amd64 one compilation = unit is accessing a static in from another compilation unit by declaring = the variable =E2=80=9Cextern=E2=80=9D.=20 I haven=E2=80=99t looked further to attempt to find the bug. However, it = looks like a Bad Thing=E2=84=A2 to me. Regards, Jan. =E2=80=94=E2=80=94Makefile: KMOD=3D refstatic SRCS=3D refstatic.c testfunc.c bus_if.h device_if.h pci_if.h .include <bsd.kmod.mk> =E2=80=94=E2=80=94 refstatic.c: #include <sys/param.h> #include <sys/kernel.h> #include <sys/bus.h> #include <sys/module.h> #include <sys/systm.h> #include <sys/types.h> #include <sys/malloc.h> #include <sys/kthread.h> #include <sys/conf.h> #include <sys/uio.h> #include <sys/bus.h> #include <sys/rman.h> #include <sys/queue.h> #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> #include <machine/bus.h> #include <machine/resource.h> static int testvar =3D 1; int func(void); static int refstatic_probe(device_t dev) { ++testvar; device_printf(dev, "func returns %d\n", func()); return ENXIO; } static int refstatic_attach(device_t dev) { (void) dev; return ENXIO; } static int refstatic_detach(device_t dev) { return 0; } static device_method_t refstatic_methods[] =3D { DEVMETHOD(device_probe, refstatic_probe), DEVMETHOD(device_attach, refstatic_attach), DEVMETHOD(device_detach, refstatic_detach), { 0, 0 } }; static driver_t refstatic_driver =3D { "refstatic", refstatic_methods, 64 }; static devclass_t refstatic_devclass; DRIVER_MODULE(refstatic, pci, refstatic_driver, refstatic_devclass, 0, = 0); =E2=80=94=E2=80=94testfunc.c: extern int testvar; int func(void); int func(void) { return testvar; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?13C52D9D-E1E6-4F83-A881-4E867C336B31>