Limit visible symbols in the shared library.

R=rsc
CC=re2-dev
http://codereview.appspot.com/674041
diff --git a/Makefile b/Makefile
index e3ccb40..8997293 100644
--- a/Makefile
+++ b/Makefile
@@ -23,9 +23,9 @@
 # REBUILD_TABLES=1
 
 ifeq ($(shell uname),Darwin)
-MAKE_SHARED_LIBRARY=g++ -dynamiclib $(LDFLAGS)
+MAKE_SHARED_LIBRARY=g++ -dynamiclib $(LDFLAGS) -exported_symbols_list libre2.symbols.darwin
 else
-MAKE_SHARED_LIBRARY=g++ -shared -Wl,-soname,libre2.so.0 $(LDFLAGS)
+MAKE_SHARED_LIBRARY=g++ -shared -Wl,-soname,libre2.so.0,--version-script=libre2.symbols $(LDFLAGS)
 endif
 
 HFILES=\
@@ -143,15 +143,15 @@
 obj/so/libre2.so: $(SOFILES)
 	@mkdir -p obj
 	$(MAKE_SHARED_LIBRARY) -o [email protected] $(SOFILES)
-	ln -s libre2.so.0 $@
+	ln -sf libre2.so.0 $@
 
 obj/test/%: obj/libre2.a obj/re2/testing/%.o $(TESTOFILES) obj/util/test.o
 	@mkdir -p obj/test
 	$(CC) -o $@ obj/re2/testing/$*.o $(TESTOFILES) obj/util/test.o obj/libre2.a $(LDFLAGS) $(LDPCRE)
 
-obj/so/test/%: obj/so/libre2.so obj/so/re2/testing/%.o $(STESTOFILES) obj/so/util/test.o
+obj/so/test/%: obj/so/libre2.so obj/libre2.a obj/so/re2/testing/%.o $(STESTOFILES) obj/so/util/test.o
 	@mkdir -p obj/so/test
-	$(CC) -o $@ obj/so/re2/testing/$*.o $(STESTOFILES) obj/so/util/test.o -Lobj/so -lre2 $(LDFLAGS) $(LDPCRE)
+	$(CC) -o $@ obj/so/re2/testing/$*.o $(STESTOFILES) obj/so/util/test.o -Lobj/so -lre2 obj/libre2.a $(LDFLAGS) $(LDPCRE)
 
 obj/test/regexp_benchmark: obj/libre2.a obj/re2/testing/regexp_benchmark.o $(TESTOFILES) obj/util/benchmark.o
 	@mkdir -p obj/test
@@ -191,8 +191,8 @@
 	install -m 444 re2/variadic_function.h /usr/local/include/re2/variadic_function.h
 	install -m 444 obj/libre2.a /usr/local/lib/libre2.a
 	install -m 444 obj/so/libre2.so /usr/local/lib/libre2.so.0.0.0
-	ln -s libre2.so.0.0.0 /usr/local/lib/libre2.so.0
-	ln -s libre2.so.0.0.0 /usr/local/lib/libre2.so
+	ln -sf libre2.so.0.0.0 /usr/local/lib/libre2.so.0
+	ln -sf libre2.so.0.0.0 /usr/local/lib/libre2.so
 
 testinstall:
 	@mkdir -p obj
diff --git a/libre2.symbols b/libre2.symbols
new file mode 100644
index 0000000..86abd54
--- /dev/null
+++ b/libre2.symbols
@@ -0,0 +1,15 @@
+{
+	global:
+		extern "C++" {
+			re2::Mutex::*;
+			re2::Prog::*;
+			re2::RE2::*;
+			re2::Regexp::*;
+			re2::StringPiece::*;
+			"operator==(re2::StringPiece const&, re2::StringPiece const&)";
+			"operator<<(std::ostream&, re2::StringPiece const&)";
+			re2::VariadicFunction2::*;
+		};
+	local:
+		*;
+};
diff --git a/libre2.symbols.darwin b/libre2.symbols.darwin
new file mode 100644
index 0000000..fdd696c
--- /dev/null
+++ b/libre2.symbols.darwin
@@ -0,0 +1,11 @@
+re2::Mutex::*
+re2::Prog::*
+re2::RE2::*
+re2::Regexp::*
+re2::StringPiece::*
+re2::VariadicFunction2::*
+# Linker doesn't like these unmangled:
+# operator==(re2::StringPiece const&, re2::StringPiece const&)
+__ZeqRKN3re211StringPieceES2_
+# operator<<(std::ostream&, re2::StringPiece const&)
+__ZlsRSoRKN3re211StringPieceE