diff options
author | Tor Lillqvist <tml@collabora.com> | 2018-11-05 21:49:59 +0200 |
---|---|---|
committer | Tor Lillqvist <tml@collabora.com> | 2018-11-05 22:01:31 +0200 |
commit | 9ddb1a12332cd1ac528b1e25d2414dbfe2088811 (patch) | |
tree | bffbc91b7cdd4388dc47541873988d3e76f166b6 | |
parent | 0cb0c7f02b745bc040c19aa26c6139dfc1833210 (diff) |
Check explicitly for function names and link directly to them on iOS
When building the iOS app with optimisation (using the Release
configurtaion), the linker will not include functions even if they
have been marked with __attribute__ ((visibility("default"))). To get
such a function included, you need an actual reference to it.
Sure, I could probably do some other trick instead. Or I could use a
table and loop here instead of a sequence of if statements. Later.
Change-Id: I86fa38838f242fd1ac251da6e3885f5b166963d3
-rw-r--r-- | include/vcl/builderfactory.hxx | 3 | ||||
-rw-r--r-- | vcl/source/window/builder.cxx | 28 |
2 files changed, 27 insertions, 4 deletions
diff --git a/include/vcl/builderfactory.hxx b/include/vcl/builderfactory.hxx index 4b8801341f49..0781726c0ffb 100644 --- a/include/vcl/builderfactory.hxx +++ b/include/vcl/builderfactory.hxx @@ -37,6 +37,9 @@ rRet = VclPtr<typeName>::Create(pParent,wb); \ } +#define VCL_BUILDER_FACTORY_EXTERN(typeName) \ + extern "C" void make##typeName(VclPtr<vcl::Window> & rRet, VclPtr<vcl::Window> & pParent, VclBuilder::stringmap & rMap) + #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index 6be921bff169..b4c38ca77d30 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -20,6 +20,7 @@ #include <sal/log.hxx> #include <unotools/resmgr.hxx> #include <vcl/builder.hxx> +#include <vcl/builderfactory.hxx> #include <vcl/button.hxx> #include <vcl/dialog.hxx> #include <vcl/edit.hxx> @@ -1488,6 +1489,15 @@ void VclBuilder::preload() #endif // DISABLE_DYNLOADING } +#if defined DISABLE_DYNLOADING && !HAVE_FEATURE_DESKTOP + +VCL_BUILDER_FACTORY_EXTERN(CustomPropertiesControl); +VCL_BUILDER_FACTORY_EXTERN(RefButton); +VCL_BUILDER_FACTORY_EXTERN(RefEdit); +VCL_BUILDER_FACTORY_EXTERN(ScRefButtonEx); + +#endif + VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString &name, const OString &id, stringmap &rMap) { @@ -2040,12 +2050,22 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & } else pFunction = reinterpret_cast<customMakeWidget>(aI->second->getFunctionSymbol(sFunction)); +#elif !HAVE_FEATURE_DESKTOP + if (false) + ; // Just so that all the other condition line pairs look the same + else if (sFunction == "makeCustomPropertiesControl") + pFunction = makeCustomPropertiesControl; + else if (sFunction == "makeRefButton") + pFunction = makeRefButton; + else if (sFunction == "makeRefEdit") + pFunction = makeRefEdit; + else if (sFunction == "makeScRefButtonEx") + pFunction = makeScRefButtonEx; + + SAL_WARN_IF(!pFunction, "vcl.layout", "Missing case for " << sFunction); + assert(pFunction); #else pFunction = reinterpret_cast<customMakeWidget>(osl_getFunctionSymbol((oslModule) RTLD_DEFAULT, sFunction.pData)); -#if !HAVE_FEATURE_DESKTOP - SAL_WARN_IF(!pFunction, "vcl.layout", "Lookup of " << sFunction << " failed"); - assert(pFunction); -#endif #endif if (pFunction) { |