2017-08-18 16 views
0

J'essaie d'ajouter du code personnalisé à notre libc interne liée à la gestion atexit.gcc symbole résolution observation

Dans notre libc, nous définissons cela car nous lions vers des fichiers CRT personnalisés et n'utilisons pas GCC qui le définit. GCC ajoute également ceci aux binaires lors de leur liaison.

void *__dso_handle __attribute__((__visibility__("hidden"),__weak__)) = &__dso_handle; 

Dans la libc est la fonction atexit qui appelle simplement

int atexit(void (*func)(void)) 
{ 
    return __cxa_atexit((void (*)(void*))func, NULL, __dso_handle); 
} 

La question que je suis face est que la valeur _dso_handle utilisée est celle locale de libc quand je voudrais faire dynamiquement la chercher un du module qui appelle atexit() à l'exécution de sorte que le dso approprié est enregistré avec la fonction atexit.

J'ai vérifié les attributs et je n'ai rien trouvé qui pourrait aider là. Notez que contrairement à la glibc, atexit est conservé dans la version dynamique de libc pour préserver la compatibilité ascendante avec les anciens binaires.

Répondre

0

La question que je suis face est que la valeur _dso_handle utilisée est celle locale de libc quand je voudrais le faire dynamiquement chercher celui du module qui appelle atexit() lors de l'exécution

Votre module peut appeler __cxa_atexit à la place, et transmettre tout ce que vous désirez dso_handle.