Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » GNU/Linux » Problem mit Shared Libraries

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
07.05.2003, 14:22 Uhr
~CruzWoman
Gast


Hallo,

ich habe ein Problem mit meinen Shared Libraries.
Und zwar moechte bzw. muss ich, um das ganze dynamisch und modular zu halten,
die libs bzw. eigentlich den Rueckgabewert (sozusagen eine "Methodentabelle")
als verkettete Liste speichern. Dies geschieht zu Beginn der Main in der Methode
init_libs.
In den libs selbst wird eine Methode aufgerufen, die mir sozusagen
die Pointer auf die eigentliche Methode, die ich aufrufen will, "umbiegt" und
diese "Methodentabelle" zurueckgibt.
Da die Pointer nun auf die entsprechenden Methoden gesetzt sind, kann ich
nun einfach die Methode process() aufrufen und es wird dann die eigentlich
gewuenschte Methode der lib ausgefuehrt.

Mein eigentliches Problem bekomme ich allerdings erst in der main(). Und zwar
wenn ich auf die entsprechenden Methodentabellen wieder zugreifen will:
datastruct = filter_table.process(datastruct);
filter_table ist hier diese Methodentabelle, wo die Pointer nun auf process() zeigen.
Hier bekomme ich dann beim Ausfuehren des Programms eine "Illegal Instruction"
und des Programm bricht ab.

Ich habe keine Ahnung was ich da falsch mache. Die entsprechenden Stellen im
Quellcode habe ich unten mal rangehangen. Ich hoffe ich habe das oben nicht zu
wirr erklaert und vielleicht kann mir da jemand weiter helfen.

Vielen Dank schon einmal.
Verena

C++:
**********Definitionsfile defs.h**************

#define MAXINT 100 /*maximale Anzahl Zahlen*/

typedef struct{
  int data[MAXINT];
}data_struct;

typedef struct{
  data_struct (*process)(data_struct);
}method_table;

struct list_elem{
  method_table *pt_method_table;
  struct list_elem *next;
};

struct list_elem *first = NULL;
struct list_elem *next = NULL;
method_table *pt_method_table = NULL;

************Main*****************

#include
#include
#include
#include
#include
#include "defs.h"

char *error;
int modulecounter = 0; /* Anzahl der insgesamt auszufuehrenden Module */
char *libname[MAXLIBS]; /* MAXLIBS entspricht Anzahl der "maximal benutzbaren" */
/* Bibliotheken evtl. spaeter hierfuer dynamische Struktur!!! */

void init_libs(){
  void *filter_handle;
  int i;
  method_table (*init_filter)(void);
  method_table filter_table;

  struct list_elem *pointer;

  for (i = 1; i < modulecounter-1; i++){
    filter_handle = dlopen(libname[i],RTLD_NOW);
    if (!filter_handle){
      fputs(dlerror(),stderr);
      exit(1);
    }
    
    init_filter = dlsym(filter_handle,"init");
    if ((error = dlerror()) != NULL){
      fputs(error,stderr);
      exit(1);
    }
    
    filter_table = (*init_filter)();

    if (first == NULL){ /*Liste noch leer*/
      if ((first = (struct list_elem *) malloc(sizeof(struct list_elem))) == NULL)
  printf("Not enough disk space\n");
      
      first->pt_method_table = &filter_table;
      first->next = NULL;
    }
    else { /*mindestens ein Element in der Liste*/
      pointer = first;
      
      while (pointer->next != NULL)
        pointer = pointer->next;
      
      if ((pointer->next = (struct list_elem *) malloc(sizeof(struct list_elem))) == NULL)
printf("Not enough disk space\n");

      pointer = pointer->next;
      pointer->pt_method_table = &filter_table;
      pointer->next = NULL;
    }  
  }
}

main(int argc, char *argv[]){
  data_struct datastruct;
  method_table filter_table;
  struct list_elem *pointer;

     .....

  /*Filter ausfuehren*/
  init_libs();

  while (pointer != NULL){
    filter_table = (method_table) *(pointer->pt_method_table);
    datastruct = filter_table.process(datastruct);
    pointer = pointer->next;
  }

     .....

}

*****************Filtermodul*******************

#include
#include
#include "defs.h"

/*Filter um eingelesene Daten um 1 zu inkrementieren*/
data_struct filter_increment(data_struct datastruct){
  int i;

  for(i = 0; i < MAXINT; i++)
    datastruct.data[i] = datastruct.data[i] + 1;
  
  return datastruct;
}

method_table init(){
  method_table *filterinc_table;
  filterinc_table = (method_table *) malloc(sizeof(method_table));
  
  filterinc_table->process = filter_increment;
  
  return *filterinc_table;
}


Edit by virtual: Code Tags eingefügt!

Dieser Post wurde am 07.05.2003 um 14:57 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.05.2003, 14:58 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich verschieb Dich mal
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.05.2003, 15:09 Uhr
virtual
Sexiest Bit alive
(Operator)


Hi,
ich habs noch nicht komplett analysiert, aber:

C++:
void init_libs(){
    void *filter_handle;
    int i;
    method_table (*init_filter)(void);
    method_table filter_table;
    ...
    [b]pointer->pt_method_table = &filter_table;[/b]
    ...
}


filter_table ist eine lokale Variable, die - und damit auch die Addresse - ist nach verlassen von init_lib ungültig. Scheint mir auf jedenfall ein problem zu sein, obs weitere gibt, sei mal dahingestellt.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.05.2003, 15:24 Uhr
~CruzWoman
Gast


Hallo,
muss gleich weg, kann das deswegen nicht gleich ausprobieren.

Das hab' ich wiedermal total verpeilt, typisch fuer mich. Hoffentlich
lags daran.

Dann vielen Dank schon mal.
Viele Grueße
Verena
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.05.2003, 23:43 Uhr
virtual
Sexiest Bit alive
(Operator)


Naja, was auf jeden Fall noch in den Bereich des schlechten Stils gehört ist das Nicht-Aufräumen: du holst Dir zwar ganz fleißig Handles zur Library mit dlopen, aber dadurch, daß du sie dir nicht länger merkst, hast Du auch keine Möglichkeit, diese Freizugeben.
Ich denke, man könnte die struct list_elem um dieses Handle erweitern und die Handles dann in dorthin schreiben, Dann hast Du zumindestens eine reale chance auch Aufräumen zu können.
Ich denke, normalerweise macht das das System für Dich, aber wie gesagt: ist kein guter stil.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ GNU/Linux ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: