dlopen - calling functions other way round

Ask a Question related to UNIX Programming, Design and Development.

  1. #1

    Default dlopen - calling functions other way round

    I am using the dlopen,dlsym functions to load in an external module in my
    program which works fine. I can call functions inside the loaded module and
    all is well.
    The problem is, when i try and call a function inside the main program from
    the module,
    it won't load giving 'Undefined symbol "getnumber"' errors. I can think of
    no way round this.

    Below is the test program I am using.
    Passing a pointer for the getnumber() function is out of the question as the
    real application
    contains 30+ api functions which may all need to be accessible.

    load.c
    ----------------------------------------------------------------------------
    #include <stdio.h>
    #include <dlfcn.h>
    #include "load.h"

    typedef int (*pointer)();

    int main(void)
    {
    void *modhandle;
    pointer symhandle;

    modhandle = dlopen("./testmod.so", RTLD_LAZY);

    if( modhandle == NULL )
    {
    printf("Load failed \"%s\"\n", dlerror());
    exit(1);
    }

    symhandle = (pointer)dlsym(modhandle, "testfunc");

    if( symhandle == NULL )
    {
    printf("Sym failed \"%s\"\n", dlerror());
    exit(1);
    }

    (*symhandle)();

    dlclose(modhandle);
    }

    int getnumber()
    {
    return 10;
    }
    ----------------------------------------------------------------------------

    load.h
    ----------------------------------------------------------------------------
    int getnumber();
    ----------------------------------------------------------------------------

    testmod.c
    ----------------------------------------------------------------------------
    #include <stdio.h>
    #include "load.h"

    int testfunc()
    {
    int i;

    i = getnumber();

    printf("Hello %d\n", i);
    }
    ----------------------------------------------------------------------------

    --

    Regards,
    Matt Churchyard
    _______________________________
    Project Development Manager
    Userve Internet
    [email]matt@userve.net[/email]
    [url]http://www.userve.net/[/url]


    Matt Churchyard Guest

  2. Similar Questions and Discussions

    1. Calling other functions
      All, Using .NET 1.1, I have built a custom control, however I am having trouble compiling it. For the on click event of the button, I want it to...
    2. calling functions with include
      suppose i have... <?php include("common_functions.php"); fxn1(); fxn2(); ?> i want fxn1 and fxn2 to be on the common_functions.php page,...
    3. Calling functions between frames...
      JavaScript can not run on server side. You can include it in the output of your PHP script. "Albert Finchly" <Albert_Finchly@Yahoo.co.uk>...
    4. Calling functions?
      Hello, I wrote a jscript function within the HTML window of my webpage and would like to call it from inside the ASPX code-behind page. Any...
    5. calling functions
      how do i call a vbscript function (which is between <%%>) from a vbscript script function (which is between script tags-<script...
  3. #2

    Default Re: dlopen - calling functions other way round

    Matt Churchyard <matt@userve.net> wrote:
    > I am using the dlopen,dlsym functions to load in an external module in my
    > program which works fine. I can call functions inside the loaded module and
    > all is well.
    > The problem is, when i try and call a function inside the main program from
    > the module,
    > it won't load giving 'Undefined symbol "getnumber"' errors. I can think of
    > no way round this.
    You must tell the linker that your main program exports symbols. If you're
    e.g. the gcc and ld combination you need to do

    gcc -Wl,-E -o load load.c -ldl

    where the -Wl,-E tells gcc to invoke the linker with the -E option,
    which in turn will make ld add all symbols to the dynamic symbol
    table, so that they can be found by the dlopen'ed library. Of
    course, you may need some other flags when you're using a different
    compiler and linker.
    Regards, Jens
    --
    _ _____ _____
    | ||_ _||_ _| [email]Jens.Toerring@physik.fu-berlin.de[/email]
    _ | | | | | |
    | |_| | | | | | [url]http://www.physik.fu-berlin.de/~toerring[/url]
    \___/ens|_|homs|_|oerring
    Jens.Toerring@physik.fu-berlin.de Guest

  4. #3

    Default Re: dlopen - calling functions other way round

    [email]Jens.Toerring@physik.fu-berlin.de[/email] writes:
    >> I am using the dlopen,dlsym functions to load in an external module in my
    >> program which works fine. I can call functions inside the loaded module and
    >> all is well.
    >> The problem is, when i try and call a function inside the main program from
    >> the module,
    >> it won't load giving 'Undefined symbol "getnumber"' errors. I can think of
    >> no way round this.
    >
    > You must tell the linker that your main program exports symbols. If you're
    > e.g. the gcc and ld combination you need to do
    >
    > gcc -Wl,-E -o load load.c -ldl
    >
    > where the -Wl,-E tells gcc to invoke the linker with the -E option,
    > which in turn will make ld add all symbols to the dynamic symbol
    > table, so that they can be found by the dlopen'ed library. Of
    > course, you may need some other flags when you're using a different
    > compiler and linker.
    gcc -rdynamic does the same thing.

    --
    Måns Rullgård
    [email]mru@users.sf.net[/email]
    Måns Rullgård Guest

  5. #4

    Default Re: dlopen - calling functions other way round

    thanks,
    its all works perfectly with the -rdynamic switch

    "Måns Rullgård" <mru@users.sourceforge.net> wrote in message
    news:yw1xhe5kl1it.fsf@users.sourceforge.net...
    > [email]Jens.Toerring@physik.fu-berlin.de[/email] writes:
    >
    > >> I am using the dlopen,dlsym functions to load in an external module in
    my
    > >> program which works fine. I can call functions inside the loaded module
    and
    > >> all is well.
    > >> The problem is, when i try and call a function inside the main program
    from
    > >> the module,
    > >> it won't load giving 'Undefined symbol "getnumber"' errors. I can think
    of
    > >> no way round this.
    > >
    > > You must tell the linker that your main program exports symbols. If
    you're
    > > e.g. the gcc and ld combination you need to do
    > >
    > > gcc -Wl,-E -o load load.c -ldl
    > >
    > > where the -Wl,-E tells gcc to invoke the linker with the -E option,
    > > which in turn will make ld add all symbols to the dynamic symbol
    > > table, so that they can be found by the dlopen'ed library. Of
    > > course, you may need some other flags when you're using a different
    > > compiler and linker.
    >
    > gcc -rdynamic does the same thing.
    >
    > --
    > Måns Rullgård
    > [email]mru@users.sf.net[/email]

    Matt Churchyard Guest

Posting Permissions

  • You may not post new threads
  • You may post replies
  • You may not post attachments
  • You may not edit your posts

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139