In GNU ld, the definition precedence is: regular symbol assignment > relocatable object definition > PROVIDE symbol assignment.
GNU ld's internal linker scripts define the non-reserved (by C and C++)
edata/end/etext with PROVIDE so the relocatable object definition takes
precedence. This makes sense because int end; is valid.
We currently redefine such symbols if they are COMMON, but not if they are
regular definitions, so int end; with -fcommon is essentially a UB in ld.lld.
Fix this (also improve consistency and match GNU ld) by using the
isDefined code path for isCommon. In GNU ld, reserved identifiers like
__ehdr_start do not use PROVIDE, while we treat them all as PROVIDE, this
seems fine.