Messages in this thread | | | Date | Wed, 02 Jan 2002 23:19:29 -0800 | From | Andrew Morton <> | Subject | Re: Extern variables in *.c files |
| |
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/
| |