Yep! I finally realized this. I was also having some trouble with position-independence -- using -fPIC doesn't work, because it causes inter-module function dispatch to go through the PLT. But the PLT is useless because I'm the dynamic linker and I have nobody to set it up for me
So I ended up using -fpie instead, linked with -shared, and now all is well.
I still think the call to exec() should fail if the program interpretter would be mapped over the top of the ELF image. That's just dumb.