1 /* Inline functions for dynamic linking.
2 Copyright (C) 1995, 1996 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB. If not,
17 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. */
21 #include <dl-machine.h>
25 /* Read the dynamic section at DYN and fill in INFO with indices DT_*. */
27 static inline void __attribute__ ((unused
))
28 elf_get_dynamic_info (ElfW(Dyn
) *dyn
, ElfW(Dyn
) *info
[DT_NUM
+ DT_PROCNUM
])
32 for (i
= 0; i
< DT_NUM
+ DT_PROCNUM
; ++i
)
38 while (dyn
->d_tag
!= DT_NULL
)
40 if (dyn
->d_tag
< DT_NUM
)
41 info
[dyn
->d_tag
] = dyn
;
42 else if (dyn
->d_tag
>= DT_LOPROC
&&
43 dyn
->d_tag
< DT_LOPROC
+ DT_PROCNUM
)
44 info
[dyn
->d_tag
- DT_LOPROC
+ DT_NUM
] = dyn
;
46 assert (! "bad dynamic tag");
51 assert (info
[DT_RELAENT
]->d_un
.d_val
== sizeof (ElfW(Rela
)));
53 assert (info
[DT_RELENT
]->d_un
.d_val
== sizeof (ElfW(Rel
)));
55 assert (info
[DT_PLTREL
]->d_un
.d_val
== DT_REL
||
56 info
[DT_PLTREL
]->d_un
.d_val
== DT_RELA
);
61 /* Get the definitions of `elf_dynamic_do_rel' and `elf_dynamic_do_rela'.
62 These functions are almost identical, so we use cpp magic to avoid
63 duplicating their code. It cannot be done in a more general function
64 because we must be able to completely inline. */
66 #if ! ELF_MACHINE_NO_REL
68 #define ELF_DYNAMIC_DO_REL(map, lazy) \
69 if ((map)->l_info[DT_REL]) \
70 elf_dynamic_do_rel ((map), DT_REL, DT_RELSZ, 0); \
71 if ((map)->l_info[DT_PLTREL] && \
72 (map)->l_info[DT_PLTREL]->d_un.d_val == DT_REL) \
73 elf_dynamic_do_rel ((map), DT_JMPREL, DT_PLTRELSZ, (lazy));
75 #define ELF_DYNAMIC_DO_REL(map, lazy) /* Nothing to do. */
78 #if ! ELF_MACHINE_NO_RELA
81 #define ELF_DYNAMIC_DO_RELA(map, lazy) \
82 if ((map)->l_info[DT_RELA]) \
83 elf_dynamic_do_rela ((map), DT_RELA, DT_RELASZ, 0); \
84 if ((map)->l_info[DT_PLTREL] && \
85 (map)->l_info[DT_PLTREL]->d_un.d_val == DT_RELA) \
86 elf_dynamic_do_rela ((map), DT_JMPREL, DT_PLTRELSZ, (lazy));
88 #define ELF_DYNAMIC_DO_RELA(map, lazy) /* Nothing to do. */
91 /* This can't just be an inline function because GCC is too dumb
92 to inline functions containing inlines themselves. */
93 #define ELF_DYNAMIC_RELOCATE(map, lazy) \
94 do { ELF_DYNAMIC_DO_REL ((map), (lazy)); \
95 ELF_DYNAMIC_DO_RELA ((map), (lazy)); } while (0)