annotate src/unexalpha.c @ 24841:d2d412758428

(clear_cached_bitmap_slots): Remove. (get_bitmap_with_cache): Check if CreateBitmap failed. Adjust cache size dynamically so cache is never larger than the system limit of GDI resources. Do cache clearing inline. Move global variables to local scope.
author Jason Rumney <jasonr@gnu.org>
date Sun, 13 Jun 1999 17:49:12 +0000
parents 70b808126773
children ea3c28a8be00
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
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3 Copyright (C) 1994 Free Software Foundation, Inc.
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>
19775
70b808126773 Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents: 19336
diff changeset
30 #if !defined (__NetBSD__) && !defined (__OpenBSD__)
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31 #include <filehdr.h>
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
32 #include <aouthdr.h>
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
33 #include <scnhdr.h>
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34 #include <syms.h>
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
35 #ifndef __linux__
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
36 # include <reloc.h>
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
37 # include <elf_abi.h>
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
38 #endif
19775
70b808126773 Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents: 19336
diff changeset
39 #else /* __NetBSD__ or __OpenBSD__ */
18103
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
40 /*
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
41 * 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
42 * 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
43 * long term.
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 #include <sys/exec_ecoff.h>
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
46
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
47 /* 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
48 #define filehdr ecoff_filehdr
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
49 #define aouthdr ecoff_aouthdr
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
50 #define scnhdr ecoff_scnhdr
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
51 #define HDRR struct ecoff_symhdr
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
52 #define pHDRR HDRR *
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
53 #define cbHDRR sizeof(HDRR)
19775
70b808126773 Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents: 19336
diff changeset
54 #ifdef __OpenBSD__
70b808126773 Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents: 19336
diff changeset
55 #define ALPHAMAGIC ECOFF_MAGIC_NATIVE_ALPHA
70b808126773 Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents: 19336
diff changeset
56 #else
18103
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
57 #define ALPHAMAGIC ECOFF_MAGIC_NETBSD_ALPHA
19775
70b808126773 Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents: 19336
diff changeset
58 #endif
18103
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
59 #define ZMAGIC ECOFF_ZMAGIC
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
60
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
61 /* 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
62 #define ALPHAUMAGIC 0617
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
63 #define _MIPS_NSCNS_MAX 35
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
64 #define STYP_TEXT 0x00000020
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
65 #define STYP_DATA 0x00000040
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
66 #define STYP_BSS 0x00000080
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
67 #define STYP_RDATA 0x00000100
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
68 #define STYP_SDATA 0x00000200
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
69 #define STYP_SBSS 0x00000400
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
70 #define STYP_INIT 0x80000000
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
71 #define _TEXT ".text"
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
72 #define _DATA ".data"
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
73 #define _BSS ".bss"
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
74 #define _INIT ".init"
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
75 #define _RDATA ".rdata"
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
76 #define _SDATA ".sdata"
8e1553706b3d [__NetBSD__]: Don't include filehdr.h, aouthdr.h
Richard M. Stallman <rms@gnu.org>
parents: 15893
diff changeset
77 #define _SBSS ".sbss"
19775
70b808126773 Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents: 19336
diff changeset
78 #endif /* __NetBSD__ || __OpenBSD__ */
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
79
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
80 static void fatal_unexec ();
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
81 static void mark_x ();
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
82
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
83 #define READ(_fd, _buffer, _size, _error_message, _error_arg) \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
84 errno = EEOF; \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
85 if (read (_fd, _buffer, _size) != _size) \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
86 fatal_unexec (_error_message, _error_arg);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
87
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
88 #define WRITE(_fd, _buffer, _size, _error_message, _error_arg) \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
89 if (write (_fd, _buffer, _size) != _size) \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
90 fatal_unexec (_error_message, _error_arg);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
91
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
92 #define SEEK(_fd, _position, _error_message, _error_arg) \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
93 errno = EEOF; \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
94 if (lseek (_fd, _position, L_SET) != _position) \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
95 fatal_unexec (_error_message, _error_arg);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
96
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
97 extern int errno;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
98 extern char *strerror ();
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
99
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
100 void *sbrk ();
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
101
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
102 #define EEOF -1
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
103
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
104 static struct scnhdr *text_section;
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
105 static struct scnhdr *rel_dyn_section;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
106 static struct scnhdr *dynstr_section;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
107 static struct scnhdr *dynsym_section;
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
108 static struct scnhdr *init_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
109 static struct scnhdr *finit_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110 static struct scnhdr *rdata_section;
9693
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
111 static struct scnhdr *rconst_section;
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
112 static struct scnhdr *data_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
113 static struct scnhdr *pdata_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
114 static struct scnhdr *xdata_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
115 static struct scnhdr *got_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
116 static struct scnhdr *lit8_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117 static struct scnhdr *lit4_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
118 static struct scnhdr *sdata_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
119 static struct scnhdr *sbss_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120 static struct scnhdr *bss_section;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
122 static struct scnhdr old_data_scnhdr;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
123
9693
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
124 static unsigned long Brk;
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 struct headers {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127 struct filehdr fhdr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
128 struct aouthdr aout;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
129 struct scnhdr section[_MIPS_NSCNS_MAX];
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130 };
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
131
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
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
134 /* Define name of label for entry point for the dumped executable. */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
135
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
136 #ifndef DEFAULT_ENTRY_ADDRESS
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
137 #define DEFAULT_ENTRY_ADDRESS __start
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
138 #endif
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 unexec (new_name, a_name, data_start, bss_start, entry_address)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141 char *new_name, *a_name;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142 unsigned long data_start, bss_start, entry_address;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
144 int new, old;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145 char * oldptr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 struct headers ohdr, nhdr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
147 struct stat stat;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 long pagesize, brk;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149 long newsyms, symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 int nread;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 int i;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152 long vaddr, scnptr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153 #define BUFSIZE 8192
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
154 char buffer[BUFSIZE];
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
156 if ((old = open (a_name, O_RDONLY)) < 0)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
157 fatal_unexec ("opening %s", a_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
159 new = creat (new_name, 0666);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
160 if (new < 0) fatal_unexec ("creating %s", new_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
161
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
162 if ((fstat (old, &stat) == -1))
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
163 fatal_unexec ("fstat %s", a_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165 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
166
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167 if (oldptr == (char *)-1)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 fatal_unexec ("mmap %s", a_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 close (old);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172 /* 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
173
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174 ohdr = (*(struct headers *)oldptr);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
176 /* 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
177
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
178 nhdr = *((struct headers *)TEXT_START);
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 /* First do some consistency checks */
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 if (nhdr.fhdr.f_magic != ALPHAMAGIC
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183 && nhdr.fhdr.f_magic != ALPHAUMAGIC)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185 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
186 nhdr.fhdr.f_magic, ALPHAMAGIC, ALPHAUMAGIC);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 exit (1);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 }
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_opthdr != sizeof (nhdr.aout))
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 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
193 nhdr.fhdr.f_opthdr, (int)sizeof (nhdr.aout));
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194 exit (1);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 if (nhdr.aout.magic != ZMAGIC)
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 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
199 nhdr.aout.magic, ZMAGIC);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 exit (1);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202
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 /* Now check the existence of certain header section and grab
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 their addresses. */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207 #define CHECK_SCNHDR(ptr, name, flags) \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 ptr = NULL; \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 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
210 if (strncmp (nhdr.section[i].s_name, name, 8) == 0) \
8836
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 if (nhdr.section[i].s_flags != flags) \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 fprintf (stderr, "unexec: %x flags (%x expected) in %s section.\n", \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 nhdr.section[i].s_flags, flags, name); \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 ptr = nhdr.section + i; \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216 } \
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
218 CHECK_SCNHDR (text_section, _TEXT, STYP_TEXT);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
219 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
220 #ifdef _REL_DYN
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
221 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
222 #endif /* _REL_DYN */
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
223 #ifdef _DYNSYM
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
224 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
225 #endif /* _REL_DYN */
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
226 #ifdef _DYNSTR
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
227 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
228 #endif /* _REL_DYN */
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
229 #ifdef _FINI
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
230 CHECK_SCNHDR (finit_section, _FINI, STYP_FINI);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
231 #endif /* _FINI */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
232 CHECK_SCNHDR (rdata_section, _RDATA, STYP_RDATA);
9693
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
233 #ifdef _RCONST
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
234 CHECK_SCNHDR (rconst_section, _RCONST, STYP_RCONST);
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
235 #endif
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
236 #ifdef _PDATA
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237 CHECK_SCNHDR (pdata_section, _PDATA, STYP_PDATA);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238 #endif _PDATA
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 #ifdef _GOT
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 CHECK_SCNHDR (got_section, _GOT, STYP_GOT);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 #endif _GOT
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242 CHECK_SCNHDR (data_section, _DATA, STYP_DATA);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243 #ifdef _XDATA
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244 CHECK_SCNHDR (xdata_section, _XDATA, STYP_XDATA);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 #endif /* _XDATA */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246 #ifdef _LIT8
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247 CHECK_SCNHDR (lit8_section, _LIT8, STYP_LIT8);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 CHECK_SCNHDR (lit4_section, _LIT4, STYP_LIT4);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 #endif /* _LIT8 */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250 CHECK_SCNHDR (sdata_section, _SDATA, STYP_SDATA);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251 CHECK_SCNHDR (sbss_section, _SBSS, STYP_SBSS);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 CHECK_SCNHDR (bss_section, _BSS, STYP_BSS);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
253
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
254
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255 pagesize = getpagesize ();
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 brk = (((long) (sbrk (0))) + pagesize - 1) & (-pagesize);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
258 /* Remember the current break */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 Brk = brk;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
262 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
263
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264 nhdr.aout.dsize = brk - DATA_START;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265 nhdr.aout.bsize = 0;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
266 if (entry_address == 0)
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 extern DEFAULT_ENTRY_ADDRESS ();
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
269 nhdr.aout.entry = (unsigned long)DEFAULT_ENTRY_ADDRESS;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
270 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
271 else
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272 nhdr.aout.entry = entry_address;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274 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
275
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
276 if (rdata_section != NULL)
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
277 {
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
278 rdata_section->s_size = data_start - DATA_START;
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279
9693
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
280 /* 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
281 rdata_section->s_vaddr = DATA_START;
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
282 rdata_section->s_paddr = DATA_START;
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
283 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
284 }
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 data_section->s_vaddr = data_start;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 data_section->s_paddr = data_start;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 data_section->s_size = brk - data_start;
9693
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
289
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
290 if (rdata_section != NULL)
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
291 {
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
292 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
293 }
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
294
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295 vaddr = data_section->s_vaddr + data_section->s_size;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 scnptr = data_section->s_scnptr + data_section->s_size;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 if (lit8_section != NULL)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299 lit8_section->s_vaddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300 lit8_section->s_paddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301 lit8_section->s_size = 0;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
302 lit8_section->s_scnptr = scnptr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
304 if (lit4_section != NULL)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
306 lit4_section->s_vaddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307 lit4_section->s_paddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308 lit4_section->s_size = 0;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309 lit4_section->s_scnptr = scnptr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 if (sdata_section != NULL)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
312 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 sdata_section->s_vaddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 sdata_section->s_paddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315 sdata_section->s_size = 0;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
316 sdata_section->s_scnptr = scnptr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318 #ifdef _XDATA
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319 if (xdata_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 xdata_section->s_vaddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
322 xdata_section->s_paddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
323 xdata_section->s_size = 0;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
324 xdata_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 #endif
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327 #ifdef _GOT
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
328 if (got_section != NULL)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
329 {
15885
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
330 bcopy (got_section, buffer, sizeof (struct scnhdr));
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
331
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
332 got_section->s_vaddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
333 got_section->s_paddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
334 got_section->s_size = 0;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
335 got_section->s_scnptr = scnptr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
337 #endif /*_GOT */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
338 if (sbss_section != NULL)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 sbss_section->s_vaddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 sbss_section->s_paddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 sbss_section->s_size = 0;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 sbss_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 if (bss_section != NULL)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 bss_section->s_vaddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 bss_section->s_paddr = vaddr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349 bss_section->s_size = 0;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350 bss_section->s_scnptr = scnptr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351 }
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 WRITE (new, (char *)TEXT_START, nhdr.aout.tsize,
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 "writing text section to %s", new_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355 WRITE (new, (char *)DATA_START, nhdr.aout.dsize,
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356 "writing data section to %s", new_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
357
15885
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
358 #ifdef _GOT
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
359 #define old_got_section ((struct scnhdr *)buffer)
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
360
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
361 if (got_section != NULL)
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
362 {
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
363 SEEK (new, old_got_section->s_scnptr,
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
364 "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
365 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
366 "writing new got_section of %s", new_name);
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
367 SEEK (new, nhdr.aout.tsize + nhdr.aout.dsize,
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
368 "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
369 }
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 #undef old_got_section
67d9f8e91688 (unexec): Copy the .got section.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
372 #endif
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374 /*
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375 * Construct new symbol table header
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376 */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378 bcopy (oldptr + nhdr.fhdr.f_symptr, buffer, cbHDRR);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 #define symhdr ((pHDRR)buffer)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 newsyms = nhdr.aout.tsize + nhdr.aout.dsize;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 symrel = newsyms - nhdr.fhdr.f_symptr;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 nhdr.fhdr.f_symptr = newsyms;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 symhdr->cbLineOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385 symhdr->cbDnOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 symhdr->cbPdOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
387 symhdr->cbSymOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388 symhdr->cbOptOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 symhdr->cbAuxOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 symhdr->cbSsOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 symhdr->cbSsExtOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392 symhdr->cbFdOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 symhdr->cbRfdOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394 symhdr->cbExtOffset += symrel;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
395
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396 WRITE (new, buffer, cbHDRR, "writing symbol table header of %s", new_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398 /*
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399 * Copy the symbol table and line numbers
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
400 */
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
401 WRITE (new, oldptr + ohdr.fhdr.f_symptr + cbHDRR,
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402 stat.st_size - ohdr.fhdr.f_symptr - cbHDRR,
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
403 "writing symbol table of %s", new_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
404
18780
a9b9bd05a8df (unexec): Don't call update_dynamic_symbols if static link.
Richard M. Stallman <rms@gnu.org>
parents: 18639
diff changeset
405 #ifdef _REL_DYN
a9b9bd05a8df (unexec): Don't call update_dynamic_symbols if static link.
Richard M. Stallman <rms@gnu.org>
parents: 18639
diff changeset
406 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
407 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
408 #endif
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
409
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
410 #undef symhdr
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
411
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412 SEEK (new, 0, "seeking to start of header in %s", new_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413 WRITE (new, &nhdr, sizeof (nhdr),
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
414 "writing header of %s", new_name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
415
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
416 close (old);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
417 close (new);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
418 mark_x (new_name);
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
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
422
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
423 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
424 char *old; /* Pointer to old executable */
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
425 char *new_name; /* Name of new executable */
b6ce6e2ccd15 (Brk): Declare as unsigned long.
Richard M. Stallman <rms@gnu.org>
parents: 8836
diff changeset
426 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
427 struct aouthdr aout; /* a.out info from the file header */
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
428 {
19775
70b808126773 Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents: 19336
diff changeset
429 #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
430
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
431 typedef struct dynrel_info {
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
432 char * addr;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
433 unsigned type:8;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
434 unsigned index:24;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
435 unsigned info:8;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
436 unsigned pad:8;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
437 } dr_info;
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
439 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
440 int i;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
441 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
442 Elf32_Sym * ds_base = (Elf32_Sym *) (old + dynsym_section->s_scnptr);
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
443
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
444 for (i = 0; i < nsyms; i++) {
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
445 register Elf32_Sym x;
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 if (rd_base[i].index == 0)
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
448 continue;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
449
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
450 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
451
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
452 #if 0
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
453 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
454 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
455 #endif
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
456
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
457
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
458 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
459 && (x.st_shndx == 0)
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
460 /* && (x.st_value == NULL) */
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
461 ) {
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
462 /* 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
463 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
464 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
465 the start of the data section,
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
466 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
467 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
468 undumped executable,
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
469 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
470 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
471 */
18639
2ad503f49fd7 (update_dynamic_symbols): Add cast when setting reladdr.
Richard M. Stallman <rms@gnu.org>
parents: 18218
diff changeset
472 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
473 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
474 unsigned long newref = aout.tsize + reladdr;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
475 int len;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
476
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
477 #if 0
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
478 fprintf (stderr, "...relocated\n");
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
479 #endif
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
480
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
481 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
482 len = 4;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
483 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
484 len = 8;
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
485 else
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
486 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
487
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
488 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
489 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
490 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
491
15893
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
492 #if 0
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 fprintf (stderr, "...not relocated\n");
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
495 #endif
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
496
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
497 }
56d0b28891da Conditionalize the changes below on not __linux__.
Richard M. Stallman <rms@gnu.org>
parents: 15885
diff changeset
498
19775
70b808126773 Test __OpenBSD__ along with __NetBSD__.
Richard M. Stallman <rms@gnu.org>
parents: 19336
diff changeset
499 #endif /* not __linux__ and not __NetBSD__ and not __OpenBSD__ */
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
500 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
501
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
502
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
503 /*
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
504 * mark_x
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
505 *
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
506 * After successfully building the new a.out, mark it executable
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
507 */
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 static void
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
510 mark_x (name)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
511 char *name;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
512 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
513 struct stat sbuf;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
514 int um = umask (777);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
515 umask (um);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
516 if (stat (name, &sbuf) < 0)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
517 fatal_unexec ("getting protection on %s", name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
518 sbuf.st_mode |= 0111 & ~um;
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
519 if (chmod (name, sbuf.st_mode) < 0)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
520 fatal_unexec ("setting protection on %s", name);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
521 }
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
522
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
523 static void
13512
738750464578 (fatal_unexec): Don't use varargs.
Richard M. Stallman <rms@gnu.org>
parents: 12826
diff changeset
524 fatal_unexec (s, arg)
738750464578 (fatal_unexec): Don't use varargs.
Richard M. Stallman <rms@gnu.org>
parents: 12826
diff changeset
525 char *s;
738750464578 (fatal_unexec): Don't use varargs.
Richard M. Stallman <rms@gnu.org>
parents: 12826
diff changeset
526 char *arg;
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
527 {
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
528 if (errno == EEOF)
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
529 fputs ("unexec: unexpected end of file, ", stderr);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
530 else
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
531 fprintf (stderr, "unexec: %s, ", strerror (errno));
13512
738750464578 (fatal_unexec): Don't use varargs.
Richard M. Stallman <rms@gnu.org>
parents: 12826
diff changeset
532 fprintf (stderr, s, arg);
8836
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
533 fputs (".\n", stderr);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
534 exit (1);
2afe507ed505 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
535 }