> But AFAIK there is no way to then tell the linker to rename symbols to match (e.g. -l foo/module.o as foo -l bar/module.o as bar).

Renaming symbols is done with objcopy. From objcopy(1):

    --redefine-sym old=new
           Change the name of a symbol old, to new.  This can be useful when
           one is trying link two things together for which you have no
           source, and there are name collisions.