When applying the assert patch from PR25398 comment 1 to master, we hit the assert like this: ... $ dwz cc1 -o 1 -lnone --odr --odr-mode=basic dwz: dwz.c:10943: write_die: Assertion `IMPLIES (cu->cu_kind == CU_PU, die_cu (refd)->cu_kind == CU_PU)' failed. Aborted (core dumped) ... The process of splitting the duplicate chain for odr DIEs can result in some of the DIEs not being part of any duplicate chain afterwards, and consequently not being part of a partial unit, while in fact that may be required. Normally, in partition_dups phase 1 we decide which DIEs we want to move into partial units because it's profitable, and in partition_dups phase 2 we find which DIEs we have to move into partial units because they are referenced by other DIEs already in partial units. So, if a DIE marked as referenced in phase 2 is not part of any duplicate chain, it won't be moved to a partial unit, causing the reference from PU to CU.
Fixed here: https://sourceware.org/git/?p=dwz.git;a=commit;h=62e49493dc36a837fdbe195646814b6a8b75b98e