I want to share my personal story, since I felt the same way you did when I was in college.
Coming out of school 2 years ago, I thought I was screwed. I had a shitty GPA, I had no work experience (not even internships), and I never took on a personal programming project. While my friends were getting offers months before graduation, I was still applying to companies (and not hearing back from any of them). Finally, a small .NET web shop gave me a call, and I royally screwed up the technical questions. The interviewer, with a disappointed sigh, asked me if I had any questions for him before we end the call. This was my opening, my chance to show him that indeed I did care about his company and, ultimately, programming. Prior to the call, I had done a lot of research on the company and who their big clients are, so I told him how cool that was and then asked what was the coolest project they've worked on. Impressed, the interviewer immediately changed his tone, and it was as if the interview restarted over. I pressed on, showing him my enthusiasm not only for the company, but for programming and how I wanted to become a better engineer tomorrow than the day before. The director, listening in on the call, pretty much gave me an offer. The offer was severely under market rate, and I was on a very short leash (3 month trial), but I was so happy, I cried. I knew that the next step was to impress the shit out of them.
So starting day 1, I'd gobble up everything about the tech stack and the domain. I'd subscribe to every .NET blog I could find. I bought and read books about design pattern and enterprise architecture. I listened to programming podcasts as I drove back and forth from work, and sometimes I'd listen to it as I tried to fall asleep. I'd constantly ask questions to my senior engineers about the .NET nuances, IoC containers, and good engineering practices. I questioned why we didn't do TDD, why we didn't switch from the Web Forms to MVC framework, why we're still using LinqToSQL instead of Entity Framework.
In three months, I got a raise, and within 6 months after that, I got another raise. My director called me the "rising star" in our company. I worked my ass off not because I wanted to prove to the world that I was good, but I wanted to prove to myself that I'm not a chump programming monkey.
A year after my first job, I got an offer to work at a friend's startup in SF, despite the fact it was on a Rails stack with WAY different architecture/requirement. Again, paid under market rate because of my lack of experience. Applied the same work ethic and dedication to the job. Learned how to scale, how to design web apps top to bottom, how to architect our systems topology, and how to get shit done.
On my personal time, I decided to build a website that would help the alumni members of my college fraternity keep in touch with each other for networking and inspirational purposes. Leveraging my knowledge from my job, built the entire damn thing, from the DB schemas, to the domain logic, to even the HTML/CSS. Initially it was built on ASP.NET MVC, then rebuilt the whole thing in Rails to improve our development speed. Now, I'm asking around other student orgs to see if they'd be interested in using our website.
Now, I guess I am that rockstar programmer, even though I don't really think that. Recruiters are constantly messaging me for job openings. I just got two offers from both a big, respectable company, and from another startup. It's surreal. I never thought I'd see this day, but I still have that chip on my shoulder to constantly improve. The point I'm trying to get is that it's not about where you start but it's the journey you're willing to take to get where you want to be. Earlier, tytso commented that you have to start at the bottom with an entry-level job, and it probably won't be the glamorous FB/Google/Apple/blahblahblah job that you so want. But that doesn't matter as long as you work in a place that you can get really fired up about. In my experience, a lot of managers would hire passionate, inexperienced guys over talented yet indifferent engineers because company culture is a big deal.
So what is it that you can do to prepare yourself right now? First, network the shit out of your school. Make as many friends as you can, regardless of their majors or background. I guarantee you you'll find other people who are smarter and more motivated than you are. Surrounding yourself with ambitious or A+ kids will a) in the short term inspire you to work harder and b) in the long term, they'll become valuable assets for your career. Then start a programming project. Right. Now. In my last year of college, I built a beer pong tournament website on LAMP. It wasn't the prettiest thing, visually/architecturally, but still proud of that thing. (For fun, I'm trying to rebuild it again with backbone, Rails, and MongoDB.)
Never forget this moment of frustration. In fact, embrace it. Use it as your motivating fuel. And then go do what makes you happy.