Update: Nat Torkington wrote a test case for the features we're using (compiling a dynamic library, and compiling an executable that uses that library), which I've attached. The test case works, and is fundamentally the same as what Parrot is doing. I've been stepping through the differences between the test case and Parrot's compilation process, seeing if I can knock out the problem.
Also helpful are the -whatsloaded and -whyload flags in gcc on darwin, which show that the .o file that defines the missing symbol (src/embed.o) is actually loaded in libparrot.dylib (to resolve symbol _Parrot_loadbc), but somehow the symbol _Parrot_set_executable_name is not included.
darwin-gcc-libtest.tgz
Description: Unix tar archive