annotate src/unexalpha.c @ 33697:e7765cb122c3

(Fw32_set_clipboard_data): Save a copy of what is put on the clipboard. (Fw32_get_clipboard_data): Compare data on clipboard with saved copy of what Emacs last put there. If they are the same, do not use the clipboard copy to avoid losing data due to coding conversions.
author Jason Rumney <jasonr@gnu.org>
date Tue, 21 Nov 2000 19:18:13 +0000
parents d4a0bd8a25a3
children 435e087e5d76
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1 /* Unexec for DEC alpha. schoepf@sc.ZIB-Berlin.DE (Rainer Schoepf).
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2
29751
ea3c28a8be00 Include errno.h, string.h, unistd.h. Don't declare errno, strerror.
Dave Love <fx@gnu.org>
parents: 19775
diff changeset
3 Copyright (C) 1994, 2000 Free Software Foundation, Inc.
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5 This file is part of GNU Emacs.
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7 GNU Emacs is free software; you can redistribute it and/or modify
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8 it under the terms of the GNU General Public License as published by
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9 the Free Software Foundation; either version 2, or (at your option)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10 any later version.
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 GNU Emacs is distributed in the hope that it will be useful,
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15 GNU General Public License for more details.
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 along with GNU Emacs; see the file COPYING. If not, write to
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 13512
diff changeset
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 13512
diff changeset
20 Boston, MA 02111-1307, USA. */
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23 #include <config.h>
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24 #include <sys/types.h>
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25 #include <sys/file.h>
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26 #include <sys/stat.h>
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27 #include <sys/mman.h>
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
28 #include <stdio.h>
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29 #include <varargs.h>
29751
ea3c28a8be00 Include errno.h, string.h, unistd.h. Don't declare errno, strerror.
Dave Love <fx@gnu.org>
parents: 19775
diff changeset
30 #include <errno.h>
ea3c28a8be00 Include errno.h, string.h, unistd.h. Don't declare errno, strerror.
Dave Love <fx@gnu.org>
parents: 19775
diff changeset
31 #ifdef HAVE_STRING_H
ea3c28a8be00 Include errno.h, string.h, unistd.h. Don't declare errno, strerror.
Dave Love <fx@gnu.org>
parents: 19775
diff changeset
32 #include <string.h>
ea3c28a8be00 Include errno.h, string.h, unistd.h. Don't declare errno, strerror.
Dave Love <fx@gnu.org>
parents: 19775
diff changeset
33 #endif
19775
70b808126773 Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents: 19336
diff changeset
34 #if !defined (__NetBSD__) && !defined (__OpenBSD__)
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
35 #include <filehdr.h>
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36 #include <aouthdr.h>
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37 #include <scnhdr.h>
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38 #include <syms.h>
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
39 #ifndef __linux__
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
40 # include <reloc.h>
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
41 # include <elf_abi.h>
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
42 #endif
19775
70b808126773 Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents: 19336
diff changeset
43 #else /* __NetBSD__ or __OpenBSD__ */
18103
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
44 /*
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
45 * NetBSD/Alpha does not have 'normal' user-land ECOFF support because
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
46 * there's no desire to support ECOFF as the executable format in the
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
47 * long term.
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
48 */
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
49 #include <sys/exec_ecoff.h>
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
50
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
51 /* Structures, constants, etc., that NetBSD defines strangely. */
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
52 #define filehdr ecoff_filehdr
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
53 #define aouthdr ecoff_aouthdr
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
54 #define scnhdr ecoff_scnhdr
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
55 #define HDRR struct ecoff_symhdr
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
56 #define pHDRR HDRR *
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
57 #define cbHDRR sizeof(HDRR)
19775
70b808126773 Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents: 19336
diff changeset
58 #ifdef __OpenBSD__
70b808126773 Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents: 19336
diff changeset
59 #define ALPHAMAGIC ECOFF_MAGIC_NATIVE_ALPHA
70b808126773 Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents: 19336
diff changeset
60 #else
18103
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
61 #define ALPHAMAGIC ECOFF_MAGIC_NETBSD_ALPHA
19775
70b808126773 Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents: 19336
diff changeset
62 #endif
18103
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
63 #define ZMAGIC ECOFF_ZMAGIC
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
64
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
65 /* Misc. constants that NetBSD doesn't define at all. */
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
66 #define ALPHAUMAGIC 0617
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
67 #define _MIPS_NSCNS_MAX 35
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
68 #define STYP_TEXT 0x00000020
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
69 #define STYP_DATA 0x00000040
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
70 #define STYP_BSS 0x00000080
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
71 #define STYP_RDATA 0x00000100
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
72 #define STYP_SDATA 0x00000200
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
73 #define STYP_SBSS 0x00000400
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
74 #define STYP_INIT 0x80000000
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
75 #define _TEXT ".text"
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
76 #define _DATA ".data"
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
77 #define _BSS ".bss"
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
78 #define _INIT ".init"
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
79 #define _RDATA ".rdata"
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
80 #define _SDATA ".sdata"
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
81 #define _SBSS ".sbss"
19775
70b808126773 Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents: 19336
diff changeset
82 #endif /* __NetBSD__ || __OpenBSD__ */
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
83
30916
d4a0bd8a25a3 Prototype fatal_unexec, mark_x, update_dynamic_symbols. Declare
Dave Love <fx@gnu.org>
parents: 29751
diff changeset
84 static void fatal_unexec __P ((char *, char *));
d4a0bd8a25a3 Prototype fatal_unexec, mark_x, update_dynamic_symbols. Declare
Dave Love <fx@gnu.org>
parents: 29751
diff changeset
85 static void mark_x __P ((char *));
d4a0bd8a25a3 Prototype fatal_unexec, mark_x, update_dynamic_symbols. Declare
Dave Love <fx@gnu.org>
parents: 29751
diff changeset
86
d4a0bd8a25a3 Prototype fatal_unexec, mark_x, update_dynamic_symbols. Declare
Dave Love <fx@gnu.org>
parents: 29751
diff changeset
87 static void update_dynamic_symbols __P ((char *, char *, int, struct aouthdr));
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
88
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
89 #define READ(_fd, _buffer, _size, _error_message, _error_arg) \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
90 errno = EEOF; \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
91 if (read (_fd, _buffer, _size) != _size) \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
92 fatal_unexec (_error_message, _error_arg);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
93
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
94 #define WRITE(_fd, _buffer, _size, _error_message, _error_arg) \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
95 if (write (_fd, _buffer, _size) != _size) \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
96 fatal_unexec (_error_message, _error_arg);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
97
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
98 #define SEEK(_fd, _position, _error_message, _error_arg) \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
99 errno = EEOF; \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
100 if (lseek (_fd, _position, L_SET) != _position) \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
101 fatal_unexec (_error_message, _error_arg);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
102
29751
ea3c28a8be00 Include errno.h, string.h, unistd.h. Don't declare errno, strerror.
Dave Love <fx@gnu.org>
parents: 19775
diff changeset
103 #ifdef HAVE_UNISTD_H
ea3c28a8be00 Include errno.h, string.h, unistd.h. Don't declare errno, strerror.
Dave Love <fx@gnu.org>
parents: 19775
diff changeset
104 #include <unistd.h>
ea3c28a8be00 Include errno.h, string.h, unistd.h. Don't declare errno, strerror.
Dave Love <fx@gnu.org>
parents: 19775
diff changeset
105 #else
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
106 void *sbrk ();
29751
ea3c28a8be00 Include errno.h, string.h, unistd.h. Don't declare errno, strerror.
Dave Love <fx@gnu.org>
parents: 19775
diff changeset
107 #endif
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
108
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
109 #define EEOF -1
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
111 static struct scnhdr *text_section;
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
112 static struct scnhdr *rel_dyn_section;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
113 static struct scnhdr *dynstr_section;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
114 static struct scnhdr *dynsym_section;
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
115 static struct scnhdr *init_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
116 static struct scnhdr *finit_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117 static struct scnhdr *rdata_section;
9693
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
118 static struct scnhdr *rconst_section;
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
119 static struct scnhdr *data_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120 static struct scnhdr *pdata_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121 static struct scnhdr *xdata_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
122 static struct scnhdr *got_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123 static struct scnhdr *lit8_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124 static struct scnhdr *lit4_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125 static struct scnhdr *sdata_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 static struct scnhdr *sbss_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127 static struct scnhdr *bss_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
128
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
129 static struct scnhdr old_data_scnhdr;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
130
9693
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
131 static unsigned long Brk;
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
132
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
133 struct headers {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
134 struct filehdr fhdr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
135 struct aouthdr aout;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
136 struct scnhdr section[_MIPS_NSCNS_MAX];
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
137 };
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
138
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
139
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141 /* Define name of label for entry point for the dumped executable. */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143 #ifndef DEFAULT_ENTRY_ADDRESS
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
144 #define DEFAULT_ENTRY_ADDRESS __start
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145 #endif
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146
30916
d4a0bd8a25a3 Prototype fatal_unexec, mark_x, update_dynamic_symbols. Declare
Dave Love <fx@gnu.org>
parents: 29751
diff changeset
147 void
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 unexec (new_name, a_name, data_start, bss_start, entry_address)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149 char *new_name, *a_name;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 unsigned long data_start, bss_start, entry_address;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152 int new, old;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153 char * oldptr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
154 struct headers ohdr, nhdr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155 struct stat stat;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
156 long pagesize, brk;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
157 long newsyms, symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158 int nread;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
159 int i;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
160 long vaddr, scnptr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
161 #define BUFSIZE 8192
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
162 char buffer[BUFSIZE];
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
163
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164 if ((old = open (a_name, O_RDONLY)) < 0)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165 fatal_unexec ("opening %s", a_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
166
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167 new = creat (new_name, 0666);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 if (new < 0) fatal_unexec ("creating %s", new_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170 if ((fstat (old, &stat) == -1))
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171 fatal_unexec ("fstat %s", a_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
173 oldptr = (char *)mmap (0, stat.st_size, PROT_READ, MAP_FILE|MAP_SHARED, old, 0);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175 if (oldptr == (char *)-1)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
176 fatal_unexec ("mmap %s", a_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
177
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
178 close (old);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
180 /* This is a copy of the a.out header of the original executable */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
181
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182 ohdr = (*(struct headers *)oldptr);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184 /* This is where we build the new header from the in-memory copy */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 nhdr = *((struct headers *)TEXT_START);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 /* First do some consistency checks */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 if (nhdr.fhdr.f_magic != ALPHAMAGIC
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191 && nhdr.fhdr.f_magic != ALPHAUMAGIC)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193 fprintf (stderr, "unexec: input file magic number is %x, not %x or %x.\n",
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194 nhdr.fhdr.f_magic, ALPHAMAGIC, ALPHAUMAGIC);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 exit (1);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 if (nhdr.fhdr.f_opthdr != sizeof (nhdr.aout))
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 fprintf (stderr, "unexec: input a.out header is %d bytes, not %d.\n",
19336
46e497d9add2 (unexec): Cast arg to fprintf.
Richard M. Stallman <rms@gnu.org>
parents: 18780
diff changeset
201 nhdr.fhdr.f_opthdr, (int)sizeof (nhdr.aout));
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202 exit (1);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204 if (nhdr.aout.magic != ZMAGIC)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206 fprintf (stderr, "unexec: input file a.out magic number is %o, not %o.\n",
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207 nhdr.aout.magic, ZMAGIC);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 exit (1);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212 /* Now check the existence of certain header section and grab
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 their addresses. */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 #define CHECK_SCNHDR(ptr, name, flags) \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216 ptr = NULL; \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217 for (i = 0; i < nhdr.fhdr.f_nscns && !ptr; i++) \
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
218 if (strncmp (nhdr.section[i].s_name, name, 8) == 0) \
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
219 { \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
220 if (nhdr.section[i].s_flags != flags) \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
221 fprintf (stderr, "unexec: %x flags (%x expected) in %s section.\n", \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
222 nhdr.section[i].s_flags, flags, name); \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
223 ptr = nhdr.section + i; \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
224 } \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
225
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
226 CHECK_SCNHDR (text_section, _TEXT, STYP_TEXT);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
227 CHECK_SCNHDR (init_section, _INIT, STYP_INIT);
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
228 #ifdef _REL_DYN
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
229 CHECK_SCNHDR (rel_dyn_section, _REL_DYN, STYP_REL_DYN);
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
230 #endif /* _REL_DYN */
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
231 #ifdef _DYNSYM
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
232 CHECK_SCNHDR (dynsym_section, _DYNSYM, STYP_DYNSYM);
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
233 #endif /* _REL_DYN */
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
234 #ifdef _DYNSTR
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
235 CHECK_SCNHDR (dynstr_section, _DYNSTR, STYP_DYNSTR);
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
236 #endif /* _REL_DYN */
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237 #ifdef _FINI
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238 CHECK_SCNHDR (finit_section, _FINI, STYP_FINI);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 #endif /* _FINI */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 CHECK_SCNHDR (rdata_section, _RDATA, STYP_RDATA);
9693
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
241 #ifdef _RCONST
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
242 CHECK_SCNHDR (rconst_section, _RCONST, STYP_RCONST);
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
243 #endif
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244 #ifdef _PDATA
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 CHECK_SCNHDR (pdata_section, _PDATA, STYP_PDATA);
29751
ea3c28a8be00 Include errno.h, string.h, unistd.h. Don't declare errno, strerror.
Dave Love <fx@gnu.org>
parents: 19775
diff changeset
246 #endif /* _PDATA */
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247 #ifdef _GOT
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 CHECK_SCNHDR (got_section, _GOT, STYP_GOT);
29751
ea3c28a8be00 Include errno.h, string.h, unistd.h. Don't declare errno, strerror.
Dave Love <fx@gnu.org>
parents: 19775
diff changeset
249 #endif /* _GOT */
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250 CHECK_SCNHDR (data_section, _DATA, STYP_DATA);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251 #ifdef _XDATA
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 CHECK_SCNHDR (xdata_section, _XDATA, STYP_XDATA);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
253 #endif /* _XDATA */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
254 #ifdef _LIT8
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255 CHECK_SCNHDR (lit8_section, _LIT8, STYP_LIT8);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 CHECK_SCNHDR (lit4_section, _LIT4, STYP_LIT4);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257 #endif /* _LIT8 */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
258 CHECK_SCNHDR (sdata_section, _SDATA, STYP_SDATA);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259 CHECK_SCNHDR (sbss_section, _SBSS, STYP_SBSS);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 CHECK_SCNHDR (bss_section, _BSS, STYP_BSS);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 pagesize = getpagesize ();
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264 brk = (((long) (sbrk (0))) + pagesize - 1) & (-pagesize);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
266 /* Remember the current break */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
267
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
268 Brk = brk;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
269
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
270 bcopy (data_section, &old_data_scnhdr, sizeof (old_data_scnhdr));
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
271
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272 nhdr.aout.dsize = brk - DATA_START;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273 nhdr.aout.bsize = 0;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274 if (entry_address == 0)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
275 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
276 extern DEFAULT_ENTRY_ADDRESS ();
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
277 nhdr.aout.entry = (unsigned long)DEFAULT_ENTRY_ADDRESS;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279 else
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280 nhdr.aout.entry = entry_address;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282 nhdr.aout.bss_start = nhdr.aout.data_start + nhdr.aout.dsize;
9693
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
283
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
284 if (rdata_section != NULL)
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
285 {
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
286 rdata_section->s_size = data_start - DATA_START;
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287
9693
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
288 /* Adjust start and virtual addresses of rdata_section, too. */
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
289 rdata_section->s_vaddr = DATA_START;
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
290 rdata_section->s_paddr = DATA_START;
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
291 rdata_section->s_scnptr = text_section->s_scnptr + nhdr.aout.tsize;
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
292 }
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 data_section->s_vaddr = data_start;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295 data_section->s_paddr = data_start;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 data_section->s_size = brk - data_start;
9693
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
297
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
298 if (rdata_section != NULL)
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
299 {
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
300 data_section->s_scnptr = rdata_section->s_scnptr + rdata_section->s_size;
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
301 }
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
302
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303 vaddr = data_section->s_vaddr + data_section->s_size;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
304 scnptr = data_section->s_scnptr + data_section->s_size;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305 if (lit8_section != NULL)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
306 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307 lit8_section->s_vaddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308 lit8_section->s_paddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309 lit8_section->s_size = 0;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 lit8_section->s_scnptr = scnptr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
312 if (lit4_section != NULL)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 lit4_section->s_vaddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315 lit4_section->s_paddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
316 lit4_section->s_size = 0;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317 lit4_section->s_scnptr = scnptr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319 if (sdata_section != NULL)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321 sdata_section->s_vaddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
322 sdata_section->s_paddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
323 sdata_section->s_size = 0;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
324 sdata_section->s_scnptr = scnptr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
326 #ifdef _XDATA
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327 if (xdata_section != NULL)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
328 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
329 xdata_section->s_vaddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
330 xdata_section->s_paddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
331 xdata_section->s_size = 0;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
332 xdata_section->s_scnptr = scnptr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
333 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
334 #endif
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
335 #ifdef _GOT
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336 if (got_section != NULL)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
337 {
15885
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
338 bcopy (got_section, buffer, sizeof (struct scnhdr));
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
339
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 got_section->s_vaddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 got_section->s_paddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 got_section->s_size = 0;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 got_section->s_scnptr = scnptr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 #endif /*_GOT */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346 if (sbss_section != NULL)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 sbss_section->s_vaddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349 sbss_section->s_paddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350 sbss_section->s_size = 0;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351 sbss_section->s_scnptr = scnptr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
352 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353 if (bss_section != NULL)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355 bss_section->s_vaddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356 bss_section->s_paddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
357 bss_section->s_size = 0;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
358 bss_section->s_scnptr = scnptr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
359 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
360
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
361 WRITE (new, (char *)TEXT_START, nhdr.aout.tsize,
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
362 "writing text section to %s", new_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
363 WRITE (new, (char *)DATA_START, nhdr.aout.dsize,
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
364 "writing data section to %s", new_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
365
15885
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
366 #ifdef _GOT
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
367 #define old_got_section ((struct scnhdr *)buffer)
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
368
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
369 if (got_section != NULL)
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
370 {
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
371 SEEK (new, old_got_section->s_scnptr,
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
372 "seeking to start of got_section in %s", new_name);
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
373 WRITE (new, oldptr + old_got_section->s_scnptr, old_got_section->s_size,
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
374 "writing new got_section of %s", new_name);
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
375 SEEK (new, nhdr.aout.tsize + nhdr.aout.dsize,
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
376 "seeking to end of data section of %s", new_name);
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
377 }
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
378
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
379 #undef old_got_section
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
380 #endif
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 /*
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 * Construct new symbol table header
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 bcopy (oldptr + nhdr.fhdr.f_symptr, buffer, cbHDRR);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
387
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388 #define symhdr ((pHDRR)buffer)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 newsyms = nhdr.aout.tsize + nhdr.aout.dsize;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 symrel = newsyms - nhdr.fhdr.f_symptr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 nhdr.fhdr.f_symptr = newsyms;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392 symhdr->cbLineOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 symhdr->cbDnOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394 symhdr->cbPdOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
395 symhdr->cbSymOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396 symhdr->cbOptOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397 symhdr->cbAuxOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398 symhdr->cbSsOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399 symhdr->cbSsExtOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
400 symhdr->cbFdOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
401 symhdr->cbRfdOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402 symhdr->cbExtOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
403
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
404 WRITE (new, buffer, cbHDRR, "writing symbol table header of %s", new_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
405
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406 /*
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407 * Copy the symbol table and line numbers
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
408 */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
409 WRITE (new, oldptr + ohdr.fhdr.f_symptr + cbHDRR,
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
410 stat.st_size - ohdr.fhdr.f_symptr - cbHDRR,
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
411 "writing symbol table of %s", new_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412
18780
a9b9bd05a8df (unexec): Don't call update_dynamic_symbols if static link.
Richard M. Stallman <rms@gnu.org>
parents: 18639
diff changeset
413 #ifdef _REL_DYN
a9b9bd05a8df (unexec): Don't call update_dynamic_symbols if static link.
Richard M. Stallman <rms@gnu.org>
parents: 18639
diff changeset
414 if (rel_dyn_section)
a9b9bd05a8df (unexec): Don't call update_dynamic_symbols if static link.
Richard M. Stallman <rms@gnu.org>
parents: 18639
diff changeset
415 update_dynamic_symbols (oldptr, new_name, new, nhdr.aout);
a9b9bd05a8df (unexec): Don't call update_dynamic_symbols if static link.
Richard M. Stallman <rms@gnu.org>
parents: 18639
diff changeset
416 #endif
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
417
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
418 #undef symhdr
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
419
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
420 SEEK (new, 0, "seeking to start of header in %s", new_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421 WRITE (new, &nhdr, sizeof (nhdr),
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
422 "writing header of %s", new_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
423
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424 close (old);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425 close (new);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426 mark_x (new_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
427 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
428
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
429
30916
d4a0bd8a25a3 Prototype fatal_unexec, mark_x, update_dynamic_symbols. Declare
Dave Love <fx@gnu.org>
parents: 29751
diff changeset
430 static void
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
431 update_dynamic_symbols (old, new_name, new, aout)
9693
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
432 char *old; /* Pointer to old executable */
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
433 char *new_name; /* Name of new executable */
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
434 int new; /* File descriptor for new executable */
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
435 struct aouthdr aout; /* a.out info from the file header */
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
436 {
19775
70b808126773 Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents: 19336
diff changeset
437 #if !defined (__linux__) && !defined (__NetBSD__) && !defined (__OpenBSD__)
18218
c8bf40360ae7 (unexec): Call update_dynamic_symbols unconditionally.
Richard M. Stallman <rms@gnu.org>
parents: 18103
diff changeset
438
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
439 typedef struct dynrel_info {
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
440 char * addr;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
441 unsigned type:8;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
442 unsigned index:24;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
443 unsigned info:8;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
444 unsigned pad:8;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
445 } dr_info;
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
446
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
447 int nsyms = rel_dyn_section->s_size / sizeof (struct dynrel_info);
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
448 int i;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
449 dr_info * rd_base = (dr_info *) (old + rel_dyn_section->s_scnptr);
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
450 Elf32_Sym * ds_base = (Elf32_Sym *) (old + dynsym_section->s_scnptr);
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
451
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
452 for (i = 0; i < nsyms; i++) {
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
453 register Elf32_Sym x;
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
455 if (rd_base[i].index == 0)
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
456 continue;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
457
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
458 x = ds_base[rd_base[i].index];
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
459
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
460 #if 0
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
461 fprintf (stderr, "Object inspected: %s, addr = %lx, shndx = %x",
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
462 old + dynstr_section->s_scnptr + x.st_name, rd_base[i].addr, x.st_shndx);
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
463 #endif
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
464
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
465
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
466 if ((ELF32_ST_BIND (x.st_info) == STB_GLOBAL)
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
467 && (x.st_shndx == 0)
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
468 /* && (x.st_value == NULL) */
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
469 ) {
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
470 /* OK, this is probably a reference to an object in a shared
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
471 library, so copy the old value. This is done in several steps:
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
472 1. reladdr is the address of the location in question relative to
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
473 the start of the data section,
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
474 2. oldref is the addr is the mapped in temacs executable,
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
475 3. newref is the address of the location in question in the
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
476 undumped executable,
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
477 4. len is the size of the object reference in bytes --
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
478 currently only 4 (long) and 8 (quad) are supported.
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
479 */
18639
2ad503f49fd7 (update_dynamic_symbols): Add cast when setting reladdr.
Richard M. Stallman <rms@gnu.org>
parents: 18218
diff changeset
480 register unsigned long reladdr = (long)rd_base[i].addr - old_data_scnhdr.s_vaddr;
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
481 char * oldref = old + old_data_scnhdr.s_scnptr + reladdr;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
482 unsigned long newref = aout.tsize + reladdr;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
483 int len;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
484
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
485 #if 0
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
486 fprintf (stderr, "...relocated\n");
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
487 #endif
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
488
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
489 if (rd_base[i].type == R_REFLONG)
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
490 len = 4;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
491 else if (rd_base[i].type == R_REFQUAD)
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
492 len = 8;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
493 else
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
494 fatal_unexec ("unrecognized relocation type in .dyn.rel section (symbol #%d)", i);
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
495
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
496 SEEK (new, newref, "seeking to dynamic symbol in %s", new_name);
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
497 WRITE (new, oldref, len, "writing old dynrel info in %s", new_name);
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
498 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
499
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
500 #if 0
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
501 else
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
502 fprintf (stderr, "...not relocated\n");
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
503 #endif
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
504
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
505 }
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
506
19775
70b808126773 Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents: 19336
diff changeset
507 #endif /* not __linux__ and not __NetBSD__ and not __OpenBSD__ */
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
508 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
509
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
510
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
511 /*
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
512 * mark_x
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
513 *
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
514 * After successfully building the new a.out, mark it executable
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
515 */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
516
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
517 static void
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
518 mark_x (name)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
519 char *name;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
520 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
521 struct stat sbuf;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
522 int um = umask (777);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
523 umask (um);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
524 if (stat (name, &sbuf) < 0)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
525 fatal_unexec ("getting protection on %s", name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
526 sbuf.st_mode |= 0111 & ~um;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
527 if (chmod (name, sbuf.st_mode) < 0)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
528 fatal_unexec ("setting protection on %s", name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
529 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
530
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
531 static void
13512
738750464578 (fatal_unexec): Don't use varargs.
Richard M. Stallman <rms@gnu.org>
parents: 12826
diff changeset
532 fatal_unexec (s, arg)
738750464578 (fatal_unexec): Don't use varargs.
Richard M. Stallman <rms@gnu.org>
parents: 12826
diff changeset
533 char *s;
738750464578 (fatal_unexec): Don't use varargs.
Richard M. Stallman <rms@gnu.org>
parents: 12826
diff changeset
534 char *arg;
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
535 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
536 if (errno == EEOF)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
537 fputs ("unexec: unexpected end of file, ", stderr);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
538 else
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
539 fprintf (stderr, "unexec: %s, ", strerror (errno));
13512
738750464578 (fatal_unexec): Don't use varargs.
Richard M. Stallman <rms@gnu.org>
parents: 12826
diff changeset
540 fprintf (stderr, s, arg);
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
541 fputs (".\n", stderr);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
542 exit (1);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
543 }