Search code examples
dllloadsymbianpanic

Symbian: kern-exec 3 panic on RLibrary::Load


I have troubles with dynamic loading of libraries - my code panics with Kern-Exec 3. The code is as follows:

TFileName dllName = _L("mydll.dll");
TFileName dllPath = _L("c:\\sys\\bin\\");
RLibrary dll;
TInt res = dll.Load(dllName, dllPath); // Kern-Exec 3!
TLibraryFunction f = dll.Lookup(1);
if (f)
    f();

I receive panic on TInt res = dll.Load(dllName, dllPath); What can I do to get rid of this panic? mydll.dll is really my dll, which has only 1 exported function (for test purposes). Maybe something wrong with the DLL? Here's what it is:

def file:

EXPORTS
_ZN4Init4InitEv @ 1 NONAME

pkg file:

#{"mydll DLL"},(0xED3F400D),1,0,0


;Localised Vendor name
%{"Vendor-EN"}

;Unique Vendor name
:"Vendor"

"$(EPOCROOT)Epoc32\release\$(PLATFORM)\$(TARGET)\mydll.dll"-"!:\sys\bin\mydll.dll"

mmp file:

TARGET        mydll.dll
TARGETTYPE    dll
UID          0x1000008d 0xED3F400D

USERINCLUDE  ..\inc
SYSTEMINCLUDE   \epoc32\include

SOURCEPATH    ..\src

SOURCE        mydllDllMain.cpp
LIBRARY      euser.lib

#ifdef ENABLE_ABIV2_MODE
DEBUGGABLE_UDEBONLY
#endif

EPOCALLOWDLLDATA

CAPABILITY CommDD LocalServices Location MultimediaDD NetworkControl NetworkServices PowerMgmt ProtServ ReadDeviceData ReadUserData SurroundingsDD SwEvent TrustedUI UserEnvironment WriteDeviceData WriteUserData

source code:

//  Exported Functions
namespace Init
    {
    EXPORT_C TInt Init()
        {
        // no implementation required
        return 0;
        }
    }

header file:

#ifndef __MYDLL_H__
#define __MYDLL_H__

//  Include Files

namespace Init
{
    IMPORT_C TInt Init();
}

#endif  // __MYDLL_H__

I have no ideas about this... Any help is greatly appreciated.

P.S. I'm trying to do RLibrary::Load because I have troubles with static linkage. When I do static linkage, my main program doesn't start at all. I decided to check what happens and discovered this issue with RLibrary::Load.


Solution

  • The case that you can't use static linkage should be a strong warning to you. It shows that there is something wrong with your DLL and using dynamic linking won't change anything.

    Usually in these cases the problem is in mismatched capabilities. DLL must have at least the same set of capabilities that your main program has. And all those capabilities should be covered by your developer cert.