diff --git a/libs/rs/java/Rollo/res/raw/rollo.c b/libs/rs/java/Rollo/res/raw/rollo.c
index 54cb21f..91413ca 100644
--- a/libs/rs/java/Rollo/res/raw/rollo.c
+++ b/libs/rs/java/Rollo/res/raw/rollo.c
@@ -25,7 +25,7 @@
 void pfClearColor(float, float, float, float);
 float loadF(int, int);
 void storeF(int, int, float);
-void drawQuadF(float x1, float y1, float z1,
+void drawQuad(float x1, float y1, float z1,
                          float x2, float y2, float z2,
                           float x3, float y3, float z3,
                           float x4, float y4, float z4);
@@ -80,10 +80,10 @@
 
         float yb = (0.5f - y) * 5.f + 0.2f;
 
-        drawQuadF(xlt, 5.f, 1,
-                  xrt, 5.f, 1,
-                  x + s, yb, 1,
-                  x - s, yb, 1);
+        drawQuad(xlt, 5.f, 1,
+                 xrt, 5.f, 1,
+                 x + s, yb, 1,
+                 x - s, yb, 1);
 
         contextBindProgramFragmentStore(NAMED_PFS);
     }
@@ -106,11 +106,12 @@
         float tz1 = tmpCos * diam + (tmpSin * scale);
         float tz2 = tz1 - (tmpSin * scale * 2.f);
 
+        int y;
         for (y = 0; (y < rowCount) && iconCount; y++) {
             float ty1 = ((y * 3.0f) - 4.5f) * scale;
             float ty2 = ty1 + scale * 2.f;
             pfBindTexture(NAMED_PF, 0, loadI32(1, y));
-            drawQuadF(tx1, ty1, tz1,
+            drawQuad(tx1, ty1, tz1,
                      tx2, ty1, tz2,
                      tx2, ty2, tz2,
                      tx1, ty2, tz1);
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index c19f0bb..21d792c 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -130,7 +130,7 @@
     return &static_cast<const uint8_t *>(sc->mSlots[bank]->getPtr())[offset];
 }
 
-extern "C" float loadF(uint32_t bank, uint32_t offset)
+static float SC_loadF(uint32_t bank, uint32_t offset)
 {
     GET_TLS();
     float f = static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset];
@@ -138,7 +138,7 @@
     return f;
 }
 
-extern "C" int32_t loadI32(uint32_t bank, uint32_t offset)
+static int32_t SC_loadI32(uint32_t bank, uint32_t offset)
 {
     GET_TLS();
     int32_t t = static_cast<const int32_t *>(sc->mSlots[bank]->getPtr())[offset];
@@ -146,7 +146,7 @@
     return t;
 }
 
-extern "C" uint32_t loadU32(uint32_t bank, uint32_t offset)
+static uint32_t SC_loadU32(uint32_t bank, uint32_t offset)
 {
     GET_TLS();
     return static_cast<const uint32_t *>(sc->mSlots[bank]->getPtr())[offset];
@@ -165,20 +165,20 @@
 }
 
 
-extern "C" void storeF(uint32_t bank, uint32_t offset, float v)
+static void SC_storeF(uint32_t bank, uint32_t offset, float v)
 {
     //LOGE("storeF %i %i %f", bank, offset, v);
     GET_TLS();
     static_cast<float *>(sc->mSlots[bank]->getPtr())[offset] = v;
 }
 
-extern "C" void storeI32(uint32_t bank, uint32_t offset, int32_t v)
+static void SC_storeI32(uint32_t bank, uint32_t offset, int32_t v)
 {
     GET_TLS();
     static_cast<int32_t *>(sc->mSlots[bank]->getPtr())[offset] = v;
 }
 
-extern "C" void storeU32(uint32_t bank, uint32_t offset, uint32_t v)
+static void SC_storeU32(uint32_t bank, uint32_t offset, uint32_t v)
 {
     GET_TLS();
     static_cast<uint32_t *>(sc->mSlots[bank]->getPtr())[offset] = v;
@@ -312,10 +312,10 @@
     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
 }
 
-extern "C" void drawQuadF(float x1, float y1, float z1,
-                          float x2, float y2, float z2,
-                          float x3, float y3, float z3,
-                          float x4, float y4, float z4)
+static void SC_drawQuad(float x1, float y1, float z1,
+                        float x2, float y2, float z2,
+                        float x3, float y3, float z3,
+                        float x4, float y4, float z4)
 {
     GET_TLS();
 
@@ -473,15 +473,15 @@
 
 static rsc_FunctionTable scriptCPtrTable = {
     loadVp,
-    loadF,
-    loadI32,
-    loadU32,
+    SC_loadF,
+    SC_loadI32,
+    SC_loadU32,
     loadEnvVec4,
     loadEnvMatrix,
 
-    storeF,
-    storeI32,
-    storeU32,
+    SC_storeF,
+    SC_storeI32,
+    SC_storeU32,
     storeEnvVec4,
     storeEnvMatrix,
 
@@ -575,6 +575,48 @@
 
 }
 
+ScriptCState::SymbolTable_t ScriptCState::gSyms[] = {
+    { "loadI32", (void *)&SC_loadI32, "int loadI32(int, int)" },
+    { "loadF", (void *)&SC_loadF, "float loadF(int, int)" },
+    { "storeI32", (void *)&SC_storeI32, "void storeI32(int, int, int)" },
+    { "storeF", (void *)&SC_storeF, "void storeF(int, int, float)" },
+    { "drawQuad", (void *)&SC_drawQuad, "drawQuad(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3, float x4, float y4, float z4)" },
+    { "sinf", (void *)&sinf, "float sinf(float)" },
+    { "cosf", (void *)&cosf, "float cosf(float)" },
+    { "contextBindProgramFragmentStore", (void *)&contextBindProgramFragmentStore, "" },
+    { "pfClearColor", (void *)&pfClearColor, "" },
+    { "pfBindTexture", (void *)&pfBindTexture, "" },
+
+
+    { NULL, NULL, NULL }
+};
+
+const ScriptCState::SymbolTable_t * ScriptCState::lookupSymbol(const char *sym)
+{
+    ScriptCState::SymbolTable_t *syms = gSyms;
+
+    while (syms->mPtr) {
+        if (!strcmp(syms->mName, sym)) {
+            return syms;
+        }
+        syms++;
+    }
+    return NULL;
+}
+
+static ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name) 
+{
+    const ScriptCState::SymbolTable_t *sym = ScriptCState::lookupSymbol(name);
+
+    if (sym) {
+        return sym->mPtr;
+    }
+
+    LOGE("ScriptC sym lookup failed for %s", name);
+
+    // Default to calling dlsym to allow any global symbol:
+    return NULL;
+}
 
 void ScriptCState::runCompiler(Context *rsc)
 {
@@ -586,6 +628,7 @@
     const char* scriptSource[] = {tmp.string(), mProgram.mScriptText};
     int scriptLength[] = {tmp.length(), mProgram.mScriptTextLength} ;
     accScriptSource(mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
+    accRegisterSymbolCallback(mAccScript, symbolLookup, NULL);
     accCompileScript(mAccScript);
     accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
     rsAssert(mProgram.mScript);
diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h
index c46901b1..9d9ec49 100644
--- a/libs/rs/rsScriptC.h
+++ b/libs/rs/rsScriptC.h
@@ -69,6 +69,14 @@
 
     void clear();
     void runCompiler(Context *rsc);
+
+    struct SymbolTable_t {
+        const char * mName;
+        void * mPtr;
+        const char * mDecl;
+    };
+    static SymbolTable_t gSyms[];
+    static const SymbolTable_t * lookupSymbol(const char *);
 };
 
 
