Linearize cycle dependency between cxx crate and cxx.cc
diff --git a/BUCK b/BUCK
index 0dfa11b..5f2a65f 100644
--- a/BUCK
+++ b/BUCK
@@ -2,10 +2,10 @@
     name = "cxx",
     srcs = glob(["src/**"], exclude = ["src/symbols/**"]),
     visibility = ["PUBLIC"],
-    rustc_flags = ["--cfg", "no_export_symbols"],
     deps = [
         ":core",
         ":macro",
+        ":symbols",
     ],
 )
 
@@ -37,8 +37,7 @@
 
 rust_library(
     name = "symbols",
-    srcs = glob(["src/macros/**", "src/symbols/**"]),
-    crate_root = "src/symbols/symbols.rs",
+    srcs = glob(["src/symbols/**"]),
 )
 
 rust_library(
diff --git a/BUILD b/BUILD
index 27c6931..197cef2 100644
--- a/BUILD
+++ b/BUILD
@@ -2,12 +2,18 @@
 
 rust_library(
     name = "cxx",
-    srcs = glob(["src/**/*.rs"]),
+    srcs = glob(
+        ["src/**/*.rs"],
+        exclude = ["src/symbols/**/*.rs"],
+    ),
     proc_macro_deps = [
         ":cxxbridge-macro",
     ],
     visibility = ["//visibility:public"],
-    deps = [":core-lib"],
+    deps = [
+        ":core-lib",
+        ":symbols",
+    ],
 )
 
 rust_binary(
@@ -39,6 +45,11 @@
 )
 
 rust_library(
+    name = "symbols",
+    srcs = glob(["src/symbols/**/*.rs"]),
+)
+
+rust_library(
     name = "cxxbridge-macro",
     srcs = glob(["macro/src/**"]),
     crate_type = "proc-macro",
diff --git a/Cargo.toml b/Cargo.toml
index 9f23252..6443475 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -20,6 +20,7 @@
 "c++20" = ["cxxbridge-flags/c++20"]
 
 [dependencies]
+cxx-symbols = { version = "=0.4.2", path = "src/symbols" }
 cxxbridge-macro = { version = "=0.4.2", path = "macro" }
 link-cplusplus = "1.0"
 
@@ -34,7 +35,7 @@
 trybuild = { version = "1.0.33", features = ["diff"] }
 
 [workspace]
-members = ["demo", "flags", "gen/build", "gen/cmd", "gen/lib", "macro", "tests/ffi"]
+members = ["demo", "flags", "gen/build", "gen/cmd", "gen/lib", "macro", "src/symbols", "tests/ffi"]
 
 [package.metadata.docs.rs]
 targets = ["x86_64-unknown-linux-gnu"]
diff --git a/src/lib.rs b/src/lib.rs
index 8d874bd..0fb7ad9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -369,9 +369,8 @@
 
 #[cfg(built_with_cargo)]
 extern crate link_cplusplus;
-
 #[macro_use]
-mod macros;
+extern crate symbols;
 
 mod cxx_string;
 mod cxx_vector;
@@ -387,9 +386,6 @@
 mod unique_ptr;
 mod unwind;
 
-#[cfg(not(no_export_symbols))]
-mod symbols;
-
 pub use crate::cxx_string::CxxString;
 pub use crate::cxx_vector::CxxVector;
 pub use crate::exception::Exception;
diff --git a/src/symbols/Cargo.toml b/src/symbols/Cargo.toml
new file mode 100644
index 0000000..80728d3
--- /dev/null
+++ b/src/symbols/Cargo.toml
@@ -0,0 +1,13 @@
+[package]
+name = "cxx-symbols"
+version = "0.4.2"
+authors = ["David Tolnay <dtolnay@gmail.com>"]
+edition = "2018"
+license = "MIT OR Apache-2.0"
+description = "Implementation detail of the `cxx` crate"
+repository = "https://github.com/dtolnay/cxx"
+documentation = "https://docs.rs/cxx"
+
+[lib]
+name = "symbols"
+path = "lib.rs"
diff --git a/src/symbols/lib.rs b/src/symbols/lib.rs
new file mode 100644
index 0000000..da0f223
--- /dev/null
+++ b/src/symbols/lib.rs
@@ -0,0 +1,9 @@
+//! *Implementation detail of the `cxx` crate.*
+
+#[macro_use]
+mod macros;
+
+mod exception;
+mod rust_str;
+mod rust_string;
+mod rust_vec;
diff --git a/src/macros/assert.rs b/src/symbols/macros/assert.rs
similarity index 80%
rename from src/macros/assert.rs
rename to src/symbols/macros/assert.rs
index 738e5bb..5d5ea9e 100644
--- a/src/macros/assert.rs
+++ b/src/symbols/macros/assert.rs
@@ -1,3 +1,5 @@
+#[macro_export]
+#[doc(hidden)]
 macro_rules! const_assert_eq {
     ($left:expr, $right:expr $(,)?) => {
         const _: [(); $left] = [(); $right];
diff --git a/src/macros/concat.rs b/src/symbols/macros/concat.rs
similarity index 80%
rename from src/macros/concat.rs
rename to src/symbols/macros/concat.rs
index e67e50d..5ee77c5 100644
--- a/src/macros/concat.rs
+++ b/src/symbols/macros/concat.rs
@@ -1,3 +1,5 @@
+#[macro_export]
+#[doc(hidden)]
 macro_rules! attr {
     (#[$name:ident = $value:expr] $($rest:tt)*) => {
         #[$name = $value]
diff --git a/src/macros/mod.rs b/src/symbols/macros/mod.rs
similarity index 100%
rename from src/macros/mod.rs
rename to src/symbols/macros/mod.rs
diff --git a/src/symbols/mod.rs b/src/symbols/mod.rs
deleted file mode 100644
index a9d158d..0000000
--- a/src/symbols/mod.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-mod exception;
-mod rust_str;
-mod rust_string;
-mod rust_vec;
diff --git a/src/symbols/rust_vec.rs b/src/symbols/rust_vec.rs
index 163f7a9..7789454 100644
--- a/src/symbols/rust_vec.rs
+++ b/src/symbols/rust_vec.rs
@@ -1,4 +1,4 @@
-use super::rust_string::RustString;
+use crate::rust_string::RustString;
 use std::mem;
 use std::ptr;
 
diff --git a/src/symbols/symbols.rs b/src/symbols/symbols.rs
deleted file mode 100644
index 2c052ec..0000000
--- a/src/symbols/symbols.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-#[path = "../macros/mod.rs"]
-#[macro_use]
-mod macros;
-
-include!("mod.rs");
diff --git a/third-party/Cargo.lock b/third-party/Cargo.lock
index 532ceff..5c1350a 100644
--- a/third-party/Cargo.lock
+++ b/third-party/Cargo.lock
@@ -63,6 +63,7 @@
 dependencies = [
  "cc",
  "cxx-build",
+ "cxx-symbols",
  "cxx-test-suite",
  "cxxbridge-flags",
  "cxxbridge-macro",
@@ -95,6 +96,10 @@
 ]
 
 [[package]]
+name = "cxx-symbols"
+version = "0.4.2"
+
+[[package]]
 name = "cxx-test-suite"
 version = "0.0.0"
 dependencies = [