@@ -197,6 +197,9 @@ set(BARRETENBERG_TARGET_OBJECTS
197197 $<TARGET_OBJECTS :translator_vm_objects >
198198 $<TARGET_OBJECTS :ultra_honk_objects >)
199199
200+ # Save the core object list before adding lmdb/world_state (not needed by FFI consumers).
201+ set (BB_EXTERNAL_TARGET_OBJECTS ${BARRETENBERG_TARGET_OBJECTS} )
202+
200203if (NOT WASM AND NOT FUZZING AND NOT BB_LITE)
201204 # enable merkle trees and lmdb (not for mobile builds)
202205 list (APPEND BARRETENBERG_TARGET_OBJECTS $<TARGET_OBJECTS :crypto_merkle_tree_objects >)
@@ -211,17 +214,35 @@ add_library(
211214 ${BARRETENBERG_TARGET_OBJECTS}
212215)
213216
214- # bb-external: A complete static library for external consumers (e.g. barretenberg-rs).
215- # Includes everything from libbarretenberg.a plus env and vm2_stub.
216- # This provides a single library file that external bindings can link against.
217+ # bb-external: static library for external consumers (e.g. barretenberg-rs).
218+ # Uses the core object list without lmdb/world_state — FFI consumers only need bbapi().
219+ # Built with -fvisibility=hidden; only WASM_EXPORT symbols remain visible.
220+ # Post-build step merges objects and strips non-exported symbols.
217221if (NOT WASM)
218222 add_library (
219223 bb-external
220224 STATIC
221- ${BARRETENBERG_TARGET_OBJECTS }
225+ ${BB_EXTERNAL_TARGET_OBJECTS }
222226 $<TARGET_OBJECTS :env_objects >
223227 $<TARGET_OBJECTS :vm2_stub >
224228 )
229+
230+ # Post-build: merge all objects and strip non-WASM_EXPORT symbols.
231+ # Only symbols marked WASM_EXPORT (visibility("default")) survive.
232+ find_program (LLD_LINKER NAMES ld.lld-20 ld.lld REQUIRED )
233+ find_program (LLVM_OBJCOPY NAMES llvm-objcopy-20 llvm-objcopy REQUIRED )
234+ find_program (LLVM_STRIP NAMES llvm-strip-20 llvm-strip REQUIRED )
235+ find_program (LLVM_AR_TOOL NAMES llvm-ar-20 llvm-ar REQUIRED )
236+ add_custom_command (TARGET bb-external POST_BUILD
237+ COMMAND ${LLD_LINKER} -r --whole-archive $<TARGET_FILE :bb -external > $<TARGET_FILE :libdeflate ::libdeflate_static > -o $<TARGET_FILE :bb -external >.merged.o
238+ COMMAND ${LLVM_OBJCOPY} --localize-hidden $<TARGET_FILE :bb -external >.merged.o
239+ COMMAND ${LLVM_STRIP} --strip-unneeded $<TARGET_FILE :bb -external >.merged.o
240+ COMMAND ${CMAKE_COMMAND} -E rm -f $<TARGET_FILE :bb -external >
241+ COMMAND ${LLVM_AR_TOOL} rcs $<TARGET_FILE :bb -external > $<TARGET_FILE :bb -external >.merged.o
242+ COMMAND ${CMAKE_COMMAND} -E rm -f $<TARGET_FILE :bb -external >.merged.o
243+ COMMENT "Stripping internal symbols from bb-external static library"
244+ VERBATIM
245+ )
225246endif ()
226247
227248if (WASM)
0 commit comments