diff options
author | kan <kan@FreeBSD.org> | 2005-12-18 19:43:33 +0000 |
---|---|---|
committer | kan <kan@FreeBSD.org> | 2005-12-18 19:43:33 +0000 |
commit | 8d6f05d58bc7dda5a91170bff51023509aa82558 (patch) | |
tree | 0d48e9fa3e1a8d20651242fc849efd6ba9f69557 /libexec/rtld-elf/map_object.c | |
parent | 116fa05e6020161c2d69796fd827231ba57cb838 (diff) | |
download | FreeBSD-src-8d6f05d58bc7dda5a91170bff51023509aa82558.zip FreeBSD-src-8d6f05d58bc7dda5a91170bff51023509aa82558.tar.gz |
Implement ELF symbol versioning using GNU semantics. This code aims
to be compatible with symbol versioning support as implemented by
GNU libc and documented by http://people.redhat.com/~drepper/symbol-versioning
and LSB 3.0.
Implement dlvsym() function to allow lookups for a specific version of
a given symbol.
Diffstat (limited to 'libexec/rtld-elf/map_object.c')
-rw-r--r-- | libexec/rtld-elf/map_object.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/libexec/rtld-elf/map_object.c b/libexec/rtld-elf/map_object.c index 2b1ef24..333e08d 100644 --- a/libexec/rtld-elf/map_object.c +++ b/libexec/rtld-elf/map_object.c @@ -305,15 +305,19 @@ obj_free(Obj_Entry *obj) { Objlist_Entry *elm; - if (obj->tls_done) { + if (obj->tls_done) free_tls_offset(obj); - } free(obj->path); while (obj->needed != NULL) { Needed_Entry *needed = obj->needed; obj->needed = needed->next; free(needed); } + while (!STAILQ_EMPTY(&obj->names)) { + Name_Entry *entry = STAILQ_FIRST(&obj->names); + STAILQ_REMOVE_HEAD(&obj->names, link); + free(entry); + } while (!STAILQ_EMPTY(&obj->dldags)) { elm = STAILQ_FIRST(&obj->dldags); STAILQ_REMOVE_HEAD(&obj->dldags, link); @@ -324,6 +328,7 @@ obj_free(Obj_Entry *obj) STAILQ_REMOVE_HEAD(&obj->dagmembers, link); free(elm); } + free(obj->vertab); free(obj->origin_path); free(obj->priv); free(obj); @@ -337,6 +342,7 @@ obj_new(void) obj = CNEW(Obj_Entry); STAILQ_INIT(&obj->dldags); STAILQ_INIT(&obj->dagmembers); + STAILQ_INIT(&obj->names); return obj; } |