RTLD_LOCAL y dynamic_cast en Linux

Tenemos un complemento que está construido con algunas bibliotecas compartidas en nuestra aplicación que necesitamos actualizar mientras la aplicación se está ejecutando. Por razones de rendimiento, cargamos y comenzamos a usar el nuevo complemento antes de descargar el viejo y solo cuando todos los subprocesos se hacen usando el viejo complemento, lo descargamos. Dado que las bibliotecas del nuevo complemento y el antiguo tienen los mismos símbolos,dlopen() conRTLD_LOCAL. Si no llamamos al nuevo complemento desde funciones internas por accidente a símbolos del antiguo complemento.

Una biblioteca del complemento hacedynamic_cast() a un objeto creado por otra biblioteca del complemento. Esto funciona en HP-UX, AIX, Solaris y Windows, pero no en Linux. Por lo que puedo entender, esto se debe a que todos estos sistemas operativos (compiladores) usan el nombre de la clase para comparar tipos (en eldynamic_cast()) pero Linux usa direcciones de cadenas de nombre para hacer esta comparación (para mejorar el rendimiento) y dado que cada biblioteca tiene su propiatype_info objeto (ya que se cargó conRTLD_LOCAL) las direcciones son diferentes y, por lo tanto, los tipos iguales parecen no ser iguales adynamic_cast().

Hay una manera de hacer una de las siguientes cosas:

Haga solo latype_infoos objetos @ se cargarán como siRTLD_GLOBAL fue suministrado. Haga que el compilador use la comparación de nombre de clase en lugar detype_info direcciones para comparar entre tipos.

? El compilador que estamos usando es:

$ icpc -V
Intel(R) C++ Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 12.0.0.084 Build 20101006
Copyright (C) 1985-2010 Intel Corporation.  All rights reserved.

Respuestas a la pregunta(2)

Su respuesta a la pregunta