summaryrefslogtreecommitdiffstats
path: root/libexec/rtld-elf/map_object.c
diff options
context:
space:
mode:
authorkan <kan@FreeBSD.org>2005-12-18 19:43:33 +0000
committerkan <kan@FreeBSD.org>2005-12-18 19:43:33 +0000
commit8d6f05d58bc7dda5a91170bff51023509aa82558 (patch)
tree0d48e9fa3e1a8d20651242fc849efd6ba9f69557 /libexec/rtld-elf/map_object.c
parent116fa05e6020161c2d69796fd827231ba57cb838 (diff)
downloadFreeBSD-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.c10
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;
}
OpenPOWER on IntegriCloud