glibc-2.9/include/libc-symbols.h 中 490 行后面的东西怎么理解? 感觉有点儿意思,有时间再看!
如:
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 |
/* The following macros are used for PLT bypassing within libc.so (and if needed other libraries similarly). First of all, you need to have the function prototyped somewhere, say in foo/foo.h: int foo (int __bar); If calls to foo within libc.so should always go to foo defined in libc.so, then in include/foo.h you add: libc_hidden_proto (foo) line and after the foo function definition: int foo (int __bar) { return __bar; } libc_hidden_def (foo) or int foo (int __bar) { return __bar; } libc_hidden_weak (foo) Similarly for global data. If references to foo within libc.so should always go to foo defined in libc.so, then in include/foo.h you add: libc_hidden_proto (foo) line and after foo's definition: int foo = INITIAL_FOO_VALUE; libc_hidden_data_def (foo) or int foo = INITIAL_FOO_VALUE; libc_hidden_data_weak (foo) If foo is normally just an alias (strong or weak) to some other function, you should use the normal strong_alias first, then add libc_hidden_def or libc_hidden_weak: int baz (int __bar) { return __bar; } strong_alias (baz, foo) libc_hidden_weak (foo) If the function should be internal to multiple objects, say ld.so and libc.so, the best way is to use: #if !defined NOT_IN_libc || defined IS_IN_rtld hidden_proto (foo) #endif in include/foo.h and the normal macros at all function definitions depending on what DSO they belong to. If versioned_symbol macro is used to define foo, libc_hidden_ver macro should be used, as in: int __real_foo (int __bar) { return __bar; } versioned_symbol (libc, __real_foo, foo, GLIBC_2_1); libc_hidden_ver (__real_foo, foo) */ |