sun4.h revision 1.1 1 1.1 christos /* SPARC-specific values for a.out files
2 1.1 christos
3 1.1 christos Copyright 2001, 2009, 2010 Free Software Foundation, Inc.
4 1.1 christos
5 1.1 christos This program is free software; you can redistribute it and/or modify
6 1.1 christos it under the terms of the GNU General Public License as published by
7 1.1 christos the Free Software Foundation; either version 3 of the License, or
8 1.1 christos (at your option) any later version.
9 1.1 christos
10 1.1 christos This program is distributed in the hope that it will be useful,
11 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
12 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 1.1 christos GNU General Public License for more details.
14 1.1 christos
15 1.1 christos You should have received a copy of the GNU General Public License
16 1.1 christos along with this program; if not, write to the Free Software
17 1.1 christos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
18 1.1 christos MA 02110-1301, USA. */
19 1.1 christos
20 1.1 christos /* Some systems, e.g., AIX, may have defined this in header files already
21 1.1 christos included. */
22 1.1 christos #undef TARGET_PAGE_SIZE
23 1.1 christos #define TARGET_PAGE_SIZE 0x2000 /* 8K. aka NBPG in <sys/param.h> */
24 1.1 christos /* Note that some SPARCs have 4K pages, some 8K, some others. */
25 1.1 christos
26 1.1 christos #define SEG_SIZE_SPARC TARGET_PAGE_SIZE
27 1.1 christos #define SEG_SIZE_SUN3 0x20000 /* Resolution of r/w protection hw */
28 1.1 christos
29 1.1 christos #define TEXT_START_ADDR TARGET_PAGE_SIZE /* Location 0 is not accessible */
30 1.1 christos #define N_HEADER_IN_TEXT(x) 1
31 1.1 christos
32 1.1 christos /* Non-default definitions of the accessor macros... */
33 1.1 christos
34 1.1 christos /* Segment size varies on Sun-3 versus Sun-4. */
35 1.1 christos
36 1.1 christos #define N_SEGSIZE(x) (N_MACHTYPE(x) == M_SPARC? SEG_SIZE_SPARC: \
37 1.1 christos N_MACHTYPE(x) == M_68020? SEG_SIZE_SUN3: \
38 1.1 christos /* Guess? */ TARGET_PAGE_SIZE)
39 1.1 christos
40 1.1 christos /* Virtual Address of text segment from the a.out file. For OMAGIC,
41 1.1 christos (almost always "unlinked .o's" these days), should be zero.
42 1.1 christos Sun added a kludge so that shared libraries linked ZMAGIC get
43 1.1 christos an address of zero if a_entry (!!!) is lower than the otherwise
44 1.1 christos expected text address. These kludges have gotta go!
45 1.1 christos For linked files, should reflect reality if we know it. */
46 1.1 christos
47 1.1 christos #define N_SHARED_LIB(x) ((x).a_entry < TEXT_START_ADDR \
48 1.1 christos && (x).a_text >= EXEC_BYTES_SIZE)
49 1.1 christos
50 1.1 christos /* This differs from the version in aout64.h (which we override by defining
51 1.1 christos it here) only for NMAGIC (we return TEXT_START_ADDR+EXEC_BYTES_SIZE;
52 1.1 christos they return 0). */
53 1.1 christos
54 1.1 christos #define N_TXTADDR(x) \
55 1.1 christos (N_MAGIC(x)==OMAGIC? 0 \
56 1.1 christos : (N_MAGIC(x) == ZMAGIC && (x).a_entry < TEXT_START_ADDR)? 0 \
57 1.1 christos : TEXT_START_ADDR+EXEC_BYTES_SIZE)
58 1.1 christos
59 1.1 christos /* When a file is linked against a shared library on SunOS 4, the
60 1.1 christos dynamic bit in the exec header is set, and the first symbol in the
61 1.1 christos symbol table is __DYNAMIC. Its value is the address of the
62 1.1 christos following structure. */
63 1.1 christos
64 1.1 christos struct external_sun4_dynamic
65 1.1 christos {
66 1.1 christos /* The version number of the structure. SunOS 4.1.x creates files
67 1.1 christos with version number 3, which is what this structure is based on.
68 1.1 christos According to gdb, version 2 is similar. I believe that version 2
69 1.1 christos used a different type of procedure linkage table, and there may
70 1.1 christos have been other differences. */
71 1.1 christos bfd_byte ld_version[4];
72 1.1 christos /* The virtual address of a 28 byte structure used in debugging.
73 1.1 christos The contents are filled in at run time by ld.so. */
74 1.1 christos bfd_byte ldd[4];
75 1.1 christos /* The virtual address of another structure with information about
76 1.1 christos how to relocate the executable at run time. */
77 1.1 christos bfd_byte ld[4];
78 1.1 christos };
79 1.1 christos
80 1.1 christos /* The size of the debugging structure pointed to by the debugger
81 1.1 christos field of __DYNAMIC. */
82 1.1 christos #define EXTERNAL_SUN4_DYNAMIC_DEBUGGER_SIZE (24)
83 1.1 christos
84 1.1 christos /* The structure pointed to by the linker field of __DYNAMIC. As far
85 1.1 christos as I can tell, most of the addresses in this structure are offsets
86 1.1 christos within the file, but some are actually virtual addresses. */
87 1.1 christos
88 1.1 christos struct internal_sun4_dynamic_link
89 1.1 christos {
90 1.1 christos /* Linked list of loaded objects. This is filled in at runtime by
91 1.1 christos ld.so and probably by dlopen. */
92 1.1 christos unsigned long ld_loaded;
93 1.1 christos
94 1.1 christos /* The address of the list of names of shared objects which must be
95 1.1 christos included at runtime. Each entry in the list is 16 bytes: the 4
96 1.1 christos byte address of the string naming the object (e.g., for -lc this
97 1.1 christos is "c"); 4 bytes of flags--the high bit is whether to search for
98 1.1 christos the object using the library path; the 2 byte major version
99 1.1 christos number; the 2 byte minor version number; the 4 byte address of
100 1.1 christos the next entry in the list (zero if this is the last entry). The
101 1.1 christos version numbers seem to only be non-zero when doing library
102 1.1 christos searching. */
103 1.1 christos unsigned long ld_need;
104 1.1 christos
105 1.1 christos /* The address of the path to search for the shared objects which
106 1.1 christos must be included. This points to a string in PATH format which
107 1.1 christos is generated from the -L arguments to the linker. According to
108 1.1 christos the man page, ld.so implicitly adds ${LD_LIBRARY_PATH} to the
109 1.1 christos beginning of this string and /lib:/usr/lib:/usr/local/lib to the
110 1.1 christos end. The string is terminated by a null byte. This field is
111 1.1 christos zero if there is no additional path. */
112 1.1 christos unsigned long ld_rules;
113 1.1 christos
114 1.1 christos /* The address of the global offset table. This appears to be a
115 1.1 christos virtual address, not a file offset. The first entry in the
116 1.1 christos global offset table seems to be the virtual address of the
117 1.1 christos sun4_dynamic structure (the same value as the __DYNAMIC symbol).
118 1.1 christos The global offset table is used for PIC code to hold the
119 1.1 christos addresses of variables. A dynamically linked file which does not
120 1.1 christos itself contain PIC code has a four byte global offset table. */
121 1.1 christos unsigned long ld_got;
122 1.1 christos
123 1.1 christos /* The address of the procedure linkage table. This appears to be a
124 1.1 christos virtual address, not a file offset.
125 1.1 christos
126 1.1 christos On a SPARC, the table is composed of 12 byte entries, each of
127 1.1 christos which consists of three instructions. The first entry is
128 1.1 christos sethi %hi(0),%g1
129 1.1 christos jmp %g1
130 1.1 christos nop
131 1.1 christos These instructions are changed by ld.so into a jump directly into
132 1.1 christos ld.so itself. Each subsequent entry is
133 1.1 christos save %sp, -96, %sp
134 1.1 christos call <address of first entry in procedure linkage table>
135 1.1 christos <reloc_number | 0x01000000>
136 1.1 christos The reloc_number is the number of the reloc to use to resolve
137 1.1 christos this entry. The reloc will be a JMP_SLOT reloc against some
138 1.1 christos symbol that is not defined in this object file but should be
139 1.1 christos defined in a shared object (if it is not, ld.so will report a
140 1.1 christos runtime error and exit). The constant 0x010000000 turns the
141 1.1 christos reloc number into a sethi of %g0, which does nothing since %g0 is
142 1.1 christos hardwired to zero.
143 1.1 christos
144 1.1 christos When one of these entries is executed, it winds up calling into
145 1.1 christos ld.so. ld.so looks at the reloc number, available via the return
146 1.1 christos address, to determine which entry this is. It then looks at the
147 1.1 christos reloc and patches up the entry in the table into a sethi and jmp
148 1.1 christos to the real address followed by a nop. This means that the reloc
149 1.1 christos lookup only has to happen once, and it also means that the
150 1.1 christos relocation only needs to be done if the function is actually
151 1.1 christos called. The relocation is expensive because ld.so must look up
152 1.1 christos the symbol by name.
153 1.1 christos
154 1.1 christos The size of the procedure linkage table is given by the ld_plt_sz
155 1.1 christos field. */
156 1.1 christos unsigned long ld_plt;
157 1.1 christos
158 1.1 christos /* The address of the relocs. These are in the same format as
159 1.1 christos ordinary relocs. Symbol index numbers refer to the symbols
160 1.1 christos pointed to by ld_stab. I think the only way to determine the
161 1.1 christos number of relocs is to assume that all the bytes from ld_rel to
162 1.1 christos ld_hash contain reloc entries. */
163 1.1 christos unsigned long ld_rel;
164 1.1 christos
165 1.1 christos /* The address of a hash table of symbols. The hash table has
166 1.1 christos roughly the same number of entries as there are dynamic symbols;
167 1.1 christos I think the only way to get the exact size is to assume that
168 1.1 christos every byte from ld_hash to ld_stab is devoted to the hash table.
169 1.1 christos
170 1.1 christos Each entry in the hash table is eight bytes. The first four
171 1.1 christos bytes are a symbol index into the dynamic symbols. The second
172 1.1 christos four bytes are the index of the next hash table entry in the
173 1.1 christos bucket. The ld_buckets field gives the number of buckets, say B.
174 1.1 christos The first B entries in the hash table each start a bucket which
175 1.1 christos is chained through the second four bytes of each entry. A value
176 1.1 christos of zero ends the chain.
177 1.1 christos
178 1.1 christos The hash function is simply
179 1.1 christos h = 0;
180 1.1 christos while (*string != '\0')
181 1.1 christos h = (h << 1) + *string++;
182 1.1 christos h &= 0x7fffffff;
183 1.1 christos
184 1.1 christos To look up a symbol, compute the hash value of the name. Take
185 1.1 christos the modulos of hash value and the number of buckets. Start at
186 1.1 christos that entry in the hash table. See if the symbol (from the first
187 1.1 christos four bytes of the hash table entry) has the name you are looking
188 1.1 christos for. If not, use the chain field (the second four bytes of the
189 1.1 christos hash table entry) to move on to the next entry in this bucket.
190 1.1 christos If the chain field is zero you have reached the end of the
191 1.1 christos bucket, and the symbol is not in the hash table. */
192 1.1 christos unsigned long ld_hash;
193 1.1 christos
194 1.1 christos /* The address of the symbol table. This is a list of
195 1.1 christos external_nlist structures. The string indices are relative to
196 1.1 christos the ld_symbols field. I think the only way to determine the
197 1.1 christos number of symbols is to assume that all the bytes between ld_stab
198 1.1 christos and ld_symbols are external_nlist structures. */
199 1.1 christos unsigned long ld_stab;
200 1.1 christos
201 1.1 christos /* I don't know what this is for. It seems to always be zero. */
202 1.1 christos unsigned long ld_stab_hash;
203 1.1 christos
204 1.1 christos /* The number of buckets in the hash table. */
205 1.1 christos unsigned long ld_buckets;
206 1.1 christos
207 1.1 christos /* The address of the symbol string table. The first string in this
208 1.1 christos string table need not be the empty string. */
209 1.1 christos unsigned long ld_symbols;
210 1.1 christos
211 1.1 christos /* The size in bytes of the symbol string table. */
212 1.1 christos unsigned long ld_symb_size;
213 1.1 christos
214 1.1 christos /* The size in bytes of the text segment. */
215 1.1 christos unsigned long ld_text;
216 1.1 christos
217 1.1 christos /* The size in bytes of the procedure linkage table. */
218 1.1 christos unsigned long ld_plt_sz;
219 1.1 christos };
220 1.1 christos
221 1.1 christos /* The external form of the structure. */
222 1.1 christos
223 1.1 christos struct external_sun4_dynamic_link
224 1.1 christos {
225 1.1 christos bfd_byte ld_loaded[4];
226 1.1 christos bfd_byte ld_need[4];
227 1.1 christos bfd_byte ld_rules[4];
228 1.1 christos bfd_byte ld_got[4];
229 1.1 christos bfd_byte ld_plt[4];
230 1.1 christos bfd_byte ld_rel[4];
231 1.1 christos bfd_byte ld_hash[4];
232 1.1 christos bfd_byte ld_stab[4];
233 1.1 christos bfd_byte ld_stab_hash[4];
234 1.1 christos bfd_byte ld_buckets[4];
235 1.1 christos bfd_byte ld_symbols[4];
236 1.1 christos bfd_byte ld_symb_size[4];
237 1.1 christos bfd_byte ld_text[4];
238 1.1 christos bfd_byte ld_plt_sz[4];
239 1.1 christos };
240