Загрузчик выполняет динамический поиск символа непосредственно перед использованием символа и сообщит об «ошибке поиска символа», если символ не найден. Я хотел бы как-то зарегистрировать ловушку, чтобы, если она не нашла символ, я мог предоставить запасной вариант. В идеале что-то вроде:
uintptr_t symbol_lookup_fallback(const char *symbol);
, которое во время выполнения будет анализировать сбойную символьную строку и возвращать (уже ASLR) адрес к резервной опции. Это похоже на опцию слабых символов в GCC, за исключением того, что я не знаю заранее, какие символы помечать как слабые, поэтому мне нужно выполнить анализ во время выполнения.
В качестве альтернативы, я мог бы также работатьс первой возможностью предоставить символ, прежде чем загрузчик попробует его. Я предполагаю, что это может быть более осуществимо, если использовать LD_PRELOAD для переопределения моей собственной версии dlsym
или любой другой используемой, и вызывать реальную реализацию, только если у меня нет пользовательской реализации. Однако, если я переопределю dlsym
, я не смог бы получить следующий символ с dlsym(RTLD_NEXT, "dlsym")
, поскольку это была бы просто рекурсия.