It's actually ld(1) that fails to note the definition in the shared library that should override the common decl (I think `tentative definition' is term used in ANSI C). We should probably only bind such a common to true shared library data, i.e. not to functions or weak definitions.