diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e957d02..738ae88 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2010-09-24  Joseph Myers  <joseph@codesourcery.com>
+
+	* common.opt (undef): New.
+
 2010-09-24  Jakub Jelinek  <jakub@redhat.com>
 
 	PR middle-end/45234
diff --git a/gcc/common.opt b/gcc/common.opt
index 119a64a..6b89c32 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -1924,6 +1924,10 @@ Driver JoinedOrMissing
 u
 Driver Joined Separate
 
+undef
+Driver
+; C option, but driver must not handle as "-u ndef".
+
 v
 Driver
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 659dab2..8c526d5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2010-09-24  Joseph Myers  <joseph@codesourcery.com>
+
+	* gcc.dg/cpp/undef-opt-1.c: New test.
+
 2010-09-24  Jason Merrill  <jason@redhat.com>
 
 	* g++.dg/other/error10.C: Adjust expected output.
diff --git a/gcc/testsuite/gcc.dg/cpp/undef-opt-1.c b/gcc/testsuite/gcc.dg/cpp/undef-opt-1.c
new file mode 100644
index 0000000..99c5246
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp/undef-opt-1.c
@@ -0,0 +1,8 @@
+/* Test -undef.  A bug in its handling broke glibc builds because
+   "linux" was wrongly defined.  */
+/* { dg-do preprocess } */
+/* { dg-options "-undef" } */
+
+#ifdef linux
+#error -undef broken
+#endif