C says it is undefined behavior.
(C99, 6.9p5) "If an identifier declared with external linkage is used in an expression (other than as part of the operand of a sizeof operator whose result is an integer constant), somewhere in the entire program there shall be exactly one external definition for the identifier; otherwise, there shall be no more than one"
Being undefined behavior means a linker can abort the linking process in presence of multiple external object definitions.
Now linkers are nice (or evil, you can choose) and usually have default extensions to handle multiple external object definitions and not fail in some cases.
If you are using gcc and ld from binutils, you'll get an error if your two object are explicitly initialized. For example, you have int x = 0; in the first translation unit and double x = 0.0;.
Otherwise, if one of the external object is not explicitly initialized (the situation in your example) gcc will silently combine the two objects into one symbol. You can still ask the linker to report a warning by passing it the option --warn-common.
For example when linking the modules:
gcc -Wl,--warn-common module1.o module2.o
To get the linking process aborted, you can request the linker to treat all warnings as errors using --fatal-warnings option (-Wl,--fatal-warnings,--warn-common).
Another way to get the linking process aborted is to use -fno-common compiler option, as explained by @teppic in his answer. -fno-common forbids the external objects to get a Common symbol type at compilation. If you do it for both module and then link, you'll also get the multiple definition linker error.
gcc -Wall -fno-common -c module1.c module2.c
gcc module1.o module2.o