Re: Aieee! Need help with gmodule!
- From: Andrew Clausen <clausen alphalink com au>
- To: Todd Graham Lewis <tlewis mindspring net>, gnome-list <gnome-list gnome org>
- Subject: Re: Aieee! Need help with gmodule!
- Date: Fri, 04 Dec 1998 06:20:05 +1100
Todd Graham Lewis wrote:
> My apologies in advance that this is not a general-purpose GNOME question.
>
> I am trying to use gmodule in a project (www.dents.org for more info).
> I am compiling some shared objects which I hope to link into my system.
>
> When I run my test g_module program on one of my shared object files,
> I get the following error:
>
> % gmodule_test modules/constant_module.so
> ** ERROR **: modules/constant_module.so: ELF file's phentsize not the
> expected size
> aborting...
> %
>
> Since I can find no docs on gmodule, I have no idea if I am doing anything
> at all right. Would whoever in this crowd is knowledgeable concerning
> gmodule mind looking this over and offering me what advice they can?
>
> I compile my objects this way:
>
> gcc -shared -fpic -DPIC -c \
> `/opt/gnome/bin/glib-config --cflags` -I.. \
> $file -o ${file%.c}.so
You need to do:
`glib-config gmodule --cflags`
Although it makes no difference for now (I don't know what platform you're using
though...)
What did you link with? You certainly need `glib-config gmodule --libs`, for the
-rdynamic switch.
> Here is the output of nm on such an object:
>
> U _GLOBAL_OFFSET_TABLE_
> U _IO_stderr_
> 00000044 T dents_module_add_zone
> 0000014c T dents_module_answer
> 00000114 T dents_module_destroy
> 000000cc T dents_module_drop_zone
> 00000000 T dents_module_init
> 00000000 D dents_module_name
> 00000084 T dents_module_reload_zone
> U fprintf
> 00000000 t gcc2_compiled.
>
> and here's my loader program:
>
> START
> #include <glib.h> /* gmodule */
> #include <gmodule.h> /* gmodule */
> #include <sys/stat.h> /* stat */
> #include <unistd.h> /* stat */
> #include <stdio.h> /* printf */
> #include "dents_module.h" /* struct dents_resolver_module */
>
> int main(int argc, char *argv[])
> {
> /* We just want to load up a module and
> call its answer routine. */
>
> char *module_file_name;
> struct dents_resolver_module my_mod;
> GModule *module = NULL;
> int (*my_func)();
> unsigned int result;
>
> if(argc!=2){
> fprintf(stderr, "%u is not 2! Need one argument.\n", argc);
> exit(-1);
> }
>
> module_file_name=argv[1];
>
> fprintf(stderr, "module file name is %s.\n", module_file_name);
> if(g_module_supported()){
> module = g_module_open (module_file_name, G_MODULE_BIND_LAZY);
> if(!module){
> fprintf(stderr, "Aiee, module == NULL!\n");
> g_error(g_module_error());
> }
> }
>
> if (module && g_module_symbol (module, "dents_module_init", my_func)) {
> result=my_func();
> fprintf(stderr, "module init returned %u.\n", result);
> g_module_make_resident (module);
> }
>
> if (!my_func){
> g_warning ("Failed to load module \"%s\": %s",
> module ? module_file_name : module_file_name,
> g_module_error ());
> if (module) {
> g_module_close (module);
> }
> }
> }
> END
That code looks pretty much right to me.
Andrew Clausen
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]