0
+ − 1 DYNODUMP
+ − 2 --------
+ − 3
+ − 4 Dynodump, not to be confused with DinoTurd (as seen in Jurassic Park),
+ − 5 is a shared object that provides one function:
+ − 6
+ − 7 int dynodump(char *new_file);
+ − 8
+ − 9 dynodump(), called from a running program will write a new executable
+ − 10 in new_file a la unexec() in GNU Emacs. The difference lies in the
+ − 11 relocations.
+ − 12
+ − 13 dynodump() will create an image with any relocations (which were
+ − 14 performed by the run-time dynamic linker) undone. This allows the new
+ − 15 image to be run in a different environment. There is, however, one
+ − 16 potentially major caveat. If a symbol reference gets updated during
+ − 17 the running of the calling program, its updated value will be lost.
+ − 18 An example (with additional blank lines for legibility):
+ − 19
+ − 20 $ cat lib.c
+ − 21 char _foo[] = "hello";
+ − 22 char _bar[] = "world";
+ − 23
+ − 24 $ cc -G -o lib.so lib.c
+ − 25
+ − 26 $ cat prog.c
+ − 27 extern char _foo, _bar;
+ − 28
+ − 29 int beenhere = 0;
+ − 30 char * foo = &_foo;
+ − 31 char * bar = &_bar;
+ − 32
+ − 33 int
+ − 34 main(void)
+ − 35 {
+ − 36 (void) printf("%d: foo = %x\n", beenhere, foo);
+ − 37 (void) printf("%d: bar = %x, ", beenhere, bar);
+ − 38
+ − 39 if (!beenhere) {
+ − 40 beenhere = 1;
+ − 41 bar++;
+ − 42 dynodump("newfile");
+ − 43 }
+ − 44 (void) printf("%x\n", bar);
+ − 45 }
+ − 46
+ − 47 $ cc -o prog prog.c -R. lib.so dynodump.so
+ − 48
+ − 49 $ ./prog
+ − 50 0: foo = ef7503cc
+ − 51 0: bar = ef7503d2, ef7503d3
+ − 52
+ − 53 $ ./newfile
+ − 54 1: foo = ef7503cc
+ − 55 1: bar = ef7503d2, ef7503d2
+ − 56
+ − 57 Notice that in the run of newfile, bar points at "world" instead of
+ − 58 the perhaps expected "orld".
+ − 59
+ − 60 Dynodump supports sparc, intel, and power pc architectures.
+ − 61
+ − 62 Dynodump is buildable with GNU make and gcc. If it works for you
+ − 63 with these tools, let me know.
+ − 64
+ − 65 unexec()
+ − 66 --------
+ − 67
+ − 68 Also supplied is an unexsol2.c which belongs in the XEmacs src
+ − 69 directory with the other unex*.c files. The src/s/sol2.h should be
+ − 70 have the following added to it:
+ − 71
+ − 72 #ifdef UNEXEC
+ − 73 #undef UNEXEC
+ − 74 #endif
+ − 75 #define UNEXEC unexsol2.o
+ − 76
+ − 77 This unexec() will attempt to dlopen() the dynodump.so to find the
+ − 78 dynodump function. The default is "../dynodump/dynodump.so" which
+ − 79 should be appropriate for the typical XEmacs build (unless you used
+ − 80 configure to set up separate build and source trees). You may change
+ − 81 it by setting the DYNODUMP environment variable to the full path of
+ − 82 the dynodump shared object.
+ − 83
+ − 84 Other notes:
+ − 85
+ − 86 If you're using the 4.0 C compiler from Sun, you should arrange to
+ − 87 shut off the incremental linker. This is done with the -xildoff
+ − 88 option to the compiler. The common.mk and testsuite/Makefile files
+ − 89 have commentary and ready made lines for uncommenting for this
+ − 90 purpose.
+ − 91
+ − 92 If you're interested in playing with the UltraSPARC specific options
+ − 93 to the aforementioned compiler, then the same makefiles have some
+ − 94 commentary and flags settings to point you in that direction.
+ − 95
+ − 96 Questions:
+ − 97
+ − 98 dynodump() was developed by Rod.Evans@Eng.Sun.COM and
+ − 99 Georg.Nikodym@Canada.Sun.COM. If you have questions, feel free to ask
+ − 100 them but be aware that Rod, "don't know jack about emacs."
+ − 101