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
|