For what it's worth, I ended up finding out where the problem is.
The cdc-acm driver in Linux is broken. The bug affects users of Linux/PowerPC but not users of Linux/x86 or Linux/amd64 (most Linux users nowadays I guess).
I patched the driver, and it now works fine for me. I will try to have my patch integrated by the maintainer of that driver.
I am encountering this same problem. In my case I actually custom manufactured a PCB based on the arduino but with an analog switch to switch between USB serial and Bluetooth serial. I went ahead and bootloaded the ATMEGA328 and loaded the firmware using the code on Github. It looked like everything uploaded successfully; I have tested the processor in a real Arduino and it works.
However when I try to communicate using the USB serial interface I start running into problems.
When I try to upload my sketch I get this error:
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x74
Performing the loopback test, I get that in the serial monitor it reads out a different character than the one I sent it. Anyone have any ideas/need more information?