author | Rod Evans <Rod.Evans@Sun.COM> |
Wed, 19 May 2010 22:33:49 -0700 | |
changeset 12449 | a87750d92895 |
parent 11827 | d7ef53deac3f |
child 12736 | 2d732c7bdbde |
permissions | -rw-r--r-- |
0 | 1 |
/* |
2 |
* CDDL HEADER START |
|
3 |
* |
|
4 |
* The contents of this file are subject to the terms of the |
|
1682 | 5 |
* Common Development and Distribution License (the "License"). |
6 |
* You may not use this file except in compliance with the License. |
|
0 | 7 |
* |
8 |
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
|
9 |
* or http://www.opensolaris.org/os/licensing. |
|
10 |
* See the License for the specific language governing permissions |
|
11 |
* and limitations under the License. |
|
12 |
* |
|
13 |
* When distributing Covered Code, include this CDDL HEADER in each |
|
14 |
* file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
|
15 |
* If applicable, add the following below this CDDL HEADER, with the |
|
16 |
* fields enclosed by brackets "[]" replaced with your own identifying |
|
17 |
* information: Portions Copyright [yyyy] [name of copyright owner] |
|
18 |
* |
|
19 |
* CDDL HEADER END |
|
20 |
*/ |
|
21 |
||
22 |
/* |
|
1682 | 23 |
* Copyright (c) 1988 AT&T |
24 |
* All Rights Reserved |
|
25 |
* |
|
12449
a87750d92895
6943772 Testing for a symbols existence with RTLD_PROBE is compromised by RTLD_BIND_NOW
Rod Evans <Rod.Evans@Sun.COM>
parents:
11827
diff
changeset
|
26 |
* Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved. |
0 | 27 |
*/ |
28 |
||
29 |
#ifndef _SYS_LINK_H |
|
30 |
#define _SYS_LINK_H |
|
31 |
||
32 |
#ifndef _ASM |
|
33 |
#include <sys/types.h> |
|
34 |
#include <sys/elftypes.h> |
|
35 |
#endif |
|
36 |
||
37 |
#ifdef __cplusplus |
|
38 |
extern "C" { |
|
39 |
#endif |
|
40 |
||
41 |
/* |
|
42 |
* Communication structures for the runtime linker. |
|
43 |
*/ |
|
44 |
||
45 |
/* |
|
46 |
* The following data structure provides a self-identifying union consisting |
|
47 |
* of a tag from a known list and a value. |
|
48 |
*/ |
|
49 |
#ifndef _ASM |
|
50 |
typedef struct { |
|
51 |
Elf32_Sword d_tag; /* how to interpret value */ |
|
52 |
union { |
|
53 |
Elf32_Word d_val; |
|
54 |
Elf32_Addr d_ptr; |
|
55 |
Elf32_Off d_off; |
|
56 |
} d_un; |
|
57 |
} Elf32_Dyn; |
|
58 |
||
59 |
#if defined(_LP64) || defined(_LONGLONG_TYPE) |
|
60 |
typedef struct { |
|
61 |
Elf64_Xword d_tag; /* how to interpret value */ |
|
62 |
union { |
|
63 |
Elf64_Xword d_val; |
|
64 |
Elf64_Addr d_ptr; |
|
65 |
} d_un; |
|
66 |
} Elf64_Dyn; |
|
67 |
#endif /* defined(_LP64) || defined(_LONGLONG_TYPE) */ |
|
68 |
#endif /* _ASM */ |
|
69 |
||
70 |
/* |
|
71 |
* Tag values |
|
72 |
*/ |
|
73 |
#define DT_NULL 0 /* last entry in list */ |
|
74 |
#define DT_NEEDED 1 /* a needed object */ |
|
75 |
#define DT_PLTRELSZ 2 /* size of relocations for the PLT */ |
|
76 |
#define DT_PLTGOT 3 /* addresses used by procedure linkage table */ |
|
77 |
#define DT_HASH 4 /* hash table */ |
|
78 |
#define DT_STRTAB 5 /* string table */ |
|
79 |
#define DT_SYMTAB 6 /* symbol table */ |
|
80 |
#define DT_RELA 7 /* addr of relocation entries */ |
|
81 |
#define DT_RELASZ 8 /* size of relocation table */ |
|
82 |
#define DT_RELAENT 9 /* base size of relocation entry */ |
|
83 |
#define DT_STRSZ 10 /* size of string table */ |
|
84 |
#define DT_SYMENT 11 /* size of symbol table entry */ |
|
85 |
#define DT_INIT 12 /* _init addr */ |
|
86 |
#define DT_FINI 13 /* _fini addr */ |
|
87 |
#define DT_SONAME 14 /* name of this shared object */ |
|
88 |
#define DT_RPATH 15 /* run-time search path */ |
|
89 |
#define DT_SYMBOLIC 16 /* shared object linked -Bsymbolic */ |
|
90 |
#define DT_REL 17 /* addr of relocation entries */ |
|
91 |
#define DT_RELSZ 18 /* size of relocation table */ |
|
92 |
#define DT_RELENT 19 /* base size of relocation entry */ |
|
93 |
#define DT_PLTREL 20 /* relocation type for PLT entry */ |
|
94 |
#define DT_DEBUG 21 /* pointer to r_debug structure */ |
|
95 |
#define DT_TEXTREL 22 /* text relocations remain for this object */ |
|
96 |
#define DT_JMPREL 23 /* pointer to the PLT relocation entries */ |
|
97 |
#define DT_BIND_NOW 24 /* perform all relocations at load of object */ |
|
98 |
#define DT_INIT_ARRAY 25 /* pointer to .initarray */ |
|
99 |
#define DT_FINI_ARRAY 26 /* pointer to .finiarray */ |
|
100 |
#define DT_INIT_ARRAYSZ 27 /* size of .initarray */ |
|
101 |
#define DT_FINI_ARRAYSZ 28 /* size of .finiarray */ |
|
102 |
#define DT_RUNPATH 29 /* run-time search path */ |
|
103 |
#define DT_FLAGS 30 /* state flags - see DF_* */ |
|
104 |
||
3492 | 105 |
/* |
106 |
* DT_* encoding rules: The value of each dynamic tag determines the |
|
107 |
* interpretation of the d_un union. This convention provides for simpler |
|
108 |
* interpretation of dynamic tags by external tools. A tag whose value |
|
109 |
* is an even number indicates a dynamic section entry that uses d_ptr. |
|
110 |
* A tag whose value is an odd number indicates a dynamic section entry |
|
111 |
* that uses d_val, or that uses neither d_ptr nor d_val. |
|
112 |
* |
|
113 |
* There are exceptions to the above rule: |
|
114 |
* - Tags with values that are less than DT_ENCODING. |
|
115 |
* - Tags with values that fall between DT_LOOS and DT_SUNW_ENCODING |
|
116 |
* - Tags with values that fall between DT_HIOS and DT_LOPROC |
|
117 |
* |
|
118 |
* Third party tools must handle these exception ranges explicitly |
|
119 |
* on an item by item basis. |
|
120 |
*/ |
|
121 |
#define DT_ENCODING 32 /* positive tag DT_* encoding rules */ |
|
122 |
/* start after this */ |
|
0 | 123 |
#define DT_PREINIT_ARRAY 32 /* pointer to .preinitarray segment */ |
124 |
#define DT_PREINIT_ARRAYSZ 33 /* size of .preinitarray segment */ |
|
125 |
||
126 |
#define DT_MAXPOSTAGS 34 /* number of positive tags */ |
|
127 |
||
3492 | 128 |
/* |
129 |
* DT_* encoding rules do not apply between DT_LOOS and DT_SUNW_ENCODING |
|
130 |
*/ |
|
0 | 131 |
#define DT_LOOS 0x6000000d /* OS specific range */ |
132 |
#define DT_SUNW_AUXILIARY 0x6000000d /* symbol auxiliary name */ |
|
133 |
#define DT_SUNW_RTLDINF 0x6000000e /* ld.so.1 info (private) */ |
|
134 |
#define DT_SUNW_FILTER 0x6000000f /* symbol filter name */ |
|
135 |
#define DT_SUNW_CAP 0x60000010 /* hardware/software */ |
|
136 |
/* capabilities */ |
|
2766
897bcb036a29
PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents:
1698
diff
changeset
|
137 |
#define DT_SUNW_SYMTAB 0x60000011 /* symtab with local fcn */ |
897bcb036a29
PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents:
1698
diff
changeset
|
138 |
/* symbols immediately */ |
897bcb036a29
PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents:
1698
diff
changeset
|
139 |
/* preceding DT_SYMTAB */ |
3492 | 140 |
#define DT_SUNW_SYMSZ 0x60000012 /* Size of SUNW_SYMTAB table */ |
141 |
||
142 |
/* |
|
143 |
* DT_* encoding rules apply between DT_SUNW_ENCODING and DT_HIOS |
|
144 |
*/ |
|
145 |
#define DT_SUNW_ENCODING 0x60000013 /* DT_* encoding rules resume */ |
|
146 |
/* after this */ |
|
9273
9a0603d78ad3
6821619 Solaris linkers need systematic approach to ELF OSABI
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
9085
diff
changeset
|
147 |
#define DT_SUNW_SORTENT 0x60000013 /* sizeof [SYM|TLS]SORT entry */ |
3492 | 148 |
#define DT_SUNW_SYMSORT 0x60000014 /* sym indices sorted by addr */ |
149 |
#define DT_SUNW_SYMSORTSZ 0x60000015 /* size of SUNW_SYMSORT */ |
|
150 |
#define DT_SUNW_TLSSORT 0x60000016 /* tls sym ndx sort by offset */ |
|
151 |
#define DT_SUNW_TLSSORTSZ 0x60000017 /* size of SUNW_TLSSORT */ |
|
11827
d7ef53deac3f
6918143 symbol capabilities
Rod Evans <Rod.Evans@Sun.COM>
parents:
11734
diff
changeset
|
152 |
#define DT_SUNW_CAPINFO 0x60000018 /* capabilities symbols */ |
3850
71162a8a771b
PSARC 2007/127 Reserved space for editing ELF dynamic sections
ab196087
parents:
3492
diff
changeset
|
153 |
#define DT_SUNW_STRPAD 0x60000019 /* # of unused bytes at the */ |
71162a8a771b
PSARC 2007/127 Reserved space for editing ELF dynamic sections
ab196087
parents:
3492
diff
changeset
|
154 |
/* end of dynstr */ |
11827
d7ef53deac3f
6918143 symbol capabilities
Rod Evans <Rod.Evans@Sun.COM>
parents:
11734
diff
changeset
|
155 |
#define DT_SUNW_CAPCHAIN 0x6000001a /* capabilities chain info */ |
6206 | 156 |
#define DT_SUNW_LDMACH 0x6000001b /* EM_ machine code of linker */ |
157 |
/* that produced object */ |
|
11827
d7ef53deac3f
6918143 symbol capabilities
Rod Evans <Rod.Evans@Sun.COM>
parents:
11734
diff
changeset
|
158 |
#define DT_SUNW_CAPCHAINENT 0x6000001d /* capabilities chain entry */ |
d7ef53deac3f
6918143 symbol capabilities
Rod Evans <Rod.Evans@Sun.COM>
parents:
11734
diff
changeset
|
159 |
#define DT_SUNW_CAPCHAINSZ 0x6000001f /* capabilities chain size */ |
3850
71162a8a771b
PSARC 2007/127 Reserved space for editing ELF dynamic sections
ab196087
parents:
3492
diff
changeset
|
160 |
|
3492 | 161 |
/* |
162 |
* DT_* encoding rules do not apply between DT_HIOS and DT_LOPROC |
|
163 |
*/ |
|
0 | 164 |
#define DT_HIOS 0x6ffff000 |
165 |
||
166 |
/* |
|
167 |
* The following values have been deprecated and remain here to allow |
|
168 |
* compatibility with older binaries. |
|
169 |
*/ |
|
170 |
#define DT_DEPRECATED_SPARC_REGISTER 0x7000001 |
|
171 |
||
172 |
/* |
|
173 |
* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the |
|
174 |
* Dyn.d_un.d_val field of the Elf*_Dyn structure. |
|
175 |
*/ |
|
176 |
#define DT_VALRNGLO 0x6ffffd00 |
|
9085
ff7eb0bace56
6813909 generalize eh_frame support to non-amd64 platforms
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
7682
diff
changeset
|
177 |
|
ff7eb0bace56
6813909 generalize eh_frame support to non-amd64 platforms
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
7682
diff
changeset
|
178 |
#define DT_GNU_PRELINKED 0x6ffffdf5 /* prelinking timestamp (unused) */ |
ff7eb0bace56
6813909 generalize eh_frame support to non-amd64 platforms
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
7682
diff
changeset
|
179 |
#define DT_GNU_CONFLICTSZ 0x6ffffdf6 /* size of conflict section (unused) */ |
ff7eb0bace56
6813909 generalize eh_frame support to non-amd64 platforms
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
7682
diff
changeset
|
180 |
#define DT_GNU_LIBLISTSZ 0x6ffffdf7 /* size of library list (unused) */ |
0 | 181 |
#define DT_CHECKSUM 0x6ffffdf8 /* elf checksum */ |
182 |
#define DT_PLTPADSZ 0x6ffffdf9 /* pltpadding size */ |
|
183 |
#define DT_MOVEENT 0x6ffffdfa /* move table entry size */ |
|
184 |
#define DT_MOVESZ 0x6ffffdfb /* move table size */ |
|
185 |
#define DT_FEATURE_1 0x6ffffdfc /* feature holder */ |
|
186 |
#define DT_POSFLAG_1 0x6ffffdfd /* flags for DT_* entries, effecting */ |
|
187 |
/* the following DT_* entry. */ |
|
188 |
/* See DF_P1_* definitions */ |
|
189 |
#define DT_SYMINSZ 0x6ffffdfe /* syminfo table size (in bytes) */ |
|
190 |
#define DT_SYMINENT 0x6ffffdff /* syminfo entry size (in bytes) */ |
|
191 |
#define DT_VALRNGHI 0x6ffffdff |
|
192 |
||
193 |
/* |
|
194 |
* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the |
|
195 |
* Dyn.d_un.d_ptr field of the Elf*_Dyn structure. |
|
196 |
* |
|
197 |
* If any adjustment is made to the ELF object after it has been |
|
198 |
* built, these entries will need to be adjusted. |
|
199 |
*/ |
|
200 |
#define DT_ADDRRNGLO 0x6ffffe00 |
|
9085
ff7eb0bace56
6813909 generalize eh_frame support to non-amd64 platforms
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
7682
diff
changeset
|
201 |
|
ff7eb0bace56
6813909 generalize eh_frame support to non-amd64 platforms
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
7682
diff
changeset
|
202 |
#define DT_GNU_HASH 0x6ffffef5 /* GNU-style hash table (unused) */ |
ff7eb0bace56
6813909 generalize eh_frame support to non-amd64 platforms
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
7682
diff
changeset
|
203 |
#define DT_TLSDESC_PLT 0x6ffffef6 /* GNU (unused) */ |
ff7eb0bace56
6813909 generalize eh_frame support to non-amd64 platforms
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
7682
diff
changeset
|
204 |
#define DT_TLSDESC_GOT 0x6ffffef7 /* GNU (unused) */ |
ff7eb0bace56
6813909 generalize eh_frame support to non-amd64 platforms
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
7682
diff
changeset
|
205 |
#define DT_GNU_CONFLICT 0x6ffffef8 /* start of conflict section (unused) */ |
ff7eb0bace56
6813909 generalize eh_frame support to non-amd64 platforms
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
7682
diff
changeset
|
206 |
#define DT_GNU_LIBLIST 0x6ffffef9 /* Library list (unused) */ |
ff7eb0bace56
6813909 generalize eh_frame support to non-amd64 platforms
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
7682
diff
changeset
|
207 |
|
0 | 208 |
#define DT_CONFIG 0x6ffffefa /* configuration information */ |
209 |
#define DT_DEPAUDIT 0x6ffffefb /* dependency auditing */ |
|
210 |
#define DT_AUDIT 0x6ffffefc /* object auditing */ |
|
211 |
#define DT_PLTPAD 0x6ffffefd /* pltpadding (sparcv9) */ |
|
212 |
#define DT_MOVETAB 0x6ffffefe /* move table */ |
|
213 |
#define DT_SYMINFO 0x6ffffeff /* syminfo table */ |
|
214 |
#define DT_ADDRRNGHI 0x6ffffeff |
|
215 |
||
216 |
/* |
|
217 |
* The following DT_* entries should have been assigned within one of the |
|
218 |
* DT_* ranges, but existed before such ranges had been established. |
|
219 |
*/ |
|
4716
c06a3889ba02
6577462 Additional improvements needed to handling of gcc's symbol versioning
ab196087
parents:
4679
diff
changeset
|
220 |
#define DT_VERSYM 0x6ffffff0 /* version symbol table - unused by */ |
c06a3889ba02
6577462 Additional improvements needed to handling of gcc's symbol versioning
ab196087
parents:
4679
diff
changeset
|
221 |
/* Solaris (see libld/update.c) */ |
0 | 222 |
|
223 |
#define DT_RELACOUNT 0x6ffffff9 /* number of RELATIVE relocations */ |
|
224 |
#define DT_RELCOUNT 0x6ffffffa /* number of RELATIVE relocations */ |
|
225 |
#define DT_FLAGS_1 0x6ffffffb /* state flags - see DF_1_* defs */ |
|
226 |
#define DT_VERDEF 0x6ffffffc /* version definition table and */ |
|
227 |
#define DT_VERDEFNUM 0x6ffffffd /* associated no. of entries */ |
|
228 |
#define DT_VERNEED 0x6ffffffe /* version needed table and */ |
|
229 |
#define DT_VERNEEDNUM 0x6fffffff /* associated no. of entries */ |
|
230 |
||
231 |
/* |
|
232 |
* DT_* entries between DT_HIPROC and DT_LOPROC are reserved for processor |
|
233 |
* specific semantics. |
|
3492 | 234 |
* |
235 |
* DT_* encoding rules apply to all tag values larger than DT_LOPROC. |
|
0 | 236 |
*/ |
237 |
#define DT_LOPROC 0x70000000 /* processor specific range */ |
|
238 |
#define DT_AUXILIARY 0x7ffffffd /* shared library auxiliary name */ |
|
239 |
#define DT_USED 0x7ffffffe /* ignored - same as needed */ |
|
240 |
#define DT_FILTER 0x7fffffff /* shared library filter name */ |
|
241 |
#define DT_HIPROC 0x7fffffff |
|
242 |
||
243 |
||
244 |
/* |
|
245 |
* Values for DT_FLAGS |
|
246 |
*/ |
|
247 |
#define DF_ORIGIN 0x00000001 /* ORIGIN processing required */ |
|
248 |
#define DF_SYMBOLIC 0x00000002 /* symbolic bindings in effect */ |
|
249 |
#define DF_TEXTREL 0x00000004 /* text relocations remain */ |
|
250 |
#define DF_BIND_NOW 0x00000008 /* process all relocations */ |
|
251 |
#define DF_STATIC_TLS 0x00000010 /* obj. contains static TLS refs */ |
|
252 |
||
253 |
/* |
|
254 |
* Values for the DT_POSFLAG_1 .dynamic entry. |
|
255 |
* These values only affect the following DT_* entry. |
|
256 |
*/ |
|
257 |
#define DF_P1_LAZYLOAD 0x00000001 /* following object is to be */ |
|
258 |
/* lazy loaded */ |
|
259 |
#define DF_P1_GROUPPERM 0x00000002 /* following object's symbols are */ |
|
260 |
/* not available for general */ |
|
261 |
/* symbol bindings. */ |
|
12449
a87750d92895
6943772 Testing for a symbols existence with RTLD_PROBE is compromised by RTLD_BIND_NOW
Rod Evans <Rod.Evans@Sun.COM>
parents:
11827
diff
changeset
|
262 |
#define DF_P1_DEFERRED 0x00000004 /* following object is deferred */ |
a87750d92895
6943772 Testing for a symbols existence with RTLD_PROBE is compromised by RTLD_BIND_NOW
Rod Evans <Rod.Evans@Sun.COM>
parents:
11827
diff
changeset
|
263 |
|
0 | 264 |
/* |
265 |
* Values for the DT_FLAGS_1 .dynamic entry. |
|
266 |
*/ |
|
267 |
#define DF_1_NOW 0x00000001 /* set RTLD_NOW for this object */ |
|
268 |
#define DF_1_GLOBAL 0x00000002 /* set RTLD_GLOBAL for this object */ |
|
269 |
#define DF_1_GROUP 0x00000004 /* set RTLD_GROUP for this object */ |
|
270 |
#define DF_1_NODELETE 0x00000008 /* set RTLD_NODELETE for this object */ |
|
271 |
#define DF_1_LOADFLTR 0x00000010 /* trigger filtee loading at runtime */ |
|
272 |
#define DF_1_INITFIRST 0x00000020 /* set RTLD_INITFIRST for this object */ |
|
273 |
#define DF_1_NOOPEN 0x00000040 /* set RTLD_NOOPEN for this object */ |
|
274 |
#define DF_1_ORIGIN 0x00000080 /* ORIGIN processing required */ |
|
275 |
#define DF_1_DIRECT 0x00000100 /* direct binding enabled */ |
|
10792
809cb9af791e
6888489 Null environment variables are not overriding crle(1) replaceable environment variables.
Rod Evans <Rod.Evans@Sun.COM>
parents:
9273
diff
changeset
|
276 |
#define DF_1_TRANS 0x00000200 /* unused historical name */ |
3466
4cc6ca6917b5
PSARC/2006/714 ld(1) mapfile: symbol interpose definition
rie
parents:
2766
diff
changeset
|
277 |
#define DF_1_INTERPOSE 0x00000400 /* object is an interposer */ |
0 | 278 |
#define DF_1_NODEFLIB 0x00000800 /* ignore default library search path */ |
279 |
#define DF_1_NODUMP 0x00001000 /* object can't be dldump(3x)'ed */ |
|
280 |
#define DF_1_CONFALT 0x00002000 /* configuration alternative created */ |
|
281 |
#define DF_1_ENDFILTEE 0x00004000 /* filtee terminates filters search */ |
|
282 |
#define DF_1_DISPRELDNE 0x00008000 /* disp reloc applied at build time */ |
|
283 |
#define DF_1_DISPRELPND 0x00010000 /* disp reloc applied at run-time */ |
|
284 |
#define DF_1_NODIRECT 0x00020000 /* object contains symbols that */ |
|
285 |
/* cannot be directly bound to */ |
|
1682 | 286 |
#define DF_1_IGNMULDEF 0x00040000 /* internal: krtld ignore muldefs */ |
287 |
#define DF_1_NOKSYMS 0x00080000 /* internal: don't export object's */ |
|
288 |
/* symbols via /dev/ksyms */ |
|
11734
d29dc9c2b6c5
6916788 ld version 2 mapfile syntax
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
10792
diff
changeset
|
289 |
#define DF_1_NOHDR 0x00100000 /* mapfile: 1st segment mapping */ |
1698 | 290 |
/* omits ELF & program headers */ |
3850
71162a8a771b
PSARC 2007/127 Reserved space for editing ELF dynamic sections
ab196087
parents:
3492
diff
changeset
|
291 |
#define DF_1_EDITED 0x00200000 /* object has been modified since */ |
71162a8a771b
PSARC 2007/127 Reserved space for editing ELF dynamic sections
ab196087
parents:
3492
diff
changeset
|
292 |
/* being built by 'ld' */ |
1682 | 293 |
#define DF_1_NORELOC 0x00400000 /* internal: unrelocated object */ |
3466
4cc6ca6917b5
PSARC/2006/714 ld(1) mapfile: symbol interpose definition
rie
parents:
2766
diff
changeset
|
294 |
#define DF_1_SYMINTPOSE 0x00800000 /* individual symbol interposers */ |
4cc6ca6917b5
PSARC/2006/714 ld(1) mapfile: symbol interpose definition
rie
parents:
2766
diff
changeset
|
295 |
/* exist */ |
4679 | 296 |
#define DF_1_GLOBAUDIT 0x01000000 /* establish global auditing */ |
5220
caa2c0074088
PSARC/2007/559 new symbol visibilities - EXPORTED, SINGLETON, and ELIMINATE
rie
parents:
4716
diff
changeset
|
297 |
#define DF_1_SINGLETON 0x02000000 /* singleton symbols exist */ |
0 | 298 |
|
299 |
/* |
|
1698 | 300 |
* Values set to DT_FEATURE_1 tag's d_val. |
0 | 301 |
*/ |
302 |
#define DTF_1_PARINIT 0x00000001 /* partially initialization feature */ |
|
303 |
#define DTF_1_CONFEXP 0x00000002 /* configuration file expected */ |
|
304 |
||
305 |
||
306 |
/* |
|
307 |
* Version structures. There are three types of version structure: |
|
308 |
* |
|
309 |
* o A definition of the versions within the image itself. |
|
310 |
* Each version definition is assigned a unique index (starting from |
|
311 |
* VER_NDX_BGNDEF) which is used to cross-reference symbols associated to |
|
312 |
* the version. Each version can have one or more dependencies on other |
|
313 |
* version definitions within the image. The version name, and any |
|
314 |
* dependency names, are specified in the version definition auxiliary |
|
315 |
* array. Version definition entries require a version symbol index table. |
|
316 |
* |
|
317 |
* o A version requirement on a needed dependency. Each needed entry |
|
318 |
* specifies the shared object dependency (as specified in DT_NEEDED). |
|
319 |
* One or more versions required from this dependency are specified in the |
|
320 |
* version needed auxiliary array. |
|
321 |
* |
|
322 |
* o A version symbol index table. Each symbol indexes into this array |
|
323 |
* to determine its version index. Index values of VER_NDX_BGNDEF or |
|
324 |
* greater indicate the version definition to which a symbol is associated. |
|
325 |
* (the size of a symbol index entry is recorded in the sh_info field). |
|
326 |
*/ |
|
327 |
#ifndef _ASM |
|
328 |
||
329 |
typedef struct { /* Version Definition Structure. */ |
|
330 |
Elf32_Half vd_version; /* this structures version revision */ |
|
331 |
Elf32_Half vd_flags; /* version information */ |
|
332 |
Elf32_Half vd_ndx; /* version index */ |
|
333 |
Elf32_Half vd_cnt; /* no. of associated aux entries */ |
|
334 |
Elf32_Word vd_hash; /* version name hash value */ |
|
335 |
Elf32_Word vd_aux; /* no. of bytes from start of this */ |
|
336 |
/* verdef to verdaux array */ |
|
337 |
Elf32_Word vd_next; /* no. of bytes from start of this */ |
|
338 |
} Elf32_Verdef; /* verdef to next verdef entry */ |
|
339 |
||
340 |
typedef struct { /* Verdef Auxiliary Structure. */ |
|
341 |
Elf32_Word vda_name; /* first element defines the version */ |
|
342 |
/* name. Additional entries */ |
|
343 |
/* define dependency names. */ |
|
344 |
Elf32_Word vda_next; /* no. of bytes from start of this */ |
|
345 |
} Elf32_Verdaux; /* verdaux to next verdaux entry */ |
|
346 |
||
347 |
||
348 |
typedef struct { /* Version Requirement Structure. */ |
|
349 |
Elf32_Half vn_version; /* this structures version revision */ |
|
350 |
Elf32_Half vn_cnt; /* no. of associated aux entries */ |
|
351 |
Elf32_Word vn_file; /* name of needed dependency (file) */ |
|
352 |
Elf32_Word vn_aux; /* no. of bytes from start of this */ |
|
353 |
/* verneed to vernaux array */ |
|
354 |
Elf32_Word vn_next; /* no. of bytes from start of this */ |
|
355 |
} Elf32_Verneed; /* verneed to next verneed entry */ |
|
356 |
||
357 |
typedef struct { /* Verneed Auxiliary Structure. */ |
|
358 |
Elf32_Word vna_hash; /* version name hash value */ |
|
359 |
Elf32_Half vna_flags; /* version information */ |
|
360 |
Elf32_Half vna_other; |
|
361 |
Elf32_Word vna_name; /* version name */ |
|
362 |
Elf32_Word vna_next; /* no. of bytes from start of this */ |
|
363 |
} Elf32_Vernaux; /* vernaux to next vernaux entry */ |
|
364 |
||
365 |
typedef Elf32_Half Elf32_Versym; /* Version symbol index array */ |
|
366 |
||
367 |
typedef struct { |
|
368 |
Elf32_Half si_boundto; /* direct bindings - symbol bound to */ |
|
369 |
Elf32_Half si_flags; /* per symbol flags */ |
|
370 |
} Elf32_Syminfo; |
|
371 |
||
372 |
||
373 |
#if defined(_LP64) || defined(_LONGLONG_TYPE) |
|
374 |
typedef struct { |
|
375 |
Elf64_Half vd_version; /* this structures version revision */ |
|
376 |
Elf64_Half vd_flags; /* version information */ |
|
377 |
Elf64_Half vd_ndx; /* version index */ |
|
378 |
Elf64_Half vd_cnt; /* no. of associated aux entries */ |
|
379 |
Elf64_Word vd_hash; /* version name hash value */ |
|
380 |
Elf64_Word vd_aux; /* no. of bytes from start of this */ |
|
381 |
/* verdef to verdaux array */ |
|
382 |
Elf64_Word vd_next; /* no. of bytes from start of this */ |
|
383 |
} Elf64_Verdef; /* verdef to next verdef entry */ |
|
384 |
||
385 |
typedef struct { |
|
386 |
Elf64_Word vda_name; /* first element defines the version */ |
|
387 |
/* name. Additional entries */ |
|
388 |
/* define dependency names. */ |
|
389 |
Elf64_Word vda_next; /* no. of bytes from start of this */ |
|
390 |
} Elf64_Verdaux; /* verdaux to next verdaux entry */ |
|
391 |
||
392 |
typedef struct { |
|
393 |
Elf64_Half vn_version; /* this structures version revision */ |
|
394 |
Elf64_Half vn_cnt; /* no. of associated aux entries */ |
|
395 |
Elf64_Word vn_file; /* name of needed dependency (file) */ |
|
396 |
Elf64_Word vn_aux; /* no. of bytes from start of this */ |
|
397 |
/* verneed to vernaux array */ |
|
398 |
Elf64_Word vn_next; /* no. of bytes from start of this */ |
|
399 |
} Elf64_Verneed; /* verneed to next verneed entry */ |
|
400 |
||
401 |
typedef struct { |
|
402 |
Elf64_Word vna_hash; /* version name hash value */ |
|
403 |
Elf64_Half vna_flags; /* version information */ |
|
404 |
Elf64_Half vna_other; |
|
405 |
Elf64_Word vna_name; /* version name */ |
|
406 |
Elf64_Word vna_next; /* no. of bytes from start of this */ |
|
407 |
} Elf64_Vernaux; /* vernaux to next vernaux entry */ |
|
408 |
||
409 |
typedef Elf64_Half Elf64_Versym; |
|
410 |
||
411 |
typedef struct { |
|
412 |
Elf64_Half si_boundto; /* direct bindings - symbol bound to */ |
|
413 |
Elf64_Half si_flags; /* per symbol flags */ |
|
414 |
} Elf64_Syminfo; |
|
415 |
#endif /* defined(_LP64) || defined(_LONGLONG_TYPE) */ |
|
416 |
||
417 |
#endif /* _ASM */ |
|
418 |
||
419 |
/* |
|
420 |
* Versym symbol index values. Values greater than VER_NDX_GLOBAL |
|
421 |
* and less then VER_NDX_LORESERVE associate symbols with user |
|
422 |
* specified version descriptors. |
|
423 |
*/ |
|
424 |
#define VER_NDX_LOCAL 0 /* symbol is local */ |
|
425 |
#define VER_NDX_GLOBAL 1 /* symbol is global and assigned to */ |
|
426 |
/* the base version */ |
|
427 |
#define VER_NDX_LORESERVE 0xff00 /* beginning of RESERVED entries */ |
|
428 |
#define VER_NDX_ELIMINATE 0xff01 /* symbol is to be eliminated */ |
|
429 |
||
430 |
/* |
|
7682
b04d06fd448f
6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
6206
diff
changeset
|
431 |
* Verdef (vd_flags) and Vernaux (vna_flags) flags values. |
0 | 432 |
*/ |
433 |
#define VER_FLG_BASE 0x1 /* version definition of file itself */ |
|
7682
b04d06fd448f
6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
6206
diff
changeset
|
434 |
/* (Verdef only) */ |
0 | 435 |
#define VER_FLG_WEAK 0x2 /* weak version identifier */ |
7682
b04d06fd448f
6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
6206
diff
changeset
|
436 |
#define VER_FLG_INFO 0x4 /* version is recorded in object for */ |
b04d06fd448f
6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
6206
diff
changeset
|
437 |
/* informational purposes */ |
b04d06fd448f
6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
6206
diff
changeset
|
438 |
/* (Versym reference) only. No */ |
b04d06fd448f
6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
6206
diff
changeset
|
439 |
/* runtime verification is */ |
b04d06fd448f
6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
6206
diff
changeset
|
440 |
/* required. (Vernaux only) */ |
0 | 441 |
|
442 |
/* |
|
443 |
* Verdef version values. |
|
444 |
*/ |
|
445 |
#define VER_DEF_NONE 0 /* Ver_def version */ |
|
446 |
#define VER_DEF_CURRENT 1 |
|
447 |
#define VER_DEF_NUM 2 |
|
448 |
||
449 |
/* |
|
450 |
* Verneed version values. |
|
451 |
*/ |
|
452 |
#define VER_NEED_NONE 0 /* Ver_need version */ |
|
453 |
#define VER_NEED_CURRENT 1 |
|
454 |
#define VER_NEED_NUM 2 |
|
455 |
||
456 |
||
457 |
/* |
|
458 |
* Syminfo flag values |
|
459 |
*/ |
|
460 |
#define SYMINFO_FLG_DIRECT 0x0001 /* symbol ref has direct association */ |
|
461 |
/* to object containing defn. */ |
|
9273
9a0603d78ad3
6821619 Solaris linkers need systematic approach to ELF OSABI
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
9085
diff
changeset
|
462 |
#define SYMINFO_FLG_FILTER 0x0002 /* symbol ref is associated to a */ |
9a0603d78ad3
6821619 Solaris linkers need systematic approach to ELF OSABI
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
9085
diff
changeset
|
463 |
/* standard filter */ |
9a0603d78ad3
6821619 Solaris linkers need systematic approach to ELF OSABI
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
9085
diff
changeset
|
464 |
#define SYMINFO_FLG_PASSTHRU SYMINFO_FLG_FILTER /* unused historical name */ |
0 | 465 |
#define SYMINFO_FLG_COPY 0x0004 /* symbol is a copy-reloc */ |
3466
4cc6ca6917b5
PSARC/2006/714 ld(1) mapfile: symbol interpose definition
rie
parents:
2766
diff
changeset
|
466 |
#define SYMINFO_FLG_LAZYLOAD 0x0008 /* object containing defn. should be */ |
0 | 467 |
/* lazily-loaded */ |
468 |
#define SYMINFO_FLG_DIRECTBIND 0x0010 /* ref should be bound directly to */ |
|
469 |
/* object containing defn. */ |
|
470 |
#define SYMINFO_FLG_NOEXTDIRECT 0x0020 /* don't let an external reference */ |
|
471 |
/* directly bind to this symbol */ |
|
9273
9a0603d78ad3
6821619 Solaris linkers need systematic approach to ELF OSABI
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
9085
diff
changeset
|
472 |
#define SYMINFO_FLG_AUXILIARY 0x0040 /* symbol ref is associated to a */ |
9a0603d78ad3
6821619 Solaris linkers need systematic approach to ELF OSABI
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents:
9085
diff
changeset
|
473 |
/* auxiliary filter */ |
3466
4cc6ca6917b5
PSARC/2006/714 ld(1) mapfile: symbol interpose definition
rie
parents:
2766
diff
changeset
|
474 |
#define SYMINFO_FLG_INTERPOSE 0x0080 /* symbol defines an interposer */ |
11827
d7ef53deac3f
6918143 symbol capabilities
Rod Evans <Rod.Evans@Sun.COM>
parents:
11734
diff
changeset
|
475 |
#define SYMINFO_FLG_CAP 0x0100 /* symbol is capabilities specific */ |
12449
a87750d92895
6943772 Testing for a symbols existence with RTLD_PROBE is compromised by RTLD_BIND_NOW
Rod Evans <Rod.Evans@Sun.COM>
parents:
11827
diff
changeset
|
476 |
#define SYMINFO_FLG_DEFERRED 0x0200 /* symbol should not be included in */ |
a87750d92895
6943772 Testing for a symbols existence with RTLD_PROBE is compromised by RTLD_BIND_NOW
Rod Evans <Rod.Evans@Sun.COM>
parents:
11827
diff
changeset
|
477 |
/* BIND_NOW relocations */ |
0 | 478 |
|
479 |
/* |
|
480 |
* Syminfo.si_boundto values. |
|
481 |
*/ |
|
482 |
#define SYMINFO_BT_SELF 0xffff /* symbol bound to self */ |
|
483 |
#define SYMINFO_BT_PARENT 0xfffe /* symbol bound to parent */ |
|
484 |
#define SYMINFO_BT_NONE 0xfffd /* no special symbol binding */ |
|
485 |
#define SYMINFO_BT_EXTERN 0xfffc /* symbol defined as external */ |
|
486 |
#define SYMINFO_BT_LOWRESERVE 0xff00 /* beginning of reserved entries */ |
|
487 |
||
488 |
/* |
|
489 |
* Syminfo version values. |
|
490 |
*/ |
|
491 |
#define SYMINFO_NONE 0 /* Syminfo version */ |
|
492 |
#define SYMINFO_CURRENT 1 |
|
493 |
#define SYMINFO_NUM 2 |
|
494 |
||
495 |
||
496 |
/* |
|
497 |
* Public structure defined and maintained within the runtime linker |
|
498 |
*/ |
|
499 |
#ifndef _ASM |
|
500 |
||
501 |
typedef struct link_map Link_map; |
|
502 |
||
503 |
struct link_map { |
|
504 |
unsigned long l_addr; /* address at which object is mapped */ |
|
505 |
char *l_name; /* full name of loaded object */ |
|
506 |
#ifdef _LP64 |
|
507 |
Elf64_Dyn *l_ld; /* dynamic structure of object */ |
|
508 |
#else |
|
509 |
Elf32_Dyn *l_ld; /* dynamic structure of object */ |
|
510 |
#endif |
|
511 |
Link_map *l_next; /* next link object */ |
|
512 |
Link_map *l_prev; /* previous link object */ |
|
513 |
char *l_refname; /* filters reference name */ |
|
514 |
}; |
|
515 |
||
516 |
#ifdef _SYSCALL32 |
|
517 |
typedef struct link_map32 Link_map32; |
|
518 |
||
519 |
struct link_map32 { |
|
520 |
Elf32_Word l_addr; |
|
521 |
Elf32_Addr l_name; |
|
522 |
Elf32_Addr l_ld; |
|
523 |
Elf32_Addr l_next; |
|
524 |
Elf32_Addr l_prev; |
|
525 |
Elf32_Addr l_refname; |
|
526 |
}; |
|
527 |
#endif |
|
528 |
||
529 |
typedef enum { |
|
530 |
RT_CONSISTENT, |
|
531 |
RT_ADD, |
|
532 |
RT_DELETE |
|
533 |
} r_state_e; |
|
534 |
||
535 |
typedef enum { |
|
536 |
RD_FL_NONE = 0, /* no flags */ |
|
537 |
RD_FL_ODBG = (1<<0), /* old style debugger present */ |
|
538 |
RD_FL_DBG = (1<<1) /* debugging enabled */ |
|
539 |
} rd_flags_e; |
|
540 |
||
541 |
||
542 |
||
543 |
/* |
|
544 |
* Debugging events enabled inside of the runtime linker. To |
|
545 |
* access these events see the librtld_db interface. |
|
546 |
*/ |
|
547 |
typedef enum { |
|
548 |
RD_NONE = 0, /* no event */ |
|
549 |
RD_PREINIT, /* the Initial rendezvous before .init */ |
|
550 |
RD_POSTINIT, /* the Second rendezvous after .init */ |
|
551 |
RD_DLACTIVITY /* a dlopen or dlclose has happened */ |
|
552 |
} rd_event_e; |
|
553 |
||
554 |
struct r_debug { |
|
555 |
int r_version; /* debugging info version no. */ |
|
556 |
Link_map *r_map; /* address of link_map */ |
|
557 |
unsigned long r_brk; /* address of update routine */ |
|
558 |
r_state_e r_state; |
|
559 |
unsigned long r_ldbase; /* base addr of ld.so */ |
|
560 |
Link_map *r_ldsomap; /* address of ld.so.1's link map */ |
|
561 |
rd_event_e r_rdevent; /* debug event */ |
|
562 |
rd_flags_e r_flags; /* misc flags. */ |
|
563 |
}; |
|
564 |
||
565 |
#ifdef _SYSCALL32 |
|
566 |
struct r_debug32 { |
|
567 |
Elf32_Word r_version; /* debugging info version no. */ |
|
568 |
Elf32_Addr r_map; /* address of link_map */ |
|
569 |
Elf32_Word r_brk; /* address of update routine */ |
|
570 |
r_state_e r_state; |
|
571 |
Elf32_Word r_ldbase; /* base addr of ld.so */ |
|
572 |
Elf32_Addr r_ldsomap; /* address of ld.so.1's link map */ |
|
573 |
rd_event_e r_rdevent; /* debug event */ |
|
574 |
rd_flags_e r_flags; /* misc flags. */ |
|
575 |
}; |
|
576 |
#endif |
|
577 |
||
578 |
||
579 |
#define R_DEBUG_VERSION 2 /* current r_debug version */ |
|
580 |
#endif /* _ASM */ |
|
581 |
||
582 |
/* |
|
583 |
* Attribute/value structures used to bootstrap ELF-based dynamic linker. |
|
584 |
*/ |
|
585 |
#ifndef _ASM |
|
586 |
typedef struct { |
|
587 |
Elf32_Sword eb_tag; /* what this one is */ |
|
588 |
union { /* possible values */ |
|
589 |
Elf32_Word eb_val; |
|
590 |
Elf32_Addr eb_ptr; |
|
591 |
Elf32_Off eb_off; |
|
592 |
} eb_un; |
|
593 |
} Elf32_Boot; |
|
594 |
||
595 |
#if defined(_LP64) || defined(_LONGLONG_TYPE) |
|
596 |
typedef struct { |
|
597 |
Elf64_Xword eb_tag; /* what this one is */ |
|
598 |
union { /* possible values */ |
|
599 |
Elf64_Xword eb_val; |
|
600 |
Elf64_Addr eb_ptr; |
|
601 |
Elf64_Off eb_off; |
|
602 |
} eb_un; |
|
603 |
} Elf64_Boot; |
|
604 |
#endif /* defined(_LP64) || defined(_LONGLONG_TYPE) */ |
|
605 |
#endif /* _ASM */ |
|
606 |
||
607 |
/* |
|
608 |
* Attributes |
|
609 |
*/ |
|
610 |
#define EB_NULL 0 /* (void) last entry */ |
|
611 |
#define EB_DYNAMIC 1 /* (*) dynamic structure of subject */ |
|
612 |
#define EB_LDSO_BASE 2 /* (caddr_t) base address of ld.so */ |
|
613 |
#define EB_ARGV 3 /* (caddr_t) argument vector */ |
|
614 |
#define EB_ENVP 4 /* (char **) environment strings */ |
|
615 |
#define EB_AUXV 5 /* (auxv_t *) auxiliary vector */ |
|
616 |
#define EB_DEVZERO 6 /* (int) fd for /dev/zero */ |
|
617 |
#define EB_PAGESIZE 7 /* (int) page size */ |
|
618 |
#define EB_MAX 8 /* number of "EBs" */ |
|
619 |
#define EB_MAX_SIZE32 64 /* size in bytes, _ILP32 */ |
|
620 |
#define EB_MAX_SIZE64 128 /* size in bytes, _LP64 */ |
|
621 |
||
622 |
||
623 |
#ifndef _ASM |
|
624 |
||
625 |
#ifdef __STDC__ |
|
626 |
||
627 |
/* |
|
628 |
* Concurrency communication structure for libc callbacks. |
|
629 |
*/ |
|
630 |
extern void _ld_libc(void *); |
|
631 |
#else /* __STDC__ */ |
|
632 |
extern void _ld_libc(); |
|
633 |
#endif /* __STDC__ */ |
|
634 |
||
635 |
#pragma unknown_control_flow(_ld_libc) |
|
636 |
#endif /* _ASM */ |
|
637 |
||
638 |
#ifdef __cplusplus |
|
639 |
} |
|
640 |
#endif |
|
641 |
||
642 |
#endif /* _SYS_LINK_H */ |