summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Lillqvist <tml@collabora.com>2018-11-05 21:49:59 +0200
committerTor Lillqvist <tml@collabora.com>2018-11-05 22:01:31 +0200
commit9ddb1a12332cd1ac528b1e25d2414dbfe2088811 (patch)
treebffbc91b7cdd4388dc47541873988d3e76f166b6
parent0cb0c7f02b745bc040c19aa26c6139dfc1833210 (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.hxx3
-rw-r--r--vcl/source/window/builder.cxx28
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)
{