summaryrefslogtreecommitdiff
path: root/gdb/stuff.c
blob: 7ea32097ecaa9e43902574eed2a10f1f2097655f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
/* OBSOLETE /* Program to stuff files into a specially prepared space in kdb. */
/* OBSOLETE    Copyright 1986, 1989, 1991, 1992, 1995, 2000 */
/* OBSOLETE    Free Software Foundation, Inc. */
/* OBSOLETE  */
/* OBSOLETE    This file is part of GDB. */
/* OBSOLETE  */
/* OBSOLETE    This program is free software; you can redistribute it and/or modify */
/* OBSOLETE    it under the terms of the GNU General Public License as published by */
/* OBSOLETE    the Free Software Foundation; either version 2 of the License, or */
/* OBSOLETE    (at your option) any later version. */
/* OBSOLETE  */
/* OBSOLETE    This program is distributed in the hope that it will be useful, */
/* OBSOLETE    but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* OBSOLETE    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the */
/* OBSOLETE    GNU General Public License for more details. */
/* OBSOLETE  */
/* OBSOLETE    You should have received a copy of the GNU General Public License */
/* OBSOLETE    along with this program; if not, write to the Free Software */
/* OBSOLETE    Foundation, Inc., 59 Temple Place - Suite 330, */
/* OBSOLETE    Boston, MA 02111-1307, USA.  */ */
/* OBSOLETE  */
/* OBSOLETE /* Written 13-Mar-86 by David Bridgham. */ */
/* OBSOLETE  */
/* OBSOLETE #include <stdio.h> */
/* OBSOLETE #include <a.out.h> */
/* OBSOLETE #include <sys/types.h> */
/* OBSOLETE #include "gdb_stat.h" */
/* OBSOLETE #include <sys/file.h> */
/* OBSOLETE #include <varargs.h> */
/* OBSOLETE  */
/* OBSOLETE main (argc, argv) */
/* OBSOLETE      int argc; */
/* OBSOLETE      char *argv[]; */
/* OBSOLETE { */
/* OBSOLETE   register char *cp; */
/* OBSOLETE   char *outfile; */
/* OBSOLETE   register int i; */
/* OBSOLETE   int offset; */
/* OBSOLETE   int out_fd, in_fd; */
/* OBSOLETE   struct stat stat_buf; */
/* OBSOLETE   int size, pad; */
/* OBSOLETE   char buf[1024]; */
/* OBSOLETE   static char zeros[4] = */
/* OBSOLETE   {0}; */
/* OBSOLETE  */
/* OBSOLETE   if (argc < 4) */
/* OBSOLETE     err ("Not enough arguments\nUsage: %s -o kdb file1 file2 ...\n", */
/* OBSOLETE 	 argv[0]); */
/* OBSOLETE  */
/* OBSOLETE   outfile = 0; */
/* OBSOLETE   for (i = 1; i < argc; i++) */
/* OBSOLETE     { */
/* OBSOLETE       if (STREQ (argv[i], "-o")) */
/* OBSOLETE 	outfile = argv[++i]; */
/* OBSOLETE     } */
/* OBSOLETE   if (outfile == 0) */
/* OBSOLETE     err ("Output file not specified\n"); */
/* OBSOLETE  */
/* OBSOLETE   offset = get_offset (outfile, "_heap"); */
/* OBSOLETE  */
/* OBSOLETE   out_fd = open (outfile, O_WRONLY); */
/* OBSOLETE   if (out_fd < 0) */
/* OBSOLETE     err ("Error opening %s for write: %s\n", outfile, strerror (errno)); */
/* OBSOLETE   if (lseek (out_fd, offset, 0) < 0) */
/* OBSOLETE     err ("Error seeking to heap in %s: %s\n", outfile, strerror (errno)); */
/* OBSOLETE  */
/* OBSOLETE   /* For each file listed on the command line, write it into the */
/* OBSOLETE    * 'heap' of the output file.  Make sure to skip the arguments */
/* OBSOLETE    * that name the output file. */ */
/* OBSOLETE   for (i = 1; i < argc; i++) */
/* OBSOLETE     { */
/* OBSOLETE       if (STREQ (argv[i], "-o")) */
/* OBSOLETE 	continue; */
/* OBSOLETE       if ((in_fd = open (argv[i], O_RDONLY)) < 0) */
/* OBSOLETE 	err ("Error opening %s for read: %s\n", argv[i], */
/* OBSOLETE 	     strerror (errno)); */
/* OBSOLETE       if (fstat (in_fd, &stat_buf) < 0) */
/* OBSOLETE 	err ("Error stat'ing %s: %s\n", argv[i], strerror (errno)); */
/* OBSOLETE       size = strlen (argv[i]); */
/* OBSOLETE       pad = 4 - (size & 3); */
/* OBSOLETE       size += pad + stat_buf.st_size + sizeof (int); */
/* OBSOLETE       write (out_fd, &size, sizeof (int)); */
/* OBSOLETE       write (out_fd, argv[i], strlen (argv[i])); */
/* OBSOLETE       write (out_fd, zeros, pad); */
/* OBSOLETE       while ((size = read (in_fd, buf, sizeof (buf))) > 0) */
/* OBSOLETE 	write (out_fd, buf, size); */
/* OBSOLETE       close (in_fd); */
/* OBSOLETE     } */
/* OBSOLETE   size = 0; */
/* OBSOLETE   write (out_fd, &size, sizeof (int)); */
/* OBSOLETE   close (out_fd); */
/* OBSOLETE   return (0); */
/* OBSOLETE } */
/* OBSOLETE  */
/* OBSOLETE /* Read symbol table from file and returns the offset into the file */
/* OBSOLETE  * where symbol sym_name is located.  If error, print message and */
/* OBSOLETE  * exit. */ */
/* OBSOLETE get_offset (char *file, char *sym_name) */
/* OBSOLETE { */
/* OBSOLETE   int f; */
/* OBSOLETE   struct exec file_hdr; */
/* OBSOLETE   struct nlist *symbol_table; */
/* OBSOLETE   int size; */
/* OBSOLETE   char *strings; */
/* OBSOLETE  */
/* OBSOLETE   f = open (file, O_RDONLY); */
/* OBSOLETE   if (f < 0) */
/* OBSOLETE     err ("Error opening %s: %s\n", file, strerror (errno)); */
/* OBSOLETE   if (read (f, &file_hdr, sizeof (file_hdr)) < 0) */
/* OBSOLETE     err ("Error reading exec structure: %s\n", strerror (errno)); */
/* OBSOLETE   if (N_BADMAG (file_hdr)) */
/* OBSOLETE     err ("File %s not an a.out file\n", file); */
/* OBSOLETE  */
/* OBSOLETE   /* read in symbol table */ */
/* OBSOLETE   if ((symbol_table = (struct nlist *) malloc (file_hdr.a_syms)) == 0) */
/* OBSOLETE     err ("Couldn't allocate space for symbol table\n"); */
/* OBSOLETE   if (lseek (f, N_SYMOFF (file_hdr), 0) == -1) */
/* OBSOLETE     err ("lseek error: %s\n", strerror (errno)); */
/* OBSOLETE   if (read (f, symbol_table, file_hdr.a_syms) == -1) */
/* OBSOLETE     err ("Error reading symbol table from %s: %s\n", file, */
/* OBSOLETE 	 strerror (errno)); */
/* OBSOLETE  */
/* OBSOLETE   /* read in string table */ */
/* OBSOLETE   if (read (f, &size, 4) == -1) */
/* OBSOLETE     err ("reading string table size: %s\n", strerror (errno)); */
/* OBSOLETE   if ((strings = (char *) malloc (size)) == 0) */
/* OBSOLETE     err ("Couldn't allocate memory for string table\n"); */
/* OBSOLETE   if (read (f, strings, size - 4) == -1) */
/* OBSOLETE     err ("reading string table: %s\n", strerror (errno)); */
/* OBSOLETE  */
/* OBSOLETE   /* Find the core address at which the first byte of kdb text segment */
/* OBSOLETE      should be loaded into core when kdb is run.  */ */
/* OBSOLETE   origin = find_symbol ("_etext", symbol_table, file_hdr.a_syms, strings) */
/* OBSOLETE     - file_hdr.a_text; */
/* OBSOLETE   /* Find the core address at which the heap will appear.  */ */
/* OBSOLETE   coreaddr = find_symbol (sym_name, symbol_table, file_hdr.a_syms, strings); */
/* OBSOLETE   /* Return address in file of the heap data space.  */ */
/* OBSOLETE   return (N_TXTOFF (file_hdr) + core_addr - origin); */
/* OBSOLETE } */
/* OBSOLETE  */
/* OBSOLETE find_symbol (char *sym_name, struct nlist *symbol_table, int length, */
/* OBSOLETE 	     char *strings) */
/* OBSOLETE { */
/* OBSOLETE   register struct nlist *sym; */
/* OBSOLETE  */
/* OBSOLETE   /* Find symbol in question */ */
/* OBSOLETE   for (sym = symbol_table; */
/* OBSOLETE        sym != (struct nlist *) ((char *) symbol_table + length); */
/* OBSOLETE        sym++) */
/* OBSOLETE     { */
/* OBSOLETE       if ((sym->n_type & N_TYPE) != N_DATA) */
/* OBSOLETE 	continue; */
/* OBSOLETE       if (sym->n_un.n_strx == 0) */
/* OBSOLETE 	continue; */
/* OBSOLETE       if (STREQ (sym_name, strings + sym->n_un.n_strx - 4)) */
/* OBSOLETE 	return sym->n_value; */
/* OBSOLETE     } */
/* OBSOLETE   err ("Data symbol %s not found in %s\n", sym_name, file); */
/* OBSOLETE } */
/* OBSOLETE  */
/* OBSOLETE /* VARARGS */ */
/* OBSOLETE void */
/* OBSOLETE err (va_alist) */
/* OBSOLETE      va_dcl */
/* OBSOLETE { */
/* OBSOLETE   va_list args; */
/* OBSOLETE   char *string; */
/* OBSOLETE  */
/* OBSOLETE   va_start (args); */
/* OBSOLETE   string = va_arg (args, char *); */
/* OBSOLETE   vfprintf (gdb_stderr, string, args); */
/* OBSOLETE   va_end (args); */
/* OBSOLETE   exit (-1); */
/* OBSOLETE } */