annotate src/=unexelf1.c @ 24206:d3649b38bb37

(w32_wnd_proc): Fix bug introduced by previous change; the lwindow, rwindow and apps keys could not be used as function keys, because they were being passed to TranslateMessage which ignores them. Also, key was being changed to SPC.
author Andrew Innes <andrewi@gnu.org>
date Wed, 27 Jan 1999 21:53:27 +0000
parents 4ff73e2c043e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15849
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1 /* Copyright (C) 1985, 1986, 1987, 1988, 1990, 1992
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2 Free Software Foundation, Inc.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4 This file is part of GNU Emacs.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6 GNU Emacs is free software; you can redistribute it and/or modify
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8 the Free Software Foundation; either version 2, or (at your option)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9 any later version.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 GNU General Public License for more details.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 along with GNU Emacs; see the file COPYING. If not, write to
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19 Boston, MA 02111-1307, USA.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21 In other words, you are welcome to use, share and improve this program.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22 You are forbidden to forbid anyone else to use, share and improve
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23 what you give them. Help stamp out software-hoarding! */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26 /*
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27 * unexec.c - Convert a running program into an a.out file.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
28 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29 * Author: Spencer W. Thomas
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
30 * Computer Science Dept.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31 * University of Utah
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
32 * Date: Tue Mar 2 1982
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
33 * Modified heavily since then.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
35 * Synopsis:
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36 * unexec (new_name, a_name, data_start, bss_start, entry_address)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37 * char *new_name, *a_name;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38 * unsigned data_start, bss_start, entry_address;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40 * Takes a snapshot of the program and makes an a.out format file in the
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41 * file named by the string argument new_name.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
42 * If a_name is non-NULL, the symbol table will be taken from the given file.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43 * On some machines, an existing a_name file is required.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45 * The boundaries within the a.out file may be adjusted with the data_start
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46 * and bss_start arguments. Either or both may be given as 0 for defaults.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
48 * Data_start gives the boundary between the text segment and the data
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49 * segment of the program. The text segment can contain shared, read-only
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50 * program code and literal data, while the data segment is always unshared
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
51 * and unprotected. Data_start gives the lowest unprotected address.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
52 * The value you specify may be rounded down to a suitable boundary
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53 * as required by the machine you are using.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
54 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
55 * Specifying zero for data_start means the boundary between text and data
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
56 * should not be the same as when the program was loaded.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57 * If NO_REMAP is defined, the argument data_start is ignored and the
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
58 * segment boundaries are never changed.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
59 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60 * Bss_start indicates how much of the data segment is to be saved in the
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61 * a.out file and restored when the program is executed. It gives the lowest
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62 * unsaved address, and is rounded up to a page boundary. The default when 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
63 * is given assumes that the entire data segment is to be stored, including
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
64 * the previous data and bss as well as any additional storage allocated with
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
65 * break (2).
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
66 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
67 * The new file is set up to start at entry_address.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
68 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69 * If you make improvements I'd like to get them too.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
70 * harpo!utah-cs!thomas, thomas@Utah-20
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
71 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72 */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
73
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74 /* Even more heavily modified by james@bigtex.cactus.org of Dell Computer Co.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
75 * ELF support added.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
76 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
77 * Basic theory: the data space of the running process needs to be
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
78 * dumped to the output file. Normally we would just enlarge the size
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
79 * of .data, scooting everything down. But we can't do that in ELF,
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
80 * because there is often something between the .data space and the
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
81 * .bss space.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
82 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
83 * In the temacs dump below, notice that the Global Offset Table
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
84 * (.got) and the Dynamic link data (.dynamic) come between .data1 and
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
85 * .bss. It does not work to overlap .data with these fields.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
86 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
87 * The solution is to create a new .data segment. This segment is
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
88 * filled with data from the current process. Since the contents of
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
89 * various sections refer to sections by index, the new .data segment
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
90 * is made the last in the table to avoid changing any existing index.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
91
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
92 * This is an example of how the section headers are changed. "Addr"
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
93 * is a process virtual address. "Offset" is a file offset.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
94
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
95 raid:/nfs/raid/src/dist-18.56/src> dump -h temacs
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
96
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
97 temacs:
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
98
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
99 **** SECTION HEADER TABLE ****
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
100 [No] Type Flags Addr Offset Size Name
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
101 Link Info Adralgn Entsize
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
102
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
103 [1] 1 2 0x80480d4 0xd4 0x13 .interp
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
104 0 0 0x1 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
105
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
106 [2] 5 2 0x80480e8 0xe8 0x388 .hash
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
107 3 0 0x4 0x4
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
108
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
109 [3] 11 2 0x8048470 0x470 0x7f0 .dynsym
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110 4 1 0x4 0x10
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
111
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
112 [4] 3 2 0x8048c60 0xc60 0x3ad .dynstr
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
113 0 0 0x1 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
114
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
115 [5] 9 2 0x8049010 0x1010 0x338 .rel.plt
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
116 3 7 0x4 0x8
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
118 [6] 1 6 0x8049348 0x1348 0x3 .init
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
119 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121 [7] 1 6 0x804934c 0x134c 0x680 .plt
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
122 0 0 0x4 0x4
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124 [8] 1 6 0x80499cc 0x19cc 0x3c56f .text
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127 [9] 1 6 0x8085f3c 0x3df3c 0x3 .fini
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
128 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
129
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130 [10] 1 2 0x8085f40 0x3df40 0x69c .rodata
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
131 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
132
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
133 [11] 1 2 0x80865dc 0x3e5dc 0xd51 .rodata1
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
134 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
135
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
136 [12] 1 3 0x8088330 0x3f330 0x20afc .data
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
137 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
138
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
139 [13] 1 3 0x80a8e2c 0x5fe2c 0x89d .data1
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142 [14] 1 3 0x80a96cc 0x606cc 0x1a8 .got
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143 0 0 0x4 0x4
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
144
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145 [15] 6 3 0x80a9874 0x60874 0x80 .dynamic
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 4 0 0x4 0x8
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
147
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 [16] 8 3 0x80a98f4 0x608f4 0x449c .bss
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 [17] 2 0 0 0x608f4 0x9b90 .symtab
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152 18 371 0x4 0x10
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
154 [18] 3 0 0 0x6a484 0x8526 .strtab
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155 0 0 0x1 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
156
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
157 [19] 3 0 0 0x729aa 0x93 .shstrtab
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158 0 0 0x1 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
159
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
160 [20] 1 0 0 0x72a3d 0x68b7 .comment
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
161 0 0 0x1 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
162
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
163 raid:/nfs/raid/src/dist-18.56/src> dump -h xemacs
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165 xemacs:
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
166
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167 **** SECTION HEADER TABLE ****
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 [No] Type Flags Addr Offset Size Name
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169 Link Info Adralgn Entsize
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171 [1] 1 2 0x80480d4 0xd4 0x13 .interp
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172 0 0 0x1 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
173
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174 [2] 5 2 0x80480e8 0xe8 0x388 .hash
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175 3 0 0x4 0x4
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
176
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
177 [3] 11 2 0x8048470 0x470 0x7f0 .dynsym
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
178 4 1 0x4 0x10
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
180 [4] 3 2 0x8048c60 0xc60 0x3ad .dynstr
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
181 0 0 0x1 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183 [5] 9 2 0x8049010 0x1010 0x338 .rel.plt
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184 3 7 0x4 0x8
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 [6] 1 6 0x8049348 0x1348 0x3 .init
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189 [7] 1 6 0x804934c 0x134c 0x680 .plt
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 0 0 0x4 0x4
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 [8] 1 6 0x80499cc 0x19cc 0x3c56f .text
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 [9] 1 6 0x8085f3c 0x3df3c 0x3 .fini
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 [10] 1 2 0x8085f40 0x3df40 0x69c .rodata
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201 [11] 1 2 0x80865dc 0x3e5dc 0xd51 .rodata1
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204 [12] 1 3 0x8088330 0x3f330 0x20afc .data
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207 [13] 1 3 0x80a8e2c 0x5fe2c 0x89d .data1
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 [14] 1 3 0x80a96cc 0x606cc 0x1a8 .got
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 0 0 0x4 0x4
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 [15] 6 3 0x80a9874 0x60874 0x80 .dynamic
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 4 0 0x4 0x8
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216 [16] 8 3 0x80c6800 0x7d800 0 .bss
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
218
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
219 [17] 2 0 0 0x7d800 0x9b90 .symtab
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
220 18 371 0x4 0x10
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
221
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
222 [18] 3 0 0 0x87390 0x8526 .strtab
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
223 0 0 0x1 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
224
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
225 [19] 3 0 0 0x8f8b6 0x93 .shstrtab
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
226 0 0 0x1 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
227
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
228 [20] 1 0 0 0x8f949 0x68b7 .comment
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
229 0 0 0x1 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
230
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
231 [21] 1 3 0x80a98f4 0x608f4 0x1cf0c .data
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
232 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
233
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
234 * This is an example of how the file header is changed. "Shoff" is
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
235 * the section header offset within the file. Since that table is
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
236 * after the new .data section, it is moved. "Shnum" is the number of
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237 * sections, which we increment.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 * "Phoff" is the file offset to the program header. "Phentsize" and
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 * "Shentsz" are the program and section header entries sizes respectively.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 * These can be larger than the apparent struct sizes.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243 raid:/nfs/raid/src/dist-18.56/src> dump -f temacs
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 temacs:
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247 **** ELF HEADER ****
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 Class Data Type Machine Version
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 Entry Phoff Shoff Flags Ehsize
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250 Phentsize Phnum Shentsz Shnum Shstrndx
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 1 1 2 3 1
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
253 0x80499cc 0x34 0x792f4 0 0x34
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
254 0x20 5 0x28 21 19
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 raid:/nfs/raid/src/dist-18.56/src> dump -f xemacs
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
258 xemacs:
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 **** ELF HEADER ****
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261 Class Data Type Machine Version
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262 Entry Phoff Shoff Flags Ehsize
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 Phentsize Phnum Shentsz Shnum Shstrndx
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265 1 1 2 3 1
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
266 0x80499cc 0x34 0x96200 0 0x34
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
267 0x20 5 0x28 22 19
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
268
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
269 * These are the program headers. "Offset" is the file offset to the
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
270 * segment. "Vaddr" is the memory load address. "Filesz" is the
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
271 * segment size as it appears in the file, and "Memsz" is the size in
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272 * memory. Below, the third segment is the code and the fourth is the
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273 * data: the difference between Filesz and Memsz is .bss
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
275 raid:/nfs/raid/src/dist-18.56/src> dump -o temacs
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
276
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
277 temacs:
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278 ***** PROGRAM EXECUTION HEADER *****
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279 Type Offset Vaddr Paddr
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280 Filesz Memsz Flags Align
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282 6 0x34 0x8048034 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283 0xa0 0xa0 5 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 3 0xd4 0 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 0x13 0 4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 1 0x34 0x8048034 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 0x3f2f9 0x3f2f9 5 0x1000
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291 1 0x3f330 0x8088330 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
292 0x215c4 0x25a60 7 0x1000
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 2 0x60874 0x80a9874 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295 0x80 0 7 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 raid:/nfs/raid/src/dist-18.56/src> dump -o xemacs
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299 xemacs:
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300 ***** PROGRAM EXECUTION HEADER *****
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301 Type Offset Vaddr Paddr
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
302 Filesz Memsz Flags Align
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
304 6 0x34 0x8048034 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305 0xa0 0xa0 5 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
306
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307 3 0xd4 0 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308 0x13 0 4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 1 0x34 0x8048034 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 0x3f2f9 0x3f2f9 5 0x1000
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
312
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 1 0x3f330 0x8088330 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 0x3e4d0 0x3e4d0 7 0x1000
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
316 2 0x60874 0x80a9874 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317 0x80 0 7 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320 */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
322 /* Modified by wtien@urbana.mcd.mot.com of Motorola Inc.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
323 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
324 * The above mechanism does not work if the unexeced ELF file is being
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325 * re-layout by other applications (such as `strip'). All the applications
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
326 * that re-layout the internal of ELF will layout all sections in ascending
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327 * order of their file offsets. After the re-layout, the data2 section will
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
328 * still be the LAST section in the section header vector, but its file offset
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
329 * is now being pushed far away down, and causes part of it not to be mapped
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
330 * in (ie. not covered by the load segment entry in PHDR vector), therefore
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
331 * causes the new binary to fail.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
332 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
333 * The solution is to modify the unexec algorithm to insert the new data2
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
334 * section header right before the new bss section header, so their file
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
335 * offsets will be in the ascending order. Since some of the section's (all
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336 * sections AFTER the bss section) indexes are now changed, we also need to
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
337 * modify some fields to make them point to the right sections. This is done
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
338 * by macro PATCH_INDEX. All the fields that need to be patched are:
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 * 1. ELF header e_shstrndx field.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 * 2. section header sh_link and sh_info field.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 * 3. symbol table entry st_shndx field.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 * The above example now should look like:
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346 **** SECTION HEADER TABLE ****
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 [No] Type Flags Addr Offset Size Name
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 Link Info Adralgn Entsize
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350 [1] 1 2 0x80480d4 0xd4 0x13 .interp
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351 0 0 0x1 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
352
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353 [2] 5 2 0x80480e8 0xe8 0x388 .hash
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 3 0 0x4 0x4
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356 [3] 11 2 0x8048470 0x470 0x7f0 .dynsym
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
357 4 1 0x4 0x10
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
358
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
359 [4] 3 2 0x8048c60 0xc60 0x3ad .dynstr
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
360 0 0 0x1 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
361
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
362 [5] 9 2 0x8049010 0x1010 0x338 .rel.plt
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
363 3 7 0x4 0x8
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
364
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
365 [6] 1 6 0x8049348 0x1348 0x3 .init
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
366 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
367
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
368 [7] 1 6 0x804934c 0x134c 0x680 .plt
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369 0 0 0x4 0x4
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
370
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
371 [8] 1 6 0x80499cc 0x19cc 0x3c56f .text
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
372 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374 [9] 1 6 0x8085f3c 0x3df3c 0x3 .fini
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 [10] 1 2 0x8085f40 0x3df40 0x69c .rodata
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 [11] 1 2 0x80865dc 0x3e5dc 0xd51 .rodata1
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 [12] 1 3 0x8088330 0x3f330 0x20afc .data
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 [13] 1 3 0x80a8e2c 0x5fe2c 0x89d .data1
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
387 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 [14] 1 3 0x80a96cc 0x606cc 0x1a8 .got
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 0 0 0x4 0x4
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392 [15] 6 3 0x80a9874 0x60874 0x80 .dynamic
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 4 0 0x4 0x8
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
395 [16] 1 3 0x80a98f4 0x608f4 0x1cf0c .data
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398 [17] 8 3 0x80c6800 0x7d800 0 .bss
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399 0 0 0x4 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
400
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
401 [18] 2 0 0 0x7d800 0x9b90 .symtab
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402 19 371 0x4 0x10
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
403
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
404 [19] 3 0 0 0x87390 0x8526 .strtab
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
405 0 0 0x1 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407 [20] 3 0 0 0x8f8b6 0x93 .shstrtab
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
408 0 0 0x1 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
409
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
410 [21] 1 0 0 0x8f949 0x68b7 .comment
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
411 0 0 0x1 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413 */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
414
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
415 #include <sys/types.h>
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
416 #include <stdio.h>
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
417 #include <sys/stat.h>
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
418 #include <memory.h>
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
419 #include <string.h>
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
420 #include <errno.h>
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421 #include <unistd.h>
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
422 #include <fcntl.h>
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
423 #include <elf.h>
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424 #include <sys/mman.h>
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426 #ifdef __alpha__
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
427 # include <sym.h> /* get COFF debugging symbol table declaration */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
428 #endif
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
429
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
430 #if __GNU_LIBRARY__ - 0 >= 6
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431 # include <link.h> /* get ElfW etc */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
432 #endif
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
433
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
434 #ifndef ElfW
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
435 # ifdef __STDC__
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
436 # define ElfW(type) Elf32_##type
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
437 # else
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438 # define ElfW(type) Elf32_/**/type
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
439 # endif
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
440 #endif
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
441
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
442 #ifndef emacs
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
443 #define fatal(a, b, c) fprintf (stderr, a, b, c), exit (1)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444 #else
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
445 #include <config.h>
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
446 extern void fatal (char *, ...);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
447 #endif
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
448
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
449 #ifndef ELF_BSS_SECTION_NAME
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
450 #define ELF_BSS_SECTION_NAME ".bss"
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
451 #endif
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
452
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
453 /* Get the address of a particular section or program header entry,
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454 * accounting for the size of the entries.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
455 */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
456 /*
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
457 On PPC Reference Platform running Solaris 2.5.1
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
458 the plt section is also of type NOBI like the bss section.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
459 (not really stored) and therefore sections after the bss
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
460 section start at the plt offset. The plt section is always
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
461 the one just before the bss section.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
462 Thus, we modify the test from
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
463 if (NEW_SECTION_H (nn).sh_offset >= new_data2_offset)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
464 to
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
465 if (NEW_SECTION_H (nn).sh_offset >=
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
466 OLD_SECTION_H (old_bss_index-1).sh_offset)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
467 This is just a hack. We should put the new data section
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
468 before the .plt section.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
469 And we should not have this routine at all but use
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
470 the libelf library to read the old file and create the new
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
471 file.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
472 The changed code is minimal and depends on prep set in m/prep.h
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473 Erik Deumens
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
474 Quantum Theory Project
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
475 University of Florida
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
476 deumens@qtp.ufl.edu
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
477 Apr 23, 1996
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
478 */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
479
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
480 #define OLD_SECTION_H(n) \
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
481 (*(ElfW(Shdr) *) ((byte *) old_section_h + old_file_h->e_shentsize * (n)))
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
482 #define NEW_SECTION_H(n) \
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
483 (*(ElfW(Shdr) *) ((byte *) new_section_h + new_file_h->e_shentsize * (n)))
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
484 #define OLD_PROGRAM_H(n) \
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
485 (*(ElfW(Phdr) *) ((byte *) old_program_h + old_file_h->e_phentsize * (n)))
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
486 #define NEW_PROGRAM_H(n) \
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
487 (*(ElfW(Phdr) *) ((byte *) new_program_h + new_file_h->e_phentsize * (n)))
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
488
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
489 #define PATCH_INDEX(n) \
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
490 do { \
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
491 if ((int) (n) >= old_bss_index) \
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
492 (n)++; } while (0)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
493 typedef unsigned char byte;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
494
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
495 /* Round X up to a multiple of Y. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
496
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
497 int
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
498 round_up (x, y)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
499 int x, y;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
500 {
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
501 int rem = x % y;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
502 if (rem == 0)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
503 return x;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
504 return x - rem + y;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
505 }
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
506
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
507 /* ****************************************************************
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
508 * unexec
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
509 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
510 * driving logic.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
511 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
512 * In ELF, this works by replacing the old .bss section with a new
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
513 * .data section, and inserting an empty .bss immediately afterwards.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
514 *
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
515 */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
516 void
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
517 unexec (new_name, old_name, data_start, bss_start, entry_address)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
518 char *new_name, *old_name;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
519 unsigned data_start, bss_start, entry_address;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
520 {
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
521 int new_file, old_file, new_file_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
522
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
523 /* Pointers to the base of the image of the two files. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
524 caddr_t old_base, new_base;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
525
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
526 /* Pointers to the file, program and section headers for the old and new
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
527 * files.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
528 */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
529 ElfW(Ehdr) *old_file_h, *new_file_h;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
530 ElfW(Phdr) *old_program_h, *new_program_h;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
531 ElfW(Shdr) *old_section_h, *new_section_h;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
532
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
533 /* Point to the section name table in the old file */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
534 char *old_section_names;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
535
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
536 ElfW(Addr) old_bss_addr, new_bss_addr;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
537 ElfW(Word) old_bss_size, new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
538 ElfW(Off) new_data2_offset;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
539 ElfW(Addr) new_data2_addr;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
540
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
541 int n, nn, old_bss_index, old_data_index, new_data2_index;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
542 struct stat stat_buf;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
543
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
544 /* Open the old file & map it into the address space. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
545
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
546 old_file = open (old_name, O_RDONLY);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
547
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
548 if (old_file < 0)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
549 fatal ("Can't open %s for reading: errno %d\n", old_name, errno);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
550
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
551 if (fstat (old_file, &stat_buf) == -1)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
552 fatal ("Can't fstat (%s): errno %d\n", old_name, errno);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
553
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
554 old_base = mmap (0, stat_buf.st_size, PROT_READ, MAP_SHARED, old_file, 0);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
555
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
556 if (old_base == (caddr_t) -1)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
557 fatal ("Can't mmap (%s): errno %d\n", old_name, errno);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
558
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
559 #ifdef DEBUG
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
560 fprintf (stderr, "mmap (%s, %x) -> %x\n", old_name, stat_buf.st_size,
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
561 old_base);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
562 #endif
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
563
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
564 /* Get pointers to headers & section names */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
565
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
566 old_file_h = (ElfW(Ehdr) *) old_base;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
567 old_program_h = (ElfW(Phdr) *) ((byte *) old_base + old_file_h->e_phoff);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
568 old_section_h = (ElfW(Shdr) *) ((byte *) old_base + old_file_h->e_shoff);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
569 old_section_names = (char *) old_base
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
570 + OLD_SECTION_H (old_file_h->e_shstrndx).sh_offset;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
571
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
572 /* Find the old .bss section. Figure out parameters of the new
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
573 * data2 and bss sections.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
574 */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
575
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
576 for (old_bss_index = 1; old_bss_index < (int) old_file_h->e_shnum;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
577 old_bss_index++)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
578 {
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
579 #ifdef DEBUG
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
580 fprintf (stderr, "Looking for .bss - found %s\n",
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
581 old_section_names + OLD_SECTION_H (old_bss_index).sh_name);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
582 #endif
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
583 if (!strcmp (old_section_names + OLD_SECTION_H (old_bss_index).sh_name,
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
584 ELF_BSS_SECTION_NAME))
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
585 break;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
586 }
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
587 if (old_bss_index == old_file_h->e_shnum)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
588 fatal ("Can't find .bss in %s.\n", old_name, 0);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
589
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
590 old_bss_addr = OLD_SECTION_H (old_bss_index).sh_addr;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
591 old_bss_size = OLD_SECTION_H (old_bss_index).sh_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
592 #if defined(emacs) || !defined(DEBUG)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
593 new_bss_addr = (ElfW(Addr)) sbrk (0);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
594 #else
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
595 new_bss_addr = old_bss_addr + old_bss_size + 0x1234;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
596 #endif
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
597 new_data2_addr = old_bss_addr;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
598 new_data2_size = new_bss_addr - old_bss_addr;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
599 new_data2_offset = OLD_SECTION_H (old_bss_index).sh_offset;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
600
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
601 #ifdef DEBUG
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
602 fprintf (stderr, "old_bss_index %d\n", old_bss_index);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
603 fprintf (stderr, "old_bss_addr %x\n", old_bss_addr);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
604 fprintf (stderr, "old_bss_size %x\n", old_bss_size);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
605 fprintf (stderr, "new_bss_addr %x\n", new_bss_addr);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
606 fprintf (stderr, "new_data2_addr %x\n", new_data2_addr);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
607 fprintf (stderr, "new_data2_size %x\n", new_data2_size);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
608 fprintf (stderr, "new_data2_offset %x\n", new_data2_offset);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
609 #endif
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
610
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
611 if ((unsigned) new_bss_addr < (unsigned) old_bss_addr + old_bss_size)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
612 fatal (".bss shrank when undumping???\n", 0, 0);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
613
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
614 /* Set the output file to the right size and mmap it. Set
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
615 * pointers to various interesting objects. stat_buf still has
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
616 * old_file data.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
617 */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
618
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
619 new_file = open (new_name, O_RDWR | O_CREAT, 0666);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
620 if (new_file < 0)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
621 fatal ("Can't creat (%s): errno %d\n", new_name, errno);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
622
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
623 new_file_size = stat_buf.st_size + old_file_h->e_shentsize + new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
624
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
625 if (ftruncate (new_file, new_file_size))
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
626 fatal ("Can't ftruncate (%s): errno %d\n", new_name, errno);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
627
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
628 #ifdef UNEXEC_USE_MAP_PRIVATE
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
629 new_base = mmap (0, new_file_size, PROT_READ | PROT_WRITE, MAP_PRIVATE,
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
630 new_file, 0);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
631 #else
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
632 new_base = mmap (0, new_file_size, PROT_READ | PROT_WRITE, MAP_SHARED,
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
633 new_file, 0);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
634 #endif
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
635
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
636 if (new_base == (caddr_t) -1)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
637 fatal ("Can't mmap (%s): errno %d\n", new_name, errno);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
638
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
639 new_file_h = (ElfW(Ehdr) *) new_base;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
640 new_program_h = (ElfW(Phdr) *) ((byte *) new_base + old_file_h->e_phoff);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
641 new_section_h = (ElfW(Shdr) *)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
642 ((byte *) new_base + old_file_h->e_shoff + new_data2_size);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
643
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
644 /* Make our new file, program and section headers as copies of the
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
645 * originals.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
646 */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
647
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
648 memcpy (new_file_h, old_file_h, old_file_h->e_ehsize);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
649 memcpy (new_program_h, old_program_h,
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
650 old_file_h->e_phnum * old_file_h->e_phentsize);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
651
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
652 /* Modify the e_shstrndx if necessary. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
653 PATCH_INDEX (new_file_h->e_shstrndx);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
654
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
655 /* Fix up file header. We'll add one section. Section header is
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
656 * further away now.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
657 */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
658
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
659 new_file_h->e_shoff += new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
660 new_file_h->e_shnum += 1;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
661
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
662 #ifdef DEBUG
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
663 fprintf (stderr, "Old section offset %x\n", old_file_h->e_shoff);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
664 fprintf (stderr, "Old section count %d\n", old_file_h->e_shnum);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
665 fprintf (stderr, "New section offset %x\n", new_file_h->e_shoff);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
666 fprintf (stderr, "New section count %d\n", new_file_h->e_shnum);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
667 #endif
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
668
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
669 /* Fix up a new program header. Extend the writable data segment so
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
670 * that the bss area is covered too. Find that segment by looking
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
671 * for a segment that ends just before the .bss area. Make sure
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
672 * that no segments are above the new .data2. Put a loop at the end
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
673 * to adjust the offset and address of any segment that is above
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
674 * data2, just in case we decide to allow this later.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
675 */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
676
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
677 for (n = new_file_h->e_phnum - 1; n >= 0; n--)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
678 {
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
679 /* Compute maximum of all requirements for alignment of section. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
680 int alignment = (NEW_PROGRAM_H (n)).p_align;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
681 if ((OLD_SECTION_H (old_bss_index)).sh_addralign > alignment)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
682 alignment = OLD_SECTION_H (old_bss_index).sh_addralign;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
683
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
684 if (NEW_PROGRAM_H (n).p_vaddr + NEW_PROGRAM_H (n).p_filesz > old_bss_addr)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
685 fatal ("Program segment above .bss in %s\n", old_name, 0);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
686
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
687 if (NEW_PROGRAM_H (n).p_type == PT_LOAD
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
688 && (round_up ((NEW_PROGRAM_H (n)).p_vaddr
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
689 + (NEW_PROGRAM_H (n)).p_filesz,
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
690 alignment)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
691 == round_up (old_bss_addr, alignment)))
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
692 break;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
693 }
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
694 if (n < 0)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
695 fatal ("Couldn't find segment next to .bss in %s\n", old_name, 0);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
696
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
697 NEW_PROGRAM_H (n).p_filesz += new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
698 NEW_PROGRAM_H (n).p_memsz = NEW_PROGRAM_H (n).p_filesz;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
699
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
700 #if 0 /* Maybe allow section after data2 - does this ever happen? */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
701 for (n = new_file_h->e_phnum - 1; n >= 0; n--)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
702 {
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
703 if (NEW_PROGRAM_H (n).p_vaddr
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
704 && NEW_PROGRAM_H (n).p_vaddr >= new_data2_addr)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
705 NEW_PROGRAM_H (n).p_vaddr += new_data2_size - old_bss_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
706
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
707 if (NEW_PROGRAM_H (n).p_offset >= new_data2_offset)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
708 NEW_PROGRAM_H (n).p_offset += new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
709 }
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
710 #endif
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
711
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
712 /* Fix up section headers based on new .data2 section. Any section
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
713 * whose offset or virtual address is after the new .data2 section
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
714 * gets its value adjusted. .bss size becomes zero and new address
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
715 * is set. data2 section header gets added by copying the existing
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
716 * .data header and modifying the offset, address and size.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
717 */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
718 for (old_data_index = 1; old_data_index < (int) old_file_h->e_shnum;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
719 old_data_index++)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
720 if (!strcmp (old_section_names + OLD_SECTION_H (old_data_index).sh_name,
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
721 ".data"))
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
722 break;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
723 if (old_data_index == old_file_h->e_shnum)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
724 fatal ("Can't find .data in %s.\n", old_name, 0);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
725
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
726 /* Walk through all section headers, insert the new data2 section right
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
727 before the new bss section. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
728 for (n = 1, nn = 1; n < (int) old_file_h->e_shnum; n++, nn++)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
729 {
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
730 caddr_t src;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
731 /* If it is bss section, insert the new data2 section before it. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
732 if (n == old_bss_index)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
733 {
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
734 /* Steal the data section header for this data2 section. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
735 memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (old_data_index),
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
736 new_file_h->e_shentsize);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
737
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
738 NEW_SECTION_H (nn).sh_addr = new_data2_addr;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
739 NEW_SECTION_H (nn).sh_offset = new_data2_offset;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
740 NEW_SECTION_H (nn).sh_size = new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
741 /* Use the bss section's alignment. This will assure that the
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
742 new data2 section always be placed in the same spot as the old
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
743 bss section by any other application. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
744 NEW_SECTION_H (nn).sh_addralign = OLD_SECTION_H (n).sh_addralign;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
745
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
746 /* Now copy over what we have in the memory now. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
747 memcpy (NEW_SECTION_H (nn).sh_offset + new_base,
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
748 (caddr_t) OLD_SECTION_H (n).sh_addr,
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
749 new_data2_size);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
750 nn++;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
751 }
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
752
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
753 memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (n),
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
754 old_file_h->e_shentsize);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
755
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
756 /* The new bss section's size is zero, and its file offset and virtual
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
757 address should be off by NEW_DATA2_SIZE. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
758 if (n == old_bss_index)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
759 {
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
760 /* NN should be `old_bss_index + 1' at this point. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
761 NEW_SECTION_H (nn).sh_offset += new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
762 NEW_SECTION_H (nn).sh_addr += new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
763 /* Let the new bss section address alignment be the same as the
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
764 section address alignment followed the old bss section, so
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
765 this section will be placed in exactly the same place. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
766 NEW_SECTION_H (nn).sh_addralign = OLD_SECTION_H (nn).sh_addralign;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
767 NEW_SECTION_H (nn).sh_size = 0;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
768 }
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
769 else
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
770 {
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
771 /* Any section that was original placed AFTER the bss
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
772 section should now be off by NEW_DATA2_SIZE. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
773 #ifdef SOLARIS_POWERPC
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
774 /* On PPC Reference Platform running Solaris 2.5.1
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
775 the plt section is also of type NOBI like the bss section.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
776 (not really stored) and therefore sections after the bss
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
777 section start at the plt offset. The plt section is always
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
778 the one just before the bss section.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
779 It would be better to put the new data section before
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
780 the .plt section, or use libelf instead.
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
781 Erik Deumens, deumens@qtp.ufl.edu. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
782 if (NEW_SECTION_H (nn).sh_offset
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
783 >= OLD_SECTION_H (old_bss_index-1).sh_offset)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
784 NEW_SECTION_H (nn).sh_offset += new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
785 #else
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
786 if (round_up (NEW_SECTION_H (nn).sh_offset,
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
787 OLD_SECTION_H (old_bss_index).sh_addralign)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
788 >= new_data2_offset)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
789 NEW_SECTION_H (nn).sh_offset += new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
790 #endif
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
791 /* Any section that was originally placed after the section
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
792 header table should now be off by the size of one section
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
793 header table entry. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
794 if (NEW_SECTION_H (nn).sh_offset > new_file_h->e_shoff)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
795 NEW_SECTION_H (nn).sh_offset += new_file_h->e_shentsize;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
796 }
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
797
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
798 /* If any section hdr refers to the section after the new .data
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
799 section, make it refer to next one because we have inserted
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
800 a new section in between. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
801
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
802 PATCH_INDEX (NEW_SECTION_H (nn).sh_link);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
803 /* For symbol tables, info is a symbol table index,
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
804 so don't change it. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
805 if (NEW_SECTION_H (nn).sh_type != SHT_SYMTAB
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
806 && NEW_SECTION_H (nn).sh_type != SHT_DYNSYM)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
807 PATCH_INDEX (NEW_SECTION_H (nn).sh_info);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
808
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
809 /* Now, start to copy the content of sections. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
810 if (NEW_SECTION_H (nn).sh_type == SHT_NULL
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
811 || NEW_SECTION_H (nn).sh_type == SHT_NOBITS)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
812 continue;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
813
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
814 /* Write out the sections. .data and .data1 (and data2, called
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
815 ".data" in the strings table) get copied from the current process
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
816 instead of the old file. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
817 if (!strcmp (old_section_names + NEW_SECTION_H (n).sh_name, ".data")
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
818 || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
819 ".data1"))
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
820 src = (caddr_t) OLD_SECTION_H (n).sh_addr;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
821 else
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
822 src = old_base + OLD_SECTION_H (n).sh_offset;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
823
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
824 memcpy (NEW_SECTION_H (nn).sh_offset + new_base, src,
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
825 NEW_SECTION_H (nn).sh_size);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
826
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
827 #ifdef __alpha__
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
828 /* Update Alpha COFF symbol table: */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
829 if (strcmp (old_section_names + OLD_SECTION_H (n).sh_name, ".mdebug")
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
830 == 0)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
831 {
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
832 pHDRR symhdr = (pHDRR) (NEW_SECTION_H (nn).sh_offset + new_base);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
833
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
834 symhdr->cbLineOffset += new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
835 symhdr->cbDnOffset += new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
836 symhdr->cbPdOffset += new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
837 symhdr->cbSymOffset += new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
838 symhdr->cbOptOffset += new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
839 symhdr->cbAuxOffset += new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
840 symhdr->cbSsOffset += new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
841 symhdr->cbSsExtOffset += new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
842 symhdr->cbFdOffset += new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
843 symhdr->cbRfdOffset += new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
844 symhdr->cbExtOffset += new_data2_size;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
845 }
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
846 #endif /* __alpha__ */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
847
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
848 /* If it is the symbol table, its st_shndx field needs to be patched. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
849 if (NEW_SECTION_H (nn).sh_type == SHT_SYMTAB
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
850 || NEW_SECTION_H (nn).sh_type == SHT_DYNSYM)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
851 {
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
852 ElfW(Shdr) *spt = &NEW_SECTION_H (nn);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
853 unsigned int num = spt->sh_size / spt->sh_entsize;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
854 ElfW(Sym) * sym = (ElfW(Sym) *) (NEW_SECTION_H (nn).sh_offset +
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
855 new_base);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
856 for (; num--; sym++)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
857 {
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
858 if ((sym->st_shndx == SHN_UNDEF)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
859 || (sym->st_shndx == SHN_ABS)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
860 || (sym->st_shndx == SHN_COMMON))
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
861 continue;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
862
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
863 PATCH_INDEX (sym->st_shndx);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
864 }
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
865 }
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
866 }
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
867
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
868 /* Update the symbol values of _edata and _end. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
869 for (n = new_file_h->e_shnum - 1; n; n--)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
870 {
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
871 byte *symnames;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
872 ElfW(Sym) *symp, *symendp;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
873
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
874 if (NEW_SECTION_H (n).sh_type != SHT_DYNSYM
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
875 && NEW_SECTION_H (n).sh_type != SHT_SYMTAB)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
876 continue;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
877
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
878 symnames = ((byte *) new_base
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
879 + NEW_SECTION_H (NEW_SECTION_H (n).sh_link).sh_offset);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
880 symp = (ElfW(Sym) *) (NEW_SECTION_H (n).sh_offset + new_base);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
881 symendp = (ElfW(Sym) *) ((byte *)symp + NEW_SECTION_H (n).sh_size);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
882
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
883 for (; symp < symendp; symp ++)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
884 if (strcmp ((char *) (symnames + symp->st_name), "_end") == 0
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
885 || strcmp ((char *) (symnames + symp->st_name), "_edata") == 0)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
886 memcpy (&symp->st_value, &new_bss_addr, sizeof (new_bss_addr));
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
887 }
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
888
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
889 /* This loop seeks out relocation sections for the data section, so
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
890 that it can undo relocations performed by the runtime linker. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
891 for (n = new_file_h->e_shnum - 1; n; n--)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
892 {
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
893 ElfW(Shdr) section = NEW_SECTION_H (n);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
894 switch (section.sh_type) {
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
895 default:
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
896 break;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
897 case SHT_REL:
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
898 case SHT_RELA:
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
899 /* This code handles two different size structs, but there should
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
900 be no harm in that provided that r_offset is always the first
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
901 member. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
902 nn = section.sh_info;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
903 if (!strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".data")
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
904 || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
905 ".data1"))
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
906 {
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
907 ElfW(Addr) offset = NEW_SECTION_H (nn).sh_addr -
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
908 NEW_SECTION_H (nn).sh_offset;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
909 caddr_t reloc = old_base + section.sh_offset, end;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
910 for (end = reloc + section.sh_size; reloc < end;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
911 reloc += section.sh_entsize)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
912 {
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
913 ElfW(Addr) addr = ((ElfW(Rel) *) reloc)->r_offset - offset;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
914 #ifdef __alpha__
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
915 /* The Alpha ELF binutils currently have a bug that
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
916 sometimes results in relocs that contain all
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
917 zeroes. Work around this for now... */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
918 if (((ElfW(Rel) *) reloc)->r_offset == 0)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
919 continue;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
920 #endif
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
921 memcpy (new_base + addr, old_base + addr, sizeof(ElfW(Addr)));
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
922 }
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
923 }
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
924 break;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
925 }
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
926 }
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
927
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
928 #ifdef UNEXEC_USE_MAP_PRIVATE
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
929 if (lseek (new_file, 0, SEEK_SET) == -1)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
930 fatal ("Can't rewind (%s): errno %d\n", new_name, errno);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
931
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
932 if (write (new_file, new_base, new_file_size) != new_file_size)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
933 fatal ("Can't write (%s): errno %d\n", new_name, errno);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
934 #endif
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
935
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
936 /* Close the files and make the new file executable. */
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
937
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
938 if (close (old_file))
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
939 fatal ("Can't close (%s): errno %d\n", old_name, errno);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
940
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
941 if (close (new_file))
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
942 fatal ("Can't close (%s): errno %d\n", new_name, errno);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
943
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
944 if (stat (new_name, &stat_buf) == -1)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
945 fatal ("Can't stat (%s): errno %d\n", new_name, errno);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
946
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
947 n = umask (777);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
948 umask (n);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
949 stat_buf.st_mode |= 0111 & ~n;
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
950 if (chmod (new_name, stat_buf.st_mode) == -1)
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
951 fatal ("Can't chmod (%s): errno %d\n", new_name, errno);
4ff73e2c043e Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
952 }