Re: section breakage on ppc64 (aka __devinitconst is broken by design)

From: Sam Ravnborg
Date: Sun Feb 03 2008 - 12:26:43 EST


On Sun, Feb 03, 2008 at 01:08:44PM +0000, Al Viro wrote:
> ; cat >a.c <<'EOF'
> const char foo[] __attribute__ ((__section__(".blah"))) = "";
> const char * const bar __attribute__((__section__(".blah"))) = "";
> EOF
> ; gcc -m32 -S a.c
> ; gcc -m64 -S a.c
> a.c:2: error: bar causes a section type conflict
> ;
>
> That's 4.1.2 on ppc. What happens is that the second declaration
> wants to make .blah writable. We actually trigger that in ppc64
> builds on drivers/net/natsemi.c.
>
> Note that on ppc64 without explicit sections you have the second one land in
> .data.rel.ro.local, which is "aw",progbits.
>
> The reason why it didn't visibly bite us before is that usually __devinit...
> just expanded to nothing (unless you disable HOTPLUG, which requires
> EMBEDDED, which wasn't apparently common enough for ppc64 builds).
>
> Suggestions?

Hi Al.

__devinitconst were invented to cover this issue.
So use __devinitconst for const data and
__devinitdata for non-const data.

We recently had breakage in mainline with x86 64 bit
(sis190) for the exact same case.

Does this work in your ppc example or do we need
to find another solution?

Sam
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/