2017-08-18 2 views
0

Ich versuche, einige benutzerdefinierte Code zu unserer internen libc im Zusammenhang mit Atexit Behandlung hinzuzufügen.gcc Symbol Auflösung Shadowing

In unserer libc definieren wir dies, weil wir auf benutzerdefinierte CRT-Dateien verlinken und nicht GCCs verwenden, die dies definieren.

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

GCC fügt auch diese zu Binärdateien, wenn sie verbinden.

In der libc ist die Funktion atexit die

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

Das Problem ist, ich bin vor nur ruft, dass der verwendete _dso_handle Wert die lokale eines von libc ist, wenn ich es dynamisch die Abruf- machen möchte eine von dem Modul, das atexit() zur Laufzeit aufruft, so dass die richtige dso mit der atexit-Funktion registriert wird.

Ich überprüfte Attribute und ich fand nichts, das dort helfen könnte.

Beachten Sie, dass atexit im Gegensatz zu glibc in der dynamischen Version von libc beibehalten wird, um die Abwärtskompatibilität mit älteren Binärdateien zu erhalten.

Antwort

0

Das Problem, das ich mit Blick auf bin ist, dass der _dso_handle Wert verwendet die lokale ein von libc ist, wenn ich es dynamisch, das eine vom Modul holen machen möchten, die atexit() zur Laufzeit ruft

Ihr Modul kann stattdessen __cxa_atexit aufrufen und geben Sie dso_handle, was Sie wünschen.