When two objects in the same compilation range have same named messages, their selectors get translated into two functions with the same name.
object First implements Object {
(void) self |> "message" |> {}
}
object Second implements Object {
(void) self |> "meesage" |> {}
}
./zircon First.zc Second.zc
(selectors produced):
void *zircon_message(void *self) {}
void *zircon_message(void *self) {}
hence the name collision.