Re: Extern variables in *.c files
Andrew Morton (akpm@zip.com.au)
Wed, 02 Jan 2002 23:19:29 -0800
Momchil Velikov wrote:
>
> >>>>> "Andrew" == Andrew Morton <akpm@zip.com.au> writes:
>
> Andrew> Oliver Xymoron wrote:
> >>
> >> On Wed, 2 Jan 2002, vda wrote:
> >>
> >> > I grepped kernel *.c (not *.h!) files for extern variable definitions.
> >> > Much to my surprize, I found ~1500 such defs.
> >> >
> >> > Isn't that bad C code style? What will happen if/when type of variable gets
> >> > changed? (int->long).
> >>
> >> Yes; Int->long won't change anything on 32-bit machines and will break
> >> silently on 64-bit ones. The trick is finding appropriate places to put
> >> such definitions so that all the things that need them can include them
> >> without circular dependencies.
> >>
>
> Andrew> Isn't there some way to get the linker to detect the differing
> Andrew> sizes?
> `--warn-common'
> Warn when a common symbol is combined with another common symbol
> or with a symbol definition. Unix linkers allow this somewhat
> sloppy practice, but linkers on some other operating systems do
> not. This option allows you to find potential problems from
> combining global symbols. Unfortunately, some C libraries use
> this practice, so you may get some warnings about symbols in the
> libraries as well as in your programs.
>
Alas, it doesn't quite work as we'd like:
akpm-1:/home/akpm> cat a.c
int a;
main()
{}
akpm-1:/home/akpm> cat b.c
extern char a;
int b()
{return a;}
akpm-1:/home/akpm> gcc -fno-common -Wl,--warn-common a.c b.c
akpm-1:/home/akpm>
No warnings emitted. If b.c doesn't use `extern' it will fail
to link because of -fno-common.
What we'd *like* to happen is for the linker to determine that
the `extern char' and the `int' declarations are a mismatch.
Maybe the object file doesn't have the size info for `extern'
variables. The compiler emits it though.
We can actually get what we want by disabling `-fno-common' and enabling
`--warn-common', but that's rather awkward.
Perhaps HJ can suggest a solution?
-
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/