From 37ea891aad9f8c355fa2c8c4aadb1d59285b7122 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Wed, 8 Sep 2021 17:32:47 -0400 Subject: [PATCH] Enable -fvisibility=hidden on static libraries by default. Only on non-GCC2 for now, as GCC2 does not have -fvisibility. An opt-out is left as a possibility, and is unfortunately necessary for libshared and libicon, as these two are used even in WebKit instead of linking to the .a. However, libcolumnlistview, libagg, and a whole bunch of others are now no longer exported, so this is already a major improvement on what symbols we were leaking. This may provide performance differences for consumers of these APIs, as GCC and the linker are now free to merge and directly use functions that previously could have been semantically interposed. AGG usage in app_server, especially, may benefit. We can also now remove the addition from libnetservices, so do that. --- build/jam/MainBuildRules | 6 ++++++ src/build/libroot/Jamfile | 1 + src/kits/network/libnetservices/JamCommon | 7 ------- src/kits/shared/Jamfile | 4 ++++ src/libs/icon/Jamfile | 6 ++++++ src/servers/app/drawing/Jamfile | 2 ++ src/servers/app/stackandtile/Jamfile | 2 ++ 7 files changed, 21 insertions(+), 7 deletions(-) diff --git a/build/jam/MainBuildRules b/build/jam/MainBuildRules index 0f8c712d6f..4ce5d31ca2 100644 --- a/build/jam/MainBuildRules +++ b/build/jam/MainBuildRules @@ -154,6 +154,12 @@ rule StaticLibrary InheritPlatform $(objects) : $(lib) ; + if $(TARGET_CC_IS_LEGACY_GCC_$(TARGET_PACKAGING_ARCH)) = 0 + && [ on $(lib) return $(NO_HIDDEN_VISIBILITY) ] != 1 { + CCFLAGS on $(objects) += -fvisibility=hidden ; + C++FLAGS on $(objects) += -fvisibility=hidden ; + } + StaticLibraryFromObjects $(lib) : $(objects) $(otherObjects) ; Objects $(2) ; } diff --git a/src/build/libroot/Jamfile b/src/build/libroot/Jamfile index b665621d61..11f335159a 100644 --- a/src/build/libroot/Jamfile +++ b/src/build/libroot/Jamfile @@ -92,6 +92,7 @@ BuildPlatformStaticLibrary libroot_build.a : USES_BE_API on [ FGristFiles function_remapper$(SUFOBJ) ] = true ; +NO_HIDDEN_VISIBILITY on libroot_build_function_remapper.a = 1 ; BuildPlatformStaticLibraryPIC libroot_build_function_remapper.a : function_remapper.cpp ; diff --git a/src/kits/network/libnetservices/JamCommon b/src/kits/network/libnetservices/JamCommon index f58bbf7a0f..b3a419ef16 100644 --- a/src/kits/network/libnetservices/JamCommon +++ b/src/kits/network/libnetservices/JamCommon @@ -54,13 +54,6 @@ for architectureObject in [ MultiArchSubDirSetup ] { : <$(architecture)>libshared.a ; } else { - if $(HAIKU_CC_IS_LEGACY_GCC_$(architecture)) = 0 { - # In order to not have conflicts between libraries built against - # different versions of libnetservices.a, prevent symbols from - # being re-exported from the static library. - SubDirC++Flags -fvisibility=hidden ; - } - StaticLibrary [ MultiArchDefaultGristFiles libnetservices.a ] : $(sources) Geolocation.cpp diff --git a/src/kits/shared/Jamfile b/src/kits/shared/Jamfile index f3babfc1d4..5e98940629 100644 --- a/src/kits/shared/Jamfile +++ b/src/kits/shared/Jamfile @@ -24,6 +24,10 @@ for architectureObject in [ MultiArchSubDirSetup ] { # for BKeymap UsePrivateHeaders interface ; + # FIXME: These symbols should be hidden, but too many applications depend + # on them at present for that. + NO_HIDDEN_VISIBILITY on <$(architecture)>libshared.a = 1 ; + StaticLibrary <$(architecture)>libshared.a : AboutMenuItem.cpp ArgumentVector.cpp diff --git a/src/libs/icon/Jamfile b/src/libs/icon/Jamfile index c8d580fe01..a27db9ebd6 100644 --- a/src/libs/icon/Jamfile +++ b/src/libs/icon/Jamfile @@ -20,12 +20,18 @@ UsePrivateHeaders shared ; local architectureObject ; for architectureObject in [ MultiArchSubDirSetup ] { on $(architectureObject) { + local architecture = $(TARGET_PACKAGING_ARCH) ; + local sourceDir ; for sourceDir in $(sourceDirs) { SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src libs icon $(sourceDir) ] ; } + # Too many applications depend on libicon APIs being visible in libbe; + # so for now, prevent -fvisiblity=hidden from being set. + NO_HIDDEN_VISIBILITY on [ MultiArchDefaultGristFiles libicon.a ] = 1 ; + StaticLibrary [ MultiArchDefaultGristFiles libicon.a ] : # flat_icon FlatIconFormat.cpp diff --git a/src/servers/app/drawing/Jamfile b/src/servers/app/drawing/Jamfile index 2253c84fb3..186835699f 100644 --- a/src/servers/app/drawing/Jamfile +++ b/src/servers/app/drawing/Jamfile @@ -15,6 +15,8 @@ UseBuildFeatureHeaders freetype ; Includes [ FGristFiles AlphaMask.cpp AlphaMaskCache.cpp DrawingEngine.cpp ] : [ BuildFeatureAttribute freetype : headers ] ; +NO_HIDDEN_VISIBILITY on libasdrawing.a = 1 ; + StaticLibrary libasdrawing.a : AlphaMask.cpp AlphaMaskCache.cpp diff --git a/src/servers/app/stackandtile/Jamfile b/src/servers/app/stackandtile/Jamfile index 1af46144a9..060a86d399 100644 --- a/src/servers/app/stackandtile/Jamfile +++ b/src/servers/app/stackandtile/Jamfile @@ -23,6 +23,8 @@ local sources = Includes [ FGristFiles $(sources) ] : [ BuildFeatureAttribute freetype : headers ] ; +NO_HIDDEN_VISIBILITY on libstackandtile.a = 1 ; + StaticLibrary libstackandtile.a : $(sources) ;