home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / dld-3.2.6-src.tgz / tar.out / fsf / dld / gxxload.cc < prev    next >
C/C++ Source or Header  |  1996-09-28  |  2KB  |  87 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include </ade/include/string.h>
  4.  
  5. #include <dld.h>
  6.  
  7. extern char* dyn_libraries[];
  8.  
  9. typedef void (*func_ptr)(void);
  10.  
  11. static print_undefined()
  12. {
  13.   char **symbols;
  14.   int i;
  15.  
  16.   symbols = dld_list_undefined_sym();
  17.   if (dld_undefined_sym_count != 0) printf("Undefined symbols:\n");
  18.   for (i=0; i<dld_undefined_sym_count; i++) {
  19.     printf("%s\n",symbols[i]);
  20.     free(symbols[i]);
  21.   }
  22.   free(symbols);
  23. }
  24.  
  25. void dyn_load(char * name)
  26. {
  27.   char nm_command[80];
  28.   char dummy[80];
  29.   char symbol[80];
  30.   func_ptr addr;
  31.   FILE* pipe;
  32.  
  33. /*
  34.  *  bad cards with C++ on linux
  35.  *  so we must collect by ourselves
  36.  */
  37.  
  38.   strcpy(nm_command,"nm -p ");
  39.   strcat(nm_command,name);
  40.   pipe = popen(nm_command,"r");
  41.   while (!feof(pipe)) {
  42.     fgets(dummy,80,pipe);
  43.     strcpy(symbol,&dummy[12]); /* skip the leading underscore */
  44.     if (strncmp(symbol,"_GLOBAL_$I",10) ) continue;
  45.     symbol[strlen(symbol) - 1] = '\0';
  46.     if (dld_create_reference(symbol)) /* load at least all constructors */
  47.       dld_perror("reference");
  48.     if (dld_link(name))  /* link it in, if needed */
  49.     {
  50.       dld_perror("link");
  51.     }
  52.     for (int i=0; dyn_libraries[i] != 0; i++)
  53.       if (dld_link(dyn_libraries[i])) // link in needed libraries
  54.         dld_perror(dyn_libraries[i]);
  55.     print_undefined();
  56.     addr = (func_ptr) dld_get_func(symbol);
  57.     if ((addr != 0) && dld_function_executable_p(symbol)) (*addr)();
  58.   }
  59. }
  60.  
  61. void dyn_unload(char * name)
  62. {
  63.   char nm_command[80];
  64.   char dummy[80];
  65.   char symbol[80];
  66.   func_ptr addr;
  67.   FILE* pipe;
  68.  
  69. /*
  70.  *  bad cards with C++ on linux
  71.  *  so we must collect by ourselves
  72.  */
  73.  
  74.   dld_unlink_by_file(name,0); 
  75.   strcpy(nm_command,"nm -p ");
  76.   strcat(nm_command,name);
  77.   pipe = popen(nm_command,"r");
  78.   while (!feof(pipe)) {
  79.     fgets(dummy,80,pipe);
  80.     strcpy(symbol,&dummy[12]); /* skip the leading underscore */
  81.     if (strncmp(symbol,"_GLOBAL_$D",10) ) continue;
  82.     symbol[strlen(symbol) - 1] = '\0';
  83.     addr = (func_ptr) dld_get_func(symbol);
  84.     if (addr != 0 && dld_function_executable_p(symbol)) (*addr)();
  85.   }
  86. }
  87.