home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / octave-1.1.1p1-src.tgz / tar.out / fsf / octave / dld / test / reload / reload.c < prev   
C/C++ Source or Header  |  1996-09-28  |  1KB  |  42 lines

  1. #include "dld.h"
  2.  
  3. /* Example to unlink the "main" module (the current executable) so that
  4.    another "main" can be linked in and executed.
  5.  
  6.    To execute, type "reload reload-test".
  7.  */
  8.     
  9. main (argc, argv)
  10. int argc;
  11. char *argv[];
  12. {
  13.  
  14.     register void (*func) () ;
  15.     int *new_brk;
  16.     
  17.     (void) dld_init(argv[0]);
  18.  
  19.     /* unlink itself */
  20.     dld_unlink_by_file (argv[0], 1);
  21.  
  22.     dld_link (argv[1]);
  23. #if defined(sequent)
  24.     func = (void (*)()) dld_get_func ("main");
  25.     (*func) ();
  26. #else
  27.     if (dld_function_executable_p ("main")) {
  28.     func = (void (*)()) dld_get_func ("main");
  29.  
  30.     /* "curbrk" is a symbol used by sbrk(2) to record the current
  31.        break of the process.  It is initialized to the address of
  32.        "_end". Since we are loading in a new copy of sbrk, we must
  33.        set its value to the true current break of the process.
  34.        Otherwise, the first call to the new sbrk will get a seg. fault */
  35.     if (new_brk = (int *) dld_get_bare_symbol ("curbrk")) {
  36.         *new_brk = sbrk(0);
  37.         (*func) ();
  38.     }
  39.     }
  40. #endif
  41. }
  42.