Skip site navigation (1)Skip section navigation (2)
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>