Skip to content
Snippets Groups Projects
Commit e750f608 authored by Simon McVittie's avatar Simon McVittie
Browse files

init: Create capsule data structures while harvesting metadata

parent 56302587
No related branches found
No related tags found
1 merge request!311Build capsule-capture-libs from a bundled copy of libcapsule
...@@ -141,6 +141,7 @@ get_capsule_metadata (struct link_map *map, const char *only) ...@@ -141,6 +141,7 @@ get_capsule_metadata (struct link_map *map, const char *only)
symbol++ ) symbol++ )
{ {
capsule_metadata *meta = NULL; capsule_metadata *meta = NULL;
capsule cap = NULL;
char *name = (char *)strtab + symbol->st_name; char *name = (char *)strtab + symbol->st_name;
if( !name || strcmp( "capsule_meta", name ) ) if( !name || strcmp( "capsule_meta", name ) )
...@@ -166,9 +167,25 @@ get_capsule_metadata (struct link_map *map, const char *only) ...@@ -166,9 +167,25 @@ get_capsule_metadata (struct link_map *map, const char *only)
meta->active_prefix = meta->active_prefix =
capsule_get_prefix( meta->default_prefix, meta->soname ); capsule_get_prefix( meta->default_prefix, meta->soname );
cap = meta->handle;
if( cap == NULL )
{
cap = xcalloc( 1, sizeof(struct _capsule) );
DEBUG( DEBUG_CAPSULE,
"Creating new capsule %p for metadata %p (%s … %s)",
cap, meta, meta->active_prefix, meta->soname );
cap->meta = meta;
cap->prefix = meta->active_prefix;
cap->seen.all = ptr_list_alloc( 32 );
cap->seen.some = ptr_list_alloc( 32 );
meta->handle = cap;
}
ptr_list_add_ptr( _capsule_metadata_list, meta, ptr_equal ); ptr_list_add_ptr( _capsule_metadata_list, meta, ptr_equal );
DEBUG( DEBUG_CAPSULE, "found metatdata for %s … %s at %p", DEBUG( DEBUG_CAPSULE,
meta->active_prefix, meta->soname, meta ); "found metadata for %s … %s at %p (capsule: %p)",
meta->active_prefix, meta->soname, meta, cap );
break; break;
} }
} }
...@@ -386,7 +403,6 @@ get_cached_metadata (const char *soname) ...@@ -386,7 +403,6 @@ get_cached_metadata (const char *soname)
capsule capsule
capsule_init (const char *soname) capsule_init (const char *soname)
{ {
capsule handle = xcalloc( 1, sizeof(struct _capsule) );
capsule_metadata *meta = NULL; capsule_metadata *meta = NULL;
meta = get_cached_metadata( soname ); meta = get_cached_metadata( soname );
...@@ -409,8 +425,6 @@ capsule_init (const char *soname) ...@@ -409,8 +425,6 @@ capsule_init (const char *soname)
abort(); abort();
} }
handle->prefix = meta->active_prefix;
for( size_t i = 0; i < _capsule_metadata_list->next; i++ ) for( size_t i = 0; i < _capsule_metadata_list->next; i++ )
{ {
capsule_metadata *cm = ptr_list_nth_ptr( _capsule_metadata_list, i ); capsule_metadata *cm = ptr_list_nth_ptr( _capsule_metadata_list, i );
...@@ -425,17 +439,7 @@ capsule_init (const char *soname) ...@@ -425,17 +439,7 @@ capsule_init (const char *soname)
DUMP_STRV( nowrap, cm->combined_nowrap ); DUMP_STRV( nowrap, cm->combined_nowrap );
} }
handle->seen.all = ptr_list_alloc( 32 ); return meta->handle;
handle->seen.some = ptr_list_alloc( 32 );
// poke the initialised metadata back into the handle
// and vice versa:
handle->meta = meta;
meta->handle = handle;
meta->closed = 0;
return handle;
} }
#define CLEAR(f,x) ({ f( x ); x = NULL; }) #define CLEAR(f,x) ({ f( x ); x = NULL; })
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment