En Windows, varios argumentos se pasan al constructor DllMain:Linux: ¿Cómo obtener el nombre completo del objeto compartido recién cargado desde el constructor?
BOOL WINAPI DllMain(
__in HINSTANCE hinstDLL,
__in DWORD fdwReason,
__in LPVOID lpvReserved
);
De hinstDLL puedo obtener el nombre completo del archivo de la misma DLL usando GetModuleFileName():
LPTSTR str = new TCHAR[256];
int libNameLength = GetModuleFileName(hinstDLL, str, 256);
delete[] str;
En el ejemplo arriba, str ahora contiene el nombre completo de la DLL que acaba de cargar, por ejemplo, C: \ Windows \ System32 \ MyFile.dll.
En Linux, no hay argumentos se pasan al constructor de objetos compartidos:
void `__attribute__` ((constructor)) on_load(void);
¿Cómo puedo obtener el nombre completo de la DLL en este caso? Crédito adicional si su solución también funciona en Mac. :-)
No sé si hay una buena manera. Mi pregunta en situaciones como esta es "¿Por qué quieres saber?". Al retroceder un nivel, es posible que encuentre un camino hacia su objetivo real sin dar el paso que actualmente lo está bloqueando. – Omnifarious
Buena pregunta. Quiero saber, porque estoy desarrollando un CSP y un módulo PKCS # 11 (archivos DLL), los cuales necesitan verificar su propia integridad cuando se carguen. Ambos archivos DLL son cargados por el sistema operativo, por lo que mi punto de entrada es el constructor. Actualmente, la mejor idea que tengo para verificar la integridad del archivo DLL es calcular un hash del archivo DLL en el constructor y luego enviar ese hash a un servidor central que puede verificar la corrección del hash. Sin embargo, necesito el nombre de archivo de la DLL para poder calcular el hash. –