Затенение разрешения символа 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 ты желаешь.

Другие вопросы по тегам