1 | /* Support macros for making weak and strong aliases for symbols,
|
---|
2 | and for using symbol sets and linker warnings with GNU ld.
|
---|
3 | Copyright (C) 1995-1998,2000-2003,2004, 2005 Free Software Foundation, Inc.
|
---|
4 | This file is part of the GNU C Library.
|
---|
5 |
|
---|
6 | The GNU C Library is free software; you can redistribute it and/or
|
---|
7 | modify it under the terms of the GNU Lesser General Public
|
---|
8 | License as published by the Free Software Foundation; either
|
---|
9 | version 2.1 of the License, or (at your option) any later version.
|
---|
10 |
|
---|
11 | The GNU C Library is distributed in the hope that it will be useful,
|
---|
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
---|
14 | Lesser General Public License for more details.
|
---|
15 |
|
---|
16 | You should have received a copy of the GNU Lesser General Public
|
---|
17 | License along with the GNU C Library; if not, write to the Free
|
---|
18 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
---|
19 | 02111-1307 USA. */
|
---|
20 |
|
---|
21 | #ifndef _LIBC_SYMBOLS_H
|
---|
22 | #define _LIBC_SYMBOLS_H 1
|
---|
23 |
|
---|
24 | /* This file's macros are included implicitly in the compilation of every
|
---|
25 | file in the C library by -imacros.
|
---|
26 |
|
---|
27 | We include config.h which is generated by configure.
|
---|
28 | It should define for us the following symbols:
|
---|
29 |
|
---|
30 | * HAVE_ASM_SET_DIRECTIVE if we have `.set B, A' instead of `A = B'.
|
---|
31 | * ASM_GLOBAL_DIRECTIVE with `.globl' or `.global'.
|
---|
32 | * ASM_TYPE_DIRECTIVE_PREFIX with `@' or `#' or whatever for .type,
|
---|
33 | or leave it undefined if there is no .type directive.
|
---|
34 | * HAVE_GNU_LD if using GNU ld, with support for weak symbols in a.out,
|
---|
35 | and for symbol set and warning messages extensions in a.out and ELF.
|
---|
36 | * HAVE_ELF if using ELF, which supports weak symbols using `.weak'.
|
---|
37 | * HAVE_ASM_WEAK_DIRECTIVE if we have weak symbols using `.weak'.
|
---|
38 | * HAVE_ASM_WEAKEXT_DIRECTIVE if we have weak symbols using `.weakext'.
|
---|
39 |
|
---|
40 | */
|
---|
41 |
|
---|
42 | /* This is defined for the compilation of all C library code. features.h
|
---|
43 | tests this to avoid inclusion of stubs.h while compiling the library,
|
---|
44 | before stubs.h has been generated. Some library code that is shared
|
---|
45 | with other packages also tests this symbol to see if it is being
|
---|
46 | compiled as part of the C library. We must define this before including
|
---|
47 | config.h, because it makes some definitions conditional on whether libc
|
---|
48 | itself is being compiled, or just some generator program. */
|
---|
49 | #define _LIBC 1
|
---|
50 |
|
---|
51 | /* Enable declarations of GNU extensions, since we are compiling them. */
|
---|
52 | #define _GNU_SOURCE 1
|
---|
53 | /* And we also need the data for the reentrant functions. */
|
---|
54 | #define _REENTRANT 1
|
---|
55 |
|
---|
56 | #include <config.h>
|
---|
57 |
|
---|
58 | /* The symbols in all the user (non-_) macros are C symbols.
|
---|
59 | HAVE_GNU_LD without HAVE_ELF implies a.out. */
|
---|
60 |
|
---|
61 | #if defined HAVE_ASM_WEAK_DIRECTIVE || defined HAVE_ASM_WEAKEXT_DIRECTIVE
|
---|
62 | # define HAVE_WEAK_SYMBOLS
|
---|
63 | #endif
|
---|
64 |
|
---|
65 | #ifndef __SYMBOL_PREFIX
|
---|
66 | # ifdef NO_UNDERSCORES
|
---|
67 | # define __SYMBOL_PREFIX
|
---|
68 | # else
|
---|
69 | # define __SYMBOL_PREFIX "_"
|
---|
70 | # endif
|
---|
71 | #endif
|
---|
72 |
|
---|
73 | #ifndef C_SYMBOL_NAME
|
---|
74 | # ifdef NO_UNDERSCORES
|
---|
75 | # define C_SYMBOL_NAME(name) name
|
---|
76 | # else
|
---|
77 | # define C_SYMBOL_NAME(name) _##name
|
---|
78 | # endif
|
---|
79 | #endif
|
---|
80 |
|
---|
81 | #ifndef ASM_LINE_SEP
|
---|
82 | # define ASM_LINE_SEP ;
|
---|
83 | #endif
|
---|
84 |
|
---|
85 | #ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
---|
86 | # ifndef C_SYMBOL_DOT_NAME
|
---|
87 | # if defined __GNUC__ && defined __GNUC_MINOR__ \
|
---|
88 | && (__GNUC__ << 16) + __GNUC_MINOR__ >= (3 << 16) + 1
|
---|
89 | # define C_SYMBOL_DOT_NAME(name) .name
|
---|
90 | # else
|
---|
91 | # define C_SYMBOL_DOT_NAME(name) .##name
|
---|
92 | # endif
|
---|
93 | # endif
|
---|
94 | #endif
|
---|
95 |
|
---|
96 | #ifndef __ASSEMBLER__
|
---|
97 | /* GCC understands weak symbols and aliases; use its interface where
|
---|
98 | possible, instead of embedded assembly language. */
|
---|
99 |
|
---|
100 | /* Define ALIASNAME as a strong alias for NAME. */
|
---|
101 | # define strong_alias(name, aliasname) _strong_alias(name, aliasname)
|
---|
102 | # define _strong_alias(name, aliasname) \
|
---|
103 | extern __typeof (name) aliasname __attribute__ ((alias (#name)));
|
---|
104 |
|
---|
105 | /* This comes between the return type and function name in
|
---|
106 | a function definition to make that definition weak. */
|
---|
107 | # define weak_function __attribute__ ((weak))
|
---|
108 | # define weak_const_function __attribute__ ((weak, __const__))
|
---|
109 |
|
---|
110 | # ifdef HAVE_WEAK_SYMBOLS
|
---|
111 |
|
---|
112 | /* Define ALIASNAME as a weak alias for NAME.
|
---|
113 | If weak aliases are not available, this defines a strong alias. */
|
---|
114 | # define weak_alias(name, aliasname) _weak_alias (name, aliasname)
|
---|
115 | # define _weak_alias(name, aliasname) \
|
---|
116 | extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
|
---|
117 |
|
---|
118 | /* Declare SYMBOL as weak undefined symbol (resolved to 0 if not defined). */
|
---|
119 | # define weak_extern(symbol) _weak_extern (weak symbol)
|
---|
120 | # define _weak_extern(expr) _Pragma (#expr)
|
---|
121 |
|
---|
122 | # else
|
---|
123 |
|
---|
124 | # define weak_alias(name, aliasname) strong_alias(name, aliasname)
|
---|
125 | # define weak_extern(symbol) /* Nothing. */
|
---|
126 |
|
---|
127 | # endif
|
---|
128 |
|
---|
129 | #else /* __ASSEMBLER__ */
|
---|
130 |
|
---|
131 | # ifdef HAVE_ASM_SET_DIRECTIVE
|
---|
132 | # ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
---|
133 | # define strong_alias(original, alias) \
|
---|
134 | ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
---|
135 | .set C_SYMBOL_NAME (alias),C_SYMBOL_NAME (original) ASM_LINE_SEP \
|
---|
136 | ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP \
|
---|
137 | .set C_SYMBOL_DOT_NAME (alias),C_SYMBOL_DOT_NAME (original)
|
---|
138 | # define strong_data_alias(original, alias) \
|
---|
139 | ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
---|
140 | .set C_SYMBOL_NAME (alias),C_SYMBOL_NAME (original)
|
---|
141 | # else
|
---|
142 | # define strong_alias(original, alias) \
|
---|
143 | ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
---|
144 | .set C_SYMBOL_NAME (alias),C_SYMBOL_NAME (original)
|
---|
145 | # define strong_data_alias(original, alias) strong_alias(original, alias)
|
---|
146 | # endif
|
---|
147 | # else
|
---|
148 | # ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
---|
149 | # define strong_alias(original, alias) \
|
---|
150 | ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
---|
151 | C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original) ASM_LINE_SEP \
|
---|
152 | ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP \
|
---|
153 | C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
|
---|
154 | # define strong_data_alias(original, alias) \
|
---|
155 | ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
---|
156 | C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
|
---|
157 | # else
|
---|
158 | # define strong_alias(original, alias) \
|
---|
159 | ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
---|
160 | C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
|
---|
161 | # define strong_data_alias(original, alias) strong_alias(original, alias)
|
---|
162 | # endif
|
---|
163 | # endif
|
---|
164 |
|
---|
165 | # ifdef HAVE_WEAK_SYMBOLS
|
---|
166 | # ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
|
---|
167 | # ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
---|
168 | # define weak_alias(original, alias) \
|
---|
169 | .weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original) ASM_LINE_SEP \
|
---|
170 | .weakext C_SYMBOL_DOT_NAME (alias), C_SYMBOL_DOT_NAME (original)
|
---|
171 | # else
|
---|
172 | # define weak_alias(original, alias) \
|
---|
173 | .weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
|
---|
174 | # endif
|
---|
175 | # define weak_extern(symbol) \
|
---|
176 | .weakext C_SYMBOL_NAME (symbol)
|
---|
177 |
|
---|
178 | # else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
|
---|
179 |
|
---|
180 | # ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
---|
181 | # define weak_alias(original, alias) \
|
---|
182 | .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
---|
183 | C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original) ASM_LINE_SEP \
|
---|
184 | .weak C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP \
|
---|
185 | C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
|
---|
186 | # else
|
---|
187 | # define weak_alias(original, alias) \
|
---|
188 | .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP \
|
---|
189 | C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
|
---|
190 | # endif
|
---|
191 |
|
---|
192 | # define weak_extern(symbol) \
|
---|
193 | .weak C_SYMBOL_NAME (symbol)
|
---|
194 |
|
---|
195 | # endif /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
|
---|
196 |
|
---|
197 | # else /* ! HAVE_WEAK_SYMBOLS */
|
---|
198 |
|
---|
199 | # define weak_alias(original, alias) strong_alias(original, alias)
|
---|
200 | # define weak_extern(symbol) /* Nothing */
|
---|
201 | # endif /* ! HAVE_WEAK_SYMBOLS */
|
---|
202 |
|
---|
203 | #endif /* __ASSEMBLER__ */
|
---|
204 |
|
---|
205 | /* On some platforms we can make internal function calls (i.e., calls of
|
---|
206 | functions not exported) a bit faster by using a different calling
|
---|
207 | convention. */
|
---|
208 | #ifndef internal_function
|
---|
209 | # define internal_function /* empty */
|
---|
210 | #endif
|
---|
211 |
|
---|
212 | /* Prepare for the case that `__builtin_expect' is not available. */
|
---|
213 | #ifndef HAVE_BUILTIN_EXPECT
|
---|
214 | # define __builtin_expect(expr, val) (expr)
|
---|
215 | #endif
|
---|
216 |
|
---|
217 | /* Determine the return address. */
|
---|
218 | #define RETURN_ADDRESS(nr) \
|
---|
219 | __builtin_extract_return_addr (__builtin_return_address (nr))
|
---|
220 |
|
---|
221 | /* When a reference to SYMBOL is encountered, the linker will emit a
|
---|
222 | warning message MSG. */
|
---|
223 | #ifdef HAVE_GNU_LD
|
---|
224 | # ifdef HAVE_ELF
|
---|
225 |
|
---|
226 | /* We want the .gnu.warning.SYMBOL section to be unallocated. */
|
---|
227 | # ifdef HAVE_ASM_PREVIOUS_DIRECTIVE
|
---|
228 | # define __make_section_unallocated(section_string) \
|
---|
229 | asm (".section " section_string "\n\t.previous");
|
---|
230 | # elif defined HAVE_ASM_POPSECTION_DIRECTIVE
|
---|
231 | # define __make_section_unallocated(section_string) \
|
---|
232 | asm (".pushsection " section_string "\n\t.popsection");
|
---|
233 | # else
|
---|
234 | # define __make_section_unallocated(section_string)
|
---|
235 | # endif
|
---|
236 |
|
---|
237 | /* Tacking on "\n\t#" to the section name makes gcc put it's bogus
|
---|
238 | section attributes on what looks like a comment to the assembler. */
|
---|
239 | # ifdef HAVE_SECTION_QUOTES
|
---|
240 | # define __sec_comment "\"\n\t#\""
|
---|
241 | # else
|
---|
242 | # define __sec_comment "\n\t#"
|
---|
243 | # endif
|
---|
244 | # define link_warning(symbol, msg) \
|
---|
245 | __make_section_unallocated (".gnu.warning." #symbol) \
|
---|
246 | static const char __evoke_link_warning_##symbol[] \
|
---|
247 | __attribute__ ((used, section (".gnu.warning." #symbol __sec_comment))) \
|
---|
248 | = msg;
|
---|
249 | # define libc_freeres_ptr(decl) \
|
---|
250 | __make_section_unallocated ("__libc_freeres_ptrs, \"aw\", %nobits") \
|
---|
251 | decl __attribute__ ((section ("__libc_freeres_ptrs" __sec_comment)))
|
---|
252 | # define __libc_freeres_fn_section \
|
---|
253 | __attribute__ ((section ("__libc_freeres_fn")))
|
---|
254 | # else /* Not ELF: a.out */
|
---|
255 | # ifdef HAVE_XCOFF
|
---|
256 | /* XCOFF does not support .stabs.
|
---|
257 | The native aix linker will remove the .stab and .stabstr sections
|
---|
258 | The gnu linker will have a fatal error if there is a relocation for
|
---|
259 | symbol in the .stab section. Silently disable this macro. */
|
---|
260 | # define link_warning(symbol, msg)
|
---|
261 | # else
|
---|
262 | # define link_warning(symbol, msg) \
|
---|
263 | asm (".stabs \"" msg "\",30,0,0,0\n\t" \
|
---|
264 | ".stabs \"" __SYMBOL_PREFIX #symbol "\",1,0,0,0\n");
|
---|
265 | # endif /* XCOFF */
|
---|
266 | # define libc_freeres_ptr(decl) decl
|
---|
267 | # define __libc_freeres_fn_section
|
---|
268 | # endif
|
---|
269 | #else
|
---|
270 | /* We will never be heard; they will all die horribly. */
|
---|
271 | # define link_warning(symbol, msg)
|
---|
272 | # define libc_freeres_ptr(decl) decl
|
---|
273 | # define __libc_freeres_fn_section
|
---|
274 | #endif
|
---|
275 | #define libc_freeres_fn(name) \
|
---|
276 | static void name (void) __attribute_used__ __libc_freeres_fn_section; \
|
---|
277 | text_set_element (__libc_subfreeres, name); \
|
---|
278 | static void name (void)
|
---|
279 |
|
---|
280 | /* A canned warning for sysdeps/stub functions. */
|
---|
281 | #define stub_warning(name) \
|
---|
282 | __make_section_unallocated (".gnu.glibc-stub." #name) \
|
---|
283 | link_warning (name, \
|
---|
284 | "warning: " #name " is not implemented and will always fail")
|
---|
285 |
|
---|
286 | /* Warning for linking functions calling dlopen into static binaries. */
|
---|
287 | #ifdef SHARED
|
---|
288 | #define static_link_warning(name)
|
---|
289 | #else
|
---|
290 | #define static_link_warning(name) static_link_warning1(name)
|
---|
291 | #define static_link_warning1(name) \
|
---|
292 | link_warning(name, "Using '" #name "' in statically linked applications \
|
---|
293 | requires at runtime the shared libraries from the glibc version used \
|
---|
294 | for linking")
|
---|
295 | #endif
|
---|
296 |
|
---|
297 | /* Declare SYMBOL to be TYPE (`function' or `object') and of SIZE bytes,
|
---|
298 | when the assembler supports such declarations (such as in ELF).
|
---|
299 | This is only necessary when defining something in assembly, or playing
|
---|
300 | funny alias games where the size should be other than what the compiler
|
---|
301 | thinks it is. */
|
---|
302 | #define declare_symbol(symbol, type, size) \
|
---|
303 | declare_symbol_1 (symbol, type, size)
|
---|
304 | #ifdef ASM_TYPE_DIRECTIVE_PREFIX
|
---|
305 | # ifdef __ASSEMBLER__
|
---|
306 | # define declare_symbol_1(symbol, type, size) \
|
---|
307 | .type C_SYMBOL_NAME (symbol), \
|
---|
308 | declare_symbol_1_paste (ASM_TYPE_DIRECTIVE_PREFIX, type), size
|
---|
309 | # define declare_symbol_1_paste(a, b) declare_symbol_1_paste_1 (a,b)
|
---|
310 | # define declare_symbol_1_paste_1(a,b) a##b
|
---|
311 | # else /* Not __ASSEMBLER__. */
|
---|
312 | # define declare_symbol_1(symbol, type, size) \
|
---|
313 | asm (".type " __SYMBOL_PREFIX #symbol ", " \
|
---|
314 | declare_symbol_1_stringify (ASM_TYPE_DIRECTIVE_PREFIX) #type \
|
---|
315 | "\n\t.size " __SYMBOL_PREFIX #symbol ", " #size);
|
---|
316 | # define declare_symbol_1_stringify(x) declare_symbol_1_stringify_1 (x)
|
---|
317 | # define declare_symbol_1_stringify_1(x) #x
|
---|
318 | # endif /* __ASSEMBLER__ */
|
---|
319 | #else
|
---|
320 | # define declare_symbol_1(symbol, type, size) /* Nothing. */
|
---|
321 | #endif
|
---|
322 |
|
---|
323 |
|
---|
324 | /*
|
---|
325 | |
---|
326 |
|
---|
327 | */
|
---|
328 |
|
---|
329 | #ifdef HAVE_GNU_LD
|
---|
330 |
|
---|
331 | /* Symbol set support macros. */
|
---|
332 |
|
---|
333 | # ifdef HAVE_ELF
|
---|
334 |
|
---|
335 | /* Make SYMBOL, which is in the text segment, an element of SET. */
|
---|
336 | # define text_set_element(set, symbol) _elf_set_element(set, symbol)
|
---|
337 | /* Make SYMBOL, which is in the data segment, an element of SET. */
|
---|
338 | # define data_set_element(set, symbol) _elf_set_element(set, symbol)
|
---|
339 | /* Make SYMBOL, which is in the bss segment, an element of SET. */
|
---|
340 | # define bss_set_element(set, symbol) _elf_set_element(set, symbol)
|
---|
341 |
|
---|
342 | /* These are all done the same way in ELF.
|
---|
343 | There is a new section created for each set. */
|
---|
344 | # ifdef SHARED
|
---|
345 | /* When building a shared library, make the set section writable,
|
---|
346 | because it will need to be relocated at run time anyway. */
|
---|
347 | # define _elf_set_element(set, symbol) \
|
---|
348 | static const void *__elf_set_##set##_element_##symbol##__ \
|
---|
349 | __attribute__ ((used, section (#set))) = &(symbol)
|
---|
350 | # else
|
---|
351 | # define _elf_set_element(set, symbol) \
|
---|
352 | static const void *const __elf_set_##set##_element_##symbol##__ \
|
---|
353 | __attribute__ ((used, section (#set))) = &(symbol)
|
---|
354 | # endif
|
---|
355 |
|
---|
356 | /* Define SET as a symbol set. This may be required (it is in a.out) to
|
---|
357 | be able to use the set's contents. */
|
---|
358 | # define symbol_set_define(set) symbol_set_declare(set)
|
---|
359 |
|
---|
360 | /* Declare SET for use in this module, if defined in another module.
|
---|
361 | In a shared library, this is always local to that shared object.
|
---|
362 | For static linking, the set might be wholly absent and so we use
|
---|
363 | weak references. */
|
---|
364 | # define symbol_set_declare(set) \
|
---|
365 | extern char const __start_##set[] __symbol_set_attribute; \
|
---|
366 | extern char const __stop_##set[] __symbol_set_attribute;
|
---|
367 | # ifdef SHARED
|
---|
368 | # define __symbol_set_attribute attribute_hidden
|
---|
369 | # else
|
---|
370 | # define __symbol_set_attribute __attribute__ ((weak))
|
---|
371 | # endif
|
---|
372 |
|
---|
373 | /* Return a pointer (void *const *) to the first element of SET. */
|
---|
374 | # define symbol_set_first_element(set) ((void *const *) (&__start_##set))
|
---|
375 |
|
---|
376 | /* Return true iff PTR (a void *const *) has been incremented
|
---|
377 | past the last element in SET. */
|
---|
378 | # define symbol_set_end_p(set, ptr) ((ptr) >= (void *const *) &__stop_##set)
|
---|
379 |
|
---|
380 | # else /* Not ELF: a.out. */
|
---|
381 |
|
---|
382 | # ifdef HAVE_XCOFF
|
---|
383 | /* XCOFF does not support .stabs.
|
---|
384 | The native aix linker will remove the .stab and .stabstr sections
|
---|
385 | The gnu linker will have a fatal error if there is a relocation for
|
---|
386 | symbol in the .stab section. Silently disable these macros. */
|
---|
387 | # define text_set_element(set, symbol)
|
---|
388 | # define data_set_element(set, symbol)
|
---|
389 | # define bss_set_element(set, symbol)
|
---|
390 | # else
|
---|
391 | # define text_set_element(set, symbol) \
|
---|
392 | asm (".stabs \"" __SYMBOL_PREFIX #set "\",23,0,0," __SYMBOL_PREFIX #symbol)
|
---|
393 | # define data_set_element(set, symbol) \
|
---|
394 | asm (".stabs \"" __SYMBOL_PREFIX #set "\",25,0,0," __SYMBOL_PREFIX #symbol)
|
---|
395 | # define bss_set_element(set, symbol) ?error Must use initialized data.
|
---|
396 | # endif /* XCOFF */
|
---|
397 | # define symbol_set_define(set) void *const (set)[1];
|
---|
398 | # define symbol_set_declare(set) extern void *const (set)[1];
|
---|
399 |
|
---|
400 | # define symbol_set_first_element(set) &(set)[1]
|
---|
401 | # define symbol_set_end_p(set, ptr) (*(ptr) == 0)
|
---|
402 |
|
---|
403 | # endif /* ELF. */
|
---|
404 | #else
|
---|
405 | /* We cannot do anything in generial. */
|
---|
406 | # define text_set_element(set, symbol) asm ("")
|
---|
407 | # define data_set_element(set, symbol) asm ("")
|
---|
408 | # define bss_set_element(set, symbol) asm ("")
|
---|
409 | # define symbol_set_define(set) void *const (set)[1];
|
---|
410 | # define symbol_set_declare(set) extern void *const (set)[1];
|
---|
411 |
|
---|
412 | # define symbol_set_first_element(set) &(set)[1]
|
---|
413 | # define symbol_set_end_p(set, ptr) (*(ptr) == 0)
|
---|
414 | #endif /* Have GNU ld. */
|
---|
415 |
|
---|
416 | #if DO_VERSIONING
|
---|
417 | # define symbol_version(real, name, version) \
|
---|
418 | _symbol_version(real, name, version)
|
---|
419 | # define default_symbol_version(real, name, version) \
|
---|
420 | _default_symbol_version(real, name, version)
|
---|
421 | # ifdef __ASSEMBLER__
|
---|
422 | # ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
---|
423 | # define _symbol_version(real, name, version) \
|
---|
424 | .symver real, name##@##version ASM_LINE_SEP \
|
---|
425 | .symver C_SYMBOL_DOT_NAME(real), C_SYMBOL_DOT_NAME(name##@##version)
|
---|
426 | # define _default_symbol_version(real, name, version) \
|
---|
427 | .symver real, name##@##@##version ASM_LINE_SEP \
|
---|
428 | .symver C_SYMBOL_DOT_NAME(real), C_SYMBOL_DOT_NAME(name##@##@##version)
|
---|
429 | # else
|
---|
430 | # define _symbol_version(real, name, version) \
|
---|
431 | .symver real, name##@##version
|
---|
432 | # define _default_symbol_version(real, name, version) \
|
---|
433 | .symver real, name##@##@##version
|
---|
434 | # endif
|
---|
435 | # else
|
---|
436 | # ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
---|
437 | # define _symbol_version(real, name, version) \
|
---|
438 | __asm__ (".symver " #real "," #name "@" #version "\n\t" \
|
---|
439 | ".symver ." #real ",." #name "@" #version)
|
---|
440 | # define _default_symbol_version(real, name, version) \
|
---|
441 | __asm__ (".symver " #real "," #name "@@" #version "\n\t" \
|
---|
442 | ".symver ." #real ",." #name "@@" #version)
|
---|
443 | # else
|
---|
444 | # define _symbol_version(real, name, version) \
|
---|
445 | __asm__ (".symver " #real "," #name "@" #version)
|
---|
446 | # define _default_symbol_version(real, name, version) \
|
---|
447 | __asm__ (".symver " #real "," #name "@@" #version)
|
---|
448 | # endif
|
---|
449 | # endif
|
---|
450 | #else
|
---|
451 | # define symbol_version(real, name, version)
|
---|
452 | # define default_symbol_version(real, name, version) \
|
---|
453 | strong_alias(real, name)
|
---|
454 | #endif
|
---|
455 |
|
---|
456 | #if defined HAVE_VISIBILITY_ATTRIBUTE \
|
---|
457 | && (defined SHARED || defined LIBC_NONSHARED)
|
---|
458 | # define attribute_hidden __attribute__ ((visibility ("hidden")))
|
---|
459 | #else
|
---|
460 | # define attribute_hidden
|
---|
461 | #endif
|
---|
462 |
|
---|
463 | #ifdef HAVE_TLS_MODEL_ATTRIBUTE
|
---|
464 | # define attribute_tls_model_ie __attribute__ ((tls_model ("initial-exec")))
|
---|
465 | #else
|
---|
466 | # define attribute_tls_model_ie
|
---|
467 | #endif
|
---|
468 |
|
---|
469 | #ifdef HAVE_Z_RELRO
|
---|
470 | # define attribute_relro __attribute__ ((section (".data.rel.ro")))
|
---|
471 | #else
|
---|
472 | # define attribute_relro
|
---|
473 | #endif
|
---|
474 |
|
---|
475 | /* Handling on non-exported internal names. We have to do this only
|
---|
476 | for shared code. */
|
---|
477 | #ifdef SHARED
|
---|
478 | # define INTUSE(name) name##_internal
|
---|
479 | # define INTDEF(name) strong_alias (name, name##_internal)
|
---|
480 | # define INTVARDEF(name) \
|
---|
481 | _INTVARDEF (name, name##_internal)
|
---|
482 | # if defined HAVE_VISIBILITY_ATTRIBUTE
|
---|
483 | # define _INTVARDEF(name, aliasname) \
|
---|
484 | extern __typeof (name) aliasname __attribute__ ((alias (#name), \
|
---|
485 | visibility ("hidden")));
|
---|
486 | # else
|
---|
487 | # define _INTVARDEF(name, aliasname) \
|
---|
488 | extern __typeof (name) aliasname __attribute__ ((alias (#name)));
|
---|
489 | # endif
|
---|
490 | # define INTDEF2(name, newname) strong_alias (name, newname##_internal)
|
---|
491 | # define INTVARDEF2(name, newname) _INTVARDEF (name, newname##_internal)
|
---|
492 | #else
|
---|
493 | # define INTUSE(name) name
|
---|
494 | # define INTDEF(name)
|
---|
495 | # define INTVARDEF(name)
|
---|
496 | # define INTDEF2(name, newname)
|
---|
497 | # define INTVARDEF2(name, newname)
|
---|
498 | #endif
|
---|
499 |
|
---|
500 | /* The following macros are used for PLT bypassing within libc.so
|
---|
501 | (and if needed other libraries similarly).
|
---|
502 | First of all, you need to have the function prototyped somewhere,
|
---|
503 | say in foo/foo.h:
|
---|
504 |
|
---|
505 | int foo (int __bar);
|
---|
506 |
|
---|
507 | If calls to foo within libc.so should always go to foo defined in libc.so,
|
---|
508 | then in include/foo.h you add:
|
---|
509 |
|
---|
510 | libc_hidden_proto (foo)
|
---|
511 |
|
---|
512 | line and after the foo function definition:
|
---|
513 |
|
---|
514 | int foo (int __bar)
|
---|
515 | {
|
---|
516 | return __bar;
|
---|
517 | }
|
---|
518 | libc_hidden_def (foo)
|
---|
519 |
|
---|
520 | or
|
---|
521 |
|
---|
522 | int foo (int __bar)
|
---|
523 | {
|
---|
524 | return __bar;
|
---|
525 | }
|
---|
526 | libc_hidden_weak (foo)
|
---|
527 |
|
---|
528 | Simularly for global data. If references to foo within libc.so should
|
---|
529 | always go to foo defined in libc.so, then in include/foo.h you add:
|
---|
530 |
|
---|
531 | libc_hidden_proto (foo)
|
---|
532 |
|
---|
533 | line and after foo's definition:
|
---|
534 |
|
---|
535 | int foo = INITIAL_FOO_VALUE;
|
---|
536 | libc_hidden_data_def (foo)
|
---|
537 |
|
---|
538 | or
|
---|
539 |
|
---|
540 | int foo = INITIAL_FOO_VALUE;
|
---|
541 | libc_hidden_data_weak (foo)
|
---|
542 |
|
---|
543 | If foo is normally just an alias (strong or weak) of some other function,
|
---|
544 | you should use the normal strong_alias first, then add libc_hidden_def
|
---|
545 | or libc_hidden_weak:
|
---|
546 |
|
---|
547 | int baz (int __bar)
|
---|
548 | {
|
---|
549 | return __bar;
|
---|
550 | }
|
---|
551 | strong_alias (baz, foo)
|
---|
552 | libc_hidden_weak (foo)
|
---|
553 |
|
---|
554 | If the function should be internal to multiple objects, say ld.so and
|
---|
555 | libc.so, the best way is to use:
|
---|
556 |
|
---|
557 | #if !defined NOT_IN_libc || defined IS_IN_rtld
|
---|
558 | hidden_proto (foo)
|
---|
559 | #endif
|
---|
560 |
|
---|
561 | in include/foo.h and the normal macros at all function definitions
|
---|
562 | depending on what DSO they belong to.
|
---|
563 |
|
---|
564 | If versioned_symbol macro is used to define foo,
|
---|
565 | libc_hidden_ver macro should be used, as in:
|
---|
566 |
|
---|
567 | int __real_foo (int __bar)
|
---|
568 | {
|
---|
569 | return __bar;
|
---|
570 | }
|
---|
571 | versioned_symbol (libc, __real_foo, foo, GLIBC_2_1);
|
---|
572 | libc_hidden_ver (__real_foo, foo) */
|
---|
573 |
|
---|
574 | #if defined SHARED && defined DO_VERSIONING \
|
---|
575 | && !defined HAVE_BROKEN_ALIAS_ATTRIBUTE && !defined NO_HIDDEN
|
---|
576 | # ifndef __ASSEMBLER__
|
---|
577 | # if !defined HAVE_VISIBILITY_ATTRIBUTE \
|
---|
578 | || defined HAVE_BROKEN_VISIBILITY_ATTRIBUTE
|
---|
579 | # define __hidden_proto_hiddenattr(attrs...)
|
---|
580 | # else
|
---|
581 | # define __hidden_proto_hiddenattr(attrs...) \
|
---|
582 | __attribute__ ((visibility ("hidden"), ##attrs))
|
---|
583 | # endif
|
---|
584 | # define hidden_proto(name, attrs...) \
|
---|
585 | __hidden_proto (name, __GI_##name, ##attrs)
|
---|
586 | # define __hidden_proto(name, internal, attrs...) \
|
---|
587 | extern __typeof (name) name __asm__ (__hidden_asmname (#internal)) \
|
---|
588 | __hidden_proto_hiddenattr (attrs);
|
---|
589 | # define __hidden_asmname(name) \
|
---|
590 | __hidden_asmname1 (__USER_LABEL_PREFIX__, name)
|
---|
591 | # define __hidden_asmname1(prefix, name) __hidden_asmname2(prefix, name)
|
---|
592 | # define __hidden_asmname2(prefix, name) #prefix name
|
---|
593 | # define __hidden_ver1(local, internal, name) \
|
---|
594 | extern __typeof (name) __EI_##name __asm__(__hidden_asmname (#internal)); \
|
---|
595 | extern __typeof (name) __EI_##name \
|
---|
596 | __attribute__((alias (__hidden_asmname (#local))))
|
---|
597 | # define hidden_ver(local, name) __hidden_ver1(local, __GI_##name, name);
|
---|
598 | # define hidden_data_ver(local, name) hidden_ver(local, name)
|
---|
599 | # define hidden_def(name) __hidden_ver1(__GI_##name, name, name);
|
---|
600 | # define hidden_data_def(name) hidden_def(name)
|
---|
601 | # define hidden_weak(name) \
|
---|
602 | __hidden_ver1(__GI_##name, name, name) __attribute__((weak));
|
---|
603 | # define hidden_data_weak(name) hidden_weak(name)
|
---|
604 | # else
|
---|
605 | /* For assembly, we need to do the opposite of what we do in C:
|
---|
606 | in assembly gcc __REDIRECT stuff is not in place, so functions
|
---|
607 | are defined by its normal name and we need to create the
|
---|
608 | __GI_* alias to it, in C __REDIRECT causes the function definition
|
---|
609 | to use __GI_* name and we need to add alias to the real name.
|
---|
610 | There is no reason to use hidden_weak over hidden_def in assembly,
|
---|
611 | but we provide it for consistency with the C usage.
|
---|
612 | hidden_proto doesn't make sense for assembly but the equivalent
|
---|
613 | is to call via the HIDDEN_JUMPTARGET macro instead of JUMPTARGET. */
|
---|
614 | # define hidden_def(name) strong_alias (name, __GI_##name)
|
---|
615 | # define hidden_weak(name) hidden_def (name)
|
---|
616 | # define hidden_ver(local, name) strong_alias (local, __GI_##name)
|
---|
617 | # define hidden_data_def(name) strong_data_alias (name, __GI_##name)
|
---|
618 | # define hidden_data_weak(name) hidden_data_def (name)
|
---|
619 | # define hidden_data_ver(local, name) strong_data_alias (local, __GI_##name)
|
---|
620 | # ifdef HAVE_ASM_GLOBAL_DOT_NAME
|
---|
621 | # define HIDDEN_JUMPTARGET(name) .__GI_##name
|
---|
622 | # else
|
---|
623 | # define HIDDEN_JUMPTARGET(name) __GI_##name
|
---|
624 | # endif
|
---|
625 | # endif
|
---|
626 | #else
|
---|
627 | # ifndef __ASSEMBLER__
|
---|
628 | # define hidden_proto(name, attrs...)
|
---|
629 | # else
|
---|
630 | # define HIDDEN_JUMPTARGET(name) JUMPTARGET(name)
|
---|
631 | # endif /* Not __ASSEMBLER__ */
|
---|
632 | # define hidden_weak(name)
|
---|
633 | # define hidden_def(name)
|
---|
634 | # define hidden_ver(local, name)
|
---|
635 | # define hidden_data_weak(name)
|
---|
636 | # define hidden_data_def(name)
|
---|
637 | # define hidden_data_ver(local, name)
|
---|
638 | #endif
|
---|
639 |
|
---|
640 | #if !defined NOT_IN_libc
|
---|
641 | # define libc_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
|
---|
642 | # define libc_hidden_def(name) hidden_def (name)
|
---|
643 | # define libc_hidden_weak(name) hidden_weak (name)
|
---|
644 | # define libc_hidden_ver(local, name) hidden_ver (local, name)
|
---|
645 | # define libc_hidden_data_def(name) hidden_data_def (name)
|
---|
646 | # define libc_hidden_data_weak(name) hidden_data_weak (name)
|
---|
647 | # define libc_hidden_data_ver(local, name) hidden_data_ver (local, name)
|
---|
648 | #else
|
---|
649 | # define libc_hidden_proto(name, attrs...)
|
---|
650 | # define libc_hidden_def(name)
|
---|
651 | # define libc_hidden_weak(name)
|
---|
652 | # define libc_hidden_ver(local, name)
|
---|
653 | # define libc_hidden_data_def(name)
|
---|
654 | # define libc_hidden_data_weak(name)
|
---|
655 | # define libc_hidden_data_ver(local, name)
|
---|
656 | #endif
|
---|
657 |
|
---|
658 | #if defined NOT_IN_libc && defined IS_IN_rtld
|
---|
659 | # define rtld_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
|
---|
660 | # define rtld_hidden_def(name) hidden_def (name)
|
---|
661 | # define rtld_hidden_weak(name) hidden_weak (name)
|
---|
662 | # define rtld_hidden_ver(local, name) hidden_ver (local, name)
|
---|
663 | # define rtld_hidden_data_def(name) hidden_data_def (name)
|
---|
664 | # define rtld_hidden_data_weak(name) hidden_data_weak (name)
|
---|
665 | # define rtld_hidden_data_ver(local, name) hidden_data_ver (local, name)
|
---|
666 | #else
|
---|
667 | # define rtld_hidden_proto(name, attrs...)
|
---|
668 | # define rtld_hidden_def(name)
|
---|
669 | # define rtld_hidden_weak(name)
|
---|
670 | # define rtld_hidden_ver(local, name)
|
---|
671 | # define rtld_hidden_data_def(name)
|
---|
672 | # define rtld_hidden_data_weak(name)
|
---|
673 | # define rtld_hidden_data_ver(local, name)
|
---|
674 | #endif
|
---|
675 |
|
---|
676 | #if defined NOT_IN_libc && defined IS_IN_libm
|
---|
677 | # define libm_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
|
---|
678 | # define libm_hidden_def(name) hidden_def (name)
|
---|
679 | # define libm_hidden_weak(name) hidden_weak (name)
|
---|
680 | # define libm_hidden_ver(local, name) hidden_ver (local, name)
|
---|
681 | # define libm_hidden_data_def(name) hidden_data_def (name)
|
---|
682 | # define libm_hidden_data_weak(name) hidden_data_weak (name)
|
---|
683 | # define libm_hidden_data_ver(local, name) hidden_data_ver (local, name)
|
---|
684 | #else
|
---|
685 | # define libm_hidden_proto(name, attrs...)
|
---|
686 | # define libm_hidden_def(name)
|
---|
687 | # define libm_hidden_weak(name)
|
---|
688 | # define libm_hidden_ver(local, name)
|
---|
689 | # define libm_hidden_data_def(name)
|
---|
690 | # define libm_hidden_data_weak(name)
|
---|
691 | # define libm_hidden_data_ver(local, name)
|
---|
692 | #endif
|
---|
693 |
|
---|
694 | #if defined NOT_IN_libc && defined IS_IN_libresolv
|
---|
695 | # define libresolv_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
|
---|
696 | # define libresolv_hidden_def(name) hidden_def (name)
|
---|
697 | # define libresolv_hidden_weak(name) hidden_weak (name)
|
---|
698 | # define libresolv_hidden_ver(local, name) hidden_ver (local, name)
|
---|
699 | # define libresolv_hidden_data_def(name) hidden_data_def (name)
|
---|
700 | # define libresolv_hidden_data_weak(name) hidden_data_weak (name)
|
---|
701 | # define libresolv_hidden_data_ver(local, name) hidden_data_ver (local, name)
|
---|
702 | #else
|
---|
703 | # define libresolv_hidden_proto(name, attrs...)
|
---|
704 | # define libresolv_hidden_def(name)
|
---|
705 | # define libresolv_hidden_weak(name)
|
---|
706 | # define libresolv_hidden_ver(local, name)
|
---|
707 | # define libresolv_hidden_data_def(name)
|
---|
708 | # define libresolv_hidden_data_weak(name)
|
---|
709 | # define libresolv_hidden_data_ver(local, name)
|
---|
710 | #endif
|
---|
711 |
|
---|
712 | #if defined NOT_IN_libc && defined IS_IN_libdl
|
---|
713 | # define libdl_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
|
---|
714 | # define libdl_hidden_def(name) hidden_def (name)
|
---|
715 | # define libdl_hidden_weak(name) hidden_weak (name)
|
---|
716 | # define libdl_hidden_ver(local, name) hidden_ver (local, name)
|
---|
717 | # define libdl_hidden_data_def(name) hidden_data_def (name)
|
---|
718 | # define libdl_hidden_data_weak(name) hidden_data_weak (name)
|
---|
719 | # define libdl_hidden_data_ver(local, name) hidden_data_ver (local, name)
|
---|
720 | #else
|
---|
721 | # define libdl_hidden_proto(name, attrs...)
|
---|
722 | # define libdl_hidden_def(name)
|
---|
723 | # define libdl_hidden_weak(name)
|
---|
724 | # define libdl_hidden_ver(local, name)
|
---|
725 | # define libdl_hidden_data_def(name)
|
---|
726 | # define libdl_hidden_data_weak(name)
|
---|
727 | # define libdl_hidden_data_ver(local, name)
|
---|
728 | #endif
|
---|
729 |
|
---|
730 | #if defined NOT_IN_libc && defined IS_IN_libnss_files
|
---|
731 | # define libnss_files_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
|
---|
732 | # define libnss_files_hidden_def(name) hidden_def (name)
|
---|
733 | # define libnss_files_hidden_weak(name) hidden_weak (name)
|
---|
734 | # define libnss_files_hidden_ver(local, name) hidden_ver (local, name)
|
---|
735 | # define libnss_files_hidden_data_def(name) hidden_data_def (name)
|
---|
736 | # define libnss_files_hidden_data_weak(name) hidden_data_weak (name)
|
---|
737 | # define libnss_files_hidden_data_ver(local, name) hidden_data_ver(local, name)
|
---|
738 | #else
|
---|
739 | # define libnss_files_hidden_proto(name, attrs...)
|
---|
740 | # define libnss_files_hidden_def(name)
|
---|
741 | # define libnss_files_hidden_weak(name)
|
---|
742 | # define libnss_files_hidden_ver(local, name)
|
---|
743 | # define libnss_files_hidden_data_def(name)
|
---|
744 | # define libnss_files_hidden_data_weak(name)
|
---|
745 | # define libnss_files_hidden_data_ver(local, name)
|
---|
746 | #endif
|
---|
747 |
|
---|
748 | #if defined NOT_IN_libc && defined IS_IN_libnsl
|
---|
749 | # define libnsl_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
|
---|
750 | # define libnsl_hidden_def(name) hidden_def (name)
|
---|
751 | # define libnsl_hidden_weak(name) hidden_weak (name)
|
---|
752 | # define libnsl_hidden_ver(local, name) hidden_ver (local, name)
|
---|
753 | # define libnsl_hidden_data_def(name) hidden_data_def (name)
|
---|
754 | # define libnsl_hidden_data_weak(name) hidden_data_weak (name)
|
---|
755 | # define libnsl_hidden_data_ver(local, name) hidden_data_ver (local, name)
|
---|
756 | #else
|
---|
757 | # define libnsl_hidden_proto(name, attrs...)
|
---|
758 | # define libnsl_hidden_def(name)
|
---|
759 | # define libnsl_hidden_weak(name)
|
---|
760 | # define libnsl_hidden_ver(local, name)
|
---|
761 | # define libnsl_hidden_data_def(name)
|
---|
762 | # define libnsl_hidden_data_weak(name)
|
---|
763 | # define libnsl_hidden_data_ver(local, name)
|
---|
764 | #endif
|
---|
765 |
|
---|
766 | #if defined NOT_IN_libc && defined IS_IN_libnss_nisplus
|
---|
767 | # define libnss_nisplus_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
|
---|
768 | # define libnss_nisplus_hidden_def(name) hidden_def (name)
|
---|
769 | # define libnss_nisplus_hidden_weak(name) hidden_weak (name)
|
---|
770 | # define libnss_nisplus_hidden_ver(local, name) hidden_ver (local, name)
|
---|
771 | # define libnss_nisplus_hidden_data_def(name) hidden_data_def (name)
|
---|
772 | # define libnss_nisplus_hidden_data_weak(name) hidden_data_weak (name)
|
---|
773 | # define libnss_nisplus_hidden_data_ver(local, name) hidden_data_ver (local, name)
|
---|
774 | #else
|
---|
775 | # define libnss_nisplus_hidden_proto(name, attrs...)
|
---|
776 | # define libnss_nisplus_hidden_def(name)
|
---|
777 | # define libnss_nisplus_hidden_weak(name)
|
---|
778 | # define libnss_nisplus_hidden_ver(local, name)
|
---|
779 | # define libnss_nisplus_hidden_data_def(name)
|
---|
780 | # define libnss_nisplus_hidden_data_weak(name)
|
---|
781 | # define libnss_nisplus_hidden_data_ver(local, name)
|
---|
782 | #endif
|
---|
783 |
|
---|
784 | #ifdef HAVE_BUILTIN_REDIRECTION
|
---|
785 | # define libc_hidden_builtin_proto(name, attrs...) libc_hidden_proto (name, ##attrs)
|
---|
786 | # define libc_hidden_builtin_def(name) libc_hidden_def (name)
|
---|
787 | # define libc_hidden_builtin_weak(name) libc_hidden_weak (name)
|
---|
788 | # define libc_hidden_builtin_ver(local, name) libc_hidden_ver (local, name)
|
---|
789 | # ifdef __ASSEMBLER__
|
---|
790 | # define HIDDEN_BUILTIN_JUMPTARGET(name) HIDDEN_JUMPTARGET(name)
|
---|
791 | # endif
|
---|
792 | #else
|
---|
793 | # define libc_hidden_builtin_proto(name, attrs...)
|
---|
794 | # define libc_hidden_builtin_def(name)
|
---|
795 | # define libc_hidden_builtin_weak(name)
|
---|
796 | # define libc_hidden_builtin_ver(local, name)
|
---|
797 | # ifdef __ASSEMBLER__
|
---|
798 | # define HIDDEN_BUILTIN_JUMPTARGET(name) JUMPTARGET(name)
|
---|
799 | # endif
|
---|
800 | #endif
|
---|
801 |
|
---|
802 | #if defined NOT_IN_libc && defined IS_IN_libutil
|
---|
803 | # define libutil_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
|
---|
804 | # define libutil_hidden_def(name) hidden_def (name)
|
---|
805 | # define libutil_hidden_weak(name) hidden_weak (name)
|
---|
806 | # define libutil_hidden_ver(local, name) hidden_ver (local, name)
|
---|
807 | # define libutil_hidden_data_def(name) hidden_data_def (name)
|
---|
808 | # define libutil_hidden_data_weak(name) hidden_data_weak (name)
|
---|
809 | # define libutil_hidden_data_ver(local, name) hidden_data_ver (local, name)
|
---|
810 | #else
|
---|
811 | # define libutil_hidden_proto(name, attrs...)
|
---|
812 | # define libutil_hidden_def(name)
|
---|
813 | # define libutil_hidden_weak(name)
|
---|
814 | # define libutil_hidden_ver(local, name)
|
---|
815 | # define libutil_hidden_data_def(name)
|
---|
816 | # define libutil_hidden_data_weak(name)
|
---|
817 | # define libutil_hidden_data_ver(local, name)
|
---|
818 | #endif
|
---|
819 |
|
---|
820 | /* Get some dirty hacks. */
|
---|
821 | #include <symbol-hacks.h>
|
---|
822 |
|
---|
823 | /* Move compatibility symbols out of the way by placing them all in a
|
---|
824 | special section. */
|
---|
825 | #ifndef __ASSEMBLER__
|
---|
826 | # define attribute_compat_text_section \
|
---|
827 | __attribute__ ((section (".text.compat")))
|
---|
828 | # define attribute_compat_data_section \
|
---|
829 | __attribute__ ((section (".data.compat")))
|
---|
830 | #else
|
---|
831 | # define compat_text_section .section ".text.compat", "ax";
|
---|
832 | # define compat_data_section .section ".data.compat", "aw";
|
---|
833 | #endif
|
---|
834 |
|
---|
835 | #endif /* libc-symbols.h */
|
---|