Hmm, actually the symbol is not changed, since it is externally visible symbol. I guess the problem would be that the symbol is used by 2 units, so both of them gets the declaration, but both of them gets the declaration with initializer (not extern). To avoid duplicate definitions, varpool.c is testing in_other_partition and prevents calling assemble_variable on them. This works just fine on ELF since extern vars don't need to be announced. Here we apparently need to get it assembled, but it is not getting via assemble_external.
Rebuilding the decl to DECL_EXTERN is probably possible, but somewhat hackish. Honza