add support for init_array/fini_array ctors/dtors to dynamic linker
This commit is contained in:
parent
ce8a995782
commit
e69ae844dc
1 changed files with 13 additions and 2 deletions
|
|
@ -696,7 +696,13 @@ static void do_fini()
|
||||||
for (p=fini_head; p; p=p->fini_next) {
|
for (p=fini_head; p; p=p->fini_next) {
|
||||||
if (!p->constructed) continue;
|
if (!p->constructed) continue;
|
||||||
decode_vec(p->dynv, dyn, DYN_CNT);
|
decode_vec(p->dynv, dyn, DYN_CNT);
|
||||||
((void (*)(void))(p->base + dyn[DT_FINI]))();
|
if (dyn[0] & (1<<DT_FINI_ARRAY)) {
|
||||||
|
size_t n = dyn[DT_FINI_ARRAYSZ]/sizeof(size_t);
|
||||||
|
size_t *fn = (void *)(p->base + dyn[DT_FINI_ARRAY]);
|
||||||
|
while (n--) ((void (*)(void))*fn++)();
|
||||||
|
}
|
||||||
|
if (dyn[0] & (1<<DT_FINI))
|
||||||
|
((void (*)(void))(p->base + dyn[DT_FINI]))();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -712,12 +718,17 @@ static void do_init_fini(struct dso *p)
|
||||||
if (p->constructed) continue;
|
if (p->constructed) continue;
|
||||||
p->constructed = 1;
|
p->constructed = 1;
|
||||||
decode_vec(p->dynv, dyn, DYN_CNT);
|
decode_vec(p->dynv, dyn, DYN_CNT);
|
||||||
if (dyn[0] & (1<<DT_FINI)) {
|
if (dyn[0] & ((1<<DT_FINI) | (1<<DT_FINI_ARRAY))) {
|
||||||
p->fini_next = fini_head;
|
p->fini_next = fini_head;
|
||||||
fini_head = p;
|
fini_head = p;
|
||||||
}
|
}
|
||||||
if (dyn[0] & (1<<DT_INIT))
|
if (dyn[0] & (1<<DT_INIT))
|
||||||
((void (*)(void))(p->base + dyn[DT_INIT]))();
|
((void (*)(void))(p->base + dyn[DT_INIT]))();
|
||||||
|
if (dyn[0] & (1<<DT_INIT_ARRAY)) {
|
||||||
|
size_t n = dyn[DT_INIT_ARRAYSZ]/sizeof(size_t);
|
||||||
|
size_t *fn = (void *)(p->base + dyn[DT_INIT_ARRAY]);
|
||||||
|
while (n--) ((void (*)(void))*fn++)();
|
||||||
|
}
|
||||||
if (!need_locking && libc.threads_minus_1) {
|
if (!need_locking && libc.threads_minus_1) {
|
||||||
need_locking = 1;
|
need_locking = 1;
|
||||||
pthread_mutex_lock(&init_fini_lock);
|
pthread_mutex_lock(&init_fini_lock);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue