Mercurial > emacs
annotate src/unexelf.c @ 49506:ac9e2eeeb03d
New format of AUTHORS file; list each
author name once followed by contributed and changed files.
Improve selection of entries to include in list, and generate list
of unrecognized entries indicating syntax errors in ChangeLog files.
(authors-coding-system): New variable.
(authors-many-files): Update doc string.
(authors-aliases): Change format. Now one entry with multiple
aliases per author.
(authors-valid-file-names, authors-renamed-files-alist)
(authors-renamed-files-regexps): New variables.
(authors-canonical-file-name): New function. Validates that file
exists or occurs in one of the above lists. Record unrecognized
file names in global authors-invalid-file-names list.
(authors-add): Change to record per-change counts.
(authors-canonical-author-name): Handle new format of
authors-aliases list.
(authors-scan-change-log): Rename FILE arg to LOG-FILE.
Change doc string to describe new entry format.
Only add author entries for valid file names.
(authors-print): Replace by authors-add-to-author-list.
(authors-add-to-author-list): New function which reorders
per-file entries and adds them to global authors-author-list.
(authors): Instead of authors-print to insert in *Authors* buffer,
use authors-add-to-author-list to reorder the list and then
insert result in *Authors* buffer with new format.
Generate *Authors Errors* compilation-mode buffer listing
unrecognized ChangeLog entries.
author | Kim F. Storm <storm@cua.dk> |
---|---|
date | Wed, 29 Jan 2003 00:13:11 +0000 |
parents | d2f5d3e1c0cc |
children | 2710810008b2 d7ddb3e565de |
rev | line source |
---|---|
40871 | 1 /* Copyright (C) 1985, 1986, 1987, 1988, 1990, 1992, 1999, 2000, 2001 |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
2 Free Software Foundation, Inc. |
484 | 3 |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14054
diff
changeset
|
4 This file is part of GNU Emacs. |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14054
diff
changeset
|
5 |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14054
diff
changeset
|
6 GNU Emacs is free software; you can redistribute it and/or modify |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14054
diff
changeset
|
7 it under the terms of the GNU General Public License as published by |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14054
diff
changeset
|
8 the Free Software Foundation; either version 2, or (at your option) |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14054
diff
changeset
|
9 any later version. |
484 | 10 |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14054
diff
changeset
|
11 GNU Emacs is distributed in the hope that it will be useful, |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14054
diff
changeset
|
12 but WITHOUT ANY WARRANTY; without even the implied warranty of |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14054
diff
changeset
|
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14054
diff
changeset
|
14 GNU General Public License for more details. |
484 | 15 |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14054
diff
changeset
|
16 You should have received a copy of the GNU General Public License |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14054
diff
changeset
|
17 along with GNU Emacs; see the file COPYING. If not, write to |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14054
diff
changeset
|
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14054
diff
changeset
|
19 Boston, MA 02111-1307, USA. |
484 | 20 |
21 In other words, you are welcome to use, share and improve this program. | |
22 You are forbidden to forbid anyone else to use, share and improve | |
23 what you give them. Help stamp out software-hoarding! */ | |
24 | |
25 | |
26 /* | |
27 * unexec.c - Convert a running program into an a.out file. | |
28 * | |
29 * Author: Spencer W. Thomas | |
30 * Computer Science Dept. | |
31 * University of Utah | |
32 * Date: Tue Mar 2 1982 | |
33 * Modified heavily since then. | |
34 * | |
35 * Synopsis: | |
19201
f502f8e2322a
(unexec): Cast 1st arg in mmap calls.
Richard M. Stallman <rms@gnu.org>
parents:
18475
diff
changeset
|
36 * unexec (new_name, old_name, data_start, bss_start, entry_address) |
f502f8e2322a
(unexec): Cast 1st arg in mmap calls.
Richard M. Stallman <rms@gnu.org>
parents:
18475
diff
changeset
|
37 * char *new_name, *old_name; |
484 | 38 * unsigned data_start, bss_start, entry_address; |
39 * | |
40 * Takes a snapshot of the program and makes an a.out format file in the | |
41 * file named by the string argument new_name. | |
19201
f502f8e2322a
(unexec): Cast 1st arg in mmap calls.
Richard M. Stallman <rms@gnu.org>
parents:
18475
diff
changeset
|
42 * If old_name is non-NULL, the symbol table will be taken from the given file. |
f502f8e2322a
(unexec): Cast 1st arg in mmap calls.
Richard M. Stallman <rms@gnu.org>
parents:
18475
diff
changeset
|
43 * On some machines, an existing old_name file is required. |
484 | 44 * |
45 * The boundaries within the a.out file may be adjusted with the data_start | |
46 * and bss_start arguments. Either or both may be given as 0 for defaults. | |
47 * | |
48 * Data_start gives the boundary between the text segment and the data | |
49 * segment of the program. The text segment can contain shared, read-only | |
50 * program code and literal data, while the data segment is always unshared | |
51 * and unprotected. Data_start gives the lowest unprotected address. | |
52 * The value you specify may be rounded down to a suitable boundary | |
53 * as required by the machine you are using. | |
54 * | |
55 * Bss_start indicates how much of the data segment is to be saved in the | |
56 * a.out file and restored when the program is executed. It gives the lowest | |
57 * unsaved address, and is rounded up to a page boundary. The default when 0 | |
58 * is given assumes that the entire data segment is to be stored, including | |
59 * the previous data and bss as well as any additional storage allocated with | |
60 * break (2). | |
61 * | |
62 * The new file is set up to start at entry_address. | |
63 * | |
64 */ | |
65 | |
66 /* Even more heavily modified by james@bigtex.cactus.org of Dell Computer Co. | |
67 * ELF support added. | |
68 * | |
69 * Basic theory: the data space of the running process needs to be | |
70 * dumped to the output file. Normally we would just enlarge the size | |
71 * of .data, scooting everything down. But we can't do that in ELF, | |
72 * because there is often something between the .data space and the | |
73 * .bss space. | |
74 * | |
75 * In the temacs dump below, notice that the Global Offset Table | |
76 * (.got) and the Dynamic link data (.dynamic) come between .data1 and | |
77 * .bss. It does not work to overlap .data with these fields. | |
78 * | |
79 * The solution is to create a new .data segment. This segment is | |
80 * filled with data from the current process. Since the contents of | |
81 * various sections refer to sections by index, the new .data segment | |
82 * is made the last in the table to avoid changing any existing index. | |
83 | |
84 * This is an example of how the section headers are changed. "Addr" | |
85 * is a process virtual address. "Offset" is a file offset. | |
86 | |
87 raid:/nfs/raid/src/dist-18.56/src> dump -h temacs | |
88 | |
89 temacs: | |
90 | |
91 **** SECTION HEADER TABLE **** | |
48592 | 92 [No] Type Flags Addr Offset Size Name |
93 Link Info Adralgn Entsize | |
484 | 94 |
48592 | 95 [1] 1 2 0x80480d4 0xd4 0x13 .interp |
96 0 0 0x1 0 | |
484 | 97 |
48592 | 98 [2] 5 2 0x80480e8 0xe8 0x388 .hash |
99 3 0 0x4 0x4 | |
484 | 100 |
48592 | 101 [3] 11 2 0x8048470 0x470 0x7f0 .dynsym |
102 4 1 0x4 0x10 | |
484 | 103 |
48592 | 104 [4] 3 2 0x8048c60 0xc60 0x3ad .dynstr |
105 0 0 0x1 0 | |
484 | 106 |
48592 | 107 [5] 9 2 0x8049010 0x1010 0x338 .rel.plt |
108 3 7 0x4 0x8 | |
484 | 109 |
48592 | 110 [6] 1 6 0x8049348 0x1348 0x3 .init |
111 0 0 0x4 0 | |
484 | 112 |
48592 | 113 [7] 1 6 0x804934c 0x134c 0x680 .plt |
114 0 0 0x4 0x4 | |
484 | 115 |
48592 | 116 [8] 1 6 0x80499cc 0x19cc 0x3c56f .text |
117 0 0 0x4 0 | |
484 | 118 |
48592 | 119 [9] 1 6 0x8085f3c 0x3df3c 0x3 .fini |
120 0 0 0x4 0 | |
484 | 121 |
48592 | 122 [10] 1 2 0x8085f40 0x3df40 0x69c .rodata |
123 0 0 0x4 0 | |
484 | 124 |
48592 | 125 [11] 1 2 0x80865dc 0x3e5dc 0xd51 .rodata1 |
126 0 0 0x4 0 | |
484 | 127 |
48592 | 128 [12] 1 3 0x8088330 0x3f330 0x20afc .data |
129 0 0 0x4 0 | |
484 | 130 |
48592 | 131 [13] 1 3 0x80a8e2c 0x5fe2c 0x89d .data1 |
132 0 0 0x4 0 | |
484 | 133 |
48592 | 134 [14] 1 3 0x80a96cc 0x606cc 0x1a8 .got |
135 0 0 0x4 0x4 | |
484 | 136 |
48592 | 137 [15] 6 3 0x80a9874 0x60874 0x80 .dynamic |
138 4 0 0x4 0x8 | |
484 | 139 |
48592 | 140 [16] 8 3 0x80a98f4 0x608f4 0x449c .bss |
141 0 0 0x4 0 | |
484 | 142 |
48592 | 143 [17] 2 0 0 0x608f4 0x9b90 .symtab |
144 18 371 0x4 0x10 | |
484 | 145 |
48592 | 146 [18] 3 0 0 0x6a484 0x8526 .strtab |
147 0 0 0x1 0 | |
484 | 148 |
48592 | 149 [19] 3 0 0 0x729aa 0x93 .shstrtab |
150 0 0 0x1 0 | |
484 | 151 |
48592 | 152 [20] 1 0 0 0x72a3d 0x68b7 .comment |
153 0 0 0x1 0 | |
484 | 154 |
48592 | 155 raid:/nfs/raid/src/dist-18.56/src> dump -h xemacs |
484 | 156 |
48592 | 157 xemacs: |
484 | 158 |
48592 | 159 **** SECTION HEADER TABLE **** |
160 [No] Type Flags Addr Offset Size Name | |
161 Link Info Adralgn Entsize | |
484 | 162 |
48592 | 163 [1] 1 2 0x80480d4 0xd4 0x13 .interp |
164 0 0 0x1 0 | |
484 | 165 |
48592 | 166 [2] 5 2 0x80480e8 0xe8 0x388 .hash |
167 3 0 0x4 0x4 | |
484 | 168 |
48592 | 169 [3] 11 2 0x8048470 0x470 0x7f0 .dynsym |
170 4 1 0x4 0x10 | |
484 | 171 |
48592 | 172 [4] 3 2 0x8048c60 0xc60 0x3ad .dynstr |
173 0 0 0x1 0 | |
484 | 174 |
48592 | 175 [5] 9 2 0x8049010 0x1010 0x338 .rel.plt |
176 3 7 0x4 0x8 | |
484 | 177 |
48592 | 178 [6] 1 6 0x8049348 0x1348 0x3 .init |
179 0 0 0x4 0 | |
484 | 180 |
48592 | 181 [7] 1 6 0x804934c 0x134c 0x680 .plt |
182 0 0 0x4 0x4 | |
484 | 183 |
48592 | 184 [8] 1 6 0x80499cc 0x19cc 0x3c56f .text |
185 0 0 0x4 0 | |
484 | 186 |
48592 | 187 [9] 1 6 0x8085f3c 0x3df3c 0x3 .fini |
188 0 0 0x4 0 | |
484 | 189 |
48592 | 190 [10] 1 2 0x8085f40 0x3df40 0x69c .rodata |
191 0 0 0x4 0 | |
484 | 192 |
48592 | 193 [11] 1 2 0x80865dc 0x3e5dc 0xd51 .rodata1 |
194 0 0 0x4 0 | |
484 | 195 |
48592 | 196 [12] 1 3 0x8088330 0x3f330 0x20afc .data |
197 0 0 0x4 0 | |
484 | 198 |
48592 | 199 [13] 1 3 0x80a8e2c 0x5fe2c 0x89d .data1 |
200 0 0 0x4 0 | |
484 | 201 |
48592 | 202 [14] 1 3 0x80a96cc 0x606cc 0x1a8 .got |
203 0 0 0x4 0x4 | |
484 | 204 |
48592 | 205 [15] 6 3 0x80a9874 0x60874 0x80 .dynamic |
206 4 0 0x4 0x8 | |
484 | 207 |
48592 | 208 [16] 8 3 0x80c6800 0x7d800 0 .bss |
209 0 0 0x4 0 | |
484 | 210 |
48592 | 211 [17] 2 0 0 0x7d800 0x9b90 .symtab |
212 18 371 0x4 0x10 | |
484 | 213 |
48592 | 214 [18] 3 0 0 0x87390 0x8526 .strtab |
215 0 0 0x1 0 | |
484 | 216 |
48592 | 217 [19] 3 0 0 0x8f8b6 0x93 .shstrtab |
218 0 0 0x1 0 | |
484 | 219 |
48592 | 220 [20] 1 0 0 0x8f949 0x68b7 .comment |
221 0 0 0x1 0 | |
484 | 222 |
48592 | 223 [21] 1 3 0x80a98f4 0x608f4 0x1cf0c .data |
224 0 0 0x4 0 | |
484 | 225 |
48592 | 226 * This is an example of how the file header is changed. "Shoff" is |
227 * the section header offset within the file. Since that table is | |
228 * after the new .data section, it is moved. "Shnum" is the number of | |
229 * sections, which we increment. | |
230 * | |
231 * "Phoff" is the file offset to the program header. "Phentsize" and | |
232 * "Shentsz" are the program and section header entries sizes respectively. | |
233 * These can be larger than the apparent struct sizes. | |
484 | 234 |
48592 | 235 raid:/nfs/raid/src/dist-18.56/src> dump -f temacs |
484 | 236 |
48592 | 237 temacs: |
484 | 238 |
48592 | 239 **** ELF HEADER **** |
240 Class Data Type Machine Version | |
241 Entry Phoff Shoff Flags Ehsize | |
242 Phentsize Phnum Shentsz Shnum Shstrndx | |
484 | 243 |
48592 | 244 1 1 2 3 1 |
245 0x80499cc 0x34 0x792f4 0 0x34 | |
246 0x20 5 0x28 21 19 | |
484 | 247 |
48592 | 248 raid:/nfs/raid/src/dist-18.56/src> dump -f xemacs |
484 | 249 |
48592 | 250 xemacs: |
484 | 251 |
48592 | 252 **** ELF HEADER **** |
253 Class Data Type Machine Version | |
254 Entry Phoff Shoff Flags Ehsize | |
255 Phentsize Phnum Shentsz Shnum Shstrndx | |
484 | 256 |
48592 | 257 1 1 2 3 1 |
258 0x80499cc 0x34 0x96200 0 0x34 | |
259 0x20 5 0x28 22 19 | |
484 | 260 |
48592 | 261 * These are the program headers. "Offset" is the file offset to the |
262 * segment. "Vaddr" is the memory load address. "Filesz" is the | |
263 * segment size as it appears in the file, and "Memsz" is the size in | |
264 * memory. Below, the third segment is the code and the fourth is the | |
265 * data: the difference between Filesz and Memsz is .bss | |
484 | 266 |
48592 | 267 raid:/nfs/raid/src/dist-18.56/src> dump -o temacs |
484 | 268 |
48592 | 269 temacs: |
270 ***** PROGRAM EXECUTION HEADER ***** | |
271 Type Offset Vaddr Paddr | |
272 Filesz Memsz Flags Align | |
484 | 273 |
48592 | 274 6 0x34 0x8048034 0 |
275 0xa0 0xa0 5 0 | |
484 | 276 |
48592 | 277 3 0xd4 0 0 |
278 0x13 0 4 0 | |
484 | 279 |
48592 | 280 1 0x34 0x8048034 0 |
281 0x3f2f9 0x3f2f9 5 0x1000 | |
484 | 282 |
48592 | 283 1 0x3f330 0x8088330 0 |
284 0x215c4 0x25a60 7 0x1000 | |
484 | 285 |
48592 | 286 2 0x60874 0x80a9874 0 |
287 0x80 0 7 0 | |
484 | 288 |
48592 | 289 raid:/nfs/raid/src/dist-18.56/src> dump -o xemacs |
484 | 290 |
48592 | 291 xemacs: |
292 ***** PROGRAM EXECUTION HEADER ***** | |
293 Type Offset Vaddr Paddr | |
294 Filesz Memsz Flags Align | |
484 | 295 |
48592 | 296 6 0x34 0x8048034 0 |
297 0xa0 0xa0 5 0 | |
484 | 298 |
48592 | 299 3 0xd4 0 0 |
300 0x13 0 4 0 | |
484 | 301 |
48592 | 302 1 0x34 0x8048034 0 |
303 0x3f2f9 0x3f2f9 5 0x1000 | |
484 | 304 |
48592 | 305 1 0x3f330 0x8088330 0 |
306 0x3e4d0 0x3e4d0 7 0x1000 | |
484 | 307 |
48592 | 308 2 0x60874 0x80a9874 0 |
309 0x80 0 7 0 | |
484 | 310 |
311 | |
312 */ | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
313 |
14251
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
314 /* Modified by wtien@urbana.mcd.mot.com of Motorola Inc. |
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
315 * |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
316 * The above mechanism does not work if the unexeced ELF file is being |
14251
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
317 * re-layout by other applications (such as `strip'). All the applications |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
318 * that re-layout the internal of ELF will layout all sections in ascending |
14251
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
319 * order of their file offsets. After the re-layout, the data2 section will |
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
320 * still be the LAST section in the section header vector, but its file offset |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
321 * is now being pushed far away down, and causes part of it not to be mapped |
14251
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
322 * in (ie. not covered by the load segment entry in PHDR vector), therefore |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
323 * causes the new binary to fail. |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
324 * |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
325 * The solution is to modify the unexec algorithm to insert the new data2 |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
326 * section header right before the new bss section header, so their file |
14251
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
327 * offsets will be in the ascending order. Since some of the section's (all |
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
328 * sections AFTER the bss section) indexes are now changed, we also need to |
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
329 * modify some fields to make them point to the right sections. This is done |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
330 * by macro PATCH_INDEX. All the fields that need to be patched are: |
14251
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
331 * |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
332 * 1. ELF header e_shstrndx field. |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
333 * 2. section header sh_link and sh_info field. |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
334 * 3. symbol table entry st_shndx field. |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
335 * |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
336 * The above example now should look like: |
484 | 337 |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
338 **** SECTION HEADER TABLE **** |
48592 | 339 [No] Type Flags Addr Offset Size Name |
340 Link Info Adralgn Entsize | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
341 |
48592 | 342 [1] 1 2 0x80480d4 0xd4 0x13 .interp |
343 0 0 0x1 0 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
344 |
48592 | 345 [2] 5 2 0x80480e8 0xe8 0x388 .hash |
346 3 0 0x4 0x4 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
347 |
48592 | 348 [3] 11 2 0x8048470 0x470 0x7f0 .dynsym |
349 4 1 0x4 0x10 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
350 |
48592 | 351 [4] 3 2 0x8048c60 0xc60 0x3ad .dynstr |
352 0 0 0x1 0 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
353 |
48592 | 354 [5] 9 2 0x8049010 0x1010 0x338 .rel.plt |
355 3 7 0x4 0x8 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
356 |
48592 | 357 [6] 1 6 0x8049348 0x1348 0x3 .init |
358 0 0 0x4 0 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
359 |
48592 | 360 [7] 1 6 0x804934c 0x134c 0x680 .plt |
361 0 0 0x4 0x4 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
362 |
48592 | 363 [8] 1 6 0x80499cc 0x19cc 0x3c56f .text |
364 0 0 0x4 0 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
365 |
48592 | 366 [9] 1 6 0x8085f3c 0x3df3c 0x3 .fini |
367 0 0 0x4 0 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
368 |
48592 | 369 [10] 1 2 0x8085f40 0x3df40 0x69c .rodata |
370 0 0 0x4 0 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
371 |
48592 | 372 [11] 1 2 0x80865dc 0x3e5dc 0xd51 .rodata1 |
373 0 0 0x4 0 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
374 |
48592 | 375 [12] 1 3 0x8088330 0x3f330 0x20afc .data |
376 0 0 0x4 0 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
377 |
48592 | 378 [13] 1 3 0x80a8e2c 0x5fe2c 0x89d .data1 |
379 0 0 0x4 0 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
380 |
48592 | 381 [14] 1 3 0x80a96cc 0x606cc 0x1a8 .got |
382 0 0 0x4 0x4 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
383 |
48592 | 384 [15] 6 3 0x80a9874 0x60874 0x80 .dynamic |
385 4 0 0x4 0x8 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
386 |
48592 | 387 [16] 1 3 0x80a98f4 0x608f4 0x1cf0c .data |
388 0 0 0x4 0 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
389 |
48592 | 390 [17] 8 3 0x80c6800 0x7d800 0 .bss |
391 0 0 0x4 0 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
392 |
48592 | 393 [18] 2 0 0 0x7d800 0x9b90 .symtab |
394 19 371 0x4 0x10 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
395 |
48592 | 396 [19] 3 0 0 0x87390 0x8526 .strtab |
397 0 0 0x1 0 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
398 |
48592 | 399 [20] 3 0 0 0x8f8b6 0x93 .shstrtab |
400 0 0 0x1 0 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
401 |
48592 | 402 [21] 1 0 0 0x8f949 0x68b7 .comment |
403 0 0 0x1 0 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
404 |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
405 */ |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
406 |
40750
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
407 /* We do not use mmap because that fails with NFS. |
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
408 Instead we read the whole file, modify it, and write it out. */ |
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
409 |
28121 | 410 #ifndef emacs |
411 #define fatal(a, b, c) fprintf (stderr, a, b, c), exit (1) | |
31487
9af879dacd99
(SHT_MIPS_DEBUG, HDRR) [__mips__]: Really confine last change to __NetBSD__.
Dave Love <fx@gnu.org>
parents:
31331
diff
changeset
|
412 #include <string.h> |
28121 | 413 #else |
414 #include <config.h> | |
415 extern void fatal (char *, ...); | |
416 #endif | |
417 | |
484 | 418 #include <sys/types.h> |
419 #include <stdio.h> | |
420 #include <sys/stat.h> | |
421 #include <memory.h> | |
422 #include <errno.h> | |
423 #include <unistd.h> | |
424 #include <fcntl.h> | |
19776
6910bd6de0d9
Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents:
19201
diff
changeset
|
425 #if !defined (__NetBSD__) && !defined (__OpenBSD__) |
484 | 426 #include <elf.h> |
18475
ee209ce34d8a
[__NetBSD__]: Add some conditionals for NetBSD.
Richard M. Stallman <rms@gnu.org>
parents:
18474
diff
changeset
|
427 #endif |
484 | 428 #include <sys/mman.h> |
18474
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
429 #if defined (__sony_news) && defined (_SYSTYPE_SYSV) |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
430 #include <sys/elf_mips.h> |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
431 #include <sym.h> |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
432 #endif /* __sony_news && _SYSTYPE_SYSV */ |
25398
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
433 #if __sgi |
26749
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
434 #include <syms.h> /* for HDRR declaration */ |
25398
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
435 #endif /* __sgi */ |
25233
f0d69d0f8222
[__linux__ && __alpha__] (HAS_SBSS_SECTION): Define.
Karl Heuer <kwzh@gnu.org>
parents:
24290
diff
changeset
|
436 |
41279
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
437 #ifndef MAP_ANON |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
438 #ifdef MAP_ANONYMOUS |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
439 #define MAP_ANON MAP_ANONYMOUS |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
440 #else |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
441 #define MAP_ANON 0 |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
442 #endif |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
443 #endif |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
444 |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
445 #ifndef MAP_FAILED |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
446 #define MAP_FAILED ((void *) -1) |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
447 #endif |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
448 |
19776
6910bd6de0d9
Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents:
19201
diff
changeset
|
449 #if defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__) |
21859
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
450 /* Declare COFF debugging symbol table. This used to be in |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
451 /usr/include/sym.h, but this file is no longer included in Red Hat |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
452 5.0 and presumably in any other glibc 2.x based distribution. */ |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
453 typedef struct { |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
454 short magic; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
455 short vstamp; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
456 int ilineMax; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
457 int idnMax; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
458 int ipdMax; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
459 int isymMax; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
460 int ioptMax; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
461 int iauxMax; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
462 int issMax; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
463 int issExtMax; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
464 int ifdMax; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
465 int crfd; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
466 int iextMax; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
467 long cbLine; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
468 long cbLineOffset; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
469 long cbDnOffset; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
470 long cbPdOffset; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
471 long cbSymOffset; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
472 long cbOptOffset; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
473 long cbAuxOffset; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
474 long cbSsOffset; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
475 long cbSsExtOffset; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
476 long cbFdOffset; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
477 long cbRfdOffset; |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
478 long cbExtOffset; |
48592 | 479 } HDRR, *pHDRR; |
21859
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
480 #define cbHDRR sizeof(HDRR) |
bd52f7e0fcdc
[defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)]:
Richard M. Stallman <rms@gnu.org>
parents:
21382
diff
changeset
|
481 #define hdrNil ((pHDRR)0) |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
482 #endif |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
483 |
18475
ee209ce34d8a
[__NetBSD__]: Add some conditionals for NetBSD.
Richard M. Stallman <rms@gnu.org>
parents:
18474
diff
changeset
|
484 #ifdef __NetBSD__ |
ee209ce34d8a
[__NetBSD__]: Add some conditionals for NetBSD.
Richard M. Stallman <rms@gnu.org>
parents:
18474
diff
changeset
|
485 /* |
ee209ce34d8a
[__NetBSD__]: Add some conditionals for NetBSD.
Richard M. Stallman <rms@gnu.org>
parents:
18474
diff
changeset
|
486 * NetBSD does not have normal-looking user-land ELF support. |
ee209ce34d8a
[__NetBSD__]: Add some conditionals for NetBSD.
Richard M. Stallman <rms@gnu.org>
parents:
18474
diff
changeset
|
487 */ |
31905
dedc24a9f752
(ELFSIZE) [__NetBSD__ && __sparc_v9__]: Define to 64.
Gerd Moellmann <gerd@gnu.org>
parents:
31487
diff
changeset
|
488 # if defined __alpha__ || defined __sparc_v9__ |
18475
ee209ce34d8a
[__NetBSD__]: Add some conditionals for NetBSD.
Richard M. Stallman <rms@gnu.org>
parents:
18474
diff
changeset
|
489 # define ELFSIZE 64 |
ee209ce34d8a
[__NetBSD__]: Add some conditionals for NetBSD.
Richard M. Stallman <rms@gnu.org>
parents:
18474
diff
changeset
|
490 # else |
ee209ce34d8a
[__NetBSD__]: Add some conditionals for NetBSD.
Richard M. Stallman <rms@gnu.org>
parents:
18474
diff
changeset
|
491 # define ELFSIZE 32 |
ee209ce34d8a
[__NetBSD__]: Add some conditionals for NetBSD.
Richard M. Stallman <rms@gnu.org>
parents:
18474
diff
changeset
|
492 # endif |
ee209ce34d8a
[__NetBSD__]: Add some conditionals for NetBSD.
Richard M. Stallman <rms@gnu.org>
parents:
18474
diff
changeset
|
493 # include <sys/exec_elf.h> |
ee209ce34d8a
[__NetBSD__]: Add some conditionals for NetBSD.
Richard M. Stallman <rms@gnu.org>
parents:
18474
diff
changeset
|
494 |
27977
026eb782382e
* unexelf.c (PT_LOAD, SHT_*, SHN_*) [__NetBSD__]: Only provide
Ken Raeburn <raeburn@raeburn.org>
parents:
26749
diff
changeset
|
495 # ifndef PT_LOAD |
026eb782382e
* unexelf.c (PT_LOAD, SHT_*, SHN_*) [__NetBSD__]: Only provide
Ken Raeburn <raeburn@raeburn.org>
parents:
26749
diff
changeset
|
496 # define PT_LOAD Elf_pt_load |
31331
c0ff788ed359
(SHT_PROGBITS) [__NetBSD__ && !PT_LOAD]: Don't define.
Gerd Moellmann <gerd@gnu.org>
parents:
28121
diff
changeset
|
497 # if 0 /* was in pkgsrc patches for 20.7 */ |
c0ff788ed359
(SHT_PROGBITS) [__NetBSD__ && !PT_LOAD]: Don't define.
Gerd Moellmann <gerd@gnu.org>
parents:
28121
diff
changeset
|
498 # define SHT_PROGBITS Elf_sht_progbits |
c0ff788ed359
(SHT_PROGBITS) [__NetBSD__ && !PT_LOAD]: Don't define.
Gerd Moellmann <gerd@gnu.org>
parents:
28121
diff
changeset
|
499 # endif |
27977
026eb782382e
* unexelf.c (PT_LOAD, SHT_*, SHN_*) [__NetBSD__]: Only provide
Ken Raeburn <raeburn@raeburn.org>
parents:
26749
diff
changeset
|
500 # define SHT_SYMTAB Elf_sht_symtab |
026eb782382e
* unexelf.c (PT_LOAD, SHT_*, SHN_*) [__NetBSD__]: Only provide
Ken Raeburn <raeburn@raeburn.org>
parents:
26749
diff
changeset
|
501 # define SHT_DYNSYM Elf_sht_dynsym |
026eb782382e
* unexelf.c (PT_LOAD, SHT_*, SHN_*) [__NetBSD__]: Only provide
Ken Raeburn <raeburn@raeburn.org>
parents:
26749
diff
changeset
|
502 # define SHT_NULL Elf_sht_null |
026eb782382e
* unexelf.c (PT_LOAD, SHT_*, SHN_*) [__NetBSD__]: Only provide
Ken Raeburn <raeburn@raeburn.org>
parents:
26749
diff
changeset
|
503 # define SHT_NOBITS Elf_sht_nobits |
026eb782382e
* unexelf.c (PT_LOAD, SHT_*, SHN_*) [__NetBSD__]: Only provide
Ken Raeburn <raeburn@raeburn.org>
parents:
26749
diff
changeset
|
504 # define SHT_REL Elf_sht_rel |
026eb782382e
* unexelf.c (PT_LOAD, SHT_*, SHN_*) [__NetBSD__]: Only provide
Ken Raeburn <raeburn@raeburn.org>
parents:
26749
diff
changeset
|
505 # define SHT_RELA Elf_sht_rela |
18475
ee209ce34d8a
[__NetBSD__]: Add some conditionals for NetBSD.
Richard M. Stallman <rms@gnu.org>
parents:
18474
diff
changeset
|
506 |
27977
026eb782382e
* unexelf.c (PT_LOAD, SHT_*, SHN_*) [__NetBSD__]: Only provide
Ken Raeburn <raeburn@raeburn.org>
parents:
26749
diff
changeset
|
507 # define SHN_UNDEF Elf_eshn_undefined |
026eb782382e
* unexelf.c (PT_LOAD, SHT_*, SHN_*) [__NetBSD__]: Only provide
Ken Raeburn <raeburn@raeburn.org>
parents:
26749
diff
changeset
|
508 # define SHN_ABS Elf_eshn_absolute |
026eb782382e
* unexelf.c (PT_LOAD, SHT_*, SHN_*) [__NetBSD__]: Only provide
Ken Raeburn <raeburn@raeburn.org>
parents:
26749
diff
changeset
|
509 # define SHN_COMMON Elf_eshn_common |
31331
c0ff788ed359
(SHT_PROGBITS) [__NetBSD__ && !PT_LOAD]: Don't define.
Gerd Moellmann <gerd@gnu.org>
parents:
28121
diff
changeset
|
510 # endif /* !PT_LOAD */ |
18475
ee209ce34d8a
[__NetBSD__]: Add some conditionals for NetBSD.
Richard M. Stallman <rms@gnu.org>
parents:
18474
diff
changeset
|
511 |
ee209ce34d8a
[__NetBSD__]: Add some conditionals for NetBSD.
Richard M. Stallman <rms@gnu.org>
parents:
18474
diff
changeset
|
512 # ifdef __alpha__ |
ee209ce34d8a
[__NetBSD__]: Add some conditionals for NetBSD.
Richard M. Stallman <rms@gnu.org>
parents:
18474
diff
changeset
|
513 # include <sys/exec_ecoff.h> |
ee209ce34d8a
[__NetBSD__]: Add some conditionals for NetBSD.
Richard M. Stallman <rms@gnu.org>
parents:
18474
diff
changeset
|
514 # define HDRR struct ecoff_symhdr |
ee209ce34d8a
[__NetBSD__]: Add some conditionals for NetBSD.
Richard M. Stallman <rms@gnu.org>
parents:
18474
diff
changeset
|
515 # define pHDRR HDRR * |
31331
c0ff788ed359
(SHT_PROGBITS) [__NetBSD__ && !PT_LOAD]: Don't define.
Gerd Moellmann <gerd@gnu.org>
parents:
28121
diff
changeset
|
516 # endif /* __alpha__ */ |
18475
ee209ce34d8a
[__NetBSD__]: Add some conditionals for NetBSD.
Richard M. Stallman <rms@gnu.org>
parents:
18474
diff
changeset
|
517 |
31487
9af879dacd99
(SHT_MIPS_DEBUG, HDRR) [__mips__]: Really confine last change to __NetBSD__.
Dave Love <fx@gnu.org>
parents:
31331
diff
changeset
|
518 #ifdef __mips__ /* was in pkgsrc patches for 20.7 */ |
31331
c0ff788ed359
(SHT_PROGBITS) [__NetBSD__ && !PT_LOAD]: Don't define.
Gerd Moellmann <gerd@gnu.org>
parents:
28121
diff
changeset
|
519 # define SHT_MIPS_DEBUG DT_MIPS_FLAGS |
c0ff788ed359
(SHT_PROGBITS) [__NetBSD__ && !PT_LOAD]: Don't define.
Gerd Moellmann <gerd@gnu.org>
parents:
28121
diff
changeset
|
520 # define HDRR struct Elf_Shdr |
c0ff788ed359
(SHT_PROGBITS) [__NetBSD__ && !PT_LOAD]: Don't define.
Gerd Moellmann <gerd@gnu.org>
parents:
28121
diff
changeset
|
521 #endif /* __mips__ */ |
31487
9af879dacd99
(SHT_MIPS_DEBUG, HDRR) [__mips__]: Really confine last change to __NetBSD__.
Dave Love <fx@gnu.org>
parents:
31331
diff
changeset
|
522 #endif /* __NetBSD__ */ |
31331
c0ff788ed359
(SHT_PROGBITS) [__NetBSD__ && !PT_LOAD]: Don't define.
Gerd Moellmann <gerd@gnu.org>
parents:
28121
diff
changeset
|
523 |
19776
6910bd6de0d9
Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents:
19201
diff
changeset
|
524 #ifdef __OpenBSD__ |
6910bd6de0d9
Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents:
19201
diff
changeset
|
525 # include <sys/exec_elf.h> |
6910bd6de0d9
Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents:
19201
diff
changeset
|
526 #endif |
6910bd6de0d9
Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents:
19201
diff
changeset
|
527 |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
528 #if __GNU_LIBRARY__ - 0 >= 6 |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
529 # include <link.h> /* get ElfW etc */ |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
530 #endif |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
531 |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
532 #ifndef ElfW |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
533 # ifdef __STDC__ |
28121 | 534 # define ElfBitsW(bits, type) Elf##bits##_##type |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
535 # else |
28121 | 536 # define ElfBitsW(bits, type) Elf/**/bits/**/_/**/type |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
537 # endif |
28121 | 538 # ifdef _LP64 |
539 # define ELFSIZE 64 | |
540 # else | |
541 # define ELFSIZE 32 | |
542 # endif | |
543 /* This macro expands `bits' before invoking ElfBitsW. */ | |
544 # define ElfExpandBitsW(bits, type) ElfBitsW (bits, type) | |
545 # define ElfW(type) ElfExpandBitsW (ELFSIZE, type) | |
484 | 546 #endif |
547 | |
6052
cff556bf85e8
(ELF_BSS_SECTION_NAME): New macro (config.h may override).
Richard M. Stallman <rms@gnu.org>
parents:
4505
diff
changeset
|
548 #ifndef ELF_BSS_SECTION_NAME |
cff556bf85e8
(ELF_BSS_SECTION_NAME): New macro (config.h may override).
Richard M. Stallman <rms@gnu.org>
parents:
4505
diff
changeset
|
549 #define ELF_BSS_SECTION_NAME ".bss" |
cff556bf85e8
(ELF_BSS_SECTION_NAME): New macro (config.h may override).
Richard M. Stallman <rms@gnu.org>
parents:
4505
diff
changeset
|
550 #endif |
cff556bf85e8
(ELF_BSS_SECTION_NAME): New macro (config.h may override).
Richard M. Stallman <rms@gnu.org>
parents:
4505
diff
changeset
|
551 |
484 | 552 /* Get the address of a particular section or program header entry, |
553 * accounting for the size of the entries. | |
554 */ | |
25398
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
555 /* |
15073
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
556 On PPC Reference Platform running Solaris 2.5.1 |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
557 the plt section is also of type NOBI like the bss section. |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
558 (not really stored) and therefore sections after the bss |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
559 section start at the plt offset. The plt section is always |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
560 the one just before the bss section. |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
561 Thus, we modify the test from |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
562 if (NEW_SECTION_H (nn).sh_offset >= new_data2_offset) |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
563 to |
25398
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
564 if (NEW_SECTION_H (nn).sh_offset >= |
15073
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
565 OLD_SECTION_H (old_bss_index-1).sh_offset) |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
566 This is just a hack. We should put the new data section |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
567 before the .plt section. |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
568 And we should not have this routine at all but use |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
569 the libelf library to read the old file and create the new |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
570 file. |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
571 The changed code is minimal and depends on prep set in m/prep.h |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
572 Erik Deumens |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
573 Quantum Theory Project |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
574 University of Florida |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
575 deumens@qtp.ufl.edu |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
576 Apr 23, 1996 |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
577 */ |
484 | 578 |
579 #define OLD_SECTION_H(n) \ | |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
580 (*(ElfW(Shdr) *) ((byte *) old_section_h + old_file_h->e_shentsize * (n))) |
484 | 581 #define NEW_SECTION_H(n) \ |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
582 (*(ElfW(Shdr) *) ((byte *) new_section_h + new_file_h->e_shentsize * (n))) |
484 | 583 #define OLD_PROGRAM_H(n) \ |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
584 (*(ElfW(Phdr) *) ((byte *) old_program_h + old_file_h->e_phentsize * (n))) |
484 | 585 #define NEW_PROGRAM_H(n) \ |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
586 (*(ElfW(Phdr) *) ((byte *) new_program_h + new_file_h->e_phentsize * (n))) |
484 | 587 |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
588 #define PATCH_INDEX(n) \ |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
589 do { \ |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
590 if ((int) (n) >= old_bss_index) \ |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
591 (n)++; } while (0) |
484 | 592 typedef unsigned char byte; |
593 | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
594 /* Round X up to a multiple of Y. */ |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
595 |
25398
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
596 static ElfW(Addr) |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
597 round_up (x, y) |
20026
027030dd12c4
(round_up): Make arguments and return type unsigned.
Karl Heuer <kwzh@gnu.org>
parents:
19776
diff
changeset
|
598 ElfW(Addr) x, y; |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
599 { |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
600 int rem = x % y; |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
601 if (rem == 0) |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
602 return x; |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
603 return x - rem + y; |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
604 } |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
605 |
26749
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
606 /* Return the index of the section named NAME. |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
607 SECTION_NAMES, FILE_NAME and FILE_H give information |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
608 about the file we are looking in. |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
609 |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
610 If we don't find the section NAME, that is a fatal error |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
611 if NOERROR is 0; we return -1 if NOERROR is nonzero. */ |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
612 |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
613 static int |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
614 find_section (name, section_names, file_name, old_file_h, old_section_h, noerror) |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
615 char *name; |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
616 char *section_names; |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
617 char *file_name; |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
618 ElfW(Ehdr) *old_file_h; |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
619 ElfW(Shdr) *old_section_h; |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
620 int noerror; |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
621 { |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
622 int idx; |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
623 |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
624 for (idx = 1; idx < old_file_h->e_shnum; idx++) |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
625 { |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
626 #ifdef DEBUG |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
627 fprintf (stderr, "Looking for %s - found %s\n", name, |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
628 section_names + OLD_SECTION_H (idx).sh_name); |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
629 #endif |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
630 if (!strcmp (section_names + OLD_SECTION_H (idx).sh_name, |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
631 name)) |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
632 break; |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
633 } |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
634 if (idx == old_file_h->e_shnum) |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
635 { |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
636 if (noerror) |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
637 return -1; |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
638 else |
31331
c0ff788ed359
(SHT_PROGBITS) [__NetBSD__ && !PT_LOAD]: Don't define.
Gerd Moellmann <gerd@gnu.org>
parents:
28121
diff
changeset
|
639 fatal ("Can't find %s in %s.\n", name, file_name); |
26749
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
640 } |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
641 |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
642 return idx; |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
643 } |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
644 |
484 | 645 /* **************************************************************** |
646 * unexec | |
647 * | |
648 * driving logic. | |
649 * | |
650 * In ELF, this works by replacing the old .bss section with a new | |
651 * .data section, and inserting an empty .bss immediately afterwards. | |
652 * | |
653 */ | |
654 void | |
655 unexec (new_name, old_name, data_start, bss_start, entry_address) | |
656 char *new_name, *old_name; | |
657 unsigned data_start, bss_start, entry_address; | |
658 { | |
659 int new_file, old_file, new_file_size; | |
660 | |
40750
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
661 /* Pointers to the base of the image of the two files. */ |
484 | 662 caddr_t old_base, new_base; |
663 | |
41279
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
664 #if MAP_ANON == 0 |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
665 int mmap_fd; |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
666 #else |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
667 # define mmap_fd -1 |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
668 #endif |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
669 |
40750
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
670 /* Pointers to the file, program and section headers for the old and |
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
671 new files. */ |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
672 ElfW(Ehdr) *old_file_h, *new_file_h; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
673 ElfW(Phdr) *old_program_h, *new_program_h; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
674 ElfW(Shdr) *old_section_h, *new_section_h; |
484 | 675 |
40750
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
676 /* Point to the section name table in the old file. */ |
484 | 677 char *old_section_names; |
678 | |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
679 ElfW(Addr) old_bss_addr, new_bss_addr; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
680 ElfW(Word) old_bss_size, new_data2_size; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
681 ElfW(Off) new_data2_offset; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
682 ElfW(Addr) new_data2_addr; |
484 | 683 |
26749
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
684 int n, nn; |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
685 int old_bss_index, old_sbss_index; |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
686 int old_data_index, new_data2_index; |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
687 int old_mdebug_index; |
484 | 688 struct stat stat_buf; |
40869
300eaca41c49
(unexec): Use mmap/munmap to allocate buffers
Gerd Moellmann <gerd@gnu.org>
parents:
40750
diff
changeset
|
689 int old_file_size; |
484 | 690 |
40742
5374777dd618
(unexec): mmap() has problems on nfs-mounted file
Eli Zaretskii <eliz@gnu.org>
parents:
31905
diff
changeset
|
691 /* Open the old file, allocate a buffer of the right size, and read |
40750
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
692 in the file contents. */ |
484 | 693 |
694 old_file = open (old_name, O_RDONLY); | |
695 | |
696 if (old_file < 0) | |
697 fatal ("Can't open %s for reading: errno %d\n", old_name, errno); | |
698 | |
699 if (fstat (old_file, &stat_buf) == -1) | |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
700 fatal ("Can't fstat (%s): errno %d\n", old_name, errno); |
484 | 701 |
41279
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
702 #if MAP_ANON == 0 |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
703 mmap_fd = open ("/dev/zero", O_RDONLY); |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
704 if (mmap_fd < 0) |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
705 fatal ("Can't open /dev/zero for reading: errno %d\n", errno); |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
706 #endif |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
707 |
40869
300eaca41c49
(unexec): Use mmap/munmap to allocate buffers
Gerd Moellmann <gerd@gnu.org>
parents:
40750
diff
changeset
|
708 /* We cannot use malloc here because that may use sbrk. If it does, |
300eaca41c49
(unexec): Use mmap/munmap to allocate buffers
Gerd Moellmann <gerd@gnu.org>
parents:
40750
diff
changeset
|
709 we'd dump our temporary buffers with Emacs, and we'd have to be |
300eaca41c49
(unexec): Use mmap/munmap to allocate buffers
Gerd Moellmann <gerd@gnu.org>
parents:
40750
diff
changeset
|
710 extra careful to use the correct value of sbrk(0) after |
300eaca41c49
(unexec): Use mmap/munmap to allocate buffers
Gerd Moellmann <gerd@gnu.org>
parents:
40750
diff
changeset
|
711 allocating all buffers in the code below, which we aren't. */ |
300eaca41c49
(unexec): Use mmap/munmap to allocate buffers
Gerd Moellmann <gerd@gnu.org>
parents:
40750
diff
changeset
|
712 old_file_size = stat_buf.st_size; |
300eaca41c49
(unexec): Use mmap/munmap to allocate buffers
Gerd Moellmann <gerd@gnu.org>
parents:
40750
diff
changeset
|
713 old_base = mmap (NULL, old_file_size, PROT_READ | PROT_WRITE, |
41279
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
714 MAP_ANON | MAP_PRIVATE, mmap_fd, 0); |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
715 if (old_base == MAP_FAILED) |
40742
5374777dd618
(unexec): mmap() has problems on nfs-mounted file
Eli Zaretskii <eliz@gnu.org>
parents:
31905
diff
changeset
|
716 fatal ("Can't allocate buffer for %s\n", old_name); |
484 | 717 |
40742
5374777dd618
(unexec): mmap() has problems on nfs-mounted file
Eli Zaretskii <eliz@gnu.org>
parents:
31905
diff
changeset
|
718 if (read (old_file, old_base, stat_buf.st_size) != stat_buf.st_size) |
5374777dd618
(unexec): mmap() has problems on nfs-mounted file
Eli Zaretskii <eliz@gnu.org>
parents:
31905
diff
changeset
|
719 fatal ("Didn't read all of %s: errno %d\n", old_name, errno); |
5374777dd618
(unexec): mmap() has problems on nfs-mounted file
Eli Zaretskii <eliz@gnu.org>
parents:
31905
diff
changeset
|
720 |
484 | 721 /* Get pointers to headers & section names */ |
722 | |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
723 old_file_h = (ElfW(Ehdr) *) old_base; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
724 old_program_h = (ElfW(Phdr) *) ((byte *) old_base + old_file_h->e_phoff); |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
725 old_section_h = (ElfW(Shdr) *) ((byte *) old_base + old_file_h->e_shoff); |
484 | 726 old_section_names = (char *) old_base |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
727 + OLD_SECTION_H (old_file_h->e_shstrndx).sh_offset; |
484 | 728 |
26749
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
729 /* Find the mdebug section, if any. */ |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
730 |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
731 old_mdebug_index = find_section (".mdebug", old_section_names, |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
732 old_name, old_file_h, old_section_h, 1); |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
733 |
484 | 734 /* Find the old .bss section. Figure out parameters of the new |
40750
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
735 data2 and bss sections. */ |
484 | 736 |
26749
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
737 old_bss_index = find_section (".bss", old_section_names, |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
738 old_name, old_file_h, old_section_h, 0); |
484 | 739 |
26749
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
740 old_sbss_index = find_section (".sbss", old_section_names, |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
741 old_name, old_file_h, old_section_h, 1); |
28121 | 742 if (old_sbss_index != -1) |
743 if (OLD_SECTION_H (old_sbss_index).sh_type == SHT_PROGBITS) | |
744 old_sbss_index = -1; | |
26749
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
745 |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
746 if (old_sbss_index == -1) |
18474
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
747 { |
26749
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
748 old_bss_addr = OLD_SECTION_H (old_bss_index).sh_addr; |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
749 old_bss_size = OLD_SECTION_H (old_bss_index).sh_size; |
18474
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
750 new_data2_index = old_bss_index; |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
751 } |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
752 else |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
753 { |
26749
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
754 old_bss_addr = OLD_SECTION_H (old_sbss_index).sh_addr; |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
755 old_bss_size = OLD_SECTION_H (old_bss_index).sh_size |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
756 + OLD_SECTION_H (old_sbss_index).sh_size; |
18474
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
757 new_data2_index = old_sbss_index; |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
758 } |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
759 |
26749
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
760 /* Find the old .data section. Figure out parameters of |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
761 the new data2 and bss sections. */ |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
762 |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
763 old_data_index = find_section (".data", old_section_names, |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
764 old_name, old_file_h, old_section_h, 0); |
25398
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
765 |
19776
6910bd6de0d9
Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents:
19201
diff
changeset
|
766 #if defined (emacs) || !defined (DEBUG) |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
767 new_bss_addr = (ElfW(Addr)) sbrk (0); |
484 | 768 #else |
769 new_bss_addr = old_bss_addr + old_bss_size + 0x1234; | |
770 #endif | |
771 new_data2_addr = old_bss_addr; | |
772 new_data2_size = new_bss_addr - old_bss_addr; | |
26749
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
773 new_data2_offset = OLD_SECTION_H (old_data_index).sh_offset + |
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
774 (new_data2_addr - OLD_SECTION_H (old_data_index).sh_addr); |
484 | 775 |
776 #ifdef DEBUG | |
777 fprintf (stderr, "old_bss_index %d\n", old_bss_index); | |
15719 | 778 fprintf (stderr, "old_bss_addr %x\n", old_bss_addr); |
779 fprintf (stderr, "old_bss_size %x\n", old_bss_size); | |
780 fprintf (stderr, "new_bss_addr %x\n", new_bss_addr); | |
781 fprintf (stderr, "new_data2_addr %x\n", new_data2_addr); | |
782 fprintf (stderr, "new_data2_size %x\n", new_data2_size); | |
783 fprintf (stderr, "new_data2_offset %x\n", new_data2_offset); | |
484 | 784 #endif |
785 | |
15719 | 786 if ((unsigned) new_bss_addr < (unsigned) old_bss_addr + old_bss_size) |
484 | 787 fatal (".bss shrank when undumping???\n", 0, 0); |
788 | |
40742
5374777dd618
(unexec): mmap() has problems on nfs-mounted file
Eli Zaretskii <eliz@gnu.org>
parents:
31905
diff
changeset
|
789 /* Set the output file to the right size. Allocate a buffer to hold |
40750
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
790 the image of the new file. Set pointers to various interesting |
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
791 objects. stat_buf still has old_file data. */ |
484 | 792 |
793 new_file = open (new_name, O_RDWR | O_CREAT, 0666); | |
794 if (new_file < 0) | |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
795 fatal ("Can't creat (%s): errno %d\n", new_name, errno); |
484 | 796 |
797 new_file_size = stat_buf.st_size + old_file_h->e_shentsize + new_data2_size; | |
798 | |
799 if (ftruncate (new_file, new_file_size)) | |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
800 fatal ("Can't ftruncate (%s): errno %d\n", new_name, errno); |
484 | 801 |
40869
300eaca41c49
(unexec): Use mmap/munmap to allocate buffers
Gerd Moellmann <gerd@gnu.org>
parents:
40750
diff
changeset
|
802 new_base = mmap (NULL, new_file_size, PROT_READ | PROT_WRITE, |
41279
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
803 MAP_ANON | MAP_PRIVATE, mmap_fd, 0); |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
804 if (new_base == MAP_FAILED) |
40742
5374777dd618
(unexec): mmap() has problems on nfs-mounted file
Eli Zaretskii <eliz@gnu.org>
parents:
31905
diff
changeset
|
805 fatal ("Can't allocate buffer for %s\n", old_name); |
5374777dd618
(unexec): mmap() has problems on nfs-mounted file
Eli Zaretskii <eliz@gnu.org>
parents:
31905
diff
changeset
|
806 |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
807 new_file_h = (ElfW(Ehdr) *) new_base; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
808 new_program_h = (ElfW(Phdr) *) ((byte *) new_base + old_file_h->e_phoff); |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
809 new_section_h = (ElfW(Shdr) *) |
484 | 810 ((byte *) new_base + old_file_h->e_shoff + new_data2_size); |
811 | |
812 /* Make our new file, program and section headers as copies of the | |
40750
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
813 originals. */ |
484 | 814 |
815 memcpy (new_file_h, old_file_h, old_file_h->e_ehsize); | |
816 memcpy (new_program_h, old_program_h, | |
817 old_file_h->e_phnum * old_file_h->e_phentsize); | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
818 |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
819 /* Modify the e_shstrndx if necessary. */ |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
820 PATCH_INDEX (new_file_h->e_shstrndx); |
484 | 821 |
822 /* Fix up file header. We'll add one section. Section header is | |
40750
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
823 further away now. */ |
484 | 824 |
825 new_file_h->e_shoff += new_data2_size; | |
826 new_file_h->e_shnum += 1; | |
827 | |
828 #ifdef DEBUG | |
15719 | 829 fprintf (stderr, "Old section offset %x\n", old_file_h->e_shoff); |
484 | 830 fprintf (stderr, "Old section count %d\n", old_file_h->e_shnum); |
15719 | 831 fprintf (stderr, "New section offset %x\n", new_file_h->e_shoff); |
484 | 832 fprintf (stderr, "New section count %d\n", new_file_h->e_shnum); |
833 #endif | |
834 | |
835 /* Fix up a new program header. Extend the writable data segment so | |
40750
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
836 that the bss area is covered too. Find that segment by looking |
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
837 for a segment that ends just before the .bss area. Make sure |
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
838 that no segments are above the new .data2. Put a loop at the end |
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
839 to adjust the offset and address of any segment that is above |
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
840 data2, just in case we decide to allow this later. */ |
484 | 841 |
842 for (n = new_file_h->e_phnum - 1; n >= 0; n--) | |
843 { | |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
844 /* Compute maximum of all requirements for alignment of section. */ |
25398
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
845 ElfW(Word) alignment = (NEW_PROGRAM_H (n)).p_align; |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
846 if ((OLD_SECTION_H (old_bss_index)).sh_addralign > alignment) |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
847 alignment = OLD_SECTION_H (old_bss_index).sh_addralign; |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
848 |
26749
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
849 #ifdef __sgi |
25398
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
850 /* According to r02kar@x4u2.desy.de (Karsten Kuenne) |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
851 and oliva@gnu.org (Alexandre Oliva), on IRIX 5.2, we |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
852 always get "Program segment above .bss" when dumping |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
853 when the executable doesn't have an sbss section. */ |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
854 if (old_sbss_index != -1) |
26749
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
855 #endif /* __sgi */ |
18474
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
856 if (NEW_PROGRAM_H (n).p_vaddr + NEW_PROGRAM_H (n).p_filesz |
25398
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
857 > (old_sbss_index == -1 |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
858 ? old_bss_addr |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
859 : round_up (old_bss_addr, alignment))) |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
860 fatal ("Program segment above .bss in %s\n", old_name, 0); |
484 | 861 |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
862 if (NEW_PROGRAM_H (n).p_type == PT_LOAD |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
863 && (round_up ((NEW_PROGRAM_H (n)).p_vaddr |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
864 + (NEW_PROGRAM_H (n)).p_filesz, |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
865 alignment) |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
866 == round_up (old_bss_addr, alignment))) |
484 | 867 break; |
868 } | |
869 if (n < 0) | |
870 fatal ("Couldn't find segment next to .bss in %s\n", old_name, 0); | |
871 | |
21382
9c3fc93e7957
(unexec): Account for possible padding before the old .bss
Andreas Schwab <schwab@suse.de>
parents:
20026
diff
changeset
|
872 /* Make sure that the size includes any padding before the old .bss |
9c3fc93e7957
(unexec): Account for possible padding before the old .bss
Andreas Schwab <schwab@suse.de>
parents:
20026
diff
changeset
|
873 section. */ |
9c3fc93e7957
(unexec): Account for possible padding before the old .bss
Andreas Schwab <schwab@suse.de>
parents:
20026
diff
changeset
|
874 NEW_PROGRAM_H (n).p_filesz = new_bss_addr - NEW_PROGRAM_H (n).p_vaddr; |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
875 NEW_PROGRAM_H (n).p_memsz = NEW_PROGRAM_H (n).p_filesz; |
484 | 876 |
877 #if 0 /* Maybe allow section after data2 - does this ever happen? */ | |
878 for (n = new_file_h->e_phnum - 1; n >= 0; n--) | |
879 { | |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
880 if (NEW_PROGRAM_H (n).p_vaddr |
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
881 && NEW_PROGRAM_H (n).p_vaddr >= new_data2_addr) |
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
882 NEW_PROGRAM_H (n).p_vaddr += new_data2_size - old_bss_size; |
484 | 883 |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
884 if (NEW_PROGRAM_H (n).p_offset >= new_data2_offset) |
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
885 NEW_PROGRAM_H (n).p_offset += new_data2_size; |
484 | 886 } |
887 #endif | |
888 | |
889 /* Fix up section headers based on new .data2 section. Any section | |
40750
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
890 whose offset or virtual address is after the new .data2 section |
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
891 gets its value adjusted. .bss size becomes zero and new address |
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
892 is set. data2 section header gets added by copying the existing |
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
893 .data header and modifying the offset, address and size. */ |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
894 for (old_data_index = 1; old_data_index < (int) old_file_h->e_shnum; |
484 | 895 old_data_index++) |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
896 if (!strcmp (old_section_names + OLD_SECTION_H (old_data_index).sh_name, |
484 | 897 ".data")) |
898 break; | |
899 if (old_data_index == old_file_h->e_shnum) | |
900 fatal ("Can't find .data in %s.\n", old_name, 0); | |
901 | |
14251
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
902 /* Walk through all section headers, insert the new data2 section right |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
903 before the new bss section. */ |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
904 for (n = 1, nn = 1; n < (int) old_file_h->e_shnum; n++, nn++) |
484 | 905 { |
906 caddr_t src; | |
18474
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
907 /* If it is (s)bss section, insert the new data2 section before it. */ |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
908 /* new_data2_index is the index of either old_sbss or old_bss, that was |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
909 chosen as a section for new_data2. */ |
25398
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
910 if (n == new_data2_index) |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
911 { |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
912 /* Steal the data section header for this data2 section. */ |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
913 memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (old_data_index), |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
914 new_file_h->e_shentsize); |
14251
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
915 |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
916 NEW_SECTION_H (nn).sh_addr = new_data2_addr; |
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
917 NEW_SECTION_H (nn).sh_offset = new_data2_offset; |
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
918 NEW_SECTION_H (nn).sh_size = new_data2_size; |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
919 /* Use the bss section's alignment. This will assure that the |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
920 new data2 section always be placed in the same spot as the old |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
921 bss section by any other application. */ |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
922 NEW_SECTION_H (nn).sh_addralign = OLD_SECTION_H (n).sh_addralign; |
484 | 923 |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
924 /* Now copy over what we have in the memory now. */ |
14251
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
925 memcpy (NEW_SECTION_H (nn).sh_offset + new_base, |
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
926 (caddr_t) OLD_SECTION_H (n).sh_addr, |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
927 new_data2_size); |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
928 nn++; |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
929 } |
14251
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
930 |
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
931 memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (n), |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
932 old_file_h->e_shentsize); |
48592 | 933 |
18474
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
934 if (n == old_bss_index |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
935 /* The new bss and sbss section's size is zero, and its file offset |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
936 and virtual address should be off by NEW_DATA2_SIZE. */ |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
937 || n == old_sbss_index |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
938 ) |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
939 { |
25398
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
940 /* NN should be `old_s?bss_index + 1' at this point. */ |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
941 NEW_SECTION_H (nn).sh_offset = |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
942 NEW_SECTION_H (new_data2_index).sh_offset + new_data2_size; |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
943 NEW_SECTION_H (nn).sh_addr = |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
944 NEW_SECTION_H (new_data2_index).sh_addr + new_data2_size; |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
945 /* Let the new bss section address alignment be the same as the |
14251
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
946 section address alignment followed the old bss section, so |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
947 this section will be placed in exactly the same place. */ |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
948 NEW_SECTION_H (nn).sh_addralign = OLD_SECTION_H (nn).sh_addralign; |
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
949 NEW_SECTION_H (nn).sh_size = 0; |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
950 } |
10995
842974f9ab7d
(unexec): Adjust the file offset of sections located
Richard M. Stallman <rms@gnu.org>
parents:
9502
diff
changeset
|
951 else |
842974f9ab7d
(unexec): Adjust the file offset of sections located
Richard M. Stallman <rms@gnu.org>
parents:
9502
diff
changeset
|
952 { |
842974f9ab7d
(unexec): Adjust the file offset of sections located
Richard M. Stallman <rms@gnu.org>
parents:
9502
diff
changeset
|
953 /* Any section that was original placed AFTER the bss |
842974f9ab7d
(unexec): Adjust the file offset of sections located
Richard M. Stallman <rms@gnu.org>
parents:
9502
diff
changeset
|
954 section should now be off by NEW_DATA2_SIZE. */ |
15073
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
955 #ifdef SOLARIS_POWERPC |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
956 /* On PPC Reference Platform running Solaris 2.5.1 |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
957 the plt section is also of type NOBI like the bss section. |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
958 (not really stored) and therefore sections after the bss |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
959 section start at the plt offset. The plt section is always |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
960 the one just before the bss section. |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
961 It would be better to put the new data section before |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
962 the .plt section, or use libelf instead. |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
963 Erik Deumens, deumens@qtp.ufl.edu. */ |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
964 if (NEW_SECTION_H (nn).sh_offset |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
965 >= OLD_SECTION_H (old_bss_index-1).sh_offset) |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
966 NEW_SECTION_H (nn).sh_offset += new_data2_size; |
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
967 #else |
26749
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
968 if (round_up (NEW_SECTION_H (nn).sh_offset, |
15504
a01d40110af0
(unexec): Round up section header offset to bss alignment
Richard M. Stallman <rms@gnu.org>
parents:
15073
diff
changeset
|
969 OLD_SECTION_H (old_bss_index).sh_addralign) |
26749
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
970 >= new_data2_offset) |
10995
842974f9ab7d
(unexec): Adjust the file offset of sections located
Richard M. Stallman <rms@gnu.org>
parents:
9502
diff
changeset
|
971 NEW_SECTION_H (nn).sh_offset += new_data2_size; |
15073
e98682eae98b
(unexec): Add conditional for SOLARIS_POWERPC.
Richard M. Stallman <rms@gnu.org>
parents:
14593
diff
changeset
|
972 #endif |
10995
842974f9ab7d
(unexec): Adjust the file offset of sections located
Richard M. Stallman <rms@gnu.org>
parents:
9502
diff
changeset
|
973 /* Any section that was originally placed after the section |
842974f9ab7d
(unexec): Adjust the file offset of sections located
Richard M. Stallman <rms@gnu.org>
parents:
9502
diff
changeset
|
974 header table should now be off by the size of one section |
842974f9ab7d
(unexec): Adjust the file offset of sections located
Richard M. Stallman <rms@gnu.org>
parents:
9502
diff
changeset
|
975 header table entry. */ |
842974f9ab7d
(unexec): Adjust the file offset of sections located
Richard M. Stallman <rms@gnu.org>
parents:
9502
diff
changeset
|
976 if (NEW_SECTION_H (nn).sh_offset > new_file_h->e_shoff) |
842974f9ab7d
(unexec): Adjust the file offset of sections located
Richard M. Stallman <rms@gnu.org>
parents:
9502
diff
changeset
|
977 NEW_SECTION_H (nn).sh_offset += new_file_h->e_shentsize; |
842974f9ab7d
(unexec): Adjust the file offset of sections located
Richard M. Stallman <rms@gnu.org>
parents:
9502
diff
changeset
|
978 } |
842974f9ab7d
(unexec): Adjust the file offset of sections located
Richard M. Stallman <rms@gnu.org>
parents:
9502
diff
changeset
|
979 |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
980 /* If any section hdr refers to the section after the new .data |
14251
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
981 section, make it refer to next one because we have inserted |
8595
099f80df77bf
(unexec): Don't alter the info field of SHT_SYMTAB and SHT_DYNSYM sections.
Richard M. Stallman <rms@gnu.org>
parents:
8574
diff
changeset
|
982 a new section in between. */ |
14251
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
983 |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
984 PATCH_INDEX (NEW_SECTION_H (nn).sh_link); |
8595
099f80df77bf
(unexec): Don't alter the info field of SHT_SYMTAB and SHT_DYNSYM sections.
Richard M. Stallman <rms@gnu.org>
parents:
8574
diff
changeset
|
985 /* For symbol tables, info is a symbol table index, |
099f80df77bf
(unexec): Don't alter the info field of SHT_SYMTAB and SHT_DYNSYM sections.
Richard M. Stallman <rms@gnu.org>
parents:
8574
diff
changeset
|
986 so don't change it. */ |
099f80df77bf
(unexec): Don't alter the info field of SHT_SYMTAB and SHT_DYNSYM sections.
Richard M. Stallman <rms@gnu.org>
parents:
8574
diff
changeset
|
987 if (NEW_SECTION_H (nn).sh_type != SHT_SYMTAB |
099f80df77bf
(unexec): Don't alter the info field of SHT_SYMTAB and SHT_DYNSYM sections.
Richard M. Stallman <rms@gnu.org>
parents:
8574
diff
changeset
|
988 && NEW_SECTION_H (nn).sh_type != SHT_DYNSYM) |
099f80df77bf
(unexec): Don't alter the info field of SHT_SYMTAB and SHT_DYNSYM sections.
Richard M. Stallman <rms@gnu.org>
parents:
8574
diff
changeset
|
989 PATCH_INDEX (NEW_SECTION_H (nn).sh_info); |
48592 | 990 |
28121 | 991 if (old_sbss_index != -1) |
992 if (!strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".sbss")) | |
993 { | |
48592 | 994 NEW_SECTION_H (nn).sh_offset = |
28121 | 995 round_up (NEW_SECTION_H (nn).sh_offset, |
996 NEW_SECTION_H (nn).sh_addralign); | |
997 NEW_SECTION_H (nn).sh_type = SHT_PROGBITS; | |
998 } | |
8595
099f80df77bf
(unexec): Don't alter the info field of SHT_SYMTAB and SHT_DYNSYM sections.
Richard M. Stallman <rms@gnu.org>
parents:
8574
diff
changeset
|
999 |
099f80df77bf
(unexec): Don't alter the info field of SHT_SYMTAB and SHT_DYNSYM sections.
Richard M. Stallman <rms@gnu.org>
parents:
8574
diff
changeset
|
1000 /* Now, start to copy the content of sections. */ |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
1001 if (NEW_SECTION_H (nn).sh_type == SHT_NULL |
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
1002 || NEW_SECTION_H (nn).sh_type == SHT_NOBITS) |
484 | 1003 continue; |
14251
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
1004 |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
1005 /* Write out the sections. .data and .data1 (and data2, called |
8595
099f80df77bf
(unexec): Don't alter the info field of SHT_SYMTAB and SHT_DYNSYM sections.
Richard M. Stallman <rms@gnu.org>
parents:
8574
diff
changeset
|
1006 ".data" in the strings table) get copied from the current process |
099f80df77bf
(unexec): Don't alter the info field of SHT_SYMTAB and SHT_DYNSYM sections.
Richard M. Stallman <rms@gnu.org>
parents:
8574
diff
changeset
|
1007 instead of the old file. */ |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
1008 if (!strcmp (old_section_names + NEW_SECTION_H (n).sh_name, ".data") |
18474
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1009 || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name), |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1010 ".sdata") |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1011 || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name), |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1012 ".lit4") |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1013 || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name), |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1014 ".lit8") |
47789
d43916bc2d4f
Redo 9/16 change, but only if IRIX6_5.
Richard M. Stallman <rms@gnu.org>
parents:
47525
diff
changeset
|
1015 /* The conditional bit below was in Oliva's original code |
d43916bc2d4f
Redo 9/16 change, but only if IRIX6_5.
Richard M. Stallman <rms@gnu.org>
parents:
47525
diff
changeset
|
1016 (1999-08-25) and seems to have been dropped by mistake |
d43916bc2d4f
Redo 9/16 change, but only if IRIX6_5.
Richard M. Stallman <rms@gnu.org>
parents:
47525
diff
changeset
|
1017 subsequently. It prevents a crash at startup under X in |
48592 | 1018 `IRIX64 6.5 6.5.17m', whether compiled on that relase or |
1019 an earlier one. It causes no trouble on the other ELF | |
1020 platforms I could test (Irix 6.5.15m, Solaris 8, Debian | |
1021 Potato x86, Debian Woody SPARC); however, it's reported | |
1022 to cause crashes under some version of GNU/Linux. It's | |
1023 not yet clear what's changed in that Irix version to | |
1024 cause the problem, or why the fix sometimes fails under | |
1025 GNU/Linux. There's probably no good reason to have | |
1026 something Irix-specific here, but this will have to do | |
1027 for now. IRIX6_5 is the most specific macro we have to | |
1028 test. -- fx 2002-10-01 | |
1029 | |
1030 The issue _looks_ as though it's gone away on 6.5.18m, | |
1031 but maybe it's still lurking, to be triggered by some | |
1032 change in the binary. It appears to concern the dynamic | |
1033 loader, but I never got anywhere with an SGI support call | |
1034 seeking clues. -- fx 2002-11-29. */ | |
47789
d43916bc2d4f
Redo 9/16 change, but only if IRIX6_5.
Richard M. Stallman <rms@gnu.org>
parents:
47525
diff
changeset
|
1035 #ifdef IRIX6_5 |
d43916bc2d4f
Redo 9/16 change, but only if IRIX6_5.
Richard M. Stallman <rms@gnu.org>
parents:
47525
diff
changeset
|
1036 || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name), |
d43916bc2d4f
Redo 9/16 change, but only if IRIX6_5.
Richard M. Stallman <rms@gnu.org>
parents:
47525
diff
changeset
|
1037 ".got") |
d43916bc2d4f
Redo 9/16 change, but only if IRIX6_5.
Richard M. Stallman <rms@gnu.org>
parents:
47525
diff
changeset
|
1038 #endif |
25398
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1039 || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name), |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1040 ".sdata1") |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
1041 || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name), |
28121 | 1042 ".data1") |
41529
370b4ba3f429
(unexec): Index by n, not nn, when checking for ".sbss".
Richard M. Stallman <rms@gnu.org>
parents:
41279
diff
changeset
|
1043 || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name), |
28121 | 1044 ".sbss")) |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
1045 src = (caddr_t) OLD_SECTION_H (n).sh_addr; |
484 | 1046 else |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
1047 src = old_base + OLD_SECTION_H (n).sh_offset; |
14251
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
1048 |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
1049 memcpy (NEW_SECTION_H (nn).sh_offset + new_base, src, |
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
1050 NEW_SECTION_H (nn).sh_size); |
484 | 1051 |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1052 #ifdef __alpha__ |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1053 /* Update Alpha COFF symbol table: */ |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1054 if (strcmp (old_section_names + OLD_SECTION_H (n).sh_name, ".mdebug") |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1055 == 0) |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1056 { |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1057 pHDRR symhdr = (pHDRR) (NEW_SECTION_H (nn).sh_offset + new_base); |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1058 |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1059 symhdr->cbLineOffset += new_data2_size; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1060 symhdr->cbDnOffset += new_data2_size; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1061 symhdr->cbPdOffset += new_data2_size; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1062 symhdr->cbSymOffset += new_data2_size; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1063 symhdr->cbOptOffset += new_data2_size; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1064 symhdr->cbAuxOffset += new_data2_size; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1065 symhdr->cbSsOffset += new_data2_size; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1066 symhdr->cbSsExtOffset += new_data2_size; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1067 symhdr->cbFdOffset += new_data2_size; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1068 symhdr->cbRfdOffset += new_data2_size; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1069 symhdr->cbExtOffset += new_data2_size; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1070 } |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1071 #endif /* __alpha__ */ |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1072 |
18474
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1073 #if defined (__sony_news) && defined (_SYSTYPE_SYSV) |
26749
5bc04426fb75
Include <syms.h>, not <sym.h> on IRIX. Removed
Gerd Moellmann <gerd@gnu.org>
parents:
26088
diff
changeset
|
1074 if (NEW_SECTION_H (nn).sh_type == SHT_MIPS_DEBUG |
48592 | 1075 && old_mdebug_index != -1) |
18474
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1076 { |
48592 | 1077 int diff = NEW_SECTION_H(nn).sh_offset |
18474
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1078 - OLD_SECTION_H(old_mdebug_index).sh_offset; |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1079 HDRR *phdr = (HDRR *)(NEW_SECTION_H (nn).sh_offset + new_base); |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1080 |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1081 if (diff) |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1082 { |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1083 phdr->cbLineOffset += diff; |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1084 phdr->cbDnOffset += diff; |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1085 phdr->cbPdOffset += diff; |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1086 phdr->cbSymOffset += diff; |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1087 phdr->cbOptOffset += diff; |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1088 phdr->cbAuxOffset += diff; |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1089 phdr->cbSsOffset += diff; |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1090 phdr->cbSsExtOffset += diff; |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1091 phdr->cbFdOffset += diff; |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1092 phdr->cbRfdOffset += diff; |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1093 phdr->cbExtOffset += diff; |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1094 } |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1095 } |
c21ad324c249
[__sony_news && _SYSTYPE_SYSV]: Include sym.h and sys/elf_mips.h.
Richard M. Stallman <rms@gnu.org>
parents:
16120
diff
changeset
|
1096 #endif /* __sony_news && _SYSTYPE_SYSV */ |
25398
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1097 |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1098 #if __sgi |
48592 | 1099 /* Adjust the HDRR offsets in .mdebug and copy the |
25398
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1100 line data if it's in its usual 'hole' in the object. |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1101 Makes the new file debuggable with dbx. |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1102 patches up two problems: the absolute file offsets |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1103 in the HDRR record of .mdebug (see /usr/include/syms.h), and |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1104 the ld bug that gets the line table in a hole in the |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1105 elf file rather than in the .mdebug section proper. |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1106 David Anderson. davea@sgi.com Jan 16,1994. */ |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1107 if (n == old_mdebug_index) |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1108 { |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1109 #define MDEBUGADJUST(__ct,__fileaddr) \ |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1110 if (n_phdrr->__ct > 0) \ |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1111 { \ |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1112 n_phdrr->__fileaddr += movement; \ |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1113 } |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1114 |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1115 HDRR * o_phdrr = (HDRR *)((byte *)old_base + OLD_SECTION_H (n).sh_offset); |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1116 HDRR * n_phdrr = (HDRR *)((byte *)new_base + NEW_SECTION_H (nn).sh_offset); |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1117 unsigned movement = new_data2_size; |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1118 |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1119 MDEBUGADJUST (idnMax, cbDnOffset); |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1120 MDEBUGADJUST (ipdMax, cbPdOffset); |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1121 MDEBUGADJUST (isymMax, cbSymOffset); |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1122 MDEBUGADJUST (ioptMax, cbOptOffset); |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1123 MDEBUGADJUST (iauxMax, cbAuxOffset); |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1124 MDEBUGADJUST (issMax, cbSsOffset); |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1125 MDEBUGADJUST (issExtMax, cbSsExtOffset); |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1126 MDEBUGADJUST (ifdMax, cbFdOffset); |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1127 MDEBUGADJUST (crfd, cbRfdOffset); |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1128 MDEBUGADJUST (iextMax, cbExtOffset); |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1129 /* The Line Section, being possible off in a hole of the object, |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1130 requires special handling. */ |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1131 if (n_phdrr->cbLine > 0) |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1132 { |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1133 if (o_phdrr->cbLineOffset > (OLD_SECTION_H (n).sh_offset |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1134 + OLD_SECTION_H (n).sh_size)) |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1135 { |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1136 /* line data is in a hole in elf. do special copy and adjust |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1137 for this ld mistake. |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1138 */ |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1139 n_phdrr->cbLineOffset += movement; |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1140 |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1141 memcpy (n_phdrr->cbLineOffset + new_base, |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1142 o_phdrr->cbLineOffset + old_base, n_phdrr->cbLine); |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1143 } |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1144 else |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1145 { |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1146 /* somehow line data is in .mdebug as it is supposed to be. */ |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1147 MDEBUGADJUST (cbLine, cbLineOffset); |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1148 } |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1149 } |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1150 } |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1151 #endif /* __sgi */ |
4b8cf5270829
Merge IRIX debugging info patch from unexsgi.c
Karl Heuer <kwzh@gnu.org>
parents:
25233
diff
changeset
|
1152 |
8595
099f80df77bf
(unexec): Don't alter the info field of SHT_SYMTAB and SHT_DYNSYM sections.
Richard M. Stallman <rms@gnu.org>
parents:
8574
diff
changeset
|
1153 /* If it is the symbol table, its st_shndx field needs to be patched. */ |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
1154 if (NEW_SECTION_H (nn).sh_type == SHT_SYMTAB |
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
1155 || NEW_SECTION_H (nn).sh_type == SHT_DYNSYM) |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
1156 { |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1157 ElfW(Shdr) *spt = &NEW_SECTION_H (nn); |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
1158 unsigned int num = spt->sh_size / spt->sh_entsize; |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1159 ElfW(Sym) * sym = (ElfW(Sym) *) (NEW_SECTION_H (nn).sh_offset + |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
1160 new_base); |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
1161 for (; num--; sym++) |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
1162 { |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
1163 if ((sym->st_shndx == SHN_UNDEF) |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
1164 || (sym->st_shndx == SHN_ABS) |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
1165 || (sym->st_shndx == SHN_COMMON)) |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
1166 continue; |
14251
9cacb2dd365c
(unexec): Undo data relocations unconditionally, not #ifdef SOLARIS2.
Roland McGrath <roland@gnu.org>
parents:
14186
diff
changeset
|
1167 |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
1168 PATCH_INDEX (sym->st_shndx); |
2005
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
1169 } |
9b80d7737d2b
(unexec): Move data2 section header up so all section
Richard M. Stallman <rms@gnu.org>
parents:
484
diff
changeset
|
1170 } |
484 | 1171 } |
1172 | |
8595
099f80df77bf
(unexec): Don't alter the info field of SHT_SYMTAB and SHT_DYNSYM sections.
Richard M. Stallman <rms@gnu.org>
parents:
8574
diff
changeset
|
1173 /* Update the symbol values of _edata and _end. */ |
8574
dd787a5353d1
Eliminate local var bss_end.
Richard M. Stallman <rms@gnu.org>
parents:
6052
diff
changeset
|
1174 for (n = new_file_h->e_shnum - 1; n; n--) |
dd787a5353d1
Eliminate local var bss_end.
Richard M. Stallman <rms@gnu.org>
parents:
6052
diff
changeset
|
1175 { |
dd787a5353d1
Eliminate local var bss_end.
Richard M. Stallman <rms@gnu.org>
parents:
6052
diff
changeset
|
1176 byte *symnames; |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1177 ElfW(Sym) *symp, *symendp; |
8574
dd787a5353d1
Eliminate local var bss_end.
Richard M. Stallman <rms@gnu.org>
parents:
6052
diff
changeset
|
1178 |
dd787a5353d1
Eliminate local var bss_end.
Richard M. Stallman <rms@gnu.org>
parents:
6052
diff
changeset
|
1179 if (NEW_SECTION_H (n).sh_type != SHT_DYNSYM |
dd787a5353d1
Eliminate local var bss_end.
Richard M. Stallman <rms@gnu.org>
parents:
6052
diff
changeset
|
1180 && NEW_SECTION_H (n).sh_type != SHT_SYMTAB) |
dd787a5353d1
Eliminate local var bss_end.
Richard M. Stallman <rms@gnu.org>
parents:
6052
diff
changeset
|
1181 continue; |
dd787a5353d1
Eliminate local var bss_end.
Richard M. Stallman <rms@gnu.org>
parents:
6052
diff
changeset
|
1182 |
11796 | 1183 symnames = ((byte *) new_base |
1184 + NEW_SECTION_H (NEW_SECTION_H (n).sh_link).sh_offset); | |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1185 symp = (ElfW(Sym) *) (NEW_SECTION_H (n).sh_offset + new_base); |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1186 symendp = (ElfW(Sym) *) ((byte *)symp + NEW_SECTION_H (n).sh_size); |
8574
dd787a5353d1
Eliminate local var bss_end.
Richard M. Stallman <rms@gnu.org>
parents:
6052
diff
changeset
|
1187 |
dd787a5353d1
Eliminate local var bss_end.
Richard M. Stallman <rms@gnu.org>
parents:
6052
diff
changeset
|
1188 for (; symp < symendp; symp ++) |
dd787a5353d1
Eliminate local var bss_end.
Richard M. Stallman <rms@gnu.org>
parents:
6052
diff
changeset
|
1189 if (strcmp ((char *) (symnames + symp->st_name), "_end") == 0 |
22975
0f032f45a525
(unexec): Check for section names end and edata with no underscore.
Richard M. Stallman <rms@gnu.org>
parents:
21859
diff
changeset
|
1190 || strcmp ((char *) (symnames + symp->st_name), "end") == 0 |
0f032f45a525
(unexec): Check for section names end and edata with no underscore.
Richard M. Stallman <rms@gnu.org>
parents:
21859
diff
changeset
|
1191 || strcmp ((char *) (symnames + symp->st_name), "_edata") == 0 |
0f032f45a525
(unexec): Check for section names end and edata with no underscore.
Richard M. Stallman <rms@gnu.org>
parents:
21859
diff
changeset
|
1192 || strcmp ((char *) (symnames + symp->st_name), "edata") == 0) |
8574
dd787a5353d1
Eliminate local var bss_end.
Richard M. Stallman <rms@gnu.org>
parents:
6052
diff
changeset
|
1193 memcpy (&symp->st_value, &new_bss_addr, sizeof (new_bss_addr)); |
dd787a5353d1
Eliminate local var bss_end.
Richard M. Stallman <rms@gnu.org>
parents:
6052
diff
changeset
|
1194 } |
dd787a5353d1
Eliminate local var bss_end.
Richard M. Stallman <rms@gnu.org>
parents:
6052
diff
changeset
|
1195 |
14054
103a1b22fcd8
(unexec) [SOLARIS2]: Undo relocations performed by the
Karl Heuer <kwzh@gnu.org>
parents:
11827
diff
changeset
|
1196 /* This loop seeks out relocation sections for the data section, so |
103a1b22fcd8
(unexec) [SOLARIS2]: Undo relocations performed by the
Karl Heuer <kwzh@gnu.org>
parents:
11827
diff
changeset
|
1197 that it can undo relocations performed by the runtime linker. */ |
103a1b22fcd8
(unexec) [SOLARIS2]: Undo relocations performed by the
Karl Heuer <kwzh@gnu.org>
parents:
11827
diff
changeset
|
1198 for (n = new_file_h->e_shnum - 1; n; n--) |
103a1b22fcd8
(unexec) [SOLARIS2]: Undo relocations performed by the
Karl Heuer <kwzh@gnu.org>
parents:
11827
diff
changeset
|
1199 { |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1200 ElfW(Shdr) section = NEW_SECTION_H (n); |
42908
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1201 |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1202 /* Cause a compilation error if anyone uses n instead of nn below. */ |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1203 struct {int a;} n; |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1204 |
48592 | 1205 switch (section.sh_type) |
42908
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1206 { |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1207 default: |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1208 break; |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1209 case SHT_REL: |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1210 case SHT_RELA: |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1211 /* This code handles two different size structs, but there should |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1212 be no harm in that provided that r_offset is always the first |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1213 member. */ |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1214 nn = section.sh_info; |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1215 if (!strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".data") |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1216 || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name), |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1217 ".sdata") |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1218 || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name), |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1219 ".lit4") |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1220 || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name), |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1221 ".lit8") |
47789
d43916bc2d4f
Redo 9/16 change, but only if IRIX6_5.
Richard M. Stallman <rms@gnu.org>
parents:
47525
diff
changeset
|
1222 #ifdef IRIX6_5 /* see above */ |
d43916bc2d4f
Redo 9/16 change, but only if IRIX6_5.
Richard M. Stallman <rms@gnu.org>
parents:
47525
diff
changeset
|
1223 || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name), |
d43916bc2d4f
Redo 9/16 change, but only if IRIX6_5.
Richard M. Stallman <rms@gnu.org>
parents:
47525
diff
changeset
|
1224 ".got") |
d43916bc2d4f
Redo 9/16 change, but only if IRIX6_5.
Richard M. Stallman <rms@gnu.org>
parents:
47525
diff
changeset
|
1225 #endif |
42908
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1226 || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name), |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1227 ".sdata1") |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1228 || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name), |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1229 ".data1")) |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1230 { |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1231 ElfW(Addr) offset = (NEW_SECTION_H (nn).sh_addr |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1232 - NEW_SECTION_H (nn).sh_offset); |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1233 caddr_t reloc = old_base + section.sh_offset, end; |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1234 for (end = reloc + section.sh_size; reloc < end; |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1235 reloc += section.sh_entsize) |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1236 { |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1237 ElfW(Addr) addr = ((ElfW(Rel) *) reloc)->r_offset - offset; |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1238 #ifdef __alpha__ |
42908
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1239 /* The Alpha ELF binutils currently have a bug that |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1240 sometimes results in relocs that contain all |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1241 zeroes. Work around this for now... */ |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1242 if (((ElfW(Rel) *) reloc)->r_offset == 0) |
16120
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1243 continue; |
2c15b1cd3b84
unexelf1.c merged into this file.
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
1244 #endif |
42908
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1245 memcpy (new_base + addr, old_base + addr, sizeof(ElfW(Addr))); |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1246 } |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1247 } |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1248 break; |
4223d39197ba
(unexec): Define n so as to cause compilation error
Richard M. Stallman <rms@gnu.org>
parents:
42858
diff
changeset
|
1249 } |
14054
103a1b22fcd8
(unexec) [SOLARIS2]: Undo relocations performed by the
Karl Heuer <kwzh@gnu.org>
parents:
11827
diff
changeset
|
1250 } |
103a1b22fcd8
(unexec) [SOLARIS2]: Undo relocations performed by the
Karl Heuer <kwzh@gnu.org>
parents:
11827
diff
changeset
|
1251 |
40750
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
1252 /* Write out new_file, and free the buffers. */ |
11827
16a95d5d252e
(unexec) [UNEXEC_USE_MAP_PRIVATE]: New logic for
Karl Heuer <kwzh@gnu.org>
parents:
11796
diff
changeset
|
1253 |
16a95d5d252e
(unexec) [UNEXEC_USE_MAP_PRIVATE]: New logic for
Karl Heuer <kwzh@gnu.org>
parents:
11796
diff
changeset
|
1254 if (write (new_file, new_base, new_file_size) != new_file_size) |
48592 | 1255 fatal ("Didn't write %d bytes to %s: errno %d\n", |
40742
5374777dd618
(unexec): mmap() has problems on nfs-mounted file
Eli Zaretskii <eliz@gnu.org>
parents:
31905
diff
changeset
|
1256 new_file_size, new_base, errno); |
11827
16a95d5d252e
(unexec) [UNEXEC_USE_MAP_PRIVATE]: New logic for
Karl Heuer <kwzh@gnu.org>
parents:
11796
diff
changeset
|
1257 |
40869
300eaca41c49
(unexec): Use mmap/munmap to allocate buffers
Gerd Moellmann <gerd@gnu.org>
parents:
40750
diff
changeset
|
1258 munmap (old_base, old_file_size); |
300eaca41c49
(unexec): Use mmap/munmap to allocate buffers
Gerd Moellmann <gerd@gnu.org>
parents:
40750
diff
changeset
|
1259 munmap (new_base, new_file_size); |
40742
5374777dd618
(unexec): mmap() has problems on nfs-mounted file
Eli Zaretskii <eliz@gnu.org>
parents:
31905
diff
changeset
|
1260 |
40750
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
1261 /* Close the files and make the new file executable. */ |
484 | 1262 |
41279
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
1263 #if MAP_ANON == 0 |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
1264 close (mmap_fd); |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
1265 #endif |
bc45052c83ae
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS if defined, 0 otherwise.
Sam Steingold <sds@gnu.org>
parents:
40871
diff
changeset
|
1266 |
484 | 1267 if (close (old_file)) |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
1268 fatal ("Can't close (%s): errno %d\n", old_name, errno); |
484 | 1269 |
40750
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
1270 if (close (new_file)) |
593d80fe8029
(unexec): Minor changes; clean up comments.
Richard M. Stallman <rms@gnu.org>
parents:
40742
diff
changeset
|
1271 fatal ("Can't close (%s): errno %d\n", new_name, errno); |
484 | 1272 |
1273 if (stat (new_name, &stat_buf) == -1) | |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
1274 fatal ("Can't stat (%s): errno %d\n", new_name, errno); |
484 | 1275 |
1276 n = umask (777); | |
1277 umask (n); | |
1278 stat_buf.st_mode |= 0111 & ~n; | |
1279 if (chmod (new_name, stat_buf.st_mode) == -1) | |
4505
348f6a32d9b5
(unexec): Add casts for some comparisons.
Richard M. Stallman <rms@gnu.org>
parents:
2005
diff
changeset
|
1280 fatal ("Can't chmod (%s): errno %d\n", new_name, errno); |
484 | 1281 } |