Затенение разрешения символа gcc
Я пытаюсь добавить собственный код в наш внутренний libc, связанный с обработкой atexit.
В нашем libc мы определяем это, потому что мы ссылаемся на пользовательские файлы CRT и не используем GCC, которые это определяют.
void *__dso_handle __attribute__((__visibility__("hidden"),__weak__)) = &__dso_handle;
GCC также добавляет это в двоичные файлы при связывании их.
В libc есть функция atexit, которая просто вызывает
int atexit(void (*func)(void))
{
return __cxa_atexit((void (*)(void*))func, NULL, __dso_handle);
}
Проблема, с которой я сталкиваюсь, заключается в том, что используемое значение _dso_handle является локальным из libc, когда я хочу, чтобы оно динамически извлекало значение из модуля, который вызывает atexit() во время выполнения, так что надлежащий dso регистрируется с помощью atexit. функция.
Я проверил атрибуты и не нашел там ничего, что могло бы помочь.
Обратите внимание, что в отличие от glibc, atexit хранится в динамической версии libc, чтобы сохранить обратную совместимость со старыми двоичными файлами.
1 ответ
Проблема, с которой я сталкиваюсь, заключается в том, что используемое значение _dso_handle является локальным из libc, когда я хочу, чтобы оно динамически извлекало значение из модуля, который вызывает atexit() во время выполнения.
Ваш модуль может позвонить __cxa_atexit
вместо этого, и передать в любом dso_handle
ты желаешь.