]>
Commit | Line | Data |
---|---|---|
1 | Index: ldso/ldso/dl-startup.c | |
2 | =================================================================== | |
3 | --- ldso/ldso/dl-startup.c (revision 16049) | |
4 | +++ ldso/ldso/dl-startup.c (working copy) | |
5 | @@ -259,7 +272,7 @@ | |
6 | rel_addr += relative_count * sizeof(ELF_RELOC); | |
7 | } | |
8 | ||
9 | - rpnt = (ELF_RELOC *) DL_RELOC_ADDR(load_addr, rel_addr); | |
10 | + rpnt = (ELF_RELOC *) rel_addr; | |
11 | for (i = 0; i < rel_size; i += sizeof(ELF_RELOC), rpnt++) { | |
12 | reloc_addr = (unsigned long *) DL_RELOC_ADDR(load_addr, (unsigned long)rpnt->r_offset); | |
13 | symtab_index = ELF_R_SYM(rpnt->r_info); | |
14 | Index: ldso/ldso/ldso.c | |
15 | =================================================================== | |
16 | --- ldso/ldso/ldso.c (revision 16049) | |
17 | +++ ldso/ldso/ldso.c (working copy) | |
18 | @@ -113,7 +125,7 @@ | |
19 | for (j = 0; j < jm; ++j) { | |
20 | void (*dl_elf_func) (void); | |
21 | dl_elf_func = (void (*)(void)) (intptr_t) addrs[j]; | |
22 | - (*dl_elf_func) (); | |
23 | + DL_CALL_FUNC_AT_ADDR (dl_elf_func, loadaddr, (void (*)(void))); | |
24 | } | |
25 | } | |
26 | } | |
27 | @@ -141,7 +153,7 @@ | |
28 | while (i-- > 0) { | |
29 | void (*dl_elf_func) (void); | |
30 | dl_elf_func = (void (*)(void)) (intptr_t) array[i]; | |
31 | - (*dl_elf_func) (); | |
32 | + DL_CALL_FUNC_AT_ADDR (dl_elf_func, tpnt->loadaddr, (void (*)(void))); | |
33 | } | |
34 | } | |
35 | } | |
36 | @@ -168,7 +180,7 @@ | |
37 | ||
38 | dl_elf_func = (void (*)(void)) (intptr_t) DL_RELOC_ADDR(tpnt->loadaddr, tpnt->dynamic_info[DT_FINI]); | |
39 | _dl_if_debug_dprint("\ncalling FINI: %s\n\n", tpnt->libname); | |
40 | - (*dl_elf_func) (); | |
41 | + DL_CALL_FUNC_AT_ADDR (dl_elf_func, tpnt->loadaddr, (void(*)(void))); | |
42 | } | |
43 | } | |
44 | } | |
45 | @@ -852,7 +880,7 @@ | |
46 | ||
47 | _dl_if_debug_dprint("calling INIT: %s\n\n", tpnt->libname); | |
48 | ||
49 | - (*dl_elf_func) (); | |
50 | + DL_CALL_FUNC_AT_ADDR (dl_elf_func, tpnt->loadaddr, (void(*)(void))); | |
51 | } | |
52 | ||
53 | _dl_run_init_array(tpnt); | |
54 | Index: ldso/ldso/dl-elf.c | |
55 | =================================================================== | |
56 | --- ldso/ldso/dl-elf.c (revision 16049) | |
57 | +++ ldso/ldso/dl-elf.c (working copy) | |
58 | @@ -118,10 +118,9 @@ | |
59 | void | |
60 | _dl_protect_relro (struct elf_resolve *l) | |
61 | { | |
62 | - ElfW(Addr) start = (DL_RELOC_ADDR(l->loadaddr, l->relro_addr) | |
63 | - & ~(_dl_pagesize - 1)); | |
64 | - ElfW(Addr) end = ((DL_RELOC_ADDR(l->loadaddr, l->relro_addr) + l->relro_size) | |
65 | - & ~(_dl_pagesize - 1)); | |
66 | + ElfW(Addr) base = (ElfW(Addr)) DL_RELOC_ADDR(l->loadaddr, l->relro_addr); | |
67 | + ElfW(Addr) start = (base & ~(_dl_pagesize - 1)); | |
68 | + ElfW(Addr) end = ((base + l->relro_size) & ~(_dl_pagesize - 1)); | |
69 | _dl_if_debug_dprint("RELRO protecting %s: start:%x, end:%x\n", l->libname, start, end); | |
70 | if (start != end && | |
71 | _dl_mprotect ((void *) start, end - start, PROT_READ) < 0) { | |
72 | @@ -628,7 +747,7 @@ | |
73 | } | |
74 | ||
75 | _dl_if_debug_dprint("\n\tfile='%s'; generating link map\n", libname); | |
76 | - _dl_if_debug_dprint("\t\tdynamic: %x base: %x\n", dynamic_addr, DL_LOADADDR_BASE(libaddr)); | |
77 | + _dl_if_debug_dprint("\t\tdynamic: %x base: %x\n", dynamic_addr, DL_LOADADDR_BASE(lib_loadaddr)); | |
78 | _dl_if_debug_dprint("\t\t entry: %x phdr: %x phnum: %x\n\n", | |
79 | DL_RELOC_ADDR(lib_loadaddr, epnt->e_entry), tpnt->ppnt, tpnt->n_phent); | |
80 | ||
81 | @@ -822,7 +941,7 @@ | |
82 | int ret = 0; | |
83 | ||
84 | for (l = _dl_loaded_modules; l != NULL; l = l->next) { | |
85 | - info.dlpi_addr = DL_LOADADDR_BASE(l->loadaddr); | |
86 | + info.dlpi_addr = l->loadaddr; | |
87 | info.dlpi_name = l->libname; | |
88 | info.dlpi_phdr = l->ppnt; | |
89 | info.dlpi_phnum = l->n_phent; | |
90 | Index: ldso/include/dl-defs.h | |
91 | =================================================================== | |
92 | --- ldso/include/dl-defs.h (revision 16049) | |
93 | +++ ldso/include/dl-defs.h (working copy) | |
94 | @@ -140,4 +146,13 @@ | |
95 | && (!(TFROM) || (TFROM)->loadaddr < (TPNT)->loadaddr)) | |
96 | #endif | |
97 | ||
98 | +/* On some platforms, computing a pointer to function is more | |
99 | + expensive than calling a function at a given address, so this | |
100 | + alternative is provided. The function signature must be given | |
101 | + within parentheses, as in a type cast. */ | |
102 | +#ifndef DL_CALL_FUNC_AT_ADDR | |
103 | +# define DL_CALL_FUNC_AT_ADDR(ADDR, LOADADDR, SIGNATURE, ...) \ | |
104 | + ((*SIGNATURE DL_ADDR_TO_FUNC_PTR ((ADDR), (LOADADDR)))(__VA_ARGS__)) | |
105 | +#endif | |
106 | + | |
107 | #endif /* _LD_DEFS_H */ | |
108 | Index: ldso/include/dl-hash.h | |
109 | =================================================================== | |
110 | --- ldso/include/dl-hash.h (revision 16049) | |
111 | +++ ldso/include/dl-hash.h (working copy) | |
112 | @@ -28,7 +28,7 @@ | |
113 | struct elf_resolve { | |
114 | /* These entries must be in this order to be compatible with the interface used | |
115 | by gdb to obtain the list of symbols. */ | |
116 | - DL_LOADADDR_TYPE loadaddr; /* Base address shared object is loaded at. */ | |
117 | + DL_LOADADDR_TYPE loadaddr; /* Base address shared object is loaded at. */ | |
118 | char *libname; /* Absolute file name object was found in. */ | |
119 | ElfW(Dyn) *dynamic_addr; /* Dynamic section of the shared object. */ | |
120 | struct elf_resolve * next; | |
121 | Index: ldso/libdl/libdl.c | |
122 | =================================================================== | |
123 | --- ldso/libdl/libdl.c (revision 16049) | |
124 | +++ ldso/libdl/libdl.c (working copy) | |
125 | @@ -378,10 +388,10 @@ | |
126 | if (tpnt->dynamic_info[DT_INIT]) { | |
127 | void (*dl_elf_func) (void); | |
128 | dl_elf_func = (void (*)(void)) DL_RELOC_ADDR(tpnt->loadaddr, tpnt->dynamic_info[DT_INIT]); | |
129 | - if (dl_elf_func && *dl_elf_func != NULL) { | |
130 | + if (dl_elf_func) { | |
131 | _dl_if_debug_print("running ctors for library %s at '%p'\n", | |
132 | tpnt->libname, dl_elf_func); | |
133 | - (*dl_elf_func) (); | |
134 | + DL_CALL_FUNC_AT_ADDR (dl_elf_func, tpnt->loadaddr, (void(*)(void))); | |
135 | } | |
136 | } | |
137 | ||
138 | @@ -512,8 +539,8 @@ | |
139 | if (tpnt->dynamic_info[DT_FINI]) { | |
140 | dl_elf_fini = (int (*)(void)) DL_RELOC_ADDR(tpnt->loadaddr, tpnt->dynamic_info[DT_FINI]); | |
141 | _dl_if_debug_print("running dtors for library %s at '%p'\n", | |
142 | - tpnt->libname, dl_elf_fini); | |
143 | - (*dl_elf_fini) (); | |
144 | + tpnt->libname, dl_elf_fini); | |
145 | + DL_CALL_FUNC_AT_ADDR (dl_elf_fini, tpnt->loadaddr, (int (*)(void))); | |
146 | } | |
147 | } | |
148 | ||
149 | @@ -660,7 +691,7 @@ | |
150 | _dl_if_debug_print("Module \"%s\" at %p\n", | |
151 | tpnt->libname, DL_LOADADDR_BASE(tpnt->loadaddr)); | |
152 | ||
153 | - if (DL_ADDR_IN_LOADADDR((ElfW(Addr)) __address, tpnt, pelf)) | |
154 | + if (DL_ADDR_IN_LOADADDR((ElfW(Addr)) __address, tpnt, pelf)) | |
155 | pelf = tpnt; | |
156 | } | |
157 |